@teaui/core 1.6.8 → 1.7.8
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/Screen.d.ts +4 -5
- package/.dist/Screen.js +4 -6
- package/.dist/Screen.js.map +1 -1
- package/.dist/Viewport.d.ts +6 -1
- package/.dist/Viewport.js +6 -2
- package/.dist/Viewport.js.map +1 -1
- package/.dist/components/Accordion.js +1 -1
- package/.dist/components/Accordion.js.map +1 -1
- package/.dist/components/Breadcrumb.d.ts +93 -0
- package/.dist/components/Breadcrumb.js +287 -0
- package/.dist/components/Breadcrumb.js.map +1 -0
- package/.dist/components/Button.js +23 -11
- package/.dist/components/Button.js.map +1 -1
- package/.dist/components/Calendar.d.ts +36 -0
- package/.dist/components/Calendar.js +721 -0
- package/.dist/components/Calendar.js.map +1 -0
- package/.dist/components/Canvas.d.ts +48 -0
- package/.dist/components/Canvas.js +230 -0
- package/.dist/components/Canvas.js.map +1 -0
- package/.dist/components/Checkbox.d.ts +3 -2
- package/.dist/components/Checkbox.js +31 -9
- package/.dist/components/Checkbox.js.map +1 -1
- package/.dist/components/Dropdown.d.ts +1 -1
- package/.dist/components/Dropdown.js +14 -6
- package/.dist/components/Dropdown.js.map +1 -1
- package/.dist/components/Geometry.d.ts +29 -0
- package/.dist/components/Geometry.js +40 -0
- package/.dist/components/Geometry.js.map +1 -0
- package/.dist/components/HotKey.js +1 -1
- package/.dist/components/HotKey.js.map +1 -1
- package/.dist/components/Log.js +1 -1
- package/.dist/components/Log.js.map +1 -1
- package/.dist/components/Logo.d.ts +19 -0
- package/.dist/components/Logo.js +204 -0
- package/.dist/components/Logo.js.map +1 -0
- package/.dist/components/Modal.d.ts +74 -0
- package/.dist/components/Modal.js +113 -0
- package/.dist/components/Modal.js.map +1 -0
- package/.dist/components/Pane.d.ts +43 -0
- package/.dist/components/Pane.js +321 -0
- package/.dist/components/Pane.js.map +1 -0
- package/.dist/components/Pin.d.ts +25 -0
- package/.dist/components/Pin.js +80 -0
- package/.dist/components/Pin.js.map +1 -0
- package/.dist/components/Plot.d.ts +25 -0
- package/.dist/components/Plot.js +171 -0
- package/.dist/components/Plot.js.map +1 -0
- package/.dist/components/Scrollable.d.ts +6 -0
- package/.dist/components/Scrollable.js +14 -2
- package/.dist/components/Scrollable.js.map +1 -1
- package/.dist/components/ScrollableList.d.ts +2 -2
- package/.dist/components/ScrollableList.js +4 -4
- package/.dist/components/ScrollableList.js.map +1 -1
- package/.dist/components/Slider.d.ts +2 -0
- package/.dist/components/Slider.js +11 -1
- package/.dist/components/Slider.js.map +1 -1
- package/.dist/components/Table.d.ts +79 -0
- package/.dist/components/Table.js +603 -0
- package/.dist/components/Table.js.map +1 -0
- package/.dist/components/Tabs.d.ts +2 -0
- package/.dist/components/Tabs.js +14 -1
- package/.dist/components/Tabs.js.map +1 -1
- package/.dist/components/ZStack.d.ts +19 -0
- package/.dist/components/ZStack.js +34 -0
- package/.dist/components/ZStack.js.map +1 -0
- package/.dist/components/charts/BarChart.d.ts +27 -0
- package/.dist/components/charts/BarChart.js +122 -0
- package/.dist/components/charts/BarChart.js.map +1 -0
- package/.dist/components/charts/Chart.d.ts +43 -0
- package/.dist/components/charts/Chart.js +41 -0
- package/.dist/components/charts/Chart.js.map +1 -0
- package/.dist/components/charts/LineChart.d.ts +23 -0
- package/.dist/components/charts/LineChart.js +109 -0
- package/.dist/components/charts/LineChart.js.map +1 -0
- package/.dist/components/charts/index.d.ts +3 -0
- package/.dist/components/charts/index.js +4 -0
- package/.dist/components/charts/index.js.map +1 -0
- package/.dist/components/index.d.ts +12 -0
- package/.dist/components/index.js +12 -0
- package/.dist/components/index.js.map +1 -1
- package/.dist/iTerm2.js +1 -3
- package/.dist/iTerm2.js.map +1 -1
- package/.dist/inspect.js +1 -1
- package/.dist/inspect.js.map +1 -1
- package/.dist/managers/ModalManager.d.ts +2 -1
- package/.dist/managers/ModalManager.js +23 -51
- package/.dist/managers/ModalManager.js.map +1 -1
- package/.dist/testing.d.ts +5 -0
- package/.dist/testing.js +19 -3
- package/.dist/testing.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Container } from '../Container.js';
|
|
2
|
+
import { Size } from '../geometry.js';
|
|
3
|
+
/**
|
|
4
|
+
* A container that reports its available size via onLayout callback. Defaults to
|
|
5
|
+
* filling all available space (width='fill', height='fill') unless explicit
|
|
6
|
+
* dimensions are provided.
|
|
7
|
+
*
|
|
8
|
+
* Useful for:
|
|
9
|
+
* - Measuring available space before deciding what to render
|
|
10
|
+
* - Virtualized lists that need viewport height to calculate visible items
|
|
11
|
+
* - Responsive layouts that change based on available space
|
|
12
|
+
*/
|
|
13
|
+
export class Geometry extends Container {
|
|
14
|
+
#onLayout;
|
|
15
|
+
#prevSize = Size.zero;
|
|
16
|
+
constructor({ onLayout, ...props }) {
|
|
17
|
+
super(props);
|
|
18
|
+
this.#onLayout = onLayout;
|
|
19
|
+
}
|
|
20
|
+
update({ onLayout, ...props }) {
|
|
21
|
+
this.#onLayout = onLayout;
|
|
22
|
+
super.update(props);
|
|
23
|
+
}
|
|
24
|
+
naturalSize(available) {
|
|
25
|
+
return available;
|
|
26
|
+
}
|
|
27
|
+
render(viewport) {
|
|
28
|
+
if (viewport.isEmpty) {
|
|
29
|
+
return super.render(viewport);
|
|
30
|
+
}
|
|
31
|
+
const size = viewport.contentSize;
|
|
32
|
+
if (size.width !== this.#prevSize.width ||
|
|
33
|
+
size.height !== this.#prevSize.height) {
|
|
34
|
+
this.#prevSize = size;
|
|
35
|
+
this.#onLayout?.(size);
|
|
36
|
+
}
|
|
37
|
+
super.render(viewport);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Geometry.js","sourceRoot":"","sources":["../../lib/components/Geometry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAA+B,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AAWnC;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAS,SAAQ,SAAS;IACrC,SAAS,CAAmB;IAC5B,SAAS,GAAS,IAAI,CAAC,IAAI,CAAA;IAE3B,YAAY,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAQ;QACrC,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;IAC3B,CAAC;IAED,MAAM,CAAC,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAQ;QAChC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,WAAW,CAAC,SAAe;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAA;QACjC,IACE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK;YACnC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EACrC,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YACrB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Container } from '../Container.js';
|
|
2
2
|
import { Size } from '../geometry.js';
|
|
3
|
-
import { toHotKeyDef } from '../events/index.js';
|
|
3
|
+
import { toHotKeyDef, } from '../events/index.js';
|
|
4
4
|
export class HotKey extends Container {
|
|
5
5
|
#hotKey = { char: '' };
|
|
6
6
|
#onPress;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HotKey.js","sourceRoot":"","sources":["../../lib/components/HotKey.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,SAAS,EAAC,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"HotKey.js","sourceRoot":"","sources":["../../lib/components/HotKey.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,SAAS,EAAC,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAGL,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAO3B,MAAM,OAAO,MAAO,SAAQ,SAAS;IACnC,OAAO,GAAe,EAAC,IAAI,EAAE,EAAE,EAAC,CAAA;IAChC,QAAQ,CAA4B;IAEpC,YAAY,KAAY;QACtB,KAAK,CAAC,KAAK,CAAC,CAAA;QAEZ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,KAAY;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACnB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,CAAC,EAAC,MAAM,EAAE,OAAO,EAAQ;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,UAAU,CAAC,KAAe;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,2EAA2E;QAC3E,uEAAuE;QACvE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACpD,CAAC;CACF"}
|
package/.dist/components/Log.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Log.js","sourceRoot":"","sources":["../../lib/components/Log.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAGT,WAAW,IAAI,cAAc,EAC7B,cAAc,IAAI,iBAAiB,GACpC,MAAM,WAAW,CAAA;AAClB,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAA;AACpC,OAAO,EAAC,MAAM,EAAC,MAAM,YAAY,CAAA;AAKjC,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAEhC,MAAM,OAAO,GAAI,SAAQ,SAAS;IAChC,KAAK,GAAc,EAAE,CAAA;IACrB,eAAe,GAAG,IAAI,cAAc,CAAC;QACnC,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,
|
|
1
|
+
{"version":3,"file":"Log.js","sourceRoot":"","sources":["../../lib/components/Log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Viewport } from '../Viewport.js';
|
|
2
|
+
import type { Props as ViewProps } from '../View.js';
|
|
3
|
+
import { View } from '../View.js';
|
|
4
|
+
import { Size } from '../geometry.js';
|
|
5
|
+
interface Props extends ViewProps {
|
|
6
|
+
isAnimating?: boolean;
|
|
7
|
+
seed?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class Logo extends View {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(props?: Props);
|
|
12
|
+
get isAnimating(): boolean;
|
|
13
|
+
set isAnimating(value: boolean);
|
|
14
|
+
update(props: Props): void;
|
|
15
|
+
naturalSize(_available: Size): Size;
|
|
16
|
+
receiveTick(dt: number): boolean;
|
|
17
|
+
render(viewport: Viewport): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { View } from '../View.js';
|
|
2
|
+
import { Style } from '../Style.js';
|
|
3
|
+
import { Point, Size } from '../geometry.js';
|
|
4
|
+
import { define } from '../util.js';
|
|
5
|
+
const WARM = [240, 223, 175];
|
|
6
|
+
const CYAN = [140, 208, 211];
|
|
7
|
+
const GRAY = [128, 128, 128];
|
|
8
|
+
const BODY_LINES = [
|
|
9
|
+
[
|
|
10
|
+
{ text: ' ┌────────┐', fg: WARM },
|
|
11
|
+
{ text: '──╮', fg: GRAY },
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
{ text: ' │', fg: WARM },
|
|
15
|
+
{ text: '╼╼╼╼╼╼╼╼', fg: CYAN },
|
|
16
|
+
{ text: '│', fg: WARM },
|
|
17
|
+
{ text: ' │', fg: GRAY },
|
|
18
|
+
],
|
|
19
|
+
[
|
|
20
|
+
{ text: ' │', fg: WARM },
|
|
21
|
+
{ text: ' TeaUI ', fg: CYAN },
|
|
22
|
+
{ text: '│', fg: WARM },
|
|
23
|
+
{ text: ' │', fg: GRAY },
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
{ text: ' │', fg: WARM },
|
|
27
|
+
{ text: '╼╼╼╼╼╼╼╼', fg: CYAN },
|
|
28
|
+
{ text: '│', fg: WARM },
|
|
29
|
+
{ text: '──╯', fg: GRAY },
|
|
30
|
+
],
|
|
31
|
+
[{ text: ' ╰▄▄▄▄▄▄▄▄╯ ', fg: WARM }],
|
|
32
|
+
];
|
|
33
|
+
const WIDTH = 16;
|
|
34
|
+
const HEIGHT = 7;
|
|
35
|
+
// Steam simulation constants
|
|
36
|
+
const STEAM_ROWS = 2; // character rows for steam
|
|
37
|
+
const STEAM_DOT_ROWS = STEAM_ROWS * 4; // braille rows
|
|
38
|
+
const STEAM_DOT_COLS = WIDTH * 2; // braille columns
|
|
39
|
+
const TICK_INTERVAL = 80; // ms per simulation step
|
|
40
|
+
const MAX_PARTICLES = 24;
|
|
41
|
+
const PARTICLE_MAX_LIFE = 10;
|
|
42
|
+
// Spawn zone (dot-columns) — above the mug opening
|
|
43
|
+
const SPAWN_MIN_X = 6;
|
|
44
|
+
const SPAWN_MAX_X = 20;
|
|
45
|
+
// Braille dot offsets: [row][col]
|
|
46
|
+
// Each braille char is 2 dots wide × 4 dots tall
|
|
47
|
+
const BRAILLE_DOT = [
|
|
48
|
+
[0x01, 0x08],
|
|
49
|
+
[0x02, 0x10],
|
|
50
|
+
[0x04, 0x20],
|
|
51
|
+
[0x40, 0x80],
|
|
52
|
+
];
|
|
53
|
+
function steamToString(particles) {
|
|
54
|
+
// Build a dot grid
|
|
55
|
+
const grid = [];
|
|
56
|
+
for (let r = 0; r < STEAM_DOT_ROWS; r++) {
|
|
57
|
+
grid[r] = new Array(STEAM_DOT_COLS).fill(false);
|
|
58
|
+
}
|
|
59
|
+
for (const p of particles) {
|
|
60
|
+
if (p.x >= 0 && p.x < STEAM_DOT_COLS && p.y >= 0 && p.y < STEAM_DOT_ROWS) {
|
|
61
|
+
grid[p.y][p.x] = true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Convert to braille characters
|
|
65
|
+
const lines = [];
|
|
66
|
+
for (let cy = 0; cy < STEAM_ROWS; cy++) {
|
|
67
|
+
let line = '';
|
|
68
|
+
for (let cx = 0; cx < WIDTH; cx++) {
|
|
69
|
+
let code = 0x2800;
|
|
70
|
+
for (let dr = 0; dr < 4; dr++) {
|
|
71
|
+
for (let dc = 0; dc < 2; dc++) {
|
|
72
|
+
const dotRow = cy * 4 + dr;
|
|
73
|
+
const dotCol = cx * 2 + dc;
|
|
74
|
+
if (dotRow < STEAM_DOT_ROWS &&
|
|
75
|
+
dotCol < STEAM_DOT_COLS &&
|
|
76
|
+
grid[dotRow][dotCol]) {
|
|
77
|
+
code += BRAILLE_DOT[dr][dc];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
line += String.fromCharCode(code);
|
|
82
|
+
}
|
|
83
|
+
lines.push(line);
|
|
84
|
+
}
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
87
|
+
// Simple seedable RNG (xorshift32) so tests are deterministic when seeded
|
|
88
|
+
function makeRng(seed) {
|
|
89
|
+
let state = seed | 0 || 1;
|
|
90
|
+
return () => {
|
|
91
|
+
state ^= state << 13;
|
|
92
|
+
state ^= state >> 17;
|
|
93
|
+
state ^= state << 5;
|
|
94
|
+
return (state >>> 0) / 0x100000000;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export class Logo extends View {
|
|
98
|
+
#isAnimating = false;
|
|
99
|
+
#particles = [];
|
|
100
|
+
#elapsed = 0;
|
|
101
|
+
#rng;
|
|
102
|
+
constructor(props = {}) {
|
|
103
|
+
super(props);
|
|
104
|
+
this.#rng = makeRng(props.seed ?? Date.now() ^ (Math.random() * 0x7fffffff));
|
|
105
|
+
this.#update(props);
|
|
106
|
+
define(this, 'isAnimating', { enumerable: true });
|
|
107
|
+
}
|
|
108
|
+
get isAnimating() {
|
|
109
|
+
return this.#isAnimating;
|
|
110
|
+
}
|
|
111
|
+
set isAnimating(value) {
|
|
112
|
+
if (value === this.#isAnimating)
|
|
113
|
+
return;
|
|
114
|
+
this.#isAnimating = value;
|
|
115
|
+
this.invalidateRender();
|
|
116
|
+
}
|
|
117
|
+
update(props) {
|
|
118
|
+
this.#update(props);
|
|
119
|
+
super.update(props);
|
|
120
|
+
}
|
|
121
|
+
#update({ isAnimating }) {
|
|
122
|
+
this.#isAnimating = isAnimating ?? false;
|
|
123
|
+
}
|
|
124
|
+
naturalSize(_available) {
|
|
125
|
+
return new Size(WIDTH, HEIGHT);
|
|
126
|
+
}
|
|
127
|
+
receiveTick(dt) {
|
|
128
|
+
if (!this.#isAnimating)
|
|
129
|
+
return false;
|
|
130
|
+
this.#elapsed += dt;
|
|
131
|
+
let stepped = false;
|
|
132
|
+
while (this.#elapsed >= TICK_INTERVAL) {
|
|
133
|
+
this.#elapsed -= TICK_INTERVAL;
|
|
134
|
+
this.#step();
|
|
135
|
+
stepped = true;
|
|
136
|
+
}
|
|
137
|
+
return stepped;
|
|
138
|
+
}
|
|
139
|
+
#step() {
|
|
140
|
+
const rng = this.#rng;
|
|
141
|
+
// Move existing particles upward with random drift
|
|
142
|
+
for (const p of this.#particles) {
|
|
143
|
+
const r = rng();
|
|
144
|
+
if (r < 0.15) {
|
|
145
|
+
// drift left
|
|
146
|
+
p.x -= 1;
|
|
147
|
+
p.y -= 1;
|
|
148
|
+
}
|
|
149
|
+
else if (r < 0.3) {
|
|
150
|
+
// drift right
|
|
151
|
+
p.x += 1;
|
|
152
|
+
p.y -= 1;
|
|
153
|
+
}
|
|
154
|
+
else if (r < 0.85) {
|
|
155
|
+
// straight up
|
|
156
|
+
p.y -= 1;
|
|
157
|
+
}
|
|
158
|
+
// else: stay (pause for a tick)
|
|
159
|
+
p.life -= 1;
|
|
160
|
+
}
|
|
161
|
+
// Remove dead or out-of-bounds particles
|
|
162
|
+
this.#particles = this.#particles.filter(p => p.life > 0 && p.y >= 0 && p.x >= 0 && p.x < STEAM_DOT_COLS);
|
|
163
|
+
// Spawn new particles at the bottom of the steam area
|
|
164
|
+
if (this.#particles.length < MAX_PARTICLES) {
|
|
165
|
+
const count = 1 + Math.floor(rng() * 2);
|
|
166
|
+
for (let i = 0; i < count; i++) {
|
|
167
|
+
this.#particles.push({
|
|
168
|
+
x: SPAWN_MIN_X + Math.floor(rng() * (SPAWN_MAX_X - SPAWN_MIN_X)),
|
|
169
|
+
y: STEAM_DOT_ROWS - 1,
|
|
170
|
+
life: 3 + Math.floor(rng() * (PARTICLE_MAX_LIFE - 3)),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
render(viewport) {
|
|
176
|
+
if (this.#isAnimating) {
|
|
177
|
+
viewport.registerTick();
|
|
178
|
+
}
|
|
179
|
+
// Render steam
|
|
180
|
+
const steamStyle = new Style({ foreground: GRAY });
|
|
181
|
+
if (this.#isAnimating) {
|
|
182
|
+
const steam = steamToString(this.#particles);
|
|
183
|
+
const steamLines = steam.split('\n');
|
|
184
|
+
for (let y = 0; y < steamLines.length; y++) {
|
|
185
|
+
viewport.write(steamLines[y], new Point(0, y), steamStyle);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Static steam when not animating
|
|
190
|
+
viewport.write(' ) ) ) ', new Point(0, 0), steamStyle);
|
|
191
|
+
viewport.write(' ( ( ( ', new Point(0, 1), steamStyle);
|
|
192
|
+
}
|
|
193
|
+
// Render body
|
|
194
|
+
for (let y = 0; y < BODY_LINES.length; y++) {
|
|
195
|
+
let x = 0;
|
|
196
|
+
for (const span of BODY_LINES[y]) {
|
|
197
|
+
const style = new Style({ foreground: span.fg });
|
|
198
|
+
viewport.write(span.text, new Point(x, y + STEAM_ROWS), style);
|
|
199
|
+
x += span.text.length;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=Logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logo.js","sourceRoot":"","sources":["../../lib/components/Logo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,IAAI,EAAC,MAAM,YAAY,CAAA;AAC/B,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AACjC,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,YAAY,CAAA;AAEjC,MAAM,IAAI,GAA6B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACtD,MAAM,IAAI,GAA6B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACtD,MAAM,IAAI,GAA6B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAItD,MAAM,UAAU,GAAa;IAC3B;QACE,EAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAC;QAC/B,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC;KACxB;IACD;QACE,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC;QACtB,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAC;QAC5B,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAC;QACrB,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC;KACxB;IACD;QACE,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC;QACtB,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAC;QAC5B,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAC;QACrB,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC;KACxB;IACD;QACE,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAC;QACtB,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAC;QAC5B,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAC;QACrB,EAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC;KACxB;IACD,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAC,CAAC;CACrC,CAAA;AAED,MAAM,KAAK,GAAG,EAAE,CAAA;AAChB,MAAM,MAAM,GAAG,CAAC,CAAA;AAEhB,6BAA6B;AAC7B,MAAM,UAAU,GAAG,CAAC,CAAA,CAAC,2BAA2B;AAChD,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,CAAA,CAAC,eAAe;AACrD,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,CAAA,CAAC,kBAAkB;AACnD,MAAM,aAAa,GAAG,EAAE,CAAA,CAAC,yBAAyB;AAClD,MAAM,aAAa,GAAG,EAAE,CAAA;AACxB,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,mDAAmD;AACnD,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,MAAM,WAAW,GAAG,EAAE,CAAA;AAQtB,kCAAkC;AAClC,iDAAiD;AACjD,MAAM,WAAW,GAAG;IAClB,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;IACZ,CAAC,IAAI,EAAE,IAAI,CAAC;CACb,CAAA;AAED,SAAS,aAAa,CAAC,SAAqB;IAC1C,mBAAmB;IACnB,MAAM,IAAI,GAAgB,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,cAAc,EAAE,CAAC;YACzE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;QACvB,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;YAClC,IAAI,IAAI,GAAG,MAAM,CAAA;YACjB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;gBAC9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;oBAC1B,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;oBAC1B,IACE,MAAM,GAAG,cAAc;wBACvB,MAAM,GAAG,cAAc;wBACvB,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACpB,CAAC;wBACD,IAAI,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,0EAA0E;AAC1E,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,OAAO,GAAG,EAAE;QACV,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QACpB,KAAK,IAAI,KAAK,IAAI,EAAE,CAAA;QACpB,KAAK,IAAI,KAAK,IAAI,CAAC,CAAA;QACnB,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,WAAW,CAAA;IACpC,CAAC,CAAA;AACH,CAAC;AAOD,MAAM,OAAO,IAAK,SAAQ,IAAI;IAC5B,YAAY,GAAY,KAAK,CAAA;IAC7B,UAAU,GAAe,EAAE,CAAA;IAC3B,QAAQ,GAAW,CAAC,CAAA;IACpB,IAAI,CAAc;IAElB,YAAY,QAAe,EAAE;QAC3B,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAA;QAC5E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEnB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,IAAI,WAAW,CAAC,KAAc;QAC5B,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY;YAAE,OAAM;QACvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,MAAM,CAAC,KAAY;QACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACnB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,CAAC,EAAC,WAAW,EAAQ;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,IAAI,KAAK,CAAA;IAC1C,CAAC;IAED,WAAW,CAAC,UAAgB;QAC1B,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAA;QAEpC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;QACnB,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAC,QAAQ,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAA;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA;QAErB,mDAAmD;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;gBACb,aAAa;gBACb,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBACR,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACV,CAAC;iBAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;gBACnB,cAAc;gBACd,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBACR,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACV,CAAC;iBAAM,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;gBACpB,cAAc;gBACd,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACV,CAAC;YACD,gCAAgC;YAChC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;QACb,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,cAAc,CAChE,CAAA;QAED,sDAAsD;QACtD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACnB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;oBAChE,CAAC,EAAE,cAAc,GAAG,CAAC;oBACrB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;iBACtD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,QAAQ,CAAC,YAAY,EAAE,CAAA;QACzB,CAAC;QAED,eAAe;QACf,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC,CAAA;QAChD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YAC/D,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QACjE,CAAC;QAED,cAAc;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAC,CAAC,CAAA;gBAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC9D,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Viewport } from '../Viewport.js';
|
|
2
|
+
import { type Props as ContainerProps, Container } from '../Container.js';
|
|
3
|
+
import { Style } from '../Style.js';
|
|
4
|
+
import { Rect, Size } from '../geometry.js';
|
|
5
|
+
import { type MouseEvent, type KeyEvent } from '../events/index.js';
|
|
6
|
+
import type { System } from '../System.js';
|
|
7
|
+
export interface Props extends ContainerProps {
|
|
8
|
+
/**
|
|
9
|
+
* If true, paints the entire screen with dimStyle before rendering children.
|
|
10
|
+
* Default: false
|
|
11
|
+
*/
|
|
12
|
+
dim?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Style used for dimming. Defaults to theme.dimTextColor fg + theme.dimBackgroundColor bg.
|
|
15
|
+
*/
|
|
16
|
+
dimStyle?: Style;
|
|
17
|
+
/**
|
|
18
|
+
* If true, clicking outside the modal content dismisses it.
|
|
19
|
+
* Default: true
|
|
20
|
+
*/
|
|
21
|
+
dismissOnClick?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* If true, pressing Escape dismisses the modal.
|
|
24
|
+
* Default: false
|
|
25
|
+
*/
|
|
26
|
+
dismissOnEsc?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Called when the modal is dismissed (via click-outside or esc).
|
|
29
|
+
*/
|
|
30
|
+
onDismiss?: () => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A modal overlay that is rendered above the main view tree.
|
|
34
|
+
*
|
|
35
|
+
* Pass a Modal instance to `viewport.requestModal(modal)` to present it.
|
|
36
|
+
* The ModalManager sets `presentedRect` and `windowSize` before rendering.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* const modal = new Modal({
|
|
40
|
+
* dim: true,
|
|
41
|
+
* dismissOnClick: true,
|
|
42
|
+
* dismissOnEsc: true,
|
|
43
|
+
* onDismiss: () => { ... },
|
|
44
|
+
* children: [myContent],
|
|
45
|
+
* })
|
|
46
|
+
* viewport.requestModal(modal)
|
|
47
|
+
*/
|
|
48
|
+
export declare class Modal extends Container {
|
|
49
|
+
#private;
|
|
50
|
+
/**
|
|
51
|
+
* The rect of the view that called `viewport.requestModal()`, in absolute
|
|
52
|
+
* screen coordinates. Set by ModalManager before rendering.
|
|
53
|
+
*/
|
|
54
|
+
presentedRect: Rect;
|
|
55
|
+
/**
|
|
56
|
+
* The full screen/window size. Set by ModalManager before rendering.
|
|
57
|
+
*/
|
|
58
|
+
windowSize: Size;
|
|
59
|
+
constructor(props?: Props);
|
|
60
|
+
update(props: Props): void;
|
|
61
|
+
get dim(): boolean;
|
|
62
|
+
set dim(value: boolean);
|
|
63
|
+
get dimStyle(): Style | undefined;
|
|
64
|
+
set dimStyle(value: Style | undefined);
|
|
65
|
+
get dismissOnClick(): boolean;
|
|
66
|
+
set dismissOnClick(value: boolean);
|
|
67
|
+
get dismissOnEsc(): boolean;
|
|
68
|
+
set dismissOnEsc(value: boolean);
|
|
69
|
+
get onDismiss(): (() => void) | undefined;
|
|
70
|
+
set onDismiss(value: (() => void) | undefined);
|
|
71
|
+
receiveMouse(event: MouseEvent, system: System): void;
|
|
72
|
+
receiveKey(event: KeyEvent): void;
|
|
73
|
+
render(viewport: Viewport): void;
|
|
74
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Container } from '../Container.js';
|
|
2
|
+
import { Style } from '../Style.js';
|
|
3
|
+
import { Rect, Size } from '../geometry.js';
|
|
4
|
+
import { isMouseClicked, toHotKeyDef, } from '../events/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* A modal overlay that is rendered above the main view tree.
|
|
7
|
+
*
|
|
8
|
+
* Pass a Modal instance to `viewport.requestModal(modal)` to present it.
|
|
9
|
+
* The ModalManager sets `presentedRect` and `windowSize` before rendering.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const modal = new Modal({
|
|
13
|
+
* dim: true,
|
|
14
|
+
* dismissOnClick: true,
|
|
15
|
+
* dismissOnEsc: true,
|
|
16
|
+
* onDismiss: () => { ... },
|
|
17
|
+
* children: [myContent],
|
|
18
|
+
* })
|
|
19
|
+
* viewport.requestModal(modal)
|
|
20
|
+
*/
|
|
21
|
+
export class Modal extends Container {
|
|
22
|
+
#dim;
|
|
23
|
+
#dimStyle;
|
|
24
|
+
#dismissOnClick;
|
|
25
|
+
#dismissOnEsc;
|
|
26
|
+
#onDismiss;
|
|
27
|
+
/**
|
|
28
|
+
* The rect of the view that called `viewport.requestModal()`, in absolute
|
|
29
|
+
* screen coordinates. Set by ModalManager before rendering.
|
|
30
|
+
*/
|
|
31
|
+
presentedRect = Rect.zero;
|
|
32
|
+
/**
|
|
33
|
+
* The full screen/window size. Set by ModalManager before rendering.
|
|
34
|
+
*/
|
|
35
|
+
windowSize = Size.zero;
|
|
36
|
+
constructor(props = {}) {
|
|
37
|
+
super(props);
|
|
38
|
+
this.#dim = props.dim ?? false;
|
|
39
|
+
this.#dimStyle = props.dimStyle;
|
|
40
|
+
this.#dismissOnClick = props.dismissOnClick ?? true;
|
|
41
|
+
this.#dismissOnEsc = props.dismissOnEsc ?? false;
|
|
42
|
+
this.#onDismiss = props.onDismiss;
|
|
43
|
+
}
|
|
44
|
+
update(props) {
|
|
45
|
+
this.#update(props);
|
|
46
|
+
super.update(props);
|
|
47
|
+
}
|
|
48
|
+
#update(props) {
|
|
49
|
+
this.#dim = props.dim ?? false;
|
|
50
|
+
this.#dimStyle = props.dimStyle;
|
|
51
|
+
this.#dismissOnClick = props.dismissOnClick ?? true;
|
|
52
|
+
this.#dismissOnEsc = props.dismissOnEsc ?? false;
|
|
53
|
+
this.#onDismiss = props.onDismiss;
|
|
54
|
+
}
|
|
55
|
+
get dim() {
|
|
56
|
+
return this.#dim;
|
|
57
|
+
}
|
|
58
|
+
set dim(value) {
|
|
59
|
+
this.#dim = value;
|
|
60
|
+
}
|
|
61
|
+
get dimStyle() {
|
|
62
|
+
return this.#dimStyle;
|
|
63
|
+
}
|
|
64
|
+
set dimStyle(value) {
|
|
65
|
+
this.#dimStyle = value;
|
|
66
|
+
}
|
|
67
|
+
get dismissOnClick() {
|
|
68
|
+
return this.#dismissOnClick;
|
|
69
|
+
}
|
|
70
|
+
set dismissOnClick(value) {
|
|
71
|
+
this.#dismissOnClick = value;
|
|
72
|
+
}
|
|
73
|
+
get dismissOnEsc() {
|
|
74
|
+
return this.#dismissOnEsc;
|
|
75
|
+
}
|
|
76
|
+
set dismissOnEsc(value) {
|
|
77
|
+
this.#dismissOnEsc = value;
|
|
78
|
+
}
|
|
79
|
+
get onDismiss() {
|
|
80
|
+
return this.#onDismiss;
|
|
81
|
+
}
|
|
82
|
+
set onDismiss(value) {
|
|
83
|
+
this.#onDismiss = value;
|
|
84
|
+
}
|
|
85
|
+
receiveMouse(event, system) {
|
|
86
|
+
if (this.#dismissOnClick && isMouseClicked(event)) {
|
|
87
|
+
this.#onDismiss?.();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
receiveKey(event) {
|
|
91
|
+
if (this.#dismissOnEsc && event.name === 'escape') {
|
|
92
|
+
this.#onDismiss?.();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
render(viewport) {
|
|
96
|
+
if (this.#dim) {
|
|
97
|
+
const style = this.#dimStyle ??
|
|
98
|
+
new Style({
|
|
99
|
+
foreground: this.theme.dimTextColor,
|
|
100
|
+
background: this.theme.dimBackgroundColor,
|
|
101
|
+
});
|
|
102
|
+
viewport.paint(style);
|
|
103
|
+
}
|
|
104
|
+
if (this.#dismissOnClick) {
|
|
105
|
+
viewport.registerMouse('mouse.button.left');
|
|
106
|
+
}
|
|
107
|
+
if (this.#dismissOnEsc) {
|
|
108
|
+
viewport.registerHotKey(toHotKeyDef('escape'));
|
|
109
|
+
}
|
|
110
|
+
super.render(viewport);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=Modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../lib/components/Modal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Viewport } from '../Viewport.js';
|
|
2
|
+
import { View } from '../View.js';
|
|
3
|
+
import { Container, type Props as ContainerProps } from '../Container.js';
|
|
4
|
+
import { Size } from '../geometry.js';
|
|
5
|
+
import { type MouseEvent } from '../events/index.js';
|
|
6
|
+
import { System } from '../System.js';
|
|
7
|
+
interface Props extends ContainerProps {
|
|
8
|
+
/**
|
|
9
|
+
* Draw a border around the entire pane.
|
|
10
|
+
* @default false
|
|
11
|
+
*/
|
|
12
|
+
border?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether browser panes can be collapsed by clicking the separator or
|
|
15
|
+
* dragging to a very small width. When false, the minimum pane width is 4.
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
collapsible?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A split-pane container for index/detail layouts. The first N-1 children are
|
|
22
|
+
* collapsible "browser" panes with draggable separators. The last child is the
|
|
23
|
+
* "detail" pane that takes remaining space.
|
|
24
|
+
*/
|
|
25
|
+
export declare class Pane extends Container {
|
|
26
|
+
#private;
|
|
27
|
+
constructor(props?: Props);
|
|
28
|
+
update(props: Props): void;
|
|
29
|
+
get border(): boolean;
|
|
30
|
+
set border(value: boolean);
|
|
31
|
+
/**
|
|
32
|
+
* Returns the browser panes (all children except the last).
|
|
33
|
+
*/
|
|
34
|
+
get browserViews(): View[];
|
|
35
|
+
/**
|
|
36
|
+
* Returns the detail pane (the last child).
|
|
37
|
+
*/
|
|
38
|
+
get detailView(): View | undefined;
|
|
39
|
+
naturalSize(available: Size): Size;
|
|
40
|
+
receiveMouse(event: MouseEvent, system: System): void;
|
|
41
|
+
render(viewport: Viewport): void;
|
|
42
|
+
}
|
|
43
|
+
export {};
|