@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.
- package/dist/app.d.ts +18 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +28 -0
- package/dist/app.js.map +1 -0
- package/dist/autocomplete/autocomplete.d.ts +48 -0
- package/dist/autocomplete/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete/autocomplete.js +391 -0
- package/dist/autocomplete/autocomplete.js.map +1 -0
- package/dist/autocomplete/file-index.d.ts +36 -0
- package/dist/autocomplete/file-index.d.ts.map +1 -0
- package/dist/autocomplete/file-index.js +143 -0
- package/dist/autocomplete/file-index.js.map +1 -0
- package/dist/autocomplete/index.d.ts +3 -0
- package/dist/autocomplete/index.d.ts.map +1 -0
- package/dist/autocomplete/index.js +3 -0
- package/dist/autocomplete/index.js.map +1 -0
- package/dist/components/badge.d.ts +11 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +28 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/code-block.d.ts +12 -0
- package/dist/components/code-block.d.ts.map +1 -0
- package/dist/components/code-block.js +21 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/dialog.d.ts +12 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +15 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/diff.d.ts +11 -0
- package/dist/components/diff.d.ts.map +1 -0
- package/dist/components/diff.js +18 -0
- package/dist/components/diff.js.map +1 -0
- package/dist/components/divider.d.ts +9 -0
- package/dist/components/divider.d.ts.map +1 -0
- package/dist/components/divider.js +14 -0
- package/dist/components/divider.js.map +1 -0
- package/dist/components/editor.d.ts +87 -0
- package/dist/components/editor.d.ts.map +1 -0
- package/dist/components/editor.js +145 -0
- package/dist/components/editor.js.map +1 -0
- package/dist/components/image.d.ts +65 -0
- package/dist/components/image.d.ts.map +1 -0
- package/dist/components/image.js +315 -0
- package/dist/components/image.js.map +1 -0
- package/dist/components/loader.d.ts +25 -0
- package/dist/components/loader.d.ts.map +1 -0
- package/dist/components/loader.js +24 -0
- package/dist/components/loader.js.map +1 -0
- package/dist/components/markdown.d.ts +28 -0
- package/dist/components/markdown.d.ts.map +1 -0
- package/dist/components/markdown.js +28 -0
- package/dist/components/markdown.js.map +1 -0
- package/dist/components/panel.d.ts +12 -0
- package/dist/components/panel.d.ts.map +1 -0
- package/dist/components/panel.js +47 -0
- package/dist/components/panel.js.map +1 -0
- package/dist/components/select-list.d.ts +55 -0
- package/dist/components/select-list.d.ts.map +1 -0
- package/dist/components/select-list.js +116 -0
- package/dist/components/select-list.js.map +1 -0
- package/dist/components/spacer.d.ts +25 -0
- package/dist/components/spacer.d.ts.map +1 -0
- package/dist/components/spacer.js +25 -0
- package/dist/components/spacer.js.map +1 -0
- package/dist/components/toast.d.ts +19 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +42 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/context/terminal.d.ts +7 -0
- package/dist/context/terminal.d.ts.map +1 -0
- package/dist/context/terminal.js +6 -0
- package/dist/context/terminal.js.map +1 -0
- package/dist/context/theme.d.ts +117 -0
- package/dist/context/theme.d.ts.map +1 -0
- package/dist/context/theme.js +648 -0
- package/dist/context/theme.js.map +1 -0
- package/dist/hooks/use-keyboard.d.ts +7 -0
- package/dist/hooks/use-keyboard.d.ts.map +1 -0
- package/dist/hooks/use-keyboard.js +6 -0
- package/dist/hooks/use-keyboard.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/opentui-augmentations.d.ts +9 -0
- package/dist/opentui-augmentations.d.ts.map +1 -0
- package/dist/opentui-augmentations.js +1 -0
- package/dist/opentui-augmentations.js.map +1 -0
- package/dist/parsers-config.d.ts +16 -0
- package/dist/parsers-config.d.ts.map +1 -0
- package/dist/parsers-config.js +119 -0
- package/dist/parsers-config.js.map +1 -0
- package/dist/themes/aura.json +69 -0
- package/dist/themes/ayu.json +80 -0
- package/dist/themes/catppuccin-macchiato.json +233 -0
- package/dist/themes/catppuccin.json +112 -0
- package/dist/themes/cobalt2.json +228 -0
- package/dist/themes/dracula.json +219 -0
- package/dist/themes/everforest.json +241 -0
- package/dist/themes/flexoki.json +237 -0
- package/dist/themes/github.json +233 -0
- package/dist/themes/gruvbox.json +95 -0
- package/dist/themes/kanagawa.json +77 -0
- package/dist/themes/lucent-orng.json +227 -0
- package/dist/themes/marvin.json +97 -0
- package/dist/themes/material.json +235 -0
- package/dist/themes/matrix.json +77 -0
- package/dist/themes/mercury.json +245 -0
- package/dist/themes/monokai.json +221 -0
- package/dist/themes/nightowl.json +221 -0
- package/dist/themes/nord.json +223 -0
- package/dist/themes/one-dark.json +84 -0
- package/dist/themes/opencode.json +245 -0
- package/dist/themes/orng.json +245 -0
- package/dist/themes/palenight.json +222 -0
- package/dist/themes/rosepine.json +234 -0
- package/dist/themes/solarized.json +223 -0
- package/dist/themes/synthwave84.json +226 -0
- package/dist/themes/tokyonight.json +243 -0
- package/dist/themes/vercel.json +245 -0
- package/dist/themes/vesper.json +218 -0
- package/dist/themes/zenburn.json +223 -0
- package/dist/utils/clipboard.d.ts +12 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +52 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/text-width.d.ts +26 -0
- package/dist/utils/text-width.d.ts.map +1 -0
- package/dist/utils/text-width.js +101 -0
- package/dist/utils/text-width.js.map +1 -0
- package/package.json +13 -4
- 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"}
|