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.
Files changed (3) hide show
  1. package/README.md +34 -4
  2. package/dist/index.js +705 -461
  3. 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 { jsxDEV } from "@opentui/solid/jsx-dev-runtime";
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 /* @__PURE__ */ jsxDEV("box", {
59
- height: 1,
60
- width: props.width,
61
- flexDirection: "row",
62
- onMouseDown: props.onSelect,
63
- children: [
64
- /* @__PURE__ */ jsxDEV("text", {
65
- fg: getStatusColor(props.status, props.theme),
66
- children: getStatusIndicator(props.status)
67
- }, undefined, false, undefined, this),
68
- /* @__PURE__ */ jsxDEV("text", {
69
- children: " "
70
- }, undefined, false, undefined, this),
71
- /* @__PURE__ */ jsxDEV("text", {
72
- fg: fgColor(),
73
- bg: bgColor(),
74
- children: props.isActive ? /* @__PURE__ */ jsxDEV("b", {
75
- children: truncatedName()
76
- }, undefined, false, undefined, this) : truncatedName()
77
- }, undefined, false, undefined, this)
78
- ]
79
- }, undefined, true, undefined, this);
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 /* @__PURE__ */ jsxDEV2("box", {
94
- flexDirection: "column",
95
- width: props.width,
96
- height: props.height,
97
- borderStyle: "single",
98
- borderColor: props.isFocused ? props.theme.primary : props.theme.muted,
99
- children: [
100
- /* @__PURE__ */ jsxDEV2("box", {
101
- height: 1,
102
- width: props.width - 2,
103
- children: /* @__PURE__ */ jsxDEV2("text", {
104
- fg: props.theme.accent,
105
- children: /* @__PURE__ */ jsxDEV2("b", {
106
- children: [
107
- "Apps ",
108
- hasScrollUp() ? "\u25B2" : " ",
109
- hasScrollDown() ? "\u25BC" : " "
110
- ]
111
- }, undefined, true, undefined, this)
112
- }, undefined, false, undefined, this)
113
- }, undefined, false, undefined, this),
114
- /* @__PURE__ */ jsxDEV2("box", {
115
- flexDirection: "column",
116
- flexGrow: 1,
117
- children: /* @__PURE__ */ jsxDEV2(For, {
118
- each: visibleEntries(),
119
- children: (entry, index) => {
120
- const actualIndex = () => props.scrollOffset + index();
121
- return /* @__PURE__ */ jsxDEV2(TabItem, {
122
- entry,
123
- status: props.getStatus(entry.id),
124
- isActive: entry.id === props.activeTabId,
125
- isFocused: props.isFocused && actualIndex() === props.selectedIndex,
126
- width: props.width - 2,
127
- theme: props.theme,
128
- onSelect: () => props.onSelect(entry.id)
129
- }, undefined, false, undefined, this);
130
- }
131
- }, undefined, false, undefined, this)
132
- }, undefined, false, undefined, this),
133
- /* @__PURE__ */ jsxDEV2("box", {
134
- height: 1,
135
- width: props.width - 2,
136
- onMouseDown: props.onAddClick,
137
- children: /* @__PURE__ */ jsxDEV2("text", {
138
- fg: props.theme.muted,
139
- children: "[+ Add]"
140
- }, undefined, false, undefined, this)
141
- }, undefined, false, undefined, this)
142
- ]
143
- }, undefined, true, undefined, this);
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 /* @__PURE__ */ jsxDEV3("box", {
153
- flexDirection: "column",
154
- flexGrow: 1,
155
- height: props.height,
156
- borderStyle: "single",
157
- borderColor: props.isFocused ? props.theme.primary : props.theme.muted,
158
- children: /* @__PURE__ */ jsxDEV3(Show, {
159
- when: props.runningApp,
160
- fallback: /* @__PURE__ */ jsxDEV3("box", {
161
- flexGrow: 1,
162
- justifyContent: "center",
163
- alignItems: "center",
164
- children: /* @__PURE__ */ jsxDEV3("text", {
165
- fg: props.theme.muted,
166
- children: "No app selected. Press Ctrl+T to add one."
167
- }, undefined, false, undefined, this)
168
- }, undefined, false, undefined, this),
169
- children: (app) => /* @__PURE__ */ jsxDEV3("box", {
170
- flexDirection: "column",
171
- flexGrow: 1,
172
- children: [
173
- /* @__PURE__ */ jsxDEV3("box", {
174
- height: 1,
175
- flexDirection: "row",
176
- children: [
177
- /* @__PURE__ */ jsxDEV3("text", {
178
- fg: props.theme.accent,
179
- children: /* @__PURE__ */ jsxDEV3("b", {
180
- children: app().entry.name
181
- }, undefined, false, undefined, this)
182
- }, undefined, false, undefined, this),
183
- /* @__PURE__ */ jsxDEV3("text", {
184
- fg: props.theme.muted,
185
- children: [
186
- " ",
187
- "(",
188
- app().status,
189
- ")"
190
- ]
191
- }, undefined, true, undefined, this)
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
- overflow: "hidden",
198
- children: /* @__PURE__ */ jsxDEV3("ghostty-terminal", {
199
- ansi: app().buffer,
200
- cols: contentWidth(),
201
- rows: contentHeight(),
202
- showCursor: true,
203
- style: { width: contentWidth(), height: contentHeight() }
204
- }, undefined, false, undefined, this)
205
- }, undefined, false, undefined, this)
206
- ]
207
- }, undefined, true, undefined, this)
208
- }, undefined, false, undefined, this)
209
- }, undefined, false, undefined, this);
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 /* @__PURE__ */ jsxDEV4("box", {
274
- height: 1,
275
- flexDirection: "row",
276
- backgroundColor: props.theme.muted,
277
- children: [
278
- /* @__PURE__ */ jsxDEV4("box", {
279
- flexGrow: 1,
280
- children: /* @__PURE__ */ jsxDEV4("text", {
281
- fg: props.theme.foreground,
282
- children: [
283
- " ",
284
- formatKeybind(props.keybinds.toggle_focus),
285
- ":Focus",
286
- " | ",
287
- formatKeybind(props.keybinds.command_palette),
288
- ":Palette",
289
- " | ",
290
- formatKeybind(props.keybinds.edit_app),
291
- ":Edit",
292
- " | ",
293
- formatKeybind(props.keybinds.stop_app),
294
- ":Stop",
295
- " | ",
296
- formatKeybind(props.keybinds.kill_all),
297
- ":KillAll",
298
- " | ",
299
- formatKeybind(props.keybinds.quit),
300
- ":Quit"
301
- ]
302
- }, undefined, true, undefined, this)
303
- }, undefined, false, undefined, this),
304
- /* @__PURE__ */ jsxDEV4("box", {
305
- children: /* @__PURE__ */ jsxDEV4(Show2, {
306
- when: props.message,
307
- fallback: /* @__PURE__ */ jsxDEV4(Show2, {
308
- when: props.appName,
309
- children: /* @__PURE__ */ jsxDEV4("text", {
310
- fg: props.theme.accent,
311
- children: [
312
- props.appName,
313
- props.appStatus ? ` (${props.appStatus})` : ""
314
- ]
315
- }, undefined, true, undefined, this)
316
- }, undefined, false, undefined, this),
317
- children: /* @__PURE__ */ jsxDEV4("text", {
318
- fg: props.theme.accent,
319
- children: /* @__PURE__ */ jsxDEV4("b", {
320
- children: props.message
321
- }, undefined, false, undefined, this)
322
- }, undefined, false, undefined, this)
323
- }, undefined, false, undefined, this)
324
- }, undefined, false, undefined, this),
325
- /* @__PURE__ */ jsxDEV4("box", {
326
- children: /* @__PURE__ */ jsxDEV4("text", {
327
- fg: props.theme.foreground,
328
- children: [
329
- props.focusMode === "terminal" ? "[TERMINAL]" : "[TABS]",
330
- " "
331
- ]
332
- }, undefined, true, undefined, this)
333
- }, undefined, false, undefined, this)
334
- ]
335
- }, undefined, true, undefined, this);
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 /* @__PURE__ */ jsxDEV5("box", {
440
- position: "absolute",
441
- top: "20%",
442
- left: "20%",
443
- width: "60%",
444
- height: "60%",
445
- flexDirection: "column",
446
- borderStyle: "double",
447
- borderColor: props.theme.primary,
448
- backgroundColor: props.theme.background,
449
- children: [
450
- /* @__PURE__ */ jsxDEV5("box", {
451
- height: 1,
452
- flexDirection: "row",
453
- borderStyle: "single",
454
- borderColor: props.theme.muted,
455
- children: /* @__PURE__ */ jsxDEV5("text", {
456
- fg: props.theme.foreground,
457
- children: `> ${query()}\u2588`
458
- }, undefined, false, undefined, this)
459
- }, undefined, false, undefined, this),
460
- /* @__PURE__ */ jsxDEV5("box", {
461
- flexDirection: "column",
462
- flexGrow: 1,
463
- overflow: "hidden",
464
- children: /* @__PURE__ */ jsxDEV5(For2, {
465
- each: results().slice(0, 10),
466
- children: (result, index) => /* @__PURE__ */ jsxDEV5("box", {
467
- height: 1,
468
- width: "100%",
469
- flexDirection: "row",
470
- backgroundColor: index() === selectedIndex() ? props.theme.primary : props.theme.background,
471
- onMouseDown: () => props.onSelect(result.item, "switch"),
472
- children: /* @__PURE__ */ jsxDEV5("text", {
473
- width: "100%",
474
- fg: index() === selectedIndex() ? props.theme.background : props.theme.foreground,
475
- bg: index() === selectedIndex() ? props.theme.primary : props.theme.background,
476
- children: [
477
- " ",
478
- `${result.item.name} - ${buildEntryCommand(result.item)}`
479
- ]
480
- }, undefined, true, undefined, this)
481
- }, undefined, false, undefined, this)
482
- }, undefined, false, undefined, this)
483
- }, undefined, false, undefined, this),
484
- /* @__PURE__ */ jsxDEV5("box", {
485
- height: 1,
486
- borderStyle: "single",
487
- borderColor: props.theme.muted,
488
- children: /* @__PURE__ */ jsxDEV5("text", {
489
- fg: props.theme.muted,
490
- children: "Enter:Select | x:Stop | Ctrl+E:Edit | Esc:Close | \u2191\u2193:Navigate"
491
- }, undefined, false, undefined, this)
492
- }, undefined, false, undefined, this)
493
- ]
494
- }, undefined, true, undefined, this);
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
- { key: "name", label: "Name", value: name, setValue: setName },
509
- { key: "command", label: "Command", value: command, setValue: setCommand },
510
- { key: "args", label: "Arguments", value: args, setValue: setArgs },
511
- { key: "cwd", label: "Directory", value: cwd, setValue: setCwd }
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 /* @__PURE__ */ jsxDEV6("box", {
561
- position: "absolute",
562
- top: "30%",
563
- left: "25%",
564
- width: "50%",
565
- height: 11,
566
- flexDirection: "column",
567
- borderStyle: "double",
568
- borderColor: props.theme.primary,
569
- backgroundColor: props.theme.background,
570
- children: [
571
- /* @__PURE__ */ jsxDEV6("box", {
572
- height: 1,
573
- children: /* @__PURE__ */ jsxDEV6("text", {
574
- fg: props.theme.accent,
575
- children: /* @__PURE__ */ jsxDEV6("b", {
576
- children: " Add New App"
577
- }, undefined, false, undefined, this)
578
- }, undefined, false, undefined, this)
579
- }, undefined, false, undefined, this),
580
- fields.map((field) => {
581
- const isFocused = () => focusedField() === field.key;
582
- return /* @__PURE__ */ jsxDEV6("box", {
583
- height: 1,
584
- flexDirection: "row",
585
- children: [
586
- /* @__PURE__ */ jsxDEV6("box", {
587
- width: 12,
588
- children: /* @__PURE__ */ jsxDEV6("text", {
589
- fg: isFocused() ? props.theme.accent : props.theme.muted,
590
- children: [
591
- field.label,
592
- ":"
593
- ]
594
- }, undefined, true, undefined, this)
595
- }, undefined, false, undefined, this),
596
- /* @__PURE__ */ jsxDEV6("text", {
597
- fg: isFocused() ? props.theme.foreground : props.theme.muted,
598
- bg: isFocused() ? props.theme.primary : undefined,
599
- children: [
600
- " ",
601
- field.value(),
602
- isFocused() ? "\u2588" : " "
603
- ]
604
- }, undefined, true, undefined, this)
605
- ]
606
- }, undefined, true, undefined, this);
607
- }),
608
- /* @__PURE__ */ jsxDEV6("box", {
609
- height: 1,
610
- children: /* @__PURE__ */ jsxDEV6("text", {
611
- fg: props.theme.muted,
612
- children: "Enter:Add | Esc:Cancel | Tab:Next field"
613
- }, undefined, false, undefined, this)
614
- }, undefined, false, undefined, this)
615
- ]
616
- }, undefined, true, undefined, this);
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
- { key: "name", label: "Name", value: name, setValue: setName },
631
- { key: "command", label: "Command", value: command, setValue: setCommand },
632
- { key: "args", label: "Arguments", value: args, setValue: setArgs },
633
- { key: "cwd", label: "Directory", value: cwd, setValue: setCwd }
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 /* @__PURE__ */ jsxDEV7("box", {
682
- position: "absolute",
683
- top: "30%",
684
- left: "25%",
685
- width: "50%",
686
- height: 12,
687
- flexDirection: "column",
688
- borderStyle: "double",
689
- borderColor: props.theme.primary,
690
- backgroundColor: props.theme.background,
691
- children: [
692
- /* @__PURE__ */ jsxDEV7("box", {
693
- height: 1,
694
- children: /* @__PURE__ */ jsxDEV7("text", {
695
- fg: props.theme.accent,
696
- children: /* @__PURE__ */ jsxDEV7("b", {
697
- children: " Edit App"
698
- }, undefined, false, undefined, this)
699
- }, undefined, false, undefined, this)
700
- }, undefined, false, undefined, this),
701
- fields.map((field) => {
702
- const isFocused = () => focusedField() === field.key;
703
- return /* @__PURE__ */ jsxDEV7("box", {
704
- height: 1,
705
- flexDirection: "row",
706
- children: [
707
- /* @__PURE__ */ jsxDEV7("box", {
708
- width: 12,
709
- children: /* @__PURE__ */ jsxDEV7("text", {
710
- fg: isFocused() ? props.theme.accent : props.theme.muted,
711
- children: [
712
- field.label,
713
- ":"
714
- ]
715
- }, undefined, true, undefined, this)
716
- }, undefined, false, undefined, this),
717
- /* @__PURE__ */ jsxDEV7("text", {
718
- fg: isFocused() ? props.theme.foreground : props.theme.muted,
719
- bg: isFocused() ? props.theme.primary : undefined,
720
- children: [
721
- " ",
722
- field.value(),
723
- isFocused() ? "\u2588" : " "
724
- ]
725
- }, undefined, true, undefined, this)
726
- ]
727
- }, undefined, true, undefined, this);
728
- }),
729
- /* @__PURE__ */ jsxDEV7("box", {
730
- height: 1,
731
- children: /* @__PURE__ */ jsxDEV7("text", {
732
- fg: props.theme.muted,
733
- children: "Enter:Save | Esc:Cancel | Tab:Next field"
734
- }, undefined, false, undefined, this)
735
- }, undefined, false, undefined, this)
736
- ]
737
- }, undefined, true, undefined, this);
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 { cols, rows };
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 { cols, rows } = getPtyDimensions();
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, { cols, rows });
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(({ exitCode }) => {
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, { silent: true });
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 = { ...props.config, apps: nextApps };
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({ showMessage: true }),
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({ showMessage: false });
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 { cols, rows } = getPtyDimensions();
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 { cols: termWidth, rows: termHeight } = getPtyDimensions();
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, { silent: true });
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 /* @__PURE__ */ jsxDEV8("box", {
1599
- flexDirection: "column",
1600
- width: "100%",
1601
- height: "100%",
1602
- children: [
1603
- /* @__PURE__ */ jsxDEV8("box", {
1604
- flexDirection: "row",
1605
- flexGrow: 1,
1606
- children: [
1607
- /* @__PURE__ */ jsxDEV8(TabList, {
1608
- entries: appsStore.store.entries,
1609
- activeTabId: tabsStore.store.activeTabId,
1610
- selectedIndex: selectedIndex(),
1611
- getStatus: getAppStatus,
1612
- isFocused: tabsStore.store.focusMode === "tabs",
1613
- width: props.config.tab_width,
1614
- height: terminalDims().height - 1,
1615
- scrollOffset: tabsStore.store.scrollOffset,
1616
- theme: props.config.theme,
1617
- onSelect: handleSelectApp,
1618
- onAddClick: () => uiStore.openModal("add-tab")
1619
- }, undefined, false, undefined, this),
1620
- /* @__PURE__ */ jsxDEV8(TerminalPane, {
1621
- runningApp: activeRunningApp(),
1622
- isFocused: tabsStore.store.focusMode === "terminal",
1623
- width: terminalDims().width - props.config.tab_width,
1624
- height: terminalDims().height - 1,
1625
- theme: props.config.theme,
1626
- onInput: handleTerminalInput
1627
- }, undefined, false, undefined, this)
1628
- ]
1629
- }, undefined, true, undefined, this),
1630
- /* @__PURE__ */ jsxDEV8(StatusBar, {
1631
- appName: activeRunningApp()?.entry.name ?? null,
1632
- appStatus: activeRunningApp()?.status ?? null,
1633
- focusMode: tabsStore.store.focusMode,
1634
- message: uiStore.store.statusMessage,
1635
- theme: props.config.theme,
1636
- keybinds: {
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
- }, undefined, false, undefined, this),
1645
- /* @__PURE__ */ jsxDEV8(Show3, {
1646
- when: uiStore.store.activeModal === "command-palette",
1647
- children: /* @__PURE__ */ jsxDEV8(CommandPalette, {
1648
- entries: appsStore.store.entries,
1649
- theme: props.config.theme,
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
- }, undefined, false, undefined, this)
1668
- }, undefined, false, undefined, this),
1669
- /* @__PURE__ */ jsxDEV8(Show3, {
1670
- when: uiStore.store.activeModal === "add-tab",
1671
- children: /* @__PURE__ */ jsxDEV8(AddTabModal, {
1672
- theme: props.config.theme,
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
- }, undefined, false, undefined, this)
1676
- }, undefined, false, undefined, this),
1677
- /* @__PURE__ */ jsxDEV8(Show3, {
1678
- when: uiStore.store.activeModal === "edit-app" && editingEntry(),
1679
- children: /* @__PURE__ */ jsxDEV8(EditAppModal, {
1680
- theme: props.config.theme,
1681
- entry: editingEntry(),
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
- }, undefined, false, undefined, this)
1688
- }, undefined, false, undefined, this)
1689
- ]
1690
- }, undefined, true, undefined, this);
1929
+ });
1930
+ }
1931
+ }), null);
1932
+ return _el$;
1933
+ })();
1691
1934
  };
1692
1935
 
1693
1936
  // src/index.tsx
1694
- import { jsxDEV as jsxDEV9 } from "@opentui/solid/jsx-dev-runtime";
1695
- extend({ "ghostty-terminal": GhosttyTerminalRenderable });
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(() => /* @__PURE__ */ jsxDEV9(App, {
1945
+ await render(() => _$createComponent6(App, {
1702
1946
  config,
1703
1947
  session
1704
- }, undefined, false, undefined, this));
1948
+ }));
1705
1949
  const handleShutdown = () => {
1706
1950
  console.log(`
1707
1951
  Shutting down tuidoscope...`);