take4-console 0.25.0 → 0.31.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.
Files changed (107) hide show
  1. package/CHANGELOG.md +253 -0
  2. package/README.md +3 -2
  3. package/dist/Screen/ErrorHolder.d.mts +10 -0
  4. package/dist/Screen/ErrorHolder.d.mts.map +1 -0
  5. package/dist/Screen/ErrorHolder.mjs +14 -0
  6. package/dist/Screen/ErrorHolder.mjs.map +1 -0
  7. package/dist/Screen/InterfaceBuilder.d.mts.map +1 -1
  8. package/dist/Screen/InterfaceBuilder.mjs +7 -0
  9. package/dist/Screen/InterfaceBuilder.mjs.map +1 -1
  10. package/dist/Screen/Screen.d.mts +90 -1
  11. package/dist/Screen/Screen.d.mts.map +1 -1
  12. package/dist/Screen/Screen.mjs +300 -1
  13. package/dist/Screen/Screen.mjs.map +1 -1
  14. package/dist/Screen/StyleRegistry.d.mts.map +1 -1
  15. package/dist/Screen/StyleRegistry.mjs +3 -1
  16. package/dist/Screen/StyleRegistry.mjs.map +1 -1
  17. package/dist/Screen/VirtualCursor.d.mts +57 -0
  18. package/dist/Screen/VirtualCursor.d.mts.map +1 -0
  19. package/dist/Screen/VirtualCursor.mjs +148 -0
  20. package/dist/Screen/VirtualCursor.mjs.map +1 -0
  21. package/dist/Screen/Window.d.mts +116 -6
  22. package/dist/Screen/Window.d.mts.map +1 -1
  23. package/dist/Screen/Window.mjs +359 -34
  24. package/dist/Screen/Window.mjs.map +1 -1
  25. package/dist/Screen/WindowManager.d.mts +78 -2
  26. package/dist/Screen/WindowManager.d.mts.map +1 -1
  27. package/dist/Screen/WindowManager.mjs +197 -3
  28. package/dist/Screen/WindowManager.mjs.map +1 -1
  29. package/dist/Screen/controls/BarChart.d.mts.map +1 -1
  30. package/dist/Screen/controls/BarChart.mjs +3 -0
  31. package/dist/Screen/controls/BarChart.mjs.map +1 -1
  32. package/dist/Screen/controls/Checkbox.d.mts.map +1 -1
  33. package/dist/Screen/controls/Checkbox.mjs +4 -0
  34. package/dist/Screen/controls/Checkbox.mjs.map +1 -1
  35. package/dist/Screen/controls/LineChart.d.mts.map +1 -1
  36. package/dist/Screen/controls/LineChart.mjs +3 -0
  37. package/dist/Screen/controls/LineChart.mjs.map +1 -1
  38. package/dist/Screen/controls/ListBox.d.mts.map +1 -1
  39. package/dist/Screen/controls/ListBox.mjs +9 -0
  40. package/dist/Screen/controls/ListBox.mjs.map +1 -1
  41. package/dist/Screen/controls/ProgressBar.d.mts.map +1 -1
  42. package/dist/Screen/controls/ProgressBar.mjs +2 -0
  43. package/dist/Screen/controls/ProgressBar.mjs.map +1 -1
  44. package/dist/Screen/controls/ProgressBarV.d.mts.map +1 -1
  45. package/dist/Screen/controls/ProgressBarV.mjs +2 -0
  46. package/dist/Screen/controls/ProgressBarV.mjs.map +1 -1
  47. package/dist/Screen/controls/Radio.d.mts.map +1 -1
  48. package/dist/Screen/controls/Radio.mjs +7 -1
  49. package/dist/Screen/controls/Radio.mjs.map +1 -1
  50. package/dist/Screen/controls/Sparkline.d.mts.map +1 -1
  51. package/dist/Screen/controls/Sparkline.mjs +3 -0
  52. package/dist/Screen/controls/Sparkline.mjs.map +1 -1
  53. package/dist/Screen/controls/Spinner.d.mts.map +1 -1
  54. package/dist/Screen/controls/Spinner.mjs +8 -0
  55. package/dist/Screen/controls/Spinner.mjs.map +1 -1
  56. package/dist/Screen/controls/StatusLED.d.mts.map +1 -1
  57. package/dist/Screen/controls/StatusLED.mjs +3 -0
  58. package/dist/Screen/controls/StatusLED.mjs.map +1 -1
  59. package/dist/Screen/controls/Tabs.d.mts.map +1 -1
  60. package/dist/Screen/controls/Tabs.mjs +2 -0
  61. package/dist/Screen/controls/Tabs.mjs.map +1 -1
  62. package/dist/Screen/controls/TextArea.d.mts +68 -2
  63. package/dist/Screen/controls/TextArea.d.mts.map +1 -1
  64. package/dist/Screen/controls/TextArea.mjs +291 -46
  65. package/dist/Screen/controls/TextArea.mjs.map +1 -1
  66. package/dist/Screen/controls/TextBox.d.mts +52 -5
  67. package/dist/Screen/controls/TextBox.d.mts.map +1 -1
  68. package/dist/Screen/controls/TextBox.mjs +192 -10
  69. package/dist/Screen/controls/TextBox.mjs.map +1 -1
  70. package/dist/Screen/controls/Toast.d.mts +72 -0
  71. package/dist/Screen/controls/Toast.d.mts.map +1 -0
  72. package/dist/Screen/controls/Toast.mjs +112 -0
  73. package/dist/Screen/controls/Toast.mjs.map +1 -0
  74. package/dist/Screen/types.d.mts +169 -0
  75. package/dist/Screen/types.d.mts.map +1 -1
  76. package/dist/Screen/types.mjs +8 -0
  77. package/dist/Screen/types.mjs.map +1 -1
  78. package/dist/index.d.mts +4 -2
  79. package/dist/index.d.mts.map +1 -1
  80. package/dist/index.mjs +3 -1
  81. package/dist/index.mjs.map +1 -1
  82. package/package.json +1 -1
  83. package/src/Screen/ErrorHolder.mts +22 -0
  84. package/src/Screen/InterfaceBuilder.mts +12 -5
  85. package/src/Screen/Screen.mts +313 -2
  86. package/src/Screen/StyleRegistry.mts +4 -0
  87. package/src/Screen/VirtualCursor.mts +175 -0
  88. package/src/Screen/Window.mts +352 -34
  89. package/src/Screen/WindowManager.mts +203 -3
  90. package/src/Screen/controls/BarChart.mts +3 -0
  91. package/src/Screen/controls/Checkbox.mts +3 -0
  92. package/src/Screen/controls/LineChart.mts +3 -0
  93. package/src/Screen/controls/ListBox.mts +8 -0
  94. package/src/Screen/controls/ProgressBar.mts +2 -0
  95. package/src/Screen/controls/ProgressBarV.mts +2 -0
  96. package/src/Screen/controls/Radio.mts +6 -1
  97. package/src/Screen/controls/Sparkline.mts +3 -0
  98. package/src/Screen/controls/Spinner.mts +6 -0
  99. package/src/Screen/controls/StatusLED.mts +2 -0
  100. package/src/Screen/controls/Tabs.mts +2 -0
  101. package/src/Screen/controls/TextArea.mts +290 -41
  102. package/src/Screen/controls/TextBox.mts +193 -10
  103. package/src/Screen/controls/Toast.mts +138 -0
  104. package/src/Screen/types.mts +167 -0
  105. package/src/demo.mts +131 -0
  106. package/src/index.mts +13 -0
  107. package/src/layout.yaml +16 -0
@@ -0,0 +1,148 @@
1
+ /** Default on/off durations (ms) for the named blink modes. */
2
+ const BLINK_PRESETS = {
3
+ slow: { onMs: 600, offMs: 600 },
4
+ fast: { onMs: 250, offMs: 250 },
5
+ };
6
+ /** Bounds (ms) for the irregular blink mode — each phase picks a random
7
+ * duration from its range so the cursor feels "alive" rather than metronomic. */
8
+ const IRREGULAR_ON_MIN = 180;
9
+ const IRREGULAR_ON_MAX = 520;
10
+ const IRREGULAR_OFF_MIN = 90;
11
+ const IRREGULAR_OFF_MAX = 240;
12
+ /** Default glyph used when the consumer does not supply one — a vertical
13
+ * bar that reads as a text insertion caret on most monospace fonts. */
14
+ export const DEFAULT_CURSOR_SYMBOL = '▎';
15
+ /** Software cursor model — owns the glyph rendered on screen and the
16
+ * on/off blink state. Stateless when `blink.mode === 'off'` or `'steady'`;
17
+ * for timed modes the class samples `Date.now()` on every `isVisible()`
18
+ * call and advances internal phase state as needed. A caller (typically
19
+ * `WindowManager`) is responsible for triggering re-renders on a timer so
20
+ * the visual state actually reaches the terminal. */
21
+ export class VirtualCursor {
22
+ /** Glyph rendered for the cursor when visible. `undefined` means "use
23
+ * the legacy inverse-block highlight over the underlying character". */
24
+ symbol;
25
+ /** Blink configuration — mode and custom timings. */
26
+ blink;
27
+ /** Current phase in the blink timeline. Lazily initialised on first
28
+ * `isVisible()` call so construction stays free of side effects. */
29
+ phase;
30
+ /** Creates a new cursor with the provided symbol and blink settings.
31
+ * Defaults: symbol = `undefined` (inverse-block), blink = `{ mode: 'steady' }`. */
32
+ constructor(options) {
33
+ this.symbol = options?.symbol;
34
+ this.blink = options?.blink ?? { mode: 'steady' };
35
+ this.phase = null;
36
+ }
37
+ /** Returns the caller-supplied glyph, or `DEFAULT_CURSOR_SYMBOL` when
38
+ * none was set. Use `hasCustomSymbol()` to distinguish the two cases. */
39
+ getSymbol() {
40
+ return this.symbol ?? DEFAULT_CURSOR_SYMBOL;
41
+ }
42
+ /** Returns true when a custom glyph was provided; false means the
43
+ * caller wants the legacy inverse-block highlight behaviour. */
44
+ hasCustomSymbol() {
45
+ return this.symbol !== undefined;
46
+ }
47
+ /** Replaces the cursor glyph. Pass `undefined` to revert to inverse-block. */
48
+ setSymbol(symbol) {
49
+ this.symbol = symbol;
50
+ }
51
+ /** Returns the active blink configuration (for inspection / cloning). */
52
+ getBlink() {
53
+ return this.blink;
54
+ }
55
+ /** Replaces the blink configuration and resets the phase timer so the
56
+ * new mode starts in its "on" phase immediately. */
57
+ setBlink(blink) {
58
+ this.blink = blink;
59
+ this.phase = null;
60
+ }
61
+ /** Returns the fastest cadence (in ms) a re-render would need to show
62
+ * this cursor's blink faithfully, or `null` when the cursor is static
63
+ * (modes `'off'` and `'steady'`). Used by `WindowManager` to pick a
64
+ * timer interval. For `irregular` we return the minimum possible
65
+ * off-phase duration so quick flicks are not missed. */
66
+ getTickHintMs() {
67
+ switch (this.blink.mode) {
68
+ case 'off':
69
+ case 'steady':
70
+ return null;
71
+ case 'slow':
72
+ return BLINK_PRESETS.slow.onMs;
73
+ case 'fast':
74
+ return BLINK_PRESETS.fast.onMs;
75
+ case 'irregular':
76
+ return IRREGULAR_OFF_MIN;
77
+ case 'custom':
78
+ return Math.min(this.blink.onMs, this.blink.offMs);
79
+ default:
80
+ return null;
81
+ }
82
+ }
83
+ /** Returns whether the cursor should be drawn at the given moment.
84
+ * `now` is accepted for deterministic testing; defaults to `Date.now()`. */
85
+ isVisible(now = Date.now()) {
86
+ if (this.blink.mode === 'off')
87
+ return false;
88
+ if (this.blink.mode === 'steady')
89
+ return true;
90
+ if (this.phase === null) {
91
+ this.phase = { startedAt: now, visible: true, duration: this.firstOnDuration() };
92
+ }
93
+ // Walk forward through phases until we land on the one that covers `now`.
94
+ // Doing this iteratively (vs. a single modulo) is important for
95
+ // `irregular` mode, where every phase has an independently sampled
96
+ // duration.
97
+ while (now - this.phase.startedAt >= this.phase.duration) {
98
+ const current = this.phase;
99
+ const nextStart = current.startedAt + current.duration;
100
+ const nextVisible = !current.visible;
101
+ this.phase = {
102
+ startedAt: nextStart,
103
+ visible: nextVisible,
104
+ duration: this.phaseDuration(nextVisible),
105
+ };
106
+ }
107
+ return this.phase.visible;
108
+ }
109
+ /** Forces the next `isVisible()` sample to begin a fresh "on" phase at
110
+ * `now`. Useful for keeping the cursor steady while the user types — a
111
+ * blink that vanishes mid-keystroke is jarring. */
112
+ resetPhase(now = Date.now()) {
113
+ this.phase = { startedAt: now, visible: true, duration: this.firstOnDuration() };
114
+ }
115
+ /** Picks the first "on" phase duration for the current blink mode.
116
+ * Split out so tests can assert the expected preset values. */
117
+ firstOnDuration() {
118
+ return this.phaseDuration(true);
119
+ }
120
+ /** Returns the duration of the upcoming phase given its visibility flag.
121
+ * Implements both the named presets and the `custom` / `irregular`
122
+ * semantics in one place. */
123
+ phaseDuration(visible) {
124
+ switch (this.blink.mode) {
125
+ case 'off':
126
+ case 'steady':
127
+ return Number.POSITIVE_INFINITY;
128
+ case 'slow':
129
+ return visible ? BLINK_PRESETS.slow.onMs : BLINK_PRESETS.slow.offMs;
130
+ case 'fast':
131
+ return visible ? BLINK_PRESETS.fast.onMs : BLINK_PRESETS.fast.offMs;
132
+ case 'custom':
133
+ return visible ? this.blink.onMs : this.blink.offMs;
134
+ case 'irregular':
135
+ return visible
136
+ ? randomBetween(IRREGULAR_ON_MIN, IRREGULAR_ON_MAX)
137
+ : randomBetween(IRREGULAR_OFF_MIN, IRREGULAR_OFF_MAX);
138
+ default:
139
+ return Number.POSITIVE_INFINITY;
140
+ }
141
+ }
142
+ }
143
+ /** Returns a uniformly distributed integer in the closed range [min, max].
144
+ * Kept as a module-private helper so `VirtualCursor` stays compact. */
145
+ function randomBetween(min, max) {
146
+ return min + Math.floor(Math.random() * (max - min + 1));
147
+ }
148
+ //# sourceMappingURL=VirtualCursor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualCursor.mjs","sourceRoot":"","sources":["../../src/Screen/VirtualCursor.mts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Cell, StyleId, WindowBorder, WindowProperties, WriteTextOptions, WriteTextInput, TerminalSize } from './types.mjs';
1
+ import type { Cell, StyleId, WindowBorder, WindowProperties, WriteTextOptions, WriteTextInput, TerminalSize, Margin, DirtyRect } from './types.mjs';
2
2
  import { Region } from './Region.mjs';
3
3
  import { StyleRegistry } from './StyleRegistry.mjs';
4
4
  export declare class Window {
@@ -43,18 +43,83 @@ export declare class Window {
43
43
  /** Padding applied inside the border (in addition to the border inset).
44
44
  * Influences `getInnerSize()` / `getInnerOffset()`. */
45
45
  private padding;
46
+ /** Outer spacing reserved around this window inside its parent's layout.
47
+ * Consumed by the parent's layout engine (absolute/flex/grid); does not
48
+ * influence this window's inner area. */
49
+ private margin;
46
50
  /** Number of columns for `layout: 'grid'`. */
47
51
  private gridColumns;
48
52
  /** Cross-axis alignment for row/column layouts. */
49
53
  private alignItems;
50
54
  /** Main-axis distribution of leftover space when no flex-grow child consumes it. */
51
55
  private justifyContent;
56
+ /** Optional identifier — copied from WindowProperties.id. Used by
57
+ * `WindowManager.focusById` and by diagnostic tooling. */
58
+ private id;
59
+ /** Stacking order among siblings (higher z renders on top). Default: 0. */
60
+ private zIndex;
61
+ /** Fires once when focused state flips from false to true. */
62
+ private onFocusHandler;
63
+ /** Fires once when focused state flips from true to false. */
64
+ private onBlurHandler;
65
+ /** Parent window (set by `addChild`, cleared by `removeChild`). Damage
66
+ * tracking walks up this chain to notify the root `Screen` of geometry
67
+ * or topology changes that need a full repaint. */
68
+ protected parent: Window | null;
69
+ /** Accumulated dirty region in this window's local coordinates.
70
+ * - `null` — nothing changed since the last emit.
71
+ * - `'all'` — the whole window area needs to be re-emitted.
72
+ * - `DirtyRect` — bounding box of localised writes; `markDirty()` eagerly
73
+ * unions new rects so we only ever carry one rect per window.
74
+ * Windows start as `'all'` so the very first frame re-emits every cell. */
75
+ protected dirtyRect: DirtyRect | 'all' | null;
76
+ /** Depth of nested `Window.render()` calls currently executing. Increments
77
+ * at the top of every `render()` and decrements in a `finally`, so
78
+ * controls whose `render()` override re-writes content via `this.clear()`
79
+ * / `this.writeText(...)` do not re-mark themselves dirty every frame —
80
+ * render-time writes deterministically rebuild the display buffer from
81
+ * existing state, so marking them as "user-driven dirty" would defeat the
82
+ * "skip frame when nothing changed" optimisation. */
83
+ protected static renderingDepth: number;
52
84
  /** Creates a window from the given properties.
53
85
  * For percentage-based sizes, call addChild() before writing content to the window.
54
86
  * Uses the global StyleRegistry set by the Screen constructor. */
55
87
  constructor(wp: WindowProperties);
56
88
  /** Returns the window dimensions (columns × rows). */
57
89
  getSize(): TerminalSize;
90
+ /** Marks this window (or a sub-rectangle in its local coordinates) as
91
+ * dirty. Subsequent `Screen.render()` calls emit ANSI only for cells
92
+ * inside the collected dirty rects, skipping untouched regions. When
93
+ * `rect` is omitted, the entire window is flagged. Render-time writes
94
+ * are ignored so controls' `render()` overrides do not re-mark
95
+ * themselves every frame. Safe to call many times between renders —
96
+ * new rects are unioned into the existing bounding box. */
97
+ markDirty(rect?: DirtyRect): void;
98
+ /** Convenience alias — flags the entire window as dirty. Equivalent to
99
+ * calling `markDirty()` with no argument; kept as a named entry point
100
+ * so custom controls can invalidate themselves without depending on
101
+ * the default-argument behaviour. */
102
+ invalidate(): void;
103
+ /** Walks the parent chain up to the root window. Damage tracking uses
104
+ * this to bubble a full-invalidation signal to the root `Screen` when
105
+ * geometry or tree topology changes, because the cells previously
106
+ * occupied by a now-moved / resized / hidden window need to be repainted
107
+ * from the content underneath them. `Screen` overrides it to toggle its
108
+ * internal full-repaint flag; plain `Window`s forward the call up. */
109
+ protected markFullInvalidation(): void;
110
+ /** Appends this window's dirty rect (translated into screen coordinates
111
+ * via the running offset) and every descendant's dirty rects to `acc`.
112
+ * Hidden subtrees are skipped — invisible windows don't contribute to
113
+ * the emit phase, and any state change that flips visibility already
114
+ * escalated to a full invalidation so the vacated area repaints. */
115
+ protected collectDirtyRects(offsetX: number, offsetY: number, acc: DirtyRect[]): void;
116
+ /** Clears the dirty flag on this window and every descendant. Called by
117
+ * `Screen.render()` after the emit phase so the next frame starts from
118
+ * a clean slate. */
119
+ protected clearDirtyRecursive(): void;
120
+ /** Returns a snapshot of the resolved per-side margin (in cells). The parent's
121
+ * layout engine reads this to reserve outer spacing around the child. */
122
+ getMargin(): Readonly<Margin>;
58
123
  /** Returns the number of cells consumed by decorations on each edge.
59
124
  * The explicit 'none' border style is treated as no border (no insets). */
60
125
  private borderInset;
@@ -72,8 +137,33 @@ export declare class Window {
72
137
  getInnerSize(): TerminalSize;
73
138
  /** Sets the active state. Affects border and background appearance on next render(). */
74
139
  setActive(active: boolean): void;
75
- /** Sets the focused state. Controls use this to change visual appearance on focus. */
140
+ /** Sets the focused state. Controls use this to change visual appearance on focus.
141
+ * Fires `onFocus` / `onBlur` (configured via `WindowProperties`) when the state
142
+ * actually changes; a no-op call with the current value does not re-fire them. */
76
143
  setFocused(focused: boolean): void;
144
+ /** Registers (or replaces) the onFocus handler at runtime. Pass `undefined`
145
+ * to detach. Fires in `setFocused` on every false → true transition. */
146
+ setOnFocus(handler: (() => void) | undefined): void;
147
+ /** Registers (or replaces) the onBlur handler at runtime. Pass `undefined`
148
+ * to detach. Fires in `setFocused` on every true → false transition. */
149
+ setOnBlur(handler: (() => void) | undefined): void;
150
+ /** Returns the optional identifier set via WindowProperties.id. */
151
+ getId(): string | undefined;
152
+ /** Sets (or clears with `undefined`) the window identifier used by
153
+ * `WindowManager.focusById` and diagnostic tooling. */
154
+ setId(id: string | undefined): void;
155
+ /** Returns the current stacking order. Higher values render on top of
156
+ * lower ones among siblings. Default: 0. */
157
+ getZIndex(): number;
158
+ /** Updates the stacking order. Siblings are re-sorted on the next render()
159
+ * call; call `screen.render()` (or the surrounding window) to see the
160
+ * change. Does not affect layout (flex/absolute coordinates are
161
+ * independent of z). */
162
+ setZIndex(zIndex: number): void;
163
+ /** Returns the direct children of this window in insertion order (a
164
+ * read-only view). WindowManager uses this to walk subtrees for
165
+ * `trapFocus` and `focusById` without exposing the internal array. */
166
+ getChildren(): readonly Window[];
77
167
  /** Returns whether this window currently has keyboard focus. */
78
168
  isFocused(): boolean;
79
169
  /** Sets the disabled state and deactivates the window when disabled. */
@@ -167,6 +257,16 @@ export declare class Window {
167
257
  * children are also skipped in the loop below.
168
258
  */
169
259
  render(): void;
260
+ /** Returns direct children sorted for rendering — stable by (zIndex asc,
261
+ * insertion order). Children with higher zIndex paint last, so they
262
+ * appear on top of lower-z siblings. Layout is NOT affected: flex and
263
+ * absolute positioning run off the insertion-ordered `children` list. */
264
+ private orderedByZ;
265
+ /** Renders a single-line "⚠ render error" marker over the child's
266
+ * pre-allocated region so a broken subtree never blanks the rest of the
267
+ * frame. The child is still blitted onto this window so its geometry
268
+ * (borders, siblings) remains visible in the debug layout. */
269
+ private paintErrorPlaceholder;
170
270
  /** Fills the display buffer with the background style. When inactive, adds dim to every cell.
171
271
  * No-op when background is 0 (transparent). */
172
272
  private paintBackground;
@@ -203,7 +303,10 @@ export declare class Window {
203
303
  * absolute / row / column / grid implementations based on `layoutMode`. */
204
304
  private runLayout;
205
305
  /** Absolute layout: each child independently resolves its Pos/Size against
206
- * the parent's inner area — the pre-flex behaviour. */
306
+ * the parent's inner area — the pre-flex behaviour. A child's `margin`
307
+ * shifts the resolved position by `(marginLeft, marginTop)` without
308
+ * altering its size, so callers can push a window away from its declared
309
+ * anchor without recomputing coordinates by hand. */
207
310
  private layoutAbsolute;
208
311
  /** Row / column flex layout. The main axis (width for 'row', height for
209
312
  * 'column') is distributed across children: each child starts with its
@@ -215,13 +318,20 @@ export declare class Window {
215
318
  * distribution only when no child consumes slack via flex-grow. Invisible
216
319
  * children are skipped so `setVisible(false)` effectively removes them
217
320
  * from the stack. Children are ordered by `Pos.flex(order)` first, then
218
- * by addChild insertion (stable). */
321
+ * by addChild insertion (stable).
322
+ *
323
+ * Each child's `margin` reserves extra cells around it: the main axis
324
+ * loses `marginLeft+marginRight` (row) or `marginTop+marginBottom` (column)
325
+ * per child before distribution, and the cross axis loses `margin*` per
326
+ * child before alignment. Grow/shrink still apply to the inner size so the
327
+ * declared margin stays constant even when the child is flex-resized. */
219
328
  private layoutFlex;
220
329
  /** Grid layout: children are placed row-major into equally sized cells.
221
330
  * Each cell's width is `(innerWidth - gap * (cols - 1)) / cols` (floored);
222
331
  * heights use the same formula with the derived row count. Children are
223
- * resized to the cell dimensions and positioned at the cell's top-left.
224
- * Invisible children are skipped. */
332
+ * resized to the cell dimensions minus their own margin and positioned
333
+ * at the cell's top-left offset by `(marginLeft, marginTop)`. Invisible
334
+ * children are skipped. */
225
335
  private layoutGrid;
226
336
  /** Returns visible children sorted by Pos.flex(order) ascending; children
227
337
  * without Pos.flex default to order 0. Stable w.r.t. addChild insertion. */
@@ -1 +1 @@
1
- {"version":3,"file":"Window.d.mts","sourceRoot":"","sources":["../../src/Screen/Window.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Window.d.mts","sourceRoot":"","sources":["../../src/Screen/Window.mts"],"names":[],"mappings":"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"}