@tomkapa/tayto 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.js +2 -2
- package/dist/{tui-IXZGQMWN.js → tui-24ZW56Q6.js} +394 -363
- package/dist/tui-24ZW56Q6.js.map +1 -0
- package/package.json +24 -1
- package/dist/tui-IXZGQMWN.js.map +0 -1
|
@@ -15,7 +15,7 @@ import { render } from "ink";
|
|
|
15
15
|
|
|
16
16
|
// src/tui/components/App.tsx
|
|
17
17
|
import { useReducer, useEffect as useEffect2, useCallback as useCallback2, useMemo as useMemo2, useState as useState7 } from "react";
|
|
18
|
-
import { Box as
|
|
18
|
+
import { Box as Box18, Text as Text18, useInput as useInput7, useApp, useStdout as useStdout4 } from "ink";
|
|
19
19
|
|
|
20
20
|
// src/tui/types.ts
|
|
21
21
|
var ViewType = {
|
|
@@ -31,112 +31,94 @@ var ViewType = {
|
|
|
31
31
|
Help: "help"
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
+
// src/tui/assets/logo-data.ts
|
|
35
|
+
var PALETTE = {
|
|
36
|
+
red: "#C82D28",
|
|
37
|
+
redDark: "#A02320",
|
|
38
|
+
grey: "#9B9BA5",
|
|
39
|
+
greyDark: "#73737D",
|
|
40
|
+
skin: "#D7A578",
|
|
41
|
+
skinDark: "#B9875F",
|
|
42
|
+
blue: "#2D4BAA",
|
|
43
|
+
blueDark: "#1E3782",
|
|
44
|
+
brown: "#82502D",
|
|
45
|
+
brownDark: "#5F371E",
|
|
46
|
+
black: "#19191E"
|
|
47
|
+
};
|
|
48
|
+
var LOGO_WIDTH = 7;
|
|
49
|
+
var LOGO_HEIGHT = 9;
|
|
50
|
+
var LOGO_PIXELS = [
|
|
51
|
+
[null, null, "red", "red", "red", null, null],
|
|
52
|
+
[null, "grey", "red", "redDark", "red", "grey", null],
|
|
53
|
+
[null, "grey", "grey", "grey", "grey", "grey", null],
|
|
54
|
+
[null, "skin", "black", "skin", "black", "skin", null],
|
|
55
|
+
[null, "skin", "skin", "skin", "skin", "skin", null],
|
|
56
|
+
["skin", "skin", "blue", "blue", "blue", "skin", "skin"],
|
|
57
|
+
[null, null, "blue", "blueDark", "blue", null, null],
|
|
58
|
+
[null, null, "skin", null, "skin", null, null],
|
|
59
|
+
[null, "brown", "brown", null, "brown", "brown", null]
|
|
60
|
+
];
|
|
61
|
+
|
|
34
62
|
// src/tui/theme.ts
|
|
35
63
|
var theme = {
|
|
36
|
-
|
|
37
|
-
fg: "#1E90FF",
|
|
38
|
-
// dodgerblue
|
|
64
|
+
fg: PALETTE.grey,
|
|
39
65
|
bg: "black",
|
|
40
|
-
logo:
|
|
41
|
-
// orange
|
|
42
|
-
// Table
|
|
66
|
+
logo: PALETTE.red,
|
|
43
67
|
table: {
|
|
44
|
-
fg: "#
|
|
45
|
-
// aqua
|
|
68
|
+
fg: "#C4C4CF",
|
|
46
69
|
cursorFg: "black",
|
|
47
|
-
cursorBg:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
depHighlightBg: "#1A5276",
|
|
53
|
-
// dark steel blue – non-terminal dep rows
|
|
54
|
-
blockedCursorBg: "#C0392B"
|
|
55
|
-
// strong red – selected row blocked by non-terminal dep
|
|
70
|
+
cursorBg: PALETTE.grey,
|
|
71
|
+
headerFg: "#D5D5DF",
|
|
72
|
+
markColor: PALETTE.skin,
|
|
73
|
+
depHighlightBg: PALETTE.blueDark,
|
|
74
|
+
blockedCursorBg: PALETTE.redDark
|
|
56
75
|
},
|
|
57
|
-
// Status colors (row-level)
|
|
58
76
|
status: {
|
|
59
77
|
new: "#87CEFA",
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
pending: "#FF8C00",
|
|
68
|
-
// darkorange
|
|
69
|
-
highlight: "#00FFFF",
|
|
70
|
-
// aqua
|
|
71
|
-
kill: "#9370DB",
|
|
72
|
-
// mediumpurple
|
|
73
|
-
completed: "#778899"
|
|
74
|
-
// lightslategray
|
|
78
|
+
modified: "#C4C4CF",
|
|
79
|
+
added: "#4682B4",
|
|
80
|
+
error: PALETTE.red,
|
|
81
|
+
pending: PALETTE.skin,
|
|
82
|
+
highlight: PALETTE.grey,
|
|
83
|
+
kill: "#5A5A64",
|
|
84
|
+
completed: PALETTE.greyDark
|
|
75
85
|
},
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
titleHighlight: "#FF00FF",
|
|
85
|
-
// fuchsia
|
|
86
|
-
titleCounter: "#FFEFD5",
|
|
87
|
-
// papayawhip
|
|
88
|
-
titleFilter: "#2E8B57",
|
|
89
|
-
// seagreen
|
|
90
|
-
// Prompt
|
|
91
|
-
prompt: "#5F9EA0",
|
|
92
|
-
// cadetblue
|
|
93
|
-
promptSuggest: "#1E90FF",
|
|
94
|
-
// dodgerblue
|
|
95
|
-
// Dialog
|
|
86
|
+
border: "#5A5A64",
|
|
87
|
+
borderFocus: PALETTE.grey,
|
|
88
|
+
title: PALETTE.grey,
|
|
89
|
+
titleHighlight: PALETTE.red,
|
|
90
|
+
titleCounter: PALETTE.skin,
|
|
91
|
+
titleFilter: PALETTE.greyDark,
|
|
92
|
+
prompt: PALETTE.greyDark,
|
|
93
|
+
promptSuggest: PALETTE.grey,
|
|
96
94
|
dialog: {
|
|
97
|
-
fg:
|
|
98
|
-
// dodgerblue
|
|
95
|
+
fg: PALETTE.grey,
|
|
99
96
|
buttonFg: "black",
|
|
100
|
-
buttonBg:
|
|
97
|
+
buttonBg: PALETTE.grey,
|
|
101
98
|
buttonFocusFg: "white",
|
|
102
|
-
buttonFocusBg:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// fuchsia
|
|
106
|
-
field: "#1E90FF"
|
|
99
|
+
buttonFocusBg: PALETTE.red,
|
|
100
|
+
label: PALETTE.red,
|
|
101
|
+
field: PALETTE.grey
|
|
107
102
|
},
|
|
108
|
-
// Detail/YAML
|
|
109
103
|
yaml: {
|
|
110
|
-
key:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
value: "#FFEFD5"
|
|
114
|
-
// papayawhip
|
|
104
|
+
key: PALETTE.greyDark,
|
|
105
|
+
colon: PALETTE.grey,
|
|
106
|
+
value: "#D5D5DF"
|
|
115
107
|
},
|
|
116
|
-
// Crumbs
|
|
117
108
|
crumb: {
|
|
118
109
|
fg: "black",
|
|
119
|
-
bg: "#
|
|
120
|
-
|
|
121
|
-
activeBg: "#FFA500"
|
|
122
|
-
// orange
|
|
110
|
+
bg: "#5A5A64",
|
|
111
|
+
activeBg: PALETTE.grey
|
|
123
112
|
},
|
|
124
|
-
// Flash
|
|
125
113
|
flash: {
|
|
126
|
-
info: "#
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// orange
|
|
130
|
-
error: "#FF4500"
|
|
131
|
-
// orangered
|
|
114
|
+
info: "#C4C4CF",
|
|
115
|
+
warn: PALETTE.skin,
|
|
116
|
+
error: PALETTE.red
|
|
132
117
|
},
|
|
133
|
-
// Menu / key hints
|
|
134
118
|
menu: {
|
|
135
|
-
key:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
// fuchsia
|
|
139
|
-
desc: "white"
|
|
119
|
+
key: PALETTE.grey,
|
|
120
|
+
numKey: PALETTE.red,
|
|
121
|
+
desc: PALETTE.greyDark
|
|
140
122
|
}
|
|
141
123
|
};
|
|
142
124
|
|
|
@@ -406,8 +388,43 @@ function appReducer(state, action) {
|
|
|
406
388
|
}
|
|
407
389
|
|
|
408
390
|
// src/tui/components/Header.tsx
|
|
391
|
+
import { Box as Box2, Text as Text2 } from "ink";
|
|
392
|
+
|
|
393
|
+
// src/tui/components/Logo.tsx
|
|
394
|
+
import React from "react";
|
|
409
395
|
import { Box, Text } from "ink";
|
|
410
|
-
import { jsx
|
|
396
|
+
import { jsx } from "react/jsx-runtime";
|
|
397
|
+
var Logo = React.memo(function Logo2() {
|
|
398
|
+
const lines = [];
|
|
399
|
+
for (let y = 0; y < LOGO_HEIGHT; y += 2) {
|
|
400
|
+
const chars = [];
|
|
401
|
+
for (let x = 0; x < LOGO_WIDTH; x++) {
|
|
402
|
+
const top = LOGO_PIXELS[y]?.[x] ?? null;
|
|
403
|
+
const bot = LOGO_PIXELS[y + 1]?.[x] ?? null;
|
|
404
|
+
const key = `${y}-${x}`;
|
|
405
|
+
if (top && bot) {
|
|
406
|
+
chars.push(
|
|
407
|
+
/* @__PURE__ */ jsx(Text, { color: PALETTE[top], backgroundColor: PALETTE[bot], children: "\u2580" }, key)
|
|
408
|
+
);
|
|
409
|
+
} else if (top) {
|
|
410
|
+
chars.push(
|
|
411
|
+
/* @__PURE__ */ jsx(Text, { color: PALETTE[top], children: "\u2580" }, key)
|
|
412
|
+
);
|
|
413
|
+
} else if (bot) {
|
|
414
|
+
chars.push(
|
|
415
|
+
/* @__PURE__ */ jsx(Text, { color: PALETTE[bot], children: "\u2584" }, key)
|
|
416
|
+
);
|
|
417
|
+
} else {
|
|
418
|
+
chars.push(/* @__PURE__ */ jsx(Text, { children: " " }, key));
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
lines.push(/* @__PURE__ */ jsx(Box, { children: chars }, `row-${y}`));
|
|
422
|
+
}
|
|
423
|
+
return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: lines });
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
// src/tui/components/Header.tsx
|
|
427
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
411
428
|
function getKeyHints(view, isSearchActive, focusedPanel) {
|
|
412
429
|
if (isSearchActive) {
|
|
413
430
|
return [
|
|
@@ -463,33 +480,47 @@ function getKeyHints(view, isSearchActive, focusedPanel) {
|
|
|
463
480
|
{ key: "q", desc: "quit" }
|
|
464
481
|
];
|
|
465
482
|
}
|
|
483
|
+
function chunkHints(hints, cols) {
|
|
484
|
+
const perCol = Math.ceil(hints.length / cols);
|
|
485
|
+
const result = [];
|
|
486
|
+
for (let i = 0; i < hints.length; i += perCol) {
|
|
487
|
+
result.push(hints.slice(i, i + perCol));
|
|
488
|
+
}
|
|
489
|
+
return result;
|
|
490
|
+
}
|
|
466
491
|
function Header({ state }) {
|
|
467
492
|
const projectName = state.activeProject?.name ?? "none";
|
|
468
493
|
const taskCount = state.tasks.length;
|
|
469
494
|
const hints = getKeyHints(state.activeView, state.isSearchActive, state.focusedPanel);
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
/* @__PURE__ */
|
|
476
|
-
/* @__PURE__ */
|
|
477
|
-
|
|
495
|
+
const hintCols = hints.length <= 7 ? 2 : hints.length <= 12 ? 3 : 4;
|
|
496
|
+
const columns = chunkHints(hints, hintCols);
|
|
497
|
+
return /* @__PURE__ */ jsxs(Box2, { flexDirection: "row", gap: 1, children: [
|
|
498
|
+
/* @__PURE__ */ jsx2(Box2, { flexShrink: 0, children: /* @__PURE__ */ jsx2(Logo, {}) }),
|
|
499
|
+
/* @__PURE__ */ jsxs(Box2, { flexDirection: "column", justifyContent: "center", flexShrink: 0, paddingLeft: 1, children: [
|
|
500
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.logo, bold: true, children: "tayto" }),
|
|
501
|
+
/* @__PURE__ */ jsxs(Box2, { gap: 1, children: [
|
|
502
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.fg, children: "Project:" }),
|
|
503
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.titleCounter, bold: true, children: projectName })
|
|
504
|
+
] }),
|
|
505
|
+
/* @__PURE__ */ jsxs(Box2, { gap: 1, children: [
|
|
506
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.fg, children: "Tasks:" }),
|
|
507
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.titleCounter, bold: true, children: taskCount })
|
|
508
|
+
] })
|
|
478
509
|
] }),
|
|
479
|
-
/* @__PURE__ */
|
|
480
|
-
/* @__PURE__ */ jsxs(
|
|
510
|
+
/* @__PURE__ */ jsx2(Box2, { flexGrow: 1, justifyContent: "flex-end", children: /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", gap: 2, children: columns.map((col, ci) => /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: col.map((h) => /* @__PURE__ */ jsxs(Box2, { children: [
|
|
511
|
+
/* @__PURE__ */ jsxs(Text2, { color: theme.menu.key, bold: true, children: [
|
|
481
512
|
"<",
|
|
482
513
|
h.key,
|
|
483
514
|
">"
|
|
484
515
|
] }),
|
|
485
|
-
/* @__PURE__ */
|
|
486
|
-
] }, h.key)) })
|
|
516
|
+
/* @__PURE__ */ jsx2(Text2, { color: theme.menu.desc, children: h.desc })
|
|
517
|
+
] }, h.key)) }, ci)) }) })
|
|
487
518
|
] });
|
|
488
519
|
}
|
|
489
520
|
|
|
490
521
|
// src/tui/components/Crumbs.tsx
|
|
491
|
-
import { Box as
|
|
492
|
-
import { jsx as
|
|
522
|
+
import { Box as Box3, Text as Text3 } from "ink";
|
|
523
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
493
524
|
var VIEW_LABELS = {
|
|
494
525
|
"task-list": "tasks",
|
|
495
526
|
"task-detail": "detail",
|
|
@@ -499,11 +530,11 @@ var VIEW_LABELS = {
|
|
|
499
530
|
help: "help"
|
|
500
531
|
};
|
|
501
532
|
function Crumbs({ breadcrumbs }) {
|
|
502
|
-
return /* @__PURE__ */
|
|
533
|
+
return /* @__PURE__ */ jsx3(Box3, { flexDirection: "row", gap: 0, width: "100%", children: breadcrumbs.map((crumb, i) => {
|
|
503
534
|
const isActive = i === breadcrumbs.length - 1;
|
|
504
535
|
const label = ` ${VIEW_LABELS[crumb] ?? crumb} `;
|
|
505
|
-
return /* @__PURE__ */
|
|
506
|
-
|
|
536
|
+
return /* @__PURE__ */ jsx3(
|
|
537
|
+
Text3,
|
|
507
538
|
{
|
|
508
539
|
color: theme.crumb.fg,
|
|
509
540
|
backgroundColor: isActive ? theme.crumb.activeBg : theme.crumb.bg,
|
|
@@ -516,20 +547,20 @@ function Crumbs({ breadcrumbs }) {
|
|
|
516
547
|
}
|
|
517
548
|
|
|
518
549
|
// src/tui/components/FlashMessage.tsx
|
|
519
|
-
import { Box as
|
|
520
|
-
import { jsx as
|
|
550
|
+
import { Box as Box4, Text as Text4 } from "ink";
|
|
551
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
521
552
|
var LEVEL_COLOR = {
|
|
522
553
|
info: theme.flash.info,
|
|
523
554
|
warn: theme.flash.warn,
|
|
524
555
|
error: theme.flash.error
|
|
525
556
|
};
|
|
526
557
|
function FlashMessage({ message, level }) {
|
|
527
|
-
return /* @__PURE__ */
|
|
558
|
+
return /* @__PURE__ */ jsx4(Box4, { justifyContent: "center", width: "100%", children: /* @__PURE__ */ jsx4(Text4, { color: LEVEL_COLOR[level], bold: level === "error", children: message }) });
|
|
528
559
|
}
|
|
529
560
|
|
|
530
561
|
// src/tui/components/TaskList.tsx
|
|
531
|
-
import { Box as
|
|
532
|
-
import { jsx as
|
|
562
|
+
import { Box as Box5, Text as Text5 } from "ink";
|
|
563
|
+
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
533
564
|
var COL = {
|
|
534
565
|
rank: 5,
|
|
535
566
|
type: 12,
|
|
@@ -558,49 +589,49 @@ function TaskList({
|
|
|
558
589
|
if (filter.search) filterParts.push(filter.search);
|
|
559
590
|
const filterText = filterParts.length > 0 ? filterParts.join(" ") : "";
|
|
560
591
|
return /* @__PURE__ */ jsxs2(
|
|
561
|
-
|
|
592
|
+
Box5,
|
|
562
593
|
{
|
|
563
594
|
flexDirection: "column",
|
|
564
595
|
flexGrow: 1,
|
|
565
596
|
borderStyle: "bold",
|
|
566
597
|
borderColor: isFocused ? theme.borderFocus : theme.border,
|
|
567
598
|
children: [
|
|
568
|
-
/* @__PURE__ */ jsxs2(
|
|
569
|
-
/* @__PURE__ */ jsxs2(
|
|
599
|
+
/* @__PURE__ */ jsxs2(Box5, { children: [
|
|
600
|
+
/* @__PURE__ */ jsxs2(Text5, { color: theme.title, bold: true, children: [
|
|
570
601
|
" ",
|
|
571
602
|
"tasks"
|
|
572
603
|
] }),
|
|
573
|
-
/* @__PURE__ */
|
|
574
|
-
/* @__PURE__ */
|
|
575
|
-
/* @__PURE__ */
|
|
576
|
-
/* @__PURE__ */ jsxs2(
|
|
604
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: "(" }),
|
|
605
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.titleHighlight, bold: true, children: activeProjectName }),
|
|
606
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: ")" }),
|
|
607
|
+
/* @__PURE__ */ jsxs2(Text5, { color: theme.titleCounter, bold: true, children: [
|
|
577
608
|
"[",
|
|
578
609
|
tasks.length,
|
|
579
610
|
"]"
|
|
580
611
|
] }),
|
|
581
|
-
isReordering && /* @__PURE__ */ jsxs2(
|
|
612
|
+
isReordering && /* @__PURE__ */ jsxs2(Text5, { color: theme.flash.warn, bold: true, children: [
|
|
582
613
|
" ",
|
|
583
614
|
"REORDER"
|
|
584
615
|
] }),
|
|
585
|
-
epicFilterActive && /* @__PURE__ */
|
|
586
|
-
filterText && /* @__PURE__ */ jsxs2(
|
|
616
|
+
epicFilterActive && /* @__PURE__ */ jsx5(Text5, { color: theme.titleHighlight, children: " [epic]" }),
|
|
617
|
+
filterText && /* @__PURE__ */ jsxs2(Text5, { color: theme.titleFilter, children: [
|
|
587
618
|
" /",
|
|
588
619
|
filterText
|
|
589
620
|
] })
|
|
590
621
|
] }),
|
|
591
|
-
isSearchActive && /* @__PURE__ */ jsxs2(
|
|
592
|
-
/* @__PURE__ */
|
|
593
|
-
/* @__PURE__ */
|
|
594
|
-
/* @__PURE__ */
|
|
622
|
+
isSearchActive && /* @__PURE__ */ jsxs2(Box5, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
|
|
623
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.prompt, children: "/" }),
|
|
624
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.prompt, children: searchQuery }),
|
|
625
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.promptSuggest, children: "_" })
|
|
595
626
|
] }),
|
|
596
|
-
/* @__PURE__ */ jsxs2(
|
|
597
|
-
/* @__PURE__ */
|
|
598
|
-
/* @__PURE__ */
|
|
599
|
-
/* @__PURE__ */
|
|
600
|
-
/* @__PURE__ */
|
|
601
|
-
/* @__PURE__ */
|
|
627
|
+
/* @__PURE__ */ jsxs2(Box5, { children: [
|
|
628
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: " " }),
|
|
629
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "#".padEnd(COL.rank) }),
|
|
630
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "TYPE".padEnd(COL.type) }),
|
|
631
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "STATUS".padEnd(COL.status) }),
|
|
632
|
+
/* @__PURE__ */ jsx5(Text5, { color: theme.table.headerFg, bold: true, children: "NAME" })
|
|
602
633
|
] }),
|
|
603
|
-
/* @__PURE__ */
|
|
634
|
+
/* @__PURE__ */ jsx5(Box5, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: tasks.length === 0 ? /* @__PURE__ */ jsx5(Box5, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx5(Text5, { color: theme.fg, children: "No tasks found. Press 'c' to create one." }) }) : visibleTasks.map((task, i) => {
|
|
604
635
|
const actualIndex = viewStart + i;
|
|
605
636
|
const isSelected = actualIndex === selectedIndex;
|
|
606
637
|
const isNonTerminalBlocker = nonTerminalBlockerIds.has(task.id);
|
|
@@ -610,7 +641,7 @@ function TaskList({
|
|
|
610
641
|
const depMarker = isNonTerminalBlocker ? "\u25B2 " : isNonTerminalDependent ? "\u25BC " : " ";
|
|
611
642
|
if (isSelected) {
|
|
612
643
|
const cursorBg = isReordering ? theme.flash.warn : isSelectedBlocked ? theme.table.blockedCursorBg : theme.table.cursorBg;
|
|
613
|
-
return /* @__PURE__ */
|
|
644
|
+
return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsxs2(Text5, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
614
645
|
isReordering ? "~ " : "> ",
|
|
615
646
|
rowNum.padEnd(COL.rank),
|
|
616
647
|
task.type.padEnd(COL.type),
|
|
@@ -619,7 +650,7 @@ function TaskList({
|
|
|
619
650
|
] }) }, task.id);
|
|
620
651
|
}
|
|
621
652
|
if (isNonTerminalBlocker || isNonTerminalDependent) {
|
|
622
|
-
return /* @__PURE__ */
|
|
653
|
+
return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsxs2(Text5, { backgroundColor: theme.table.depHighlightBg, color: theme.table.fg, bold: true, children: [
|
|
623
654
|
depMarker,
|
|
624
655
|
rowNum.padEnd(COL.rank),
|
|
625
656
|
task.type.padEnd(COL.type),
|
|
@@ -627,15 +658,15 @@ function TaskList({
|
|
|
627
658
|
task.name
|
|
628
659
|
] }) }, task.id);
|
|
629
660
|
}
|
|
630
|
-
return /* @__PURE__ */ jsxs2(
|
|
631
|
-
/* @__PURE__ */
|
|
632
|
-
/* @__PURE__ */
|
|
633
|
-
/* @__PURE__ */
|
|
634
|
-
/* @__PURE__ */
|
|
635
|
-
/* @__PURE__ */
|
|
661
|
+
return /* @__PURE__ */ jsxs2(Box5, { children: [
|
|
662
|
+
/* @__PURE__ */ jsx5(Text5, { children: " " }),
|
|
663
|
+
/* @__PURE__ */ jsx5(Text5, { dimColor: true, children: rowNum.padEnd(COL.rank) }),
|
|
664
|
+
/* @__PURE__ */ jsx5(Text5, { color: TYPE_COLOR[task.type] ?? rowColor, children: task.type.padEnd(COL.type) }),
|
|
665
|
+
/* @__PURE__ */ jsx5(Text5, { color: STATUS_COLOR[task.status] ?? rowColor, children: task.status.padEnd(COL.status) }),
|
|
666
|
+
/* @__PURE__ */ jsx5(Text5, { color: rowColor, children: task.name })
|
|
636
667
|
] }, task.id);
|
|
637
668
|
}) }),
|
|
638
|
-
tasks.length > PAGE_SIZE && /* @__PURE__ */
|
|
669
|
+
tasks.length > PAGE_SIZE && /* @__PURE__ */ jsx5(Box5, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs2(Text5, { dimColor: true, children: [
|
|
639
670
|
"[",
|
|
640
671
|
viewStart + 1,
|
|
641
672
|
"-",
|
|
@@ -651,11 +682,11 @@ function TaskList({
|
|
|
651
682
|
|
|
652
683
|
// src/tui/components/TaskDetail.tsx
|
|
653
684
|
import { useMemo } from "react";
|
|
654
|
-
import { Box as
|
|
685
|
+
import { Box as Box7, Text as Text7, useStdout } from "ink";
|
|
655
686
|
import chalk2 from "chalk";
|
|
656
687
|
|
|
657
688
|
// src/tui/components/Markdown.tsx
|
|
658
|
-
import { Text as
|
|
689
|
+
import { Text as Text6, Box as Box6 } from "ink";
|
|
659
690
|
import { Marked } from "marked";
|
|
660
691
|
import { markedTerminal } from "marked-terminal";
|
|
661
692
|
import chalk from "chalk";
|
|
@@ -691,7 +722,7 @@ mermaid.initialize({ startOnLoad: true, theme: 'dark' });
|
|
|
691
722
|
}
|
|
692
723
|
|
|
693
724
|
// src/tui/components/Markdown.tsx
|
|
694
|
-
import { jsx as
|
|
725
|
+
import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
695
726
|
function extractMermaidBlocks(content) {
|
|
696
727
|
const lexer = new Marked();
|
|
697
728
|
const tokens = lexer.lexer(content);
|
|
@@ -752,12 +783,12 @@ function renderMarkdown(content) {
|
|
|
752
783
|
function MermaidHint({ content }) {
|
|
753
784
|
const blocks = extractMermaidBlocks(content);
|
|
754
785
|
if (blocks.length === 0) return null;
|
|
755
|
-
return /* @__PURE__ */ jsxs3(
|
|
756
|
-
/* @__PURE__ */ jsxs3(
|
|
786
|
+
return /* @__PURE__ */ jsxs3(Box6, { children: [
|
|
787
|
+
/* @__PURE__ */ jsxs3(Text6, { color: theme.menu.key, bold: true, children: [
|
|
757
788
|
"<m>",
|
|
758
789
|
" "
|
|
759
790
|
] }),
|
|
760
|
-
/* @__PURE__ */ jsxs3(
|
|
791
|
+
/* @__PURE__ */ jsxs3(Text6, { dimColor: true, children: [
|
|
761
792
|
"Open ",
|
|
762
793
|
blocks.length,
|
|
763
794
|
" mermaid diagram",
|
|
@@ -775,7 +806,7 @@ function openAllMermaidDiagrams(content) {
|
|
|
775
806
|
}
|
|
776
807
|
|
|
777
808
|
// src/tui/components/TaskDetail.tsx
|
|
778
|
-
import { jsx as
|
|
809
|
+
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
779
810
|
var PAD = " ";
|
|
780
811
|
function field(label, value) {
|
|
781
812
|
return PAD + chalk2.hex(theme.yaml.key).bold(label) + chalk2.hex(theme.yaml.colon)(": ") + chalk2.hex(theme.yaml.value)(value);
|
|
@@ -858,29 +889,29 @@ ${task.additionalRequirements}`;
|
|
|
858
889
|
const viewportHeight = Math.max(1, (stdout.rows > 0 ? stdout.rows : 24) - CHROME_LINES);
|
|
859
890
|
const visibleLines = contentLines.slice(scrollOffset, scrollOffset + viewportHeight);
|
|
860
891
|
return /* @__PURE__ */ jsxs4(
|
|
861
|
-
|
|
892
|
+
Box7,
|
|
862
893
|
{
|
|
863
894
|
flexDirection: "column",
|
|
864
895
|
flexGrow: 1,
|
|
865
896
|
borderStyle: "bold",
|
|
866
897
|
borderColor: isFocused ? theme.borderFocus : theme.border,
|
|
867
898
|
children: [
|
|
868
|
-
/* @__PURE__ */ jsxs4(
|
|
869
|
-
/* @__PURE__ */ jsxs4(
|
|
899
|
+
/* @__PURE__ */ jsxs4(Box7, { gap: 0, children: [
|
|
900
|
+
/* @__PURE__ */ jsxs4(Text7, { color: theme.title, bold: true, children: [
|
|
870
901
|
" ",
|
|
871
902
|
"detail"
|
|
872
903
|
] }),
|
|
873
|
-
/* @__PURE__ */
|
|
874
|
-
/* @__PURE__ */
|
|
875
|
-
/* @__PURE__ */
|
|
876
|
-
scrollOffset > 0 && /* @__PURE__ */ jsxs4(
|
|
904
|
+
/* @__PURE__ */ jsx7(Text7, { color: theme.fg, children: "(" }),
|
|
905
|
+
/* @__PURE__ */ jsx7(Text7, { color: theme.titleHighlight, bold: true, children: task.name }),
|
|
906
|
+
/* @__PURE__ */ jsx7(Text7, { color: theme.fg, children: ")" }),
|
|
907
|
+
scrollOffset > 0 && /* @__PURE__ */ jsxs4(Text7, { dimColor: true, children: [
|
|
877
908
|
" \u2191",
|
|
878
909
|
scrollOffset
|
|
879
910
|
] })
|
|
880
911
|
] }),
|
|
881
|
-
/* @__PURE__ */
|
|
882
|
-
/* @__PURE__ */
|
|
883
|
-
/* @__PURE__ */
|
|
912
|
+
/* @__PURE__ */ jsx7(Text7, { children: visibleLines.join("\n") }),
|
|
913
|
+
/* @__PURE__ */ jsx7(Box7, { flexGrow: 1 }),
|
|
914
|
+
/* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsx7(MermaidHint, { content: allText }) })
|
|
884
915
|
]
|
|
885
916
|
}
|
|
886
917
|
);
|
|
@@ -888,7 +919,7 @@ ${task.additionalRequirements}`;
|
|
|
888
919
|
|
|
889
920
|
// src/tui/components/TaskForm.tsx
|
|
890
921
|
import { useState as useState2, useCallback } from "react";
|
|
891
|
-
import { Box as
|
|
922
|
+
import { Box as Box9, Text as Text9, useInput as useInput2 } from "ink";
|
|
892
923
|
|
|
893
924
|
// src/tui/editor.ts
|
|
894
925
|
import { writeFileSync as writeFileSync2, readFileSync, unlinkSync, mkdtempSync as mkdtempSync2 } from "fs";
|
|
@@ -925,8 +956,8 @@ function openInEditor(content, filename) {
|
|
|
925
956
|
|
|
926
957
|
// src/tui/components/TaskPicker.tsx
|
|
927
958
|
import { useState } from "react";
|
|
928
|
-
import { Box as
|
|
929
|
-
import { Fragment, jsx as
|
|
959
|
+
import { Box as Box8, Text as Text8, useInput, useStdout as useStdout2 } from "ink";
|
|
960
|
+
import { Fragment, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
930
961
|
var DEP_TYPE_VALUES = Object.values(UIDependencyType);
|
|
931
962
|
var DEP_TYPE_COLOR = {
|
|
932
963
|
[DependencyType.Blocks]: theme.status.error,
|
|
@@ -1040,28 +1071,28 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1040
1071
|
return;
|
|
1041
1072
|
}
|
|
1042
1073
|
});
|
|
1043
|
-
return /* @__PURE__ */ jsxs5(
|
|
1044
|
-
/* @__PURE__ */ jsxs5(
|
|
1045
|
-
/* @__PURE__ */ jsxs5(
|
|
1074
|
+
return /* @__PURE__ */ jsxs5(Box8, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
|
|
1075
|
+
/* @__PURE__ */ jsxs5(Box8, { gap: 0, children: [
|
|
1076
|
+
/* @__PURE__ */ jsxs5(Text8, { color: theme.title, bold: true, children: [
|
|
1046
1077
|
" ",
|
|
1047
1078
|
"select dependencies"
|
|
1048
1079
|
] }),
|
|
1049
|
-
/* @__PURE__ */ jsxs5(
|
|
1080
|
+
/* @__PURE__ */ jsxs5(Text8, { color: theme.titleCounter, bold: true, children: [
|
|
1050
1081
|
" ",
|
|
1051
1082
|
"[",
|
|
1052
1083
|
selected.size,
|
|
1053
1084
|
" selected]"
|
|
1054
1085
|
] })
|
|
1055
1086
|
] }),
|
|
1056
|
-
isSearching ? /* @__PURE__ */ jsxs5(
|
|
1057
|
-
/* @__PURE__ */
|
|
1058
|
-
/* @__PURE__ */
|
|
1059
|
-
/* @__PURE__ */
|
|
1060
|
-
] }) : searchQuery ? /* @__PURE__ */
|
|
1087
|
+
isSearching ? /* @__PURE__ */ jsxs5(Box8, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
|
|
1088
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.prompt, children: "/" }),
|
|
1089
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.prompt, children: searchQuery }),
|
|
1090
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.promptSuggest, children: "_" })
|
|
1091
|
+
] }) : searchQuery ? /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { color: theme.titleFilter, children: [
|
|
1061
1092
|
"/",
|
|
1062
1093
|
searchQuery
|
|
1063
1094
|
] }) }) : null,
|
|
1064
|
-
/* @__PURE__ */
|
|
1095
|
+
/* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { color: theme.table.headerFg, bold: true, children: [
|
|
1065
1096
|
" ",
|
|
1066
1097
|
"SEL".padEnd(5),
|
|
1067
1098
|
"ID".padEnd(14),
|
|
@@ -1069,7 +1100,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1069
1100
|
"STATUS".padEnd(14),
|
|
1070
1101
|
"NAME"
|
|
1071
1102
|
] }) }),
|
|
1072
|
-
available.length === 0 ? /* @__PURE__ */
|
|
1103
|
+
available.length === 0 ? /* @__PURE__ */ jsx8(Box8, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "No tasks match the filter" }) }) : visible.map((task, i) => {
|
|
1073
1104
|
const actualIndex = viewStart + i;
|
|
1074
1105
|
const isCursor = actualIndex === cursorIndex;
|
|
1075
1106
|
const entry = selected.get(task.id);
|
|
@@ -1077,7 +1108,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1077
1108
|
const checkMark = isChecked ? "[x]" : "[ ]";
|
|
1078
1109
|
const depType = entry ? DEP_TYPE_LABEL[entry.type] ?? entry.type : "";
|
|
1079
1110
|
const depColor = entry ? DEP_TYPE_COLOR[entry.type] ?? theme.table.fg : theme.table.fg;
|
|
1080
|
-
return /* @__PURE__ */
|
|
1111
|
+
return /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs5(Text8, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
1081
1112
|
"> ",
|
|
1082
1113
|
checkMark.padEnd(5),
|
|
1083
1114
|
task.id.padEnd(14),
|
|
@@ -1085,16 +1116,16 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1085
1116
|
task.status.padEnd(14),
|
|
1086
1117
|
task.name
|
|
1087
1118
|
] }) : /* @__PURE__ */ jsxs5(Fragment, { children: [
|
|
1088
|
-
/* @__PURE__ */
|
|
1089
|
-
/* @__PURE__ */
|
|
1090
|
-
/* @__PURE__ */
|
|
1091
|
-
/* @__PURE__ */
|
|
1092
|
-
/* @__PURE__ */
|
|
1093
|
-
/* @__PURE__ */
|
|
1119
|
+
/* @__PURE__ */ jsx8(Text8, { children: " " }),
|
|
1120
|
+
/* @__PURE__ */ jsx8(Text8, { color: isChecked ? theme.status.added : theme.table.fg, children: checkMark.padEnd(5) }),
|
|
1121
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.yaml.value, children: task.id.padEnd(14) }),
|
|
1122
|
+
/* @__PURE__ */ jsx8(Text8, { color: depColor, children: depType.padEnd(12) }),
|
|
1123
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.status.completed, children: task.status.padEnd(14) }),
|
|
1124
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.table.fg, children: task.name })
|
|
1094
1125
|
] }) }, task.id);
|
|
1095
1126
|
}),
|
|
1096
|
-
/* @__PURE__ */
|
|
1097
|
-
available.length > maxVisible && /* @__PURE__ */
|
|
1127
|
+
/* @__PURE__ */ jsx8(Box8, { flexGrow: 1 }),
|
|
1128
|
+
available.length > maxVisible && /* @__PURE__ */ jsx8(Box8, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs5(Text8, { dimColor: true, children: [
|
|
1098
1129
|
"[",
|
|
1099
1130
|
viewStart + 1,
|
|
1100
1131
|
"-",
|
|
@@ -1103,11 +1134,11 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1103
1134
|
available.length,
|
|
1104
1135
|
"]"
|
|
1105
1136
|
] }) }),
|
|
1106
|
-
selected.size > 0 && /* @__PURE__ */ jsxs5(
|
|
1107
|
-
/* @__PURE__ */
|
|
1108
|
-
/* @__PURE__ */
|
|
1137
|
+
selected.size > 0 && /* @__PURE__ */ jsxs5(Box8, { paddingX: 1, flexDirection: "column", children: [
|
|
1138
|
+
/* @__PURE__ */ jsx8(Text8, { color: theme.table.headerFg, bold: true, children: "Selected:" }),
|
|
1139
|
+
/* @__PURE__ */ jsx8(Box8, { children: /* @__PURE__ */ jsx8(Text8, { children: Array.from(selected.values()).map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(", ") }) })
|
|
1109
1140
|
] }),
|
|
1110
|
-
/* @__PURE__ */
|
|
1141
|
+
/* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsxs5(Text8, { dimColor: true, children: [
|
|
1111
1142
|
"space/t: select & cycle type (blocks ",
|
|
1112
1143
|
"->",
|
|
1113
1144
|
" relates-to ",
|
|
@@ -1123,7 +1154,7 @@ function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }
|
|
|
1123
1154
|
}
|
|
1124
1155
|
|
|
1125
1156
|
// src/tui/components/TaskForm.tsx
|
|
1126
|
-
import { jsx as
|
|
1157
|
+
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1127
1158
|
var FIELDS = [
|
|
1128
1159
|
{ label: "Name", key: "name", type: "inline" },
|
|
1129
1160
|
{ label: "Type", key: "type", type: "select", options: TYPE_VALUES },
|
|
@@ -1254,7 +1285,7 @@ function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }) {
|
|
|
1254
1285
|
);
|
|
1255
1286
|
if (pickerActive) {
|
|
1256
1287
|
const pickerExclude = editingTask ? { excludeIds: /* @__PURE__ */ new Set([editingTask.id]) } : {};
|
|
1257
|
-
return /* @__PURE__ */
|
|
1288
|
+
return /* @__PURE__ */ jsx9(
|
|
1258
1289
|
TaskPicker,
|
|
1259
1290
|
{
|
|
1260
1291
|
tasks: allTasks,
|
|
@@ -1267,53 +1298,53 @@ function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }) {
|
|
|
1267
1298
|
}
|
|
1268
1299
|
const isEdit = editingTask !== null;
|
|
1269
1300
|
const depSummary = pickedDeps.length > 0 ? pickedDeps.map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(", ") : "";
|
|
1270
|
-
return /* @__PURE__ */ jsxs6(
|
|
1271
|
-
/* @__PURE__ */
|
|
1301
|
+
return /* @__PURE__ */ jsxs6(Box9, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
|
|
1302
|
+
/* @__PURE__ */ jsx9(Box9, { gap: 0, children: /* @__PURE__ */ jsxs6(Text9, { color: theme.title, bold: true, children: [
|
|
1272
1303
|
" ",
|
|
1273
1304
|
isEdit ? "edit" : "create"
|
|
1274
1305
|
] }) }),
|
|
1275
|
-
/* @__PURE__ */
|
|
1306
|
+
/* @__PURE__ */ jsx9(Box9, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS.map((field2, i) => {
|
|
1276
1307
|
const isFocused = i === focusIndex;
|
|
1277
1308
|
const value = field2.key === "dependsOn" ? depSummary : values[field2.key] ?? "";
|
|
1278
1309
|
const displayValue = value;
|
|
1279
|
-
return /* @__PURE__ */ jsxs6(
|
|
1280
|
-
/* @__PURE__ */ jsxs6(
|
|
1310
|
+
return /* @__PURE__ */ jsxs6(Box9, { gap: 1, children: [
|
|
1311
|
+
/* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
|
|
1281
1312
|
isFocused ? ">" : " ",
|
|
1282
1313
|
" ",
|
|
1283
1314
|
field2.label.padEnd(14)
|
|
1284
1315
|
] }),
|
|
1285
|
-
field2.type === "inline" && /* @__PURE__ */ jsxs6(
|
|
1316
|
+
field2.type === "inline" && /* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
|
|
1286
1317
|
displayValue,
|
|
1287
|
-
isFocused ? /* @__PURE__ */
|
|
1318
|
+
isFocused ? /* @__PURE__ */ jsx9(Text9, { color: theme.titleHighlight, children: "_" }) : ""
|
|
1288
1319
|
] }),
|
|
1289
|
-
field2.type === "picker" && /* @__PURE__ */ jsxs6(
|
|
1290
|
-
displayValue ? /* @__PURE__ */
|
|
1291
|
-
isFocused && /* @__PURE__ */
|
|
1320
|
+
field2.type === "picker" && /* @__PURE__ */ jsxs6(Text9, { children: [
|
|
1321
|
+
displayValue ? /* @__PURE__ */ jsx9(Text9, { color: theme.status.added, children: displayValue.length > 60 ? displayValue.slice(0, 60) + "..." : displayValue }) : /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: isFocused ? "press enter to select" : "none" }),
|
|
1322
|
+
isFocused && /* @__PURE__ */ jsx9(Text9, { color: theme.menu.key, children: " [enter: open picker]" })
|
|
1292
1323
|
] }),
|
|
1293
|
-
field2.type === "editor" && /* @__PURE__ */ jsxs6(
|
|
1294
|
-
displayValue ? /* @__PURE__ */ jsxs6(
|
|
1324
|
+
field2.type === "editor" && /* @__PURE__ */ jsxs6(Text9, { children: [
|
|
1325
|
+
displayValue ? /* @__PURE__ */ jsxs6(Text9, { color: theme.status.added, children: [
|
|
1295
1326
|
displayValue.split("\n")[0]?.slice(0, 50),
|
|
1296
1327
|
displayValue.length > 50 || displayValue.includes("\n") ? "..." : ""
|
|
1297
|
-
] }) : /* @__PURE__ */
|
|
1298
|
-
isFocused && /* @__PURE__ */
|
|
1328
|
+
] }) : /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: isFocused ? "press enter" : "empty" }),
|
|
1329
|
+
isFocused && /* @__PURE__ */ jsx9(Text9, { color: theme.menu.key, children: " [enter: $EDITOR]" })
|
|
1299
1330
|
] }),
|
|
1300
|
-
field2.type === "select" && /* @__PURE__ */ jsxs6(
|
|
1331
|
+
field2.type === "select" && /* @__PURE__ */ jsxs6(Text9, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
|
|
1301
1332
|
isFocused ? "< " : " ",
|
|
1302
1333
|
displayValue,
|
|
1303
1334
|
isFocused ? " >" : ""
|
|
1304
1335
|
] })
|
|
1305
1336
|
] }, field2.key);
|
|
1306
1337
|
}) }),
|
|
1307
|
-
/* @__PURE__ */
|
|
1308
|
-
/* @__PURE__ */
|
|
1309
|
-
editorActive && /* @__PURE__ */
|
|
1338
|
+
/* @__PURE__ */ jsx9(Box9, { flexGrow: 1 }),
|
|
1339
|
+
/* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) }),
|
|
1340
|
+
editorActive && /* @__PURE__ */ jsx9(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx9(Text9, { color: theme.flash.warn, bold: true, children: "Editor open... save and close to return" }) })
|
|
1310
1341
|
] });
|
|
1311
1342
|
}
|
|
1312
1343
|
|
|
1313
1344
|
// src/tui/components/ProjectSelector.tsx
|
|
1314
1345
|
import { useState as useState3 } from "react";
|
|
1315
|
-
import { Box as
|
|
1316
|
-
import { jsx as
|
|
1346
|
+
import { Box as Box10, Text as Text10, useInput as useInput3 } from "ink";
|
|
1347
|
+
import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1317
1348
|
function ProjectSelector({
|
|
1318
1349
|
projects,
|
|
1319
1350
|
activeProject,
|
|
@@ -1365,24 +1396,24 @@ function ProjectSelector({
|
|
|
1365
1396
|
setSelectedIndex((i) => Math.min(projects.length - 1, i + 1));
|
|
1366
1397
|
}
|
|
1367
1398
|
});
|
|
1368
|
-
return /* @__PURE__ */ jsxs7(
|
|
1369
|
-
/* @__PURE__ */ jsxs7(
|
|
1370
|
-
/* @__PURE__ */ jsxs7(
|
|
1399
|
+
return /* @__PURE__ */ jsxs7(Box10, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
|
|
1400
|
+
/* @__PURE__ */ jsxs7(Box10, { gap: 0, children: [
|
|
1401
|
+
/* @__PURE__ */ jsxs7(Text10, { color: theme.title, bold: true, children: [
|
|
1371
1402
|
" ",
|
|
1372
1403
|
"projects"
|
|
1373
1404
|
] }),
|
|
1374
|
-
/* @__PURE__ */ jsxs7(
|
|
1405
|
+
/* @__PURE__ */ jsxs7(Text10, { color: theme.titleCounter, bold: true, children: [
|
|
1375
1406
|
"[",
|
|
1376
1407
|
projects.length,
|
|
1377
1408
|
"]"
|
|
1378
1409
|
] })
|
|
1379
1410
|
] }),
|
|
1380
|
-
/* @__PURE__ */ jsxs7(
|
|
1381
|
-
/* @__PURE__ */
|
|
1382
|
-
/* @__PURE__ */
|
|
1383
|
-
/* @__PURE__ */
|
|
1411
|
+
/* @__PURE__ */ jsxs7(Box10, { paddingX: 1, children: [
|
|
1412
|
+
/* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: " NAME".padEnd(30) }),
|
|
1413
|
+
/* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: "GIT REMOTE".padEnd(40) }),
|
|
1414
|
+
/* @__PURE__ */ jsx10(Text10, { color: theme.table.headerFg, bold: true, children: "DESCRIPTION" })
|
|
1384
1415
|
] }),
|
|
1385
|
-
projects.length === 0 ? /* @__PURE__ */
|
|
1416
|
+
projects.length === 0 ? /* @__PURE__ */ jsx10(Box10, { paddingX: 1, paddingY: 1, children: /* @__PURE__ */ jsx10(Text10, { color: theme.fg, children: "No projects. Press 'c' to create one." }) }) : projects.map((project, i) => {
|
|
1386
1417
|
const isSelected = i === selectedIndex;
|
|
1387
1418
|
const isActive = project.id === activeProject?.id;
|
|
1388
1419
|
const activeMarker = isActive ? "*" : " ";
|
|
@@ -1390,7 +1421,7 @@ function ProjectSelector({
|
|
|
1390
1421
|
const marker = `${activeMarker}${defaultMarker}`;
|
|
1391
1422
|
const remoteDisplay = (project.gitRemote ?? "").slice(0, 38).padEnd(40);
|
|
1392
1423
|
if (isSelected) {
|
|
1393
|
-
return /* @__PURE__ */
|
|
1424
|
+
return /* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs7(Text10, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
1394
1425
|
marker,
|
|
1395
1426
|
" ",
|
|
1396
1427
|
project.name.padEnd(27),
|
|
@@ -1398,25 +1429,25 @@ function ProjectSelector({
|
|
|
1398
1429
|
project.description
|
|
1399
1430
|
] }) }, project.id);
|
|
1400
1431
|
}
|
|
1401
|
-
return /* @__PURE__ */ jsxs7(
|
|
1402
|
-
/* @__PURE__ */ jsxs7(
|
|
1432
|
+
return /* @__PURE__ */ jsxs7(Box10, { paddingX: 1, children: [
|
|
1433
|
+
/* @__PURE__ */ jsxs7(Text10, { color: isActive ? theme.status.modified : theme.table.fg, children: [
|
|
1403
1434
|
marker,
|
|
1404
1435
|
" ",
|
|
1405
1436
|
project.name.padEnd(27)
|
|
1406
1437
|
] }),
|
|
1407
|
-
/* @__PURE__ */
|
|
1408
|
-
/* @__PURE__ */
|
|
1438
|
+
/* @__PURE__ */ jsx10(Text10, { dimColor: true, children: remoteDisplay }),
|
|
1439
|
+
/* @__PURE__ */ jsx10(Text10, { dimColor: true, children: project.description })
|
|
1409
1440
|
] }, project.id);
|
|
1410
1441
|
}),
|
|
1411
|
-
/* @__PURE__ */
|
|
1412
|
-
/* @__PURE__ */
|
|
1442
|
+
/* @__PURE__ */ jsx10(Box10, { flexGrow: 1 }),
|
|
1443
|
+
/* @__PURE__ */ jsx10(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: "enter: select | d: set default | l: link git | c: create | esc: back" }) })
|
|
1413
1444
|
] });
|
|
1414
1445
|
}
|
|
1415
1446
|
|
|
1416
1447
|
// src/tui/components/ProjectForm.tsx
|
|
1417
1448
|
import { useState as useState4 } from "react";
|
|
1418
|
-
import { Box as
|
|
1419
|
-
import { jsx as
|
|
1449
|
+
import { Box as Box11, Text as Text11, useInput as useInput4 } from "ink";
|
|
1450
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1420
1451
|
var FIELDS2 = [
|
|
1421
1452
|
{ label: "Name", key: "name", type: "inline" },
|
|
1422
1453
|
{ label: "Key", key: "key", type: "inline" },
|
|
@@ -1477,41 +1508,41 @@ function ProjectForm({ onSave, onCancel }) {
|
|
|
1477
1508
|
}
|
|
1478
1509
|
}
|
|
1479
1510
|
});
|
|
1480
|
-
return /* @__PURE__ */ jsxs8(
|
|
1481
|
-
/* @__PURE__ */
|
|
1511
|
+
return /* @__PURE__ */ jsxs8(Box11, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
|
|
1512
|
+
/* @__PURE__ */ jsx11(Box11, { gap: 0, children: /* @__PURE__ */ jsxs8(Text11, { color: theme.title, bold: true, children: [
|
|
1482
1513
|
" ",
|
|
1483
1514
|
"new project"
|
|
1484
1515
|
] }) }),
|
|
1485
|
-
/* @__PURE__ */
|
|
1516
|
+
/* @__PURE__ */ jsx11(Box11, { flexDirection: "column", paddingX: 1, paddingY: 0, children: FIELDS2.map((field2, i) => {
|
|
1486
1517
|
const isFocused = i === focusIndex;
|
|
1487
1518
|
const value = values[field2.key] ?? "";
|
|
1488
|
-
return /* @__PURE__ */ jsxs8(
|
|
1489
|
-
/* @__PURE__ */ jsxs8(
|
|
1519
|
+
return /* @__PURE__ */ jsxs8(Box11, { gap: 1, children: [
|
|
1520
|
+
/* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.dialog.label : theme.yaml.key, bold: isFocused, children: [
|
|
1490
1521
|
isFocused ? ">" : " ",
|
|
1491
1522
|
" ",
|
|
1492
1523
|
field2.label.padEnd(14)
|
|
1493
1524
|
] }),
|
|
1494
|
-
field2.type === "inline" && /* @__PURE__ */ jsxs8(
|
|
1525
|
+
field2.type === "inline" && /* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
|
|
1495
1526
|
value,
|
|
1496
|
-
isFocused ? /* @__PURE__ */
|
|
1497
|
-
field2.key === "key" && !value && /* @__PURE__ */
|
|
1527
|
+
isFocused ? /* @__PURE__ */ jsx11(Text11, { color: theme.titleHighlight, children: "_" }) : "",
|
|
1528
|
+
field2.key === "key" && !value && /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: isFocused ? " (auto from name)" : "" })
|
|
1498
1529
|
] }),
|
|
1499
|
-
field2.type === "toggle" && /* @__PURE__ */ jsxs8(
|
|
1530
|
+
field2.type === "toggle" && /* @__PURE__ */ jsxs8(Text11, { color: isFocused ? theme.yaml.value : theme.table.fg, children: [
|
|
1500
1531
|
isFocused ? "< " : " ",
|
|
1501
1532
|
value,
|
|
1502
1533
|
isFocused ? " >" : ""
|
|
1503
1534
|
] })
|
|
1504
1535
|
] }, field2.key);
|
|
1505
1536
|
}) }),
|
|
1506
|
-
/* @__PURE__ */
|
|
1507
|
-
/* @__PURE__ */
|
|
1537
|
+
/* @__PURE__ */ jsx11(Box11, { flexGrow: 1 }),
|
|
1538
|
+
/* @__PURE__ */ jsx11(Box11, { paddingX: 1, children: /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "tab: next | shift+tab: prev | ctrl+s: save | esc: cancel" }) })
|
|
1508
1539
|
] });
|
|
1509
1540
|
}
|
|
1510
1541
|
|
|
1511
1542
|
// src/tui/components/ProjectLinkForm.tsx
|
|
1512
1543
|
import { useState as useState5 } from "react";
|
|
1513
|
-
import { Box as
|
|
1514
|
-
import { jsx as
|
|
1544
|
+
import { Box as Box12, Text as Text12, useInput as useInput5 } from "ink";
|
|
1545
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1515
1546
|
function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
|
|
1516
1547
|
const [remoteUrl, setRemoteUrl] = useState5(project.gitRemote ?? "");
|
|
1517
1548
|
useInput5((input, key) => {
|
|
@@ -1547,24 +1578,24 @@ function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
|
|
|
1547
1578
|
setRemoteUrl((v) => v + input);
|
|
1548
1579
|
}
|
|
1549
1580
|
});
|
|
1550
|
-
return /* @__PURE__ */ jsxs9(
|
|
1551
|
-
/* @__PURE__ */ jsxs9(
|
|
1552
|
-
/* @__PURE__ */ jsxs9(
|
|
1581
|
+
return /* @__PURE__ */ jsxs9(Box12, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
|
|
1582
|
+
/* @__PURE__ */ jsxs9(Box12, { gap: 0, children: [
|
|
1583
|
+
/* @__PURE__ */ jsxs9(Text12, { color: theme.title, bold: true, children: [
|
|
1553
1584
|
" ",
|
|
1554
1585
|
"link git remote"
|
|
1555
1586
|
] }),
|
|
1556
|
-
/* @__PURE__ */ jsxs9(
|
|
1587
|
+
/* @__PURE__ */ jsxs9(Text12, { color: theme.titleCounter, bold: true, children: [
|
|
1557
1588
|
" ",
|
|
1558
1589
|
"[",
|
|
1559
1590
|
project.name,
|
|
1560
1591
|
"]"
|
|
1561
1592
|
] })
|
|
1562
1593
|
] }),
|
|
1563
|
-
/* @__PURE__ */ jsxs9(
|
|
1564
|
-
/* @__PURE__ */ jsxs9(
|
|
1565
|
-
/* @__PURE__ */
|
|
1566
|
-
/* @__PURE__ */
|
|
1567
|
-
|
|
1594
|
+
/* @__PURE__ */ jsxs9(Box12, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
|
|
1595
|
+
/* @__PURE__ */ jsxs9(Box12, { gap: 1, children: [
|
|
1596
|
+
/* @__PURE__ */ jsx12(Text12, { color: theme.dialog.label, bold: true, children: "Current:" }),
|
|
1597
|
+
/* @__PURE__ */ jsx12(
|
|
1598
|
+
Text12,
|
|
1568
1599
|
{
|
|
1569
1600
|
color: project.gitRemote ? theme.yaml.value : theme.table.fg,
|
|
1570
1601
|
dimColor: !project.gitRemote,
|
|
@@ -1572,22 +1603,22 @@ function ProjectLinkForm({ project, onSave, onUnlink, onDetect, onCancel }) {
|
|
|
1572
1603
|
}
|
|
1573
1604
|
)
|
|
1574
1605
|
] }),
|
|
1575
|
-
/* @__PURE__ */ jsxs9(
|
|
1576
|
-
/* @__PURE__ */
|
|
1577
|
-
/* @__PURE__ */ jsxs9(
|
|
1606
|
+
/* @__PURE__ */ jsxs9(Box12, { gap: 1, marginTop: 1, children: [
|
|
1607
|
+
/* @__PURE__ */ jsx12(Text12, { color: theme.dialog.label, bold: true, children: "Remote URL: " }),
|
|
1608
|
+
/* @__PURE__ */ jsxs9(Text12, { color: theme.yaml.value, children: [
|
|
1578
1609
|
remoteUrl,
|
|
1579
|
-
/* @__PURE__ */
|
|
1610
|
+
/* @__PURE__ */ jsx12(Text12, { color: theme.titleHighlight, children: "_" })
|
|
1580
1611
|
] })
|
|
1581
1612
|
] })
|
|
1582
1613
|
] }),
|
|
1583
|
-
/* @__PURE__ */
|
|
1584
|
-
/* @__PURE__ */
|
|
1614
|
+
/* @__PURE__ */ jsx12(Box12, { flexGrow: 1 }),
|
|
1615
|
+
/* @__PURE__ */ jsx12(Box12, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "ctrl+s: save | ctrl+d: detect from cwd | ctrl+u: unlink | esc: cancel" }) })
|
|
1585
1616
|
] });
|
|
1586
1617
|
}
|
|
1587
1618
|
|
|
1588
1619
|
// src/tui/components/HelpOverlay.tsx
|
|
1589
|
-
import { Box as
|
|
1590
|
-
import { jsx as
|
|
1620
|
+
import { Box as Box13, Text as Text13 } from "ink";
|
|
1621
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1591
1622
|
var SECTIONS = [
|
|
1592
1623
|
{
|
|
1593
1624
|
title: "NAVIGATION",
|
|
@@ -1650,7 +1681,7 @@ var SECTIONS = [
|
|
|
1650
1681
|
];
|
|
1651
1682
|
function HelpOverlay() {
|
|
1652
1683
|
return /* @__PURE__ */ jsxs10(
|
|
1653
|
-
|
|
1684
|
+
Box13,
|
|
1654
1685
|
{
|
|
1655
1686
|
flexDirection: "column",
|
|
1656
1687
|
borderStyle: "bold",
|
|
@@ -1658,35 +1689,35 @@ function HelpOverlay() {
|
|
|
1658
1689
|
paddingX: 2,
|
|
1659
1690
|
paddingY: 1,
|
|
1660
1691
|
children: [
|
|
1661
|
-
/* @__PURE__ */ jsxs10(
|
|
1692
|
+
/* @__PURE__ */ jsxs10(Text13, { color: theme.title, bold: true, children: [
|
|
1662
1693
|
" ",
|
|
1663
1694
|
"Help"
|
|
1664
1695
|
] }),
|
|
1665
|
-
/* @__PURE__ */
|
|
1666
|
-
/* @__PURE__ */
|
|
1667
|
-
/* @__PURE__ */
|
|
1668
|
-
section.keys.map(([key, desc]) => /* @__PURE__ */ jsxs10(
|
|
1669
|
-
/* @__PURE__ */ jsxs10(
|
|
1696
|
+
/* @__PURE__ */ jsx13(Text13, { children: " " }),
|
|
1697
|
+
/* @__PURE__ */ jsx13(Box13, { flexDirection: "row", gap: 4, children: SECTIONS.map((section) => /* @__PURE__ */ jsxs10(Box13, { flexDirection: "column", children: [
|
|
1698
|
+
/* @__PURE__ */ jsx13(Text13, { color: theme.table.headerFg, bold: true, children: section.title }),
|
|
1699
|
+
section.keys.map(([key, desc]) => /* @__PURE__ */ jsxs10(Box13, { gap: 1, children: [
|
|
1700
|
+
/* @__PURE__ */ jsxs10(Text13, { color: theme.menu.key, bold: true, children: [
|
|
1670
1701
|
"<",
|
|
1671
1702
|
(key ?? "").padEnd(5),
|
|
1672
1703
|
">"
|
|
1673
1704
|
] }),
|
|
1674
|
-
/* @__PURE__ */
|
|
1705
|
+
/* @__PURE__ */ jsx13(Text13, { dimColor: true, children: desc })
|
|
1675
1706
|
] }, key))
|
|
1676
1707
|
] }, section.title)) }),
|
|
1677
|
-
/* @__PURE__ */
|
|
1678
|
-
/* @__PURE__ */
|
|
1708
|
+
/* @__PURE__ */ jsx13(Text13, { children: " " }),
|
|
1709
|
+
/* @__PURE__ */ jsx13(Text13, { dimColor: true, children: "Press any key to close" })
|
|
1679
1710
|
]
|
|
1680
1711
|
}
|
|
1681
1712
|
);
|
|
1682
1713
|
}
|
|
1683
1714
|
|
|
1684
1715
|
// src/tui/components/ConfirmDialog.tsx
|
|
1685
|
-
import { Box as
|
|
1686
|
-
import { jsx as
|
|
1716
|
+
import { Box as Box14, Text as Text14 } from "ink";
|
|
1717
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1687
1718
|
function ConfirmDialog({ task }) {
|
|
1688
1719
|
return /* @__PURE__ */ jsxs11(
|
|
1689
|
-
|
|
1720
|
+
Box14,
|
|
1690
1721
|
{
|
|
1691
1722
|
flexDirection: "column",
|
|
1692
1723
|
borderStyle: "bold",
|
|
@@ -1695,17 +1726,17 @@ function ConfirmDialog({ task }) {
|
|
|
1695
1726
|
paddingY: 1,
|
|
1696
1727
|
alignSelf: "center",
|
|
1697
1728
|
children: [
|
|
1698
|
-
/* @__PURE__ */
|
|
1699
|
-
/* @__PURE__ */
|
|
1700
|
-
/* @__PURE__ */ jsxs11(
|
|
1729
|
+
/* @__PURE__ */ jsx14(Text14, { color: theme.dialog.label, bold: true, children: "<Delete>" }),
|
|
1730
|
+
/* @__PURE__ */ jsx14(Text14, { children: " " }),
|
|
1731
|
+
/* @__PURE__ */ jsxs11(Text14, { color: theme.dialog.fg, children: [
|
|
1701
1732
|
'Delete task "',
|
|
1702
1733
|
task.name,
|
|
1703
1734
|
'"?'
|
|
1704
1735
|
] }),
|
|
1705
|
-
/* @__PURE__ */
|
|
1706
|
-
/* @__PURE__ */ jsxs11(
|
|
1707
|
-
/* @__PURE__ */
|
|
1708
|
-
|
|
1736
|
+
/* @__PURE__ */ jsx14(Text14, { children: " " }),
|
|
1737
|
+
/* @__PURE__ */ jsxs11(Box14, { gap: 3, children: [
|
|
1738
|
+
/* @__PURE__ */ jsx14(Box14, { children: /* @__PURE__ */ jsx14(
|
|
1739
|
+
Text14,
|
|
1709
1740
|
{
|
|
1710
1741
|
backgroundColor: theme.dialog.buttonFocusBg,
|
|
1711
1742
|
color: theme.dialog.buttonFocusFg,
|
|
@@ -1713,7 +1744,7 @@ function ConfirmDialog({ task }) {
|
|
|
1713
1744
|
children: " y: OK "
|
|
1714
1745
|
}
|
|
1715
1746
|
) }),
|
|
1716
|
-
/* @__PURE__ */
|
|
1747
|
+
/* @__PURE__ */ jsx14(Box14, { children: /* @__PURE__ */ jsx14(Text14, { backgroundColor: theme.dialog.buttonBg, color: theme.dialog.buttonFg, children: " n: Cancel " }) })
|
|
1717
1748
|
] })
|
|
1718
1749
|
]
|
|
1719
1750
|
}
|
|
@@ -1721,8 +1752,8 @@ function ConfirmDialog({ task }) {
|
|
|
1721
1752
|
}
|
|
1722
1753
|
|
|
1723
1754
|
// src/tui/components/DependencyList.tsx
|
|
1724
|
-
import { Box as
|
|
1725
|
-
import { Fragment as Fragment2, jsx as
|
|
1755
|
+
import { Box as Box15, Text as Text15 } from "ink";
|
|
1756
|
+
import { Fragment as Fragment2, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1726
1757
|
function TaskRow({
|
|
1727
1758
|
task,
|
|
1728
1759
|
globalIndex,
|
|
@@ -1730,16 +1761,16 @@ function TaskRow({
|
|
|
1730
1761
|
}) {
|
|
1731
1762
|
const isSelected = globalIndex === selectedIndex;
|
|
1732
1763
|
const statusColor = STATUS_COLOR[task.status] ?? theme.table.fg;
|
|
1733
|
-
return /* @__PURE__ */
|
|
1764
|
+
return /* @__PURE__ */ jsx15(Box15, { children: isSelected ? /* @__PURE__ */ jsxs12(Text15, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
1734
1765
|
"> ",
|
|
1735
1766
|
task.id.padEnd(12),
|
|
1736
1767
|
task.status.padEnd(14),
|
|
1737
1768
|
task.name
|
|
1738
1769
|
] }) : /* @__PURE__ */ jsxs12(Fragment2, { children: [
|
|
1739
|
-
/* @__PURE__ */
|
|
1740
|
-
/* @__PURE__ */
|
|
1741
|
-
/* @__PURE__ */
|
|
1742
|
-
/* @__PURE__ */
|
|
1770
|
+
/* @__PURE__ */ jsx15(Text15, { children: " " }),
|
|
1771
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.yaml.value, children: task.id.padEnd(12) }),
|
|
1772
|
+
/* @__PURE__ */ jsx15(Text15, { color: statusColor, children: task.status.padEnd(14) }),
|
|
1773
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.table.fg, children: task.name })
|
|
1743
1774
|
] }) }, task.id);
|
|
1744
1775
|
}
|
|
1745
1776
|
function DependencyList({
|
|
@@ -1760,23 +1791,23 @@ function DependencyList({
|
|
|
1760
1791
|
const relatedOffset = offset;
|
|
1761
1792
|
offset += related.length;
|
|
1762
1793
|
const duplicatesOffset = offset;
|
|
1763
|
-
return /* @__PURE__ */ jsxs12(
|
|
1764
|
-
/* @__PURE__ */ jsxs12(
|
|
1765
|
-
/* @__PURE__ */ jsxs12(
|
|
1794
|
+
return /* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", flexGrow: 1, borderStyle: "bold", borderColor: theme.borderFocus, children: [
|
|
1795
|
+
/* @__PURE__ */ jsxs12(Box15, { gap: 0, children: [
|
|
1796
|
+
/* @__PURE__ */ jsxs12(Text15, { color: theme.title, bold: true, children: [
|
|
1766
1797
|
" ",
|
|
1767
1798
|
"dependencies"
|
|
1768
1799
|
] }),
|
|
1769
|
-
/* @__PURE__ */
|
|
1770
|
-
/* @__PURE__ */
|
|
1771
|
-
/* @__PURE__ */
|
|
1800
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.fg, children: "(" }),
|
|
1801
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.titleHighlight, bold: true, children: task.name }),
|
|
1802
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.fg, children: ")" })
|
|
1772
1803
|
] }),
|
|
1773
|
-
/* @__PURE__ */ jsxs12(
|
|
1774
|
-
/* @__PURE__ */ jsxs12(
|
|
1804
|
+
/* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
|
|
1805
|
+
/* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
|
|
1775
1806
|
"BLOCKED BY (",
|
|
1776
1807
|
blockers.length,
|
|
1777
1808
|
")"
|
|
1778
1809
|
] }),
|
|
1779
|
-
blockers.length === 0 ? /* @__PURE__ */
|
|
1810
|
+
blockers.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No blockers" }) : blockers.map((t, i) => /* @__PURE__ */ jsx15(
|
|
1780
1811
|
TaskRow,
|
|
1781
1812
|
{
|
|
1782
1813
|
task: t,
|
|
@@ -1786,13 +1817,13 @@ function DependencyList({
|
|
|
1786
1817
|
t.id
|
|
1787
1818
|
))
|
|
1788
1819
|
] }),
|
|
1789
|
-
/* @__PURE__ */ jsxs12(
|
|
1790
|
-
/* @__PURE__ */ jsxs12(
|
|
1820
|
+
/* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
|
|
1821
|
+
/* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
|
|
1791
1822
|
"BLOCKS (",
|
|
1792
1823
|
dependents.length,
|
|
1793
1824
|
")"
|
|
1794
1825
|
] }),
|
|
1795
|
-
dependents.length === 0 ? /* @__PURE__ */
|
|
1826
|
+
dependents.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No dependents" }) : dependents.map((t, i) => /* @__PURE__ */ jsx15(
|
|
1796
1827
|
TaskRow,
|
|
1797
1828
|
{
|
|
1798
1829
|
task: t,
|
|
@@ -1802,13 +1833,13 @@ function DependencyList({
|
|
|
1802
1833
|
t.id
|
|
1803
1834
|
))
|
|
1804
1835
|
] }),
|
|
1805
|
-
/* @__PURE__ */ jsxs12(
|
|
1806
|
-
/* @__PURE__ */ jsxs12(
|
|
1836
|
+
/* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
|
|
1837
|
+
/* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
|
|
1807
1838
|
"RELATES TO (",
|
|
1808
1839
|
related.length,
|
|
1809
1840
|
")"
|
|
1810
1841
|
] }),
|
|
1811
|
-
related.length === 0 ? /* @__PURE__ */
|
|
1842
|
+
related.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No related tasks" }) : related.map((t, i) => /* @__PURE__ */ jsx15(
|
|
1812
1843
|
TaskRow,
|
|
1813
1844
|
{
|
|
1814
1845
|
task: t,
|
|
@@ -1818,13 +1849,13 @@ function DependencyList({
|
|
|
1818
1849
|
t.id
|
|
1819
1850
|
))
|
|
1820
1851
|
] }),
|
|
1821
|
-
/* @__PURE__ */ jsxs12(
|
|
1822
|
-
/* @__PURE__ */ jsxs12(
|
|
1852
|
+
/* @__PURE__ */ jsxs12(Box15, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [
|
|
1853
|
+
/* @__PURE__ */ jsxs12(Text15, { color: theme.table.headerFg, bold: true, children: [
|
|
1823
1854
|
"DUPLICATES (",
|
|
1824
1855
|
duplicates.length,
|
|
1825
1856
|
")"
|
|
1826
1857
|
] }),
|
|
1827
|
-
duplicates.length === 0 ? /* @__PURE__ */
|
|
1858
|
+
duplicates.length === 0 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " No duplicate tasks" }) : duplicates.map((t, i) => /* @__PURE__ */ jsx15(
|
|
1828
1859
|
TaskRow,
|
|
1829
1860
|
{
|
|
1830
1861
|
task: t,
|
|
@@ -1834,19 +1865,19 @@ function DependencyList({
|
|
|
1834
1865
|
t.id
|
|
1835
1866
|
))
|
|
1836
1867
|
] }),
|
|
1837
|
-
/* @__PURE__ */
|
|
1838
|
-
isAddingDep && /* @__PURE__ */ jsxs12(
|
|
1839
|
-
/* @__PURE__ */
|
|
1840
|
-
/* @__PURE__ */
|
|
1841
|
-
/* @__PURE__ */
|
|
1868
|
+
/* @__PURE__ */ jsx15(Box15, { flexGrow: 1 }),
|
|
1869
|
+
isAddingDep && /* @__PURE__ */ jsxs12(Box15, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
|
|
1870
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.prompt, children: "depends on (id or id:type): " }),
|
|
1871
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.prompt, children: addDepInput }),
|
|
1872
|
+
/* @__PURE__ */ jsx15(Text15, { color: theme.promptSuggest, children: "_" })
|
|
1842
1873
|
] }),
|
|
1843
|
-
/* @__PURE__ */
|
|
1874
|
+
/* @__PURE__ */ jsx15(Box15, { paddingX: 1, children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "a: add dep (id or id:relates-to) | x: remove selected | enter: go to task | esc: back" }) })
|
|
1844
1875
|
] });
|
|
1845
1876
|
}
|
|
1846
1877
|
|
|
1847
1878
|
// src/tui/components/EpicPanel.tsx
|
|
1848
|
-
import { Box as
|
|
1849
|
-
import { jsx as
|
|
1879
|
+
import { Box as Box16, Text as Text16 } from "ink";
|
|
1880
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1850
1881
|
var PAGE_SIZE2 = 20;
|
|
1851
1882
|
function EpicPanel({
|
|
1852
1883
|
epics,
|
|
@@ -1860,33 +1891,33 @@ function EpicPanel({
|
|
|
1860
1891
|
const viewStart = currentPage * PAGE_SIZE2;
|
|
1861
1892
|
const visibleEpics = epics.slice(viewStart, viewStart + PAGE_SIZE2);
|
|
1862
1893
|
return /* @__PURE__ */ jsxs13(
|
|
1863
|
-
|
|
1894
|
+
Box16,
|
|
1864
1895
|
{
|
|
1865
1896
|
flexDirection: "column",
|
|
1866
1897
|
width: 48,
|
|
1867
1898
|
borderStyle: "bold",
|
|
1868
1899
|
borderColor: isFocused ? theme.borderFocus : theme.border,
|
|
1869
1900
|
children: [
|
|
1870
|
-
/* @__PURE__ */ jsxs13(
|
|
1871
|
-
/* @__PURE__ */ jsxs13(
|
|
1901
|
+
/* @__PURE__ */ jsxs13(Box16, { children: [
|
|
1902
|
+
/* @__PURE__ */ jsxs13(Text16, { color: theme.title, bold: true, children: [
|
|
1872
1903
|
" ",
|
|
1873
1904
|
"epics"
|
|
1874
1905
|
] }),
|
|
1875
|
-
/* @__PURE__ */ jsxs13(
|
|
1906
|
+
/* @__PURE__ */ jsxs13(Text16, { color: theme.titleCounter, bold: true, children: [
|
|
1876
1907
|
"[",
|
|
1877
1908
|
epics.length,
|
|
1878
1909
|
"]"
|
|
1879
1910
|
] }),
|
|
1880
|
-
isReordering && /* @__PURE__ */ jsxs13(
|
|
1911
|
+
isReordering && /* @__PURE__ */ jsxs13(Text16, { color: theme.flash.warn, bold: true, children: [
|
|
1881
1912
|
" ",
|
|
1882
1913
|
"REORDER"
|
|
1883
1914
|
] }),
|
|
1884
|
-
filterActive && /* @__PURE__ */ jsxs13(
|
|
1915
|
+
filterActive && /* @__PURE__ */ jsxs13(Text16, { color: theme.titleFilter, children: [
|
|
1885
1916
|
" *",
|
|
1886
1917
|
selectedEpicIds.size
|
|
1887
1918
|
] })
|
|
1888
1919
|
] }),
|
|
1889
|
-
/* @__PURE__ */
|
|
1920
|
+
/* @__PURE__ */ jsx16(Box16, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: epics.length === 0 ? /* @__PURE__ */ jsx16(Box16, { paddingX: 1, children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, children: "No epics" }) }) : visibleEpics.map((epic, i) => {
|
|
1890
1921
|
const actualIndex = viewStart + i;
|
|
1891
1922
|
const isSelected = actualIndex === selectedIndex && isFocused;
|
|
1892
1923
|
const isChecked = selectedEpicIds.has(epic.id);
|
|
@@ -1894,21 +1925,21 @@ function EpicPanel({
|
|
|
1894
1925
|
const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;
|
|
1895
1926
|
if (isSelected) {
|
|
1896
1927
|
const cursorBg = isReordering ? theme.flash.warn : theme.table.cursorBg;
|
|
1897
|
-
return /* @__PURE__ */
|
|
1928
|
+
return /* @__PURE__ */ jsx16(Box16, { children: /* @__PURE__ */ jsxs13(Text16, { backgroundColor: cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
1898
1929
|
isReordering ? "~ " : " ",
|
|
1899
1930
|
marker,
|
|
1900
1931
|
" ",
|
|
1901
1932
|
epic.name
|
|
1902
1933
|
] }) }, epic.id);
|
|
1903
1934
|
}
|
|
1904
|
-
return /* @__PURE__ */
|
|
1935
|
+
return /* @__PURE__ */ jsx16(Box16, { children: /* @__PURE__ */ jsxs13(Text16, { color: isChecked ? theme.titleHighlight : statusColor, children: [
|
|
1905
1936
|
" ",
|
|
1906
1937
|
marker,
|
|
1907
1938
|
" ",
|
|
1908
1939
|
epic.name
|
|
1909
1940
|
] }) }, epic.id);
|
|
1910
1941
|
}) }),
|
|
1911
|
-
epics.length > PAGE_SIZE2 && /* @__PURE__ */
|
|
1942
|
+
epics.length > PAGE_SIZE2 && /* @__PURE__ */ jsx16(Box16, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs13(Text16, { dimColor: true, children: [
|
|
1912
1943
|
"[",
|
|
1913
1944
|
viewStart + 1,
|
|
1914
1945
|
"-",
|
|
@@ -1924,8 +1955,8 @@ function EpicPanel({
|
|
|
1924
1955
|
|
|
1925
1956
|
// src/tui/components/EpicPicker.tsx
|
|
1926
1957
|
import { useState as useState6 } from "react";
|
|
1927
|
-
import { Box as
|
|
1928
|
-
import { Fragment as Fragment3, jsx as
|
|
1958
|
+
import { Box as Box17, Text as Text17, useInput as useInput6, useStdout as useStdout3 } from "ink";
|
|
1959
|
+
import { Fragment as Fragment3, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1929
1960
|
function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
|
|
1930
1961
|
const { stdout } = useStdout3();
|
|
1931
1962
|
const termHeight = stdout.rows > 0 ? stdout.rows : 24;
|
|
@@ -1998,53 +2029,53 @@ function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
|
|
|
1998
2029
|
return;
|
|
1999
2030
|
}
|
|
2000
2031
|
});
|
|
2001
|
-
return /* @__PURE__ */ jsxs14(
|
|
2002
|
-
/* @__PURE__ */ jsxs14(
|
|
2003
|
-
/* @__PURE__ */ jsxs14(
|
|
2032
|
+
return /* @__PURE__ */ jsxs14(Box17, { flexDirection: "column", borderStyle: "bold", borderColor: theme.borderFocus, flexGrow: 1, children: [
|
|
2033
|
+
/* @__PURE__ */ jsxs14(Box17, { gap: 0, children: [
|
|
2034
|
+
/* @__PURE__ */ jsxs14(Text17, { color: theme.title, bold: true, children: [
|
|
2004
2035
|
" ",
|
|
2005
2036
|
"assign to epic"
|
|
2006
2037
|
] }),
|
|
2007
|
-
/* @__PURE__ */ jsxs14(
|
|
2038
|
+
/* @__PURE__ */ jsxs14(Text17, { color: theme.titleCounter, bold: true, children: [
|
|
2008
2039
|
" ",
|
|
2009
2040
|
"[",
|
|
2010
2041
|
epics.length,
|
|
2011
2042
|
"]"
|
|
2012
2043
|
] })
|
|
2013
2044
|
] }),
|
|
2014
|
-
isSearching ? /* @__PURE__ */ jsxs14(
|
|
2015
|
-
/* @__PURE__ */
|
|
2016
|
-
/* @__PURE__ */
|
|
2017
|
-
/* @__PURE__ */
|
|
2018
|
-
] }) : searchQuery ? /* @__PURE__ */
|
|
2045
|
+
isSearching ? /* @__PURE__ */ jsxs14(Box17, { borderStyle: "round", borderColor: theme.prompt, paddingX: 1, children: [
|
|
2046
|
+
/* @__PURE__ */ jsx17(Text17, { color: theme.prompt, children: "/" }),
|
|
2047
|
+
/* @__PURE__ */ jsx17(Text17, { color: theme.prompt, children: searchQuery }),
|
|
2048
|
+
/* @__PURE__ */ jsx17(Text17, { color: theme.promptSuggest, children: "_" })
|
|
2049
|
+
] }) : searchQuery ? /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text17, { color: theme.titleFilter, children: [
|
|
2019
2050
|
"/",
|
|
2020
2051
|
searchQuery
|
|
2021
2052
|
] }) }) : null,
|
|
2022
|
-
/* @__PURE__ */
|
|
2053
|
+
/* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsxs14(Text17, { color: theme.table.headerFg, bold: true, children: [
|
|
2023
2054
|
" ",
|
|
2024
2055
|
"ID".padEnd(14),
|
|
2025
2056
|
"STATUS".padEnd(14),
|
|
2026
2057
|
"NAME"
|
|
2027
2058
|
] }) }),
|
|
2028
|
-
filtered.length === 0 ? /* @__PURE__ */
|
|
2059
|
+
filtered.length === 0 ? /* @__PURE__ */ jsx17(Box17, { paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "No epics match the filter" }) }) : visible.map((epic, i) => {
|
|
2029
2060
|
const actualIndex = viewStart + i;
|
|
2030
2061
|
const isCursor = actualIndex === cursorIndex;
|
|
2031
2062
|
const isCurrent = epic.id === currentEpicId;
|
|
2032
2063
|
const marker = isCurrent ? "* " : " ";
|
|
2033
2064
|
const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;
|
|
2034
|
-
return /* @__PURE__ */
|
|
2065
|
+
return /* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: isCursor ? /* @__PURE__ */ jsxs14(Text17, { backgroundColor: theme.table.cursorBg, color: theme.table.cursorFg, bold: true, children: [
|
|
2035
2066
|
"> ",
|
|
2036
2067
|
epic.id.padEnd(14),
|
|
2037
2068
|
epic.status.padEnd(14),
|
|
2038
2069
|
epic.name
|
|
2039
2070
|
] }) : /* @__PURE__ */ jsxs14(Fragment3, { children: [
|
|
2040
|
-
/* @__PURE__ */
|
|
2041
|
-
/* @__PURE__ */
|
|
2042
|
-
/* @__PURE__ */
|
|
2043
|
-
/* @__PURE__ */
|
|
2071
|
+
/* @__PURE__ */ jsx17(Text17, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: marker }),
|
|
2072
|
+
/* @__PURE__ */ jsx17(Text17, { color: theme.yaml.value, children: epic.id.padEnd(14) }),
|
|
2073
|
+
/* @__PURE__ */ jsx17(Text17, { color: statusColor, children: epic.status.padEnd(14) }),
|
|
2074
|
+
/* @__PURE__ */ jsx17(Text17, { color: isCurrent ? theme.titleHighlight : theme.table.fg, children: epic.name })
|
|
2044
2075
|
] }) }, epic.id);
|
|
2045
2076
|
}),
|
|
2046
|
-
/* @__PURE__ */
|
|
2047
|
-
filtered.length > maxVisible && /* @__PURE__ */
|
|
2077
|
+
/* @__PURE__ */ jsx17(Box17, { flexGrow: 1 }),
|
|
2078
|
+
filtered.length > maxVisible && /* @__PURE__ */ jsx17(Box17, { justifyContent: "flex-end", paddingRight: 1, children: /* @__PURE__ */ jsxs14(Text17, { dimColor: true, children: [
|
|
2048
2079
|
"[",
|
|
2049
2080
|
viewStart + 1,
|
|
2050
2081
|
"-",
|
|
@@ -2053,7 +2084,7 @@ function EpicPicker({ epics, currentEpicId, onSelect, onCancel }) {
|
|
|
2053
2084
|
filtered.length,
|
|
2054
2085
|
"]"
|
|
2055
2086
|
] }) }),
|
|
2056
|
-
/* @__PURE__ */
|
|
2087
|
+
/* @__PURE__ */ jsx17(Box17, { paddingX: 1, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "enter: assign | x: unassign | /: search | esc: cancel" }) })
|
|
2057
2088
|
] });
|
|
2058
2089
|
}
|
|
2059
2090
|
|
|
@@ -2093,7 +2124,7 @@ function useAutoRefetch(dbPath, onRefetch) {
|
|
|
2093
2124
|
}
|
|
2094
2125
|
|
|
2095
2126
|
// src/tui/components/App.tsx
|
|
2096
|
-
import { jsx as
|
|
2127
|
+
import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2097
2128
|
var STATUS_CYCLE = [
|
|
2098
2129
|
TaskStatus.Backlog,
|
|
2099
2130
|
TaskStatus.Todo,
|
|
@@ -3013,12 +3044,12 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3013
3044
|
loadDeps(previewTaskId);
|
|
3014
3045
|
}
|
|
3015
3046
|
}, [state.activeView, previewTaskId, loadDeps]);
|
|
3016
|
-
return /* @__PURE__ */ jsxs15(
|
|
3017
|
-
/* @__PURE__ */
|
|
3018
|
-
/* @__PURE__ */ jsxs15(
|
|
3019
|
-
state.confirmDelete && /* @__PURE__ */
|
|
3020
|
-
!state.confirmDelete && state.activeView === ViewType.TaskList && /* @__PURE__ */ jsxs15(
|
|
3021
|
-
/* @__PURE__ */
|
|
3047
|
+
return /* @__PURE__ */ jsxs15(Box18, { flexDirection: "column", height: stdout.rows, children: [
|
|
3048
|
+
/* @__PURE__ */ jsx18(Header, { state }),
|
|
3049
|
+
/* @__PURE__ */ jsxs15(Box18, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: [
|
|
3050
|
+
state.confirmDelete && /* @__PURE__ */ jsx18(ConfirmDialog, { task: state.confirmDelete }),
|
|
3051
|
+
!state.confirmDelete && state.activeView === ViewType.TaskList && /* @__PURE__ */ jsxs15(Box18, { flexDirection: "row", flexGrow: 1, children: [
|
|
3052
|
+
/* @__PURE__ */ jsx18(
|
|
3022
3053
|
EpicPanel,
|
|
3023
3054
|
{
|
|
3024
3055
|
epics: state.epics,
|
|
@@ -3028,7 +3059,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3028
3059
|
isReordering: state.isEpicReordering
|
|
3029
3060
|
}
|
|
3030
3061
|
),
|
|
3031
|
-
/* @__PURE__ */
|
|
3062
|
+
/* @__PURE__ */ jsx18(Box18, { width: taskListWidth, children: /* @__PURE__ */ jsx18(
|
|
3032
3063
|
TaskList,
|
|
3033
3064
|
{
|
|
3034
3065
|
tasks: state.tasks,
|
|
@@ -3049,7 +3080,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3049
3080
|
epicFilterActive: state.selectedEpicIds.size > 0
|
|
3050
3081
|
}
|
|
3051
3082
|
) }),
|
|
3052
|
-
/* @__PURE__ */
|
|
3083
|
+
/* @__PURE__ */ jsx18(Box18, { width: taskDetailWidth, children: previewTask ? /* @__PURE__ */ jsx18(
|
|
3053
3084
|
TaskDetail,
|
|
3054
3085
|
{
|
|
3055
3086
|
task: previewTask,
|
|
@@ -3061,23 +3092,23 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3061
3092
|
scrollOffset: state.detailScrollOffset
|
|
3062
3093
|
}
|
|
3063
3094
|
) : /* @__PURE__ */ jsxs15(
|
|
3064
|
-
|
|
3095
|
+
Box18,
|
|
3065
3096
|
{
|
|
3066
3097
|
flexDirection: "column",
|
|
3067
3098
|
flexGrow: 1,
|
|
3068
3099
|
borderStyle: "bold",
|
|
3069
3100
|
borderColor: theme.border,
|
|
3070
3101
|
children: [
|
|
3071
|
-
/* @__PURE__ */
|
|
3102
|
+
/* @__PURE__ */ jsx18(Box18, { children: /* @__PURE__ */ jsxs15(Text18, { color: theme.title, bold: true, children: [
|
|
3072
3103
|
" ",
|
|
3073
3104
|
"detail"
|
|
3074
3105
|
] }) }),
|
|
3075
|
-
/* @__PURE__ */
|
|
3106
|
+
/* @__PURE__ */ jsx18(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx18(Text18, { dimColor: true, children: "No task selected" }) })
|
|
3076
3107
|
]
|
|
3077
3108
|
}
|
|
3078
3109
|
) })
|
|
3079
3110
|
] }),
|
|
3080
|
-
!state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && /* @__PURE__ */
|
|
3111
|
+
!state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && /* @__PURE__ */ jsx18(
|
|
3081
3112
|
TaskDetail,
|
|
3082
3113
|
{
|
|
3083
3114
|
task: state.selectedTask,
|
|
@@ -3088,7 +3119,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3088
3119
|
scrollOffset: state.detailScrollOffset
|
|
3089
3120
|
}
|
|
3090
3121
|
),
|
|
3091
|
-
!state.confirmDelete && state.activeView === ViewType.DependencyList && state.selectedTask && /* @__PURE__ */
|
|
3122
|
+
!state.confirmDelete && state.activeView === ViewType.DependencyList && state.selectedTask && /* @__PURE__ */ jsx18(
|
|
3092
3123
|
DependencyList,
|
|
3093
3124
|
{
|
|
3094
3125
|
task: state.selectedTask,
|
|
@@ -3101,7 +3132,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3101
3132
|
addDepInput: state.addDepInput
|
|
3102
3133
|
}
|
|
3103
3134
|
),
|
|
3104
|
-
!state.confirmDelete && (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && /* @__PURE__ */
|
|
3135
|
+
!state.confirmDelete && (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && /* @__PURE__ */ jsx18(
|
|
3105
3136
|
TaskForm,
|
|
3106
3137
|
{
|
|
3107
3138
|
editingTask: state.activeView === ViewType.TaskEdit ? state.selectedTask : null,
|
|
@@ -3111,7 +3142,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3111
3142
|
onCancel: handleFormCancel
|
|
3112
3143
|
}
|
|
3113
3144
|
),
|
|
3114
|
-
!state.confirmDelete && state.activeView === ViewType.EpicPicker && state.selectedTask && /* @__PURE__ */
|
|
3145
|
+
!state.confirmDelete && state.activeView === ViewType.EpicPicker && state.selectedTask && /* @__PURE__ */ jsx18(
|
|
3115
3146
|
EpicPicker,
|
|
3116
3147
|
{
|
|
3117
3148
|
epics: state.epics,
|
|
@@ -3120,7 +3151,7 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3120
3151
|
onCancel: handleEpicPickerCancel
|
|
3121
3152
|
}
|
|
3122
3153
|
),
|
|
3123
|
-
!state.confirmDelete && state.activeView === ViewType.ProjectSelector && /* @__PURE__ */
|
|
3154
|
+
!state.confirmDelete && state.activeView === ViewType.ProjectSelector && /* @__PURE__ */ jsx18(
|
|
3124
3155
|
ProjectSelector,
|
|
3125
3156
|
{
|
|
3126
3157
|
projects: state.projects,
|
|
@@ -3132,8 +3163,8 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3132
3163
|
onCancel: handleProjectCancel
|
|
3133
3164
|
}
|
|
3134
3165
|
),
|
|
3135
|
-
!state.confirmDelete && state.activeView === ViewType.ProjectCreate && /* @__PURE__ */
|
|
3136
|
-
!state.confirmDelete && state.activeView === ViewType.ProjectLink && state.linkingProject && /* @__PURE__ */
|
|
3166
|
+
!state.confirmDelete && state.activeView === ViewType.ProjectCreate && /* @__PURE__ */ jsx18(ProjectForm, { onSave: handleProjectFormSave, onCancel: handleProjectFormCancel }),
|
|
3167
|
+
!state.confirmDelete && state.activeView === ViewType.ProjectLink && state.linkingProject && /* @__PURE__ */ jsx18(
|
|
3137
3168
|
ProjectLinkForm,
|
|
3138
3169
|
{
|
|
3139
3170
|
project: state.linkingProject,
|
|
@@ -3143,17 +3174,17 @@ ${state.selectedTask.additionalRequirements}`;
|
|
|
3143
3174
|
onCancel: handleLinkCancel
|
|
3144
3175
|
}
|
|
3145
3176
|
),
|
|
3146
|
-
!state.confirmDelete && state.activeView === ViewType.Help && /* @__PURE__ */
|
|
3177
|
+
!state.confirmDelete && state.activeView === ViewType.Help && /* @__PURE__ */ jsx18(HelpOverlay, {})
|
|
3147
3178
|
] }),
|
|
3148
|
-
/* @__PURE__ */
|
|
3149
|
-
state.flash && /* @__PURE__ */
|
|
3179
|
+
/* @__PURE__ */ jsx18(Crumbs, { breadcrumbs: state.breadcrumbs }),
|
|
3180
|
+
state.flash && /* @__PURE__ */ jsx18(FlashMessage, { message: state.flash.message, level: state.flash.level })
|
|
3150
3181
|
] });
|
|
3151
3182
|
}
|
|
3152
3183
|
|
|
3153
3184
|
// src/tui/index.tsx
|
|
3154
|
-
import { jsx as
|
|
3185
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
3155
3186
|
async function launchTUI(container, initialProject) {
|
|
3156
|
-
const instance = render(/* @__PURE__ */
|
|
3187
|
+
const instance = render(/* @__PURE__ */ jsx19(App, { container, initialProject }), {
|
|
3157
3188
|
exitOnCtrlC: true
|
|
3158
3189
|
});
|
|
3159
3190
|
await instance.waitUntilExit();
|
|
@@ -3161,4 +3192,4 @@ async function launchTUI(container, initialProject) {
|
|
|
3161
3192
|
export {
|
|
3162
3193
|
launchTUI
|
|
3163
3194
|
};
|
|
3164
|
-
//# sourceMappingURL=tui-
|
|
3195
|
+
//# sourceMappingURL=tui-24ZW56Q6.js.map
|