import { getCapabilities, getImageDimensions, imageFallback, renderImage, } from "../terminal-image.js"; export class Image { base64Data; mimeType; dimensions; theme; options; imageId; cachedLines; cachedWidth; constructor(base64Data, mimeType, theme, options = {}, dimensions) { this.base64Data = base64Data; this.mimeType = mimeType; this.theme = theme; this.options = options; this.dimensions = dimensions || getImageDimensions(base64Data, mimeType) || { widthPx: 800, heightPx: 600 }; this.imageId = options.imageId; } /** Get the Kitty image ID used by this image (if any). */ getImageId() { return this.imageId; } invalidate() { this.cachedLines = undefined; this.cachedWidth = undefined; } render(width) { if (this.cachedLines && this.cachedWidth === width) { return this.cachedLines; } const maxWidth = Math.min(width - 2, this.options.maxWidthCells ?? 60); const caps = getCapabilities(); let lines; if (caps.images) { const result = renderImage(this.base64Data, this.dimensions, { maxWidthCells: maxWidth, imageId: this.imageId, }); if (result) { // Store the image ID for later cleanup if (result.imageId) { this.imageId = result.imageId; } // Return `rows` lines so TUI accounts for image height // First (rows-1) lines are empty (TUI clears them) // Last line: move cursor back up, then output image sequence lines = []; for (let i = 0; i < result.rows - 1; i++) { lines.push(""); } // Move cursor up to first row, then output image const moveUp = result.rows > 1 ? `\x1b[${result.rows - 1}A` : ""; lines.push(moveUp + result.sequence); } else { const fallback = imageFallback(this.mimeType, this.dimensions, this.options.filename); lines = [this.theme.fallbackColor(fallback)]; } } else { const fallback = imageFallback(this.mimeType, this.dimensions, this.options.filename); lines = [this.theme.fallbackColor(fallback)]; } this.cachedLines = lines; this.cachedWidth = width; return lines; } } //# sourceMappingURL=image.js.map