{"version":3,"file":"spinner-DNvxbM9a.cjs","names":["getTerminalWidth","getTerminalWidth"],"sources":["../../src/terminal/color-converter.ts","../../src/terminal/formatter.ts","../../src/playground/step.ts","../../src/playground/header.ts","../../src/playground/divider.ts","../../src/playground/box.ts","../../src/playground/cli-table.ts","../../src/playground/spinner.ts"],"sourcesContent":["/**\n * Color Converter - CSS colors to ANSI extended color codes\n * Supports 256-color and truecolor (24-bit) terminals\n */\n\nexport type ColorCapability = 'full' | 'basic' | 'none';\n\nexport interface RGB {\n    r: number;\n    g: number;\n    b: number;\n}\n\nconst ANSI_16_COLORS: Record<string, { fg: string; bg: string; bright: { fg: string; bg: string } }> = {\n    black:   { fg: '30', bg: '40', bright: { fg: '90', bg: '100' } },\n    red:     { fg: '31', bg: '41', bright: { fg: '91', bg: '101' } },\n    green:   { fg: '32', bg: '42', bright: { fg: '92', bg: '102' } },\n    yellow:  { fg: '33', bg: '43', bright: { fg: '93', bg: '103' } },\n    blue:    { fg: '34', bg: '44', bright: { fg: '94', bg: '104' } },\n    magenta: { fg: '35', bg: '45', bright: { fg: '95', bg: '105' } },\n    cyan:    { fg: '36', bg: '46', bright: { fg: '96', bg: '106' } },\n    white:   { fg: '37', bg: '47', bright: { fg: '97', bg: '107' } },\n    gray:    { fg: '90', bg: '100', bright: { fg: '37', bg: '47' } },\n    grey:    { fg: '90', bg: '100', bright: { fg: '37', bg: '47' } },\n};\n\nconst CSS_NAMED_COLORS: Record<string, string> = {\n    aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff',\n    aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc',\n    bisque: '#ffe4c4', black: '#000000', blanchedalmond: '#ffebcd',\n    blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a',\n    burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00',\n    chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed',\n    cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff',\n    darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b',\n    darkgray: '#a9a9a9', darkgreen: '#006400', darkkhaki: '#bdb76b',\n    darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00',\n    darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a',\n    darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f',\n    darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493',\n    deepskyblue: '#00bfff', dimgray: '#696969', dodgerblue: '#1e90ff',\n    firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22',\n    fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff',\n    gold: '#ffd700', goldenrod: '#daa520', gray: '#808080',\n    green: '#008000', greenyellow: '#adff2f', honeydew: '#f0fff0',\n    hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082',\n    ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa',\n    lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd',\n    lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff',\n    lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90',\n    lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa',\n    lightskyblue: '#87cefa', lightslategray: '#778899', lightsteelblue: '#b0c4de',\n    lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32',\n    linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000',\n    mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3',\n    mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee',\n    mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585',\n    midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1',\n    moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080',\n    oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23',\n    orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6',\n    palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee',\n    palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9',\n    peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd',\n    powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399',\n    red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1',\n    saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460',\n    seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d',\n    silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd',\n    slategray: '#708090', snow: '#fffafa', springgreen: '#00ff7f',\n    steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080',\n    thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0',\n    violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff',\n    whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32',\n};\n\nexport function hexToRgb(hex: string): RGB {\n    const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n    if (!result || !result[1] || !result[2] || !result[3]) {\n        return { r: 255, g: 255, b: 255 };\n    }\n    return {\n        r: parseInt(result[1], 16),\n        g: parseInt(result[2], 16),\n        b: parseInt(result[3], 16),\n    };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n    return '#' + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');\n}\n\nexport function hexTo256(hex: string): number {\n    const { r, g, b } = hexToRgb(hex);\n\n    if (r === g && g === b) {\n        if (r < 8) return 16;\n        if (r > 248) return 231;\n        return Math.round(((r - 8) / 247) * 24) + 232;\n    }\n\n    const ri = Math.round(r / 255 * 5);\n    const gi = Math.round(g / 255 * 5);\n    const bi = Math.round(b / 255 * 5);\n\n    return 16 + (36 * ri) + (6 * gi) + bi;\n}\n\nexport function colorToHex(color: string): string {\n    if (color.startsWith('#')) {\n        return color;\n    }\n\n    const named = CSS_NAMED_COLORS[color.toLowerCase()];\n    if (named) {\n        return named;\n    }\n\n    const rgbMatch = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n    if (rgbMatch && rgbMatch[1] && rgbMatch[2] && rgbMatch[3]) {\n        return rgbToHex(\n            parseInt(rgbMatch[1]),\n            parseInt(rgbMatch[2]),\n            parseInt(rgbMatch[3])\n        );\n    }\n\n    return '#ffffff';\n}\n\nexport function getANSIForeground(color: string, capability: ColorCapability): string {\n    if (capability === 'none') return '';\n\n    const lowerColor = color.toLowerCase();\n\n    if (capability === 'basic' && ANSI_16_COLORS[lowerColor]) {\n        return `\\x1b[${ANSI_16_COLORS[lowerColor].fg}m`;\n    }\n\n    if (capability === 'basic') {\n        const hex = colorToHex(color);\n        const nearestBasic = findNearestBasicColor(hex);\n        const basicColor = ANSI_16_COLORS[nearestBasic];\n        return basicColor ? `\\x1b[${basicColor.fg}m` : '\\x1b[37m';\n    }\n\n    const hex = colorToHex(color);\n    const { r, g, b } = hexToRgb(hex);\n    return `\\x1b[38;2;${r};${g};${b}m`;\n}\n\nexport function getANSIBackground(color: string, capability: ColorCapability): string {\n    if (capability === 'none') return '';\n\n    const lowerColor = color.toLowerCase();\n\n    if (capability === 'basic' && ANSI_16_COLORS[lowerColor]) {\n        return `\\x1b[${ANSI_16_COLORS[lowerColor].bg}m`;\n    }\n\n    if (capability === 'basic') {\n        const hex = colorToHex(color);\n        const nearestBasic = findNearestBasicColor(hex);\n        const basicColor = ANSI_16_COLORS[nearestBasic];\n        return basicColor ? `\\x1b[${basicColor.bg}m` : '\\x1b[47m';\n    }\n\n    const hex = colorToHex(color);\n    const { r, g, b } = hexToRgb(hex);\n    return `\\x1b[48;2;${r};${g};${b}m`;\n}\n\nexport function getANSI256Foreground(colorIndex: number): string {\n    return `\\x1b[38;5;${colorIndex}m`;\n}\n\nexport function getANSI256Background(colorIndex: number): string {\n    return `\\x1b[48;5;${colorIndex}m`;\n}\n\nfunction findNearestBasicColor(hex: string): string {\n    const { r, g, b } = hexToRgb(hex);\n    const basicColors: Record<string, RGB> = {\n        black:   { r: 0, g: 0, b: 0 },\n        red:     { r: 205, g: 0, b: 0 },\n        green:   { r: 0, g: 205, b: 0 },\n        yellow:  { r: 205, g: 205, b: 0 },\n        blue:    { r: 0, g: 0, b: 238 },\n        magenta: { r: 205, g: 0, b: 205 },\n        cyan:    { r: 0, g: 205, b: 205 },\n        white:   { r: 229, g: 229, b: 229 },\n    };\n\n    let nearest = 'white';\n    let minDistance = Infinity;\n\n    for (const [name, rgb] of Object.entries(basicColors)) {\n        const distance = Math.sqrt(\n            Math.pow(r - rgb.r, 2) +\n            Math.pow(g - rgb.g, 2) +\n            Math.pow(b - rgb.b, 2)\n        );\n        if (distance < minDistance) {\n            minDistance = distance;\n            nearest = name;\n        }\n    }\n\n    return nearest;\n}\n\nexport function extractGradientColors(gradient: string): string[] {\n    const hexMatches = gradient.match(/#[a-fA-F0-9]{6}/g) || [];\n    const rgbMatches = gradient.match(/rgba?\\([^)]+\\)/g) || [];\n    const namedMatches = gradient.match(/,\\s*([a-z]+)(?:\\s|,|\\))/gi) || [];\n\n    const colors: string[] = [\n        ...hexMatches,\n        ...rgbMatches.map(colorToHex),\n        ...namedMatches.map(m => {\n            const name = m.replace(/[,\\s)]/g, '').toLowerCase();\n            return CSS_NAMED_COLORS[name] || null;\n        }).filter((c): c is string => c !== null)\n    ];\n\n    return colors.length > 0 ? colors : ['#ffffff'];\n}\n\nexport function gradientToSingleColor(gradient: string): string {\n    const colors = extractGradientColors(gradient);\n    if (colors.length === 0) return '#ffffff';\n    if (colors.length === 1) return colors[0] ?? '#ffffff';\n\n    const rgbs = colors.map(c => hexToRgb(colorToHex(c)));\n    const avgR = Math.round(rgbs.reduce((sum, rgb) => sum + rgb.r, 0) / rgbs.length);\n    const avgG = Math.round(rgbs.reduce((sum, rgb) => sum + rgb.g, 0) / rgbs.length);\n    const avgB = Math.round(rgbs.reduce((sum, rgb) => sum + rgb.b, 0) / rgbs.length);\n\n    return rgbToHex(avgR, avgG, avgB);\n}\n\nexport function cssColorToANSI(\n    cssColor: string,\n    capability: ColorCapability,\n    isBackground: boolean = false\n): string {\n    if (capability === 'none') return '';\n\n    let resolvedColor: string;\n\n    if (cssColor.includes('gradient')) {\n        resolvedColor = gradientToSingleColor(cssColor);\n    } else {\n        resolvedColor = colorToHex(cssColor);\n    }\n\n    return isBackground\n        ? getANSIBackground(resolvedColor, capability)\n        : getANSIForeground(resolvedColor, capability);\n}\n\nexport const ANSI = {\n    reset: '\\x1b[0m',\n    bold: '\\x1b[1m',\n    dim: '\\x1b[2m',\n    italic: '\\x1b[3m',\n    underline: '\\x1b[4m',\n    blink: '\\x1b[5m',\n    inverse: '\\x1b[7m',\n    hidden: '\\x1b[8m',\n    strikethrough: '\\x1b[9m',\n\n    fg: {\n        black: '\\x1b[30m',\n        red: '\\x1b[31m',\n        green: '\\x1b[32m',\n        yellow: '\\x1b[33m',\n        blue: '\\x1b[34m',\n        magenta: '\\x1b[35m',\n        cyan: '\\x1b[36m',\n        white: '\\x1b[37m',\n        gray: '\\x1b[90m',\n        brightRed: '\\x1b[91m',\n        brightGreen: '\\x1b[92m',\n        brightYellow: '\\x1b[93m',\n        brightBlue: '\\x1b[94m',\n        brightMagenta: '\\x1b[95m',\n        brightCyan: '\\x1b[96m',\n        brightWhite: '\\x1b[97m',\n    },\n\n    bg: {\n        black: '\\x1b[40m',\n        red: '\\x1b[41m',\n        green: '\\x1b[42m',\n        yellow: '\\x1b[43m',\n        blue: '\\x1b[44m',\n        magenta: '\\x1b[45m',\n        cyan: '\\x1b[46m',\n        white: '\\x1b[47m',\n        gray: '\\x1b[100m',\n        brightRed: '\\x1b[101m',\n        brightGreen: '\\x1b[102m',\n        brightYellow: '\\x1b[103m',\n        brightBlue: '\\x1b[104m',\n        brightMagenta: '\\x1b[105m',\n        brightCyan: '\\x1b[106m',\n        brightWhite: '\\x1b[107m',\n    },\n\n    rgb: (r: number, g: number, b: number) => `\\x1b[38;2;${r};${g};${b}m`,\n    bgRgb: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n    color256: (n: number) => `\\x1b[38;5;${n}m`,\n    bgColor256: (n: number) => `\\x1b[48;5;${n}m`,\n};\n","/**\n * Terminal Formatter - Alignment, key-value, and advanced terminal formatting\n */\n\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { getANSIForeground, getANSIBackground, ANSI, type ColorCapability } from './color-converter.js';\nimport type { ColumnConfig, ColumnAlign, BadgeStyle, TimestampFormat, LogOptions } from '../types/index.js';\n\nexport function stripAnsi(str: string): string {\n    return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nexport function getVisibleLength(str: string): number {\n    return stripAnsi(str).length;\n}\n\nexport function padToWidth(str: string, width: number, align: ColumnAlign = 'left'): string {\n    const visibleLen = getVisibleLength(str);\n    if (visibleLen >= width) return str;\n\n    const padding = width - visibleLen;\n\n    switch (align) {\n        case 'right':\n            return ' '.repeat(padding) + str;\n        case 'center':\n            const leftPad = Math.floor(padding / 2);\n            const rightPad = padding - leftPad;\n            return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n        case 'left':\n        default:\n            return str + ' '.repeat(padding);\n    }\n}\n\nexport function formatWithRightAlign(\n    leftContent: string,\n    rightContent: string,\n    maxWidth?: number\n): string {\n    const width = maxWidth ?? getTerminalWidth();\n    const leftLen = getVisibleLength(leftContent);\n    const rightLen = getVisibleLength(rightContent);\n\n    const gap = width - leftLen - rightLen;\n    if (gap <= 1) {\n        return `${leftContent} ${rightContent}`;\n    }\n\n    return `${leftContent}${' '.repeat(gap)}${rightContent}`;\n}\n\nexport function formatColumns(\n    columns: ColumnConfig[],\n    maxWidth?: number,\n    colorCapability: ColorCapability = 'full'\n): string {\n    const width = maxWidth ?? getTerminalWidth();\n    const totalColumns = columns.length;\n\n    const columnsWithWidths = columns.map((col, idx) => {\n        if (col.width) return { ...col, calculatedWidth: col.width };\n\n        const remainingWidth = width - columns\n            .filter((c, i) => i !== idx && c.width)\n            .reduce((sum, c) => sum + (c.width ?? 0), 0);\n\n        const autoColumns = columns.filter(c => !c.width).length;\n        const calculatedWidth = Math.floor(remainingWidth / autoColumns);\n\n        return { ...col, calculatedWidth };\n    });\n\n    return columnsWithWidths.map(col => {\n        let content = col.content;\n\n        if (col.color && colorCapability !== 'none') {\n            const colorCode = getANSIForeground(col.color, colorCapability);\n            content = `${colorCode}${content}${ANSI.reset}`;\n        }\n\n        return padToWidth(content, col.calculatedWidth, col.align);\n    }).join('');\n}\n\nexport function formatKeyValue(\n    obj: Record<string, unknown>,\n    colorCapability: ColorCapability = 'full',\n    options: { separator?: string; keyColor?: string; valueColor?: string } = {}\n): string {\n    const {\n        separator = '  ',\n        keyColor = '#888888',\n        valueColor = '#00ffff'\n    } = options;\n\n    const entries = Object.entries(obj);\n    if (entries.length === 0) return '';\n\n    const keyColorCode = colorCapability !== 'none'\n        ? getANSIForeground(keyColor, colorCapability)\n        : '';\n    const valueColorCode = colorCapability !== 'none'\n        ? getANSIForeground(valueColor, colorCapability)\n        : '';\n    const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n    return entries\n        .map(([key, value]) => {\n            const valueStr = typeof value === 'object'\n                ? JSON.stringify(value)\n                : String(value);\n            return `${keyColorCode}${key}:${reset} ${valueColorCode}${valueStr}${reset}`;\n        })\n        .join(separator);\n}\n\nexport function isKeyValueObject(obj: unknown): obj is Record<string, unknown> {\n    if (typeof obj !== 'object' || obj === null) return false;\n    if (Array.isArray(obj)) return false;\n\n    const proto = Object.getPrototypeOf(obj);\n    if (proto !== Object.prototype && proto !== null) return false;\n\n    const values = Object.values(obj);\n    return values.every(v =>\n        typeof v === 'string' ||\n        typeof v === 'number' ||\n        typeof v === 'boolean' ||\n        v === null\n    );\n}\n\nexport function formatBadge(\n    badge: string,\n    style: BadgeStyle = 'brackets',\n    colorCapability: ColorCapability = 'full',\n    color?: string\n): string {\n    const reset = colorCapability !== 'none' ? ANSI.reset : '';\n\n    const text = badge.toUpperCase();\n\n    switch (style) {\n        case 'rounded':\n            const colorCode1 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n            const bgBlack1 = colorCapability !== 'none' ? ANSI.bg.black : '';\n            return `${bgBlack1}${colorCode1}⟨${text}⟩${reset}`;\n        case 'plain':\n            const colorCode2 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n            return `${colorCode2}${text}${reset}`;\n        case 'unicode':\n            const colorCode3 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n            const bgBlack3 = colorCapability !== 'none' ? ANSI.bg.black : '';\n            return `${bgBlack3}${colorCode3}╭${text}╮${reset}`;\n        case 'pill':\n            // Badge con background de color y texto blanco/negro\n            const bgColor = color && colorCapability !== 'none' ? getANSIBackground(color, colorCapability) : '';\n            const fgColor = colorCapability !== 'none' ? getANSIForeground('#000000', colorCapability) : '';\n            return `${bgColor}${fgColor}[${text}]${reset}`;\n        case 'brackets':\n        default:\n            const colorCode5 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';\n            const bgBlack5 = colorCapability !== 'none' ? ANSI.bg.black : '';\n            return `${bgBlack5}${colorCode5}[${text}]${reset}`;\n    }\n}\n\nexport function formatTimestamp(\n    date: Date = new Date(),\n    format: TimestampFormat = 'time'\n): string {\n    switch (format) {\n        case 'iso':\n            return date.toISOString();\n        case 'date':\n            return date.toISOString().split('T')[0] ?? '';\n        case 'time':\n            return date.toTimeString().slice(0, 8);\n        case 'timeMs':\n            return date.toTimeString().slice(0, 8) + '.' +\n                   String(date.getMilliseconds()).padStart(3, '0');\n        case 'relative':\n            return formatRelativeTime(date);\n        case 'elapsed':\n            return formatElapsedTime(date);\n        case 'custom':\n        default:\n            return date.toLocaleTimeString();\n    }\n}\n\nlet startTime: number | null = null;\n\nexport function formatRelativeTime(date: Date): string {\n    if (startTime === null) {\n        startTime = Date.now();\n    }\n\n    const diff = date.getTime() - startTime;\n\n    if (diff < 1000) {\n        return `+${diff}ms`;\n    } else if (diff < 60000) {\n        return `+${(diff / 1000).toFixed(1)}s`;\n    } else {\n        const mins = Math.floor(diff / 60000);\n        const secs = Math.floor((diff % 60000) / 1000);\n        return `+${mins}m${secs}s`;\n    }\n}\n\nexport function formatElapsedTime(date: Date): string {\n    if (startTime === null) {\n        startTime = Date.now();\n    }\n\n    const diff = date.getTime() - startTime;\n    const hours = Math.floor(diff / 3600000);\n    const mins = Math.floor((diff % 3600000) / 60000);\n    const secs = Math.floor((diff % 60000) / 1000);\n\n    return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`;\n}\n\nexport function resetStartTime(): void {\n    startTime = Date.now();\n}\n\nexport function applyLogOptions(\n    message: string,\n    options: LogOptions,\n    colorCapability: ColorCapability = 'full'\n): string {\n    let result = message;\n\n    if (options.rightAlign) {\n        result = formatWithRightAlign(message, options.rightAlign);\n    }\n\n    return result;\n}\n","/**\n * @fileoverview Step progress renderer for CLI primitives\n */\n\nimport { getANSIForeground, ANSI, type ColorCapability } from '../terminal/color-converter.js';\n\n/**\n * Renders a step progress indicator like `  [2/5] Analyzing repository...`\n * @param current - Current step number\n * @param total - Total number of steps\n * @param msg - Step description message\n * @param colorCap - Terminal color capability\n * @returns Formatted step string\n */\nexport function renderStep(current: number, total: number, msg: string, colorCap: ColorCapability): string {\n    const label = `[${current}/${total}]`;\n    const colored = colorCap !== 'none'\n        ? getANSIForeground('#00bcd4', colorCap) + ANSI.bold + label + ANSI.reset\n        : label;\n    return `  ${colored} ${msg}`;\n}\n","/**\n * @fileoverview Header renderer for CLI primitives\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\n\n/**\n * Renders a styled header with optional subtitle\n * @param title - Main title text\n * @param subtitle - Optional subtitle (rendered dimmed)\n * @returns Formatted header string\n */\nexport function renderHeader(title: string, subtitle?: string): string {\n    const t = ANSI.bold + title + ANSI.reset;\n    const s = subtitle ? ANSI.dim + ` ${subtitle}` + ANSI.reset : '';\n    return `  ${t}${s}`;\n}\n","/**\n * @fileoverview Divider renderer for CLI primitives\n */\n\nimport { ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\n\n/**\n * Renders a horizontal divider line\n * @param width - Optional explicit width (defaults to terminal width capped at 60)\n * @returns Formatted divider string\n */\nexport function renderDivider(width?: number): string {\n    const w = width ?? Math.min(getTerminalWidth() - 4, 60);\n    return ANSI.dim + '  ' + '\\u2500'.repeat(w) + ANSI.reset;\n}\n","/**\n * @fileoverview Box renderer for CLI primitives\n */\n\nimport type { IBoxOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getTerminalWidth } from '../utils/environment-detector.js';\nimport { stripAnsi, getVisibleLength } from '../terminal/formatter.js';\n\n/**\n * Border character sets for different styles\n */\nconst BORDER_CHARS = {\n    single:  { tl: '\\u250c', tr: '\\u2510', bl: '\\u2514', br: '\\u2518', h: '\\u2500', v: '\\u2502' },\n    rounded: { tl: '\\u256d', tr: '\\u256e', bl: '\\u2570', br: '\\u256f', h: '\\u2500', v: '\\u2502' },\n    double:  { tl: '\\u2554', tr: '\\u2557', bl: '\\u255a', br: '\\u255d', h: '\\u2550', v: '\\u2551' },\n    bold:    { tl: '\\u250f', tr: '\\u2513', bl: '\\u2517', br: '\\u251b', h: '\\u2501', v: '\\u2503' },\n} as const;\n\n/**\n * Renders content inside a bordered box\n * @param content - Content string (may contain newlines)\n * @param options - Box rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted box string with border\n */\nexport function renderBox(content: string, options: IBoxOptions = {}, colorCap: ColorCapability = 'full'): string {\n    const {\n        title,\n        borderColor,\n        borderStyle = 'rounded',\n        padding = 0,\n    } = options;\n\n    const chars = BORDER_CHARS[borderStyle] ?? BORDER_CHARS.rounded;\n    const lines = content.split('\\n');\n    const maxTermWidth = Math.min(getTerminalWidth() - 4, 80);\n\n    // Calculate content width from visible text\n    const contentWidths = lines.map(l => getVisibleLength(l));\n    const titleWidth = title ? stripAnsi(title).length + 2 : 0; // +2 for spaces around title\n    const maxContentWidth = Math.max(...contentWidths, titleWidth);\n    const innerWidth = Math.min(maxContentWidth + 2, maxTermWidth); // +2 for horizontal padding\n\n    // Color wrapper for border chars\n    const bc = borderColor && colorCap !== 'none'\n        ? getANSIForeground(borderColor, colorCap)\n        : '';\n    const reset = bc ? ANSI.reset : '';\n\n    const wrap = (char: string) => `${bc}${char}${reset}`;\n\n    // Build top border (with optional title)\n    let topBorder: string;\n    if (title) {\n        const titleStr = ` ${title} `;\n        const afterTitle = innerWidth - stripAnsi(titleStr).length;\n        topBorder = `  ${wrap(chars.tl)}${wrap(chars.h)}${wrap(titleStr)}${wrap(chars.h.repeat(Math.max(0, afterTitle - 1)))}${wrap(chars.tr)}`;\n    } else {\n        topBorder = `  ${wrap(chars.tl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.tr)}`;\n    }\n\n    // Build bottom border\n    const bottomBorder = `  ${wrap(chars.bl)}${wrap(chars.h.repeat(innerWidth))}${wrap(chars.br)}`;\n\n    // Build padding lines\n    const emptyLine = `  ${wrap(chars.v)}${' '.repeat(innerWidth)}${wrap(chars.v)}`;\n    const paddingLines = padding > 0 ? Array(padding).fill(emptyLine) : [];\n\n    // Build content lines\n    const contentLines = lines.map(line => {\n        const visible = getVisibleLength(line);\n        const pad = innerWidth - visible - 1; // -1 for left space\n        return `  ${wrap(chars.v)} ${line}${' '.repeat(Math.max(0, pad))}${wrap(chars.v)}`;\n    });\n\n    return [\n        topBorder,\n        ...paddingLines,\n        ...contentLines,\n        ...paddingLines,\n        bottomBorder,\n    ].join('\\n');\n}\n","/**\n * @fileoverview CLI table renderer for CLI primitives\n */\n\nimport type { ITableOptions } from '../types/core.js';\nimport type { ColorCapability } from '../terminal/color-converter.js';\nimport { getANSIForeground, ANSI } from '../terminal/color-converter.js';\nimport { getVisibleLength, padToWidth } from '../terminal/formatter.js';\n\n/**\n * Renders an array of objects as a formatted ASCII table\n * @param rows - Array of row objects\n * @param options - Table rendering options\n * @param colorCap - Terminal color capability\n * @returns Formatted table string\n */\nexport function renderTable(\n    rows: Record<string, unknown>[],\n    options: ITableOptions = {},\n    colorCap: ColorCapability = 'full'\n): string {\n    if (rows.length === 0) return '';\n\n    // Determine columns from options or first row's keys\n    const columns = options.columns ?? Object.keys(rows[0]!);\n    const headers = options.head ?? columns;\n\n    // Calculate column widths (max of header and all values)\n    const colWidths = columns.map((col, i) => {\n        const headerLen = getVisibleLength(headers[i] ?? col);\n        const maxValueLen = rows.reduce((max, row) => {\n            const val = String(row[col] ?? '');\n            return Math.max(max, getVisibleLength(val));\n        }, 0);\n        return Math.max(headerLen, maxValueLen) + 2; // +2 for padding\n    });\n\n    // Color helpers\n    const cyan = colorCap !== 'none' ? getANSIForeground('#00bcd4', colorCap) : '';\n    const dim = colorCap !== 'none' ? ANSI.dim : '';\n    const reset = colorCap !== 'none' ? ANSI.reset : '';\n\n    // Build header row\n    const headerRow = '  ' + columns.map((col, i) => {\n        const label = headers[i] ?? col;\n        return cyan + ANSI.bold + padToWidth(` ${label}`, colWidths[i]!) + reset;\n    }).join('');\n\n    // Build separator\n    const separator = '  ' + dim + colWidths.map(w => '\\u2500'.repeat(w)).join('\\u2500') + reset;\n\n    // Build data rows\n    const dataRows = rows.map(row => {\n        return '  ' + columns.map((col, i) => {\n            const val = String(row[col] ?? '');\n            return padToWidth(` ${val}`, colWidths[i]!);\n        }).join('');\n    });\n\n    return [headerRow, separator, ...dataRows].join('\\n');\n}\n","/**\n * @fileoverview Built-in spinner implementation for CLI primitives\n */\n\nimport type { ISpinnerHandle, LoggerConfig } from '../types/core.js';\nimport type { Logger } from '../Logger.js';\nimport { ANSI } from '../terminal/color-converter.js';\n\n/** Braille-based spinner animation frames */\nconst SPINNER_FRAMES = ['\\u280b', '\\u2819', '\\u2839', '\\u2838', '\\u283c', '\\u2834', '\\u2826', '\\u2827', '\\u2807', '\\u280f'];\n\n/** Spinner frame interval in milliseconds */\nconst FRAME_INTERVAL = 80;\n\n/**\n * Interactive terminal spinner with in-place line updates.\n * Writes to stderr to avoid polluting piped stdout.\n *\n * @implements {ISpinnerHandle}\n */\nexport class SpinnerManager implements ISpinnerHandle {\n    private message: string;\n    private frameIndex = 0;\n    private interval: ReturnType<typeof setInterval> | null = null;\n    private _logger: Logger;\n\n    constructor(message: string, _config: LoggerConfig, logger: Logger) {\n        this.message = message;\n        this._logger = logger;\n    }\n\n    /** Start the spinner animation */\n    start(): void {\n        if (this.interval) return; // Already running\n\n        // Switch logger to buffer mode to prevent garbled output\n        this._logger.updateConfig({ outputMode: 'silent' });\n\n        this.frameIndex = 0;\n        this.render();\n        this.interval = setInterval(() => {\n            this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;\n            this.render();\n        }, FRAME_INTERVAL);\n    }\n\n    /** Stop the spinner without a status message */\n    stop(): void {\n        this.clearInterval();\n        this.clearLine();\n        // Restore logger output\n        this._logger.updateConfig({ outputMode: 'console' });\n    }\n\n    /** Stop with a success indicator */\n    succeed(msg?: string): void {\n        this.clearInterval();\n        this.clearLine();\n        const text = msg ?? this.message;\n        process.stderr.write(`  ${ANSI.fg.green}\\u2713${ANSI.reset} ${text}\\n`);\n        this._logger.updateConfig({ outputMode: 'console' });\n    }\n\n    /** Stop with a failure indicator */\n    fail(msg?: string): void {\n        this.clearInterval();\n        this.clearLine();\n        const text = msg ?? this.message;\n        process.stderr.write(`  ${ANSI.fg.red}\\u2717${ANSI.reset} ${text}\\n`);\n        this._logger.updateConfig({ outputMode: 'console' });\n    }\n\n    /** Update the spinner text while running */\n    text(msg: string): void {\n        this.message = msg;\n    }\n\n    private render(): void {\n        const frame = SPINNER_FRAMES[this.frameIndex] ?? SPINNER_FRAMES[0];\n        const line = `  ${ANSI.fg.cyan}${frame}${ANSI.reset} ${this.message}`;\n        process.stderr.write(`\\r\\x1b[K${line}`);\n    }\n\n    private clearLine(): void {\n        process.stderr.write('\\r\\x1b[K');\n    }\n\n    private clearInterval(): void {\n        if (this.interval) {\n            clearInterval(this.interval);\n            this.interval = null;\n        }\n    }\n}\n\n/**\n * No-op spinner for non-TTY environments or silent mode.\n * Logs start/succeed/fail as plain log messages.\n *\n * @implements {ISpinnerHandle}\n */\nexport class NoopSpinner implements ISpinnerHandle {\n    private message: string;\n    private _logger: Logger;\n\n    constructor(message: string, logger: Logger) {\n        this.message = message;\n        this._logger = logger;\n    }\n\n    start(): void {\n        this._logger.info(this.message);\n    }\n\n    stop(): void {\n        // No-op\n    }\n\n    succeed(msg?: string): void {\n        this._logger.success(msg ?? this.message);\n    }\n\n    fail(msg?: string): void {\n        this._logger.error(msg ?? this.message);\n    }\n\n    text(msg: string): void {\n        this.message = msg;\n    }\n}\n"],"mappings":"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"}