ink-hud 0.1.2 → 0.1.4
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/README.md +242 -147
- package/dist/index.cjs +891 -366
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +350 -125
- package/dist/index.d.ts +350 -125
- package/dist/index.js +874 -366
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/renderer.ts","../src/core/braille.ts","../src/core/block.ts","../src/core/ascii.ts","../src/detect/terminal.ts","../src/detect/selector.ts","../src/components/InkHudProvider.tsx","../src/utils/gradient.ts","../src/theme/ThemeContext.tsx","../src/utils/scale.ts","../src/utils/geometry.ts","../src/utils/downsampling.ts","../src/hooks/useSmooth.ts","../src/components/Grid.tsx","../src/components/common/chartUtils.ts","../src/components/common/Axis.tsx","../src/components/common/Legend.tsx","../src/components/common/ChartContainer.tsx","../src/components/common/useChartCore.ts","../src/components/common/useChartRenderer.ts","../src/components/LineChart.tsx","../src/components/AreaChart.tsx","../src/components/BarChart.tsx","../src/components/PieChart.tsx","../src/components/Sparkline.tsx","../src/components/Panel.tsx","../src/components/Gauge.tsx","../src/components/BigNumber/font.ts","../src/components/BigNumber.tsx","../src/components/Heatmap.tsx","../src/components/LogStream.tsx","../src/components/Table.tsx","../src/components/PulseBar.tsx"],"names":["createContext","useMemo","React","useContext","chalk","tinygradient","useState","useRef","useEffect","useStdout","Box","Text","CHAR_SETS","useFocus","useInput"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Pixel, RenderedLine } from './types';\n\n/**\n * Renderer Module - Defines a unified interface for all renderers\n */\n\n/**\n * Renderer type\n */\nexport type RendererType = 'braille' | 'block' | 'ascii';\n\n/**\n * Renderer resolution information\n * Represents how many pixels each character can display\n */\nexport interface RendererResolution {\n /** Pixels per character horizontally (e.g. Braille 2, Block 2, ASCII 1) */\n horizontal: number;\n /** Pixels per character vertically (e.g. Braille 4, Block 8, ASCII 1) */\n vertical: number;\n}\n\n/**\n * Renderer metadata\n * Describes renderer capabilities and requirements\n */\nexport interface RendererMetadata {\n /** Renderer name */\n name: RendererType;\n /** Renderer display name */\n displayName: string;\n /** Renderer description */\n description: string;\n /** Renderer resolution */\n resolution: RendererResolution;\n /** Whether UTF-8 support is required */\n requiresUtf8: boolean;\n /** Whether Unicode support is required */\n requiresUnicode: boolean;\n /** Minimum terminal capability score requirement (0-100) */\n minScore: number;\n}\n\n/**\n * Abstract Renderer base class\n *\n * Provides common implementations for all drawing primitives. Subclasses only need to implement:\n * - getMetadata(): Return renderer metadata\n * - renderCanvas(): Convert Pixel[][] to terminal characters\n */\nexport abstract class Renderer {\n /**\n * Get renderer metadata (must be implemented by subclasses)\n */\n abstract getMetadata(): RendererMetadata;\n\n /**\n * Render Canvas as styled lines of text (must be implemented by subclasses)\n * @param pixels - 2D pixel array\n * @param width - Canvas width (pixels)\n * @param height - Canvas height (pixels)\n * @returns Array of colored text lines\n */\n abstract renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[];\n\n // ============================================================\n // Common implementations shared by all renderers\n // ============================================================\n\n /**\n * Create a blank Canvas\n * @param width - Canvas width (pixels)\n * @param height - Canvas height (pixels)\n * @returns 2D pixel array\n */\n createCanvas(width: number, height: number): Pixel[][] {\n return Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ active: false })),\n );\n }\n\n /**\n * Set a single pixel on the Canvas\n * @param canvas - Canvas\n * @param x - x coordinate\n * @param y - y coordinate\n * @param pixel - Pixel properties (active, color, etc.)\n */\n setPixel(\n canvas: Pixel[][],\n x: number,\n y: number,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n const row = canvas[y];\n if (y >= 0 && y < canvas.length && row && x >= 0 && x < row.length) {\n const current = row[x];\n if (current) {\n Object.assign(current, pixel);\n }\n }\n }\n\n /**\n * Draw line segments (Bresenham's algorithm)\n */\n drawLine(\n canvas: Pixel[][],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n const dx = Math.abs(x1 - x0);\n const dy = Math.abs(y1 - y0);\n const sx = x0 < x1 ? 1 : -1;\n const sy = y0 < y1 ? 1 : -1;\n let err = dx - dy;\n\n let x = Math.round(x0);\n let y = Math.round(y0);\n const endX = Math.round(x1);\n const endY = Math.round(y1);\n\n while (true) {\n this.setPixel(canvas, x, y, pixel);\n if (x === endX && y === endY) break;\n\n const e2 = 2 * err;\n if (e2 > -dy) {\n err -= dy;\n x += sx;\n }\n if (e2 < dx) {\n err += dx;\n y += sy;\n }\n }\n }\n\n /**\n * Draw circle or ring (Midpoint Circle algorithm)\n */\n drawCircle(\n canvas: Pixel[][],\n centerX: number,\n centerY: number,\n radius: number,\n filled = false,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n if (filled) {\n for (let y = -radius; y <= radius; y++) {\n const width = Math.sqrt(radius * radius - y * y);\n for (let x = -width; x <= width; x++) {\n this.setPixel(canvas, Math.round(centerX + x), Math.round(centerY + y), pixel);\n }\n }\n } else {\n let x = 0;\n let y = radius;\n let d = 1 - radius;\n\n while (x <= y) {\n this.setPixel(canvas, centerX + x, centerY + y, pixel);\n this.setPixel(canvas, centerX - x, centerY + y, pixel);\n this.setPixel(canvas, centerX + x, centerY - y, pixel);\n this.setPixel(canvas, centerX - x, centerY - y, pixel);\n this.setPixel(canvas, centerX + y, centerY + x, pixel);\n this.setPixel(canvas, centerX - y, centerY + x, pixel);\n this.setPixel(canvas, centerX + y, centerY - x, pixel);\n this.setPixel(canvas, centerX - y, centerY - x, pixel);\n\n x++;\n if (d < 0) {\n d += 2 * x + 1;\n } else {\n y--;\n d += 2 * (x - y) + 1;\n }\n }\n }\n }\n\n /**\n * Draw arc (Parametric equation)\n */\n drawArc(\n canvas: Pixel[][],\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n thickness = 1,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n let start = startAngle;\n let end = endAngle;\n if (start > end) {\n [start, end] = [end, start];\n }\n\n const angleStep = 1 / (radius * 2);\n\n for (let r = Math.max(0, radius - thickness + 1); r <= radius; r++) {\n for (let theta = start; theta <= end; theta += angleStep) {\n const x = centerX + r * Math.cos(theta);\n const y = centerY + r * Math.sin(theta);\n this.setPixel(canvas, Math.round(x), Math.round(y), pixel);\n }\n }\n }\n\n /**\n * Draw rectangle\n */\n drawRect(\n canvas: Pixel[][],\n x: number,\n y: number,\n width: number,\n height: number,\n filled = false,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n if (filled) {\n for (let py = y; py < y + height; py++) {\n for (let px = x; px < x + width; px++) {\n this.setPixel(canvas, px, py, pixel);\n }\n }\n } else {\n // Bottom side\n for (let px = x; px < x + width; px++) {\n this.setPixel(canvas, px, y + height - 1, pixel);\n }\n // Left side\n for (let py = y; py < y + height; py++) {\n this.setPixel(canvas, x, py, pixel);\n }\n // Right side\n for (let py = y; py < y + height; py++) {\n this.setPixel(canvas, x + width - 1, py, pixel);\n }\n }\n }\n\n // ============================================================\n // Helper methods\n // ============================================================\n\n /**\n * Get renderer resolution\n */\n getResolution(): RendererResolution {\n return this.getMetadata().resolution;\n }\n\n /**\n * Get renderer name\n */\n getName(): RendererType {\n return this.getMetadata().name;\n }\n\n /**\n * Calculate number of character rows and columns needed to render specified dimensions\n */\n calculateCharDimensions(\n pixelWidth: number,\n pixelHeight: number,\n ): { rows: number; cols: number } {\n const res = this.getResolution();\n return {\n cols: Math.ceil(pixelWidth / res.horizontal),\n rows: Math.ceil(pixelHeight / res.vertical),\n };\n }\n}\n","import type { RendererMetadata } from './renderer';\nimport { Renderer } from './renderer';\nimport type { Pixel, RenderedLine } from './types';\n\nconst BRAILLE_BASE = 0x2800;\nconst DOT_WEIGHTS = [1, 2, 4, 8, 16, 32, 64, 128];\n\n/**\n * Braille Renderer\n *\n * Implements 2x4 dot matrix rendering using Braille Unicode characters (U+2800-U+28FF)\n * Each character can represent 8 sub-pixels, providing 8x resolution\n */\nexport class BrailleRenderer extends Renderer {\n getMetadata(): RendererMetadata {\n return {\n name: 'braille',\n displayName: 'Braille',\n description: 'Braille character (⣿) 2x4 matrix, 8x resolution',\n resolution: {\n horizontal: 2,\n vertical: 4,\n },\n requiresUtf8: true,\n requiresUnicode: true,\n minScore: 80,\n };\n }\n\n // ============================================================\n // Braille-specific private methods\n // ============================================================\n\n private createBrailleChar(dots: boolean[]): string {\n let code = BRAILLE_BASE;\n for (let i = 0; i < 8 && i < DOT_WEIGHTS.length; i++) {\n if (dots[i]) {\n const weight = DOT_WEIGHTS[i];\n if (weight !== undefined) {\n code += weight;\n }\n }\n }\n return String.fromCharCode(code);\n }\n\n private pixelToDotIndex(x: number, y: number): number {\n // Left column: 0,1,2,6 Right column: 3,4,5,7\n if (x === 0) {\n return y === 3 ? 6 : y;\n }\n return y === 3 ? 7 : y + 3;\n }\n\n private fillBrailleDots(\n pixels: Pixel[][],\n cx: number,\n cy: number,\n width: number,\n height: number,\n ): boolean[] {\n const dots = Array(8).fill(false);\n for (let py = 0; py < 4; py++) {\n for (let px = 0; px < 2; px++) {\n const pixelY = cy * 4 + py;\n const pixelX = cx * 2 + px;\n if (pixelY < height && pixelX < width) {\n dots[this.pixelToDotIndex(px, py)] = pixels[pixelY]?.[pixelX]?.active ?? false;\n }\n }\n }\n return dots;\n }\n\n private resolveColor(\n pixels: Pixel[][],\n cx: number,\n cy: number,\n width: number,\n height: number,\n ): string | undefined {\n const counts = new Map<string, number>();\n\n for (let py = 0; py < 4; py++) {\n for (let px = 0; px < 2; px++) {\n const pixelY = cy * 4 + py;\n const pixelX = cx * 2 + px;\n\n if (pixelY < height && pixelX < width) {\n const pixel = pixels[pixelY]?.[pixelX];\n if (pixel?.active && pixel.color) {\n counts.set(pixel.color, (counts.get(pixel.color) ?? 0) + 1);\n }\n }\n }\n }\n\n if (counts.size === 0) return undefined;\n\n let maxCount = 0;\n let dominantColor: string | undefined;\n\n for (const [color, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n }\n\n return dominantColor;\n }\n\n // ============================================================\n // Methods that subclasses must implement\n // ============================================================\n\n renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[] {\n const charWidth = Math.ceil(width / 2);\n const charHeight = Math.ceil(height / 4);\n const lines: RenderedLine[] = [];\n\n for (let cy = 0; cy < charHeight; cy++) {\n const lineSegments: RenderedLine = [];\n let buffer = '';\n let bufferColor: string | undefined;\n\n for (let cx = 0; cx < charWidth; cx++) {\n const dots = this.fillBrailleDots(pixels, cx, cy, width, height);\n const char = this.createBrailleChar(dots);\n const color = this.resolveColor(pixels, cx, cy, width, height);\n\n if (buffer && bufferColor !== color) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n buffer = '';\n }\n\n bufferColor = color;\n buffer += char;\n }\n\n if (buffer) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n }\n lines.push(lineSegments);\n }\n\n return lines;\n }\n}\n","import type { RendererMetadata } from './renderer';\nimport { Renderer } from './renderer';\nimport type { Pixel, RenderedLine } from './types';\n\n/**\n * Block Elements renderer\n *\n * Implements 2x8 dot matrix rendering using Unicode Block Elements characters (U+2581-U+2588)\n * Vertical 8x resolution, horizontal 2x resolution\n */\nexport class BlockRenderer extends Renderer {\n // 9x9 Lookup table: [leftHeight][rightHeight] -> char\n // Index 0-8 represents filled pixel height of column\n private static readonly BLOCK_LUT: string[][] = [\n // R=0 1 2 3 4 5 6 7 8 (L Row Index)\n [' ', '▗', '▗', '▗', '▗', '▗', '▗', '▐', '▐'], // L=0\n ['▖', '▂', '▂', '▃', '▃', '▄', '▄', '▅', '▅'], // L=1: Avg 1-1.5 -> ▂\n ['▖', '▂', '▂', '▃', '▃', '▄', '▄', '▅', '▅'], // L=2\n ['▖', '▃', '▃', '▃', '▄', '▄', '▅', '▅', '▅'], // L=3: Avg 1.5-3.5\n ['▖', '▃', '▃', '▄', '▄', '▅', '▅', '▆', '▆'], // L=4\n ['▖', '▄', '▄', '▅', '▅', '▅', '▆', '▆', '▇'], // L=5\n ['▖', '▄', '▄', '▅', '▅', '▆', '▆', '▇', '▇'], // L=6\n ['▌', '▅', '▅', '▆', '▆', '▇', '▇', '▇', '█'], // L=7\n ['▌', '▅', '▅', '▆', '▆', '▇', '▇', '█', '█'], // L=8\n ];\n\n getMetadata(): RendererMetadata {\n return {\n name: 'block',\n displayName: 'Block Elements',\n description: 'Block Elements character (█) 2x8 matrix, vertical 8x resolution',\n resolution: {\n horizontal: 2,\n vertical: 8,\n },\n requiresUtf8: true,\n requiresUnicode: true,\n minScore: 30,\n };\n }\n\n // ============================================================\n // Block-specific private methods\n // ============================================================\n\n /**\n * Determine primary color\n */\n private resolveColor(\n pixels: Pixel[][],\n startX: number,\n startY: number,\n width: number,\n height: number,\n ): string | undefined {\n const counts = new Map<string, number>();\n\n for (let py = 0; py < 8; py++) {\n for (let px = 0; px < 2; px++) {\n const y = startY + py;\n const x = startX + px;\n\n if (y >= height || x >= width) continue;\n\n const pixel = pixels[y]?.[x];\n if (pixel?.active && pixel.color) {\n counts.set(pixel.color, (counts.get(pixel.color) ?? 0) + 1);\n }\n }\n }\n\n if (counts.size === 0) return undefined;\n\n let maxCount = 0;\n let dominantColor: string | undefined;\n\n for (const [color, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n }\n\n return dominantColor;\n }\n\n // ============================================================\n // Methods that subclasses must implement\n // ============================================================\n\n renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[] {\n const charWidth = Math.ceil(width / 2);\n const charHeight = Math.ceil(height / 8);\n const lines: RenderedLine[] = [];\n\n for (let cy = 0; cy < charHeight; cy++) {\n const lineSegments: RenderedLine = [];\n let buffer = '';\n let bufferFg: string | undefined;\n let bufferBg: string | undefined;\n let bufferColorKey: string | undefined;\n\n for (let cx = 0; cx < charWidth; cx++) {\n const startY = cy * 8;\n const leftX = cx * 2;\n const rightX = cx * 2 + 1;\n\n // 1. Column Analysis (Calculate Height & Center of Gravity)\n // Used to determine if the column is Top-Heavy (Top-aligned content) or Bottom-Heavy\n const analyzeColumn = (colX: number) => {\n let count = 0;\n let sumY = 0;\n for (let py = 0; py < 8; py++) {\n const y = startY + py;\n if (y >= height) break;\n if (pixels[y]?.[colX]?.active) {\n count++;\n sumY += py;\n }\n }\n // Gravity 0 = Top, 7 = Bottom. Center = 3.5.\n // If center < 3.5, it's Top Heavy.\n const gravity = count > 0 ? sumY / count : 3.5;\n return { count, gravity };\n };\n\n const left = analyzeColumn(leftX);\n const right = analyzeColumn(rightX);\n\n const isLeftTop = left.count > 0 && left.gravity < 3.5;\n const isRightTop = right.count > 0 && right.gravity < 3.5;\n\n // 2. Determine Render Mode\n\n // Mode A: Top-Heavy Inversion\n // If BOTH columns are Top-Heavy (or one is Top and other empty), we use \"Inverted Rendering\".\n // We calculate the empty space at the bottom (8 - count), lookup the char for that,\n // and render it with FG=Black (Hole) and BG=Color (Fill).\n const useInverse =\n (isLeftTop && (isRightTop || right.count === 0)) ||\n (isRightTop && (isLeftTop || left.count === 0));\n\n let char = ' ';\n let isInverted = false;\n const pixelColor = this.resolveColor(pixels, leftX, startY, width, height);\n\n if (useInverse) {\n const invLeft = 8 - left.count;\n const invRight = 8 - right.count;\n char = BlockRenderer.BLOCK_LUT[invLeft]?.[invRight] ?? ' ';\n isInverted = true;\n } else {\n // Mode B: Standard Histogram (Bottom-Up)\n const finalLeft = Math.min(8, Math.max(0, left.count));\n const finalRight = Math.min(8, Math.max(0, right.count));\n\n // Fallback to basic LUT\n char = BlockRenderer.BLOCK_LUT[finalLeft]?.[finalRight] ?? ' ';\n }\n\n // Color Logic\n let fgColor: string | undefined;\n let bgColor: string | undefined;\n\n if (char !== ' ') {\n if (isInverted) {\n fgColor = 'black'; // Make the char \"hole\"\n bgColor = pixelColor; // Make the block background\n } else {\n fgColor = pixelColor;\n bgColor = undefined;\n }\n }\n\n const colorKey = `${fgColor}|${bgColor}`;\n\n if (buffer && bufferColorKey !== colorKey) {\n lineSegments.push({\n text: buffer,\n ...(bufferFg ? { color: bufferFg } : {}),\n ...(bufferBg ? { backgroundColor: bufferBg } : {}),\n });\n buffer = '';\n }\n\n //@ts-ignore\n bufferColorKey = colorKey;\n bufferFg = fgColor;\n bufferBg = bgColor;\n buffer += char;\n }\n\n if (buffer) {\n lineSegments.push({\n text: buffer,\n ...(bufferFg ? { color: bufferFg } : {}),\n ...(bufferBg ? { backgroundColor: bufferBg } : {}),\n });\n }\n lines.push(lineSegments);\n }\n\n return lines;\n }\n}\n","import type { RendererMetadata } from './renderer';\nimport { Renderer } from './renderer';\nimport type { Pixel, RenderedLine } from './types';\n\n/**\n * ASCII renderer\n *\n * Implements 1x3 dot matrix rendering using basic ASCII characters\n * Simulates subtle height variations using top/middle/bottom character segments\n */\nexport class AsciiRenderer extends Renderer {\n getMetadata(): RendererMetadata {\n return {\n name: 'ascii',\n displayName: 'ASCII',\n description: \"ASCII character (. _ - ' / \\\\ |) 1x3 resolution, maximum compatibility\",\n resolution: {\n horizontal: 1,\n vertical: 3,\n },\n requiresUtf8: false,\n requiresUnicode: false,\n minScore: 0, // No requirements, usable in any terminal\n };\n }\n\n // ============================================================\n // ASCII-specific private methods\n // ============================================================\n\n /**\n * Check if the pixel at the specified position is set\n */\n private isPixelSet(pixels: Pixel[][], x: number, y: number): boolean {\n const row = pixels[y];\n if (!row) return false;\n return row[x]?.active ?? false;\n }\n\n private getCellPositions(pixels: Pixel[][], x: number, baseY: number): number[] {\n const positions: number[] = [];\n for (let offset = 0; offset < 3; offset++) {\n if (this.isPixelSet(pixels, x, baseY + offset)) {\n positions.push(offset);\n }\n }\n return positions;\n }\n\n private getNeighborPosition(pixels: Pixel[][], x: number, baseY: number): number | null {\n const positions = this.getCellPositions(pixels, x, baseY);\n if (positions.length === 0) {\n return null;\n }\n const sum = positions.reduce((total, value) => total + value, 0);\n return sum / positions.length;\n }\n\n private selectMultiPixelChar(hasAnyLeft: boolean, hasAnyRight: boolean): string {\n return hasAnyLeft || hasAnyRight ? '+' : '|';\n }\n\n private selectHorizontalChar(pos: number): string {\n if (pos === 0) {\n return \"'\";\n }\n if (pos === 1) {\n return '-';\n }\n return '_';\n }\n\n private selectDiagonalChar(params: {\n pos: number;\n hasAnyLeft: boolean;\n hasAnyRight: boolean;\n leftPos: number | null;\n rightPos: number | null;\n }): string | null {\n const { pos, hasAnyLeft, hasAnyRight, leftPos, rightPos } = params;\n if (hasAnyLeft && leftPos !== null && leftPos !== pos) {\n return pos < leftPos ? '/' : '\\\\';\n }\n if (hasAnyRight && rightPos !== null && rightPos !== pos) {\n return pos > rightPos ? '/' : '\\\\';\n }\n return null;\n }\n\n private selectIsolatedChar(pos: number): string {\n if (pos === 0) {\n return '\"';\n }\n if (pos === 1) {\n return '+';\n }\n return '.';\n }\n\n private selectSinglePixelChar(params: {\n pos: number;\n hasSameHorizontal: boolean;\n hasAnyLeft: boolean;\n hasAnyRight: boolean;\n leftPos: number | null;\n rightPos: number | null;\n }): string {\n const { pos, hasSameHorizontal, hasAnyLeft, hasAnyRight, leftPos, rightPos } = params;\n\n if (hasSameHorizontal) {\n return this.selectHorizontalChar(pos);\n }\n const diagonal = this.selectDiagonalChar({\n pos,\n hasAnyLeft,\n hasAnyRight,\n leftPos,\n rightPos,\n });\n if (diagonal) {\n return diagonal;\n }\n return this.selectIsolatedChar(pos);\n }\n\n /**\n * Intelligently select ASCII character\n * Select appropriate character based on 1x3 vertical pixels and adjacent column connections\n */\n private selectAsciiChar(pixels: Pixel[][], x: number, baseY: number): string {\n const positions = this.getCellPositions(pixels, x, baseY);\n if (positions.length === 0) {\n return ' ';\n }\n\n const leftPos = this.getNeighborPosition(pixels, x - 1, baseY);\n const rightPos = this.getNeighborPosition(pixels, x + 1, baseY);\n\n const hasAnyLeft = leftPos !== null;\n const hasAnyRight = rightPos !== null;\n\n if (positions.length >= 2) {\n return this.selectMultiPixelChar(hasAnyLeft, hasAnyRight);\n }\n\n const pos = positions[0] ?? 1;\n const hasLeftSame = this.isPixelSet(pixels, x - 1, baseY + pos);\n const hasRightSame = this.isPixelSet(pixels, x + 1, baseY + pos);\n const hasSameHorizontal = hasLeftSame || hasRightSame;\n\n return this.selectSinglePixelChar({\n pos,\n hasSameHorizontal,\n hasAnyLeft,\n hasAnyRight,\n leftPos,\n rightPos,\n });\n }\n\n /**\n * Determine the primary color for this character cell\n */\n private resolveColor(pixels: Pixel[][], x: number, baseY: number): string | undefined {\n const counts = new Map<string, number>();\n\n for (let offset = 0; offset < 3; offset++) {\n const y = baseY + offset;\n if (y >= pixels.length) continue;\n const pixel = pixels[y]?.[x];\n\n if (pixel?.active && pixel.color) {\n counts.set(pixel.color, (counts.get(pixel.color) ?? 0) + 1);\n }\n }\n\n if (counts.size === 0) return undefined;\n\n // Find the color that appears most frequently\n let maxCount = 0;\n let dominantColor: string | undefined;\n\n for (const [color, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n }\n\n return dominantColor;\n }\n\n // ============================================================\n // Methods that subclasses must implement\n // ============================================================\n\n renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[] {\n const lines: RenderedLine[] = [];\n\n const charHeight = Math.ceil(height / 3);\n for (let cy = 0; cy < charHeight; cy++) {\n const lineSegments: RenderedLine = [];\n const baseY = cy * 3;\n\n let buffer = '';\n let bufferColor: string | undefined;\n\n for (let x = 0; x < width; x++) {\n const char = this.selectAsciiChar(pixels, x, baseY);\n const color = char === ' ' ? undefined : this.resolveColor(pixels, x, baseY);\n\n if (buffer && bufferColor !== color) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n buffer = '';\n }\n\n bufferColor = color;\n buffer += char;\n }\n\n if (buffer) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n }\n lines.push(lineSegments);\n }\n\n return lines;\n }\n}\n","/**\n * Terminal capabilities detector\n *\n * Automatically detect terminal-supported features by analyzing environment variables\n */\n\nimport type { EnvironmentInfo, TerminalCapabilities } from './types';\n\n/**\n * Terminal capabilities detector\n *\n * Analyze process environment variables to determine current terminal's supported character sets, colors, and other features\n */\nexport class TerminalDetector {\n /** Terminal whitelist supporting Braille characters (lowercase) */\n private static readonly BRAILLE_SUPPORTED_TERMINALS = [\n 'iterm',\n 'warp',\n 'alacritty',\n 'kitty',\n 'wezterm',\n 'hyper',\n 'tabby',\n 'rio',\n ];\n\n /** Environment variable information */\n private envInfo: EnvironmentInfo;\n\n constructor(env: NodeJS.ProcessEnv = process.env) {\n this.envInfo = this.extractEnvInfo(env);\n }\n\n /**\n * Extract relevant information from environment variables\n * @param env - Environment variable object\n * @returns Environment information\n */\n private extractEnvInfo(env: NodeJS.ProcessEnv): EnvironmentInfo {\n const info: EnvironmentInfo = {};\n\n if (env.LANG !== undefined) {\n info.LANG = env.LANG;\n }\n if (env.TERM !== undefined) {\n info.TERM = env.TERM;\n }\n if (env.COLORTERM !== undefined) {\n info.COLORTERM = env.COLORTERM;\n }\n if (env.TERM_PROGRAM !== undefined) {\n info.TERM_PROGRAM = env.TERM_PROGRAM;\n }\n if (env.TERM_PROGRAM_VERSION !== undefined) {\n info.TERM_PROGRAM_VERSION = env.TERM_PROGRAM_VERSION;\n }\n\n return info;\n }\n\n /**\n * Detect UTF-8 support\n * @returns Whether UTF-8 is supported\n */\n private checkUtf8Support(): boolean {\n const lang = this.envInfo.LANG || '';\n return lang.toUpperCase().includes('UTF-8') || lang.toUpperCase().includes('UTF8');\n }\n\n /**\n * Detect Unicode support\n * UTF-8 terminals usually support Unicode\n * @returns Whether Unicode is supported\n */\n private checkUnicodeSupport(): boolean {\n return this.checkUtf8Support();\n }\n\n /**\n * Detect Braille character support\n * Determine based on terminal program whitelist\n * @returns Whether Braille characters are supported\n */\n private checkBrailleSupport(): boolean {\n const termProgram = (this.envInfo.TERM_PROGRAM || '').toLowerCase();\n\n // Check whitelist\n return TerminalDetector.BRAILLE_SUPPORTED_TERMINALS.some((supportedTerm) =>\n termProgram.includes(supportedTerm),\n );\n }\n\n /**\n * Detect Block Elements character support\n * Most terminals supporting Unicode also support Block Elements\n * @returns Whether Block Elements are supported\n */\n private checkBlockElementsSupport(): boolean {\n return this.checkUnicodeSupport();\n }\n\n /**\n * Detect color support (16 colors or more)\n * @returns Whether colors are supported\n */\n private checkColorSupport(): boolean {\n const term = this.envInfo.TERM || '';\n const colorterm = this.envInfo.COLORTERM || '';\n\n // Check if TERM contains color identifier\n if (term.includes('color') || term.includes('256color')) {\n return true;\n }\n\n // Check COLORTERM\n if (colorterm.length > 0) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Detect true color support (24-bit RGB)\n * @returns Whether true color is supported\n */\n private checkTrueColorSupport(): boolean {\n const colorterm = this.envInfo.COLORTERM || '';\n return colorterm.toLowerCase() === 'truecolor' || colorterm === '24bit';\n }\n\n /**\n * Calculate comprehensive terminal capability score (0-100)\n * @returns Score\n */\n private calculateScore(): number {\n let score = 0;\n\n // UTF-8 support +20\n if (this.checkUtf8Support()) {\n score += 20;\n }\n\n // Unicode support +10 (UTF-8 included)\n if (this.checkUnicodeSupport()) {\n score += 10;\n }\n\n // Braille support +30 (advanced feature)\n if (this.checkBrailleSupport()) {\n score += 30;\n }\n\n // Block Elements support +10\n if (this.checkBlockElementsSupport()) {\n score += 10;\n }\n\n // Color support +15\n if (this.checkColorSupport()) {\n score += 15;\n }\n\n // True color support +15\n if (this.checkTrueColorSupport()) {\n score += 15;\n }\n\n return Math.min(score, 100);\n }\n\n /**\n * Detect terminal capabilities\n * @returns Terminal capability information\n */\n detect(): TerminalCapabilities {\n const supportsUtf8 = this.checkUtf8Support();\n const supportsUnicode = this.checkUnicodeSupport();\n const supportsBraille = this.checkBrailleSupport();\n const supportsBlockElements = this.checkBlockElementsSupport();\n const supportsColor = this.checkColorSupport();\n const supportsTrueColor = this.checkTrueColorSupport();\n const score = this.calculateScore();\n\n return {\n supportsUtf8,\n supportsUnicode,\n supportsBraille,\n supportsBlockElements,\n supportsColor,\n supportsTrueColor,\n score,\n };\n }\n\n /**\n * Get environment information\n * @returns Environment information\n */\n getEnvironmentInfo(): EnvironmentInfo {\n return { ...this.envInfo };\n }\n}\n\n/**\n * Global terminal detector instance\n */\nexport const terminalDetector = new TerminalDetector();\n","/**\n * Renderer Selector\n *\n * Automatically selects the optimal renderer based on terminal capabilities to achieve intelligent fallback\n */\n\nimport { AsciiRenderer } from '../core/ascii';\nimport { BlockRenderer } from '../core/block';\nimport { BrailleRenderer } from '../core/braille';\nimport type { Renderer, RendererType } from '../core/renderer';\nimport { TerminalDetector } from './terminal';\nimport type { TerminalCapabilities } from './types';\n\n/**\n * Renderer Selector\n *\n * Automatically detects terminal capabilities and selects the optimal renderer\n * Supports custom fallback chains and renderer caching\n */\nexport class RendererSelector {\n /** Terminal detector */\n private detector: TerminalDetector;\n\n constructor(detector: TerminalDetector = new TerminalDetector()) {\n this.detector = detector;\n }\n\n /**\n * Creates a renderer instance of the specified type\n * @param type - Renderer type\n * @returns Renderer instance\n */\n private createRenderer(type: RendererType): Renderer {\n switch (type) {\n case 'braille':\n return new BrailleRenderer();\n case 'block':\n return new BlockRenderer();\n case 'ascii':\n return new AsciiRenderer();\n }\n }\n\n /**\n * Get renderer by type\n * @param type - Renderer type\n * @returns Renderer instance\n */\n getRenderer(type: RendererType): Renderer {\n return this.createRenderer(type);\n }\n\n /**\n * Check if the renderer meets terminal capability requirements\n * @param renderer - Renderer instance\n * @param capabilities - Terminal capabilities\n * @returns Whether requirements are met\n */\n private isRendererSupported(renderer: Renderer, capabilities: TerminalCapabilities): boolean {\n const metadata = renderer.getMetadata();\n\n // Check minimum score requirement\n if (capabilities.score < metadata.minScore) {\n return false;\n }\n\n // Check UTF-8 requirement\n if (metadata.requiresUtf8 && !capabilities.supportsUtf8) {\n return false;\n }\n\n // Check Unicode requirement\n if (metadata.requiresUnicode && !capabilities.supportsUnicode) {\n return false;\n }\n\n // Additional checks for specific renderers\n const rendererName = metadata.name;\n\n // Braille requires explicit support\n if (rendererName === 'braille' && !capabilities.supportsBraille) {\n return false;\n }\n\n // Block Elements requires Unicode support\n if (rendererName === 'block' && !capabilities.supportsBlockElements) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Automatically select the best renderer\n *\n * Try in the order of the priority chain, returning the first renderer that meets terminal capability requirements\n * If none are satisfied, fallback to ASCII\n *\n * @param preferredChain - Priority chain (default: ['braille', 'block', 'ascii'])\n * @returns Selected renderer instance\n */\n selectBest(preferredChain: RendererType[] = ['braille', 'block', 'ascii']): Renderer {\n // Detect terminal capabilities\n const capabilities = this.detector.detect();\n\n // Traverse according to the priority chain\n for (const rendererType of preferredChain) {\n const renderer = this.getRenderer(rendererType);\n\n // Check whether requirements are met\n if (this.isRendererSupported(renderer, capabilities)) {\n return renderer;\n }\n }\n\n // Fallback to ASCII (no requirements, supported by any terminal)\n return this.getRenderer('ascii');\n }\n\n /**\n * Get terminal capability information\n * @returns Terminal capabilities\n */\n getTerminalCapabilities(): TerminalCapabilities {\n return this.detector.detect();\n }\n}\n\n/**\n * Global RendererSelector instance\n */\nexport const rendererSelector = new RendererSelector();\n","/**\n * ink-hud Context Provider\n *\n * Provide dependency injection, replacing the global singleton\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { Renderer, RendererType } from '../core/renderer';\nimport { RendererSelector } from '../detect/selector';\nimport { TerminalDetector } from '../detect/terminal';\nimport type { TerminalCapabilities } from '../detect/types';\n\n/**\n * InkHud Context value\n */\nexport interface InkHudContextValue {\n /** Renderer selector */\n selector: RendererSelector;\n\n /** Get terminal capabilities */\n getCapabilities: () => TerminalCapabilities;\n\n /** Get renderer of specified type */\n getRenderer: (type: RendererType) => Renderer;\n\n /** Select best renderer */\n selectBest: (chain?: RendererType[]) => Renderer;\n}\n\n/**\n * Default Context (using global detector)\n */\nconst defaultSelector = new RendererSelector();\nconst defaultContext: InkHudContextValue = {\n selector: defaultSelector,\n getCapabilities: () => defaultSelector.getTerminalCapabilities(),\n getRenderer: (type) => defaultSelector.getRenderer(type),\n selectBest: (chain) => defaultSelector.selectBest(chain),\n};\n\nconst InkHudContext = createContext<InkHudContextValue>(defaultContext);\n\n/**\n * InkHud Provider Props\n */\nexport interface InkHudProviderProps {\n /**\n * Custom terminal detector\n * For testing or simulating different terminal environments\n */\n detector?: TerminalDetector;\n\n /**\n * Force use of specified renderer\n * Override automatic detection for testing or specific scenarios\n */\n forceRenderer?: RendererType;\n\n children: React.ReactNode;\n}\n\n/**\n * InkHud Context Provider\n *\n * Encapsulate renderer selection logic, supports dependency injection\n *\n * @example\n * ```tsx\n * // Standard usage (automatic detection)\n * <InkHudProvider>\n * <MyApp />\n * </InkHudProvider>\n *\n * // Inject mock for testing\n * <InkHudProvider detector={mockDetector}>\n * <MyApp />\n * </InkHudProvider>\n *\n * // Force ASCII renderer\n * <InkHudProvider forceRenderer=\"ascii\">\n * <MyApp />\n * </InkHudProvider>\n * ```\n */\nexport const InkHudProvider: React.FC<InkHudProviderProps> = ({\n detector,\n forceRenderer,\n children,\n}) => {\n const value = useMemo<InkHudContextValue>(() => {\n const selector = detector ? new RendererSelector(detector) : defaultSelector;\n\n return {\n selector,\n getCapabilities: () => selector.getTerminalCapabilities(),\n getRenderer: (type) => selector.getRenderer(type),\n selectBest: (chain) => {\n if (forceRenderer) {\n return selector.getRenderer(forceRenderer);\n }\n return selector.selectBest(chain);\n },\n };\n }, [detector, forceRenderer]);\n\n return <InkHudContext.Provider value={value}>{children}</InkHudContext.Provider>;\n};\n\n/**\n * Get InkHud Context\n *\n * Even without a Provider, returns the default Context (using the global detector)\n */\nexport function useInkHud(): InkHudContextValue {\n return useContext(InkHudContext);\n}\n\n/**\n * Get renderer selector\n *\n * Simplified Hook to directly get the selector\n */\nexport function useRendererSelector(): RendererSelector {\n return useInkHud().selector;\n}\n","/**\n * Gradient tool module\n *\n * Use tinygradient and chalk to implement terminal color gradients\n */\n\nimport chalk from 'chalk';\nimport tinygradient from 'tinygradient';\n\n/**\n * Generate gradient color array\n *\n * @param colors - Start and end color array (supports hex, rgb, css color names)\n * @param steps - Interpolation steps\n * @returns Chalk color function array\n *\n * @example\n * const gradient = createGradient(['#00f', '#0ff', '#0f0'], 10);\n * gradient[0]('text'); // Blue\n * gradient[9]('text'); // Green\n */\nexport function createGradient(colors: string[], steps: number): Array<(text: string) => string> {\n if (colors.length === 0) {\n return Array(steps).fill((text: string) => text);\n }\n\n if (colors.length === 1) {\n // Single color, no gradient needed\n const color = colors[0];\n if (color) {\n const colorFn = (text: string) => chalk.hex(color)(text);\n return Array(steps).fill(colorFn);\n }\n return Array(steps).fill((text: string) => text);\n }\n\n // Use tinygradient for the gradient\n const gradient = tinygradient(colors);\n const rgbColors = gradient.rgb(steps);\n\n return rgbColors.map((color) => {\n const hex = color.toHex();\n return (text: string) => chalk.hex(hex)(text);\n });\n}\n\n// One Dark palette definitions\n// Source: Atom One Dark Theme\nexport const ONE_DARK_PALETTES = {\n /** One Dark - Classic theme */\n standard: [\n '#61afef', // blue\n '#98c379', // green\n '#e5c07b', // yellow\n '#c678dd', // purple\n '#e06c75', // red\n '#56b6c2', // cyan\n '#d19a66', // orange\n '#abb2bf', // gray\n ],\n /** One Dark Vivid - More vibrant variant */\n vivid: [\n '#61afef', // blue\n '#98c379', // green\n '#e5c07b', // yellow\n '#c678dd', // purple\n '#e06c75', // red\n '#56b6c2', // cyan\n '#be5046', // dark red\n '#d19a66', // orange\n '#528bff', // bright blue\n ],\n};\n\n/**\n * Palette type\n * Supports built-in palette names or custom color arrays\n */\nexport type ColorPalette = 'one-dark' | 'one-dark-vivid' | string[];\n\n/**\n * Assign different colors for data series\n *\n * @param seriesCount - Number of series\n * @param palette - Palette configuration (default: 'one-dark')\n * @returns Color array (hex format)\n *\n * @example\n * const colors = assignColors(5);\n * // Use Vivid variant\n * const vividColors = assignColors(5, 'one-dark-vivid');\n */\nexport function assignColors(seriesCount: number, palette: ColorPalette = 'one-dark'): string[] {\n if (seriesCount === 0) {\n return [];\n }\n\n let baseColors: string[];\n\n if (Array.isArray(palette)) {\n baseColors = palette;\n } else {\n switch (palette) {\n case 'one-dark-vivid':\n baseColors = ONE_DARK_PALETTES.vivid;\n break;\n default:\n baseColors = ONE_DARK_PALETTES.standard;\n break;\n }\n }\n\n // If series count is within palette range, return slice directly\n // Prefer using first colors in palette to maintain consistency\n if (seriesCount <= baseColors.length) {\n return baseColors.slice(0, seriesCount);\n }\n\n // If series count exceeds palette, use gradient to generate more colors to cover full range\n const gradient = tinygradient(baseColors);\n return gradient.rgb(seriesCount).map((c) => c.toHex());\n}\n\n/**\n * Convert color string to chalk color function\n *\n * @param color - Color string (hex, css color names)\n * @returns Chalk color function\n *\n * @example\n * const colorFn = colorToChalk('#ff0000');\n * console.log(colorFn('Red text'));\n */\nexport function colorToChalk(color: string): (text: string) => string {\n // If it's a hex color (#rrggbb or #rgb)\n if (color.startsWith('#')) {\n return (text: string) => chalk.hex(color)(text);\n }\n\n // Try using chalk built-in colors\n // @ts-expect-error - chalk dynamic color access\n if (typeof chalk[color] === 'function') {\n // @ts-expect-error - chalk dynamic color access\n return (text: string) => chalk[color](text);\n }\n\n // Default to returning original text\n return (text: string) => text;\n}\n","/**\n * ThemeContext - Theme Context\n *\n * Provides unified color configuration, replacing hardcoded colors\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport { ONE_DARK_PALETTES } from '../utils/gradient';\n\n/**\n * Semantic color configuration\n */\nexport interface SemanticColors {\n /** Success/Up */\n success: string;\n /** Error/Down */\n error: string;\n /** Warning */\n warning: string;\n /** Info */\n info: string;\n /** Secondary/Disabled */\n muted: string;\n /** Primary text */\n text: string;\n /** Secondary text */\n textSecondary: string;\n}\n\n/**\n * Heatmap gradient configuration\n */\nexport interface HeatmapGradient {\n /** Gradient color array (from dark to light) */\n colors: string[];\n}\n\n/**\n * Theme configuration\n */\nexport interface Theme {\n /** Theme name */\n name: string;\n /** Series colors (for charts) */\n palette: string[];\n /** Semantic colors */\n semantic: SemanticColors;\n /** Heatmap gradient */\n heatmapGradient: string[];\n}\n\n/**\n * One Dark Theme (default)\n */\nexport const ONE_DARK_THEME: Theme = {\n name: 'one-dark',\n palette: ONE_DARK_PALETTES.standard,\n semantic: {\n success: '#98c379', // green\n error: '#e06c75', // red\n warning: '#e5c07b', // yellow\n info: '#61afef', // blue\n muted: '#5c6370', // gray\n text: '#abb2bf', // light gray\n textSecondary: '#5c6370', // dark gray\n },\n heatmapGradient: [\n '#282c34', // background (dark)\n '#56b6c2', // cyan\n '#98c379', // green\n '#e5c07b', // yellow\n '#61afef', // blue (light)\n ],\n};\n\n/**\n * Theme Context\n */\nconst ThemeContext = createContext<Theme>(ONE_DARK_THEME);\n\n/**\n * Theme Provider Props\n */\nexport interface ThemeProviderProps {\n /** Custom theme (optional) */\n theme?: Partial<Theme>;\n children: React.ReactNode;\n}\n\n/**\n * Theme Provider\n *\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n *\n * // Custom theme\n * <ThemeProvider theme={{ semantic: { success: '#00ff00' } }}>\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme: customTheme, children }) => {\n const mergedTheme = useMemo<Theme>(() => {\n if (!customTheme) {\n return ONE_DARK_THEME;\n }\n return {\n ...ONE_DARK_THEME,\n ...customTheme,\n semantic: {\n ...ONE_DARK_THEME.semantic,\n ...customTheme.semantic,\n },\n };\n }, [customTheme]);\n\n return <ThemeContext.Provider value={mergedTheme}>{children}</ThemeContext.Provider>;\n};\n\n/**\n * Get current theme\n *\n * @example\n * ```tsx\n * const theme = useTheme();\n * <Text color={theme.semantic.success}>Success</Text>\n * ```\n */\nexport function useTheme(): Theme {\n return useContext(ThemeContext);\n}\n\n/**\n * Get semantic colors\n *\n * @example\n * ```tsx\n * const colors = useSemanticColors();\n * <Text color={colors.error}>Error</Text>\n * ```\n */\nexport function useSemanticColors(): SemanticColors {\n const theme = useTheme();\n return theme.semantic;\n}\n","/**\n * Data scaling utility module\n *\n * Provides data normalization and linear scaling functions for mapping data to chart coordinate space\n */\n\n/**\n * Linear scale function\n * Map value from input domain to output domain\n *\n * @param value - Value to scale\n * @param domain - Input domain [min, max]\n * @param range - Output range [min, max]\n * @returns Scaled value\n *\n * @example\n * linearScale(50, [0, 100], [0, 10]); // Returns 5\n * linearScale(75, [0, 100], [0, 20]); // Returns 15\n */\nexport function linearScale(\n value: number,\n domain: [number, number],\n range: [number, number],\n): number {\n const [domainMin, domainMax] = domain;\n const [rangeMin, rangeMax] = range;\n\n // Handle case where domain range is 0\n if (domainMax === domainMin) {\n return rangeMin;\n }\n\n // Linear mapping formula: y = (x - x_min) / (x_max - x_min) * (y_max - y_min) + y_min\n const ratio = (value - domainMin) / (domainMax - domainMin);\n return ratio * (rangeMax - rangeMin) + rangeMin;\n}\n\n/**\n * Data normalization\n * Map array data to [0, 1] interval\n *\n * @param data - Original data array\n * @returns Normalized data array\n *\n * @example\n * normalize([0, 50, 100]); // Returns [0, 0.5, 1]\n * normalize([10, 20, 30]); // Returns [0, 0.5, 1]\n */\nexport function normalize(data: number[]): number[] {\n if (data.length === 0) {\n return [];\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n\n // If all values are same, return 0.5 for all (middle value)\n if (max === min) {\n return data.map(() => 0.5);\n }\n\n return data.map((value) => linearScale(value, [min, max], [0, 1]));\n}\n\n/**\n * Scale data to specified range\n * Map array data to specified output range\n *\n * @param data - Original data array\n * @param range - Output range [min, max]\n * @returns Scaled data array\n *\n * @example\n * scaleToRange([0, 50, 100], [0, 10]); // Returns [0, 5, 10]\n * scaleToRange([-10, 0, 10], [0, 100]); // Returns [0, 50, 100]\n */\nexport function scaleToRange(data: number[], range: [number, number]): number[] {\n if (data.length === 0) {\n return [];\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n\n // If all values are same, return the range midpoint\n if (max === min) {\n const midPoint = (range[0] + range[1]) / 2;\n return data.map(() => midPoint);\n }\n\n return data.map((value) => linearScale(value, [min, max], range));\n}\n\n/**\n * Clamp value within specified range (clamp)\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n *\n * @example\n * clamp(5, 0, 10); // Returns 5\n * clamp(-5, 0, 10); // Returns 0\n * clamp(15, 0, 10); // Returns 10\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * Geometry calculation utility module\n *\n * Provides helper functions for calculating geometric shapes like circles and arcs\n */\n\n/**\n * Midpoint Circle Algorithm\n * Calculate all points on the circle (8 symmetry points)\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @returns Array of coordinates for all points on circle\n *\n * @example\n * const points = midpointCircle(50, 50, 20);\n * points.forEach(([x, y]) => {\n * console.log(`Point coordinates: (${x}, ${y})`);\n * });\n */\nexport function midpointCircle(\n centerX: number,\n centerY: number,\n radius: number,\n): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n\n let x = 0;\n let y = radius;\n let d = 1 - radius;\n\n while (x <= y) {\n // 8 symmetry points\n points.push(\n [centerX + x, centerY + y],\n [centerX - x, centerY + y],\n [centerX + x, centerY - y],\n [centerX - x, centerY - y],\n [centerX + y, centerY + x],\n [centerX - y, centerY + x],\n [centerX + y, centerY - x],\n [centerX - y, centerY - x],\n );\n\n x++;\n if (d < 0) {\n d += 2 * x + 1;\n } else {\n y--;\n d += 2 * (x - y) + 1;\n }\n }\n\n return points;\n}\n\n/**\n * Calculate point coordinates at specified angle on arc\n * Using parametric equations: x = centerX + r * cos(θ), y = centerY + r * sin(θ)\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @param angle - Angle (radians)\n * @returns Point coordinates [x, y]\n *\n * @example\n * // Calculate the point at 45° (π/4 radians)\n * const [x, y] = pointOnArc(50, 50, 20, Math.PI / 4);\n */\nexport function pointOnArc(\n centerX: number,\n centerY: number,\n radius: number,\n angle: number,\n): [number, number] {\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n return [x, y];\n}\n\n/**\n * Calculate multiple points on the arc\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @param startAngle - Start angle (radians)\n * @param endAngle - End angle (radians)\n * @param steps - Steps (default calculated based on radius)\n * @returns Array of coordinates for all points on arc\n *\n * @example\n * // Calculate arc points from 0° to 90°\n * const points = arcPoints(50, 50, 20, 0, Math.PI / 2, 20);\n */\nexport function arcPoints(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n steps?: number,\n): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n\n // Ensure correct angle order\n let start = startAngle;\n let end = endAngle;\n if (start > end) {\n [start, end] = [end, start];\n }\n\n // Calculate number of steps (default based on radius and angle range)\n const angleRange = end - start;\n const stepCount = steps ?? Math.max(10, Math.ceil(radius * angleRange));\n\n // Calculate angle step\n const angleStep = angleRange / stepCount;\n\n for (let i = 0; i <= stepCount; i++) {\n const angle = start + i * angleStep;\n points.push(pointOnArc(centerX, centerY, radius, angle));\n }\n\n return points;\n}\n\n/**\n * Convert angle from degrees to radians\n *\n * @param degrees - Angle (degrees)\n * @returns Angle (radians)\n *\n * @example\n * const radians = degreesToRadians(90); // π/2\n */\nexport function degreesToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\n/**\n * Convert angle from radians to degrees\n *\n * @param radians - Angle (radians)\n * @returns Angle (degrees)\n *\n * @example\n * const degrees = radiansToDegrees(Math.PI / 2); // 90\n */\nexport function radiansToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n\n/**\n * Calculate distance between two points\n *\n * @param x1 - First point x coordinate\n * @param y1 - First point y coordinate\n * @param x2 - Second point x coordinate\n * @param y2 - Second point y coordinate\n * @returns Distance\n *\n * @example\n * const distance = distanceBetweenPoints(0, 0, 3, 4); // 5\n */\nexport function distanceBetweenPoints(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return Math.sqrt(dx * dx + dy * dy);\n}\n","/**\n * Data downsampling module\n *\n * Provides downsampling algorithms for large datasets to display many data points in limited-width charts\n */\n\nfunction computeAveragePoint(\n data: number[],\n startIndexInclusive: number,\n endIndexExclusive: number,\n): { x: number; y: number } {\n const count = endIndexExclusive - startIndexInclusive;\n if (count <= 0) {\n return { x: 0, y: 0 };\n }\n\n let sumX = 0;\n let sumY = 0;\n for (let i = startIndexInclusive; i < endIndexExclusive; i++) {\n sumX += i;\n sumY += data[i] ?? 0;\n }\n\n return { x: sumX / count, y: sumY / count };\n}\n\nfunction triangleArea(\n prevX: number,\n prevY: number,\n avgX: number,\n avgY: number,\n pointX: number,\n pointY: number,\n): number {\n return Math.abs((prevX - avgX) * (pointY - prevY) - (prevX - pointX) * (avgY - prevY));\n}\n\nfunction findLargestTrianglePointIndex(\n data: number[],\n bucketStart: number,\n bucketEnd: number,\n prevX: number,\n prevY: number,\n avgX: number,\n avgY: number,\n): number {\n let maxArea = -1;\n let maxIdx = bucketStart;\n\n for (let i = bucketStart; i < bucketEnd; i++) {\n const area = triangleArea(prevX, prevY, avgX, avgY, i, data[i] ?? 0);\n if (area > maxArea) {\n maxArea = area;\n maxIdx = i;\n }\n }\n\n return maxIdx;\n}\n\n/**\n * LTTB (Largest Triangle Three Buckets) algorithm\n * An efficient data downsampling algorithm that preserves visually important data points\n *\n * Algorithm principles:\n * 1. Always preserve first and last points\n * 2. Divide intermediate data into multiple buckets\n * 3. Select the point with largest triangle area in each bucket (forming largest triangle with adjacent points)\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = Array.from({ length: 1000 }, (_, i) => Math.sin(i / 10));\n * const sampled = lttb(data, 100); // Downsample from 1000 points to 100 points\n */\nexport function lttb(data: number[], threshold: number): number[] {\n // If number of data points is less than or equal to threshold, return directly\n if (data.length <= threshold) {\n return data;\n }\n\n // If threshold is too small, at least preserve first and last points\n if (threshold <= 2) {\n return [data[0] ?? 0, data[data.length - 1] ?? 0];\n }\n\n const sampled: number[] = [data[0] ?? 0]; // Always preserve the first point\n let prevIndex = 0;\n\n // Calculate bucket size\n const bucketSize = (data.length - 2) / (threshold - 2);\n\n // Iterate through buckets\n for (let i = 0; i < threshold - 2; i++) {\n // Start and end indices of current bucket\n const bucketStart = Math.floor(i * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 1) * bucketSize) + 1;\n\n // Center point of the next bucket (for triangle calculation)\n const nextBucketStart = bucketEnd;\n const nextBucketEnd = Math.min(Math.floor((i + 2) * bucketSize) + 1, data.length);\n\n // Calculate average point of next bucket (as third vertex of triangle)\n const { x: avgX, y: avgY } = computeAveragePoint(data, nextBucketStart, nextBucketEnd);\n\n // Previously selected point\n const prevX = prevIndex;\n const prevY = data[prevIndex] ?? 0;\n\n const maxIdx = findLargestTrianglePointIndex(\n data,\n bucketStart,\n bucketEnd,\n prevX,\n prevY,\n avgX,\n avgY,\n );\n\n sampled.push(data[maxIdx] ?? 0);\n prevIndex = maxIdx;\n }\n\n // Always preserve the last point\n sampled.push(data[data.length - 1] ?? 0);\n\n return sampled;\n}\n\n/**\n * Simple fixed-interval downsampling\n * Select one data point at fixed intervals\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n * const sampled = fixedIntervalDownsampling(data, 5); // [1, 3, 5, 7, 10]\n */\nexport function fixedIntervalDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const step = (data.length - 1) / (threshold - 1);\n\n for (let i = 0; i < threshold; i++) {\n const index = Math.round(i * step);\n sampled.push(data[index] ?? 0);\n }\n\n return sampled;\n}\n\n/**\n * Average Downsampling\n * Divide data into multiple buckets, taking the average value for each bucket\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8];\n * const sampled = averageDownsampling(data, 4); // [1.5, 3.5, 5.5, 7.5]\n */\nexport function averageDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const bucketSize = data.length / threshold;\n\n for (let i = 0; i < threshold; i++) {\n const bucketStart = Math.floor(i * bucketSize);\n const bucketEnd = Math.floor((i + 1) * bucketSize);\n\n let sum = 0;\n let count = 0;\n\n for (let j = bucketStart; j < bucketEnd; j++) {\n sum += data[j] ?? 0;\n count++;\n }\n\n sampled.push(count > 0 ? sum / count : 0);\n }\n\n return sampled;\n}\n\n/**\n * Min-Max Downsampling\n * Divide data into multiple buckets, preserving the Maximum and Minimum values for each bucket\n * Suitable for preserving peaks and valleys in data\n *\n * @param data - Original data array\n * @param threshold - Target number of data points (actual returned points will be 2x threshold)\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 5, 2, 8, 3, 6, 4, 7];\n * const sampled = minMaxDownsampling(data, 4); // [1, 5, 2, 8, 3, 6, 4, 7]\n */\nexport function minMaxDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const bucketSize = data.length / threshold;\n\n for (let i = 0; i < threshold; i++) {\n const bucketStart = Math.floor(i * bucketSize);\n const bucketEnd = Math.floor((i + 1) * bucketSize);\n\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (let j = bucketStart; j < bucketEnd; j++) {\n const value = data[j] ?? 0;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n\n // Preserve Minimum and Maximum values\n sampled.push(min, max);\n }\n\n return sampled;\n}\n","/**\n * Data smooth transition Hook module\n *\n * Provides smooth animation effects for data changes\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * Easing function type\n */\nexport type EasingFunction = (t: number) => number;\n\n/**\n * Quadratic easing function (accelerate then decelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n/**\n * Linear easing function (constant speed)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeLinear(t: number): number {\n return t;\n}\n\n/**\n * Cubic ease-out function (decelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\n\n/**\n * Cubic ease-in function (accelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\n\n/**\n * Data smooth transition Hook\n * Smooth transition to new value when target changes\n *\n * @param targetValue - Target value\n * @param duration - Transition duration (ms, default 300)\n * @param easingFn - Easing function (default easeInOutQuad)\n * @returns Current smooth value\n *\n * @example\n * const smoothValue = useSmooth(cpuUsage, 500);\n * return <LineChart series={[{ name: 'Value', data: [smoothValue] }]} />;\n */\nexport function useSmooth(\n targetValue: number,\n duration = 300,\n easingFn: EasingFunction = easeInOutQuad,\n): number {\n const [currentValue, setCurrentValue] = useState(targetValue);\n const startValueRef = useRef(targetValue);\n const startTimeRef = useRef<number | null>(null);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n // If target value hasn't changed, no animation needed\n if (targetValue === currentValue) {\n return;\n }\n\n startValueRef.current = currentValue;\n startTimeRef.current = Date.now();\n\n const frameInterval = 1000 / 30; // 30 FPS\n\n const animate = () => {\n const now = Date.now();\n const elapsed = now - (startTimeRef.current ?? now);\n const progress = Math.min(elapsed / duration, 1);\n\n const easedProgress = easingFn(progress);\n const newValue =\n startValueRef.current + (targetValue - startValueRef.current) * easedProgress;\n\n setCurrentValue(newValue);\n\n if (progress < 1) {\n timerRef.current = setTimeout(animate, frameInterval);\n }\n };\n\n timerRef.current = setTimeout(animate, frameInterval);\n\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, [targetValue, duration, easingFn, currentValue]);\n\n return currentValue;\n}\n\n/**\n * Array data smooth transition Hook\n * Smooth transition to new data when target changes\n *\n * @param targetData - Target data array\n * @param duration - Transition duration (ms, default 300)\n * @param easingFn - Easing function (default easeInOutQuad)\n * @returns Current smooth data array\n *\n * @example\n * const smoothData = useSmoothArray(memoryData, 500);\n * return <LineChart data={[{ name: 'Memory', data: smoothData }]} />;\n */\nexport function useSmoothArray(\n targetData: number[],\n duration = 300,\n easingFn: EasingFunction = easeInOutQuad,\n): number[] {\n const [currentData, setCurrentData] = useState(targetData);\n const startDataRef = useRef(targetData);\n const startTimeRef = useRef<number | null>(null);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n // If data length changes, use new data directly (no smoothing)\n if (targetData.length !== currentData.length) {\n setCurrentData(targetData);\n return;\n }\n\n // If data hasn't changed, no animation needed\n const hasChanged = targetData.some((value, i) => value !== currentData[i]);\n if (!hasChanged) {\n return;\n }\n\n startDataRef.current = currentData;\n startTimeRef.current = Date.now();\n\n const frameInterval = 1000 / 30; // 30 FPS\n\n const animate = () => {\n const now = Date.now();\n const elapsed = now - (startTimeRef.current ?? now);\n const progress = Math.min(elapsed / duration, 1);\n\n const easedProgress = easingFn(progress);\n const newData = targetData.map((target, i) => {\n const start = startDataRef.current[i] ?? 0;\n return start + (target - start) * easedProgress;\n });\n\n setCurrentData(newData);\n\n if (progress < 1) {\n timerRef.current = setTimeout(animate, frameInterval);\n }\n };\n\n timerRef.current = setTimeout(animate, frameInterval);\n\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, [targetData, duration, easingFn, currentData]);\n\n return currentData;\n}\n\n/**\n * Throttling Hook\n * Limit animation frame rate to avoid terminal flicker\n *\n * @param value - Current value\n * @param fps - Target frame rate (default 30)\n * @returns Throttled value\n *\n * @example\n * const throttledValue = useThrottle(cpuUsage, 30);\n */\nexport function useThrottle<T>(value: T, fps = 30): T {\n const [throttledValue, setThrottledValue] = useState(value);\n const lastUpdateRef = useRef(Date.now());\n\n useEffect(() => {\n const now = Date.now();\n const interval = 1000 / fps;\n const elapsed = now - lastUpdateRef.current;\n\n if (elapsed >= interval) {\n setThrottledValue(value);\n lastUpdateRef.current = now;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n setThrottledValue(value);\n lastUpdateRef.current = Date.now();\n }, interval - elapsed);\n\n return () => clearTimeout(timeoutId);\n }, [value, fps]);\n\n return throttledValue;\n}\n","import { Box, useStdout } from 'ink';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\n// Context to pass grid configuration to items\ninterface GridContextValue {\n columns: number;\n gap: number;\n totalWidth: number;\n rowHeight?: number | string | undefined;\n /** Pre-calculated widths for each GridItem (by index) */\n itemWidths?: number[];\n}\n\nconst GridContext = createContext<GridContextValue>({\n columns: 12,\n gap: 0,\n totalWidth: 80, // Fallback\n});\n\n// Context to pass available width to immediate children (like Charts)\nexport interface GridItemContextValue {\n width?: number; // Available width for the content (excluding padding)\n height?: number | string | undefined; // Available height\n}\n\nexport const GridItemContext = createContext<GridItemContextValue | null>(null);\n\nexport interface GridProps {\n /** Number of columns in the grid (default: 12) */\n columns?: number;\n\n /** Gap between items (horizontal and vertical) */\n gap?: number;\n\n /**\n * Total width of the grid in characters.\n * If not provided, it will automatically use the terminal width (stdout.columns).\n */\n width?: number;\n\n /**\n * Width offset to subtract from the terminal width when auto-calculating.\n * Use this to account for parent padding or borders.\n * @deprecated Recommend wrapping content with `<Panel>`, which automatically handles border overhead\n */\n widthOffset?: number;\n\n /**\n * Default height for all rows/items in the grid.\n * Can be overridden by individual GridItem height prop.\n */\n rowHeight?: number | string | undefined;\n\n /** Children should be GridItem components */\n children: React.ReactNode;\n}\n\n/**\n * Calculate precise widths for all GridItems\n * Uses \"distribute remainder\" algorithm to eliminate rounding errors\n */\nfunction calculateItemWidths(\n children: React.ReactNode,\n totalWidth: number,\n columns: number,\n gap: number,\n): number[] {\n const childArray = React.Children.toArray(children);\n const itemWidths: number[] = [];\n\n // Calculate available width for columns (excluding all gaps between columns)\n const totalGapWidth = Math.max(0, (columns - 1) * gap);\n const availableWidth = Math.max(0, totalWidth - totalGapWidth);\n\n // Base column width and remainder\n const baseColWidth = Math.floor(availableWidth / columns);\n const remainder = availableWidth % columns;\n\n // Track current column position and remaining extra pixels\n let currentCol = 0;\n let remainingExtra = remainder;\n\n for (const child of childArray) {\n // Get span from child props (default: 1)\n const span =\n React.isValidElement(child) && typeof child.props.span === 'number'\n ? Math.min(Math.max(1, child.props.span), columns)\n : 1;\n\n // Calculate how many extra pixels this item should get\n // Distribute extras to columns from left to right\n let itemExtra = 0;\n const startCol = currentCol;\n const endCol = Math.min(currentCol + span, columns);\n\n for (let col = startCol; col < endCol && remainingExtra > 0; col++) {\n if (col < remainder) {\n itemExtra++;\n remainingExtra--;\n }\n }\n\n // Recalculate: we should use the actual distribution method\n // For each column in the span, check if it should get +1\n itemExtra = 0;\n for (let col = currentCol; col < currentCol + span && col < columns; col++) {\n if (col < remainder) {\n itemExtra++;\n }\n }\n\n // Item width = (base * span) + extra pixels + internal gaps\n const itemGapWidth = Math.max(0, (span - 1) * gap);\n const itemWidth = baseColWidth * span + itemExtra + itemGapWidth;\n\n itemWidths.push(itemWidth);\n\n // Move to next column position (wrap if needed)\n currentCol += span;\n if (currentCol >= columns) {\n currentCol = 0;\n remainingExtra = remainder; // Reset for next row\n }\n }\n\n return itemWidths;\n}\n\n/**\n * Grid Container\n * Acts like a CSS Grid container, arranging items in columns.\n */\nexport const Grid: React.FC<GridProps> = ({\n columns = 12,\n gap = 0,\n width: propsWidth,\n widthOffset = 0,\n rowHeight,\n children,\n}) => {\n const { stdout } = useStdout();\n const [terminalWidth, setTerminalWidth] = useState(stdout ? stdout.columns : 80);\n\n // Update width on resize\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setTerminalWidth(stdout.columns);\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n // Use provided width or terminal width\n // When widthOffset is specified, user is manually managing margins, so don't apply default safety margin\n // Otherwise, subtract a safety margin (2 chars) to prevent edge-case wrapping\n const safetyMargin = widthOffset > 0 ? 0 : 2;\n const defaultWidth =\n terminalWidth > safetyMargin ? terminalWidth - safetyMargin : terminalWidth;\n const totalWidth = propsWidth ?? Math.max(0, defaultWidth - widthOffset);\n\n // Pre-calculate precise widths for all items\n const itemWidths = calculateItemWidths(children, totalWidth, columns, gap);\n\n // Clone children with _gridIndex prop\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child as React.ReactElement<{ _gridIndex?: number }>, {\n _gridIndex: index,\n });\n }\n return child;\n });\n\n return (\n <GridContext.Provider value={{ columns, gap, totalWidth, rowHeight, itemWidths }}>\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n columnGap={gap}\n rowGap={gap}\n width={totalWidth}\n >\n {childrenWithIndex}\n </Box>\n </GridContext.Provider>\n );\n};\n\nexport interface GridItemProps {\n /** Number of columns to span (default: 1) */\n span?: number;\n /** Fixed height for this item */\n height?: number | string;\n /** Minimum height for this item */\n minHeight?: number | string;\n /** Overflow behavior */\n overflow?: 'visible' | 'hidden';\n children: React.ReactNode;\n /** Internal: index assigned by Grid parent */\n _gridIndex?: number;\n}\n\n/**\n * Grid Item\n * A cell in the grid that spans a specific number of columns.\n */\nexport const GridItem: React.FC<GridItemProps> = ({\n span = 1,\n height,\n minHeight,\n overflow,\n children,\n _gridIndex,\n}) => {\n const {\n columns,\n gap,\n totalWidth,\n rowHeight: contextRowHeight,\n itemWidths,\n } = useContext(GridContext);\n\n // Get precise width from pre-calculated widths if available\n let basisWidth: number;\n\n if (itemWidths !== undefined && _gridIndex !== undefined && _gridIndex < itemWidths.length) {\n // Use pre-calculated precise width (non-null assertion safe due to bounds check)\n basisWidth = itemWidths[_gridIndex] ?? 0;\n } else {\n // Fallback to original calculation (for standalone usage)\n const totalGapWidth = Math.max(0, (columns - 1) * gap);\n const availableWidth = Math.max(0, totalWidth - totalGapWidth);\n const colWidth = availableWidth / columns;\n const itemGapWidth = Math.max(0, (span - 1) * gap);\n basisWidth = Math.floor(colWidth * span + itemGapWidth);\n }\n\n const effectiveHeight = height ?? contextRowHeight;\n\n return (\n <GridItemContext.Provider value={{ width: basisWidth, height: effectiveHeight }}>\n <Box\n flexGrow={0}\n flexShrink={0}\n flexBasis={basisWidth}\n flexDirection=\"column\"\n {...(effectiveHeight !== undefined && { height: effectiveHeight })}\n {...(minHeight !== undefined && { minHeight })}\n {...(overflow !== undefined && { overflow })}\n >\n {children}\n </Box>\n </GridItemContext.Provider>\n );\n};\n","import { useContext } from 'react';\nimport type { Renderer } from '../../core/renderer';\nimport { type ColorPalette, assignColors } from '../../utils/gradient';\nimport { linearScale } from '../../utils/scale';\nimport { GridItemContext } from '../Grid';\n\n/**\n * Chart Layout Configuration\n */\n/* ... existing code ... */\n\nexport function resolveSeriesColors(\n series: ChartSeries[],\n colors?: string[],\n palette?: ColorPalette,\n): string[] {\n if (series.length === 0) {\n return [];\n }\n // Prioritize explicit colors array if provided and sufficient\n if (colors && colors.length >= series.length) {\n return colors.slice(0, series.length);\n }\n // Otherwise use palette (defaults to 'one-dark' inside assignColors)\n // If colors is partially provided, we might want to use it?\n // Current logic: if colors is provided but not enough, assignColors generates new ones.\n // We pass 'colors' as baseColors to assignColors if palette is not specified?\n // Actually assignColors 2nd arg is 'palette' now.\n\n // If colors is provided, treat it as a custom palette\n if (colors && colors.length > 0) {\n return assignColors(series.length, colors);\n }\n\n return assignColors(series.length, palette);\n}\n\n/**\n * Chart Layout Configuration\n */\nexport interface ChartLayoutConfig {\n /** Minimum width of the chart (default: 10) */\n minWidth?: number;\n /** Minimum height of the chart (default: 1) */\n minHeight?: number;\n /**\n * Width offset (default: 0)\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n widthOffset?: number;\n /**\n * Height offset (default: 0)\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n heightOffset?: number;\n /** X-axis visibility */\n showXAxis?: boolean;\n /** Y-axis visibility */\n showYAxis?: boolean;\n /** Legend visibility */\n showLegend?: boolean;\n /** Legend position */\n legendPosition?: 'top' | 'bottom' | 'right';\n /** X-axis label */\n xAxisLabel?: string;\n /** Y-axis label */\n yAxisLabel?: string;\n /** Y-axis tick count */\n yTickCount?: number;\n /** Y-axis tick formatter */\n yTickFormat?: (value: number) => string;\n /** Default width if not in grid (default: 60) */\n defaultWidth?: number;\n /** Default height if not in grid (default: 15) */\n defaultHeight?: number;\n /** Data min value */\n min: number;\n /** Data max value */\n max: number;\n}\n\n/**\n * Chart Layout Result\n */\nexport interface ChartLayoutResult {\n /** Total width of the component */\n totalWidth: number;\n /** Total height of the component */\n totalHeight: number;\n /** Width of the plot area (canvas) */\n plotWidth: number;\n /** Height of the plot area (canvas) */\n plotHeight: number;\n /** Width of the Y-axis label area */\n yAxisWidth: number;\n /** Height of the legend area (if top/bottom) */\n legendHeight: number;\n /** Width of the legend area (if right) */\n legendWidth: number;\n /** Height of the X-axis area */\n xAxisHeight: number;\n}\n\n/**\n * Hook to calculate consistent chart layout\n */\nexport function useChartLayout(\n props: { width?: number; height?: number },\n config: ChartLayoutConfig,\n): ChartLayoutResult {\n const {\n minWidth = 10,\n widthOffset = 0,\n heightOffset = 0,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n legendPosition = 'right',\n xAxisLabel,\n yTickCount = 5,\n yTickFormat,\n defaultWidth = 60,\n defaultHeight = 15,\n min,\n max,\n } = config;\n\n const gridContext = useContext(GridItemContext);\n\n // 1. Calculate Total Dimensions\n // Priority: props.height > gridContext.height (if number) > defaultHeight\n const totalHeight =\n props.height ??\n (typeof gridContext?.height === 'number' ? gridContext.height : defaultHeight);\n\n let totalWidth = props.width;\n if (totalWidth === undefined) {\n if (gridContext?.width) {\n totalWidth = Math.max(minWidth, gridContext.width - widthOffset);\n } else {\n totalWidth = defaultWidth; // Default fallback\n }\n }\n\n // 2. Calculate Component Dimensions\n const yAxisWidth = showYAxis\n ? getYAxisLabelWidth({\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n })\n : 0;\n\n const effectiveXAxisHeight = showXAxis ? 1 + (xAxisLabel ? 1 : 0) : 0;\n\n let legendWidth = 0;\n let legendHeight = 0;\n\n if (showLegend) {\n if (legendPosition === 'right') {\n legendWidth = 20; // Fixed width for right legend\n } else {\n // Top or Bottom\n legendHeight = 2; // 1 line content + 1 line margin\n }\n }\n\n // 3. Calculate Plot Dimensions\n // Width: Total - YAxis - RightLegend - (Spacing)\n const yAxisSpacing = showYAxis ? 1 : 0;\n const legendSpacing = showLegend && legendPosition === 'right' ? 2 : 0;\n\n const plotWidth = Math.max(\n 1,\n totalWidth - yAxisWidth - yAxisSpacing - legendWidth - legendSpacing,\n );\n\n const plotHeight = Math.max(\n 1,\n totalHeight - heightOffset - legendHeight - effectiveXAxisHeight,\n );\n\n return {\n totalWidth,\n totalHeight,\n plotWidth,\n plotHeight,\n yAxisWidth,\n legendHeight,\n legendWidth,\n xAxisHeight: effectiveXAxisHeight,\n };\n}\n\n/**\n * Simplified Chart layout props interface\n * Can be directly destructured from chart component props\n */\nexport interface ChartLayoutProps {\n width?: number;\n height?: number;\n showAxis?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n legendPosition?: 'top' | 'bottom' | 'right';\n xAxisLabel?: string;\n yAxisLabel?: string;\n yTickCount?: number;\n yTickFormat?: (value: number) => string;\n /** @deprecated Recommend wrapping chart with `<Panel>` */\n widthOffset?: number;\n /** @deprecated Recommend wrapping chart with `<Panel>` */\n heightOffset?: number;\n}\n\n/**\n * Simplified layout Hook\n *\n * Directly accepts chart props, reducing verbose code at call sites.\n *\n * @example\n * ```tsx\n * const layout = useChartLayoutSimple(props, min, max);\n * // Equivalent to original verbose call:\n * // const layout = useChartLayout(\n * // { width: props.width, height: props.height },\n * // { showXAxis: props.showXAxis ?? props.showAxis, ... }\n * // );\n * ```\n */\nexport function useChartLayoutSimple(\n props: ChartLayoutProps,\n min: number,\n max: number,\n): ChartLayoutResult {\n const {\n width: propsWidth,\n height: propsHeight,\n showAxis = true,\n showXAxis,\n showYAxis,\n showLegend = true,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n yTickCount = 5,\n yTickFormat,\n widthOffset = 0,\n heightOffset = 0,\n } = props;\n\n // Resolve relationship between showAxis and showXAxis/showYAxis\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n return useChartLayout(\n {\n ...(propsWidth !== undefined && { width: propsWidth }),\n ...(propsHeight !== undefined && { height: propsHeight }),\n },\n {\n widthOffset,\n heightOffset,\n showXAxis: renderXAxis,\n showYAxis: renderYAxis,\n showLegend,\n legendPosition,\n ...(xAxisLabel && { xAxisLabel }),\n ...(yAxisLabel && { yAxisLabel }),\n yTickCount,\n ...(yTickFormat && { yTickFormat }),\n min,\n max,\n },\n );\n}\n\nexport interface ChartSeries {\n name: string;\n data: number[];\n color?: string;\n}\n\nexport function buildSeriesInputParams(\n series?: ChartSeries[],\n data?: number[],\n seriesName?: string,\n): { series?: ChartSeries[]; data?: number[]; seriesName?: string } {\n const params: { series?: ChartSeries[]; data?: number[]; seriesName?: string } = {};\n if (series !== undefined) {\n params.series = series;\n }\n if (data !== undefined) {\n params.data = data;\n }\n if (seriesName !== undefined) {\n params.seriesName = seriesName;\n }\n return params;\n}\n\nexport function resolveSeriesInput(params: {\n series?: ChartSeries[];\n data?: number[];\n seriesName?: string;\n}): ChartSeries[] {\n const { series, data, seriesName } = params;\n if (series && series.length > 0) {\n return series;\n }\n if (data && data.length > 0) {\n return [\n {\n name: seriesName ?? 'Series',\n data,\n },\n ];\n }\n return [];\n}\n\nexport function computeSeriesExtent(series: ChartSeries[]): {\n min: number;\n max: number;\n maxLength: number;\n} {\n let min = 0;\n let max = 0;\n let maxLength = 0;\n let hasValue = false;\n\n for (const item of series) {\n maxLength = Math.max(maxLength, item.data.length);\n for (const value of item.data) {\n if (!hasValue) {\n min = value;\n max = value;\n hasValue = true;\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n }\n\n if (!hasValue) {\n return { min: 0, max: 0, maxLength };\n }\n\n return { min, max, maxLength };\n}\n\nexport function getPixelDimensions(\n renderer: Renderer,\n width: number,\n height: number,\n): { pixelWidth: number; pixelHeight: number } {\n const resolution = renderer.getResolution();\n return {\n pixelWidth: width * resolution.horizontal,\n pixelHeight: height * resolution.vertical,\n };\n}\n\nexport function defaultTickFormat(value: number): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n // Billion\n if (absValue >= 1_000_000_000) {\n const v = absValue / 1_000_000_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}b`;\n }\n\n // Million\n if (absValue >= 1_000_000) {\n const v = absValue / 1_000_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}m`;\n }\n\n // Kilo\n if (absValue >= 1_000) {\n const v = absValue / 1_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}k`;\n }\n\n // Less than 1000: display as integer\n return Math.round(value).toString();\n}\n\nexport function getYAxisLabelWidth(params: {\n min: number;\n max: number;\n tickCount: number;\n tickFormat?: (value: number) => string;\n}): number {\n const { min, max, tickCount, tickFormat = defaultTickFormat } = params;\n if (tickCount <= 0) {\n return 0;\n }\n if (max === min) {\n return tickFormat(min).length;\n }\n\n const step = (max - min) / (tickCount - 1);\n let maxLength = 0;\n for (let i = 0; i < tickCount; i++) {\n const value = min + i * step;\n maxLength = Math.max(maxLength, tickFormat(value).length);\n }\n return maxLength;\n}\n\n/**\n * Compute baseline Y coordinate\n *\n * Used for AreaChart and BarChart to determine the starting point of the filled area\n */\nexport function computeBaselineY(params: {\n min: number;\n max: number;\n pixelHeight: number;\n}): number {\n const { min, max, pixelHeight } = params;\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n const baselineValue = min <= 0 && max >= 0 ? 0 : min > 0 ? min : max;\n return Math.round(linearScale(baselineValue, [min, max], [pixelHeight - 1, 0]));\n}\n","/**\n * Coordinate axis component\n *\n * Used for X-axis and Y-axis display in charts\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { defaultTickFormat } from './chartUtils';\n\n/**\n * Coordinate axis component props\n */\nexport interface AxisProps {\n /** Axis type */\n type: 'x' | 'y';\n\n /** Minimum data value */\n min: number;\n\n /** Maximum data value */\n max: number;\n\n /** Tick count (default 5) */\n tickCount?: number;\n\n /** Tick formatter function */\n tickFormat?: (value: number) => string;\n\n /** Axis label */\n label?: string;\n\n /** Axis length (character count) */\n length: number;\n\n /** Text color (default 'gray') */\n color?: string;\n\n /** Whether to show grid lines (default false) */\n showGrid?: boolean;\n\n /** Whether to force ticks to be integers (default false) */\n integerScale?: boolean;\n}\n\n/**\n * Coordinate axis component\n *\n * @example\n * // X-axis\n * <Axis type=\"x\" min={0} max={100} length={50} label=\"Time\" />\n *\n * // Y-axis\n * <Axis type=\"y\" min={0} max={100} length={10} label=\"Value\" />\n */\nexport const Axis: React.FC<AxisProps> = ({\n type,\n min,\n max,\n tickCount = 5,\n tickFormat = defaultTickFormat,\n label,\n length,\n color = 'gray',\n showGrid: _showGrid = false,\n integerScale = false,\n}) => {\n // Calculate tick values\n const ticks = useMemo(() => {\n if (tickCount <= 0) {\n return [];\n }\n\n // If max equals min, display only one tick\n if (max === min) {\n return [{ value: min, position: 0 }];\n }\n\n let effectiveTickCount = tickCount;\n let step = (max - min) / (tickCount - 1);\n\n if (integerScale) {\n // Simple integer adaptation logic: if step isn't an integer, try adjusting tickCount\n const range = max - min;\n if (range < tickCount - 1) {\n // Range is too small for many ticks, reduce tick count\n effectiveTickCount = range + 1;\n step = 1;\n } else {\n // Force step to be integer? Or allow non-integer step but approximate values via Math.round?\n // Users typically want to see evenly spaced integers.\n // simple Math.round can lead to uneven distribution (0, 3.5->4, 7... => 0 4 7 11 14).\n // Here 0-4=4, 4-7=3, 7-11=4... unequal spacing.\n // Better approach is to find step that divides range evenly, but this may change tickCount.\n // Here we use simple Math.round strategy, prioritizing display of integers.\n }\n }\n\n return Array.from({ length: effectiveTickCount }, (_, i) => {\n let value = min + i * step;\n if (integerScale) {\n value = Math.round(value);\n }\n\n // position represents distance from start (0).\n const position = ((value - min) / (max - min)) * length;\n return { value, position };\n });\n }, [min, max, tickCount, length, integerScale]);\n\n // X-axis: horizontal layout\n if (type === 'x') {\n // Construct a single line of labels with carefully calculated spacing\n const xConfig = (() => {\n let previousEnd = 0;\n const elements: React.ReactNode[] = [];\n\n ticks.forEach((tick, i) => {\n const tickLabel = tickFormat(tick.value);\n const labelWidth = tickLabel.length;\n // Center the tick: tick.position is the center.\n // Start of label = tick.position - labelWidth / 2.\n // Ensure we don't overlap or go negative relative to previous.\n const intendedStart = Math.floor(tick.position - labelWidth / 2);\n const actualStart = Math.max(previousEnd, intendedStart);\n const spaces = Math.max(0, actualStart - previousEnd);\n\n if (spaces > 0) {\n elements.push(<Text key={`space-${i}`}>{' '.repeat(spaces)}</Text>);\n }\n\n elements.push(\n <Text key={`tick-${i}`} color={color} wrap=\"truncate\">\n {tickLabel}\n </Text>,\n );\n\n previousEnd = actualStart + labelWidth;\n });\n\n return elements;\n })();\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">{xConfig}</Box>\n {/* Axis label (centered) */}\n {label && (\n <Box justifyContent=\"center\" marginTop={0}>\n {/* Centering label naively */}\n <Text color={color} dimColor>\n {label}\n </Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // Y-axis: vertical layout\n // We need to distribute ticks from TOP to BOTTOM.\n // Ticks array is Min -> Max.\n // Render: Max (Top) -> Min (Bottom).\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n height={length}\n justifyContent=\"space-between\"\n >\n {ticks\n .slice()\n .reverse() // Max to Min\n .map((tick, i) => (\n <Box key={`tick-${i}`}>\n <Text color={color} wrap=\"truncate\">\n {tickFormat(tick.value)}\n </Text>\n </Box>\n ))}\n\n {/* Axis label */}\n {/* If we want the label, it should be outside the height-constrained box or handled differently. */}\n {/* Current implementation put it inside the column, which would steal space. Move it out? */}\n {/* Actually, Y-Axis label usually goes to the left or top. Vertical text is hard. */}\n {/* Let's keep it simple: Ignore label inside the tick distribution box. */}\n </Box>\n );\n};\n","/**\n * Legend component\n *\n * Used to display chart legend\n */\n\nimport { Box, Text } from 'ink';\nimport React from 'react';\n\n/**\n * Legend item\n */\nexport interface LegendItem {\n /** Legend name */\n name: string;\n\n /** Legend color */\n color: string;\n\n /** Legend symbol (default '●') */\n symbol?: string;\n}\n\n/**\n * Legend component props\n */\nexport interface LegendProps {\n /** Legend items array */\n items: LegendItem[];\n\n /** Layout direction (default 'horizontal') */\n position?: 'horizontal' | 'vertical';\n\n /** Overall text color (defaults to each item's own color) */\n color?: string;\n\n /** Gap between legend items (default 2) */\n gap?: number;\n}\n\n/**\n * Legend component\n *\n * @example\n * // Horizontal legend\n * <Legend\n * items={[\n * { name: 'CPU', color: 'blue', symbol: '●' },\n * { name: 'Memory', color: 'green', symbol: '●' },\n * ]}\n * position=\"horizontal\"\n * />\n *\n * // Vertical legend\n * <Legend\n * items={[\n * { name: 'Series 1', color: 'cyan' },\n * { name: 'Series 2', color: 'yellow' },\n * ]}\n * position=\"vertical\"\n * />\n */\nexport const Legend: React.FC<LegendProps> = ({\n items,\n position = 'horizontal',\n color,\n gap = 2,\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Box flexDirection={position === 'horizontal' ? 'row' : 'column'} gap={gap}>\n {items.map((item, i) => (\n <Box key={`legend-${i}`} gap={1}>\n <Text color={color ?? item.color}>{item.symbol || '●'}</Text>\n <Text {...(color && { color })}>{item.name}</Text>\n </Box>\n ))}\n </Box>\n );\n};\n","/**\n * ChartContainer - Unified chart layout container component\n *\n * Unified layout structure for Y-axis + Canvas + X-axis + Legend\n */\n\nimport { Box, Text } from 'ink';\nimport React from 'react';\nimport { Axis, type AxisProps } from './Axis';\nimport { Legend, type LegendItem } from './Legend';\nimport type { ChartLayoutResult } from './chartUtils';\n\n/**\n * Axis configuration (excluding type and length fields, provided by ChartContainer)\n */\nexport type AxisConfig = Omit<AxisProps, 'type' | 'length'>;\n\n/**\n * ChartContainer component props\n */\nexport interface ChartContainerProps {\n /** Layout calculation result */\n layout: ChartLayoutResult;\n\n /** Whether to show X-axis */\n showXAxis?: boolean;\n /** Whether to show Y-axis */\n showYAxis?: boolean;\n\n /** X-axis configuration */\n xAxisConfig?: AxisConfig;\n /** Y-axis configuration */\n yAxisConfig?: AxisConfig;\n\n /** Whether to show legend */\n showLegend?: boolean;\n /** Legend position */\n legendPosition?: 'top' | 'bottom' | 'right';\n /** Legend items */\n legendItems?: LegendItem[];\n\n /** Canvas rendering content (coloredLines) */\n children: React.ReactNode;\n}\n\n/**\n * Render Canvas content (colored lines)\n */\nfunction renderCanvasLines(\n coloredLines: Array<Array<{ text: string; color?: string }>>,\n): React.ReactNode {\n return coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) =>\n segment.color ? (\n <Text key={`seg-${i}-${j}`} color={segment.color}>\n {segment.text}\n </Text>\n ) : (\n <Text key={`seg-${i}-${j}`}>{segment.text}</Text>\n ),\n )}\n </Text>\n ));\n}\n\n/**\n * ChartContainer - Unified chart layout container\n *\n * Eliminate redundant JSX layout code in LineChart, AreaChart, and BarChart\n */\nexport const ChartContainer: React.FC<ChartContainerProps> = ({\n layout,\n showXAxis = true,\n showYAxis = true,\n xAxisConfig,\n yAxisConfig,\n showLegend = true,\n legendPosition = 'right',\n legendItems = [],\n children,\n}) => {\n const { totalWidth, totalHeight, plotWidth, plotHeight, yAxisWidth } = layout;\n\n return (\n <Box flexDirection=\"column\" width={totalWidth} height={totalHeight}>\n {/* Top Legend */}\n {showLegend && legendPosition === 'top' && (\n <Box marginBottom={1} marginLeft={showYAxis ? yAxisWidth + 1 : 0}>\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n\n {/* Main Row: Y Axis + Canvas + Right Legend */}\n <Box flexDirection=\"row\">\n {/* Y Axis */}\n {showYAxis && yAxisConfig && (\n <Box marginRight={1} width={yAxisWidth}>\n <Axis type=\"y\" length={plotHeight} {...yAxisConfig} />\n </Box>\n )}\n\n {/* Canvas Content */}\n <Box flexDirection=\"column\">{children}</Box>\n\n {/* Right Legend */}\n {showLegend && legendPosition === 'right' && (\n <Box marginLeft={2}>\n <Legend items={legendItems} position=\"vertical\" />\n </Box>\n )}\n </Box>\n\n {/* X Axis */}\n {showXAxis && xAxisConfig && (\n <Box marginLeft={showYAxis ? yAxisWidth + 1 : 0}>\n <Axis type=\"x\" length={plotWidth} {...xAxisConfig} />\n </Box>\n )}\n\n {/* Bottom Legend */}\n {showLegend && legendPosition === 'bottom' && (\n <Box marginTop={1} marginLeft={showYAxis ? yAxisWidth + 1 : 0}>\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * Render coloredLines as React elements\n */\nexport { renderCanvasLines };\n","/**\n * useChartCore - Chart core data processing Hook\n *\n * Integrates data processing logic shared by all chart components\n */\n\nimport { useMemo } from 'react';\nimport { type ColorPalette } from '../../utils/gradient';\nimport type { LegendItem } from './Legend';\nimport {\n type ChartSeries,\n buildSeriesInputParams,\n computeSeriesExtent,\n resolveSeriesColors,\n resolveSeriesInput,\n} from './chartUtils';\n\n/**\n * Chart core Hook input parameters\n */\nexport interface ChartCoreProps {\n /** Multi-series data */\n series?: ChartSeries[];\n /** Single-series data (simplified) */\n data?: number[];\n /** Single-series name (simplified) */\n seriesName?: string;\n /** Color array */\n colors?: string[];\n /** Color palette */\n colorPalette?: ColorPalette;\n}\n\n/**\n * Chart core Hook return value\n */\nexport interface ChartCoreResult {\n /** Parsed series data */\n series: ChartSeries[];\n /** Minimum data value */\n min: number;\n /** Maximum data value */\n max: number;\n /** Maximum data point length */\n maxLength: number;\n /** Series color array */\n colors: string[];\n /** Legend items */\n legendItems: LegendItem[];\n}\n\n/**\n * Chart core data processing Hook\n *\n * Integrates the following common logic:\n * - Data series parsing\n * - Data range calculation\n * - Color assignment\n * - Legend item construction\n */\nexport function useChartCore(props: ChartCoreProps): ChartCoreResult {\n const { series: seriesProp, data, seriesName, colors: colorsProp, colorPalette } = props;\n\n // 1. Parse series data\n const series = useMemo(\n () => resolveSeriesInput(buildSeriesInputParams(seriesProp, data, seriesName)),\n [seriesProp, data, seriesName],\n );\n\n // 2. Calculate data range\n const { min, max, maxLength } = useMemo(() => computeSeriesExtent(series), [series]);\n\n // 3. Assign colors\n const colors = useMemo(\n () => resolveSeriesColors(series, colorsProp, colorPalette),\n [series, colorsProp, colorPalette],\n );\n\n // 4. Build legend items\n const legendItems = useMemo(\n () =>\n series.map((item, i) => ({\n name: item.name,\n color: item.color ?? colors[i] ?? 'cyan',\n symbol: '●',\n })),\n [series, colors],\n );\n\n return {\n series,\n min,\n max,\n maxLength,\n colors,\n legendItems,\n };\n}\n","/**\n * useChartRenderer - Chart renderer selection Hook\n */\n\nimport { useMemo } from 'react';\nimport type { Renderer, RendererType } from '../../core/renderer';\nimport { useInkHud } from '../InkHudProvider';\n\n/**\n * Renderer Hook input parameters\n */\nexport interface ChartRendererProps {\n /** Manually specify Renderer type */\n renderer?: RendererType;\n /** Renderer fallback chain */\n rendererChain?: RendererType[];\n}\n\n/**\n * Default renderer fallback chain\n */\nexport const DEFAULT_RENDERER_CHAIN: RendererType[] = ['braille', 'block', 'ascii'];\n\n/**\n * BarChart default renderer fallback chain (prefer block)\n */\nexport const BAR_CHART_RENDERER_CHAIN: RendererType[] = ['block', 'braille', 'ascii'];\n\n/**\n * Chart renderer selection Hook\n *\n * Automatically select optimal renderer based on user specification or terminal capabilities\n * Get renderer selector via Context, supports dependency injection\n */\nexport function useChartRenderer(\n props: ChartRendererProps,\n defaultChain: RendererType[] = DEFAULT_RENDERER_CHAIN,\n): Renderer {\n const { getRenderer, selectBest } = useInkHud();\n\n const { renderer: preferredRenderer, rendererChain = defaultChain } = props;\n\n return useMemo(() => {\n if (preferredRenderer) {\n return getRenderer(preferredRenderer);\n }\n return selectBest(rendererChain);\n }, [preferredRenderer, rendererChain, getRenderer, selectBest]);\n}\n","/**\n * LineChart - Basic line chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport { defaultTickFormat, getPixelDimensions, useChartLayoutSimple } from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { DEFAULT_RENDERER_CHAIN, useChartRenderer } from './common/useChartRenderer';\n\n/**\n * LineChart component props\n */\nexport type LineChartProps = TimeSeriesChartProps;\n\nexport const LineChart: React.FC<LineChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n rendererChain = DEFAULT_RENDERER_CHAIN,\n xIntegerScale = true,\n yIntegerScale = false,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Use common Hooks\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer(props, rendererChain);\n\n // 2. Layout calculation (use simplified API)\n const layout = useChartLayoutSimple(props, min, max);\n\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Draw line chart (component-specific logic)\n const coloredLines = useMemo(\n () =>\n renderLineChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n colors,\n }),\n [renderer, series, canvasWidth, canvasHeight, min, max, colors],\n );\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n // 4. Build AxisConfig\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n ...(xIntegerScale !== undefined && { integerScale: xIntegerScale }),\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n // 5. Assemble\n return (\n <ChartContainer\n layout={layout}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n >\n {coloredLines.map((line, i) => (\n <Text key={i}>\n {line.map((seg, j) => (\n <Text\n key={j}\n {...(seg.color ? { color: seg.color } : {})}\n {...(seg.backgroundColor\n ? { backgroundColor: seg.backgroundColor }\n : {})}\n >\n {seg.text}\n </Text>\n ))}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n\n// ===== Internal rendering logic =====\n\ninterface RenderLineChartParams {\n renderer: ReturnType<typeof useChartRenderer>;\n series: Array<{ name: string; data: number[]; color?: string }>;\n canvasWidth: number;\n canvasHeight: number;\n min: number;\n max: number;\n colors: string[];\n}\n\nfunction renderLineChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n colors,\n}: RenderLineChartParams) {\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWidth, canvasHeight);\n\n if (pixelWidth <= 0 || pixelHeight <= 0 || series.length === 0) {\n return [];\n }\n\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n for (let si = 0; si < series.length; si++) {\n const s = series[si];\n if (!s) continue;\n\n const { data } = s;\n const color = s.color ?? colors[si] ?? 'cyan';\n\n if (data.length === 0) continue;\n\n // Calculate pixel position for each data point\n const xScale = data.length > 1 ? (pixelWidth - 1) / (data.length - 1) : 0;\n\n const scaleY = (value: number): number => {\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n return Math.round(linearScale(value, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Draw line segments\n for (let i = 0; i < data.length - 1; i++) {\n const currVal = data[i];\n const nextVal = data[i + 1];\n\n if (currVal === undefined || nextVal === undefined) continue;\n\n const x0 = Math.round(i * xScale);\n const y0 = scaleY(currVal);\n const x1 = Math.round((i + 1) * xScale);\n const y1 = scaleY(nextVal);\n\n renderer.drawLine(canvas, x0, y0, x1, y1, { active: true, color });\n }\n\n // If only one point, draw separately\n if (data.length === 1) {\n const val = data[0];\n if (val !== undefined) {\n const x = Math.round(pixelWidth / 2);\n const y = scaleY(val);\n renderer.setPixel(canvas, x, y, { active: true, color });\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n","/**\n * AreaChart - Basic area chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport {\n type ChartSeries,\n computeBaselineY,\n defaultTickFormat,\n getPixelDimensions,\n useChartLayoutSimple,\n} from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { DEFAULT_RENDERER_CHAIN, useChartRenderer } from './common/useChartRenderer';\n\n/**\n * AreaChart component props\n */\nexport type AreaChartProps = TimeSeriesChartProps;\n\n/**\n * Fill area between two Y values at a given X position\n */\nfunction fillVerticalLine(\n renderer: ReturnType<typeof useChartRenderer>,\n canvas: ReturnType<ReturnType<typeof useChartRenderer>['createCanvas']>,\n x: number,\n y1: number,\n y2: number,\n color?: string,\n): void {\n const fillStart = Math.min(y1, y2);\n const fillEnd = Math.max(y1, y2);\n for (let fy = fillStart; fy <= fillEnd; fy++) {\n renderer.setPixel(canvas, x, fy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n}\n\n/**\n * Render area chart drawing logic\n */\nfunction renderAreaChartCanvas(params: {\n renderer: ReturnType<typeof useChartRenderer>;\n series: ChartSeries[];\n canvasWidth: number;\n canvasHeight: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}): Array<Array<{ text: string; color?: string }>> {\n const { renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors } = params;\n\n if (series.length === 0 || maxLength === 0) {\n return [];\n }\n\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWidth, canvasHeight);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n const baselineY = computeBaselineY({ min, max, pixelHeight });\n const xStep = maxLength > 1 ? (pixelWidth - 1) / (maxLength - 1) : 0;\n\n const scaleValue = (value: number): number => {\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n return Math.round(linearScale(value, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Sort series by max value (descending) to draw largest areas first (background)\n const sortedData = series\n .map((s, i) => {\n const maxVal = Math.max(...s.data);\n return { series: s, color: colors[i], maxVal };\n })\n .sort((a, b) => b.maxVal - a.maxVal);\n\n for (const { series: item, color } of sortedData) {\n let prevPoint: { x: number; y: number } | null = null;\n\n for (let idx = 0; idx < item.data.length; idx++) {\n const value = item.data[idx];\n if (value === undefined) continue;\n const point = { x: Math.round(idx * xStep), y: scaleValue(value) };\n\n if (prevPoint) {\n const startX = Math.min(prevPoint.x, point.x);\n const endX = Math.max(prevPoint.x, point.x);\n\n for (let px = startX; px <= endX; px++) {\n const t = endX === startX ? 0 : (px - prevPoint.x) / (point.x - prevPoint.x);\n const py = Math.floor(prevPoint.y + (point.y - prevPoint.y) * t);\n fillVerticalLine(renderer, canvas, px, py, baselineY, color);\n }\n renderer.drawLine(canvas, prevPoint.x, prevPoint.y, point.x, point.y, {\n active: true,\n ...(color ? { color } : {}),\n });\n } else {\n fillVerticalLine(renderer, canvas, point.x, point.y, baselineY, color);\n }\n prevPoint = point;\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\nexport const AreaChart: React.FC<AreaChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n rendererChain = DEFAULT_RENDERER_CHAIN,\n xIntegerScale = true,\n yIntegerScale = false,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Use common Hooks\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer(props, rendererChain);\n\n // 2. Layout calculation (use simplified API)\n const layout = useChartLayoutSimple(props, min, max);\n\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Draw area chart (component-specific logic)\n const coloredLines = useMemo(\n () =>\n renderAreaChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n maxLength,\n colors,\n }),\n [renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors],\n );\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n // 4. Use unified container rendering\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n ...(xIntegerScale !== undefined && { integerScale: xIntegerScale }),\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n return (\n <ChartContainer\n layout={layout}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n >\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) =>\n segment.color ? (\n <Text key={`seg-${i}-${j}`} color={segment.color}>\n {segment.text}\n </Text>\n ) : (\n <Text key={`seg-${i}-${j}`}>{segment.text}</Text>\n ),\n )}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n","/**\n * BarChart Basic bar chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport type { Renderer } from '../core/renderer';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport {\n type ChartSeries,\n computeBaselineY,\n defaultTickFormat,\n getPixelDimensions,\n useChartLayoutSimple,\n} from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { BAR_CHART_RENDERER_CHAIN, useChartRenderer } from './common/useChartRenderer';\n\n// ============================================================================\n// Layout Helpers (Pure Functions)\n// ============================================================================\n\nconst alignDown = (val: number, alignment: number) => Math.floor(val / alignment) * alignment;\n\n/**\n * Vertical Layout Calculation\n * X-Axis partitioning.\n */\nfunction computeVerticalLayout(params: {\n pixelWidth: number;\n categoryCount: number;\n seriesCount: number;\n alignment: number; // Horizontal resolution (usually 1 or 2)\n}): { groupWidth: number; barWidth: number; barGap: number; groupPadding: number } {\n const { pixelWidth, categoryCount, seriesCount, alignment } = params;\n\n // 1. Calculate max possible group width across the canvas\n const maxGroupWidth = alignDown(\n Math.max(alignment, Math.floor(pixelWidth / Math.max(1, categoryCount))),\n alignment,\n );\n const groupWidth = maxGroupWidth;\n\n // Internal helper to calculate layout for a specific padding\n const calculateForPadding = (p: number) => {\n const available = groupWidth - p * 2;\n // Need at least 1 alignment unit per bar\n const minNeed = seriesCount * alignment;\n if (available < minNeed) return null;\n\n const gap =\n available >= seriesCount * alignment + (seriesCount - 1) * alignment ? alignment : 0;\n const totalGap = gap * (seriesCount - 1);\n const remaining = available - totalGap;\n\n let barWidth = Math.floor(remaining / seriesCount);\n // Ensure barWidth is aligned (even values for Block)\n barWidth = alignDown(barWidth, alignment);\n\n if (barWidth < alignment) return null;\n\n return { groupWidth, barWidth, barGap: gap, groupPadding: p };\n };\n\n // 2. Strategy Comparison\n // Strategy A: Standard Padding (Breathing room)\n const paddingStandard = alignment;\n const layoutStandard = calculateForPadding(paddingStandard);\n\n // Strategy B: Compact (Max Width)\n const layoutCompact = calculateForPadding(0);\n\n // Decision:\n // 1. If Standard is invalid, must use Compact.\n if (!layoutStandard) {\n return layoutCompact ?? { groupWidth, barWidth: alignment, barGap: 0, groupPadding: 0 };\n }\n\n // 2. If Compact is invalid (shouldn't happen if Standard is valid, but safety), use Standard.\n if (!layoutCompact) {\n return layoutStandard;\n }\n\n // 3. Maximize Bar Width:\n // If Compact gives us strictly WIDER bars, we sacrifice padding to get fat bars.\n // e.g. Standard: Bar=2. Compact: Bar=4. -> Choose Compact.\n if (layoutCompact.barWidth > layoutStandard.barWidth) {\n return layoutCompact;\n }\n\n // Otherwise prefer breathing room\n return layoutStandard;\n}\n\n/**\n * Horizontal Layout Calculation\n * Y-Axis partitioning.\n * Critical for Block Rendering (Alignment 8).\n */\nfunction computeHorizontalLayout(params: {\n pixelHeight: number;\n categoryCount: number;\n seriesCount: number;\n alignment: number; // Vertical resolution (usually 8 for Block, 3 for Ascii, 4 for Braille)\n}): { groupHeight: number; barHeight: number; barGap: number; groupPadding: number } {\n const { pixelHeight, categoryCount, seriesCount, alignment } = params;\n\n // 1. Calculate max possible height per category\n const maxGroupHeight = alignDown(\n Math.max(alignment, Math.floor(pixelHeight / Math.max(1, categoryCount))),\n alignment,\n );\n\n // 2. Strict Block Logic (High Alignment)\n if (alignment >= 4) {\n // With high alignment (e.g. 8px), we have limited vertical canvas.\n // Preventing gaps is priority #1 to avoid seeing \"scanlines\".\n\n // Calculate the absolute minimum stack height needed for one group\n // assuming minimum bar height (1 alignment unit) and NO gaps.\n const stackHeight = seriesCount * alignment;\n\n // Case A: The assigned group space is just enough or barely tight.\n // We force Tight Layout: GroupHeight = StackHeight.\n // This eliminates \"Slack\" (unused pixels) inside the group logic, pushing all slack to the end of the chart.\n const groupHeight = Math.max(alignment, stackHeight);\n\n return {\n groupHeight: groupHeight, // Strictly tight\n barHeight: alignment, // Min thickness (1 block char)\n barGap: 0, // No gaps\n groupPadding: 0, // No padding\n };\n }\n\n // 3. Standard Logic (Low Alignment, e.g. Ascii/Braille or purely pixel-based)\n // Similar to vertical logic: try to add padding/gaps if space allows.\n const padding = alignment;\n\n // ... logic similar to vertical but simpler ...\n // For simplicity, just use a compact strategy for horizontal to maximize label readability space usually\n // But here we are just drawing bars.\n\n // For non-block renderers, we can try to be nice.\n const available = maxGroupHeight - padding * 2;\n if (available > seriesCount * alignment * 1.5) {\n // Enough space for padding\n const gap = alignment;\n const barHeight = alignDown(\n Math.floor((available - gap * (seriesCount - 1)) / seriesCount),\n alignment,\n );\n return { groupHeight: maxGroupHeight, barHeight, barGap: gap, groupPadding: padding };\n }\n\n // Compact fallback\n const availableCompact = maxGroupHeight;\n const barHeightCompact = alignDown(Math.floor(availableCompact / seriesCount), alignment);\n return { groupHeight: maxGroupHeight, barHeight: barHeightCompact, barGap: 0, groupPadding: 0 };\n}\n\n// ============================================================================\n// Renderers\n// ============================================================================\n\nfunction renderVertical(params: {\n renderer: Renderer;\n series: ChartSeries[];\n width: number;\n height: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}) {\n const { renderer, series, width, height, min, max, maxLength, colors } = params;\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, width, height);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n const resolution = renderer.getResolution();\n const alignment = resolution.horizontal;\n\n // Layout\n const { groupWidth, barWidth, barGap, groupPadding } = computeVerticalLayout({\n pixelWidth,\n categoryCount: maxLength,\n seriesCount: series.length,\n alignment,\n });\n\n const baselineY = computeBaselineY({ min, max, pixelHeight });\n const scaleValue = (val: number) => {\n if (max === min) return Math.round((pixelHeight - 1) / 2);\n return Math.round(linearScale(val, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Render\n for (let i = 0; i < maxLength; i++) {\n const groupLeft = i * groupWidth + groupPadding;\n for (let j = 0; j < series.length; j++) {\n const val = series[j]?.data[i] ?? 0;\n const yVal = scaleValue(val);\n const x = groupLeft + j * (barWidth + barGap);\n const xEnd = Math.min(pixelWidth - 1, x + barWidth - 1);\n\n const yStart = Math.min(yVal, baselineY);\n const yEnd = Math.max(yVal, baselineY);\n const color = colors[j];\n\n for (let yy = yStart; yy <= yEnd; yy++) {\n for (let xx = x; xx <= xEnd; xx++) {\n renderer.setPixel(canvas, xx, yy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n }\n }\n }\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\nfunction renderHorizontal(params: {\n renderer: Renderer;\n series: ChartSeries[];\n width: number;\n height: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}) {\n const { renderer, series, width, height, min, max, maxLength, colors } = params;\n\n const resolution = renderer.getResolution();\n\n const pixelWidth = width * resolution.horizontal;\n const pixelHeight = height * resolution.vertical;\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n // Vertical alignment (Thickness of horizontal bar)\n const alignment = resolution.vertical;\n\n // Layout\n const { groupHeight, barHeight, barGap, groupPadding } = computeHorizontalLayout({\n pixelHeight,\n categoryCount: maxLength,\n seriesCount: series.length,\n alignment,\n });\n\n // Scale X\n const scaleValue = (val: number) => {\n if (max === min) return Math.round((pixelWidth - 1) / 2);\n return Math.round(linearScale(val, [min, max], [0, pixelWidth - 1]));\n };\n\n // Baseline X\n let baselineVal = 0;\n if (min > 0) baselineVal = min;\n else if (max < 0) baselineVal = max;\n const baselineX = scaleValue(baselineVal);\n\n // Render\n // Note: We use the *calculated* groupHeight for rendering positions strictly.\n // This allows the \"Tight Layout\" to act effectively.\n for (let i = 0; i < maxLength; i++) {\n const groupTop = i * groupHeight + groupPadding;\n for (let j = 0; j < series.length; j++) {\n const val = series[j]?.data[i] ?? 0;\n const xVal = scaleValue(val);\n\n const y = groupTop + j * (barHeight + barGap);\n const yEnd = Math.min(pixelHeight - 1, y + barHeight - 1); // Clamp to canvas\n\n // Check if we are checking out of bounds (which safe tightening prevents, but for safety)\n if (y >= pixelHeight) continue;\n\n const xStart = Math.min(xVal, baselineX);\n const xEndFill = Math.max(xVal, baselineX);\n const color = colors[j];\n\n for (let yy = y; yy <= yEnd; yy++) {\n for (let xx = xStart; xx <= xEndFill; xx++) {\n renderer.setPixel(canvas, xx, yy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * BarChart component props\n */\nexport type BarChartProps = TimeSeriesChartProps & {\n /** Orientation (default 'vertical') */\n orientation?: 'vertical' | 'horizontal';\n};\n\nexport const BarChart: React.FC<BarChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n orientation = 'vertical',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n rendererChain = BAR_CHART_RENDERER_CHAIN,\n xIntegerScale,\n yIntegerScale,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Core Data\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer(props, rendererChain);\n\n // 2. Layout\n const layout = useChartLayoutSimple(props, min, max);\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Render Chart Lines\n const coloredLines = useMemo(() => {\n if (series.length === 0 || maxLength === 0) return [];\n\n if (orientation === 'horizontal') {\n return renderHorizontal({\n renderer,\n series,\n width: canvasWidth,\n height: canvasHeight,\n min,\n max,\n maxLength,\n colors,\n });\n }\n return renderVertical({\n renderer,\n series,\n width: canvasWidth,\n height: canvasHeight,\n min,\n max,\n maxLength,\n colors,\n });\n }, [renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors, orientation]);\n\n if (coloredLines.length === 0) return null;\n\n // 4. Wrapped Result\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n integerScale: xIntegerScale ?? true,\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n return (\n <ChartContainer\n layout={layout}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n >\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) => (\n <Text\n key={`seg-${i}-${j}`}\n {...(segment.color ? { color: segment.color } : {})}\n {...(segment.backgroundColor\n ? { backgroundColor: segment.backgroundColor }\n : {})}\n >\n {segment.text}\n </Text>\n ))}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n","/**\n * PieChart Pie chart component\n *\n * Basic pie chart display with built-in legend\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport type { RendererType } from '../core/renderer';\nimport { type ColorPalette, assignColors } from '../utils/gradient';\nimport { useInkHud } from './InkHudProvider';\nimport { Legend } from './common/Legend';\nimport { getPixelDimensions, useChartLayoutSimple } from './common/chartUtils';\n\n/**\n * PieChart data item\n */\nexport interface PieChartDataItem {\n /** Name */\n name: string;\n /** Value */\n value: number;\n /** Color (optional, auto-assigned if not specified) */\n color?: string;\n}\n\n/**\n * PieChart component props\n */\nexport interface PieChartProps {\n /**\n * Data array - supports two formats:\n * 1. Simplified mode: number[] (requires labels)\n * 2. Detailed mode: PieChartDataItem[]\n */\n data?: number[] | PieChartDataItem[];\n\n /**\n * Label array (used in simplified mode)\n * When used with data: number[], provides name for each value\n */\n labels?: string[];\n\n /** Chart width (character count, default 30) */\n width?: number;\n\n /** Chart height (character lines, default 15) */\n height?: number;\n\n /** Outer radius (pixels, auto-calculated by default) */\n radius?: number;\n\n /** Aspect ratio correction (default 2) */\n aspectRatio?: number;\n\n /** Donut inner radius ratio (0-1, default 0) */\n donutRatio?: number;\n\n /** Whether to show percentage labels (default false) */\n showLabels?: boolean;\n\n /** Whether to show legend (default true) */\n showLegend?: boolean;\n\n /** Legend position (default 'right') */\n legendPosition?: 'right' | 'bottom';\n\n /** Color array (auto-assigned if not specified) */\n colors?: string[];\n\n /** Palette name or custom color array */\n colorPalette?: ColorPalette;\n\n /** Manually specify renderer type (optional) */\n renderer?: RendererType;\n\n /** Custom renderer fallback chain (default: ['braille', 'block', 'ascii']) */\n rendererChain?: RendererType[];\n\n /**\n * Height offset\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n heightOffset?: number;\n\n /**\n * Width offset\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n widthOffset?: number;\n}\n\n/**\n * Parse data input, unify to PieChartDataItem[] format\n */\nfunction resolveDataItems(\n data: number[] | PieChartDataItem[] | undefined,\n labels?: string[],\n): PieChartDataItem[] {\n if (!data || data.length === 0) {\n return [];\n }\n\n // Check if simplified mode (number[])\n if (typeof data[0] === 'number') {\n return (data as number[]).map((value, i) => ({\n name: labels?.[i] ?? `Item ${i + 1}`,\n value,\n }));\n }\n\n // Detailed mode (PieChartDataItem[])\n return data as PieChartDataItem[];\n}\n\nconst TWO_PI = Math.PI * 2;\nconst START_ANGLE = -Math.PI / 2;\n\nfunction resolveRadius(\n pixelWidth: number,\n pixelHeight: number,\n customRadius: number | undefined,\n): { centerX: number; centerY: number; radius: number } {\n const centerX = Math.floor(pixelWidth / 2);\n const centerY = Math.floor(pixelHeight / 2);\n const maxRadius = Math.max(\n 0,\n Math.min(Math.floor(pixelWidth / 2) - 1, Math.floor(pixelHeight / 2) - 1),\n );\n const radius = customRadius ?? maxRadius;\n\n return { centerX, centerY, radius };\n}\n\nfunction buildAngleStops(\n data: PieChartDataItem[],\n total: number,\n): Array<{ index: number; end: number }> {\n if (total <= 0) {\n return [];\n }\n\n const stops: Array<{ index: number; end: number }> = [];\n let current = 0;\n data.forEach((item, index) => {\n if (item.value <= 0) {\n return;\n }\n current += (item.value / total) * TWO_PI;\n stops.push({ index, end: current });\n });\n\n return stops;\n}\n\nfunction resolveSliceIndex(\n angle: number,\n stops: Array<{ index: number; end: number }>,\n): number | null {\n if (stops.length === 0) {\n return null;\n }\n\n for (const stop of stops) {\n if (angle <= stop.end) {\n return stop.index;\n }\n }\n return stops[stops.length - 1]?.index ?? null;\n}\n\n/**\n * PieChart Pie chart component\n */\nexport const PieChart: React.FC<PieChartProps> = ({\n data: dataProp,\n labels,\n width,\n height,\n radius: customRadius,\n aspectRatio,\n donutRatio = 0,\n showLabels = false,\n showLegend = true,\n legendPosition = 'right',\n colors,\n colorPalette,\n renderer: preferredRenderer,\n rendererChain = ['braille', 'block', 'ascii'],\n heightOffset = 0,\n widthOffset = 0,\n}) => {\n // Parse data input\n const data = useMemo(() => resolveDataItems(dataProp, labels), [dataProp, labels]);\n\n // 1. Layout calculation (Use simplified API, disable axes)\n const layout = useChartLayoutSimple(\n {\n ...(width !== undefined && { width }),\n ...(height !== undefined && { height }),\n showAxis: false,\n showLegend,\n legendPosition,\n widthOffset,\n heightOffset,\n },\n 0,\n 0,\n );\n\n const { totalWidth, plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n const { getRenderer, selectBest } = useInkHud();\n\n const renderer = useMemo(() => {\n if (preferredRenderer) {\n return getRenderer(preferredRenderer);\n }\n return selectBest(rendererChain);\n }, [preferredRenderer, rendererChain, getRenderer, selectBest]);\n\n // Calculate aspect ratio dynamically if not provided\n const ratio = useMemo(() => {\n if (aspectRatio !== undefined) return aspectRatio;\n const resolution = renderer.getResolution();\n // Standard terminal character is ~2:1 (Height:Width).\n // Correction = 2 * (PixelWidth / PixelHeight)\n // e.g. Braille (2x4): 2 * (2/4) = 1.0 (Square pixels)\n // e.g. Block (2x8): 2 * (2/8) = 0.5 (Wide pixels)\n return 2 * (resolution.horizontal / resolution.vertical);\n }, [aspectRatio, renderer]);\n\n const itemColors = useMemo(() => {\n if (colors && colors.length >= data.length) {\n return colors;\n }\n if (colors && colors.length > 0) {\n return assignColors(data.length, colors);\n }\n return assignColors(data.length, colorPalette);\n }, [data.length, colors, colorPalette]);\n\n const { total, percentages } = useMemo(() => {\n const sum = data.reduce((acc, item) => acc + item.value, 0);\n const pcts = data.map((item) => (sum > 0 ? (item.value / sum) * 100 : 0));\n return { total: sum, percentages: pcts };\n }, [data]);\n\n const coloredLines = useMemo(() => {\n if (data.length === 0 || total <= 0) {\n return [];\n }\n\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWidth, canvasHeight);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n const {\n centerX,\n centerY,\n radius: outerRadius,\n } = resolveRadius(pixelWidth, pixelHeight, customRadius);\n\n const innerRadius = outerRadius * donutRatio;\n const angleStops = buildAngleStops(data, total);\n\n // Unified rendering loop: calculate slice for each pixel and set color\n // No longer care if renderer uses ASCII or Braille, Renderer handles this\n for (let y = 0; y < pixelHeight; y++) {\n const dy = (y - centerY) * ratio; // Apply aspect ratio correction\n for (let x = 0; x < pixelWidth; x++) {\n const dx = x - centerX;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance > outerRadius || distance < innerRadius) {\n continue;\n }\n\n const angle = (Math.atan2(dy, dx) - START_ANGLE + TWO_PI) % TWO_PI;\n const sliceIndex = resolveSliceIndex(angle, angleStops);\n\n if (sliceIndex !== null) {\n const color = data[sliceIndex]?.color ?? itemColors[sliceIndex];\n if (color) {\n renderer.setPixel(canvas, x, y, { active: true, color });\n }\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n }, [\n data,\n total,\n renderer,\n canvasWidth,\n canvasHeight,\n customRadius,\n ratio,\n donutRatio,\n itemColors,\n ]);\n\n const legendItems = useMemo(() => {\n return data.map((item, i) => ({\n name: showLabels ? `${item.name} (${percentages[i]?.toFixed(1)}%)` : item.name,\n color: item.color ?? itemColors[i] ?? 'cyan',\n symbol: '●',\n }));\n }, [data, itemColors, showLabels, percentages]);\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n return (\n <Box flexDirection=\"column\" width={totalWidth} height={layout.totalHeight}>\n <Box flexDirection=\"row\" justifyContent=\"center\">\n <Box flexDirection=\"column\" width={canvasWidth}>\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) => (\n <Text\n key={`seg-${i}-${j}`}\n {...(segment.color ? { color: segment.color } : {})}\n {...(segment.backgroundColor\n ? { backgroundColor: segment.backgroundColor }\n : {})}\n >\n {segment.text}\n </Text>\n ))}\n </Text>\n ))}\n </Box>\n\n {showLegend && legendPosition === 'right' && (\n <Box marginLeft={2}>\n <Legend items={legendItems} position=\"vertical\" />\n </Box>\n )}\n </Box>\n\n {showLegend && legendPosition === 'bottom' && (\n <Box marginTop={1}>\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Sparkline - Mini trend chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useContext, useMemo } from 'react';\nimport { lttb } from '../utils/downsampling';\nimport { GridItemContext } from './Grid';\n\n/**\n * Unicode block characters for sparkline (levels 1-8)\n * U+2581 to U+2588\n */\nconst SPARK_LEVELS_BLOCK = [' ', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\n/**\n * Braille characters for sparkline (progressive fill)\n */\nconst SPARK_LEVELS_BRAILLE = ['⠀', '⡀', '⣀', '⣄', '⣤', '⣦', '⣶', '⣷', '⣿'];\n\n/**\n * ASCII characters for sparkline (density map)\n */\nconst SPARK_LEVELS_ASCII = [' ', '.', ':', '-', '=', '+', '*', '#', '%', '@'];\n\nexport interface SparklineProps {\n /** Array of data points */\n data: number[];\n\n /**\n * Target width (character count)\n * If number of data points exceeds width, will automatically use LTTB algorithm for downsampling\n * If not provided, width will equal the number of data points\n */\n width?: number;\n\n /** Minimum value (default: calculation from data) */\n min?: number;\n\n /** Maximum value (default: calculation from data) */\n max?: number;\n\n /** Color */\n color?: string;\n\n /** Rendering style (default: 'block') */\n variant?: 'block' | 'braille' | 'ascii';\n}\n\nexport const Sparkline: React.FC<SparklineProps> = ({\n data,\n width: propsWidth,\n min: userMin,\n max: userMax,\n color,\n variant = 'block',\n}) => {\n // Get width from Grid context\n const gridContext = useContext(GridItemContext);\n const effectiveWidth = propsWidth ?? gridContext?.width;\n\n const text = useMemo(() => {\n if (!data || data.length === 0) return '';\n\n // If width limit exists and data points exceed width, perform downsampling\n let processedData = data;\n if (effectiveWidth && data.length > effectiveWidth) {\n processedData = lttb(data, effectiveWidth);\n }\n\n const min = userMin ?? Math.min(...processedData);\n let max = userMax ?? Math.max(...processedData);\n\n // Avoid division by zero if all values are equal\n if (max === min) {\n max = min + 1;\n }\n\n const levels =\n variant === 'braille'\n ? SPARK_LEVELS_BRAILLE\n : variant === 'ascii'\n ? SPARK_LEVELS_ASCII\n : SPARK_LEVELS_BLOCK;\n\n return processedData\n .map((v) => {\n // Clamping\n const value = Math.max(min, Math.min(max, v));\n\n // Map to 0..levels.length-1 range\n const normalized = (value - min) / (max - min);\n const index = Math.round(normalized * (levels.length - 1));\n\n return levels[index];\n })\n .join('');\n }, [data, effectiveWidth, userMin, userMax, variant]);\n\n return <Text {...(color ? { color } : {})}>{text}</Text>;\n};\n","import { Box, type BoxProps, Text } from 'ink';\nimport React from 'react';\nimport { GridItemContext } from './Grid';\n\nexport interface PanelProps {\n /**\n * Panel title\n */\n title?: string;\n\n /**\n * Title alignment\n * @default 'left'\n */\n titleAlignment?: 'left' | 'center' | 'right';\n\n /**\n * Border style\n * @default 'round'\n */\n borderStyle?: BoxProps['borderStyle'];\n\n /**\n * Border color\n * @default 'white'\n */\n borderColor?: string;\n\n /**\n * Content padding\n * @default 0\n */\n padding?: number;\n\n /**\n * Panel width\n */\n width?: number | string;\n\n /**\n * Panel height\n */\n height?: number | string;\n\n /**\n * Children (content)\n */\n children: React.ReactNode;\n}\n\n/**\n * Panel - Card component with title and border\n *\n * Unified encapsulation of borders, titles, and padding, supporting various border styles.\n */\nexport const Panel: React.FC<PanelProps> = ({\n title,\n titleAlignment = 'left',\n borderStyle = 'round',\n borderColor,\n padding = 0,\n width,\n height,\n children,\n}) => {\n // 1. Resolve dimensions from props or context\n const gridContext = React.useContext(GridItemContext);\n\n // Effective dimensions (Outer dimensions of the Panel)\n const effectiveWidth = width ?? gridContext?.width;\n const effectiveHeight = height ?? gridContext?.height;\n\n // 2. Calculate inner available space for children\n // If we have explicit or context dimensions, subtract borders and padding\n // Border always consumes 2 units (1 left, 1 right / 1 top, 1 bottom) if active\n // Standard Ink Box border consumes space.\n const borderOverhead = borderStyle ? 2 : 0;\n const paddingOverhead = padding * 2;\n const totalOverhead = borderOverhead + paddingOverhead;\n\n const innerWidth =\n typeof effectiveWidth === 'number'\n ? Math.max(0, effectiveWidth - totalOverhead)\n : undefined;\n\n const innerHeight =\n typeof effectiveHeight === 'number'\n ? Math.max(0, effectiveHeight - totalOverhead)\n : undefined;\n\n // 3. Prepare Box props\n const boxProps: BoxProps = {\n borderStyle,\n flexDirection: 'column',\n ...(effectiveWidth !== undefined && { width: effectiveWidth }),\n ...(effectiveHeight !== undefined && { height: effectiveHeight }),\n ...(borderColor !== undefined && { borderColor }),\n };\n\n // 4. Update Context for children\n // We memoize the context value to prevent unnecessary re-renders\n // Note: If height is a string (like '100%'), we can't calculate innerHeight,\n // but we should still pass meaningfully to children\n const childContext = React.useMemo(\n () => ({\n ...(innerWidth !== undefined ? { width: innerWidth } : {}),\n // Pass innerHeight if calculated, or pass the raw effectiveHeight for reference\n // This allows children to know at least that a height constraint exists\n height:\n innerHeight ?? (typeof effectiveHeight === 'string' ? effectiveHeight : undefined),\n }),\n [innerWidth, innerHeight, effectiveHeight],\n );\n\n // Note: If innerWidth is undefined (e.g. Panel width is '100%'), we might not be able to pass a number.\n // However, chartUtils useChartLayout falls back to defaultWidth if context width is missing.\n // Ideally we pass what we know.\n\n return (\n <GridItemContext.Provider value={childContext}>\n <Box {...boxProps}>\n {title && (\n <Box\n position=\"absolute\"\n marginTop={-1}\n width=\"100%\"\n paddingX={2}\n justifyContent={\n titleAlignment === 'center'\n ? 'center'\n : titleAlignment === 'right'\n ? 'flex-end'\n : 'flex-start'\n }\n >\n <Text bold color={borderColor || 'white'}>\n {' '}\n {title}{' '}\n </Text>\n </Box>\n )}\n <Box padding={padding} flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n </Box>\n </GridItemContext.Provider>\n );\n};\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeContext';\n\n/**\n * Character set configuration\n */\nconst CHAR_SETS = {\n unicode: { fill: '█', empty: '░' },\n ascii: { fill: '#', empty: '-' },\n} as const;\n\nexport interface GaugeProps {\n /**\n * Current value\n */\n value: number;\n\n /**\n * Minimum value\n * @default 0\n */\n min?: number;\n\n /**\n * Maximum value\n * @default 100\n */\n max?: number;\n\n /**\n * Progress bar width (character count), excluding percentage text\n * @default 20\n */\n width?: number;\n\n /**\n * Fill color\n * @default 'green'\n */\n color?: string;\n\n /**\n * Unfilled character color\n * @default 'gray'\n */\n emptyColor?: string;\n\n /**\n * Whether to show percentage text\n * @default true\n */\n showPercent?: boolean;\n\n /**\n * Rendering style\n * - 'unicode': Use Unicode block characters (█░)\n * - 'ascii': Use ASCII characters (#-)\n * @default 'unicode'\n */\n variant?: 'unicode' | 'ascii';\n\n /**\n * Custom fill character (overrides variant setting)\n */\n fillChar?: string;\n\n /**\n * Custom unfilled character (overrides variant setting)\n */\n emptyChar?: string;\n\n /**\n * Prefix label\n */\n label?: string;\n}\n\n/**\n * Gauge - Gauge/progress bar component\n *\n * Display progress or load of a single metric.\n * Style examples:\n * - unicode: [██████░░░░] 60%\n * - ascii: [######----] 60%\n */\nexport const Gauge: React.FC<GaugeProps> = ({\n value,\n min = 0,\n max = 100,\n width = 20,\n color,\n emptyColor,\n showPercent = true,\n variant = 'unicode',\n fillChar,\n emptyChar,\n label,\n}) => {\n const theme = useTheme();\n const effectiveColor = color ?? theme.semantic.success;\n const effectiveEmptyColor = emptyColor ?? theme.semantic.muted;\n\n // Select character set based on variant\n const charSet = CHAR_SETS[variant];\n const effectiveFillChar = fillChar ?? charSet.fill;\n const effectiveEmptyChar = emptyChar ?? charSet.empty;\n\n const clampedValue = Math.min(Math.max(value, min), max);\n const range = max - min;\n const ratio = range === 0 ? 0 : (clampedValue - min) / range;\n const percent = Math.round(ratio * 100);\n\n const filledLength = Math.round(ratio * width);\n const emptyLength = width - filledLength;\n\n const filledStr = effectiveFillChar.repeat(filledLength);\n const emptyStr = effectiveEmptyChar.repeat(emptyLength);\n\n return (\n <Box flexDirection=\"row\">\n {label && (\n <Box marginRight={1}>\n <Text>{label}</Text>\n </Box>\n )}\n <Text color={effectiveColor}>{filledStr}</Text>\n <Text color={effectiveEmptyColor}>{emptyStr}</Text>\n {showPercent && (\n <Box marginLeft={1}>\n <Text>{percent}%</Text>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Multi-Style Big Fonts for BigNumber Component\n *\n * Supports three rendering styles:\n * - block: Unicode Block Elements (█▀▄)\n * - braille: Braille patterns (⠿)\n * - ascii: Pure ASCII characters\n */\n\nexport type FontStyle = 'block' | 'braille' | 'ascii';\n\n// ============================================================\n// Block Elements Font (3x3 character matrix)\n// ============================================================\n\nconst BLOCK_FONT: Record<string, string[]> = {\n '0': ['█▀█', '█ █', '█▄█'],\n '1': [' █ ', ' █ ', ' █ '],\n '2': ['▀▀█', ' ▀▄', '█▄▄'],\n '3': ['▀▀█', ' ▀▄', '▄▄█'],\n '4': ['█ █', '█▄█', ' █'],\n '5': ['█▀▀', '▀▀▄', '▄▄█'],\n '6': ['█▀▀', '█▄▄', '█▄█'],\n '7': ['▀▀█', ' █', ' █'],\n '8': ['█▀█', '█▀█', '█▄█'],\n '9': ['█▀█', '▀▀█', ' █'],\n '.': [' ', ' ', ' ▄ '],\n ',': [' ', ' ', ' ▙ '],\n '%': ['█ ', ' █ ', ' █'],\n '+': [' ', ' ┼ ', ' '],\n '-': [' ', ' ─ ', ' '],\n};\n\n// ============================================================\n// Braille Font (3x3 character matrix using Braille dots)\n// ============================================================\n\nconst BRAILLE_FONT: Record<string, string[]> = {\n '0': ['⣰⣆', '⡇⢸', '⠙⠛'],\n '1': ['⢀⡆', '⠀⡇', '⠀⠇'],\n '2': ['⠤⣤', '⢀⡤', '⠓⠒'],\n '3': ['⠤⣤', '⠀⡤', '⠒⠚'],\n '4': ['⡆⢸', '⠓⢺', '⠀⢸'],\n '5': ['⠖⠶', '⠒⢲', '⠒⠚'],\n '6': ['⢰⡆', '⠖⢲', '⠓⠚'],\n '7': ['⠤⣤', '⠀⡰', '⠀⡇'],\n '8': ['⢰⡆', '⠖⡶', '⠓⠚'],\n '9': ['⢰⡆', '⠓⢺', '⠀⢸'],\n '.': ['⠀⠀', '⠀⠀', '⠀⠄'],\n ',': ['⠀⠀', '⠀⠀', '⠀⠢'],\n '%': ['⠁⠀', '⠀⠂', '⠀⠈'],\n '+': ['⠀⠀', '⠐⠒', '⠀⠀'],\n '-': ['⠀⠀', '⠐⠒', '⠀⠀'],\n};\n\n// ============================================================\n// ASCII Font (3x3 character matrix, pure ASCII)\n// ============================================================\n\nconst ASCII_FONT: Record<string, string[]> = {\n '0': ['+~+', '| |', '+~+'],\n '1': [' | ', ' | ', ' | '],\n '2': ['~~+', '+-+', '+~~'],\n '3': ['~~+', ' ~+', '~~+'],\n '4': ['+ +', '+-+', ' +'],\n '5': ['+~~', '+~+', '~~+'],\n '6': ['+~~', '+~+', '+~+'],\n '7': ['~~+', ' +', ' +'],\n '8': ['+~+', '+~+', '+~+'],\n '9': ['+~+', '+~+', ' +'],\n '.': [' ', ' ', ' . '],\n ',': [' ', ' ', ' , '],\n '%': ['* ', ' * ', ' *'],\n '+': [' ', ' + ', ' '],\n '-': [' ', ' - ', ' '],\n};\n\n// ============================================================\n// Font Registry\n// ============================================================\n\nconst FONTS: Record<FontStyle, Record<string, string[]>> = {\n block: BLOCK_FONT,\n braille: BRAILLE_FONT,\n ascii: ASCII_FONT,\n};\n\nconst UNKNOWN: Record<FontStyle, string[]> = {\n block: [' ', ' ? ', ' '],\n braille: ['⠀⠀', '⠀⠦', '⠀⠀'],\n ascii: [' ', ' ? ', ' '],\n};\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function getBigChar(char: string, style: FontStyle = 'block'): string[] {\n return FONTS[style][char] || UNKNOWN[style];\n}\n\nexport function renderBigString(text: string, style: FontStyle = 'block'): string[] {\n const rows = ['', '', ''];\n for (const char of text) {\n const matrix = getBigChar(char, style);\n rows[0] += `${matrix[0]} `;\n rows[1] += `${matrix[1]} `;\n rows[2] += `${matrix[2]} `;\n }\n return rows;\n}\n","import { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { useTheme } from '../theme/ThemeContext';\nimport { type FontStyle, renderBigString } from './BigNumber/font';\n\n/**\n * Trend arrow character set\n */\nconst TREND_ARROWS = {\n unicode: { up: '▲', down: '▼', neutral: '─' },\n ascii: { up: '^', down: 'v', neutral: '-' },\n} as const;\n\nexport interface BigNumberProps {\n /**\n * Main value\n */\n value: string | number;\n\n /**\n * Subtitle/label\n */\n label?: string;\n\n /**\n * Color\n * @default 'white'\n */\n color?: string;\n\n /**\n * Trend direction (for rendering arrows)\n */\n trendDirection?: 'up' | 'down' | 'neutral';\n\n /**\n * Trend label (e.g., \"12%\")\n */\n trendLabel?: string;\n\n /**\n * Trend arrow style\n * - 'unicode': Use Unicode arrows\n * - 'ascii': Use ASCII characters\n * @default 'unicode'\n */\n variant?: 'unicode' | 'ascii';\n\n /**\n * Large font style\n * - 'block': Block Elements characters (default)\n * - 'braille': Braille Dot Matrix characters\n * - 'ascii': Pure ASCII characters\n * @default 'block'\n */\n fontStyle?: FontStyle;\n\n /**\n * Alignment\n * @default 'center'\n */\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * BigNumber - Key metric card component\n *\n * Display core KPIs with large font for main value, supports subtitle and trend indicators.\n */\nexport const BigNumber: React.FC<BigNumberProps> = ({\n value,\n label,\n color = 'white',\n trendDirection,\n trendLabel,\n variant = 'unicode',\n fontStyle = 'block',\n align = 'center',\n}) => {\n const bigLines = useMemo(() => renderBigString(String(value), fontStyle), [value, fontStyle]);\n\n const theme = useTheme();\n\n // Select arrow character based on variant\n const arrows = TREND_ARROWS[variant];\n\n let trendColor = theme.semantic.muted;\n let trendArrow = '';\n\n if (trendDirection === 'up') {\n trendColor = theme.semantic.success;\n trendArrow = arrows.up;\n } else if (trendDirection === 'down') {\n trendColor = theme.semantic.error;\n trendArrow = arrows.down;\n } else if (trendDirection === 'neutral') {\n trendArrow = arrows.neutral;\n }\n\n const alignItems =\n align === 'center' ? 'center' : align === 'right' ? 'flex-end' : 'flex-start';\n\n return (\n <Box flexDirection=\"column\" alignItems={alignItems}>\n <Box flexDirection=\"column\" marginBottom={1}>\n {bigLines.map((line, i) => (\n <Text key={i} color={color}>\n {line}\n </Text>\n ))}\n </Box>\n\n <Box flexDirection=\"row\" gap={1}>\n {label && <Text color={theme.semantic.textSecondary}>{label}</Text>}\n {(trendLabel || trendArrow) && (\n <Text color={trendColor}>\n {trendArrow} {trendLabel}\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { useTheme } from '../theme/ThemeContext';\nimport { createGradient } from '../utils/gradient';\n\n/**\n * Character set configuration\n */\nconst CHAR_SETS = {\n unicode: '■',\n ascii: '#',\n} as const;\n\nexport interface HeatmapProps {\n /**\n * Data matrix (2D array)\n * e.g. rows x cols\n */\n data: number[][];\n\n /**\n * Color gradient (from low to high)\n * Defaults to theme's heatmapGradient\n */\n colors?: string[];\n\n /**\n * Empty/zero value color (if not handled in gradient)\n */\n emptyColor?: string;\n\n /**\n * Rendering style\n * - 'unicode': Use Unicode Blocks character (■)\n * - 'ascii': Use ASCII characters (#)\n * @default 'unicode'\n */\n variant?: 'unicode' | 'ascii';\n\n /**\n * Custom character (overrides variant setting)\n */\n char?: string;\n}\n\n/**\n * Heatmap - Heatmap component\n *\n * Display density or time distribution (similar to GitHub Contribution graph).\n * Use color intensity to represent value magnitude.\n */\n// Helper to find min/max\nconst findMinMax = (data: number[][]) => {\n let minVal = Number.POSITIVE_INFINITY;\n let maxVal = Number.NEGATIVE_INFINITY;\n\n for (const row of data) {\n for (const val of row) {\n if (val < minVal) minVal = val;\n if (val > maxVal) maxVal = val;\n }\n }\n return { min: minVal, max: maxVal };\n};\n\nexport const Heatmap: React.FC<HeatmapProps> = ({ data, colors, variant = 'unicode', char }) => {\n const theme = useTheme();\n const effectiveColors = colors ?? theme.heatmapGradient;\n\n // Select character based on variant\n const effectiveChar = char ?? CHAR_SETS[variant];\n\n // 1. Compute min/max\n const { min, max } = useMemo(() => {\n const { min: minVal, max: maxVal } = findMinMax(data);\n if (minVal === Number.POSITIVE_INFINITY) return { min: 0, max: 0 };\n return { min: minVal, max: maxVal > minVal ? maxVal : minVal + 1 };\n }, [data]);\n\n // 2. Create gradient function\n // We map 0..1 to gradient steps.\n const steps = effectiveColors.length;\n const gradient = useMemo(\n () => createGradient(effectiveColors, steps),\n [effectiveColors, steps],\n );\n\n // 3. Render\n return (\n <Box flexDirection=\"column\">\n {data.map((row, rowIndex) => (\n <Box key={rowIndex} flexDirection=\"row\">\n {row.map((val, colIndex) => {\n // Normalize value to 0..1\n const normalized = max === min ? 0 : (val - min) / (max - min);\n // Map to step index 0..(steps-1)\n // Using linear mapping\n let stepIndex = Math.floor(normalized * steps);\n if (stepIndex >= steps) stepIndex = steps - 1; // clamp max (when val == max)\n\n const colorFn = gradient[stepIndex];\n // If colorFn is missing (shouldn't happen), fallback to last color or text\n const renderedChar = colorFn ? colorFn(effectiveChar) : effectiveChar;\n\n return <Text key={`${rowIndex}-${colIndex}`}>{renderedChar} </Text>;\n })}\n </Box>\n ))}\n </Box>\n );\n};\n","/**\n * LogStream - Log stream display component\n *\n * Pure log display component, without borders and title.\n * If borders are needed, please use the <Panel><LogStream /></Panel> pattern.\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useContext, useMemo } from 'react';\nimport { type SemanticColors, useTheme } from '../theme/ThemeContext';\nimport { GridItemContext } from './Grid';\n\nexport interface LogStreamProps {\n /**\n * Array of log strings\n */\n logs: string[];\n\n /**\n * Maximum retained lines (counted from end)\n * @default 100\n */\n maxLines?: number;\n\n /**\n * Display height (number of lines)\n * If not provided, will adapt to content (but not exceed maxLines)\n */\n height?: number;\n\n /**\n * Display width (character count)\n * If not provided, will adapt to parent container\n */\n width?: number;\n}\n\n// Log level definitions\ntype LogLevel = 'info' | 'warn' | 'error' | 'success' | 'debug' | 'unknown';\n\ninterface ParsedLog {\n timestamp?: string;\n level: LogLevel;\n message: string;\n raw: string;\n}\n\n/**\n * Parse log line\n */\nfunction parseLogLine(line: string): ParsedLog {\n // Try to extract timestamp (e.g., \"2023-01-01 12:00:00\", \"12:00:00\", \"[12:00:00]\")\n const timeRegex = /\\[?(\\d{2,4}-\\d{2}-\\d{2}\\s)?(\\d{2}:\\d{2}:\\d{2})\\]?/;\n const timeMatch = line.match(timeRegex);\n let timestamp = timeMatch ? timeMatch[0] : undefined;\n let content = line;\n\n if (timestamp) {\n content = content.replace(timestamp, '').trim();\n // Remove brackets if present in extracted timestamp for cleaner display\n timestamp = timestamp.replace(/^\\[|\\]$/g, '');\n }\n\n // Try to extract log level\n const levelRegex = /(info|warn|warning|error|err|success|debug)/i;\n const levelMatch = content.match(levelRegex);\n let level: LogLevel = 'unknown';\n\n if (levelMatch) {\n const lvl = levelMatch[0].toLowerCase();\n if (lvl.includes('error') || lvl.includes('err')) level = 'error';\n else if (lvl.includes('warn')) level = 'warn';\n else if (lvl.includes('info')) level = 'info';\n else if (lvl.includes('success')) level = 'success';\n else if (lvl.includes('debug')) level = 'debug';\n\n // Optional: Remove level tag from message if it's in brackets or standard format\n // e.g. \"[INFO] msg\" -> \"msg\"\n content = content.replace(new RegExp(`\\\\[?${levelMatch[0]}\\\\]?`, 'i'), '').trim();\n // Remove leading/trailing non-word chars (like \":\", \"-\")\n content = content.replace(/^[:\\-\\s]+/, '');\n }\n\n return {\n ...(timestamp ? { timestamp } : {}),\n level,\n message: content || line,\n raw: line,\n };\n}\n\n/**\n * Render single log line\n */\ninterface LogLineProps {\n parsed: ParsedLog;\n semantic: SemanticColors;\n index: number;\n}\n\nconst LogLine: React.FC<Omit<LogLineProps, 'index'>> = ({ parsed, semantic }) => {\n const { timestamp, level, message } = parsed;\n\n // Style configuration: based on semantic colors\n const getStyle = (lvl: LogLevel) => {\n switch (lvl) {\n case 'error':\n return { color: semantic.error, badge: '✖ ERROR', icon: '✖' };\n case 'warn':\n return { color: semantic.warning, badge: '⚠ WARN ', icon: '⚠' };\n case 'success':\n return { color: semantic.success, badge: '✔ SUCCESS', icon: '✔' };\n case 'debug':\n return { color: semantic.muted, badge: '⚙ DEBUG', icon: '⚙' };\n default:\n return { color: semantic.info, badge: 'ℹ INFO ', icon: 'ℹ' };\n }\n };\n\n const style = getStyle(level);\n\n // Different display modes:\n // Mode 1: Compact icon mode (Icon + Message) - Suitable for compact layout\n // Mode 2: Full badge mode (Badge + Message) - Suitable for wide layout\n // Here we use a hybrid mode: Level with color-highlighted text\n\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n {/* 1. Timestamp (Fixed width or just spacing) */}\n {timestamp && (\n <Box marginRight={1} width={10}>\n <Text dimColor wrap=\"truncate\">\n {timestamp}\n </Text>\n </Box>\n )}\n\n {/* 2. Level Badge/Icon */}\n {/* Use Box to give Badge a fixed width for alignment */}\n <Box marginRight={1} width={9}>\n {/* \n Badge Background: Ink does not support Text background color as a Badge well (except inverse),\n So we use colored text + icons.\n If you want \"background color blocks\", you can use <Text backgroundColor={style.color} color=\"black\"> {style.badge} </Text>\n But inverse colors may not be obvious in some terminals.\n Here we use: Bold Color Text.\n */}\n {level === 'unknown' ? (\n <Text color={semantic.muted}>•</Text>\n ) : (\n <Text color={style.color} bold>\n {level === 'error' || level === 'warn'\n ? `${style.icon} ${level.toUpperCase()}`\n : level.toUpperCase()}\n </Text>\n )}\n </Box>\n\n {/* 3. Message */}\n <Box flexGrow={1}>\n {level === 'error' ? (\n <Text color={style.color} wrap=\"truncate-end\">\n {message}\n </Text>\n ) : (\n <Text color={semantic.text} wrap=\"truncate-end\">\n {message}\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n\n/**\n * LogStream - Scrolling log viewer component\n *\n * Features:\n * - Automatically display latest logs (render tail)\n * - Intelligently parse timestamps and log levels\n * - Use icons and colors to distinguish levels\n * - Support maximum line limit\n */\nexport const LogStream: React.FC<LogStreamProps> = ({ logs, maxLines = 100, height, width }) => {\n const theme = useTheme();\n\n // Get dimensions from Grid context\n const gridContext = useContext(GridItemContext);\n const effectiveHeight =\n height ?? (typeof gridContext?.height === 'number' ? gridContext.height : undefined);\n const effectiveWidth = width ?? gridContext?.width;\n\n // 1. Trim logs to maxLines\n const recentLogs = useMemo(() => {\n const start = Math.max(0, logs.length - maxLines);\n return logs.slice(start);\n }, [logs, maxLines]);\n\n // 2. If height limit exists, further trim to visible lines\n const displayLogs = useMemo(() => {\n if (effectiveHeight && effectiveHeight > 0) {\n const start = Math.max(0, recentLogs.length - effectiveHeight);\n return recentLogs.slice(start);\n }\n return recentLogs;\n }, [recentLogs, effectiveHeight]);\n\n // 3. Parse and render\n const items = displayLogs.map((line, index) => {\n const parsed = parseLogLine(line);\n return <LogLine key={index} parsed={parsed} semantic={theme.semantic} />;\n });\n\n return (\n <Box\n flexDirection=\"column\"\n justifyContent=\"flex-end\"\n flexGrow={1}\n {...(effectiveHeight !== undefined && { height: effectiveHeight })}\n {...(effectiveWidth !== undefined && { width: effectiveWidth })}\n >\n {items}\n </Box>\n );\n};\n","import { Box, Text, useFocus, useInput } from 'ink';\nimport React, { useMemo, useContext } from 'react';\nimport { useTheme } from '../theme/ThemeContext';\nimport { GridItemContext } from './Grid';\n\nexport interface TableColumn<T> {\n /**\n * Header title\n */\n header: string;\n\n /**\n * Data accessor key (if property of T) or render function\n */\n accessor: keyof T | ((item: T) => React.ReactNode);\n\n /**\n * Optional fixed width (if not provided, auto-calculated)\n */\n width?: number;\n\n /**\n * Alignment\n * @default 'left'\n */\n align?: 'left' | 'right' | 'center';\n}\n\nexport interface TableProps<T> {\n /**\n * Data array\n */\n data: T[];\n\n /**\n * Column definitions\n */\n columns: TableColumn<T>[];\n\n /**\n * Currently sorted column key (matches matches column header or some ID? Let's use header/index for simplicity or separate ID)\n * For simplicity, let's match 'header' string or an index.\n * Let's use the index of the column for simplicity in this TUI context, or match header string.\n */\n sortColumn?: number | string;\n\n /**\n * Sort direction\n */\n sortDirection?: 'asc' | 'desc';\n\n /**\n * Enable zebra striping\n * @default false\n */\n zebra?: boolean;\n\n /**\n * Callback when a column header is activated (sorted)\n */\n onSort?: (column: TableColumn<T>, index: number) => void;\n}\n\n// Alignment mapping constants\nconst ALIGN_MAP = {\n left: 'flex-start',\n right: 'flex-end',\n center: 'center',\n} as const;\n\ninterface HeaderCellProps<T> {\n column: TableColumn<T>;\n width: number;\n isSorted: boolean;\n sortDirection: 'asc' | 'desc';\n onSort?: (column: TableColumn<T>) => void;\n align: 'flex-start' | 'center' | 'flex-end';\n autoFocus?: boolean;\n}\n\nconst SortableHeaderCell = <T,>({\n column,\n width,\n isSorted,\n sortDirection,\n onSort,\n align,\n autoFocus,\n}: HeaderCellProps<T>) => {\n const theme = useTheme();\n const semantic = theme.semantic;\n const { isFocused } = useFocus({ autoFocus: !!autoFocus });\n\n useInput((input, key) => {\n if (isFocused && (key.return || input === ' ')) {\n onSort?.(column);\n }\n });\n\n let indicator = '';\n if (isSorted) {\n indicator = sortDirection === 'asc' ? ' ▲' : ' ▼';\n }\n\n return (\n <Box\n width={width}\n justifyContent={align}\n flexShrink={0}\n paddingX={1}\n {...(isFocused ? { borderStyle: 'single' } : {})}\n borderColor={semantic.info}\n marginTop={isFocused ? -1 : 0} // visual adjustment for border\n // Or better: use inverse color for focus\n >\n {/* \n Border adds size, might shift layout. \n Using inverse/underline for focus is safer in fixed layout.\n */}\n <Text\n bold\n color={isFocused ? semantic.info : semantic.success}\n underline={isFocused}\n wrap=\"truncate-end\"\n >\n {column.header}\n {indicator}\n </Text>\n </Box>\n );\n};\n\n/**\n * Table - Data table with interactive sort headers\n */\n// Helper to separate cell content extraction\nconst getCellContentLength = <T,>(item: T, col: TableColumn<T>): number => {\n let content = '';\n if (typeof col.accessor === 'function') {\n const result = col.accessor(item);\n if (typeof result === 'string' || typeof result === 'number') {\n content = String(result);\n }\n } else {\n const val = item[col.accessor];\n if (val !== undefined && val !== null) {\n content = String(val);\n }\n }\n return content.length;\n};\n\n// Helper to calculate widths\nconst calculateWidths = <T,>(columns: TableColumn<T>[], data: T[]) => {\n return columns.map((col) => {\n if (col.width) return col.width;\n\n let max = col.header.length + 2;\n for (const item of data) {\n max = Math.max(max, getCellContentLength(item, col));\n }\n return max + 2;\n });\n};\n\n/**\n * Table - Data table with interactive sort headers\n */\nexport const Table = <T,>({\n data,\n columns,\n sortColumn,\n sortDirection = 'asc',\n zebra = false,\n onSort,\n}: TableProps<T>) => {\n // 1. Resolve Context for Width\n const gridContext = useContext(GridItemContext);\n const availableWidth = gridContext?.width;\n\n // 2. Calculate column widths based on content\n const contentWidths = useMemo(() => calculateWidths(columns, data), [data, columns]);\n const totalContentWidth = contentWidths.reduce((a, b) => a + b, 0);\n\n // 3. Adjust widths to fit availableWidth\n // 3. Adjust widths to fit availableWidth\n const finalColumnWidths = useMemo(() => {\n if (!availableWidth) {\n return contentWidths;\n }\n\n // Expansion Strategy: If we have extra space, fill it proportionally\n // Compression Strategy: If we don't have enough space, scale down\n // Both can be handled by the same scale factor logic\n const scale = availableWidth / totalContentWidth;\n\n // If scale is close to 1 (within rounding error), just return contentWidths?\n // No, we want to snap to availableWidth exactly if possible.\n\n let allocated = 0;\n return contentWidths.map((w, i) => {\n // If this is the last column, give it the remaining space\n // This handles both rounding errors and ensures we fill the width\n if (i === contentWidths.length - 1) {\n return Math.max(1, availableWidth - allocated);\n }\n\n const newW = Math.floor(w * scale);\n allocated += newW;\n return Math.max(1, newW);\n });\n }, [availableWidth, totalContentWidth, contentWidths]);\n\n return (\n <Box\n flexDirection=\"column\"\n {...(availableWidth !== undefined && { width: availableWidth })}\n >\n {/* Header */}\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderBottom={true}\n flexDirection=\"row\"\n >\n {columns.map((col, i) => {\n const width = finalColumnWidths[i] ?? 0;\n const isSorted = sortColumn === i || sortColumn === col.header;\n const justifyContent = col.align ? ALIGN_MAP[col.align] : 'flex-start';\n\n return (\n <SortableHeaderCell\n key={i}\n column={col}\n width={width}\n isSorted={isSorted}\n sortDirection={sortDirection}\n align={justifyContent}\n onSort={() => onSort?.(col, i)}\n autoFocus={i === 0}\n />\n );\n })}\n </Box>\n\n {/* Rows */}\n {data.map((item, rowIndex) => {\n const isZebra = zebra && rowIndex % 2 === 1;\n\n return (\n <Box key={rowIndex} flexDirection=\"row\">\n {columns.map((col, colIndex) => {\n const width = finalColumnWidths[colIndex] ?? 0;\n\n let content: React.ReactNode;\n if (typeof col.accessor === 'function') {\n content = col.accessor(item);\n } else {\n const val = item[col.accessor];\n content = val !== undefined && val !== null ? String(val) : '';\n }\n\n const justifyContent = col.align ? ALIGN_MAP[col.align] : 'flex-start';\n\n return (\n <Box\n key={colIndex}\n width={width}\n justifyContent={justifyContent}\n flexShrink={0}\n paddingX={1}\n >\n {/* \n Ink doesn't have background color on Box easily for rows. \n We wrap content in Text with backgroundColor if zebra.\n But this only backgrounds the text characters, not the full cell width.\n To background full cell width, we usually need 'ink-color-pipe' or some hack.\n Or we use 'inverse' for zebra?\n 'dimColor' is subtle for zebra striping on text. \n Let's try: if zebra, dim the text.\n */}\n <Text dimColor={isZebra} wrap=\"truncate-end\">\n {content}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeContext';\n\n/**\n * Status for a single ping\n */\nexport type PingStatus = 'good' | 'unstable' | 'bad';\n\n/**\n * Ping record item\n */\nexport interface PingRecord {\n /**\n * Connection status\n */\n status: PingStatus;\n}\n\nexport interface PulseBarProps {\n /**\n * Ping history entries\n */\n records: PingRecord[];\n\n /**\n * Maximum number of bars to display\n * @default 30\n */\n maxBars?: number;\n\n /**\n * Render style\n * - 'unicode': use Unicode characters\n * - 'ascii': use ASCII characters\n * @default 'unicode'\n */\n variant?: 'unicode' | 'ascii';\n\n /**\n * Custom colors\n */\n colors?: {\n good?: string;\n unstable?: string;\n bad?: string;\n };\n}\n\n/**\n * Character set configuration\n */\nconst CHAR_SETS = {\n unicode: {\n bar: '▌',\n left: '╭',\n right: '╮',\n leftBottom: '╰',\n rightBottom: '╯',\n horizontal: '─',\n vertical: '│',\n },\n ascii: {\n bar: '|',\n left: '/',\n right: '\\\\',\n leftBottom: '\\\\',\n rightBottom: '/',\n horizontal: '-',\n vertical: '|',\n },\n} as const;\n\n/**\n * PulseBar - network connection status component\n *\n * Shows ping history, each bar represents a ping result:\n * - Green: connection healthy\n * - Yellow: connection unstable\n * - Red: connection failed\n */\nexport const PulseBar: React.FC<PulseBarProps> = ({\n records,\n maxBars = 30,\n variant = 'unicode',\n colors,\n}) => {\n const theme = useTheme();\n const chars = CHAR_SETS[variant];\n\n // Resolve the color for each status\n const getColor = (status: PingStatus): string => {\n switch (status) {\n case 'good':\n return colors?.good ?? theme.semantic.success;\n case 'unstable':\n return colors?.unstable ?? theme.semantic.warning;\n case 'bad':\n return colors?.bad ?? theme.semantic.error;\n }\n };\n\n // Keep the most recent maxBars entries\n const displayRecords = records.slice(-maxBars);\n // Fill remaining slots with empty bars\n const paddingCount = maxBars - displayRecords.length;\n\n // Border color\n const borderColor = theme.semantic.muted;\n\n // Top border\n const topBorder = chars.left + chars.horizontal.repeat(maxBars) + chars.right;\n // Bottom border\n const bottomBorder = chars.leftBottom + chars.horizontal.repeat(maxBars) + chars.rightBottom;\n\n return (\n <Box flexDirection=\"column\">\n <Text color={borderColor}>{topBorder}</Text>\n <Box flexDirection=\"row\">\n <Text color={borderColor}>{chars.vertical}</Text>\n {/* Fill empty slots with muted bars */}\n {paddingCount > 0 && (\n <Text color={borderColor}>{chars.bar.repeat(paddingCount)}</Text>\n )}\n {/* Render each ping record */}\n {displayRecords.map((record, index) => (\n <Text key={index} color={getColor(record.status)}>\n {chars.bar}\n </Text>\n ))}\n <Text color={borderColor}>{chars.vertical}</Text>\n </Box>\n <Text color={borderColor}>{bottomBorder}</Text>\n </Box>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/renderer.ts","../src/core/braille.ts","../src/core/block.ts","../src/detect/terminal.ts","../src/detect/selector.ts","../src/components/InkHudProvider.tsx","../src/utils/gradient.ts","../src/theme/ThemeContext.tsx","../src/utils/scale.ts","../src/utils/geometry.ts","../src/utils/downsampling.ts","../src/hooks/useSmooth.ts","../src/render/capabilities.ts","../src/render/image/iterm2.ts","../src/render/image/kitty.ts","../src/hooks/useImageProtocol.ts","../src/components/Grid.tsx","../src/components/common/chartUtils.ts","../src/components/common/Axis.tsx","../src/components/common/Legend.tsx","../src/components/common/ChartContainer.tsx","../src/symbols.ts","../src/components/common/useChartCore.ts","../src/components/common/useChartRenderer.ts","../src/components/LineChart.tsx","../src/components/AreaChart.tsx","../src/components/BarChart.tsx","../src/components/PieChart.tsx","../src/render/image/png.ts","../src/render/image/drawing.ts","../src/components/Sparkline.tsx","../src/components/Panel.tsx","../src/components/Gauge.tsx","../src/components/BigNumber/font.ts","../src/components/BigNumber.tsx","../src/components/Heatmap.tsx","../src/components/LogStream.tsx","../src/components/Table.tsx","../src/components/PulseBar.tsx"],"names":["createContext","useMemo","React","useContext","chalk","tinygradient","useState","useRef","useEffect","useStdout","Box","Text","deflateSync","clamp","useFocus","useInput"],"mappings":"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;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxF,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAExB,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAExD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhE,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhB,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAExB,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhB,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhE,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhE,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhB,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhB,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAEhF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA;AAAA,EAExF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA;AAAA,EAEhB,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA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","file":"index.cjs","sourcesContent":["import type { Pixel, RenderedLine } from './types';\n\n/**\n * Renderer Module - Defines a unified interface for all renderers\n */\n\n/**\n * Renderer type\n */\nexport type RendererType = 'braille' | 'block';\n\n/**\n * Renderer resolution information\n * Represents how many pixels each character can display\n */\nexport interface RendererResolution {\n /** Pixels per character horizontally (e.g. Braille 2, Block 2, ASCII 1) */\n horizontal: number;\n /** Pixels per character vertically (e.g. Braille 4, Block 8, ASCII 1) */\n vertical: number;\n}\n\n/**\n * Renderer metadata\n * Describes renderer capabilities and requirements\n */\nexport interface RendererMetadata {\n /** Renderer name */\n name: RendererType;\n /** Renderer display name */\n displayName: string;\n /** Renderer description */\n description: string;\n /** Renderer resolution */\n resolution: RendererResolution;\n /** Whether UTF-8 support is required */\n requiresUtf8: boolean;\n /** Whether Unicode support is required */\n requiresUnicode: boolean;\n /** Minimum terminal capability score requirement (0-100) */\n minScore: number;\n}\n\n/**\n * Abstract Renderer base class\n *\n * Provides common implementations for all drawing primitives. Subclasses only need to implement:\n * - getMetadata(): Return renderer metadata\n * - renderCanvas(): Convert Pixel[][] to terminal characters\n */\nexport abstract class Renderer {\n /**\n * Get renderer metadata (must be implemented by subclasses)\n */\n abstract getMetadata(): RendererMetadata;\n\n /**\n * Render Canvas as styled lines of text (must be implemented by subclasses)\n * @param pixels - 2D pixel array\n * @param width - Canvas width (pixels)\n * @param height - Canvas height (pixels)\n * @returns Array of colored text lines\n */\n abstract renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[];\n\n // ============================================================\n // Common implementations shared by all renderers\n // ============================================================\n\n /**\n * Create a blank Canvas\n * @param width - Canvas width (pixels)\n * @param height - Canvas height (pixels)\n * @returns 2D pixel array\n */\n createCanvas(width: number, height: number): Pixel[][] {\n return Array.from({ length: height }, () =>\n Array.from({ length: width }, () => ({ active: false })),\n );\n }\n\n /**\n * Set a single pixel on the Canvas\n * @param canvas - Canvas\n * @param x - x coordinate\n * @param y - y coordinate\n * @param pixel - Pixel properties (active, color, etc.)\n */\n setPixel(\n canvas: Pixel[][],\n x: number,\n y: number,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n const row = canvas[y];\n if (y >= 0 && y < canvas.length && row && x >= 0 && x < row.length) {\n const current = row[x];\n if (current) {\n Object.assign(current, pixel);\n }\n }\n }\n\n /**\n * Draw line segments (Bresenham's algorithm)\n */\n drawLine(\n canvas: Pixel[][],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n const dx = Math.abs(x1 - x0);\n const dy = Math.abs(y1 - y0);\n const sx = x0 < x1 ? 1 : -1;\n const sy = y0 < y1 ? 1 : -1;\n let err = dx - dy;\n\n let x = Math.round(x0);\n let y = Math.round(y0);\n const endX = Math.round(x1);\n const endY = Math.round(y1);\n\n while (true) {\n this.setPixel(canvas, x, y, pixel);\n if (x === endX && y === endY) break;\n\n const e2 = 2 * err;\n if (e2 > -dy) {\n err -= dy;\n x += sx;\n }\n if (e2 < dx) {\n err += dx;\n y += sy;\n }\n }\n }\n\n /**\n * Draw circle or ring (Midpoint Circle algorithm)\n */\n drawCircle(\n canvas: Pixel[][],\n centerX: number,\n centerY: number,\n radius: number,\n filled = false,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n if (filled) {\n for (let y = -radius; y <= radius; y++) {\n const width = Math.sqrt(radius * radius - y * y);\n for (let x = -width; x <= width; x++) {\n this.setPixel(canvas, Math.round(centerX + x), Math.round(centerY + y), pixel);\n }\n }\n } else {\n let x = 0;\n let y = radius;\n let d = 1 - radius;\n\n while (x <= y) {\n this.setPixel(canvas, centerX + x, centerY + y, pixel);\n this.setPixel(canvas, centerX - x, centerY + y, pixel);\n this.setPixel(canvas, centerX + x, centerY - y, pixel);\n this.setPixel(canvas, centerX - x, centerY - y, pixel);\n this.setPixel(canvas, centerX + y, centerY + x, pixel);\n this.setPixel(canvas, centerX - y, centerY + x, pixel);\n this.setPixel(canvas, centerX + y, centerY - x, pixel);\n this.setPixel(canvas, centerX - y, centerY - x, pixel);\n\n x++;\n if (d < 0) {\n d += 2 * x + 1;\n } else {\n y--;\n d += 2 * (x - y) + 1;\n }\n }\n }\n }\n\n /**\n * Draw arc (Parametric equation)\n */\n drawArc(\n canvas: Pixel[][],\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n thickness = 1,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n let start = startAngle;\n let end = endAngle;\n if (start > end) {\n [start, end] = [end, start];\n }\n\n const angleStep = 1 / (radius * 2);\n\n for (let r = Math.max(0, radius - thickness + 1); r <= radius; r++) {\n for (let theta = start; theta <= end; theta += angleStep) {\n const x = centerX + r * Math.cos(theta);\n const y = centerY + r * Math.sin(theta);\n this.setPixel(canvas, Math.round(x), Math.round(y), pixel);\n }\n }\n }\n\n /**\n * Draw rectangle\n */\n drawRect(\n canvas: Pixel[][],\n x: number,\n y: number,\n width: number,\n height: number,\n filled = false,\n pixel: Partial<Pixel> = { active: true },\n ): void {\n if (filled) {\n for (let py = y; py < y + height; py++) {\n for (let px = x; px < x + width; px++) {\n this.setPixel(canvas, px, py, pixel);\n }\n }\n } else {\n // Bottom side\n for (let px = x; px < x + width; px++) {\n this.setPixel(canvas, px, y + height - 1, pixel);\n }\n // Left side\n for (let py = y; py < y + height; py++) {\n this.setPixel(canvas, x, py, pixel);\n }\n // Right side\n for (let py = y; py < y + height; py++) {\n this.setPixel(canvas, x + width - 1, py, pixel);\n }\n }\n }\n\n // ============================================================\n // Helper methods\n // ============================================================\n\n /**\n * Get renderer resolution\n */\n getResolution(): RendererResolution {\n return this.getMetadata().resolution;\n }\n\n /**\n * Get renderer name\n */\n getName(): RendererType {\n return this.getMetadata().name;\n }\n\n /**\n * Calculate number of character rows and columns needed to render specified dimensions\n */\n calculateCharDimensions(\n pixelWidth: number,\n pixelHeight: number,\n ): { rows: number; cols: number } {\n const res = this.getResolution();\n return {\n cols: Math.ceil(pixelWidth / res.horizontal),\n rows: Math.ceil(pixelHeight / res.vertical),\n };\n }\n}\n","import type { RendererMetadata } from './renderer';\nimport { Renderer } from './renderer';\nimport type { Pixel, RenderedLine } from './types';\n\nconst BRAILLE_BASE = 0x2800;\nconst DOT_WEIGHTS = [1, 2, 4, 8, 16, 32, 64, 128];\n\n/**\n * Braille Renderer\n *\n * Implements 2x4 dot matrix rendering using Braille Unicode characters (U+2800-U+28FF)\n * Each character can represent 8 sub-pixels, providing 8x resolution\n */\nexport class BrailleRenderer extends Renderer {\n getMetadata(): RendererMetadata {\n return {\n name: 'braille',\n displayName: 'Braille',\n description: 'Braille character (⣿) 2x4 matrix, 8x resolution',\n resolution: {\n horizontal: 2,\n vertical: 4,\n },\n requiresUtf8: true,\n requiresUnicode: true,\n minScore: 80,\n };\n }\n\n // ============================================================\n // Braille-specific private methods\n // ============================================================\n\n private createBrailleChar(dots: boolean[]): string {\n let code = BRAILLE_BASE;\n for (let i = 0; i < 8 && i < DOT_WEIGHTS.length; i++) {\n if (dots[i]) {\n const weight = DOT_WEIGHTS[i];\n if (weight !== undefined) {\n code += weight;\n }\n }\n }\n return String.fromCharCode(code);\n }\n\n private pixelToDotIndex(x: number, y: number): number {\n // Left column: 0,1,2,6 Right column: 3,4,5,7\n if (x === 0) {\n return y === 3 ? 6 : y;\n }\n return y === 3 ? 7 : y + 3;\n }\n\n private fillBrailleDots(\n pixels: Pixel[][],\n cx: number,\n cy: number,\n width: number,\n height: number,\n ): boolean[] {\n const dots = Array(8).fill(false);\n for (let py = 0; py < 4; py++) {\n for (let px = 0; px < 2; px++) {\n const pixelY = cy * 4 + py;\n const pixelX = cx * 2 + px;\n if (pixelY < height && pixelX < width) {\n dots[this.pixelToDotIndex(px, py)] = pixels[pixelY]?.[pixelX]?.active ?? false;\n }\n }\n }\n return dots;\n }\n\n private resolveColor(\n pixels: Pixel[][],\n cx: number,\n cy: number,\n width: number,\n height: number,\n ): string | undefined {\n const counts = new Map<string, number>();\n\n for (let py = 0; py < 4; py++) {\n for (let px = 0; px < 2; px++) {\n const pixelY = cy * 4 + py;\n const pixelX = cx * 2 + px;\n\n if (pixelY < height && pixelX < width) {\n const pixel = pixels[pixelY]?.[pixelX];\n if (pixel?.active && pixel.color) {\n counts.set(pixel.color, (counts.get(pixel.color) ?? 0) + 1);\n }\n }\n }\n }\n\n if (counts.size === 0) return undefined;\n\n let maxCount = 0;\n let dominantColor: string | undefined;\n\n for (const [color, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n }\n\n return dominantColor;\n }\n\n // ============================================================\n // Methods that subclasses must implement\n // ============================================================\n\n renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[] {\n const charWidth = Math.ceil(width / 2);\n const charHeight = Math.ceil(height / 4);\n const lines: RenderedLine[] = [];\n\n for (let cy = 0; cy < charHeight; cy++) {\n const lineSegments: RenderedLine = [];\n let buffer = '';\n let bufferColor: string | undefined;\n\n for (let cx = 0; cx < charWidth; cx++) {\n const dots = this.fillBrailleDots(pixels, cx, cy, width, height);\n const char = this.createBrailleChar(dots);\n const color = this.resolveColor(pixels, cx, cy, width, height);\n\n if (buffer && bufferColor !== color) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n buffer = '';\n }\n\n bufferColor = color;\n buffer += char;\n }\n\n if (buffer) {\n lineSegments.push(\n bufferColor ? { text: buffer, color: bufferColor } : { text: buffer },\n );\n }\n lines.push(lineSegments);\n }\n\n return lines;\n }\n}\n","import type { RendererMetadata } from './renderer';\nimport { Renderer } from './renderer';\nimport type { Pixel, RenderedLine } from './types';\n\n/**\n * Block Elements renderer\n *\n * Implements 2x8 dot matrix rendering using Unicode Block Elements characters (U+2581-U+2588)\n * Vertical 8x resolution, horizontal 2x resolution\n */\nexport class BlockRenderer extends Renderer {\n // 9x9 Lookup table: [leftHeight][rightHeight] -> char\n // Index 0-8 represents filled pixel height of column\n private static readonly BLOCK_LUT: string[][] = [\n // R=0 1 2 3 4 5 6 7 8 (L Row Index)\n [' ', '▗', '▗', '▗', '▗', '▗', '▗', '▐', '▐'], // L=0\n ['▖', '▂', '▂', '▃', '▃', '▄', '▄', '▅', '▅'], // L=1: Avg 1-1.5 -> ▂\n ['▖', '▂', '▂', '▃', '▃', '▄', '▄', '▅', '▅'], // L=2\n ['▖', '▃', '▃', '▃', '▄', '▄', '▅', '▅', '▅'], // L=3: Avg 1.5-3.5\n ['▖', '▃', '▃', '▄', '▄', '▅', '▅', '▆', '▆'], // L=4\n ['▖', '▄', '▄', '▅', '▅', '▅', '▆', '▆', '▇'], // L=5\n ['▖', '▄', '▄', '▅', '▅', '▆', '▆', '▇', '▇'], // L=6\n ['▌', '▅', '▅', '▆', '▆', '▇', '▇', '▇', '█'], // L=7\n ['▌', '▅', '▅', '▆', '▆', '▇', '▇', '█', '█'], // L=8\n ];\n\n getMetadata(): RendererMetadata {\n return {\n name: 'block',\n displayName: 'Block Elements',\n description: 'Block Elements character (█) 2x8 matrix, vertical 8x resolution',\n resolution: {\n horizontal: 2,\n vertical: 8,\n },\n requiresUtf8: true,\n requiresUnicode: true,\n minScore: 30,\n };\n }\n\n // ============================================================\n // Block-specific private methods\n // ============================================================\n\n /**\n * Determine primary color\n */\n private resolveColor(\n pixels: Pixel[][],\n startX: number,\n startY: number,\n width: number,\n height: number,\n ): string | undefined {\n const counts = new Map<string, number>();\n\n for (let py = 0; py < 8; py++) {\n for (let px = 0; px < 2; px++) {\n const y = startY + py;\n const x = startX + px;\n\n if (y >= height || x >= width) continue;\n\n const pixel = pixels[y]?.[x];\n if (pixel?.active && pixel.color) {\n counts.set(pixel.color, (counts.get(pixel.color) ?? 0) + 1);\n }\n }\n }\n\n if (counts.size === 0) return undefined;\n\n let maxCount = 0;\n let dominantColor: string | undefined;\n\n for (const [color, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n }\n\n return dominantColor;\n }\n\n // ============================================================\n // Methods that subclasses must implement\n // ============================================================\n\n renderCanvas(pixels: Pixel[][], width: number, height: number): RenderedLine[] {\n const charWidth = Math.ceil(width / 2);\n const charHeight = Math.ceil(height / 8);\n const lines: RenderedLine[] = [];\n\n for (let cy = 0; cy < charHeight; cy++) {\n const lineSegments: RenderedLine = [];\n let buffer = '';\n let bufferFg: string | undefined;\n let bufferBg: string | undefined;\n let bufferColorKey: string | undefined;\n\n for (let cx = 0; cx < charWidth; cx++) {\n const startY = cy * 8;\n const leftX = cx * 2;\n const rightX = cx * 2 + 1;\n\n // 1. Column Analysis (Calculate Height & Center of Gravity)\n // Used to determine if the column is Top-Heavy (Top-aligned content) or Bottom-Heavy\n const analyzeColumn = (colX: number) => {\n let count = 0;\n let sumY = 0;\n for (let py = 0; py < 8; py++) {\n const y = startY + py;\n if (y >= height) break;\n if (pixels[y]?.[colX]?.active) {\n count++;\n sumY += py;\n }\n }\n // Gravity 0 = Top, 7 = Bottom. Center = 3.5.\n // If center < 3.5, it's Top Heavy.\n const gravity = count > 0 ? sumY / count : 3.5;\n return { count, gravity };\n };\n\n const left = analyzeColumn(leftX);\n const right = analyzeColumn(rightX);\n\n const isLeftTop = left.count > 0 && left.gravity < 3.5;\n const isRightTop = right.count > 0 && right.gravity < 3.5;\n\n // 2. Determine Render Mode\n\n // Mode A: Top-Heavy Inversion\n // If BOTH columns are Top-Heavy (or one is Top and other empty), we use \"Inverted Rendering\".\n // We calculate the empty space at the bottom (8 - count), lookup the char for that,\n // and render it with FG=Black (Hole) and BG=Color (Fill).\n const useInverse =\n (isLeftTop && (isRightTop || right.count === 0)) ||\n (isRightTop && (isLeftTop || left.count === 0));\n\n let char = ' ';\n let isInverted = false;\n const pixelColor = this.resolveColor(pixels, leftX, startY, width, height);\n\n if (useInverse) {\n const invLeft = 8 - left.count;\n const invRight = 8 - right.count;\n char = BlockRenderer.BLOCK_LUT[invLeft]?.[invRight] ?? ' ';\n isInverted = true;\n } else {\n // Mode B: Standard Histogram (Bottom-Up)\n const finalLeft = Math.min(8, Math.max(0, left.count));\n const finalRight = Math.min(8, Math.max(0, right.count));\n\n // Fallback to basic LUT\n char = BlockRenderer.BLOCK_LUT[finalLeft]?.[finalRight] ?? ' ';\n }\n\n // Color Logic\n let fgColor: string | undefined;\n let bgColor: string | undefined;\n\n if (char !== ' ') {\n if (isInverted) {\n fgColor = 'black'; // Make the char \"hole\"\n bgColor = pixelColor; // Make the block background\n } else {\n fgColor = pixelColor;\n bgColor = undefined;\n }\n }\n\n const colorKey = `${fgColor}|${bgColor}`;\n\n if (buffer && bufferColorKey !== colorKey) {\n lineSegments.push({\n text: buffer,\n ...(bufferFg ? { color: bufferFg } : {}),\n ...(bufferBg ? { backgroundColor: bufferBg } : {}),\n });\n buffer = '';\n }\n\n //@ts-ignore\n bufferColorKey = colorKey;\n bufferFg = fgColor;\n bufferBg = bgColor;\n buffer += char;\n }\n\n if (buffer) {\n lineSegments.push({\n text: buffer,\n ...(bufferFg ? { color: bufferFg } : {}),\n ...(bufferBg ? { backgroundColor: bufferBg } : {}),\n });\n }\n lines.push(lineSegments);\n }\n\n return lines;\n }\n}\n","/**\n * Terminal capabilities detector\n *\n * Automatically detect terminal-supported features by analyzing environment variables\n */\n\nimport type { EnvironmentInfo, TerminalCapabilities } from './types';\n\n/**\n * Terminal capabilities detector\n *\n * Analyze process environment variables to determine current terminal's supported character sets, colors, and other features\n */\nexport class TerminalDetector {\n /** Terminal whitelist supporting Braille characters (lowercase) */\n private static readonly BRAILLE_SUPPORTED_TERMINALS = [\n 'iterm',\n 'warp',\n 'alacritty',\n 'kitty',\n 'wezterm',\n 'hyper',\n 'tabby',\n 'rio',\n ];\n\n /** Environment variable information */\n private envInfo: EnvironmentInfo;\n\n constructor(env: NodeJS.ProcessEnv = process.env) {\n this.envInfo = this.extractEnvInfo(env);\n }\n\n /**\n * Extract relevant information from environment variables\n * @param env - Environment variable object\n * @returns Environment information\n */\n private extractEnvInfo(env: NodeJS.ProcessEnv): EnvironmentInfo {\n const info: EnvironmentInfo = {};\n\n if (env.LANG !== undefined) {\n info.LANG = env.LANG;\n }\n if (env.TERM !== undefined) {\n info.TERM = env.TERM;\n }\n if (env.COLORTERM !== undefined) {\n info.COLORTERM = env.COLORTERM;\n }\n if (env.TERM_PROGRAM !== undefined) {\n info.TERM_PROGRAM = env.TERM_PROGRAM;\n }\n if (env.TERM_PROGRAM_VERSION !== undefined) {\n info.TERM_PROGRAM_VERSION = env.TERM_PROGRAM_VERSION;\n }\n\n return info;\n }\n\n /**\n * Detect UTF-8 support\n * @returns Whether UTF-8 is supported\n */\n private checkUtf8Support(): boolean {\n const lang = this.envInfo.LANG || '';\n return lang.toUpperCase().includes('UTF-8') || lang.toUpperCase().includes('UTF8');\n }\n\n /**\n * Detect Unicode support\n * UTF-8 terminals usually support Unicode\n * @returns Whether Unicode is supported\n */\n private checkUnicodeSupport(): boolean {\n return this.checkUtf8Support();\n }\n\n /**\n * Detect Braille character support\n * Determine based on terminal program whitelist\n * @returns Whether Braille characters are supported\n */\n private checkBrailleSupport(): boolean {\n const termProgram = (this.envInfo.TERM_PROGRAM || '').toLowerCase();\n\n // Check whitelist\n return TerminalDetector.BRAILLE_SUPPORTED_TERMINALS.some((supportedTerm) =>\n termProgram.includes(supportedTerm),\n );\n }\n\n /**\n * Detect Block Elements character support\n * Most terminals supporting Unicode also support Block Elements\n * @returns Whether Block Elements are supported\n */\n private checkBlockElementsSupport(): boolean {\n return this.checkUnicodeSupport();\n }\n\n /**\n * Detect color support (16 colors or more)\n * @returns Whether colors are supported\n */\n private checkColorSupport(): boolean {\n const term = this.envInfo.TERM || '';\n const colorterm = this.envInfo.COLORTERM || '';\n\n // Check if TERM contains color identifier\n if (term.includes('color') || term.includes('256color')) {\n return true;\n }\n\n // Check COLORTERM\n if (colorterm.length > 0) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Detect true color support (24-bit RGB)\n * @returns Whether true color is supported\n */\n private checkTrueColorSupport(): boolean {\n const colorterm = this.envInfo.COLORTERM || '';\n return colorterm.toLowerCase() === 'truecolor' || colorterm === '24bit';\n }\n\n /**\n * Calculate comprehensive terminal capability score (0-100)\n * @returns Score\n */\n private calculateScore(): number {\n let score = 0;\n\n // UTF-8 support +20\n if (this.checkUtf8Support()) {\n score += 20;\n }\n\n // Unicode support +10 (UTF-8 included)\n if (this.checkUnicodeSupport()) {\n score += 10;\n }\n\n // Braille support +30 (advanced feature)\n if (this.checkBrailleSupport()) {\n score += 30;\n }\n\n // Block Elements support +10\n if (this.checkBlockElementsSupport()) {\n score += 10;\n }\n\n // Color support +15\n if (this.checkColorSupport()) {\n score += 15;\n }\n\n // True color support +15\n if (this.checkTrueColorSupport()) {\n score += 15;\n }\n\n return Math.min(score, 100);\n }\n\n /**\n * Detect terminal capabilities\n * @returns Terminal capability information\n */\n detect(): TerminalCapabilities {\n const supportsUtf8 = this.checkUtf8Support();\n const supportsUnicode = this.checkUnicodeSupport();\n const supportsBraille = this.checkBrailleSupport();\n const supportsBlockElements = this.checkBlockElementsSupport();\n const supportsColor = this.checkColorSupport();\n const supportsTrueColor = this.checkTrueColorSupport();\n const score = this.calculateScore();\n\n return {\n supportsUtf8,\n supportsUnicode,\n supportsBraille,\n supportsBlockElements,\n supportsColor,\n supportsTrueColor,\n score,\n };\n }\n\n /**\n * Get environment information\n * @returns Environment information\n */\n getEnvironmentInfo(): EnvironmentInfo {\n return { ...this.envInfo };\n }\n}\n\n/**\n * Global terminal detector instance\n */\nexport const terminalDetector = new TerminalDetector();\n","/**\n * Renderer Selector\n *\n * Automatically selects the optimal renderer based on terminal capabilities to achieve intelligent fallback\n */\n\nimport { BlockRenderer } from '../core/block';\nimport { BrailleRenderer } from '../core/braille';\nimport type { Renderer, RendererType } from '../core/renderer';\nimport { TerminalDetector } from './terminal';\nimport type { TerminalCapabilities } from './types';\n\n/**\n * Renderer Selector\n *\n * Automatically detects terminal capabilities and selects the optimal renderer\n * Supports custom fallback chains and renderer caching\n */\nexport class RendererSelector {\n /** Terminal detector */\n private detector: TerminalDetector;\n\n constructor(detector: TerminalDetector = new TerminalDetector()) {\n this.detector = detector;\n }\n\n /**\n * Creates a renderer instance of the specified type\n * @param type - Renderer type\n * @returns Renderer instance\n */\n private createRenderer(type: RendererType): Renderer {\n switch (type) {\n case 'braille':\n return new BrailleRenderer();\n case 'block':\n return new BlockRenderer();\n }\n }\n\n /**\n * Get renderer by type\n * @param type - Renderer type\n * @returns Renderer instance\n */\n getRenderer(type: RendererType): Renderer {\n return this.createRenderer(type);\n }\n\n /**\n * Check if a renderer type is supported by the current terminal\n * Used internally by InkHudProvider to determine the per-chart renderer\n * @param type - Renderer type\n * @returns Whether the renderer type is supported\n */\n isRendererTypeSupported(type: RendererType): boolean {\n const capabilities = this.detector.detect();\n const renderer = this.createRenderer(type);\n return this.isRendererSupported(renderer, capabilities);\n }\n\n /**\n * Check if the renderer meets terminal capability requirements\n * @param renderer - Renderer instance\n * @param capabilities - Terminal capabilities\n * @returns Whether requirements are met\n */\n private isRendererSupported(renderer: Renderer, capabilities: TerminalCapabilities): boolean {\n const metadata = renderer.getMetadata();\n\n // Check minimum score requirement\n if (capabilities.score < metadata.minScore) {\n return false;\n }\n\n // Check UTF-8 requirement\n if (metadata.requiresUtf8 && !capabilities.supportsUtf8) {\n return false;\n }\n\n // Check Unicode requirement\n if (metadata.requiresUnicode && !capabilities.supportsUnicode) {\n return false;\n }\n\n // Additional checks for specific renderers\n const rendererName = metadata.name;\n\n // Braille requires explicit support\n if (rendererName === 'braille' && !capabilities.supportsBraille) {\n return false;\n }\n\n // Block Elements requires Unicode support\n if (rendererName === 'block' && !capabilities.supportsBlockElements) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Automatically select the best renderer from a priority chain.\n *\n * @deprecated Prefer `<InkHudProvider renderers={{ line: 'block' }}>` combined\n * with `useChartRenderer(kind)`. This method remains as a low-level escape\n * hatch for custom renderer selection outside the React component tree.\n *\n * @param preferredChain - Priority chain (default: ['braille', 'block'])\n * @returns Selected renderer instance\n */\n selectBest(preferredChain: RendererType[] = ['braille', 'block']): Renderer {\n // Detect terminal capabilities\n const capabilities = this.detector.detect();\n\n // Traverse according to the priority chain\n for (const rendererType of preferredChain) {\n const renderer = this.getRenderer(rendererType);\n\n // Check whether requirements are met\n if (this.isRendererSupported(renderer, capabilities)) {\n return renderer;\n }\n }\n\n // Fallback to Block (requires UTF-8, minScore=30 — met by any modern terminal)\n return this.getRenderer('block');\n }\n\n /**\n * Get terminal capability information\n * @returns Terminal capabilities\n */\n getTerminalCapabilities(): TerminalCapabilities {\n return this.detector.detect();\n }\n}\n\n/**\n * Global RendererSelector instance\n */\nexport const rendererSelector = new RendererSelector();\n","/**\n * ink-hud Context Provider\n *\n * Provide dependency injection, replacing the global singleton\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { Renderer, RendererType } from '../core/renderer';\nimport { RendererSelector } from '../detect/selector';\nimport { TerminalDetector } from '../detect/terminal';\nimport type { TerminalCapabilities } from '../detect/types';\n\n// ============================================\n// Chart renderer configuration\n// ============================================\n\n/**\n * Chart types that use the pixel-canvas rendering system\n */\nexport type ChartKind = 'line' | 'area' | 'bar' | 'pie';\n\n/**\n * Per-chart-kind renderer assignment\n */\nexport type ChartRenderers = Record<ChartKind, RendererType>;\n\n/**\n * Default renderer per chart kind — pre-tuned for best visual output\n *\n * | Chart | Renderer | Reason |\n * |-------|----------|--------|\n * | line | braille | 2×4 sub-pixel grid renders smooth diagonals |\n * | area | braille | Fine-grained fill under curves |\n * | bar | block | 2×2 cells produce clean rectangular bar edges |\n * | pie | block | Solid fills create clean sector boundaries |\n */\nexport const DEFAULT_CHART_RENDERERS: ChartRenderers = {\n line: 'braille',\n area: 'braille',\n bar: 'block',\n pie: 'block',\n};\n\n// ============================================\n// Context\n// ============================================\n\n/**\n * InkHud Context value\n */\nexport interface InkHudContextValue {\n /** Renderer selector */\n selector: RendererSelector;\n\n /** Get terminal capabilities */\n getCapabilities: () => TerminalCapabilities;\n\n /** Get renderer of specified type */\n getRenderer: (type: RendererType) => Renderer;\n\n /**\n * Get the renderer configured for a specific chart kind.\n * In development mode, emits a one-time console.warn when falling back to\n * BlockRenderer because the configured renderer is not supported by the\n * current terminal. In production, the fallback is silent.\n */\n getRendererFor: (kind: ChartKind) => Renderer;\n}\n\n// Per-selector dedup map — one warning per (kind, target) pair per RendererSelector instance.\n// Using WeakMap ensures test isolation: each new RendererSelector gets a fresh Set so\n// module-level state does not bleed across test cases.\nconst selectorFallbackWarnings = new WeakMap<RendererSelector, Set<string>>();\n\nfunction warnFallback(selector: RendererSelector, kind: ChartKind, target: RendererType): void {\n if (process.env.NODE_ENV === 'production') return;\n let warned = selectorFallbackWarnings.get(selector);\n if (!warned) {\n warned = new Set<string>();\n selectorFallbackWarnings.set(selector, warned);\n }\n const key = `${kind}:${target}`;\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(\n `[ink-hud] Renderer '${target}' is not supported by the current terminal; ` +\n `falling back to 'block' for chart kind '${kind}'. ` +\n `Override via <InkHudProvider renderers={{ ${kind}: 'block' }}>.`,\n );\n}\n\n/**\n * Default Context (using global detector)\n */\nconst defaultSelector = new RendererSelector();\nconst defaultContext: InkHudContextValue = {\n selector: defaultSelector,\n getCapabilities: () => defaultSelector.getTerminalCapabilities(),\n getRenderer: (type) => defaultSelector.getRenderer(type),\n getRendererFor: (kind) => {\n const target = DEFAULT_CHART_RENDERERS[kind];\n if (defaultSelector.isRendererTypeSupported(target)) {\n return defaultSelector.getRenderer(target);\n }\n warnFallback(defaultSelector, kind, target);\n return defaultSelector.getRenderer('block');\n },\n};\n\nconst InkHudContext = createContext<InkHudContextValue>(defaultContext);\n\n/**\n * InkHud Provider Props\n */\nexport interface InkHudProviderProps {\n /**\n * Custom terminal detector\n * For testing or simulating different terminal environments\n */\n detector?: TerminalDetector;\n\n /**\n * Override the renderer used for specific chart kinds.\n * Unspecified kinds keep their default (see DEFAULT_CHART_RENDERERS).\n *\n * @example\n * ```tsx\n * // Force all line charts to use block renderer\n * <InkHudProvider renderers={{ line: 'block' }}>\n * <MyApp />\n * </InkHudProvider>\n * ```\n */\n renderers?: Partial<ChartRenderers>;\n\n children: React.ReactNode;\n}\n\n/**\n * InkHud Context Provider\n *\n * Encapsulate renderer selection logic, supports dependency injection.\n * Each chart kind ships with a pre-tuned default renderer — no per-component\n * configuration required.\n *\n * @example\n * ```tsx\n * // Standard usage (automatic detection, best renderer per chart)\n * <InkHudProvider>\n * <MyApp />\n * </InkHudProvider>\n *\n * // Inject mock for testing\n * <InkHudProvider detector={mockDetector}>\n * <MyApp />\n * </InkHudProvider>\n *\n * // Override renderer for specific charts\n * <InkHudProvider renderers={{ line: 'block', bar: 'braille' }}>\n * <MyApp />\n * </InkHudProvider>\n * ```\n */\nexport const InkHudProvider: React.FC<InkHudProviderProps> = ({\n detector,\n renderers,\n children,\n}) => {\n const value = useMemo<InkHudContextValue>(() => {\n const selector = detector ? new RendererSelector(detector) : defaultSelector;\n\n const mergedRenderers: ChartRenderers = {\n ...DEFAULT_CHART_RENDERERS,\n ...renderers,\n };\n\n const getRendererFor = (kind: ChartKind): Renderer => {\n const target = mergedRenderers[kind];\n if (selector.isRendererTypeSupported(target)) {\n return selector.getRenderer(target);\n }\n warnFallback(selector, kind, target);\n return selector.getRenderer('block');\n };\n\n return {\n selector,\n getCapabilities: () => selector.getTerminalCapabilities(),\n getRenderer: (type) => selector.getRenderer(type),\n getRendererFor,\n };\n }, [detector, renderers]);\n\n return <InkHudContext.Provider value={value}>{children}</InkHudContext.Provider>;\n};\n\n/**\n * Get InkHud Context\n *\n * Even without a Provider, returns the default Context (using the global detector)\n */\nexport function useInkHud(): InkHudContextValue {\n return useContext(InkHudContext);\n}\n\n/**\n * Get renderer selector\n *\n * Simplified Hook to directly get the selector\n */\nexport function useRendererSelector(): RendererSelector {\n return useInkHud().selector;\n}\n","/**\n * Gradient tool module\n *\n * Use tinygradient and chalk to implement terminal color gradients\n */\n\nimport chalk from 'chalk';\nimport tinygradient from 'tinygradient';\n\n/**\n * Generate gradient color array\n *\n * @param colors - Start and end color array (supports hex, rgb, css color names)\n * @param steps - Interpolation steps\n * @returns Chalk color function array\n *\n * @example\n * const gradient = createGradient(['#00f', '#0ff', '#0f0'], 10);\n * gradient[0]('text'); // Blue\n * gradient[9]('text'); // Green\n */\nexport function createGradient(colors: string[], steps: number): Array<(text: string) => string> {\n if (colors.length === 0) {\n return Array(steps).fill((text: string) => text);\n }\n\n if (colors.length === 1) {\n // Single color, no gradient needed\n const color = colors[0];\n if (color) {\n const colorFn = (text: string) => chalk.hex(color)(text);\n return Array(steps).fill(colorFn);\n }\n return Array(steps).fill((text: string) => text);\n }\n\n // Use tinygradient for the gradient\n const gradient = tinygradient(colors);\n const rgbColors = gradient.rgb(steps);\n\n return rgbColors.map((color) => {\n const hex = color.toHex();\n return (text: string) => chalk.hex(hex)(text);\n });\n}\n\n// One Dark palette definitions\n// Source: Atom One Dark Theme\nexport const ONE_DARK_PALETTES = {\n /** One Dark - Classic theme */\n standard: [\n '#61afef', // blue\n '#98c379', // green\n '#e5c07b', // yellow\n '#c678dd', // purple\n '#e06c75', // red\n '#56b6c2', // cyan\n '#d19a66', // orange\n '#abb2bf', // gray\n ],\n /** One Dark Vivid - More vibrant variant */\n vivid: [\n '#61afef', // blue\n '#98c379', // green\n '#e5c07b', // yellow\n '#c678dd', // purple\n '#e06c75', // red\n '#56b6c2', // cyan\n '#be5046', // dark red\n '#d19a66', // orange\n '#528bff', // bright blue\n ],\n};\n\n/**\n * Palette type\n * Supports built-in palette names or custom color arrays\n */\nexport type ColorPalette = 'one-dark' | 'one-dark-vivid' | string[];\n\n/**\n * Assign different colors for data series\n *\n * @param seriesCount - Number of series\n * @param palette - Palette configuration (default: 'one-dark')\n * @returns Color array (hex format)\n *\n * @example\n * const colors = assignColors(5);\n * // Use Vivid variant\n * const vividColors = assignColors(5, 'one-dark-vivid');\n */\nexport function assignColors(seriesCount: number, palette: ColorPalette = 'one-dark'): string[] {\n if (seriesCount === 0) {\n return [];\n }\n\n let baseColors: string[];\n\n if (Array.isArray(palette)) {\n baseColors = palette;\n } else {\n switch (palette) {\n case 'one-dark-vivid':\n baseColors = ONE_DARK_PALETTES.vivid;\n break;\n default:\n baseColors = ONE_DARK_PALETTES.standard;\n break;\n }\n }\n\n // If series count is within palette range, return slice directly\n // Prefer using first colors in palette to maintain consistency\n if (seriesCount <= baseColors.length) {\n return baseColors.slice(0, seriesCount);\n }\n\n // If series count exceeds palette, use gradient to generate more colors to cover full range\n const gradient = tinygradient(baseColors);\n return gradient.rgb(seriesCount).map((c) => c.toHex());\n}\n\n/**\n * Convert color string to chalk color function\n *\n * @param color - Color string (hex, css color names)\n * @returns Chalk color function\n *\n * @example\n * const colorFn = colorToChalk('#ff0000');\n * console.log(colorFn('Red text'));\n */\nexport function colorToChalk(color: string): (text: string) => string {\n // If it's a hex color (#rrggbb or #rgb)\n if (color.startsWith('#')) {\n return (text: string) => chalk.hex(color)(text);\n }\n\n // Try using chalk built-in colors\n // @ts-expect-error - chalk dynamic color access\n if (typeof chalk[color] === 'function') {\n // @ts-expect-error - chalk dynamic color access\n return (text: string) => chalk[color](text);\n }\n\n // Default to returning original text\n return (text: string) => text;\n}\n","/**\n * ThemeContext - Theme Context\n *\n * Provides unified color configuration, replacing hardcoded colors\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport { ONE_DARK_PALETTES } from '../utils/gradient';\n\n/**\n * Semantic color configuration\n */\nexport interface SemanticColors {\n /** Success/Up */\n success: string;\n /** Error/Down */\n error: string;\n /** Warning */\n warning: string;\n /** Info */\n info: string;\n /** Secondary/Disabled */\n muted: string;\n /** Primary text */\n text: string;\n /** Secondary text */\n textSecondary: string;\n}\n\n/**\n * Heatmap gradient configuration\n */\nexport interface HeatmapGradient {\n /** Gradient color array (from dark to light) */\n colors: string[];\n}\n\n/**\n * Theme configuration\n */\nexport interface Theme {\n /** Theme name */\n name: string;\n /** Series colors (for charts) */\n palette: string[];\n /** Semantic colors */\n semantic: SemanticColors;\n /** Heatmap gradient */\n heatmapGradient: string[];\n}\n\n/**\n * One Dark Theme (default)\n */\nexport const ONE_DARK_THEME: Theme = {\n name: 'one-dark',\n palette: ONE_DARK_PALETTES.standard,\n semantic: {\n success: '#98c379', // green\n error: '#e06c75', // red\n warning: '#e5c07b', // yellow\n info: '#61afef', // blue\n muted: '#5c6370', // gray\n text: '#abb2bf', // light gray\n textSecondary: '#5c6370', // dark gray\n },\n heatmapGradient: [\n '#282c34', // background (dark)\n '#56b6c2', // cyan\n '#98c379', // green\n '#e5c07b', // yellow\n '#61afef', // blue (light)\n ],\n};\n\n/**\n * Theme Context\n */\nconst ThemeContext = createContext<Theme>(ONE_DARK_THEME);\n\n/**\n * Theme Provider Props\n */\nexport interface ThemeProviderProps {\n /** Custom theme (optional) */\n theme?: Partial<Theme>;\n children: React.ReactNode;\n}\n\n/**\n * Theme Provider\n *\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n *\n * // Custom theme\n * <ThemeProvider theme={{ semantic: { success: '#00ff00' } }}>\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme: customTheme, children }) => {\n const mergedTheme = useMemo<Theme>(() => {\n if (!customTheme) {\n return ONE_DARK_THEME;\n }\n return {\n ...ONE_DARK_THEME,\n ...customTheme,\n semantic: {\n ...ONE_DARK_THEME.semantic,\n ...customTheme.semantic,\n },\n };\n }, [customTheme]);\n\n return <ThemeContext.Provider value={mergedTheme}>{children}</ThemeContext.Provider>;\n};\n\n/**\n * Get current theme\n *\n * @example\n * ```tsx\n * const theme = useTheme();\n * <Text color={theme.semantic.success}>Success</Text>\n * ```\n */\nexport function useTheme(): Theme {\n return useContext(ThemeContext);\n}\n\n/**\n * Get semantic colors\n *\n * @example\n * ```tsx\n * const colors = useSemanticColors();\n * <Text color={colors.error}>Error</Text>\n * ```\n */\nexport function useSemanticColors(): SemanticColors {\n const theme = useTheme();\n return theme.semantic;\n}\n","/**\n * Data scaling utility module\n *\n * Provides data normalization and linear scaling functions for mapping data to chart coordinate space\n */\n\n/**\n * Linear scale function\n * Map value from input domain to output domain\n *\n * @param value - Value to scale\n * @param domain - Input domain [min, max]\n * @param range - Output range [min, max]\n * @returns Scaled value\n *\n * @example\n * linearScale(50, [0, 100], [0, 10]); // Returns 5\n * linearScale(75, [0, 100], [0, 20]); // Returns 15\n */\nexport function linearScale(\n value: number,\n domain: [number, number],\n range: [number, number],\n): number {\n const [domainMin, domainMax] = domain;\n const [rangeMin, rangeMax] = range;\n\n // Handle case where domain range is 0\n if (domainMax === domainMin) {\n return rangeMin;\n }\n\n // Linear mapping formula: y = (x - x_min) / (x_max - x_min) * (y_max - y_min) + y_min\n const ratio = (value - domainMin) / (domainMax - domainMin);\n return ratio * (rangeMax - rangeMin) + rangeMin;\n}\n\n/**\n * Data normalization\n * Map array data to [0, 1] interval\n *\n * @param data - Original data array\n * @returns Normalized data array\n *\n * @example\n * normalize([0, 50, 100]); // Returns [0, 0.5, 1]\n * normalize([10, 20, 30]); // Returns [0, 0.5, 1]\n */\nexport function normalize(data: number[]): number[] {\n if (data.length === 0) {\n return [];\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n\n // If all values are same, return 0.5 for all (middle value)\n if (max === min) {\n return data.map(() => 0.5);\n }\n\n return data.map((value) => linearScale(value, [min, max], [0, 1]));\n}\n\n/**\n * Scale data to specified range\n * Map array data to specified output range\n *\n * @param data - Original data array\n * @param range - Output range [min, max]\n * @returns Scaled data array\n *\n * @example\n * scaleToRange([0, 50, 100], [0, 10]); // Returns [0, 5, 10]\n * scaleToRange([-10, 0, 10], [0, 100]); // Returns [0, 50, 100]\n */\nexport function scaleToRange(data: number[], range: [number, number]): number[] {\n if (data.length === 0) {\n return [];\n }\n\n const min = Math.min(...data);\n const max = Math.max(...data);\n\n // If all values are same, return the range midpoint\n if (max === min) {\n const midPoint = (range[0] + range[1]) / 2;\n return data.map(() => midPoint);\n }\n\n return data.map((value) => linearScale(value, [min, max], range));\n}\n\n/**\n * Clamp value within specified range (clamp)\n *\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n *\n * @example\n * clamp(5, 0, 10); // Returns 5\n * clamp(-5, 0, 10); // Returns 0\n * clamp(15, 0, 10); // Returns 10\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * Geometry calculation utility module\n *\n * Provides helper functions for calculating geometric shapes like circles and arcs\n */\n\n/**\n * Midpoint Circle Algorithm\n * Calculate all points on the circle (8 symmetry points)\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @returns Array of coordinates for all points on circle\n *\n * @example\n * const points = midpointCircle(50, 50, 20);\n * points.forEach(([x, y]) => {\n * console.log(`Point coordinates: (${x}, ${y})`);\n * });\n */\nexport function midpointCircle(\n centerX: number,\n centerY: number,\n radius: number,\n): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n\n let x = 0;\n let y = radius;\n let d = 1 - radius;\n\n while (x <= y) {\n // 8 symmetry points\n points.push(\n [centerX + x, centerY + y],\n [centerX - x, centerY + y],\n [centerX + x, centerY - y],\n [centerX - x, centerY - y],\n [centerX + y, centerY + x],\n [centerX - y, centerY + x],\n [centerX + y, centerY - x],\n [centerX - y, centerY - x],\n );\n\n x++;\n if (d < 0) {\n d += 2 * x + 1;\n } else {\n y--;\n d += 2 * (x - y) + 1;\n }\n }\n\n return points;\n}\n\n/**\n * Calculate point coordinates at specified angle on arc\n * Using parametric equations: x = centerX + r * cos(θ), y = centerY + r * sin(θ)\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @param angle - Angle (radians)\n * @returns Point coordinates [x, y]\n *\n * @example\n * // Calculate the point at 45° (π/4 radians)\n * const [x, y] = pointOnArc(50, 50, 20, Math.PI / 4);\n */\nexport function pointOnArc(\n centerX: number,\n centerY: number,\n radius: number,\n angle: number,\n): [number, number] {\n const x = centerX + radius * Math.cos(angle);\n const y = centerY + radius * Math.sin(angle);\n return [x, y];\n}\n\n/**\n * Calculate multiple points on the arc\n *\n * @param centerX - Center x coordinate\n * @param centerY - Center y coordinate\n * @param radius - Radius\n * @param startAngle - Start angle (radians)\n * @param endAngle - End angle (radians)\n * @param steps - Steps (default calculated based on radius)\n * @returns Array of coordinates for all points on arc\n *\n * @example\n * // Calculate arc points from 0° to 90°\n * const points = arcPoints(50, 50, 20, 0, Math.PI / 2, 20);\n */\nexport function arcPoints(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n steps?: number,\n): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n\n // Ensure correct angle order\n let start = startAngle;\n let end = endAngle;\n if (start > end) {\n [start, end] = [end, start];\n }\n\n // Calculate number of steps (default based on radius and angle range)\n const angleRange = end - start;\n const stepCount = steps ?? Math.max(10, Math.ceil(radius * angleRange));\n\n // Calculate angle step\n const angleStep = angleRange / stepCount;\n\n for (let i = 0; i <= stepCount; i++) {\n const angle = start + i * angleStep;\n points.push(pointOnArc(centerX, centerY, radius, angle));\n }\n\n return points;\n}\n\n/**\n * Convert angle from degrees to radians\n *\n * @param degrees - Angle (degrees)\n * @returns Angle (radians)\n *\n * @example\n * const radians = degreesToRadians(90); // π/2\n */\nexport function degreesToRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\n/**\n * Convert angle from radians to degrees\n *\n * @param radians - Angle (radians)\n * @returns Angle (degrees)\n *\n * @example\n * const degrees = radiansToDegrees(Math.PI / 2); // 90\n */\nexport function radiansToDegrees(radians: number): number {\n return (radians * 180) / Math.PI;\n}\n\n/**\n * Calculate distance between two points\n *\n * @param x1 - First point x coordinate\n * @param y1 - First point y coordinate\n * @param x2 - Second point x coordinate\n * @param y2 - Second point y coordinate\n * @returns Distance\n *\n * @example\n * const distance = distanceBetweenPoints(0, 0, 3, 4); // 5\n */\nexport function distanceBetweenPoints(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return Math.sqrt(dx * dx + dy * dy);\n}\n","/**\n * Data downsampling module\n *\n * Provides downsampling algorithms for large datasets to display many data points in limited-width charts\n */\n\nfunction computeAveragePoint(\n data: number[],\n startIndexInclusive: number,\n endIndexExclusive: number,\n): { x: number; y: number } {\n const count = endIndexExclusive - startIndexInclusive;\n if (count <= 0) {\n return { x: 0, y: 0 };\n }\n\n let sumX = 0;\n let sumY = 0;\n for (let i = startIndexInclusive; i < endIndexExclusive; i++) {\n sumX += i;\n sumY += data[i] ?? 0;\n }\n\n return { x: sumX / count, y: sumY / count };\n}\n\nfunction triangleArea(\n prevX: number,\n prevY: number,\n avgX: number,\n avgY: number,\n pointX: number,\n pointY: number,\n): number {\n return Math.abs((prevX - avgX) * (pointY - prevY) - (prevX - pointX) * (avgY - prevY));\n}\n\nfunction findLargestTrianglePointIndex(\n data: number[],\n bucketStart: number,\n bucketEnd: number,\n prevX: number,\n prevY: number,\n avgX: number,\n avgY: number,\n): number {\n let maxArea = -1;\n let maxIdx = bucketStart;\n\n for (let i = bucketStart; i < bucketEnd; i++) {\n const area = triangleArea(prevX, prevY, avgX, avgY, i, data[i] ?? 0);\n if (area > maxArea) {\n maxArea = area;\n maxIdx = i;\n }\n }\n\n return maxIdx;\n}\n\n/**\n * LTTB (Largest Triangle Three Buckets) algorithm\n * An efficient data downsampling algorithm that preserves visually important data points\n *\n * Algorithm principles:\n * 1. Always preserve first and last points\n * 2. Divide intermediate data into multiple buckets\n * 3. Select the point with largest triangle area in each bucket (forming largest triangle with adjacent points)\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = Array.from({ length: 1000 }, (_, i) => Math.sin(i / 10));\n * const sampled = lttb(data, 100); // Downsample from 1000 points to 100 points\n */\nexport function lttb(data: number[], threshold: number): number[] {\n // If number of data points is less than or equal to threshold, return directly\n if (data.length <= threshold) {\n return data;\n }\n\n // If threshold is too small, at least preserve first and last points\n if (threshold <= 2) {\n return [data[0] ?? 0, data[data.length - 1] ?? 0];\n }\n\n const sampled: number[] = [data[0] ?? 0]; // Always preserve the first point\n let prevIndex = 0;\n\n // Calculate bucket size\n const bucketSize = (data.length - 2) / (threshold - 2);\n\n // Iterate through buckets\n for (let i = 0; i < threshold - 2; i++) {\n // Start and end indices of current bucket\n const bucketStart = Math.floor(i * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 1) * bucketSize) + 1;\n\n // Center point of the next bucket (for triangle calculation)\n const nextBucketStart = bucketEnd;\n const nextBucketEnd = Math.min(Math.floor((i + 2) * bucketSize) + 1, data.length);\n\n // Calculate average point of next bucket (as third vertex of triangle)\n const { x: avgX, y: avgY } = computeAveragePoint(data, nextBucketStart, nextBucketEnd);\n\n // Previously selected point\n const prevX = prevIndex;\n const prevY = data[prevIndex] ?? 0;\n\n const maxIdx = findLargestTrianglePointIndex(\n data,\n bucketStart,\n bucketEnd,\n prevX,\n prevY,\n avgX,\n avgY,\n );\n\n sampled.push(data[maxIdx] ?? 0);\n prevIndex = maxIdx;\n }\n\n // Always preserve the last point\n sampled.push(data[data.length - 1] ?? 0);\n\n return sampled;\n}\n\n/**\n * Simple fixed-interval downsampling\n * Select one data point at fixed intervals\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n * const sampled = fixedIntervalDownsampling(data, 5); // [1, 3, 5, 7, 10]\n */\nexport function fixedIntervalDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const step = (data.length - 1) / (threshold - 1);\n\n for (let i = 0; i < threshold; i++) {\n const index = Math.round(i * step);\n sampled.push(data[index] ?? 0);\n }\n\n return sampled;\n}\n\n/**\n * Average Downsampling\n * Divide data into multiple buckets, taking the average value for each bucket\n *\n * @param data - Original data array\n * @param threshold - Target number of data points\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 2, 3, 4, 5, 6, 7, 8];\n * const sampled = averageDownsampling(data, 4); // [1.5, 3.5, 5.5, 7.5]\n */\nexport function averageDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const bucketSize = data.length / threshold;\n\n for (let i = 0; i < threshold; i++) {\n const bucketStart = Math.floor(i * bucketSize);\n const bucketEnd = Math.floor((i + 1) * bucketSize);\n\n let sum = 0;\n let count = 0;\n\n for (let j = bucketStart; j < bucketEnd; j++) {\n sum += data[j] ?? 0;\n count++;\n }\n\n sampled.push(count > 0 ? sum / count : 0);\n }\n\n return sampled;\n}\n\n/**\n * Min-Max Downsampling\n * Divide data into multiple buckets, preserving the Maximum and Minimum values for each bucket\n * Suitable for preserving peaks and valleys in data\n *\n * @param data - Original data array\n * @param threshold - Target number of data points (actual returned points will be 2x threshold)\n * @returns Downsampled data array\n *\n * @example\n * const data = [1, 5, 2, 8, 3, 6, 4, 7];\n * const sampled = minMaxDownsampling(data, 4); // [1, 5, 2, 8, 3, 6, 4, 7]\n */\nexport function minMaxDownsampling(data: number[], threshold: number): number[] {\n if (data.length <= threshold) {\n return data;\n }\n\n const sampled: number[] = [];\n const bucketSize = data.length / threshold;\n\n for (let i = 0; i < threshold; i++) {\n const bucketStart = Math.floor(i * bucketSize);\n const bucketEnd = Math.floor((i + 1) * bucketSize);\n\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (let j = bucketStart; j < bucketEnd; j++) {\n const value = data[j] ?? 0;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n\n // Preserve Minimum and Maximum values\n sampled.push(min, max);\n }\n\n return sampled;\n}\n","/**\n * Data smooth transition Hook module\n *\n * Provides smooth animation effects for data changes\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * Easing function type\n */\nexport type EasingFunction = (t: number) => number;\n\n/**\n * Quadratic easing function (accelerate then decelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n/**\n * Linear easing function (constant speed)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeLinear(t: number): number {\n return t;\n}\n\n/**\n * Cubic ease-out function (decelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\n\n/**\n * Cubic ease-in function (accelerate)\n * @param t - Progress (0-1)\n * @returns Eased progress (0-1)\n */\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\n\n/**\n * Data smooth transition Hook\n * Smooth transition to new value when target changes\n *\n * @param targetValue - Target value\n * @param duration - Transition duration (ms, default 300)\n * @param easingFn - Easing function (default easeInOutQuad)\n * @returns Current smooth value\n *\n * @example\n * const smoothValue = useSmooth(cpuUsage, 500);\n * return <LineChart series={[{ name: 'Value', data: [smoothValue] }]} />;\n */\nexport function useSmooth(\n targetValue: number,\n duration = 300,\n easingFn: EasingFunction = easeInOutQuad,\n): number {\n const [currentValue, setCurrentValue] = useState(targetValue);\n const startValueRef = useRef(targetValue);\n const startTimeRef = useRef<number | null>(null);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n // If target value hasn't changed, no animation needed\n if (targetValue === currentValue) {\n return;\n }\n\n startValueRef.current = currentValue;\n startTimeRef.current = Date.now();\n\n const frameInterval = 1000 / 30; // 30 FPS\n\n const animate = () => {\n const now = Date.now();\n const elapsed = now - (startTimeRef.current ?? now);\n const progress = Math.min(elapsed / duration, 1);\n\n const easedProgress = easingFn(progress);\n const newValue =\n startValueRef.current + (targetValue - startValueRef.current) * easedProgress;\n\n setCurrentValue(newValue);\n\n if (progress < 1) {\n timerRef.current = setTimeout(animate, frameInterval);\n }\n };\n\n timerRef.current = setTimeout(animate, frameInterval);\n\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, [targetValue, duration, easingFn, currentValue]);\n\n return currentValue;\n}\n\n/**\n * Array data smooth transition Hook\n * Smooth transition to new data when target changes\n *\n * @param targetData - Target data array\n * @param duration - Transition duration (ms, default 300)\n * @param easingFn - Easing function (default easeInOutQuad)\n * @returns Current smooth data array\n *\n * @example\n * const smoothData = useSmoothArray(memoryData, 500);\n * return <LineChart data={[{ name: 'Memory', data: smoothData }]} />;\n */\nexport function useSmoothArray(\n targetData: number[],\n duration = 300,\n easingFn: EasingFunction = easeInOutQuad,\n): number[] {\n const [currentData, setCurrentData] = useState(targetData);\n const startDataRef = useRef(targetData);\n const startTimeRef = useRef<number | null>(null);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n // If data length changes, use new data directly (no smoothing)\n if (targetData.length !== currentData.length) {\n setCurrentData(targetData);\n return;\n }\n\n // If data hasn't changed, no animation needed\n const hasChanged = targetData.some((value, i) => value !== currentData[i]);\n if (!hasChanged) {\n return;\n }\n\n startDataRef.current = currentData;\n startTimeRef.current = Date.now();\n\n const frameInterval = 1000 / 30; // 30 FPS\n\n const animate = () => {\n const now = Date.now();\n const elapsed = now - (startTimeRef.current ?? now);\n const progress = Math.min(elapsed / duration, 1);\n\n const easedProgress = easingFn(progress);\n const newData = targetData.map((target, i) => {\n const start = startDataRef.current[i] ?? 0;\n return start + (target - start) * easedProgress;\n });\n\n setCurrentData(newData);\n\n if (progress < 1) {\n timerRef.current = setTimeout(animate, frameInterval);\n }\n };\n\n timerRef.current = setTimeout(animate, frameInterval);\n\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, [targetData, duration, easingFn, currentData]);\n\n return currentData;\n}\n\n/**\n * Throttling Hook\n * Limit animation frame rate to avoid terminal flicker\n *\n * @param value - Current value\n * @param fps - Target frame rate (default 30)\n * @returns Throttled value\n *\n * @example\n * const throttledValue = useThrottle(cpuUsage, 30);\n */\nexport function useThrottle<T>(value: T, fps = 30): T {\n const [throttledValue, setThrottledValue] = useState(value);\n const lastUpdateRef = useRef(Date.now());\n\n useEffect(() => {\n const now = Date.now();\n const interval = 1000 / fps;\n const elapsed = now - lastUpdateRef.current;\n\n if (elapsed >= interval) {\n setThrottledValue(value);\n lastUpdateRef.current = now;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n setThrottledValue(value);\n lastUpdateRef.current = Date.now();\n }, interval - elapsed);\n\n return () => clearTimeout(timeoutId);\n }, [value, fps]);\n\n return throttledValue;\n}\n","/**\n * Terminal image protocol capability detection\n */\n\nexport type ImageProtocol = 'kitty' | 'iterm2' | null;\n\n/**\n * Detect which image protocol (if any) the current terminal supports.\n *\n * Priority: Kitty Graphics > iTerm2 Inline Images\n * Users can override by setting INKHU_IMAGE_PROTOCOL=kitty|iterm2|none\n */\nexport function detectImageProtocol(env: NodeJS.ProcessEnv = process.env): ImageProtocol {\n // Manual override\n const override = env.INKHU_IMAGE_PROTOCOL;\n if (override === 'kitty') return 'kitty';\n if (override === 'iterm2') return 'iterm2';\n if (override === 'none') return null;\n\n // Kitty — dedicated env var\n if (env.KITTY_WINDOW_ID) return 'kitty';\n\n const tp = (env.TERM_PROGRAM ?? '').toLowerCase();\n\n // WezTerm and Ghostty speak Kitty Graphics natively\n if (tp === 'wezterm' || tp === 'ghostty') return 'kitty';\n\n // VS Code integrated terminal supports Kitty since v1.110 (Feb 2026),\n // but requires terminal.integrated.enableImages=true — opt-in only.\n // Users who enable it should set INKHU_IMAGE_PROTOCOL=kitty.\n\n // iTerm2 (macOS)\n if (tp === 'iterm.app') return 'iterm2';\n\n return null;\n}\n","/**\n * iTerm2 Inline Images Protocol encoder\n *\n * Encodes a PNG buffer as an OSC 1337 escape sequence for iTerm2.\n *\n * Spec: https://iterm2.com/documentation-images.html\n */\n\n/**\n * Encode a PNG buffer as an iTerm2 inline image escape sequence.\n *\n * @param pngBuffer - Raw PNG data\n * @param cols - Desired display width in character columns (optional)\n */\nexport function encodeIterm2(pngBuffer: Buffer, cols?: number): string {\n const b64 = pngBuffer.toString('base64');\n const args = ['inline=1', 'preserveAspectRatio=1'];\n if (cols !== undefined) args.push(`width=${cols}`);\n // OSC 1337 ; File=<args>:<base64> BEL\n return `\\x1b]1337;File=${args.join(';')}:${b64}\\x07`;\n}\n","/**\n * Kitty Graphics Protocol encoder\n *\n * Spec: https://sw.kovidgoyal.net/kitty/graphics-protocol/\n */\n\nconst CHUNK_SIZE = 4096;\n\n/**\n * Combining diacritical marks used to encode row/col indices in Unicode Placeholder mode.\n * Each index maps to a zero-width combining character (string-width = 0).\n * Spec: https://sw.kovidgoyal.net/kitty/graphics-protocol/#unicode-placeholders\n */\n// Full set of combining diacritical marks valid for Kitty Unicode Placeholder mode.\n// Source: https://sw.kovidgoyal.net/kitty/graphics-protocol/#unicode-placeholders\n// 256 entries — supports grids up to 256×256 cells (≫ any realistic terminal size).\nconst DIACRITICS = [\n // 0–99 (original set)\n 0x0305, 0x030d, 0x030e, 0x0310, 0x0312, 0x033d, 0x033e, 0x033f, 0x0346, 0x034a, 0x034b, 0x034c,\n 0x0350, 0x0351, 0x0352, 0x0357, 0x035b, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369,\n 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0592,\n 0x0593, 0x0594, 0x0595, 0x0597, 0x0598, 0x0599, 0x059c, 0x059d, 0x059e, 0x059f, 0x05a0, 0x05a1,\n 0x05a8, 0x05a9, 0x05ab, 0x05ac, 0x05af, 0x05c4, 0x0610, 0x0611, 0x0612, 0x0613, 0x0614, 0x0615,\n 0x0616, 0x0617, 0x0657, 0x0658, 0x0659, 0x065a, 0x065b, 0x065d, 0x065e, 0x06d6, 0x06d7, 0x06d8,\n 0x06d9, 0x06da, 0x06db, 0x06dc, 0x06df, 0x06e0, 0x06e1, 0x06e2, 0x06e4, 0x06e7, 0x06e8, 0x06eb,\n 0x06ec, 0x0730, 0x0732, 0x0733, 0x0735, 0x0736, 0x073a, 0x073d, 0x073f, 0x0740, 0x0741, 0x0743,\n 0x0745, 0x0747, 0x0749, 0x074a,\n // 100–107\n 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, 0x07f0, 0x07f1, 0x07f3,\n // 108–128\n 0x0816, 0x0817, 0x0818, 0x0819, 0x081b, 0x081c, 0x081d, 0x081e, 0x081f, 0x0820, 0x0821, 0x0822,\n 0x0823, 0x0825, 0x0826, 0x0827, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d,\n // 129–131\n 0x0951, 0x0953, 0x0954,\n // 132–135\n 0x0f82, 0x0f83, 0x0f86, 0x0f87,\n // 136–138\n 0x135d, 0x135e, 0x135f,\n // 139\n 0x17dd,\n // 140\n 0x193a,\n // 141–149\n 0x1a17, 0x1a75, 0x1a76, 0x1a77, 0x1a78, 0x1a79, 0x1a7a, 0x1a7b, 0x1a7c,\n // 150–158\n 0x1b6b, 0x1b6c, 0x1b6d, 0x1b6e, 0x1b6f, 0x1b70, 0x1b71, 0x1b72, 0x1b73,\n // 159–173\n 0x1cd0, 0x1cd1, 0x1cd2, 0x1cda, 0x1cdb, 0x1ce0, 0x1ce1, 0x1ce2, 0x1ce3, 0x1ce4, 0x1ce5, 0x1ce6,\n 0x1ce7, 0x1ce8, 0x1ced,\n // 174–176\n 0x1cf4, 0x1cf8, 0x1cf9,\n // 177–187\n 0x1dc0, 0x1dc1, 0x1dc3, 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, 0x1dc8, 0x1dc9, 0x1dcb, 0x1dcc,\n // 188–210\n 0x1dd1, 0x1dd2, 0x1dd3, 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, 0x1ddc,\n 0x1ddd, 0x1dde, 0x1ddf, 0x1de0, 0x1de1, 0x1de2, 0x1de3, 0x1de4, 0x1de5, 0x1de6, 0x1dfe,\n // 211–222\n 0x20d0, 0x20d1, 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20db, 0x20dc, 0x20e1, 0x20e7, 0x20e9, 0x20f0,\n // 223–225\n 0x2cef, 0x2cf0, 0x2cf1,\n // 226–255\n 0x2de0, 0x2de1, 0x2de2, 0x2de3, 0x2de4, 0x2de5, 0x2de6, 0x2de7, 0x2de8, 0x2de9, 0x2dea, 0x2deb,\n 0x2dec, 0x2ded, 0x2dee, 0x2def, 0x2df0, 0x2df1, 0x2df2, 0x2df3, 0x2df4, 0x2df5, 0x2df6, 0x2df7,\n 0x2df8, 0x2df9, 0x2dfa, 0x2dfb, 0x2dfc, 0x2dfd,\n];\n\n/**\n * Encode a PNG buffer as a Kitty Graphics upload sequence (Unicode Placeholder mode).\n *\n * Unlike `encodeKitty` (a=T, immediate display), this stores the image under a\n * numeric ID without rendering it. The caller must then write placeholder characters\n * to select which cells display the image (see `encodeKittyPlaceholders`).\n *\n * Upload params:\n * a=T — transmit\n * U=1 — Unicode Placeholder virtual placement\n * i= — image ID (1–4294967295)\n * f=100 — PNG format\n * q=2 — quiet (suppress OK/error response)\n * c=, r= — nominal cell dimensions (informational for the terminal)\n */\nexport function encodeKittyUpload(\n pngBuffer: Buffer,\n cols: number,\n rows: number,\n imageId: number,\n): string {\n const b64 = pngBuffer.toString('base64');\n const parts: string[] = [];\n\n for (let i = 0; i < b64.length; i += CHUNK_SIZE) {\n const data = b64.slice(i, i + CHUNK_SIZE);\n const isFirst = i === 0;\n const isLast = i + CHUNK_SIZE >= b64.length;\n\n let params: string;\n if (isFirst) {\n const more = isLast ? 0 : 1;\n params = `a=T,U=1,i=${imageId},f=100,q=2,m=${more},c=${cols},r=${rows}`;\n } else {\n params = `m=${isLast ? 0 : 1},q=2`;\n }\n\n parts.push(`\\x1b_G${params};${data}\\x1b\\\\`);\n }\n\n return parts.join('');\n}\n\n/**\n * Build placeholder character rows for a previously-uploaded Kitty image.\n *\n * Each cell is represented by:\n * - fg color encoding the image ID: ESC[38;2;R;G;Bm\n * - U+10EEEE (Kitty placeholder, string-width=1)\n * - DIACRITICS[row] (zero-width combining mark)\n * - DIACRITICS[col] (zero-width combining mark)\n * - U+0020 (trailing space) — only when trailingSpace=true (default)\n *\n * trailingSpace=true → each cell = 2 terminal columns (Heatmap, 1 char + 1 space layout)\n * trailingSpace=false → each cell = 1 terminal column (Sparkline, 1 char per column layout)\n *\n * Returns a string with `rows` lines separated by '\\n' (no trailing newline).\n */\nexport function encodeKittyPlaceholders(\n cols: number,\n rows: number,\n imageId: number,\n options: { trailingSpace?: boolean } = {},\n): string {\n const { trailingSpace = true } = options;\n const r = (imageId >> 16) & 0xff;\n const g = (imageId >> 8) & 0xff;\n const b = imageId & 0xff;\n const colorSeq = `\\x1b[38;2;${r};${g};${b}m`;\n const resetSeq = '\\x1b[39m';\n\n // U+10EEEE encoded as UTF-16 surrogate pair → UTF-8\n const placeholder = '\\u{10EEEE}';\n\n const maxDim = DIACRITICS.length; // 256\n if (rows > maxDim || cols > maxDim) {\n throw new RangeError(\n `encodeKittyPlaceholders: rows (${rows}) and cols (${cols}) must each be ≤ ${maxDim}`,\n );\n }\n\n const lines: string[] = [];\n for (let row = 0; row < rows; row++) {\n const rowMark = String.fromCodePoint(DIACRITICS[row] ?? 0);\n let line = colorSeq;\n for (let col = 0; col < cols; col++) {\n const colMark = String.fromCodePoint(DIACRITICS[col] ?? 0);\n // placeholder char + row diacritic + col diacritic + trailing space\n line += placeholder + rowMark + colMark + (trailingSpace ? ' ' : '');\n }\n line += resetSeq;\n lines.push(line);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Delete a previously-uploaded Kitty image by ID.\n * Write this to stdout when the component unmounts to free terminal memory.\n */\nexport function encodeKittyDelete(imageId: number): string {\n return `\\x1b_Ga=d,d=I,i=${imageId}\\x1b\\\\`;\n}\n\n/**\n * Encode a PNG buffer as a Kitty sequence that transmits and displays immediately\n * (legacy / PoC mode, no image ID). Use `encodeKittyUpload` + `encodeKittyPlaceholders`\n * for ink integration instead.\n */\nexport function encodeKitty(pngBuffer: Buffer, cols: number, rows: number): string {\n const b64 = pngBuffer.toString('base64');\n const parts: string[] = [];\n\n for (let i = 0; i < b64.length; i += CHUNK_SIZE) {\n const data = b64.slice(i, i + CHUNK_SIZE);\n const isFirst = i === 0;\n const isLast = i + CHUNK_SIZE >= b64.length;\n\n let params: string;\n if (isFirst) {\n const more = isLast ? 0 : 1;\n params = `a=T,f=100,q=2,m=${more},c=${cols},r=${rows}`;\n } else {\n params = `m=${isLast ? 0 : 1},q=2`;\n }\n\n parts.push(`\\x1b_G${params};${data}\\x1b\\\\`);\n }\n\n return parts.join('');\n}\n","import { useStdout } from 'ink';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { detectImageProtocol } from '../render/capabilities';\nimport { encodeIterm2 } from '../render/image/iterm2';\nimport {\n encodeKittyDelete,\n encodeKittyPlaceholders,\n encodeKittyUpload,\n} from '../render/image/kitty';\n\n// Single shared counter — all image-mode components draw from this namespace\n// so Kitty image IDs are unique across the entire application.\nlet nextImageId = 1;\n\nexport interface UseImageProtocolOptions {\n /**\n * 'character' disables image mode entirely; 'image' forces it (no-op when unsupported);\n * 'auto' detects at runtime and falls back to character mode.\n */\n mode: 'auto' | 'image' | 'character';\n\n /**\n * Number of Kitty placeholder cells (= columns in the Kitty image grid).\n * With trailingSpace=true each cell is 2 terminal cols wide (U+10EEEE + space).\n * With trailingSpace=false each cell is 1 terminal col wide.\n */\n charCols: number;\n\n /** Number of placeholder rows (= rows in the Kitty image grid). */\n charRows: number;\n\n /** Pre-built PNG buffer. null suppresses image rendering for this render cycle. */\n pngBuf: Buffer | null;\n\n /**\n * Append a trailing space after each Kitty placeholder cell.\n * true → 2 terminal cols/cell — use for components whose character mode\n * renders \"char + space\" per data cell (e.g. Heatmap's \"■ \").\n * false → 1 terminal col/cell — use for components with 1-char-per-column\n * layout (e.g. Sparkline).\n * @default true\n */\n trailingSpace?: boolean;\n}\n\nexport interface UseImageProtocolResult {\n /** True when image protocol is active and a PNG has been uploaded. */\n useImage: boolean;\n\n /**\n * One string per charRow to render as <Text> elements (Kitty protocol).\n * null when Kitty is not the active protocol.\n */\n kittyLines: string[] | null;\n\n /**\n * Width in terminal columns for blank placeholder rows (iTerm2 protocol).\n * null when iTerm2 is not the active protocol.\n * Render charRows blank lines of this width to reserve the image's space.\n */\n iterm2Cols: number | null;\n}\n\n/**\n * Shared hook for image-mode rendering (Heatmap, Sparkline, …).\n *\n * Handles: protocol detection, stable image ID management, Kitty upload/cleanup\n * effects, iTerm2 cursor-up write, and placeholder data for the calling component.\n */\nexport function useImageProtocol({\n mode,\n charCols,\n charRows,\n pngBuf,\n trailingSpace = true,\n}: UseImageProtocolOptions): UseImageProtocolResult {\n const { stdout } = useStdout();\n\n // Stable image ID for this component instance.\n // null sentinel is unambiguous (0 could theoretically be a valid ID).\n const imageIdRef = useRef<number | null>(null);\n if (imageIdRef.current === null) {\n imageIdRef.current = nextImageId++;\n }\n const imageId = imageIdRef.current;\n\n const protocol = useMemo(() => {\n if (mode === 'character') return null;\n return detectImageProtocol();\n }, [mode]);\n\n const useImage =\n protocol !== null &&\n mode !== 'character' &&\n pngBuf !== null &&\n charCols > 0 &&\n charRows > 0;\n\n // Kitty: upload new PNG when pngBuf changes; delete stored image on unmount.\n // useImage is intentionally excluded from deps — its constituent values\n // (protocol, pngBuf, charCols, charRows, mode) are already listed individually.\n useEffect(() => {\n if (\n protocol !== 'kitty' ||\n !pngBuf ||\n charCols <= 0 ||\n charRows <= 0 ||\n mode === 'character'\n )\n return;\n stdout.write(encodeKittyUpload(pngBuf, charCols, charRows, imageId));\n return () => {\n stdout.write(encodeKittyDelete(imageId));\n };\n }, [mode, protocol, pngBuf, charCols, charRows, imageId, stdout]);\n\n // iTerm2: overwrite the placeholder region on each pngBuf change.\n useEffect(() => {\n if (\n protocol !== 'iterm2' ||\n !pngBuf ||\n charCols <= 0 ||\n charRows <= 0 ||\n mode === 'character'\n )\n return;\n const terminalCols = charCols * (trailingSpace ? 2 : 1);\n const seq = encodeIterm2(pngBuf, terminalCols);\n stdout.write(`\\x1b[${charRows}A\\x1b[0G${seq}\\x1b[${charRows}B`);\n }, [mode, protocol, pngBuf, charCols, charRows, trailingSpace, stdout]);\n\n if (!useImage) {\n return { useImage: false, kittyLines: null, iterm2Cols: null };\n }\n\n if (protocol === 'kitty') {\n const text = encodeKittyPlaceholders(charCols, charRows, imageId, { trailingSpace });\n return { useImage: true, kittyLines: text.split('\\n'), iterm2Cols: null };\n }\n\n // iTerm2\n return {\n useImage: true,\n kittyLines: null,\n iterm2Cols: charCols * (trailingSpace ? 2 : 1),\n };\n}\n","import { Box, useStdout } from 'ink';\nimport React, { createContext, useContext, useEffect, useState } from 'react';\n\n// Context to pass grid configuration to items\ninterface GridContextValue {\n columns: number;\n gap: number;\n totalWidth: number;\n rowHeight?: number | string | undefined;\n /** Pre-calculated widths for each GridItem (by index) */\n itemWidths?: number[];\n}\n\nconst GridContext = createContext<GridContextValue>({\n columns: 12,\n gap: 0,\n totalWidth: 80, // Fallback\n});\n\n// Context to pass available width to immediate children (like Charts)\nexport interface GridItemContextValue {\n width?: number; // Available width for the content (excluding padding)\n height?: number | string | undefined; // Available height\n}\n\nexport const GridItemContext = createContext<GridItemContextValue | null>(null);\n\nexport interface GridProps {\n /** Number of columns in the grid (default: 12) */\n columns?: number;\n\n /** Gap between items (horizontal and vertical) */\n gap?: number;\n\n /**\n * Total width of the grid in characters.\n * If not provided, it will automatically use the terminal width (stdout.columns).\n */\n width?: number;\n\n /**\n * Width offset to subtract from the terminal width when auto-calculating.\n * Use this to account for parent padding or borders.\n * @deprecated Recommend wrapping content with `<Panel>`, which automatically handles border overhead\n */\n widthOffset?: number;\n\n /**\n * Default height for all rows/items in the grid.\n * Can be overridden by individual GridItem height prop.\n */\n rowHeight?: number | string | undefined;\n\n /** Children should be GridItem components */\n children: React.ReactNode;\n}\n\n/**\n * Calculate precise widths for all GridItems\n * Uses \"distribute remainder\" algorithm to eliminate rounding errors\n */\nfunction calculateItemWidths(\n children: React.ReactNode,\n totalWidth: number,\n columns: number,\n gap: number,\n): number[] {\n const childArray = React.Children.toArray(children);\n const itemWidths: number[] = [];\n\n // Calculate available width for columns (excluding all gaps between columns)\n const totalGapWidth = Math.max(0, (columns - 1) * gap);\n const availableWidth = Math.max(0, totalWidth - totalGapWidth);\n\n // Base column width and remainder\n const baseColWidth = Math.floor(availableWidth / columns);\n const remainder = availableWidth % columns;\n\n // Track current column position and remaining extra pixels\n let currentCol = 0;\n let remainingExtra = remainder;\n\n for (const child of childArray) {\n // Get span from child props (default: 1)\n const span =\n React.isValidElement(child) && typeof child.props.span === 'number'\n ? Math.min(Math.max(1, child.props.span), columns)\n : 1;\n\n // Calculate how many extra pixels this item should get\n // Distribute extras to columns from left to right\n let itemExtra = 0;\n const startCol = currentCol;\n const endCol = Math.min(currentCol + span, columns);\n\n for (let col = startCol; col < endCol && remainingExtra > 0; col++) {\n if (col < remainder) {\n itemExtra++;\n remainingExtra--;\n }\n }\n\n // Recalculate: we should use the actual distribution method\n // For each column in the span, check if it should get +1\n itemExtra = 0;\n for (let col = currentCol; col < currentCol + span && col < columns; col++) {\n if (col < remainder) {\n itemExtra++;\n }\n }\n\n // Item width = (base * span) + extra pixels + internal gaps\n const itemGapWidth = Math.max(0, (span - 1) * gap);\n const itemWidth = baseColWidth * span + itemExtra + itemGapWidth;\n\n itemWidths.push(itemWidth);\n\n // Move to next column position (wrap if needed)\n currentCol += span;\n if (currentCol >= columns) {\n currentCol = 0;\n remainingExtra = remainder; // Reset for next row\n }\n }\n\n return itemWidths;\n}\n\n/**\n * Grid Container\n * Acts like a CSS Grid container, arranging items in columns.\n */\nexport const Grid: React.FC<GridProps> = ({\n columns = 12,\n gap = 0,\n width: propsWidth,\n widthOffset = 0,\n rowHeight,\n children,\n}) => {\n const { stdout } = useStdout();\n const [terminalWidth, setTerminalWidth] = useState(stdout ? stdout.columns : 80);\n\n // Update width on resize\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setTerminalWidth(stdout.columns);\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n // Use provided width or terminal width\n // When widthOffset is specified, user is manually managing margins, so don't apply default safety margin\n // Otherwise, subtract a safety margin (2 chars) to prevent edge-case wrapping\n const safetyMargin = widthOffset > 0 ? 0 : 2;\n const defaultWidth =\n terminalWidth > safetyMargin ? terminalWidth - safetyMargin : terminalWidth;\n const totalWidth = propsWidth ?? Math.max(0, defaultWidth - widthOffset);\n\n // Pre-calculate precise widths for all items\n const itemWidths = calculateItemWidths(children, totalWidth, columns, gap);\n\n // Clone children with _gridIndex prop\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child as React.ReactElement<{ _gridIndex?: number }>, {\n _gridIndex: index,\n });\n }\n return child;\n });\n\n return (\n <GridContext.Provider value={{ columns, gap, totalWidth, rowHeight, itemWidths }}>\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n columnGap={gap}\n rowGap={gap}\n width={totalWidth}\n >\n {childrenWithIndex}\n </Box>\n </GridContext.Provider>\n );\n};\n\nexport interface GridItemProps {\n /** Number of columns to span (default: 1) */\n span?: number;\n /** Fixed height for this item */\n height?: number | string;\n /** Minimum height for this item */\n minHeight?: number | string;\n /** Overflow behavior */\n overflow?: 'visible' | 'hidden';\n children: React.ReactNode;\n /** Internal: index assigned by Grid parent */\n _gridIndex?: number;\n}\n\n/**\n * Grid Item\n * A cell in the grid that spans a specific number of columns.\n */\nexport const GridItem: React.FC<GridItemProps> = ({\n span = 1,\n height,\n minHeight,\n overflow,\n children,\n _gridIndex,\n}) => {\n const {\n columns,\n gap,\n totalWidth,\n rowHeight: contextRowHeight,\n itemWidths,\n } = useContext(GridContext);\n\n // Get precise width from pre-calculated widths if available\n let basisWidth: number;\n\n if (itemWidths !== undefined && _gridIndex !== undefined && _gridIndex < itemWidths.length) {\n // Use pre-calculated precise width (non-null assertion safe due to bounds check)\n basisWidth = itemWidths[_gridIndex] ?? 0;\n } else {\n // Fallback to original calculation (for standalone usage)\n const totalGapWidth = Math.max(0, (columns - 1) * gap);\n const availableWidth = Math.max(0, totalWidth - totalGapWidth);\n const colWidth = availableWidth / columns;\n const itemGapWidth = Math.max(0, (span - 1) * gap);\n basisWidth = Math.floor(colWidth * span + itemGapWidth);\n }\n\n const effectiveHeight = height ?? contextRowHeight;\n\n return (\n <GridItemContext.Provider value={{ width: basisWidth, height: effectiveHeight }}>\n <Box\n flexGrow={0}\n flexShrink={0}\n flexBasis={basisWidth}\n flexDirection=\"column\"\n {...(effectiveHeight !== undefined && { height: effectiveHeight })}\n {...(minHeight !== undefined && { minHeight })}\n {...(overflow !== undefined && { overflow })}\n >\n {children}\n </Box>\n </GridItemContext.Provider>\n );\n};\n","import { useContext } from 'react';\nimport type { Renderer } from '../../core/renderer';\nimport { type ColorPalette, assignColors } from '../../utils/gradient';\nimport { linearScale } from '../../utils/scale';\nimport { GridItemContext } from '../Grid';\n\n/**\n * Estimate how many visual rows a horizontal legend needs given an available width.\n * Mimics the Legend component's <Box flexDirection=\"row\" gap={2}> layout.\n */\nfunction estimateHorizontalLegendRows(names: string[] | undefined, availableWidth: number): number {\n if (!names || names.length === 0) return 1;\n const SYMBOL_WIDTH = 2; // '● '\n const ITEM_GAP = 2; // <Box gap={2}>\n let rows = 1;\n let used = 0;\n for (const n of names) {\n const itemWidth = SYMBOL_WIDTH + n.length;\n const needed = used === 0 ? itemWidth : itemWidth + ITEM_GAP;\n if (used + needed > availableWidth && used > 0) {\n rows++;\n used = itemWidth;\n } else {\n used += needed;\n }\n }\n return rows;\n}\n\nexport function resolveSeriesColors(\n series: ChartSeries[],\n colors?: string[],\n palette?: ColorPalette,\n): string[] {\n if (series.length === 0) {\n return [];\n }\n // Prioritize explicit colors array if provided and sufficient\n if (colors && colors.length >= series.length) {\n return colors.slice(0, series.length);\n }\n // Otherwise use palette (defaults to 'one-dark' inside assignColors)\n // If colors is partially provided, we might want to use it?\n // Current logic: if colors is provided but not enough, assignColors generates new ones.\n // We pass 'colors' as baseColors to assignColors if palette is not specified?\n // Actually assignColors 2nd arg is 'palette' now.\n\n // If colors is provided, treat it as a custom palette\n if (colors && colors.length > 0) {\n return assignColors(series.length, colors);\n }\n\n return assignColors(series.length, palette);\n}\n\n/**\n * Chart Layout Configuration\n */\nexport interface ChartLayoutConfig {\n /** Minimum width of the chart (default: 10) */\n minWidth?: number;\n /** Minimum height of the chart (default: 1) */\n minHeight?: number;\n /**\n * Width offset (default: 0)\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n widthOffset?: number;\n /**\n * Height offset (default: 0)\n * @deprecated Recommend wrapping chart with `<Panel>`, Panel automatically handles border overhead\n */\n heightOffset?: number;\n /** X-axis visibility */\n showXAxis?: boolean;\n /** Y-axis visibility */\n showYAxis?: boolean;\n /** Legend visibility */\n showLegend?: boolean;\n /** Legend position */\n legendPosition?: 'top' | 'bottom' | 'right';\n /** X-axis label */\n xAxisLabel?: string;\n /** Y-axis label */\n yAxisLabel?: string;\n /** Y-axis tick count */\n yTickCount?: number;\n /** Y-axis tick formatter */\n yTickFormat?: (value: number) => string;\n /** Default width if not in grid (default: 60) */\n defaultWidth?: number;\n /** Default height if not in grid (default: 15) */\n defaultHeight?: number;\n /** Data min value */\n min: number;\n /** Data max value */\n max: number;\n /** Legend item names, used to dynamically compute right legend width */\n legendNames?: string[];\n}\n\n/**\n * Chart Layout Result\n */\nexport interface ChartLayoutResult {\n /** Total width of the component */\n totalWidth: number;\n /** Total height of the component */\n totalHeight: number;\n /** Width of the plot area (canvas) */\n plotWidth: number;\n /** Height of the plot area (canvas) */\n plotHeight: number;\n /** Width of the Y-axis label area */\n yAxisWidth: number;\n /** Height of the legend area (if top/bottom) */\n legendHeight: number;\n /** Width of the legend area (if right) */\n legendWidth: number;\n /** Height of the X-axis area */\n xAxisHeight: number;\n}\n\n/**\n * Hook to calculate consistent chart layout\n */\nexport function useChartLayout(\n props: { width?: number; height?: number },\n config: ChartLayoutConfig,\n): ChartLayoutResult {\n const {\n minWidth = 10,\n widthOffset = 0,\n heightOffset = 0,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n legendPosition = 'right',\n xAxisLabel,\n yTickCount = 5,\n yTickFormat,\n defaultWidth = 60,\n defaultHeight = 15,\n min,\n max,\n legendNames,\n } = config;\n\n const gridContext = useContext(GridItemContext);\n\n // 1. Calculate Total Dimensions\n // Priority: props.height > gridContext.height (if number) > defaultHeight\n const totalHeight =\n props.height ??\n (typeof gridContext?.height === 'number' ? gridContext.height : defaultHeight);\n\n let totalWidth = props.width;\n if (totalWidth === undefined) {\n if (gridContext?.width) {\n totalWidth = Math.max(minWidth, gridContext.width - widthOffset);\n } else {\n totalWidth = defaultWidth; // Default fallback\n }\n }\n\n // 2. Calculate Component Dimensions\n const yAxisWidth = showYAxis\n ? getYAxisLabelWidth({\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n })\n : 0;\n\n const effectiveXAxisHeight = showXAxis ? 1 + (xAxisLabel ? 1 : 0) : 0;\n\n let legendWidth = 0;\n let legendHeight = 0;\n\n if (showLegend) {\n if (legendPosition === 'right') {\n legendWidth =\n legendNames && legendNames.length > 0\n ? Math.max(...legendNames.map((n) => n.length)) + 2\n : 20;\n } else {\n // Top or Bottom: estimate actual visual rows (legend may wrap in narrow panels).\n // Deduct yAxis area from available width; use 1 as legendHeight floor.\n const legendAvailWidth = Math.max(1, totalWidth - yAxisWidth - (showYAxis ? 1 : 0));\n const contentRows = estimateHorizontalLegendRows(legendNames, legendAvailWidth);\n legendHeight = contentRows + 1; // +1 = marginTop / marginBottom gap\n }\n }\n\n // 3. Calculate Plot Dimensions\n // Width: Total - YAxis - RightLegend - (Spacing)\n const yAxisSpacing = showYAxis ? 1 : 0;\n const legendSpacing = showLegend && legendPosition === 'right' ? 2 : 0;\n\n const plotWidth = Math.max(\n 1,\n totalWidth - yAxisWidth - yAxisSpacing - legendWidth - legendSpacing,\n );\n\n const plotHeight = Math.max(\n 1,\n totalHeight - heightOffset - legendHeight - effectiveXAxisHeight,\n );\n\n return {\n totalWidth,\n totalHeight,\n plotWidth,\n plotHeight,\n yAxisWidth,\n legendHeight,\n legendWidth,\n xAxisHeight: effectiveXAxisHeight,\n };\n}\n\n/**\n * Simplified Chart layout props interface\n * Can be directly destructured from chart component props\n */\nexport interface ChartLayoutProps {\n width?: number;\n height?: number;\n showAxis?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n legendPosition?: 'top' | 'bottom' | 'right';\n xAxisLabel?: string;\n yAxisLabel?: string;\n yTickCount?: number;\n yTickFormat?: (value: number) => string;\n /** @deprecated Recommend wrapping chart with `<Panel>` */\n widthOffset?: number;\n /** @deprecated Recommend wrapping chart with `<Panel>` */\n heightOffset?: number;\n}\n\n/**\n * Simplified layout Hook\n *\n * Directly accepts chart props, reducing verbose code at call sites.\n *\n * @example\n * ```tsx\n * const layout = useChartLayoutSimple(props, min, max);\n * // Equivalent to original verbose call:\n * // const layout = useChartLayout(\n * // { width: props.width, height: props.height },\n * // { showXAxis: props.showXAxis ?? props.showAxis, ... }\n * // );\n * ```\n */\nexport function useChartLayoutSimple(\n props: ChartLayoutProps,\n min: number,\n max: number,\n legendNames?: string[],\n): ChartLayoutResult {\n const {\n width: propsWidth,\n height: propsHeight,\n showAxis = true,\n showXAxis,\n showYAxis,\n showLegend = true,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n yTickCount = 5,\n yTickFormat,\n widthOffset = 0,\n heightOffset = 0,\n } = props;\n\n // Resolve relationship between showAxis and showXAxis/showYAxis\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n return useChartLayout(\n {\n ...(propsWidth !== undefined && { width: propsWidth }),\n ...(propsHeight !== undefined && { height: propsHeight }),\n },\n {\n widthOffset,\n heightOffset,\n showXAxis: renderXAxis,\n showYAxis: renderYAxis,\n showLegend,\n legendPosition,\n ...(xAxisLabel && { xAxisLabel }),\n ...(yAxisLabel && { yAxisLabel }),\n yTickCount,\n ...(yTickFormat && { yTickFormat }),\n min,\n max,\n ...(legendNames && { legendNames }),\n },\n );\n}\n\nexport interface ChartSeries {\n name: string;\n data: number[];\n color?: string;\n}\n\nexport function buildSeriesInputParams(\n series?: ChartSeries[],\n data?: number[],\n seriesName?: string,\n): { series?: ChartSeries[]; data?: number[]; seriesName?: string } {\n const params: { series?: ChartSeries[]; data?: number[]; seriesName?: string } = {};\n if (series !== undefined) {\n params.series = series;\n }\n if (data !== undefined) {\n params.data = data;\n }\n if (seriesName !== undefined) {\n params.seriesName = seriesName;\n }\n return params;\n}\n\nexport function resolveSeriesInput(params: {\n series?: ChartSeries[];\n data?: number[];\n seriesName?: string;\n}): ChartSeries[] {\n const { series, data, seriesName } = params;\n if (series && series.length > 0) {\n return series;\n }\n if (data && data.length > 0) {\n return [\n {\n name: seriesName ?? 'Series',\n data,\n },\n ];\n }\n return [];\n}\n\nexport function computeSeriesExtent(series: ChartSeries[]): {\n min: number;\n max: number;\n maxLength: number;\n} {\n let min = 0;\n let max = 0;\n let maxLength = 0;\n let hasValue = false;\n\n for (const item of series) {\n maxLength = Math.max(maxLength, item.data.length);\n for (const value of item.data) {\n if (!hasValue) {\n min = value;\n max = value;\n hasValue = true;\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n }\n\n if (!hasValue) {\n return { min: 0, max: 0, maxLength };\n }\n\n return { min, max, maxLength };\n}\n\nexport function getPixelDimensions(\n renderer: Renderer,\n width: number,\n height: number,\n): { pixelWidth: number; pixelHeight: number } {\n const resolution = renderer.getResolution();\n return {\n pixelWidth: width * resolution.horizontal,\n pixelHeight: height * resolution.vertical,\n };\n}\n\nexport function defaultTickFormat(value: number): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n // Billion\n if (absValue >= 1_000_000_000) {\n const v = absValue / 1_000_000_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}b`;\n }\n\n // Million\n if (absValue >= 1_000_000) {\n const v = absValue / 1_000_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}m`;\n }\n\n // Kilo\n if (absValue >= 1_000) {\n const v = absValue / 1_000;\n return `${sign}${Number.isInteger(v) ? v : v.toFixed(1)}k`;\n }\n\n // Less than 1000: display as integer\n return Math.round(value).toString();\n}\n\nexport function getYAxisLabelWidth(params: {\n min: number;\n max: number;\n tickCount: number;\n tickFormat?: (value: number) => string;\n}): number {\n const { min, max, tickCount, tickFormat = defaultTickFormat } = params;\n if (tickCount <= 0) {\n return 0;\n }\n if (max === min) {\n return tickFormat(min).length;\n }\n\n const step = (max - min) / (tickCount - 1);\n let maxLength = 0;\n for (let i = 0; i < tickCount; i++) {\n const value = min + i * step;\n maxLength = Math.max(maxLength, tickFormat(value).length);\n }\n return maxLength;\n}\n\n/**\n * Compute baseline Y coordinate\n *\n * Used for AreaChart and BarChart to determine the starting point of the filled area\n */\nexport function computeBaselineY(params: {\n min: number;\n max: number;\n pixelHeight: number;\n}): number {\n const { min, max, pixelHeight } = params;\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n const baselineValue = min <= 0 && max >= 0 ? 0 : min > 0 ? min : max;\n return Math.round(linearScale(baselineValue, [min, max], [pixelHeight - 1, 0]));\n}\n","/**\n * Coordinate axis component\n *\n * Used for X-axis and Y-axis display in charts\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { defaultTickFormat } from './chartUtils';\n\n/**\n * Coordinate axis component props\n */\nexport interface AxisProps {\n /** Axis type */\n type: 'x' | 'y';\n\n /** Minimum data value */\n min: number;\n\n /** Maximum data value */\n max: number;\n\n /** Tick count (default 5) */\n tickCount?: number;\n\n /** Tick formatter function */\n tickFormat?: (value: number) => string;\n\n /** Axis label */\n label?: string;\n\n /** Axis length (character count) */\n length: number;\n\n /** Text color (default 'gray') */\n color?: string;\n\n /** Whether to show grid lines (default false) */\n showGrid?: boolean;\n\n /** Whether to force ticks to be integers (default false) */\n integerScale?: boolean;\n}\n\n/**\n * Coordinate axis component\n *\n * @example\n * // X-axis\n * <Axis type=\"x\" min={0} max={100} length={50} label=\"Time\" />\n *\n * // Y-axis\n * <Axis type=\"y\" min={0} max={100} length={10} label=\"Value\" />\n */\nexport const Axis: React.FC<AxisProps> = ({\n type,\n min,\n max,\n tickCount = 5,\n tickFormat = defaultTickFormat,\n label,\n length,\n color = 'gray',\n showGrid: _showGrid = false,\n integerScale = false,\n}) => {\n // Calculate tick values\n const ticks = useMemo(() => {\n if (tickCount <= 0) {\n return [];\n }\n\n // If max equals min, display only one tick\n if (max === min) {\n return [{ value: min, position: 0 }];\n }\n\n let effectiveTickCount = tickCount;\n let step = (max - min) / (tickCount - 1);\n\n if (integerScale) {\n // Simple integer adaptation logic: if step isn't an integer, try adjusting tickCount\n const range = max - min;\n if (range < tickCount - 1) {\n // Range is too small for many ticks, reduce tick count\n effectiveTickCount = range + 1;\n step = 1;\n } else {\n // Force step to be integer? Or allow non-integer step but approximate values via Math.round?\n // Users typically want to see evenly spaced integers.\n // simple Math.round can lead to uneven distribution (0, 3.5->4, 7... => 0 4 7 11 14).\n // Here 0-4=4, 4-7=3, 7-11=4... unequal spacing.\n // Better approach is to find step that divides range evenly, but this may change tickCount.\n // Here we use simple Math.round strategy, prioritizing display of integers.\n }\n }\n\n return Array.from({ length: effectiveTickCount }, (_, i) => {\n let value = min + i * step;\n if (integerScale) {\n value = Math.round(value);\n }\n\n // position represents distance from start (0).\n const position = ((value - min) / (max - min)) * length;\n return { value, position };\n });\n }, [min, max, tickCount, length, integerScale]);\n\n // X-axis: horizontal layout\n if (type === 'x') {\n // Construct a single line of labels with carefully calculated spacing\n const xConfig = (() => {\n let previousEnd = 0;\n const elements: React.ReactNode[] = [];\n\n ticks.forEach((tick, i) => {\n const tickLabel = tickFormat(tick.value);\n const labelWidth = tickLabel.length;\n // Center the tick: tick.position is the center.\n // Start of label = tick.position - labelWidth / 2.\n // Ensure we don't overlap or go negative relative to previous.\n const intendedStart = Math.floor(tick.position - labelWidth / 2);\n const actualStart = Math.max(previousEnd, intendedStart);\n const spaces = Math.max(0, actualStart - previousEnd);\n\n if (spaces > 0) {\n elements.push(<Text key={`space-${i}`}>{' '.repeat(spaces)}</Text>);\n }\n\n elements.push(\n <Text key={`tick-${i}`} color={color} wrap=\"truncate\">\n {tickLabel}\n </Text>,\n );\n\n previousEnd = actualStart + labelWidth;\n });\n\n return elements;\n })();\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">{xConfig}</Box>\n {/* Axis label (centered) */}\n {label && (\n <Box justifyContent=\"center\" marginTop={0}>\n {/* Centering label naively */}\n <Text color={color} dimColor>\n {label}\n </Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // Y-axis: vertical layout\n // We need to distribute ticks from TOP to BOTTOM.\n // Ticks array is Min -> Max.\n // Render: Max (Top) -> Min (Bottom).\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n height={length}\n justifyContent=\"space-between\"\n >\n {ticks\n .slice()\n .reverse() // Max to Min\n .map((tick, i) => (\n <Box key={`tick-${i}`}>\n <Text color={color} wrap=\"truncate\">\n {tickFormat(tick.value)}\n </Text>\n </Box>\n ))}\n\n {/* Axis label */}\n {/* If we want the label, it should be outside the height-constrained box or handled differently. */}\n {/* Current implementation put it inside the column, which would steal space. Move it out? */}\n {/* Actually, Y-Axis label usually goes to the left or top. Vertical text is hard. */}\n {/* Let's keep it simple: Ignore label inside the tick distribution box. */}\n </Box>\n );\n};\n","/**\n * Legend component\n *\n * Used to display chart legend\n */\n\nimport { Box, Text } from 'ink';\nimport React from 'react';\n\n/**\n * Legend item\n */\nexport interface LegendItem {\n /** Legend name */\n name: string;\n\n /** Legend color */\n color: string;\n\n /** Legend symbol (default '●') */\n symbol?: string;\n}\n\n/**\n * Legend component props\n */\nexport interface LegendProps {\n /** Legend items array */\n items: LegendItem[];\n\n /** Layout direction (default 'horizontal') */\n position?: 'horizontal' | 'vertical';\n\n /** Overall text color (defaults to each item's own color) */\n color?: string;\n\n /** Gap between legend items (default 2) */\n gap?: number;\n}\n\n/**\n * Legend component\n *\n * @example\n * // Horizontal legend\n * <Legend\n * items={[\n * { name: 'CPU', color: 'blue', symbol: '●' },\n * { name: 'Memory', color: 'green', symbol: '●' },\n * ]}\n * position=\"horizontal\"\n * />\n *\n * // Vertical legend\n * <Legend\n * items={[\n * { name: 'Series 1', color: 'cyan' },\n * { name: 'Series 2', color: 'yellow' },\n * ]}\n * position=\"vertical\"\n * />\n */\nexport const Legend: React.FC<LegendProps> = ({\n items,\n position = 'horizontal',\n color,\n gap = 2,\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n return (\n <Box flexDirection={position === 'horizontal' ? 'row' : 'column'} gap={gap}>\n {items.map((item, i) => (\n <Box key={`legend-${i}`} gap={1}>\n <Text color={color ?? item.color}>{item.symbol || '●'}</Text>\n <Text {...(color && { color })}>{item.name}</Text>\n </Box>\n ))}\n </Box>\n );\n};\n","/**\n * ChartContainer - Unified chart layout container component\n *\n * Unified layout structure for Y-axis + Canvas + X-axis + Legend\n */\n\nimport { Box, Text } from 'ink';\nimport React from 'react';\nimport { Axis, type AxisProps } from './Axis';\nimport { Legend, type LegendItem } from './Legend';\nimport type { ChartLayoutResult } from './chartUtils';\n\n/**\n * Axis configuration (excluding type and length fields, provided by ChartContainer)\n */\nexport type AxisConfig = Omit<AxisProps, 'type' | 'length'>;\n\n/**\n * ChartContainer component props\n */\nexport interface ChartContainerProps {\n /** Layout calculation result */\n layout: ChartLayoutResult;\n\n /** Whether to show X-axis */\n showXAxis?: boolean;\n /** Whether to show Y-axis */\n showYAxis?: boolean;\n\n /** X-axis configuration */\n xAxisConfig?: AxisConfig;\n /** Y-axis configuration */\n yAxisConfig?: AxisConfig;\n\n /** Whether to show legend */\n showLegend?: boolean;\n /** Legend position */\n legendPosition?: 'top' | 'bottom' | 'right';\n /** Legend items */\n legendItems?: LegendItem[];\n\n /** Canvas rendering content (coloredLines) */\n children: React.ReactNode;\n}\n\n/**\n * Render Canvas content (colored lines)\n */\nfunction renderCanvasLines(\n coloredLines: Array<Array<{ text: string; color?: string }>>,\n): React.ReactNode {\n return coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) =>\n segment.color ? (\n <Text key={`seg-${i}-${j}`} color={segment.color}>\n {segment.text}\n </Text>\n ) : (\n <Text key={`seg-${i}-${j}`}>{segment.text}</Text>\n ),\n )}\n </Text>\n ));\n}\n\n/**\n * ChartContainer - Unified chart layout container\n *\n * Eliminate redundant JSX layout code in LineChart, AreaChart, and BarChart\n */\nexport const ChartContainer: React.FC<ChartContainerProps> = ({\n layout,\n showXAxis = true,\n showYAxis = true,\n xAxisConfig,\n yAxisConfig,\n showLegend = true,\n legendPosition = 'right',\n legendItems = [],\n children,\n}) => {\n const { totalWidth, totalHeight, plotWidth, plotHeight, yAxisWidth } = layout;\n\n return (\n <Box flexDirection=\"column\" width={totalWidth} height={totalHeight}>\n {/* Top Legend */}\n {showLegend && legendPosition === 'top' && (\n <Box marginBottom={1} marginLeft={showYAxis ? yAxisWidth + 1 : 0}>\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n\n {/* Main Row: Y Axis + Canvas + Right Legend */}\n <Box flexDirection=\"row\">\n {/* Y Axis */}\n {showYAxis && yAxisConfig && (\n <Box marginRight={1} width={yAxisWidth}>\n <Axis type=\"y\" length={plotHeight} {...yAxisConfig} />\n </Box>\n )}\n\n {/* Canvas Content */}\n <Box flexDirection=\"column\">{children}</Box>\n\n {/* Right Legend */}\n {showLegend && legendPosition === 'right' && (\n <Box marginLeft={2}>\n <Legend items={legendItems} position=\"vertical\" />\n </Box>\n )}\n </Box>\n\n {/* X Axis */}\n {showXAxis && xAxisConfig && (\n <Box marginLeft={showYAxis ? yAxisWidth + 1 : 0}>\n <Axis type=\"x\" length={plotWidth} {...xAxisConfig} />\n </Box>\n )}\n\n {/* Bottom Legend */}\n {showLegend && legendPosition === 'bottom' && (\n <Box\n marginTop={1}\n marginLeft={showYAxis ? yAxisWidth + 1 : 0}\n width={plotWidth}\n justifyContent=\"center\"\n >\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * Render coloredLines as React elements\n */\nexport { renderCanvasLines };\n","/**\n * ink-hud visual symbol constants\n *\n * Centralised character table — grouped by purpose, not Unicode block.\n * Components import from here instead of hard-coding characters inline.\n * All entries are `as const` — stable references safe to use in object keys.\n */\n\n/** Trend direction arrows (BigNumber, Table) */\nexport const TREND = { up: '▲', down: '▼', neutral: '─' } as const;\n\n/** Legend dot marker (PieChart, Legend, chart core) */\nexport const LEGEND = { dot: '●' } as const;\n\n/** Filled / empty bar characters (Gauge) */\nexport const BAR = { fill: '█', empty: '░' } as const;\n\n/** Default character for heatmap cells in character mode */\nexport const HEATMAP = { default: '■' } as const;\n\n/** Rounded-box border characters (PulseBar) */\nexport const BORDER_ROUNDED = {\n topLeft: '╭',\n topRight: '╮',\n bottomLeft: '╰',\n bottomRight: '╯',\n horizontal: '─',\n vertical: '│',\n bar: '▌',\n} as const;\n\n/** Multi-level bar characters for Sparkline character mode */\nexport const SPARK_LEVELS = {\n block: [' ', '▂', '▃', '▄', '▅', '▆', '▇', '█'] as const,\n braille: ['⠀', '⡀', '⣀', '⣄', '⣤', '⣦', '⣶', '⣷', '⣿'] as const,\n} as const;\n","/**\n * useChartCore - Chart core data processing Hook\n *\n * Integrates data processing logic shared by all chart components\n */\n\nimport { useMemo } from 'react';\nimport { LEGEND } from '../../symbols';\nimport { type ColorPalette } from '../../utils/gradient';\nimport type { LegendItem } from './Legend';\nimport {\n type ChartSeries,\n buildSeriesInputParams,\n computeSeriesExtent,\n resolveSeriesColors,\n resolveSeriesInput,\n} from './chartUtils';\n\n/**\n * Chart core Hook input parameters\n */\nexport interface ChartCoreProps {\n /** Multi-series data */\n series?: ChartSeries[];\n /** Single-series data (simplified) */\n data?: number[];\n /** Single-series name (simplified) */\n seriesName?: string;\n /** Color array */\n colors?: string[];\n /** Color palette */\n colorPalette?: ColorPalette;\n}\n\n/**\n * Chart core Hook return value\n */\nexport interface ChartCoreResult {\n /** Parsed series data */\n series: ChartSeries[];\n /** Minimum data value */\n min: number;\n /** Maximum data value */\n max: number;\n /** Maximum data point length */\n maxLength: number;\n /** Series color array */\n colors: string[];\n /** Legend items */\n legendItems: LegendItem[];\n}\n\n/**\n * Chart core data processing Hook\n *\n * Integrates the following common logic:\n * - Data series parsing\n * - Data range calculation\n * - Color assignment\n * - Legend item construction\n */\nexport function useChartCore(props: ChartCoreProps): ChartCoreResult {\n const { series: seriesProp, data, seriesName, colors: colorsProp, colorPalette } = props;\n\n // 1. Parse series data\n const series = useMemo(\n () => resolveSeriesInput(buildSeriesInputParams(seriesProp, data, seriesName)),\n [seriesProp, data, seriesName],\n );\n\n // 2. Calculate data range\n const { min, max, maxLength } = useMemo(() => computeSeriesExtent(series), [series]);\n\n // 3. Assign colors\n const colors = useMemo(\n () => resolveSeriesColors(series, colorsProp, colorPalette),\n [series, colorsProp, colorPalette],\n );\n\n // 4. Build legend items\n const legendItems = useMemo(\n () =>\n series.map((item, i) => ({\n name: item.name,\n color: item.color ?? colors[i] ?? 'cyan',\n symbol: LEGEND.dot,\n })),\n [series, colors],\n );\n\n return {\n series,\n min,\n max,\n maxLength,\n colors,\n legendItems,\n };\n}\n","/**\n * useChartRenderer - Chart renderer selection Hook\n */\n\nimport { useMemo } from 'react';\nimport type { Renderer } from '../../core/renderer';\nimport type { ChartKind } from '../InkHudProvider';\nimport { useInkHud } from '../InkHudProvider';\n\n/**\n * Return the renderer configured for the given chart kind.\n *\n * The actual renderer is determined by InkHudProvider's `renderers` config\n * (merged over DEFAULT_CHART_RENDERERS). If the terminal does not support\n * the configured renderer, BlockRenderer is returned as a silent fallback.\n */\nexport function useChartRenderer(kind: ChartKind): Renderer {\n const { getRendererFor } = useInkHud();\n return useMemo(() => getRendererFor(kind), [kind, getRendererFor]);\n}\n","/**\n * LineChart - Basic line chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport { defaultTickFormat, getPixelDimensions, useChartLayoutSimple } from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { useChartRenderer } from './common/useChartRenderer';\n\n/**\n * LineChart component props\n */\nexport type LineChartProps = TimeSeriesChartProps;\n\nexport const LineChart: React.FC<LineChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n xIntegerScale = true,\n yIntegerScale = false,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Use common Hooks\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer('line');\n\n // 2. Layout calculation (use simplified API)\n const layout = useChartLayoutSimple(\n props,\n min,\n max,\n legendItems.map((it) => it.name),\n );\n\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Draw line chart (component-specific logic)\n const coloredLines = useMemo(\n () =>\n renderLineChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n colors,\n }),\n [renderer, series, canvasWidth, canvasHeight, min, max, colors],\n );\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n // 4. Build AxisConfig\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n ...(xIntegerScale !== undefined && { integerScale: xIntegerScale }),\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n // 5. Assemble\n return (\n <ChartContainer\n layout={layout}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n >\n {coloredLines.map((line, i) => (\n <Text key={i}>\n {line.map((seg, j) => (\n <Text\n key={j}\n {...(seg.color ? { color: seg.color } : {})}\n {...(seg.backgroundColor\n ? { backgroundColor: seg.backgroundColor }\n : {})}\n >\n {seg.text}\n </Text>\n ))}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n\n// ===== Internal rendering logic =====\n\ninterface RenderLineChartParams {\n renderer: ReturnType<typeof useChartRenderer>;\n series: Array<{ name: string; data: number[]; color?: string }>;\n canvasWidth: number;\n canvasHeight: number;\n min: number;\n max: number;\n colors: string[];\n}\n\nfunction renderLineChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n colors,\n}: RenderLineChartParams) {\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWidth, canvasHeight);\n\n if (pixelWidth <= 0 || pixelHeight <= 0 || series.length === 0) {\n return [];\n }\n\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n for (let si = 0; si < series.length; si++) {\n const s = series[si];\n if (!s) continue;\n\n const { data } = s;\n const color = s.color ?? colors[si] ?? 'cyan';\n\n if (data.length === 0) continue;\n\n // Calculate pixel position for each data point\n const xScale = data.length > 1 ? (pixelWidth - 1) / (data.length - 1) : 0;\n\n const scaleY = (value: number): number => {\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n return Math.round(linearScale(value, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Draw line segments\n for (let i = 0; i < data.length - 1; i++) {\n const currVal = data[i];\n const nextVal = data[i + 1];\n\n if (currVal === undefined || nextVal === undefined) continue;\n\n const x0 = Math.round(i * xScale);\n const y0 = scaleY(currVal);\n const x1 = Math.round((i + 1) * xScale);\n const y1 = scaleY(nextVal);\n\n renderer.drawLine(canvas, x0, y0, x1, y1, { active: true, color });\n }\n\n // If only one point, draw separately\n if (data.length === 1) {\n const val = data[0];\n if (val !== undefined) {\n const x = Math.round(pixelWidth / 2);\n const y = scaleY(val);\n renderer.setPixel(canvas, x, y, { active: true, color });\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n","/**\n * AreaChart - Basic area chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport {\n type ChartSeries,\n computeBaselineY,\n defaultTickFormat,\n getPixelDimensions,\n useChartLayoutSimple,\n} from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { useChartRenderer } from './common/useChartRenderer';\n\n/**\n * AreaChart component props\n */\nexport type AreaChartProps = TimeSeriesChartProps;\n\n/**\n * Fill area between two Y values at a given X position\n */\nfunction fillVerticalLine(\n renderer: ReturnType<typeof useChartRenderer>,\n canvas: ReturnType<ReturnType<typeof useChartRenderer>['createCanvas']>,\n x: number,\n y1: number,\n y2: number,\n color?: string,\n): void {\n const fillStart = Math.min(y1, y2);\n const fillEnd = Math.max(y1, y2);\n for (let fy = fillStart; fy <= fillEnd; fy++) {\n renderer.setPixel(canvas, x, fy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n}\n\n/**\n * Render area chart drawing logic\n */\nfunction renderAreaChartCanvas(params: {\n renderer: ReturnType<typeof useChartRenderer>;\n series: ChartSeries[];\n canvasWidth: number;\n canvasHeight: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}): Array<Array<{ text: string; color?: string }>> {\n const { renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors } = params;\n\n if (series.length === 0 || maxLength === 0) {\n return [];\n }\n\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWidth, canvasHeight);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n const baselineY = computeBaselineY({ min, max, pixelHeight });\n const xStep = maxLength > 1 ? (pixelWidth - 1) / (maxLength - 1) : 0;\n\n const scaleValue = (value: number): number => {\n if (max === min) {\n return Math.round((pixelHeight - 1) / 2);\n }\n return Math.round(linearScale(value, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Sort series by max value (descending) to draw largest areas first (background)\n const sortedData = series\n .map((s, i) => {\n const maxVal = Math.max(...s.data);\n return { series: s, color: colors[i], maxVal };\n })\n .sort((a, b) => b.maxVal - a.maxVal);\n\n for (const { series: item, color } of sortedData) {\n let prevPoint: { x: number; y: number } | null = null;\n\n for (let idx = 0; idx < item.data.length; idx++) {\n const value = item.data[idx];\n if (value === undefined) continue;\n const point = { x: Math.round(idx * xStep), y: scaleValue(value) };\n\n if (prevPoint) {\n const startX = Math.min(prevPoint.x, point.x);\n const endX = Math.max(prevPoint.x, point.x);\n\n for (let px = startX; px <= endX; px++) {\n const t = endX === startX ? 0 : (px - prevPoint.x) / (point.x - prevPoint.x);\n const py = Math.floor(prevPoint.y + (point.y - prevPoint.y) * t);\n fillVerticalLine(renderer, canvas, px, py, baselineY, color);\n }\n renderer.drawLine(canvas, prevPoint.x, prevPoint.y, point.x, point.y, {\n active: true,\n ...(color ? { color } : {}),\n });\n } else {\n fillVerticalLine(renderer, canvas, point.x, point.y, baselineY, color);\n }\n prevPoint = point;\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\nexport const AreaChart: React.FC<AreaChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n xIntegerScale = true,\n yIntegerScale = false,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Use common Hooks\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer('area');\n\n // 2. Layout calculation (use simplified API)\n const layout = useChartLayoutSimple(\n props,\n min,\n max,\n legendItems.map((it) => it.name),\n );\n\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Draw area chart (component-specific logic)\n const coloredLines = useMemo(\n () =>\n renderAreaChartCanvas({\n renderer,\n series,\n canvasWidth,\n canvasHeight,\n min,\n max,\n maxLength,\n colors,\n }),\n [renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors],\n );\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n // 4. Use unified container rendering\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n ...(xIntegerScale !== undefined && { integerScale: xIntegerScale }),\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n return (\n <ChartContainer\n layout={layout}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n >\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) =>\n segment.color ? (\n <Text key={`seg-${i}-${j}`} color={segment.color}>\n {segment.text}\n </Text>\n ) : (\n <Text key={`seg-${i}-${j}`}>{segment.text}</Text>\n ),\n )}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n","/**\n * BarChart Basic bar chart component\n */\n\nimport { Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport type { Renderer } from '../core/renderer';\nimport { linearScale } from '../utils/scale';\nimport { type AxisConfig, ChartContainer } from './common/ChartContainer';\nimport type { TimeSeriesChartProps } from './common/chartTypes';\nimport {\n type ChartSeries,\n computeBaselineY,\n defaultTickFormat,\n getPixelDimensions,\n useChartLayoutSimple,\n} from './common/chartUtils';\nimport { useChartCore } from './common/useChartCore';\nimport { useChartRenderer } from './common/useChartRenderer';\n\n// ============================================================================\n// Layout Helpers (Pure Functions)\n// ============================================================================\n\nconst alignDown = (val: number, alignment: number) => Math.floor(val / alignment) * alignment;\n\n/**\n * Vertical Layout Calculation\n * X-Axis partitioning.\n */\nfunction computeVerticalLayout(params: {\n pixelWidth: number;\n categoryCount: number;\n seriesCount: number;\n alignment: number; // Horizontal resolution (usually 1 or 2)\n}): { groupWidth: number; barWidth: number; barGap: number; groupPadding: number } {\n const { pixelWidth, categoryCount, seriesCount, alignment } = params;\n\n // 1. Calculate max possible group width across the canvas\n const maxGroupWidth = alignDown(\n Math.max(alignment, Math.floor(pixelWidth / Math.max(1, categoryCount))),\n alignment,\n );\n const groupWidth = maxGroupWidth;\n\n // Internal helper to calculate layout for a specific padding\n const calculateForPadding = (p: number) => {\n const available = groupWidth - p * 2;\n // Need at least 1 alignment unit per bar\n const minNeed = seriesCount * alignment;\n if (available < minNeed) return null;\n\n const gap =\n available >= seriesCount * alignment + (seriesCount - 1) * alignment ? alignment : 0;\n const totalGap = gap * (seriesCount - 1);\n const remaining = available - totalGap;\n\n let barWidth = Math.floor(remaining / seriesCount);\n // Ensure barWidth is aligned (even values for Block)\n barWidth = alignDown(barWidth, alignment);\n\n if (barWidth < alignment) return null;\n\n return { groupWidth, barWidth, barGap: gap, groupPadding: p };\n };\n\n // 2. Strategy Comparison\n // Strategy A: Standard Padding (Breathing room)\n const paddingStandard = alignment;\n const layoutStandard = calculateForPadding(paddingStandard);\n\n // Strategy B: Compact (Max Width)\n const layoutCompact = calculateForPadding(0);\n\n // Decision:\n // 1. If Standard is invalid, must use Compact.\n if (!layoutStandard) {\n return layoutCompact ?? { groupWidth, barWidth: alignment, barGap: 0, groupPadding: 0 };\n }\n\n // 2. If Compact is invalid (shouldn't happen if Standard is valid, but safety), use Standard.\n if (!layoutCompact) {\n return layoutStandard;\n }\n\n // 3. Maximize Bar Width:\n // If Compact gives us strictly WIDER bars, we sacrifice padding to get fat bars.\n // e.g. Standard: Bar=2. Compact: Bar=4. -> Choose Compact.\n if (layoutCompact.barWidth > layoutStandard.barWidth) {\n return layoutCompact;\n }\n\n // Otherwise prefer breathing room\n return layoutStandard;\n}\n\n/**\n * Horizontal Layout Calculation\n * Y-Axis partitioning.\n * Critical for Block Rendering (Alignment 8).\n */\nfunction computeHorizontalLayout(params: {\n pixelHeight: number;\n categoryCount: number;\n seriesCount: number;\n alignment: number; // Vertical resolution (8 for Block, 4 for Braille)\n}): { groupHeight: number; barHeight: number; barGap: number; groupPadding: number } {\n const { pixelHeight, categoryCount, seriesCount, alignment } = params;\n\n // 1. Calculate max possible height per category\n const maxGroupHeight = alignDown(\n Math.max(alignment, Math.floor(pixelHeight / Math.max(1, categoryCount))),\n alignment,\n );\n\n // 2. Strict Block Logic (High Alignment)\n if (alignment >= 4) {\n // With high alignment (e.g. 8px), we have limited vertical canvas.\n // Preventing gaps is priority #1 to avoid seeing \"scanlines\".\n\n // Calculate the absolute minimum stack height needed for one group\n // assuming minimum bar height (1 alignment unit) and NO gaps.\n const stackHeight = seriesCount * alignment;\n\n // Case A: The assigned group space is just enough or barely tight.\n // We force Tight Layout: GroupHeight = StackHeight.\n // This eliminates \"Slack\" (unused pixels) inside the group logic, pushing all slack to the end of the chart.\n const groupHeight = Math.max(alignment, stackHeight);\n\n return {\n groupHeight: groupHeight, // Strictly tight\n barHeight: alignment, // Min thickness (1 block char)\n barGap: 0, // No gaps\n groupPadding: 0, // No padding\n };\n }\n\n // 3. Standard Logic (Low Alignment, e.g. Braille or purely pixel-based)\n // Similar to vertical logic: try to add padding/gaps if space allows.\n const padding = alignment;\n\n // ... logic similar to vertical but simpler ...\n // For simplicity, just use a compact strategy for horizontal to maximize label readability space usually\n // But here we are just drawing bars.\n\n // For non-block renderers, we can try to be nice.\n const available = maxGroupHeight - padding * 2;\n if (available > seriesCount * alignment * 1.5) {\n // Enough space for padding\n const gap = alignment;\n const barHeight = alignDown(\n Math.floor((available - gap * (seriesCount - 1)) / seriesCount),\n alignment,\n );\n return { groupHeight: maxGroupHeight, barHeight, barGap: gap, groupPadding: padding };\n }\n\n // Compact fallback\n const availableCompact = maxGroupHeight;\n const barHeightCompact = alignDown(Math.floor(availableCompact / seriesCount), alignment);\n return { groupHeight: maxGroupHeight, barHeight: barHeightCompact, barGap: 0, groupPadding: 0 };\n}\n\n// ============================================================================\n// Renderers\n// ============================================================================\n\nfunction renderVertical(params: {\n renderer: Renderer;\n series: ChartSeries[];\n width: number;\n height: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}) {\n const { renderer, series, width, height, min, max, maxLength, colors } = params;\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, width, height);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n const resolution = renderer.getResolution();\n const alignment = resolution.horizontal;\n\n // Layout\n const { groupWidth, barWidth, barGap, groupPadding } = computeVerticalLayout({\n pixelWidth,\n categoryCount: maxLength,\n seriesCount: series.length,\n alignment,\n });\n\n const baselineY = computeBaselineY({ min, max, pixelHeight });\n const scaleValue = (val: number) => {\n if (max === min) return Math.round((pixelHeight - 1) / 2);\n return Math.round(linearScale(val, [min, max], [pixelHeight - 1, 0]));\n };\n\n // Render\n for (let i = 0; i < maxLength; i++) {\n const groupLeft = i * groupWidth + groupPadding;\n for (let j = 0; j < series.length; j++) {\n const val = series[j]?.data[i] ?? 0;\n const yVal = scaleValue(val);\n const x = groupLeft + j * (barWidth + barGap);\n const xEnd = Math.min(pixelWidth - 1, x + barWidth - 1);\n\n const yStart = Math.min(yVal, baselineY);\n const yEnd = Math.max(yVal, baselineY);\n const color = colors[j];\n\n for (let yy = yStart; yy <= yEnd; yy++) {\n for (let xx = x; xx <= xEnd; xx++) {\n renderer.setPixel(canvas, xx, yy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n }\n }\n }\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\nfunction renderHorizontal(params: {\n renderer: Renderer;\n series: ChartSeries[];\n width: number;\n height: number;\n min: number;\n max: number;\n maxLength: number;\n colors: string[];\n}) {\n const { renderer, series, width, height, min, max, maxLength, colors } = params;\n\n const resolution = renderer.getResolution();\n\n const pixelWidth = width * resolution.horizontal;\n const pixelHeight = height * resolution.vertical;\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n // Vertical alignment (Thickness of horizontal bar)\n const alignment = resolution.vertical;\n\n // Layout\n const { groupHeight, barHeight, barGap, groupPadding } = computeHorizontalLayout({\n pixelHeight,\n categoryCount: maxLength,\n seriesCount: series.length,\n alignment,\n });\n\n // Scale X\n const scaleValue = (val: number) => {\n if (max === min) return Math.round((pixelWidth - 1) / 2);\n return Math.round(linearScale(val, [min, max], [0, pixelWidth - 1]));\n };\n\n // Baseline X\n let baselineVal = 0;\n if (min > 0) baselineVal = min;\n else if (max < 0) baselineVal = max;\n const baselineX = scaleValue(baselineVal);\n\n // Render\n // Note: We use the *calculated* groupHeight for rendering positions strictly.\n // This allows the \"Tight Layout\" to act effectively.\n for (let i = 0; i < maxLength; i++) {\n const groupTop = i * groupHeight + groupPadding;\n for (let j = 0; j < series.length; j++) {\n const val = series[j]?.data[i] ?? 0;\n const xVal = scaleValue(val);\n\n const y = groupTop + j * (barHeight + barGap);\n const yEnd = Math.min(pixelHeight - 1, y + barHeight - 1); // Clamp to canvas\n\n // Check if we are checking out of bounds (which safe tightening prevents, but for safety)\n if (y >= pixelHeight) continue;\n\n const xStart = Math.min(xVal, baselineX);\n const xEndFill = Math.max(xVal, baselineX);\n const color = colors[j];\n\n for (let yy = y; yy <= yEnd; yy++) {\n for (let xx = xStart; xx <= xEndFill; xx++) {\n renderer.setPixel(canvas, xx, yy, {\n active: true,\n ...(color ? { color } : {}),\n });\n }\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * BarChart component props\n */\nexport type BarChartProps = TimeSeriesChartProps & {\n /** Orientation (default 'vertical') */\n orientation?: 'vertical' | 'horizontal';\n};\n\nexport const BarChart: React.FC<BarChartProps> = (props) => {\n const {\n showLegend = true,\n showAxis = true,\n showXAxis,\n showYAxis,\n legendPosition = 'right',\n orientation = 'vertical',\n xAxisLabel,\n yAxisLabel,\n xTickCount = 5,\n yTickCount = 5,\n xTickFormat,\n yTickFormat,\n xIntegerScale,\n yIntegerScale,\n } = props;\n\n const renderXAxis = showXAxis ?? showAxis;\n const renderYAxis = showYAxis ?? showAxis;\n\n // 1. Core Data\n const { series, min, max, maxLength, colors, legendItems } = useChartCore(props);\n const renderer = useChartRenderer('bar');\n\n // 2. Layout\n const layout = useChartLayoutSimple(\n props,\n min,\n max,\n legendItems.map((it) => it.name),\n );\n const { plotWidth: canvasWidth, plotHeight: canvasHeight } = layout;\n\n // 3. Render Chart Lines\n const coloredLines = useMemo(() => {\n if (series.length === 0 || maxLength === 0) return [];\n\n if (orientation === 'horizontal') {\n return renderHorizontal({\n renderer,\n series,\n width: canvasWidth,\n height: canvasHeight,\n min,\n max,\n maxLength,\n colors,\n });\n }\n return renderVertical({\n renderer,\n series,\n width: canvasWidth,\n height: canvasHeight,\n min,\n max,\n maxLength,\n colors,\n });\n }, [renderer, series, canvasWidth, canvasHeight, min, max, maxLength, colors, orientation]);\n\n if (coloredLines.length === 0) return null;\n\n // 4. Wrapped Result\n const yAxisConfig: AxisConfig = {\n min,\n max,\n tickCount: yTickCount,\n tickFormat: yTickFormat ?? defaultTickFormat,\n ...(yIntegerScale !== undefined && { integerScale: yIntegerScale }),\n ...(yAxisLabel ? { label: yAxisLabel } : {}),\n };\n\n const xAxisConfig: AxisConfig = {\n min: 0,\n max: Math.max(0, maxLength - 1),\n tickCount: xTickCount,\n tickFormat: xTickFormat ?? defaultTickFormat,\n integerScale: xIntegerScale ?? true,\n ...(xAxisLabel ? { label: xAxisLabel } : {}),\n };\n\n return (\n <ChartContainer\n layout={layout}\n showXAxis={renderXAxis}\n showYAxis={renderYAxis}\n xAxisConfig={xAxisConfig}\n yAxisConfig={yAxisConfig}\n showLegend={showLegend}\n legendPosition={legendPosition}\n legendItems={legendItems}\n >\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) => (\n <Text\n key={`seg-${i}-${j}`}\n {...(segment.color ? { color: segment.color } : {})}\n {...(segment.backgroundColor\n ? { backgroundColor: segment.backgroundColor }\n : {})}\n >\n {segment.text}\n </Text>\n ))}\n </Text>\n ))}\n </ChartContainer>\n );\n};\n","/**\n * PieChart Pie chart component\n *\n * Basic pie chart display with built-in legend\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { LEGEND } from '../symbols';\nimport { type ColorPalette, assignColors } from '../utils/gradient';\nimport { Legend } from './common/Legend';\nimport { getPixelDimensions, useChartLayoutSimple } from './common/chartUtils';\nimport { useChartRenderer } from './common/useChartRenderer';\n\n/**\n * PieChart data item\n */\nexport interface PieChartDataItem {\n /** Name */\n name: string;\n /** Value */\n value: number;\n /** Color (optional, auto-assigned if not specified) */\n color?: string;\n}\n\n/**\n * PieChart component props\n */\nexport interface PieChartProps {\n /**\n * Data array - supports two formats:\n * 1. Simplified mode: number[] (requires labels)\n * 2. Detailed mode: PieChartDataItem[]\n */\n data?: number[] | PieChartDataItem[];\n\n /**\n * Label array (used in simplified mode)\n * When used with data: number[], provides name for each value\n */\n labels?: string[];\n\n /** Chart width (character count, default 30) */\n width?: number;\n\n /** Chart height (character lines, default 15) */\n height?: number;\n\n /** Outer radius (pixels, auto-calculated by default) */\n radius?: number;\n\n /** Aspect ratio correction (default 2) */\n aspectRatio?: number;\n\n /** Donut inner radius ratio (0-1, default 0) */\n donutRatio?: number;\n\n /** Whether to show percentage labels (default false) */\n showLabels?: boolean;\n\n /** Whether to show legend (default true) */\n showLegend?: boolean;\n\n /** Legend position (default 'right') */\n legendPosition?: 'right' | 'bottom';\n\n /** Color array (auto-assigned if not specified) */\n colors?: string[];\n\n /** Palette name or custom color array */\n colorPalette?: ColorPalette;\n\n /**\n * @deprecated Per-chart `renderer` prop has been removed.\n * Configure via `<InkHudProvider renderers={{ pie: 'block' }}>` instead.\n */\n renderer?: never;\n\n /**\n * @deprecated Per-chart `rendererChain` prop has been removed.\n * Configure via `<InkHudProvider renderers={{ pie: 'block' }}>` instead.\n */\n rendererChain?: never;\n}\n\n/**\n * Parse data input, unify to PieChartDataItem[] format\n */\nfunction resolveDataItems(\n data: number[] | PieChartDataItem[] | undefined,\n labels?: string[],\n): PieChartDataItem[] {\n if (!data || data.length === 0) {\n return [];\n }\n\n // Check if simplified mode (number[])\n if (typeof data[0] === 'number') {\n return (data as number[]).map((value, i) => ({\n name: labels?.[i] ?? `Item ${i + 1}`,\n value,\n }));\n }\n\n // Detailed mode (PieChartDataItem[])\n return data as PieChartDataItem[];\n}\n\nconst TWO_PI = Math.PI * 2;\nconst START_ANGLE = -Math.PI / 2;\n\nfunction resolveRadius(\n canvasWChars: number,\n canvasHChars: number,\n renderer: import('../core/renderer').Renderer,\n customRadius: number | undefined,\n aspectRatioCorrection: number,\n): { pixelWidth: number; pixelHeight: number; centerX: number; centerY: number; radius: number } {\n const { pixelWidth, pixelHeight } = getPixelDimensions(renderer, canvasWChars, canvasHChars);\n const { vertical } = renderer.getResolution();\n const centerX = (pixelWidth - 1) / 2;\n const centerY = (pixelHeight - 1) / 2;\n\n // Fit the circle to the actual pixel bounds instead of a char-based heuristic.\n // This keeps pie charts round in shorter layouts (for example with bottom legends)\n // and avoids the even-height bias from integer center coordinates.\n // We also reserve half a glyph of vertical breathing room so braille/block rows\n // do not look visually clipped when their first/last pixel buckets touch the edge.\n const maxRadiusByWidth = Math.min(centerX, pixelWidth - 1 - centerX);\n const verticalInsetPixels = Math.ceil(vertical / 2);\n const maxRadiusByHeight =\n Math.max(0, Math.min(centerY, pixelHeight - 1 - centerY) - verticalInsetPixels) *\n aspectRatioCorrection;\n const maxRadius = Math.max(0, Math.min(maxRadiusByWidth, maxRadiusByHeight));\n const radius =\n customRadius !== undefined ? Math.min(Math.max(0, customRadius), maxRadius) : maxRadius;\n\n return { pixelWidth, pixelHeight, centerX, centerY, radius };\n}\n\nfunction buildAngleStops(\n data: PieChartDataItem[],\n total: number,\n): Array<{ index: number; end: number }> {\n if (total <= 0) {\n return [];\n }\n\n const stops: Array<{ index: number; end: number }> = [];\n let current = 0;\n data.forEach((item, index) => {\n if (item.value <= 0) {\n return;\n }\n current += (item.value / total) * TWO_PI;\n stops.push({ index, end: current });\n });\n\n return stops;\n}\n\nfunction resolveSliceIndex(\n angle: number,\n stops: Array<{ index: number; end: number }>,\n): number | null {\n if (stops.length === 0) {\n return null;\n }\n\n for (const stop of stops) {\n if (angle <= stop.end) {\n return stop.index;\n }\n }\n return stops[stops.length - 1]?.index ?? null;\n}\n\n/**\n * PieChart Pie chart component\n */\nexport const PieChart: React.FC<PieChartProps> = ({\n data: dataProp,\n labels,\n width,\n height,\n radius: customRadius,\n aspectRatio,\n donutRatio = 0,\n showLabels = false,\n showLegend = true,\n legendPosition = 'right',\n colors,\n colorPalette,\n}) => {\n // Parse data input\n const data = useMemo(() => resolveDataItems(dataProp, labels), [dataProp, labels]);\n\n // Pre-compute percentages early so legendNames can be passed to layout for wrapping estimate\n const percentagesEarly = useMemo(() => {\n const sum = data.reduce((acc, item) => acc + item.value, 0);\n return data.map((item) => (sum > 0 ? (item.value / sum) * 100 : 0));\n }, [data]);\n\n const legendNamesForLayout = useMemo(() => {\n if (!showLegend) return undefined;\n return data.map((item, i) =>\n showLabels ? `${item.name} (${percentagesEarly[i]?.toFixed(1)}%)` : item.name,\n );\n }, [data, showLegend, showLabels, percentagesEarly]);\n\n // 1. Layout calculation (Use simplified API, disable axes)\n const layout = useChartLayoutSimple(\n {\n ...(width !== undefined && { width }),\n ...(height !== undefined && { height }),\n showAxis: false,\n showLegend,\n legendPosition,\n },\n 0,\n 0,\n legendNamesForLayout,\n );\n\n // Constrain canvas to a visual square so the circle's container matches its shape.\n // Terminal cells are ~2:1 (height:width), so a visual square = 2:1 chars (W:H).\n // Without this, wide panels render the circle small on a wide rectangle, leaving\n // huge empty bands on left/right.\n const { totalWidth, plotWidth: plotW, plotHeight: plotH } = layout;\n const canvasHeight = Math.max(1, Math.min(plotH, Math.floor(plotW / 2)));\n const canvasWidth = canvasHeight * 2;\n\n const renderer = useChartRenderer('pie');\n\n // Calculate aspect ratio dynamically if not provided\n const ratio = useMemo(() => {\n if (aspectRatio !== undefined) return aspectRatio;\n const resolution = renderer.getResolution();\n // Standard terminal character is ~2:1 (Height:Width).\n // Correction = 2 * (PixelWidth / PixelHeight)\n // e.g. Braille (2x4): 2 * (2/4) = 1.0 (Square pixels)\n // e.g. Block (2x8): 2 * (2/8) = 0.5 (Wide pixels)\n return 2 * (resolution.horizontal / resolution.vertical);\n }, [aspectRatio, renderer]);\n\n const itemColors = useMemo(() => {\n if (colors && colors.length >= data.length) {\n return colors;\n }\n if (colors && colors.length > 0) {\n return assignColors(data.length, colors);\n }\n return assignColors(data.length, colorPalette);\n }, [data.length, colors, colorPalette]);\n\n const total = useMemo(() => data.reduce((acc, item) => acc + item.value, 0), [data]);\n // percentagesEarly and percentages are identical — reuse to avoid double computation\n const percentages = percentagesEarly;\n\n const coloredLines = useMemo(() => {\n if (data.length === 0 || total <= 0) {\n return [];\n }\n\n const {\n pixelWidth,\n pixelHeight,\n centerX,\n centerY,\n radius: outerRadius,\n } = resolveRadius(canvasWidth, canvasHeight, renderer, customRadius, ratio);\n const canvas = renderer.createCanvas(pixelWidth, pixelHeight);\n\n const innerRadius = outerRadius * donutRatio;\n const angleStops = buildAngleStops(data, total);\n\n // Unified rendering loop: calculate slice for each pixel and set color\n // No longer care if renderer uses ASCII or Braille, Renderer handles this\n for (let y = 0; y < pixelHeight; y++) {\n const dy = (y - centerY) * ratio; // Apply aspect ratio correction\n for (let x = 0; x < pixelWidth; x++) {\n const dx = x - centerX;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance > outerRadius || distance < innerRadius) {\n continue;\n }\n\n const angle = (Math.atan2(dy, dx) - START_ANGLE + TWO_PI) % TWO_PI;\n const sliceIndex = resolveSliceIndex(angle, angleStops);\n\n if (sliceIndex !== null) {\n const color = data[sliceIndex]?.color ?? itemColors[sliceIndex];\n if (color) {\n renderer.setPixel(canvas, x, y, { active: true, color });\n }\n }\n }\n }\n\n return renderer.renderCanvas(canvas, pixelWidth, pixelHeight);\n }, [\n data,\n total,\n renderer,\n canvasWidth,\n canvasHeight,\n customRadius,\n ratio,\n donutRatio,\n itemColors,\n ]);\n\n const legendItems = useMemo(() => {\n return data.map((item, i) => ({\n name: showLabels ? `${item.name} (${percentages[i]?.toFixed(1)}%)` : item.name,\n color: item.color ?? itemColors[i] ?? 'cyan',\n symbol: LEGEND.dot,\n }));\n }, [data, itemColors, showLabels, percentages]);\n\n if (coloredLines.length === 0) {\n return null;\n }\n\n return (\n <Box flexDirection=\"column\" width={totalWidth} height={layout.totalHeight}>\n <Box flexDirection=\"row\" justifyContent=\"center\">\n <Box flexDirection=\"column\" width={canvasWidth}>\n {coloredLines.map((segments, i) => (\n <Text key={`chart-line-${i}`}>\n {segments.map((segment, j) => (\n <Text\n key={`seg-${i}-${j}`}\n {...(segment.color ? { color: segment.color } : {})}\n {...(segment.backgroundColor\n ? { backgroundColor: segment.backgroundColor }\n : {})}\n >\n {segment.text}\n </Text>\n ))}\n </Text>\n ))}\n </Box>\n\n {showLegend && legendPosition === 'right' && (\n <Box marginLeft={2}>\n <Legend items={legendItems} position=\"vertical\" />\n </Box>\n )}\n </Box>\n\n {showLegend && legendPosition === 'bottom' && (\n <Box marginTop={1} width={totalWidth} justifyContent=\"center\">\n <Legend items={legendItems} position=\"horizontal\" />\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Minimal RGB PNG encoder — no dependencies (uses Node.js built-in zlib).\n */\n\nimport { deflateSync } from 'node:zlib';\n\n// ---------------------------------------------------------------------------\n// CRC-32\n// ---------------------------------------------------------------------------\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[i] = c;\n }\n return table;\n})();\n\nfunction crc32(buf: Buffer): number {\n let crc = 0xffffffff;\n for (let i = 0; i < buf.length; i++) {\n crc = (CRC_TABLE[(crc ^ (buf[i] as number)) & 0xff] ?? 0) ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\n// ---------------------------------------------------------------------------\n// PNG chunk builder\n// ---------------------------------------------------------------------------\n\nfunction chunk(type: string, data: Buffer): Buffer {\n const len = Buffer.alloc(4);\n len.writeUInt32BE(data.length, 0);\n const typeBytes = Buffer.from(type, 'ascii');\n const crcBytes = Buffer.alloc(4);\n crcBytes.writeUInt32BE(crc32(Buffer.concat([typeBytes, data])), 0);\n return Buffer.concat([len, typeBytes, data, crcBytes]);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Encode a grid of RGB pixels into a minimal PNG buffer.\n *\n * @param pixels - Row-major grid: pixels[row][col] = [r, g, b]\n */\nexport function createRgbPng(pixels: [number, number, number][][]): Buffer {\n const height = pixels.length;\n const width = pixels[0]?.length ?? 0;\n\n // IHDR\n const ihdrData = Buffer.alloc(13);\n ihdrData.writeUInt32BE(width, 0);\n ihdrData.writeUInt32BE(height, 4);\n ihdrData[8] = 8; // bit depth\n ihdrData[9] = 2; // colour type: RGB truecolour\n // bytes 10-12: compression=0, filter=0, interlace=0\n\n // Raw pixel rows: filter byte (None=0) + RGB triplets\n const rawRows: Buffer[] = [];\n for (const row of pixels) {\n const rowBuf = Buffer.alloc(1 + width * 3);\n rowBuf[0] = 0; // filter: None\n let offset = 1;\n for (const [r, g, b] of row) {\n rowBuf[offset++] = r;\n rowBuf[offset++] = g;\n rowBuf[offset++] = b;\n }\n rawRows.push(rowBuf);\n }\n\n const compressed = deflateSync(Buffer.concat(rawRows), { level: 1 });\n\n const PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n return Buffer.concat([\n PNG_SIGNATURE,\n chunk('IHDR', ihdrData),\n chunk('IDAT', compressed),\n chunk('IEND', Buffer.alloc(0)),\n ]);\n}\n\n/**\n * Convert a hex colour string (#rrggbb or rrggbb) to [r, g, b].\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.startsWith('#') ? hex.slice(1) : hex;\n const n = Number.parseInt(h, 16);\n return [(n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff];\n}\n","/**\n * Shared pixel-grid drawing utilities for image-mode chart components.\n * All functions produce RGB[][], ready to pass to createRgbPng().\n */\n\nimport tinygradient from 'tinygradient';\nimport { hexToRgb } from './png';\n\ntype RGB = [number, number, number];\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n\nfunction darken(rgb: RGB, factor: number): RGB {\n return [Math.round(rgb[0] * factor), Math.round(rgb[1] * factor), Math.round(rgb[2] * factor)];\n}\n\n/**\n * Returns a function that maps a normalized value [0, 1] to an RGB color\n * by interpolating through the provided color stops (256-step palette).\n */\nexport function gradientColorFn(colors: string[]): (normalized: number) => RGB {\n if (colors.length === 0) return () => [128, 128, 128];\n if (colors.length === 1) {\n const rgb = hexToRgb(colors[0] ?? '');\n return () => rgb;\n }\n const g = tinygradient(colors);\n const palette = g.rgb(256).map((c): RGB => hexToRgb(`#${c.toHex()}`));\n return (normalized: number) => {\n const idx = clamp(Math.floor(normalized * 256), 0, 255);\n return palette[idx] ?? [128, 128, 128];\n };\n}\n\n/**\n * Build an RGB pixel grid for a sparkline area chart.\n *\n * Each data value is linearly interpolated across pixel columns.\n * The line is drawn 2 px thick; the area below is filled with a darkened version\n * of the line color. bgColor fills everything above the line.\n *\n * @param data - Processed (downsampled) data points\n * @param widthPx - Pixel width of the output image\n * @param heightPx - Pixel height of the output image\n * @param min - Data minimum (for normalization)\n * @param max - Data maximum (for normalization)\n * @param colorFn - Maps normalized value → RGB (use gradientColorFn)\n * @param bgColor - Background color (default: near-black)\n */\nexport function buildSparklinePixelGrid(\n data: number[],\n widthPx: number,\n heightPx: number,\n min: number,\n max: number,\n colorFn: (normalized: number) => RGB,\n bgColor: RGB = [10, 10, 14],\n): RGB[][] {\n const grid: RGB[][] = Array.from({ length: heightPx }, () =>\n Array.from({ length: widthPx }, () => [...bgColor] as RGB),\n );\n\n if (data.length === 0 || widthPx === 0 || heightPx === 0) return grid;\n\n const range = max === min ? 1 : max - min;\n\n for (let x = 0; x < widthPx; x++) {\n // Linear interpolation across data points\n const t = data.length === 1 ? 0 : (x / Math.max(widthPx - 1, 1)) * (data.length - 1);\n const baseIdx = clamp(Math.floor(t), 0, data.length - 2);\n const frac = data.length === 1 ? 0 : t - baseIdx;\n const raw =\n data.length === 1\n ? (data[0] ?? 0)\n : (data[baseIdx] ?? 0) * (1 - frac) + (data[baseIdx + 1] ?? 0) * frac;\n\n const normalized = clamp((raw - min) / range, 0, 1);\n const yLine = Math.round((1 - normalized) * (heightPx - 1));\n const lineRgb = colorFn(normalized);\n const fillRgb = darken(lineRgb, 0.28);\n\n // Area fill below the line\n for (let y = yLine + 2; y < heightPx; y++) {\n const row = grid[y];\n if (row !== undefined) row[x] = fillRgb;\n }\n // Soft transition pixel between line and fill\n if (yLine + 1 < heightPx) {\n const row = grid[yLine + 1];\n if (row !== undefined) row[x] = darken(lineRgb, 0.55);\n }\n // Line: 2 px (full brightness + dimmer cap above)\n const lineRow = grid[yLine];\n if (lineRow !== undefined) lineRow[x] = lineRgb;\n if (yLine - 1 >= 0) {\n const capRow = grid[yLine - 1];\n if (capRow !== undefined) capRow[x] = darken(lineRgb, 0.75);\n }\n }\n\n return grid;\n}\n","/**\n * Sparkline - Mini trend chart component\n *\n * Note: Sparkline does NOT consume the InkHudProvider `renderers` configuration.\n * Its `variant` prop ('block' | 'braille') is independent because Sparkline uses\n * a static character table (SPARK_LEVELS), not the pixel-canvas pipeline used by\n * LineChart / AreaChart / BarChart / PieChart. Set `variant` directly on the\n * component when you need to override the default ('block').\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useContext, useMemo } from 'react';\nimport { useImageProtocol } from '../hooks/useImageProtocol';\nimport { buildSparklinePixelGrid, gradientColorFn } from '../render/image/drawing';\nimport { createRgbPng } from '../render/image/png';\nimport { SPARK_LEVELS } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\nimport { lttb } from '../utils/downsampling';\nimport { GridItemContext } from './Grid';\n\nexport interface SparklineProps {\n /** Array of data points */\n data: number[];\n\n /**\n * Target width in character columns.\n * If data.length exceeds width, LTTB downsampling is applied.\n * Defaults to data.length.\n */\n width?: number;\n\n /** Minimum value (default: derived from data) */\n min?: number;\n\n /** Maximum value (default: derived from data) */\n max?: number;\n\n /** Single solid color for character mode (and image mode when colors is not set) */\n color?: string;\n\n /**\n * Rendering style for character mode. Ignored in image mode.\n * @default 'block'\n */\n variant?: 'block' | 'braille';\n\n /**\n * Rendering mode.\n * - 'auto': use image protocol if supported, otherwise character mode\n * - 'image': force image protocol (no-op if unsupported)\n * - 'character': always use character mode (block/braille)\n * @default 'auto'\n */\n mode?: 'auto' | 'image' | 'character';\n\n /**\n * Chart height in character rows (image mode only).\n * @default 1\n */\n height?: number;\n\n /**\n * Color gradient for image mode (low → high).\n * Overrides the `color` prop. Defaults to the theme's heatmapGradient.\n */\n colors?: string[];\n\n /**\n * Pixel size per character cell in image mode.\n * @default 8\n */\n cellPx?: number;\n}\n\nexport const Sparkline: React.FC<SparklineProps> = ({\n data,\n width: propsWidth,\n min: userMin,\n max: userMax,\n color,\n variant = 'block',\n mode = 'auto',\n height = 1,\n colors,\n cellPx = 8,\n}) => {\n const gridContext = useContext(GridItemContext);\n const theme = useTheme();\n\n const effectiveWidth = propsWidth ?? gridContext?.width;\n\n // --- Data processing (shared between character and image mode) ---\n const { processedData, min, max } = useMemo(() => {\n if (!data || data.length === 0) return { processedData: [], min: 0, max: 1 };\n\n let processed = data;\n if (effectiveWidth && data.length > effectiveWidth) {\n processed = lttb(data, effectiveWidth);\n }\n\n const lo = userMin ?? Math.min(...processed);\n let hi = userMax ?? Math.max(...processed);\n if (hi === lo) hi = lo + 1;\n\n return { processedData: processed, min: lo, max: hi };\n }, [data, effectiveWidth, userMin, userMax]);\n\n const charCols = effectiveWidth ?? processedData.length;\n const charRows = height;\n\n // --- Build PNG (skipped in character mode or when no data) ---\n const pngBuf = useMemo(() => {\n if (mode === 'character' || charCols === 0 || processedData.length === 0) return null;\n\n const effectiveColors = colors ?? (color ? [color] : theme.heatmapGradient);\n const colorFn = gradientColorFn(effectiveColors);\n const pixelGrid = buildSparklinePixelGrid(\n processedData,\n charCols * cellPx,\n charRows * cellPx,\n min,\n max,\n colorFn,\n );\n return createRgbPng(pixelGrid);\n }, [\n mode,\n charCols,\n charRows,\n cellPx,\n colors,\n color,\n theme.heatmapGradient,\n processedData,\n min,\n max,\n ]);\n\n // --- Image protocol: upload, effects, and placeholder data ---\n // trailingSpace=false → each Kitty placeholder cell = 1 terminal col (matches character mode width)\n const { kittyLines, iterm2Cols } = useImageProtocol({\n mode,\n charCols,\n charRows,\n pngBuf,\n trailingSpace: false,\n });\n\n // --- Kitty placeholder ---\n if (kittyLines !== null) {\n return (\n <Box flexDirection=\"column\">\n {kittyLines.map((line, i) => (\n <Text key={i}>{line}</Text>\n ))}\n </Box>\n );\n }\n\n // --- iTerm2 placeholder ---\n if (iterm2Cols !== null) {\n return (\n <Box flexDirection=\"column\">\n {Array.from({ length: charRows }, (_, i) => (\n <Text key={i}>{' '.repeat(iterm2Cols)}</Text>\n ))}\n </Box>\n );\n }\n\n // --- Character mode ---\n if (processedData.length === 0) {\n return <Text>{''}</Text>;\n }\n\n const levels = SPARK_LEVELS[variant];\n const outputCols = charCols > 0 ? charCols : processedData.length;\n const text = Array.from({ length: outputCols }, (_, i) => {\n const dataIndex = Math.floor((i * processedData.length) / outputCols);\n const v = processedData[dataIndex] ?? 0;\n const value = Math.max(min, Math.min(max, v));\n const normalized = (value - min) / (max - min);\n const index = Math.round(normalized * (levels.length - 1));\n return levels[index];\n }).join('');\n\n return <Text {...(color ? { color } : {})}>{text}</Text>;\n};\n","import { Box, type BoxProps, Text } from 'ink';\nimport React from 'react';\nimport { GridItemContext } from './Grid';\n\nexport interface PanelProps {\n /**\n * Panel title\n */\n title?: string;\n\n /**\n * Title alignment\n * @default 'left'\n */\n titleAlignment?: 'left' | 'center' | 'right';\n\n /**\n * Border style\n * @default 'round'\n */\n borderStyle?: BoxProps['borderStyle'];\n\n /**\n * Border color\n * @default 'white'\n */\n borderColor?: string;\n\n /**\n * Content padding\n * @default 0\n */\n padding?: number;\n\n /**\n * Panel width\n */\n width?: number | string;\n\n /**\n * Panel height\n */\n height?: number | string;\n\n /**\n * Children (content)\n */\n children: React.ReactNode;\n}\n\n/**\n * Panel - Card component with title and border\n *\n * Unified encapsulation of borders, titles, and padding, supporting various border styles.\n */\nexport const Panel: React.FC<PanelProps> = ({\n title,\n titleAlignment = 'left',\n borderStyle = 'round',\n borderColor,\n padding = 0,\n width,\n height,\n children,\n}) => {\n // 1. Resolve dimensions from props or context\n const gridContext = React.useContext(GridItemContext);\n\n // Effective dimensions (Outer dimensions of the Panel)\n const effectiveWidth = width ?? gridContext?.width;\n const effectiveHeight = height ?? gridContext?.height;\n\n // 2. Calculate inner available space for children\n // If we have explicit or context dimensions, subtract borders and padding\n // Border always consumes 2 units (1 left, 1 right / 1 top, 1 bottom) if active\n // Standard Ink Box border consumes space.\n const borderOverhead = borderStyle ? 2 : 0;\n const paddingOverhead = padding * 2;\n const totalOverhead = borderOverhead + paddingOverhead;\n\n const innerWidth =\n typeof effectiveWidth === 'number'\n ? Math.max(0, effectiveWidth - totalOverhead)\n : undefined;\n\n const innerHeight =\n typeof effectiveHeight === 'number'\n ? Math.max(0, effectiveHeight - totalOverhead)\n : undefined;\n\n // 3. Prepare Box props\n const boxProps: BoxProps = {\n borderStyle,\n flexDirection: 'column',\n ...(effectiveWidth !== undefined && { width: effectiveWidth }),\n ...(effectiveHeight !== undefined && { height: effectiveHeight }),\n ...(borderColor !== undefined && { borderColor }),\n };\n\n // 4. Update Context for children\n // We memoize the context value to prevent unnecessary re-renders\n // Note: If height is a string (like '100%'), we can't calculate innerHeight,\n // but we should still pass meaningfully to children\n const childContext = React.useMemo(\n () => ({\n ...(innerWidth !== undefined ? { width: innerWidth } : {}),\n // Pass innerHeight if calculated, or pass the raw effectiveHeight for reference\n // This allows children to know at least that a height constraint exists\n height:\n innerHeight ?? (typeof effectiveHeight === 'string' ? effectiveHeight : undefined),\n }),\n [innerWidth, innerHeight, effectiveHeight],\n );\n\n // Note: If innerWidth is undefined (e.g. Panel width is '100%'), we might not be able to pass a number.\n // However, chartUtils useChartLayout falls back to defaultWidth if context width is missing.\n // Ideally we pass what we know.\n\n return (\n <GridItemContext.Provider value={childContext}>\n <Box {...boxProps}>\n {title && (\n <Box\n position=\"absolute\"\n marginTop={-1}\n width=\"100%\"\n paddingX={2}\n justifyContent={\n titleAlignment === 'center'\n ? 'center'\n : titleAlignment === 'right'\n ? 'flex-end'\n : 'flex-start'\n }\n >\n <Text bold color={borderColor || 'white'}>\n {' '}\n {title}{' '}\n </Text>\n </Box>\n )}\n <Box padding={padding} flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n </Box>\n </GridItemContext.Provider>\n );\n};\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { BAR } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\n\nexport interface GaugeProps {\n /**\n * Current value\n */\n value: number;\n\n /**\n * Minimum value\n * @default 0\n */\n min?: number;\n\n /**\n * Maximum value\n * @default 100\n */\n max?: number;\n\n /**\n * Progress bar width (character count), excluding percentage text\n * @default 20\n */\n width?: number;\n\n /**\n * Fill color\n * @default 'green'\n */\n color?: string;\n\n /**\n * Unfilled character color\n * @default 'gray'\n */\n emptyColor?: string;\n\n /**\n * Whether to show percentage text\n * @default true\n */\n showPercent?: boolean;\n\n /**\n * Custom fill character\n */\n fillChar?: string;\n\n /**\n * Custom unfilled character\n */\n emptyChar?: string;\n\n /**\n * Prefix label\n */\n label?: string;\n}\n\n/**\n * Gauge - Gauge/progress bar component\n *\n * Display progress or load of a single metric.\n * Example: [██████░░░░] 60%\n */\nexport const Gauge: React.FC<GaugeProps> = ({\n value,\n min = 0,\n max = 100,\n width = 20,\n color,\n emptyColor,\n showPercent = true,\n fillChar,\n emptyChar,\n label,\n}) => {\n const theme = useTheme();\n const effectiveColor = color ?? theme.semantic.success;\n const effectiveEmptyColor = emptyColor ?? theme.semantic.muted;\n\n const effectiveFillChar = fillChar ?? BAR.fill;\n const effectiveEmptyChar = emptyChar ?? BAR.empty;\n\n const clampedValue = Math.min(Math.max(value, min), max);\n const range = max - min;\n const ratio = range === 0 ? 0 : (clampedValue - min) / range;\n const percent = Math.round(ratio * 100);\n\n const filledLength = Math.round(ratio * width);\n const emptyLength = width - filledLength;\n\n const filledStr = effectiveFillChar.repeat(filledLength);\n const emptyStr = effectiveEmptyChar.repeat(emptyLength);\n\n return (\n <Box flexDirection=\"row\">\n {label && (\n <Box marginRight={1}>\n <Text>{label}</Text>\n </Box>\n )}\n <Text color={effectiveColor}>{filledStr}</Text>\n <Text color={effectiveEmptyColor}>{emptyStr}</Text>\n {showPercent && (\n <Box marginLeft={1}>\n <Text>{percent}%</Text>\n </Box>\n )}\n </Box>\n );\n};\n","/**\n * Multi-Style Big Fonts for BigNumber Component\n *\n * Supports two rendering styles:\n * - block: Unicode Block Elements (█▀▄)\n * - braille: Braille patterns (⠿)\n */\n\nexport type FontStyle = 'block' | 'braille';\n\n// ============================================================\n// Block Elements Font (3x3 character matrix)\n// ============================================================\n\nconst BLOCK_FONT: Record<string, string[]> = {\n '0': ['█▀█', '█ █', '█▄█'],\n '1': [' █ ', ' █ ', ' █ '],\n '2': ['▀▀█', ' ▀▄', '█▄▄'],\n '3': ['▀▀█', ' ▀▄', '▄▄█'],\n '4': ['█ █', '█▄█', ' █'],\n '5': ['█▀▀', '▀▀▄', '▄▄█'],\n '6': ['█▀▀', '█▄▄', '█▄█'],\n '7': ['▀▀█', ' █', ' █'],\n '8': ['█▀█', '█▀█', '█▄█'],\n '9': ['█▀█', '▀▀█', ' █'],\n '.': [' ', ' ', ' ▄ '],\n ',': [' ', ' ', ' ▙ '],\n '%': ['█ ', ' █ ', ' █'],\n '+': [' ', ' ┼ ', ' '],\n '-': [' ', ' ─ ', ' '],\n};\n\n// ============================================================\n// Braille Font (3x3 character matrix using Braille dots)\n// ============================================================\n\nconst BRAILLE_FONT: Record<string, string[]> = {\n '0': ['⣰⣆', '⡇⢸', '⠙⠛'],\n '1': ['⢀⡆', '⠀⡇', '⠀⠇'],\n '2': ['⠤⣤', '⢀⡤', '⠓⠒'],\n '3': ['⠤⣤', '⠀⡤', '⠒⠚'],\n '4': ['⡆⢸', '⠓⢺', '⠀⢸'],\n '5': ['⠖⠶', '⠒⢲', '⠒⠚'],\n '6': ['⢰⡆', '⠖⢲', '⠓⠚'],\n '7': ['⠤⣤', '⠀⡰', '⠀⡇'],\n '8': ['⢰⡆', '⠖⡶', '⠓⠚'],\n '9': ['⢰⡆', '⠓⢺', '⠀⢸'],\n '.': ['⠀⠀', '⠀⠀', '⠀⠄'],\n ',': ['⠀⠀', '⠀⠀', '⠀⠢'],\n '%': ['⠁⠀', '⠀⠂', '⠀⠈'],\n '+': ['⠀⠀', '⠐⠒', '⠀⠀'],\n '-': ['⠀⠀', '⠐⠒', '⠀⠀'],\n};\n\n// ============================================================\n// Font Registry\n// ============================================================\n\nconst FONTS: Record<FontStyle, Record<string, string[]>> = {\n block: BLOCK_FONT,\n braille: BRAILLE_FONT,\n};\n\nconst UNKNOWN: Record<FontStyle, string[]> = {\n block: [' ', ' ? ', ' '],\n braille: ['⠀⠀', '⠀⠦', '⠀⠀'],\n};\n\n// ============================================================\n// Dev-mode warn for unsupported characters\n// ============================================================\n\nconst warnedChars = new Set<string>();\n\nfunction warnUnsupportedChar(char: string, style: FontStyle): void {\n if (process.env.NODE_ENV === 'production') return;\n const key = `${style}:${char}`;\n if (warnedChars.has(key)) return;\n warnedChars.add(key);\n console.warn(\n `[ink-hud] BigNumber: unsupported char \"${char}\" (style=\"${style}\") rendered as \"?\". Use the prefix/suffix props for units or symbols (e.g. <BigNumber value=\"49\" suffix=\"ms\" />).`,\n );\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function getBigChar(char: string, style: FontStyle = 'block'): string[] {\n const glyphs = FONTS[style][char];\n if (!glyphs) {\n warnUnsupportedChar(char, style);\n return UNKNOWN[style];\n }\n return glyphs;\n}\n\nexport function renderBigString(text: string, style: FontStyle = 'block'): string[] {\n const rows = ['', '', ''];\n for (const char of text) {\n const matrix = getBigChar(char, style);\n rows[0] += `${matrix[0]} `;\n rows[1] += `${matrix[1]} `;\n rows[2] += `${matrix[2]} `;\n }\n return rows;\n}\n","import { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport { TREND } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\nimport { type FontStyle, renderBigString } from './BigNumber/font';\n\nexport interface BigNumberProps {\n /**\n * Main value — should contain only supported characters: 0-9 . , % + -\n */\n value: string | number;\n\n /**\n * Small text rendered to the left of the big value (e.g. \"$\")\n */\n prefix?: string;\n\n /**\n * Small text rendered to the right of the big value (e.g. \"ms\", \"k\", \"%\")\n */\n suffix?: string;\n\n /**\n * Subtitle/label\n */\n label?: string;\n\n /**\n * Color\n * @default 'white'\n */\n color?: string;\n\n /**\n * Trend direction (for rendering arrows)\n */\n trendDirection?: 'up' | 'down' | 'neutral';\n\n /**\n * Trend label (e.g., \"12%\")\n */\n trendLabel?: string;\n\n /**\n * Large font style\n * - 'block': Block Elements characters (default)\n * - 'braille': Braille Dot Matrix characters\n * @default 'block'\n */\n fontStyle?: FontStyle;\n\n /**\n * Alignment\n * @default 'center'\n */\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * BigNumber - Key metric card component\n *\n * Display core KPIs with large font for main value, supports subtitle and trend indicators.\n */\nexport const BigNumber: React.FC<BigNumberProps> = ({\n value,\n prefix,\n suffix,\n label,\n color = 'white',\n trendDirection,\n trendLabel,\n fontStyle = 'block',\n align = 'center',\n}) => {\n const bigLines = useMemo(() => renderBigString(String(value), fontStyle), [value, fontStyle]);\n\n const theme = useTheme();\n\n let trendColor = theme.semantic.muted;\n let trendArrow = '';\n\n if (trendDirection === 'up') {\n trendColor = theme.semantic.success;\n trendArrow = TREND.up;\n } else if (trendDirection === 'down') {\n trendColor = theme.semantic.error;\n trendArrow = TREND.down;\n } else if (trendDirection === 'neutral') {\n trendArrow = TREND.neutral;\n }\n\n const alignItems =\n align === 'center' ? 'center' : align === 'right' ? 'flex-end' : 'flex-start';\n\n return (\n <Box flexDirection=\"column\" alignItems={alignItems}>\n <Box flexDirection=\"row\" alignItems=\"flex-end\" marginBottom={1}>\n {prefix && (\n <Box marginRight={1}>\n <Text color={color}>{prefix}</Text>\n </Box>\n )}\n <Box flexDirection=\"column\">\n {bigLines.map((line, i) => (\n <Text key={i} color={color}>\n {line}\n </Text>\n ))}\n </Box>\n {suffix && (\n <Box marginLeft={1}>\n <Text color={color}>{suffix}</Text>\n </Box>\n )}\n </Box>\n\n <Box flexDirection=\"row\" gap={1}>\n {label && <Text color={theme.semantic.textSecondary}>{label}</Text>}\n {(trendLabel || trendArrow) && (\n <Text color={trendColor}>\n {trendArrow} {trendLabel}\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport React, { useMemo } from 'react';\nimport tinygradient from 'tinygradient';\nimport { useImageProtocol } from '../hooks/useImageProtocol';\nimport { createRgbPng, hexToRgb } from '../render/image/png';\nimport { HEATMAP } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\nimport { createGradient } from '../utils/gradient';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface HeatmapProps {\n /** Data matrix (2D array), rows × cols */\n data: number[][];\n\n /**\n * Color gradient (from low to high).\n * Defaults to theme's heatmapGradient.\n */\n colors?: string[];\n\n /** Custom character for character mode (defaults to Unicode block ■) */\n char?: string;\n\n /**\n * Rendering mode.\n * - 'auto': use image protocol if supported, otherwise character mode\n * - 'image': force image protocol (no-op if unsupported)\n * - 'character': always use unicode block characters\n * @default 'auto'\n */\n mode?: 'auto' | 'image' | 'character';\n\n /**\n * Pixel size of each data cell in image mode.\n * @default 8\n */\n cellPx?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction findMinMax(data: number[][]): { min: number; max: number } {\n let minVal = Number.POSITIVE_INFINITY;\n let maxVal = Number.NEGATIVE_INFINITY;\n for (const row of data) {\n for (const val of row) {\n if (val < minVal) minVal = val;\n if (val > maxVal) maxVal = val;\n }\n }\n return { min: minVal, max: maxVal };\n}\n\nfunction gradientRgbPalette(colors: string[], steps: number): [number, number, number][] {\n if (steps === 0) return [];\n if (colors.length === 0) return Array(steps).fill([128, 128, 128] as [number, number, number]);\n if (colors.length === 1) {\n const rgb = hexToRgb(colors[0] ?? '#808080');\n return Array(steps).fill(rgb);\n }\n const g = tinygradient(colors);\n return g.rgb(steps).map((c) => hexToRgb(`#${c.toHex()}`));\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport const Heatmap: React.FC<HeatmapProps> = ({\n data,\n colors,\n char,\n mode = 'auto',\n cellPx = 8,\n}) => {\n const theme = useTheme();\n const effectiveColors = colors ?? theme.heatmapGradient;\n const effectiveChar = char ?? HEATMAP.default;\n\n const dataRows = data.length;\n const dataCols = data[0]?.length ?? 0;\n\n // --- Shared min/max ---\n const { min, max } = useMemo(() => {\n const { min: minVal, max: maxVal } = findMinMax(data);\n if (minVal === Number.POSITIVE_INFINITY) return { min: 0, max: 0 };\n return { min: minVal, max: maxVal > minVal ? maxVal : minVal + 1 };\n }, [data]);\n\n const steps = effectiveColors.length;\n\n // --- Build PNG (skipped in character mode or when data is empty) ---\n const pngBuf = useMemo(() => {\n if (mode === 'character' || !dataRows || !dataCols) return null;\n\n const palette = gradientRgbPalette(effectiveColors, steps);\n const pixelGrid: [number, number, number][][] = [];\n const GAP: [number, number, number] = [16, 16, 16];\n\n for (let row = 0; row < dataRows; row++) {\n for (let py = 0; py < cellPx; py++) {\n const pixelRow: [number, number, number][] = [];\n for (let col = 0; col < dataCols; col++) {\n const val = data[row]?.[col] ?? 0;\n const normalized = max === min ? 0 : (val - min) / (max - min);\n let si = Math.floor(normalized * steps);\n if (si >= steps) si = steps - 1;\n const rgb = palette[si] ?? GAP;\n for (let px = 0; px < cellPx; px++) pixelRow.push(rgb);\n // Gap column mirrors the trailing space in character mode\n for (let px = 0; px < cellPx; px++) pixelRow.push(GAP);\n }\n pixelGrid.push(pixelRow);\n }\n }\n\n return createRgbPng(pixelGrid);\n }, [data, min, max, steps, effectiveColors, cellPx, mode, dataRows, dataCols]);\n\n // --- Image protocol: upload, effects, and placeholder data ---\n // charCols = dataCols Kitty cells, each 2 terminal cols wide (trailingSpace=true)\n const { kittyLines, iterm2Cols } = useImageProtocol({\n mode,\n charCols: dataCols,\n charRows: dataRows,\n pngBuf,\n trailingSpace: true,\n });\n\n // --- Kitty placeholder ---\n if (kittyLines !== null) {\n return (\n <Box flexDirection=\"column\">\n {kittyLines.map((line, i) => (\n <Text key={i}>{line}</Text>\n ))}\n </Box>\n );\n }\n\n // --- iTerm2 placeholder (blank rows; image written via cursor-up in hook) ---\n if (iterm2Cols !== null) {\n return (\n <Box flexDirection=\"column\">\n {data.map((_, i) => (\n <Text key={i}>{' '.repeat(iterm2Cols)}</Text>\n ))}\n </Box>\n );\n }\n\n // --- Character mode ---\n const gradient = createGradient(effectiveColors, steps);\n\n return (\n <Box flexDirection=\"column\">\n {data.map((row, rowIndex) => (\n <Box key={rowIndex} flexDirection=\"row\">\n {row.map((val, colIndex) => {\n const normalized = max === min ? 0 : (val - min) / (max - min);\n let stepIndex = Math.floor(normalized * steps);\n if (stepIndex >= steps) stepIndex = steps - 1;\n\n const colorFn = gradient[stepIndex];\n const renderedChar = colorFn ? colorFn(effectiveChar) : effectiveChar;\n\n return <Text key={`${rowIndex}-${colIndex}`}>{renderedChar} </Text>;\n })}\n </Box>\n ))}\n </Box>\n );\n};\n","/**\n * LogStream - Log stream display component\n *\n * Pure log display component, without borders and title.\n * If borders are needed, please use the <Panel><LogStream /></Panel> pattern.\n */\n\nimport { Box, Text } from 'ink';\nimport React, { useContext, useMemo } from 'react';\nimport { type SemanticColors, useTheme } from '../theme/ThemeContext';\nimport { GridItemContext } from './Grid';\n\nexport interface LogStreamProps {\n /**\n * Array of log strings\n */\n logs: string[];\n\n /**\n * Maximum retained lines (counted from end)\n * @default 100\n */\n maxLines?: number;\n\n /**\n * Display height (number of lines)\n * If not provided, will adapt to content (but not exceed maxLines)\n */\n height?: number;\n\n /**\n * Display width (character count)\n * If not provided, will adapt to parent container\n */\n width?: number;\n}\n\n// Log level definitions\ntype LogLevel = 'info' | 'warn' | 'error' | 'success' | 'debug' | 'unknown';\n\ninterface ParsedLog {\n timestamp?: string;\n level: LogLevel;\n message: string;\n raw: string;\n}\n\n/**\n * Parse log line\n */\nfunction parseLogLine(line: string): ParsedLog {\n // Try to extract timestamp (e.g., \"2023-01-01 12:00:00\", \"12:00:00\", \"[12:00:00]\")\n const timeRegex = /\\[?(\\d{2,4}-\\d{2}-\\d{2}\\s)?(\\d{2}:\\d{2}:\\d{2})\\]?/;\n const timeMatch = line.match(timeRegex);\n let timestamp = timeMatch ? timeMatch[0] : undefined;\n let content = line;\n\n if (timestamp) {\n content = content.replace(timestamp, '').trim();\n // Remove brackets if present in extracted timestamp for cleaner display\n timestamp = timestamp.replace(/^\\[|\\]$/g, '');\n }\n\n // Try to extract log level\n const levelRegex = /(info|warn|warning|error|err|success|debug)/i;\n const levelMatch = content.match(levelRegex);\n let level: LogLevel = 'unknown';\n\n if (levelMatch) {\n const lvl = levelMatch[0].toLowerCase();\n if (lvl.includes('error') || lvl.includes('err')) level = 'error';\n else if (lvl.includes('warn')) level = 'warn';\n else if (lvl.includes('info')) level = 'info';\n else if (lvl.includes('success')) level = 'success';\n else if (lvl.includes('debug')) level = 'debug';\n\n // Optional: Remove level tag from message if it's in brackets or standard format\n // e.g. \"[INFO] msg\" -> \"msg\"\n content = content.replace(new RegExp(`\\\\[?${levelMatch[0]}\\\\]?`, 'i'), '').trim();\n // Remove leading/trailing non-word chars (like \":\", \"-\")\n content = content.replace(/^[:\\-\\s]+/, '');\n }\n\n return {\n ...(timestamp ? { timestamp } : {}),\n level,\n message: content || line,\n raw: line,\n };\n}\n\n/**\n * Render single log line\n */\ninterface LogLineProps {\n parsed: ParsedLog;\n semantic: SemanticColors;\n index: number;\n}\n\nconst LogLine: React.FC<Omit<LogLineProps, 'index'>> = ({ parsed, semantic }) => {\n const { timestamp, level, message } = parsed;\n\n // Style configuration: based on semantic colors\n const getStyle = (lvl: LogLevel) => {\n switch (lvl) {\n case 'error':\n return { color: semantic.error, badge: '✖ ERROR', icon: '✖' };\n case 'warn':\n return { color: semantic.warning, badge: '⚠ WARN ', icon: '⚠' };\n case 'success':\n return { color: semantic.success, badge: '✔ SUCCESS', icon: '✔' };\n case 'debug':\n return { color: semantic.muted, badge: '⚙ DEBUG', icon: '⚙' };\n default:\n return { color: semantic.info, badge: 'ℹ INFO ', icon: 'ℹ' };\n }\n };\n\n const style = getStyle(level);\n\n // Different display modes:\n // Mode 1: Compact icon mode (Icon + Message) - Suitable for compact layout\n // Mode 2: Full badge mode (Badge + Message) - Suitable for wide layout\n // Here we use a hybrid mode: Level with color-highlighted text\n\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n {/* 1. Timestamp (Fixed width or just spacing) */}\n {timestamp && (\n <Box marginRight={1} width={10}>\n <Text dimColor wrap=\"truncate\">\n {timestamp}\n </Text>\n </Box>\n )}\n\n {/* 2. Level Badge/Icon */}\n {/* Use Box to give Badge a fixed width for alignment */}\n <Box marginRight={1} width={9}>\n {/* \n Badge Background: Ink does not support Text background color as a Badge well (except inverse),\n So we use colored text + icons.\n If you want \"background color blocks\", you can use <Text backgroundColor={style.color} color=\"black\"> {style.badge} </Text>\n But inverse colors may not be obvious in some terminals.\n Here we use: Bold Color Text.\n */}\n {level === 'unknown' ? (\n <Text color={semantic.muted}>•</Text>\n ) : (\n <Text color={style.color} bold>\n {level === 'error' || level === 'warn'\n ? `${style.icon} ${level.toUpperCase()}`\n : level.toUpperCase()}\n </Text>\n )}\n </Box>\n\n {/* 3. Message */}\n <Box flexGrow={1}>\n {level === 'error' ? (\n <Text color={style.color} wrap=\"truncate-end\">\n {message}\n </Text>\n ) : (\n <Text color={semantic.text} wrap=\"truncate-end\">\n {message}\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n\n/**\n * LogStream - Scrolling log viewer component\n *\n * Features:\n * - Automatically display latest logs (render tail)\n * - Intelligently parse timestamps and log levels\n * - Use icons and colors to distinguish levels\n * - Support maximum line limit\n */\nexport const LogStream: React.FC<LogStreamProps> = ({ logs, maxLines = 100, height, width }) => {\n const theme = useTheme();\n\n // Get dimensions from Grid context\n const gridContext = useContext(GridItemContext);\n const effectiveHeight =\n height ?? (typeof gridContext?.height === 'number' ? gridContext.height : undefined);\n const effectiveWidth = width ?? gridContext?.width;\n\n // 1. Trim logs to maxLines\n const recentLogs = useMemo(() => {\n const start = Math.max(0, logs.length - maxLines);\n return logs.slice(start);\n }, [logs, maxLines]);\n\n // 2. If height limit exists, further trim to visible lines\n const displayLogs = useMemo(() => {\n if (effectiveHeight && effectiveHeight > 0) {\n const start = Math.max(0, recentLogs.length - effectiveHeight);\n return recentLogs.slice(start);\n }\n return recentLogs;\n }, [recentLogs, effectiveHeight]);\n\n // 3. Parse and render\n const items = displayLogs.map((line, index) => {\n const parsed = parseLogLine(line);\n return <LogLine key={index} parsed={parsed} semantic={theme.semantic} />;\n });\n\n return (\n <Box\n flexDirection=\"column\"\n justifyContent=\"flex-end\"\n flexGrow={1}\n {...(effectiveHeight !== undefined && { height: effectiveHeight })}\n {...(effectiveWidth !== undefined && { width: effectiveWidth })}\n >\n {items}\n </Box>\n );\n};\n","import { Box, Text, useFocus, useInput } from 'ink';\nimport React, { useMemo, useContext } from 'react';\nimport { TREND } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\nimport { GridItemContext } from './Grid';\n\nexport interface TableColumn<T> {\n /**\n * Header title\n */\n header: string;\n\n /**\n * Data accessor key (if property of T) or render function\n */\n accessor: keyof T | ((item: T) => React.ReactNode);\n\n /**\n * Optional fixed width (if not provided, auto-calculated)\n */\n width?: number;\n\n /**\n * Alignment\n * @default 'left'\n */\n align?: 'left' | 'right' | 'center';\n}\n\nexport interface TableProps<T> {\n /**\n * Data array\n */\n data: T[];\n\n /**\n * Column definitions\n */\n columns: TableColumn<T>[];\n\n /**\n * Currently sorted column key (matches matches column header or some ID? Let's use header/index for simplicity or separate ID)\n * For simplicity, let's match 'header' string or an index.\n * Let's use the index of the column for simplicity in this TUI context, or match header string.\n */\n sortColumn?: number | string;\n\n /**\n * Sort direction\n */\n sortDirection?: 'asc' | 'desc';\n\n /**\n * Enable zebra striping\n * @default false\n */\n zebra?: boolean;\n\n /**\n * Callback when a column header is activated (sorted)\n */\n onSort?: (column: TableColumn<T>, index: number) => void;\n}\n\n// Alignment mapping constants\nconst ALIGN_MAP = {\n left: 'flex-start',\n right: 'flex-end',\n center: 'center',\n} as const;\n\ninterface HeaderCellProps<T> {\n column: TableColumn<T>;\n width: number;\n isSorted: boolean;\n sortDirection: 'asc' | 'desc';\n onSort?: (column: TableColumn<T>) => void;\n align: 'flex-start' | 'center' | 'flex-end';\n autoFocus?: boolean;\n}\n\nconst SortableHeaderCell = <T,>({\n column,\n width,\n isSorted,\n sortDirection,\n onSort,\n align,\n autoFocus,\n}: HeaderCellProps<T>) => {\n const theme = useTheme();\n const semantic = theme.semantic;\n const { isFocused } = useFocus({ autoFocus: !!autoFocus });\n\n useInput((input, key) => {\n if (isFocused && (key.return || input === ' ')) {\n onSort?.(column);\n }\n });\n\n let indicator = '';\n if (isSorted) {\n indicator = sortDirection === 'asc' ? ` ${TREND.up}` : ` ${TREND.down}`;\n }\n\n return (\n <Box\n width={width}\n justifyContent={align}\n flexShrink={0}\n paddingX={1}\n {...(isFocused ? { borderStyle: 'single' } : {})}\n borderColor={semantic.info}\n marginTop={isFocused ? -1 : 0} // visual adjustment for border\n // Or better: use inverse color for focus\n >\n {/* \n Border adds size, might shift layout. \n Using inverse/underline for focus is safer in fixed layout.\n */}\n <Text\n bold\n color={isFocused ? semantic.info : semantic.success}\n underline={isFocused}\n wrap=\"truncate-end\"\n >\n {column.header}\n {indicator}\n </Text>\n </Box>\n );\n};\n\n/**\n * Table - Data table with interactive sort headers\n */\n// Helper to separate cell content extraction\nconst getCellContentLength = <T,>(item: T, col: TableColumn<T>): number => {\n let content = '';\n if (typeof col.accessor === 'function') {\n const result = col.accessor(item);\n if (typeof result === 'string' || typeof result === 'number') {\n content = String(result);\n }\n } else {\n const val = item[col.accessor];\n if (val !== undefined && val !== null) {\n content = String(val);\n }\n }\n return content.length;\n};\n\n// Helper to calculate widths\nconst calculateWidths = <T,>(columns: TableColumn<T>[], data: T[]) => {\n return columns.map((col) => {\n if (col.width) return col.width;\n\n let max = col.header.length + 2;\n for (const item of data) {\n max = Math.max(max, getCellContentLength(item, col));\n }\n return max + 2;\n });\n};\n\n/**\n * Table - Data table with interactive sort headers\n */\nexport const Table = <T,>({\n data,\n columns,\n sortColumn,\n sortDirection = 'asc',\n zebra = false,\n onSort,\n}: TableProps<T>) => {\n // 1. Resolve Context for Width\n const gridContext = useContext(GridItemContext);\n const availableWidth = gridContext?.width;\n\n // 2. Calculate column widths based on content\n const contentWidths = useMemo(() => calculateWidths(columns, data), [data, columns]);\n const totalContentWidth = contentWidths.reduce((a, b) => a + b, 0);\n\n // 3. Adjust widths to fit availableWidth\n // 3. Adjust widths to fit availableWidth\n const finalColumnWidths = useMemo(() => {\n if (!availableWidth) {\n return contentWidths;\n }\n\n // Expansion Strategy: If we have extra space, fill it proportionally\n // Compression Strategy: If we don't have enough space, scale down\n // Both can be handled by the same scale factor logic\n const scale = availableWidth / totalContentWidth;\n\n // If scale is close to 1 (within rounding error), just return contentWidths?\n // No, we want to snap to availableWidth exactly if possible.\n\n let allocated = 0;\n return contentWidths.map((w, i) => {\n // If this is the last column, give it the remaining space\n // This handles both rounding errors and ensures we fill the width\n if (i === contentWidths.length - 1) {\n return Math.max(1, availableWidth - allocated);\n }\n\n const newW = Math.floor(w * scale);\n allocated += newW;\n return Math.max(1, newW);\n });\n }, [availableWidth, totalContentWidth, contentWidths]);\n\n return (\n <Box\n flexDirection=\"column\"\n {...(availableWidth !== undefined && { width: availableWidth })}\n >\n {/* Header */}\n <Box\n borderStyle=\"single\"\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderBottom={true}\n flexDirection=\"row\"\n >\n {columns.map((col, i) => {\n const width = finalColumnWidths[i] ?? 0;\n const isSorted = sortColumn === i || sortColumn === col.header;\n const justifyContent = col.align ? ALIGN_MAP[col.align] : 'flex-start';\n\n return (\n <SortableHeaderCell\n key={i}\n column={col}\n width={width}\n isSorted={isSorted}\n sortDirection={sortDirection}\n align={justifyContent}\n onSort={() => onSort?.(col, i)}\n autoFocus={i === 0}\n />\n );\n })}\n </Box>\n\n {/* Rows */}\n {data.map((item, rowIndex) => {\n const isZebra = zebra && rowIndex % 2 === 1;\n\n return (\n <Box key={rowIndex} flexDirection=\"row\">\n {columns.map((col, colIndex) => {\n const width = finalColumnWidths[colIndex] ?? 0;\n\n let content: React.ReactNode;\n if (typeof col.accessor === 'function') {\n content = col.accessor(item);\n } else {\n const val = item[col.accessor];\n content = val !== undefined && val !== null ? String(val) : '';\n }\n\n const justifyContent = col.align ? ALIGN_MAP[col.align] : 'flex-start';\n\n return (\n <Box\n key={colIndex}\n width={width}\n justifyContent={justifyContent}\n flexShrink={0}\n paddingX={1}\n >\n {/* \n Ink doesn't have background color on Box easily for rows. \n We wrap content in Text with backgroundColor if zebra.\n But this only backgrounds the text characters, not the full cell width.\n To background full cell width, we usually need 'ink-color-pipe' or some hack.\n Or we use 'inverse' for zebra?\n 'dimColor' is subtle for zebra striping on text. \n Let's try: if zebra, dim the text.\n */}\n <Text dimColor={isZebra} wrap=\"truncate-end\">\n {content}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n })}\n </Box>\n );\n};\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { BORDER_ROUNDED } from '../symbols';\nimport { useTheme } from '../theme/ThemeContext';\n\n/**\n * Status for a single ping\n */\nexport type PingStatus = 'good' | 'unstable' | 'bad';\n\n/**\n * Ping record item\n */\nexport interface PingRecord {\n /**\n * Connection status\n */\n status: PingStatus;\n}\n\nexport interface PulseBarProps {\n /**\n * Ping history entries\n */\n records?: PingRecord[];\n\n /**\n * Maximum number of bars to display\n * @default 30\n */\n maxBars?: number;\n\n /**\n * Custom colors\n */\n colors?: {\n good?: string;\n unstable?: string;\n bad?: string;\n };\n}\n\n/**\n * PulseBar - network connection status component\n *\n * Shows ping history, each bar represents a ping result:\n * - Green: connection healthy\n * - Yellow: connection unstable\n * - Red: connection failed\n */\nexport const PulseBar: React.FC<PulseBarProps> = ({ records = [], maxBars = 30, colors }) => {\n const theme = useTheme();\n\n const getColor = (status: PingStatus): string => {\n switch (status) {\n case 'good':\n return colors?.good ?? theme.semantic.success;\n case 'unstable':\n return colors?.unstable ?? theme.semantic.warning;\n case 'bad':\n return colors?.bad ?? theme.semantic.error;\n }\n };\n\n const displayRecords = records.slice(-maxBars);\n const paddingCount = maxBars - displayRecords.length;\n const borderColor = theme.semantic.muted;\n const topBorder =\n BORDER_ROUNDED.topLeft +\n BORDER_ROUNDED.horizontal.repeat(maxBars) +\n BORDER_ROUNDED.topRight;\n const bottomBorder =\n BORDER_ROUNDED.bottomLeft +\n BORDER_ROUNDED.horizontal.repeat(maxBars) +\n BORDER_ROUNDED.bottomRight;\n\n return (\n <Box flexDirection=\"column\">\n <Text color={borderColor}>{topBorder}</Text>\n <Box flexDirection=\"row\">\n <Text color={borderColor}>{BORDER_ROUNDED.vertical}</Text>\n {paddingCount > 0 && (\n <Text color={borderColor}>{BORDER_ROUNDED.bar.repeat(paddingCount)}</Text>\n )}\n {displayRecords.map((record, index) => (\n <Text key={index} color={getColor(record.status)}>\n {BORDER_ROUNDED.bar}\n </Text>\n ))}\n <Text color={borderColor}>{BORDER_ROUNDED.vertical}</Text>\n </Box>\n <Text color={borderColor}>{bottomBorder}</Text>\n </Box>\n );\n};\n"]}
|