tuidoscope 0.1.4 → 0.1.7
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 +34 -4
- package/dist/index.js +705 -461
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
1
2
|
// @bun
|
|
2
3
|
// src/index.tsx
|
|
4
|
+
import { createComponent as _$createComponent6 } from "@opentui/solid";
|
|
3
5
|
import { render, extend } from "@opentui/solid";
|
|
4
6
|
import { GhosttyTerminalRenderable } from "ghostty-opentui/terminal-buffer";
|
|
5
7
|
|
|
6
8
|
// src/app.tsx
|
|
9
|
+
import { insertNode as _$insertNode8 } from "@opentui/solid";
|
|
10
|
+
import { memo as _$memo6 } from "@opentui/solid";
|
|
11
|
+
import { insert as _$insert8 } from "@opentui/solid";
|
|
12
|
+
import { createComponent as _$createComponent5 } from "@opentui/solid";
|
|
13
|
+
import { setProp as _$setProp8 } from "@opentui/solid";
|
|
14
|
+
import { createElement as _$createElement8 } from "@opentui/solid";
|
|
7
15
|
import { Show as Show3, createSignal as createSignal4, createEffect as createEffect2, onCleanup, createMemo as createMemo3 } from "solid-js";
|
|
8
16
|
import { useKeyboard as useKeyboard4, useTerminalDimensions, useRenderer } from "@opentui/solid";
|
|
9
17
|
|
|
10
18
|
// src/components/TabList.tsx
|
|
19
|
+
import { effect as _$effect2 } from "@opentui/solid";
|
|
20
|
+
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
21
|
+
import { insert as _$insert2 } from "@opentui/solid";
|
|
22
|
+
import { createTextNode as _$createTextNode2 } from "@opentui/solid";
|
|
23
|
+
import { insertNode as _$insertNode2 } from "@opentui/solid";
|
|
24
|
+
import { memo as _$memo2 } from "@opentui/solid";
|
|
25
|
+
import { setProp as _$setProp2 } from "@opentui/solid";
|
|
26
|
+
import { createElement as _$createElement2 } from "@opentui/solid";
|
|
11
27
|
import { For, createMemo } from "solid-js";
|
|
12
28
|
|
|
13
29
|
// src/components/TabItem.tsx
|
|
14
|
-
import {
|
|
30
|
+
import { effect as _$effect } from "@opentui/solid";
|
|
31
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
32
|
+
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
33
|
+
import { insertNode as _$insertNode } from "@opentui/solid";
|
|
34
|
+
import { insert as _$insert } from "@opentui/solid";
|
|
35
|
+
import { setProp as _$setProp } from "@opentui/solid";
|
|
36
|
+
import { createElement as _$createElement } from "@opentui/solid";
|
|
15
37
|
function getStatusIndicator(status) {
|
|
16
38
|
switch (status) {
|
|
17
39
|
case "running":
|
|
@@ -55,32 +77,43 @@ var TabItem = (props) => {
|
|
|
55
77
|
}
|
|
56
78
|
return props.theme.foreground;
|
|
57
79
|
};
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
return (() => {
|
|
81
|
+
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("text"), _el$5 = _$createElement("text");
|
|
82
|
+
_$insertNode(_el$, _el$2);
|
|
83
|
+
_$insertNode(_el$, _el$3);
|
|
84
|
+
_$insertNode(_el$, _el$5);
|
|
85
|
+
_$setProp(_el$, "height", 1);
|
|
86
|
+
_$setProp(_el$, "flexDirection", "row");
|
|
87
|
+
_$insert(_el$2, () => getStatusIndicator(props.status));
|
|
88
|
+
_$insertNode(_el$3, _$createTextNode(` `));
|
|
89
|
+
_$insert(_el$5, (() => {
|
|
90
|
+
var _c$ = _$memo(() => !!props.isActive);
|
|
91
|
+
return () => _c$() ? (() => {
|
|
92
|
+
var _el$6 = _$createElement("b");
|
|
93
|
+
_$insert(_el$6, truncatedName);
|
|
94
|
+
return _el$6;
|
|
95
|
+
})() : truncatedName();
|
|
96
|
+
})());
|
|
97
|
+
_$effect((_p$) => {
|
|
98
|
+
var { width: _v$, onSelect: _v$2 } = props, _v$3 = getStatusColor(props.status, props.theme), _v$4 = fgColor(), _v$5 = bgColor();
|
|
99
|
+
_v$ !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$, _p$.e));
|
|
100
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$, "onMouseDown", _v$2, _p$.t));
|
|
101
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp(_el$2, "fg", _v$3, _p$.a));
|
|
102
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp(_el$5, "fg", _v$4, _p$.o));
|
|
103
|
+
_v$5 !== _p$.i && (_p$.i = _$setProp(_el$5, "bg", _v$5, _p$.i));
|
|
104
|
+
return _p$;
|
|
105
|
+
}, {
|
|
106
|
+
e: undefined,
|
|
107
|
+
t: undefined,
|
|
108
|
+
a: undefined,
|
|
109
|
+
o: undefined,
|
|
110
|
+
i: undefined
|
|
111
|
+
});
|
|
112
|
+
return _el$;
|
|
113
|
+
})();
|
|
80
114
|
};
|
|
81
115
|
|
|
82
116
|
// src/components/TabList.tsx
|
|
83
|
-
import { jsxDEV as jsxDEV2 } from "@opentui/solid/jsx-dev-runtime";
|
|
84
117
|
var TabList = (props) => {
|
|
85
118
|
const visibleHeight = () => props.height - 2;
|
|
86
119
|
const visibleEntries = createMemo(() => {
|
|
@@ -90,126 +123,176 @@ var TabList = (props) => {
|
|
|
90
123
|
});
|
|
91
124
|
const hasScrollUp = () => props.scrollOffset > 0;
|
|
92
125
|
const hasScrollDown = () => props.scrollOffset + visibleHeight() < props.entries.length;
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
126
|
+
return (() => {
|
|
127
|
+
var _el$ = _$createElement2("box"), _el$2 = _$createElement2("box"), _el$3 = _$createElement2("text"), _el$4 = _$createElement2("b"), _el$5 = _$createTextNode2(`Apps `), _el$6 = _$createElement2("box"), _el$7 = _$createElement2("box"), _el$8 = _$createElement2("text");
|
|
128
|
+
_$insertNode2(_el$, _el$2);
|
|
129
|
+
_$insertNode2(_el$, _el$6);
|
|
130
|
+
_$insertNode2(_el$, _el$7);
|
|
131
|
+
_$setProp2(_el$, "flexDirection", "column");
|
|
132
|
+
_$setProp2(_el$, "borderStyle", "single");
|
|
133
|
+
_$insertNode2(_el$2, _el$3);
|
|
134
|
+
_$setProp2(_el$2, "height", 1);
|
|
135
|
+
_$insertNode2(_el$3, _el$4);
|
|
136
|
+
_$insertNode2(_el$4, _el$5);
|
|
137
|
+
_$insert2(_el$4, () => hasScrollUp() ? "\u25B2" : " ", null);
|
|
138
|
+
_$insert2(_el$4, () => hasScrollDown() ? "\u25BC" : " ", null);
|
|
139
|
+
_$setProp2(_el$6, "flexDirection", "column");
|
|
140
|
+
_$setProp2(_el$6, "flexGrow", 1);
|
|
141
|
+
_$insert2(_el$6, _$createComponent(For, {
|
|
142
|
+
get each() {
|
|
143
|
+
return visibleEntries();
|
|
144
|
+
},
|
|
145
|
+
children: (entry, index) => {
|
|
146
|
+
const actualIndex = () => props.scrollOffset + index();
|
|
147
|
+
return _$createComponent(TabItem, {
|
|
148
|
+
entry,
|
|
149
|
+
get status() {
|
|
150
|
+
return props.getStatus(entry.id);
|
|
151
|
+
},
|
|
152
|
+
get isActive() {
|
|
153
|
+
return entry.id === props.activeTabId;
|
|
154
|
+
},
|
|
155
|
+
get isFocused() {
|
|
156
|
+
return _$memo2(() => !!props.isFocused)() && actualIndex() === props.selectedIndex;
|
|
157
|
+
},
|
|
158
|
+
get width() {
|
|
159
|
+
return props.width - 2;
|
|
160
|
+
},
|
|
161
|
+
get theme() {
|
|
162
|
+
return props.theme;
|
|
163
|
+
},
|
|
164
|
+
onSelect: () => props.onSelect(entry.id)
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}));
|
|
168
|
+
_$insertNode2(_el$7, _el$8);
|
|
169
|
+
_$setProp2(_el$7, "height", 1);
|
|
170
|
+
_$insertNode2(_el$8, _$createTextNode2(`[+ Add]`));
|
|
171
|
+
_$effect2((_p$) => {
|
|
172
|
+
var { width: _v$, height: _v$2 } = props, _v$3 = props.isFocused ? props.theme.primary : props.theme.muted, _v$4 = props.width - 2, _v$5 = props.theme.accent, _v$6 = props.width - 2, _v$7 = props.onAddClick, _v$8 = props.theme.muted;
|
|
173
|
+
_v$ !== _p$.e && (_p$.e = _$setProp2(_el$, "width", _v$, _p$.e));
|
|
174
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp2(_el$, "height", _v$2, _p$.t));
|
|
175
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp2(_el$, "borderColor", _v$3, _p$.a));
|
|
176
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp2(_el$2, "width", _v$4, _p$.o));
|
|
177
|
+
_v$5 !== _p$.i && (_p$.i = _$setProp2(_el$3, "fg", _v$5, _p$.i));
|
|
178
|
+
_v$6 !== _p$.n && (_p$.n = _$setProp2(_el$7, "width", _v$6, _p$.n));
|
|
179
|
+
_v$7 !== _p$.s && (_p$.s = _$setProp2(_el$7, "onMouseDown", _v$7, _p$.s));
|
|
180
|
+
_v$8 !== _p$.h && (_p$.h = _$setProp2(_el$8, "fg", _v$8, _p$.h));
|
|
181
|
+
return _p$;
|
|
182
|
+
}, {
|
|
183
|
+
e: undefined,
|
|
184
|
+
t: undefined,
|
|
185
|
+
a: undefined,
|
|
186
|
+
o: undefined,
|
|
187
|
+
i: undefined,
|
|
188
|
+
n: undefined,
|
|
189
|
+
s: undefined,
|
|
190
|
+
h: undefined
|
|
191
|
+
});
|
|
192
|
+
return _el$;
|
|
193
|
+
})();
|
|
144
194
|
};
|
|
145
195
|
|
|
146
196
|
// src/components/TerminalPane.tsx
|
|
197
|
+
import { createTextNode as _$createTextNode3 } from "@opentui/solid";
|
|
198
|
+
import { insertNode as _$insertNode3 } from "@opentui/solid";
|
|
199
|
+
import { effect as _$effect3 } from "@opentui/solid";
|
|
200
|
+
import { insert as _$insert3 } from "@opentui/solid";
|
|
201
|
+
import { createComponent as _$createComponent2 } from "@opentui/solid";
|
|
202
|
+
import { setProp as _$setProp3 } from "@opentui/solid";
|
|
203
|
+
import { createElement as _$createElement3 } from "@opentui/solid";
|
|
147
204
|
import { Show } from "solid-js";
|
|
148
|
-
import { jsxDEV as jsxDEV3 } from "@opentui/solid/jsx-dev-runtime";
|
|
149
205
|
var TerminalPane = (props) => {
|
|
150
206
|
const contentWidth = () => Math.max(1, props.width - 2);
|
|
151
207
|
const contentHeight = () => Math.max(1, props.height - 3);
|
|
152
|
-
return
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
borderStyle
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}, undefined, true, undefined, this),
|
|
194
|
-
/* @__PURE__ */ jsxDEV3("box", {
|
|
208
|
+
return (() => {
|
|
209
|
+
var _el$ = _$createElement3("box");
|
|
210
|
+
_$setProp3(_el$, "flexDirection", "column");
|
|
211
|
+
_$setProp3(_el$, "flexGrow", 1);
|
|
212
|
+
_$setProp3(_el$, "borderStyle", "single");
|
|
213
|
+
_$insert3(_el$, _$createComponent2(Show, {
|
|
214
|
+
get when() {
|
|
215
|
+
return props.runningApp;
|
|
216
|
+
},
|
|
217
|
+
get fallback() {
|
|
218
|
+
return (() => {
|
|
219
|
+
var _el$2 = _$createElement3("box"), _el$3 = _$createElement3("text");
|
|
220
|
+
_$insertNode3(_el$2, _el$3);
|
|
221
|
+
_$setProp3(_el$2, "flexGrow", 1);
|
|
222
|
+
_$setProp3(_el$2, "justifyContent", "center");
|
|
223
|
+
_$setProp3(_el$2, "alignItems", "center");
|
|
224
|
+
_$insertNode3(_el$3, _$createTextNode3(`No app selected. Press Ctrl+T to add one.`));
|
|
225
|
+
_$effect3((_$p) => _$setProp3(_el$3, "fg", props.theme.muted, _$p));
|
|
226
|
+
return _el$2;
|
|
227
|
+
})();
|
|
228
|
+
},
|
|
229
|
+
children: (app) => (() => {
|
|
230
|
+
var _el$5 = _$createElement3("box"), _el$6 = _$createElement3("box"), _el$7 = _$createElement3("text"), _el$8 = _$createElement3("b"), _el$9 = _$createElement3("text"), _el$0 = _$createTextNode3(` (`), _el$10 = _$createTextNode3(`)`), _el$11 = _$createElement3("box"), _el$12 = _$createElement3("ghostty-terminal");
|
|
231
|
+
_$insertNode3(_el$5, _el$6);
|
|
232
|
+
_$insertNode3(_el$5, _el$11);
|
|
233
|
+
_$setProp3(_el$5, "flexDirection", "column");
|
|
234
|
+
_$setProp3(_el$5, "flexGrow", 1);
|
|
235
|
+
_$insertNode3(_el$6, _el$7);
|
|
236
|
+
_$insertNode3(_el$6, _el$9);
|
|
237
|
+
_$setProp3(_el$6, "height", 1);
|
|
238
|
+
_$setProp3(_el$6, "flexDirection", "row");
|
|
239
|
+
_$insertNode3(_el$7, _el$8);
|
|
240
|
+
_$insert3(_el$8, () => app().entry.name);
|
|
241
|
+
_$insertNode3(_el$9, _el$0);
|
|
242
|
+
_$insertNode3(_el$9, _el$10);
|
|
243
|
+
_$insert3(_el$9, () => app().status, _el$10);
|
|
244
|
+
_$insertNode3(_el$11, _el$12);
|
|
245
|
+
_$setProp3(_el$11, "overflow", "hidden");
|
|
246
|
+
_$setProp3(_el$12, "showCursor", true);
|
|
247
|
+
_$effect3((_p$) => {
|
|
248
|
+
var _v$3 = props.theme.accent, _v$4 = props.theme.muted, _v$5 = contentWidth(), _v$6 = contentHeight(), _v$7 = app().buffer, _v$8 = contentWidth(), _v$9 = contentHeight(), _v$0 = {
|
|
195
249
|
width: contentWidth(),
|
|
196
|
-
height: contentHeight()
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
250
|
+
height: contentHeight()
|
|
251
|
+
};
|
|
252
|
+
_v$3 !== _p$.e && (_p$.e = _$setProp3(_el$7, "fg", _v$3, _p$.e));
|
|
253
|
+
_v$4 !== _p$.t && (_p$.t = _$setProp3(_el$9, "fg", _v$4, _p$.t));
|
|
254
|
+
_v$5 !== _p$.a && (_p$.a = _$setProp3(_el$11, "width", _v$5, _p$.a));
|
|
255
|
+
_v$6 !== _p$.o && (_p$.o = _$setProp3(_el$11, "height", _v$6, _p$.o));
|
|
256
|
+
_v$7 !== _p$.i && (_p$.i = _$setProp3(_el$12, "ansi", _v$7, _p$.i));
|
|
257
|
+
_v$8 !== _p$.n && (_p$.n = _$setProp3(_el$12, "cols", _v$8, _p$.n));
|
|
258
|
+
_v$9 !== _p$.s && (_p$.s = _$setProp3(_el$12, "rows", _v$9, _p$.s));
|
|
259
|
+
_v$0 !== _p$.h && (_p$.h = _$setProp3(_el$12, "style", _v$0, _p$.h));
|
|
260
|
+
return _p$;
|
|
261
|
+
}, {
|
|
262
|
+
e: undefined,
|
|
263
|
+
t: undefined,
|
|
264
|
+
a: undefined,
|
|
265
|
+
o: undefined,
|
|
266
|
+
i: undefined,
|
|
267
|
+
n: undefined,
|
|
268
|
+
s: undefined,
|
|
269
|
+
h: undefined
|
|
270
|
+
});
|
|
271
|
+
return _el$5;
|
|
272
|
+
})()
|
|
273
|
+
}));
|
|
274
|
+
_$effect3((_p$) => {
|
|
275
|
+
var _v$ = props.height, _v$2 = props.isFocused ? props.theme.primary : props.theme.muted;
|
|
276
|
+
_v$ !== _p$.e && (_p$.e = _$setProp3(_el$, "height", _v$, _p$.e));
|
|
277
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp3(_el$, "borderColor", _v$2, _p$.t));
|
|
278
|
+
return _p$;
|
|
279
|
+
}, {
|
|
280
|
+
e: undefined,
|
|
281
|
+
t: undefined
|
|
282
|
+
});
|
|
283
|
+
return _el$;
|
|
284
|
+
})();
|
|
210
285
|
};
|
|
211
286
|
|
|
212
287
|
// src/components/StatusBar.tsx
|
|
288
|
+
import { memo as _$memo3 } from "@opentui/solid";
|
|
289
|
+
import { createComponent as _$createComponent3 } from "@opentui/solid";
|
|
290
|
+
import { effect as _$effect4 } from "@opentui/solid";
|
|
291
|
+
import { insert as _$insert4 } from "@opentui/solid";
|
|
292
|
+
import { createTextNode as _$createTextNode4 } from "@opentui/solid";
|
|
293
|
+
import { insertNode as _$insertNode4 } from "@opentui/solid";
|
|
294
|
+
import { setProp as _$setProp4 } from "@opentui/solid";
|
|
295
|
+
import { createElement as _$createElement4 } from "@opentui/solid";
|
|
213
296
|
import { Show as Show2 } from "solid-js";
|
|
214
297
|
|
|
215
298
|
// src/lib/keybinds.ts
|
|
@@ -268,74 +351,84 @@ function formatKeybind(keybind) {
|
|
|
268
351
|
}
|
|
269
352
|
|
|
270
353
|
// src/components/StatusBar.tsx
|
|
271
|
-
import { jsxDEV as jsxDEV4 } from "@opentui/solid/jsx-dev-runtime";
|
|
272
354
|
var StatusBar = (props) => {
|
|
273
|
-
return
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
355
|
+
return (() => {
|
|
356
|
+
var _el$ = _$createElement4("box"), _el$2 = _$createElement4("box"), _el$3 = _$createElement4("text"), _el$4 = _$createTextNode4(` `), _el$5 = _$createTextNode4(`:Focus | `), _el$7 = _$createTextNode4(`:Palette | `), _el$9 = _$createTextNode4(`:Edit | `), _el$1 = _$createTextNode4(`:Stop | `), _el$11 = _$createTextNode4(`:KillAll | `), _el$13 = _$createTextNode4(`:Quit`), _el$14 = _$createElement4("box"), _el$17 = _$createElement4("box"), _el$18 = _$createElement4("text"), _el$19 = _$createTextNode4(` `);
|
|
357
|
+
_$insertNode4(_el$, _el$2);
|
|
358
|
+
_$insertNode4(_el$, _el$14);
|
|
359
|
+
_$insertNode4(_el$, _el$17);
|
|
360
|
+
_$setProp4(_el$, "height", 1);
|
|
361
|
+
_$setProp4(_el$, "flexDirection", "row");
|
|
362
|
+
_$insertNode4(_el$2, _el$3);
|
|
363
|
+
_$setProp4(_el$2, "flexGrow", 1);
|
|
364
|
+
_$insertNode4(_el$3, _el$4);
|
|
365
|
+
_$insertNode4(_el$3, _el$5);
|
|
366
|
+
_$insertNode4(_el$3, _el$7);
|
|
367
|
+
_$insertNode4(_el$3, _el$9);
|
|
368
|
+
_$insertNode4(_el$3, _el$1);
|
|
369
|
+
_$insertNode4(_el$3, _el$11);
|
|
370
|
+
_$insertNode4(_el$3, _el$13);
|
|
371
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.toggle_focus), _el$5);
|
|
372
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.command_palette), _el$7);
|
|
373
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.edit_app), _el$9);
|
|
374
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.stop_app), _el$1);
|
|
375
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.kill_all), _el$11);
|
|
376
|
+
_$insert4(_el$3, () => formatKeybind(props.keybinds.quit), _el$13);
|
|
377
|
+
_$insert4(_el$14, _$createComponent3(Show2, {
|
|
378
|
+
get when() {
|
|
379
|
+
return props.message;
|
|
380
|
+
},
|
|
381
|
+
get fallback() {
|
|
382
|
+
return _$createComponent3(Show2, {
|
|
383
|
+
get when() {
|
|
384
|
+
return props.appName;
|
|
385
|
+
},
|
|
386
|
+
get children() {
|
|
387
|
+
var _el$20 = _$createElement4("text");
|
|
388
|
+
_$insert4(_el$20, () => props.appName, null);
|
|
389
|
+
_$insert4(_el$20, (() => {
|
|
390
|
+
var _c$ = _$memo3(() => !!props.appStatus);
|
|
391
|
+
return () => _c$() ? ` (${props.appStatus})` : "";
|
|
392
|
+
})(), null);
|
|
393
|
+
_$effect4((_$p) => _$setProp4(_el$20, "fg", props.theme.accent, _$p));
|
|
394
|
+
return _el$20;
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
},
|
|
398
|
+
get children() {
|
|
399
|
+
var _el$15 = _$createElement4("text"), _el$16 = _$createElement4("b");
|
|
400
|
+
_$insertNode4(_el$15, _el$16);
|
|
401
|
+
_$insert4(_el$16, () => props.message);
|
|
402
|
+
_$effect4((_$p) => _$setProp4(_el$15, "fg", props.theme.accent, _$p));
|
|
403
|
+
return _el$15;
|
|
404
|
+
}
|
|
405
|
+
}));
|
|
406
|
+
_$insertNode4(_el$17, _el$18);
|
|
407
|
+
_$insertNode4(_el$18, _el$19);
|
|
408
|
+
_$insert4(_el$18, () => props.focusMode === "terminal" ? "[TERMINAL]" : "[TABS]", _el$19);
|
|
409
|
+
_$effect4((_p$) => {
|
|
410
|
+
var _v$ = props.theme.muted, _v$2 = props.theme.foreground, _v$3 = props.theme.foreground;
|
|
411
|
+
_v$ !== _p$.e && (_p$.e = _$setProp4(_el$, "backgroundColor", _v$, _p$.e));
|
|
412
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp4(_el$3, "fg", _v$2, _p$.t));
|
|
413
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp4(_el$18, "fg", _v$3, _p$.a));
|
|
414
|
+
return _p$;
|
|
415
|
+
}, {
|
|
416
|
+
e: undefined,
|
|
417
|
+
t: undefined,
|
|
418
|
+
a: undefined
|
|
419
|
+
});
|
|
420
|
+
return _el$;
|
|
421
|
+
})();
|
|
336
422
|
};
|
|
337
423
|
|
|
338
424
|
// src/components/CommandPalette.tsx
|
|
425
|
+
import { effect as _$effect5 } from "@opentui/solid";
|
|
426
|
+
import { createTextNode as _$createTextNode5 } from "@opentui/solid";
|
|
427
|
+
import { createComponent as _$createComponent4 } from "@opentui/solid";
|
|
428
|
+
import { insertNode as _$insertNode5 } from "@opentui/solid";
|
|
429
|
+
import { insert as _$insert5 } from "@opentui/solid";
|
|
430
|
+
import { setProp as _$setProp5 } from "@opentui/solid";
|
|
431
|
+
import { createElement as _$createElement5 } from "@opentui/solid";
|
|
339
432
|
import { For as For2, createSignal, createMemo as createMemo2, createEffect } from "solid-js";
|
|
340
433
|
import { useKeyboard } from "@opentui/solid";
|
|
341
434
|
|
|
@@ -374,7 +467,6 @@ function buildEntryCommand(entry) {
|
|
|
374
467
|
}
|
|
375
468
|
|
|
376
469
|
// src/components/CommandPalette.tsx
|
|
377
|
-
import { jsxDEV as jsxDEV5 } from "@opentui/solid/jsx-dev-runtime";
|
|
378
470
|
var CommandPalette = (props) => {
|
|
379
471
|
const [query, setQuery] = createSignal("");
|
|
380
472
|
const [selectedIndex, setSelectedIndex] = createSignal(0);
|
|
@@ -436,80 +528,116 @@ var CommandPalette = (props) => {
|
|
|
436
528
|
results();
|
|
437
529
|
setSelectedIndex(0);
|
|
438
530
|
});
|
|
439
|
-
return
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
531
|
+
return (() => {
|
|
532
|
+
var _el$ = _$createElement5("box"), _el$2 = _$createElement5("box"), _el$3 = _$createElement5("text"), _el$4 = _$createElement5("box"), _el$5 = _$createElement5("box"), _el$6 = _$createElement5("text");
|
|
533
|
+
_$insertNode5(_el$, _el$2);
|
|
534
|
+
_$insertNode5(_el$, _el$4);
|
|
535
|
+
_$insertNode5(_el$, _el$5);
|
|
536
|
+
_$setProp5(_el$, "position", "absolute");
|
|
537
|
+
_$setProp5(_el$, "top", "20%");
|
|
538
|
+
_$setProp5(_el$, "left", "20%");
|
|
539
|
+
_$setProp5(_el$, "width", "60%");
|
|
540
|
+
_$setProp5(_el$, "height", "60%");
|
|
541
|
+
_$setProp5(_el$, "flexDirection", "column");
|
|
542
|
+
_$setProp5(_el$, "borderStyle", "double");
|
|
543
|
+
_$insertNode5(_el$2, _el$3);
|
|
544
|
+
_$setProp5(_el$2, "height", 1);
|
|
545
|
+
_$setProp5(_el$2, "flexDirection", "row");
|
|
546
|
+
_$setProp5(_el$2, "borderStyle", "single");
|
|
547
|
+
_$insert5(_el$3, () => `> ${query()}\u2588`);
|
|
548
|
+
_$setProp5(_el$4, "flexDirection", "column");
|
|
549
|
+
_$setProp5(_el$4, "flexGrow", 1);
|
|
550
|
+
_$setProp5(_el$4, "overflow", "hidden");
|
|
551
|
+
_$insert5(_el$4, _$createComponent4(For2, {
|
|
552
|
+
get each() {
|
|
553
|
+
return results().slice(0, 10);
|
|
554
|
+
},
|
|
555
|
+
children: (result, index) => (() => {
|
|
556
|
+
var _el$8 = _$createElement5("box"), _el$9 = _$createElement5("text"), _el$0 = _$createTextNode5(` `);
|
|
557
|
+
_$insertNode5(_el$8, _el$9);
|
|
558
|
+
_$setProp5(_el$8, "height", 1);
|
|
559
|
+
_$setProp5(_el$8, "width", "100%");
|
|
560
|
+
_$setProp5(_el$8, "flexDirection", "row");
|
|
561
|
+
_$setProp5(_el$8, "onMouseDown", () => props.onSelect(result.item, "switch"));
|
|
562
|
+
_$insertNode5(_el$9, _el$0);
|
|
563
|
+
_$setProp5(_el$9, "width", "100%");
|
|
564
|
+
_$insert5(_el$9, () => `${result.item.name} - ${buildEntryCommand(result.item)}`, null);
|
|
565
|
+
_$effect5((_p$) => {
|
|
566
|
+
var _v$7 = index() === selectedIndex() ? props.theme.primary : props.theme.background, _v$8 = index() === selectedIndex() ? props.theme.background : props.theme.foreground, _v$9 = index() === selectedIndex() ? props.theme.primary : props.theme.background;
|
|
567
|
+
_v$7 !== _p$.e && (_p$.e = _$setProp5(_el$8, "backgroundColor", _v$7, _p$.e));
|
|
568
|
+
_v$8 !== _p$.t && (_p$.t = _$setProp5(_el$9, "fg", _v$8, _p$.t));
|
|
569
|
+
_v$9 !== _p$.a && (_p$.a = _$setProp5(_el$9, "bg", _v$9, _p$.a));
|
|
570
|
+
return _p$;
|
|
571
|
+
}, {
|
|
572
|
+
e: undefined,
|
|
573
|
+
t: undefined,
|
|
574
|
+
a: undefined
|
|
575
|
+
});
|
|
576
|
+
return _el$8;
|
|
577
|
+
})()
|
|
578
|
+
}));
|
|
579
|
+
_$insertNode5(_el$5, _el$6);
|
|
580
|
+
_$setProp5(_el$5, "height", 1);
|
|
581
|
+
_$setProp5(_el$5, "borderStyle", "single");
|
|
582
|
+
_$insertNode5(_el$6, _$createTextNode5(`Enter:Select | x:Stop | Ctrl+E:Edit | Esc:Close | \u2191\u2193:Navigate`));
|
|
583
|
+
_$effect5((_p$) => {
|
|
584
|
+
var _v$ = props.theme.primary, _v$2 = props.theme.background, _v$3 = props.theme.muted, _v$4 = props.theme.foreground, _v$5 = props.theme.muted, _v$6 = props.theme.muted;
|
|
585
|
+
_v$ !== _p$.e && (_p$.e = _$setProp5(_el$, "borderColor", _v$, _p$.e));
|
|
586
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp5(_el$, "backgroundColor", _v$2, _p$.t));
|
|
587
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp5(_el$2, "borderColor", _v$3, _p$.a));
|
|
588
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp5(_el$3, "fg", _v$4, _p$.o));
|
|
589
|
+
_v$5 !== _p$.i && (_p$.i = _$setProp5(_el$5, "borderColor", _v$5, _p$.i));
|
|
590
|
+
_v$6 !== _p$.n && (_p$.n = _$setProp5(_el$6, "fg", _v$6, _p$.n));
|
|
591
|
+
return _p$;
|
|
592
|
+
}, {
|
|
593
|
+
e: undefined,
|
|
594
|
+
t: undefined,
|
|
595
|
+
a: undefined,
|
|
596
|
+
o: undefined,
|
|
597
|
+
i: undefined,
|
|
598
|
+
n: undefined
|
|
599
|
+
});
|
|
600
|
+
return _el$;
|
|
601
|
+
})();
|
|
495
602
|
};
|
|
496
603
|
|
|
497
604
|
// src/components/AddTabModal.tsx
|
|
605
|
+
import { memo as _$memo4 } from "@opentui/solid";
|
|
606
|
+
import { effect as _$effect6 } from "@opentui/solid";
|
|
607
|
+
import { insert as _$insert6 } from "@opentui/solid";
|
|
608
|
+
import { createTextNode as _$createTextNode6 } from "@opentui/solid";
|
|
609
|
+
import { insertNode as _$insertNode6 } from "@opentui/solid";
|
|
610
|
+
import { setProp as _$setProp6 } from "@opentui/solid";
|
|
611
|
+
import { createElement as _$createElement6 } from "@opentui/solid";
|
|
498
612
|
import { createSignal as createSignal2 } from "solid-js";
|
|
499
613
|
import { useKeyboard as useKeyboard2 } from "@opentui/solid";
|
|
500
|
-
import { jsxDEV as jsxDEV6 } from "@opentui/solid/jsx-dev-runtime";
|
|
501
614
|
var AddTabModal = (props) => {
|
|
502
615
|
const [name, setName] = createSignal2("");
|
|
503
616
|
const [command, setCommand] = createSignal2("");
|
|
504
617
|
const [args, setArgs] = createSignal2("");
|
|
505
618
|
const [cwd, setCwd] = createSignal2("~");
|
|
506
619
|
const [focusedField, setFocusedField] = createSignal2("name");
|
|
507
|
-
const fields = [
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
620
|
+
const fields = [{
|
|
621
|
+
key: "name",
|
|
622
|
+
label: "Name",
|
|
623
|
+
value: name,
|
|
624
|
+
setValue: setName
|
|
625
|
+
}, {
|
|
626
|
+
key: "command",
|
|
627
|
+
label: "Command",
|
|
628
|
+
value: command,
|
|
629
|
+
setValue: setCommand
|
|
630
|
+
}, {
|
|
631
|
+
key: "args",
|
|
632
|
+
label: "Arguments",
|
|
633
|
+
value: args,
|
|
634
|
+
setValue: setArgs
|
|
635
|
+
}, {
|
|
636
|
+
key: "cwd",
|
|
637
|
+
label: "Directory",
|
|
638
|
+
value: cwd,
|
|
639
|
+
setValue: setCwd
|
|
640
|
+
}];
|
|
513
641
|
const focusIndex = () => fields.findIndex((field) => field.key === focusedField());
|
|
514
642
|
const setFocusByIndex = (index) => {
|
|
515
643
|
const clamped = Math.max(0, Math.min(fields.length - 1, index));
|
|
@@ -557,81 +685,107 @@ var AddTabModal = (props) => {
|
|
|
557
685
|
event.preventDefault();
|
|
558
686
|
}
|
|
559
687
|
});
|
|
560
|
-
return
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
688
|
+
return (() => {
|
|
689
|
+
var _el$ = _$createElement6("box"), _el$2 = _$createElement6("box"), _el$3 = _$createElement6("text"), _el$4 = _$createElement6("b"), _el$6 = _$createElement6("box"), _el$7 = _$createElement6("text");
|
|
690
|
+
_$insertNode6(_el$, _el$2);
|
|
691
|
+
_$insertNode6(_el$, _el$6);
|
|
692
|
+
_$setProp6(_el$, "position", "absolute");
|
|
693
|
+
_$setProp6(_el$, "top", "30%");
|
|
694
|
+
_$setProp6(_el$, "left", "25%");
|
|
695
|
+
_$setProp6(_el$, "width", "50%");
|
|
696
|
+
_$setProp6(_el$, "height", 11);
|
|
697
|
+
_$setProp6(_el$, "flexDirection", "column");
|
|
698
|
+
_$setProp6(_el$, "borderStyle", "double");
|
|
699
|
+
_$insertNode6(_el$2, _el$3);
|
|
700
|
+
_$setProp6(_el$2, "height", 1);
|
|
701
|
+
_$insertNode6(_el$3, _el$4);
|
|
702
|
+
_$insertNode6(_el$4, _$createTextNode6(` Add New App`));
|
|
703
|
+
_$insert6(_el$, () => fields.map((field) => {
|
|
704
|
+
const isFocused = () => focusedField() === field.key;
|
|
705
|
+
return (() => {
|
|
706
|
+
var _el$9 = _$createElement6("box"), _el$0 = _$createElement6("box"), _el$1 = _$createElement6("text"), _el$10 = _$createTextNode6(`:`), _el$11 = _$createElement6("text"), _el$12 = _$createTextNode6(` `);
|
|
707
|
+
_$insertNode6(_el$9, _el$0);
|
|
708
|
+
_$insertNode6(_el$9, _el$11);
|
|
709
|
+
_$setProp6(_el$9, "height", 1);
|
|
710
|
+
_$setProp6(_el$9, "flexDirection", "row");
|
|
711
|
+
_$insertNode6(_el$0, _el$1);
|
|
712
|
+
_$setProp6(_el$0, "width", 12);
|
|
713
|
+
_$insertNode6(_el$1, _el$10);
|
|
714
|
+
_$insert6(_el$1, () => field.label, _el$10);
|
|
715
|
+
_$insertNode6(_el$11, _el$12);
|
|
716
|
+
_$insert6(_el$11, () => field.value(), null);
|
|
717
|
+
_$insert6(_el$11, () => isFocused() ? "\u2588" : " ", null);
|
|
718
|
+
_$effect6((_p$) => {
|
|
719
|
+
var _v$5 = isFocused() ? props.theme.accent : props.theme.muted, _v$6 = isFocused() ? props.theme.foreground : props.theme.muted, _v$7 = isFocused() ? props.theme.primary : undefined;
|
|
720
|
+
_v$5 !== _p$.e && (_p$.e = _$setProp6(_el$1, "fg", _v$5, _p$.e));
|
|
721
|
+
_v$6 !== _p$.t && (_p$.t = _$setProp6(_el$11, "fg", _v$6, _p$.t));
|
|
722
|
+
_v$7 !== _p$.a && (_p$.a = _$setProp6(_el$11, "bg", _v$7, _p$.a));
|
|
723
|
+
return _p$;
|
|
724
|
+
}, {
|
|
725
|
+
e: undefined,
|
|
726
|
+
t: undefined,
|
|
727
|
+
a: undefined
|
|
728
|
+
});
|
|
729
|
+
return _el$9;
|
|
730
|
+
})();
|
|
731
|
+
}), _el$6);
|
|
732
|
+
_$insertNode6(_el$6, _el$7);
|
|
733
|
+
_$setProp6(_el$6, "height", 1);
|
|
734
|
+
_$insertNode6(_el$7, _$createTextNode6(`Enter:Add | Esc:Cancel | Tab:Next field`));
|
|
735
|
+
_$effect6((_p$) => {
|
|
736
|
+
var _v$ = props.theme.primary, _v$2 = props.theme.background, _v$3 = props.theme.accent, _v$4 = props.theme.muted;
|
|
737
|
+
_v$ !== _p$.e && (_p$.e = _$setProp6(_el$, "borderColor", _v$, _p$.e));
|
|
738
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp6(_el$, "backgroundColor", _v$2, _p$.t));
|
|
739
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp6(_el$3, "fg", _v$3, _p$.a));
|
|
740
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp6(_el$7, "fg", _v$4, _p$.o));
|
|
741
|
+
return _p$;
|
|
742
|
+
}, {
|
|
743
|
+
e: undefined,
|
|
744
|
+
t: undefined,
|
|
745
|
+
a: undefined,
|
|
746
|
+
o: undefined
|
|
747
|
+
});
|
|
748
|
+
return _el$;
|
|
749
|
+
})();
|
|
617
750
|
};
|
|
618
751
|
|
|
619
752
|
// src/components/EditAppModal.tsx
|
|
753
|
+
import { memo as _$memo5 } from "@opentui/solid";
|
|
754
|
+
import { effect as _$effect7 } from "@opentui/solid";
|
|
755
|
+
import { insert as _$insert7 } from "@opentui/solid";
|
|
756
|
+
import { createTextNode as _$createTextNode7 } from "@opentui/solid";
|
|
757
|
+
import { insertNode as _$insertNode7 } from "@opentui/solid";
|
|
758
|
+
import { setProp as _$setProp7 } from "@opentui/solid";
|
|
759
|
+
import { createElement as _$createElement7 } from "@opentui/solid";
|
|
620
760
|
import { createSignal as createSignal3 } from "solid-js";
|
|
621
761
|
import { useKeyboard as useKeyboard3 } from "@opentui/solid";
|
|
622
|
-
import { jsxDEV as jsxDEV7 } from "@opentui/solid/jsx-dev-runtime";
|
|
623
762
|
var EditAppModal = (props) => {
|
|
624
763
|
const [name, setName] = createSignal3(props.entry.name ?? "");
|
|
625
764
|
const [command, setCommand] = createSignal3(props.entry.command ?? "");
|
|
626
765
|
const [args, setArgs] = createSignal3(props.entry.args ?? "");
|
|
627
766
|
const [cwd, setCwd] = createSignal3(props.entry.cwd ?? "");
|
|
628
767
|
const [focusedField, setFocusedField] = createSignal3("name");
|
|
629
|
-
const fields = [
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
768
|
+
const fields = [{
|
|
769
|
+
key: "name",
|
|
770
|
+
label: "Name",
|
|
771
|
+
value: name,
|
|
772
|
+
setValue: setName
|
|
773
|
+
}, {
|
|
774
|
+
key: "command",
|
|
775
|
+
label: "Command",
|
|
776
|
+
value: command,
|
|
777
|
+
setValue: setCommand
|
|
778
|
+
}, {
|
|
779
|
+
key: "args",
|
|
780
|
+
label: "Arguments",
|
|
781
|
+
value: args,
|
|
782
|
+
setValue: setArgs
|
|
783
|
+
}, {
|
|
784
|
+
key: "cwd",
|
|
785
|
+
label: "Directory",
|
|
786
|
+
value: cwd,
|
|
787
|
+
setValue: setCwd
|
|
788
|
+
}];
|
|
635
789
|
const focusIndex = () => fields.findIndex((field) => field.key === focusedField());
|
|
636
790
|
const setFocusByIndex = (index) => {
|
|
637
791
|
const clamped = Math.max(0, Math.min(fields.length - 1, index));
|
|
@@ -678,63 +832,68 @@ var EditAppModal = (props) => {
|
|
|
678
832
|
event.preventDefault();
|
|
679
833
|
}
|
|
680
834
|
});
|
|
681
|
-
return
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
835
|
+
return (() => {
|
|
836
|
+
var _el$ = _$createElement7("box"), _el$2 = _$createElement7("box"), _el$3 = _$createElement7("text"), _el$4 = _$createElement7("b"), _el$6 = _$createElement7("box"), _el$7 = _$createElement7("text");
|
|
837
|
+
_$insertNode7(_el$, _el$2);
|
|
838
|
+
_$insertNode7(_el$, _el$6);
|
|
839
|
+
_$setProp7(_el$, "position", "absolute");
|
|
840
|
+
_$setProp7(_el$, "top", "30%");
|
|
841
|
+
_$setProp7(_el$, "left", "25%");
|
|
842
|
+
_$setProp7(_el$, "width", "50%");
|
|
843
|
+
_$setProp7(_el$, "height", 12);
|
|
844
|
+
_$setProp7(_el$, "flexDirection", "column");
|
|
845
|
+
_$setProp7(_el$, "borderStyle", "double");
|
|
846
|
+
_$insertNode7(_el$2, _el$3);
|
|
847
|
+
_$setProp7(_el$2, "height", 1);
|
|
848
|
+
_$insertNode7(_el$3, _el$4);
|
|
849
|
+
_$insertNode7(_el$4, _$createTextNode7(` Edit App`));
|
|
850
|
+
_$insert7(_el$, () => fields.map((field) => {
|
|
851
|
+
const isFocused = () => focusedField() === field.key;
|
|
852
|
+
return (() => {
|
|
853
|
+
var _el$9 = _$createElement7("box"), _el$0 = _$createElement7("box"), _el$1 = _$createElement7("text"), _el$10 = _$createTextNode7(`:`), _el$11 = _$createElement7("text"), _el$12 = _$createTextNode7(` `);
|
|
854
|
+
_$insertNode7(_el$9, _el$0);
|
|
855
|
+
_$insertNode7(_el$9, _el$11);
|
|
856
|
+
_$setProp7(_el$9, "height", 1);
|
|
857
|
+
_$setProp7(_el$9, "flexDirection", "row");
|
|
858
|
+
_$insertNode7(_el$0, _el$1);
|
|
859
|
+
_$setProp7(_el$0, "width", 12);
|
|
860
|
+
_$insertNode7(_el$1, _el$10);
|
|
861
|
+
_$insert7(_el$1, () => field.label, _el$10);
|
|
862
|
+
_$insertNode7(_el$11, _el$12);
|
|
863
|
+
_$insert7(_el$11, () => field.value(), null);
|
|
864
|
+
_$insert7(_el$11, () => isFocused() ? "\u2588" : " ", null);
|
|
865
|
+
_$effect7((_p$) => {
|
|
866
|
+
var _v$5 = isFocused() ? props.theme.accent : props.theme.muted, _v$6 = isFocused() ? props.theme.foreground : props.theme.muted, _v$7 = isFocused() ? props.theme.primary : undefined;
|
|
867
|
+
_v$5 !== _p$.e && (_p$.e = _$setProp7(_el$1, "fg", _v$5, _p$.e));
|
|
868
|
+
_v$6 !== _p$.t && (_p$.t = _$setProp7(_el$11, "fg", _v$6, _p$.t));
|
|
869
|
+
_v$7 !== _p$.a && (_p$.a = _$setProp7(_el$11, "bg", _v$7, _p$.a));
|
|
870
|
+
return _p$;
|
|
871
|
+
}, {
|
|
872
|
+
e: undefined,
|
|
873
|
+
t: undefined,
|
|
874
|
+
a: undefined
|
|
875
|
+
});
|
|
876
|
+
return _el$9;
|
|
877
|
+
})();
|
|
878
|
+
}), _el$6);
|
|
879
|
+
_$insertNode7(_el$6, _el$7);
|
|
880
|
+
_$setProp7(_el$6, "height", 1);
|
|
881
|
+
_$insertNode7(_el$7, _$createTextNode7(`Enter:Save | Esc:Cancel | Tab:Next field`));
|
|
882
|
+
_$effect7((_p$) => {
|
|
883
|
+
var _v$ = props.theme.primary, _v$2 = props.theme.background, _v$3 = props.theme.accent, _v$4 = props.theme.muted;
|
|
884
|
+
_v$ !== _p$.e && (_p$.e = _$setProp7(_el$, "borderColor", _v$, _p$.e));
|
|
885
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp7(_el$, "backgroundColor", _v$2, _p$.t));
|
|
886
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp7(_el$3, "fg", _v$3, _p$.a));
|
|
887
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp7(_el$7, "fg", _v$4, _p$.o));
|
|
888
|
+
return _p$;
|
|
889
|
+
}, {
|
|
890
|
+
e: undefined,
|
|
891
|
+
t: undefined,
|
|
892
|
+
a: undefined,
|
|
893
|
+
o: undefined
|
|
894
|
+
});
|
|
895
|
+
return _el$;
|
|
896
|
+
})();
|
|
738
897
|
};
|
|
739
898
|
|
|
740
899
|
// src/stores/apps.ts
|
|
@@ -1245,7 +1404,6 @@ function debugLog(message) {
|
|
|
1245
1404
|
}
|
|
1246
1405
|
|
|
1247
1406
|
// src/app.tsx
|
|
1248
|
-
import { jsxDEV as jsxDEV8 } from "@opentui/solid/jsx-dev-runtime";
|
|
1249
1407
|
var App = (props) => {
|
|
1250
1408
|
const renderer = useRenderer();
|
|
1251
1409
|
const appsStore = createAppsStore(props.config.apps);
|
|
@@ -1261,19 +1419,28 @@ var App = (props) => {
|
|
|
1261
1419
|
const dims = terminalDims();
|
|
1262
1420
|
const cols = dims.width - props.config.tab_width - 2;
|
|
1263
1421
|
const rows = dims.height - 4;
|
|
1264
|
-
return {
|
|
1422
|
+
return {
|
|
1423
|
+
cols,
|
|
1424
|
+
rows
|
|
1425
|
+
};
|
|
1265
1426
|
};
|
|
1266
1427
|
const startApp = (entry) => {
|
|
1267
1428
|
if (tabsStore.store.runningApps.has(entry.id)) {
|
|
1268
1429
|
return;
|
|
1269
1430
|
}
|
|
1270
1431
|
const dims = terminalDims();
|
|
1271
|
-
const {
|
|
1432
|
+
const {
|
|
1433
|
+
cols,
|
|
1434
|
+
rows
|
|
1435
|
+
} = getPtyDimensions();
|
|
1272
1436
|
if (cols < 10 || rows < 3) {
|
|
1273
1437
|
console.warn(`Skipping start for ${entry.name}: invalid dimensions ${cols}x${rows}`);
|
|
1274
1438
|
return;
|
|
1275
1439
|
}
|
|
1276
|
-
const ptyProcess = spawnPty(entry, {
|
|
1440
|
+
const ptyProcess = spawnPty(entry, {
|
|
1441
|
+
cols,
|
|
1442
|
+
rows
|
|
1443
|
+
});
|
|
1277
1444
|
const runningApp = {
|
|
1278
1445
|
entry,
|
|
1279
1446
|
pty: ptyProcess,
|
|
@@ -1297,7 +1464,9 @@ var App = (props) => {
|
|
|
1297
1464
|
flushTimer = setTimeout(flushOutput, 50);
|
|
1298
1465
|
}
|
|
1299
1466
|
});
|
|
1300
|
-
ptyProcess.onExit(({
|
|
1467
|
+
ptyProcess.onExit(({
|
|
1468
|
+
exitCode
|
|
1469
|
+
}) => {
|
|
1301
1470
|
flushOutput();
|
|
1302
1471
|
if (exitCode === 0) {
|
|
1303
1472
|
tabsStore.updateAppStatus(entry.id, "stopped");
|
|
@@ -1331,7 +1500,9 @@ var App = (props) => {
|
|
|
1331
1500
|
return;
|
|
1332
1501
|
}
|
|
1333
1502
|
for (const id of runningIds) {
|
|
1334
|
-
stopApp(id, {
|
|
1503
|
+
stopApp(id, {
|
|
1504
|
+
silent: true
|
|
1505
|
+
});
|
|
1335
1506
|
}
|
|
1336
1507
|
tabsStore.setActiveTab(null);
|
|
1337
1508
|
if (options.showMessage) {
|
|
@@ -1393,7 +1564,10 @@ var App = (props) => {
|
|
|
1393
1564
|
restart_on_exit: entry.restartOnExit,
|
|
1394
1565
|
env: entry.env
|
|
1395
1566
|
}));
|
|
1396
|
-
const nextConfig = {
|
|
1567
|
+
const nextConfig = {
|
|
1568
|
+
...props.config,
|
|
1569
|
+
apps: nextApps
|
|
1570
|
+
};
|
|
1397
1571
|
props.config.apps = nextApps;
|
|
1398
1572
|
try {
|
|
1399
1573
|
await saveConfig(nextConfig);
|
|
@@ -1470,7 +1644,9 @@ var App = (props) => {
|
|
|
1470
1644
|
uiStore.showTemporaryMessage("No active app");
|
|
1471
1645
|
}
|
|
1472
1646
|
},
|
|
1473
|
-
kill_all: () => stopAllApps({
|
|
1647
|
+
kill_all: () => stopAllApps({
|
|
1648
|
+
showMessage: true
|
|
1649
|
+
}),
|
|
1474
1650
|
restart_app: () => {
|
|
1475
1651
|
const activeId = tabsStore.store.activeTabId;
|
|
1476
1652
|
if (activeId)
|
|
@@ -1489,7 +1665,9 @@ var App = (props) => {
|
|
|
1489
1665
|
timestamp: Date.now()
|
|
1490
1666
|
});
|
|
1491
1667
|
}
|
|
1492
|
-
stopAllApps({
|
|
1668
|
+
stopAllApps({
|
|
1669
|
+
showMessage: false
|
|
1670
|
+
});
|
|
1493
1671
|
renderer.destroy();
|
|
1494
1672
|
setTimeout(() => process.exit(0), 50);
|
|
1495
1673
|
}
|
|
@@ -1542,7 +1720,10 @@ var App = (props) => {
|
|
|
1542
1720
|
}
|
|
1543
1721
|
});
|
|
1544
1722
|
createEffect2(() => {
|
|
1545
|
-
const {
|
|
1723
|
+
const {
|
|
1724
|
+
cols,
|
|
1725
|
+
rows
|
|
1726
|
+
} = getPtyDimensions();
|
|
1546
1727
|
if (cols < 10 || rows < 3 || hasAutostarted()) {
|
|
1547
1728
|
return;
|
|
1548
1729
|
}
|
|
@@ -1565,7 +1746,10 @@ var App = (props) => {
|
|
|
1565
1746
|
}
|
|
1566
1747
|
});
|
|
1567
1748
|
createEffect2(() => {
|
|
1568
|
-
const {
|
|
1749
|
+
const {
|
|
1750
|
+
cols: termWidth,
|
|
1751
|
+
rows: termHeight
|
|
1752
|
+
} = getPtyDimensions();
|
|
1569
1753
|
if (termWidth < 10 || termHeight < 3) {
|
|
1570
1754
|
return;
|
|
1571
1755
|
}
|
|
@@ -1583,7 +1767,9 @@ var App = (props) => {
|
|
|
1583
1767
|
};
|
|
1584
1768
|
onCleanup(() => {
|
|
1585
1769
|
for (const [id] of tabsStore.store.runningApps) {
|
|
1586
|
-
stopApp(id, {
|
|
1770
|
+
stopApp(id, {
|
|
1771
|
+
silent: true
|
|
1772
|
+
});
|
|
1587
1773
|
}
|
|
1588
1774
|
});
|
|
1589
1775
|
const activeRunningApp = createMemo3(() => {
|
|
@@ -1595,58 +1781,100 @@ var App = (props) => {
|
|
|
1595
1781
|
const entry = id ? appsStore.getEntry(id) : undefined;
|
|
1596
1782
|
return entry;
|
|
1597
1783
|
});
|
|
1598
|
-
return
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1784
|
+
return (() => {
|
|
1785
|
+
var _el$ = _$createElement8("box"), _el$2 = _$createElement8("box");
|
|
1786
|
+
_$insertNode8(_el$, _el$2);
|
|
1787
|
+
_$setProp8(_el$, "flexDirection", "column");
|
|
1788
|
+
_$setProp8(_el$, "width", "100%");
|
|
1789
|
+
_$setProp8(_el$, "height", "100%");
|
|
1790
|
+
_$setProp8(_el$2, "flexDirection", "row");
|
|
1791
|
+
_$setProp8(_el$2, "flexGrow", 1);
|
|
1792
|
+
_$insert8(_el$2, _$createComponent5(TabList, {
|
|
1793
|
+
get entries() {
|
|
1794
|
+
return appsStore.store.entries;
|
|
1795
|
+
},
|
|
1796
|
+
get activeTabId() {
|
|
1797
|
+
return tabsStore.store.activeTabId;
|
|
1798
|
+
},
|
|
1799
|
+
get selectedIndex() {
|
|
1800
|
+
return selectedIndex();
|
|
1801
|
+
},
|
|
1802
|
+
getStatus: getAppStatus,
|
|
1803
|
+
get isFocused() {
|
|
1804
|
+
return tabsStore.store.focusMode === "tabs";
|
|
1805
|
+
},
|
|
1806
|
+
get width() {
|
|
1807
|
+
return props.config.tab_width;
|
|
1808
|
+
},
|
|
1809
|
+
get height() {
|
|
1810
|
+
return terminalDims().height - 1;
|
|
1811
|
+
},
|
|
1812
|
+
get scrollOffset() {
|
|
1813
|
+
return tabsStore.store.scrollOffset;
|
|
1814
|
+
},
|
|
1815
|
+
get theme() {
|
|
1816
|
+
return props.config.theme;
|
|
1817
|
+
},
|
|
1818
|
+
onSelect: handleSelectApp,
|
|
1819
|
+
onAddClick: () => uiStore.openModal("add-tab")
|
|
1820
|
+
}), null);
|
|
1821
|
+
_$insert8(_el$2, _$createComponent5(TerminalPane, {
|
|
1822
|
+
get runningApp() {
|
|
1823
|
+
return activeRunningApp();
|
|
1824
|
+
},
|
|
1825
|
+
get isFocused() {
|
|
1826
|
+
return tabsStore.store.focusMode === "terminal";
|
|
1827
|
+
},
|
|
1828
|
+
get width() {
|
|
1829
|
+
return terminalDims().width - props.config.tab_width;
|
|
1830
|
+
},
|
|
1831
|
+
get height() {
|
|
1832
|
+
return terminalDims().height - 1;
|
|
1833
|
+
},
|
|
1834
|
+
get theme() {
|
|
1835
|
+
return props.config.theme;
|
|
1836
|
+
},
|
|
1837
|
+
onInput: handleTerminalInput
|
|
1838
|
+
}), null);
|
|
1839
|
+
_$insert8(_el$, _$createComponent5(StatusBar, {
|
|
1840
|
+
get appName() {
|
|
1841
|
+
return activeRunningApp()?.entry.name ?? null;
|
|
1842
|
+
},
|
|
1843
|
+
get appStatus() {
|
|
1844
|
+
return activeRunningApp()?.status ?? null;
|
|
1845
|
+
},
|
|
1846
|
+
get focusMode() {
|
|
1847
|
+
return tabsStore.store.focusMode;
|
|
1848
|
+
},
|
|
1849
|
+
get message() {
|
|
1850
|
+
return uiStore.store.statusMessage;
|
|
1851
|
+
},
|
|
1852
|
+
get theme() {
|
|
1853
|
+
return props.config.theme;
|
|
1854
|
+
},
|
|
1855
|
+
get keybinds() {
|
|
1856
|
+
return {
|
|
1637
1857
|
toggle_focus: props.config.keybinds.toggle_focus,
|
|
1638
1858
|
command_palette: props.config.keybinds.command_palette,
|
|
1639
1859
|
edit_app: props.config.keybinds.edit_app,
|
|
1640
1860
|
stop_app: props.config.keybinds.stop_app,
|
|
1641
1861
|
kill_all: props.config.keybinds.kill_all,
|
|
1642
1862
|
quit: props.config.keybinds.quit
|
|
1643
|
-
}
|
|
1644
|
-
}
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1863
|
+
};
|
|
1864
|
+
}
|
|
1865
|
+
}), null);
|
|
1866
|
+
_$insert8(_el$, _$createComponent5(Show3, {
|
|
1867
|
+
get when() {
|
|
1868
|
+
return uiStore.store.activeModal === "command-palette";
|
|
1869
|
+
},
|
|
1870
|
+
get children() {
|
|
1871
|
+
return _$createComponent5(CommandPalette, {
|
|
1872
|
+
get entries() {
|
|
1873
|
+
return appsStore.store.entries;
|
|
1874
|
+
},
|
|
1875
|
+
get theme() {
|
|
1876
|
+
return props.config.theme;
|
|
1877
|
+
},
|
|
1650
1878
|
onSelect: (entry, action) => {
|
|
1651
1879
|
if (action === "edit") {
|
|
1652
1880
|
openEditModal(entry.id);
|
|
@@ -1664,44 +1892,60 @@ var App = (props) => {
|
|
|
1664
1892
|
}
|
|
1665
1893
|
},
|
|
1666
1894
|
onClose: () => uiStore.closeModal()
|
|
1667
|
-
}
|
|
1668
|
-
}
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1895
|
+
});
|
|
1896
|
+
}
|
|
1897
|
+
}), null);
|
|
1898
|
+
_$insert8(_el$, _$createComponent5(Show3, {
|
|
1899
|
+
get when() {
|
|
1900
|
+
return uiStore.store.activeModal === "add-tab";
|
|
1901
|
+
},
|
|
1902
|
+
get children() {
|
|
1903
|
+
return _$createComponent5(AddTabModal, {
|
|
1904
|
+
get theme() {
|
|
1905
|
+
return props.config.theme;
|
|
1906
|
+
},
|
|
1673
1907
|
onAdd: handleAddApp,
|
|
1674
1908
|
onClose: () => uiStore.closeModal()
|
|
1675
|
-
}
|
|
1676
|
-
}
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1909
|
+
});
|
|
1910
|
+
}
|
|
1911
|
+
}), null);
|
|
1912
|
+
_$insert8(_el$, _$createComponent5(Show3, {
|
|
1913
|
+
get when() {
|
|
1914
|
+
return _$memo6(() => uiStore.store.activeModal === "edit-app")() && editingEntry();
|
|
1915
|
+
},
|
|
1916
|
+
get children() {
|
|
1917
|
+
return _$createComponent5(EditAppModal, {
|
|
1918
|
+
get theme() {
|
|
1919
|
+
return props.config.theme;
|
|
1920
|
+
},
|
|
1921
|
+
get entry() {
|
|
1922
|
+
return editingEntry();
|
|
1923
|
+
},
|
|
1682
1924
|
onSave: (updates) => handleEditApp(editingEntry().id, updates),
|
|
1683
1925
|
onClose: () => {
|
|
1684
1926
|
uiStore.closeModal();
|
|
1685
1927
|
setEditingEntryId(null);
|
|
1686
1928
|
}
|
|
1687
|
-
}
|
|
1688
|
-
}
|
|
1689
|
-
|
|
1690
|
-
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1931
|
+
}), null);
|
|
1932
|
+
return _el$;
|
|
1933
|
+
})();
|
|
1691
1934
|
};
|
|
1692
1935
|
|
|
1693
1936
|
// src/index.tsx
|
|
1694
|
-
|
|
1695
|
-
|
|
1937
|
+
extend({
|
|
1938
|
+
"ghostty-terminal": GhosttyTerminalRenderable
|
|
1939
|
+
});
|
|
1696
1940
|
async function main() {
|
|
1697
1941
|
try {
|
|
1698
1942
|
const config = await loadConfig();
|
|
1699
1943
|
initSessionPath(config);
|
|
1700
1944
|
const session = config.session.persist ? await restoreSession() : null;
|
|
1701
|
-
await render(() =>
|
|
1945
|
+
await render(() => _$createComponent6(App, {
|
|
1702
1946
|
config,
|
|
1703
1947
|
session
|
|
1704
|
-
}
|
|
1948
|
+
}));
|
|
1705
1949
|
const handleShutdown = () => {
|
|
1706
1950
|
console.log(`
|
|
1707
1951
|
Shutting down tuidoscope...`);
|