UNPKG

@oxog/termstyle

Version:

A powerful, feature-rich CLI text formatting library with zero dependencies. Supports colors, gradients, animations, progress bars, and more.

1 lines 237 kB
{"version":3,"sources":["../src/core/ansi.ts","../src/utils/terminal.ts","../src/core/validators.ts","../src/core/errors.ts","../src/core/lru-cache-optimized.ts","../src/core/cache-manager.ts","../src/core/color-processor.ts","../src/styles/style.ts","../src/formatter.ts","../src/core/string-builder.ts","../src/effects/gradient.ts","../src/core/resource-manager.ts","../src/core/safe-utils.ts","../src/core/cursor-manager.ts","../src/effects/animation.ts","../src/effects/box.ts","../src/effects/progress.ts","../src/template.ts","../src/themes/theme.ts","../src/conditional.ts","../src/index.ts"],"sourcesContent":["export const ESC = '\\u001B[';\nexport const RESET = ESC + '0m';\n\nexport const ansiCode = (code: number | string): string => ESC + code + 'm';\nexport const ansi = (code: number | string): string => String(code);\n\nexport const ansiCodes = {\n  reset: 0,\n  bold: 1,\n  dim: 2,\n  italic: 3,\n  underline: 4,\n  blink: 5,\n  rapidBlink: 6,\n  inverse: 7,\n  hidden: 8,\n  strikethrough: 9,\n  \n  resetBold: 22,\n  resetDim: 22,\n  resetItalic: 23,\n  resetUnderline: 24,\n  resetBlink: 25,\n  resetInverse: 27,\n  resetHidden: 28,\n  resetStrikethrough: 29,\n  \n  black: 30,\n  red: 31,\n  green: 32,\n  yellow: 33,\n  blue: 34,\n  magenta: 35,\n  cyan: 36,\n  white: 37,\n  defaultColor: 39,\n  \n  bgBlack: 40,\n  bgRed: 41,\n  bgGreen: 42,\n  bgYellow: 43,\n  bgBlue: 44,\n  bgMagenta: 45,\n  bgCyan: 46,\n  bgWhite: 47,\n  bgDefaultColor: 49,\n  \n  brightBlack: 90,\n  brightRed: 91,\n  brightGreen: 92,\n  brightYellow: 93,\n  brightBlue: 94,\n  brightMagenta: 95,\n  brightCyan: 96,\n  brightWhite: 97,\n  \n  bgBrightBlack: 100,\n  bgBrightRed: 101,\n  bgBrightGreen: 102,\n  bgBrightYellow: 103,\n  bgBrightBlue: 104,\n  bgBrightMagenta: 105,\n  bgBrightCyan: 106,\n  bgBrightWhite: 107\n} as const;\n\nexport type AnsiCode = keyof typeof ansiCodes;\n\nexport const rgb = (r: number, g: number, b: number): string => {\n  return `38;2;${r};${g};${b}`;\n};\n\nexport const bgRgb = (r: number, g: number, b: number): string => {\n  return `48;2;${r};${g};${b}`;\n};\n\nexport const ansi256 = (code: number): string => {\n  return `38;5;${code}`;\n};\n\nexport const bgAnsi256 = (code: number): string => {\n  return `48;5;${code}`;\n};\n\nexport const hexToRgb = (hex: string): [number, number, number] => {\n  if (!hex || typeof hex !== 'string') {\n    return [0, 0, 0]; // Default to black for invalid input\n  }\n  let cleanHex = hex.replace('#', '');\n  \n  // Handle 3-character hex codes\n  if (cleanHex.length === 3) {\n    cleanHex = cleanHex.split('').map(char => char + char).join('');\n  }\n  \n  const r = parseInt(cleanHex.slice(0, 2), 16);\n  const g = parseInt(cleanHex.slice(2, 4), 16);\n  const b = parseInt(cleanHex.slice(4, 6), 16);\n  return [r, g, b];\n};\n\nexport const rgbToAnsi256 = (r: number, g: number, b: number): number => {\n  // Check if it's a grayscale value (exact match)\n  if (r === g && g === b) {\n    if (r < 8) return 16;\n    if (r > 238) return 231;\n    // ANSI 256 grayscale: colors 232-255 represent rgb(8,8,8) to rgb(238,238,238)\n    // incrementing by 10 for each level\n    const index = Math.round((r - 8) / 10);\n    return 232 + Math.min(index, 23);\n  }\n  \n  const ansiR = Math.round(r / 51);\n  const ansiG = Math.round(g / 51);\n  const ansiB = Math.round(b / 51);\n  \n  return 16 + (36 * ansiR) + (6 * ansiG) + ansiB;\n};\n\nexport const stripAnsi = (str: string): string => {\n  if (typeof str !== 'string') {\n    return String(str);\n  }\n  \n  // Safe regex patterns to prevent ReDoS attacks\n  // Match ANSI codes including malformed ones with excessive semicolons\n  // eslint-disable-next-line no-control-regex\n  const ansiColorPattern = /\\u001B\\[(?:[0-9;]{0,30})?m/g;\n  // eslint-disable-next-line no-control-regex\n  const ansiControlPattern = /\\u001B\\[(?:[0-9;]{0,30})?[A-Za-z]/g;\n  \n  try {\n    return str\n      .replace(ansiColorPattern, '')\n      .replace(ansiControlPattern, '');\n  } catch {\n    // Fallback: character-by-character processing if regex fails\n    let result = '';\n    let i = 0;\n    while (i < str.length) {\n      if (str[i] === '\\u001B' && str[i + 1] === '[') {\n        // Skip ANSI sequence\n        i += 2;\n        while (i < str.length && (\n          (str[i] >= '0' && str[i] <= '9') || \n          str[i] === ';' || \n          str[i] === 'm' ||\n          (str[i] >= 'A' && str[i] <= 'Z') ||\n          (str[i] >= 'a' && str[i] <= 'z')\n        )) {\n          if (str[i] === 'm' || (str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) {\n            i++;\n            break;\n          }\n          i++;\n        }\n      } else {\n        result += str[i];\n        i++;\n      }\n    }\n    return result;\n  }\n};\n\nexport const cursorUp = (n: number = 1): string => ESC + n + 'A';\nexport const cursorDown = (n: number = 1): string => ESC + n + 'B';\nexport const cursorForward = (n: number = 1): string => ESC + n + 'C';\nexport const cursorBackward = (n: number = 1): string => ESC + n + 'D';\nexport const cursorPosition = (row: number, col: number): string => ESC + row + ';' + col + 'H';\nexport const eraseLine = (): string => ESC + '2K';\nexport const eraseScreen = (): string => ESC + '2J';\nexport const saveCursor = (): string => ESC + 's';\nexport const restoreCursor = (): string => ESC + 'u';\nexport const hideCursor = (): string => ESC + '?25l';\nexport const showCursor = (): string => ESC + '?25h';","import { release } from 'os';\n\nexport interface TerminalInfo {\n  supportsColor: boolean;\n  colorLevel: 0 | 1 | 2 | 3;\n  isTTY: boolean;\n  isCI: boolean;\n  width: number;\n  height: number;\n  columns: number;\n  rows: number;\n}\n\nconst getIsCI = (): boolean => Boolean(\n  process.env.CI ||\n  process.env.CONTINUOUS_INTEGRATION ||\n  process.env.BUILD_NUMBER ||\n  process.env.RUN_ID ||\n  false\n);\n\nconst getColorLevel = (): 0 | 1 | 2 | 3 => {\n  try {\n    // Re-read env each time to ensure we get current values\n    const currentEnv = process.env;\n    \n    if (currentEnv.NO_COLOR || currentEnv.NODE_DISABLE_COLORS) return 0;\n    if (currentEnv.FORCE_COLOR === '0') return 0;\n    if (currentEnv.FORCE_COLOR === '1') return 1;\n    if (currentEnv.FORCE_COLOR === '2') return 2;\n    if (currentEnv.FORCE_COLOR === '3') return 3;\n    \n    if (!process.stdout || !process.stdout.isTTY) return 0;\n    \n    if (process.platform === 'win32') {\n      try {\n        const osRelease = release().split('.');\n        const majorVersion = parseInt(osRelease[0], 10);\n        const buildVersion = parseInt(osRelease[2], 10);\n        \n        if (isNaN(majorVersion) || isNaN(buildVersion)) return 1;\n        \n        if (majorVersion >= 10 && buildVersion >= 10586) {\n          return buildVersion >= 14931 ? 3 : 2;\n        }\n        return 1;\n      } catch {\n        return 1; // Safe fallback for Windows\n      }\n    }\n    \n    if (currentEnv.COLORTERM === 'truecolor' || currentEnv.TERM_PROGRAM === 'iTerm.app') {\n      return 3;\n    }\n    \n    if (currentEnv.TERM?.includes('256color')) return 2;\n    if (currentEnv.TERM?.includes('color')) return 1;\n    \n    return 0;\n  } catch {\n    return 0; // Safe fallback\n  }\n};\n\nexport const getTerminalInfo = (): TerminalInfo => {\n  try {\n    const colorLevel = getColorLevel();\n    const columns = Math.max(1, process.stdout?.columns || 80);\n    const rows = Math.max(1, process.stdout?.rows || 24);\n    \n    return {\n      supportsColor: colorLevel > 0,\n      colorLevel,\n      isTTY: Boolean(process.stdout?.isTTY),\n      isCI: getIsCI(),\n      width: columns,\n      height: rows,\n      columns,\n      rows\n    };\n  } catch {\n    // Safe fallback terminal info\n    return {\n      supportsColor: false,\n      colorLevel: 0,\n      isTTY: false,\n      isCI: false,\n      width: 80,\n      height: 24,\n      columns: 80,\n      rows: 24\n    };\n  }\n};\n\nlet terminalInfo: TerminalInfo | null = null;\nlet terminalInfoTimestamp = 0;\nlet resizeListener: (() => void) | null = null;\n\n// Cache TTL in milliseconds (5 minutes)\nconst TERMINAL_INFO_TTL = 5 * 60 * 1000;\n\nexport const terminal = (): TerminalInfo => {\n  const now = Date.now();\n  \n  // Check if cache is expired or doesn't exist\n  if (!terminalInfo || (now - terminalInfoTimestamp) > TERMINAL_INFO_TTL) {\n    terminalInfo = getTerminalInfo();\n    terminalInfoTimestamp = now;\n  }\n  \n  return terminalInfo;\n};\n\nexport const updateTerminalInfo = (): void => {\n  terminalInfo = getTerminalInfo();\n  terminalInfoTimestamp = Date.now();\n};\n\nexport const cleanup = (): void => {\n  if (resizeListener && typeof process !== 'undefined' && process.stdout && typeof process.stdout.removeListener === 'function') {\n    try {\n      process.stdout.removeListener('resize', resizeListener);\n      resizeListener = null;\n    } catch {\n      // Ignore cleanup errors\n    }\n  }\n  terminalInfo = null;\n};\n\n// Safe event listener registration - prevent duplicate listeners\nif (typeof process !== 'undefined' && process.stdout && typeof process.stdout.on === 'function') {\n  try {\n    // Only register if we haven't already\n    if (!resizeListener) {\n      resizeListener = updateTerminalInfo;\n      process.stdout.on('resize', resizeListener);\n    }\n  } catch {\n    // Ignore event listener registration errors\n  }\n}","/**\n * Input Validation Framework\n * Provides comprehensive validation for all user inputs\n */\n\nimport { ColorInput, RGBTuple } from './color-processor';\n\nexport type ValidatedColor = {\n  type: 'rgb' | 'hex' | 'name' | 'number';\n  value: RGBTuple;\n  original: ColorInput;\n};\n\nexport type AnimationType = 'dots' | 'line' | 'star' | 'flip' | 'grow' | 'balloon' | \n                            'noise' | 'bounce' | 'boxing' | 'arc' | 'circle' | \n                            'square' | 'triangle' | 'arrow' | 'bouncingBar' | \n                            'toggle' | 'smiley' | 'monkey' | 'hearts' | 'clock' | \n                            'earth' | 'moon' | 'weather' | 'christmas' | 'grenade' | \n                            'point' | 'layer' | 'betaWave' | 'aesthetic';\n\nexport type ValidatedPercent = {\n  value: number;\n  clamped: boolean;\n  original: number;\n};\n\nexport type ValidatedTextInput = {\n  text: string;\n  hasControlChars: boolean;\n  hasAnsiCodes: boolean;\n  isEmpty: boolean;\n};\n\nexport type ValidationResult<T> = {\n  valid: boolean;\n  value?: T;\n  error?: string;\n  warnings?: string[];\n};\n\nexport class InputValidator {\n  private static readonly HEX_PATTERN = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n  private static readonly RGB_PATTERN = /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)$/;\n  private static readonly HSL_PATTERN = /^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%(?:,\\s*[\\d.]+)?\\)$/;\n  // eslint-disable-next-line no-control-regex\n  private static readonly ANSI_PATTERN = /\\u001b\\[[0-9;]*m/g;\n  // eslint-disable-next-line no-control-regex\n  private static readonly CONTROL_CHAR_PATTERN = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g;\n\n  /**\n   * Validate color input\n   */\n  static validateColor(input: ColorInput): ValidationResult<ValidatedColor> {\n    if (input == null) {\n      return {\n        valid: false,\n        error: 'Color input cannot be null or undefined'\n      };\n    }\n\n    // RGB tuple validation\n    if (Array.isArray(input)) {\n      const inputArray = input as unknown[];\n      if (inputArray.length !== 3) {\n        return {\n          valid: false,\n          error: `RGB array must have exactly 3 values, got ${inputArray.length}`\n        };\n      }\n\n      const warnings: string[] = [];\n      const validated: [number, number, number] = [0, 0, 0];\n\n      for (let i = 0; i < 3; i++) {\n        const value = inputArray[i];\n        if (typeof value !== 'number') {\n          return {\n            valid: false,\n            error: `RGB value at index ${i} must be a number, got ${typeof value}`\n          };\n        }\n\n        if (!Number.isFinite(value)) {\n          return {\n            valid: false,\n            error: `RGB value at index ${i} must be finite, got ${value}`\n          };\n        }\n\n        // Clamp and warn\n        if (value < 0 || value > 255) {\n          warnings.push(`RGB value ${value} at index ${i} was clamped to 0-255 range`);\n        }\n        validated[i] = Math.max(0, Math.min(255, Math.round(value)));\n      }\n\n      return {\n        valid: true,\n        value: {\n          type: 'rgb',\n          value: validated,\n          original: input\n        },\n        warnings: warnings.length > 0 ? warnings : undefined\n      };\n    }\n\n    // Number validation\n    if (typeof input === 'number') {\n      if (!Number.isFinite(input)) {\n        return {\n          valid: false,\n          error: `Color number must be finite, got ${input}`\n        };\n      }\n\n      const warnings: string[] = [];\n      let value = input;\n\n      if (value < 0 || value > 0xffffff) {\n        warnings.push(`Color number ${value} was clamped to 0x000000-0xFFFFFF range`);\n        value = Math.max(0, Math.min(0xffffff, Math.floor(value)));\n      }\n\n      const r = (value >> 16) & 0xff;\n      const g = (value >> 8) & 0xff;\n      const b = value & 0xff;\n\n      return {\n        valid: true,\n        value: {\n          type: 'number',\n          value: [r, g, b] as RGBTuple,\n          original: input\n        },\n        warnings: warnings.length > 0 ? warnings : undefined\n      };\n    }\n\n    // String validation\n    if (typeof input === 'string') {\n      const trimmed = input.trim();\n      \n      if (trimmed.length === 0) {\n        return {\n          valid: false,\n          error: 'Color string cannot be empty'\n        };\n      }\n\n      // Check hex\n      if (this.HEX_PATTERN.test(trimmed)) {\n        return {\n          valid: true,\n          value: {\n            type: 'hex',\n            value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n            original: input\n          }\n        };\n      }\n\n      // Check rgb()\n      const rgbMatch = trimmed.match(this.RGB_PATTERN);\n      if (rgbMatch) {\n        const r = parseInt(rgbMatch[1], 10);\n        const g = parseInt(rgbMatch[2], 10);\n        const b = parseInt(rgbMatch[3], 10);\n        \n        return this.validateColor([r, g, b]);\n      }\n\n      // Check hsl()\n      if (this.HSL_PATTERN.test(trimmed)) {\n        return {\n          valid: true,\n          value: {\n            type: 'name', // Treat HSL as name for now\n            value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n            original: input\n          }\n        };\n      }\n\n      // Assume color name\n      return {\n        valid: true,\n        value: {\n          type: 'name',\n          value: [0, 0, 0] as RGBTuple, // Will be converted by color processor\n          original: input\n        }\n      };\n    }\n\n    return {\n      valid: false,\n      error: `Invalid color input type: ${typeof input}`\n    };\n  }\n\n  /**\n   * Validate percentage value\n   */\n  static validatePercent(value: number, allowNegative: boolean = false): ValidationResult<ValidatedPercent> {\n    if (typeof value !== 'number') {\n      return {\n        valid: false,\n        error: `Percent must be a number, got ${typeof value}`\n      };\n    }\n\n    if (!Number.isFinite(value)) {\n      return {\n        valid: false,\n        error: `Percent must be finite, got ${value}`\n      };\n    }\n\n    const min = allowNegative ? -1 : 0;\n    const clamped = Math.max(min, Math.min(1, value));\n    const wasClamped = clamped !== value;\n\n    return {\n      valid: true,\n      value: {\n        value: clamped,\n        clamped: wasClamped,\n        original: value\n      },\n      warnings: wasClamped ? [`Percent value ${value} was clamped to ${min}-1 range`] : undefined\n    };\n  }\n\n  /**\n   * Validate animation type\n   */\n  static validateAnimationType(type: string): ValidationResult<AnimationType> {\n    const validTypes: AnimationType[] = [\n      'dots', 'line', 'star', 'flip', 'grow', 'balloon', 'noise', 'bounce',\n      'boxing', 'arc', 'circle', 'square', 'triangle', 'arrow', 'bouncingBar',\n      'toggle', 'smiley', 'monkey', 'hearts', 'clock', 'earth', 'moon',\n      'weather', 'christmas', 'grenade', 'point', 'layer', 'betaWave', 'aesthetic'\n    ];\n\n    if (typeof type !== 'string') {\n      return {\n        valid: false,\n        error: `Animation type must be a string, got ${typeof type}`\n      };\n    }\n\n    const normalized = type.trim().toLowerCase();\n    const found = validTypes.find(t => t.toLowerCase() === normalized);\n\n    if (!found) {\n      return {\n        valid: false,\n        error: `Invalid animation type '${type}'. Valid types: ${validTypes.join(', ')}`\n      };\n    }\n\n    return {\n      valid: true,\n      value: found\n    };\n  }\n\n  /**\n   * Validate text input\n   */\n  static validateText(text: unknown): ValidationResult<ValidatedTextInput> {\n    if (text == null) {\n      return {\n        valid: true,\n        value: {\n          text: '',\n          hasControlChars: false,\n          hasAnsiCodes: false,\n          isEmpty: true\n        }\n      };\n    }\n\n    if (typeof text !== 'string') {\n      // Try to convert to string\n      try {\n        const converted = String(text);\n        return this.validateText(converted);\n      } catch {\n        return {\n          valid: false,\n          error: `Cannot convert ${typeof text} to string`\n        };\n      }\n    }\n\n    const hasControlChars = this.CONTROL_CHAR_PATTERN.test(text);\n    const hasAnsiCodes = this.ANSI_PATTERN.test(text);\n    const isEmpty = text.length === 0;\n\n    const warnings: string[] = [];\n    if (hasControlChars) {\n      warnings.push('Text contains control characters that may affect output');\n    }\n    if (hasAnsiCodes) {\n      warnings.push('Text contains ANSI escape codes that will be preserved');\n    }\n\n    return {\n      valid: true,\n      value: {\n        text,\n        hasControlChars,\n        hasAnsiCodes,\n        isEmpty\n      },\n      warnings: warnings.length > 0 ? warnings : undefined\n    };\n  }\n\n  /**\n   * Validate array of colors\n   */\n  static validateColorArray(colors: unknown[]): ValidationResult<ValidatedColor[]> {\n    if (!Array.isArray(colors)) {\n      return {\n        valid: false,\n        error: 'Colors must be an array'\n      };\n    }\n\n    // Filter out null/undefined values\n    const validColors = colors.filter(c => c != null);\n    \n    if (validColors.length === 0) {\n      return {\n        valid: false,\n        error: 'Color array cannot be empty or contain only null/undefined values'\n      };\n    }\n\n    const results: ValidatedColor[] = [];\n    const errors: string[] = [];\n    const warnings: string[] = [];\n    \n    // Track skipped null/undefined values\n    const skippedCount = colors.length - validColors.length;\n    if (skippedCount > 0) {\n      warnings.push(`Skipped ${skippedCount} null/undefined color(s)`);\n    }\n\n    for (let i = 0; i < validColors.length; i++) {\n      const result = this.validateColor(validColors[i] as ColorInput);\n      \n      if (!result.valid) {\n        errors.push(`Color at index ${i}: ${result.error}`);\n      } else {\n        results.push(result.value!);\n        if (result.warnings) {\n          warnings.push(...result.warnings.map(w => `Color at index ${i}: ${w}`));\n        }\n      }\n    }\n\n    if (errors.length > 0) {\n      return {\n        valid: false,\n        error: errors.join('; ')\n      };\n    }\n\n    return {\n      valid: true,\n      value: results,\n      warnings: warnings.length > 0 ? warnings : undefined\n    };\n  }\n\n  /**\n   * Validate number is positive\n   */\n  static validatePositiveNumber(value: number, name: string): ValidationResult<number> {\n    if (typeof value !== 'number') {\n      return {\n        valid: false,\n        error: `${name} must be a number, got ${typeof value}`\n      };\n    }\n\n    if (!Number.isFinite(value)) {\n      return {\n        valid: false,\n        error: `${name} must be finite, got ${value}`\n      };\n    }\n\n    if (value <= 0) {\n      return {\n        valid: false,\n        error: `${name} must be positive, got ${value}`\n      };\n    }\n\n    return { valid: true, value };\n  }\n\n  /**\n   * Validate integer\n   */\n  static validateInteger(value: number, name: string, min?: number, max?: number): ValidationResult<number> {\n    const numberResult = this.validatePositiveNumber(value, name);\n    if (!numberResult.valid) {\n      return numberResult;\n    }\n\n    if (!Number.isInteger(value)) {\n      return {\n        valid: false,\n        error: `${name} must be an integer, got ${value}`\n      };\n    }\n\n    if (min !== undefined && value < min) {\n      return {\n        valid: false,\n        error: `${name} must be at least ${min}, got ${value}`\n      };\n    }\n\n    if (max !== undefined && value > max) {\n      return {\n        valid: false,\n        error: `${name} must be at most ${max}, got ${value}`\n      };\n    }\n\n    return { valid: true, value };\n  }\n\n  /**\n   * Strip ANSI codes from text\n   */\n  static stripAnsiCodes(text: string): string {\n    return text.replace(this.ANSI_PATTERN, '');\n  }\n\n  /**\n   * Check if text has ANSI codes\n   */\n  static hasAnsiCodes(text: string): boolean {\n    return this.ANSI_PATTERN.test(text);\n  }\n\n  /**\n   * Sanitize text by removing control characters\n   */\n  static sanitizeText(text: string, preserveAnsi: boolean = true): string {\n    let sanitized = text.replace(this.CONTROL_CHAR_PATTERN, '');\n    \n    if (!preserveAnsi) {\n      sanitized = this.stripAnsiCodes(sanitized);\n    }\n    \n    return sanitized;\n  }\n}","/**\n * Custom Error Classes for TermStyle\n * Provides detailed error information with error codes\n */\n\nexport enum ErrorCode {\n  // Input validation errors (1000-1999)\n  INVALID_COLOR_INPUT = 1001,\n  INVALID_PERCENT_VALUE = 1002,\n  INVALID_ANIMATION_TYPE = 1003,\n  INVALID_TEXT_INPUT = 1004,\n  INVALID_NUMBER_INPUT = 1005,\n  INVALID_ARRAY_INPUT = 1006,\n  \n  // Terminal errors (2000-2999)\n  TERMINAL_NOT_SUPPORTED = 2001,\n  TERMINAL_NO_COLOR = 2002,\n  TERMINAL_DETECTION_FAILED = 2003,\n  \n  // Resource errors (3000-3999)\n  RESOURCE_ALREADY_DISPOSED = 3001,\n  RESOURCE_CLEANUP_FAILED = 3002,\n  RESOURCE_NOT_FOUND = 3003,\n  \n  // Animation errors (4000-4999)\n  ANIMATION_ALREADY_STARTED = 4001,\n  ANIMATION_NOT_STARTED = 4002,\n  ANIMATION_FRAME_ERROR = 4003,\n  \n  // Configuration errors (5000-5999)\n  CONFIG_INVALID_OPTION = 5001,\n  CONFIG_MISSING_REQUIRED = 5002,\n  \n  // System errors (9000-9999)\n  INTERNAL_ERROR = 9001,\n  OUT_OF_MEMORY = 9002,\n  OPERATION_TIMEOUT = 9003\n}\n\nexport interface ErrorDetails {\n  code: ErrorCode;\n  message: string;\n  details?: Record<string, unknown>;\n  cause?: Error;\n  suggestions?: string[];\n}\n\n/**\n * Base class for all TermStyle errors\n */\nexport class TermStyleError extends Error {\n  public readonly code: ErrorCode;\n  public readonly details?: Record<string, unknown>;\n  public readonly cause?: Error;\n  public readonly suggestions?: string[];\n  public readonly timestamp: Date;\n\n  constructor(errorDetails: ErrorDetails) {\n    super(errorDetails.message);\n    this.name = this.constructor.name;\n    this.code = errorDetails.code;\n    this.details = errorDetails.details;\n    this.cause = errorDetails.cause;\n    this.suggestions = errorDetails.suggestions;\n    this.timestamp = new Date();\n\n    // Maintain proper stack trace\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, this.constructor);\n    }\n\n    // Include cause in stack trace if available\n    if (this.cause && this.cause.stack) {\n      this.stack = `${this.stack}\\nCaused by: ${this.cause.stack}`;\n    }\n  }\n\n  /**\n   * Get a formatted error message with all details\n   */\n  getFullMessage(): string {\n    let message = `[${this.code}] ${this.message}`;\n    \n    if (this.details && Object.keys(this.details).length > 0) {\n      message += `\\nDetails: ${JSON.stringify(this.details, null, 2)}`;\n    }\n    \n    if (this.suggestions && this.suggestions.length > 0) {\n      message += `\\nSuggestions:\\n${this.suggestions.map(s => `  - ${s}`).join('\\n')}`;\n    }\n    \n    return message;\n  }\n\n  /**\n   * Convert error to JSON\n   */\n  toJSON(): Record<string, unknown> {\n    return {\n      name: this.name,\n      code: this.code,\n      message: this.message,\n      details: this.details,\n      suggestions: this.suggestions,\n      timestamp: this.timestamp.toISOString(),\n      stack: this.stack\n    };\n  }\n}\n\n/**\n * Input validation error\n */\nexport class ValidationError extends TermStyleError {\n  constructor(message: string, code: ErrorCode, details?: Record<string, unknown>) {\n    super({\n      code,\n      message,\n      details,\n      suggestions: [\n        'Check the input format and type',\n        'Refer to the documentation for valid input values',\n        'Use the validation methods before passing values'\n      ]\n    });\n  }\n}\n\n/**\n * Terminal compatibility error\n */\nexport class TerminalError extends TermStyleError {\n  constructor(message: string, code: ErrorCode = ErrorCode.TERMINAL_NOT_SUPPORTED) {\n    const suggestions = [];\n    \n    if (code === ErrorCode.TERMINAL_NO_COLOR) {\n      suggestions.push(\n        'Set FORCE_COLOR=1 environment variable to force color output',\n        'Use a terminal that supports colors',\n        'Check if NO_COLOR environment variable is set'\n      );\n    } else {\n      suggestions.push(\n        'Try using a different terminal emulator',\n        'Update your terminal to the latest version',\n        'Check terminal compatibility in the documentation'\n      );\n    }\n\n    super({\n      code,\n      message,\n      suggestions\n    });\n  }\n}\n\n/**\n * Resource management error\n */\nexport class ResourceError extends TermStyleError {\n  constructor(message: string, code: ErrorCode = ErrorCode.RESOURCE_CLEANUP_FAILED, cause?: Error) {\n    super({\n      code,\n      message,\n      cause,\n      suggestions: [\n        'Ensure resources are disposed in the correct order',\n        'Check for circular dependencies in resources',\n        'Use try-finally blocks for resource cleanup'\n      ]\n    });\n  }\n}\n\n/**\n * Animation error\n */\nexport class AnimationError extends TermStyleError {\n  constructor(message: string, code: ErrorCode = ErrorCode.ANIMATION_FRAME_ERROR, details?: Record<string, unknown>) {\n    super({\n      code,\n      message,\n      details,\n      suggestions: [\n        'Check if the animation is already running',\n        'Ensure the animation type is valid',\n        'Verify terminal supports cursor manipulation'\n      ]\n    });\n  }\n}\n\n/**\n * Configuration error\n */\nexport class ConfigurationError extends TermStyleError {\n  constructor(message: string, code: ErrorCode = ErrorCode.CONFIG_INVALID_OPTION, details?: Record<string, unknown>) {\n    super({\n      code,\n      message,\n      details,\n      suggestions: [\n        'Review the configuration options',\n        'Check for typos in option names',\n        'Ensure all required options are provided'\n      ]\n    });\n  }\n}\n\n/**\n * Error recovery strategies\n */\nexport class ErrorRecovery {\n  /**\n   * Attempt to recover from an error with a fallback\n   */\n  static recover<T>(\n    operation: () => T,\n    fallback: T | (() => T),\n    logError: boolean = false\n  ): T {\n    try {\n      return operation();\n    } catch (error) {\n      if (logError && process.env.DEBUG) {\n        console.error('[TermStyle] Error recovered:', error);\n      }\n      return typeof fallback === 'function' ? (fallback as () => T)() : fallback;\n    }\n  }\n\n  /**\n   * Retry an operation with exponential backoff\n   */\n  static async retry<T>(\n    operation: () => Promise<T>,\n    maxAttempts: number = 3,\n    initialDelay: number = 100\n  ): Promise<T> {\n    let lastError: Error | undefined;\n    \n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      try {\n        return await operation();\n      } catch (error) {\n        lastError = error as Error;\n        \n        if (attempt < maxAttempts - 1) {\n          const delay = initialDelay * Math.pow(2, attempt);\n          await new Promise(resolve => setTimeout(resolve, delay));\n        }\n      }\n    }\n    \n    throw new TermStyleError({\n      code: ErrorCode.OPERATION_TIMEOUT,\n      message: `Operation failed after ${maxAttempts} attempts`,\n      cause: lastError,\n      details: { maxAttempts, initialDelay }\n    });\n  }\n\n  /**\n   * Wrap a function with error boundary\n   */\n  static withErrorBoundary<T extends (...args: any[]) => any>(\n    fn: T,\n    errorHandler: (error: Error) => ReturnType<T> | void\n  ): T {\n    return ((...args: Parameters<T>) => {\n      try {\n        return fn(...args);\n      } catch (error) {\n        const result = errorHandler(error as Error);\n        if (result !== undefined) {\n          return result;\n        }\n        throw error;\n      }\n    }) as T;\n  }\n\n  /**\n   * Create a safe version of a function that never throws\n   */\n  static makeSafe<T extends (...args: any[]) => any>(\n    fn: T,\n    defaultValue: ReturnType<T>\n  ): T {\n    return ((...args: Parameters<T>) => {\n      try {\n        return fn(...args);\n      } catch {\n        return defaultValue;\n      }\n    }) as T;\n  }\n}\n\n/**\n * Error context for better debugging\n */\nexport class ErrorContext {\n  private static context: Map<string, unknown> = new Map();\n\n  /**\n   * Add context that will be included in errors\n   */\n  static add(key: string, value: unknown): void {\n    this.context.set(key, value);\n  }\n\n  /**\n   * Remove context\n   */\n  static remove(key: string): void {\n    this.context.delete(key);\n  }\n\n  /**\n   * Get all context\n   */\n  static getAll(): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n    for (const [key, value] of this.context) {\n      result[key] = value;\n    }\n    return result;\n  }\n\n  /**\n   * Clear all context\n   */\n  static clear(): void {\n    this.context.clear();\n  }\n\n  /**\n   * Run a function with temporary context\n   */\n  static withContext<T>(\n    context: Record<string, unknown>,\n    fn: () => T\n  ): T {\n    const keys = Object.keys(context);\n    \n    // Add temporary context\n    for (const key of keys) {\n      this.add(key, context[key]);\n    }\n    \n    try {\n      return fn();\n    } finally {\n      // Remove temporary context\n      for (const key of keys) {\n        this.remove(key);\n      }\n    }\n  }\n}","/**\n * Optimized LRU Cache implementation using Map for O(1) operations\n */\n\nexport class LRUCacheOptimized<K, V> {\n  private cache = new Map<K, V>();\n  private readonly capacity: number;\n\n  constructor(capacity: number) {\n    if (capacity <= 0) {\n      throw new Error('Cache capacity must be positive');\n    }\n    this.capacity = capacity;\n  }\n\n  get(key: K): V | undefined {\n    if (!this.cache.has(key)) {\n      return undefined;\n    }\n    \n    // Move to end (most recently used)\n    const value = this.cache.get(key)!;\n    this.cache.delete(key);\n    this.cache.set(key, value);\n    return value;\n  }\n\n  set(key: K, value: V): void {\n    // If key exists, delete it first to update position\n    if (this.cache.has(key)) {\n      this.cache.delete(key);\n    } else if (this.cache.size >= this.capacity) {\n      // Remove least recently used (first item)\n      const firstKey = this.cache.keys().next().value;\n      if (firstKey !== undefined) {\n        this.cache.delete(firstKey);\n      }\n    }\n    \n    // Add to end (most recently used)\n    this.cache.set(key, value);\n  }\n\n  has(key: K): boolean {\n    return this.cache.has(key);\n  }\n\n  delete(key: K): boolean {\n    return this.cache.delete(key);\n  }\n\n  clear(): void {\n    this.cache.clear();\n  }\n\n  get size(): number {\n    return this.cache.size;\n  }\n\n  getSize(): number {\n    return this.cache.size;\n  }\n\n  keys(): K[] {\n    return Array.from(this.cache.keys());\n  }\n\n  values(): V[] {\n    return Array.from(this.cache.values());\n  }\n\n  entries(): Array<[K, V]> {\n    return Array.from(this.cache.entries());\n  }\n\n  forEach(callback: (value: V, key: K, map: Map<K, V>) => void): void {\n    this.cache.forEach(callback);\n  }\n}\n\n/**\n * Create a memoized version of a function with optimized LRU caching\n */\nexport function memoizeOptimized<Args extends unknown[], Return>(\n  fn: (...args: Args) => Return,\n  options: {\n    capacity?: number;\n    keyGenerator?: (...args: Args) => string;\n  } = {}\n): (...args: Args) => Return {\n  const cache = new LRUCacheOptimized<string, Return>(options.capacity || 100);\n  const keyGen = options.keyGenerator || ((...args) => JSON.stringify(args));\n\n  return (...args: Args): Return => {\n    const key = keyGen(...args);\n    \n    const cached = cache.get(key);\n    if (cached !== undefined) {\n      return cached;\n    }\n\n    const result = fn(...args);\n    cache.set(key, result);\n    return result;\n  };\n}","/**\n * Cache Manager for Performance Optimization\n * Provides centralized caching for expensive operations\n */\n\nimport { LRUCacheOptimized } from './lru-cache-optimized';\nimport { RGBTuple } from './color-processor';\nimport { Style } from '../styles/style';\n\nexport interface CacheStats {\n  hits: number;\n  misses: number;\n  size: number;\n  maxSize: number;\n}\n\nexport class CacheManager {\n  private static instance: CacheManager;\n  \n  // Color conversion caches\n  private colorCache: LRUCacheOptimized<string, RGBTuple>;\n  private hexCache: LRUCacheOptimized<string, RGBTuple>;\n  private hslCache: LRUCacheOptimized<string, RGBTuple>;\n  \n  // Gradient cache\n  private gradientCache: LRUCacheOptimized<string, string>;\n  \n  // Style cache (for commonly used styles)\n  private styleCache: Map<string, Style>;\n  \n  // Cache statistics\n  private stats = {\n    color: { hits: 0, misses: 0 },\n    gradient: { hits: 0, misses: 0 },\n    style: { hits: 0, misses: 0 }\n  };\n  \n  private constructor() {\n    // Initialize caches with reasonable sizes\n    this.colorCache = new LRUCacheOptimized<string, RGBTuple>(1000);\n    this.hexCache = new LRUCacheOptimized<string, RGBTuple>(500);\n    this.hslCache = new LRUCacheOptimized<string, RGBTuple>(500);\n    this.gradientCache = new LRUCacheOptimized<string, string>(100);\n    this.styleCache = new Map<string, Style>();\n  }\n  \n  static getInstance(): CacheManager {\n    if (!this.instance) {\n      this.instance = new CacheManager();\n    }\n    return this.instance;\n  }\n  \n  // Color caching methods\n  getColor(key: string): RGBTuple | undefined {\n    const cached = this.colorCache.get(key);\n    if (cached) {\n      this.stats.color.hits++;\n      return cached;\n    }\n    this.stats.color.misses++;\n    return undefined;\n  }\n  \n  setColor(key: string, value: RGBTuple): void {\n    this.colorCache.set(key, value);\n  }\n  \n  getHexColor(hex: string): RGBTuple | undefined {\n    const cached = this.hexCache.get(hex);\n    if (cached) {\n      this.stats.color.hits++;\n      return cached;\n    }\n    this.stats.color.misses++;\n    return undefined;\n  }\n  \n  setHexColor(hex: string, value: RGBTuple): void {\n    this.hexCache.set(hex, value);\n  }\n  \n  getHslColor(key: string): RGBTuple | undefined {\n    const cached = this.hslCache.get(key);\n    if (cached) {\n      this.stats.color.hits++;\n      return cached;\n    }\n    this.stats.color.misses++;\n    return undefined;\n  }\n  \n  setHslColor(key: string, value: RGBTuple): void {\n    this.hslCache.set(key, value);\n  }\n  \n  // Gradient caching\n  getGradient(key: string): string | undefined {\n    const cached = this.gradientCache.get(key);\n    if (cached) {\n      this.stats.gradient.hits++;\n      return cached;\n    }\n    this.stats.gradient.misses++;\n    return undefined;\n  }\n  \n  setGradient(key: string, value: string): void {\n    this.gradientCache.set(key, value);\n  }\n  \n  // Style caching for common styles\n  getStyle(key: string): Style | undefined {\n    const cached = this.styleCache.get(key);\n    if (cached) {\n      this.stats.style.hits++;\n      return cached;\n    }\n    this.stats.style.misses++;\n    return undefined;\n  }\n  \n  setStyle(key: string, value: Style): void {\n    // Limit style cache size to prevent memory issues\n    if (this.styleCache.size >= 100) {\n      const firstKey = this.styleCache.keys().next().value;\n      if (firstKey) {\n        this.styleCache.delete(firstKey);\n      }\n    }\n    this.styleCache.set(key, value);\n  }\n  \n  // Cache management\n  clear(): void {\n    this.colorCache.clear();\n    this.hexCache.clear();\n    this.hslCache.clear();\n    this.gradientCache.clear();\n    this.styleCache.clear();\n    this.resetStats();\n  }\n  \n  clearColors(): void {\n    this.colorCache.clear();\n    this.hexCache.clear();\n    this.hslCache.clear();\n  }\n  \n  clearGradients(): void {\n    this.gradientCache.clear();\n  }\n  \n  clearStyles(): void {\n    this.styleCache.clear();\n  }\n  \n  // Statistics\n  getStats(): Record<string, CacheStats> {\n    return {\n      color: {\n        hits: this.stats.color.hits,\n        misses: this.stats.color.misses,\n        size: this.colorCache.getSize() + this.hexCache.getSize() + this.hslCache.getSize(),\n        maxSize: 2000\n      },\n      gradient: {\n        hits: this.stats.gradient.hits,\n        misses: this.stats.gradient.misses,\n        size: this.gradientCache.getSize(),\n        maxSize: 100\n      },\n      style: {\n        hits: this.stats.style.hits,\n        misses: this.stats.style.misses,\n        size: this.styleCache.size,\n        maxSize: 100\n      }\n    };\n  }\n  \n  resetStats(): void {\n    this.stats = {\n      color: { hits: 0, misses: 0 },\n      gradient: { hits: 0, misses: 0 },\n      style: { hits: 0, misses: 0 }\n    };\n  }\n  \n  // Hit rate calculation\n  getHitRate(type: 'color' | 'gradient' | 'style'): number {\n    const stats = this.stats[type];\n    const total = stats.hits + stats.misses;\n    return total > 0 ? (stats.hits / total) * 100 : 0;\n  }\n}\n\n// Export singleton instance\nexport const cacheManager = CacheManager.getInstance();","/**\n * Color Processing with Performance Optimization\n * Implements caching and efficient color conversion algorithms\n */\n\nimport { hexToRgb } from './ansi';\nimport { cacheManager } from './cache-manager';\n\nexport type ColorInput = string | [number, number, number] | number;\nexport type RGBTuple = readonly [number, number, number];\n\n// Enhanced color name mapping\nconst colorNames: Record<string, string> = {\n  // Basic colors\n  red: '#ff0000',\n  green: '#00ff00',\n  blue: '#0000ff',\n  yellow: '#ffff00',\n  magenta: '#ff00ff',\n  cyan: '#00ffff',\n  white: '#ffffff',\n  black: '#000000',\n  gray: '#808080',\n  grey: '#808080',\n  \n  // Extended colors\n  orange: '#ffa500',\n  purple: '#800080',\n  pink: '#ffc0cb',\n  brown: '#a52a2a',\n  violet: '#ee82ee',\n  indigo: '#4b0082',\n  lime: '#00ff00',\n  olive: '#808000',\n  navy: '#000080',\n  teal: '#008080',\n  silver: '#c0c0c0',\n  maroon: '#800000',\n  fuchsia: '#ff00ff',\n  aqua: '#00ffff',\n  \n  // Web colors\n  aliceblue: '#f0f8ff',\n  antiquewhite: '#faebd7',\n  aquamarine: '#7fffd4',\n  azure: '#f0ffff',\n  beige: '#f5f5dc',\n  bisque: '#ffe4c4',\n  blanchedalmond: '#ffebcd',\n  blueviolet: '#8a2be2',\n  burlywood: '#deb887',\n  cadetblue: '#5f9ea0',\n  chartreuse: '#7fff00',\n  chocolate: '#d2691e',\n  coral: '#ff7f50',\n  cornflowerblue: '#6495ed',\n  cornsilk: '#fff8dc',\n  crimson: '#dc143c',\n  darkblue: '#00008b',\n  darkcyan: '#008b8b',\n  darkgoldenrod: '#b8860b',\n  darkgray: '#a9a9a9',\n  darkgreen: '#006400',\n  darkgrey: '#a9a9a9',\n  darkkhaki: '#bdb76b',\n  darkmagenta: '#8b008b',\n  darkolivegreen: '#556b2f',\n  darkorange: '#ff8c00',\n  darkorchid: '#9932cc',\n  darkred: '#8b0000',\n  darksalmon: '#e9967a',\n  darkseagreen: '#8fbc8f',\n  darkslateblue: '#483d8b',\n  darkslategray: '#2f4f4f',\n  darkslategrey: '#2f4f4f',\n  darkturquoise: '#00ced1',\n  darkviolet: '#9400d3',\n  deeppink: '#ff1493',\n  deepskyblue: '#00bfff',\n  dimgray: '#696969',\n  dimgrey: '#696969',\n  dodgerblue: '#1e90ff',\n  firebrick: '#b22222',\n  floralwhite: '#fffaf0',\n  forestgreen: '#228b22',\n  gainsboro: '#dcdcdc',\n  ghostwhite: '#f8f8ff',\n  gold: '#ffd700',\n  goldenrod: '#daa520',\n  greenyellow: '#adff2f',\n  honeydew: '#f0fff0',\n  hotpink: '#ff69b4',\n  indianred: '#cd5c5c',\n  ivory: '#fffff0',\n  khaki: '#f0e68c',\n  lavender: '#e6e6fa',\n  lavenderblush: '#fff0f5',\n  lawngreen: '#7cfc00',\n  lemonchiffon: '#fffacd',\n  lightblue: '#add8e6',\n  lightcoral: '#f08080',\n  lightcyan: '#e0ffff',\n  lightgoldenrodyellow: '#fafad2',\n  lightgray: '#d3d3d3',\n  lightgreen: '#90ee90',\n  lightgrey: '#d3d3d3',\n  lightpink: '#ffb6c1',\n  lightsalmon: '#ffa07a',\n  lightseagreen: '#20b2aa',\n  lightskyblue: '#87cefa',\n  lightslategray: '#778899',\n  lightslategrey: '#778899',\n  lightsteelblue: '#b0c4de',\n  lightyellow: '#ffffe0',\n  limegreen: '#32cd32',\n  linen: '#faf0e6',\n  mediumaquamarine: '#66cdaa',\n  mediumblue: '#0000cd',\n  mediumorchid: '#ba55d3',\n  mediumpurple: '#9370db',\n  mediumseagreen: '#3cb371',\n  mediumslateblue: '#7b68ee',\n  mediumspringgreen: '#00fa9a',\n  mediumturquoise: '#48d1cc',\n  mediumvioletred: '#c71585',\n  midnightblue: '#191970',\n  mintcream: '#f5fffa',\n  mistyrose: '#ffe4e1',\n  moccasin: '#ffe4b5',\n  navajowhite: '#ffdead',\n  oldlace: '#fdf5e6',\n  olivedrab: '#6b8e23',\n  orangered: '#ff4500',\n  orchid: '#da70d6',\n  palegoldenrod: '#eee8aa',\n  palegreen: '#98fb98',\n  paleturquoise: '#afeeee',\n  palevioletred: '#db7093',\n  papayawhip: '#ffefd5',\n  peachpuff: '#ffdab9',\n  peru: '#cd853f',\n  plum: '#dda0dd',\n  powderblue: '#b0e0e6',\n  rosybrown: '#bc8f8f',\n  royalblue: '#4169e1',\n  saddlebrown: '#8b4513',\n  salmon: '#fa8072',\n  sandybrown: '#f4a460',\n  seagreen: '#2e8b57',\n  seashell: '#fff5ee',\n  sienna: '#a0522d',\n  skyblue: '#87ceeb',\n  slateblue: '#6a5acd',\n  slategray: '#708090',\n  slategrey: '#708090',\n  snow: '#fffafa',\n  springgreen: '#00ff7f',\n  steelblue: '#4682b4',\n  tan: '#d2b48c',\n  thistle: '#d8bfd8',\n  tomato: '#ff6347',\n  turquoise: '#40e0d0',\n  wheat: '#f5deb3',\n  whitesmoke: '#f5f5f5',\n  yellowgreen: '#9acd32'\n};\n\nexport class ColorProcessor {\n  /**\n   * Process any color input into RGB tuple with caching\n   */\n  static processColor(input: ColorInput): RGBTuple {\n    const key = this.getCacheKey(input);\n    \n    // Check cache first\n    const cached = cacheManager.getColor(key);\n    if (cached) {\n      return cached;\n    }\n    \n    const result = this.convertColor(input);\n    cacheManager.setColor(key, result);\n    return result;\n  }\n\n  /**\n   * Convert HSL to RGB with caching\n   */\n  static hslToRgb(h: number, s: number, l: number): RGBTuple {\n    const key = `hsl(${h},${s},${l})`;\n    \n    const cached = cacheManager.getHslColor(key);\n    if (cached) {\n      return cached;\n    }\n\n    const result = this.computeHslToRgb(h, s, l);\n    cacheManager.setHslColor(key, result);\n    return result;\n  }\n\n  /**\n   * Convert RGB to 256-color index without caching (caching handled at higher level)\n   */\n  static rgbTo256(r: number, g: number, b: number): number {\n    return this.computeRgbTo256(r, g, b);\n  }\n\n  /**\n   * Get color name suggestions for auto-completion\n   */\n  static getColorNames(): string[] {\n    return Object.keys(colorNames);\n  }\n\n  /**\n   * Check if a string is a valid color name\n   */\n  static isValidColorName(name: string): boolean {\n    return name.toLowerCase() in colorNames;\n  }\n\n  /**\n   * Check if a string is a valid hex color\n   */\n  static isValidHex(hex: string): boolean {\n    return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex);\n  }\n\n  /**\n   * Clear all caches (useful for testing or memory management)\n   */\n  static clearCaches(): void {\n    cacheManager.clearColors();\n  }\n\n  /**\n   * Get cache statistics\n   */\n  static getCacheStats() {\n    return cacheManager.getStats();\n  }\n\n  private static getCacheKey(input: ColorInput): string {\n    if (Array.isArray(input)) {\n      return `rgb(${input[0]},${input[1]},${input[2]})`;\n    }\n    if (typeof input === 'number') {\n      return `num(${input})`;\n    }\n    return `str(${input})`;\n  }\n\n  private static convertColor(input: ColorInput): RGBTuple {\n    if (Array.isArray(input)) {\n      // Validate and clamp RGB values\n      return [\n        Math.max(0, Math.min(255, Math.round(input[0]))),\n        Math.max(0, Math.min(255, Math.round(input[1]))),\n        Math.max(0, Math.min(255, Math.round(input[2])))\n      ] as RGBTuple;\n    }\n\n    if (typeof input === 'number') {\n      // Convert number to RGB (assuming 24-bit color)\n      const num = Math.max(0, Math.min(0xffffff, Math.floor(input)));\n      return [\n        (num >> 16) & 0xff,\n        (num >> 8) & 0xff,\n        num & 0xff\n      ] as RGBTuple;\n    }\n\n    if (typeof input === 'string') {\n      const trimmed = input.trim().toLowerCase();\n      \n      // Check if it's a color name\n      if (trimmed in colorNames) {\n        return hexToRgb(colorNames[trimmed]) as RGBTuple;\n      }\n      \n      // Check if it's a hex color\n      if (this.isValidHex(input)) {\n        return hexToRgb(input) as RGBTuple;\n      }\n      \n      // Handle rgb() and rgba() functions\n      const rgbMatch = trimmed.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)$/);\n      if (rgbMatch) {\n        return [\n          Math.max(0, Math.min(255, parseInt(rgbMatch[1], 10))),\n          Math.max(0, Math.min(255, parseInt(rgbMatch[2], 10))),\n          Math.max(0, Math.min(255, parseInt(rgbMatch[3], 10)))\n        ] as RGBTuple;\n      }\n\n      // Handle hsl() and hsla() functions\n      const hslMatch = trimmed.match(/^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%(?:,\\s*[\\d.]+)?\\)$/);\n      if (hslMatch) {\n        return this.hslToRgb(\n          parseInt(hslMatch[1], 10),\n          parseInt(hslMatch[2], 10),\n          parseInt(hslMatch[3], 10)\n        );\n      }\n    }\n\n    // Fallback to white for invalid input\n    return [255, 255, 255] as RGBTuple;\n  }\n\n  private static computeHslToRgb(h: number, s: number, l: number): RGBTuple {\n    // Normalize inputs\n    h = ((h % 360) + 360) % 360; // Ensure h is 0-359\n    s = Math.max(0, Math.min(100, s)) / 100; // Convert to 0-1\n    l = Math.max(0, Math.min(100, l)) / 100; // Convert to 0-1\n\n    const c = (1 - Math.abs(2 * l - 1)) * s;\n    const x = c * (1 - Math.abs((h / 60) % 2 - 1));\n    const m = l - c / 2;\n\n    let r: number, g: number, b: number;\n\n    if (h < 60) {\n      [r, g, b] = [c, x, 0];\n    } else if (h < 120) {\n      [r, g, b] = [x, c, 0];\n    } else if (h < 180) {\n      [r, g, b] = [0, c, x];\n    } else if (h < 240) {\n      [r, g, b] = [0, x, c];\n    } else if (h < 300) {\n      [r, g, b] = [x, 0, c];\n    } else {\n      [r, g, b] = [c, 0, x];\n    }\n\n    return [\n      Math.round((r + m) * 255),\n      Math.round((g + m) * 255),\n      Math.round((b + m) * 255)\n    ] as RGBTuple;\n  }\n\n  private static computeRgbTo256(r: number, g: number, b: number): number {\n    // Clamp values\n    r = Math.max(0, Math.min(255, Math.round(r)));\n    g = Math.max(0, Math.min(255, Math.round(g)));\n    b = Math.max(0, Math.min(255, Math.round(b)));\n\n    // Check if it's a grayscale color\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    // Convert to 6x6x6 color cube\n    const rIndex = Math.round((r / 255) * 5);\n    const gIndex = Math.round((g / 255) * 5);\n    const bIndex = Math.round((b / 255) * 5);\n\n    return 16 + (36 * rIndex) + (6 * gIndex) + bIndex;\n  }\n}","import { ansiCode, ansiCodes, rgb, bgRgb, ansi256, bgAnsi256, rgbToAnsi256 } from '../core/ansi';\nimport { terminal } from '../utils/terminal';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ErrorCode } from '../core/errors';\nimport { ColorProcessor } from '../core/color-processor';\n\nexport type ColorInput = string | number | [number, number, number];\n\nexport interface StyleOptions {\n  force?: boolean;\n  level?: 0 | 1 | 2 | 3;\n}\n\nexport class Style {\n  private codes: string[] = [];\n  private resetCodes: string[] = [];\n  private options: StyleOptions;\n\n  constructor(codes: string[] = [], resetCodes: string[] = [], options: StyleOptions = {}) {\n    this.codes = codes;\n    this.resetCodes = resetCodes;\n    this.options = options;\n  }\n\n  private shouldApplyStyle(): boolean {\n    if (this.options.force) return true;\n    const level = this.options.level ?? terminal().colorLevel;\n    return level > 0;\n  }\n\n  private addStyle(code: string, resetCode: string): Style {\n    if (typeof code !== 'string' || typeof resetCode !== 'string') {\n      return this; // Invalid input, return unchanged\n    }\n    \n    // Check if this is a color code that should override previous colors\n    const newCodes = [...this.codes];\n    const newResetCodes = [...this.resetCodes];\n    \n    try {\n      // Safely parse the code number\n      const codeNum = parseInt(code.split(';')[0], 10);\n      if (isNaN(codeNum)) {\n        // Invalid code, just add it without conflict resolution\n        return new Style(\n          [...newCodes, code],\n          [resetCode, ...newResetCodes],\n          this.options\n        );\n      }\n      \n      const isForegroundColor = (codeNum >= 30 && codeNum <= 37) || (codeNum >= 90 && codeNum <= 97) || code.startsWith('38;');\n      const isBackgroundColor = (codeNum >= 40 && codeNum <= 47) || (codeNum >= 100 && codeNum <= 107) || code.startsWith('48;');\n      \n      if (isForegroundColor) {\n        // Remove previous foreground colors\n        const indicesToRemove: number[] = [];\n        for (let i = newCodes.length - 1; i >= 0; i--) {\n          const existingCode = newCodes[i];\n          const existingCodeNum = parseInt(existingCode.split(';')[0], 10);\n          if (!isNaN(existingCodeNum)) {\n            const isExistingFgColor = (existingCodeNum >= 30 && existingCodeNum <= 37) || \n                                      (existingCodeNum >= 90 && existingCodeNum <= 97) || \n                                      existingCode.startsWith('38;');\n            if (isExistingFgColor) {\n              indicesToRemove.push(i);\n            }\n          }\n        }\n        \n        // Remove in reverse order to maintain indices\n        for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n          const index = indicesToRemove[i];\n          if (index >= 0 && index < newCodes.length) {\n            newCodes.splice(index, 1);\n            // Calculate reset index safely with proper bounds checking\n            const resetIndex = Math.min(newResetCodes.length - 1, Math.max(0, newResetCodes.length - 1 - i));\n            if (resetIndex >= 0 && resetIndex < newResetCodes.length) {\n              newResetCodes.splice(resetIndex, 1);\n            }\n          }\n        }\n      }\n      \n      if (isBackgroundColor) {\n        // Remove previous background colors\n        const indicesToRemove: number[] = [];\n        for (let i = newCodes.length - 1; i >= 0; i--) {\n          const existingCode = newCodes[i];\n          const existingCodeNum = parseInt(existingCode.split(';')[0], 10);\n          if (!isNaN(existingCodeNum)) {\n            const isExistingBgColor = (existingCodeNum >= 40 && existingCodeNum <= 47) || \n                                      (existingCodeNum >= 100 && existingCodeNum <= 107) || \n                                      existingCode.startsWith('48;');\n            if (isExistingBgColor) {\n              indicesToRemove.push(i);\n            }\n          }\n        }\n        \n        // Remove in reverse order to maintain indices\n        for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n          const index = indicesToRemove[i];\n          if (index >= 0 && index < newCodes.length) {\n            newCodes.splice(index, 1);\n            // Calculate reset index safely with proper bounds checking\n            const resetIndex = Math.min(newResetCodes.length - 1, Math.max(0, newResetCodes.length - 1 - i));\n            if (resetIndex >= 0 && resetIndex < newResetCodes.length) {\n              newResetCodes.splice(resetIndex, 1);\n            }\n          }\n        }\n      }\n      \n      return new Style(\n        [...newCodes, code],\n        [resetCode, ...newResetCodes],\n        this.options\n      );\n    } catch {\n      // If anything fails, safely add the style without conflict resolution\n      return new Style(\n        [...newCodes, code],\n        [resetCode, ...newResetCodes],\n        this.options\n      );\n    }\n  }\n\n  apply(text: string): string {\n    // Validate text input\n    const validation = InputValidator.validateText(text);\n    if (!validation.valid) {\n      return '';\n    }\n    \n    const validatedText = validation.value!.text;\n    \n    if (!this.shouldApplyStyle() || this.codes.length === 0) {\n      return validatedText;\n    }\n\n    const openCodes = this.codes.map(code => ansiCode(code)).join('');\n    const closeCodes = this.resetCodes.map(code => ansiCode(code)).join('');\n    \n    return openCodes + validatedText + closeCodes;\n  }\n\n  get bold(): Style {\n    return this.addStyle(String(ansiCodes.bold), String(ansiCodes.resetBold));\n  }\n\n  get dim(): Style {\n    return this.addStyle(String(ansiCodes.dim), String(ansiCodes.resetDim));\n  }\n\n  get italic(): Style {\n    return this.addStyle(String(ansiCodes.italic), String(ansiCodes.resetItalic));\n  }\n\n  get underline(): Style {\n    return this.addStyle(String(ansiCodes.underline), String(ansiCodes.resetUnderline));\n  }\n\n  get inverse(): Style {\n    return this.addStyle(String(ansiCodes.inverse), String(ansiCodes.resetInverse));\n  }\n\n  get hidden(): Style {\n    return this.addStyle(String(ansiCodes.hidden), String(ansiCodes.resetHidden));\n  }\n\n  get strikethrough(): Style {\n    return this.addStyle(String(ansiCodes.strikethrough), String(ansiCodes.resetStrikethrough));\n  }\n\n  get black(): Style {\n    return this.addStyle(String(ansiCodes.black), String(ansiCodes.defaultColor));\n  }\n\n  get red(): Style {\n    return this.addStyle(String(ansiCodes.red), String(ansiCodes.defaultColor));\n  }\n\n  get green(): Style {\n    return this.addStyle(String(ansiCodes.green), String(ansiCodes.defaultColor));\n  }\n\n  get yellow(): Style {\n    return this.addStyle(String(ansiCodes.yellow), String(ansiCodes.defaultColor));\n  }\n\n  get blue(): Style {\n    return this.addStyle(String(ansiCodes.blue), String(ansiCodes.defaultColor));\n  }\n\n  get magenta(): Style {\n    return this.addStyle(String(ansiCodes.magenta), String(ansiCodes.defaultColor));\n  }\n\n  get cyan(): Style {\n    return this.addStyle(String(ansiCodes.cyan), String(ansiCodes.defaultColor));\n  }\n\n  get white(): Style {\n    return this.addStyle(String(ansiCodes.white), String(ansiCodes.defaultColor));\n  }\n\n  get gray(): Style {\n    return this.addStyle(String(ansiCodes.brightBlack), String(ansiCodes.defaultColor));\n  }\n\n  get grey(): Style {\n    return this.gray;\n  }\n\n  get bgBlack(): Style {\n    return this.addStyle(String(ansiCodes.bgBlack), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgRed(): Style {\n    return this.addStyle(String(ansiCodes.bgRed), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgGreen(): Style {\n    return this.addStyle(String(ansiCodes.bgGreen), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgYellow(): Style {\n    return this.addStyle(String(ansiCodes.bgYellow), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgBlue(): Style {\n    return this.addStyle(String(ansiCodes.bgBlue), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgMagenta(): Style {\n    return this.addStyle(String(ansiCodes.bgMagenta), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgCyan(): Style {\n    return this.addStyle(String(ansiCodes.bgCyan), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgWhite(): Style {\n    return this.addStyle(String(ansiCodes.bgWhite), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgGray(): Style {\n    return this.addStyle(String(ansiCodes.bgBrightBlack), String(ansiCodes.bgDefaultColor));\n  }\n\n  get bgGrey(): Style {\n    return this.bgGray;\n  }\n\n  color(color: ColorInput): Style {\n    const level = this.options.level ?? terminal().colorLevel;\n    \n    // Validate color input\n    const validation = InputValidator.validateColor(color);\n    if (!validation.valid) {\n      if (process.env.NODE_ENV === 'development') {\n        throw new ValidationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { input: color }\n        );\n      }\n      // In production, return unchanged style\n      return this;\n    }\n    \n    // Check if it's a basic named color first\n    if (typeof color === 'string') {\n      const basicColors: Record<string, number> = {\n        black: ansiCodes.black,\n        red: ansiCodes.red,\n        green: ansiCodes.green,\n        yellow: ansiCodes.yellow,\n        blue: ansiCodes.blue,\n        magenta: ansiCodes.magenta,\n        cyan: ansiCodes.cyan,\n        white: ansiCodes.white,\n        gray: ansiCodes.brightBlack,\n        grey: ansiCodes.brightBlack\n      };\n      \n      const colorLower = color.toLowerCase();\n      if (colorLower in basicColors && level >= 1) {\n        return this.addStyle(String(basicColors[colorLower]), String(ansiCodes.defaultColor));\n      }\n      \n      // Check if it's a hex color without # prefix\n      if (/^[0-9a-fA-F]{6}$/.test(color)) {\n        // Add # prefix and process as hex\n        const [r, g, b] = ColorProcessor.processColor('#' + color);\n        if (this.options.force || level >= 3) {\n          return this.addStyle(rgb(r, g, b), String(ansiCodes.defaultColor));\n        } else if (level >= 2) {\n          const code = rgbToAnsi256(r, g, b);\n          return this.addStyle(ansi256(code), String(ansiCodes.defaultColor));\n        }\n      }\n      \n      // Check if it's a valid color name or hex with #\n      if (!ColorProcessor.isValidColorName(color) && !ColorProcessor.isValidHex(color)) {\n        // Invalid color name - return unchanged\n        return this;\n      }\n    }\n    \n    // Handle ANSI 256 color codes\n    if (typeof color === 'number') {\n      if (level >= 2) {\n        return this.addStyle(ansi256(color), String(ansiCodes.defaultColor));\n      } else {\n        // No support for 256 colors at basic level\n        return this;\n      }\n    }\n    \n    // Use ColorProcessor for RGB colors\n    const [r, g, b] = ColorProcessor.processColor(color);\n    \n    if (this.options.force || level >= 3) {\n      return this.addStyle(rgb(r, g, b), String(ansiCodes.defaultColor));\n    } else if (level >= 2) {\n      const code = rgbToAnsi256(r, g, b);\n      return this.addStyle(ansi256(code), String(ansiCodes.defaultColor));\n    } else if (level >= 1) {\n      // Basic color level (1) doesn't support RGB arrays\n      return this;\n    }\n\n    return this;\n  }\n\n  bgColor(color: ColorInput): Style {\n    const level = this.options.level ?? terminal().colorLevel;\n    \n    // Validate color input\n    const validation = InputValidator.validateColor(color);\n    if (!validation.valid) {\n      if (process.env.NODE_ENV === 'development') {\n        throw new ValidationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { input: color }\n        );\n      }\n      // In production, return unchanged style\n      return this;\n    }\n    \n    // Check if it's a basic named color first\n    if (typeof color === 'string') {\n      const basicBgColors: Record<string, number> = {\n        black: ansiCodes.bgBlack,\n        red: ansiCodes.bgRed,\n        green: ansiCodes.bgGreen,\n        yellow: ansiCodes.bgYellow,\n        blue: ansiCodes.bgBlue,\n        magenta: ansiCodes.bgMagenta,\n        cyan: ansiCodes.bgCyan,\n        white: ansiCodes.bgWhite,\n        gray: ansiCodes.bgBrightBlack,\n        grey: ansiCodes.bgBrightBlack\n      };\n      \n      const colorLower = color.toLowerCase();\n      if (colorLower in basicBgColors && level >= 1) {\n        return this.addStyle(String(basicBgColors[colorLower]), String(ansiCodes.bgDefaultColor));\n      }\n    }\n    \n    // Handle ANSI 256 color codes\n    if (typeof color === 'number' && level >= 2) {\n      return this.addStyle(bgAnsi256(color), String(ansiCodes.bgDefaultColor));\n    }\n    \n    // Use ColorProcessor for RGB colors\n    const [r, g, b] = ColorProcessor.processColor(color);\n    \n    if (this.options.force || level >= 3) {\n      return this.addStyle(bgRgb(r, g, b), String(ansiCodes.bgDefaultColor));\n    } else if (level >= 2) {\n      const code = rgbToAnsi256(r, g, b);\n      return this.addStyle(bgAnsi256(code), String(ansiCodes.bgDefaultColor));\n    } else if (level >= 1) {\n      // Fallback to basic background colors for RGB values\n      const brightness = (r + g + b) / 3;\n      let closestColor = 'white';\n      if (brightness < 64) closestColor = 'black';\n      else if (r > g && r > b) closestColor = 'red';\n      else if (g > r && g > b) closestColor = 'green';\n      else if (b > r && b > g) closestColor = 'blue';\n      else if (r > 128 && g > 128) closestColor = 'yellow';\n      else if (r > 128 && b > 128) closestColor = 'magenta';\n      else if (g > 128 && b > 128) closestColor = 'cyan';\n      \n      const basicBgColors: Record<string, number> = {\n        black: ansiCodes.bgBlack,\n        red: ansiCodes.bgRed,\n        green: ansiCodes.bgGreen,\n        yellow: ansiCodes.bgYellow,\n        blue: ansiCodes.bgBlue,\n        magenta: ansiCodes.bgMagenta,\n        cyan: ansiCodes.bgCyan,\n        white: ansiCodes.bgWhite\n      };\n      \n      return this.addStyle(String(basicBgColors[closestColor]), String(ansiCodes.bgDefaultColor));\n    }\n\n    return this;\n  }\n\n  rgb(r: number, g: number, b: number): Style {\n    // Validate individual RGB values\n    const validation = InputValidator.validateColor([r, g, b]);\n    if (!validation.valid) {\n      if (process.env.NODE_ENV === 'development') {\n        throw new ValidationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { r, g, b }\n        );\n      }\n      return this;\n    }\n    return this.color([r, g, b]);\n  }\n\n  bgRgb(r: number, g: number, b: number): Style {\n    // Validate individual RGB values\n    const validation = InputValidator.validateColor([r, g, b]);\n    if (!validation.valid) {\n      if (process.env.NODE_ENV === 'development') {\n        throw new ValidationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { r, g, b }\n        );\n      }\n      return this;\n    }\n    return this.bgColor([r, g, b]);\n  }\n\n  hex(hex: string): Style {\n    return this.color(hex);\n  }\n\n  bgHex(hex: string): Style {\n    return this.bgColor(hex);\n  }\n}","import { Style, StyleOptions } from './styles/style';\nimport { stripAnsi } from './core/ansi';\n\ntype FormatterFunction = {\n  (text: string): string;\n  (...args: any[]): string;\n};\n\nexport type FormatterProxy = FormatterFunction & Record<string, any>;\n\nexport class Formatter {\n  private style: Style;\n\n  constructor(options: StyleOptions = {}) {\n    this.style = new Style([], [], options);\n  }\n\n  private createProxy(style: Style): FormatterProxy {\n    const formatter = (...args: any[]): string => {\n      if (args.length === 0) return '';\n      \n      if (args.length === 1 && typeof args[0] === 'string') {\n        return style.apply(args[0]);\n      }\n      \n      if (Array.isArray(args[0]) && 'raw' in args[0]) {\n        return this.template(style, args[0] as TemplateStringsArray, ...args.slice(1));\n      }\n      \n      return style.apply(args.map(String).join(' '));\n    };\n\n    return new Proxy(formatter as FormatterProxy, {\n      get: (target, prop: string) => {\n        // Special methods from Formatter class\n        if (prop === 'strip') {\n          return this.strip.bind(this);\n        }\n        \n        if (prop in style) {\n          const styleObj = style as Style & Record<string, unknown>;\n          const newStyle = styleObj[prop];\n          if (newStyle instanceof Style) {\n            return this.createProxy(newStyle);\n          }\n          if (typeof newStyle === 'function') {\n            return (...args: unknown[]) => {\n              const result = (newStyle as (...args: unknown[]) => unknown).apply(style, args);\n              if (result instanceof Style) {\n                return this.createProxy(result);\n              }\n              return result;\n            };\n          }\n        }\n        return target[prop as keyof FormatterProxy];\n      }\n    });\n  }\n\n  private template(style: Style, strings: TemplateStringsArray, ...values: any[]): string {\n    let result = '';\n    \n    strings.forEach((str, i) => {\n      result += str;\n      if (i < values.length) {\n        result += String(values[i]);\n      }\n    });\n    \n    return style.apply(result);\n  }\n\n  get proxy(): FormatterProxy {\n    return this.createProxy(this.style);\n  }\n\n  strip(text: string): string {\n    return stripAnsi(text);\n  }\n\n  static create(options: StyleOptions = {}): FormatterProxy {\n    const formatter = new Formatter(options);\n    return formatter.proxy;\n  }\n}\n\n\nexport interface FormatterInstance extends FormatterProxy {\n  (text: string): string;\n  (...args: any[]): string;\n  (strings: TemplateStringsArray, ...values: any[]): string;\n  \n  strip: (text: string) => string;\n  \n  color: (color: string | number | [number, number, number]) => FormatterProxy;\n  bgColor: (color: string | number | [number, number, number]) => FormatterProxy;\n  rgb: (r: number, g: number, b: number) => FormatterProxy;\n  bgRgb: (r: number, g: number, b: number) => FormatterProxy;\n  hex: (hex: string) => FormatterProxy;\n  bgHex: (hex: string) => FormatterProxy;\n}\n\nexport interface FormatterAPI extends FormatterInstance {\n  black: FormatterInstance;\n  red: FormatterInstance;\n  green: FormatterInstance;\n  yellow: FormatterInstance;\n  blue: FormatterInstance;\n  magenta: FormatterInstance;\n  cyan: FormatterInstance;\n  white: FormatterInstance;\n  gray: FormatterInstance;\n  grey: FormatterInstance;\n  \n  bgBlack: FormatterInstance;\n  bgRed: FormatterInstance;\n  bgGreen: FormatterInstance;\n  bgYellow: FormatterInstance;\n  bgBlue: FormatterInstance;\n  bgMagenta: FormatterInstance;\n  bgCyan: FormatterInstance;\n  bgWhite: FormatterInstance;\n  bgGray: FormatterInstance;\n  bgGrey: FormatterInstance;\n  \n  bold: FormatterInstance;\n  dim: FormatterInstance;\n  italic: FormatterInstance;\n  underline: FormatterInstance;\n  inverse: FormatterInstance;\n  hidden: FormatterInstance;\n  strikethrough: FormatterInstance;\n}","/**\n * High-performance StringBuilder for efficient string concatenation\n * Avoids the O(n²) complexity of repeated string concatenation\n */\n\nexport class StringBuilder {\n  private chunks: string[] = [];\n  private _length = 0;\n  \n  constructor(initial?: string) {\n    if (initial) {\n      this.append(initial);\n    }\n  }\n  \n  append(value: string | number): StringBuilder {\n    if (typeof value === 'number') {\n      const str = String(value);\n      this.chunks.push(str);\n      this._length += str.length;\n    } else if (value.length > 0) {\n      this.chunks.push(value);\n      this._length += value.length;\n    }\n    return this;\n  }\n  \n  appendLine(str: string = ''): StringBuilder {\n    return this.append(str + '\\n');\n  }\n  \n  prepend(str: string): StringBuilder {\n    if (str.length > 0) {\n      this.chunks.unshift(str);\n      this._length += str.length;\n    }\n    return this;\n  }\n  \n  insert(index: number, str: string): StringBuilder {\n    if (index < 0 || index > this._length) {\n      throw new RangeError('Index out of bounds');\n    }\n    \n    if (index === 0) {\n      return this.prepend(str);\n    }\n    \n    if (index === this._length) {\n      return this.append(str);\n    }\n    \n    // For insertion in the middle, we need to rebuild\n    const current = this.toString();\n    this.clear();\n    this.append(current.slice(0, index));\n    this.append(str);\n    this.append(current.slice(index));\n    \n    return this;\n  }\n  \n  clear(): StringBuilder {\n    this.chunks = [];\n    this._length = 0;\n    return this;\n  }\n  \n  toString(): string {\n    // Join is much faster than repeated concatenation\n    return this.chunks.join('');\n  }\n  \n  get length(): number {\n    return this._length;\n  }\n  \n  isEmpty(): boolean {\n    return this._length === 0;\n  }\n  \n  // Static factory method\n  static create(initial?: string): StringBuilder {\n    return new StringBuilder(initial);\n  }\n  \n  // Utility method for building ANSI sequences\n  static ansi(codes: (string | number)[]): string {\n    return `\\u001b[${codes.join(';')}m`;\n  }\n  \n  // Performance-optimized method for building styled text\n  static styledText(text: string, openCodes: string[], closeCodes: string[]): string {\n    if (openCodes.length === 0) return text;\n    \n    const builder = new StringBuilder();\n    \n    // Add opening codes\n    for (const code of openCodes) {\n      builder.append(`\\u001b[${code}m`);\n    }\n    \n    // Add text\n    builder.append(text);\n    \n    // Add closing codes in reverse order\n    for (let i = closeCodes.length - 1; i >= 0; i--) {\n      builder.append(`\\u001b[${closeCodes[i]}m`);\n    }\n    \n    return builder.toString();\n  }\n}\n\n/**\n * Pool of reusable StringBuilder instances to reduce GC pressure\n */\nexport class StringBuilderPool {\n  private static pool: StringBuilder[] = [];\n  private static maxPoolSize = 10;\n  \n  static acquire(initial?: string): StringBuilder {\n    const builder = this.pool.pop() || new StringBuilder();\n    if (initial) {\n      builder.append(initial);\n    }\n    return builder;\n  }\n  \n  static release(builder: StringBuilder): void {\n    if (this.pool.length < this.maxPoolSize) {\n      builder.clear();\n      this.pool.push(builder);\n    }\n  }\n  \n  static withBuilder<T>(fn: (builder: StringBuilder) => T): T {\n    const builder = this.acquire();\n    try {\n      return fn(builder);\n    } finally {\n      this.release(builder);\n    }\n  }\n}","import { Style } from '../styles/style';\nimport { terminal } from '../utils/terminal';\nimport { ColorProcessor, RGBTuple } from '../core/color-processor';\nimport { StringBuilder } from '../core/string-builder';\nimport { cacheManager } from '../core/cache-manager';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ErrorCode, ErrorRecovery } from '../core/errors';\n\n\n\n// Convert RGB to basic color (30-37)\nfunction rgbToBasic(r: number, g: number, b: number): number {\n  const brightness = (r + g + b) / 3;\n  \n  if (brightness < 64) return 30; // black\n  if (r > g && r > b) return 31; // red\n  if (g > r && g > b) return 32; // green\n  if (r > 128 && g > 128 && b < 64) return 33; // yellow\n  if (b > r && b > g) return 34; // blue\n  if (r > 128 && b > 128 && g < 64) return 35; // magenta\n  if (g > 128 && b > 128 && r < 64) return 36; // cyan\n  return 37; // white\n}\n\nfunction convertColorInput(color: string | number | [number, number, number]): RGBTuple {\n  return ColorProcessor.processColor(color);\n}\n\nexport interface GradientOptions {\n  interpolation?: 'linear' | 'bezier';\n  hsvSpin?: 'short' | 'long';\n}\n\nfunction interpolateLinear(start: number, end: number, factor: number): number {\n  return Math.round(start + (end - start) * factor);\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n  r /= 255;\n  g /= 255;\n  b /= 255;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const delta = max - min;\n\n  let h = 0;\n  const s = max === 0 ? 0 : delta / max;\n  const v = max;\n\n  if (delta !== 0) {\n    if (max === r) {\n      h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n    } else if (max === g) {\n      h = ((b - r) / delta + 2) / 6;\n    } else {\n      h = ((r - g) / delta + 4) / 6;\n    }\n  }\n\n  return [h * 360, s * 100, v * 100];\n}\n\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n  h /= 360;\n  s /= 100;\n  v /= 100;\n\n  const i = Math.floor(h * 6);\n  const f = h * 6 - i;\n  const p = v * (1 - s);\n  const q = v * (1 - f * s);\n  const t = v * (1 - (1 - f) * s);\n\n  let r: number, g: number, b: number;\n\n  switch (i % 6) {\n    case 0: [r, g, b] = [v, t, p]; break;\n    case 1: [r, g, b] = [q, v, p]; break;\n    case 2: [r, g, b] = [p, v, t]; break;\n    case 3: [r, g, b] = [p, q, v]; break;\n    case 4: [r, g, b] = [t, p, v]; break;\n    case 5: [r, g, b] = [v, p, q]; break;\n    default: [r, g, b] = [0, 0, 0];\n  }\n\n  return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}\n\nfunction interpolateHsv(\n  start: RGBTuple,\n  end: RGBTuple,\n  factor: number,\n  spin: 'short' | 'long' = 'short'\n): RGBTuple {\n  const [h1Start, s1, v1] = rgbToHsv(start[0], start[1], start[2]);\n  const [h2Start, s2, v2] = rgbToHsv(end[0], end[1], end[2]);\n  let h1 = h1Start;\n  let h2 = h2Start;\n\n  if (spin === 'long') {\n    if (h2 > h1 && h2 - h1 > 180) {\n      h1 += 360;\n    } else if (h1 > h2 && h1 - h2 > 180) {\n      h2 += 360;\n    }\n  } else {\n    if (h2 > h1 && h2 - h1 > 180) {\n      h2 -= 360;\n    } else if (h1 > h2 && h1 - h2 > 180) {\n      h1 -= 360;\n    }\n  }\n\n  const hRaw = interpolateLinear(h1, h2, factor);\n  // Ensure h is in range [0, 360)\n  const h = ((hRaw % 360) + 360) % 360;\n  const s = Math.max(0, Math.min(100, interpolateLinear(s1, s2, factor)));\n  const v = Math.max(0, Math.min(100, interpolateLinear(v1, v2, factor)));\n\n  return hsvToRgb(h, s, v) as RGBTuple;\n}\n\n// Optimized function for cache key generation\nfunction getGradientCacheKey(text: string, colors: (string | number | [number, number, number])[], options: GradientOptions): string {\n  // Use StringBuilder for efficient string concatenation\n  const keyBuilder = new StringBuilder();\n  \n  // Add colors\n  for (let i = 0; i < colors.length; i++) {\n    if (i > 0) keyBuilder.append('|');\n    const c = colors[i];\n    if (Array.isArray(c)) {\n      keyBuilder.append(c[0]).append(',').append(c[1]).append(',').append(c[2]);\n    } else {\n      keyBuilder.append(String(c));\n    }\n  }\n  \n  keyBuilder.append('-').append(text.length).append('-');\n  \n  // Better hash calculation with FNV-1a algorithm for better distribution\n  let hash = 2166136261; // FNV offset basis\n  for (let i = 0; i < text.length; i++) {\n    hash ^= text.charCodeAt(i);\n    hash = Math.imul(hash, 16777619); // FNV prime, using Math.imul for 32-bit arithmetic\n  }\n  // Ensure positive number\n  hash = Math.abs(hash);\n  keyBuilder.append(hash).append('-');\n  \n  // Add options\n  keyBuilder.append(options.interpolation || 'linear')\n    .append('-')\n    .append(options.hsvSpin || 'short');\n  \n  return keyBuilder.toString();\n}\n\nfunction optimizedGradientBase(\n  text: string,\n  colors: (string | number | [number, number, number])[],\n  options: GradientOptions = {}\n): string {\n  // Validate text input\n  const textValidation = InputValidator.validateText(text);\n  if (!textValidation.valid) {\n    return '';\n  }\n  const validatedText = textValidation.value!.text;\n  \n  // Check terminal color support\n  const termInfo = terminal();\n  if (!termInfo.supportsColor) {\n    return validatedText; // Return plain text if no color support\n  }\n\n  // Validate color array\n  const colorValidation = InputValidator.validateColorArray(colors);\n  if (!colorValidation.valid) {\n    if (process.env.NODE_ENV === 'development') {\n      throw new ValidationError(\n        colorValidation.error!,\n        ErrorCode.INVALID_COLOR_INPUT,\n        { colors }\n      );\n    }\n    return validatedText;\n  }\n  \n  const validColors = colorValidation.value!.map(vc => vc.original);\n  \n  if (validColors.length === 0) return validatedText;\n  if (validColors.length === 1) {\n    const color = validColors[0];\n    const rgb = convertColorInput(color);\n    return new Style([], [], {}).color([rgb[0], rgb[1], rgb[2]]).apply(validatedText);\n  }\n\n  const chars = [...validatedText];\n  if (chars.length === 0) return validatedText;\n  \n  // Check cache for this gradient configuration\n  const cacheKey = getGradientCacheKey(validatedText, validColors, options);\n  const cached = cacheManager.getGradient(cacheKey);\n  if (cached) {\n    return cached;\n  }\n  \n  // Pre-compute all colors for performance\n  const colorStops = validColors.map(convertColorInput);\n  const segments = Math.max(1, colorStops.length - 1);\n  const charsPerSegment = chars.length / segments;\n  \n  // Use StringBuilder for better performance than array joining\n  const builder = new StringBuilder();\n  \n  // Pre-calculate common ANSI sequences for reuse\n  const colorReset = '\\u001b[39m';\n  const colorLevel = termInfo.colorLevel;\n  \n  // Optimize interpolation function selection\n  const useHsvInterpolation = options.interpolation === 'bezier' || options.hsvSpin;\n  \n  for (let i = 0; i < chars.length; i++) {\n    const char = chars[i];\n    \n    // Fast path for whitespace\n    if (char === ' ' || char === '\\n' || char === '\\t') {\n      builder.append(char);\n      continue;\n    }\n\n    const segment = Math.min(Math.floor(i / charsPerSegment), segments - 1);\n    const segmentProgress = (i % charsPerSegment) / charsPerSegment;\n    \n    const startColor = colorStops[segment];\n    // Ensure we don't go out of bounds for the last segment\n    const endColor = colorStops[Math.min(segment + 1, colorStops.length - 1)];\n    \n    let r: number, g: number, b: number;\n    \n    if (useHsvInterpolation) {\n      const color = interpolateHsv(startColor, endColor, segmentProgress, options.hsvSpin);\n      [r, g, b] = color;\n    } else {\n      // Inline linear interpolation for performance\n      r = Math.round(startColor[0] + (endColor[0] - startColor[0]) * segmentProgress);\n      g = Math.round(startColor[1] + (endColor[1] - startColor[1]) * segmentProgress);\n      b = Math.round(startColor[2] + (endColor[2] - startColor[2]) * segmentProgress);\n    }\n    \n    // Build ANSI code based on terminal color support\n    if (colorLevel >= 3) {\n      // 24-bit true color\n      builder.append('\\u001b[38;2;').append(r).append(';').append(g).append(';').append(b).append('m').append(char).append(colorReset);\n    } else if (colorLevel >= 2) {\n      // 256 color mode - use cached conversion\n      const colorIndex = ColorProcessor.rgbTo256(r, g, b);\n      builder.append('\\u001b[38;5;').append(colorIndex).append('m').append(char).append(colorReset);\n    } else {\n      // Basic colors only\n      const basicColor = rgbToBasic(r, g, b);\n      builder.append('\\u001b[').append(basicColor).append('m').append(char).append(colorReset);\n    }\n  }\n  \n  const result = builder.toString();\n  \n  // Cache the result\n  cacheManager.setGradient(cacheKey, result);\n  \n  return result;\n}\n\nfunction gradientBase(\n  text: string,\n  colors: (string | number | [number, number, number])[],\n  options: GradientOptions = {}\n): string {\n  return optimizedGradientBase(text, colors, options);\n}\n\n// Export the basic gradient function\nexport function gradient(\n  text: string,\n  colors: (string | number | [number, number, number])[],\n  options: GradientOptions = {}\n): string {\n  return ErrorRecovery.recover(\n    () => gradientBase(text, colors, options),\n    text,\n    process.env.DEBUG === 'true'\n  );\n}\n\n// Add linear method for backward compatibility\nexport interface GradientAPI {\n  (text: string, colors: (string | number | [number, number, number])[], options?: GradientOptions): string;\n  (colors: (string | number | [number, number, number])[]): (text: string, options?: GradientOptions) => string;\n  linear: (text: string, options: { from: string | number | [number, number, number]; to: string | number | [number, number, number] }) => string;\n}\n\n// Create gradient object with linear method for the main index\nconst gradientWithLinear = Object.assign(\n  function gradient(...args: any[]) {\n    // Support both gradient(text, colors) and gradient(colors)(text)\n    if (args.length === 1 && Array.isArray(args[0])) {\n      // Curried form: gradient(colors) returns a function\n      const colors = args[0] as (string | number | [number, number, number])[];\n      return (text: string, options?: GradientOptions) => gradientBase(text, colors, options);\n    } else if (args.length >= 2) {\n      // Direct form: gradient(text, colors, options?)\n      const [text, colors, options] = args;\n      return gradientBase(text, colors, options);\n    } else if (args.length === 1 && typeof args[0] === 'string') {\n      // Edge case: gradient(text) with no colors\n      return args[0];\n    }\n    // Default case\n    return '';\n  },\n  {\n    linear: (text: string, options: { from: string | [number, number, number]; to: string | [number, number, number] }) => {\n      return gradientBase(text, [options.from, options.to]);\n    }\n  }\n) as GradientAPI;\n\n// Export the enhanced gradient function for main index\nexport { gradientWithLinear as gradientEnhanced };\n\n// Export linear function for direct imports\nexport const linear = (text: string, options: { from: string | number | [number, number, number]; to: string | number | [number, number, number] }) => {\n  if (!options || !options.from || !options.to) {\n    if (process.env.NODE_ENV === 'development') {\n      throw new ValidationError(\n        'Linear gradient requires both from and to colors',\n        ErrorCode.INVALID_COLOR_INPUT,\n        { options }\n      );\n    }\n    return text;\n  }\n  return gradientBase(text, [options.from, options.to]);\n};\n\n// Export default for CommonJS compatibility\nexport default {\n  linear,\n  gradient,\n  rainbow\n};\n\n// Rainbow function with optional currying support\nexport function rainbow(...args: any[]): string | ((text: string) => string) {\n  const colors = [\n    '#e81416',  // Red\n    '#ffa500',  // Orange  \n    '#faeb36',  // Yellow\n    '#79c314',  // Green\n    '#487de7',  // Blue\n    '#4b369d',  // Indigo\n    '#70369d'   // Violet\n  ];\n  \n  if (args.length === 0) {\n    // Curried form: rainbow() returns a function\n    return (text: string, options: GradientOptions = {}) => {\n      return ErrorRecovery.recover(\n        () => gradientBase(text, colors, options),\n        text,\n        process.env.DEBUG === 'true'\n      );\n    };\n  } else if (args.length >= 1 && typeof args[0] === 'string') {\n    // Direct form: rainbow(text, options?)\n    const [text, options = {}] = args;\n    return ErrorRecovery.recover(\n      () => gradientBase(text, colors, options),\n      text,\n      process.env.DEBUG === 'true'\n    );\n  }\n  \n  // Default case\n  return '';\n}","/**\n * Global Resource Manager for tracking and disposing resources\n * Prevents memory leaks by ensuring all resources are properly cleaned up\n */\n\nexport interface Disposable {\n  dispose(): void;\n}\n\nexport class ResourceManager {\n  private static resources = new Set<Disposable>();\n  private static initialized = false;\n  private static isDisposing = false;\n\n  static register(resource: Disposable): void {\n    this.ensureInitialized();\n    this.resources.add(resource);\n  }\n\n  static unregister(resource: Disposable): void {\n    this.resources.delete(resource);\n  }\n\n  static disposeAll(): void {\n    // Atomic check-and-set to prevent race conditions\n    const wasDisposing = this.isDisposing;\n    this.isDisposing = true;\n    \n    // If already disposing, wait and return\n    if (wasDisposing) return;\n    \n    const resources = Array.from(this.resources);\n    this.resources.clear();\n    \n    // Dispose resources with error isolation\n    for (const resource of resources) {\n      try {\n        resource.dispose();\n      } catch (error) {\n        // Log error but continue cleanup to prevent cascading failures\n        if (typeof console !== 'undefined' && console.warn) {\n          console.warn('Error disposing resource:', error);\n        }\n      }\n    }\n    \n    this.isDisposing = false;\n  }\n\n  static getResourceCount(): number {\n    return this.resources.size;\n  }\n\n  private static ensureInitialized(): void {\n    if (this.initialized) return;\n    this.initialized = true;\n\n    // Set up process exit handlers only once\n    const cleanup = () => {\n      this.disposeAll();\n    };\n\n    // Create cleanup handler that ensures single execution\n    let cleanupExecuted = false;\n    const safeCleanup = () => {\n      if (!cleanupExecuted) {\n        cleanupExecuted = true;\n        cleanup();\n      }\n    };\n\n    // Increase listener limit to prevent warnings\n    if (typeof process !== 'undefined' && process.setMaxListeners) {\n      const currentMax = process.getMaxListeners();\n      if (currentMax < 20) {\n        process.setMaxListeners(20);\n      }\n    }\n\n    // Register cleanup handlers with safe wrapper\n    if (typeof process !== 'undefined') {\n      process.once('exit', safeCleanup);\n      process.once('SIGINT', safeCleanup);\n      process.once('SIGTERM', safeCleanup);\n      process.once('uncaughtException', (error) => {\n        console.error('Uncaught exception:', error);\n        safeCleanup();\n      });\n      process.once('unhandledRejection', (reason) => {\n        console.error('Unhandled rejection:', reason);\n        safeCleanup();\n      });\n    }\n  }\n}\n\n/**\n * Helper decorator for auto-registering disposable classes\n */\nexport function autoDispose<T extends new (...args: any[]) => Disposable>(\n  constructor: T\n) {\n  return class extends constructor {\n    constructor(...args: any[]) {\n      super(...args);\n      ResourceManager.register(this);\n    }\n\n    dispose(): void {\n      ResourceManager.unregister(this);\n      super.dispose();\n    }\n  };\n}\n\n/**\n * Utility for creating disposable resources with automatic cleanup\n */\nexport function createDisposable<T>(\n  resource: T,\n  disposeFn: (resource: T) => void\n): Disposable & { resource: T } {\n  const disposable = {\n    resource,\n    dispose(): void {\n      try {\n        disposeFn(resource);\n      } catch (error) {\n        console.warn('Error in dispose function:', error);\n      }\n    }\n  };\n\n  ResourceManager.register(disposable);\n  return disposable;\n}","/**\n * Safe utility functions for preventing runtime errors\n * Provides bounds checking, error recovery, and safe operations\n */\n\n/**\n * Safe division that prevents division by zero and handles edge cases\n */\nexport function safeDivide(a: number, b: number, defaultValue = 0): number {\n  if (b === 0 || !isFinite(b) || !isFinite(a)) {\n    return defaultValue;\n  }\n  const result = a / b;\n  return isFinite(result) ? result : defaultValue;\n}\n\n/**\n * Safe substring with bounds checking\n */\nexport function safeSubstring(str: string, start: number, end?: number): string {\n  if (!str || typeof str !== 'string') return '';\n  \n  const len = str.length;\n  const safeStart = Math.max(0, Math.min(start, len));\n  \n  if (end === undefined) {\n    return str.substring(safeStart);\n  }\n  \n  const safeEnd = Math.max(safeStart, Math.min(end, len));\n  return str.substring(safeStart, safeEnd);\n}\n\n/**\n * Safe array access with bounds checking\n */\nexport function safeArrayAccess<T>(array: T[], index: number, defaultValue?: T): T | undefined {\n  if (!Array.isArray(array) || index < 0 || index >= array.length) {\n    return defaultValue;\n  }\n  return array[index];\n}\n\n/**\n * Safe number parsing with fallback\n */\nexport function safeParseInt(value: unknown, defaultValue = 0): number {\n  if (typeof value === 'number' && isFinite(value)) {\n    return Math.floor(value);\n  }\n  \n  if (typeof value === 'string') {\n    const parsed = parseInt(value, 10);\n    return isFinite(parsed) ? parsed : defaultValue;\n  }\n  \n  return defaultValue;\n}\n\n/**\n * Safe float parsing with fallback\n */\nexport function safeParseFloat(value: unknown, defaultValue = 0): number {\n  if (typeof value === 'number' && isFinite(value)) {\n    return value;\n  }\n  \n  if (typeof value === 'string') {\n    const parsed = parseFloat(value);\n    return isFinite(parsed) ? parsed : defaultValue;\n  }\n  \n  return defaultValue;\n}\n\n/**\n * Safe execution wrapper with error recovery\n */\nexport function safeExecute<T>(\n  operation: () => T,\n  fallback: T,\n  errorHandler?: (error: Error) => void\n): T {\n  try {\n    return operation();\n  } catch (error) {\n    if (errorHandler) {\n      try {\n        errorHandler(error as Error);\n      } catch (handlerError) {\n        // Ignore handler errors to prevent cascading failures\n      }\n    }\n    return fallback;\n  }\n}\n\n/**\n * Safe async execution wrapper\n */\nexport async function safeExecuteAsync<T>(\n  operation: () => Promise<T>,\n  fallback: T,\n  errorHandler?: (error: Error) => void\n): Promise<T> {\n  try {\n    return await operation();\n  } catch (error) {\n    if (errorHandler) {\n      try {\n        errorHandler(error as Error);\n      } catch (handlerError) {\n        // Ignore handler errors\n      }\n    }\n    return fallback;\n  }\n}\n\n/**\n * Clamp number to range\n */\nexport function clamp(value: number, min: number, max: number): number {\n  if (!isFinite(value)) return min;\n  return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Safe object property access\n */\nexport function safeGet<T>(\n  obj: any,\n  path: string | string[],\n  defaultValue?: T\n): T | undefined {\n  if (!obj || typeof obj !== 'object') {\n    return defaultValue;\n  }\n\n  const keys = Array.isArray(path) ? path : path.split('.');\n  let current = obj;\n\n  for (const key of keys) {\n    if (current == null || typeof current !== 'object' || !(key in current)) {\n      return defaultValue;\n    }\n    current = current[key];\n  }\n\n  return current;\n}\n\n/**\n * Debounce function to prevent excessive calls\n */\nexport function debounce<T extends (...args: any[]) => any>(\n  func: T,\n  delay: number\n): (...args: Parameters<T>) => void {\n  let timeoutId: NodeJS.Timeout | undefined;\n  \n  return (...args: Parameters<T>) => {\n    if (timeoutId) {\n      clearTimeout(timeoutId);\n    }\n    \n    timeoutId = setTimeout(() => {\n      func(...args);\n    }, delay);\n  };\n}\n\n/**\n * Throttle function to limit call frequency\n */\nexport function throttle<T extends (...args: any[]) => any>(\n  func: T,\n  delay: number\n): (...args: Parameters<T>) => void {\n  let lastCall = 0;\n  \n  return (...args: Parameters<T>) => {\n    const now = Date.now();\n    if (now - lastCall >= delay) {\n      lastCall = now;\n      func(...args);\n    }\n  };\n}","/**\n * Global Cursor State Manager\n * Prevents cursor state corruption when multiple components control cursor visibility\n */\n\nimport { hideCursor, showCursor } from './ansi';\nimport { safeExecute } from './safe-utils';\n\nexport class CursorManager {\n  private static instance: CursorManager;\n  private hiddenBy = new Set<string>();\n  private isHidden = false;\n\n  static getInstance(): CursorManager {\n    if (!this.instance) {\n      this.instance = new CursorManager();\n    }\n    return this.instance;\n  }\n\n  /**\n   * Hide cursor with reference tracking\n   */\n  hide(componentId: string): void {\n    this.hiddenBy.add(componentId);\n    \n    if (!this.isHidden) {\n      safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          process.stdout.write(hideCursor());\n          this.isHidden = true;\n        }\n      }, undefined);\n    }\n  }\n\n  /**\n   * Show cursor only when no components need it hidden\n   */\n  show(componentId: string): void {\n    this.hiddenBy.delete(componentId);\n    \n    // Only show cursor if no other components need it hidden\n    if (this.hiddenBy.size === 0 && this.isHidden) {\n      safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          process.stdout.write(showCursor());\n          this.isHidden = false;\n        }\n      }, undefined);\n    }\n  }\n\n  /**\n   * Force show cursor (emergency cleanup)\n   */\n  forceShow(): void {\n    this.hiddenBy.clear();\n    if (this.isHidden) {\n      safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          process.stdout.write(showCursor());\n          this.isHidden = false;\n        }\n      }, undefined);\n    }\n  }\n\n  /**\n   * Get current cursor state\n   */\n  get isCurrentlyHidden(): boolean {\n    return this.isHidden;\n  }\n\n  /**\n   * Get list of components that have hidden the cursor\n   */\n  get hiddenByComponents(): string[] {\n    return Array.from(this.hiddenBy);\n  }\n}\n\n// Export singleton instance\nexport const cursorManager = CursorManager.getInstance();","import { eraseLine } from '../core/ansi';\nimport { Style } from '../styles/style';\nimport { ResourceManager, Disposable } from '../core/resource-manager';\nimport { cursorManager } from '../core/cursor-manager';\nimport { safeExecute } from '../core/safe-utils';\nimport { InputValidator } from '../core/validators';\nimport { AnimationError, ErrorCode } from '../core/errors';\n\nexport type AnimationType = 'blink' | 'pulse' | 'slide' | 'typewriter' | 'fade';\n\nexport interface AnimationOptions {\n  duration?: number;\n  interval?: number;\n  iterations?: number;\n  onComplete?: () => void;\n}\n\nexport class Animation implements Disposable {\n  private intervalId?: NodeJS.Timeout;\n  private running = false;\n  private isDisposed = false;\n  private componentId: string;\n  private frameCount = 0;\n  private startTime = 0;\n  private pausedFrame = 0;\n  private pausedIteration = 0;\n\n  constructor(\n    private text: string,\n    private type: AnimationType,\n    private options: AnimationOptions = {}\n  ) {\n    // Validate text input\n    const textValidation = InputValidator.validateText(text);\n    if (!textValidation.valid) {\n      throw new AnimationError(\n        textValidation.error!,\n        ErrorCode.INVALID_TEXT_INPUT,\n        { text }\n      );\n    }\n    this.text = textValidation.value!.text;\n    \n    // Validate animation options\n    if (options.duration !== undefined) {\n      const durationValidation = InputValidator.validatePositiveNumber(options.duration, 'duration');\n      if (!durationValidation.valid) {\n        throw new AnimationError(\n          durationValidation.error!,\n          ErrorCode.INVALID_NUMBER_INPUT,\n          { duration: options.duration }\n        );\n      }\n    }\n    \n    if (options.interval !== undefined) {\n      const intervalValidation = InputValidator.validatePositiveNumber(options.interval, 'interval');\n      if (!intervalValidation.valid) {\n        throw new AnimationError(\n          intervalValidation.error!,\n          ErrorCode.INVALID_NUMBER_INPUT,\n          { interval: options.interval }\n        );\n      }\n    }\n    \n    if (options.iterations !== undefined && options.iterations !== Infinity) {\n      const iterationsValidation = InputValidator.validatePositiveNumber(options.iterations, 'iterations');\n      if (!iterationsValidation.valid) {\n        throw new AnimationError(\n          iterationsValidation.error!,\n          ErrorCode.INVALID_NUMBER_INPUT,\n          { iterations: options.iterations }\n        );\n      }\n    }\n    \n    this.options = {\n      duration: 1000,\n      interval: 100,\n      iterations: Infinity,\n      ...options\n    };\n    \n    // Generate unique component ID for cursor management\n    this.componentId = `animation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n    \n    // Register with ResourceManager for automatic cleanup\n    ResourceManager.register(this);\n  }\n\n  start(): void {\n    if (this.running || this.isDisposed) return;\n    \n    // Atomic disposal: Clear any existing interval BEFORE creating new one\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    \n    this.running = true;\n    \n    // Hide cursor using cursor manager\n    cursorManager.hide(this.componentId);\n    \n    // Resume from paused state or start fresh\n    let frame = this.pausedFrame || 1;\n    let iteration = this.pausedIteration || 0;\n    const totalFrames = Math.floor((this.options.duration || 1000) / (this.options.interval || 100));\n    \n    this.intervalId = setInterval(() => {\n      // Double-check disposal state to prevent zombie timers\n      if (this.isDisposed || !this.running) {\n        this.stop();\n        return;\n      }\n      \n      const progress = (frame % totalFrames) / totalFrames;\n      \n      const success = safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          // Use carriage return to go to beginning of current line instead of absolute positioning\n          process.stdout.write('\\r' + eraseLine());\n          \n          switch (this.type) {\n            case 'blink':\n              this.renderBlink(progress);\n              break;\n            case 'pulse':\n              this.renderPulse(progress);\n              break;\n            case 'slide':\n              this.renderSlide(progress);\n              break;\n            case 'typewriter':\n              this.renderTypewriter(progress);\n              break;\n            case 'fade':\n              this.renderFade(progress);\n              break;\n          }\n          return true;\n        }\n        return false;\n      }, false);\n      \n      if (!success) {\n        this.stop();\n        return;\n      }\n      \n      frame++;\n      \n      if (frame > totalFrames) {\n        iteration++;\n        frame = 1;\n        \n        if (this.options.iterations !== Infinity && this.options.iterations !== undefined && iteration >= this.options.iterations) {\n          this.stop();\n          if (this.options.onComplete) {\n            this.options.onComplete();\n          }\n        }\n      }\n      \n      // Update paused state in case of pause\n      this.pausedFrame = frame;\n      this.pausedIteration = iteration;\n    }, this.options.interval);\n  }\n\n  stop(): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    this.running = false;\n    \n    // Reset paused state on stop\n    this.pausedFrame = 0;\n    this.pausedIteration = 0;\n    \n    // Show cursor using cursor manager\n    if (!this.isDisposed) {\n      cursorManager.show(this.componentId);\n    }\n  }\n  \n  pause(frame?: number, iteration?: number): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    this.running = false;\n    \n    // Save current state if provided\n    if (frame !== undefined) {\n      this.pausedFrame = frame;\n    }\n    if (iteration !== undefined) {\n      this.pausedIteration = iteration;\n    }\n  }\n  \n  resume(): void {\n    if (!this.running && !this.isDisposed) {\n      this.start();\n    }\n  }\n  \n  dispose(): void {\n    if (this.isDisposed) return;\n    this.isDisposed = true;\n    \n    // Unregister from ResourceManager\n    ResourceManager.unregister(this);\n    \n    // Stop animation\n    this.stop();\n    \n    // Ensure cursor is shown by this component\n    cursorManager.show(this.componentId);\n  }\n\n  private renderBlink(progress: number): void {\n    if (progress <= 0.5) {\n      process.stdout.write(this.text);\n    } else {\n      process.stdout.write(' '.repeat(this.text.length));\n    }\n  }\n\n  private renderPulse(progress: number): void {\n    const intensity = Math.sin(progress * Math.PI) * 128 + 127;\n    const color: [number, number, number] = [intensity, intensity, intensity];\n    const styled = new Style().color(color).apply(this.text);\n    process.stdout.write(styled);\n  }\n\n  private renderSlide(progress: number): void {\n    const offset = Math.floor(progress * this.text.length);\n    const visible = this.text.slice(0, offset) + ' '.repeat(this.text.length - offset);\n    process.stdout.write(visible);\n  }\n\n  private renderTypewriter(progress: number): void {\n    const chars = Math.floor(progress * this.text.length);\n    const visible = this.text.slice(0, chars);\n    process.stdout.write(visible + '█');\n  }\n\n  private renderFade(progress: number): void {\n    const opacity = progress < 0.5 ? progress * 2 : (1 - progress) * 2;\n    const intensity = Math.floor(opacity * 255);\n    const color: [number, number, number] = [intensity, intensity, intensity];\n    const styled = new Style().color(color).apply(this.text);\n    process.stdout.write(styled);\n  }\n}\n\nexport function animate(\n  text: string,\n  type: AnimationType,\n  options?: AnimationOptions\n): Animation {\n  const animation = new Animation(text, type, options);\n  animation.start();\n  return animation;\n}\n\nexport const spinners = {\n  dots: { frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'], interval: 80 },\n  dots2: { frames: ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'], interval: 80 },\n  dots3: { frames: ['⠋', '⠙', '⠚', '⠞', '⠖', '⠦', '⠴', '⠲', '⠳', '⠓'], interval: 80 },\n  line: { frames: ['-', '\\\\', '|', '/'], interval: 130 },\n  line2: { frames: ['⠂', '-', '–', '—', '–', '-'], interval: 100 },\n  pipe: { frames: ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'], interval: 100 },\n  star: { frames: ['✶', '✸', '✹', '✺', '✹', '✷'], interval: 70 },\n  toggle: { frames: ['⊶', '⊷'], interval: 250 },\n  box: { frames: ['◰', '◳', '◲', '◱'], interval: 120 },\n  circle: { frames: ['◐', '◓', '◑', '◒'], interval: 120 },\n  arrow: { frames: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'], interval: 100 },\n  bounce: { frames: ['⠁', '⠂', '⠄', '⠂'], interval: 120 },\n  bar: { frames: ['▁', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃'], interval: 80 },\n  earth: { frames: ['🌍', '🌎', '🌏'], interval: 180 },\n  moon: { frames: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'], interval: 80 },\n  clock: { frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'], interval: 100 },\n  balloon: { frames: [' ', '.', 'o', 'O', '@', '*', ' '], interval: 140 },\n  noise: { frames: ['▓', '▒', '░'], interval: 100 },\n  boxBounce: { frames: ['▖', '▘', '▝', '▗'], interval: 120 },\n  triangle: { frames: ['◢', '◣', '◤', '◥'], interval: 50 },\n  binary: { frames: ['010010', '101101', '010010', '101010'], interval: 120 },\n  runner: { frames: ['🚶', '🏃'], interval: 140 },\n  pong: { frames: ['▐⠂       ▌', '▐⠈       ▌', '▐ ⠂      ▌', '▐ ⠠      ▌', '▐  ⡀     ▌', '▐  ⠠     ▌', '▐   ⠂    ▌', '▐   ⠈    ▌', '▐    ⠂   ▌', '▐    ⠠   ▌', '▐     ⡀  ▌', '▐     ⠠  ▌', '▐      ⠂ ▌', '▐      ⠈ ▌', '▐       ⠂▌', '▐       ⠠▌', '▐       ⡀▌', '▐      ⠠ ▌', '▐      ⠂ ▌', '▐     ⠈  ▌', '▐     ⠂  ▌', '▐    ⠠   ▌', '▐    ⡀   ▌', '▐   ⠠    ▌', '▐   ⠂    ▌', '▐  ⠈     ▌', '▐  ⠂     ▌', '▐ ⠠      ▌', '▐ ⡀      ▌', '▐⠠       ▌'], interval: 80 },\n  shark: { frames: ['▐|\\\\____________▌', '▐_|\\\\___________▌', '▐__|\\\\__________▌', '▐___|\\\\_________▌', '▐____|\\\\________▌', '▐_____|\\\\_______▌', '▐______|\\\\______▌', '▐_______|\\\\_____▌', '▐________|\\\\____▌', '▐_________|\\\\___▌', '▐__________|\\\\__▌', '▐___________|\\\\_▌', '▐____________|\\\\▌', '▐____________/|▌', '▐___________/|_▌', '▐__________/|__▌', '▐_________/|___▌', '▐________/|____▌', '▐_______/|_____▌', '▐______/|______▌', '▐_____/|_______▌', '▐____/|________▌', '▐___/|_________▌', '▐__/|__________▌', '▐_/|___________▌', '▐/|____________▌'], interval: 120 },\n  dqpb: { frames: ['d', 'q', 'p', 'b'], interval: 100 },\n  weather: { frames: ['☀️ ', '⛅ ', '🌤 ', '⛈ ', '🌧 ', '🌦 ', '☀️ '], interval: 100 },\n  christmas: { frames: ['🌲', '🎄'], interval: 400 }\n} as const;\n\nexport type SpinnerName = keyof typeof spinners;\n\nexport class Spinner implements Disposable {\n  private frames: string[];\n  private currentFrame = 0;\n  private intervalId?: NodeJS.Timeout;\n  private running = false;\n  private interval: number;\n  private isDisposed = false;\n  private componentId: string;\n\n  constructor(\n    private text: string,\n    spinnerOrOptions?: SpinnerName | { spinner?: SpinnerName | string; color?: string; interval?: number },\n    interval?: number\n  ) {\n    // Validate text input\n    const textValidation = InputValidator.validateText(text);\n    if (!textValidation.valid) {\n      throw new AnimationError(\n        textValidation.error!,\n        ErrorCode.INVALID_TEXT_INPUT,\n        { text }\n      );\n    }\n    this.text = textValidation.value!.text;\n    \n    let spinnerName: SpinnerName = 'dots';\n    let finalInterval = 80;\n\n    if (typeof spinnerOrOptions === 'string') {\n      spinnerName = spinnerOrOptions;\n      finalInterval = interval ?? spinners[spinnerName]?.interval ?? 80;\n    } else if (spinnerOrOptions && typeof spinnerOrOptions === 'object') {\n      spinnerName = (spinnerOrOptions.spinner as SpinnerName) ?? 'dots';\n      finalInterval = spinnerOrOptions.interval ?? spinners[spinnerName]?.interval ?? 80;\n    }\n    \n    // Validate interval\n    if (finalInterval) {\n      const intervalValidation = InputValidator.validatePositiveNumber(finalInterval, 'interval');\n      if (!intervalValidation.valid) {\n        throw new AnimationError(\n          intervalValidation.error!,\n          ErrorCode.INVALID_NUMBER_INPUT,\n          { interval: finalInterval }\n        );\n      }\n    }\n\n    // Handle invalid spinner names gracefully\n    const spinner = spinners[spinnerName];\n    if (spinner) {\n      this.frames = [...spinner.frames];\n      this.interval = finalInterval;\n    } else {\n      // Fallback to dots if spinner not found\n      this.frames = [...spinners.dots.frames];\n      this.interval = finalInterval;\n    }\n    \n    // Generate unique component ID for cursor management\n    this.componentId = `spinner-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n    \n    // Register with ResourceManager for automatic cleanup\n    ResourceManager.register(this);\n  }\n\n  start(): void {\n    if (this.running || this.isDisposed) return;\n    \n    // Clear any existing interval\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n    }\n    \n    this.running = true;\n    \n    // Hide cursor using cursor manager\n    cursorManager.hide(this.componentId);\n    \n    this.intervalId = setInterval(() => {\n      if (this.isDisposed) {\n        this.stop();\n        return;\n      }\n      \n      const success = safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          const frame = this.frames[this.currentFrame];\n          process.stdout.write(`\\r${frame} ${this.text}`);\n          this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n          return true;\n        }\n        return false;\n      }, false);\n      \n      if (!success) {\n        this.stop();\n      }\n    }, this.interval);\n  }\n\n  stop(finalText?: string): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    this.running = false;\n    \n    if (!this.isDisposed) {\n      safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          process.stdout.write('\\r' + eraseLine());\n          if (finalText) {\n            process.stdout.write(finalText);\n          }\n          process.stdout.write('\\n');\n        }\n        // Show cursor using cursor manager\n        cursorManager.show(this.componentId);\n      }, undefined);\n    }\n  }\n\n  update(text: string): void {\n    this.text = text;\n  }\n\n  updateColor(_color: string): void {\n    // Store color for future use - this is a placeholder for color functionality\n  }\n\n  succeed(text?: string): void {\n    this.stop(`✓ ${text || this.text}`);\n  }\n\n  fail(text?: string): void {\n    this.stop(`✗ ${text || this.text}`);\n  }\n\n  warn(text?: string): void {\n    this.stop(`⚠ ${text || this.text}`);\n  }\n\n  info(text?: string): void {\n    this.stop(`ℹ ${text || this.text}`);\n  }\n\n  clear(): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    this.running = false;\n    \n    if (!this.isDisposed) {\n      safeExecute(() => {\n        if (typeof process !== 'undefined' && process.stdout) {\n          process.stdout.write('\\r' + eraseLine());\n        }\n        // Show cursor using cursor manager\n        cursorManager.show(this.componentId);\n      }, undefined);\n    }\n  }\n  \n  dispose(): void {\n    if (this.isDisposed) return;\n    this.isDisposed = true;\n    \n    // Ensure interval is cleared first\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = undefined;\n    }\n    \n    // Unregister from ResourceManager\n    ResourceManager.unregister(this);\n    \n    // Clear animation\n    this.clear();\n    \n    // Ensure cursor is shown by this component\n    cursorManager.show(this.componentId);\n  }\n}\n\nexport function spinner(\n  text: string, \n  options?: SpinnerName | { spinner?: SpinnerName; color?: string; interval?: number }\n): Spinner {\n  const s = new Spinner(text, options);\n  s.start();\n  return s;\n}\n\n// Add pulse animation function for backward compatibility\nexport function pulse(text: string, options: { color?: string; duration?: number } = {}): string[] {\n  const frames: string[] = [];\n  const totalFrames = Math.floor((options.duration || 1000) / 100); // 100ms per frame\n  \n  for (let i = 0; i < totalFrames; i++) {\n    let styledText = text;\n    if (options.color) {\n      const style = new Style([], [], { force: true });\n      styledText = style.color(options.color).apply(text);\n    }\n    \n    frames.push(styledText);\n  }\n  \n  return frames;\n}","import { Style } from '../styles/style';\nimport { stripAnsi } from '../core/ansi';\n\nexport type BoxStyle = 'single' | 'double' | 'round' | 'bold' | 'ascii';\n\nexport interface BoxOptions {\n  padding?: number | { top?: number; right?: number; bottom?: number; left?: number };\n  margin?: number | { top?: number; right?: number; bottom?: number; left?: number };\n  borderStyle?: BoxStyle;\n  borderColor?: string | [number, number, number];\n  backgroundColor?: string | [number, number, number];\n  align?: 'left' | 'center' | 'right';\n  title?: string;\n  titleAlignment?: 'left' | 'center' | 'right';\n  width?: number;\n  wrap?: boolean;\n}\n\nconst boxStyles = {\n  single: {\n    topLeft: '┌',\n    topRight: '┐',\n    bottomLeft: '└',\n    bottomRight: '┘',\n    horizontal: '─',\n    vertical: '│'\n  },\n  double: {\n    topLeft: '╔',\n    topRight: '╗',\n    bottomLeft: '╚',\n    bottomRight: '╝',\n    horizontal: '═',\n    vertical: '║'\n  },\n  round: {\n    topLeft: '╭',\n    topRight: '╮',\n    bottomLeft: '╰',\n    bottomRight: '╯',\n    horizontal: '─',\n    vertical: '│'\n  },\n  bold: {\n    topLeft: '┏',\n    topRight: '┓',\n    bottomLeft: '┗',\n    bottomRight: '┛',\n    horizontal: '━',\n    vertical: '┃'\n  },\n  ascii: {\n    topLeft: '+',\n    topRight: '+',\n    bottomLeft: '+',\n    bottomRight: '+',\n    horizontal: '-',\n    vertical: '|'\n  }\n} as const;\n\nfunction getPadding(padding: BoxOptions['padding']): { top: number; right: number; bottom: number; left: number } {\n  if (typeof padding === 'number') {\n    return { top: padding, right: padding, bottom: padding, left: padding };\n  }\n  return {\n    top: padding?.top ?? 0,\n    right: padding?.right ?? 0,\n    bottom: padding?.bottom ?? 0,\n    left: padding?.left ?? 0\n  };\n}\n\nfunction wrapText(text: string, width: number): string[] {\n  const lines: string[] = [];\n  const words = text.split(' ');\n  let currentLine = '';\n\n  for (const word of words) {\n    const testLine = currentLine ? `${currentLine} ${word}` : word;\n    if (stripAnsi(testLine).length <= width) {\n      currentLine = testLine;\n    } else {\n      if (currentLine) lines.push(currentLine);\n      currentLine = word;\n    }\n  }\n  \n  if (currentLine) lines.push(currentLine);\n  return lines;\n}\n\nfunction alignText(text: string, width: number, align: 'left' | 'center' | 'right'): string {\n  const textLength = stripAnsi(text).length;\n  const totalPadding = width - textLength;\n  \n  if (totalPadding <= 0) return text;\n  \n  switch (align) {\n    case 'center': {\n      const leftPad = Math.floor(totalPadding / 2);\n      const rightPad = totalPadding - leftPad;\n      return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n    }\n    case 'right': {\n      return ' '.repeat(totalPadding) + text;\n    }\n    default:\n      return text + ' '.repeat(totalPadding);\n  }\n}\n\nexport function box(content: string, options: BoxOptions = {}): string {\n  const {\n    padding = 0,\n    margin = 0,\n    borderStyle = 'single',\n    borderColor,\n    backgroundColor,\n    align = 'left',\n    title,\n    titleAlignment = 'center',\n    width,\n    wrap = true\n  } = options;\n\n  const style = boxStyles[borderStyle];\n  const pad = getPadding(padding);\n  const mar = getPadding(margin);\n  \n  let lines = content.split('\\n');\n  \n  if (width && wrap) {\n    lines = lines.flatMap(line => wrapText(line, width - pad.left - pad.right - 2));\n  }\n  \n  const maxLineLength = Math.max(\n    ...lines.map(line => stripAnsi(line).length),\n    0\n  );\n  \n  // Calculate minimum width needed for the title (including spacing)\n  let titleWidth = 0;\n  if (title) {\n    const titleLen = stripAnsi(title).length;\n    if (titleLen > maxLineLength) {\n      // When title is longer than content, ensure at least 3 chars padding on each side\n      titleWidth = titleLen + 8; // 8 for \"─── title ───\"\n    } else {\n      titleWidth = titleLen + 4; // 4 for \"─ title ─\"\n    }\n  }\n  \n  // Content width should accommodate both content and title\n  const minContentWidth = Math.max(maxLineLength + pad.left + pad.right, titleWidth);\n  \n  const contentWidth = width ? Math.max(width - 2, titleWidth) : minContentWidth;\n  \n  const paddedLines = lines.map(line => {\n    const aligned = alignText(line, contentWidth - pad.left - pad.right, align);\n    return ' '.repeat(pad.left) + aligned + ' '.repeat(pad.right);\n  });\n  \n  for (let i = 0; i < pad.top; i++) {\n    paddedLines.unshift(' '.repeat(contentWidth));\n  }\n  \n  for (let i = 0; i < pad.bottom; i++) {\n    paddedLines.push(' '.repeat(contentWidth));\n  }\n  \n  let borderStyle_ = new Style();\n  if (borderColor) {\n    borderStyle_ = typeof borderColor === 'string' \n      ? borderStyle_.color(borderColor)\n      : borderStyle_.color(borderColor);\n  }\n  \n  let topBorder = style.topLeft + style.horizontal.repeat(contentWidth) + style.topRight;\n  \n  if (title) {\n    const titleLength = stripAnsi(title).length;\n    const availableSpace = contentWidth - titleLength - 2; // -2 for the spaces around title\n    \n    let leftPadding: string, rightPadding: string;\n    \n    switch (titleAlignment) {\n      case 'center': {\n        const leftSpaces = Math.ceil(availableSpace / 2);\n        const rightSpaces = availableSpace - leftSpaces;\n        leftPadding = style.horizontal.repeat(leftSpaces) + ' ';\n        rightPadding = ' ' + style.horizontal.repeat(rightSpaces);\n        break;\n      }\n      case 'left': {\n        leftPadding = ' ';\n        rightPadding = ' ' + style.horizontal.repeat(availableSpace);\n        break;\n      }\n      case 'right': {\n        leftPadding = style.horizontal.repeat(availableSpace) + ' ';\n        rightPadding = ' ';\n        break;\n      }\n      default: {\n        const defaultLeftSpaces = Math.floor(availableSpace / 2);\n        const defaultRightSpaces = availableSpace - defaultLeftSpaces;\n        leftPadding = style.horizontal.repeat(defaultLeftSpaces) + ' ';\n        rightPadding = ' ' + style.horizontal.repeat(defaultRightSpaces);\n      }\n    }\n    \n    topBorder = style.topLeft + leftPadding + title + rightPadding + style.topRight;\n  }\n  \n  const bottomBorder = style.bottomLeft + style.horizontal.repeat(contentWidth) + style.bottomRight;\n  \n  const boxLines: string[] = [];\n  \n  boxLines.push(borderStyle_.apply(topBorder));\n  \n  paddedLines.forEach(line => {\n    let fullLine = borderStyle_.apply(style.vertical) + line + borderStyle_.apply(style.vertical);\n    \n    if (backgroundColor) {\n      const bgStyle = typeof backgroundColor === 'string'\n        ? new Style().bgColor(backgroundColor)\n        : new Style().bgColor(backgroundColor);\n      fullLine = bgStyle.apply(fullLine);\n    }\n    \n    boxLines.push(fullLine);\n  });\n  \n  boxLines.push(borderStyle_.apply(bottomBorder));\n  \n  if (mar.top > 0) {\n    for (let i = 0; i < mar.top; i++) {\n      boxLines.unshift('');\n    }\n  }\n  \n  if (mar.bottom > 0) {\n    for (let i = 0; i < mar.bottom; i++) {\n      boxLines.push('');\n    }\n  }\n  \n  return boxLines.map(line => {\n    if (mar.left > 0 && line !== '') {\n      return ' '.repeat(mar.left) + line;\n    }\n    return line;\n  }).join('\\n');\n}\n\n// Add create alias for backward compatibility\nexport const create = box;\n\n// Export default for CommonJS compatibility\nexport default Object.assign(box, {\n  box,\n  create\n});","import { eraseLine } from '../core/ansi';\nimport { Style } from '../styles/style';\nimport { ResourceManager, Disposable } from '../core/resource-manager';\nimport { cursorManager } from '../core/cursor-manager';\nimport { safeExecute, safeDivide } from '../core/safe-utils';\nimport { InputValidator } from '../core/validators';\nimport { ValidationError, ConfigurationError, ErrorCode } from '../core/errors';\n\nexport interface ProgressBarOptions {\n  total?: number;\n  width?: number;\n  complete?: string;\n  incomplete?: string;\n  head?: string;\n  clear?: boolean;\n  renderThrottle?: number;\n  format?: string;\n  stream?: NodeJS.WriteStream;\n  barColor?: string | [number, number, number];\n  completeColor?: string | [number, number, number];\n}\n\nexport class ProgressBar implements Disposable {\n  private current = 0;\n  private startTime = Date.now();\n  private lastRender = 0;\n  private options: Required<ProgressBarOptions>;\n  private isDisposed = false;\n  private componentId: string;\n\n  constructor(options: ProgressBarOptions = {}) {\n    // Validate options\n    if (options.total !== undefined) {\n      if (typeof options.total !== 'number' || !Number.isFinite(options.total) || options.total < 0) {\n        throw new ConfigurationError(\n          'total must be a non-negative number',\n          ErrorCode.CONFIG_INVALID_OPTION,\n          { option: 'total', value: options.total }\n        );\n      }\n    }\n    \n    if (options.width !== undefined) {\n      const validation = InputValidator.validatePositiveNumber(options.width, 'width');\n      if (!validation.valid) {\n        throw new ConfigurationError(\n          validation.error!,\n          ErrorCode.CONFIG_INVALID_OPTION,\n          { option: 'width', value: options.width }\n        );\n      }\n    }\n    \n    if (options.renderThrottle !== undefined) {\n      const validation = InputValidator.validatePositiveNumber(options.renderThrottle, 'renderThrottle');\n      if (!validation.valid) {\n        throw new ConfigurationError(\n          validation.error!,\n          ErrorCode.CONFIG_INVALID_OPTION,\n          { option: 'renderThrottle', value: options.renderThrottle }\n        );\n      }\n    }\n    \n    if (options.barColor !== undefined) {\n      const validation = InputValidator.validateColor(options.barColor);\n      if (!validation.valid) {\n        throw new ConfigurationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { option: 'barColor', value: options.barColor }\n        );\n      }\n    }\n    \n    if (options.completeColor !== undefined) {\n      const validation = InputValidator.validateColor(options.completeColor);\n      if (!validation.valid) {\n        throw new ConfigurationError(\n          validation.error!,\n          ErrorCode.INVALID_COLOR_INPUT,\n          { option: 'completeColor', value: options.completeColor }\n        );\n      }\n    }\n    \n    this.options = {\n      total: 100,\n      width: 40,\n      complete: '█',\n      incomplete: '░',\n      head: '',\n      clear: false,\n      renderThrottle: 16,\n      format: ':bar :percent :etas',\n      stream: process.stdout,\n      barColor: '',\n      completeColor: '',\n      ...options\n    };\n    \n    // Generate unique component ID for cursor management\n    this.componentId = `progress-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n    \n    // Register with ResourceManager for automatic cleanup\n    ResourceManager.register(this);\n  }\n\n  tick(delta = 1, tokens?: Record<string, string>): void {\n    if (this.isDisposed) return;\n    \n    // Validate delta\n    if (typeof delta !== 'number' || !Number.isFinite(delta)) {\n      throw new ValidationError(\n        'Delta must be a finite number',\n        ErrorCode.INVALID_NUMBER_INPUT,\n        { delta }\n      );\n    }\n    \n    const oldCurrent = this.current;\n    this.current = Math.min(this.current + delta, this.options.total);\n    this.render(tokens, oldCurrent !== this.current);\n  }\n\n  update(current: number, tokens?: Record<string, string>): void {\n    if (this.isDisposed) return;\n    \n    // Validate current value\n    if (typeof current !== 'number' || !Number.isFinite(current)) {\n      throw new ValidationError(\n        'Current value must be a finite number',\n        ErrorCode.INVALID_NUMBER_INPUT,\n        { current }\n      );\n    }\n    \n    this.current = Math.max(0, Math.min(current, this.options.total));\n    this.render(tokens);\n  }\n\n  private render(tokens?: Record<string, string>, forceRender = false): void {\n    if (this.isDisposed) return;\n    \n    const now = Date.now();\n    if (!forceRender && this.options.renderThrottle > 0 && now - this.lastRender < this.options.renderThrottle && this.current < this.options.total) {\n      return;\n    }\n    this.lastRender = now;\n\n    // Ensure percent is between 0 and 1\n    const rawPercent = safeDivide(this.current, this.options.total);\n    const percent = Math.max(0, Math.min(1, rawPercent));\n    \n    const filledLength = Math.max(0, Math.floor(this.options.width * percent));\n    const emptyLength = Math.max(0, this.options.width - filledLength);\n\n    let filled = this.options.complete.repeat(Math.max(0, filledLength));\n    const empty = this.options.incomplete.repeat(Math.max(0, emptyLength));\n\n    if (this.options.head && filledLength > 0 && filledLength < this.options.width) {\n      filled = filled.slice(0, -1) + this.options.head;\n    }\n\n    if (this.options.barColor) {\n      const style = new Style();\n      filled = typeof this.options.barColor === 'string'\n        ? style.color(this.options.barColor).apply(filled)\n        : style.color(this.options.barColor).apply(filled);\n    }\n\n    const bar = filled + empty;\n    const elapsed = (now - this.startTime) / 1000;\n    const eta = percent > 0 ? (elapsed / percent - elapsed) : 0;\n\n    let output = this.options.format\n      .replace(':bar', bar)\n      .replace(':percent', `${Math.floor(percent * 100)}%`)\n      .replace(':current', String(this.current))\n      .replace(':total', String(this.options.total))\n      .replace(':elapsed', this.formatTime(elapsed))\n      .replace(':etas', eta > 0 ? this.formatTime(eta) : '')\n      .replace(':eta', this.formatTime(eta));\n\n    if (tokens) {\n      Object.entries(tokens).forEach(([key, value]) => {\n        output = output.replace(`:${key}`, value);\n      });\n    }\n\n    if (this.options.completeColor && percent === 1) {\n      const style = new Style();\n      output = typeof this.options.completeColor === 'string'\n        ? style.color(this.options.completeColor).apply(output)\n        : style.color(this.options.completeColor).apply(output);\n    }\n\n    safeExecute(() => {\n      // Hide cursor on first render using cursor manager\n      cursorManager.hide(this.componentId);\n      \n      this.options.stream.write('\\r' + eraseLine() + output);\n    }, undefined, () => {\n      // Handle stream errors gracefully\n      this.dispose();\n    });\n  }\n\n\n  private formatTime(seconds: number): string {\n    if (!isFinite(seconds) || seconds < 0) return '0:00';\n    \n    const hours = Math.floor(seconds / 3600);\n    const minutes = Math.floor((seconds % 3600) / 60);\n    const secs = Math.floor(seconds % 60);\n\n    if (hours > 0) {\n      return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n    }\n    return `${minutes}:${secs.toString().padStart(2, '0')}`;\n  }\n\n  complete(): void {\n    if (this.isDisposed) return;\n    \n    this.current = this.options.total;\n    this.render();\n    \n    try {\n      this.options.stream.write('\\n');\n      \n      // Show cursor using cursor manager\n      cursorManager.show(this.componentId);\n      \n      if (this.options.clear) {\n        this.options.stream.write('\\r' + eraseLine());\n      }\n    } catch (error) {\n      // Ignore stream errors during completion\n    }\n    \n    this.dispose();\n  }\n\n  getRenderString(): string {\n    const percent = safeDivide(this.current, this.options.total);\n    const filledLength = Math.max(0, Math.floor(this.options.width * percent));\n    const emptyLength = Math.max(0, this.options.width - filledLength);\n\n    let filled = this.options.complete.repeat(filledLength);\n    const empty = this.options.incomplete.repeat(emptyLength);\n\n    if (this.options.head && filledLength > 0 && filledLength < this.options.width) {\n      filled = filled.slice(0, -1) + this.options.head;\n    }\n\n    const bar = filled + empty;\n    const elapsed = (Date.now() - this.startTime) / 1000;\n    const eta = percent > 0 ? (elapsed / percent - elapsed) : 0;\n\n    return this.options.format\n      .replace(':bar', bar)\n      .replace(':percent', `${Math.floor(percent * 100)}%`)\n      .replace(':current', String(this.current))\n      .replace(':total', String(this.options.total))\n      .replace(':elapsed', this.formatTime(elapsed))\n      .replace(':etas', eta > 0 ? this.formatTime(eta) : '')\n      .replace(':eta', this.formatTime(eta));\n  }\n  \n  dispose(): void {\n    if (this.isDisposed) return;\n    this.isDisposed = true;\n    \n    // Unregister from ResourceManager\n    ResourceManager.unregister(this);\n    \n    // Show cursor using cursor manager\n    cursorManager.show(this.componentId);\n  }\n}\n\nexport interface MultiProgressOptions {\n  total?: number;\n  width?: number;\n  complete?: string;\n  incomplete?: string;\n  stream?: NodeJS.WriteStream;\n}\n\nexport class MultiProgress implements Disposable {\n  private bars: ProgressBar[] = [];\n  private options: Required<MultiProgressOptions>;\n  private isDisposed = false;\n\n  constructor(options: MultiProgressOptions = {}) {\n    this.options = {\n      total: 100,\n      width: 40,\n      complete: '█',\n      incomplete: '░',\n      stream: process.stdout,\n      ...options\n    };\n    \n    // Register with ResourceManager for automatic cleanup\n    ResourceManager.register(this);\n  }\n\n  newBar(format: string, options?: ProgressBarOptions): ProgressBar {\n    if (this.isDisposed) {\n      throw new Error('MultiProgress has been disposed');\n    }\n    \n    const bar = new ProgressBar({\n      format,\n      ...this.options,\n      ...options,\n      stream: this.options.stream\n    });\n    \n    this.bars.push(bar);\n    return bar;\n  }\n\n  render(): void {\n    if (this.isDisposed) return;\n    \n    safeExecute(() => {\n      // Move cursor up to overwrite previous bars\n      if (this.bars.length > 0) {\n        // Use relative cursor movement instead of absolute positioning\n        for (let i = 0; i < this.bars.length; i++) {\n          this.options.stream.write('\\u001b[1A'); // Move up one line\n        }\n      }\n\n      // Render each bar\n      this.bars.forEach((bar, index) => {\n        this.options.stream.write('\\r' + eraseLine() + bar.getRenderString());\n        if (index < this.bars.length - 1) {\n          this.options.stream.write('\\n');\n        }\n      });\n    }, undefined, () => {\n      // Handle stream errors\n      this.dispose();\n    });\n  }\n\n  update(): void {\n    this.render();\n  }\n  \n  dispose(): void {\n    if (this.isDisposed) return;\n    this.isDisposed = true;\n    \n    // Unregister from ResourceManager\n    ResourceManager.unregister(this);\n    \n    // Dispose all bars safely\n    const barsToDispose = [...this.bars];\n    this.bars = [];\n    \n    barsToDispose.forEach(bar => {\n      try {\n        bar.dispose();\n      } catch (error) {\n        console.warn('Error disposing progress bar:', error);\n      }\n    });\n  }\n}\n\nexport function progressBar(options?: ProgressBarOptions): ProgressBar {\n  return new ProgressBar(options);\n}\n\nexport function multiProgress(options?: MultiProgressOptions): MultiProgress {\n  return new MultiProgress(options);\n}\n\n// Add bar method for backward compatibility\nexport function bar(current: number, total: number, options?: ProgressBarOptions): string {\n  const barOptions = { ...options, total };\n  \n  // Create the bar string\n  const percent = total > 0 ? current / total : 0;\n  const width = barOptions.width || 40;\n  const filledLength = Math.max(0, Math.min(width, Math.floor(width * percent)));\n  const emptyLength = Math.max(0, width - filledLength);\n  \n  const complete = barOptions.complete || '█';\n  const incomplete = barOptions.incomplete || '░';\n  \n  return complete.repeat(filledLength) + incomplete.repeat(emptyLength);\n}","import { Style } from './styles/style';\nimport { Formatter, FormatterProxy } from './formatter';\n\nexport type TemplateFunction = (strings: TemplateStringsArray, ...values: any[]) => string;\n\nexport interface TemplateHelpers {\n  [key: string]: Style | TemplateFunction;\n}\n\nfunction parseStyleTags(text: string, helpers: TemplateHelpers): string {\n  // Parse from inside out to handle nesting\n  let result = text;\n  let changed = true;\n  \n  while (changed) {\n    changed = false;\n    const tagRegex = /\\{([^}]+)\\}([^{]*?)\\{\\/\\1\\}/g;\n    \n    result = result.replace(tagRegex, (fullMatch, tagName, content) => {\n      const helper = helpers[tagName];\n      \n      if (helper instanceof Style) {\n        changed = true;\n        return helper.apply(content);\n      } else if (typeof helper === 'function') {\n        changed = true;\n        return helper([content] as any);\n      }\n      \n      return fullMatch;\n    });\n  }\n\n  return result;\n}\n\nfunction parseInlineStyles(text: string, formatter: FormatterProxy): string {\n  // Match patterns like ${red`text`} or ${red.bold`text`}\n  const inlineRegex = /\\$\\{([^}]+)`([^`]*)`\\}/g;\n  \n  return text.replace(inlineRegex, (fullMatch, stylePath, content) => {\n    try {\n      const styles = stylePath.split('.');\n      \n      let currentStyle: any = formatter;\n      for (const style of styles) {\n        if (currentStyle && typeof currentStyle === 'object' && style in currentStyle) {\n          currentStyle = currentStyle[style];\n        } else if (currentStyle && typeof currentStyle === 'function') {\n          // Try to access property via proxy getter\n          currentStyle = currentStyle[style];\n        } else {\n          return fullMatch; // Return unchanged if style not found\n        }\n      }\n      \n      // If we have a valid style function, apply it\n      if (typeof currentStyle === 'function') {\n        return currentStyle(content);\n      }\n      \n      // If it's a Style object with apply method, use that\n      if (currentStyle && typeof currentStyle === 'object' && 'apply' in currentStyle && typeof currentStyle.apply === 'function') {\n        return currentStyle.apply(content);\n      }\n      \n      return fullMatch;\n    } catch (error) {\n      return fullMatch; // Return unchanged on error\n    }\n  });\n}\n\nexport function createTemplate(formatter: FormatterProxy, helpers: TemplateHelpers = {}): TemplateFunction {\n  // Always include default helpers, but allow overrides\n  const allHelpers = {\n    ...createDefaultHelpers(),\n    ...helpers\n  };\n  return (strings: TemplateStringsArray, ...values: any[]): string => {\n    let result = '';\n    const mutableStrings = [...strings]; // Create mutable copy\n    \n    // First, combine template strings and values\n    mutableStrings.forEach((str, i) => {\n      result += str;\n      if (i < values.length) {\n        const value = values[i];\n        \n        // Handle Style objects with apply method differently\n        if (value && typeof value === 'object' && 'apply' in value && typeof value.apply === 'function') {\n          // Check if the next string starts with a backtick (template literal)\n          const nextStr = mutableStrings[i + 1] || '';\n          const backtickMatch = nextStr.match(/^`([^`]*)`(.*)/);\n          if (backtickMatch) {\n            // Apply the style to the content and update the next string\n            result += value.apply(backtickMatch[1]);\n            mutableStrings[i + 1] = backtickMatch[2];\n            return;\n          }\n        }\n        \n        result += String(value);\n      }\n    });\n    \n    // Then parse inline styles and tags\n    result = parseInlineStyles(result, formatter);\n    result = parseStyleTags(result, allHelpers);\n    \n    return result;\n  };\n}\n\nexport function createTemplateTag(options: { formatter?: FormatterProxy; helpers?: TemplateHelpers } = {}): TemplateFunction {\n  const formatter = options.formatter || Formatter.create({ force: true }); // Force colors for template tags\n  const helpers = {\n    ...createDefaultHelpers(),\n    ...options.helpers\n  };\n  \n  return createTemplate(formatter, helpers);\n}\n\n// Add parse function for backward compatibility\nexport function parse(template: string, variables: Record<string, any> = {}): string {\n  const helpers = createDefaultHelpers();\n  \n  // Replace variables first\n  let result = template;\n  Object.entries(variables).forEach(([key, value]) => {\n    const regex = new RegExp(`{{${key}}}`, 'g');\n    result = result.replace(regex, String(value));\n  });\n  \n  // Then parse style tags\n  return parseStyleTags(result, helpers);\n}\n\nfunction createDefaultHelpers(): TemplateHelpers {\n  const style = new Style([], [], { force: true });\n  \n  return {\n    bold: style.bold,\n    dim: style.dim,\n    italic: style.italic,\n    underline: style.underline,\n    inverse: style.inverse,\n    hidden: style.hidden,\n    strikethrough: style.strikethrough,\n    \n    black: style.black,\n    red: style.red,\n    green: style.green,\n    yellow: style.yellow,\n    blue: style.blue,\n    magenta: style.magenta,\n    cyan: style.cyan,\n    white: style.white,\n    gray: style.gray,\n    \n    bgBlack: style.bgBlack,\n    bgRed: style.bgRed,\n    bgGreen: style.bgGreen,\n    bgYellow: style.bgYellow,\n    bgBlue: style.bgBlue,\n    bgMagenta: style.bgMagenta,\n    bgCyan: style.bgCyan,\n    bgWhite: style.bgWhite,\n    bgGray: style.bgGray,\n    \n    success: style.green.bold,\n    error: style.red.bold,\n    warning: style.yellow.bold,\n    info: style.blue.bold,\n    debug: style.gray.dim\n  };\n}\n\n// Export default for CommonJS compatibility\nexport default {\n  parse,\n  createTemplate,\n  createTemplateTag,\n  createDefaultHelpers\n};","import { Style } from '../styles/style';\n\nexport interface ThemeColors {\n  primary?: string | [number, number, number];\n  secondary?: string | [number, number, number];\n  success?: string | [number, number, number];\n  error?: string | [number, number, number];\n  warning?: string | [number, number, number];\n  info?: string | [number, number, number];\n  debug?: string | [number, number, number];\n  muted?: string | [number, number, number];\n  accent?: string | [number, number, number];\n  highlight?: string | [number, number, number];\n  [key: string]: string | [number, number, number] | undefined;\n}\n\nexport interface ThemeStyles {\n  heading1?: Style;\n  heading2?: Style;\n  heading3?: Style;\n  text?: Style;\n  bold?: Style;\n  italic?: Style;\n  underline?: Style;\n  code?: Style;\n  link?: Style;\n  quote?: Style;\n  list?: Style;\n  [key: string]: Style | undefined;\n}\n\nexport interface Theme {\n  name: string;\n  colors: ThemeColors;\n  styles: ThemeStyles;\n}\n\nexport const defaultTheme: Theme = {\n  name: 'default',\n  colors: {\n    primary: '#0066cc',\n    secondary: '#6c757d',\n    success: '#28a745',\n    error: '#dc3545',\n    warning: '#ffc107',\n    info: '#17a2b8',\n    debug: '#6c757d',\n    muted: '#999999',\n    accent: '#e91e63',\n    highlight: '#ffeb3b'\n  },\n  styles: {\n    heading1: new Style([], [], { force: true }).bold.underline,\n    heading2: new Style([], [], { force: true }).bold,\n    heading3: new Style([], [], { force: true }).underline,\n    text: new Style([], [], { force: true }),\n    bold: new Style([], [], { force: true }).bold,\n    italic: new Style([], [], { force: true }).italic,\n    underline: new Style([], [], { force: true }).underline,\n    code: new Style([], [], { force: true }).bgColor('#2d2d2d').color('#f8f8f2'),\n    link: new Style([], [], { force: true }).underline.color('#0066cc'),\n    quote: new Style([], [], { force: true }).italic.color('#6c757d'),\n    list: new Style([], [], { force: true }).color('#333333')\n  }\n};\n\nexport const themes: Record<string, Theme> = {\n  default: defaultTheme,\n  \n  dark: {\n    name: 'dark',\n    colors: {\n      primary: '#61afef',\n      secondary: '#abb2bf',\n      success: '#98c379',\n      error: '#e06c75',\n      warning: '#e5c07b',\n      info: '#56b6c2',\n      debug: '#5c6370',\n      muted: '#5c6370',\n      accent: '#c678dd',\n      highlight: '#d19a66'\n    },\n    styles: {\n      heading1: new Style([], [], { force: true }).bold.color('#61afef'),\n      heading2: new Style([], [], { force: true }).bold.color('#98c379'),\n      heading3: new Style([], [], { force: true }).color('#e5c07b'),\n      text: new Style([], [], { force: true }).color('#abb2bf'),\n      bold: new Style([], [], { force: true }).bold,\n      italic: new Style([], [], { force: true }).italic,\n      underline: new Style([], [], { force: true }).underline,\n      code: new Style([], [], { force: true }).bgColor('#282c34').color('#abb2bf'),\n      link: new Style([], [], { force: true }).underline.color('#61afef'),\n      quote: new Style([], [], { force: true }).italic.color('#5c6370'),\n      list: new Style([], [], { force: true }).color('#abb2bf')\n    }\n  },\n  \n  ocean: {\n    name: 'ocean',\n    colors: {\n      primary: '#0074d9',\n      secondary: '#39cccc',\n      success: '#2ecc40',\n      error: '#ff4136',\n      warning: '#ff851b',\n      info: '#7fdbff',\n      debug: '#b10dc9',\n      muted: '#aaaaaa',\n      accent: '#f012be',\n      highlight: '#ffdc00'\n    },\n    styles: {\n      heading1: new Style([], [], { force: true }).bold.color('#0074d9'),\n      heading2: new Style([], [], { force: true }).bold.color('#39cccc'),\n      heading3: new Style([], [], { force: true }).color('#7fdbff'),\n      text: new Style([], [], { force: true }),\n      bold: new Style([], [], { force: true }).bold,\n      italic: new Style([], [], { force: true }).italic,\n      underline: new Style([], [], { force: true }).underline,\n      code: new Style([], [], { force: true }).bgColor('#001f3f').color('#7fdbff'),\n      link: new Style([], [], { force: true }).underline.color('#0074d9'),\n      quote: new Style([], [], { force: true }).italic.color('#39cccc'),\n      list: new Style([], [], { force: true }).color('#0074d9')\n    }\n  },\n  \n  forest: {\n    name: 'forest',\n    colors: {\n      primary: '#228b22',\n      secondary: '#8b4513',\n      success: '#32cd32',\n      error: '#dc143c',\n      warning: '#ffa500',\n      info: '#4682b4',\n      debug: '#696969',\n      muted: '#808080',\n      accent: '#ff1493',\n      highlight: '#ffd700'\n    },\n    styles: {\n      heading1: new Style([], [], { force: true }).bold.color('#228b22'),\n      heading2: new Style([], [], { force: true }).bold.color('#32cd32'),\n      heading3: new Style([], [], { force: true }).color('#8b4513'),\n      text: new Style([], [], { force: true }),\n      bold: new Style([], [], { force: true }).bold,\n      italic: new Style([], [], { force: true }).italic,\n      underline: new Style([], [], { force: true }).underline,\n      code: new Style([], [], { force: true }).bgColor('#013220').color('#90ee90'),\n      link: new Style([], [], { force: true }).underline.color('#228b22'),\n      quote: new Style([], [], { force: true }).italic.color('#8b4513'),\n      list: new Style([], [], { force: true }).color('#228b22')\n    }\n  }\n};\n\n// Helper function to create theme proxy objects\nexport function create(colors: ThemeColors): any {\n  const style = new Style([], [], { force: true });\n  const proxy: any = {};\n  \n  // Add color methods\n  Object.entries(colors).forEach(([name, color]) => {\n    if (color) {\n      proxy[name] = (text: string) => style.color(color).apply(text);\n    }\n  });\n  \n  return proxy;\n}\n\nexport class ThemeManager {\n  private currentTheme: Theme;\n  private customThemes: Record<string, Theme> = {};\n\n  constructor(themeName: string = 'default') {\n    this.currentTheme = themes[themeName] || defaultTheme;\n  }\n\n  setTheme(themeName: string): void {\n    const theme = themes[themeName] || this.customThemes[themeName];\n    if (theme) {\n      this.currentTheme = theme;\n    } else {\n      throw new Error(`Theme '${themeName}' not found`);\n    }\n  }\n\n  getTheme(): Theme {\n    return this.currentTheme;\n  }\n\n  registerTheme(theme: Theme): void;\n  registerTheme(name: string, theme: Omit<Theme, 'name'>): void;\n  registerTheme(nameOrTheme: string | Theme, theme?: Omit<Theme, 'name'>): void {\n    if (typeof nameOrTheme === 'string' && theme) {\n      this.customThemes[nameOrTheme] = { name: nameOrTheme, ...theme };\n    } else if (typeof nameOrTheme === 'object' && 'name' in nameOrTheme) {\n      this.customThemes[nameOrTheme.name] = nameOrTheme;\n    } else {\n      throw new Error('Invalid arguments to registerTheme');\n    }\n  }\n\n  getColor(colorName: string): string | [number, number, number] | undefined {\n    return this.currentTheme.colors[colorName];\n  }\n\n  getStyle(styleName: string): Style | undefined {\n    return this.currentTheme.styles[styleName];\n  }\n\n  applyTheme(): Record<string, (...args: any[]) => any> {\n    const themedFormatters: Record<string, (...args: any[]) => any> = {};\n    \n    // Create themed color functions\n    Object.entries(this.currentTheme.colors).forEach(([name, color]) => {\n      if (color) {\n        themedFormatters[name] = (text: string) => {\n          const style = new Style([], [], { force: true });\n          return style.color(color).apply(text);\n        };\n      }\n    });\n    \n    // Create themed style functions\n    Object.entries(this.currentTheme.styles).forEach(([name, style]) => {\n      if (style) {\n        themedFormatters[name] = (text: string) => style.apply(text);\n      }\n    });\n    \n    return themedFormatters;\n  }\n\n  getCurrentTheme(): string {\n    return this.currentTheme.name;\n  }\n}\n\n// Export default for CommonJS compatibility\nexport default Object.assign(create, {\n  create,\n  ThemeManager,\n  themes,\n  defaultTheme\n});","import { Style } from './styles/style';\n\nexport type Condition = boolean | (() => boolean);\nexport type ConditionalStyle = [Condition, Style | string];\n\nexport interface ConditionalOptions {\n  defaultStyle?: Style;\n  fallback?: string;\n}\n\nexport class ConditionalFormatter {\n  private conditions: ConditionalStyle[] = [];\n  private options: ConditionalOptions;\n  public format: any;\n\n  constructor(condition: boolean, options?: ConditionalOptions);\n  constructor(options?: ConditionalOptions);\n  constructor(conditionOrOptions?: boolean | ConditionalOptions, optionsParam?: ConditionalOptions) {\n    let condition: boolean | undefined;\n    let options: ConditionalOptions;\n\n    if (typeof conditionOrOptions === 'boolean') {\n      condition = conditionOrOptions;\n      options = optionsParam || {};\n    } else {\n      options = conditionOrOptions || {};\n    }\n\n    this.options = {\n      defaultStyle: new Style(),\n      fallback: '',\n      ...options\n    };\n    \n    // Handle explicit undefined defaultStyle\n    if (options && typeof options === 'object' && 'defaultStyle' in options && options.defaultStyle === undefined) {\n      this.options.defaultStyle = undefined;\n    }\n\n    // If condition is provided, create a conditional formatter\n    if (condition !== undefined) {\n      this.format = conditional(condition, options);\n    } else {\n      // Create a format method that applies the configured conditions\n      this.format = (text: string) => this.formatText(text);\n    }\n  }\n\n  when(condition: Condition, style: Style | string): this {\n    this.conditions.push([condition, style]);\n    return this;\n  }\n  \n  elsif(condition: Condition, style: Style | string): this {\n    return this.when(condition, style);\n  }\n  \n  else(style: Style | string): this {\n    this.conditions.push([true, style]);\n    return this;\n  }\n\n  formatText(text: string): string {\n    for (const [condition, style] of this.conditions) {\n      let isTrue: boolean;\n      try {\n        isTrue = typeof condition === 'function' ? condition() : condition;\n      } catch (error) {\n        // If condition function throws, treat as false\n        isTrue = false;\n      }\n      \n      if (isTrue) {\n        if (typeof style === 'string') {\n          return style;\n        }\n        return style.apply(text);\n      }\n    }\n    \n    if (this.options.defaultStyle) {\n      return this.options.defaultStyle.apply(text);\n    }\n    \n    return this.options.fallback || text;\n  }\n}\n\nexport function conditional(): ConditionalFormatter;\nexport function conditional(condition: any, options?: ConditionalOptions): any;\nexport function conditional(condition?: any, options?: ConditionalOptions): any & { when: (...args: any[]) => any } {\n  // If no arguments provided, return a new ConditionalFormatter for chaining\n  if (arguments.length === 0) {\n    return new ConditionalFormatter(options);\n  }\n  \n  if (condition) {\n    const style = new Style([], [], { force: true, ...options });\n    \n    // Create a proxy that makes style getters callable\n    const proxy = new Proxy(style, {\n      get(target, prop) {\n        const value = target[prop as keyof Style];\n        \n        // If it's a Style getter, make it callable\n        if (value instanceof Style) {\n          return (text: string) => value.apply(text);\n        }\n        \n        // If it's a method, bind it\n        if (typeof value === 'function') {\n          return value.bind(target);\n        }\n        \n        return value;\n      }\n    });\n    \n    return proxy;\n  } else {\n    // For falsy values including null, return no-op proxy\n    return createNoOpProxy();\n  }\n}\n\n// Helper function to create a no-op proxy\nfunction createNoOpProxy(): any {\n  const createNoOpMethod = () => (text: string) => text;\n  \n  const proxy = new Proxy(createNoOpMethod(), {\n    get: (_target, prop) => {\n      // Common style method names\n      const styleMethods = [\n        'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'gray', 'black',\n        'bgRed', 'bgGreen', 'bgYellow', 'bgBlue', 'bgMagenta', 'bgCyan', 'bgWhite', 'bgGray', 'bgBlack',\n        'bold', 'dim', 'italic', 'underline', 'inverse', 'hidden', 'strikethrough',\n        'rgb', 'hex', 'bgRgb', 'bgHex', 'color', 'bgColor'\n      ];\n      \n      if (styleMethods.includes(String(prop))) {\n        return createNoOpMethod();\n      }\n      \n      // For apply method\n      if (prop === 'apply') {\n        return createNoOpMethod();\n      }\n      \n      // Return another proxy that maintains the chainable interface\n      return proxy;\n    },\n    apply: (_target, _thisArg, args) => args[0] || ''\n  });\n  return proxy;\n}\n\nexport interface LogLevel {\n  name: string;\n  value: number;\n  style: Style;\n  prefix?: string;\n}\n\nexport const logLevels: Record<string, LogLevel> = {\n  trace: { name: 'TRACE', value: 10, style: new Style().gray, prefix: '🔍' },\n  debug: { name: 'DEBUG', value: 20, style: new Style().cyan, prefix: '🐛' },\n  info: { name: 'INFO', value: 30, style: new Style().blue, prefix: 'ℹ️' },\n  warn: { name: 'WARN', value: 40, style: new Style().yellow, prefix: '⚠️' },\n  error: { name: 'ERROR', value: 50, style: new Style().red, prefix: '❌' },\n  fatal: { name: 'FATAL', value: 60, style: new Style().red.bold.inverse, prefix: '💀' }\n};\n\nexport class LogFormatter {\n  private minLevel: number;\n  private usePrefix: boolean;\n  private timestamp: boolean;\n\n  constructor(options: { minLevel?: string; usePrefix?: boolean; timestamp?: boolean } = {}) {\n    this.minLevel = logLevels[options.minLevel || 'info'].value;\n    this.usePrefix = options.usePrefix ?? true;\n    this.timestamp = options.timestamp ?? false;\n  }\n\n  format(level: string, message: string): string | null {\n    const logLevel = logLevels[level];\n    if (!logLevel || logLevel.value < this.minLevel) {\n      return null;\n    }\n\n    let output = '';\n    \n    if (this.timestamp) {\n      const time = new Date().toISOString();\n      output += new Style().gray.apply(`[${time}] `);\n    }\n    \n    if (this.usePrefix && logLevel.prefix) {\n      output += logLevel.prefix + ' ';\n    }\n    \n    output += logLevel.style.apply(`[${logLevel.name}]`) + ' ';\n    output += message;\n    \n    return output;\n  }\n\n  trace(message: string): string | null {\n    return this.format('trace', message);\n  }\n\n  debug(message: string): string | null {\n    return this.format('debug', message);\n  }\n\n  info(message: string): string | null {\n    return this.format('info', message);\n  }\n\n  warn(message: string): string | null {\n    return this.format('warn', message);\n  }\n\n  error(message: string): string | null {\n    return this.format('error', message);\n  }\n\n  fatal(message: string): string | null {\n    return this.format('fatal', message);\n  }\n}\n\nexport function createLogFormatter(options?: ConstructorParameters<typeof LogFormatter>[0]): LogFormatter {\n  return new LogFormatter(options);\n}\n\nexport interface StatusFormatter {\n  success(text: string): string;\n  error(text: string): string;\n  warning(text: string): string;\n  info(text: string): string;\n  pending(text: string): string;\n  skipped(text: string): string;\n}\n\nexport function createStatusFormatter(): StatusFormatter {\n  return {\n    success: (text: string) => new Style().green.apply('✓ ') + text,\n    error: (text: string) => new Style().red.apply('✗ ') + text,\n    warning: (text: string) => new Style().yellow.apply('⚠ ') + text,\n    info: (text: string) => new Style().blue.apply('ℹ ') + text,\n    pending: (text: string) => new Style().gray.apply('◌ ') + text,\n    skipped: (text: string) => new Style().gray.dim.apply('⊘ ') + text\n  };\n}\n\n// Helper function for color conditional\nexport function color(input: string, fallback?: string | Style): string {\n  // If input contains ANSI codes, return it, otherwise return fallback\n  if (input && typeof input === 'string' && input.includes('\\u001B[')) {\n    return input;\n  }\n  \n  // Handle fallback - if it's a Style object, apply it to the input\n  if (fallback && typeof fallback === 'object' && 'apply' in fallback) {\n    return (fallback as Style).apply(input);\n  }\n  \n  return (fallback as string) || input;\n}\n\n// Add when method to conditional function for chaining API\nconditional.when = function(condition: Condition | (() => Promise<boolean>), text: string, style?: Style | string): string | Promise<string> {\n  try {\n    if (typeof condition === 'function') {\n      const result = condition();\n      // Handle async functions that return promises\n      if (result && typeof result === 'object' && 'then' in result && typeof result.then === 'function') {\n        return (result as Promise<boolean>).then((isTrue: boolean) => {\n          if (isTrue && style) {\n            if (typeof style === 'string') {\n              return style;\n            }\n            return style.apply(text);\n          }\n          return text;\n        }).catch(() => {\n          // If async condition rejects, return text unchanged\n          return text;\n        });\n      }\n      // Handle sync functions\n      const isTrue = result as boolean;\n      if (isTrue && style) {\n        if (typeof style === 'string') {\n          return style;\n        }\n        return style.apply(text);\n      }\n      return text;\n    }\n    \n    // Handle boolean conditions\n    const isTrue = condition as boolean;\n    if (isTrue && style) {\n      if (typeof style === 'string') {\n        return style;\n      }\n      return style.apply(text);\n    }\n    return text;\n  } catch (error) {\n    // If condition throws, return text unchanged\n    return text;\n  }\n};","import { Formatter, FormatterAPI } from './formatter';\nimport { Style, StyleOptions } from './styles/style';\nimport { terminal, getTerminalInfo, TerminalInfo } from './utils/terminal';\nimport { gradientEnhanced as gradient, rainbow, GradientOptions } from './effects/gradient';\nimport { \n  animate, \n  Animation, \n  AnimationType, \n  AnimationOptions,\n  spinner,\n  Spinner,\n  SpinnerName,\n  spinners\n} from './effects/animation';\nimport { box, BoxOptions, BoxStyle } from './effects/box';\nimport { \n  progressBar, \n  ProgressBar, \n  ProgressBarOptions,\n  multiProgress,\n  MultiProgress,\n  MultiProgressOptions,\n  bar\n} from './effects/progress';\nimport { createTemplateTag, TemplateFunction, TemplateHelpers, parse as templateParse } from './template';\nimport { \n  Theme, \n  ThemeManager, \n  themes, \n  defaultTheme,\n  ThemeColors,\n  ThemeStyles,\n  create as themeCreate\n} from './themes/theme';\nimport {\n  conditional,\n  ConditionalFormatter,\n  ConditionalOptions,\n  createLogFormatter,\n  LogFormatter,\n  createStatusFormatter,\n  StatusFormatter,\n  logLevels,\n  color as conditionalColor\n} from './conditional';\nimport { stripAnsi } from './core/ansi';\nimport { cacheManager } from './core/cache-manager';\n\nconst formatter = Formatter.create() as FormatterAPI;\n\nconst termstyle: FormatterAPI & {\n  Style: typeof Style;\n  Formatter: typeof Formatter;\n  \n  gradient: typeof gradient;\n  rainbow: typeof rainbow;\n  \n  animate: typeof animate;\n  Animation: typeof Animation;\n  spinner: typeof spinner;\n  Spinner: typeof Spinner;\n  spinners: typeof spinners;\n  \n  box: typeof box;\n  \n  progressBar: typeof progressBar;\n  ProgressBar: typeof ProgressBar;\n  multiProgress: typeof multiProgress;\n  MultiProgress: typeof MultiProgress;\n  \n  template: TemplateFunction;\n  createTemplate: typeof createTemplateTag;\n  templateParse: typeof templateParse;\n  \n  ThemeManager: typeof ThemeManager;\n  themes: typeof themes;\n  \n  conditional: typeof conditional;\n  ConditionalFormatter: typeof ConditionalFormatter;\n  createLogFormatter: typeof createLogFormatter;\n  LogFormatter: typeof LogFormatter;\n  createStatusFormatter: typeof createStatusFormatter;\n  logLevels: typeof logLevels;\n  conditionalColor: typeof conditionalColor;\n  \n  terminal: typeof terminal;\n  getTerminalInfo: typeof getTerminalInfo;\n  \n  strip: typeof stripAnsi;\n  stripAnsi: typeof stripAnsi;\n  \n  create: typeof Formatter.create;\n  \n  supportsColor: boolean;\n  level: 0 | 1 | 2 | 3;\n} = Object.assign(formatter, {\n  Style,\n  Formatter,\n  \n  gradient,\n  rainbow,\n  \n  animate,\n  Animation,\n  spinner,\n  Spinner,\n  spinners,\n  \n  box,\n  \n  progressBar,\n  ProgressBar,\n  multiProgress,\n  MultiProgress,\n  bar,\n  \n  template: createTemplateTag(),\n  createTemplate: createTemplateTag,\n  templateParse,\n  \n  ThemeManager,\n  themes,\n  \n  conditional,\n  ConditionalFormatter,\n  createLogFormatter,\n  LogFormatter,\n  createStatusFormatter,\n  logLevels,\n  conditionalColor,\n  \n  terminal,\n  getTerminalInfo,\n  \n  strip: stripAnsi,\n  stripAnsi,\n  \n  create: Formatter.create,\n  \n  get supportsColor() {\n    return terminal().supportsColor;\n  },\n  \n  get level() {\n    return terminal().colorLevel;\n  }\n});\n\n// Create a style instance for easy access\nconst style = new Style();\n\nexport default termstyle;\n\n// Export classes and functions\nexport {\n  Style,\n  Formatter,\n  style,\n  gradient,\n  rainbow,\n  bar,\n  themeCreate,\n  animate,\n  Animation,\n  spinner,\n  Spinner,\n  spinners,\n  box,\n  progressBar,\n  ProgressBar,\n  multiProgress,\n  MultiProgress,\n  createTemplateTag,\n  templateParse,\n  ThemeManager,\n  themes,\n  defaultTheme,\n  conditional,\n  ConditionalFormatter,\n  createLogFormatter,\n  LogFormatter,\n  createStatusFormatter,\n  logLevels,\n  conditionalColor,\n  terminal,\n  getTerminalInfo,\n  stripAnsi,\n  cacheManager\n};\n\n// Export types separately\nexport type {\n  StyleOptions,\n  FormatterAPI,\n  GradientOptions,\n  AnimationType,\n  AnimationOptions,\n  SpinnerName,\n  BoxOptions,\n  BoxStyle,\n  ProgressBarOptions,\n  MultiProgressOptions,\n  TemplateFunction,\n  TemplateHelpers,\n  Theme,\n  ThemeColors,\n  ThemeStyles,\n  ConditionalOptions,\n  StatusFormatter,\n  TerminalInfo\n};"],"mappings":"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","names":["ESC","RESET","ansiCode","code","ansiCodes","rgb","r","g","b","bgRgb","ansi256","code","bgAnsi256","hexToRgb","hex","cleanHex","char","rgbToAnsi256","index","ansiR","ansiG","ansiB","stripAnsi","str","ansiColorPattern","ansiControlPattern","result","i","eraseLine","ESC","hideCursor","ESC","showCursor","release","getIsCI","getColorLevel","_a","_b","currentEnv","osRelease","majorVersion","buildVersion","getTerminalInfo","_c","colorLevel","columns","rows","terminalInfo","terminalInfoTimestamp","resizeListener","TERMINAL_INFO_TTL","terminal","now","updateTerminalInfo","resizeListener","updateTerminalInfo","InputValidator","input","inputArray","warnings","validated","i","value","r","g","b","trimmed","rgbMatch","allowNegative","min","clamped","wasClamped","type","validTypes","normalized","found","t","text","converted","hasControlChars","hasAnsiCodes","isEmpty","colors","validColors","c","results","errors","skippedCount","result","w","name","max","numberResult","preserveAnsi","sanitized","TermStyleError","errorDetails","message","s","ValidationError","code","details","AnimationError","TermStyleError","message","code","details","ConfigurationError","ErrorRecovery","operation","fallback","logError","error","maxAttempts","initialDelay","lastError","attempt","delay","resolve","fn","errorHandler","args","result","defaultValue","ErrorContext","key","value","context","keys","LRUCacheOptimized","capacity","key","value","firstKey","callback","CacheManager","_CacheManager","LRUCacheOptimized","key","cached","value","hex","firstKey","type","stats","total","cacheManager","colorNames","ColorProcessor","input","key","cached","cacheManager","result","h","s","l","r","g","b","name","hex","num","trimmed","hexToRgb","rgbMatch","hslMatch","c","x","m","rIndex","gIndex","bIndex","Style","_Style","codes","resetCodes","options","terminal","code","resetCode","newCodes","newResetCodes","codeNum","isForegroundColor","isBackgroundColor","indicesToRemove","i","existingCode","existingCodeNum","index","resetIndex","text","validation","InputValidator","validatedText","openCodes","ansiCode","closeCodes","ansiCodes","color","level","basicColors","colorLower","r","g","b","ColorProcessor","rgb","rgbToAnsi256","ansi256","basicBgColors","bgAnsi256","bgRgb","brightness","closestColor","hex","Formatter","_Formatter","options","Style","style","formatter","args","target","prop","newStyle","result","strings","values","str","i","text","stripAnsi","StringBuilder","_StringBuilder","initial","value","str","index","current","codes","text","openCodes","closeCodes","builder","code","i","StringBuilderPool","fn","rgbToBasic","r","g","b","convertColorInput","color","ColorProcessor","interpolateLinear","start","end","factor","rgbToHsv","max","min","delta","h","s","v","hsvToRgb","i","f","p","q","t","interpolateHsv","spin","h1Start","s1","v1","h2Start","s2","v2","h1","h2","getGradientCacheKey","text","colors","options","keyBuilder","StringBuilder","c","hash","optimizedGradientBase","textValidation","InputValidator","validatedText","termInfo","terminal","colorValidation","validColors","vc","rgb","Style","chars","cacheKey","cached","cacheManager","colorStops","segments","charsPerSegment","builder","colorReset","colorLevel","useHsvInterpolation","char","segment","segmentProgress","startColor","endColor","colorIndex","basicColor","result","gradientBase","gradientWithLinear","args","colors","text","options","gradientBase","rainbow","args","colors","text","options","ErrorRecovery","gradientBase","ResourceManager","resource","wasDisposing","resources","error","cleanup","cleanupExecuted","safeCleanup","reason","safeDivide","a","b","defaultValue","result","safeExecute","operation","fallback","errorHandler","error","CursorManager","_CursorManager","componentId","safeExecute","hideCursor","showCursor","cursorManager","Animation","text","type","options","textValidation","InputValidator","AnimationError","durationValidation","intervalValidation","iterationsValidation","ResourceManager","cursorManager","frame","iteration","totalFrames","progress","safeExecute","eraseLine","intensity","color","styled","Style","offset","visible","chars","opacity","animate","animation","spinners","Spinner","spinnerOrOptions","interval","_a","_b","spinnerName","finalInterval","spinner","finalText","_color","s","boxStyles","getPadding","padding","wrapText","text","width","lines","words","currentLine","word","testLine","stripAnsi","alignText","align","textLength","totalPadding","leftPad","rightPad","box","content","options","margin","borderStyle","borderColor","backgroundColor","title","titleAlignment","wrap","style","pad","mar","line","maxLineLength","titleWidth","titleLen","minContentWidth","contentWidth","paddedLines","aligned","i","borderStyle_","Style","topBorder","titleLength","availableSpace","leftPadding","rightPadding","leftSpaces","rightSpaces","defaultLeftSpaces","defaultRightSpaces","bottomBorder","boxLines","fullLine","create","box_default","ProgressBar","options","ConfigurationError","validation","InputValidator","ResourceManager","delta","tokens","ValidationError","oldCurrent","current","forceRender","now","rawPercent","safeDivide","percent","filledLength","emptyLength","filled","empty","style","Style","bar","elapsed","eta","output","key","value","safeExecute","cursorManager","eraseLine","seconds","hours","minutes","secs","MultiProgress","format","i","index","barsToDispose","error","progressBar","multiProgress","total","barOptions","width","complete","incomplete","parseStyleTags","text","helpers","result","changed","tagRegex","fullMatch","tagName","content","helper","Style","parseInlineStyles","formatter","inlineRegex","stylePath","styles","currentStyle","style","createTemplate","allHelpers","createDefaultHelpers","strings","values","mutableStrings","str","i","value","backtickMatch","createTemplateTag","options","Formatter","parse","template","variables","key","regex","defaultTheme","Style","themes","create","colors","style","proxy","name","color","text","ThemeManager","themeName","theme","nameOrTheme","colorName","styleName","themedFormatters","theme_default","ConditionalFormatter","conditionOrOptions","optionsParam","condition","options","Style","conditional","text","style","isTrue","target","prop","value","createNoOpProxy","createNoOpMethod","proxy","_target","_thisArg","args","logLevels","LogFormatter","level","message","logLevel","output","time","createLogFormatter","createStatusFormatter","color","input","fallback","result","formatter","Formatter","termstyle","Style","gradientWithLinear","rainbow","animate","Animation","spinner","Spinner","spinners","box","progressBar","ProgressBar","multiProgress","MultiProgress","bar","createTemplateTag","parse","ThemeManager","themes","conditional","ConditionalFormatter","createLogFormatter","LogFormatter","createStatusFormatter","logLevels","color","terminal","getTerminalInfo","stripAnsi","style","index_default"]}