@yeshwanthyk/open-tui 0.1.0 → 0.1.1

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.jsx +28 -0
  4. package/dist/app.jsx.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.jsx +31 -0
  20. package/dist/components/badge.jsx.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.jsx +34 -0
  24. package/dist/components/code-block.jsx.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.jsx +29 -0
  28. package/dist/components/dialog.jsx.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.jsx +17 -0
  32. package/dist/components/diff.jsx.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.jsx +13 -0
  36. package/dist/components/divider.jsx.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.jsx +146 -0
  40. package/dist/components/editor.jsx.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.jsx +319 -0
  44. package/dist/components/image.jsx.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.jsx +31 -0
  48. package/dist/components/loader.jsx.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.jsx +30 -0
  52. package/dist/components/markdown.jsx.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.jsx +51 -0
  56. package/dist/components/panel.jsx.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.jsx +135 -0
  60. package/dist/components/select-list.jsx.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.jsx +27 -0
  64. package/dist/components/spacer.jsx.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.jsx +52 -0
  68. package/dist/components/toast.jsx.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.jsx +6 -0
  72. package/dist/context/terminal.jsx.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.jsx +650 -0
  76. package/dist/context/theme.jsx.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,146 @@
1
+ /**
2
+ * Editor component - wrapper around OpenTUI's TextareaRenderable
3
+ *
4
+ * Provides a multi-line text input with keyboard navigation, history,
5
+ * and autocomplete support.
6
+ */
7
+ import { TextareaRenderable } from "@opentui/core";
8
+ import { createEffect } from "solid-js";
9
+ import { useTheme } from "../context/theme.js";
10
+ // Default keybindings for the textarea
11
+ const defaultKeybindings = [
12
+ { name: "left", action: "move-left" },
13
+ { name: "right", action: "move-right" },
14
+ { name: "up", action: "move-up" },
15
+ { name: "down", action: "move-down" },
16
+ { name: "home", action: "buffer-home" },
17
+ { name: "end", action: "buffer-end" },
18
+ { name: "a", ctrl: true, action: "line-home" },
19
+ { name: "e", ctrl: true, action: "line-end" },
20
+ { name: "backspace", action: "backspace" },
21
+ { name: "delete", action: "delete" },
22
+ { name: "w", ctrl: true, action: "delete-word-backward" },
23
+ { name: "k", ctrl: true, action: "delete-to-line-end" },
24
+ { name: "u", ctrl: true, action: "delete-to-line-start" },
25
+ { name: "return", shift: true, action: "newline" },
26
+ { name: "return", ctrl: true, action: "newline" },
27
+ { name: "return", meta: true, action: "newline" },
28
+ { name: "return", action: "submit" },
29
+ { name: "z", super: true, action: "undo" },
30
+ { name: "z", super: true, shift: true, action: "redo" },
31
+ ];
32
+ /**
33
+ * Editor component for multi-line text input
34
+ */
35
+ export function Editor(props) {
36
+ const { theme: globalTheme } = useTheme();
37
+ let textareaRef;
38
+ const theme = () => ({
39
+ border: props.theme?.border ?? globalTheme.border,
40
+ borderActive: props.theme?.borderActive ?? globalTheme.borderActive,
41
+ text: props.theme?.text ?? globalTheme.text,
42
+ cursor: props.theme?.cursor ?? globalTheme.text,
43
+ placeholder: props.theme?.placeholder ?? globalTheme.textMuted,
44
+ background: props.theme?.background ?? globalTheme.backgroundPanel,
45
+ });
46
+ const editorRef = {
47
+ getText: () => textareaRef?.plainText ?? "",
48
+ setText: (text) => textareaRef?.setText(text),
49
+ clear: () => textareaRef?.clear(),
50
+ focus: () => textareaRef?.focus(),
51
+ blur: () => textareaRef?.blur(),
52
+ getTextarea: () => textareaRef,
53
+ };
54
+ createEffect(() => {
55
+ if (props.ref && textareaRef)
56
+ props.ref(editorRef);
57
+ });
58
+ const handleKeyDown = (e) => {
59
+ if (props.disabled) {
60
+ e.preventDefault();
61
+ return;
62
+ }
63
+ if (e.name === "escape") {
64
+ props.onEscape?.();
65
+ e.preventDefault();
66
+ }
67
+ };
68
+ const handleSubmit = () => {
69
+ if (props.disabled)
70
+ return;
71
+ const text = textareaRef?.plainText?.trim() ?? "";
72
+ if (!text)
73
+ return;
74
+ props.onSubmit?.(text);
75
+ };
76
+ const handleContentChange = () => {
77
+ props.onChange?.(textareaRef?.plainText ?? "");
78
+ };
79
+ const borderColor = () => (props.focused ? theme().borderActive : theme().border);
80
+ const textareaProps = {
81
+ minHeight: props.minHeight ?? 1,
82
+ maxHeight: props.maxHeight ?? 10,
83
+ backgroundColor: theme().background,
84
+ focusedBackgroundColor: theme().background,
85
+ textColor: theme().text,
86
+ focusedTextColor: theme().text,
87
+ cursorColor: theme().cursor,
88
+ keyBindings: defaultKeybindings,
89
+ onKeyDown: handleKeyDown,
90
+ onSubmit: handleSubmit,
91
+ onContentChange: handleContentChange,
92
+ };
93
+ if (props.initialValue !== undefined) {
94
+ textareaProps["initialValue"] = props.initialValue;
95
+ }
96
+ if (props.placeholder) {
97
+ textareaProps["placeholder"] = props.placeholder;
98
+ }
99
+ if (props.focused !== undefined) {
100
+ textareaProps["focused"] = props.focused;
101
+ }
102
+ const boxProps = {
103
+ flexDirection: "column",
104
+ border: true,
105
+ borderColor: borderColor(),
106
+ backgroundColor: theme().background,
107
+ paddingLeft: 1,
108
+ paddingRight: 1,
109
+ };
110
+ if (props.width !== undefined)
111
+ boxProps["width"] = props.width;
112
+ if (props.maxWidth !== undefined)
113
+ boxProps["maxWidth"] = props.maxWidth;
114
+ return (<box {...boxProps}>
115
+ <textarea ref={(r) => {
116
+ textareaRef = r;
117
+ props.ref?.(editorRef);
118
+ }} {...textareaProps}/>
119
+ </box>);
120
+ }
121
+ export function Input(props) {
122
+ const editorProps = {
123
+ minHeight: 1,
124
+ maxHeight: 1,
125
+ };
126
+ if (props.value !== undefined)
127
+ editorProps.initialValue = props.value;
128
+ if (props.placeholder !== undefined)
129
+ editorProps.placeholder = props.placeholder;
130
+ if (props.focused !== undefined)
131
+ editorProps.focused = props.focused;
132
+ if (props.theme !== undefined)
133
+ editorProps.theme = props.theme;
134
+ if (props.onChange !== undefined)
135
+ editorProps.onChange = props.onChange;
136
+ if (props.onSubmit !== undefined)
137
+ editorProps.onSubmit = props.onSubmit;
138
+ if (props.onEscape !== undefined)
139
+ editorProps.onEscape = props.onEscape;
140
+ if (props.width !== undefined)
141
+ editorProps.width = props.width;
142
+ if (props.maxWidth !== undefined)
143
+ editorProps.maxWidth = props.maxWidth;
144
+ return <Editor {...editorProps}/>;
145
+ }
146
+ //# sourceMappingURL=editor.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.jsx","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,319 @@
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 { createEffect, createMemo, onCleanup, Show } from "solid-js";
11
+ import { useTerminalDimensions } from "../context/terminal.js";
12
+ import { useTheme } from "../context/theme.js";
13
+ // Cache terminal capabilities
14
+ let cachedCapabilities = null;
15
+ // Default cell dimensions
16
+ let cellDimensions = { widthPx: 9, heightPx: 18 };
17
+ export function setCellDimensions(dims) {
18
+ cellDimensions = dims;
19
+ }
20
+ export function getCellDimensions() {
21
+ return cellDimensions;
22
+ }
23
+ /**
24
+ * Detect terminal image capabilities
25
+ */
26
+ export function detectCapabilities() {
27
+ const env = process.env;
28
+ const termProgram = env["TERM_PROGRAM"]?.toLowerCase() || "";
29
+ const term = env["TERM"]?.toLowerCase() || "";
30
+ const colorTerm = env["COLORTERM"]?.toLowerCase() || "";
31
+ const termInfo = env["TERMINFO"]?.toLowerCase() || "";
32
+ // Kitty protocol support
33
+ if (env["KITTY_WINDOW_ID"] || termProgram === "kitty") {
34
+ return { images: "kitty", trueColor: true };
35
+ }
36
+ // Ghostty - check TERM_PROGRAM or TERMINFO (for tmux passthrough)
37
+ if (termProgram === "ghostty" || term.includes("ghostty") || termInfo.includes("ghostty")) {
38
+ return { images: "kitty", trueColor: true };
39
+ }
40
+ if (env["WEZTERM_PANE"] || termProgram === "wezterm") {
41
+ return { images: "kitty", trueColor: true };
42
+ }
43
+ // iTerm2 protocol support
44
+ if (env["ITERM_SESSION_ID"] || termProgram === "iterm.app") {
45
+ return { images: "iterm2", trueColor: true };
46
+ }
47
+ // No image support
48
+ const trueColor = colorTerm === "truecolor" || colorTerm === "24bit";
49
+ return { images: null, trueColor };
50
+ }
51
+ export function getCapabilities() {
52
+ if (!cachedCapabilities) {
53
+ cachedCapabilities = detectCapabilities();
54
+ }
55
+ return cachedCapabilities;
56
+ }
57
+ export function resetCapabilitiesCache() {
58
+ cachedCapabilities = null;
59
+ }
60
+ /**
61
+ * Encode image using Kitty graphics protocol
62
+ */
63
+ function encodeKitty(base64Data, columns, rows) {
64
+ const CHUNK_SIZE = 4096;
65
+ const params = ["a=T", "f=100", "q=2", `c=${columns}`, `r=${rows}`];
66
+ if (base64Data.length <= CHUNK_SIZE) {
67
+ return `\x1b_G${params.join(",")};${base64Data}\x1b\\`;
68
+ }
69
+ const chunks = [];
70
+ let offset = 0;
71
+ let isFirst = true;
72
+ while (offset < base64Data.length) {
73
+ const chunk = base64Data.slice(offset, offset + CHUNK_SIZE);
74
+ const isLast = offset + CHUNK_SIZE >= base64Data.length;
75
+ if (isFirst) {
76
+ chunks.push(`\x1b_G${params.join(",")},m=1;${chunk}\x1b\\`);
77
+ isFirst = false;
78
+ }
79
+ else if (isLast) {
80
+ chunks.push(`\x1b_Gm=0;${chunk}\x1b\\`);
81
+ }
82
+ else {
83
+ chunks.push(`\x1b_Gm=1;${chunk}\x1b\\`);
84
+ }
85
+ offset += CHUNK_SIZE;
86
+ }
87
+ return chunks.join("");
88
+ }
89
+ /**
90
+ * Encode image using iTerm2 inline image protocol
91
+ */
92
+ function encodeITerm2(base64Data, width) {
93
+ const params = [`inline=1`, `width=${width}`, `height=auto`, `preserveAspectRatio=1`];
94
+ return `\x1b]1337;File=${params.join(";")}:${base64Data}\x07`;
95
+ }
96
+ /**
97
+ * Calculate image rows based on dimensions and cell size
98
+ */
99
+ function calculateRows(imageDims, targetWidthCells) {
100
+ const targetWidthPx = targetWidthCells * cellDimensions.widthPx;
101
+ const scale = targetWidthPx / imageDims.widthPx;
102
+ const scaledHeightPx = imageDims.heightPx * scale;
103
+ const rows = Math.ceil(scaledHeightPx / cellDimensions.heightPx);
104
+ return Math.max(1, rows);
105
+ }
106
+ // Image dimension extractors
107
+ function getPngDimensions(base64Data) {
108
+ try {
109
+ const buffer = Buffer.from(base64Data, "base64");
110
+ if (buffer.length < 24)
111
+ return null;
112
+ if (buffer[0] !== 0x89 || buffer[1] !== 0x50 || buffer[2] !== 0x4e || buffer[3] !== 0x47)
113
+ return null;
114
+ return { widthPx: buffer.readUInt32BE(16), heightPx: buffer.readUInt32BE(20) };
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ }
120
+ function getJpegDimensions(base64Data) {
121
+ try {
122
+ const buffer = Buffer.from(base64Data, "base64");
123
+ if (buffer.length < 2 || buffer[0] !== 0xff || buffer[1] !== 0xd8)
124
+ return null;
125
+ let offset = 2;
126
+ while (offset < buffer.length - 9) {
127
+ if (buffer[offset] !== 0xff) {
128
+ offset++;
129
+ continue;
130
+ }
131
+ const marker = buffer[offset + 1];
132
+ if (marker !== undefined && marker >= 0xc0 && marker <= 0xc2) {
133
+ return { widthPx: buffer.readUInt16BE(offset + 7), heightPx: buffer.readUInt16BE(offset + 5) };
134
+ }
135
+ if (offset + 3 >= buffer.length)
136
+ return null;
137
+ const length = buffer.readUInt16BE(offset + 2);
138
+ if (length < 2)
139
+ return null;
140
+ offset += 2 + length;
141
+ }
142
+ return null;
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function getGifDimensions(base64Data) {
149
+ try {
150
+ const buffer = Buffer.from(base64Data, "base64");
151
+ if (buffer.length < 10)
152
+ return null;
153
+ const sig = buffer.slice(0, 6).toString("ascii");
154
+ if (sig !== "GIF87a" && sig !== "GIF89a")
155
+ return null;
156
+ return { widthPx: buffer.readUInt16LE(6), heightPx: buffer.readUInt16LE(8) };
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ function getWebpDimensions(base64Data) {
163
+ try {
164
+ const buffer = Buffer.from(base64Data, "base64");
165
+ if (buffer.length < 30)
166
+ return null;
167
+ if (buffer.slice(0, 4).toString("ascii") !== "RIFF")
168
+ return null;
169
+ if (buffer.slice(8, 12).toString("ascii") !== "WEBP")
170
+ return null;
171
+ const chunk = buffer.slice(12, 16).toString("ascii");
172
+ if (chunk === "VP8 " && buffer.length >= 30) {
173
+ return { widthPx: buffer.readUInt16LE(26) & 0x3fff, heightPx: buffer.readUInt16LE(28) & 0x3fff };
174
+ }
175
+ if (chunk === "VP8L" && buffer.length >= 25) {
176
+ const bits = buffer.readUInt32LE(21);
177
+ return { widthPx: (bits & 0x3fff) + 1, heightPx: ((bits >> 14) & 0x3fff) + 1 };
178
+ }
179
+ if (chunk === "VP8X" && buffer.length >= 30) {
180
+ return {
181
+ widthPx: ((buffer[24] ?? 0) | ((buffer[25] ?? 0) << 8) | ((buffer[26] ?? 0) << 16)) + 1,
182
+ heightPx: ((buffer[27] ?? 0) | ((buffer[28] ?? 0) << 8) | ((buffer[29] ?? 0) << 16)) + 1,
183
+ };
184
+ }
185
+ return null;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Get image dimensions from base64 data
193
+ */
194
+ export function getImageDimensions(base64Data, mimeType) {
195
+ if (mimeType === "image/png")
196
+ return getPngDimensions(base64Data);
197
+ if (mimeType === "image/jpeg")
198
+ return getJpegDimensions(base64Data);
199
+ if (mimeType === "image/gif")
200
+ return getGifDimensions(base64Data);
201
+ if (mimeType === "image/webp")
202
+ return getWebpDimensions(base64Data);
203
+ return null;
204
+ }
205
+ /**
206
+ * Generate fallback text for images
207
+ */
208
+ function imageFallback(mimeType, dimensions, filename) {
209
+ const parts = [];
210
+ if (filename)
211
+ parts.push(filename);
212
+ parts.push(`[${mimeType}]`);
213
+ if (dimensions)
214
+ parts.push(`${dimensions.widthPx}x${dimensions.heightPx}`);
215
+ return `[Image: ${parts.join(" ")}]`;
216
+ }
217
+ // Track rendered images to avoid duplicate writes
218
+ const renderedImages = new Set();
219
+ /**
220
+ * Write image escape sequence directly to stdout
221
+ * This bypasses OpenTUI's text buffer which doesn't handle OSC sequences properly
222
+ */
223
+ function writeImageToStdout(sequence, rows, imageId) {
224
+ // Avoid duplicate writes for the same image
225
+ if (renderedImages.has(imageId))
226
+ return;
227
+ renderedImages.add(imageId);
228
+ // Move cursor up to the start of the reserved space, output image, then restore position
229
+ // The box component reserves `rows` lines, so we move up (rows-1) to position at start
230
+ const moveUp = rows > 1 ? `\x1b[${rows - 1}A` : "";
231
+ const moveDown = rows > 1 ? `\x1b[${rows - 1}B` : "";
232
+ // Write: move up, image sequence, move down (to restore cursor position)
233
+ process.stdout.write(moveUp + sequence + moveDown);
234
+ }
235
+ /**
236
+ * Image component for rendering inline images in the terminal
237
+ *
238
+ * @example
239
+ * ```tsx
240
+ * <Image
241
+ * data={base64ImageData}
242
+ * mimeType="image/png"
243
+ * maxWidth={60}
244
+ * />
245
+ * ```
246
+ */
247
+ export function Image(props) {
248
+ const { theme } = useTheme();
249
+ const caps = getCapabilities();
250
+ const fallbackColor = () => props.fallbackColor ?? theme.textMuted;
251
+ const termDimensions = useTerminalDimensions();
252
+ // Get or detect dimensions
253
+ const dimensions = createMemo(() => {
254
+ if (props.dimensions)
255
+ return props.dimensions;
256
+ return getImageDimensions(props.data, props.mimeType) ?? { widthPx: 800, heightPx: 600 };
257
+ });
258
+ // Dynamic maxWidth based on terminal size
259
+ const maxWidth = createMemo(() => Math.min(props.maxWidth ?? 60, termDimensions().width - 4));
260
+ const maxHeight = () => props.maxHeight ?? 24;
261
+ // Generate content-based key for caching (re-render if data or size changes)
262
+ const imageKey = createMemo(() => {
263
+ const dims = dimensions();
264
+ const mw = maxWidth();
265
+ const mh = maxHeight();
266
+ // Use first 32 chars of data for key
267
+ const dataPrefix = props.data.slice(0, 32);
268
+ return `img-${dataPrefix}-${dims.widthPx}x${dims.heightPx}-${mw}x${mh}`;
269
+ });
270
+ // Render image or fallback
271
+ const renderResult = createMemo(() => {
272
+ if (!caps.images) {
273
+ return { type: "fallback", text: imageFallback(props.mimeType, dimensions(), props.filename) };
274
+ }
275
+ const width = maxWidth();
276
+ let rows = calculateRows(dimensions(), width);
277
+ // Clamp to maxHeight
278
+ if (rows > maxHeight()) {
279
+ rows = maxHeight();
280
+ }
281
+ if (caps.images === "kitty") {
282
+ const sequence = encodeKitty(props.data, width, rows);
283
+ return { type: "image", sequence, rows };
284
+ }
285
+ if (caps.images === "iterm2") {
286
+ const sequence = encodeITerm2(props.data, width);
287
+ return { type: "image", sequence, rows };
288
+ }
289
+ return { type: "fallback", text: imageFallback(props.mimeType, dimensions(), props.filename) };
290
+ });
291
+ // Write image directly to stdout when component renders
292
+ createEffect(() => {
293
+ const result = renderResult();
294
+ const key = imageKey();
295
+ if (result.type === "image") {
296
+ // Small delay to ensure the box has been rendered and positioned
297
+ setTimeout(() => {
298
+ writeImageToStdout(result.sequence, result.rows, key);
299
+ }, 50);
300
+ }
301
+ });
302
+ // Re-render on terminal resize - imageKey already depends on maxWidth which depends on termDimensions
303
+ createEffect(() => {
304
+ const key = imageKey();
305
+ // Remove from cache to force re-render when dimensions change
306
+ renderedImages.delete(key);
307
+ });
308
+ // Cleanup: remove from rendered set when component unmounts
309
+ onCleanup(() => {
310
+ renderedImages.delete(imageKey());
311
+ });
312
+ return (<Show when={renderResult().type === "image"} fallback={<text fg={fallbackColor()}>{renderResult().text}</text>}>
313
+ {/* Reserve vertical space for the image - content is written directly to stdout */}
314
+ <box height={renderResult().rows} width={maxWidth()}>
315
+ <text fg={theme.textMuted}>{" ".repeat(maxWidth())}</text>
316
+ </box>
317
+ </Show>);
318
+ }
319
+ //# sourceMappingURL=image.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.jsx","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,31 @@
1
+ /**
2
+ * Loader/spinner component using OpenTUI spinner
3
+ */
4
+ import { parseColor } from "@opentui/core";
5
+ import "opentui-spinner/solid";
6
+ import { Show } from "solid-js";
7
+ // Default spinner frames (bouncing dots style)
8
+ const DEFAULT_FRAMES = [" ", ". ", ".. ", "... ", "....", " ...", " ..", " ."];
9
+ const DEFAULT_COLOR = parseColor("#64b4ff");
10
+ /**
11
+ * Animated loader with optional message
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <Loader message="Loading..." color={theme.primary} />
16
+ * ```
17
+ */
18
+ export function Loader(props) {
19
+ const interval = () => props.interval ?? 120;
20
+ const color = () => props.color ?? DEFAULT_COLOR;
21
+ return (<box flexDirection="row" gap={1}>
22
+ <spinner frames={DEFAULT_FRAMES} interval={interval()} color={color()}/>
23
+ <Show when={props.message && props.dimColor}>
24
+ <text fg={props.dimColor}>{props.message}</text>
25
+ </Show>
26
+ <Show when={props.message && !props.dimColor}>
27
+ <text>{props.message}</text>
28
+ </Show>
29
+ </box>);
30
+ }
31
+ //# sourceMappingURL=loader.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.jsx","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,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC/B;GAAA,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EACtE;GAAA,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAC3C;IAAA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CACjD;GAAA,EAAE,IAAI,CACN;GAAA,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC5C;IAAA,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAC5B;GAAA,EAAE,IAAI,CACP;EAAA,EAAE,GAAG,CAAC,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"}