@textui/core 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/app.d.ts +28 -0
- package/dist/app/app.d.ts.map +1 -1
- package/dist/app/app.js +93 -1
- package/dist/render/buffer.d.ts +16 -1
- package/dist/render/buffer.d.ts.map +1 -1
- package/dist/render/buffer.js +27 -2
- package/dist/render/layout.d.ts +18 -0
- package/dist/render/layout.d.ts.map +1 -1
- package/dist/render/layout.js +16 -6
- package/dist/runtime/bindings.d.ts.map +1 -1
- package/dist/runtime/bindings.js +31 -4
- package/dist/runtime/hooks.d.ts +14 -2
- package/dist/runtime/hooks.d.ts.map +1 -1
- package/dist/runtime/hooks.js +15 -4
- package/dist/runtime/paint.d.ts.map +1 -1
- package/dist/runtime/paint.js +55 -16
- package/dist/types/app.d.ts +15 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/util/text.d.ts +18 -1
- package/dist/util/text.d.ts.map +1 -1
- package/dist/util/text.js +55 -4
- package/package.json +1 -1
- package/src/app/app.ts +96 -1
- package/src/render/buffer.ts +28 -2
- package/src/render/layout.ts +27 -6
- package/src/runtime/bindings.ts +29 -3
- package/src/runtime/hooks.ts +15 -4
- package/src/runtime/paint.ts +58 -17
- package/src/types/app.ts +13 -0
- package/src/util/text.ts +55 -4
package/dist/app/app.d.ts
CHANGED
|
@@ -120,6 +120,34 @@ export declare class App implements TextUIApp {
|
|
|
120
120
|
setRoot(node: ComponentNode): void;
|
|
121
121
|
private requestRender;
|
|
122
122
|
flush(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Render until there is nothing left to render.
|
|
125
|
+
*
|
|
126
|
+
* `flush` forces one frame; this is the other question - *has it finished?* -
|
|
127
|
+
* and there was no way to ask it. What a program wanting one true frame did
|
|
128
|
+
* instead was guess: every example that writes a still ended with a sleep
|
|
129
|
+
* loop of four milliseconds times a number somebody tried until the picture
|
|
130
|
+
* looked right. Eight, mostly. Four in one, twelve in another. A number too
|
|
131
|
+
* small does not fail; it writes a half-drawn frame.
|
|
132
|
+
*
|
|
133
|
+
* A frame settles in more than one pass by design - an effect may mark
|
|
134
|
+
* something dirty, and a measurement changing runs the layout again - so the
|
|
135
|
+
* answer is a loop rather than a flag. Each turn yields to the task queue
|
|
136
|
+
* first, because what has not run yet cannot have marked anything.
|
|
137
|
+
*
|
|
138
|
+
* It returns as soon as a pass finds nothing pending, so an application that
|
|
139
|
+
* animates settles *between* its frames - which is what makes a still of one
|
|
140
|
+
* possible at all, and why the answer is not "has it stopped moving".
|
|
141
|
+
*
|
|
142
|
+
* `false` is the other thing: passes that kept producing work until the
|
|
143
|
+
* limit ran out, which is a render loop that does not converge - an effect
|
|
144
|
+
* with no dependency list setting the state it reads. Worth reporting rather
|
|
145
|
+
* than hanging on, and worth a number rather than a promise a caller can
|
|
146
|
+
* wait on for ever.
|
|
147
|
+
*/
|
|
148
|
+
settled(options?: {
|
|
149
|
+
limit?: number;
|
|
150
|
+
}): Promise<boolean>;
|
|
123
151
|
/**
|
|
124
152
|
* The tree the frame renders: the shell, always, when one is registered.
|
|
125
153
|
*
|
package/dist/app/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/app/app.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/app/app.ts"],"names":[],"mappings":"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"}
|
package/dist/app/app.js
CHANGED
|
@@ -255,6 +255,20 @@ export class App {
|
|
|
255
255
|
const shell = this.shells.get(id);
|
|
256
256
|
if (shell?.theme && this.themes.get(shell.theme))
|
|
257
257
|
this.setTheme(shell.theme);
|
|
258
|
+
// `root` reaches the screen two ways, and this is the moment it changes
|
|
259
|
+
// which. With no shell registered at boot it was never opened into `main` -
|
|
260
|
+
// `rootNode` wraps it directly, which is the path an application built out
|
|
261
|
+
// of primitives takes. A shell arriving afterwards makes `rootNode` return
|
|
262
|
+
// the shell instead, and the application's entire content was simply gone:
|
|
263
|
+
// a framed, themed, empty screen.
|
|
264
|
+
//
|
|
265
|
+
// `setRoot` has always handled both paths, and says why - "setting one and
|
|
266
|
+
// not the other works in exactly half of the programs that can exist". This
|
|
267
|
+
// is the other half of the same sentence. Opening the same key twice
|
|
268
|
+
// replaces the mount rather than stacking one, so no guard is needed.
|
|
269
|
+
if (this.options.root) {
|
|
270
|
+
this.surfaces.open({ surface: 'main', key: ROOT_KEY, target: this.options.root });
|
|
271
|
+
}
|
|
258
272
|
this.buffer_.invalidate();
|
|
259
273
|
this.requestRender(true);
|
|
260
274
|
}
|
|
@@ -401,6 +415,44 @@ export class App {
|
|
|
401
415
|
this.frameScheduled = false;
|
|
402
416
|
this.renderFrame();
|
|
403
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Render until there is nothing left to render.
|
|
420
|
+
*
|
|
421
|
+
* `flush` forces one frame; this is the other question - *has it finished?* -
|
|
422
|
+
* and there was no way to ask it. What a program wanting one true frame did
|
|
423
|
+
* instead was guess: every example that writes a still ended with a sleep
|
|
424
|
+
* loop of four milliseconds times a number somebody tried until the picture
|
|
425
|
+
* looked right. Eight, mostly. Four in one, twelve in another. A number too
|
|
426
|
+
* small does not fail; it writes a half-drawn frame.
|
|
427
|
+
*
|
|
428
|
+
* A frame settles in more than one pass by design - an effect may mark
|
|
429
|
+
* something dirty, and a measurement changing runs the layout again - so the
|
|
430
|
+
* answer is a loop rather than a flag. Each turn yields to the task queue
|
|
431
|
+
* first, because what has not run yet cannot have marked anything.
|
|
432
|
+
*
|
|
433
|
+
* It returns as soon as a pass finds nothing pending, so an application that
|
|
434
|
+
* animates settles *between* its frames - which is what makes a still of one
|
|
435
|
+
* possible at all, and why the answer is not "has it stopped moving".
|
|
436
|
+
*
|
|
437
|
+
* `false` is the other thing: passes that kept producing work until the
|
|
438
|
+
* limit ran out, which is a render loop that does not converge - an effect
|
|
439
|
+
* with no dependency list setting the state it reads. Worth reporting rather
|
|
440
|
+
* than hanging on, and worth a number rather than a promise a caller can
|
|
441
|
+
* wait on for ever.
|
|
442
|
+
*/
|
|
443
|
+
async settled(options = {}) {
|
|
444
|
+
const limit = options.limit ?? 100;
|
|
445
|
+
for (let i = 0; i < limit; i++) {
|
|
446
|
+
// Deliberately not `unref`'d: this timer is what keeps the process alive
|
|
447
|
+
// while a still is being rendered, and one that lets it exit would leave
|
|
448
|
+
// the await unresolved and the frame unwritten.
|
|
449
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
450
|
+
if (!this.frameScheduled && !this.isDirty())
|
|
451
|
+
return true;
|
|
452
|
+
this.flush();
|
|
453
|
+
}
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
404
456
|
/**
|
|
405
457
|
* The tree the frame renders: the shell, always, when one is registered.
|
|
406
458
|
*
|
|
@@ -675,7 +727,21 @@ export class App {
|
|
|
675
727
|
if (position)
|
|
676
728
|
return;
|
|
677
729
|
const cursor = instance.props.cursor;
|
|
678
|
-
|
|
730
|
+
/*
|
|
731
|
+
* Absent, not falsy.
|
|
732
|
+
*
|
|
733
|
+
* `cursor` is a column, and column 0 is a real one - it is where the
|
|
734
|
+
* caret sits in an empty field, and where it sits at the start of any
|
|
735
|
+
* field. `!cursor` treated that as "no caret here", so a text input
|
|
736
|
+
* published no cursor position at all until its first character was
|
|
737
|
+
* typed: the terminal cursor stayed hidden, and the only thing marking
|
|
738
|
+
* the focused control was its border colour.
|
|
739
|
+
*
|
|
740
|
+
* `true` still means "here, at offset 0", which is what the `typeof`
|
|
741
|
+
* below is for - so this rejects the three ways of saying nothing and
|
|
742
|
+
* nothing else.
|
|
743
|
+
*/
|
|
744
|
+
if (cursor === undefined || cursor === null || cursor === false || !instance.box)
|
|
679
745
|
return;
|
|
680
746
|
const id = typeof instance.props.id === 'string' ? instance.props.id : instance.id;
|
|
681
747
|
if (id !== focused && `${instance.id}:focus` !== focused)
|
|
@@ -794,6 +860,32 @@ export class App {
|
|
|
794
860
|
catch (err) {
|
|
795
861
|
this.handleError(err, `input:${event.type}`);
|
|
796
862
|
}
|
|
863
|
+
/*
|
|
864
|
+
* Pointer motion and the wheel are streams, and only where they got to
|
|
865
|
+
* means anything.
|
|
866
|
+
*
|
|
867
|
+
* A terminal reports every cell the pointer crosses and every notch of the
|
|
868
|
+
* wheel, and one read can carry twenty of them - so rendering per event
|
|
869
|
+
* lays out and paints the whole tree twenty times to draw one gesture. The
|
|
870
|
+
* cost is the size of the tree, which is why it is invisible on a short
|
|
871
|
+
* screen and, on a long transcript, is the thing being dragged trailing
|
|
872
|
+
* seconds behind the pointer and a wheel that goes on scrolling after the
|
|
873
|
+
* hand has stopped. That second one is the tell: it is not momentum, it is
|
|
874
|
+
* a backlog of events still being drawn one frame each.
|
|
875
|
+
*
|
|
876
|
+
* Only the drawing is coalesced. Every event is still dispatched, so the
|
|
877
|
+
* notches still add up and the pointer still ends where it ended; what
|
|
878
|
+
* they share is the one frame `handleMouse` asked for, at the animation
|
|
879
|
+
* ceiling rather than at whatever rate the terminal felt like reporting.
|
|
880
|
+
*
|
|
881
|
+
* Keys are the opposite and stay synchronous: every one of them is a
|
|
882
|
+
* separate thing a person did, and a handler closes over the props from
|
|
883
|
+
* its last render, so typing "ab" without a frame in between makes the
|
|
884
|
+
* handler for "b" see the state from before "a".
|
|
885
|
+
*/
|
|
886
|
+
if (event.type === 'mouse'
|
|
887
|
+
&& (event.action === 'move' || event.action === 'drag' || event.action === 'wheel'))
|
|
888
|
+
return;
|
|
797
889
|
if (this.running_ && this.isDirty())
|
|
798
890
|
this.renderFrame();
|
|
799
891
|
}
|
package/dist/render/buffer.d.ts
CHANGED
|
@@ -69,7 +69,22 @@ export declare class Buffer implements CellBuffer {
|
|
|
69
69
|
cellChanged(i: number): boolean;
|
|
70
70
|
dirtyRows(): number[];
|
|
71
71
|
commit(): void;
|
|
72
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* Force the next diff to repaint everything. After a resize or a redraw.
|
|
74
|
+
*
|
|
75
|
+
* Both halves, and the second one is the one that was missing. Clearing
|
|
76
|
+
* `committed` makes `dirtyRows` return every row, but `diffFrame` still
|
|
77
|
+
* skips each cell that matches the previous frame - and a blank cell in the
|
|
78
|
+
* new frame matched the reset previous frame exactly, so it was never
|
|
79
|
+
* written. Under a theme with an opaque canvas nothing showed, because every
|
|
80
|
+
* cell carries a background colour and therefore differs anyway. Under a
|
|
81
|
+
* theme with a transparent one the blanks are default-on-default, and the
|
|
82
|
+
* terminal kept whatever the old layout had left in them: a resize scattered
|
|
83
|
+
* the previous frame across the new one and it never cleared.
|
|
84
|
+
*
|
|
85
|
+
* So the previous frame is filled with a character no cell can hold, which
|
|
86
|
+
* is a comparison that cannot come out equal.
|
|
87
|
+
*/
|
|
73
88
|
invalidate(): void;
|
|
74
89
|
toText(rect?: Rect): string;
|
|
75
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/render/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/render/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAYxE,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,WAAW,CAAC;IAChB,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAGD,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;;GAMG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAE9B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAAS;gBAEd,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAkBzC,8EAA8E;IAC9E,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAa3C;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAYtD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAO3C,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAInC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;OAIG;IACH,GAAG,CACD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,EAAE,GAAE,WAA2B,EAC/B,EAAE,GAAE,WAA2B,EAC/B,KAAK,SAAI,EACT,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI;IAqDP;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,GAAE,WAA2B,GAAG,IAAI;IAmBzD,OAAO,CAAC,QAAQ;IAShB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoC3C,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAU/B,SAAS,IAAI,MAAM,EAAE;IAiBrB,MAAM,IAAI,IAAI;IASd;;;;;;;;;;;;;;;OAeG;IACH,UAAU,IAAI,IAAI;IAKlB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM;CAgB5B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
package/dist/render/buffer.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { COLOR_DEFAULT, packColor } from './color.js';
|
|
2
|
+
/**
|
|
3
|
+
* A character no cell can hold, for the previous frame when it must not match.
|
|
4
|
+
*
|
|
5
|
+
* `put` refuses the empty string and every real glyph is one the terminal can
|
|
6
|
+
* print, so NUL is a value that never arrives from a render and never leaves
|
|
7
|
+
* one: `diffFrame` reads `chars`, never `prevChars`, so this is only ever a
|
|
8
|
+
* comparison and is never written out.
|
|
9
|
+
*/
|
|
10
|
+
const NEVER = '\u0000';
|
|
2
11
|
import { graphemeWidth } from '../util/text.js';
|
|
3
12
|
/** Internal cell flags, kept out of the public attrs bitfield. */
|
|
4
13
|
export const FLAG_CONTINUATION = 1;
|
|
@@ -200,7 +209,7 @@ export class Buffer {
|
|
|
200
209
|
this.links = next.links;
|
|
201
210
|
// A resize invalidates the previous frame entirely.
|
|
202
211
|
const n = width * height;
|
|
203
|
-
this.prevChars = new Array(n).fill(
|
|
212
|
+
this.prevChars = new Array(n).fill(NEVER);
|
|
204
213
|
this.prevFg = new Int32Array(n).fill(COLOR_DEFAULT);
|
|
205
214
|
this.prevBg = new Int32Array(n).fill(COLOR_DEFAULT);
|
|
206
215
|
this.prevAttrs = new Uint16Array(n);
|
|
@@ -238,9 +247,25 @@ export class Buffer {
|
|
|
238
247
|
this.prevLinks = this.links.slice();
|
|
239
248
|
this.committed = true;
|
|
240
249
|
}
|
|
241
|
-
/**
|
|
250
|
+
/**
|
|
251
|
+
* Force the next diff to repaint everything. After a resize or a redraw.
|
|
252
|
+
*
|
|
253
|
+
* Both halves, and the second one is the one that was missing. Clearing
|
|
254
|
+
* `committed` makes `dirtyRows` return every row, but `diffFrame` still
|
|
255
|
+
* skips each cell that matches the previous frame - and a blank cell in the
|
|
256
|
+
* new frame matched the reset previous frame exactly, so it was never
|
|
257
|
+
* written. Under a theme with an opaque canvas nothing showed, because every
|
|
258
|
+
* cell carries a background colour and therefore differs anyway. Under a
|
|
259
|
+
* theme with a transparent one the blanks are default-on-default, and the
|
|
260
|
+
* terminal kept whatever the old layout had left in them: a resize scattered
|
|
261
|
+
* the previous frame across the new one and it never cleared.
|
|
262
|
+
*
|
|
263
|
+
* So the previous frame is filled with a character no cell can hold, which
|
|
264
|
+
* is a comparison that cannot come out equal.
|
|
265
|
+
*/
|
|
242
266
|
invalidate() {
|
|
243
267
|
this.committed = false;
|
|
268
|
+
this.prevChars.fill(NEVER);
|
|
244
269
|
}
|
|
245
270
|
toText(rect) {
|
|
246
271
|
const r = rect ?? { x: 0, y: 0, width: this.width, height: this.height };
|
package/dist/render/layout.d.ts
CHANGED
|
@@ -34,6 +34,24 @@ export interface LayoutBox {
|
|
|
34
34
|
content: Rect;
|
|
35
35
|
/** Content larger than `content`, when overflow is 'scroll'. */
|
|
36
36
|
scrollSize?: Size;
|
|
37
|
+
/**
|
|
38
|
+
* Frame and gaps, worked out once for this box.
|
|
39
|
+
*
|
|
40
|
+
* Neither depends on the space being offered - they are the box's own
|
|
41
|
+
* margin, border, padding and gap - and the box is measured about four
|
|
42
|
+
* times a frame at different bounds, each of which was rebuilding both and
|
|
43
|
+
* allocating three objects to do it. Same lifetime as `measured` below, and
|
|
44
|
+
* for the same reason: a layout box is rebuilt from the instance tree every
|
|
45
|
+
* frame, so nothing here can go stale.
|
|
46
|
+
*/
|
|
47
|
+
frame?: {
|
|
48
|
+
margin: Edges;
|
|
49
|
+
inset: Edges;
|
|
50
|
+
};
|
|
51
|
+
gaps?: {
|
|
52
|
+
main: number;
|
|
53
|
+
cross: number;
|
|
54
|
+
};
|
|
37
55
|
/**
|
|
38
56
|
* The last answer `measureBox` gave for this box, and what it was asked.
|
|
39
57
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/render/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAA6B,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGpF;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,yEAAyE;IACzE,WAAW,EAAE,KAAK,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,yEAAyE;IACzE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,IAAI,EAAE,IAAI,CAAC;IACX,8DAA8D;IAC9D,OAAO,EAAE,IAAI,CAAC;IACd,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAuB9D;AA0CD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,CAElE;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/render/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAA6B,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGpF;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,yEAAyE;IACzE,WAAW,EAAE,KAAK,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,yEAAyE;IACzE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,IAAI,EAAE,IAAI,CAAC;IACX,8DAA8D;IAC9D,OAAO,EAAE,IAAI,CAAC;IACd,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,CAAC;IAElB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IACxC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAEvC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAuB9D;AA0CD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,CAElE;AA0ED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsJ/E;AA0FD,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAE5D"}
|
package/dist/render/layout.js
CHANGED
|
@@ -82,11 +82,16 @@ function mainOverflow(box) {
|
|
|
82
82
|
* that sets both reads the same either way round.
|
|
83
83
|
*/
|
|
84
84
|
function gapsOf(box) {
|
|
85
|
+
const seen = box.gaps;
|
|
86
|
+
if (seen !== undefined)
|
|
87
|
+
return seen;
|
|
85
88
|
const vertical = box.style.rowGap ?? box.style.gap ?? 0;
|
|
86
89
|
const horizontal = box.style.columnGap ?? box.style.gap ?? 0;
|
|
87
|
-
|
|
90
|
+
const gaps = isColumn(box)
|
|
88
91
|
? { main: vertical, cross: horizontal }
|
|
89
92
|
: { main: horizontal, cross: vertical };
|
|
93
|
+
box.gaps = gaps;
|
|
94
|
+
return gaps;
|
|
90
95
|
}
|
|
91
96
|
/**
|
|
92
97
|
* Cut a run of main-axis sizes into lines that each fit `limit`.
|
|
@@ -115,10 +120,13 @@ function splitLines(mains, gap, limit) {
|
|
|
115
120
|
}
|
|
116
121
|
/** Space this box consumes outside its content: margin, border, padding. */
|
|
117
122
|
function frameOf(box) {
|
|
123
|
+
const seen = box.frame;
|
|
124
|
+
if (seen !== undefined)
|
|
125
|
+
return seen;
|
|
118
126
|
const margin = resolveEdges(box.style.margin);
|
|
119
127
|
const padding = resolveEdges(box.style.padding);
|
|
120
128
|
const b = box.borderEdges;
|
|
121
|
-
|
|
129
|
+
const frame = {
|
|
122
130
|
margin,
|
|
123
131
|
inset: {
|
|
124
132
|
top: b.top + padding.top,
|
|
@@ -127,6 +135,8 @@ function frameOf(box) {
|
|
|
127
135
|
left: b.left + padding.left,
|
|
128
136
|
},
|
|
129
137
|
};
|
|
138
|
+
box.frame = frame;
|
|
139
|
+
return frame;
|
|
130
140
|
}
|
|
131
141
|
/**
|
|
132
142
|
* Intrinsic size, ignoring grow. Containers ask their children; leaves are
|
|
@@ -178,7 +188,7 @@ export function measureBox(box, availW, availH) {
|
|
|
178
188
|
continue;
|
|
179
189
|
count++;
|
|
180
190
|
const m = measureBox(child, innerAvailW, innerAvailH);
|
|
181
|
-
const cm =
|
|
191
|
+
const cm = frameOf(child).margin;
|
|
182
192
|
mains.push(column ? m.height + edgeV(cm) : m.width + edgeH(cm));
|
|
183
193
|
crosses.push(column ? m.width + edgeH(cm) : m.height + edgeV(cm));
|
|
184
194
|
}
|
|
@@ -222,7 +232,7 @@ export function measureBox(box, availW, availH) {
|
|
|
222
232
|
continue;
|
|
223
233
|
const flex = Math.max(0, child.style.flex ?? 0);
|
|
224
234
|
if (flex > 0) {
|
|
225
|
-
const cm =
|
|
235
|
+
const cm = frameOf(child).margin;
|
|
226
236
|
const share = Math.max(0, Math.floor((room * flex) / totalFlex) - edgeH(cm));
|
|
227
237
|
const m = measureBox(child, share, innerAvailH);
|
|
228
238
|
crosses[index] = m.height + edgeV(cm);
|
|
@@ -439,7 +449,7 @@ function layoutWrapped(box, flow) {
|
|
|
439
449
|
const mains = [];
|
|
440
450
|
const crosses = [];
|
|
441
451
|
for (const child of flow) {
|
|
442
|
-
const margin =
|
|
452
|
+
const margin = frameOf(child).margin;
|
|
443
453
|
const basis = child.style.basis ?? (column ? child.style.height : child.style.width);
|
|
444
454
|
const fixed = resolveDimension(basis, mainAvail);
|
|
445
455
|
const m = measureBox(child, column ? crossAvail : mainAvail, column ? mainAvail : crossAvail);
|
|
@@ -480,7 +490,7 @@ function layoutLine(box, flow, content, scrollOffset) {
|
|
|
480
490
|
const crossAvail = column ? content.width : content.height;
|
|
481
491
|
const gapTotal = flow.length > 1 ? gap * (flow.length - 1) : 0;
|
|
482
492
|
// 1. base sizes
|
|
483
|
-
const margins = flow.map((c) =>
|
|
493
|
+
const margins = flow.map((c) => frameOf(c).margin);
|
|
484
494
|
const bases = [];
|
|
485
495
|
for (let i = 0; i < flow.length; i++) {
|
|
486
496
|
const child = flow[i];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/runtime/bindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAAE,WAAW,EAAE,aAAa,EACnC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gCAAgC;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,gCAAgC;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,oEAAoE;IACpE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAsCD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,GAC7D,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAW/C;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/runtime/bindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAAE,WAAW,EAAE,aAAa,EACnC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gCAAgC;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,gCAAgC;IAChC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,oEAAoE;IACpE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpB;AAsCD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,GAC7D,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,GAAG,SAAS,CAW/C;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CA4CzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,aAAa,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAOD,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,OAAO,GACT,CAAC,IAAI;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAMrD"}
|
package/dist/runtime/bindings.js
CHANGED
|
@@ -69,13 +69,40 @@ export function resolveValue(ctx, value) {
|
|
|
69
69
|
return value;
|
|
70
70
|
if (isAction(value))
|
|
71
71
|
return value;
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
/*
|
|
73
|
+
* The same array back when there was nothing in it to resolve.
|
|
74
|
+
*
|
|
75
|
+
* Identity is what the reconciler compares - a component whose props are
|
|
76
|
+
* all unchanged is not re-run, and neither is anything under it - so
|
|
77
|
+
* copying unconditionally made that test impossible to pass for exactly
|
|
78
|
+
* the props worth passing it for. A list of four hundred rows arrived as a
|
|
79
|
+
* new array on every pass, its holder re-rendered every frame whatever it
|
|
80
|
+
* had been told, and the memoisation callers wrote to prevent that could
|
|
81
|
+
* not reach this far.
|
|
82
|
+
*
|
|
83
|
+
* Copying at all is for the bindings: a `{ path }` inside an array has to
|
|
84
|
+
* become the value it names, and that is a different array. So the copy is
|
|
85
|
+
* kept and returned only when something in it actually changed.
|
|
86
|
+
*/
|
|
87
|
+
if (Array.isArray(value)) {
|
|
88
|
+
let changed = false;
|
|
89
|
+
const items = value.map((v) => {
|
|
90
|
+
const resolved = resolveValue(ctx, v);
|
|
91
|
+
if (resolved !== v)
|
|
92
|
+
changed = true;
|
|
93
|
+
return resolved;
|
|
94
|
+
});
|
|
95
|
+
return changed ? items : value;
|
|
96
|
+
}
|
|
97
|
+
let changed = false;
|
|
74
98
|
const out = {};
|
|
75
99
|
for (const [k, v] of Object.entries(value)) {
|
|
76
|
-
|
|
100
|
+
const resolved = resolveValue(ctx, v);
|
|
101
|
+
if (resolved !== v)
|
|
102
|
+
changed = true;
|
|
103
|
+
out[k] = resolved;
|
|
77
104
|
}
|
|
78
|
-
return out;
|
|
105
|
+
return changed ? out : value;
|
|
79
106
|
}
|
|
80
107
|
/**
|
|
81
108
|
* Resolve every prop on a node. `component`, `id`, `key` and `$meta` are
|
package/dist/runtime/hooks.d.ts
CHANGED
|
@@ -274,8 +274,20 @@ export declare function useTicker(onTick: (frame: number, elapsedMs: number) =>
|
|
|
274
274
|
fps?: number;
|
|
275
275
|
enabled?: boolean;
|
|
276
276
|
}): void;
|
|
277
|
-
/**
|
|
278
|
-
|
|
277
|
+
/**
|
|
278
|
+
* A frame counter, for spinners and marquees. Frozen when animation is off.
|
|
279
|
+
*
|
|
280
|
+
* `enabled` is not a convenience. A ticker is a standing invalidation - it
|
|
281
|
+
* marks its component dirty `fps` times a second for as long as it is
|
|
282
|
+
* mounted - so a component that animates only sometimes and calls this
|
|
283
|
+
* unconditionally keeps the whole application rendering while it sits still.
|
|
284
|
+
* That is invisible in a small tree and is the entire frame budget in a large
|
|
285
|
+
* one, which is the case nobody tests. Frozen at 0 while off, so a caret or a
|
|
286
|
+
* spinner drawn from it is steady rather than absent.
|
|
287
|
+
*/
|
|
288
|
+
export declare function useFrame(fps?: number, options?: {
|
|
289
|
+
enabled?: boolean;
|
|
290
|
+
}): number;
|
|
279
291
|
/** A value that eases towards its target. Snaps when animation is off. */
|
|
280
292
|
export declare function useTween(target: number, durationMs?: number): number;
|
|
281
293
|
export declare function useInterval(fn: () => void, ms: number, enabled?: boolean): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/runtime/hooks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/runtime/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/hooks.js
CHANGED
|
@@ -796,13 +796,24 @@ export function useTicker(onTick, options = {}) {
|
|
|
796
796
|
return () => ticker.dispose();
|
|
797
797
|
}, [enabled, options.fps]);
|
|
798
798
|
}
|
|
799
|
-
/**
|
|
800
|
-
|
|
799
|
+
/**
|
|
800
|
+
* A frame counter, for spinners and marquees. Frozen when animation is off.
|
|
801
|
+
*
|
|
802
|
+
* `enabled` is not a convenience. A ticker is a standing invalidation - it
|
|
803
|
+
* marks its component dirty `fps` times a second for as long as it is
|
|
804
|
+
* mounted - so a component that animates only sometimes and calls this
|
|
805
|
+
* unconditionally keeps the whole application rendering while it sits still.
|
|
806
|
+
* That is invisible in a small tree and is the entire frame budget in a large
|
|
807
|
+
* one, which is the case nobody tests. Frozen at 0 while off, so a caret or a
|
|
808
|
+
* spinner drawn from it is steady rather than absent.
|
|
809
|
+
*/
|
|
810
|
+
export function useFrame(fps = 10, options = {}) {
|
|
801
811
|
const instance = currentInstance();
|
|
802
812
|
const [frame, setFrame] = useState(0);
|
|
803
813
|
const disabled = instance.runtime.animation.disabled;
|
|
804
|
-
|
|
805
|
-
|
|
814
|
+
const running = (options.enabled ?? true) && !disabled;
|
|
815
|
+
useTicker(() => setFrame((f) => f + 1), { fps, enabled: running });
|
|
816
|
+
return running ? frame : 0;
|
|
806
817
|
}
|
|
807
818
|
/** A value that eases towards its target. Snaps when animation is off. */
|
|
808
819
|
export function useTween(target, durationMs = 200) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/runtime/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,KAAK,EAA2B,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMrF,OAAO,EAES,KAAK,gBAAgB,EACpC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/runtime/paint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,KAAK,EAA2B,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMrF,OAAO,EAES,KAAK,gBAAgB,EACpC,MAAM,YAAY,CAAC;AAuIpB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,oBAAoB,EAClC,KAAK,GAAE,gBAAiC,GACvC,aAAa,CAiBf;AAID,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,oBAAoB,CAAC;IACnC,kEAAkE;IAClE,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAAC;CAC/C;AAeD,6DAA6D;AAC7D,UAAU,SAAS;IACjB,EAAE,EAAE,WAAW,CAAC;IAChB,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AA4DD,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,SAA0B,GACpC,SAAS,EAAE,CAwDb;AAsFD,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,IAAI,GACT,IAAI,CA4FN"}
|
package/dist/runtime/paint.js
CHANGED
|
@@ -2,7 +2,7 @@ import { ATTR_DIM } from '../types/cells.js';
|
|
|
2
2
|
import { overflowOn } from '../render/layout.js';
|
|
3
3
|
import { COLOR_DEFAULT, mix, packColor } from '../render/color.js';
|
|
4
4
|
import { rectIntersect } from '../types/geometry.js';
|
|
5
|
-
import { graphemes, graphemeWidth, sanitize, stringWidth, truncate, truncateSideOf, wrapModeOf, wrapText, } from '../util/text.js';
|
|
5
|
+
import { graphemes, graphemeWidth, isAscii, sanitize, stringWidth, truncate, truncateSideOf, wrapModeOf, wrapText, } from '../util/text.js';
|
|
6
6
|
import { attrsFromStyle, NO_INTERACTION, packStyleColor, resolveBorder, resolveStyle, } from './style.js';
|
|
7
7
|
/**
|
|
8
8
|
* Painting.
|
|
@@ -62,8 +62,22 @@ class Surface {
|
|
|
62
62
|
const attrs = style?.attrs ?? 0;
|
|
63
63
|
const link = style?.link;
|
|
64
64
|
const oy = this.rect.y + y;
|
|
65
|
+
const clean = sanitize(text);
|
|
66
|
+
// Plain ASCII is one cell per character and needs none of the clustering
|
|
67
|
+
// machinery - and it is nearly every string a terminal ever draws. The
|
|
68
|
+
// general path allocates an array of one-character strings for the whole
|
|
69
|
+
// run before writing any of it.
|
|
65
70
|
let cx = x;
|
|
66
|
-
|
|
71
|
+
if (isAscii(clean)) {
|
|
72
|
+
for (let i = 0; i < clean.length; i++) {
|
|
73
|
+
const ax = this.rect.x + cx;
|
|
74
|
+
if (this.visible(ax, oy))
|
|
75
|
+
this.buffer.put(ax, oy, clean[i], fg, bg, attrs, link);
|
|
76
|
+
cx += 1;
|
|
77
|
+
}
|
|
78
|
+
return cx - x;
|
|
79
|
+
}
|
|
80
|
+
for (const g of graphemes(clean)) {
|
|
67
81
|
const w = graphemeWidth(g);
|
|
68
82
|
if (w === 0)
|
|
69
83
|
continue;
|
|
@@ -246,31 +260,56 @@ function textContent(instance) {
|
|
|
246
260
|
function oneLine(text) {
|
|
247
261
|
return text.includes('\n') ? text.split('\n').join(' ') : text;
|
|
248
262
|
}
|
|
263
|
+
/**
|
|
264
|
+
* Text measurements already taken.
|
|
265
|
+
*
|
|
266
|
+
* A measurement is a pure function of the string, how it wraps and the width
|
|
267
|
+
* it is offered - and a layout asks for the same three several times in a
|
|
268
|
+
* frame, then the next frame asks for all of them again. The text in a
|
|
269
|
+
* transcript does not change; only the one line somebody is typing does.
|
|
270
|
+
*/
|
|
271
|
+
const measurements = new Map();
|
|
272
|
+
const MEASURE_CACHE = 4096;
|
|
249
273
|
function textMeasure(instance, style) {
|
|
250
274
|
return (maxWidth) => {
|
|
251
275
|
const text = sanitize(textContent(instance));
|
|
252
276
|
if (text === '')
|
|
253
277
|
return { width: 0, height: text.includes('\n') ? 1 : 1 };
|
|
254
278
|
const wrap = style.wrap ?? 'none';
|
|
279
|
+
const key = `${wrap}\u0000${String(maxWidth)}\u0000${text}`;
|
|
280
|
+
const seen = measurements.get(key);
|
|
281
|
+
if (seen !== undefined)
|
|
282
|
+
return seen;
|
|
255
283
|
// A truncating text is one row, always. It still asks for the width it
|
|
256
284
|
// would like - a box sizing itself around it gets the whole string when
|
|
257
285
|
// there is room, and only cuts when there is not.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
286
|
+
const size = measure(text, wrap, maxWidth);
|
|
287
|
+
if (measurements.size >= MEASURE_CACHE)
|
|
288
|
+
measurements.clear();
|
|
289
|
+
measurements.set(key, size);
|
|
290
|
+
return size;
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** The measurement itself, with nothing remembered. */
|
|
294
|
+
function measure(text, wrap, maxWidth) {
|
|
295
|
+
// A truncating text is one row, always. It still asks for the width it
|
|
296
|
+
// would like - a box sizing itself around it gets the whole string when
|
|
297
|
+
// there is room, and only cuts when there is not.
|
|
298
|
+
if (truncateSideOf(wrap) !== undefined) {
|
|
299
|
+
return { width: stringWidth(oneLine(text)), height: 1 };
|
|
300
|
+
}
|
|
301
|
+
if (wrap === 'none') {
|
|
302
|
+
const lines = text.split('\n');
|
|
270
303
|
return {
|
|
271
|
-
width: Math.
|
|
272
|
-
height:
|
|
304
|
+
width: Math.max(...lines.map(stringWidth)),
|
|
305
|
+
height: lines.length,
|
|
273
306
|
};
|
|
307
|
+
}
|
|
308
|
+
const limit = Number.isFinite(maxWidth) && maxWidth > 0 ? maxWidth : stringWidth(text);
|
|
309
|
+
const lines = wrapText(text, limit, wrapModeOf(wrap));
|
|
310
|
+
return {
|
|
311
|
+
width: Math.min(limit, Math.max(0, ...lines.map(stringWidth))),
|
|
312
|
+
height: Math.max(1, lines.length),
|
|
274
313
|
};
|
|
275
314
|
}
|
|
276
315
|
// ------------------------------------------------------------------- paint
|