@akcelik/strct 4.5.0 → 4.7.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, DOCUMENT, signal, computed, Injectable, input, isDevMode, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, NgZone, booleanAttribute, afterNextRender, Directive, model, output, HostListener, contentChildren, effect, ApplicationRef, EnvironmentInjector, createComponent, PLATFORM_ID, forwardRef, DestroyRef, TemplateRef, contentChild, viewChild, InjectionToken, untracked, ViewContainerRef, Injector, viewChildren, Renderer2, Pipe, afterRenderEffect } from '@angular/core';
2
+ import { inject, DOCUMENT, signal, computed, Injectable, input, isDevMode, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, NgZone, booleanAttribute, afterNextRender, Directive, model, output, contentChildren, HostListener, effect, ApplicationRef, EnvironmentInjector, createComponent, PLATFORM_ID, forwardRef, DestroyRef, TemplateRef, contentChild, viewChild, InjectionToken, untracked, ViewContainerRef, Injector, viewChildren, Renderer2, Pipe, afterRenderEffect } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
4
  import { NgTemplateOutlet, DOCUMENT as DOCUMENT$1, isPlatformBrowser } from '@angular/common';
5
5
  import { RouterLink, RouterLinkActive } from '@angular/router';
@@ -1587,6 +1587,172 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
1587
1587
  }, styles: [".strct-ph{display:block}.strct-ph--divider{padding-bottom:16px;border-bottom:1px solid var(--b1)}.strct-ph__crumbs:empty{display:none}.strct-ph__crumbs{margin-bottom:6px}.strct-ph__row{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.strct-ph__text{flex:1;min-width:0}.strct-ph__titlerow{display:flex;align-items:baseline;gap:var(--space-2);min-width:0;flex-wrap:wrap}.strct-ph__icon{align-self:center;color:var(--t2);flex:none}.strct-ph__titlemeta:empty{display:none}.strct-ph__titlemeta{display:inline-flex;align-items:center;gap:var(--space-2)}.strct-ph--pane .strct-ph__title{font-size:var(--text-lg);font-weight:600;letter-spacing:0}.strct-ph__title{margin:0;font-size:var(--text-2xl);font-weight:700;letter-spacing:-.01em;color:var(--t1);text-wrap:balance}.strct-ph__subtitle{margin:6px 0 0;font-size:13px;line-height:1.55;color:var(--t2);max-width:72ch}.strct-ph__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.strct-ph__actions:empty{display:none}\n"] }]
1588
1588
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], divider: [{ type: i0.Input, args: [{ isSignal: true, alias: "divider", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }] } });
1589
1589
 
1590
+ /** Leading marker of a row — a badge, a status dot, an icon. */
1591
+ class StrctListItemLeading {
1592
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemLeading, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1593
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: StrctListItemLeading, isStandalone: true, selector: "[strctListItemLeading]", ngImport: i0 });
1594
+ }
1595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemLeading, decorators: [{
1596
+ type: Directive,
1597
+ args: [{ selector: '[strctListItemLeading]' }]
1598
+ }] });
1599
+ /** Secondary line under the row's title. */
1600
+ class StrctListItemDescription {
1601
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1602
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: StrctListItemDescription, isStandalone: true, selector: "[strctListItemDescription]", ngImport: i0 });
1603
+ }
1604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemDescription, decorators: [{
1605
+ type: Directive,
1606
+ args: [{ selector: '[strctListItemDescription]' }]
1607
+ }] });
1608
+ /** Quiet text at the end of the row — a time, a count. */
1609
+ class StrctListItemMeta {
1610
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1611
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: StrctListItemMeta, isStandalone: true, selector: "[strctListItemMeta]", ngImport: i0 });
1612
+ }
1613
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemMeta, decorators: [{
1614
+ type: Directive,
1615
+ args: [{ selector: '[strctListItemMeta]' }]
1616
+ }] });
1617
+ /** Controls after the meta — a button, a menu trigger. Its own tab stop. */
1618
+ class StrctListItemTrailing {
1619
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemTrailing, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1620
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.4", type: StrctListItemTrailing, isStandalone: true, selector: "[strctListItemTrailing]", ngImport: i0 });
1621
+ }
1622
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItemTrailing, decorators: [{
1623
+ type: Directive,
1624
+ args: [{ selector: '[strctListItemTrailing]' }]
1625
+ }] });
1626
+ /**
1627
+ * One row of a {@link StrctList}: leading · title / description · meta ·
1628
+ * trailing.
1629
+ *
1630
+ * `interactive` makes the row itself activate (click, Enter or Space) and emit
1631
+ * `activated`, while anything in `[strctListItemTrailing]` stays a separate tab
1632
+ * stop — so "open this alarm" and "acknowledge it" are two different targets.
1633
+ *
1634
+ * The row carries `role="button"` rather than being a `<button>` element: a
1635
+ * template can project the same content into only one place, so branching the
1636
+ * markup on `interactive` would drop it in the other branch. `strct-tree` rows
1637
+ * work the same way.
1638
+ */
1639
+ class StrctListItem {
1640
+ /** The row activates on click / Enter / Space and emits `activated`. */
1641
+ interactive = input(false, { ...(ngDevMode ? { debugName: "interactive" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1642
+ /** Marks the current row (`aria-current`). */
1643
+ selected = input(false, { ...(ngDevMode ? { debugName: "selected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1644
+ /** Optional leading rail, as `strct-card [status]`. */
1645
+ status = input(null, /* @ts-ignore */
1646
+ ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
1647
+ /** Emitted when an `interactive` row is activated. */
1648
+ activated = output();
1649
+ onActivate() {
1650
+ if (this.interactive())
1651
+ this.activated.emit();
1652
+ }
1653
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
1654
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: StrctListItem, isStandalone: true, selector: "strct-list-item", inputs: { interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activated: "activated" }, host: { attributes: { "role": "listitem" }, properties: { "class.strct-li--interactive": "interactive()", "class.strct-li--selected": "selected()", "class.strct-li--status": "status()", "attr.data-status": "status()" }, classAttribute: "strct-li" }, ngImport: i0, template: `
1655
+ <div
1656
+ class="strct-li__main"
1657
+ [attr.role]="interactive() ? 'button' : null"
1658
+ [attr.tabindex]="interactive() ? 0 : null"
1659
+ [attr.aria-current]="selected() ? 'true' : null"
1660
+ (click)="onActivate()"
1661
+ (keydown.enter)="onActivate()"
1662
+ (keydown.space)="$event.preventDefault(); onActivate()"
1663
+ >
1664
+ <span class="strct-li__leading"><ng-content select="[strctListItemLeading]" /></span>
1665
+ <span class="strct-li__text">
1666
+ <span class="strct-li__title"><ng-content /></span>
1667
+ <span class="strct-li__desc"><ng-content select="[strctListItemDescription]" /></span>
1668
+ </span>
1669
+ <span class="strct-li__meta"><ng-content select="[strctListItemMeta]" /></span>
1670
+ </div>
1671
+ <span class="strct-li__trailing"><ng-content select="[strctListItemTrailing]" /></span>
1672
+ `, isInline: true, styles: [".strct-li{display:flex;align-items:center;gap:var(--space-2);padding-inline:var(--space-3);position:relative}.strct-list--dividers .strct-li+.strct-li{border-block-start:1px solid var(--b1)}.strct-li__main{display:flex;align-items:center;gap:var(--space-2);flex:1;min-width:0;min-height:44px;padding-block:6px;text-align:start;border-radius:var(--radius-sm)}.strct-list--dense .strct-li__main{min-height:32px;padding-block:2px}.strct-li--interactive .strct-li__main{cursor:pointer}.strct-li--interactive:hover{background:var(--bg-2)}.strct-li--selected{background:var(--acc-s)}.strct-li__main:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-li--status:before{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;width:2px;background:var(--t3)}.strct-li[data-status=accent]:before{background:var(--acc)}.strct-li[data-status=success]:before{background:var(--success)}.strct-li[data-status=warning]:before{background:var(--warning)}.strct-li[data-status=critical]:before{background:var(--critical)}.strct-li__leading:empty,.strct-li__meta:empty,.strct-li__desc:empty,.strct-li__trailing:empty{display:none}.strct-li__leading{display:inline-flex;align-items:center;flex:none}.strct-li__text{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}.strct-li__title{font-size:var(--text-md);color:var(--t1);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-li__desc{font-size:var(--text-sm);color:var(--t3);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-li__meta{display:inline-flex;align-items:center;flex:none;font-size:var(--text-sm);color:var(--t3);white-space:nowrap}.strct-li__trailing{display:inline-flex;align-items:center;gap:var(--space-2);flex:none}@container (max-width: 360px){.strct-li__main{flex-wrap:wrap}.strct-li__meta{flex-basis:100%;padding-inline-start:0}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1673
+ }
1674
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctListItem, decorators: [{
1675
+ type: Component,
1676
+ args: [{ selector: 'strct-list-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
1677
+ <div
1678
+ class="strct-li__main"
1679
+ [attr.role]="interactive() ? 'button' : null"
1680
+ [attr.tabindex]="interactive() ? 0 : null"
1681
+ [attr.aria-current]="selected() ? 'true' : null"
1682
+ (click)="onActivate()"
1683
+ (keydown.enter)="onActivate()"
1684
+ (keydown.space)="$event.preventDefault(); onActivate()"
1685
+ >
1686
+ <span class="strct-li__leading"><ng-content select="[strctListItemLeading]" /></span>
1687
+ <span class="strct-li__text">
1688
+ <span class="strct-li__title"><ng-content /></span>
1689
+ <span class="strct-li__desc"><ng-content select="[strctListItemDescription]" /></span>
1690
+ </span>
1691
+ <span class="strct-li__meta"><ng-content select="[strctListItemMeta]" /></span>
1692
+ </div>
1693
+ <span class="strct-li__trailing"><ng-content select="[strctListItemTrailing]" /></span>
1694
+ `, host: {
1695
+ class: 'strct-li',
1696
+ role: 'listitem',
1697
+ '[class.strct-li--interactive]': 'interactive()',
1698
+ '[class.strct-li--selected]': 'selected()',
1699
+ '[class.strct-li--status]': 'status()',
1700
+ '[attr.data-status]': 'status()',
1701
+ }, styles: [".strct-li{display:flex;align-items:center;gap:var(--space-2);padding-inline:var(--space-3);position:relative}.strct-list--dividers .strct-li+.strct-li{border-block-start:1px solid var(--b1)}.strct-li__main{display:flex;align-items:center;gap:var(--space-2);flex:1;min-width:0;min-height:44px;padding-block:6px;text-align:start;border-radius:var(--radius-sm)}.strct-list--dense .strct-li__main{min-height:32px;padding-block:2px}.strct-li--interactive .strct-li__main{cursor:pointer}.strct-li--interactive:hover{background:var(--bg-2)}.strct-li--selected{background:var(--acc-s)}.strct-li__main:focus-visible{outline:2px solid var(--acc50);outline-offset:-2px}.strct-li--status:before{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;width:2px;background:var(--t3)}.strct-li[data-status=accent]:before{background:var(--acc)}.strct-li[data-status=success]:before{background:var(--success)}.strct-li[data-status=warning]:before{background:var(--warning)}.strct-li[data-status=critical]:before{background:var(--critical)}.strct-li__leading:empty,.strct-li__meta:empty,.strct-li__desc:empty,.strct-li__trailing:empty{display:none}.strct-li__leading{display:inline-flex;align-items:center;flex:none}.strct-li__text{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}.strct-li__title{font-size:var(--text-md);color:var(--t1);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-li__desc{font-size:var(--text-sm);color:var(--t3);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-li__meta{display:inline-flex;align-items:center;flex:none;font-size:var(--text-sm);color:var(--t3);white-space:nowrap}.strct-li__trailing{display:inline-flex;align-items:center;gap:var(--space-2);flex:none}@container (max-width: 360px){.strct-li__main{flex-wrap:wrap}.strct-li__meta{flex-basis:100%;padding-inline-start:0}}\n"] }]
1702
+ }], propDecorators: { interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], activated: [{ type: i0.Output, args: ["activated"] }] } });
1703
+ /**
1704
+ * A short list of things with a status — alarms, findings, clusters in a
1705
+ * summary. A table needs a header row and columns, a timeline implies time
1706
+ * order, and an alert per item is too heavy; without a list every screen
1707
+ * invents its own rows.
1708
+ *
1709
+ * <strct-list dense [label]="'Active alarms'">
1710
+ * <strct-list-item interactive (activated)="open(a)">
1711
+ * <strct-badge strctListItemLeading status="critical">Critical</strct-badge>
1712
+ * {{ a.name }}
1713
+ * <span strctListItemDescription>{{ a.object }}</span>
1714
+ * <span strctListItemMeta>{{ a.when }}</span>
1715
+ * <button strctListItemTrailing strct-button size="mini" variant="flat">Acknowledge</button>
1716
+ * </strct-list-item>
1717
+ * </strct-list>
1718
+ */
1719
+ class StrctList {
1720
+ /** 32px rows instead of 44px. */
1721
+ dense = input(false, { ...(ngDevMode ? { debugName: "dense" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1722
+ /** Hairline between rows. */
1723
+ dividers = input(true, { ...(ngDevMode ? { debugName: "dividers" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1724
+ /** Shown when the list has no items. */
1725
+ emptyText = input('', /* @ts-ignore */
1726
+ ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
1727
+ /** Accessible name of the list. */
1728
+ label = input('', /* @ts-ignore */
1729
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
1730
+ items = contentChildren(StrctListItem, /* @ts-ignore */
1731
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1732
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctList, deps: [], target: i0.ɵɵFactoryTarget.Component });
1733
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctList, isStandalone: true, selector: "strct-list", inputs: { dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, dividers: { classPropertyName: "dividers", publicName: "dividers", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" }, properties: { "attr.aria-label": "label() || null", "class.strct-list--dense": "dense()", "class.strct-list--dividers": "dividers()" }, classAttribute: "strct-list" }, queries: [{ propertyName: "items", predicate: StrctListItem, isSignal: true }], ngImport: i0, template: `
1734
+ <ng-content />
1735
+ @if (emptyText() && !items().length) {
1736
+ <p class="strct-list__empty">{{ emptyText() }}</p>
1737
+ }
1738
+ `, isInline: true, styles: [".strct-list{display:block;container-type:inline-size}.strct-list__empty{margin:0;padding:var(--space-3);font-size:var(--text-sm);color:var(--t3)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1739
+ }
1740
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctList, decorators: [{
1741
+ type: Component,
1742
+ args: [{ selector: 'strct-list', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
1743
+ <ng-content />
1744
+ @if (emptyText() && !items().length) {
1745
+ <p class="strct-list__empty">{{ emptyText() }}</p>
1746
+ }
1747
+ `, host: {
1748
+ class: 'strct-list',
1749
+ role: 'list',
1750
+ '[attr.aria-label]': 'label() || null',
1751
+ '[class.strct-list--dense]': 'dense()',
1752
+ '[class.strct-list--dividers]': 'dividers()',
1753
+ }, styles: [".strct-list{display:block;container-type:inline-size}.strct-list__empty{margin:0;padding:var(--space-3);font-size:var(--text-sm);color:var(--t3)}\n"] }]
1754
+ }], propDecorators: { dense: [{ type: i0.Input, args: [{ isSignal: true, alias: "dense", required: false }] }], dividers: [{ type: i0.Input, args: [{ isSignal: true, alias: "dividers", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctListItem), { isSignal: true }] }] } });
1755
+
1590
1756
  /** Follows the heading on its line — a badge, a count, a status dot. */
1591
1757
  class StrctSectionHeaderMeta {
1592
1758
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctSectionHeaderMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -1890,7 +2056,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
1890
2056
  }, styles: [".strct-av{position:relative;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;flex-shrink:0;background:var(--bg-3);color:var(--t1);overflow:visible;font-size:13px;font-weight:600;-webkit-user-select:none;user-select:none;border:1px solid var(--b2)}.strct-av--sm{width:26px;height:26px;font-size:12px}.strct-av--lg{width:48px;height:48px;font-size:17px}.strct-av__img{width:100%;height:100%;border-radius:50%;object-fit:cover}.strct-av__initials{line-height:1}.strct-av__status{position:absolute;inset-inline-end:-1px;bottom:-1px;width:30%;height:30%;min-width:8px;min-height:8px;border-radius:50%;border:2px solid var(--bg-1);background:var(--t3)}.strct-av--online .strct-av__status{background:var(--success)}.strct-av--busy .strct-av__status{background:var(--critical)}.strct-av--offline .strct-av__status{background:var(--t3)}\n"] }]
1891
2057
  }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }] } });
1892
2058
 
1893
- /** Horizontal value/usage bar. `<strct-progress [value]="72" status="warning" />`. */
2059
+ /**
2060
+ * Horizontal value/usage bar. `<strct-progress [value]="72" status="warning" />`.
2061
+ *
2062
+ * **Meter mode.** A capacity bar says what it measures and how much, next to
2063
+ * the bar: `visibleLabel` puts `label` at the start of a row above the track,
2064
+ * `showValue` puts `valueText` (default `${value}%`) at its end, and `caption`
2065
+ * adds a quiet line under it. `segments` stacks more than one fill, and
2066
+ * `indeterminate` is a task that is running but reports no percentage. Every
2067
+ * one of these is off by default, so a plain bar renders exactly as before.
2068
+ */
1894
2069
  class StrctProgress {
1895
2070
  /** Current value. */
1896
2071
  value = input(0, /* @ts-ignore */
@@ -1901,6 +2076,21 @@ class StrctProgress {
1901
2076
  /** Visual status color. */
1902
2077
  status = input('accent', /* @ts-ignore */
1903
2078
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
2079
+ /** Show `label` above the bar as well as announcing it. */
2080
+ visibleLabel = input(false, { ...(ngDevMode ? { debugName: "visibleLabel" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2081
+ /** Show the value at the end of the row above the bar. */
2082
+ showValue = input(false, { ...(ngDevMode ? { debugName: "showValue" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2083
+ /** What `showValue` prints — "293 GB of 512 GB". Defaults to `${value}%`. */
2084
+ valueText = input('', /* @ts-ignore */
2085
+ ...(ngDevMode ? [{ debugName: "valueText" }] : /* istanbul ignore next */ []));
2086
+ /** A quiet line under the bar — "219 GB free across 2 nodes". */
2087
+ caption = input('', /* @ts-ignore */
2088
+ ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
2089
+ /** Running, but with no percentage to report. */
2090
+ indeterminate = input(false, { ...(ngDevMode ? { debugName: "indeterminate" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2091
+ /** Stack several fills (used now + what would arrive); clamped to 100 total. */
2092
+ segments = input(null, /* @ts-ignore */
2093
+ ...(ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []));
1904
2094
  /**
1905
2095
  * Optional value-driven thresholds. When set, the component picks its own
1906
2096
  * status from the value instead of the caller computing it: `value >= critical`
@@ -1912,6 +2102,30 @@ class StrctProgress {
1912
2102
  ...(ngDevMode ? [{ debugName: "thresholds" }] : /* istanbul ignore next */ []));
1913
2103
  clamped = computed(() => Math.max(0, Math.min(100, this.value())), /* @ts-ignore */
1914
2104
  ...(ngDevMode ? [{ debugName: "clamped" }] : /* istanbul ignore next */ []));
2105
+ /** Segments as widths that together never exceed the track. */
2106
+ stacked = computed(() => {
2107
+ const segments = this.segments();
2108
+ if (!segments?.length)
2109
+ return null;
2110
+ let left = 100;
2111
+ return segments.map((s) => {
2112
+ const width = Math.max(0, Math.min(s.value, left));
2113
+ left -= width;
2114
+ return { width, status: s.status ?? this.resolvedStatus() };
2115
+ });
2116
+ }, /* @ts-ignore */
2117
+ ...(ngDevMode ? [{ debugName: "stacked" }] : /* istanbul ignore next */ []));
2118
+ /** What a screen reader reads instead of the bare number. */
2119
+ valueDescription = computed(() => {
2120
+ if (this.indeterminate())
2121
+ return 'In progress';
2122
+ const segments = this.segments();
2123
+ if (segments?.length) {
2124
+ return segments.map((s) => `${s.label ? s.label + ' ' : ''}${s.value}%`).join(', ');
2125
+ }
2126
+ return this.valueText() || null;
2127
+ }, /* @ts-ignore */
2128
+ ...(ngDevMode ? [{ debugName: "valueDescription" }] : /* istanbul ignore next */ []));
1915
2129
  /** Status after applying thresholds (falls back to `status` when none set). */
1916
2130
  resolvedStatus = computed(() => {
1917
2131
  const t = this.thresholds();
@@ -1927,39 +2141,90 @@ class StrctProgress {
1927
2141
  }, /* @ts-ignore */
1928
2142
  ...(ngDevMode ? [{ debugName: "resolvedStatus" }] : /* istanbul ignore next */ []));
1929
2143
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctProgress, deps: [], target: i0.ɵɵFactoryTarget.Component });
1930
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: StrctProgress, isStandalone: true, selector: "strct-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, thresholds: { classPropertyName: "thresholds", publicName: "thresholds", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.strct-progress--success": "resolvedStatus() === 'success'", "class.strct-progress--warning": "resolvedStatus() === 'warning'", "class.strct-progress--critical": "resolvedStatus() === 'critical'" }, classAttribute: "strct-progress" }, ngImport: i0, template: `
2144
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctProgress, isStandalone: true, selector: "strct-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, visibleLabel: { classPropertyName: "visibleLabel", publicName: "visibleLabel", isSignal: true, isRequired: false, transformFunction: null }, showValue: { classPropertyName: "showValue", publicName: "showValue", isSignal: true, isRequired: false, transformFunction: null }, valueText: { classPropertyName: "valueText", publicName: "valueText", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, thresholds: { classPropertyName: "thresholds", publicName: "thresholds", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.strct-progress--neutral": "resolvedStatus() === 'neutral'", "class.strct-progress--success": "resolvedStatus() === 'success'", "class.strct-progress--warning": "resolvedStatus() === 'warning'", "class.strct-progress--critical": "resolvedStatus() === 'critical'" }, classAttribute: "strct-progress" }, ngImport: i0, template: `
2145
+ @if (visibleLabel() || showValue()) {
2146
+ <div class="strct-progress__row">
2147
+ @if (visibleLabel()) {
2148
+ <span class="strct-progress__label">{{ label() }}</span>
2149
+ }
2150
+ @if (showValue()) {
2151
+ <span class="strct-progress__value">{{ valueText() || clamped() + '%' }}</span>
2152
+ }
2153
+ </div>
2154
+ }
1931
2155
  <div
1932
2156
  class="strct-progress__track"
1933
2157
  role="progressbar"
1934
2158
  [attr.aria-label]="label() || 'Progress'"
1935
- [attr.aria-valuenow]="clamped()"
1936
- aria-valuemin="0"
1937
- aria-valuemax="100"
2159
+ [attr.aria-valuenow]="indeterminate() ? null : clamped()"
2160
+ [attr.aria-valuetext]="valueDescription()"
2161
+ [attr.aria-valuemin]="indeterminate() ? null : 0"
2162
+ [attr.aria-valuemax]="indeterminate() ? null : 100"
1938
2163
  >
1939
- <div class="strct-progress__fill" [style.width.%]="clamped()"></div>
2164
+ @if (indeterminate()) {
2165
+ <div class="strct-progress__fill strct-progress__fill--indeterminate"></div>
2166
+ } @else if (stacked(); as parts) {
2167
+ @for (part of parts; track $index) {
2168
+ <div
2169
+ class="strct-progress__fill strct-progress__fill--{{ part.status }}"
2170
+ [style.width.%]="part.width"
2171
+ ></div>
2172
+ }
2173
+ } @else {
2174
+ <div class="strct-progress__fill" [style.width.%]="clamped()"></div>
2175
+ }
1940
2176
  </div>
1941
- `, isInline: true, styles: [".strct-progress{display:block}.strct-progress__track{height:6px;border-radius:var(--radius-sm);background:var(--strct-progress-track, color-mix(in srgb, var(--t1) 12%, transparent));box-shadow:inset 0 0 0 1px var(--b2);overflow:hidden}.strct-progress__fill{height:100%;border-radius:var(--radius-sm);background:var(--acc);transition:width .3s ease}.strct-progress--success .strct-progress__fill{background:var(--success)}.strct-progress--warning .strct-progress__fill{background:var(--warning)}.strct-progress--critical .strct-progress__fill{background:var(--critical)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2177
+ @if (caption()) {
2178
+ <p class="strct-progress__caption">{{ caption() }}</p>
2179
+ }
2180
+ `, isInline: true, styles: [".strct-progress{display:block}.strct-progress__row{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2);margin-block-end:4px;font-size:var(--text-sm)}.strct-progress__label{color:var(--t2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-progress__value{color:var(--t1);font-variant-numeric:tabular-nums;white-space:nowrap}.strct-progress__caption{margin:4px 0 0;font-size:var(--text-sm);line-height:1.5;color:var(--t3)}.strct-progress__track{position:relative;display:flex;height:6px;border-radius:var(--radius-sm);background:var(--strct-progress-track, color-mix(in srgb, var(--t1) 12%, transparent));box-shadow:inset 0 0 0 1px var(--b2);overflow:hidden}.strct-progress__fill{height:100%;border-radius:var(--radius-sm);background:var(--acc);transition:width .3s ease}.strct-progress--neutral .strct-progress__fill{background:var(--t3)}.strct-progress--success .strct-progress__fill{background:var(--success)}.strct-progress--warning .strct-progress__fill{background:var(--warning)}.strct-progress--critical .strct-progress__fill{background:var(--critical)}.strct-progress .strct-progress__fill--neutral{background:var(--t3)}.strct-progress .strct-progress__fill--accent{background:var(--acc)}.strct-progress .strct-progress__fill--success{background:var(--success)}.strct-progress .strct-progress__fill--warning{background:var(--warning)}.strct-progress .strct-progress__fill--critical{background:var(--critical)}.strct-progress__track .strct-progress__fill+.strct-progress__fill{border-start-start-radius:0;border-end-start-radius:0}.strct-progress .strct-progress__fill--indeterminate{width:35%;animation:strct-progress-sweep 1.1s ease-in-out infinite}@keyframes strct-progress-sweep{0%{transform:translate(-120%)}to{transform:translate(340%)}}@media(prefers-reduced-motion:reduce){.strct-progress .strct-progress__fill--indeterminate{width:100%;animation:none;background:repeating-linear-gradient(135deg,var(--acc) 0 6px,color-mix(in srgb,var(--acc) 45%,transparent) 6px 12px)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1942
2181
  }
1943
2182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctProgress, decorators: [{
1944
2183
  type: Component,
1945
2184
  args: [{ selector: 'strct-progress', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
2185
+ @if (visibleLabel() || showValue()) {
2186
+ <div class="strct-progress__row">
2187
+ @if (visibleLabel()) {
2188
+ <span class="strct-progress__label">{{ label() }}</span>
2189
+ }
2190
+ @if (showValue()) {
2191
+ <span class="strct-progress__value">{{ valueText() || clamped() + '%' }}</span>
2192
+ }
2193
+ </div>
2194
+ }
1946
2195
  <div
1947
2196
  class="strct-progress__track"
1948
2197
  role="progressbar"
1949
2198
  [attr.aria-label]="label() || 'Progress'"
1950
- [attr.aria-valuenow]="clamped()"
1951
- aria-valuemin="0"
1952
- aria-valuemax="100"
2199
+ [attr.aria-valuenow]="indeterminate() ? null : clamped()"
2200
+ [attr.aria-valuetext]="valueDescription()"
2201
+ [attr.aria-valuemin]="indeterminate() ? null : 0"
2202
+ [attr.aria-valuemax]="indeterminate() ? null : 100"
1953
2203
  >
1954
- <div class="strct-progress__fill" [style.width.%]="clamped()"></div>
2204
+ @if (indeterminate()) {
2205
+ <div class="strct-progress__fill strct-progress__fill--indeterminate"></div>
2206
+ } @else if (stacked(); as parts) {
2207
+ @for (part of parts; track $index) {
2208
+ <div
2209
+ class="strct-progress__fill strct-progress__fill--{{ part.status }}"
2210
+ [style.width.%]="part.width"
2211
+ ></div>
2212
+ }
2213
+ } @else {
2214
+ <div class="strct-progress__fill" [style.width.%]="clamped()"></div>
2215
+ }
1955
2216
  </div>
2217
+ @if (caption()) {
2218
+ <p class="strct-progress__caption">{{ caption() }}</p>
2219
+ }
1956
2220
  `, host: {
1957
2221
  class: 'strct-progress',
2222
+ '[class.strct-progress--neutral]': "resolvedStatus() === 'neutral'",
1958
2223
  '[class.strct-progress--success]': "resolvedStatus() === 'success'",
1959
2224
  '[class.strct-progress--warning]': "resolvedStatus() === 'warning'",
1960
2225
  '[class.strct-progress--critical]': "resolvedStatus() === 'critical'",
1961
- }, styles: [".strct-progress{display:block}.strct-progress__track{height:6px;border-radius:var(--radius-sm);background:var(--strct-progress-track, color-mix(in srgb, var(--t1) 12%, transparent));box-shadow:inset 0 0 0 1px var(--b2);overflow:hidden}.strct-progress__fill{height:100%;border-radius:var(--radius-sm);background:var(--acc);transition:width .3s ease}.strct-progress--success .strct-progress__fill{background:var(--success)}.strct-progress--warning .strct-progress__fill{background:var(--warning)}.strct-progress--critical .strct-progress__fill{background:var(--critical)}\n"] }]
1962
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], thresholds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thresholds", required: false }] }] } });
2226
+ }, styles: [".strct-progress{display:block}.strct-progress__row{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2);margin-block-end:4px;font-size:var(--text-sm)}.strct-progress__label{color:var(--t2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.strct-progress__value{color:var(--t1);font-variant-numeric:tabular-nums;white-space:nowrap}.strct-progress__caption{margin:4px 0 0;font-size:var(--text-sm);line-height:1.5;color:var(--t3)}.strct-progress__track{position:relative;display:flex;height:6px;border-radius:var(--radius-sm);background:var(--strct-progress-track, color-mix(in srgb, var(--t1) 12%, transparent));box-shadow:inset 0 0 0 1px var(--b2);overflow:hidden}.strct-progress__fill{height:100%;border-radius:var(--radius-sm);background:var(--acc);transition:width .3s ease}.strct-progress--neutral .strct-progress__fill{background:var(--t3)}.strct-progress--success .strct-progress__fill{background:var(--success)}.strct-progress--warning .strct-progress__fill{background:var(--warning)}.strct-progress--critical .strct-progress__fill{background:var(--critical)}.strct-progress .strct-progress__fill--neutral{background:var(--t3)}.strct-progress .strct-progress__fill--accent{background:var(--acc)}.strct-progress .strct-progress__fill--success{background:var(--success)}.strct-progress .strct-progress__fill--warning{background:var(--warning)}.strct-progress .strct-progress__fill--critical{background:var(--critical)}.strct-progress__track .strct-progress__fill+.strct-progress__fill{border-start-start-radius:0;border-end-start-radius:0}.strct-progress .strct-progress__fill--indeterminate{width:35%;animation:strct-progress-sweep 1.1s ease-in-out infinite}@keyframes strct-progress-sweep{0%{transform:translate(-120%)}to{transform:translate(340%)}}@media(prefers-reduced-motion:reduce){.strct-progress .strct-progress__fill--indeterminate{width:100%;animation:none;background:repeating-linear-gradient(135deg,var(--acc) 0 6px,color-mix(in srgb,var(--acc) 45%,transparent) 6px 12px)}}\n"] }]
2227
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], visibleLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibleLabel", required: false }] }], showValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "showValue", required: false }] }], valueText: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueText", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], segments: [{ type: i0.Input, args: [{ isSignal: true, alias: "segments", required: false }] }], thresholds: [{ type: i0.Input, args: [{ isSignal: true, alias: "thresholds", required: false }] }] } });
1963
2228
 
1964
2229
  /** Indeterminate loading ring. `<strct-spinner size="sm" />`. */
1965
2230
  class StrctSpinner {
@@ -1969,19 +2234,37 @@ class StrctSpinner {
1969
2234
  /** Accessible label (localizable). */
1970
2235
  label = input('Loading', /* @ts-ignore */
1971
2236
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2237
+ /**
2238
+ * Visible text beside the ring — "Reading…". It becomes the accessible name
2239
+ * too, so the spinner is not announced as "Loading" while it says something
2240
+ * else on screen.
2241
+ */
2242
+ caption = input('', /* @ts-ignore */
2243
+ ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
1972
2244
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctSpinner, deps: [], target: i0.ɵɵFactoryTarget.Component });
1973
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.4", type: StrctSpinner, isStandalone: true, selector: "strct-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "attr.aria-label": "label()", "class.strct-spinner--sm": "size() === 'sm'", "class.strct-spinner--lg": "size() === 'lg'" }, classAttribute: "strct-spinner" }, ngImport: i0, template: '', isInline: true, styles: [".strct-spinner{display:inline-block;width:22px;height:22px;border:2.5px solid var(--b3);border-top-color:var(--acc);border-radius:50%;animation:strct-spin .7s linear infinite}.strct-spinner--sm{width:14px;height:14px;border-width:2px}.strct-spinner--lg{width:34px;height:34px;border-width:3px}@keyframes strct-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.strct-spinner{animation-duration:1.6s}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctSpinner, isStandalone: true, selector: "strct-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "class.strct-spinner--captioned": "caption()", "attr.aria-label": "caption() || label()", "class.strct-spinner--sm": "size() === 'sm'", "class.strct-spinner--lg": "size() === 'lg'" }, classAttribute: "strct-spinner" }, ngImport: i0, template: `
2246
+ @if (caption()) {
2247
+ <span class="strct-spinner__ring"></span>
2248
+ <span class="strct-spinner__caption">{{ caption() }}</span>
2249
+ }
2250
+ `, isInline: true, styles: [".strct-spinner{display:inline-block;width:22px;height:22px;border:2.5px solid var(--b3);border-top-color:var(--acc);border-radius:50%;animation:strct-spin .7s linear infinite}.strct-spinner--sm{width:14px;height:14px;border-width:2px}.strct-spinner--lg{width:34px;height:34px;border-width:3px}@keyframes strct-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.strct-spinner{animation-duration:1.6s}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1974
2251
  }
1975
2252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctSpinner, decorators: [{
1976
2253
  type: Component,
1977
- args: [{ selector: 'strct-spinner', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: '', host: {
2254
+ args: [{ selector: 'strct-spinner', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
2255
+ @if (caption()) {
2256
+ <span class="strct-spinner__ring"></span>
2257
+ <span class="strct-spinner__caption">{{ caption() }}</span>
2258
+ }
2259
+ `, host: {
1978
2260
  class: 'strct-spinner',
1979
2261
  role: 'progressbar',
1980
- '[attr.aria-label]': 'label()',
2262
+ '[class.strct-spinner--captioned]': 'caption()',
2263
+ '[attr.aria-label]': 'caption() || label()',
1981
2264
  '[class.strct-spinner--sm]': "size() === 'sm'",
1982
2265
  '[class.strct-spinner--lg]': "size() === 'lg'",
1983
2266
  }, styles: [".strct-spinner{display:inline-block;width:22px;height:22px;border:2.5px solid var(--b3);border-top-color:var(--acc);border-radius:50%;animation:strct-spin .7s linear infinite}.strct-spinner--sm{width:14px;height:14px;border-width:2px}.strct-spinner--lg{width:34px;height:34px;border-width:3px}@keyframes strct-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.strct-spinner{animation-duration:1.6s}}\n"] }]
1984
- }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
2267
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }] } });
1985
2268
 
1986
2269
  /**
1987
2270
  * Shimmering loading placeholder.
@@ -7134,7 +7417,7 @@ class StrctCellStatus {
7134
7417
  }
7135
7418
  </span>
7136
7419
  }
7137
- `, isInline: true, styles: [".strct-vstate{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--text-sm);line-height:1;color:var(--t3)}.strct-vstate strct-icon{flex-shrink:0}.strct-vstate--ok{color:var(--success)}.strct-vstate--warning{color:var(--warning)}.strct-vstate--error{color:var(--critical)}.strct-vstate__msg{color:var(--t2)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctSpinner, selector: "strct-spinner", inputs: ["size", "label"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7420
+ `, isInline: true, styles: [".strct-vstate{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--text-sm);line-height:1;color:var(--t3)}.strct-vstate strct-icon{flex-shrink:0}.strct-vstate--ok{color:var(--success)}.strct-vstate--warning{color:var(--warning)}.strct-vstate--error{color:var(--critical)}.strct-vstate__msg{color:var(--t2)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctSpinner, selector: "strct-spinner", inputs: ["size", "label", "caption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7138
7421
  }
7139
7422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctCellStatus, decorators: [{
7140
7423
  type: Component,
@@ -7287,7 +7570,7 @@ class StrctField {
7287
7570
  } @else if (hint()) {
7288
7571
  <div class="strct-field__msg strct-field__msg--hint" [id]="hintId">{{ hint() }}</div>
7289
7572
  }
7290
- `, isInline: true, styles: [".strct-field{display:flex;flex-direction:column;gap:6px}.strct-field__label{font-size:12px;font-weight:600;color:var(--t2)}.strct-field__req{color:var(--critical);margin-inline-start:2px}.strct-field__control{position:relative;display:flex;flex-direction:column}.strct-field__adorn{position:absolute;top:50%;inset-inline-end:10px;transform:translateY(-50%);display:inline-flex;align-items:center;pointer-events:none}.strct-field__adorn--ok{color:var(--success)}.strct-field__adorn--warning{color:var(--warning)}.strct-field__adorn--error{color:var(--critical)}.strct-field--validating .strct-control{padding-inline-end:32px}.strct-field__msg{font-size:12px;line-height:1.4}.strct-field__msg--hint,.strct-field__msg--checking{color:var(--t3)}.strct-field__msg--ok{color:var(--success)}.strct-field__msg--warning{color:var(--warning)}.strct-field__msg--error{color:var(--critical)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctSpinner, selector: "strct-spinner", inputs: ["size", "label"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7573
+ `, isInline: true, styles: [".strct-field{display:flex;flex-direction:column;gap:6px}.strct-field__label{font-size:12px;font-weight:600;color:var(--t2)}.strct-field__req{color:var(--critical);margin-inline-start:2px}.strct-field__control{position:relative;display:flex;flex-direction:column}.strct-field__adorn{position:absolute;top:50%;inset-inline-end:10px;transform:translateY(-50%);display:inline-flex;align-items:center;pointer-events:none}.strct-field__adorn--ok{color:var(--success)}.strct-field__adorn--warning{color:var(--warning)}.strct-field__adorn--error{color:var(--critical)}.strct-field--validating .strct-control{padding-inline-end:32px}.strct-field__msg{font-size:12px;line-height:1.4}.strct-field__msg--hint,.strct-field__msg--checking{color:var(--t3)}.strct-field__msg--ok{color:var(--success)}.strct-field__msg--warning{color:var(--warning)}.strct-field__msg--error{color:var(--critical)}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctSpinner, selector: "strct-spinner", inputs: ["size", "label", "caption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
7291
7574
  }
7292
7575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctField, decorators: [{
7293
7576
  type: Component,
@@ -17299,6 +17582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
17299
17582
 
17300
17583
  const VARIANTS = {
17301
17584
  empty: { icon: 'folder', tone: 'neutral' },
17585
+ loading: { icon: '', tone: 'neutral' },
17302
17586
  denied: { icon: 'lock', tone: 'warning' },
17303
17587
  error: { icon: 'warning', tone: 'critical' },
17304
17588
  notfound: { icon: 'search', tone: 'neutral' },
@@ -17324,6 +17608,12 @@ class StrctEmptyState {
17324
17608
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
17325
17609
  title = input.required(/* @ts-ignore */
17326
17610
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
17611
+ /**
17612
+ * `sm` is the inline row a 240px frame wants: a 16px icon with the title and
17613
+ * description on one line. A page-sized empty state stays `md`.
17614
+ */
17615
+ size = input('md', /* @ts-ignore */
17616
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
17327
17617
  description = input('', /* @ts-ignore */
17328
17618
  ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
17329
17619
  resolvedIcon = computed(() => this.icon() || VARIANTS[this.variant()].icon, /* @ts-ignore */
@@ -17331,30 +17621,50 @@ class StrctEmptyState {
17331
17621
  toneClass = computed(() => this.tone() || VARIANTS[this.variant()].tone, /* @ts-ignore */
17332
17622
  ...(ngDevMode ? [{ debugName: "toneClass" }] : /* istanbul ignore next */ []));
17333
17623
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctEmptyState, deps: [], target: i0.ɵɵFactoryTarget.Component });
17334
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctEmptyState, isStandalone: true, selector: "strct-empty-state", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "strct-empty" }, ngImport: i0, template: `
17624
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctEmptyState, isStandalone: true, selector: "strct-empty-state", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.strct-empty--sm": "size() === 'sm'", "attr.aria-busy": "variant() === 'loading' ? 'true' : null" }, classAttribute: "strct-empty" }, ngImport: i0, template: `
17335
17625
  <span class="strct-empty__icon strct-empty__icon--{{ toneClass() }}">
17336
- <strct-icon [name]="resolvedIcon()" [size]="26" [strokeWidth]="1.4" />
17626
+ @if (variant() === 'loading') {
17627
+ <strct-spinner [size]="size() === 'sm' ? 'sm' : 'md'" [label]="title()" />
17628
+ } @else {
17629
+ <strct-icon
17630
+ [name]="resolvedIcon()"
17631
+ [size]="size() === 'sm' ? 16 : 26"
17632
+ [strokeWidth]="1.4"
17633
+ />
17634
+ }
17337
17635
  </span>
17338
17636
  <h3 class="strct-empty__title">{{ title() }}</h3>
17339
17637
  @if (description()) {
17340
17638
  <p class="strct-empty__desc">{{ description() }}</p>
17341
17639
  }
17342
17640
  <div class="strct-empty__actions"><ng-content /></div>
17343
- `, isInline: true, styles: [".strct-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:40px 24px}.strct-empty__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:14px;margin-bottom:2px}.strct-empty__icon--neutral{background:var(--bg-3);color:var(--t2)}.strct-empty__icon--warning{background:var(--warning-bg);color:var(--warning)}.strct-empty__icon--critical{background:var(--critical-bg);color:var(--critical)}.strct-empty__icon--accent{background:var(--acc-m);color:var(--acc)}.strct-empty__title{margin:0;font-size:15px;font-weight:600;color:var(--t1)}.strct-empty__desc{margin:0;max-width:360px;font-size:13px;line-height:1.5;color:var(--t3)}.strct-empty__actions{display:flex;align-items:center;gap:8px;margin-top:6px}.strct-empty__actions:empty{display:none}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
17641
+ `, isInline: true, styles: [".strct-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:40px 24px}.strct-empty__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:14px;margin-bottom:2px}.strct-empty__icon--neutral{background:var(--bg-3);color:var(--t2)}.strct-empty__icon--warning{background:var(--warning-bg);color:var(--warning)}.strct-empty__icon--critical{background:var(--critical-bg);color:var(--critical)}.strct-empty__icon--accent{background:var(--acc-m);color:var(--acc)}.strct-empty__title{margin:0;font-size:15px;font-weight:600;color:var(--t1)}.strct-empty__desc{margin:0;max-width:360px;font-size:13px;line-height:1.5;color:var(--t3)}.strct-empty__actions{display:flex;align-items:center;gap:8px;margin-top:6px}.strct-empty__actions:empty{display:none}\n"], dependencies: [{ kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel"] }, { kind: "component", type: StrctSpinner, selector: "strct-spinner", inputs: ["size", "label", "caption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
17344
17642
  }
17345
17643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctEmptyState, decorators: [{
17346
17644
  type: Component,
17347
- args: [{ selector: 'strct-empty-state', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [StrctIcon], template: `
17645
+ args: [{ selector: 'strct-empty-state', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [StrctIcon, StrctSpinner], template: `
17348
17646
  <span class="strct-empty__icon strct-empty__icon--{{ toneClass() }}">
17349
- <strct-icon [name]="resolvedIcon()" [size]="26" [strokeWidth]="1.4" />
17647
+ @if (variant() === 'loading') {
17648
+ <strct-spinner [size]="size() === 'sm' ? 'sm' : 'md'" [label]="title()" />
17649
+ } @else {
17650
+ <strct-icon
17651
+ [name]="resolvedIcon()"
17652
+ [size]="size() === 'sm' ? 16 : 26"
17653
+ [strokeWidth]="1.4"
17654
+ />
17655
+ }
17350
17656
  </span>
17351
17657
  <h3 class="strct-empty__title">{{ title() }}</h3>
17352
17658
  @if (description()) {
17353
17659
  <p class="strct-empty__desc">{{ description() }}</p>
17354
17660
  }
17355
17661
  <div class="strct-empty__actions"><ng-content /></div>
17356
- `, host: { class: 'strct-empty' }, styles: [".strct-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:40px 24px}.strct-empty__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:14px;margin-bottom:2px}.strct-empty__icon--neutral{background:var(--bg-3);color:var(--t2)}.strct-empty__icon--warning{background:var(--warning-bg);color:var(--warning)}.strct-empty__icon--critical{background:var(--critical-bg);color:var(--critical)}.strct-empty__icon--accent{background:var(--acc-m);color:var(--acc)}.strct-empty__title{margin:0;font-size:15px;font-weight:600;color:var(--t1)}.strct-empty__desc{margin:0;max-width:360px;font-size:13px;line-height:1.5;color:var(--t3)}.strct-empty__actions{display:flex;align-items:center;gap:8px;margin-top:6px}.strct-empty__actions:empty{display:none}\n"] }]
17357
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
17662
+ `, host: {
17663
+ class: 'strct-empty',
17664
+ '[class.strct-empty--sm]': "size() === 'sm'",
17665
+ '[attr.aria-busy]': "variant() === 'loading' ? 'true' : null",
17666
+ }, styles: [".strct-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:40px 24px}.strct-empty__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:14px;margin-bottom:2px}.strct-empty__icon--neutral{background:var(--bg-3);color:var(--t2)}.strct-empty__icon--warning{background:var(--warning-bg);color:var(--warning)}.strct-empty__icon--critical{background:var(--critical-bg);color:var(--critical)}.strct-empty__icon--accent{background:var(--acc-m);color:var(--acc)}.strct-empty__title{margin:0;font-size:15px;font-weight:600;color:var(--t1)}.strct-empty__desc{margin:0;max-width:360px;font-size:13px;line-height:1.5;color:var(--t3)}.strct-empty__actions{display:flex;align-items:center;gap:8px;margin-top:6px}.strct-empty__actions:empty{display:none}\n"] }]
17667
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
17358
17668
 
17359
17669
  /**
17360
17670
  * Unit formatting for infrastructure consoles — bytes, rates, durations and
@@ -22522,5 +22832,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
22522
22832
  * Generated bundle index. Do not edit.
22523
22833
  */
22524
22834
 
22525
- export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCardHeaderActions, StrctCardHeaderMeta, StrctCardHeaderNote, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctCode, StrctCodeInline, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatagridActionBarCaption, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLogViewer, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctModalContent, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPageHeaderTitleMeta, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderItem, StrctRowDetailDef, StrctSearchbox, StrctSectionHeader, StrctSectionHeaderActions, StrctSectionHeaderMeta, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarCaption, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWizard, StrctWizardAside, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctValidationIcon, strctValidationTone, unlockBodyScroll };
22835
+ export { FOCUSABLE_SELECTOR, STRCT_DP_DOW, STRCT_DP_DOW_FULL, STRCT_DP_MONTHS, STRCT_ICONS, STRCT_ICON_GROUPS, STRCT_ICON_NAMES, STRCT_MASKS, STRCT_NOTIFICATION_HISTORY_LIMIT, STRCT_PALETTES, STRCT_RAW_ICONS, STRCT_TIME_RANGE_PRESETS, STRCT_WIZARD_DEFAULTS, StrctAccordion, StrctAccordionPanel, StrctAlert, StrctAnnouncer, StrctAvatar, StrctBadge, StrctBreadcrumb, StrctBreadcrumbItem, StrctButton, StrctButtonGroup, StrctBytesPipe, StrctCard, StrctCardBlock, StrctCardFooter, StrctCardHeader, StrctCardHeaderActions, StrctCardHeaderMeta, StrctCardHeaderNote, StrctCascadeColumn, StrctCascadeHost, StrctCascadeSelect, StrctCellDef, StrctCellStatus, StrctChart, StrctCheckbox, StrctChips, StrctCode, StrctCodeInline, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatagridActionBarCaption, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFile, StrctFilterBar, StrctFlow, StrctFooter, StrctGauge, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctList, StrctListItem, StrctListItemDescription, StrctListItemLeading, StrctListItemMeta, StrctListItemTrailing, StrctLogViewer, StrctLogin, StrctMenuPanel, StrctMenuService, StrctMenubar, StrctMetricTile, StrctModal, StrctModalContent, StrctNav, StrctNavItem, StrctNotificationCenter, StrctNumber, StrctOverlay, StrctPageHeader, StrctPageHeaderActions, StrctPageHeaderCrumbs, StrctPageHeaderTitleMeta, StrctPagination, StrctPassword, StrctPopover, StrctPopoverTrigger, StrctProgress, StrctRadio, StrctRadioGroup, StrctRail, StrctRange, StrctRatePipe, StrctRating, StrctReorder, StrctReorderItem, StrctRowDetailDef, StrctSearchbox, StrctSectionHeader, StrctSectionHeaderActions, StrctSectionHeaderMeta, StrctSectionMenu, StrctSegmented, StrctSelect, StrctShell, StrctShellService, StrctSiPipe, StrctSignpost, StrctSignpostTrigger, StrctSkeleton, StrctSparkline, StrctSpeedDial, StrctSpinner, StrctSplitButton, StrctSplitter, StrctStack, StrctStackItem, StrctStatusDot, StrctStep, StrctSubmenu, StrctTab, StrctTable, StrctTabs, StrctTag, StrctThemeService, StrctThemeSwitcher, StrctTimeRangePicker, StrctTimeline, StrctTimelineItem, StrctToastOutlet, StrctToastService, StrctToggle, StrctToolbar, StrctToolbarCaption, StrctToolbarSpacer, StrctTooltip, StrctTour, StrctTransfer, StrctTree, StrctTreeNode, StrctTreeSelect, StrctVerticalNav, StrctWatermark, StrctWizard, StrctWizardAside, focusFirstIn, keepTabInside, lockBodyScroll, parseAnsi, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctValidationIcon, strctValidationTone, unlockBodyScroll };
22526
22836
  //# sourceMappingURL=akcelik-strct.mjs.map