@acpus/tui 0.1.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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/agentTranscript.d.ts +33 -0
  4. package/dist/agentTranscript.d.ts.map +1 -0
  5. package/dist/agentTranscript.js +238 -0
  6. package/dist/agentTranscript.js.map +1 -0
  7. package/dist/components/App.d.ts +28 -0
  8. package/dist/components/App.d.ts.map +1 -0
  9. package/dist/components/App.js +516 -0
  10. package/dist/components/App.js.map +1 -0
  11. package/dist/components/DetailsPane.d.ts +65 -0
  12. package/dist/components/DetailsPane.d.ts.map +1 -0
  13. package/dist/components/DetailsPane.js +290 -0
  14. package/dist/components/DetailsPane.js.map +1 -0
  15. package/dist/components/Footer.d.ts +12 -0
  16. package/dist/components/Footer.d.ts.map +1 -0
  17. package/dist/components/Footer.js +34 -0
  18. package/dist/components/Footer.js.map +1 -0
  19. package/dist/components/GraphPane.d.ts +31 -0
  20. package/dist/components/GraphPane.d.ts.map +1 -0
  21. package/dist/components/GraphPane.js +35 -0
  22. package/dist/components/GraphPane.js.map +1 -0
  23. package/dist/components/RunPicker.d.ts +17 -0
  24. package/dist/components/RunPicker.d.ts.map +1 -0
  25. package/dist/components/RunPicker.js +53 -0
  26. package/dist/components/RunPicker.js.map +1 -0
  27. package/dist/components/StatusOverview.d.ts +20 -0
  28. package/dist/components/StatusOverview.d.ts.map +1 -0
  29. package/dist/components/StatusOverview.js +19 -0
  30. package/dist/components/StatusOverview.js.map +1 -0
  31. package/dist/controls.d.ts +15 -0
  32. package/dist/controls.d.ts.map +1 -0
  33. package/dist/controls.js +68 -0
  34. package/dist/controls.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +33 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/model.d.ts +130 -0
  40. package/dist/model.d.ts.map +1 -0
  41. package/dist/model.js +429 -0
  42. package/dist/model.js.map +1 -0
  43. package/dist/osc52.d.ts +3 -0
  44. package/dist/osc52.d.ts.map +1 -0
  45. package/dist/osc52.js +8 -0
  46. package/dist/osc52.js.map +1 -0
  47. package/dist/poller.d.ts +24 -0
  48. package/dist/poller.d.ts.map +1 -0
  49. package/dist/poller.js +58 -0
  50. package/dist/poller.js.map +1 -0
  51. package/dist/theme.d.ts +37 -0
  52. package/dist/theme.d.ts.map +1 -0
  53. package/dist/theme.js +68 -0
  54. package/dist/theme.js.map +1 -0
  55. package/dist/ui/inkui/JSONViewer.d.ts +37 -0
  56. package/dist/ui/inkui/JSONViewer.d.ts.map +1 -0
  57. package/dist/ui/inkui/JSONViewer.js +121 -0
  58. package/dist/ui/inkui/JSONViewer.js.map +1 -0
  59. package/dist/ui/inkui/KeyHint.d.ts +11 -0
  60. package/dist/ui/inkui/KeyHint.d.ts.map +1 -0
  61. package/dist/ui/inkui/KeyHint.js +7 -0
  62. package/dist/ui/inkui/KeyHint.js.map +1 -0
  63. package/dist/ui/inkui/Markdown.d.ts +9 -0
  64. package/dist/ui/inkui/Markdown.d.ts.map +1 -0
  65. package/dist/ui/inkui/Markdown.js +80 -0
  66. package/dist/ui/inkui/Markdown.js.map +1 -0
  67. package/dist/ui/inkui/ScrollArea.d.ts +29 -0
  68. package/dist/ui/inkui/ScrollArea.d.ts.map +1 -0
  69. package/dist/ui/inkui/ScrollArea.js +38 -0
  70. package/dist/ui/inkui/ScrollArea.js.map +1 -0
  71. package/dist/ui/inkui/Spinner.d.ts +19 -0
  72. package/dist/ui/inkui/Spinner.d.ts.map +1 -0
  73. package/dist/ui/inkui/Spinner.js +36 -0
  74. package/dist/ui/inkui/Spinner.js.map +1 -0
  75. package/dist/ui/inkui/Tabs.d.ts +14 -0
  76. package/dist/ui/inkui/Tabs.d.ts.map +1 -0
  77. package/dist/ui/inkui/Tabs.js +15 -0
  78. package/dist/ui/inkui/Tabs.js.map +1 -0
  79. package/dist/ui/inkui/index.d.ts +8 -0
  80. package/dist/ui/inkui/index.d.ts.map +1 -0
  81. package/dist/ui/inkui/index.js +8 -0
  82. package/dist/ui/inkui/index.js.map +1 -0
  83. package/dist/ui/inkui/theme.d.ts +20 -0
  84. package/dist/ui/inkui/theme.d.ts.map +1 -0
  85. package/dist/ui/inkui/theme.js +51 -0
  86. package/dist/ui/inkui/theme.js.map +1 -0
  87. package/dist/useTerminalSize.d.ts +20 -0
  88. package/dist/useTerminalSize.d.ts.map +1 -0
  89. package/dist/useTerminalSize.js +34 -0
  90. package/dist/useTerminalSize.js.map +1 -0
  91. package/package.json +65 -0
package/dist/theme.js ADDED
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Glyphs and colors for acpus's true 7-state node lifecycle, plus kind labels
3
+ * for composite/executable nodes. Deliberately mirrors acpus semantics — NOT
4
+ * the reference image's invented states (queued / needs-review / retried).
5
+ */
6
+ /**
7
+ * The unified 7 states. No "queued"/"needs-review"/"retried" — those are not
8
+ * acpus states.
9
+ *
10
+ * IMPORTANT: every glyph MUST be a single terminal column wide. Wide (emoji /
11
+ * East-Asian) glyphs like ⏳/⏸/▶ render as 2 columns and break the
12
+ * `justifyContent="space-between"` alignment in StatusOverview (and skew the
13
+ * graph tree indentation). Use single-width symbols only.
14
+ */
15
+ export const STATE_STYLES = {
16
+ pending: { glyph: "○", color: "gray", label: "Pending" },
17
+ running: { glyph: "▷", color: "yellow", label: "Running" },
18
+ awaiting: { glyph: "◷", color: "blue", label: "Awaiting" },
19
+ completed: { glyph: "✓", color: "green", label: "Completed" },
20
+ failed: { glyph: "✗", color: "red", label: "Failed" },
21
+ paused: { glyph: "‖", color: "cyan", label: "Paused" },
22
+ cancelled: { glyph: "⊘", color: "magenta", label: "Cancelled" }
23
+ };
24
+ /** Short uppercase label for a composite container header. */
25
+ export const KIND_LABELS = {
26
+ pipeline: "PIPELINE",
27
+ "run.agent": "AGENT",
28
+ "run.program": "PROGRAM",
29
+ parallel: "PARALLEL",
30
+ fanout: "FANOUT",
31
+ switch: "SWITCH",
32
+ loop: "LOOP",
33
+ guard: "GUARD",
34
+ approval: "APPROVAL",
35
+ subworkflow: "SUBWORKFLOW"
36
+ };
37
+ /** Single-width node-kind symbols and colors shared by graph rows and legends. */
38
+ export const KIND_STYLES = {
39
+ pipeline: { symbol: "▣", color: "green", label: "Pipeline" },
40
+ "run.agent": { symbol: "◉", color: "cyan", label: "Agent" },
41
+ "run.program": { symbol: "$", color: "yellow", label: "Program" },
42
+ parallel: { symbol: "▥", color: "blueBright", label: "Parallel" },
43
+ fanout: { symbol: "◬", color: "magenta", label: "Fanout" },
44
+ switch: { symbol: "◇", color: "blue", label: "Switch" },
45
+ loop: { symbol: "↻", color: "yellowBright", label: "Loop" },
46
+ guard: { symbol: "◈", color: "redBright", label: "Guard" },
47
+ approval: { symbol: "□", color: "white", label: "Approval" },
48
+ subworkflow: { symbol: "▧", color: "gray", label: "Subworkflow" }
49
+ };
50
+ /** Composite kinds control other nodes; the rest are executable leaves. */
51
+ export const COMPOSITE_KINDS = new Set([
52
+ "pipeline",
53
+ "parallel",
54
+ "fanout",
55
+ "switch",
56
+ "loop",
57
+ "subworkflow"
58
+ ]);
59
+ export function isComposite(kind) {
60
+ return COMPOSITE_KINDS.has(kind);
61
+ }
62
+ export function styleForState(state) {
63
+ return state ? STATE_STYLES[state] : { glyph: "·", color: "gray", label: "Not started" };
64
+ }
65
+ export function styleForKind(kind) {
66
+ return KIND_STYLES[kind];
67
+ }
68
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export interface JsonRowDescriptor {
4
+ id: string;
5
+ text: string;
6
+ color: string;
7
+ branch: boolean;
8
+ }
9
+ export declare function JSONViewer({ data, width, rootLabel, initialDepth, expandedIds, selectedIndex, theme }: {
10
+ data: unknown;
11
+ width: number;
12
+ rootLabel?: string;
13
+ initialDepth?: number;
14
+ expandedIds?: ReadonlySet<string>;
15
+ selectedIndex?: number;
16
+ theme?: InkUiTheme;
17
+ }): React.ReactElement;
18
+ export declare function jsonViewerRows(data: unknown, width: number, { rootLabel, initialDepth, expandedIds, selectedIndex, theme }?: {
19
+ rootLabel?: string;
20
+ initialDepth?: number;
21
+ expandedIds?: ReadonlySet<string>;
22
+ selectedIndex?: number;
23
+ theme?: InkUiTheme;
24
+ }): React.ReactElement[];
25
+ export declare function jsonPlainText(data: unknown, rootLabel?: string, initialDepth?: number): string;
26
+ export declare function jsonRowDescriptors(data: unknown, { rootLabel, initialDepth, expandedIds, theme }?: {
27
+ rootLabel?: string;
28
+ initialDepth?: number;
29
+ expandedIds?: ReadonlySet<string>;
30
+ theme?: InkUiTheme;
31
+ }): JsonRowDescriptor[];
32
+ export declare function jsonExpandedIdsForInitialDepth(data: unknown, { rootLabel, initialDepth }?: {
33
+ rootLabel?: string;
34
+ initialDepth?: number;
35
+ }): Set<string>;
36
+ export declare function toggleJsonExpandedId(expandedIds: ReadonlySet<string>, id: string): Set<string>;
37
+ //# sourceMappingURL=JSONViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONViewer.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/JSONViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAErB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,EACE,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,KAAK,CAAC,YAAY,EAAE,CAStB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAAW,EAAE,YAAY,SAA2B,GAAG,MAAM,CAElH;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,EACE,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,iBAAiB,EAAE,CAwCrB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,EACb,EACE,SAAoB,EACpB,YAAgB,EACjB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,GAAG,CAAC,MAAM,CAAC,CAsBb;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAK9F"}
@@ -0,0 +1,121 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Text } from "ink";
3
+ import { acpusInkUiTheme, wrapText } from "./theme.js";
4
+ export function JSONViewer({ data, width, rootLabel = "output", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme }) {
5
+ return _jsx(_Fragment, { children: jsonViewerRows(data, width, { rootLabel, initialDepth, expandedIds, selectedIndex, theme }) });
6
+ }
7
+ export function jsonViewerRows(data, width, { rootLabel = "output", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme } = {}) {
8
+ return jsonRowDescriptors(data, { rootLabel, initialDepth, expandedIds, theme })
9
+ .flatMap((row, rowIndex) => wrapText(row.text, width).map((chunk, index) => (_jsx(Text, { color: row.color, inverse: selectedIndex === rowIndex, children: index === 0 ? chunk : ` ${chunk}` }, `${row.id}:${index}`))));
10
+ }
11
+ export function jsonPlainText(data, rootLabel = "output", initialDepth = Number.POSITIVE_INFINITY) {
12
+ return jsonRowDescriptors(data, { rootLabel, initialDepth }).map((row) => row.text).join("\n");
13
+ }
14
+ export function jsonRowDescriptors(data, { rootLabel = "output", initialDepth = 2, expandedIds, theme = acpusInkUiTheme } = {}) {
15
+ const rows = [];
16
+ const visited = new WeakSet();
17
+ visit(data, rootLabel, 0, "root", []);
18
+ return rows;
19
+ function visit(value, key, depth, path, prefixes) {
20
+ const prefix = prefixes.join("");
21
+ const type = jsonType(value);
22
+ const branch = type === "object" || type === "array";
23
+ if (branch && value !== null && typeof value === "object") {
24
+ if (visited.has(value)) {
25
+ rows.push({
26
+ id: path,
27
+ text: `${prefix} ${key}: [circular]`,
28
+ color: theme.colors.warning,
29
+ branch: false
30
+ });
31
+ return;
32
+ }
33
+ visited.add(value);
34
+ }
35
+ const expanded = branch && (expandedIds ? expandedIds.has(path) : depth < initialDepth);
36
+ const summary = formatSummary(value, type);
37
+ rows.push({
38
+ id: path,
39
+ text: `${prefix}${expanded ? "▾" : branch ? "▸" : " "} ${key}${summary}`,
40
+ color: branch ? theme.colors.primary : colorFor(type, theme),
41
+ branch
42
+ });
43
+ if (!expanded)
44
+ return;
45
+ const entries = Array.isArray(value)
46
+ ? value.map((entry, index) => [String(index), entry])
47
+ : Object.entries(value);
48
+ entries.forEach(([childKey, childValue], index) => {
49
+ const last = index === entries.length - 1;
50
+ visit(childValue, childKey, depth + 1, `${path}.${childKey}`, [...prefixes, last ? " " : "│ "]);
51
+ });
52
+ }
53
+ }
54
+ export function jsonExpandedIdsForInitialDepth(data, { rootLabel = "output", initialDepth = 2 } = {}) {
55
+ const expanded = new Set();
56
+ const visited = new WeakSet();
57
+ visit(data, rootLabel, 0, "root");
58
+ return expanded;
59
+ function visit(value, _key, depth, path) {
60
+ const type = jsonType(value);
61
+ const branch = type === "object" || type === "array";
62
+ if (!branch || depth >= initialDepth)
63
+ return;
64
+ if (value !== null && typeof value === "object") {
65
+ if (visited.has(value))
66
+ return;
67
+ visited.add(value);
68
+ }
69
+ expanded.add(path);
70
+ const entries = Array.isArray(value)
71
+ ? value.map((entry, index) => [String(index), entry])
72
+ : Object.entries(value);
73
+ for (const [childKey, childValue] of entries) {
74
+ visit(childValue, childKey, depth + 1, `${path}.${childKey}`);
75
+ }
76
+ }
77
+ }
78
+ export function toggleJsonExpandedId(expandedIds, id) {
79
+ const next = new Set(expandedIds);
80
+ if (next.has(id))
81
+ next.delete(id);
82
+ else
83
+ next.add(id);
84
+ return next;
85
+ }
86
+ function jsonType(value) {
87
+ if (value === null)
88
+ return "null";
89
+ if (Array.isArray(value))
90
+ return "array";
91
+ if (typeof value === "object")
92
+ return "object";
93
+ if (typeof value === "number")
94
+ return "number";
95
+ if (typeof value === "boolean")
96
+ return "boolean";
97
+ return "string";
98
+ }
99
+ function formatSummary(value, type) {
100
+ if (type === "array")
101
+ return ` [${value.length}]`;
102
+ if (type === "object")
103
+ return ` {${Object.keys(value).length}}`;
104
+ if (type === "string")
105
+ return `: ${JSON.stringify(value)}`;
106
+ if (type === "null")
107
+ return ": null";
108
+ return `: ${String(value)}`;
109
+ }
110
+ function colorFor(type, theme) {
111
+ if (type === "string")
112
+ return theme.colors.success;
113
+ if (type === "number")
114
+ return theme.colors.warning;
115
+ if (type === "boolean")
116
+ return theme.colors.info;
117
+ if (type === "null")
118
+ return theme.colors.muted;
119
+ return theme.colors.text;
120
+ }
121
+ //# sourceMappingURL=JSONViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONViewer.js","sourceRoot":"","sources":["../../../src/ui/inkui/JSONViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export interface KeyHintItem {
4
+ key: string;
5
+ label: string;
6
+ }
7
+ export declare function KeyHint({ keys, theme }: {
8
+ keys: KeyHintItem[];
9
+ theme?: InkUiTheme;
10
+ }): React.ReactElement;
11
+ //# sourceMappingURL=KeyHint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyHint.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/KeyHint.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,KAAuB,EACxB,EAAE;IACD,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAarB"}
@@ -0,0 +1,7 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { acpusInkUiTheme } from "./theme.js";
4
+ export function KeyHint({ keys, theme = acpusInkUiTheme }) {
5
+ return (_jsx(Box, { gap: 2, children: keys.map(({ key, label }) => (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { bold: true, color: theme.colors.text, children: ["[", key, "]"] }), _jsx(Text, { color: theme.colors.muted, children: label })] }, `${key}:${label}`))) }));
6
+ }
7
+ //# sourceMappingURL=KeyHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyHint.js","sourceRoot":"","sources":["../../../src/ui/inkui/KeyHint.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAO9D,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,EACJ,KAAK,GAAG,eAAe,EAIxB;IACC,OAAO,CACL,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC5B,MAAC,GAAG,IAAyB,GAAG,EAAE,CAAC,aACjC,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,kBAC/B,GAAG,SACA,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,YAAG,KAAK,GAAQ,KAJvC,GAAG,GAAG,IAAI,KAAK,EAAE,CAKrB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export declare function Markdown({ content, width, theme }: {
4
+ content: string;
5
+ width: number;
6
+ theme?: InkUiTheme;
7
+ }): React.ReactElement;
8
+ export declare function markdownRows(content: string, width: number, theme?: InkUiTheme): React.ReactElement[];
9
+ //# sourceMappingURL=Markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EACL,KAAuB,EACxB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAErB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,UAA4B,GAAG,KAAK,CAAC,YAAY,EAAE,CAiFtH"}
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { acpusInkUiTheme, wrapText } from "./theme.js";
4
+ export function Markdown({ content, width, theme = acpusInkUiTheme }) {
5
+ return _jsx(Box, { flexDirection: "column", children: markdownRows(content, width, theme) });
6
+ }
7
+ export function markdownRows(content, width, theme = acpusInkUiTheme) {
8
+ const rows = [];
9
+ const lines = content.split("\n");
10
+ let inCode = false;
11
+ let codeLang = "";
12
+ lines.forEach((line, index) => {
13
+ if (line.startsWith("```")) {
14
+ inCode = !inCode;
15
+ codeLang = inCode ? line.slice(3).trim() : "";
16
+ rows.push(_jsx(Text, { color: theme.colors.muted, children: inCode ? `┌─ ${codeLang || "code"}` : "└─" }, `fence-${index}`));
17
+ return;
18
+ }
19
+ if (inCode) {
20
+ for (const [chunkIndex, chunk] of wrapText(line, Math.max(1, width - 2)).entries()) {
21
+ rows.push(_jsxs(Text, { color: theme.colors.text, children: ["\u2502 ", chunk] }, `code-${index}-${chunkIndex}`));
22
+ }
23
+ return;
24
+ }
25
+ if (line.startsWith("# ")) {
26
+ rows.push(_jsx(Text, { bold: true, color: theme.colors.primary, children: line.slice(2) }, `h1-${index}`));
27
+ return;
28
+ }
29
+ if (line.startsWith("## ")) {
30
+ rows.push(_jsx(Text, { bold: true, color: theme.colors.secondary, children: line.slice(3) }, `h2-${index}`));
31
+ return;
32
+ }
33
+ if (line.startsWith("### ")) {
34
+ rows.push(_jsx(Text, { bold: true, children: line.slice(4) }, `h3-${index}`));
35
+ return;
36
+ }
37
+ if (line.startsWith("> ")) {
38
+ for (const [chunkIndex, chunk] of wrapText(line.slice(2), Math.max(1, width - 2)).entries()) {
39
+ rows.push(_jsxs(Text, { color: theme.colors.muted, children: ["\u2502 ", chunk] }, `quote-${index}-${chunkIndex}`));
40
+ }
41
+ return;
42
+ }
43
+ if (line.startsWith("- ") || line.startsWith("* ")) {
44
+ for (const [i, chunk] of wrapText(line.slice(2), Math.max(1, width - 4)).entries()) {
45
+ rows.push(_jsxs(Text, { children: [_jsx(Text, { color: theme.colors.primary, children: i === 0 ? " • " : " " }), renderInlineParts(chunk, theme, `ul-${index}-${i}`)] }, `ul-${index}-${i}`));
46
+ }
47
+ return;
48
+ }
49
+ const ordered = line.match(/^(\s*)(\d+)\.\s(.*)$/);
50
+ if (ordered) {
51
+ const prefix = `${ordered[1]}${ordered[2]}. `;
52
+ for (const [i, chunk] of wrapText(ordered[3], Math.max(1, width - prefix.length)).entries()) {
53
+ rows.push(_jsxs(Text, { children: [_jsx(Text, { color: theme.colors.primary, children: i === 0 ? prefix : " ".repeat(prefix.length) }), renderInlineParts(chunk, theme, `ol-${index}-${i}`)] }, `ol-${index}-${i}`));
54
+ }
55
+ return;
56
+ }
57
+ if (line.trim() === "") {
58
+ rows.push(_jsx(Text, { children: " " }, `blank-${index}`));
59
+ return;
60
+ }
61
+ for (const [i, chunk] of wrapText(line, width).entries()) {
62
+ rows.push(_jsx(Text, { children: renderInlineParts(chunk, theme, `p-${index}-${i}`) }, `p-${index}-${i}`));
63
+ }
64
+ });
65
+ return rows.length > 0 ? rows : [_jsx(Text, { color: theme.colors.muted, children: "No prompt." }, "empty")];
66
+ }
67
+ function renderInlineParts(line, theme, keyPrefix = "inline") {
68
+ const parts = line.split(/(`[^`]+`|\*\*[^*]+\*\*)/g).filter(Boolean);
69
+ return parts.map((part, index) => {
70
+ const key = `${keyPrefix}:${part}:${index}`;
71
+ if (part.startsWith("`") && part.endsWith("`")) {
72
+ return _jsx(Text, { color: theme.colors.info, inverse: true, children: part.slice(1, -1) }, key);
73
+ }
74
+ if (part.startsWith("**") && part.endsWith("**")) {
75
+ return _jsx(Text, { bold: true, children: part.slice(2, -2) }, key);
76
+ }
77
+ return part;
78
+ });
79
+ }
80
+ //# sourceMappingURL=Markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/ui/inkui/Markdown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export interface ScrollAreaMetrics {
4
+ start: number;
5
+ end: number;
6
+ moreAbove: number;
7
+ moreBelow: number;
8
+ maxOffset: number;
9
+ }
10
+ export interface ScrollbarMetrics {
11
+ show: boolean;
12
+ thumbSize: number;
13
+ thumbPos: number;
14
+ }
15
+ export interface ScrollAreaProps {
16
+ height: number;
17
+ width?: number;
18
+ offset?: number;
19
+ scrollbar?: boolean;
20
+ scrollbarChar?: string;
21
+ trackChar?: string;
22
+ theme?: InkUiTheme;
23
+ empty?: React.ReactNode;
24
+ children: React.ReactNode;
25
+ }
26
+ export declare function scrollAreaMetrics(total: number, height: number, offset?: number): ScrollAreaMetrics;
27
+ export declare function scrollbarMetrics(total: number, height: number, offset?: number): ScrollbarMetrics;
28
+ export declare function ScrollArea({ height, width, offset, scrollbar, scrollbarChar, trackChar, theme, empty, children }: ScrollAreaProps): React.ReactElement;
29
+ //# sourceMappingURL=ScrollArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/ScrollArea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,iBAAiB,CAM9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,gBAAgB,CAY5F;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,MAAU,EACV,SAAgB,EAChB,aAAmB,EACnB,SAAe,EACf,KAAuB,EACvB,KAAK,EACL,QAAQ,EACT,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA2BtC"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Box, Text } from "ink";
4
+ import { acpusInkUiTheme } from "./theme.js";
5
+ export function scrollAreaMetrics(total, height, offset = 0) {
6
+ const visibleRows = Math.max(1, height);
7
+ const maxOffset = Math.max(0, total - visibleRows);
8
+ const start = Math.max(0, Math.min(offset, maxOffset));
9
+ const end = Math.min(total, start + visibleRows);
10
+ return { start, end, moreAbove: start, moreBelow: total - end, maxOffset };
11
+ }
12
+ export function scrollbarMetrics(total, height, offset = 0) {
13
+ const rows = Math.max(0, total);
14
+ const visibleRows = Math.max(1, height);
15
+ if (rows <= visibleRows)
16
+ return { show: false, thumbSize: visibleRows, thumbPos: 0 };
17
+ const metrics = scrollAreaMetrics(rows, visibleRows, offset);
18
+ const proportional = Math.floor((visibleRows / rows) * visibleRows);
19
+ const thumbSize = Math.max(1, Math.min(visibleRows, proportional));
20
+ const maxThumbPos = Math.max(0, visibleRows - thumbSize);
21
+ const thumbPos = metrics.maxOffset > 0
22
+ ? Math.min(maxThumbPos, Math.floor((metrics.start / metrics.maxOffset) * maxThumbPos))
23
+ : 0;
24
+ return { show: true, thumbSize, thumbPos };
25
+ }
26
+ export function ScrollArea({ height, width, offset = 0, scrollbar = true, scrollbarChar = "█", trackChar = "░", theme = acpusInkUiTheme, empty, children }) {
27
+ const rows = React.Children.toArray(children);
28
+ const metrics = scrollAreaMetrics(rows.length, height, offset);
29
+ const visible = rows.slice(metrics.start, metrics.end);
30
+ const bar = scrollbarMetrics(rows.length, height, offset);
31
+ const showScrollbar = scrollbar && bar.show;
32
+ const contentWidth = width === undefined ? undefined : Math.max(1, width - (showScrollbar ? 1 : 0));
33
+ return (_jsxs(Box, { flexDirection: "row", height: height, width: width, overflow: "hidden", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, width: contentWidth, children: rows.length === 0 ? empty : visible }), showScrollbar ? (_jsx(Box, { flexDirection: "column", width: 1, children: Array.from({ length: height }, (_, i) => {
34
+ const isThumb = i >= bar.thumbPos && i < bar.thumbPos + bar.thumbSize;
35
+ return (_jsx(Text, { color: isThumb ? theme.colors.primary : theme.colors.muted, children: isThumb ? scrollbarChar : trackChar }, i));
36
+ }) })) : null] }));
37
+ }
38
+ //# sourceMappingURL=ScrollArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollArea.js","sourceRoot":"","sources":["../../../src/ui/inkui/ScrollArea.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ declare const FRAMES: {
4
+ readonly dots: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
5
+ readonly line: readonly ["-", "\\", "|", "/"];
6
+ readonly arc: readonly ["◜", "◠", "◝", "◞", "◡", "◟"];
7
+ readonly bounce: readonly ["⠁", "⠂", "⠄", "⠂"];
8
+ };
9
+ export type SpinnerType = keyof typeof FRAMES;
10
+ export declare function spinnerFrame(type: SpinnerType, frame: number, active: boolean): string;
11
+ export declare function Spinner({ label, type, interval, active, theme }: {
12
+ label?: string;
13
+ type?: SpinnerType;
14
+ interval?: number;
15
+ active?: boolean;
16
+ theme?: InkUiTheme;
17
+ }): React.ReactElement;
18
+ export {};
19
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,QAAA,MAAM,MAAM;;;;;CAKF,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,MAAM,CAAC;AAE9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAItF;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAU,EACV,IAAa,EACb,QAAa,EACb,MAAa,EACb,KAAuB,EACxB,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAwBrB"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { Text } from "ink";
4
+ import { acpusInkUiTheme } from "./theme.js";
5
+ const FRAMES = {
6
+ dots: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
7
+ line: ["-", "\\", "|", "/"],
8
+ arc: ["◜", "◠", "◝", "◞", "◡", "◟"],
9
+ bounce: ["⠁", "⠂", "⠄", "⠂"]
10
+ };
11
+ export function spinnerFrame(type, frame, active) {
12
+ if (!active)
13
+ return "■";
14
+ const frames = FRAMES[type];
15
+ return frames[Math.max(0, frame) % frames.length];
16
+ }
17
+ export function Spinner({ label = "", type = "dots", interval = 80, active = true, theme = acpusInkUiTheme }) {
18
+ const frames = FRAMES[type];
19
+ const [frame, setFrame] = useState(0);
20
+ const wasActiveRef = useRef(active);
21
+ useEffect(() => {
22
+ if (active && !wasActiveRef.current)
23
+ setFrame(0);
24
+ wasActiveRef.current = active;
25
+ }, [active]);
26
+ useEffect(() => {
27
+ if (!active)
28
+ return;
29
+ const timer = setInterval(() => {
30
+ setFrame((prev) => (prev + 1) % frames.length);
31
+ }, interval);
32
+ return () => clearInterval(timer);
33
+ }, [active, interval, type]);
34
+ return (_jsxs(Text, { children: [_jsx(Text, { color: active ? theme.colors.primary : theme.colors.muted, children: spinnerFrame(type, frame, active) }), active && label ? ` ${label}` : ""] }));
35
+ }
36
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/ui/inkui/Spinner.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACxD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpB,CAAC;AAIX,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,KAAa,EAAE,MAAe;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EACtB,KAAK,GAAG,EAAE,EACV,IAAI,GAAG,MAAM,EACb,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,IAAI,EACb,KAAK,GAAG,eAAe,EAOxB;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjD,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC;IAChC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE7B,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,YAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAQ,EAC1G,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAC9B,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export interface TabItem {
4
+ key: string;
5
+ label: string;
6
+ badge?: number;
7
+ }
8
+ export declare function Tabs({ tabs, activeKey, width, theme }: {
9
+ tabs: TabItem[];
10
+ activeKey: string;
11
+ width: number;
12
+ theme?: InkUiTheme;
13
+ }): React.ReactElement | null;
14
+ //# sourceMappingURL=Tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,SAAS,EACT,KAAK,EACL,KAAuB,EACxB,EAAE;IACD,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAsB5B"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { acpusInkUiTheme, clampInline } from "./theme.js";
4
+ export function Tabs({ tabs, activeKey, width, theme = acpusInkUiTheme }) {
5
+ if (tabs.length === 0)
6
+ return null;
7
+ const maxLabel = Math.max(5, Math.floor(Math.max(20, width) / Math.max(1, tabs.length)) - 4);
8
+ return (_jsx(Box, { flexDirection: "row", gap: 1, overflow: "hidden", children: tabs.map((tab, index) => {
9
+ const active = tab.key === activeKey;
10
+ const suffix = tab.badge !== undefined ? ` ${tab.badge}` : "";
11
+ const label = clampInline(`${index + 1}:${tab.label}${suffix}`, maxLabel);
12
+ return (_jsx(Text, { bold: active, color: active ? theme.colors.textInverse : theme.colors.muted, backgroundColor: active ? theme.colors.selection : undefined, children: active ? ` ${label} ` : ` ${label} ` }, tab.key));
13
+ }) }));
14
+ }
15
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/ui/inkui/Tabs.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAQ3E,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,SAAS,EACT,KAAK,EACL,KAAK,GAAG,eAAe,EAMxB;IACC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7F,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAC,QAAQ,YAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC;YACrC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC1E,OAAO,CACL,KAAC,IAAI,IAEH,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAC7D,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,YAE3D,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,IALhC,GAAG,CAAC,GAAG,CAMP,CACR,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./JSONViewer.js";
2
+ export * from "./KeyHint.js";
3
+ export * from "./Markdown.js";
4
+ export * from "./ScrollArea.js";
5
+ export * from "./Spinner.js";
6
+ export * from "./Tabs.js";
7
+ export * from "./theme.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./JSONViewer.js";
2
+ export * from "./KeyHint.js";
3
+ export * from "./Markdown.js";
4
+ export * from "./ScrollArea.js";
5
+ export * from "./Spinner.js";
6
+ export * from "./Tabs.js";
7
+ export * from "./theme.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/inkui/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}