@elaraai/e3-ui-cli 1.0.71 → 1.0.73
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 +46 -21
- package/dist/app/assets/{engine-BKZbmXkC-hslJZfFw.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
- package/dist/app/assets/{index-8USNHP31.js → index-mj-YVVN1.js} +92 -92
- package/dist/app/index.html +1 -1
- package/dist/cli.js +36 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/tui.d.ts +84 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +86 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/tui/api.d.ts +108 -0
- package/dist/tui/api.d.ts.map +1 -0
- package/dist/tui/api.js +130 -0
- package/dist/tui/api.js.map +1 -0
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +241 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/controller.d.ts +116 -0
- package/dist/tui/controller.d.ts.map +1 -0
- package/dist/tui/controller.js +620 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/data/dataflow.d.ts +68 -0
- package/dist/tui/data/dataflow.d.ts.map +1 -0
- package/dist/tui/data/dataflow.js +137 -0
- package/dist/tui/data/dataflow.js.map +1 -0
- package/dist/tui/data/dataset.d.ts +80 -0
- package/dist/tui/data/dataset.d.ts.map +1 -0
- package/dist/tui/data/dataset.js +297 -0
- package/dist/tui/data/dataset.js.map +1 -0
- package/dist/tui/data/edit-buffer.d.ts +74 -0
- package/dist/tui/data/edit-buffer.d.ts.map +1 -0
- package/dist/tui/data/edit-buffer.js +120 -0
- package/dist/tui/data/edit-buffer.js.map +1 -0
- package/dist/tui/data/feeds.d.ts +45 -0
- package/dist/tui/data/feeds.d.ts.map +1 -0
- package/dist/tui/data/feeds.js +318 -0
- package/dist/tui/data/feeds.js.map +1 -0
- package/dist/tui/data/logs.d.ts +68 -0
- package/dist/tui/data/logs.d.ts.map +1 -0
- package/dist/tui/data/logs.js +134 -0
- package/dist/tui/data/logs.js.map +1 -0
- package/dist/tui/input/commands.d.ts +159 -0
- package/dist/tui/input/commands.d.ts.map +1 -0
- package/dist/tui/input/commands.js +259 -0
- package/dist/tui/input/commands.js.map +1 -0
- package/dist/tui/input/completion.d.ts +63 -0
- package/dist/tui/input/completion.d.ts.map +1 -0
- package/dist/tui/input/completion.js +128 -0
- package/dist/tui/input/completion.js.map +1 -0
- package/dist/tui/input/keymap.d.ts +153 -0
- package/dist/tui/input/keymap.d.ts.map +1 -0
- package/dist/tui/input/keymap.js +206 -0
- package/dist/tui/input/keymap.js.map +1 -0
- package/dist/tui/input/mouse.d.ts +52 -0
- package/dist/tui/input/mouse.d.ts.map +1 -0
- package/dist/tui/input/mouse.js +55 -0
- package/dist/tui/input/mouse.js.map +1 -0
- package/dist/tui/lifecycle.d.ts +61 -0
- package/dist/tui/lifecycle.d.ts.map +1 -0
- package/dist/tui/lifecycle.js +99 -0
- package/dist/tui/lifecycle.js.map +1 -0
- package/dist/tui/model/catalogue.d.ts +28 -0
- package/dist/tui/model/catalogue.d.ts.map +1 -0
- package/dist/tui/model/catalogue.js +94 -0
- package/dist/tui/model/catalogue.js.map +1 -0
- package/dist/tui/model/help.d.ts +37 -0
- package/dist/tui/model/help.d.ts.map +1 -0
- package/dist/tui/model/help.js +210 -0
- package/dist/tui/model/help.js.map +1 -0
- package/dist/tui/model/index.d.ts +42 -0
- package/dist/tui/model/index.d.ts.map +1 -0
- package/dist/tui/model/index.js +50 -0
- package/dist/tui/model/index.js.map +1 -0
- package/dist/tui/model/status.d.ts +88 -0
- package/dist/tui/model/status.d.ts.map +1 -0
- package/dist/tui/model/status.js +137 -0
- package/dist/tui/model/status.js.map +1 -0
- package/dist/tui/model/tree.d.ts +112 -0
- package/dist/tui/model/tree.d.ts.map +1 -0
- package/dist/tui/model/tree.js +178 -0
- package/dist/tui/model/tree.js.map +1 -0
- package/dist/tui/model/types.d.ts +21 -0
- package/dist/tui/model/types.d.ts.map +1 -0
- package/dist/tui/model/types.js +46 -0
- package/dist/tui/model/types.js.map +1 -0
- package/dist/tui/render/glyphs.d.ts +122 -0
- package/dist/tui/render/glyphs.d.ts.map +1 -0
- package/dist/tui/render/glyphs.js +122 -0
- package/dist/tui/render/glyphs.js.map +1 -0
- package/dist/tui/render/layout.d.ts +145 -0
- package/dist/tui/render/layout.d.ts.map +1 -0
- package/dist/tui/render/layout.js +209 -0
- package/dist/tui/render/layout.js.map +1 -0
- package/dist/tui/render/text.d.ts +149 -0
- package/dist/tui/render/text.d.ts.map +1 -0
- package/dist/tui/render/text.js +288 -0
- package/dist/tui/render/text.js.map +1 -0
- package/dist/tui/render/theme.d.ts +88 -0
- package/dist/tui/render/theme.d.ts.map +1 -0
- package/dist/tui/render/theme.js +145 -0
- package/dist/tui/render/theme.js.map +1 -0
- package/dist/tui/session.d.ts +78 -0
- package/dist/tui/session.d.ts.map +1 -0
- package/dist/tui/session.js +237 -0
- package/dist/tui/session.js.map +1 -0
- package/dist/tui/state/actions.d.ts +584 -0
- package/dist/tui/state/actions.d.ts.map +1 -0
- package/dist/tui/state/actions.js +62 -0
- package/dist/tui/state/actions.js.map +1 -0
- package/dist/tui/state/persist.d.ts +114 -0
- package/dist/tui/state/persist.d.ts.map +1 -0
- package/dist/tui/state/persist.js +187 -0
- package/dist/tui/state/persist.js.map +1 -0
- package/dist/tui/state/poll.d.ts +99 -0
- package/dist/tui/state/poll.d.ts.map +1 -0
- package/dist/tui/state/poll.js +160 -0
- package/dist/tui/state/poll.js.map +1 -0
- package/dist/tui/state/reducer.d.ts +16 -0
- package/dist/tui/state/reducer.d.ts.map +1 -0
- package/dist/tui/state/reducer.js +363 -0
- package/dist/tui/state/reducer.js.map +1 -0
- package/dist/tui/state/store.d.ts +37 -0
- package/dist/tui/state/store.d.ts.map +1 -0
- package/dist/tui/state/store.js +84 -0
- package/dist/tui/state/store.js.map +1 -0
- package/dist/tui/suspend.d.ts +17 -0
- package/dist/tui/suspend.d.ts.map +1 -0
- package/dist/tui/suspend.js +33 -0
- package/dist/tui/suspend.js.map +1 -0
- package/dist/tui/ui/App.d.ts +41 -0
- package/dist/tui/ui/App.d.ts.map +1 -0
- package/dist/tui/ui/App.js +92 -0
- package/dist/tui/ui/App.js.map +1 -0
- package/dist/tui/ui/frame.d.ts +86 -0
- package/dist/tui/ui/frame.d.ts.map +1 -0
- package/dist/tui/ui/frame.js +42 -0
- package/dist/tui/ui/frame.js.map +1 -0
- package/dist/tui/ui/lines.d.ts +92 -0
- package/dist/tui/ui/lines.d.ts.map +1 -0
- package/dist/tui/ui/lines.js +94 -0
- package/dist/tui/ui/lines.js.map +1 -0
- package/dist/tui/ui/shell/chrome.d.ts +61 -0
- package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
- package/dist/tui/ui/shell/chrome.js +272 -0
- package/dist/tui/ui/shell/chrome.js.map +1 -0
- package/dist/tui/ui/shell/widgets.d.ts +75 -0
- package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
- package/dist/tui/ui/shell/widgets.js +160 -0
- package/dist/tui/ui/shell/widgets.js.map +1 -0
- package/dist/tui/ui/views/about.d.ts +20 -0
- package/dist/tui/ui/views/about.d.ts.map +1 -0
- package/dist/tui/ui/views/about.js +40 -0
- package/dist/tui/ui/views/about.js.map +1 -0
- package/dist/tui/ui/views/all.d.ts +17 -0
- package/dist/tui/ui/views/all.d.ts.map +1 -0
- package/dist/tui/ui/views/all.js +17 -0
- package/dist/tui/ui/views/all.js.map +1 -0
- package/dist/tui/ui/views/dashboard.d.ts +156 -0
- package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
- package/dist/tui/ui/views/dashboard.js +599 -0
- package/dist/tui/ui/views/dashboard.js.map +1 -0
- package/dist/tui/ui/views/help.d.ts +17 -0
- package/dist/tui/ui/views/help.d.ts.map +1 -0
- package/dist/tui/ui/views/help.js +65 -0
- package/dist/tui/ui/views/help.js.map +1 -0
- package/dist/tui/ui/views/index.d.ts +42 -0
- package/dist/tui/ui/views/index.d.ts.map +1 -0
- package/dist/tui/ui/views/index.js +42 -0
- package/dist/tui/ui/views/index.js.map +1 -0
- package/dist/tui/ui/views/input.d.ts +6 -0
- package/dist/tui/ui/views/input.d.ts.map +1 -0
- package/dist/tui/ui/views/input.js +494 -0
- package/dist/tui/ui/views/input.js.map +1 -0
- package/dist/tui/ui/views/launch.d.ts +16 -0
- package/dist/tui/ui/views/launch.d.ts.map +1 -0
- package/dist/tui/ui/views/launch.js +43 -0
- package/dist/tui/ui/views/launch.js.map +1 -0
- package/dist/tui/ui/views/refusal.d.ts +20 -0
- package/dist/tui/ui/views/refusal.d.ts.map +1 -0
- package/dist/tui/ui/views/refusal.js +47 -0
- package/dist/tui/ui/views/refusal.js.map +1 -0
- package/dist/tui/ui/views/repos.d.ts +10 -0
- package/dist/tui/ui/views/repos.d.ts.map +1 -0
- package/dist/tui/ui/views/repos.js +93 -0
- package/dist/tui/ui/views/repos.js.map +1 -0
- package/dist/tui/ui/views/task.d.ts +17 -0
- package/dist/tui/ui/views/task.d.ts.map +1 -0
- package/dist/tui/ui/views/task.js +309 -0
- package/dist/tui/ui/views/task.js.map +1 -0
- package/dist/tui/ui/views/wordmark.d.ts +15 -0
- package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
- package/dist/tui/ui/views/wordmark.js +50 -0
- package/dist/tui/ui/views/wordmark.js.map +1 -0
- package/dist/tui/ui/views/workspaces.d.ts +17 -0
- package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
- package/dist/tui/ui/views/workspaces.js +127 -0
- package/dist/tui/ui/views/workspaces.js.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.js +119 -0
- package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
- package/dist/tui/ui/widgets/logs.d.ts +99 -0
- package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/logs.js +291 -0
- package/dist/tui/ui/widgets/logs.js.map +1 -0
- package/dist/tui/ui/widgets/reads.d.ts +62 -0
- package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
- package/dist/tui/ui/widgets/reads.js +122 -0
- package/dist/tui/ui/widgets/reads.js.map +1 -0
- package/dist/tui/ui/widgets/runs.d.ts +51 -0
- package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/runs.js +86 -0
- package/dist/tui/ui/widgets/runs.js.map +1 -0
- package/dist/tui/ui/widgets/tree.d.ts +149 -0
- package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
- package/dist/tui/ui/widgets/tree.js +584 -0
- package/dist/tui/ui/widgets/tree.js.map +1 -0
- package/package.json +22 -12
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
4
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* The Ink root — one column of exactly `rows` lines, each exactly
|
|
8
|
+
* `columns` cells, rendered from the store through the view router and the
|
|
9
|
+
* shell chrome. Keys go to the controller; the terminal size and the
|
|
10
|
+
* spinner drive re-renders.
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
*/
|
|
14
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
15
|
+
import { Box, Text, useApp, useInput, useStdout, useWindowSize } from 'ink';
|
|
16
|
+
import { registerSuspend } from '../suspend.js';
|
|
17
|
+
import { breakpoint, shellLayout } from '../render/layout.js';
|
|
18
|
+
import { toneColor } from '../render/theme.js';
|
|
19
|
+
import { useStore } from '../state/store.js';
|
|
20
|
+
import { layoutOf } from '../model/index.js';
|
|
21
|
+
import { completionHits, headerHits, renderFrame } from './shell/chrome.js';
|
|
22
|
+
import { setLastFrame } from './frame.js';
|
|
23
|
+
import { renderView } from './views/index.js';
|
|
24
|
+
import { fitLine } from './lines.js';
|
|
25
|
+
/** One rendered row. */
|
|
26
|
+
function Row({ line, theme }) {
|
|
27
|
+
return (_jsx(Text, { wrap: "truncate-end", children: line.map((span, i) => (_jsx(Text, { color: toneColor(theme, span.tone ?? 'plain'), bold: span.bold === true, dimColor: span.dim === true, inverse: span.inverse === true, children: span.text }, i))) }));
|
|
28
|
+
}
|
|
29
|
+
/** Whether the state animates (the spinner ticks). */
|
|
30
|
+
function animating(state) {
|
|
31
|
+
if (state.view.kind === 'launch')
|
|
32
|
+
return true;
|
|
33
|
+
const ws = state.view.kind === 'dashboard' || state.view.kind === 'task' || state.view.kind === 'input' ? state.view.ws : null;
|
|
34
|
+
if (ws === null)
|
|
35
|
+
return false;
|
|
36
|
+
const execution = state.data.execution[ws];
|
|
37
|
+
return execution?.state?.status.type === 'running' || execution?.settling === true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The application.
|
|
41
|
+
*
|
|
42
|
+
* @param props - The controller, theme, glyphs and version
|
|
43
|
+
* @returns The frame
|
|
44
|
+
*/
|
|
45
|
+
export function App(props) {
|
|
46
|
+
const { controller, theme, glyphs, version } = props;
|
|
47
|
+
const state = useStore(s => s);
|
|
48
|
+
const windowSize = useWindowSize();
|
|
49
|
+
const { stdout } = useStdout();
|
|
50
|
+
const size = props.size ?? windowSize;
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
controller.setSize(size);
|
|
53
|
+
}, [controller, size.columns, size.rows]);
|
|
54
|
+
const [spinner, setSpinner] = useState(0);
|
|
55
|
+
const spinning = animating(state);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!spinning)
|
|
58
|
+
return;
|
|
59
|
+
const timer = setInterval(() => setSpinner(s => s + 1), 120);
|
|
60
|
+
return () => clearInterval(timer);
|
|
61
|
+
}, [spinning]);
|
|
62
|
+
useInput((input, key) => {
|
|
63
|
+
controller.onKey(input, key);
|
|
64
|
+
});
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
controller.attachStdout(stdout);
|
|
67
|
+
}, [controller, stdout]);
|
|
68
|
+
const { suspendTerminal } = useApp();
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
registerSuspend((fn) => suspendTerminal(fn));
|
|
71
|
+
return () => registerSuspend(null);
|
|
72
|
+
}, [suspendTerminal]);
|
|
73
|
+
const now = props.now !== undefined ? props.now() : Date.now();
|
|
74
|
+
const lines = useMemo(() => {
|
|
75
|
+
const bp = breakpoint(size);
|
|
76
|
+
if (bp === 'refuse') {
|
|
77
|
+
return [fitLine([{ text: `terminal too small (${size.columns}×${size.rows}) — need 60×16`, tone: 'neg', bold: true }], Math.max(1, size.columns))];
|
|
78
|
+
}
|
|
79
|
+
const layout = state.size.columns === size.columns && state.size.rows === size.rows ? layoutOf(state) : shellLayout(size, { commit: false, completion: 0 });
|
|
80
|
+
const ctx = { layout, g: glyphs, theme, now, version, spinner, about: props.about };
|
|
81
|
+
const view = renderView(state, ctx, props.facts());
|
|
82
|
+
const hits = [
|
|
83
|
+
...headerHits(state, ctx),
|
|
84
|
+
...(view.hits ?? []).map(h => ({ ...h, row: h.row + layout.bodyTop })),
|
|
85
|
+
...completionHits(state, ctx),
|
|
86
|
+
];
|
|
87
|
+
setLastFrame({ layout, hits, pane: view.pane !== undefined ? { ...view.pane, top: view.pane.top + layout.bodyTop } : null });
|
|
88
|
+
return renderFrame(state, ctx, view.body, view.hints);
|
|
89
|
+
}, [state, size.columns, size.rows, glyphs, theme, now, version, spinner, props]);
|
|
90
|
+
return (_jsx(Box, { flexDirection: "column", width: size.columns, height: size.rows, children: lines.map((line, i) => _jsx(Row, { line: line, theme: theme }, i)) }));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/ui/App.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAa,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAA6C,MAAM,YAAY,CAAC;AAiBhF,wBAAwB;AACxB,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAgC;IACtD,OAAO,CACH,KAAC,IAAI,IAAC,IAAI,EAAC,cAAc,YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACnB,KAAC,IAAI,IAED,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,EAC7C,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,EACxB,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,YAE7B,IAAI,CAAC,IAAI,IANL,CAAC,CAOH,CACV,CAAC,GACC,CACV,CAAC;AACN,CAAC;AAED,sDAAsD;AACtD,SAAS,SAAS,CAAC,KAAe;IAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/H,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AACvF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IAC/B,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE;QACX,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAW,EAAE;QAC/B,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,uBAAuB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvJ,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5J,MAAM,GAAG,GAAc,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/F,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAU;YAChB,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;SAChC,CAAC;QACF,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7H,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAElF,OAAO,CACH,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,YAC7D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAC,GAAG,IAAS,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAA3B,CAAC,CAA8B,CAAC,GAChE,CACT,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The last frame's geometry, for the mouse: which cells are rows, twists,
|
|
7
|
+
* tabs, crumbs, pills and completion rows (`hits`), and the scrolling
|
|
8
|
+
* pane under the body (`pane`) with its scrollbar column. Views publish
|
|
9
|
+
* body-relative rows with their lines; the App stores the absolute ones
|
|
10
|
+
* after each render; the controller hit-tests clicks against them.
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
*/
|
|
14
|
+
import type { ShellLayout } from '../render/layout.js';
|
|
15
|
+
/** What a click on a cell does. */
|
|
16
|
+
export type HitTarget = {
|
|
17
|
+
kind: 'list';
|
|
18
|
+
index: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'dashboard';
|
|
21
|
+
index: number;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'tree';
|
|
24
|
+
flat: number;
|
|
25
|
+
twistX: number | null;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'tab';
|
|
28
|
+
index: number;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'toolbar';
|
|
31
|
+
action: 'expandAll' | 'collapseAll' | 'save';
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'crumb';
|
|
34
|
+
index: number;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'pill';
|
|
37
|
+
pill: 'running' | 'dirty' | 'connection';
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'completion';
|
|
40
|
+
index: number;
|
|
41
|
+
};
|
|
42
|
+
/** A clickable cell range on one row (`x1` exclusive). */
|
|
43
|
+
export interface Hit {
|
|
44
|
+
row: number;
|
|
45
|
+
x0: number;
|
|
46
|
+
x1: number;
|
|
47
|
+
target: HitTarget;
|
|
48
|
+
}
|
|
49
|
+
/** The scrolling pane: its rows, its extent, and where it is scrolled to. */
|
|
50
|
+
export interface Pane {
|
|
51
|
+
/** The first row of the pane (the scrollbar's `▲` sits there). */
|
|
52
|
+
top: number;
|
|
53
|
+
/** Rows the pane occupies (the scrollbar's `▼` sits on the last). */
|
|
54
|
+
rows: number;
|
|
55
|
+
total: number;
|
|
56
|
+
visible: number;
|
|
57
|
+
scrollTop: number;
|
|
58
|
+
}
|
|
59
|
+
/** The last frame's geometry. */
|
|
60
|
+
export interface FrameInfo {
|
|
61
|
+
layout: ShellLayout;
|
|
62
|
+
hits: Hit[];
|
|
63
|
+
pane: Pane | null;
|
|
64
|
+
}
|
|
65
|
+
/** Records the frame just rendered. */
|
|
66
|
+
export declare function setLastFrame(frame: FrameInfo): void;
|
|
67
|
+
/** The frame last rendered, if any. */
|
|
68
|
+
export declare function lastFrame(): FrameInfo | null;
|
|
69
|
+
/**
|
|
70
|
+
* The hit under a cell.
|
|
71
|
+
*
|
|
72
|
+
* @param frame - The frame
|
|
73
|
+
* @param x - The column
|
|
74
|
+
* @param y - The row
|
|
75
|
+
* @returns The target, or null
|
|
76
|
+
*/
|
|
77
|
+
export declare function hitAt(frame: FrameInfo, x: number, y: number): HitTarget | null;
|
|
78
|
+
/**
|
|
79
|
+
* The scroll position a drag on the scrollbar track maps to.
|
|
80
|
+
*
|
|
81
|
+
* @param pane - The pane
|
|
82
|
+
* @param y - The row dragged to
|
|
83
|
+
* @returns The scroll top
|
|
84
|
+
*/
|
|
85
|
+
export declare function paneTopFromRow(pane: Pane, y: number): number;
|
|
86
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/tui/ui/frame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,mCAAmC;AACnC,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,0DAA0D;AAC1D,MAAM,WAAW,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;CACrB;AAED,6EAA6E;AAC7E,MAAM,WAAW,IAAI;IACjB,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACrB;AAID,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAEnD;AAED,uCAAuC;AACvC,wBAAgB,SAAS,IAAI,SAAS,GAAG,IAAI,CAE5C;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAK9E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
let last = null;
|
|
6
|
+
/** Records the frame just rendered. */
|
|
7
|
+
export function setLastFrame(frame) {
|
|
8
|
+
last = frame;
|
|
9
|
+
}
|
|
10
|
+
/** The frame last rendered, if any. */
|
|
11
|
+
export function lastFrame() {
|
|
12
|
+
return last;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The hit under a cell.
|
|
16
|
+
*
|
|
17
|
+
* @param frame - The frame
|
|
18
|
+
* @param x - The column
|
|
19
|
+
* @param y - The row
|
|
20
|
+
* @returns The target, or null
|
|
21
|
+
*/
|
|
22
|
+
export function hitAt(frame, x, y) {
|
|
23
|
+
for (const hit of frame.hits) {
|
|
24
|
+
if (hit.row === y && x >= hit.x0 && x < hit.x1)
|
|
25
|
+
return hit.target;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The scroll position a drag on the scrollbar track maps to.
|
|
31
|
+
*
|
|
32
|
+
* @param pane - The pane
|
|
33
|
+
* @param y - The row dragged to
|
|
34
|
+
* @returns The scroll top
|
|
35
|
+
*/
|
|
36
|
+
export function paneTopFromRow(pane, y) {
|
|
37
|
+
const track = Math.max(1, pane.rows - 2);
|
|
38
|
+
const pos = Math.max(0, Math.min(track - 1, y - (pane.top + 1)));
|
|
39
|
+
const max = Math.max(0, pane.total - pane.visible);
|
|
40
|
+
return Math.round((pos / Math.max(1, track - 1)) * max);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/tui/ui/frame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmDH,IAAI,IAAI,GAAqB,IAAI,CAAC;AAElC,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,KAAgB;IACzC,IAAI,GAAG,KAAK,CAAC;AACjB,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS;IACrB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,KAAgB,EAAE,CAAS,EAAE,CAAS;IACxD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,CAAS;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Lines and spans — the unit every view renders. A `Line` is a list of
|
|
7
|
+
* styled spans that together fill exactly one terminal row; the shell pads
|
|
8
|
+
* or truncates each line to the frame width, so views never wrap and the
|
|
9
|
+
* scroll math stays exact.
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import type { Glyphs } from '../render/glyphs.js';
|
|
14
|
+
import type { Theme, Tone } from '../render/theme.js';
|
|
15
|
+
import type { ShellLayout } from '../render/layout.js';
|
|
16
|
+
/** One styled run of text. */
|
|
17
|
+
export interface Span {
|
|
18
|
+
text: string;
|
|
19
|
+
tone?: Tone | undefined;
|
|
20
|
+
bold?: boolean | undefined;
|
|
21
|
+
dim?: boolean | undefined;
|
|
22
|
+
inverse?: boolean | undefined;
|
|
23
|
+
}
|
|
24
|
+
/** One terminal row. */
|
|
25
|
+
export type Line = Span[];
|
|
26
|
+
/** What a renderer needs besides the state. */
|
|
27
|
+
export interface RenderCtx {
|
|
28
|
+
layout: ShellLayout;
|
|
29
|
+
g: Glyphs;
|
|
30
|
+
theme: Theme;
|
|
31
|
+
/** Epoch milliseconds of this frame. */
|
|
32
|
+
now: number;
|
|
33
|
+
/** The package version. */
|
|
34
|
+
version: string;
|
|
35
|
+
/** The spinner frame index. */
|
|
36
|
+
spinner: number;
|
|
37
|
+
/** The about view's facts. */
|
|
38
|
+
about: AboutInfo;
|
|
39
|
+
}
|
|
40
|
+
/** Facts the about view shows. */
|
|
41
|
+
export interface AboutInfo {
|
|
42
|
+
/** The state file path. */
|
|
43
|
+
statePath: string;
|
|
44
|
+
/** The terminal description (`kitty 0.36 · 120×36 · truecolor · mouse ● · kitty keyboard ●`). */
|
|
45
|
+
terminal: string;
|
|
46
|
+
}
|
|
47
|
+
/** A plain span. */
|
|
48
|
+
export declare const t: (text: string, tone?: Tone) => Span;
|
|
49
|
+
/** A bold span. */
|
|
50
|
+
export declare const b: (text: string, tone?: Tone) => Span;
|
|
51
|
+
/** A dim (muted) span. */
|
|
52
|
+
export declare const d: (text: string) => Span;
|
|
53
|
+
/** The cell width of a line. */
|
|
54
|
+
export declare function lineWidth(line: Line): number;
|
|
55
|
+
/**
|
|
56
|
+
* Fits a line to exactly `width` cells: spans past the width are cut (the
|
|
57
|
+
* last kept one ending in an ellipsis), a short line is padded.
|
|
58
|
+
*
|
|
59
|
+
* @param line - The line
|
|
60
|
+
* @param width - The row width
|
|
61
|
+
* @returns The fitted line
|
|
62
|
+
*/
|
|
63
|
+
export declare function fitLine(line: Line, width: number): Line;
|
|
64
|
+
/**
|
|
65
|
+
* A line from plain text, padded to the width.
|
|
66
|
+
*
|
|
67
|
+
* @param text - The text
|
|
68
|
+
* @param width - The row width
|
|
69
|
+
* @param tone - An optional tone
|
|
70
|
+
* @returns The line
|
|
71
|
+
*/
|
|
72
|
+
export declare function textLine(text: string, width: number, tone?: Tone): Line;
|
|
73
|
+
/** A blank line. */
|
|
74
|
+
export declare function blank(width: number): Line;
|
|
75
|
+
/** A full-width rule. */
|
|
76
|
+
export declare function rule(width: number, ch: string): Line;
|
|
77
|
+
/** Pads a list of lines to exactly `rows` rows, cutting extras. */
|
|
78
|
+
export declare function fitRows(lines: Line[], rows: number, width: number): Line[];
|
|
79
|
+
/** The text of a line (for tests and the debug log). */
|
|
80
|
+
export declare function lineText(line: Line): string;
|
|
81
|
+
/**
|
|
82
|
+
* Left- and right-aligned spans on one row, the left yielding.
|
|
83
|
+
*
|
|
84
|
+
* @param left - The left spans
|
|
85
|
+
* @param right - The right spans
|
|
86
|
+
* @param width - The row width
|
|
87
|
+
* @returns The composed line
|
|
88
|
+
*/
|
|
89
|
+
export declare function lrLine(left: Line, right: Line, width: number): Line;
|
|
90
|
+
/** The glyph set of the context (a shorthand). */
|
|
91
|
+
export declare function glyphs(ctx: RenderCtx): Glyphs;
|
|
92
|
+
//# sourceMappingURL=lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/ui/lines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,8BAA8B;AAC9B,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED,wBAAwB;AACxB,MAAM,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;AAE1B,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,KAAK,CAAC;IACb,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,EAAE,SAAS,CAAC;CACpB;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACtB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,oBAAoB;AACpB,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,EAAE,OAAO,IAAI,KAAG,IAAwD,CAAC;AACvG,mBAAmB;AACnB,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,EAAE,OAAO,IAAI,KAAG,IAAoC,CAAC;AACnF,0BAA0B;AAC1B,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,KAAG,IAA6B,CAAC;AAE/D,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAI5C;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAgBvD;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAEvE;AAED,oBAAoB;AACpB,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,yBAAyB;AACzB,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAI1E;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKnE;AAED,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { displayWidth, padEnd, truncate } from '../render/text.js';
|
|
6
|
+
/** A plain span. */
|
|
7
|
+
export const t = (text, tone) => (tone === undefined ? { text } : { text, tone });
|
|
8
|
+
/** A bold span. */
|
|
9
|
+
export const b = (text, tone) => ({ text, tone, bold: true });
|
|
10
|
+
/** A dim (muted) span. */
|
|
11
|
+
export const d = (text) => ({ text, dim: true });
|
|
12
|
+
/** The cell width of a line. */
|
|
13
|
+
export function lineWidth(line) {
|
|
14
|
+
let w = 0;
|
|
15
|
+
for (const s of line)
|
|
16
|
+
w += displayWidth(s.text);
|
|
17
|
+
return w;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fits a line to exactly `width` cells: spans past the width are cut (the
|
|
21
|
+
* last kept one ending in an ellipsis), a short line is padded.
|
|
22
|
+
*
|
|
23
|
+
* @param line - The line
|
|
24
|
+
* @param width - The row width
|
|
25
|
+
* @returns The fitted line
|
|
26
|
+
*/
|
|
27
|
+
export function fitLine(line, width) {
|
|
28
|
+
const out = [];
|
|
29
|
+
let used = 0;
|
|
30
|
+
for (const span of line) {
|
|
31
|
+
if (used >= width)
|
|
32
|
+
break;
|
|
33
|
+
const w = displayWidth(span.text);
|
|
34
|
+
if (used + w <= width) {
|
|
35
|
+
out.push(span);
|
|
36
|
+
used += w;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
out.push({ ...span, text: truncate(span.text, width - used) });
|
|
40
|
+
used = width;
|
|
41
|
+
}
|
|
42
|
+
if (used < width)
|
|
43
|
+
out.push({ text: ' '.repeat(width - used) });
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A line from plain text, padded to the width.
|
|
48
|
+
*
|
|
49
|
+
* @param text - The text
|
|
50
|
+
* @param width - The row width
|
|
51
|
+
* @param tone - An optional tone
|
|
52
|
+
* @returns The line
|
|
53
|
+
*/
|
|
54
|
+
export function textLine(text, width, tone) {
|
|
55
|
+
return [t(padEnd(text, width), tone)];
|
|
56
|
+
}
|
|
57
|
+
/** A blank line. */
|
|
58
|
+
export function blank(width) {
|
|
59
|
+
return [t(' '.repeat(width))];
|
|
60
|
+
}
|
|
61
|
+
/** A full-width rule. */
|
|
62
|
+
export function rule(width, ch) {
|
|
63
|
+
return [{ text: ch.repeat(width), tone: 'muted' }];
|
|
64
|
+
}
|
|
65
|
+
/** Pads a list of lines to exactly `rows` rows, cutting extras. */
|
|
66
|
+
export function fitRows(lines, rows, width) {
|
|
67
|
+
const out = lines.slice(0, rows).map(l => fitLine(l, width));
|
|
68
|
+
while (out.length < rows)
|
|
69
|
+
out.push(blank(width));
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** The text of a line (for tests and the debug log). */
|
|
73
|
+
export function lineText(line) {
|
|
74
|
+
return line.map(s => s.text).join('');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Left- and right-aligned spans on one row, the left yielding.
|
|
78
|
+
*
|
|
79
|
+
* @param left - The left spans
|
|
80
|
+
* @param right - The right spans
|
|
81
|
+
* @param width - The row width
|
|
82
|
+
* @returns The composed line
|
|
83
|
+
*/
|
|
84
|
+
export function lrLine(left, right, width) {
|
|
85
|
+
const rightWidth = lineWidth(right);
|
|
86
|
+
const leftBudget = Math.max(0, width - rightWidth - 1);
|
|
87
|
+
const l = fitLine(left, leftBudget);
|
|
88
|
+
return [...l, t(' '), ...right];
|
|
89
|
+
}
|
|
90
|
+
/** The glyph set of the context (a shorthand). */
|
|
91
|
+
export function glyphs(ctx) {
|
|
92
|
+
return ctx.g;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/ui/lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { TuiState } from '../../state/actions.js';
|
|
6
|
+
import { type Line, type RenderCtx } from '../lines.js';
|
|
7
|
+
import type { Hit } from '../frame.js';
|
|
8
|
+
/** The breadcrumb of a view. */
|
|
9
|
+
export declare function breadcrumb(state: TuiState, ctx: RenderCtx): string;
|
|
10
|
+
/** The header's pills: dirty, running, connection. */
|
|
11
|
+
export declare function pills(state: TuiState, ctx: RenderCtx): Line;
|
|
12
|
+
/** The header row: ` e3-ui <breadcrumb>` with the pills flush right. */
|
|
13
|
+
export declare function renderHeader(state: TuiState, ctx: RenderCtx): Line;
|
|
14
|
+
/**
|
|
15
|
+
* The clickable crumbs and pills of the header row (row 0).
|
|
16
|
+
*
|
|
17
|
+
* @param state - The store state
|
|
18
|
+
* @param ctx - The render context
|
|
19
|
+
* @returns The hits
|
|
20
|
+
*/
|
|
21
|
+
export declare function headerHits(state: TuiState, ctx: RenderCtx): Hit[];
|
|
22
|
+
/**
|
|
23
|
+
* The clickable completion rows (absolute rows above the command box).
|
|
24
|
+
*
|
|
25
|
+
* @param state - The store state
|
|
26
|
+
* @param ctx - The render context
|
|
27
|
+
* @returns The hits
|
|
28
|
+
*/
|
|
29
|
+
export declare function completionHits(state: TuiState, ctx: RenderCtx): Hit[];
|
|
30
|
+
/** The consequence line of what is typed (`run 6 tasks in main …`), and its keys. */
|
|
31
|
+
export declare function commandStatus(state: TuiState): {
|
|
32
|
+
text: string;
|
|
33
|
+
keys: string;
|
|
34
|
+
error: boolean;
|
|
35
|
+
};
|
|
36
|
+
/** The command box: a rule, the ` › …` line, a rule. */
|
|
37
|
+
export declare function renderCommandBox(state: TuiState, ctx: RenderCtx): Line[];
|
|
38
|
+
/** The completion rows above the command box. */
|
|
39
|
+
export declare function renderCompletion(state: TuiState, ctx: RenderCtx): Line[];
|
|
40
|
+
/** The commit bar (a dashed rule + the pending summary), when editing. */
|
|
41
|
+
export declare function renderCommitBar(state: TuiState, ctx: RenderCtx): Line[];
|
|
42
|
+
/** The hint row (the last row): the view's hints, or the toast when the box is busy. */
|
|
43
|
+
export declare function renderHintBar(state: TuiState, ctx: RenderCtx, hints: {
|
|
44
|
+
left: string;
|
|
45
|
+
right: string;
|
|
46
|
+
}): Line;
|
|
47
|
+
/**
|
|
48
|
+
* The whole frame: header, rule, body, commit bar, completion, command box,
|
|
49
|
+
* hint — exactly `rows` lines of exactly `columns` cells.
|
|
50
|
+
*
|
|
51
|
+
* @param state - The store state
|
|
52
|
+
* @param ctx - The render context
|
|
53
|
+
* @param body - The view's body lines
|
|
54
|
+
* @param hints - The view's hint row
|
|
55
|
+
* @returns The frame's lines
|
|
56
|
+
*/
|
|
57
|
+
export declare function renderFrame(state: TuiState, ctx: RenderCtx, body: Line[], hints: {
|
|
58
|
+
left: string;
|
|
59
|
+
right: string;
|
|
60
|
+
}): Line[];
|
|
61
|
+
//# sourceMappingURL=chrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/shell/chrome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,wBAAwB,CAAC;AAK7D,OAAO,EAA6D,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAkBlE;AAED,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAkB3D;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAIlE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,CAqBjE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,CAKrE;AAUD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CA0B7F;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CA+BxE;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CAwBxE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CASvE;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS3G;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAAE,CAazH"}
|