@akcelik/strct 5.9.0 → 5.11.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.
@@ -700,6 +700,15 @@ declare class StrctListItem {
700
700
  * row at once; this is the per-row form.
701
701
  */
702
702
  readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
703
+ /**
704
+ * The row cannot be activated — a conversation that cannot be switched away
705
+ * from while a reply arrives. It keeps its tab stop and says
706
+ * `aria-disabled`, so the reason can be read; a keyboard or touch user
707
+ * never sees a `title`.
708
+ */
709
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
710
+ /** Why it cannot be activated, read as the row's description. */
711
+ readonly disabledReason: _angular_core.InputSignal<string>;
703
712
  /** Marks the current row (`aria-current`). */
704
713
  readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
705
714
  /** Optional leading rail, as `strct-card [status]`. */
@@ -708,7 +717,7 @@ declare class StrctListItem {
708
717
  readonly activated: _angular_core.OutputEmitterRef<void>;
709
718
  protected onActivate(): void;
710
719
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctListItem, never>;
711
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctListItem, "strct-list-item", never, { "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[strctListItemLeading]", "*", "[strctListItemDescription]", "[strctListItemMeta]", "[strctListItemTrailing]"], true, never>;
720
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctListItem, "strct-list-item", never, { "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "disabledReason": { "alias": "disabledReason"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[strctListItemLeading]", "*", "[strctListItemDescription]", "[strctListItemMeta]", "[strctListItemTrailing]"], true, never>;
712
721
  }
713
722
  /**
714
723
  * A short list of things with a status — alarms, findings, clusters in a
@@ -866,6 +875,14 @@ declare class StrctTag {
866
875
  * The × keeps `removeLabel`.
867
876
  */
868
877
  readonly activateLabel: _angular_core.InputSignal<string>;
878
+ /**
879
+ * The tag's body is a link to this address — an object chip in a reply opens
880
+ * the object's page. A link is what a middle click, a Ctrl/Cmd-click and
881
+ * "copy link address" need; `interactive` cannot give them.
882
+ */
883
+ readonly href: _angular_core.InputSignal<string | null>;
884
+ /** `_blank` adds the `rel` a new tab needs. */
885
+ readonly target: _angular_core.InputSignal<string>;
869
886
  /**
870
887
  * The body becomes a control: pointer, hover, focus ring, and `activated` on
871
888
  * click / Enter / Space. The × stays a separate tab stop, so "open it" and
@@ -882,7 +899,7 @@ declare class StrctTag {
882
899
  readonly activated: _angular_core.OutputEmitterRef<void>;
883
900
  protected onActivate(): void;
884
901
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctTag, never>;
885
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTag, "strct-tag", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "activateLabel": { "alias": "activateLabel"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "mono": { "alias": "mono"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[strctTagLeading]", "*"], true, never>;
902
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctTag, "strct-tag", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "activateLabel": { "alias": "activateLabel"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "mono": { "alias": "mono"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "activated": "activated"; }, never, ["[strctTagLeading]", "*", "[strctTagLeading]", "*"], true, never>;
886
903
  }
887
904
 
888
905
  /** Avatar size variants. */
@@ -1711,6 +1728,15 @@ declare class StrctModal {
1711
1728
  * `dismissible` for lightweight, transient dialogs where quick dismissal is fine.
1712
1729
  */
1713
1730
  readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
1731
+ /**
1732
+ * Escape closes the dialog. Defaults to `dismissible`; set it on its own for
1733
+ * a window that should close on Escape — nothing is lost — but not on a
1734
+ * stray click outside it. An Escape a focused control already handled
1735
+ * (`defaultPrevented`) is left alone.
1736
+ */
1737
+ readonly closeOnEscape: _angular_core.InputSignalWithTransform<boolean | null, string | boolean | null | undefined>;
1738
+ /** A click on the backdrop closes it. Defaults to `dismissible`. */
1739
+ readonly closeOnBackdrop: _angular_core.InputSignalWithTransform<boolean | null, string | boolean | null | undefined>;
1714
1740
  /** Allow repositioning the dialog by dragging its header (mouse + touch). */
1715
1741
  readonly draggable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1716
1742
  /** Extra class(es) added to the dialog panel — style it from app-global CSS. */
@@ -1732,7 +1758,7 @@ declare class StrctModal {
1732
1758
  constructor();
1733
1759
  close(): void;
1734
1760
  protected onBackdrop(event?: Event): void;
1735
- protected onEscape(): void;
1761
+ protected onEscape(event?: Event): void;
1736
1762
  /** Wrap Tab focus within the dialog. */
1737
1763
  protected onTab(event: Event): void;
1738
1764
  /** Dialog translation from its centered position; reset on every open. */
@@ -1747,7 +1773,7 @@ declare class StrctModal {
1747
1773
  private focusable;
1748
1774
  private focusInitial;
1749
1775
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctModal, never>;
1750
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctModal, "strct-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hideFooter": { "alias": "hideFooter"; "required": false; "isSignal": true; }; "chromeless": { "alias": "chromeless"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "backdropClass": { "alias": "backdropClass"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, ["lazyContent"], ["*", "[strctModalFooter]"], true, never>;
1776
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctModal, "strct-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hideFooter": { "alias": "hideFooter"; "required": false; "isSignal": true; }; "chromeless": { "alias": "chromeless"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "backdropClass": { "alias": "backdropClass"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, ["lazyContent"], ["*", "[strctModalFooter]"], true, never>;
1751
1777
  }
1752
1778
 
1753
1779
  /** Marks the drawer's footer action area: `<ng-container strctDrawerFooter>…`. */
@@ -2915,6 +2941,18 @@ interface StrctSegmentedOption {
2915
2941
  icon?: string;
2916
2942
  /** Disable just this segment. */
2917
2943
  disabled?: boolean;
2944
+ /**
2945
+ * How much is behind this view — "History 14". Drawn after the label as a
2946
+ * muted tabular number; the selected option keeps it muted.
2947
+ */
2948
+ count?: number;
2949
+ /** A count that is itself the news: "Failed 3" in critical. */
2950
+ countStatus?: StrctStatus;
2951
+ /**
2952
+ * What the count is called, for the option's accessible name: given
2953
+ * `(n) => n + ' runs'`, the option reads "History, 14 runs".
2954
+ */
2955
+ countLabel?: (count: number) => string;
2918
2956
  }
2919
2957
  /** Segment size. */
2920
2958
  type StrctSegmentedSize = 'sm' | 'md';
@@ -3862,6 +3900,8 @@ interface StrctDatagridLabels {
3862
3900
  openDetail: string;
3863
3901
  toggleDetail: string;
3864
3902
  closeDetail: string;
3903
+ /** The pane's way back to the list, when it has taken the list's place. */
3904
+ backToList: string;
3865
3905
  rowActions: string;
3866
3906
  chooseColumns: string;
3867
3907
  refresh: string;
@@ -3929,6 +3969,12 @@ interface StrctDatagridColumn {
3929
3969
  comparator?: (a: StrctRow, b: StrctRow) => number;
3930
3970
  /** What an export writes for this column; defaults to the stored value. */
3931
3971
  exportValue?: (row: StrctRow) => unknown;
3972
+ /**
3973
+ * Keep this column visible while a `detailPane` is open. Without any, the
3974
+ * list collapses to its first column — which cuts a long name in half and
3975
+ * hides the status the operator is triaging by.
3976
+ */
3977
+ keepInPane?: boolean;
3932
3978
  /**
3933
3979
  * Hidden until the chooser is asked for it — the column exists, it is just
3934
3980
  * not one of the defaults. A persisted or bound `columnState` wins.
@@ -3971,6 +4017,51 @@ interface StrctDatagridLazyState {
3971
4017
  /** The global quick-filter term ('' when none). */
3972
4018
  quickFilter: string;
3973
4019
  }
4020
+ /**
4021
+ * A group the consumer defines, beside `groupBy`. A triage page orders its
4022
+ * groups by urgency, not alphabetically, and "Passed (59)" starts folded.
4023
+ */
4024
+ interface StrctDatagridGroup {
4025
+ /** The `groupBy` column's value this group holds. */
4026
+ value: unknown;
4027
+ /** Shown instead of the raw value. */
4028
+ label?: string;
4029
+ /** Tints the label and the count chip. */
4030
+ status?: StrctStatus;
4031
+ /** One muted line after the count — "Blocks the join until …". */
4032
+ note?: string;
4033
+ /** Initial state; groups are expanded by default. */
4034
+ collapsed?: boolean;
4035
+ /** Shown instead of the row count — a server's total. */
4036
+ count?: number;
4037
+ }
4038
+ /**
4039
+ * A fully custom group header row:
4040
+ *
4041
+ * <ng-template strctGroupHeader let-group let-count="count">
4042
+ * <strct-badge [status]="group.status">{{ group.label }}</strct-badge> {{ count }}
4043
+ * </ng-template>
4044
+ */
4045
+ /** The pane header's own title, instead of the first column's value. */
4046
+ declare class StrctDetailPaneTitle {
4047
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDetailPaneTitle, never>;
4048
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctDetailPaneTitle, "[strctDetailPaneTitle]", never, {}, {}, never, never, true, never>;
4049
+ }
4050
+ /** Status, category, nodes — what the row is, beside its title. */
4051
+ declare class StrctDetailPaneMeta {
4052
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDetailPaneMeta, never>;
4053
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctDetailPaneMeta, "[strctDetailPaneMeta]", never, {}, {}, never, never, true, never>;
4054
+ }
4055
+ /** Controls at the pane header's end; the close button stays the library's. */
4056
+ declare class StrctDetailPaneActions {
4057
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDetailPaneActions, never>;
4058
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctDetailPaneActions, "[strctDetailPaneActions]", never, {}, {}, never, never, true, never>;
4059
+ }
4060
+ declare class StrctGroupHeaderDef {
4061
+ readonly template: TemplateRef<any>;
4062
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctGroupHeaderDef, never>;
4063
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctGroupHeaderDef, "ng-template[strctGroupHeader]", never, {}, {}, never, never, true, never>;
4064
+ }
3974
4065
  /** Persistable user column preferences (widths from resize, hidden from the
3975
4066
  * chooser, order from drag-reorder). */
3976
4067
  interface StrctDatagridColumnState {
@@ -3989,6 +4080,8 @@ interface DgItem {
3989
4080
  label: string;
3990
4081
  count: number;
3991
4082
  collapsed: boolean;
4083
+ status?: StrctStatus;
4084
+ note?: string;
3992
4085
  };
3993
4086
  }
3994
4087
  /**
@@ -4033,6 +4126,22 @@ declare class StrctDatagrid {
4033
4126
  /** Collapse the grid to a single column and open a side detail pane for the
4034
4127
  * clicked row (distinct from {@link expandable}). */
4035
4128
  readonly detailPane: _angular_core.InputSignalWithTransform<boolean, unknown>;
4129
+ /**
4130
+ * How wide the list column is while the pane is open — px or any CSS width.
4131
+ * 260px cuts a test name like "Validate Switch Enabled Teaming
4132
+ * Configurations" in half and hides its status.
4133
+ */
4134
+ readonly paneListWidth: _angular_core.InputSignal<string>;
4135
+ /**
4136
+ * Below this container width (px) the pane takes the list's place, with a
4137
+ * way back in its header, rather than squeezing both into a phone.
4138
+ */
4139
+ readonly paneTakeoverWidth: _angular_core.InputSignal<number>;
4140
+ /**
4141
+ * The row whose pane is open, two-way: a "what to do next" chip opens the
4142
+ * finding it settles, a URL fragment deep-links to a test, `null` closes it.
4143
+ */
4144
+ readonly activeRowId: _angular_core.ModelSignal<unknown>;
4036
4145
  /** Compact density mode. */
4037
4146
  readonly compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
4038
4147
  /**
@@ -4127,6 +4236,7 @@ declare class StrctDatagrid {
4127
4236
  openDetail: string;
4128
4237
  toggleDetail: string;
4129
4238
  closeDetail: string;
4239
+ backToList: string;
4130
4240
  rowActions: string;
4131
4241
  chooseColumns: string;
4132
4242
  refresh: string;
@@ -4191,6 +4301,19 @@ declare class StrctDatagrid {
4191
4301
  * groups. Paging is bypassed while grouped; not combinable with `virtual`.
4192
4302
  */
4193
4303
  readonly groupBy: _angular_core.InputSignal<string | null>;
4304
+ /**
4305
+ * The groups themselves, beside `groupBy`: their order, their labels, a
4306
+ * tone, a note, whether they start folded and a count of the consumer's
4307
+ * own. Values no group mentions follow, in the order the rows arrived.
4308
+ */
4309
+ readonly groups: _angular_core.InputSignal<readonly StrctDatagridGroup[] | null>;
4310
+ /** Keep a declared group that holds no rows, rather than dropping it. */
4311
+ readonly showEmptyGroups: _angular_core.InputSignalWithTransform<boolean, unknown>;
4312
+ /**
4313
+ * Which groups are folded, two-way — so a summary counter elsewhere on the
4314
+ * page can open the group it counts.
4315
+ */
4316
+ readonly collapsedGroups: _angular_core.ModelSignal<readonly unknown[]>;
4194
4317
  /**
4195
4318
  * Two-way per-column filter state: `key → contains-text` (text filter) or
4196
4319
  * `key → unknown[]` (checked value set). Applied client-side; in `lazy`
@@ -4257,6 +4380,9 @@ declare class StrctDatagrid {
4257
4380
  }>;
4258
4381
  private readonly menu;
4259
4382
  protected readonly detailDef: _angular_core.Signal<StrctRowDetailDef | undefined>;
4383
+ /** An `<ng-template strctGroupHeader let-group let-count="count">`. */
4384
+ protected readonly groupHeaderDef: _angular_core.Signal<StrctGroupHeaderDef | undefined>;
4385
+ protected readonly paneTitleDef: _angular_core.Signal<StrctDetailPaneTitle | undefined>;
4260
4386
  protected readonly actionBarDef: _angular_core.Signal<StrctDatagridActionBar | undefined>;
4261
4387
  /** A read-only grid with a note needed an empty action bar to show it. */
4262
4388
  protected readonly actionBarCaptionDef: _angular_core.Signal<StrctDatagridActionBarCaption | undefined>;
@@ -4278,8 +4404,13 @@ declare class StrctDatagrid {
4278
4404
  onResizeStart(e: MouseEvent, key: string): void;
4279
4405
  private onResizeMove;
4280
4406
  private onResizeEnd;
4281
- private readonly activeId;
4282
4407
  protected readonly activeRow: _angular_core.Signal<StrctRow | null>;
4408
+ /**
4409
+ * Whether the container is too narrow to show the list and the pane at once.
4410
+ * It is the grid's own width that decides, not the viewport: the same grid
4411
+ * is wide in a page and narrow in a drawer.
4412
+ */
4413
+ protected readonly narrowPane: _angular_core.WritableSignal<boolean>;
4283
4414
  protected readonly canExpand: _angular_core.Signal<boolean>;
4284
4415
  protected readonly canDetail: _angular_core.Signal<boolean>;
4285
4416
  protected readonly paneOpen: _angular_core.Signal<boolean>;
@@ -4297,7 +4428,8 @@ declare class StrctDatagrid {
4297
4428
  protected onColDragOver(key: string, event: DragEvent): void;
4298
4429
  protected onColDrop(key: string): void;
4299
4430
  protected onColDragEnd(): void;
4300
- private readonly collapsedGroups;
4431
+ /** The folded groups as a set, from the two-way `collapsedGroups`. */
4432
+ private readonly collapsedSet;
4301
4433
  /** Collapse / expand one group header. */
4302
4434
  toggleGroup(key: unknown): void;
4303
4435
  /** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */
@@ -4338,6 +4470,8 @@ declare class StrctDatagrid {
4338
4470
  * the new tabindex has rendered. */
4339
4471
  private focusTreeRow;
4340
4472
  private readonly hostRef;
4473
+ private readonly zone;
4474
+ private readonly destroyRef;
4341
4475
  protected readonly editing: _angular_core.WritableSignal<{
4342
4476
  rowKey: unknown;
4343
4477
  colKey: string;
@@ -4526,6 +4660,14 @@ declare class StrctDatagrid {
4526
4660
  protected colspan(): number;
4527
4661
  /** Toggle the detail pane for a row (triggered by its » button, not the row,
4528
4662
  * so row cells remain selectable for copy). */
4663
+ /** One tab stop for the list while a pane can be opened from it. */
4664
+ protected paneRowTabindex(row: StrctRow): number;
4665
+ /**
4666
+ * The mail-client contract a triage list is read with: Enter or Space opens
4667
+ * the row's pane, the arrows move the active row while it is open, and
4668
+ * Escape closes the pane and leaves focus on the row it came from.
4669
+ */
4670
+ protected onPaneRowKeydown(row: StrctRow, event: KeyboardEvent): void;
4529
4671
  openDetail(row: StrctRow): void;
4530
4672
  closePane(): void;
4531
4673
  /** Open the row-action menu next to the clicked kebab button. */
@@ -4584,7 +4726,7 @@ declare class StrctDatagrid {
4584
4726
  private compareRows;
4585
4727
  private compare;
4586
4728
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
4587
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "singleLine": { "alias": "singleLine"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "selectedId": { "alias": "selectedId"; "required": false; "isSignal": true; }; "rowSelectable": { "alias": "rowSelectable"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "paging": { "alias": "paging"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; "moreTotal": { "alias": "moreTotal"; "required": false; "isSignal": true; }; "groupSelect": { "alias": "groupSelect"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "editHint": { "alias": "editHint"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "quickFilter": { "alias": "quickFilter"; "required": false; "isSignal": true; }; "quickFilterFields": { "alias": "quickFilterFields"; "required": false; "isSignal": true; }; "quickFilterable": { "alias": "quickFilterable"; "required": false; "isSignal": true; }; "quickFilterAlign": { "alias": "quickFilterAlign"; "required": false; "isSignal": true; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; }, { "selectedId": "selectedIdChange"; "loadMore": "loadMore"; "selectedIds": "selectedIdsChange"; "columnState": "columnStateChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "actionBarDef", "actionBarCaptionDef", "cellDefs"], ["[strctDatagridActionBarCaption]", "[strctDatagridActionBar]"], true, never>;
4729
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "paneListWidth": { "alias": "paneListWidth"; "required": false; "isSignal": true; }; "paneTakeoverWidth": { "alias": "paneTakeoverWidth"; "required": false; "isSignal": true; }; "activeRowId": { "alias": "activeRowId"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "singleLine": { "alias": "singleLine"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "selectedId": { "alias": "selectedId"; "required": false; "isSignal": true; }; "rowSelectable": { "alias": "rowSelectable"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "paging": { "alias": "paging"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; "moreTotal": { "alias": "moreTotal"; "required": false; "isSignal": true; }; "groupSelect": { "alias": "groupSelect"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "editHint": { "alias": "editHint"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "showEmptyGroups": { "alias": "showEmptyGroups"; "required": false; "isSignal": true; }; "collapsedGroups": { "alias": "collapsedGroups"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "quickFilter": { "alias": "quickFilter"; "required": false; "isSignal": true; }; "quickFilterFields": { "alias": "quickFilterFields"; "required": false; "isSignal": true; }; "quickFilterable": { "alias": "quickFilterable"; "required": false; "isSignal": true; }; "quickFilterAlign": { "alias": "quickFilterAlign"; "required": false; "isSignal": true; }; "childrenKey": { "alias": "childrenKey"; "required": false; "isSignal": true; }; }, { "activeRowId": "activeRowIdChange"; "selectedId": "selectedIdChange"; "loadMore": "loadMore"; "selectedIds": "selectedIdsChange"; "columnState": "columnStateChange"; "collapsedGroups": "collapsedGroupsChange"; "filters": "filtersChange"; "quickFilter": "quickFilterChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["detailDef", "groupHeaderDef", "paneTitleDef", "actionBarDef", "actionBarCaptionDef", "cellDefs"], ["[strctDatagridActionBarCaption]", "[strctDatagridActionBar]", "[strctDetailPaneTitle]", "[strctDetailPaneMeta]", "[strctDetailPaneActions]"], true, never>;
4588
4730
  }
4589
4731
 
4590
4732
  /** Timeline node state colors. */
@@ -5321,6 +5463,17 @@ declare class StrctMetricTile {
5321
5463
  readonly href: _angular_core.InputSignal<string | null>;
5322
5464
  /** Makes the whole tile a control that emits `activated`. */
5323
5465
  readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
5466
+ /**
5467
+ * The tile is a filter: `true` draws it on and says `aria-pressed`, `false`
5468
+ * draws it off and still says so. `null` (the default) is a tile that is
5469
+ * not a toggle at all, which must not claim a pressed state.
5470
+ */
5471
+ readonly pressed: _angular_core.InputSignalWithTransform<boolean | null, string | boolean | null | undefined>;
5472
+ /**
5473
+ * `sm` is the verdict-band size: six counters beside a one-line verdict at
5474
+ * 1440px, where the dashboard size fits three.
5475
+ */
5476
+ readonly size: _angular_core.InputSignal<"md" | "sm">;
5324
5477
  /**
5325
5478
  * What a plain click on an `href` tile does. `browser` follows the link, as
5326
5479
  * today. `app` belongs to a single-page app: the click is prevented and
@@ -5366,7 +5519,7 @@ declare class StrctMetricTile {
5366
5519
  protected readonly deltaTone: _angular_core.Signal<"flat" | "up" | "down">;
5367
5520
  protected readonly sparkStatus: _angular_core.Signal<StrctChartStatus>;
5368
5521
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctMetricTile, never>;
5369
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctMetricTile, "strct-metric-tile", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "captionStatus": { "alias": "captionStatus"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "navigate": { "alias": "navigate"; "required": false; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "deltaSuffix": { "alias": "deltaSuffix"; "required": false; "isSignal": true; }; "deltaAriaLabel": { "alias": "deltaAriaLabel"; "required": false; "isSignal": true; }; "invertDelta": { "alias": "invertDelta"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[strctMetricMeter]"], true, never>;
5522
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctMetricTile, "strct-metric-tile", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "captionStatus": { "alias": "captionStatus"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "pressed": { "alias": "pressed"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "navigate": { "alias": "navigate"; "required": false; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "deltaSuffix": { "alias": "deltaSuffix"; "required": false; "isSignal": true; }; "deltaAriaLabel": { "alias": "deltaAriaLabel"; "required": false; "isSignal": true; }; "invertDelta": { "alias": "invertDelta"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[strctMetricMeter]"], true, never>;
5370
5523
  }
5371
5524
 
5372
5525
  /**
@@ -6547,9 +6700,16 @@ declare class StrctStatusDot {
6547
6700
  * not jitter. Under `prefers-reduced-motion` the halo is a static ring.
6548
6701
  */
6549
6702
  readonly pulse: _angular_core.InputSignalWithTransform<boolean, unknown>;
6703
+ /**
6704
+ * `solid` is an outcome. `ring` — a 2px outline with a transparent centre —
6705
+ * is a state that is **not** one: "Inconclusive", "Not applicable",
6706
+ * "Unknown". They must not read as Warning or Passed with only the colour
6707
+ * to tell them apart, so the shape carries the difference (WCAG 1.4.1).
6708
+ */
6709
+ readonly variant: _angular_core.InputSignal<"solid" | "ring">;
6550
6710
  protected readonly text: _angular_core.Signal<string>;
6551
6711
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctStatusDot, never>;
6552
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctStatusDot, "strct-status-dot", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6712
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctStatusDot, "strct-status-dot", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
6553
6713
  }
6554
6714
 
6555
6715
  /** What a live view is currently doing. */
@@ -6980,6 +7140,11 @@ declare class StrctWindowDock {
6980
7140
  /** Who wrote a message. */
6981
7141
  type StrctChatAuthor = 'user' | 'assistant' | 'system';
6982
7142
  /** A card the message carries — an action to approve, a result to read. */
7143
+ /** A quiet row under the bubble — copy, a status, a fold. */
7144
+ declare class StrctChatMessageActions {
7145
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChatMessageActions, never>;
7146
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctChatMessageActions, "[strctChatMessageActions]", never, {}, {}, never, never, true, never>;
7147
+ }
6983
7148
  declare class StrctChatAttachment {
6984
7149
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChatAttachment, never>;
6985
7150
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctChatAttachment, "[strctChatAttachment]", never, {}, {}, never, never, true, never>;
@@ -7038,7 +7203,7 @@ declare class StrctChatMessage {
7038
7203
  protected readonly shortTime: _angular_core.Signal<string>;
7039
7204
  protected readonly isoTime: _angular_core.Signal<string | null>;
7040
7205
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChatMessage, never>;
7041
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChatMessage, "strct-chat-message", never, { "author": { "alias": "author"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "avatarIcon": { "alias": "avatarIcon"; "required": false; "isSignal": true; }; "streaming": { "alias": "streaming"; "required": false; "isSignal": true; }; "time": { "alias": "time"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "authorNames": { "alias": "authorNames"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[strctChatAttachment]"], true, never>;
7206
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChatMessage, "strct-chat-message", never, { "author": { "alias": "author"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "avatarIcon": { "alias": "avatarIcon"; "required": false; "isSignal": true; }; "streaming": { "alias": "streaming"; "required": false; "isSignal": true; }; "time": { "alias": "time"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "authorNames": { "alias": "authorNames"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[strctChatAttachment]", "[strctChatMessageActions]"], true, never>;
7042
7207
  }
7043
7208
  /**
7044
7209
  * The box the user writes in: it grows with the text up to `maxRows`, sends on
@@ -7059,6 +7224,16 @@ declare class StrctChatComposer {
7059
7224
  * while a reply is still streaming. `disabled` stops the typing as well.
7060
7225
  */
7061
7226
  readonly sendDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
7227
+ /**
7228
+ * A reply is streaming: the one button becomes Stop, where every chat the
7229
+ * operators know puts it. It is enabled whatever the draft holds, and Enter
7230
+ * still never sends — the draft stays editable meanwhile.
7231
+ */
7232
+ readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
7233
+ /** What the Stop button is called. */
7234
+ readonly stopLabel: _angular_core.InputSignal<string>;
7235
+ /** The reader asked for the reply to stop. */
7236
+ readonly stop: _angular_core.OutputEmitterRef<void>;
7062
7237
  /** How tall the box grows before it scrolls. */
7063
7238
  readonly maxRows: _angular_core.InputSignal<number>;
7064
7239
  /** The send button's accessible name. */
@@ -7075,7 +7250,7 @@ declare class StrctChatComposer {
7075
7250
  protected onEnter(event: Event): void;
7076
7251
  submit(): void;
7077
7252
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChatComposer, never>;
7078
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChatComposer, "strct-chat-composer", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "sendLabel": { "alias": "sendLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "send": "send"; }, never, never, true, never>;
7253
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChatComposer, "strct-chat-composer", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "sendDisabled": { "alias": "sendDisabled"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; "stopLabel": { "alias": "stopLabel"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "sendLabel": { "alias": "sendLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "stop": "stop"; "send": "send"; }, never, never, true, never>;
7079
7254
  }
7080
7255
 
7081
7256
  /**
@@ -7806,5 +7981,199 @@ declare function strctCheckHostInputs(host: HTMLElement, selector: string, owns:
7806
7981
  */
7807
7982
  declare function strctCheckHostDisplay(host: HTMLElement, selector: string, expected: string): void;
7808
7983
 
7809
- 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, 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, StrctChatThread, StrctCheckbox, StrctChips, StrctCode, StrctCodeInline, StrctColorPicker, StrctCombobox, StrctCommandPalette, StrctConfirmOutlet, StrctConfirmService, StrctContextMenu, StrctContextMenuTrigger, StrctControlDescription, StrctCopy, StrctDatagrid, StrctDatagridActionBar, StrctDatagridActionBarCaption, StrctDatepicker, StrctDatetimePicker, StrctDesc, StrctDescriptionList, StrctDiff, StrctDivider, StrctDonut, StrctDrawer, StrctDrawerFooter, StrctDropdown, StrctDropdownDivider, StrctDropdownItem, StrctDropdownItemAction, StrctDropdownTrigger, StrctDurationPipe, StrctEmptyState, StrctField, StrctFieldGroup, StrctFieldHint, StrctFieldPrefix, StrctFieldSuffix, StrctFieldValue, StrctFile, StrctFilterBar, StrctFlow, StrctFlowNodeTemplate, StrctFooter, StrctGauge, StrctHeader, StrctHeatmap, StrctHero, StrctHotkeysHelp, StrctHotkeysService, StrctIcon, StrctInlineEdit, StrctInput, StrctInputMask, StrctInputOtp, StrctKbd, StrctKnob, StrctLegend, StrctList, StrctListItem, StrctListItemDescription, StrctListItemLeading, StrctListItemMeta, StrctListItemTrailing, StrctLiveIndicator, StrctLogViewer, StrctLogin, 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, provideStrctWizardDefaults, registerStrctIcon, restoreFocus, saveFocusedElement, strctCheckHostDisplay, strctCheckHostInputs, strctComputeDiff, strctDpPad, strctFormatBytes, strctFormatDuration, strctFormatRate, strctFormatSi, strctQrMatrix, strctValidationIcon, strctValidationTone, unlockBodyScroll };
7810
- 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, 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, 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 };
7984
+ /**
7985
+ * A Markdown reader that produces plain objects — never HTML.
7986
+ *
7987
+ * A model's reply is Markdown, and an app that reaches for a Markdown library
7988
+ * ends up handing the browser a string of HTML (`innerHTML` plus a sanitiser),
7989
+ * which a sealed, reviewed build cannot accept. This reader returns a tree the
7990
+ * templates draw with ordinary bindings, so every word reaches the page as a
7991
+ * text node and raw HTML is shown as the characters it is.
7992
+ *
7993
+ * It is deliberately a subset of CommonMark + GFM: paragraphs, ATX headings,
7994
+ * fenced code, lists (nested), block quotes, thematic breaks, tables with
7995
+ * alignment, and inline emphasis / strong / strikethrough / code / links /
7996
+ * autolinks. Everything else is text.
7997
+ *
7998
+ * Every loop is bounded, because the input is a remote model's output.
7999
+ */
8000
+ /** Hard limits, so hostile input costs a known amount of work. */
8001
+ declare const STRCT_MD_LIMITS: {
8002
+ /** Characters of source read at all. */
8003
+ readonly source: number;
8004
+ /** Lines read at all. */
8005
+ readonly lines: 20000;
8006
+ /** How deep lists and quotes may nest. */
8007
+ readonly depth: 8;
8008
+ /** Inline delimiter runs considered per text span. */
8009
+ readonly delimiters: 2000;
8010
+ };
8011
+ type StrctMdAlign = 'start' | 'center' | 'end' | null;
8012
+ type StrctMdInline = {
8013
+ kind: 'text';
8014
+ text: string;
8015
+ } | {
8016
+ kind: 'code';
8017
+ text: string;
8018
+ } | {
8019
+ kind: 'strong';
8020
+ children: StrctMdInline[];
8021
+ } | {
8022
+ kind: 'em';
8023
+ children: StrctMdInline[];
8024
+ } | {
8025
+ kind: 'del';
8026
+ children: StrctMdInline[];
8027
+ } | {
8028
+ kind: 'link';
8029
+ href: string;
8030
+ children: StrctMdInline[];
8031
+ } | {
8032
+ kind: 'break';
8033
+ }
8034
+ /** A span the consumer claimed through `tokens` — an object chip, a mention. */
8035
+ | {
8036
+ kind: 'token';
8037
+ token: string;
8038
+ text: string;
8039
+ data?: unknown;
8040
+ };
8041
+ type StrctMdBlock = {
8042
+ kind: 'p';
8043
+ inlines: StrctMdInline[];
8044
+ } | {
8045
+ kind: 'heading';
8046
+ level: number;
8047
+ inlines: StrctMdInline[];
8048
+ } | {
8049
+ kind: 'code';
8050
+ text: string;
8051
+ lang: string;
8052
+ closed: boolean;
8053
+ } | {
8054
+ kind: 'list';
8055
+ ordered: boolean;
8056
+ start: number;
8057
+ items: StrctMdBlock[][];
8058
+ } | {
8059
+ kind: 'quote';
8060
+ blocks: StrctMdBlock[];
8061
+ } | {
8062
+ kind: 'rule';
8063
+ } | {
8064
+ kind: 'table';
8065
+ head: StrctMdInline[][];
8066
+ rows: StrctMdInline[][][];
8067
+ align: StrctMdAlign[];
8068
+ };
8069
+ /** What a consumer's `tokens` function returns for one run of text. */
8070
+ interface StrctMdToken {
8071
+ /** Where the token starts in the text it was found in. */
8072
+ start: number;
8073
+ /** How many characters it covers. */
8074
+ length: number;
8075
+ /** Which template draws it. */
8076
+ token: string;
8077
+ /** Anything the template needs. */
8078
+ data?: unknown;
8079
+ }
8080
+ type StrctMdTokenizer = (text: string) => StrctMdToken[];
8081
+ /**
8082
+ * Read Markdown into blocks.
8083
+ *
8084
+ * `streaming` says the source may be cut mid-token: an unterminated fence is
8085
+ * still a code block, so a reply that streams code looks like code from its
8086
+ * first line rather than flashing as a paragraph and then becoming one.
8087
+ */
8088
+ declare function strctParseMarkdown(source: string, options?: {
8089
+ streaming?: boolean;
8090
+ tokenize?: StrctMdTokenizer;
8091
+ }): StrctMdBlock[];
8092
+ /**
8093
+ * Inline reading. Code spans win over everything (their content is literal),
8094
+ * then links, then the emphasis delimiters — each bounded.
8095
+ */
8096
+ declare function parseInlines(source: string, options?: {
8097
+ tokenize?: StrctMdTokenizer;
8098
+ }): StrctMdInline[];
8099
+ /**
8100
+ * What a link may do. Anything that is not plainly safe stays the text the
8101
+ * model wrote: `javascript:`, `data:`, a protocol-relative `//host`, or
8102
+ * anything this does not recognise.
8103
+ */
8104
+ declare function strctClassifyHref(href: string): 'external' | 'internal' | null;
8105
+
8106
+ /**
8107
+ * A template for a span the consumer claimed through `tokens`, keyed by the
8108
+ * token's kind:
8109
+ *
8110
+ * <ng-template strctMarkdownToken="object" let-text let-data="data">
8111
+ * <strct-tag [href]="data.url">{{ text }}</strct-tag>
8112
+ * </ng-template>
8113
+ */
8114
+ declare class StrctMarkdownToken {
8115
+ /** Which token kind this template draws. */
8116
+ readonly strctMarkdownToken: _angular_core.InputSignal<string>;
8117
+ readonly template: TemplateRef<any>;
8118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctMarkdownToken, never>;
8119
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrctMarkdownToken, "ng-template[strctMarkdownToken]", never, { "strctMarkdownToken": { "alias": "strctMarkdownToken"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
8120
+ }
8121
+ /**
8122
+ * Markdown as a tree of components, never as HTML.
8123
+ *
8124
+ * <strct-markdown [source]="reply()" [streaming]="busy()" />
8125
+ *
8126
+ * A model's reply is Markdown: drawn as plain text it leaves tables as rows of
8127
+ * pipes and `**` everywhere, and an app that reaches for a Markdown library
8128
+ * ends up handing the browser HTML — `innerHTML` plus a sanitiser — which a
8129
+ * sealed, reviewed build cannot accept.
8130
+ *
8131
+ * Every word reaches the page as a text node. Raw HTML is shown as the
8132
+ * characters it is. Images are never loaded: an image's alt text is all a
8133
+ * reader gets. A link opens in a new tab only when it is plainly http(s);
8134
+ * an in-app path is handed to `(navigate)`; anything else — `javascript:`,
8135
+ * `data:`, `//host` — stays the text the model wrote.
8136
+ */
8137
+ declare class StrctMarkdown {
8138
+ /** The Markdown to read. */
8139
+ readonly source: _angular_core.InputSignal<string>;
8140
+ /**
8141
+ * A tree read elsewhere, instead of `source` — how the component draws the
8142
+ * blocks inside a list item or a quote without re-reading them.
8143
+ */
8144
+ readonly tree: _angular_core.InputSignal<StrctMdBlock[] | null>;
8145
+ /**
8146
+ * The reply is still arriving: an unterminated fence is already a code
8147
+ * block, so streamed code does not flash as a paragraph first, and the
8148
+ * caret sits at the end of the last line.
8149
+ */
8150
+ readonly streaming: _angular_core.InputSignalWithTransform<boolean, unknown>;
8151
+ /**
8152
+ * How far the model's headings are pulled down. A message is a region
8153
+ * inside a dialog, so `#` should not be the page's `h1`: the default of 2
8154
+ * makes it an `h3`.
8155
+ */
8156
+ readonly headingOffset: _angular_core.InputSignal<number>;
8157
+ /**
8158
+ * What a link may do, when the default rule is not what the app wants.
8159
+ * Returning `null` leaves the link as text.
8160
+ */
8161
+ readonly linkPolicy: _angular_core.InputSignal<((href: string) => "external" | "internal" | null) | null>;
8162
+ /** Claim runs of plain text — an inventory id becomes an object chip. */
8163
+ readonly tokens: _angular_core.InputSignal<StrctMdTokenizer | null>;
8164
+ /** An in-app link was followed; the consumer routes it. */
8165
+ readonly navigate: _angular_core.OutputEmitterRef<string>;
8166
+ private readonly tokenDefs;
8167
+ protected readonly blocks: _angular_core.Signal<StrctMdBlock[]>;
8168
+ protected level(level: number): number;
8169
+ protected hrefKind(href: string): 'external' | 'internal' | null;
8170
+ protected tokenTemplate(kind: string): TemplateRef<unknown> | null;
8171
+ /** The caret belongs to the last block, and only while streaming. */
8172
+ protected caretOn(index: number): boolean;
8173
+ protected onInternal(event: Event, href: string): void;
8174
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctMarkdown, never>;
8175
+ 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>;
8176
+ }
8177
+
8178
+ 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, StrctDropdownItem, StrctDropdownItemAction, 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 };
8179
+ 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 };