@akcelik/strct 5.13.0 → 5.15.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akcelik/strct",
3
- "version": "5.13.0",
3
+ "version": "5.15.0",
4
4
  "description": "UIStruct — a standalone Angular component library with a tokenised, multi-palette theme system, built for datacenter / infrastructure management UIs.",
5
5
  "author": "Serkan Akcelik <serkan.akcelik@gmail.com>",
6
6
  "license": "MIT",
@@ -81,11 +81,6 @@
81
81
  --t4: rgba(255, 255, 255, 0.15);
82
82
  --inv: #0e1015;
83
83
  --acc: #7b9ec8;
84
- --acc-m: rgba(123, 158, 200, 0.12);
85
- --acc-s: rgba(123, 158, 200, 0.06);
86
- --acc50: rgba(123, 158, 200, 0.5);
87
- --acc30: rgba(123, 158, 200, 0.3);
88
- --acc18: rgba(123, 158, 200, 0.18);
89
84
  --success: #7da87e;
90
85
  --success-bg: rgba(125, 168, 126, 0.12);
91
86
  --warning: #bfae6a;
@@ -151,11 +146,6 @@
151
146
  --t4: rgba(0, 0, 0, 0.14);
152
147
  --inv: #ffffff;
153
148
  --acc: #4a6b8f;
154
- --acc-m: rgba(74, 107, 143, 0.1);
155
- --acc-s: rgba(74, 107, 143, 0.05);
156
- --acc50: rgba(74, 107, 143, 0.5);
157
- --acc30: rgba(74, 107, 143, 0.3);
158
- --acc18: rgba(74, 107, 143, 0.18);
159
149
  --success: #4c7a4f;
160
150
  --success-bg: rgba(76, 122, 79, 0.12);
161
151
  --warning: #7d6f30;
@@ -221,11 +211,6 @@
221
211
  --t4: rgba(255, 225, 195, 0.14);
222
212
  --inv: #12100d;
223
213
  --acc: #c49a6c;
224
- --acc-m: rgba(196, 154, 108, 0.12);
225
- --acc-s: rgba(196, 154, 108, 0.06);
226
- --acc50: rgba(196, 154, 108, 0.5);
227
- --acc30: rgba(196, 154, 108, 0.3);
228
- --acc18: rgba(196, 154, 108, 0.18);
229
214
  --success: #8aaa7a;
230
215
  --success-bg: rgba(138, 170, 122, 0.12);
231
216
  --warning: #c4b060;
@@ -291,11 +276,6 @@
291
276
  --t4: rgba(80, 55, 30, 0.14);
292
277
  --inv: #fdfcfa;
293
278
  --acc: #7d5e3f;
294
- --acc-m: rgba(125, 94, 63, 0.1);
295
- --acc-s: rgba(125, 94, 63, 0.05);
296
- --acc50: rgba(125, 94, 63, 0.5);
297
- --acc30: rgba(125, 94, 63, 0.3);
298
- --acc18: rgba(125, 94, 63, 0.18);
299
279
  --success: #4c7a46;
300
280
  --success-bg: rgba(76, 122, 70, 0.12);
301
281
  --warning: #7d6e2c;
@@ -361,11 +341,6 @@
361
341
  --t4: rgba(195, 222, 210, 0.14);
362
342
  --inv: #0d1210;
363
343
  --acc: #7aab90;
364
- --acc-m: rgba(122, 171, 144, 0.12);
365
- --acc-s: rgba(122, 171, 144, 0.06);
366
- --acc50: rgba(122, 171, 144, 0.5);
367
- --acc30: rgba(122, 171, 144, 0.3);
368
- --acc18: rgba(122, 171, 144, 0.18);
369
344
  --success: #82aa82;
370
345
  --success-bg: rgba(130, 170, 130, 0.12);
371
346
  --warning: #b8ac6a;
@@ -431,11 +406,6 @@
431
406
  --t4: rgba(35, 65, 45, 0.14);
432
407
  --inv: #fafcfb;
433
408
  --acc: #3f7355;
434
- --acc-m: rgba(63, 115, 85, 0.1);
435
- --acc-s: rgba(63, 115, 85, 0.05);
436
- --acc50: rgba(63, 115, 85, 0.5);
437
- --acc30: rgba(63, 115, 85, 0.3);
438
- --acc18: rgba(63, 115, 85, 0.18);
439
409
  --success: #467a48;
440
410
  --success-bg: rgba(70, 122, 72, 0.12);
441
411
  --warning: #6f682d;
@@ -474,6 +444,37 @@
474
444
  --disabled-opacity: 0.5;
475
445
  }
476
446
 
447
+ // A product's own accent, independent of the operator's palette (FR-52-03).
448
+ // Every translucent accent tint is derived from --acc rather than written out
449
+ // per palette, so a subtree that sets --acc on a [data-accent] element remaps
450
+ // badges, check marks, links, focus rings and selection fills with it — no
451
+ // second set of tokens, and no component has to know the product's name.
452
+ //
453
+ // [data-accent='backup'] { --acc: #2f8f7a; }
454
+ // [data-theme='dark'] [data-accent='backup'] { --acc: #58b9a3; }
455
+ //
456
+ // The mixes are the values these tokens have always had: 12/6% in dark and
457
+ // 10/5% in light, 50/30/18% in both. The colour is the app's to pick, so its
458
+ // contrast is the app's to check: >= 4.5:1 on --bg-0/1/2 for text and marks,
459
+ // >= 3:1 on --hdr for a line or a chip (the palette's own light accent is
460
+ // 2.67-2.85:1 on its header, which is why a header shade is a second value).
461
+ [data-palette][data-theme='dark'],
462
+ [data-theme='dark'] [data-accent] {
463
+ --acc-m: color-mix(in srgb, var(--acc) 12%, transparent);
464
+ --acc-s: color-mix(in srgb, var(--acc) 6%, transparent);
465
+ --acc50: color-mix(in srgb, var(--acc) 50%, transparent);
466
+ --acc30: color-mix(in srgb, var(--acc) 30%, transparent);
467
+ --acc18: color-mix(in srgb, var(--acc) 18%, transparent);
468
+ }
469
+ [data-palette][data-theme='light'],
470
+ [data-theme='light'] [data-accent] {
471
+ --acc-m: color-mix(in srgb, var(--acc) 10%, transparent);
472
+ --acc-s: color-mix(in srgb, var(--acc) 5%, transparent);
473
+ --acc50: color-mix(in srgb, var(--acc) 50%, transparent);
474
+ --acc30: color-mix(in srgb, var(--acc) 30%, transparent);
475
+ --acc18: color-mix(in srgb, var(--acc) 18%, transparent);
476
+ }
477
+
477
478
  // Honour the OS "increase contrast" preference (low-vision users / bright ambient
478
479
  // light): strengthen borders and lift secondary/tertiary text toward primary.
479
480
  // Only active when the OS asks, so the default look is untouched. Scoped by
@@ -434,6 +434,17 @@ declare class StrctShellService {
434
434
  readonly mobileNavOpen: _angular_core.WritableSignal<boolean>;
435
435
  /** Id of the vertical nav controlled by the header drawer toggle. */
436
436
  readonly navId: string;
437
+ /**
438
+ * The header's drawer toggle, so closing the drawer can hand focus back to
439
+ * what opened it. The header registers it; nothing else writes it.
440
+ */
441
+ drawerToggle: HTMLElement | null;
442
+ /**
443
+ * Closes the navigation drawer. On a phone the drawer holds the
444
+ * navigation, so a choice made in it opens a page *behind* it; the shell
445
+ * calls this on every completed navigation unless told not to.
446
+ */
447
+ closeNav(): void;
437
448
  }
438
449
  /**
439
450
  * Application frame: a full-viewport grid of header / body / footer rows.
@@ -454,16 +465,65 @@ declare class StrctShell {
454
465
  readonly skipLinkLabel: _angular_core.InputSignal<string>;
455
466
  /** The name of the backdrop that closes the navigation drawer on a phone. */
456
467
  readonly closeNavLabel: _angular_core.InputSignal<string>;
468
+ /**
469
+ * Close the drawer when a navigation completes — the subscription every app
470
+ * with a router ends up writing. It needs a `Router`; without one nothing
471
+ * happens. Set it to `false` to keep the drawer open across navigations,
472
+ * and close it yourself with `StrctShellService.closeNav()`.
473
+ */
474
+ readonly closeNavOnNavigate: _angular_core.InputSignalWithTransform<boolean, unknown>;
457
475
  /** The drawer's open state lives on the shell, and so does its backdrop. */
458
476
  protected readonly shell: StrctShellService;
459
477
  private readonly doc;
478
+ private readonly router;
479
+ constructor();
460
480
  /**
461
481
  * Moves focus rather than only the scroll position: an href alone scrolls
462
482
  * without focusing, so the next Tab would resume from the link.
463
483
  */
464
484
  protected skipToMain(event: Event): void;
465
485
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctShell, never>;
466
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctShell, "strct-shell", never, { "skipLinkTarget": { "alias": "skipLinkTarget"; "required": false; "isSignal": true; }; "skipLinkLabel": { "alias": "skipLinkLabel"; "required": false; "isSignal": true; }; "closeNavLabel": { "alias": "closeNavLabel"; "required": false; "isSignal": true; }; }, {}, never, ["strct-header", "*", "strct-footer"], true, never>;
486
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctShell, "strct-shell", never, { "skipLinkTarget": { "alias": "skipLinkTarget"; "required": false; "isSignal": true; }; "skipLinkLabel": { "alias": "skipLinkLabel"; "required": false; "isSignal": true; }; "closeNavLabel": { "alias": "closeNavLabel"; "required": false; "isSignal": true; }; "closeNavOnNavigate": { "alias": "closeNavOnNavigate"; "required": false; "isSignal": true; }; }, {}, never, ["strct-header", "*", "strct-footer"], true, never>;
487
+ }
488
+ /** What a header action is, and whether it may move into the overflow menu. */
489
+ interface StrctHeaderActionConfig {
490
+ /** The name the overflow row shows, and the action's own name. */
491
+ label: string;
492
+ /** Optional icon for the overflow row (an icon-set name). */
493
+ icon?: string;
494
+ /**
495
+ * `'phone'` (the default) moves the action into the "More" menu below the
496
+ * breakpoint. `'never'` keeps it in the header at every width — what an
497
+ * action that opens its own popover (alarms, the account menu) needs, since
498
+ * a popover inside a menu is a menu inside a menu.
499
+ */
500
+ overflow?: 'phone' | 'never';
501
+ /**
502
+ * What the overflow row does when it is chosen. Given one, the row is a
503
+ * menu item with the icon and the label — a command.
504
+ *
505
+ * Without one the action's own template is drawn in the menu instead, in a
506
+ * row that is not a menu item: the way out for an action that is a control
507
+ * in its own right (a segmented choice, a switcher). It keeps its own tab
508
+ * stop and its own clicks, and using it does not close the menu.
509
+ */
510
+ run?: () => void;
511
+ }
512
+ /**
513
+ * An action in the header that knows whether it may move into the overflow
514
+ * menu on a phone:
515
+ *
516
+ * <ng-container *strctHeaderAction="{ label: 'Create', icon: 'plus', run: create }">
517
+ * <button strct-button variant="flat" iconOnly aria-label="Create">…</button>
518
+ * </ng-container>
519
+ *
520
+ * Content projected into the header without this directive never moves.
521
+ */
522
+ declare class StrctHeaderAction {
523
+ readonly config: _angular_core.InputSignal<StrctHeaderActionConfig>;
524
+ readonly template: TemplateRef<unknown>;
525
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHeaderAction, never>;
526
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctHeaderAction, "[strctHeaderAction]", never, { "config": { "alias": "strctHeaderAction"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
467
527
  }
468
528
  /** Top application bar. Holds brand on the left and actions on the right. */
469
529
  declare class StrctHeader {
@@ -475,9 +535,29 @@ declare class StrctHeader {
475
535
  * nothing under it moves. Empty leaves today's border alone.
476
536
  */
477
537
  readonly accent: _angular_core.InputSignal<string>;
538
+ /**
539
+ * Below this width (px) the actions marked `overflow: 'phone'` move into a
540
+ * "More" menu. A console header carries more icons than a phone has room
541
+ * for, and an app should not have to draw two copies of each.
542
+ */
543
+ readonly overflowBreakpoint: _angular_core.InputSignal<number>;
544
+ /** The "More" trigger's accessible name (localisable). */
545
+ readonly overflowLabel: _angular_core.InputSignal<string>;
546
+ protected readonly actions: _angular_core.Signal<readonly StrctHeaderAction[]>;
547
+ /** Whether the viewport is below `overflowBreakpoint`. */
548
+ private readonly narrow;
549
+ protected readonly inlineActions: _angular_core.Signal<StrctHeaderAction[]>;
550
+ protected readonly overflowActions: _angular_core.Signal<StrctHeaderAction[]>;
551
+ /** An action that brings its own control makes the panel a dialog, not a menu. */
552
+ protected readonly overflowIsPanel: _angular_core.Signal<boolean>;
553
+ private readonly overflowPanel;
554
+ /** In panel mode nothing closes on activation, so a command closes it. */
555
+ protected runAndClose(run: () => void): void;
478
556
  protected readonly shell: StrctShellService;
557
+ private readonly hostEl;
558
+ constructor();
479
559
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctHeader, never>;
480
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctHeader, "strct-header", never, { "drawerToggleAriaLabel": { "alias": "drawerToggleAriaLabel"; "required": false; "isSignal": true; }; "accent": { "alias": "accent"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
560
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctHeader, "strct-header", never, { "drawerToggleAriaLabel": { "alias": "drawerToggleAriaLabel"; "required": false; "isSignal": true; }; "accent": { "alias": "accent"; "required": false; "isSignal": true; }; "overflowBreakpoint": { "alias": "overflowBreakpoint"; "required": false; "isSignal": true; }; "overflowLabel": { "alias": "overflowLabel"; "required": false; "isSignal": true; }; }, {}, ["actions"], ["*"], true, never>;
481
561
  }
482
562
  /** Bottom status bar. */
483
563
  declare class StrctFooter {
@@ -488,10 +568,39 @@ declare class StrctFooter {
488
568
  /** Scrollable left sidebar surface. Holds the icon nav and/or a tree. */
489
569
  declare class StrctVerticalNav {
490
570
  protected readonly shell: StrctShellService;
571
+ private readonly host;
572
+ /**
573
+ * How wide the drawer may get on a phone — only in drawer mode, so the
574
+ * width an app sets for its desktop sidebar is untouched. The default
575
+ * leaves 48px of page to tap the drawer away.
576
+ */
577
+ readonly drawerMaxWidth: _angular_core.InputSignal<string>;
578
+ /**
579
+ * Draw a close control at the drawer's top. Escape and the backdrop close
580
+ * it too, but neither is visible, and a touch screen has no Escape.
581
+ */
582
+ readonly closeButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
583
+ /** The close control's accessible name (localisable). */
584
+ readonly closeLabel: _angular_core.InputSignal<string>;
585
+ /**
586
+ * Keep Tab inside the open drawer and move focus into it, the way a dialog
587
+ * does. It is only ever on in drawer mode: a sidebar that is part of the
588
+ * page must not trap anything.
589
+ */
590
+ readonly trapFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
591
+ /** True while the drawer is open AND the viewport is in drawer mode. */
592
+ protected trapped(): boolean;
593
+ constructor();
491
594
  /** Closes the mobile nav on Escape. */
492
595
  protected onEscape(): void;
596
+ protected onTab(event: Event): void;
597
+ /**
598
+ * The drawer breakpoint is the media query the styles use; matchMedia is
599
+ * the only way the component can read it, and a server render has none.
600
+ */
601
+ private isDrawer;
493
602
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctVerticalNav, never>;
494
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctVerticalNav, "strct-vertical-nav", never, {}, {}, never, ["*"], true, never>;
603
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctVerticalNav, "strct-vertical-nav", never, { "drawerMaxWidth": { "alias": "drawerMaxWidth"; "required": false; "isSignal": true; }; "closeButton": { "alias": "closeButton"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "trapFocus": { "alias": "trapFocus"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
495
604
  }
496
605
  /** Horizontal strip of icon tabs (e.g. section switcher at the top of a sidebar). */
497
606
  declare class StrctNav {
@@ -2008,7 +2117,7 @@ declare class StrctDropdownItem {
2008
2117
  protected readonly tabindex: _angular_core.Signal<number | null>;
2009
2118
  constructor();
2010
2119
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDropdownItem, never>;
2011
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDropdownItem, "strct-dropdown-item", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "critical": { "alias": "critical"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; }, {}, never, ["[strctDropdownItemIcon]", "[strctDropdownItemAction]", "[strctDropdownItemLabel]", "[strctDropdownItemDescription]", "*"], true, never>;
2120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDropdownItem, "strct-dropdown-item, a[strctDropdownItem]", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "critical": { "alias": "critical"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; }, {}, never, ["[strctDropdownItemIcon]", "[strctDropdownItemAction]", "[strctDropdownItemLabel]", "[strctDropdownItemDescription]", "*"], true, never>;
2012
2121
  }
2013
2122
  /**
2014
2123
  * A named group of rows — "Create" above the create actions, where a divider
@@ -2339,6 +2448,15 @@ interface StrctMenuLink {
2339
2448
  dotStatus?: StrctRailStatus;
2340
2449
  /** Muted trailing icon (e.g. "restart required"), before any badge / dot. */
2341
2450
  trailingIcon?: string;
2451
+ /**
2452
+ * Render as a real router link (`<a routerLink>`): middle-click, ⌘/Ctrl-click
2453
+ * and "open in new tab" work, and the address can be copied — which a page
2454
+ * with an address of its own needs. `(select)` still fires on plain
2455
+ * activation. Without `routerLink` or `href` the entry stays a `<button>`.
2456
+ */
2457
+ routerLink?: string | unknown[];
2458
+ /** Render as a plain `<a href>` (external or non-router destinations). */
2459
+ href?: string;
2342
2460
  }
2343
2461
  /** A category (level 1) that groups {@link StrctMenuLink} items (level 2). */
2344
2462
  interface StrctMenuSection {
@@ -2375,7 +2493,15 @@ declare class StrctSectionMenu {
2375
2493
  private readonly overrides;
2376
2494
  protected isOpen(sec: StrctMenuSection): boolean;
2377
2495
  protected toggle(sec: StrctMenuSection): void;
2378
- protected pick(item: StrctMenuLink): void;
2496
+ /** Enabled entry with a router destination → renders as `<a routerLink>`. */
2497
+ protected isRouted(item: StrctMenuLink): boolean;
2498
+ /**
2499
+ * Active state of a router-link entry: an explicit `activeId` is
2500
+ * authoritative; without one the router's own active state drives it — the
2501
+ * rail's contract.
2502
+ */
2503
+ protected isActive(item: StrctMenuLink, routerActive: boolean): boolean;
2504
+ protected pick(item: StrctMenuLink, event?: MouseEvent): void;
2379
2505
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctSectionMenu, never>;
2380
2506
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctSectionMenu, "strct-section-menu", never, { "sections": { "alias": "sections"; "required": true; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "showIcons": { "alias": "showIcons"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "activeId": "activeIdChange"; "select": "select"; }, never, never, true, never>;
2381
2507
  }
@@ -8280,5 +8406,79 @@ declare class StrctMarkdown {
8280
8406
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctMarkdown, "strct-markdown", never, { "source": { "alias": "source"; "required": false; "isSignal": true; }; "tree": { "alias": "tree"; "required": false; "isSignal": true; }; "streaming": { "alias": "streaming"; "required": false; "isSignal": true; }; "headingOffset": { "alias": "headingOffset"; "required": false; "isSignal": true; }; "linkPolicy": { "alias": "linkPolicy"; "required": false; "isSignal": true; }; "tokens": { "alias": "tokens"; "required": false; "isSignal": true; }; }, { "navigate": "navigate"; }, ["tokenDefs"], never, true, never>;
8281
8407
  }
8282
8408
 
8283
- export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_MD_LIMITS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAlertActions, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCardHeaderActions, StrctCardHeaderLeading, StrctCardHeaderMeta, StrctCardHeaderNote, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChange, StrctChart, StrctChatAttachment, StrctChatComposer, StrctChatMessage, StrctChatMessageActions, StrctChatThread, StrctCheckbox, StrctChips, StrctCode, StrctCodeInline, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctControlDescription, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatagridActionBarCaption, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDetailPaneActions, StrctDetailPaneMeta, StrctDetailPaneTitle, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownGroup, StrctDropdownItem, StrctDropdownItemAction, StrctDropdownItemDescription, StrctDropdownItemIcon, StrctDropdownItemLabel, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFieldGroup, StrctFieldHint, StrctFieldPrefix, StrctFieldSuffix, StrctFieldValue, StrctFile, StrctFilterBar, StrctFlow, StrctFlowNodeTemplate, StrctFooter, StrctGauge, StrctGroupHeaderDef, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLegend, StrctList, StrctListItem, StrctListItemDescription, StrctListItemLeading, StrctListItemMeta, StrctListItemTrailing, StrctLiveIndicator, StrctLogViewer, StrctLogin, StrctMarkdown, StrctMarkdownToken, StrctMediaFrame, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctModalContent, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPageHeaderTitleMeta, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProgress, StrctQr, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderGroup, StrctReorderHandle, StrctReorderItem, StrctResizeHandle, StrctRowDetailDef, StrctSearchbox, StrctSectionHeader, StrctSectionHeaderActions, StrctSectionHeaderMeta, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctStepAction, StrctSteps, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctTagLeading, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarCaption, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWindow, StrctWindowDock, StrctWindowDockItem, StrctWindowService, StrctWizard, StrctWizardAside, __qrInternals, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, parseInlines, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctCheckHostDisplay, strctCheckHostInputs, strctClassifyHref, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctParseMarkdown, strctQrMatrix, strctValidationIcon, strctValidationTone, unlockBodyScroll };
8284
- export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartAnnotation, StrctChartColor, StrctChartCurve, StrctChartSeries, StrctChartSlot, StrctChartStatus, StrctChartSummaryInfo, StrctChartThreshold, StrctChartType, StrctChatAuthor, StrctColumn, StrctCommandItem, StrctConfirmOptions, StrctConfirmTone, StrctDatagridColumn, StrctDatagridColumnState, StrctDatagridFilters, StrctDatagridGroup, StrctDatagridLabels, StrctDatagridLazyState, StrctDescAlign, StrctDescItem, StrctDiffRow, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctFilterChip, StrctFlowColumn, StrctFlowDirection, StrctFlowEdge, StrctFlowNode, StrctFlowOrientation, StrctHeatmapCell, StrctHeatmapSummaryInfo, StrctHotkey, StrctIconBadge, StrctIconName, StrctKnobStatus, StrctLegendItem, StrctLiveLabels, StrctLiveState, StrctLogLine, StrctMdAlign, StrctMdBlock, StrctMdInline, StrctMdToken, StrctMdTokenizer, StrctMediaState, StrctMenuItem, StrctMenuLink, StrctMenuOpenOptions, StrctMenuPlacement, StrctMenuSection, StrctMenubarItem, StrctMetricStatus, StrctModalSize, StrctMode, StrctNotification, StrctOption, StrctOverlayPlacement, StrctPalette, StrctPaletteInfo, StrctProgressSegment, StrctProgressStatus, StrctQrEcc, StrctRailItem, StrctRailStatus, StrctReorderEvent, StrctReorderMoveEvent, StrctRow, StrctRowId, StrctSegmentedOption, StrctSegmentedSize, StrctSignpostPosition, StrctSpeedDialDirection, StrctSpinnerSize, StrctStatus, StrctStatusDotSize, StrctStepPhase, StrctStepState, StrctStepsLabels, StrctTagStatus, StrctThresholds, StrctTimeRange, StrctTimeRangePreset, StrctTimelineState, StrctToast, StrctToastOptions, StrctToastType, StrctTooltipPosition, StrctTourStep, StrctTransferItem, StrctTreeDropEvent, StrctTreeMenuEvent, StrctTreeNodeData, StrctTreeNodeMenuFn, StrctValidationState, StrctValidationStatus, StrctWindowBounds, StrctWindowLabels, StrctWindowOutsidePointer, StrctWizardDefaults };
8409
+ /** One product (or platform) a person may switch to. */
8410
+ interface StrctProductItem {
8411
+ /** Stable identity, matched against `current`. */
8412
+ id: string;
8413
+ /** The product's full name — the menu row's label, and what a reader hears. */
8414
+ name: string;
8415
+ /** What the chip shows; the full name when omitted. */
8416
+ label?: string;
8417
+ /**
8418
+ * What the chip shows below `shortLabelWidth`. An icon alone does not say
8419
+ * where you are — "Site Recovery" and "Backup" icons are not self-evident —
8420
+ * while a short word fits. The full name stays in the accessible name.
8421
+ */
8422
+ shortLabel?: string;
8423
+ /** Icon name from the icon set. */
8424
+ icon?: string;
8425
+ /** One line of health under the name ("2 VMs past RPO"). */
8426
+ description?: string;
8427
+ /** The dot beside that line. */
8428
+ status?: StrctStatus;
8429
+ /** The product's own colour (a token or value): the icons take it. */
8430
+ tone?: string;
8431
+ /** Render the row as a real router link (middle-click, a new tab). */
8432
+ routerLink?: string | unknown[];
8433
+ /** Render the row as a plain link. */
8434
+ href?: string;
8435
+ disabled?: boolean;
8436
+ }
8437
+ /**
8438
+ * The product switcher every multi-product console grows: a chip beside the
8439
+ * logo saying where you are, opening the products you may use with a line of
8440
+ * health each, and the platform after a divider.
8441
+ *
8442
+ * <strct-product-switcher
8443
+ * [items]="products" [(current)]="productId" [footerItems]="[admin]"
8444
+ * (opened)="loadHealth()" (select)="go($event)" />
8445
+ *
8446
+ * A person offered one product sees a plain chip, not a menu of one.
8447
+ */
8448
+ declare class StrctProductSwitcher {
8449
+ /** The products this person may switch to. */
8450
+ readonly items: _angular_core.InputSignal<readonly StrctProductItem[]>;
8451
+ /** Entries after a divider — the shared platform, administration. */
8452
+ readonly footerItems: _angular_core.InputSignal<readonly StrctProductItem[]>;
8453
+ /** Which product you are in, two-way. */
8454
+ readonly current: _angular_core.ModelSignal<string | null>;
8455
+ /**
8456
+ * What the chip is for, after the product's name:
8457
+ * "HyperStruct Backup — switch product".
8458
+ */
8459
+ readonly switchLabel: _angular_core.InputSignal<string>;
8460
+ /**
8461
+ * Below this width (px) the chip shows each item's `shortLabel` instead of
8462
+ * its label. The full name stays in the accessible name.
8463
+ */
8464
+ readonly shortLabelWidth: _angular_core.InputSignal<number>;
8465
+ /** The menu has opened — read the health lines now, not before. */
8466
+ readonly opened: _angular_core.OutputEmitterRef<void>;
8467
+ /** A product was chosen (plain activation only, as the rail does). */
8468
+ readonly select: _angular_core.OutputEmitterRef<StrctProductItem>;
8469
+ private readonly menu;
8470
+ private readonly narrow;
8471
+ private wasOpen;
8472
+ /** With one product and nowhere else to go, there is no menu to open. */
8473
+ protected readonly hasMenu: _angular_core.Signal<boolean>;
8474
+ protected readonly currentItem: _angular_core.Signal<StrctProductItem>;
8475
+ protected readonly chipText: _angular_core.Signal<string>;
8476
+ protected readonly chipAriaLabel: _angular_core.Signal<string>;
8477
+ constructor();
8478
+ protected pick(item: StrctProductItem, event?: MouseEvent): void;
8479
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctProductSwitcher, never>;
8480
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctProductSwitcher, "strct-product-switcher", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "footerItems": { "alias": "footerItems"; "required": false; "isSignal": true; }; "current": { "alias": "current"; "required": false; "isSignal": true; }; "switchLabel": { "alias": "switchLabel"; "required": false; "isSignal": true; }; "shortLabelWidth": { "alias": "shortLabelWidth"; "required": false; "isSignal": true; }; }, { "current": "currentChange"; "opened": "opened"; "select": "select"; }, never, never, true, never>;
8481
+ }
8482
+
8483
+ export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_MD_LIMITS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAlertActions, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCardHeaderActions, StrctCardHeaderLeading, StrctCardHeaderMeta, StrctCardHeaderNote, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChange, StrctChart, StrctChatAttachment, StrctChatComposer, StrctChatMessage, StrctChatMessageActions, StrctChatThread, StrctCheckbox, StrctChips, StrctCode, StrctCodeInline, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctControlDescription, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatagridActionBarCaption, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDetailPaneActions, StrctDetailPaneMeta, StrctDetailPaneTitle, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownGroup, StrctDropdownItem, StrctDropdownItemAction, StrctDropdownItemDescription, StrctDropdownItemIcon, StrctDropdownItemLabel, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFieldGroup, StrctFieldHint, StrctFieldPrefix, StrctFieldSuffix, StrctFieldValue, StrctFile, StrctFilterBar, StrctFlow, StrctFlowNodeTemplate, StrctFooter, StrctGauge, StrctGroupHeaderDef, StrctHeader, StrctHeaderAction, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLegend, StrctList, StrctListItem, StrctListItemDescription, StrctListItemLeading, StrctListItemMeta, StrctListItemTrailing, StrctLiveIndicator, StrctLogViewer, StrctLogin, StrctMarkdown, StrctMarkdownToken, StrctMediaFrame, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctModalContent, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPageHeaderTitleMeta, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProductSwitcher, StrctProgress, StrctQr, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderGroup, StrctReorderHandle, StrctReorderItem, StrctResizeHandle, StrctRowDetailDef, StrctSearchbox, StrctSectionHeader, StrctSectionHeaderActions, StrctSectionHeaderMeta, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctStepAction, StrctSteps, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctTagLeading, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarCaption, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWindow, StrctWindowDock, StrctWindowDockItem, StrctWindowService, StrctWizard, StrctWizardAside, __qrInternals, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, parseInlines, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctCheckHostDisplay, strctCheckHostInputs, strctClassifyHref, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctParseMarkdown, strctQrMatrix, strctValidationIcon, strctValidationTone, unlockBodyScroll };
8484
+ export type { StrctAlertType, StrctAvatarSize, StrctAvatarStatus, StrctBadgeStatus, StrctButtonSize, StrctButtonVariant, StrctCascadeOption, StrctCellContext, StrctChartAnnotation, StrctChartColor, StrctChartCurve, StrctChartSeries, StrctChartSlot, StrctChartStatus, StrctChartSummaryInfo, StrctChartThreshold, StrctChartType, StrctChatAuthor, StrctColumn, StrctCommandItem, StrctConfirmOptions, StrctConfirmTone, StrctDatagridColumn, StrctDatagridColumnState, StrctDatagridFilters, StrctDatagridGroup, StrctDatagridLabels, StrctDatagridLazyState, StrctDescAlign, StrctDescItem, StrctDiffRow, StrctDonutSegment, StrctDrawerSide, StrctDrawerSize, StrctEmptyVariant, StrctFilterChip, StrctFlowColumn, StrctFlowDirection, StrctFlowEdge, StrctFlowNode, StrctFlowOrientation, StrctHeaderActionConfig, StrctHeatmapCell, StrctHeatmapSummaryInfo, StrctHotkey, StrctIconBadge, StrctIconName, StrctKnobStatus, StrctLegendItem, StrctLiveLabels, StrctLiveState, StrctLogLine, StrctMdAlign, StrctMdBlock, StrctMdInline, StrctMdToken, StrctMdTokenizer, StrctMediaState, StrctMenuItem, StrctMenuLink, StrctMenuOpenOptions, StrctMenuPlacement, StrctMenuSection, StrctMenubarItem, StrctMetricStatus, StrctModalSize, StrctMode, StrctNotification, StrctOption, StrctOverlayPlacement, StrctPalette, StrctPaletteInfo, StrctProductItem, StrctProgressSegment, StrctProgressStatus, StrctQrEcc, StrctRailItem, StrctRailStatus, StrctReorderEvent, StrctReorderMoveEvent, StrctRow, StrctRowId, StrctSegmentedOption, StrctSegmentedSize, StrctSignpostPosition, StrctSpeedDialDirection, StrctSpinnerSize, StrctStatus, StrctStatusDotSize, StrctStepPhase, StrctStepState, StrctStepsLabels, StrctTagStatus, StrctThresholds, StrctTimeRange, StrctTimeRangePreset, StrctTimelineState, StrctToast, StrctToastOptions, StrctToastType, StrctTooltipPosition, StrctTourStep, StrctTransferItem, StrctTreeDropEvent, StrctTreeMenuEvent, StrctTreeNodeData, StrctTreeNodeMenuFn, StrctValidationState, StrctValidationStatus, StrctWindowBounds, StrctWindowLabels, StrctWindowOutsidePointer, StrctWizardDefaults };