@brainfile/cli 0.8.1 → 0.9.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/dist/commands/tui.d.ts.map +1 -1
- package/dist/commands/tui.js +6 -701
- package/dist/commands/tui.js.map +1 -1
- package/dist/tui/BrainfileTUI.d.ts +4 -0
- package/dist/tui/BrainfileTUI.d.ts.map +1 -0
- package/dist/tui/BrainfileTUI.js +198 -0
- package/dist/tui/BrainfileTUI.js.map +1 -0
- package/dist/tui/actions.d.ts +49 -0
- package/dist/tui/actions.d.ts.map +1 -0
- package/dist/tui/actions.js +569 -0
- package/dist/tui/actions.js.map +1 -0
- package/dist/tui/components/ColumnTabs.d.ts +9 -0
- package/dist/tui/components/ColumnTabs.d.ts.map +1 -0
- package/dist/tui/components/ColumnTabs.js +30 -0
- package/dist/tui/components/ColumnTabs.js.map +1 -0
- package/dist/tui/components/Header.d.ts +12 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +24 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/HelpOverlay.d.ts +7 -0
- package/dist/tui/components/HelpOverlay.d.ts.map +1 -0
- package/dist/tui/components/HelpOverlay.js +56 -0
- package/dist/tui/components/HelpOverlay.js.map +1 -0
- package/dist/tui/components/Overlays.d.ts +41 -0
- package/dist/tui/components/Overlays.d.ts.map +1 -0
- package/dist/tui/components/Overlays.js +127 -0
- package/dist/tui/components/Overlays.js.map +1 -0
- package/dist/tui/components/ProgressBar.d.ts +8 -0
- package/dist/tui/components/ProgressBar.d.ts.map +1 -0
- package/dist/tui/components/ProgressBar.js +35 -0
- package/dist/tui/components/ProgressBar.js.map +1 -0
- package/dist/tui/components/SearchBar.d.ts +7 -0
- package/dist/tui/components/SearchBar.d.ts.map +1 -0
- package/dist/tui/components/SearchBar.js +22 -0
- package/dist/tui/components/SearchBar.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +12 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +37 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/TaskCard.d.ts +19 -0
- package/dist/tui/components/TaskCard.d.ts.map +1 -0
- package/dist/tui/components/TaskCard.js +105 -0
- package/dist/tui/components/TaskCard.js.map +1 -0
- package/dist/tui/components/TaskList.d.ts +11 -0
- package/dist/tui/components/TaskList.d.ts.map +1 -0
- package/dist/tui/components/TaskList.js +56 -0
- package/dist/tui/components/TaskList.js.map +1 -0
- package/dist/tui/components/index.d.ts +19 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +26 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/hooks/index.d.ts +3 -0
- package/dist/tui/hooks/index.d.ts.map +1 -0
- package/dist/tui/hooks/index.js +8 -0
- package/dist/tui/hooks/index.js.map +1 -0
- package/dist/tui/hooks/useBrainfileLoader.d.ts +5 -0
- package/dist/tui/hooks/useBrainfileLoader.d.ts.map +1 -0
- package/dist/tui/hooks/useBrainfileLoader.js +171 -0
- package/dist/tui/hooks/useBrainfileLoader.js.map +1 -0
- package/dist/tui/hooks/useKeyboardNavigation.d.ts +16 -0
- package/dist/tui/hooks/useKeyboardNavigation.d.ts.map +1 -0
- package/dist/tui/hooks/useKeyboardNavigation.js +434 -0
- package/dist/tui/hooks/useKeyboardNavigation.js.map +1 -0
- package/dist/tui/index.d.ts +9 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +36 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/theme.d.ts +113 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +132 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.d.ts +30 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +6 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/utils.d.ts +3 -0
- package/dist/tui/utils.d.ts.map +1 -0
- package/dist/tui/utils.js +31 -0
- package/dist/tui/utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Header = Header;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_js_1 = require("../theme.js");
|
|
10
|
+
function Header({ title, reloadFlash }) {
|
|
11
|
+
return (react_1.default.createElement(ink_1.Box, { paddingLeft: 1, paddingRight: 1 },
|
|
12
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true },
|
|
13
|
+
theme_js_1.BOX.topLeft,
|
|
14
|
+
theme_js_1.BOX.horizontal),
|
|
15
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, bold: true },
|
|
16
|
+
" ",
|
|
17
|
+
title,
|
|
18
|
+
" "),
|
|
19
|
+
reloadFlash ? (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success },
|
|
20
|
+
" ",
|
|
21
|
+
theme_js_1.ICONS.reload,
|
|
22
|
+
" reloaded")) : null));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";;;;;AAUA,wBAUC;AApBD,kDAA0B;AAC1B,6BAAgC;AAChC,0CAAkD;AAQlD,SAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAe;IACxD,OAAO,CACL,8BAAC,SAAG,IAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;QAClC,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,MAAM,EAAE,IAAI;YAAE,cAAG,CAAC,OAAO;YAAE,cAAG,CAAC,UAAU,CAAQ;QACtE,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,IAAI,EAAE,IAAI;;YAAG,KAAK;gBAAS;QAC/C,WAAW,CAAC,CAAC,CAAC,CACb,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,OAAO;;YAAI,gBAAK,CAAC,MAAM;wBAAiB,CAC9D,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpOverlay.d.ts","sourceRoot":"","sources":["../../../src/tui/components/HelpOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,gBAAgB,qBA6EtE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HelpOverlay = HelpOverlay;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_js_1 = require("../theme.js");
|
|
10
|
+
function HelpOverlay({ termWidth, termHeight }) {
|
|
11
|
+
const panelWidth = 58;
|
|
12
|
+
const panelHeight = 16;
|
|
13
|
+
// Calculate centering
|
|
14
|
+
const padTop = Math.max(0, Math.floor((termHeight - panelHeight) / 2));
|
|
15
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", width: termWidth, height: termHeight, alignItems: "center" },
|
|
16
|
+
padTop > 0 && react_1.default.createElement(ink_1.Box, { height: padTop }),
|
|
17
|
+
react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: theme_js_1.PALETTE.accent, paddingX: 2, paddingY: 1, width: panelWidth },
|
|
18
|
+
react_1.default.createElement(ink_1.Box, { justifyContent: "center", marginBottom: 1 },
|
|
19
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, bold: true }, "KEYBOARD SHORTCUTS")),
|
|
20
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
21
|
+
react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginRight: 3 },
|
|
22
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true }, "Navigation"),
|
|
23
|
+
react_1.default.createElement(HelpRow, { k: "j/k \u2193/\u2191", desc: "Move up/down" }),
|
|
24
|
+
react_1.default.createElement(HelpRow, { k: "h/l \u2190/\u2192", desc: "Switch columns" }),
|
|
25
|
+
react_1.default.createElement(HelpRow, { k: "g/G", desc: "Top / Bottom" }),
|
|
26
|
+
react_1.default.createElement(HelpRow, { k: "^d/^u", desc: "Page down/up" }),
|
|
27
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
28
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true }, "View")),
|
|
29
|
+
react_1.default.createElement(HelpRow, { k: "ENTER", desc: "Expand/collapse" }),
|
|
30
|
+
react_1.default.createElement(HelpRow, { k: "/", desc: "Search" }),
|
|
31
|
+
react_1.default.createElement(HelpRow, { k: "r", desc: "Refresh" }),
|
|
32
|
+
react_1.default.createElement(HelpRow, { k: "ESC", desc: "Clear/close" })),
|
|
33
|
+
react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
34
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true }, "Tasks"),
|
|
35
|
+
react_1.default.createElement(HelpRow, { k: "n", desc: "New task (quick)" }),
|
|
36
|
+
react_1.default.createElement(HelpRow, { k: "N", desc: "New task (editor)" }),
|
|
37
|
+
react_1.default.createElement(HelpRow, { k: "e", desc: "Edit in $EDITOR" }),
|
|
38
|
+
react_1.default.createElement(HelpRow, { k: "m", desc: "Move to column" }),
|
|
39
|
+
react_1.default.createElement(HelpRow, { k: "d", desc: "Delete task" }),
|
|
40
|
+
react_1.default.createElement(HelpRow, { k: "a", desc: "Archive task" }),
|
|
41
|
+
react_1.default.createElement(HelpRow, { k: "p", desc: "Cycle priority" }),
|
|
42
|
+
react_1.default.createElement(HelpRow, { k: "t", desc: "Toggle subtask" }),
|
|
43
|
+
react_1.default.createElement(HelpRow, { k: "y", desc: "Copy task ID" }),
|
|
44
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
45
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true }, "Quit")),
|
|
46
|
+
react_1.default.createElement(HelpRow, { k: "q/^c", desc: "Exit" }))),
|
|
47
|
+
react_1.default.createElement(ink_1.Box, { justifyContent: "center", marginTop: 1 },
|
|
48
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "press any key to close")))));
|
|
49
|
+
}
|
|
50
|
+
function HelpRow({ k, desc }) {
|
|
51
|
+
return (react_1.default.createElement(ink_1.Box, null,
|
|
52
|
+
react_1.default.createElement(ink_1.Box, { width: 10 },
|
|
53
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text }, k)),
|
|
54
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, desc)));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=HelpOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpOverlay.js","sourceRoot":"","sources":["../../../src/tui/components/HelpOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overlays - Modal-like UI components for task management
|
|
3
|
+
*
|
|
4
|
+
* - MoveOverlay: Column picker for moving tasks
|
|
5
|
+
* - DeleteConfirmOverlay: Confirmation prompt for deletion
|
|
6
|
+
* - SubtaskOverlay: Subtask picker for toggling completion
|
|
7
|
+
* - StatusMessage: Toast-like feedback messages
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import type { StatusMessage as StatusMessageType, BoardColumn } from '../types.js';
|
|
11
|
+
import type { Task } from '@brainfile/core';
|
|
12
|
+
export interface StatusMessageProps {
|
|
13
|
+
message: StatusMessageType | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function StatusMessageDisplay({ message }: StatusMessageProps): React.JSX.Element | null;
|
|
16
|
+
export interface MoveOverlayProps {
|
|
17
|
+
columns: BoardColumn[];
|
|
18
|
+
selectedIndex: number;
|
|
19
|
+
taskTitle: string;
|
|
20
|
+
termWidth: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function MoveOverlay({ columns, selectedIndex, taskTitle, termWidth }: MoveOverlayProps): React.JSX.Element;
|
|
23
|
+
export interface DeleteConfirmOverlayProps {
|
|
24
|
+
taskId: string;
|
|
25
|
+
taskTitle: string;
|
|
26
|
+
termWidth: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function DeleteConfirmOverlay({ taskId, taskTitle, termWidth }: DeleteConfirmOverlayProps): React.JSX.Element;
|
|
29
|
+
export interface NewTaskOverlayProps {
|
|
30
|
+
title: string;
|
|
31
|
+
columnName: string;
|
|
32
|
+
termWidth: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function NewTaskOverlay({ title, columnName, termWidth }: NewTaskOverlayProps): React.JSX.Element;
|
|
35
|
+
export interface SubtaskOverlayProps {
|
|
36
|
+
task: Task;
|
|
37
|
+
selectedIndex: number;
|
|
38
|
+
termWidth: number;
|
|
39
|
+
}
|
|
40
|
+
export declare function SubtaskOverlay({ task, selectedIndex, termWidth }: SubtaskOverlayProps): React.JSX.Element;
|
|
41
|
+
//# sourceMappingURL=Overlays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Overlays.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Overlays.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,4BAoBnE;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,gBAAgB,qBA6C7F;AAGD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,yBAAyB,qBA8B/F;AAGD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB,qBA2BnF;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,mBAAmB,qBAgDrF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StatusMessageDisplay = StatusMessageDisplay;
|
|
7
|
+
exports.MoveOverlay = MoveOverlay;
|
|
8
|
+
exports.DeleteConfirmOverlay = DeleteConfirmOverlay;
|
|
9
|
+
exports.NewTaskOverlay = NewTaskOverlay;
|
|
10
|
+
exports.SubtaskOverlay = SubtaskOverlay;
|
|
11
|
+
/**
|
|
12
|
+
* Overlays - Modal-like UI components for task management
|
|
13
|
+
*
|
|
14
|
+
* - MoveOverlay: Column picker for moving tasks
|
|
15
|
+
* - DeleteConfirmOverlay: Confirmation prompt for deletion
|
|
16
|
+
* - SubtaskOverlay: Subtask picker for toggling completion
|
|
17
|
+
* - StatusMessage: Toast-like feedback messages
|
|
18
|
+
*/
|
|
19
|
+
const react_1 = __importDefault(require("react"));
|
|
20
|
+
const ink_1 = require("ink");
|
|
21
|
+
const theme_js_1 = require("../theme.js");
|
|
22
|
+
const utils_js_1 = require("../utils.js");
|
|
23
|
+
function StatusMessageDisplay({ message }) {
|
|
24
|
+
if (!message)
|
|
25
|
+
return null;
|
|
26
|
+
const color = message.type === 'success'
|
|
27
|
+
? theme_js_1.PALETTE.success
|
|
28
|
+
: message.type === 'error'
|
|
29
|
+
? theme_js_1.PALETTE.error
|
|
30
|
+
: theme_js_1.PALETTE.accent;
|
|
31
|
+
const icon = message.type === 'success'
|
|
32
|
+
? '✓'
|
|
33
|
+
: message.type === 'error'
|
|
34
|
+
? '✗'
|
|
35
|
+
: '●';
|
|
36
|
+
return (react_1.default.createElement(ink_1.Box, { paddingLeft: 1 },
|
|
37
|
+
react_1.default.createElement(ink_1.Text, { color: color },
|
|
38
|
+
icon,
|
|
39
|
+
" ",
|
|
40
|
+
message.text)));
|
|
41
|
+
}
|
|
42
|
+
function MoveOverlay({ columns, selectedIndex, taskTitle, termWidth }) {
|
|
43
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: theme_js_1.PALETTE.accent, paddingX: 2, paddingY: 1, marginX: 2 },
|
|
44
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, bold: true }, "Move Task"),
|
|
45
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, (0, utils_js_1.truncate)(taskTitle, termWidth - 10)),
|
|
46
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
47
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "Select column: "),
|
|
48
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
49
|
+
'←/→ or 1-',
|
|
50
|
+
columns.length)),
|
|
51
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 }, columns.map((col, idx) => {
|
|
52
|
+
const isSelected = idx === selectedIndex;
|
|
53
|
+
return (react_1.default.createElement(ink_1.Box, { key: col.id, marginRight: 1 }, isSelected ? (react_1.default.createElement(ink_1.Text, { backgroundColor: theme_js_1.PALETTE.accent, color: theme_js_1.PALETTE.bg, bold: true }, ` ${idx + 1}:${col.title} `)) : (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, ` ${idx + 1}:${col.title} `))));
|
|
54
|
+
})),
|
|
55
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
56
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
57
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, "ENTER"),
|
|
58
|
+
" confirm",
|
|
59
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.warning }, " ESC"),
|
|
60
|
+
" cancel"))));
|
|
61
|
+
}
|
|
62
|
+
function DeleteConfirmOverlay({ taskId, taskTitle, termWidth }) {
|
|
63
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: theme_js_1.PALETTE.error, paddingX: 2, paddingY: 1, marginX: 2 },
|
|
64
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.error, bold: true }, "Delete Task?"),
|
|
65
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
66
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, (0, utils_js_1.truncate)(taskTitle, termWidth - 10)),
|
|
67
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
68
|
+
" (",
|
|
69
|
+
taskId,
|
|
70
|
+
")")),
|
|
71
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
72
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "This action cannot be undone.")),
|
|
73
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
74
|
+
react_1.default.createElement(ink_1.Text, null,
|
|
75
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.error, bold: true }, "Y"),
|
|
76
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, " delete "),
|
|
77
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success, bold: true }, "N"),
|
|
78
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, " cancel")))));
|
|
79
|
+
}
|
|
80
|
+
function NewTaskOverlay({ title, columnName, termWidth }) {
|
|
81
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: theme_js_1.PALETTE.accent, paddingX: 2, paddingY: 1, marginX: 2 },
|
|
82
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, bold: true }, "New Task"),
|
|
83
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
84
|
+
"Adding to ",
|
|
85
|
+
columnName),
|
|
86
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
87
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent }, '❯ '),
|
|
88
|
+
react_1.default.createElement(ink_1.Text, { color: title ? theme_js_1.PALETTE.text : theme_js_1.PALETTE.textMuted }, title || 'Enter task title...'),
|
|
89
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent }, '▌')),
|
|
90
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
91
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
92
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, "ENTER"),
|
|
93
|
+
" create",
|
|
94
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.warning }, " ESC"),
|
|
95
|
+
" cancel"))));
|
|
96
|
+
}
|
|
97
|
+
function SubtaskOverlay({ task, selectedIndex, termWidth }) {
|
|
98
|
+
const subtasks = task.subtasks || [];
|
|
99
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: theme_js_1.PALETTE.accent, paddingX: 2, paddingY: 1, marginX: 2 },
|
|
100
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, bold: true }, "Toggle Subtask"),
|
|
101
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, (0, utils_js_1.truncate)(task.title, termWidth - 10)),
|
|
102
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1, flexDirection: "column" }, subtasks.map((st, idx) => {
|
|
103
|
+
const isSelected = idx === selectedIndex;
|
|
104
|
+
const checkmark = st.completed ? '✓' : '○';
|
|
105
|
+
const textColor = st.completed ? theme_js_1.PALETTE.success : theme_js_1.PALETTE.textSecondary;
|
|
106
|
+
return (react_1.default.createElement(ink_1.Box, { key: st.id }, isSelected ? (react_1.default.createElement(ink_1.Text, { backgroundColor: theme_js_1.PALETTE.bgHighlight },
|
|
107
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent }, '▸ '),
|
|
108
|
+
react_1.default.createElement(ink_1.Text, { color: textColor },
|
|
109
|
+
checkmark,
|
|
110
|
+
" ",
|
|
111
|
+
(0, utils_js_1.truncate)(st.title, termWidth - 14)))) : (react_1.default.createElement(ink_1.Text, null,
|
|
112
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textDim }, ' '),
|
|
113
|
+
react_1.default.createElement(ink_1.Text, { color: textColor },
|
|
114
|
+
checkmark,
|
|
115
|
+
" ",
|
|
116
|
+
(0, utils_js_1.truncate)(st.title, termWidth - 14))))));
|
|
117
|
+
})),
|
|
118
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
119
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
120
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "\u2191/\u2193"),
|
|
121
|
+
" select",
|
|
122
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, " ENTER/SPACE"),
|
|
123
|
+
" toggle",
|
|
124
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.warning }, " ESC"),
|
|
125
|
+
" close"))));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=Overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Overlays.js","sourceRoot":"","sources":["../../../src/tui/components/Overlays.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gBAAgB,qBAyBnE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProgressBar = ProgressBar;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_js_1 = require("../theme.js");
|
|
10
|
+
function ProgressBar({ done, total, width }) {
|
|
11
|
+
const percentage = total > 0 ? Math.round((done / total) * 100) : 0;
|
|
12
|
+
// Reserve space for: padding + "XX% " + " X of Y complete"
|
|
13
|
+
const textWidth = 20 + String(done).length + String(total).length;
|
|
14
|
+
const barWidth = Math.max(width - textWidth, 20);
|
|
15
|
+
const filled = Math.round((percentage / 100) * barWidth);
|
|
16
|
+
const empty = barWidth - filled;
|
|
17
|
+
// Color the percentage based on completion
|
|
18
|
+
const percentColor = percentage === 100 ? theme_js_1.PALETTE.success :
|
|
19
|
+
percentage >= 50 ? theme_js_1.PALETTE.progress :
|
|
20
|
+
theme_js_1.PALETTE.textMuted;
|
|
21
|
+
return (react_1.default.createElement(ink_1.Box, { paddingLeft: 2, paddingTop: 1, paddingBottom: 1 },
|
|
22
|
+
react_1.default.createElement(ink_1.Text, { color: percentColor, bold: true },
|
|
23
|
+
percentage,
|
|
24
|
+
"%"),
|
|
25
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, " "),
|
|
26
|
+
filled > 0 && react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, theme_js_1.ICONS.progressFilled.repeat(filled)),
|
|
27
|
+
empty > 0 && react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.border }, theme_js_1.ICONS.progressEmpty.repeat(empty)),
|
|
28
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
29
|
+
" ",
|
|
30
|
+
done),
|
|
31
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, "/"),
|
|
32
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, total),
|
|
33
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, " complete")));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../src/tui/components/ProgressBar.tsx"],"names":[],"mappings":";;;;;AAUA,kCAyBC;AAnCD,kDAA0B;AAC1B,6BAAgC;AAChC,0CAA6C;AAQ7C,SAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAoB;IAClE,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,2DAA2D;IAC3D,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEhC,2CAA2C;IAC3C,MAAM,YAAY,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAO,CAAC,OAAO,CAAC,CAAC;QACtC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,kBAAO,CAAC,QAAQ,CAAC,CAAC;YACrC,kBAAO,CAAC,SAAS,CAAC;IAEvC,OAAO,CACL,8BAAC,SAAG,IAAC,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;QAClD,8BAAC,UAAI,IAAC,KAAK,EAAE,YAAY,EAAE,IAAI;YAAE,UAAU;gBAAS;QACpD,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,SAAS,QAAU;QACvC,MAAM,GAAG,CAAC,IAAI,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,OAAO,IAAG,gBAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAQ;QACxF,KAAK,GAAG,CAAC,IAAI,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,MAAM,IAAG,gBAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAQ;QACrF,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa;;YAAI,IAAI,CAAQ;QAClD,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,SAAS,QAAU;QACxC,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa,IAAG,KAAK,CAAQ;QAClD,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,SAAS,gBAAkB,CAC5C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/SearchBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,cAAc,qBAUzD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SearchBar = SearchBar;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_js_1 = require("../theme.js");
|
|
10
|
+
function SearchBar({ query, width }) {
|
|
11
|
+
const inputWidth = Math.min(width - 6, 60);
|
|
12
|
+
const displayQuery = query.padEnd(inputWidth, ' ').slice(0, inputWidth);
|
|
13
|
+
return (react_1.default.createElement(ink_1.Box, { paddingLeft: 1, marginTop: 0 },
|
|
14
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent },
|
|
15
|
+
theme_js_1.ICONS.search,
|
|
16
|
+
" "),
|
|
17
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.text, backgroundColor: theme_js_1.PALETTE.bgHighlight },
|
|
18
|
+
" ",
|
|
19
|
+
displayQuery,
|
|
20
|
+
" ")));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=SearchBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../src/tui/components/SearchBar.tsx"],"names":[],"mappings":";;;;;AASA,8BAUC;AAnBD,kDAA0B;AAC1B,6BAAgC;AAChC,0CAA6C;AAO7C,SAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAkB;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAExE,OAAO,CACL,8BAAC,SAAG,IAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QAC/B,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,MAAM;YAAG,gBAAK,CAAC,MAAM;gBAAS;QACnD,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,IAAI,EAAE,eAAe,EAAE,kBAAO,CAAC,WAAW;;YAAI,YAAY;gBAAS,CACpF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ViewMode } from '../types.js';
|
|
3
|
+
export interface StatusBarProps {
|
|
4
|
+
mode: ViewMode;
|
|
5
|
+
columnName: string;
|
|
6
|
+
taskIndex: number;
|
|
7
|
+
taskCount: number;
|
|
8
|
+
termWidth: number;
|
|
9
|
+
isWatching?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function StatusBar({ mode, columnName, taskIndex, taskCount, termWidth, isWatching }: StatusBarProps): React.JSX.Element;
|
|
12
|
+
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAiB,EAAE,EAAE,cAAc,qBAyDjH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StatusBar = StatusBar;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
const theme_js_1 = require("../theme.js");
|
|
10
|
+
function StatusBar({ mode, columnName, taskIndex, taskCount, termWidth, isWatching = true }) {
|
|
11
|
+
// Left section: essential commands with subtle styling
|
|
12
|
+
const leftCommands = mode === 'search' ? (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
13
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.warning }, "ESC"),
|
|
14
|
+
react_1.default.createElement(ink_1.Text, null, ' cancel'))) : (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted },
|
|
15
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "?"),
|
|
16
|
+
react_1.default.createElement(ink_1.Text, null, ' help '),
|
|
17
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "TAB"),
|
|
18
|
+
react_1.default.createElement(ink_1.Text, null, ' column '),
|
|
19
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, "q"),
|
|
20
|
+
react_1.default.createElement(ink_1.Text, null, ' quit')));
|
|
21
|
+
// Middle section: column and position
|
|
22
|
+
const position = taskCount > 0 ? `${taskIndex}/${taskCount}` : null;
|
|
23
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", width: termWidth },
|
|
24
|
+
react_1.default.createElement(ink_1.Box, { width: termWidth - 2, paddingLeft: 1, paddingRight: 1 },
|
|
25
|
+
leftCommands,
|
|
26
|
+
react_1.default.createElement(ink_1.Box, { flexGrow: 1 }),
|
|
27
|
+
columnName ? (react_1.default.createElement(ink_1.Text, null,
|
|
28
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, columnName.toUpperCase()),
|
|
29
|
+
position ? react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accent, bold: true }, ` ${position}`) : null)) : null,
|
|
30
|
+
react_1.default.createElement(ink_1.Box, { flexGrow: 1 }),
|
|
31
|
+
isWatching ? (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success },
|
|
32
|
+
react_1.default.createElement(ink_1.Text, null, theme_js_1.ICONS.live),
|
|
33
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, ' live'))) : null),
|
|
34
|
+
react_1.default.createElement(ink_1.Box, { paddingLeft: 1 },
|
|
35
|
+
react_1.default.createElement(ink_1.Text, null, ' '))));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":";;;;;AAcA,8BAyDC;AAvED,kDAA0B;AAC1B,6BAAgC;AAChC,0CAA6C;AAY7C,SAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,EAAkB;IAChH,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACvC,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,SAAS;QAC5B,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,OAAO,UAAY;QACxC,8BAAC,UAAI,QAAE,SAAS,CAAQ,CACnB,CACR,CAAC,CAAC,CAAC,CACF,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,SAAS;QAC5B,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa,QAAU;QAC5C,8BAAC,UAAI,QAAE,SAAS,CAAQ;QACxB,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa,UAAY;QAC9C,8BAAC,UAAI,QAAE,WAAW,CAAQ;QAC1B,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa,QAAU;QAC5C,8BAAC,UAAI,QAAE,OAAO,CAAQ,CACjB,CACR,CAAC;IAEF,sCAAsC;IACtC,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,SAAS;QAE1C,8BAAC,SAAG,IAAC,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;YAEvD,YAAY;YAGb,8BAAC,SAAG,IAAC,QAAQ,EAAE,CAAC,GAAI;YAGnB,UAAU,CAAC,CAAC,CAAC,CACZ,8BAAC,UAAI;gBACH,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,aAAa,IAAG,UAAU,CAAC,WAAW,EAAE,CAAQ;gBACpE,QAAQ,CAAC,CAAC,CAAC,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,MAAM,EAAE,IAAI,UAAE,IAAI,QAAQ,EAAE,CAAQ,CAAC,CAAC,CAAC,IAAI,CACvE,CACR,CAAC,CAAC,CAAC,IAAI;YAGR,8BAAC,SAAG,IAAC,QAAQ,EAAE,CAAC,GAAI;YAGnB,UAAU,CAAC,CAAC,CAAC,CACZ,8BAAC,UAAI,IAAC,KAAK,EAAE,kBAAO,CAAC,OAAO;gBAC1B,8BAAC,UAAI,QAAE,gBAAK,CAAC,IAAI,CAAQ;gBACzB,8BAAC,UAAI,IAAC,QAAQ,UAAE,OAAO,CAAQ,CAC1B,CACR,CAAC,CAAC,CAAC,IAAI,CACJ;QAGN,8BAAC,SAAG,IAAC,WAAW,EAAE,CAAC;YACjB,8BAAC,UAAI,QAAE,GAAG,CAAQ,CACd,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskCard - Lipgloss-style task card with rounded borders
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* 1. Rounded borders (like Bubbletea/Lipgloss)
|
|
6
|
+
* 2. Better visual hierarchy with consistent spacing
|
|
7
|
+
* 3. Subtle color accents for priority
|
|
8
|
+
* 4. Cleaner metadata display
|
|
9
|
+
*/
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import type { Task } from '@brainfile/core';
|
|
12
|
+
export interface TaskCardProps {
|
|
13
|
+
task: Task;
|
|
14
|
+
isSelected: boolean;
|
|
15
|
+
isExpanded: boolean;
|
|
16
|
+
width: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function TaskCard({ task, isSelected, isExpanded, width }: TaskCardProps): React.JSX.Element;
|
|
19
|
+
//# sourceMappingURL=TaskCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskCard.d.ts","sourceRoot":"","sources":["../../../src/tui/components/TaskCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AA4ED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,aAAa,qBAkF9E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TaskCard = TaskCard;
|
|
7
|
+
/**
|
|
8
|
+
* TaskCard - Lipgloss-style task card with rounded borders
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* 1. Rounded borders (like Bubbletea/Lipgloss)
|
|
12
|
+
* 2. Better visual hierarchy with consistent spacing
|
|
13
|
+
* 3. Subtle color accents for priority
|
|
14
|
+
* 4. Cleaner metadata display
|
|
15
|
+
*/
|
|
16
|
+
const react_1 = __importDefault(require("react"));
|
|
17
|
+
const ink_1 = require("ink");
|
|
18
|
+
const theme_js_1 = require("../theme.js");
|
|
19
|
+
const utils_js_1 = require("../utils.js");
|
|
20
|
+
// Priority badge with background color
|
|
21
|
+
function PriorityBadge({ priority }) {
|
|
22
|
+
if (!priority)
|
|
23
|
+
return null;
|
|
24
|
+
const color = (0, utils_js_1.getPriorityColor)(priority);
|
|
25
|
+
const label = priority.toUpperCase().slice(0, 4);
|
|
26
|
+
return (react_1.default.createElement(ink_1.Text, { color: "black", backgroundColor: color, bold: true }, ` ${label} `));
|
|
27
|
+
}
|
|
28
|
+
// Tag pills
|
|
29
|
+
function TagPills({ tags, maxTags = 3 }) {
|
|
30
|
+
if (!tags || tags.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
return (react_1.default.createElement(ink_1.Box, { marginLeft: 1 },
|
|
33
|
+
tags.slice(0, maxTags).map((tag, idx) => (react_1.default.createElement(ink_1.Box, { key: tag, marginRight: idx < Math.min(tags.length, maxTags) - 1 ? 1 : 0 },
|
|
34
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
35
|
+
"#",
|
|
36
|
+
tag)))),
|
|
37
|
+
tags.length > maxTags && (react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary },
|
|
38
|
+
" +",
|
|
39
|
+
tags.length - maxTags))));
|
|
40
|
+
}
|
|
41
|
+
// Subtask progress indicator
|
|
42
|
+
function SubtaskProgress({ completed, total }) {
|
|
43
|
+
if (total === 0)
|
|
44
|
+
return null;
|
|
45
|
+
const barWidth = 10;
|
|
46
|
+
const filled = Math.round((completed / total) * barWidth);
|
|
47
|
+
return (react_1.default.createElement(ink_1.Box, null,
|
|
48
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, '['),
|
|
49
|
+
filled > 0 && react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.success }, '█'.repeat(filled)),
|
|
50
|
+
barWidth - filled > 0 && react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, '░'.repeat(barWidth - filled)),
|
|
51
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, `] ${completed}/${total}`)));
|
|
52
|
+
}
|
|
53
|
+
// Due date indicator with color coding
|
|
54
|
+
function DueDateBadge({ dueDate }) {
|
|
55
|
+
if (!dueDate)
|
|
56
|
+
return null;
|
|
57
|
+
const due = new Date(dueDate);
|
|
58
|
+
const now = new Date();
|
|
59
|
+
const diffDays = Math.ceil((due.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
|
|
60
|
+
// Determine color based on urgency
|
|
61
|
+
const getColor = () => {
|
|
62
|
+
if (diffDays < 0)
|
|
63
|
+
return theme_js_1.PALETTE.error; // Overdue
|
|
64
|
+
if (diffDays <= 2)
|
|
65
|
+
return theme_js_1.PALETTE.warning; // Due soon
|
|
66
|
+
return theme_js_1.PALETTE.textSecondary;
|
|
67
|
+
};
|
|
68
|
+
// Format as short date
|
|
69
|
+
const formatted = due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
|
|
70
|
+
return (react_1.default.createElement(ink_1.Text, { color: getColor() },
|
|
71
|
+
diffDays < 0 ? '⚠ ' : '📅 ',
|
|
72
|
+
formatted));
|
|
73
|
+
}
|
|
74
|
+
function TaskCard({ task, isSelected, isExpanded, width }) {
|
|
75
|
+
const subtasks = task.subtasks || [];
|
|
76
|
+
const completedSubtasks = subtasks.filter(s => s.completed).length;
|
|
77
|
+
const borderColor = isSelected ? theme_js_1.PALETTE.progress : theme_js_1.PALETTE.border;
|
|
78
|
+
const contentWidth = width - 4; // Account for border + padding
|
|
79
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: borderColor, paddingX: 1, marginBottom: 1 },
|
|
80
|
+
react_1.default.createElement(ink_1.Box, { justifyContent: "space-between" },
|
|
81
|
+
react_1.default.createElement(ink_1.Box, { flexShrink: 1 },
|
|
82
|
+
react_1.default.createElement(ink_1.Text, { color: isSelected ? theme_js_1.PALETTE.text : theme_js_1.PALETTE.textSecondary, bold: isSelected }, (0, utils_js_1.truncate)(task.title, contentWidth - task.id.length - 2))),
|
|
83
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textMuted }, task.id)),
|
|
84
|
+
(task.priority || (task.tags && task.tags.length > 0) || subtasks.length > 0 || task.dueDate) && (react_1.default.createElement(ink_1.Box, { marginTop: 0 },
|
|
85
|
+
react_1.default.createElement(PriorityBadge, { priority: task.priority }),
|
|
86
|
+
react_1.default.createElement(TagPills, { tags: task.tags }),
|
|
87
|
+
subtasks.length > 0 && (react_1.default.createElement(ink_1.Box, { marginLeft: 1 },
|
|
88
|
+
react_1.default.createElement(SubtaskProgress, { completed: completedSubtasks, total: subtasks.length }))),
|
|
89
|
+
task.dueDate && (react_1.default.createElement(ink_1.Box, { marginLeft: 1 },
|
|
90
|
+
react_1.default.createElement(DueDateBadge, { dueDate: task.dueDate }))))),
|
|
91
|
+
isExpanded && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 },
|
|
92
|
+
contentWidth > 0 && react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.border }, '─'.repeat(contentWidth)),
|
|
93
|
+
task.description && (react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
94
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.textSecondary }, (0, utils_js_1.truncate)(task.description.split('\n')[0], contentWidth)))),
|
|
95
|
+
subtasks.length > 0 && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: task.description ? 1 : 0 }, subtasks.map((st) => (react_1.default.createElement(ink_1.Box, { key: st.id },
|
|
96
|
+
react_1.default.createElement(ink_1.Text, { color: st.completed ? theme_js_1.PALETTE.success : theme_js_1.PALETTE.textSecondary },
|
|
97
|
+
st.completed ? '✓' : '○',
|
|
98
|
+
" ",
|
|
99
|
+
(0, utils_js_1.truncate)(st.title, contentWidth - 2))))))),
|
|
100
|
+
task.relatedFiles && task.relatedFiles.length > 0 && (react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
101
|
+
react_1.default.createElement(ink_1.Text, { color: theme_js_1.PALETTE.accentAlt },
|
|
102
|
+
'📁 ',
|
|
103
|
+
(0, utils_js_1.truncate)(task.relatedFiles.slice(0, 2).join(', '), contentWidth - 3))))))));
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=TaskCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskCard.js","sourceRoot":"","sources":["../../../src/tui/components/TaskCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Task } from '@brainfile/core';
|
|
3
|
+
export interface TaskListProps {
|
|
4
|
+
tasks: Task[];
|
|
5
|
+
selectedIndex: number;
|
|
6
|
+
expandedIds: Set<string>;
|
|
7
|
+
viewportHeight: number;
|
|
8
|
+
termWidth: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function TaskList({ tasks, selectedIndex, expandedIds, viewportHeight, termWidth }: TaskListProps): React.JSX.Element;
|
|
11
|
+
//# sourceMappingURL=TaskList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/TaskList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,aAAa,qBA0EvG"}
|