tuidoscope 0.1.6 → 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/dist/index.js +704 -461
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
3
|
// src/index.tsx
|
|
4
|
+
import { createComponent as _$createComponent6 } from "@opentui/solid";
|
|
4
5
|
import { render, extend } from "@opentui/solid";
|
|
5
6
|
import { GhosttyTerminalRenderable } from "ghostty-opentui/terminal-buffer";
|
|
6
7
|
|
|
7
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";
|
|
8
15
|
import { Show as Show3, createSignal as createSignal4, createEffect as createEffect2, onCleanup, createMemo as createMemo3 } from "solid-js";
|
|
9
16
|
import { useKeyboard as useKeyboard4, useTerminalDimensions, useRenderer } from "@opentui/solid";
|
|
10
17
|
|
|
11
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";
|
|
12
27
|
import { For, createMemo } from "solid-js";
|
|
13
28
|
|
|
14
29
|
// src/components/TabItem.tsx
|
|
15
|
-
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";
|
|
16
37
|
function getStatusIndicator(status) {
|
|
17
38
|
switch (status) {
|
|
18
39
|
case "running":
|
|
@@ -56,32 +77,43 @@ var TabItem = (props) => {
|
|
|
56
77
|
}
|
|
57
78
|
return props.theme.foreground;
|
|
58
79
|
};
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
+
})();
|
|
81
114
|
};
|
|
82
115
|
|
|
83
116
|
// src/components/TabList.tsx
|
|
84
|
-
import { jsxDEV as jsxDEV2 } from "@opentui/solid/jsx-dev-runtime";
|
|
85
117
|
var TabList = (props) => {
|
|
86
118
|
const visibleHeight = () => props.height - 2;
|
|
87
119
|
const visibleEntries = createMemo(() => {
|
|
@@ -91,126 +123,176 @@ var TabList = (props) => {
|
|
|
91
123
|
});
|
|
92
124
|
const hasScrollUp = () => props.scrollOffset > 0;
|
|
93
125
|
const hasScrollDown = () => props.scrollOffset + visibleHeight() < props.entries.length;
|
|
94
|
-
return
|
|
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
|
-
|
|
144
|
-
|
|
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
|
+
})();
|
|
145
194
|
};
|
|
146
195
|
|
|
147
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";
|
|
148
204
|
import { Show } from "solid-js";
|
|
149
|
-
import { jsxDEV as jsxDEV3 } from "@opentui/solid/jsx-dev-runtime";
|
|
150
205
|
var TerminalPane = (props) => {
|
|
151
206
|
const contentWidth = () => Math.max(1, props.width - 2);
|
|
152
207
|
const contentHeight = () => Math.max(1, props.height - 3);
|
|
153
|
-
return
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
borderStyle
|
|
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
|
-
|
|
194
|
-
}, undefined, true, undefined, this),
|
|
195
|
-
/* @__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 = {
|
|
196
249
|
width: contentWidth(),
|
|
197
|
-
height: contentHeight()
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
+
})();
|
|
211
285
|
};
|
|
212
286
|
|
|
213
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";
|
|
214
296
|
import { Show as Show2 } from "solid-js";
|
|
215
297
|
|
|
216
298
|
// src/lib/keybinds.ts
|
|
@@ -269,74 +351,84 @@ function formatKeybind(keybind) {
|
|
|
269
351
|
}
|
|
270
352
|
|
|
271
353
|
// src/components/StatusBar.tsx
|
|
272
|
-
import { jsxDEV as jsxDEV4 } from "@opentui/solid/jsx-dev-runtime";
|
|
273
354
|
var StatusBar = (props) => {
|
|
274
|
-
return
|
|
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
|
-
|
|
336
|
-
|
|
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
|
+
})();
|
|
337
422
|
};
|
|
338
423
|
|
|
339
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";
|
|
340
432
|
import { For as For2, createSignal, createMemo as createMemo2, createEffect } from "solid-js";
|
|
341
433
|
import { useKeyboard } from "@opentui/solid";
|
|
342
434
|
|
|
@@ -375,7 +467,6 @@ function buildEntryCommand(entry) {
|
|
|
375
467
|
}
|
|
376
468
|
|
|
377
469
|
// src/components/CommandPalette.tsx
|
|
378
|
-
import { jsxDEV as jsxDEV5 } from "@opentui/solid/jsx-dev-runtime";
|
|
379
470
|
var CommandPalette = (props) => {
|
|
380
471
|
const [query, setQuery] = createSignal("");
|
|
381
472
|
const [selectedIndex, setSelectedIndex] = createSignal(0);
|
|
@@ -437,80 +528,116 @@ var CommandPalette = (props) => {
|
|
|
437
528
|
results();
|
|
438
529
|
setSelectedIndex(0);
|
|
439
530
|
});
|
|
440
|
-
return
|
|
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
|
-
|
|
495
|
-
|
|
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
|
+
})();
|
|
496
602
|
};
|
|
497
603
|
|
|
498
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";
|
|
499
612
|
import { createSignal as createSignal2 } from "solid-js";
|
|
500
613
|
import { useKeyboard as useKeyboard2 } from "@opentui/solid";
|
|
501
|
-
import { jsxDEV as jsxDEV6 } from "@opentui/solid/jsx-dev-runtime";
|
|
502
614
|
var AddTabModal = (props) => {
|
|
503
615
|
const [name, setName] = createSignal2("");
|
|
504
616
|
const [command, setCommand] = createSignal2("");
|
|
505
617
|
const [args, setArgs] = createSignal2("");
|
|
506
618
|
const [cwd, setCwd] = createSignal2("~");
|
|
507
619
|
const [focusedField, setFocusedField] = createSignal2("name");
|
|
508
|
-
const fields = [
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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
|
+
}];
|
|
514
641
|
const focusIndex = () => fields.findIndex((field) => field.key === focusedField());
|
|
515
642
|
const setFocusByIndex = (index) => {
|
|
516
643
|
const clamped = Math.max(0, Math.min(fields.length - 1, index));
|
|
@@ -558,81 +685,107 @@ var AddTabModal = (props) => {
|
|
|
558
685
|
event.preventDefault();
|
|
559
686
|
}
|
|
560
687
|
});
|
|
561
|
-
return
|
|
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
|
-
|
|
617
|
-
|
|
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
|
+
})();
|
|
618
750
|
};
|
|
619
751
|
|
|
620
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";
|
|
621
760
|
import { createSignal as createSignal3 } from "solid-js";
|
|
622
761
|
import { useKeyboard as useKeyboard3 } from "@opentui/solid";
|
|
623
|
-
import { jsxDEV as jsxDEV7 } from "@opentui/solid/jsx-dev-runtime";
|
|
624
762
|
var EditAppModal = (props) => {
|
|
625
763
|
const [name, setName] = createSignal3(props.entry.name ?? "");
|
|
626
764
|
const [command, setCommand] = createSignal3(props.entry.command ?? "");
|
|
627
765
|
const [args, setArgs] = createSignal3(props.entry.args ?? "");
|
|
628
766
|
const [cwd, setCwd] = createSignal3(props.entry.cwd ?? "");
|
|
629
767
|
const [focusedField, setFocusedField] = createSignal3("name");
|
|
630
|
-
const fields = [
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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
|
+
}];
|
|
636
789
|
const focusIndex = () => fields.findIndex((field) => field.key === focusedField());
|
|
637
790
|
const setFocusByIndex = (index) => {
|
|
638
791
|
const clamped = Math.max(0, Math.min(fields.length - 1, index));
|
|
@@ -679,63 +832,68 @@ var EditAppModal = (props) => {
|
|
|
679
832
|
event.preventDefault();
|
|
680
833
|
}
|
|
681
834
|
});
|
|
682
|
-
return
|
|
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
|
-
|
|
738
|
-
|
|
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
|
+
})();
|
|
739
897
|
};
|
|
740
898
|
|
|
741
899
|
// src/stores/apps.ts
|
|
@@ -1246,7 +1404,6 @@ function debugLog(message) {
|
|
|
1246
1404
|
}
|
|
1247
1405
|
|
|
1248
1406
|
// src/app.tsx
|
|
1249
|
-
import { jsxDEV as jsxDEV8 } from "@opentui/solid/jsx-dev-runtime";
|
|
1250
1407
|
var App = (props) => {
|
|
1251
1408
|
const renderer = useRenderer();
|
|
1252
1409
|
const appsStore = createAppsStore(props.config.apps);
|
|
@@ -1262,19 +1419,28 @@ var App = (props) => {
|
|
|
1262
1419
|
const dims = terminalDims();
|
|
1263
1420
|
const cols = dims.width - props.config.tab_width - 2;
|
|
1264
1421
|
const rows = dims.height - 4;
|
|
1265
|
-
return {
|
|
1422
|
+
return {
|
|
1423
|
+
cols,
|
|
1424
|
+
rows
|
|
1425
|
+
};
|
|
1266
1426
|
};
|
|
1267
1427
|
const startApp = (entry) => {
|
|
1268
1428
|
if (tabsStore.store.runningApps.has(entry.id)) {
|
|
1269
1429
|
return;
|
|
1270
1430
|
}
|
|
1271
1431
|
const dims = terminalDims();
|
|
1272
|
-
const {
|
|
1432
|
+
const {
|
|
1433
|
+
cols,
|
|
1434
|
+
rows
|
|
1435
|
+
} = getPtyDimensions();
|
|
1273
1436
|
if (cols < 10 || rows < 3) {
|
|
1274
1437
|
console.warn(`Skipping start for ${entry.name}: invalid dimensions ${cols}x${rows}`);
|
|
1275
1438
|
return;
|
|
1276
1439
|
}
|
|
1277
|
-
const ptyProcess = spawnPty(entry, {
|
|
1440
|
+
const ptyProcess = spawnPty(entry, {
|
|
1441
|
+
cols,
|
|
1442
|
+
rows
|
|
1443
|
+
});
|
|
1278
1444
|
const runningApp = {
|
|
1279
1445
|
entry,
|
|
1280
1446
|
pty: ptyProcess,
|
|
@@ -1298,7 +1464,9 @@ var App = (props) => {
|
|
|
1298
1464
|
flushTimer = setTimeout(flushOutput, 50);
|
|
1299
1465
|
}
|
|
1300
1466
|
});
|
|
1301
|
-
ptyProcess.onExit(({
|
|
1467
|
+
ptyProcess.onExit(({
|
|
1468
|
+
exitCode
|
|
1469
|
+
}) => {
|
|
1302
1470
|
flushOutput();
|
|
1303
1471
|
if (exitCode === 0) {
|
|
1304
1472
|
tabsStore.updateAppStatus(entry.id, "stopped");
|
|
@@ -1332,7 +1500,9 @@ var App = (props) => {
|
|
|
1332
1500
|
return;
|
|
1333
1501
|
}
|
|
1334
1502
|
for (const id of runningIds) {
|
|
1335
|
-
stopApp(id, {
|
|
1503
|
+
stopApp(id, {
|
|
1504
|
+
silent: true
|
|
1505
|
+
});
|
|
1336
1506
|
}
|
|
1337
1507
|
tabsStore.setActiveTab(null);
|
|
1338
1508
|
if (options.showMessage) {
|
|
@@ -1394,7 +1564,10 @@ var App = (props) => {
|
|
|
1394
1564
|
restart_on_exit: entry.restartOnExit,
|
|
1395
1565
|
env: entry.env
|
|
1396
1566
|
}));
|
|
1397
|
-
const nextConfig = {
|
|
1567
|
+
const nextConfig = {
|
|
1568
|
+
...props.config,
|
|
1569
|
+
apps: nextApps
|
|
1570
|
+
};
|
|
1398
1571
|
props.config.apps = nextApps;
|
|
1399
1572
|
try {
|
|
1400
1573
|
await saveConfig(nextConfig);
|
|
@@ -1471,7 +1644,9 @@ var App = (props) => {
|
|
|
1471
1644
|
uiStore.showTemporaryMessage("No active app");
|
|
1472
1645
|
}
|
|
1473
1646
|
},
|
|
1474
|
-
kill_all: () => stopAllApps({
|
|
1647
|
+
kill_all: () => stopAllApps({
|
|
1648
|
+
showMessage: true
|
|
1649
|
+
}),
|
|
1475
1650
|
restart_app: () => {
|
|
1476
1651
|
const activeId = tabsStore.store.activeTabId;
|
|
1477
1652
|
if (activeId)
|
|
@@ -1490,7 +1665,9 @@ var App = (props) => {
|
|
|
1490
1665
|
timestamp: Date.now()
|
|
1491
1666
|
});
|
|
1492
1667
|
}
|
|
1493
|
-
stopAllApps({
|
|
1668
|
+
stopAllApps({
|
|
1669
|
+
showMessage: false
|
|
1670
|
+
});
|
|
1494
1671
|
renderer.destroy();
|
|
1495
1672
|
setTimeout(() => process.exit(0), 50);
|
|
1496
1673
|
}
|
|
@@ -1543,7 +1720,10 @@ var App = (props) => {
|
|
|
1543
1720
|
}
|
|
1544
1721
|
});
|
|
1545
1722
|
createEffect2(() => {
|
|
1546
|
-
const {
|
|
1723
|
+
const {
|
|
1724
|
+
cols,
|
|
1725
|
+
rows
|
|
1726
|
+
} = getPtyDimensions();
|
|
1547
1727
|
if (cols < 10 || rows < 3 || hasAutostarted()) {
|
|
1548
1728
|
return;
|
|
1549
1729
|
}
|
|
@@ -1566,7 +1746,10 @@ var App = (props) => {
|
|
|
1566
1746
|
}
|
|
1567
1747
|
});
|
|
1568
1748
|
createEffect2(() => {
|
|
1569
|
-
const {
|
|
1749
|
+
const {
|
|
1750
|
+
cols: termWidth,
|
|
1751
|
+
rows: termHeight
|
|
1752
|
+
} = getPtyDimensions();
|
|
1570
1753
|
if (termWidth < 10 || termHeight < 3) {
|
|
1571
1754
|
return;
|
|
1572
1755
|
}
|
|
@@ -1584,7 +1767,9 @@ var App = (props) => {
|
|
|
1584
1767
|
};
|
|
1585
1768
|
onCleanup(() => {
|
|
1586
1769
|
for (const [id] of tabsStore.store.runningApps) {
|
|
1587
|
-
stopApp(id, {
|
|
1770
|
+
stopApp(id, {
|
|
1771
|
+
silent: true
|
|
1772
|
+
});
|
|
1588
1773
|
}
|
|
1589
1774
|
});
|
|
1590
1775
|
const activeRunningApp = createMemo3(() => {
|
|
@@ -1596,58 +1781,100 @@ var App = (props) => {
|
|
|
1596
1781
|
const entry = id ? appsStore.getEntry(id) : undefined;
|
|
1597
1782
|
return entry;
|
|
1598
1783
|
});
|
|
1599
|
-
return
|
|
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
|
-
|
|
1637
|
-
|
|
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 {
|
|
1638
1857
|
toggle_focus: props.config.keybinds.toggle_focus,
|
|
1639
1858
|
command_palette: props.config.keybinds.command_palette,
|
|
1640
1859
|
edit_app: props.config.keybinds.edit_app,
|
|
1641
1860
|
stop_app: props.config.keybinds.stop_app,
|
|
1642
1861
|
kill_all: props.config.keybinds.kill_all,
|
|
1643
1862
|
quit: props.config.keybinds.quit
|
|
1644
|
-
}
|
|
1645
|
-
}
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
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
|
+
},
|
|
1651
1878
|
onSelect: (entry, action) => {
|
|
1652
1879
|
if (action === "edit") {
|
|
1653
1880
|
openEditModal(entry.id);
|
|
@@ -1665,44 +1892,60 @@ var App = (props) => {
|
|
|
1665
1892
|
}
|
|
1666
1893
|
},
|
|
1667
1894
|
onClose: () => uiStore.closeModal()
|
|
1668
|
-
}
|
|
1669
|
-
}
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
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
|
+
},
|
|
1674
1907
|
onAdd: handleAddApp,
|
|
1675
1908
|
onClose: () => uiStore.closeModal()
|
|
1676
|
-
}
|
|
1677
|
-
}
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
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
|
+
},
|
|
1683
1924
|
onSave: (updates) => handleEditApp(editingEntry().id, updates),
|
|
1684
1925
|
onClose: () => {
|
|
1685
1926
|
uiStore.closeModal();
|
|
1686
1927
|
setEditingEntryId(null);
|
|
1687
1928
|
}
|
|
1688
|
-
}
|
|
1689
|
-
}
|
|
1690
|
-
|
|
1691
|
-
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1931
|
+
}), null);
|
|
1932
|
+
return _el$;
|
|
1933
|
+
})();
|
|
1692
1934
|
};
|
|
1693
1935
|
|
|
1694
1936
|
// src/index.tsx
|
|
1695
|
-
|
|
1696
|
-
|
|
1937
|
+
extend({
|
|
1938
|
+
"ghostty-terminal": GhosttyTerminalRenderable
|
|
1939
|
+
});
|
|
1697
1940
|
async function main() {
|
|
1698
1941
|
try {
|
|
1699
1942
|
const config = await loadConfig();
|
|
1700
1943
|
initSessionPath(config);
|
|
1701
1944
|
const session = config.session.persist ? await restoreSession() : null;
|
|
1702
|
-
await render(() =>
|
|
1945
|
+
await render(() => _$createComponent6(App, {
|
|
1703
1946
|
config,
|
|
1704
1947
|
session
|
|
1705
|
-
}
|
|
1948
|
+
}));
|
|
1706
1949
|
const handleShutdown = () => {
|
|
1707
1950
|
console.log(`
|
|
1708
1951
|
Shutting down tuidoscope...`);
|