ink-hud 0.1.0

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.
@@ -0,0 +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"],"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}\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 * 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 // Subtract a safety margin (e.g., 2 chars) if using terminal width to prevent edge-case wrapping\n const defaultWidth = terminalWidth > 2 ? terminalWidth - 2 : terminalWidth;\n const totalWidth = propsWidth ?? Math.max(0, defaultWidth - widthOffset);\n\n return (\n <GridContext.Provider value={{ columns, gap, totalWidth, rowHeight }}>\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n columnGap={gap}\n rowGap={gap}\n width={totalWidth}\n >\n {children}\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}\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}) => {\n const { columns, gap, totalWidth, rowHeight: contextRowHeight } = useContext(GridContext);\n\n // Calculate width accounting for gaps\n // Available width for columns = Total - (Columns - 1) * Gap\n const totalGapWidth = Math.max(0, (columns - 1) * gap);\n const availableWidth = Math.max(0, totalWidth - totalGapWidth);\n\n // Width for this item's span\n // SpanWidth = (SingleColWidth * Span) + ((Span - 1) * Gap)\n // We floor to ensure we don't overflow; flexGrow will fill remainder.\n const colWidth = availableWidth / columns;\n const itemGapWidth = Math.max(0, (span - 1) * gap);\n const basisWidth = Math.floor(colWidth * span + itemGapWidth);\n\n const effectiveHeight = height ?? contextRowHeight;\n\n return (\n <GridItemContext.Provider value={{ width: basisWidth, height: effectiveHeight }}>\n <Box\n flexGrow={1}\n flexShrink={1}\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 /** 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 min,\n max,\n } = config;\n\n const gridContext = useContext(GridItemContext);\n\n // 1. Calculate Total Dimensions\n const totalHeight =\n props.height ?? (typeof gridContext?.height === 'number' ? gridContext.height : 15);\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, plotWidth, plotHeight, yAxisWidth } = layout;\n\n return (\n <Box flexDirection=\"column\" width={totalWidth}>\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} alignItems=\"center\">\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\">\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 const childContext = React.useMemo(\n () => ({\n ...(innerWidth !== undefined ? { width: innerWidth } : {}),\n height: innerHeight,\n }),\n [innerWidth, innerHeight],\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"]}