@sentropic/design-system-angular 0.36.59 → 0.36.61

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.
@@ -0,0 +1,270 @@
1
+ import { ElementRef, EventEmitter } from "@angular/core";
2
+ import type { AfterContentInit, AfterViewInit, OnChanges, OnDestroy, OnInit, SimpleChanges } from "@angular/core";
3
+ import * as i0 from "@angular/core";
4
+ export type PanelStackShape = "split-primary" | "sticky-item";
5
+ /**
6
+ * Bound ratified by the chat consumer lane: beyond 4 sections, stacking
7
+ * collapsible regions in a pane capped at 640px makes scrolling unmanageable
8
+ * and the single-owner rule becomes untenable. Enforced as a dev-time
9
+ * `console.warn` in `register()` (this package's established convention —
10
+ * see NavActionStack/WaterfallChart — is to warn and degrade, never throw or
11
+ * silently truncate); exported here so the bound is also visible through
12
+ * types/docs to a consumer reading `PanelStackProps`. Mirrors
13
+ * `PanelStack.svelte`'s constant of the same name/value 1:1.
14
+ */
15
+ export declare const PANEL_STACK_MAX_SECTIONS = 4;
16
+ export type PanelStackProps = {
17
+ /** "sticky-item" (default): one section expanded at a time, all headers stay visible.
18
+ "split-primary": the `primary` section is always expanded and owns the scroll;
19
+ the others are content-sized disclosures. */
20
+ shape?: PanelStackShape;
21
+ /** Accessible name for the stack region. */
22
+ label?: string;
23
+ /** sticky-item, controlled: id of the expanded section. */
24
+ expanded?: string | null;
25
+ /** sticky-item, uncontrolled seed. */
26
+ defaultExpanded?: string | null;
27
+ onExpandedChange?: (id: string | null) => void;
28
+ /**
29
+ * split-primary: id of the section that owns the scroll. Falls back to the
30
+ * first EXPANDED section (registration order) when unset or stale, and —
31
+ * if nothing is expanded — to the first registered section, so the stack
32
+ * never degrades to zero scroll owners.
33
+ */
34
+ primary?: string;
35
+ /** Usable floor for the primary section, in px. While the primary sits above it the
36
+ primary absorbs overflow; once it would drop below, a secondary auto-collapses
37
+ instead of compressing the primary further. Default 160. */
38
+ primaryMinHeight?: number;
39
+ /**
40
+ * At most {@link PANEL_STACK_MAX_SECTIONS} `PanelSection` children are
41
+ * supported — see that constant's doc comment for why.
42
+ */
43
+ class?: string;
44
+ };
45
+ /**
46
+ * Pure fallback-chain resolver for split-primary's scroll owner — mirrors
47
+ * `PanelStack.svelte`'s `effectivePrimary` derivation so it is unit-testable
48
+ * without any component/DOM machinery (see MenuPopover's
49
+ * `computeMenuPopoverPosition` for the established pattern).
50
+ *
51
+ * Tier 1: a `designatedPrimary` that matches a currently-registered id always
52
+ * wins. Tier 2: otherwise the first EXPANDED id in `orderedIds` (registration
53
+ * order is the tiebreak, never click order). Tier 3 (last resort): the first
54
+ * registered id, so the stack never degrades to zero scroll owners.
55
+ */
56
+ export declare function resolvePanelStackPrimary(designatedPrimary: string | undefined, orderedIds: readonly string[], openIds: ReadonlySet<string>): string | null;
57
+ /**
58
+ * Pure resolver for sticky-item's effective expanded/scroll-owner id — a
59
+ * SINGLE resolved value deliberately reused by the class for both
60
+ * `isExpanded` and `isScrollOwner` in that shape (see `effectiveExpandedId`).
61
+ * Splitting these into two different values would let a section render as
62
+ * the (visible, `overflow:auto`) scroll owner while its trigger reports
63
+ * `aria-expanded="false"` — a screen reader announcing "collapsed" for
64
+ * on-screen, scrolling content. sticky-item's contract is that "expanded"
65
+ * and "owns the scroll" are the same fact about the same section by
66
+ * definition, so this resolver is the one place that fact is decided, for
67
+ * both.
68
+ *
69
+ * The controlled counterpart to `effectiveExpandedId`'s uncontrolled
70
+ * fallback (which already resolves to the first registered id on its own).
71
+ * Mirrors `resolvePanelStackPrimary`'s last-resort tier so this package's
72
+ * Node test environment can exercise the decision without any
73
+ * component/DOM machinery.
74
+ *
75
+ * Ratified cross-framework rule: a controlled `expanded` is NEVER silently
76
+ * corrected — the caller must still expose the raw, possibly-invalid value
77
+ * back to the consumer (never rewritten, never fed through
78
+ * `onExpandedChange`) — that is about the PROP, not about what gets
79
+ * rendered: ARIA still has to describe the actual DOM, so the resolved
80
+ * (possibly healed) value below is what both `isExpanded` and
81
+ * `isScrollOwner` read. Two distinct controlled inputs are told apart here:
82
+ *
83
+ * - `expandedId` is a non-null id that names NO id in `orderedIds`: this is
84
+ * a MISTAKE (a stale/typo'd controlled value) — the consumer intended a
85
+ * section open and silently got none, which is exactly the "content
86
+ * unreachable by the wheel" state the stack must never reach. Falls back
87
+ * to the first registered id, identically to `resolvePanelStackPrimary`'s
88
+ * own tier 3.
89
+ * - `expandedId` is explicitly `null`: this is a DELIBERATE "everything
90
+ * collapsed" — honoured as-is, no fallback. An all-collapsed stack shows
91
+ * no content at all, so nothing is unreachable; zero scroll owners is the
92
+ * correct, legitimate outcome here.
93
+ */
94
+ export declare function resolvePanelStackExpanded(expandedId: string | null, orderedIds: readonly string[]): string | null;
95
+ export type PanelStackAutoCollapseMeasurements = {
96
+ /** Id of the section currently resolved as primary (never a collapse candidate). */
97
+ primaryId: string;
98
+ /** Latest observed height of the stack container. 0 means "not measured yet". */
99
+ stackHeight: number;
100
+ /** Latest observed height of the primary's own header. */
101
+ primaryHeaderHeight: number;
102
+ /** Ids of every non-primary (secondary) registered section. */
103
+ secondaryIds: readonly string[];
104
+ /** Latest observed ROOT (header + current body) height per registered id. */
105
+ rootHeights: ReadonlyMap<string, number>;
106
+ /** Ids the user explicitly opened (their INTENT, independent of what's actually visible). */
107
+ openSecondary: ReadonlySet<string>;
108
+ /** Ids force-collapsed by this algorithm on an earlier pass. */
109
+ autoCollapsed: ReadonlySet<string>;
110
+ /** MRU order (oldest first) of ids the user explicitly opened — drives
111
+ * "collapse the least-recently-expanded secondary first". */
112
+ expansionOrder: readonly string[];
113
+ };
114
+ /**
115
+ * THE auto-collapse decision, factored out as a pure function (per
116
+ * MenuPopover's `computeMenuPopoverPosition` precedent) so it is testable
117
+ * without ResizeObserver/DOM: this package's Node test environment has
118
+ * neither. Mirrors `PanelStack.svelte`'s decision `$effect` body exactly.
119
+ *
120
+ * Returns the id of AT MOST ONE new secondary to auto-collapse this pass, or
121
+ * `null` if nothing needs to (either it already fits, or nothing is left to
122
+ * collapse — the degenerate "pane too small even fully collapsed" case).
123
+ *
124
+ * Convergence / no-avalanche contract: this function is a pure read of the
125
+ * measurements and state PASSED IN — it never reads or writes any component
126
+ * field itself, and it never returns more than one id per call. A caller
127
+ * that re-invokes it once per REAL measurement update (the pattern used by
128
+ * `PanelStack`'s ResizeObserver callback and `toggle()`) therefore collapses
129
+ * at most one NEW secondary per pass, using measurements that are always
130
+ * either accurate (untouched by this pass) or correctly reflect an EARLIER
131
+ * pass once the observer catches up — never a same-tick avalanche. Calling
132
+ * it again with IDENTICAL inputs (e.g. a duplicate/no-op resize delivery)
133
+ * always returns `null` once the fixed point is reached: `autoCollapsed`
134
+ * already contains every viable candidate, so the `.find()` below yields
135
+ * nothing new — no oscillation.
136
+ */
137
+ export declare function computePanelStackAutoCollapse(measurements: PanelStackAutoCollapseMeasurements, floorPx?: number): string | null;
138
+ /**
139
+ * Stacks several `PanelSection` contents inside ONE panel so a docked chat
140
+ * can share a pane with other content. The invariant is the whole point:
141
+ * exactly one section's body has `overflow: auto` at any moment, and the
142
+ * stack itself NEVER scrolls — see `PanelSection.ts` for the single scrolling
143
+ * declaration in this component pair.
144
+ *
145
+ * Faithful Angular port of `PanelStack.svelte`. See that file for the
146
+ * ratified contract this mirrors; the notable Angular-specific departures,
147
+ * all forced by this platform (documented in depth at each site below):
148
+ *
149
+ * - Coordination with `PanelSection` children is NOT Svelte-style context
150
+ * (`setContext`/`getContext`). Angular constructor DI would be the direct
151
+ * analog, but it needs `@Optional()`/`@Inject()` PARAMETER decorators,
152
+ * which this package's tsconfig cannot compile (no `experimentalDecorators`
153
+ * — the whole package already relies on standard/Ivy decorators for
154
+ * class/property positions only). Instead `PanelStack` discovers its
155
+ * sections via `@ContentChildren` and pushes `isPrimary`/`expanded`/
156
+ * `scrollOwner` directly onto each instance — the SAME "parent owns
157
+ * projected children's state" idiom `SelectableList` already established
158
+ * for its `SelectableRow` children in this exact package.
159
+ * - Registration order substitutes for Svelte's DOM-order-via-
160
+ * `compareDocumentPosition` fallback: `@ContentChildren` (and this
161
+ * package's Node test environment, which has no DOM at all) both already
162
+ * hand entries over in call/DOM order, so no separate re-sort is needed.
163
+ * - No `ChangeDetectorRef`/`markForCheck` — matching this package's existing
164
+ * idiom of relying on zone.js's default full-tree change detection (same
165
+ * as `MenuPopover`'s window-listener-driven position updates).
166
+ */
167
+ export declare class PanelStack implements OnInit, AfterContentInit, AfterViewInit, OnChanges, OnDestroy {
168
+ private readonly host;
169
+ static readonly stComponentName = "PanelStack";
170
+ readonly componentName = "PanelStack";
171
+ shape: PanelStackShape;
172
+ label?: string;
173
+ /** sticky-item, controlled: id of the expanded section. Presence (including
174
+ * an explicit `null`) is what makes the stack controlled — same
175
+ * undefined-vs-set idiom as `AppShell.panelWidths`. */
176
+ expanded?: string | null;
177
+ defaultExpanded: string | null;
178
+ /** Svelte-canonical callback. */
179
+ onExpandedChange?: (id: string | null) => void;
180
+ /** Angular-idiom addition (not in the Svelte contract): enables
181
+ * `[(expanded)]` two-way binding alongside `onExpandedChange`. */
182
+ readonly expandedChange: EventEmitter<string | null>;
183
+ primary?: string;
184
+ primaryMinHeight?: number;
185
+ classInput?: string;
186
+ private sectionsQuery?;
187
+ private entries;
188
+ private internalExpanded;
189
+ private openSecondary;
190
+ private autoCollapsed;
191
+ private expansionOrder;
192
+ private rootHeights;
193
+ private stackHeight;
194
+ private primaryHeaderHeight;
195
+ private resizeObserver;
196
+ private observedPrimaryHeaderEl;
197
+ /** Dev-time "warned once" latch for a controlled `expanded` naming no
198
+ * registered section — see `effectiveExpandedId`. Guards the
199
+ * `console.warn` only, never the fallback resolution itself (which must
200
+ * always resolve a scroll owner). Never reset: the contract is "a
201
+ * console.warn once" (per instance), not "once per distinct bad id". */
202
+ private warnedInvalidExpanded;
203
+ private childUnregister;
204
+ private childToggleSub;
205
+ private sectionsChangesSub;
206
+ constructor(host: ElementRef<HTMLElement>);
207
+ ngOnInit(): void;
208
+ ngAfterContentInit(): void;
209
+ ngAfterViewInit(): void;
210
+ ngOnChanges(changes: SimpleChanges): void;
211
+ ngOnDestroy(): void;
212
+ get hostClass(): string;
213
+ get controlled(): boolean;
214
+ /**
215
+ * sticky-item: the controlled branch NEVER rewrites `this.expanded` (the
216
+ * controlled contract is absolute — no self-correction, no synthetic
217
+ * `onExpandedChange`/`expandedChange` call), but it DOES resolve through
218
+ * `resolvePanelStackExpanded` so every DERIVED read (`isExpanded`,
219
+ * `isScrollOwner`) sees a healed value: a non-null `expanded` naming no
220
+ * registered section falls back to the first registered id (with a
221
+ * one-time dev warning below); an explicit `null` is a deliberate
222
+ * "everything collapsed" and is returned as-is. Guarded by
223
+ * `this.entries.length > 0` so a controlled value isn't flagged as
224
+ * "invalid" before any `PanelSection` has had a chance to register yet.
225
+ */
226
+ get effectiveExpandedId(): string | null;
227
+ get effectivePrimary(): string | null;
228
+ /** Resolved floor fed to `computePanelStackAutoCollapse`'s `floorPx` —
229
+ * falls back to `PRIMARY_MIN_BLOCK_SIZE_PX` (the same value as the CSS
230
+ * fallback) when `primaryMinHeight` is unset. */
231
+ get resolvedPrimaryMinHeight(): number;
232
+ /** Inline value for the host's `--st-component-panelStack-primaryMinBlockSize`
233
+ * custom property — see the `host` binding in the `@Component` decorator.
234
+ * `resolvedPrimaryMinHeight` is the single source of truth this is
235
+ * derived from, so the JS threshold and the CSS floor can never drift
236
+ * apart. */
237
+ get primaryMinHeightStyle(): string;
238
+ isPrimary(id: string): boolean;
239
+ isExpanded(id: string): boolean;
240
+ isScrollOwner(id: string): boolean;
241
+ toggle(id: string): void;
242
+ /** Register a section's root AND header element, in registration order;
243
+ * returns an unregister callback. NOT just bookkeeping — the stack falls
244
+ * back to the first registered section as the scroll owner whenever
245
+ * nothing else designates one (unset/stale `expanded` or `primary`), so
246
+ * the invariant "exactly one scroll owner whenever the stack has >=1
247
+ * section" holds even for a misconfigured or dynamically-changing stack.
248
+ * Plain, DOM-agnostic bookkeeping — safe to call directly from tests with
249
+ * fake element objects (no real DOM required: `el`/`headerEl` are only
250
+ * ever compared by identity or handed to `ResizeObserver.observe`, which
251
+ * is itself guarded for absence below). */
252
+ register(id: string, el: HTMLElement, headerEl: HTMLElement): () => void;
253
+ private setExpanded;
254
+ private syncSections;
255
+ private applyStateToChildren;
256
+ private ensureResizeObserver;
257
+ /** Retarget the header observer whenever the primary changes (designation,
258
+ * fallback resolution, or a section registering/unregistering). */
259
+ private syncPrimaryHeaderObserver;
260
+ /** THE decision, driven off whatever measurements are CURRENTLY known.
261
+ * Called after every event that could change what "fits" means (a fresh
262
+ * ResizeObserver delivery, a toggle, a register/unregister, a `primary`/
263
+ * `shape` input change) — safe to over-call: `computePanelStackAutoCollapse`
264
+ * is a pure, idempotent read that returns `null` once nothing more needs
265
+ * to collapse, so redundant calls are no-ops. */
266
+ private runAutoCollapseDecision;
267
+ static ɵfac: i0.ɵɵFactoryDeclaration<PanelStack, never>;
268
+ static ɵcmp: i0.ɵɵComponentDeclaration<PanelStack, "st-panel-stack", never, { "shape": { "alias": "shape"; "required": false; }; "label": { "alias": "label"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; "defaultExpanded": { "alias": "defaultExpanded"; "required": false; }; "onExpandedChange": { "alias": "onExpandedChange"; "required": false; }; "primary": { "alias": "primary"; "required": false; }; "primaryMinHeight": { "alias": "primaryMinHeight"; "required": false; }; "classInput": { "alias": "class"; "required": false; }; }, { "expandedChange": "expandedChange"; }, ["sectionsQuery"], ["*"], true, never>;
269
+ }
270
+ //# sourceMappingURL=PanelStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelStack.d.ts","sourceRoot":"","sources":["../src/PanelStack.ts"],"names":[],"mappings":"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"}