@sagmans/dsh-tui 0.4.0 → 0.5.1
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/LICENSE +1 -1
- package/README.md +270 -68
- package/lib/agent/present.js +1 -1
- package/lib/agent/present.js.map +1 -1
- package/lib/agent/prompt-history.d.ts.map +1 -1
- package/lib/agent/prompt-history.js +5 -3
- package/lib/agent/prompt-history.js.map +1 -1
- package/lib/agent/status.d.ts +1 -1
- package/lib/cards.d.ts +83 -13
- package/lib/cards.d.ts.map +1 -1
- package/lib/cards.js +96 -28
- package/lib/cards.js.map +1 -1
- package/lib/export.d.ts +3 -3
- package/lib/export.d.ts.map +1 -1
- package/lib/export.js +23 -13
- package/lib/export.js.map +1 -1
- package/lib/fold-cursor.d.ts +12 -5
- package/lib/fold-cursor.d.ts.map +1 -1
- package/lib/fold-cursor.js +16 -5
- package/lib/fold-cursor.js.map +1 -1
- package/lib/gates.d.ts.map +1 -1
- package/lib/gates.js +42 -9
- package/lib/gates.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +459 -72
- package/lib/index.js.map +1 -1
- package/lib/injection.d.ts +9 -0
- package/lib/injection.d.ts.map +1 -0
- package/lib/injection.js +128 -0
- package/lib/injection.js.map +1 -0
- package/lib/input/actions.d.ts +19 -2
- package/lib/input/actions.d.ts.map +1 -1
- package/lib/input/actions.js +57 -11
- package/lib/input/actions.js.map +1 -1
- package/lib/input/cancel.d.ts +55 -0
- package/lib/input/cancel.d.ts.map +1 -0
- package/lib/input/cancel.js +47 -0
- package/lib/input/cancel.js.map +1 -0
- package/lib/input/completion.d.ts +5 -2
- package/lib/input/completion.d.ts.map +1 -1
- package/lib/input/completion.js +79 -4
- package/lib/input/completion.js.map +1 -1
- package/lib/input/file-search.d.ts +105 -0
- package/lib/input/file-search.d.ts.map +1 -0
- package/lib/input/file-search.js +665 -0
- package/lib/input/file-search.js.map +1 -0
- package/lib/input/fuzzy.d.ts +42 -0
- package/lib/input/fuzzy.d.ts.map +1 -0
- package/lib/input/fuzzy.js +289 -0
- package/lib/input/fuzzy.js.map +1 -0
- package/lib/input/keymap.d.ts +3 -1
- package/lib/input/keymap.d.ts.map +1 -1
- package/lib/input/keymap.js +14 -3
- package/lib/input/keymap.js.map +1 -1
- package/lib/input/match.d.ts +12 -4
- package/lib/input/match.d.ts.map +1 -1
- package/lib/input/match.js +50 -51
- package/lib/input/match.js.map +1 -1
- package/lib/input/submission.d.ts +10 -0
- package/lib/input/submission.d.ts.map +1 -1
- package/lib/input/submission.js +7 -6
- package/lib/input/submission.js.map +1 -1
- package/lib/keys-command.d.ts +19 -3
- package/lib/keys-command.d.ts.map +1 -1
- package/lib/keys-command.js +34 -31
- package/lib/keys-command.js.map +1 -1
- package/lib/settings-notice.d.ts +5 -0
- package/lib/settings-notice.d.ts.map +1 -1
- package/lib/settings-notice.js +9 -7
- package/lib/settings-notice.js.map +1 -1
- package/lib/stash/paths.d.ts +8 -8
- package/lib/stash/paths.d.ts.map +1 -1
- package/lib/stash/paths.js +19 -18
- package/lib/stash/paths.js.map +1 -1
- package/lib/stash/schema.d.ts +11 -12
- package/lib/stash/schema.d.ts.map +1 -1
- package/lib/stash/schema.js +10 -29
- package/lib/stash/schema.js.map +1 -1
- package/lib/stash/store.js +10 -10
- package/lib/stash/store.js.map +1 -1
- package/lib/stash.d.ts +37 -6
- package/lib/stash.d.ts.map +1 -1
- package/lib/stash.js +93 -36
- package/lib/stash.js.map +1 -1
- package/lib/terminal/external-editor.d.ts +93 -0
- package/lib/terminal/external-editor.d.ts.map +1 -0
- package/lib/terminal/external-editor.js +263 -0
- package/lib/terminal/external-editor.js.map +1 -0
- package/lib/terminal/host-writes.d.ts +39 -0
- package/lib/terminal/host-writes.d.ts.map +1 -0
- package/lib/terminal/host-writes.js +136 -0
- package/lib/terminal/host-writes.js.map +1 -0
- package/lib/terminal/signals.d.ts +25 -0
- package/lib/terminal/signals.d.ts.map +1 -0
- package/lib/terminal/signals.js +39 -0
- package/lib/terminal/signals.js.map +1 -0
- package/lib/terminal/warning-screen.d.ts +19 -1
- package/lib/terminal/warning-screen.d.ts.map +1 -1
- package/lib/terminal/warning-screen.js +37 -1
- package/lib/terminal/warning-screen.js.map +1 -1
- package/lib/terminal-text.d.ts +72 -0
- package/lib/terminal-text.d.ts.map +1 -0
- package/lib/terminal-text.js +603 -0
- package/lib/terminal-text.js.map +1 -0
- package/lib/text.d.ts +45 -6
- package/lib/text.d.ts.map +1 -1
- package/lib/text.js +106 -46
- package/lib/text.js.map +1 -1
- package/lib/theme-command.d.ts +7 -4
- package/lib/theme-command.d.ts.map +1 -1
- package/lib/theme-command.js +32 -12
- package/lib/theme-command.js.map +1 -1
- package/lib/theme-files.d.ts +110 -0
- package/lib/theme-files.d.ts.map +1 -0
- package/lib/theme-files.js +352 -0
- package/lib/theme-files.js.map +1 -0
- package/lib/theme-schema.d.ts +121 -0
- package/lib/theme-schema.d.ts.map +1 -0
- package/lib/theme-schema.js +87 -0
- package/lib/theme-schema.js.map +1 -0
- package/lib/theme-settings.d.ts +43 -10
- package/lib/theme-settings.d.ts.map +1 -1
- package/lib/theme-settings.js +103 -43
- package/lib/theme-settings.js.map +1 -1
- package/lib/theme-tokens.d.ts +39 -7
- package/lib/theme-tokens.d.ts.map +1 -1
- package/lib/theme-tokens.js +96 -13
- package/lib/theme-tokens.js.map +1 -1
- package/lib/theme.d.ts +24 -2
- package/lib/theme.d.ts.map +1 -1
- package/lib/theme.js +49 -6
- package/lib/theme.js.map +1 -1
- package/lib/tool-display.d.ts +57 -0
- package/lib/tool-display.d.ts.map +1 -0
- package/lib/tool-display.js +51 -0
- package/lib/tool-display.js.map +1 -0
- package/lib/transcript.d.ts +28 -0
- package/lib/transcript.d.ts.map +1 -1
- package/lib/transcript.js +126 -37
- package/lib/transcript.js.map +1 -1
- package/lib/ui/diff.d.ts +49 -0
- package/lib/ui/diff.d.ts.map +1 -0
- package/lib/ui/diff.js +208 -0
- package/lib/ui/diff.js.map +1 -0
- package/lib/ui/dock.d.ts.map +1 -1
- package/lib/ui/dock.js +9 -6
- package/lib/ui/dock.js.map +1 -1
- package/lib/ui/editor.d.ts.map +1 -1
- package/lib/ui/editor.js +4 -2
- package/lib/ui/editor.js.map +1 -1
- package/lib/ui/frame.d.ts +16 -5
- package/lib/ui/frame.d.ts.map +1 -1
- package/lib/ui/frame.js +32 -13
- package/lib/ui/frame.js.map +1 -1
- package/lib/ui/keymap-picker.d.ts +16 -0
- package/lib/ui/keymap-picker.d.ts.map +1 -0
- package/lib/ui/keymap-picker.js +41 -0
- package/lib/ui/keymap-picker.js.map +1 -0
- package/lib/ui/layout.d.ts +33 -0
- package/lib/ui/layout.d.ts.map +1 -0
- package/lib/ui/layout.js +33 -0
- package/lib/ui/layout.js.map +1 -0
- package/lib/ui/markdown.d.ts +25 -3
- package/lib/ui/markdown.d.ts.map +1 -1
- package/lib/ui/markdown.js +12 -8
- package/lib/ui/markdown.js.map +1 -1
- package/lib/ui/picker-card.d.ts +42 -0
- package/lib/ui/picker-card.d.ts.map +1 -0
- package/lib/ui/picker-card.js +148 -0
- package/lib/ui/picker-card.js.map +1 -0
- package/lib/ui/picker.d.ts +40 -2
- package/lib/ui/picker.d.ts.map +1 -1
- package/lib/ui/picker.js +50 -6
- package/lib/ui/picker.js.map +1 -1
- package/lib/ui/prompt.d.ts +10 -2
- package/lib/ui/prompt.d.ts.map +1 -1
- package/lib/ui/prompt.js +21 -2
- package/lib/ui/prompt.js.map +1 -1
- package/lib/ui/rows.d.ts +8 -6
- package/lib/ui/rows.d.ts.map +1 -1
- package/lib/ui/rows.js +10 -18
- package/lib/ui/rows.js.map +1 -1
- package/lib/ui/stash-picker.d.ts +2 -2
- package/lib/ui/stash-picker.d.ts.map +1 -1
- package/lib/ui/stash-picker.js +4 -4
- package/lib/ui/stash-picker.js.map +1 -1
- package/lib/ui/status.d.ts.map +1 -1
- package/lib/ui/status.js +18 -16
- package/lib/ui/status.js.map +1 -1
- package/lib/ui/theme-picker.d.ts +18 -0
- package/lib/ui/theme-picker.d.ts.map +1 -0
- package/lib/ui/theme-picker.js +68 -0
- package/lib/ui/theme-picker.js.map +1 -0
- package/lib/ui/view.d.ts +146 -22
- package/lib/ui/view.d.ts.map +1 -1
- package/lib/ui/view.js +461 -154
- package/lib/ui/view.js.map +1 -1
- package/package.json +45 -11
- package/themes/deepseek-blue.yaml +183 -0
- package/themes/violet-orbit.yaml +178 -0
package/lib/ui/stash-picker.js
CHANGED
|
@@ -30,7 +30,7 @@ export function stashLabel(text) {
|
|
|
30
30
|
return line.length <= LABEL_LENGTH ? line : `${line.slice(0, LABEL_LENGTH - 1)}${ELLIPSIS}`;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* The drafts of one
|
|
33
|
+
* The drafts of one session, chosen by key press.
|
|
34
34
|
*
|
|
35
35
|
* The id a pick settles on is the entry id, so a pop survives the list being
|
|
36
36
|
* re-read while it is open and can never take the wrong draft after a concurrent
|
|
@@ -39,8 +39,8 @@ export function stashLabel(text) {
|
|
|
39
39
|
* it into something a reader could type and miss.
|
|
40
40
|
*/
|
|
41
41
|
export class StashPicker extends ListPicker {
|
|
42
|
-
constructor(entries,
|
|
43
|
-
super(() => entries, () => `stash · ${
|
|
42
|
+
constructor(entries, sessionLabel, keys, now = () => Date.now()) {
|
|
43
|
+
super(() => entries, () => `stash · ${sessionLabel} · ${entries.length} draft${entries.length === 1 ? '' : 's'}`, row => row.entry.id, (row) => ({
|
|
44
44
|
label: `[${row.index}] ${stashLabel(row.entry.text)}`,
|
|
45
45
|
description: describeAge(row.entry.createdAt, now()),
|
|
46
46
|
// The card marks the row under the cursor, which the list decides.
|
|
@@ -72,7 +72,7 @@ export class StashConfirmPicker extends ListPicker {
|
|
|
72
72
|
description: 'remove them permanently',
|
|
73
73
|
},
|
|
74
74
|
];
|
|
75
|
-
super(() => choices, () => `clear stash · ${count} draft${count === 1 ? '' : 's'} in this
|
|
75
|
+
super(() => choices, () => `clear stash · ${count} draft${count === 1 ? '' : 's'} in this session`, choice => choice.id, (choice) => ({ label: choice.label, description: choice.description, current: false }), choice => choice.label, stashHints(keys, 'confirm'), keys);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
//# sourceMappingURL=stash-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stash-picker.js","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAoC,MAAM,aAAa,CAAA;AAEvF,6DAA6D;AAC7D,MAAM,YAAY,GAAG,EAAE,CAAA;AACvB,qFAAqF;AACrF,MAAM,WAAW,GAAG,eAAe,CAAA;AACnC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAEpB;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAkB,EAAE,IAAY;IAClD,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,0CAA0C,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,SAAS;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,QAAQ,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,IAAI,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,0BAA0B;KACpL,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACtG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,WAAW,CAAA;IACzD,OAAO,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAA;AAC7F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,UAAyB;IACxD,YACE,OAAiC,EACjC,
|
|
1
|
+
{"version":3,"file":"stash-picker.js","sourceRoot":"","sources":["../../src/ui/stash-picker.ts"],"names":[],"mappings":"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"}
|
package/lib/ui/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,wBAAwB,CAAA;AAKrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAA;IAChD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AAwBD,wFAAwF;AAExF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQxE;AAOD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAiDvF;AAsCD,yDAAyD;AACzD,qBAAa,SAAU,YAAW,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,MAAM,WAAW,EACxB,KAAK,EAAE,QAAQ;IAGlC,UAAU,IAAI,IAAI;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAGhC"}
|
package/lib/ui/status.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { visibleWidth } from '@earendil-works/pi-tui';
|
|
2
|
-
import {
|
|
2
|
+
import { oneRow } from "../text.js";
|
|
3
|
+
import { renderTerminalText } from "../terminal-text.js";
|
|
3
4
|
import { formatTokens } from "../tokens.js";
|
|
4
5
|
const SECOND_MS = 1000;
|
|
5
6
|
const MINUTE_MS = 60 * SECOND_MS;
|
|
@@ -47,15 +48,14 @@ function elapsed(ms) {
|
|
|
47
48
|
export function formatStatus(facts, width, theme) {
|
|
48
49
|
const segments = [];
|
|
49
50
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* characters visible, so a segment would print its own colour as text.
|
|
51
|
+
* A segment is collected as its source wrote it and drawn when the row is
|
|
52
|
+
* assembled: a sequence has to be read before its width is measured, and the
|
|
53
|
+
* column it starts at is only known while the row is being built.
|
|
54
54
|
*/
|
|
55
55
|
const push = (token, text, join = false) => {
|
|
56
56
|
if (!theme.visible(token))
|
|
57
57
|
return;
|
|
58
|
-
segments.push({ token, text
|
|
58
|
+
segments.push({ token, text, join });
|
|
59
59
|
};
|
|
60
60
|
// An armed chord is transient and needs the reader's eye now, so it leads the
|
|
61
61
|
// row: a row cut to width loses its tail, never what is about to happen.
|
|
@@ -101,15 +101,17 @@ export function formatStatus(facts, width, theme) {
|
|
|
101
101
|
if (facts.cacheRate !== undefined)
|
|
102
102
|
push('status.cache', `cache ${Math.round(facts.cacheRate * 100)}%`);
|
|
103
103
|
push('status.cwd', shortPath(facts.cwd, facts.home));
|
|
104
|
-
|
|
104
|
+
// The row is one row whatever a fact carried: a break that survived the cut
|
|
105
|
+
// would be written as a move down, over the row beneath the bar.
|
|
106
|
+
return oneRow(renderSegments(segments, width, theme));
|
|
105
107
|
}
|
|
106
108
|
/**
|
|
107
|
-
* Join
|
|
109
|
+
* Join drawn segments into one row, giving each the room the row has left.
|
|
108
110
|
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* still says
|
|
111
|
+
* Each segment is drawn first and measured after, because a sequence is not a
|
|
112
|
+
* column and a tab lands on the stop its own starting column reaches. A segment
|
|
113
|
+
* is trimmed to the room left rather than dropped: a reader loses the tail of
|
|
114
|
+
* the last fact, not the fact, and the ellipsis still says something was left out.
|
|
113
115
|
*/
|
|
114
116
|
function renderSegments(segments, width, theme) {
|
|
115
117
|
// Hiding the separator means drawing no separator, not drawing a plain one:
|
|
@@ -127,14 +129,14 @@ function renderSegments(segments, width, theme) {
|
|
|
127
129
|
if (budget - lead < ellipsisWidth)
|
|
128
130
|
break;
|
|
129
131
|
const room = budget - lead;
|
|
130
|
-
const
|
|
132
|
+
const drawn = theme.rich(segment.text, { token: segment.token, column: width - budget });
|
|
133
|
+
const textWidth = visibleWidth(drawn);
|
|
131
134
|
if (textWidth > room) {
|
|
132
135
|
// Not the last segment: the rest is omitted, so the row must show it.
|
|
133
|
-
|
|
134
|
-
out += `${lead > 0 ? separator : ''}${theme.style(segment.token, cut)}`;
|
|
136
|
+
out += `${lead > 0 ? separator : ''}${theme.cut(drawn, room, ELLIPSIS)}`;
|
|
135
137
|
return out;
|
|
136
138
|
}
|
|
137
|
-
out += `${lead > 0 ? separator : ''}${
|
|
139
|
+
out += `${lead > 0 ? separator : ''}${drawn}`;
|
|
138
140
|
budget -= lead + textWidth;
|
|
139
141
|
}
|
|
140
142
|
return out === '' ? theme.cut('', Math.max(0, width), ELLIPSIS) : out;
|
package/lib/ui/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/ui/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Keymap } from '../input/actions.ts';
|
|
2
|
+
import { type LoadedTheme, type ThemeLibrary } from '../theme-files.ts';
|
|
3
|
+
import { ListPicker } from './picker.ts';
|
|
4
|
+
/**
|
|
5
|
+
* The themes on disk, chosen by key press.
|
|
6
|
+
*
|
|
7
|
+
* Choosing a theme is a comparison, and a name does not carry the shades it
|
|
8
|
+
* stands for, so the row under the cursor is handed back as it moves: the caller
|
|
9
|
+
* paints the surface with it and writes nothing, which is what makes the list
|
|
10
|
+
* itself the preview. The library is re-read per paint, so a theme exported or
|
|
11
|
+
* edited while the list is open appears in it without reopening.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ThemePicker extends ListPicker<LoadedTheme> {
|
|
14
|
+
constructor(library: () => ThemeLibrary, chosen: () => string | undefined, keys: () => Keymap,
|
|
15
|
+
/** The theme to show, or undefined to show the one the document names again. */
|
|
16
|
+
preview: (theme: LoadedTheme | undefined) => void);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=theme-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-picker.d.ts","sourceRoot":"","sources":["../../src/ui/theme-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAoC,MAAM,aAAa,CAAA;AAgD1E;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,UAAU,CAAC,WAAW,CAAC;gBAEpD,OAAO,EAAE,MAAM,YAAY,EAC3B,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,MAAM,MAAM;IAClB,gFAAgF;IAChF,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI;CAkBpD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { hintKeys, moveHint } from "../input/actions.js";
|
|
2
|
+
import { DEFAULT_THEME } from "../theme-files.js";
|
|
3
|
+
import { ListPicker } from "./picker.js";
|
|
4
|
+
/**
|
|
5
|
+
* The themes to choose from, the one in force first.
|
|
6
|
+
*
|
|
7
|
+
* The row under the cursor is what the screen is painting, so the list opens on
|
|
8
|
+
* the theme already in use: a preview starting anywhere else would repaint the
|
|
9
|
+
* surface the moment the reader asked to see the list, and the top row would name
|
|
10
|
+
* a theme they are not looking at.
|
|
11
|
+
*/
|
|
12
|
+
function orderedThemes(library, inUse) {
|
|
13
|
+
const themes = library.list();
|
|
14
|
+
return [
|
|
15
|
+
...themes.filter(theme => theme.name === inUse),
|
|
16
|
+
...themes.filter(theme => theme.name !== inUse),
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* One theme as a row.
|
|
21
|
+
*
|
|
22
|
+
* The count is of the elements the file names, not of the elements it changes: a
|
|
23
|
+
* theme writes out its whole table, and one that names fewer leaves the rest to
|
|
24
|
+
* the table underneath — which is the difference between two files that their
|
|
25
|
+
* names alone do not show.
|
|
26
|
+
*/
|
|
27
|
+
function describeTheme(theme, inUse) {
|
|
28
|
+
const elements = Object.keys(theme.tokens).length;
|
|
29
|
+
return {
|
|
30
|
+
label: theme.name,
|
|
31
|
+
description: [
|
|
32
|
+
theme.builtin ? 'built into the package' : 'yours',
|
|
33
|
+
`${elements} element${elements === 1 ? '' : 's'}`,
|
|
34
|
+
theme.name === inUse ? 'in use' : undefined,
|
|
35
|
+
].filter(part => part !== undefined).join(' · '),
|
|
36
|
+
// The card marks the row under the cursor, which the list decides.
|
|
37
|
+
current: false,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** What the list says about its own keys, read per paint so a rebind lands. */
|
|
41
|
+
function themeHints(keys) {
|
|
42
|
+
return {
|
|
43
|
+
empty: () => `nothing matches · backspace to widen · ${hintKeys(keys(), 'picker.cancel')} cancel`,
|
|
44
|
+
listed: () => `${moveHint(keys(), 'picker.up', 'picker.down')} preview · ${hintKeys(keys(), 'picker.confirm')} apply · ${hintKeys(keys(), 'picker.cancel')} cancel · type to filter`,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The themes on disk, chosen by key press.
|
|
49
|
+
*
|
|
50
|
+
* Choosing a theme is a comparison, and a name does not carry the shades it
|
|
51
|
+
* stands for, so the row under the cursor is handed back as it moves: the caller
|
|
52
|
+
* paints the surface with it and writes nothing, which is what makes the list
|
|
53
|
+
* itself the preview. The library is re-read per paint, so a theme exported or
|
|
54
|
+
* edited while the list is open appears in it without reopening.
|
|
55
|
+
*/
|
|
56
|
+
export class ThemePicker extends ListPicker {
|
|
57
|
+
constructor(library, chosen, keys,
|
|
58
|
+
/** The theme to show, or undefined to show the one the document names again. */
|
|
59
|
+
preview) {
|
|
60
|
+
// A document naming no theme is a surface drawing the package's own, so the
|
|
61
|
+
// row the cursor starts on and the screen agree whichever way it was left.
|
|
62
|
+
const inUse = () => chosen() ?? DEFAULT_THEME;
|
|
63
|
+
super(() => orderedThemes(library(), inUse()), () => `theme · ${library().list().length} available`, theme => theme.name, theme => describeTheme(theme, inUse()), theme => [theme.name, theme.builtin ? 'built into the package' : 'yours'].join(' '), themeHints(keys), keys,
|
|
64
|
+
// Opened unfiltered: the reader asked for the list, not for a search.
|
|
65
|
+
'', preview);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=theme-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-picker.js","sourceRoot":"","sources":["../../src/ui/theme-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,aAAa,EAAuC,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAoC,MAAM,aAAa,CAAA;AAE1E;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,OAAqB,EAAE,KAAa;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC7B,OAAO;QACL,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAC/C,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;KAChD,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,KAAkB,EAAE,KAAa;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;IACjD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE;YACX,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO;YAClD,GAAG,QAAQ,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;YACjD,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SAC5C,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAChD,mEAAmE;QACnE,OAAO,EAAE,KAAK;KACf,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CAAC,IAAkB;IACpC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,0CAA0C,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,SAAS;QACjG,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,cAAc,QAAQ,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,YAAY,QAAQ,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,0BAA0B;KACrL,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,UAAuB;IACtD,YACE,OAA2B,EAC3B,MAAgC,EAChC,IAAkB;IAClB,gFAAgF;IAChF,OAAiD;QAEjD,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,KAAK,GAAG,GAAW,EAAE,CAAC,MAAM,EAAE,IAAI,aAAa,CAAA;QACrD,KAAK,CACH,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EACvC,GAAG,EAAE,CAAC,WAAW,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,YAAY,EACpD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EACtC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACnF,UAAU,CAAC,IAAI,CAAC,EAChB,IAAI;QACJ,sEAAsE;QACtE,EAAE,EACF,OAAO,CACR,CAAA;IACH,CAAC;CACF"}
|
package/lib/ui/view.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { type Component } from '@earendil-works/pi-tui';
|
|
1
|
+
import { type Component, type TuiMouseEvent, type TuiMouseEventResult } from '@earendil-works/pi-tui';
|
|
2
2
|
import { type Keymap } from '../input/actions.ts';
|
|
3
3
|
import { type GateCard } from '../gates.ts';
|
|
4
4
|
import type { TranscriptEntry, TranscriptModel } from '../transcript.ts';
|
|
5
|
+
import { type ToolDisplaySpec } from '../tool-display.ts';
|
|
5
6
|
import type { TuiTheme } from '../theme.ts';
|
|
6
|
-
import type
|
|
7
|
+
import { type MarkdownRenderer } from './markdown.ts';
|
|
7
8
|
import type { PickerCard } from './picker.ts';
|
|
8
|
-
import { RowCache } from './rows.ts';
|
|
9
|
-
/** Which rows the reader has opened
|
|
9
|
+
import { RowCache, type RowCacheStats } from './rows.ts';
|
|
10
|
+
/** Which rows the reader has opened by key; a click decides for one message instead. */
|
|
10
11
|
export interface ViewState {
|
|
11
12
|
readonly expandCards: boolean;
|
|
12
13
|
readonly expandReasoning: boolean;
|
|
@@ -16,10 +17,10 @@ export interface ViewState {
|
|
|
16
17
|
/**
|
|
17
18
|
* The state a reader gets before opening anything, and the view's own fallback.
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* Thoughts start folded because they can be long enough to push the answer off
|
|
21
|
+
* the screen. Cards and a program's calls start from the reader's own `tools:`
|
|
22
|
+
* settings, which ship folded for cards — one clipped line each — and inline for
|
|
23
|
+
* a program's calls, whose one line per dispatch is what the card stands for.
|
|
23
24
|
*/
|
|
24
25
|
export declare const DEFAULT_VIEW_STATE: ViewState;
|
|
25
26
|
/**
|
|
@@ -45,6 +46,13 @@ export interface TranscriptViewOptions {
|
|
|
45
46
|
* a settings edit moved the key.
|
|
46
47
|
*/
|
|
47
48
|
readonly keys?: () => Keymap;
|
|
49
|
+
/**
|
|
50
|
+
* How one tool's cards draw, read per render.
|
|
51
|
+
*
|
|
52
|
+
* The settings document is hot-reloaded, so a captured table would keep
|
|
53
|
+
* folding a session under the policy it happened to start with.
|
|
54
|
+
*/
|
|
55
|
+
readonly toolDisplay?: (tool: string) => ToolDisplaySpec;
|
|
48
56
|
}
|
|
49
57
|
export declare class TranscriptView implements Component {
|
|
50
58
|
private readonly model;
|
|
@@ -52,16 +60,56 @@ export declare class TranscriptView implements Component {
|
|
|
52
60
|
private readonly markdown;
|
|
53
61
|
private readonly options;
|
|
54
62
|
private readonly rows;
|
|
63
|
+
/**
|
|
64
|
+
* Fold choices the reader made by clicking, per message.
|
|
65
|
+
*
|
|
66
|
+
* Absent means the key or the tool's own policy decides, so a settings edit
|
|
67
|
+
* stays in charge of messages nobody clicked. Keyed by the call or thought id
|
|
68
|
+
* rather than by the entry, because a result replaces the entry a click was
|
|
69
|
+
* made on and a thought outlives the live row that streamed it.
|
|
70
|
+
*/
|
|
71
|
+
private readonly clicked;
|
|
72
|
+
/** The rows each clickable message drew last render, for mapping a click back to it. */
|
|
73
|
+
private spans;
|
|
74
|
+
/** The same spans relative to their entry, so a cached entry still answers clicks. */
|
|
75
|
+
private readonly entrySpans;
|
|
55
76
|
constructor(model: TranscriptModel, theme: TuiTheme, markdown: MarkdownRenderer, options?: TranscriptViewOptions);
|
|
56
77
|
private get viewState();
|
|
78
|
+
/** The display the reader configured for a tool, or the shipped one. */
|
|
79
|
+
private toolDisplay;
|
|
80
|
+
/**
|
|
81
|
+
* Whether one tool message draws open.
|
|
82
|
+
*
|
|
83
|
+
* A click outranks the key, which outranks the tool's start state: Ctrl+O
|
|
84
|
+
* stays "show me everything", while one clicked message keeps the state the
|
|
85
|
+
* reader gave it.
|
|
86
|
+
*/
|
|
87
|
+
private expansionOf;
|
|
88
|
+
/** Whether one thought draws its body; a click decides for that thought alone. */
|
|
89
|
+
private reasoningOpen;
|
|
90
|
+
/** Whether one dispatched call draws its argument in full; a click decides for that call. */
|
|
91
|
+
private subCallOpen;
|
|
92
|
+
/**
|
|
93
|
+
* Answer a click on a message by folding or unfolding that one row.
|
|
94
|
+
*
|
|
95
|
+
* The tightest span under the point wins, so a click on a dispatched call
|
|
96
|
+
* opens that call rather than the card around it. Only a left click is
|
|
97
|
+
* consumed: a press, a drag, and a wheel belong to the surface's own
|
|
98
|
+
* selection and scrolling, and a row that swallowed them would cost the
|
|
99
|
+
* reader the ability to copy the command it just drew.
|
|
100
|
+
*/
|
|
101
|
+
handleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined;
|
|
57
102
|
/** The cache's own account of the work it avoided; a test reads this. */
|
|
58
|
-
rowStats():
|
|
59
|
-
readonly hits: number;
|
|
60
|
-
readonly misses: number;
|
|
61
|
-
readonly size: number;
|
|
62
|
-
};
|
|
103
|
+
rowStats(): RowCacheStats;
|
|
63
104
|
invalidate(): void;
|
|
64
|
-
/**
|
|
105
|
+
/**
|
|
106
|
+
* Wrap one text block under a prefix, keeping the prefix's column budget.
|
|
107
|
+
*
|
|
108
|
+
* The block is drawn before it is wrapped: a sequence a terminal would have
|
|
109
|
+
* acted on has to be gone before pi-tui measures the row, and a tab has to
|
|
110
|
+
* land on the stop the writer saw rather than one a wrapper would guess at.
|
|
111
|
+
* The prefix seeds that stop, because it is already on the row.
|
|
112
|
+
*/
|
|
65
113
|
private pushWrapped;
|
|
66
114
|
/**
|
|
67
115
|
* Wrap one already-styled block under a prefix.
|
|
@@ -73,8 +121,40 @@ export declare class TranscriptView implements Component {
|
|
|
73
121
|
* command is worse than a taller card.
|
|
74
122
|
*/
|
|
75
123
|
private pushStyledWrapped;
|
|
76
|
-
/**
|
|
124
|
+
/**
|
|
125
|
+
* The rows one markdown message draws, with the padding pi-tui adds for background styling removed.
|
|
126
|
+
*
|
|
127
|
+
* The source is drawn first so the markdown renderer never measures a sequence
|
|
128
|
+
* it cannot see; its own spans are applied around the result afterwards.
|
|
129
|
+
*/
|
|
130
|
+
private markdownLines;
|
|
131
|
+
/**
|
|
132
|
+
* Render one message's text as markdown.
|
|
133
|
+
*
|
|
134
|
+
* A thought passes its own face and an indent, so the row stays visibly a
|
|
135
|
+
* detail of the step that produced it rather than a second answer.
|
|
136
|
+
*/
|
|
77
137
|
private pushMarkdown;
|
|
138
|
+
/**
|
|
139
|
+
* One message closed into a frame, with its markdown laid out to what is left inside.
|
|
140
|
+
*
|
|
141
|
+
* A prompt and a reply are the two objects of an exchange, so both are drawn as
|
|
142
|
+
* bars rather than as one more stretch of rows; the face, the border's element,
|
|
143
|
+
* and whether the text is still arriving are the only differences. Markdown lays
|
|
144
|
+
* itself out to the frame's text width, so the frame may only place the rows:
|
|
145
|
+
* wrapping them again would break what it drew.
|
|
146
|
+
*/
|
|
147
|
+
private pushFramed;
|
|
148
|
+
/**
|
|
149
|
+
* The face a thought is drawn in.
|
|
150
|
+
*
|
|
151
|
+
* Its shade stays the thought body's and it asks for no drawing: a diagram in
|
|
152
|
+
* the middle of a thought would carry the answer's weight, and the answer's
|
|
153
|
+
* colours would make the thinking compete with it.
|
|
154
|
+
*/
|
|
155
|
+
private reasoningFace;
|
|
156
|
+
/** The face a submitted prompt is drawn in: its structure is markdown's, its shade stays the prompt's. */
|
|
157
|
+
private userFace;
|
|
78
158
|
/** The live map, or the shipped one for a caller that did not lend one. */
|
|
79
159
|
private keymap;
|
|
80
160
|
private reasoningFoldHint;
|
|
@@ -84,21 +164,65 @@ export declare class TranscriptView implements Component {
|
|
|
84
164
|
* The calls one card dispatched, one entry each.
|
|
85
165
|
*
|
|
86
166
|
* A nested call is a signpost rather than a card of its own, so it keeps one
|
|
87
|
-
* entry per call
|
|
88
|
-
*
|
|
89
|
-
*
|
|
167
|
+
* entry per call, clipped to that entry until the reader clicks it: the
|
|
168
|
+
* argument is the part a reader scans for, and one that always wrapped pushed
|
|
169
|
+
* the rest of the program off the screen.
|
|
90
170
|
*/
|
|
91
171
|
private pushSubCalls;
|
|
172
|
+
/**
|
|
173
|
+
* What a dispatched call declared and what it produced, under its argument.
|
|
174
|
+
*
|
|
175
|
+
* The parent card keeps only the program's return value, so both are otherwise
|
|
176
|
+
* gone; a reader who opens the row is asking for them, which is why the call's
|
|
177
|
+
* own rows come first and its outcome under them. Each section keeps the
|
|
178
|
+
* retention its card used, so a long run still says what it dropped.
|
|
179
|
+
*/
|
|
180
|
+
private pushSubCallOutput;
|
|
181
|
+
/**
|
|
182
|
+
* A folded card's one row: label, clipped argument, measured facts, outcome.
|
|
183
|
+
*
|
|
184
|
+
* The outcome rides this row rather than a row of its own, because one line
|
|
185
|
+
* per call is what folding promises. A shell card's hidden rows are counted
|
|
186
|
+
* here too: its output is the answer the reader asked for, and a fold that
|
|
187
|
+
* left no trace of it would read as a call that produced nothing.
|
|
188
|
+
*
|
|
189
|
+
* The argument is the part that gives up room: it is clipped to whatever the
|
|
190
|
+
* label, the facts, and the outcome leave before the edge, so a wide terminal
|
|
191
|
+
* shows more of the call while a narrow one still shows how it ended.
|
|
192
|
+
*/
|
|
193
|
+
private renderCollapsedHead;
|
|
194
|
+
/**
|
|
195
|
+
* One detail row, drawn with its own kind's colours or nothing at all.
|
|
196
|
+
*
|
|
197
|
+
* The row says what it is, so the renderer never guesses from the text: a diff
|
|
198
|
+
* line beginning with "+" is an addition because the presenter said so, not
|
|
199
|
+
* because of its first character.
|
|
200
|
+
*/
|
|
201
|
+
private detailRow;
|
|
202
|
+
/** The mark that introduces a card, empty when the theme hides its label. */
|
|
203
|
+
private cardLead;
|
|
204
|
+
/** A card's label, styled, or nothing when the theme hides it. */
|
|
205
|
+
private cardTitle;
|
|
206
|
+
/** A card's argument, styled and flattened, clipped to `limit` when one is given. */
|
|
207
|
+
private cardArgument;
|
|
92
208
|
/**
|
|
93
209
|
* A card's header: its label, its argument, and its measured facts.
|
|
94
210
|
*
|
|
95
211
|
* The glyph is returned apart from the body so a wrapped continuation can
|
|
96
|
-
* align under the label rather than under the mark.
|
|
97
|
-
* left out because it needs a row of its own — it is the one
|
|
98
|
-
* be a whole command rather than a word.
|
|
212
|
+
* align under the label rather than under the mark. An opened terminal's
|
|
213
|
+
* argument is left out because it needs a row of its own — it is the one
|
|
214
|
+
* argument that can be a whole command rather than a word.
|
|
99
215
|
*/
|
|
100
216
|
private renderHead;
|
|
101
|
-
/** The
|
|
217
|
+
/** The separator a header uses between its label, its facts, and its outcome. */
|
|
218
|
+
private statSeparator;
|
|
219
|
+
/**
|
|
220
|
+
* The measured facts, each in its own colour, or nothing when none is visible.
|
|
221
|
+
*
|
|
222
|
+
* The lead is a parameter because a header that already carries a title and an
|
|
223
|
+
* argument separates its facts with the same mark as its outcome, while facts
|
|
224
|
+
* on a row of their own stand apart with blank columns.
|
|
225
|
+
*/
|
|
102
226
|
private renderStats;
|
|
103
227
|
private pushPicker;
|
|
104
228
|
private pushGate;
|
package/lib/ui/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/ui/view.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/ui/view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAGzB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAE/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AA4FxD,wFAAwF;AACxF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAgF,CAAA;AA0BjH;;;;;;;GAOG;AACH,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,SAAS,CAAA;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,UAAU,GAAG,SAAS,CAAA;IAC9C,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IACzC;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAA;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAA;CACzD;AAED,qBAAa,cAAe,YAAW,SAAS;IAiB5C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAnB1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,wFAAwF;IACxF,OAAO,CAAC,KAAK,CAA2B;IACxC,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;gBAG/D,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,qBAA0B;IAKtD,OAAO,KAAK,SAAS,GAEpB;IAED,wEAAwE;IACxE,OAAO,CAAC,WAAW;IAInB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAMnB,kFAAkF;IAClF,OAAO,CAAC,aAAa;IAMrB,6FAA6F;IAC7F,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,GAAG,SAAS;IAYlE,yEAAyE;IACzE,QAAQ,IAAI,aAAa;IAIzB,UAAU,IAAI,IAAI;IAMlB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAenB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAMrB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAWlB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAKrB,0GAA0G;IAC1G,OAAO,CAAC,QAAQ;IAIhB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,QAAQ;IAgEhB;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IA8BpB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IASjB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ;IAKhB,kEAAkE;IAClE,OAAO,CAAC,SAAS;IAIjB,qFAAqF;IACrF,OAAO,CAAC,YAAY;IAMpB;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAQlB,iFAAiF;IACjF,OAAO,CAAC,aAAa;IAIrB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;IAyDhB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAYnB,+FAA+F;IAC/F,OAAO,CAAC,WAAW;IA+BnB,gFAAgF;IAChF,OAAO,CAAC,WAAW;IAKnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAyDhC"}
|