import React, { useEffect, useState } from 'react' import { Box, Text, useStdout } from 'ink' import { theme, gradientColor, lerpHex } from '../../../../ui/theme.js' const COMPACT_LINES = [ '█▀▀ ▀█▀ █ █ ▄▀█ █▀▀ █▀▀ █▄ █ ▀█▀', '██▄ █ █▀█ █▀█ █▄█ ██▄ █ ▀█ █ ', ] const COMPACT_SPLIT = 12 const COMPACT_WIDTH = Math.max(...COMPACT_LINES.map(line => line.length)) // Brightness shade: multiply RGB channels by a factor function shade(hex: string, factor: number): string { const n = parseInt(hex.slice(1), 16) const ch = (shift: number): string => Math.min(255, Math.round(((n >> shift) & 0xff) * factor)).toString(16).padStart(2, '0') return `#${ch(16)}${ch(8)}${ch(0)}` } // Eth half: steel-blue diagonal sheen const ETH_HIGHLIGHT = '#d8e0f0' const ETH_TOP = '#a0b0cc' const ETH_BASE = '#7888a8' const ETH_SHADE = '#506078' function getEthSheen(t: number): string { if (t < 0.2) return lerpHex(ETH_HIGHLIGHT, ETH_TOP, t / 0.2) if (t < 0.5) return lerpHex(ETH_TOP, ETH_BASE, (t - 0.2) / 0.3) return lerpHex(ETH_BASE, ETH_SHADE, (t - 0.5) / 0.5) } const CompactBanner: React.FC<{ columns: number }> = ({ columns }) => { if (columns < COMPACT_WIDTH) { const agent = 'agent' const maxAgent = Math.max(1, agent.length - 1) return ( eth {[...agent].map((ch, j) => ( {ch} ))} ) } const rows = COMPACT_LINES.length return ( {COMPACT_LINES.map((line, row) => { const tY = row / (rows - 1 || 1) const eth = line.slice(0, COMPACT_SPLIT) const agent = line.slice(COMPACT_SPLIT) const ethChars = [...eth] const agentChars = [...agent] const ethLast = Math.max(1, ethChars.length - 1) const agentLast = Math.max(1, agentChars.length - 1) return ( {ethChars.map((ch, i) => { if (ch === ' ') return const factor = ((i / ethLast) + tY) / 2 return ( {ch} ) })} {agentChars.map((ch, j) => { if (ch === ' ') return const tX = j / agentLast // Highlight top-left (1.25), fade to shadow bottom-right (0.75) const brightness = 1.25 - ((tX + tY) / 2) * 0.5 return ( {ch} ) })} ) })} ) } export const Logo: React.FC = () => { const { stdout } = useStdout() const [columns, setColumns] = useState(() => Math.floor(stdout?.columns ?? 80)) useEffect(() => { if (!stdout) return const handleResize = () => setColumns(Math.floor(stdout.columns ?? 80)) stdout.on('resize', handleResize) return () => { stdout.off('resize', handleResize) } }, [stdout]) return }