@profullstack/hqtui 0.1.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/README.md +144 -0
- package/dist/ansi.d.ts +42 -0
- package/dist/ansi.d.ts.map +1 -0
- package/dist/ansi.js +66 -0
- package/dist/ansi.js.map +1 -0
- package/dist/app.d.ts +128 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +296 -0
- package/dist/app.js.map +1 -0
- package/dist/buffer.d.ts +50 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +184 -0
- package/dist/buffer.js.map +1 -0
- package/dist/capabilities.d.ts +36 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +93 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/color.d.ts +47 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +176 -0
- package/dist/color.js.map +1 -0
- package/dist/diff.d.ts +39 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +203 -0
- package/dist/diff.js.map +1 -0
- package/dist/graphics/blocks.d.ts +26 -0
- package/dist/graphics/blocks.d.ts.map +1 -0
- package/dist/graphics/blocks.js +49 -0
- package/dist/graphics/blocks.js.map +1 -0
- package/dist/graphics/braille.d.ts +33 -0
- package/dist/graphics/braille.d.ts.map +1 -0
- package/dist/graphics/braille.js +166 -0
- package/dist/graphics/braille.js.map +1 -0
- package/dist/graphics/index.d.ts +4 -0
- package/dist/graphics/index.d.ts.map +1 -0
- package/dist/graphics/index.js +4 -0
- package/dist/graphics/index.js.map +1 -0
- package/dist/graphics/plot.d.ts +91 -0
- package/dist/graphics/plot.d.ts.map +1 -0
- package/dist/graphics/plot.js +291 -0
- package/dist/graphics/plot.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +62 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +245 -0
- package/dist/input.js.map +1 -0
- package/dist/layout.d.ts +51 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +163 -0
- package/dist/layout.js.map +1 -0
- package/dist/surface.d.ts +81 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +181 -0
- package/dist/surface.js.map +1 -0
- package/dist/terminal.d.ts +63 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +189 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing.d.ts +71 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +171 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme.d.ts +58 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +238 -0
- package/dist/theme.js.map +1 -0
- package/dist/ui.d.ts +194 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +439 -0
- package/dist/ui.js.map +1 -0
- package/dist/unicode.d.ts +36 -0
- package/dist/unicode.d.ts.map +1 -0
- package/dist/unicode.js +221 -0
- package/dist/unicode.js.map +1 -0
- package/dist/widgets/controls.d.ts +95 -0
- package/dist/widgets/controls.d.ts.map +1 -0
- package/dist/widgets/controls.js +231 -0
- package/dist/widgets/controls.js.map +1 -0
- package/dist/widgets/index.d.ts +5 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +5 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/meters.d.ts +100 -0
- package/dist/widgets/meters.d.ts.map +1 -0
- package/dist/widgets/meters.js +209 -0
- package/dist/widgets/meters.js.map +1 -0
- package/dist/widgets/table.d.ts +92 -0
- package/dist/widgets/table.d.ts.map +1 -0
- package/dist/widgets/table.js +228 -0
- package/dist/widgets/table.js.map +1 -0
- package/dist/widgets/text.d.ts +64 -0
- package/dist/widgets/text.d.ts.map +1 -0
- package/dist/widgets/text.js +123 -0
- package/dist/widgets/text.js.map +1 -0
- package/package.json +56 -0
package/dist/input.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes raw terminal bytes into normalized events. Applications should never
|
|
3
|
+
* see an escape sequence — only `"ctrl+c"`, `"up"`, or a printable character.
|
|
4
|
+
*/
|
|
5
|
+
const SPECIAL = {
|
|
6
|
+
"[A": "up", "[B": "down", "[C": "right", "[D": "left",
|
|
7
|
+
"[H": "home", "[F": "end", "[Z": "shift+tab",
|
|
8
|
+
"OA": "up", "OB": "down", "OC": "right", "OD": "left",
|
|
9
|
+
"OH": "home", "OF": "end",
|
|
10
|
+
"OP": "f1", "OQ": "f2", "OR": "f3", "OS": "f4",
|
|
11
|
+
"[1~": "home", "[2~": "insert", "[3~": "delete", "[4~": "end",
|
|
12
|
+
"[5~": "pageup", "[6~": "pagedown", "[7~": "home", "[8~": "end",
|
|
13
|
+
"[11~": "f1", "[12~": "f2", "[13~": "f3", "[14~": "f4", "[15~": "f5",
|
|
14
|
+
"[17~": "f6", "[18~": "f7", "[19~": "f8", "[20~": "f9", "[21~": "f10",
|
|
15
|
+
"[23~": "f11", "[24~": "f12",
|
|
16
|
+
};
|
|
17
|
+
// xterm modifier parameter: 1 + bitfield(shift=1, alt=2, ctrl=4).
|
|
18
|
+
function decodeModifiers(param) {
|
|
19
|
+
const bits = Math.max(0, param - 1);
|
|
20
|
+
return { shift: (bits & 1) !== 0, alt: (bits & 2) !== 0, ctrl: (bits & 4) !== 0 };
|
|
21
|
+
}
|
|
22
|
+
function keyEvent(name, mods = {}, char, raw = "") {
|
|
23
|
+
const ctrl = mods.ctrl ?? false;
|
|
24
|
+
const alt = mods.alt ?? false;
|
|
25
|
+
const shift = mods.shift ?? false;
|
|
26
|
+
const parts = [];
|
|
27
|
+
if (ctrl)
|
|
28
|
+
parts.push("ctrl");
|
|
29
|
+
if (alt)
|
|
30
|
+
parts.push("alt");
|
|
31
|
+
if (shift && name.length > 1)
|
|
32
|
+
parts.push("shift");
|
|
33
|
+
parts.push(name);
|
|
34
|
+
return { type: "key", name, ctrl, alt, shift, char, key: parts.join("+"), raw };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Feed it chunks, get events. Stateful so a sequence split across two reads
|
|
38
|
+
* (common over SSH) still decodes correctly.
|
|
39
|
+
*/
|
|
40
|
+
export class InputParser {
|
|
41
|
+
pending = "";
|
|
42
|
+
pasteBuffer = null;
|
|
43
|
+
/** True when bytes are buffered awaiting the rest of a sequence. */
|
|
44
|
+
get hasPending() {
|
|
45
|
+
return this.pending.length > 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve buffered bytes that turned out to be complete after all. A lone ESC
|
|
49
|
+
* is ambiguous — it only becomes the Escape key once no more bytes follow —
|
|
50
|
+
* so the terminal calls this on a short timeout.
|
|
51
|
+
*/
|
|
52
|
+
flush() {
|
|
53
|
+
if (this.pending.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const data = this.pending;
|
|
56
|
+
this.pending = "";
|
|
57
|
+
if (data === "\x1b")
|
|
58
|
+
return [keyEvent("escape", {}, undefined, "\x1b")];
|
|
59
|
+
const events = [];
|
|
60
|
+
// An incomplete sequence that never completed: emit ESC and re-parse the rest.
|
|
61
|
+
events.push(keyEvent("escape", {}, undefined, "\x1b"));
|
|
62
|
+
events.push(...this.parse(data.slice(1)));
|
|
63
|
+
return events;
|
|
64
|
+
}
|
|
65
|
+
parse(chunk) {
|
|
66
|
+
const events = [];
|
|
67
|
+
let data = this.pending + chunk;
|
|
68
|
+
this.pending = "";
|
|
69
|
+
while (data.length > 0) {
|
|
70
|
+
if (this.pasteBuffer !== null) {
|
|
71
|
+
const end = data.indexOf("\x1b[201~");
|
|
72
|
+
if (end === -1) {
|
|
73
|
+
this.pasteBuffer += data;
|
|
74
|
+
data = "";
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
this.pasteBuffer += data.slice(0, end);
|
|
78
|
+
events.push({ type: "paste", text: this.pasteBuffer });
|
|
79
|
+
this.pasteBuffer = null;
|
|
80
|
+
data = data.slice(end + 6);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const ch = data[0];
|
|
84
|
+
if (ch !== "\x1b") {
|
|
85
|
+
const consumed = this.parsePlain(data, events);
|
|
86
|
+
data = data.slice(consumed);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Lone ESC at the end of a chunk: could be the start of a sequence.
|
|
90
|
+
if (data.length === 1) {
|
|
91
|
+
this.pending = data;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
const consumed = this.parseEscape(data, events);
|
|
95
|
+
if (consumed === -1) {
|
|
96
|
+
this.pending = data; // incomplete sequence, wait for more bytes
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
data = data.slice(consumed);
|
|
100
|
+
}
|
|
101
|
+
return events;
|
|
102
|
+
}
|
|
103
|
+
parsePlain(data, events) {
|
|
104
|
+
const cp = data.codePointAt(0);
|
|
105
|
+
const size = cp > 0xffff ? 2 : 1;
|
|
106
|
+
const ch = data.slice(0, size);
|
|
107
|
+
if (cp === 13 || cp === 10) {
|
|
108
|
+
events.push(keyEvent("enter", {}, undefined, ch));
|
|
109
|
+
return size;
|
|
110
|
+
}
|
|
111
|
+
if (cp === 9) {
|
|
112
|
+
events.push(keyEvent("tab", {}, undefined, ch));
|
|
113
|
+
return size;
|
|
114
|
+
}
|
|
115
|
+
if (cp === 127 || cp === 8) {
|
|
116
|
+
events.push(keyEvent("backspace", {}, undefined, ch));
|
|
117
|
+
return size;
|
|
118
|
+
}
|
|
119
|
+
if (cp === 32) {
|
|
120
|
+
events.push(keyEvent("space", {}, " ", ch));
|
|
121
|
+
return size;
|
|
122
|
+
}
|
|
123
|
+
if (cp < 32) {
|
|
124
|
+
// Ctrl+letter arrives as the control code itself.
|
|
125
|
+
const letter = String.fromCharCode(cp + 96);
|
|
126
|
+
events.push(keyEvent(letter, { ctrl: true }, undefined, ch));
|
|
127
|
+
return size;
|
|
128
|
+
}
|
|
129
|
+
events.push(keyEvent(ch, {}, ch, ch));
|
|
130
|
+
return size;
|
|
131
|
+
}
|
|
132
|
+
parseEscape(data, events) {
|
|
133
|
+
// Bracketed paste start.
|
|
134
|
+
if (data.startsWith("\x1b[200~")) {
|
|
135
|
+
this.pasteBuffer = "";
|
|
136
|
+
return 6;
|
|
137
|
+
}
|
|
138
|
+
if (data.startsWith("\x1b[I")) {
|
|
139
|
+
events.push({ type: "focus", focused: true });
|
|
140
|
+
return 3;
|
|
141
|
+
}
|
|
142
|
+
if (data.startsWith("\x1b[O")) {
|
|
143
|
+
events.push({ type: "focus", focused: false });
|
|
144
|
+
return 3;
|
|
145
|
+
}
|
|
146
|
+
// SGR mouse: ESC [ < b ; x ; y (M press | m release)
|
|
147
|
+
const mouse = /^\x1b\[<(\d+);(\d+);(\d+)([Mm])/.exec(data);
|
|
148
|
+
if (mouse) {
|
|
149
|
+
events.push(this.decodeMouse(Number(mouse[1]), Number(mouse[2]), Number(mouse[3]), mouse[4] === "M"));
|
|
150
|
+
return mouse[0].length;
|
|
151
|
+
}
|
|
152
|
+
if (/^\x1b\[<[\d;]*$/.test(data))
|
|
153
|
+
return -1;
|
|
154
|
+
// CSI with modifier parameters: ESC [ 1 ; 5 A → ctrl+up
|
|
155
|
+
const modded = /^\x1b\[1;(\d+)([A-HPQRS])/.exec(data);
|
|
156
|
+
if (modded) {
|
|
157
|
+
const mods = decodeModifiers(Number(modded[1]));
|
|
158
|
+
const base = SPECIAL[`[${modded[2]}`] ?? SPECIAL[`O${modded[2]}`];
|
|
159
|
+
if (base) {
|
|
160
|
+
events.push(keyEvent(base, mods, undefined, modded[0]));
|
|
161
|
+
return modded[0].length;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const moddedTilde = /^\x1b\[(\d+);(\d+)~/.exec(data);
|
|
165
|
+
if (moddedTilde) {
|
|
166
|
+
const base = SPECIAL[`[${moddedTilde[1]}~`];
|
|
167
|
+
if (base) {
|
|
168
|
+
events.push(keyEvent(base, decodeModifiers(Number(moddedTilde[2])), undefined, moddedTilde[0]));
|
|
169
|
+
return moddedTilde[0].length;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Plain special keys, longest match first.
|
|
173
|
+
for (const seq of SPECIAL_KEYS_SORTED) {
|
|
174
|
+
if (data.startsWith(`\x1b${seq}`)) {
|
|
175
|
+
const name = SPECIAL[seq];
|
|
176
|
+
if (name === "shift+tab")
|
|
177
|
+
events.push(keyEvent("tab", { shift: true }, undefined, `\x1b${seq}`));
|
|
178
|
+
else
|
|
179
|
+
events.push(keyEvent(name, {}, undefined, `\x1b${seq}`));
|
|
180
|
+
return seq.length + 1;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Possibly-incomplete CSI/SS3 sequence.
|
|
184
|
+
if (/^\x1b(\[|O)[\d;<]*$/.test(data))
|
|
185
|
+
return -1;
|
|
186
|
+
// Alt+key.
|
|
187
|
+
if (data.length >= 2 && data[1] !== "[" && data[1] !== "O") {
|
|
188
|
+
const rest = data.slice(1);
|
|
189
|
+
const sub = [];
|
|
190
|
+
const consumed = this.parsePlain(rest, sub);
|
|
191
|
+
const first = sub[0];
|
|
192
|
+
if (first && first.type === "key") {
|
|
193
|
+
events.push(keyEvent(first.name, { ...first, alt: true }, first.char, `\x1b${first.raw}`));
|
|
194
|
+
return consumed + 1;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
events.push(keyEvent("escape", {}, undefined, "\x1b"));
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
decodeMouse(code, col, row, pressed) {
|
|
201
|
+
const shift = (code & 4) !== 0;
|
|
202
|
+
const alt = (code & 8) !== 0;
|
|
203
|
+
const ctrl = (code & 16) !== 0;
|
|
204
|
+
const motion = (code & 32) !== 0;
|
|
205
|
+
const isScroll = (code & 64) !== 0;
|
|
206
|
+
const buttonBits = code & 3;
|
|
207
|
+
let button = "none";
|
|
208
|
+
let action;
|
|
209
|
+
let scroll = 0;
|
|
210
|
+
if (isScroll) {
|
|
211
|
+
action = "scroll";
|
|
212
|
+
scroll = buttonBits === 0 ? -1 : 1;
|
|
213
|
+
}
|
|
214
|
+
else if (motion) {
|
|
215
|
+
action = buttonBits === 3 ? "move" : "drag";
|
|
216
|
+
button = buttonBits === 0 ? "left" : buttonBits === 1 ? "middle" : buttonBits === 2 ? "right" : "none";
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
action = pressed ? "press" : "release";
|
|
220
|
+
button = buttonBits === 0 ? "left" : buttonBits === 1 ? "middle" : buttonBits === 2 ? "right" : "none";
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
type: "mouse",
|
|
224
|
+
action,
|
|
225
|
+
button,
|
|
226
|
+
x: Math.max(0, col - 1),
|
|
227
|
+
y: Math.max(0, row - 1),
|
|
228
|
+
scroll,
|
|
229
|
+
ctrl,
|
|
230
|
+
alt,
|
|
231
|
+
shift,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const SPECIAL_KEYS_SORTED = Object.keys(SPECIAL).sort((a, b) => b.length - a.length);
|
|
236
|
+
/** Does this event match a binding like `"ctrl+c"`, `"q"`, or `"f10"`? */
|
|
237
|
+
export function matchKey(event, binding) {
|
|
238
|
+
const b = binding.toLowerCase().trim();
|
|
239
|
+
if (event.key.toLowerCase() === b)
|
|
240
|
+
return true;
|
|
241
|
+
if (event.name.toLowerCase() === b && !event.ctrl && !event.alt)
|
|
242
|
+
return true;
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
package/dist/layout.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sizes are resolved once per frame with a single pass. No manual coordinate
|
|
3
|
+
* arithmetic should ever appear in application code.
|
|
4
|
+
*
|
|
5
|
+
* 12 12 columns/rows
|
|
6
|
+
* "40%" 40% of the container
|
|
7
|
+
* "2fr" two shares of whatever is left over
|
|
8
|
+
* "auto" whatever the widget says it needs
|
|
9
|
+
* "fill" same as "1fr"
|
|
10
|
+
*/
|
|
11
|
+
export type Size = number | string;
|
|
12
|
+
export interface Rect {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
export interface Constraint {
|
|
19
|
+
size?: Size;
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
/** Natural size, used by "auto" and as the floor for flexible items. */
|
|
23
|
+
intrinsic?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare const fixed: (n: number) => Size;
|
|
26
|
+
export declare const percent: (n: number) => Size;
|
|
27
|
+
export declare const flex: (n?: number) => Size;
|
|
28
|
+
export declare const auto: Size;
|
|
29
|
+
export declare const fill: Size;
|
|
30
|
+
export declare const remaining: () => Size;
|
|
31
|
+
export declare const minmax: (min: number, max: number) => Constraint;
|
|
32
|
+
/**
|
|
33
|
+
* Distribute `total` across `items`, honouring gaps, fractions, and min/max.
|
|
34
|
+
* Always returns non-negative integers that sum to at most `total`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function solve(total: number, items: Constraint[], gap?: number): number[];
|
|
37
|
+
/** Lay children out along one axis inside `rect`. */
|
|
38
|
+
export declare function stack(rect: Rect, items: Constraint[], direction: "row" | "column", gap?: number): Rect[];
|
|
39
|
+
export type Padding = number | [number, number] | [number, number, number, number] | {
|
|
40
|
+
top?: number;
|
|
41
|
+
right?: number;
|
|
42
|
+
bottom?: number;
|
|
43
|
+
left?: number;
|
|
44
|
+
};
|
|
45
|
+
export declare function normalizePadding(p: Padding | undefined): [number, number, number, number];
|
|
46
|
+
/** Shrink a rect by padding, never past zero. */
|
|
47
|
+
export declare function inset(rect: Rect, padding: Padding): Rect;
|
|
48
|
+
export declare function intersect(a: Rect, b: Rect): Rect;
|
|
49
|
+
export declare function contains(rect: Rect, x: number, y: number): boolean;
|
|
50
|
+
export declare function isEmpty(rect: Rect): boolean;
|
|
51
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnC,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,IAAS,CAAC;AAC5C,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,IAAe,CAAC;AACpD,eAAO,MAAM,IAAI,GAAI,UAAK,KAAG,IAAgB,CAAC;AAC9C,eAAO,MAAM,IAAI,EAAE,IAAa,CAAC;AACjC,eAAO,MAAM,IAAI,EAAE,IAAa,CAAC;AACjC,eAAO,MAAM,SAAS,QAAO,IAAc,CAAC;AAC5C,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,UAA0C,CAAC;AAiC7F;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,SAAI,GAAG,MAAM,EAAE,CA8E3E;AAED,qDAAqD;AACrD,wBAAgB,KAAK,CACnB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,KAAK,GAAG,QAAQ,EAC3B,GAAG,SAAI,GACN,IAAI,EAAE,CAcR;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChF;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQzF;AAED,iDAAiD;AACjD,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAQxD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAMhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE3C"}
|
package/dist/layout.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export const fixed = (n) => n;
|
|
2
|
+
export const percent = (n) => `${n}%`;
|
|
3
|
+
export const flex = (n = 1) => `${n}fr`;
|
|
4
|
+
export const auto = "auto";
|
|
5
|
+
export const fill = "fill";
|
|
6
|
+
export const remaining = () => "fill";
|
|
7
|
+
export const minmax = (min, max) => ({ size: "fill", min, max });
|
|
8
|
+
function parse(c, total) {
|
|
9
|
+
const min = c.min ?? 0;
|
|
10
|
+
const max = c.max ?? Infinity;
|
|
11
|
+
const size = c.size ?? "auto";
|
|
12
|
+
if (typeof size === "number")
|
|
13
|
+
return { value: size, fr: 0, min, max };
|
|
14
|
+
const s = size.trim();
|
|
15
|
+
if (s === "auto")
|
|
16
|
+
return { value: c.intrinsic ?? 0, fr: 0, min, max };
|
|
17
|
+
if (s === "fill")
|
|
18
|
+
return { value: 0, fr: 1, min, max };
|
|
19
|
+
if (s.endsWith("%")) {
|
|
20
|
+
const pct = Number.parseFloat(s) / 100;
|
|
21
|
+
return { value: Math.round(total * (Number.isFinite(pct) ? pct : 0)), fr: 0, min, max };
|
|
22
|
+
}
|
|
23
|
+
if (s.endsWith("fr")) {
|
|
24
|
+
const n = Number.parseFloat(s);
|
|
25
|
+
return { value: 0, fr: Number.isFinite(n) && n > 0 ? n : 1, min, max };
|
|
26
|
+
}
|
|
27
|
+
const n = Number.parseFloat(s);
|
|
28
|
+
return { value: Number.isFinite(n) ? n : 0, fr: 0, min, max };
|
|
29
|
+
}
|
|
30
|
+
function clamp(v, min, max) {
|
|
31
|
+
return Math.max(min, Math.min(max, v));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Distribute `total` across `items`, honouring gaps, fractions, and min/max.
|
|
35
|
+
* Always returns non-negative integers that sum to at most `total`.
|
|
36
|
+
*/
|
|
37
|
+
export function solve(total, items, gap = 0) {
|
|
38
|
+
const n = items.length;
|
|
39
|
+
if (n === 0)
|
|
40
|
+
return [];
|
|
41
|
+
const gapTotal = gap * (n - 1);
|
|
42
|
+
const available = Math.max(0, total - gapTotal);
|
|
43
|
+
const parsed = items.map((c) => parse(c, available));
|
|
44
|
+
let used = 0;
|
|
45
|
+
let frTotal = 0;
|
|
46
|
+
const out = new Array(n).fill(0);
|
|
47
|
+
for (let i = 0; i < n; i++) {
|
|
48
|
+
const p = parsed[i];
|
|
49
|
+
if (p.fr > 0) {
|
|
50
|
+
frTotal += p.fr;
|
|
51
|
+
out[i] = -1; // resolved in the flexible pass
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
out[i] = clamp(Math.round(p.value), p.min, Math.min(p.max, available));
|
|
55
|
+
used += out[i];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
let free = Math.max(0, available - used);
|
|
59
|
+
if (frTotal > 0) {
|
|
60
|
+
// Two passes: clamped items give their surplus back to the rest.
|
|
61
|
+
const flexible = [];
|
|
62
|
+
for (let i = 0; i < n; i++)
|
|
63
|
+
if (out[i] === -1)
|
|
64
|
+
flexible.push(i);
|
|
65
|
+
let remainingFr = frTotal;
|
|
66
|
+
let pool = free;
|
|
67
|
+
const pending = new Set(flexible);
|
|
68
|
+
let changed = true;
|
|
69
|
+
while (changed && pending.size > 0) {
|
|
70
|
+
changed = false;
|
|
71
|
+
for (const i of [...pending]) {
|
|
72
|
+
const p = parsed[i];
|
|
73
|
+
const share = remainingFr > 0 ? (pool * p.fr) / remainingFr : 0;
|
|
74
|
+
const clamped = clamp(share, p.min, p.max);
|
|
75
|
+
if (clamped !== share) {
|
|
76
|
+
out[i] = Math.round(clamped);
|
|
77
|
+
pool -= out[i];
|
|
78
|
+
remainingFr -= p.fr;
|
|
79
|
+
pending.delete(i);
|
|
80
|
+
changed = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Distribute what is left, giving rounding remainder to the largest shares.
|
|
85
|
+
let assigned = 0;
|
|
86
|
+
const order = [...pending];
|
|
87
|
+
order.forEach((i, k) => {
|
|
88
|
+
const p = parsed[i];
|
|
89
|
+
const exact = remainingFr > 0 ? (pool * p.fr) / remainingFr : 0;
|
|
90
|
+
const v = k === order.length - 1 ? Math.max(0, pool - assigned) : Math.floor(exact);
|
|
91
|
+
out[i] = v;
|
|
92
|
+
assigned += v;
|
|
93
|
+
});
|
|
94
|
+
free = 0;
|
|
95
|
+
}
|
|
96
|
+
// Overflow: shrink from the end until it fits rather than drawing outside.
|
|
97
|
+
let sum = out.reduce((a, b) => a + b, 0);
|
|
98
|
+
if (sum > available) {
|
|
99
|
+
for (let i = n - 1; i >= 0 && sum > available; i--) {
|
|
100
|
+
const shrink = Math.min(out[i] - parsed[i].min, sum - available);
|
|
101
|
+
if (shrink > 0) {
|
|
102
|
+
out[i] -= shrink;
|
|
103
|
+
sum -= shrink;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (let i = n - 1; i >= 0 && sum > available; i--) {
|
|
107
|
+
const shrink = Math.min(out[i], sum - available);
|
|
108
|
+
out[i] -= shrink;
|
|
109
|
+
sum -= shrink;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/** Lay children out along one axis inside `rect`. */
|
|
115
|
+
export function stack(rect, items, direction, gap = 0) {
|
|
116
|
+
const horizontal = direction === "row";
|
|
117
|
+
const sizes = solve(horizontal ? rect.width : rect.height, items, gap);
|
|
118
|
+
const out = [];
|
|
119
|
+
let offset = horizontal ? rect.x : rect.y;
|
|
120
|
+
for (const size of sizes) {
|
|
121
|
+
out.push(horizontal
|
|
122
|
+
? { x: offset, y: rect.y, width: size, height: rect.height }
|
|
123
|
+
: { x: rect.x, y: offset, width: rect.width, height: size });
|
|
124
|
+
offset += size + gap;
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
export function normalizePadding(p) {
|
|
129
|
+
if (p === undefined)
|
|
130
|
+
return [0, 0, 0, 0];
|
|
131
|
+
if (typeof p === "number")
|
|
132
|
+
return [p, p, p, p];
|
|
133
|
+
if (Array.isArray(p)) {
|
|
134
|
+
if (p.length === 2)
|
|
135
|
+
return [p[0], p[1], p[0], p[1]];
|
|
136
|
+
return [p[0], p[1], p[2], p[3]];
|
|
137
|
+
}
|
|
138
|
+
return [p.top ?? 0, p.right ?? 0, p.bottom ?? 0, p.left ?? 0];
|
|
139
|
+
}
|
|
140
|
+
/** Shrink a rect by padding, never past zero. */
|
|
141
|
+
export function inset(rect, padding) {
|
|
142
|
+
const [t, r, b, l] = normalizePadding(padding);
|
|
143
|
+
return {
|
|
144
|
+
x: rect.x + l,
|
|
145
|
+
y: rect.y + t,
|
|
146
|
+
width: Math.max(0, rect.width - l - r),
|
|
147
|
+
height: Math.max(0, rect.height - t - b),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
export function intersect(a, b) {
|
|
151
|
+
const x = Math.max(a.x, b.x);
|
|
152
|
+
const y = Math.max(a.y, b.y);
|
|
153
|
+
const x2 = Math.min(a.x + a.width, b.x + b.width);
|
|
154
|
+
const y2 = Math.min(a.y + a.height, b.y + b.height);
|
|
155
|
+
return { x, y, width: Math.max(0, x2 - x), height: Math.max(0, y2 - y) };
|
|
156
|
+
}
|
|
157
|
+
export function contains(rect, x, y) {
|
|
158
|
+
return x >= rect.x && y >= rect.y && x < rect.x + rect.width && y < rect.y + rect.height;
|
|
159
|
+
}
|
|
160
|
+
export function isEmpty(rect) {
|
|
161
|
+
return rect.width <= 0 || rect.height <= 0;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { FrameBuffer, type Style, type Attributes } from "./buffer.ts";
|
|
2
|
+
import { DEFAULT_COLOR, type Color } from "./color.ts";
|
|
3
|
+
import { type Rect, type Padding } from "./layout.ts";
|
|
4
|
+
import type { Theme } from "./theme.ts";
|
|
5
|
+
export type BorderStyle = "rounded" | "single" | "double" | "thick" | "dashed" | "ascii" | "none";
|
|
6
|
+
export interface BorderChars {
|
|
7
|
+
tl: string;
|
|
8
|
+
tr: string;
|
|
9
|
+
bl: string;
|
|
10
|
+
br: string;
|
|
11
|
+
h: string;
|
|
12
|
+
v: string;
|
|
13
|
+
ml: string;
|
|
14
|
+
mr: string;
|
|
15
|
+
mt: string;
|
|
16
|
+
mb: string;
|
|
17
|
+
cross: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const BORDERS: Record<Exclude<BorderStyle, "none">, BorderChars>;
|
|
20
|
+
export type Align = "left" | "center" | "right";
|
|
21
|
+
export interface TextOptions extends Style {
|
|
22
|
+
align?: Align;
|
|
23
|
+
/** Truncate with an ellipsis instead of clipping mid-word. */
|
|
24
|
+
ellipsis?: boolean;
|
|
25
|
+
maxWidth?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface BoxOptions extends Style {
|
|
28
|
+
border?: BorderStyle;
|
|
29
|
+
borderColor?: Color;
|
|
30
|
+
title?: string;
|
|
31
|
+
titleAlign?: Align;
|
|
32
|
+
titleColor?: Color;
|
|
33
|
+
/** Right-aligned text on the top border, e.g. a value or a hint. */
|
|
34
|
+
subtitle?: string;
|
|
35
|
+
subtitleColor?: Color;
|
|
36
|
+
/** Paint the interior with `bg` before drawing. */
|
|
37
|
+
fill?: boolean;
|
|
38
|
+
footer?: string;
|
|
39
|
+
footerColor?: Color;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A clipped, translated view onto the framebuffer. Widgets only ever see a
|
|
43
|
+
* Surface, so nothing can draw outside the rectangle it was given.
|
|
44
|
+
*/
|
|
45
|
+
export declare class Surface {
|
|
46
|
+
readonly buffer: FrameBuffer;
|
|
47
|
+
readonly rect: Rect;
|
|
48
|
+
readonly clip: Rect;
|
|
49
|
+
readonly theme: Theme;
|
|
50
|
+
constructor(buffer: FrameBuffer, rect: Rect, theme: Theme, clip?: Rect);
|
|
51
|
+
get width(): number;
|
|
52
|
+
get height(): number;
|
|
53
|
+
get empty(): boolean;
|
|
54
|
+
/** A child surface in local coordinates, clipped to this one. */
|
|
55
|
+
sub(x: number, y: number, width: number, height: number): Surface;
|
|
56
|
+
/** A child surface from an absolute rect (as produced by the layout solver). */
|
|
57
|
+
region(rect: Rect, clipToParent?: boolean): Surface;
|
|
58
|
+
inset(padding: Padding): Surface;
|
|
59
|
+
private visible;
|
|
60
|
+
char(x: number, y: number, value: number | string, style?: Style): void;
|
|
61
|
+
/** Draw text at local (x, y). Returns columns written. */
|
|
62
|
+
text(x: number, y: number, text: string, options?: TextOptions): number;
|
|
63
|
+
/** Text positioned within the full surface width. */
|
|
64
|
+
textAligned(y: number, text: string, align: Align, options?: TextOptions): void;
|
|
65
|
+
fill(style: Style, ch?: number): void;
|
|
66
|
+
fillRect(x: number, y: number, w: number, h: number, style: Style, ch?: number): void;
|
|
67
|
+
styleRect(x: number, y: number, w: number, h: number, style: Style): void;
|
|
68
|
+
hline(x: number, y: number, length: number, ch?: string, style?: Style): void;
|
|
69
|
+
vline(x: number, y: number, length: number, ch?: string, style?: Style): void;
|
|
70
|
+
/**
|
|
71
|
+
* Draw a bordered box with an optional title, and return the interior surface.
|
|
72
|
+
* This is the workhorse behind every panel in the library.
|
|
73
|
+
*/
|
|
74
|
+
box(options?: BoxOptions): Surface;
|
|
75
|
+
/** Absolute rect of this surface, for hit-testing mouse events. */
|
|
76
|
+
hitRect(): Rect;
|
|
77
|
+
}
|
|
78
|
+
export declare function createSurface(buffer: FrameBuffer, theme: Theme, rect?: Rect): Surface;
|
|
79
|
+
export type { Style, Attributes, Color };
|
|
80
|
+
export { DEFAULT_COLOR };
|
|
81
|
+
//# sourceMappingURL=surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"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"}
|