@yeshwanthyk/open-tui 0.1.0 → 0.1.2

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 (132) hide show
  1. package/dist/app.d.ts +18 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +28 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/autocomplete/autocomplete.d.ts +48 -0
  6. package/dist/autocomplete/autocomplete.d.ts.map +1 -0
  7. package/dist/autocomplete/autocomplete.js +391 -0
  8. package/dist/autocomplete/autocomplete.js.map +1 -0
  9. package/dist/autocomplete/file-index.d.ts +36 -0
  10. package/dist/autocomplete/file-index.d.ts.map +1 -0
  11. package/dist/autocomplete/file-index.js +143 -0
  12. package/dist/autocomplete/file-index.js.map +1 -0
  13. package/dist/autocomplete/index.d.ts +3 -0
  14. package/dist/autocomplete/index.d.ts.map +1 -0
  15. package/dist/autocomplete/index.js +3 -0
  16. package/dist/autocomplete/index.js.map +1 -0
  17. package/dist/components/badge.d.ts +11 -0
  18. package/dist/components/badge.d.ts.map +1 -0
  19. package/dist/components/badge.js +28 -0
  20. package/dist/components/badge.js.map +1 -0
  21. package/dist/components/code-block.d.ts +12 -0
  22. package/dist/components/code-block.d.ts.map +1 -0
  23. package/dist/components/code-block.js +21 -0
  24. package/dist/components/code-block.js.map +1 -0
  25. package/dist/components/dialog.d.ts +12 -0
  26. package/dist/components/dialog.d.ts.map +1 -0
  27. package/dist/components/dialog.js +15 -0
  28. package/dist/components/dialog.js.map +1 -0
  29. package/dist/components/diff.d.ts +11 -0
  30. package/dist/components/diff.d.ts.map +1 -0
  31. package/dist/components/diff.js +18 -0
  32. package/dist/components/diff.js.map +1 -0
  33. package/dist/components/divider.d.ts +9 -0
  34. package/dist/components/divider.d.ts.map +1 -0
  35. package/dist/components/divider.js +14 -0
  36. package/dist/components/divider.js.map +1 -0
  37. package/dist/components/editor.d.ts +87 -0
  38. package/dist/components/editor.d.ts.map +1 -0
  39. package/dist/components/editor.js +145 -0
  40. package/dist/components/editor.js.map +1 -0
  41. package/dist/components/image.d.ts +65 -0
  42. package/dist/components/image.d.ts.map +1 -0
  43. package/dist/components/image.js +315 -0
  44. package/dist/components/image.js.map +1 -0
  45. package/dist/components/loader.d.ts +25 -0
  46. package/dist/components/loader.d.ts.map +1 -0
  47. package/dist/components/loader.js +24 -0
  48. package/dist/components/loader.js.map +1 -0
  49. package/dist/components/markdown.d.ts +28 -0
  50. package/dist/components/markdown.d.ts.map +1 -0
  51. package/dist/components/markdown.js +28 -0
  52. package/dist/components/markdown.js.map +1 -0
  53. package/dist/components/panel.d.ts +12 -0
  54. package/dist/components/panel.d.ts.map +1 -0
  55. package/dist/components/panel.js +47 -0
  56. package/dist/components/panel.js.map +1 -0
  57. package/dist/components/select-list.d.ts +55 -0
  58. package/dist/components/select-list.d.ts.map +1 -0
  59. package/dist/components/select-list.js +116 -0
  60. package/dist/components/select-list.js.map +1 -0
  61. package/dist/components/spacer.d.ts +25 -0
  62. package/dist/components/spacer.d.ts.map +1 -0
  63. package/dist/components/spacer.js +25 -0
  64. package/dist/components/spacer.js.map +1 -0
  65. package/dist/components/toast.d.ts +19 -0
  66. package/dist/components/toast.d.ts.map +1 -0
  67. package/dist/components/toast.js +42 -0
  68. package/dist/components/toast.js.map +1 -0
  69. package/dist/context/terminal.d.ts +7 -0
  70. package/dist/context/terminal.d.ts.map +1 -0
  71. package/dist/context/terminal.js +6 -0
  72. package/dist/context/terminal.js.map +1 -0
  73. package/dist/context/theme.d.ts +117 -0
  74. package/dist/context/theme.d.ts.map +1 -0
  75. package/dist/context/theme.js +648 -0
  76. package/dist/context/theme.js.map +1 -0
  77. package/dist/hooks/use-keyboard.d.ts +7 -0
  78. package/dist/hooks/use-keyboard.d.ts.map +1 -0
  79. package/dist/hooks/use-keyboard.js +6 -0
  80. package/dist/hooks/use-keyboard.js.map +1 -0
  81. package/dist/index.d.ts +31 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +45 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/opentui-augmentations.d.ts +9 -0
  86. package/dist/opentui-augmentations.d.ts.map +1 -0
  87. package/dist/opentui-augmentations.js +1 -0
  88. package/dist/opentui-augmentations.js.map +1 -0
  89. package/dist/parsers-config.d.ts +16 -0
  90. package/dist/parsers-config.d.ts.map +1 -0
  91. package/dist/parsers-config.js +119 -0
  92. package/dist/parsers-config.js.map +1 -0
  93. package/dist/themes/aura.json +69 -0
  94. package/dist/themes/ayu.json +80 -0
  95. package/dist/themes/catppuccin-macchiato.json +233 -0
  96. package/dist/themes/catppuccin.json +112 -0
  97. package/dist/themes/cobalt2.json +228 -0
  98. package/dist/themes/dracula.json +219 -0
  99. package/dist/themes/everforest.json +241 -0
  100. package/dist/themes/flexoki.json +237 -0
  101. package/dist/themes/github.json +233 -0
  102. package/dist/themes/gruvbox.json +95 -0
  103. package/dist/themes/kanagawa.json +77 -0
  104. package/dist/themes/lucent-orng.json +227 -0
  105. package/dist/themes/marvin.json +97 -0
  106. package/dist/themes/material.json +235 -0
  107. package/dist/themes/matrix.json +77 -0
  108. package/dist/themes/mercury.json +245 -0
  109. package/dist/themes/monokai.json +221 -0
  110. package/dist/themes/nightowl.json +221 -0
  111. package/dist/themes/nord.json +223 -0
  112. package/dist/themes/one-dark.json +84 -0
  113. package/dist/themes/opencode.json +245 -0
  114. package/dist/themes/orng.json +245 -0
  115. package/dist/themes/palenight.json +222 -0
  116. package/dist/themes/rosepine.json +234 -0
  117. package/dist/themes/solarized.json +223 -0
  118. package/dist/themes/synthwave84.json +226 -0
  119. package/dist/themes/tokyonight.json +243 -0
  120. package/dist/themes/vercel.json +245 -0
  121. package/dist/themes/vesper.json +218 -0
  122. package/dist/themes/zenburn.json +223 -0
  123. package/dist/utils/clipboard.d.ts +12 -0
  124. package/dist/utils/clipboard.d.ts.map +1 -0
  125. package/dist/utils/clipboard.js +52 -0
  126. package/dist/utils/clipboard.js.map +1 -0
  127. package/dist/utils/text-width.d.ts +26 -0
  128. package/dist/utils/text-width.d.ts.map +1 -0
  129. package/dist/utils/text-width.js +101 -0
  130. package/dist/utils/text-width.js.map +1 -0
  131. package/package.json +13 -4
  132. package/src/index.ts +0 -121
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/components/editor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Image component for rendering images in the terminal
3
+ *
4
+ * Supports Kitty and iTerm2 image protocols with automatic detection.
5
+ * Falls back to text placeholder when images aren't supported.
6
+ *
7
+ * Note: Image escape sequences are written directly to stdout, bypassing
8
+ * OpenTUI's text buffer (which doesn't properly handle OSC sequences).
9
+ */
10
+ import { type RGBA } from "../context/theme.js";
11
+ export type ImageProtocol = "kitty" | "iterm2" | null;
12
+ export interface TerminalCapabilities {
13
+ images: ImageProtocol;
14
+ trueColor: boolean;
15
+ }
16
+ export interface ImageDimensions {
17
+ widthPx: number;
18
+ heightPx: number;
19
+ }
20
+ export interface CellDimensions {
21
+ widthPx: number;
22
+ heightPx: number;
23
+ }
24
+ export interface ImageProps {
25
+ /** Base64 encoded image data */
26
+ data: string;
27
+ /** MIME type of the image */
28
+ mimeType: string;
29
+ /** Image dimensions (will be auto-detected if not provided) */
30
+ dimensions?: ImageDimensions;
31
+ /** Maximum width in terminal cells */
32
+ maxWidth?: number;
33
+ /** Maximum height in terminal cells */
34
+ maxHeight?: number;
35
+ /** Filename for fallback display */
36
+ filename?: string;
37
+ /** Fallback text color */
38
+ fallbackColor?: RGBA;
39
+ }
40
+ export declare function setCellDimensions(dims: CellDimensions): void;
41
+ export declare function getCellDimensions(): CellDimensions;
42
+ /**
43
+ * Detect terminal image capabilities
44
+ */
45
+ export declare function detectCapabilities(): TerminalCapabilities;
46
+ export declare function getCapabilities(): TerminalCapabilities;
47
+ export declare function resetCapabilitiesCache(): void;
48
+ /**
49
+ * Get image dimensions from base64 data
50
+ */
51
+ export declare function getImageDimensions(base64Data: string, mimeType: string): ImageDimensions | null;
52
+ /**
53
+ * Image component for rendering inline images in the terminal
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * <Image
58
+ * data={base64ImageData}
59
+ * mimeType="image/png"
60
+ * maxWidth={60}
61
+ * />
62
+ * ```
63
+ */
64
+ export declare function Image(props: ImageProps): any;
65
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/components/image.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,KAAK,IAAI,EAAY,MAAM,qBAAqB,CAAA;AAGzD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAA;AAErD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,IAAI,CAAA;CACpB;AAQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CA2BzD;AAED,wBAAgB,eAAe,IAAI,oBAAoB,CAKtD;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAgID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAM/F;AAkCD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,OAwFtC"}
@@ -0,0 +1,315 @@
1
+ import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
2
+ /**
3
+ * Image component for rendering images in the terminal
4
+ *
5
+ * Supports Kitty and iTerm2 image protocols with automatic detection.
6
+ * Falls back to text placeholder when images aren't supported.
7
+ *
8
+ * Note: Image escape sequences are written directly to stdout, bypassing
9
+ * OpenTUI's text buffer (which doesn't properly handle OSC sequences).
10
+ */
11
+ import { createEffect, createMemo, onCleanup, Show } from "solid-js";
12
+ import { useTerminalDimensions } from "../context/terminal.js";
13
+ import { useTheme } from "../context/theme.js";
14
+ // Cache terminal capabilities
15
+ let cachedCapabilities = null;
16
+ // Default cell dimensions
17
+ let cellDimensions = { widthPx: 9, heightPx: 18 };
18
+ export function setCellDimensions(dims) {
19
+ cellDimensions = dims;
20
+ }
21
+ export function getCellDimensions() {
22
+ return cellDimensions;
23
+ }
24
+ /**
25
+ * Detect terminal image capabilities
26
+ */
27
+ export function detectCapabilities() {
28
+ const env = process.env;
29
+ const termProgram = env["TERM_PROGRAM"]?.toLowerCase() || "";
30
+ const term = env["TERM"]?.toLowerCase() || "";
31
+ const colorTerm = env["COLORTERM"]?.toLowerCase() || "";
32
+ const termInfo = env["TERMINFO"]?.toLowerCase() || "";
33
+ // Kitty protocol support
34
+ if (env["KITTY_WINDOW_ID"] || termProgram === "kitty") {
35
+ return { images: "kitty", trueColor: true };
36
+ }
37
+ // Ghostty - check TERM_PROGRAM or TERMINFO (for tmux passthrough)
38
+ if (termProgram === "ghostty" || term.includes("ghostty") || termInfo.includes("ghostty")) {
39
+ return { images: "kitty", trueColor: true };
40
+ }
41
+ if (env["WEZTERM_PANE"] || termProgram === "wezterm") {
42
+ return { images: "kitty", trueColor: true };
43
+ }
44
+ // iTerm2 protocol support
45
+ if (env["ITERM_SESSION_ID"] || termProgram === "iterm.app") {
46
+ return { images: "iterm2", trueColor: true };
47
+ }
48
+ // No image support
49
+ const trueColor = colorTerm === "truecolor" || colorTerm === "24bit";
50
+ return { images: null, trueColor };
51
+ }
52
+ export function getCapabilities() {
53
+ if (!cachedCapabilities) {
54
+ cachedCapabilities = detectCapabilities();
55
+ }
56
+ return cachedCapabilities;
57
+ }
58
+ export function resetCapabilitiesCache() {
59
+ cachedCapabilities = null;
60
+ }
61
+ /**
62
+ * Encode image using Kitty graphics protocol
63
+ */
64
+ function encodeKitty(base64Data, columns, rows) {
65
+ const CHUNK_SIZE = 4096;
66
+ const params = ["a=T", "f=100", "q=2", `c=${columns}`, `r=${rows}`];
67
+ if (base64Data.length <= CHUNK_SIZE) {
68
+ return `\x1b_G${params.join(",")};${base64Data}\x1b\\`;
69
+ }
70
+ const chunks = [];
71
+ let offset = 0;
72
+ let isFirst = true;
73
+ while (offset < base64Data.length) {
74
+ const chunk = base64Data.slice(offset, offset + CHUNK_SIZE);
75
+ const isLast = offset + CHUNK_SIZE >= base64Data.length;
76
+ if (isFirst) {
77
+ chunks.push(`\x1b_G${params.join(",")},m=1;${chunk}\x1b\\`);
78
+ isFirst = false;
79
+ }
80
+ else if (isLast) {
81
+ chunks.push(`\x1b_Gm=0;${chunk}\x1b\\`);
82
+ }
83
+ else {
84
+ chunks.push(`\x1b_Gm=1;${chunk}\x1b\\`);
85
+ }
86
+ offset += CHUNK_SIZE;
87
+ }
88
+ return chunks.join("");
89
+ }
90
+ /**
91
+ * Encode image using iTerm2 inline image protocol
92
+ */
93
+ function encodeITerm2(base64Data, width) {
94
+ const params = [`inline=1`, `width=${width}`, `height=auto`, `preserveAspectRatio=1`];
95
+ return `\x1b]1337;File=${params.join(";")}:${base64Data}\x07`;
96
+ }
97
+ /**
98
+ * Calculate image rows based on dimensions and cell size
99
+ */
100
+ function calculateRows(imageDims, targetWidthCells) {
101
+ const targetWidthPx = targetWidthCells * cellDimensions.widthPx;
102
+ const scale = targetWidthPx / imageDims.widthPx;
103
+ const scaledHeightPx = imageDims.heightPx * scale;
104
+ const rows = Math.ceil(scaledHeightPx / cellDimensions.heightPx);
105
+ return Math.max(1, rows);
106
+ }
107
+ // Image dimension extractors
108
+ function getPngDimensions(base64Data) {
109
+ try {
110
+ const buffer = Buffer.from(base64Data, "base64");
111
+ if (buffer.length < 24)
112
+ return null;
113
+ if (buffer[0] !== 0x89 || buffer[1] !== 0x50 || buffer[2] !== 0x4e || buffer[3] !== 0x47)
114
+ return null;
115
+ return { widthPx: buffer.readUInt32BE(16), heightPx: buffer.readUInt32BE(20) };
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ function getJpegDimensions(base64Data) {
122
+ try {
123
+ const buffer = Buffer.from(base64Data, "base64");
124
+ if (buffer.length < 2 || buffer[0] !== 0xff || buffer[1] !== 0xd8)
125
+ return null;
126
+ let offset = 2;
127
+ while (offset < buffer.length - 9) {
128
+ if (buffer[offset] !== 0xff) {
129
+ offset++;
130
+ continue;
131
+ }
132
+ const marker = buffer[offset + 1];
133
+ if (marker !== undefined && marker >= 0xc0 && marker <= 0xc2) {
134
+ return { widthPx: buffer.readUInt16BE(offset + 7), heightPx: buffer.readUInt16BE(offset + 5) };
135
+ }
136
+ if (offset + 3 >= buffer.length)
137
+ return null;
138
+ const length = buffer.readUInt16BE(offset + 2);
139
+ if (length < 2)
140
+ return null;
141
+ offset += 2 + length;
142
+ }
143
+ return null;
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ function getGifDimensions(base64Data) {
150
+ try {
151
+ const buffer = Buffer.from(base64Data, "base64");
152
+ if (buffer.length < 10)
153
+ return null;
154
+ const sig = buffer.slice(0, 6).toString("ascii");
155
+ if (sig !== "GIF87a" && sig !== "GIF89a")
156
+ return null;
157
+ return { widthPx: buffer.readUInt16LE(6), heightPx: buffer.readUInt16LE(8) };
158
+ }
159
+ catch {
160
+ return null;
161
+ }
162
+ }
163
+ function getWebpDimensions(base64Data) {
164
+ try {
165
+ const buffer = Buffer.from(base64Data, "base64");
166
+ if (buffer.length < 30)
167
+ return null;
168
+ if (buffer.slice(0, 4).toString("ascii") !== "RIFF")
169
+ return null;
170
+ if (buffer.slice(8, 12).toString("ascii") !== "WEBP")
171
+ return null;
172
+ const chunk = buffer.slice(12, 16).toString("ascii");
173
+ if (chunk === "VP8 " && buffer.length >= 30) {
174
+ return { widthPx: buffer.readUInt16LE(26) & 0x3fff, heightPx: buffer.readUInt16LE(28) & 0x3fff };
175
+ }
176
+ if (chunk === "VP8L" && buffer.length >= 25) {
177
+ const bits = buffer.readUInt32LE(21);
178
+ return { widthPx: (bits & 0x3fff) + 1, heightPx: ((bits >> 14) & 0x3fff) + 1 };
179
+ }
180
+ if (chunk === "VP8X" && buffer.length >= 30) {
181
+ return {
182
+ widthPx: ((buffer[24] ?? 0) | ((buffer[25] ?? 0) << 8) | ((buffer[26] ?? 0) << 16)) + 1,
183
+ heightPx: ((buffer[27] ?? 0) | ((buffer[28] ?? 0) << 8) | ((buffer[29] ?? 0) << 16)) + 1,
184
+ };
185
+ }
186
+ return null;
187
+ }
188
+ catch {
189
+ return null;
190
+ }
191
+ }
192
+ /**
193
+ * Get image dimensions from base64 data
194
+ */
195
+ export function getImageDimensions(base64Data, mimeType) {
196
+ if (mimeType === "image/png")
197
+ return getPngDimensions(base64Data);
198
+ if (mimeType === "image/jpeg")
199
+ return getJpegDimensions(base64Data);
200
+ if (mimeType === "image/gif")
201
+ return getGifDimensions(base64Data);
202
+ if (mimeType === "image/webp")
203
+ return getWebpDimensions(base64Data);
204
+ return null;
205
+ }
206
+ /**
207
+ * Generate fallback text for images
208
+ */
209
+ function imageFallback(mimeType, dimensions, filename) {
210
+ const parts = [];
211
+ if (filename)
212
+ parts.push(filename);
213
+ parts.push(`[${mimeType}]`);
214
+ if (dimensions)
215
+ parts.push(`${dimensions.widthPx}x${dimensions.heightPx}`);
216
+ return `[Image: ${parts.join(" ")}]`;
217
+ }
218
+ // Track rendered images to avoid duplicate writes
219
+ const renderedImages = new Set();
220
+ /**
221
+ * Write image escape sequence directly to stdout
222
+ * This bypasses OpenTUI's text buffer which doesn't handle OSC sequences properly
223
+ */
224
+ function writeImageToStdout(sequence, rows, imageId) {
225
+ // Avoid duplicate writes for the same image
226
+ if (renderedImages.has(imageId))
227
+ return;
228
+ renderedImages.add(imageId);
229
+ // Move cursor up to the start of the reserved space, output image, then restore position
230
+ // The box component reserves `rows` lines, so we move up (rows-1) to position at start
231
+ const moveUp = rows > 1 ? `\x1b[${rows - 1}A` : "";
232
+ const moveDown = rows > 1 ? `\x1b[${rows - 1}B` : "";
233
+ // Write: move up, image sequence, move down (to restore cursor position)
234
+ process.stdout.write(moveUp + sequence + moveDown);
235
+ }
236
+ /**
237
+ * Image component for rendering inline images in the terminal
238
+ *
239
+ * @example
240
+ * ```tsx
241
+ * <Image
242
+ * data={base64ImageData}
243
+ * mimeType="image/png"
244
+ * maxWidth={60}
245
+ * />
246
+ * ```
247
+ */
248
+ export function Image(props) {
249
+ const { theme } = useTheme();
250
+ const caps = getCapabilities();
251
+ const fallbackColor = () => props.fallbackColor ?? theme.textMuted;
252
+ const termDimensions = useTerminalDimensions();
253
+ // Get or detect dimensions
254
+ const dimensions = createMemo(() => {
255
+ if (props.dimensions)
256
+ return props.dimensions;
257
+ return getImageDimensions(props.data, props.mimeType) ?? { widthPx: 800, heightPx: 600 };
258
+ });
259
+ // Dynamic maxWidth based on terminal size
260
+ const maxWidth = createMemo(() => Math.min(props.maxWidth ?? 60, termDimensions().width - 4));
261
+ const maxHeight = () => props.maxHeight ?? 24;
262
+ // Generate content-based key for caching (re-render if data or size changes)
263
+ const imageKey = createMemo(() => {
264
+ const dims = dimensions();
265
+ const mw = maxWidth();
266
+ const mh = maxHeight();
267
+ // Use first 32 chars of data for key
268
+ const dataPrefix = props.data.slice(0, 32);
269
+ return `img-${dataPrefix}-${dims.widthPx}x${dims.heightPx}-${mw}x${mh}`;
270
+ });
271
+ // Render image or fallback
272
+ const renderResult = createMemo(() => {
273
+ if (!caps.images) {
274
+ return { type: "fallback", text: imageFallback(props.mimeType, dimensions(), props.filename) };
275
+ }
276
+ const width = maxWidth();
277
+ let rows = calculateRows(dimensions(), width);
278
+ // Clamp to maxHeight
279
+ if (rows > maxHeight()) {
280
+ rows = maxHeight();
281
+ }
282
+ if (caps.images === "kitty") {
283
+ const sequence = encodeKitty(props.data, width, rows);
284
+ return { type: "image", sequence, rows };
285
+ }
286
+ if (caps.images === "iterm2") {
287
+ const sequence = encodeITerm2(props.data, width);
288
+ return { type: "image", sequence, rows };
289
+ }
290
+ return { type: "fallback", text: imageFallback(props.mimeType, dimensions(), props.filename) };
291
+ });
292
+ // Write image directly to stdout when component renders
293
+ createEffect(() => {
294
+ const result = renderResult();
295
+ const key = imageKey();
296
+ if (result.type === "image") {
297
+ // Small delay to ensure the box has been rendered and positioned
298
+ setTimeout(() => {
299
+ writeImageToStdout(result.sequence, result.rows, key);
300
+ }, 50);
301
+ }
302
+ });
303
+ // Re-render on terminal resize - imageKey already depends on maxWidth which depends on termDimensions
304
+ createEffect(() => {
305
+ const key = imageKey();
306
+ // Remove from cache to force re-render when dimensions change
307
+ renderedImages.delete(key);
308
+ });
309
+ // Cleanup: remove from rendered set when component unmounts
310
+ onCleanup(() => {
311
+ renderedImages.delete(imageKey());
312
+ });
313
+ return (_jsx(Show, { when: renderResult().type === "image", fallback: _jsx("text", { fg: fallbackColor(), children: renderResult().text }), children: _jsx("box", { height: renderResult().rows, width: maxWidth(), children: _jsx("text", { fg: theme.textMuted, children: " ".repeat(maxWidth()) }) }) }));
314
+ }
315
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/components/image.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Loader/spinner component using OpenTUI spinner
3
+ */
4
+ import { type RGBA } from "@opentui/core";
5
+ import "opentui-spinner/solid";
6
+ export interface LoaderProps {
7
+ /** Message to display alongside spinner */
8
+ message?: string;
9
+ /** Primary color for spinner */
10
+ color?: RGBA;
11
+ /** Dim color for message text */
12
+ dimColor?: RGBA;
13
+ /** Animation interval in ms */
14
+ interval?: number;
15
+ }
16
+ /**
17
+ * Animated loader with optional message
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * <Loader message="Loading..." color={theme.primary} />
22
+ * ```
23
+ */
24
+ export declare function Loader(props: LoaderProps): any;
25
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/components/loader.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,uBAAuB,CAAA;AAG9B,MAAM,WAAW,WAAW;IAC3B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,iCAAiC;IACjC,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAMD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,OAexC"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
2
+ /**
3
+ * Loader/spinner component using OpenTUI spinner
4
+ */
5
+ import { parseColor } from "@opentui/core";
6
+ import "opentui-spinner/solid";
7
+ import { Show } from "solid-js";
8
+ // Default spinner frames (bouncing dots style)
9
+ const DEFAULT_FRAMES = [" ", ". ", ".. ", "... ", "....", " ...", " ..", " ."];
10
+ const DEFAULT_COLOR = parseColor("#64b4ff");
11
+ /**
12
+ * Animated loader with optional message
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <Loader message="Loading..." color={theme.primary} />
17
+ * ```
18
+ */
19
+ export function Loader(props) {
20
+ const interval = () => props.interval ?? 120;
21
+ const color = () => props.color ?? DEFAULT_COLOR;
22
+ return (_jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("spinner", { frames: DEFAULT_FRAMES, interval: interval(), color: color() }), _jsx(Show, { when: props.message && props.dimColor, children: _jsx("text", { fg: props.dimColor, children: props.message }) }), _jsx(Show, { when: props.message && !props.dimColor, children: _jsx("text", { children: props.message }) })] }));
23
+ }
24
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/components/loader.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,eAAe,CAAA;AACrD,OAAO,uBAAuB,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAa/B,+CAA+C;AAC/C,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AACvF,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;AAE3C;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,KAAkB;IACxC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAA;IAC5C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,CAAA;IAEhD,OAAO,CACN,eAAK,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,aAC9B,kBAAS,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAI,EACzE,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,YAC1C,eAAM,EAAE,EAAE,KAAK,CAAC,QAAS,YAAG,KAAK,CAAC,OAAO,GAAQ,GAC3C,EACP,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,YAC3C,yBAAO,KAAK,CAAC,OAAO,GAAQ,GACtB,IACF,CACN,CAAA;AACF,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Markdown renderer using @opentui/core's tree-sitter based <code> component
3
+ */
4
+ import type { JSX } from "solid-js";
5
+ export interface MarkdownProps {
6
+ /** Markdown text to render */
7
+ text: string;
8
+ /** Enable conceal mode (hides markdown syntax like **, #, etc.) */
9
+ conceal?: boolean;
10
+ /** Whether content is actively streaming */
11
+ streaming?: boolean;
12
+ /** Use dimmed/subtle styling (for secondary content like thinking blocks) */
13
+ dim?: boolean;
14
+ }
15
+ /**
16
+ * Markdown component that renders markdown text with tree-sitter syntax highlighting
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <Markdown text="# Hello\n\nThis is **bold** text." />
21
+ * ```
22
+ */
23
+ export declare function Markdown(props: MarkdownProps): JSX.Element;
24
+ export interface MarkdownTheme {
25
+ text?: string;
26
+ heading?: string;
27
+ }
28
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/components/markdown.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAGnC,MAAM,WAAW,aAAa;IAC7B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAmB1D;AAGD,MAAM,WAAW,aAAa;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CAEhB"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
2
+ import { useTheme } from "../context/theme.js";
3
+ /**
4
+ * Markdown component that renders markdown text with tree-sitter syntax highlighting
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * <Markdown text="# Hello\n\nThis is **bold** text." />
9
+ * ```
10
+ */
11
+ export function Markdown(props) {
12
+ const { theme, syntaxStyle, subtleSyntaxStyle } = useTheme();
13
+ const isStreaming = props.streaming ?? false;
14
+ const commonProps = {
15
+ content: props.text ?? "",
16
+ syntaxStyle: props.dim ? subtleSyntaxStyle : syntaxStyle,
17
+ conceal: props.conceal ?? true,
18
+ streaming: isStreaming,
19
+ drawUnstyledText: true,
20
+ fg: props.dim ? theme.textMuted : theme.markdownText,
21
+ };
22
+ if (isStreaming) {
23
+ // Skip tree-sitter while streaming to avoid O(n) highlight cost.
24
+ return _jsx("code", { ...commonProps });
25
+ }
26
+ return _jsx("code", { filetype: "markdown", ...commonProps });
27
+ }
28
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/components/markdown.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAa9C;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC5C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,MAAM,WAAW,GAAG;QACnB,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QACzB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW;QACxD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,SAAS,EAAE,WAAW;QACtB,gBAAgB,EAAE,IAAa;QAC/B,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY;KACpD,CAAA;IAED,IAAI,WAAW,EAAE,CAAC;QACjB,iEAAiE;QACjE,OAAO,kBAAU,WAAW,GAAI,CAAA;IACjC,CAAC;IAED,OAAO,eAAM,QAAQ,EAAC,UAAU,KAAK,WAAW,GAAI,CAAA;AACrD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { JSX } from "@opentui/solid";
2
+ import { type RGBA } from "../context/theme.js";
3
+ export type PanelVariant = "panel" | "element" | "menu" | "transparent";
4
+ export type PanelProps = JSX.IntrinsicElements["box"] & {
5
+ variant?: PanelVariant;
6
+ paddingX?: number | `${number}%`;
7
+ paddingY?: number | `${number}%`;
8
+ accentLeft?: RGBA;
9
+ accentWidth?: number;
10
+ };
11
+ export declare function Panel(props: PanelProps): JSX.Element;
12
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/components/panel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAY,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAIzD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,CAAA;AAEvE,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG;IACvD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IAChC,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,CAmEpD"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
2
+ import { parseColor } from "@opentui/core";
3
+ import { splitProps } from "solid-js";
4
+ import { useTheme } from "../context/theme.js";
5
+ const transparentBg = parseColor("transparent");
6
+ export function Panel(props) {
7
+ const { theme } = useTheme();
8
+ const [local, rest] = splitProps(props, [
9
+ "variant",
10
+ "padding",
11
+ "paddingLeft",
12
+ "paddingRight",
13
+ "paddingTop",
14
+ "paddingBottom",
15
+ "paddingX",
16
+ "paddingY",
17
+ "backgroundColor",
18
+ "border",
19
+ "borderColor",
20
+ "accentLeft",
21
+ "accentWidth",
22
+ "children",
23
+ ]);
24
+ const resolvedBg = () => {
25
+ if (local.backgroundColor !== undefined)
26
+ return local.backgroundColor;
27
+ switch (local.variant ?? "panel") {
28
+ case "element":
29
+ return theme.backgroundElement;
30
+ case "menu":
31
+ return theme.backgroundMenu;
32
+ case "transparent":
33
+ return transparentBg;
34
+ case "panel":
35
+ default:
36
+ return theme.backgroundPanel;
37
+ }
38
+ };
39
+ const resolvedBorder = () => local.border ?? true;
40
+ const resolvedBorderColor = () => local.borderColor ?? theme.borderSubtle;
41
+ const paddingLeft = () => local.paddingLeft ?? local.paddingX ?? local.padding ?? 1;
42
+ const paddingRight = () => local.paddingRight ?? local.paddingX ?? local.padding ?? 1;
43
+ const paddingTop = () => local.paddingTop ?? local.paddingY ?? local.padding ?? 0;
44
+ const paddingBottom = () => local.paddingBottom ?? local.paddingY ?? local.padding ?? 0;
45
+ return (_jsxs("box", { flexDirection: "row", ...rest, children: [local.accentLeft && (_jsx("box", { width: local.accentWidth ?? 1, backgroundColor: local.accentLeft, flexShrink: 0 })), _jsx("box", { flexDirection: "column", backgroundColor: resolvedBg(), border: resolvedBorder(), borderColor: resolvedBorderColor(), paddingLeft: paddingLeft(), paddingRight: paddingRight(), paddingTop: paddingTop(), paddingBottom: paddingBottom(), flexGrow: 1, children: local.children })] }));
46
+ }
47
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/components/panel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAa,MAAM,qBAAqB,CAAA;AAEzD,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;AAY/C,MAAM,UAAU,KAAK,CAAC,KAAiB;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE;QACvC,SAAS;QACT,SAAS;QACT,aAAa;QACb,cAAc;QACd,YAAY;QACZ,eAAe;QACf,UAAU;QACV,UAAU;QACV,iBAAiB;QACjB,QAAQ;QACR,aAAa;QACb,YAAY;QACZ,aAAa;QACb,UAAU;KACV,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC7B,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,eAAuB,CAAA;QAC7E,QAAQ,KAAK,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;YAClC,KAAK,SAAS;gBACb,OAAO,KAAK,CAAC,iBAAiB,CAAA;YAC/B,KAAK,MAAM;gBACV,OAAO,KAAK,CAAC,cAAc,CAAA;YAC5B,KAAK,aAAa;gBACjB,OAAO,aAAa,CAAA;YACrB,KAAK,OAAO,CAAC;YACb;gBACC,OAAO,KAAK,CAAC,eAAe,CAAA;QAC9B,CAAC;IACF,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAA;IACjD,MAAM,mBAAmB,GAAG,GAAS,EAAE,CAAE,KAAK,CAAC,WAAgC,IAAI,KAAK,CAAC,YAAY,CAAA;IAErG,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;IACnF,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;IACrF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;IACjF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;IAEvF,OAAO,CACN,eAAK,aAAa,EAAC,KAAK,KAAK,IAAI,aAC/B,KAAK,CAAC,UAAU,IAAI,CACpB,cACC,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,EAC7B,eAAe,EAAE,KAAK,CAAC,UAAU,EACjC,UAAU,EAAE,CAAC,GACZ,CACF,EACD,cACC,aAAa,EAAC,QAAQ,EACtB,eAAe,EAAE,UAAU,EAAE,EAC7B,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,mBAAmB,EAAE,EAClC,WAAW,EAAE,WAAW,EAAE,EAC1B,YAAY,EAAE,YAAY,EAAE,EAC5B,UAAU,EAAE,UAAU,EAAE,EACxB,aAAa,EAAE,aAAa,EAAE,EAC9B,QAAQ,EAAE,CAAC,YAEV,KAAK,CAAC,QAAQ,GACV,IACD,CACN,CAAA;AACF,CAAC"}