silvery 0.17.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/UPNG-AVSMjiFE.mjs +5076 -0
  2. package/dist/UPNG-AVSMjiFE.mjs.map +1 -0
  3. package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs +6 -0
  4. package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs.map +1 -0
  5. package/dist/animation-C_PTO0uH.mjs +304 -0
  6. package/dist/animation-C_PTO0uH.mjs.map +1 -0
  7. package/dist/ansi-CXLE_pt1.mjs +71 -0
  8. package/dist/ansi-CXLE_pt1.mjs.map +1 -0
  9. package/dist/ansi-zmNzgkPB.d.mts +49 -0
  10. package/dist/ansi-zmNzgkPB.d.mts.map +1 -0
  11. package/dist/apng-DCWY913R.mjs +3 -0
  12. package/dist/apng-ENBAJk-H.mjs +70 -0
  13. package/dist/apng-ENBAJk-H.mjs.map +1 -0
  14. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  15. package/dist/backend-CkIkIHR-.mjs +13396 -0
  16. package/dist/backend-CkIkIHR-.mjs.map +1 -0
  17. package/dist/backends-CkvbG3js.mjs +1181 -0
  18. package/dist/backends-CkvbG3js.mjs.map +1 -0
  19. package/dist/backends-CyJqNLeK.mjs +3 -0
  20. package/dist/chunk-BSw8zbkd.mjs +37 -0
  21. package/dist/cli-B-k7Bm56.mjs +4 -0
  22. package/dist/context-QreF3UHr.mjs +64 -0
  23. package/dist/context-QreF3UHr.mjs.map +1 -0
  24. package/dist/derive-D7bFJdfU.d.mts +28 -0
  25. package/dist/derive-D7bFJdfU.d.mts.map +1 -0
  26. package/dist/devtools-CscuKaDK.mjs +89 -0
  27. package/dist/devtools-CscuKaDK.mjs.map +1 -0
  28. package/dist/devtools-D4oGc6LY.mjs +2 -0
  29. package/dist/eta-DLiVPaSD.mjs +110 -0
  30. package/dist/eta-DLiVPaSD.mjs.map +1 -0
  31. package/dist/flexily-zero-adapter-DmG4Ge8t.mjs +3376 -0
  32. package/dist/flexily-zero-adapter-DmG4Ge8t.mjs.map +1 -0
  33. package/dist/flexily-zero-adapter-GHwEW11s.mjs +2 -0
  34. package/dist/gif-BaJNREpP.mjs +3 -0
  35. package/dist/gif-Bp6fIyN3.mjs +73 -0
  36. package/dist/gif-Bp6fIyN3.mjs.map +1 -0
  37. package/dist/gifenc-GiVCZ9-3.mjs +730 -0
  38. package/dist/gifenc-GiVCZ9-3.mjs.map +1 -0
  39. package/dist/image-Dx7gYjkq.mjs +346 -0
  40. package/dist/image-Dx7gYjkq.mjs.map +1 -0
  41. package/dist/index-CBcSpGSM.d.mts +3416 -0
  42. package/dist/index-CBcSpGSM.d.mts.map +1 -0
  43. package/dist/index-DCVL3jHo.d.mts +634 -0
  44. package/dist/index-DCVL3jHo.d.mts.map +1 -0
  45. package/dist/index-p-wBs_wH.d.mts +175 -0
  46. package/dist/index-p-wBs_wH.d.mts.map +1 -0
  47. package/dist/index.d.mts +7296 -0
  48. package/dist/index.d.mts.map +1 -0
  49. package/dist/index.mjs +9399 -0
  50. package/dist/index.mjs.map +1 -0
  51. package/dist/key-mapping-BsUHe_nk.mjs +3 -0
  52. package/dist/key-mapping-DsyfLEdC.mjs +132 -0
  53. package/dist/key-mapping-DsyfLEdC.mjs.map +1 -0
  54. package/dist/layout-engine-B3dsnVLU.mjs +50 -0
  55. package/dist/layout-engine-B3dsnVLU.mjs.map +1 -0
  56. package/dist/layout-engine-D_lSR4i9.mjs +2 -0
  57. package/dist/multi-progress-C0-rkn86.d.mts +180 -0
  58. package/dist/multi-progress-C0-rkn86.d.mts.map +1 -0
  59. package/dist/multi-progress-CQVB9lES.mjs +219 -0
  60. package/dist/multi-progress-CQVB9lES.mjs.map +1 -0
  61. package/dist/node-Dedx-6xF.mjs +1085 -0
  62. package/dist/node-Dedx-6xF.mjs.map +1 -0
  63. package/dist/pipeline-DDOPrjuY.mjs +4387 -0
  64. package/dist/pipeline-DDOPrjuY.mjs.map +1 -0
  65. package/dist/progress-bar-COPSBlT9.mjs +155 -0
  66. package/dist/progress-bar-COPSBlT9.mjs.map +1 -0
  67. package/dist/reconciler-2lp5VXK7.mjs +16506 -0
  68. package/dist/reconciler-2lp5VXK7.mjs.map +1 -0
  69. package/dist/render-string-BXvxTg5P.mjs +201 -0
  70. package/dist/render-string-BXvxTg5P.mjs.map +1 -0
  71. package/dist/render-string-hvfpVtoP.mjs +2 -0
  72. package/dist/resvg-js-V6oMi8CY.mjs +203 -0
  73. package/dist/resvg-js-V6oMi8CY.mjs.map +1 -0
  74. package/dist/runtime-BjDHNTxJ.mjs +8723 -0
  75. package/dist/runtime-BjDHNTxJ.mjs.map +1 -0
  76. package/dist/runtime.d.mts +2 -0
  77. package/dist/runtime.mjs +3 -0
  78. package/dist/spinner-Cgej6Vnb.d.mts +127 -0
  79. package/dist/spinner-Cgej6Vnb.d.mts.map +1 -0
  80. package/dist/spinner-DSByknyx.mjs +298 -0
  81. package/dist/spinner-DSByknyx.mjs.map +1 -0
  82. package/dist/src-9B5k0JmY.mjs +1629 -0
  83. package/dist/src-9B5k0JmY.mjs.map +1 -0
  84. package/dist/src-C9f3hiVG.mjs +3620 -0
  85. package/dist/src-C9f3hiVG.mjs.map +1 -0
  86. package/dist/src-fJVbhdn-.mjs +816 -0
  87. package/dist/src-fJVbhdn-.mjs.map +1 -0
  88. package/dist/theme.d.mts +115 -0
  89. package/dist/theme.d.mts.map +1 -0
  90. package/dist/theme.mjs +8 -0
  91. package/dist/theme.mjs.map +1 -0
  92. package/dist/types-Bhj5QkIQ.mjs +13 -0
  93. package/dist/types-Bhj5QkIQ.mjs.map +1 -0
  94. package/dist/types-CDgkE-Rw.d.mts +241 -0
  95. package/dist/types-CDgkE-Rw.d.mts.map +1 -0
  96. package/dist/ui/animation.d.mts +2 -0
  97. package/dist/ui/animation.mjs +2 -0
  98. package/dist/ui/ansi.d.mts +2 -0
  99. package/dist/ui/ansi.mjs +2 -0
  100. package/dist/ui/cli.d.mts +5 -0
  101. package/dist/ui/cli.mjs +7 -0
  102. package/dist/ui/display.d.mts +35 -0
  103. package/dist/ui/display.d.mts.map +1 -0
  104. package/dist/ui/display.mjs +123 -0
  105. package/dist/ui/display.mjs.map +1 -0
  106. package/dist/ui/image.d.mts +2 -0
  107. package/dist/ui/image.mjs +2 -0
  108. package/dist/ui/input.d.mts +184 -0
  109. package/dist/ui/input.d.mts.map +1 -0
  110. package/dist/ui/input.mjs +285 -0
  111. package/dist/ui/input.mjs.map +1 -0
  112. package/dist/ui/progress.d.mts +249 -0
  113. package/dist/ui/progress.d.mts.map +1 -0
  114. package/dist/ui/progress.mjs +858 -0
  115. package/dist/ui/progress.mjs.map +1 -0
  116. package/dist/ui/react.d.mts +280 -0
  117. package/dist/ui/react.d.mts.map +1 -0
  118. package/dist/ui/react.mjs +413 -0
  119. package/dist/ui/react.mjs.map +1 -0
  120. package/dist/ui/utils.d.mts +86 -0
  121. package/dist/ui/utils.d.mts.map +1 -0
  122. package/dist/ui/utils.mjs +2 -0
  123. package/dist/ui/wrappers.d.mts +3 -0
  124. package/dist/ui/wrappers.mjs +2 -0
  125. package/dist/ui.d.mts +6 -0
  126. package/dist/ui.mjs +7 -0
  127. package/dist/useLatest-BMIYXd6e.d.mts +154 -0
  128. package/dist/useLatest-BMIYXd6e.d.mts.map +1 -0
  129. package/dist/useLayout-BG2cGl15.mjs +139 -0
  130. package/dist/useLayout-BG2cGl15.mjs.map +1 -0
  131. package/dist/with-text-input-CmHf_9d6.d.mts +284 -0
  132. package/dist/with-text-input-CmHf_9d6.d.mts.map +1 -0
  133. package/dist/wrapper-Dqh0zi2W.mjs +3527 -0
  134. package/dist/wrapper-Dqh0zi2W.mjs.map +1 -0
  135. package/dist/wrappers-hhL8EQ_n.mjs +810 -0
  136. package/dist/wrappers-hhL8EQ_n.mjs.map +1 -0
  137. package/dist/yoga-adapter-BJ9SOhTY.mjs +245 -0
  138. package/dist/yoga-adapter-BJ9SOhTY.mjs.map +1 -0
  139. package/dist/yoga-adapter-Daq6-dw1.mjs +2 -0
  140. package/package.json +48 -75
  141. package/CHANGELOG.md +0 -319
  142. package/dist/chalk.js +0 -4
  143. package/dist/index.js +0 -270
  144. package/dist/ink.js +0 -142
  145. package/dist/runtime.js +0 -135
  146. package/dist/theme.js +0 -7
  147. package/dist/ui/animation.js +0 -3
  148. package/dist/ui/ansi.js +0 -3
  149. package/dist/ui/cli.js +0 -9
  150. package/dist/ui/display.js +0 -4
  151. package/dist/ui/image.js +0 -4
  152. package/dist/ui/input.js +0 -3
  153. package/dist/ui/progress.js +0 -9
  154. package/dist/ui/react.js +0 -4
  155. package/dist/ui/utils.js +0 -3
  156. package/dist/ui/wrappers.js +0 -15
  157. package/dist/ui.js +0 -18
  158. package/src/index.ts +0 -73
  159. package/src/runtime.ts +0 -4
  160. package/src/theme.ts +0 -4
  161. package/src/ui/animation.ts +0 -2
  162. package/src/ui/ansi.ts +0 -2
  163. package/src/ui/cli.ts +0 -3
  164. package/src/ui/display.ts +0 -2
  165. package/src/ui/image.ts +0 -2
  166. package/src/ui/input.ts +0 -2
  167. package/src/ui/progress.ts +0 -2
  168. package/src/ui/react.ts +0 -2
  169. package/src/ui/utils.ts +0 -2
  170. package/src/ui/wrappers.ts +0 -2
  171. package/src/ui.ts +0 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-9B5k0JmY.mjs","names":["CSI","ESC","ESC","ESC","BEL","normalizeHexChannel"],"sources":["../packages/ansi/src/detection.ts","../packages/ansi/src/sgr-codes.ts","../packages/ansi/src/utils.ts","../packages/ansi/src/color-maps.ts","../packages/ansi/src/terminal-control.ts","../packages/color/src/color.ts","../packages/color/src/contrast.ts","../packages/color/src/index.ts","../packages/ansi/src/style/colors.ts","../packages/ansi/src/style/style.ts","../packages/ansi/src/style/mixed-proxy.ts","../packages/ansi/src/theme/derive.ts","../packages/ansi/src/theme/default-palettes.ts","../packages/ansi/src/theme/types.ts","../packages/ansi/src/osc-palette.ts","../packages/ansi/src/osc-colors.ts","../packages/ansi/src/theme/detect.ts","../packages/ansi/src/color-scheme.ts","../packages/ansi/src/index.ts"],"sourcesContent":["/**\n * Terminal capability detection.\n *\n * Detects:\n * - Cursor control (can reposition cursor)\n * - Input capability (can read raw keystrokes)\n * - Color level (basic, 256, truecolor)\n * - Unicode support (can render unicode symbols)\n * - Extended underline support (curly, dotted, etc)\n * - Terminal capabilities profile (TerminalCaps)\n */\n\nimport type { ColorLevel } from \"./types\"\n\n// =============================================================================\n// Cursor Detection\n// =============================================================================\n\n/**\n * Detect if terminal supports cursor control (repositioning).\n * Returns false for dumb terminals and piped output.\n */\nexport function detectCursor(stdout: NodeJS.WriteStream): boolean {\n // Not a TTY - no cursor control\n if (!stdout.isTTY) return false\n\n // Dumb terminal - no cursor control\n if (process.env.TERM === \"dumb\") return false\n\n return true\n}\n\n// =============================================================================\n// Input Detection\n// =============================================================================\n\n/**\n * Detect if terminal can read raw keystrokes.\n * Requires stdin to be a TTY with raw mode support.\n */\nexport function detectInput(stdin: NodeJS.ReadStream): boolean {\n // Not a TTY - no raw input\n if (!stdin.isTTY) return false\n\n // Check if setRawMode is available\n return typeof stdin.setRawMode === \"function\"\n}\n\n// =============================================================================\n// Color Detection\n// =============================================================================\n\n/**\n * Known CI environments that may not support colors well.\n */\nconst CI_ENVS = [\"CI\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"JENKINS_URL\", \"BUILDKITE\", \"CIRCLECI\", \"TRAVIS\"]\n\n/**\n * Detect color level supported by terminal.\n * Returns null if no color support.\n *\n * Checks (in order):\n * 1. NO_COLOR env var - forces no color\n * 2. FORCE_COLOR env var - forces color level\n * 3. COLORTERM=truecolor - truecolor support\n * 4. TERM patterns - detect from terminal type\n * 5. CI detection - basic colors in CI\n */\nexport function detectColor(stdout: NodeJS.WriteStream): ColorLevel | null {\n // NO_COLOR takes precedence (see https://no-color.org/)\n if (process.env.NO_COLOR !== undefined) {\n return null\n }\n\n // FORCE_COLOR overrides detection\n const forceColor = process.env.FORCE_COLOR\n if (forceColor !== undefined) {\n if (forceColor === \"0\" || forceColor === \"false\") return null\n if (forceColor === \"1\") return \"basic\"\n if (forceColor === \"2\") return \"256\"\n if (forceColor === \"3\") return \"truecolor\"\n // Any other truthy value defaults to basic\n return \"basic\"\n }\n\n // Non-TTY without FORCE_COLOR - no colors\n if (!stdout.isTTY) {\n return null\n }\n\n // Dumb terminal\n if (process.env.TERM === \"dumb\") {\n return null\n }\n\n // COLORTERM=truecolor indicates 24-bit support\n const colorTerm = process.env.COLORTERM\n if (colorTerm === \"truecolor\" || colorTerm === \"24bit\") {\n return \"truecolor\"\n }\n\n // Check TERM for color hints\n const term = process.env.TERM ?? \"\"\n\n // Known truecolor terminals\n if (\n term.includes(\"truecolor\") ||\n term.includes(\"24bit\") ||\n term.includes(\"xterm-ghostty\") ||\n term.includes(\"xterm-kitty\") ||\n term.includes(\"wezterm\")\n ) {\n return \"truecolor\"\n }\n\n // 256-color terminals\n if (term.includes(\"256color\") || term.includes(\"256\")) {\n return \"256\"\n }\n\n // Modern macOS terminals typically support truecolor\n const termProgram = process.env.TERM_PROGRAM\n if (termProgram === \"iTerm.app\" || termProgram === \"Apple_Terminal\") {\n return termProgram === \"iTerm.app\" ? \"truecolor\" : \"256\"\n }\n\n // Ghostty, WezTerm, Kitty via TERM_PROGRAM\n if (termProgram === \"Ghostty\" || termProgram === \"WezTerm\") {\n return \"truecolor\"\n }\n\n // Kitty via env var\n if (process.env.KITTY_WINDOW_ID) {\n return \"truecolor\"\n }\n\n // xterm-color variants get basic colors\n if (term.includes(\"xterm\") || term.includes(\"color\") || term.includes(\"ansi\")) {\n return \"basic\"\n }\n\n // CI environments usually support basic colors\n if (CI_ENVS.some((env) => process.env[env] !== undefined)) {\n return \"basic\"\n }\n\n // Windows Terminal (modern)\n if (process.env.WT_SESSION) {\n return \"truecolor\"\n }\n\n // Default: basic colors if TTY\n return \"basic\"\n}\n\n// =============================================================================\n// Unicode Detection\n// =============================================================================\n\n/**\n * Detect if terminal can render unicode symbols.\n * Based on TERM, locale, and known terminal apps.\n */\nexport function detectUnicode(): boolean {\n // CI environments - often UTF-8 capable but be conservative\n if (process.env.CI) {\n // GitHub Actions is UTF-8\n if (process.env.GITHUB_ACTIONS) return true\n // Other CI - check LANG\n }\n\n // Check locale for UTF-8\n const lang = process.env.LANG ?? process.env.LC_ALL ?? process.env.LC_CTYPE ?? \"\"\n if (lang.toLowerCase().includes(\"utf-8\") || lang.toLowerCase().includes(\"utf8\")) {\n return true\n }\n\n // Windows Terminal\n if (process.env.WT_SESSION) {\n return true\n }\n\n // Modern terminal programs\n const termProgram = process.env.TERM_PROGRAM ?? \"\"\n if ([\"iTerm.app\", \"Ghostty\", \"WezTerm\", \"Apple_Terminal\"].includes(termProgram)) {\n return true\n }\n\n // Kitty\n if (process.env.KITTY_WINDOW_ID) {\n return true\n }\n\n // Check TERM for modern terminals\n const term = process.env.TERM ?? \"\"\n if (term.includes(\"xterm\") || term.includes(\"rxvt\") || term.includes(\"screen\") || term.includes(\"tmux\")) {\n return true\n }\n\n // Default: assume no unicode for safety\n return false\n}\n\n// =============================================================================\n// Extended Underline Detection\n// =============================================================================\n\n/**\n * Known terminals with extended underline support.\n */\nconst EXTENDED_UNDERLINE_TERMS = [\"xterm-ghostty\", \"xterm-kitty\", \"wezterm\", \"xterm-256color\"]\n\n/**\n * Known terminal programs with extended underline support.\n */\nconst EXTENDED_UNDERLINE_PROGRAMS = [\"Ghostty\", \"iTerm.app\", \"WezTerm\"]\n\n/**\n * Detect if terminal supports extended underline styles.\n * (curly, dotted, dashed, double)\n *\n * Extended underlines use SGR 4:x (style) and SGR 58;2;r;g;b (color).\n * These are NOT supported by Terminal.app, which misinterprets them\n * as background colors causing visual artifacts.\n */\nexport function detectExtendedUnderline(): boolean {\n const term = process.env.TERM ?? \"\"\n const termProgram = process.env.TERM_PROGRAM ?? \"\"\n\n // Apple Terminal doesn't support extended underlines - check FIRST\n // because it often sets TERM=xterm-256color which would otherwise match\n if (termProgram === \"Apple_Terminal\") {\n return false\n }\n\n // Check TERM variable for known modern terminals\n if (EXTENDED_UNDERLINE_TERMS.some((t) => term.includes(t))) {\n return true\n }\n\n // Check TERM_PROGRAM for known terminal applications\n if (EXTENDED_UNDERLINE_PROGRAMS.some((p) => termProgram.includes(p))) {\n return true\n }\n\n // Kitty sets KITTY_WINDOW_ID\n if (process.env.KITTY_WINDOW_ID) {\n return true\n }\n\n // Default to false for unknown terminals\n return false\n}\n\n// =============================================================================\n// Terminal Capabilities Profile\n// =============================================================================\n\nexport interface TerminalCaps {\n /** Terminal program name (from TERM_PROGRAM) */\n program: string\n /** TERM value */\n term: string\n /** Color support level */\n colorLevel: \"none\" | \"basic\" | \"256\" | \"truecolor\"\n /** Kitty keyboard protocol supported */\n kittyKeyboard: boolean\n /** Kitty graphics protocol (inline images) */\n kittyGraphics: boolean\n /** Sixel graphics supported */\n sixel: boolean\n /** OSC 52 clipboard */\n osc52: boolean\n /** OSC 8 hyperlinks */\n hyperlinks: boolean\n /** OSC 9/99 notifications */\n notifications: boolean\n /** Bracketed paste mode */\n bracketedPaste: boolean\n /** SGR mouse tracking */\n mouse: boolean\n /** Synchronized output (DEC 2026) */\n syncOutput: boolean\n /** Unicode/emoji support */\n unicode: boolean\n /** SGR 4:x underline style subparameters (curly, dotted, dashed) */\n underlineStyles: boolean\n /** SGR 58 underline color */\n underlineColor: boolean\n /** Text-presentation emoji (⚠, ☑, ⭐) rendered as 2-wide.\n * Modern terminals (Ghostty, iTerm, Kitty) render these at emoji width (2 cells).\n * Terminal.app renders them at text width (1 cell). */\n textEmojiWide: boolean\n /** OSC 66 text sizing protocol likely supported (Kitty 0.40+, Ghostty) */\n textSizingSupported: boolean\n /** Heuristic: likely dark background (for theme selection) */\n darkBackground: boolean\n /** Heuristic: likely has Nerd Font installed (for icon selection) */\n nerdfont: boolean\n}\n\n/**\n * Default capabilities (assumes modern terminal with full support).\n */\nexport function defaultCaps(): TerminalCaps {\n return {\n program: \"\",\n term: \"\",\n colorLevel: \"truecolor\",\n kittyKeyboard: false,\n kittyGraphics: false,\n sixel: false,\n osc52: false,\n hyperlinks: false,\n notifications: false,\n bracketedPaste: true,\n mouse: true,\n syncOutput: false,\n unicode: true,\n underlineStyles: true,\n underlineColor: true,\n textEmojiWide: true,\n textSizingSupported: false,\n darkBackground: true,\n nerdfont: false,\n }\n}\n\n/**\n * Cached result of macOS dark mode detection.\n * Computed lazily on first access to avoid spawnSync at module load time.\n */\nlet cachedMacOSDarkMode: boolean | undefined\n\n/**\n * Check if macOS is in dark mode by reading the system appearance preference.\n * Uses `defaults read -g AppleInterfaceStyle` — returns \"Dark\" when dark mode\n * is active, exits non-zero when light mode. ~2ms via spawnSync.\n *\n * Result is cached after first call to avoid repeated process spawns.\n */\nfunction detectMacOSDarkMode(): boolean {\n if (cachedMacOSDarkMode !== undefined) return cachedMacOSDarkMode\n\n try {\n // Lazy import: child_process is Node.js-only and must not be loaded at\n // module level so that browser bundles (canvas adapter) never pull it in.\n const { spawnSync } = require(\"child_process\") as typeof import(\"child_process\")\n const result = spawnSync(\"defaults\", [\"read\", \"-g\", \"AppleInterfaceStyle\"], {\n encoding: \"utf-8\",\n timeout: 500,\n })\n cachedMacOSDarkMode = result.stdout?.trim() === \"Dark\"\n } catch {\n cachedMacOSDarkMode = false\n }\n\n return cachedMacOSDarkMode\n}\n\n/** Detect terminal capabilities from environment variables.\n * Synchronous. Minimal I/O: may run `defaults` on macOS for Apple_Terminal.\n */\nexport function detectTerminalCaps(): TerminalCaps {\n const program = process.env.TERM_PROGRAM ?? \"\"\n const term = process.env.TERM ?? \"\"\n const colorTerm = process.env.COLORTERM ?? \"\"\n const noColor = process.env.NO_COLOR !== undefined\n\n const isAppleTerminal = program === \"Apple_Terminal\"\n\n let colorLevel: TerminalCaps[\"colorLevel\"] = \"none\"\n if (!noColor) {\n if (isAppleTerminal) {\n colorLevel = \"256\"\n } else if (colorTerm === \"truecolor\" || colorTerm === \"24bit\") {\n colorLevel = \"truecolor\"\n } else if (term.includes(\"256color\")) {\n colorLevel = \"256\"\n } else if (process.stdout?.isTTY) {\n colorLevel = \"basic\"\n }\n }\n\n const isKitty = term === \"xterm-kitty\"\n const isITerm = program === \"iTerm.app\"\n const isGhostty = program === \"ghostty\"\n const isWezTerm = program === \"WezTerm\"\n const isAlacritty = program === \"Alacritty\"\n const isFoot = term === \"foot\" || term === \"foot-extra\"\n const isModern = isKitty || isITerm || isGhostty || isWezTerm || isFoot\n\n // Kitty v0.40+ supports OSC 66 text sizing\n let isKittyWithTextSizing = false\n if (isKitty) {\n const version = process.env.TERM_PROGRAM_VERSION ?? \"\"\n const parts = version.split(\".\")\n const major = Number(parts[0]) || 0\n const minor = Number(parts[1]) || 0\n isKittyWithTextSizing = major > 0 || (major === 0 && minor >= 40)\n }\n\n let darkBackground = !isAppleTerminal\n const colorFgBg = process.env.COLORFGBG\n if (colorFgBg) {\n const parts = colorFgBg.split(\";\")\n const bg = parseInt(parts[parts.length - 1] ?? \"\", 10)\n if (!isNaN(bg)) {\n darkBackground = bg < 7\n }\n } else if (isAppleTerminal) {\n darkBackground = detectMacOSDarkMode()\n }\n\n let nerdfont = isModern || isAlacritty\n const nfEnv = process.env.NERDFONT\n if (nfEnv === \"0\" || nfEnv === \"false\") nerdfont = false\n else if (nfEnv === \"1\" || nfEnv === \"true\") nerdfont = true\n\n const underlineExtensions = isModern || isAlacritty\n\n return {\n program,\n term,\n colorLevel,\n kittyKeyboard: isKitty || isGhostty || isWezTerm || isFoot,\n kittyGraphics: isKitty || isGhostty,\n sixel: isFoot || isWezTerm,\n osc52: isModern || isAlacritty,\n hyperlinks: isModern || isAlacritty,\n notifications: isITerm || isKitty,\n bracketedPaste: true,\n mouse: true,\n syncOutput: isModern || isAlacritty,\n unicode: true,\n underlineStyles: underlineExtensions,\n underlineColor: underlineExtensions,\n textEmojiWide: !isAppleTerminal,\n textSizingSupported: isKittyWithTextSizing, // Ghostty parses OSC 66 but doesn't render it (v1.3.0)\n darkBackground,\n nerdfont,\n }\n}\n","/**\n * SGR (Select Graphic Rendition) color code helpers.\n *\n * Shared by buffer.ts (styleToAnsiCodes) and output-phase.ts (styleTransition).\n * Emits the shortest possible SGR code string for a given color.\n */\n\n/**\n * Emit the shortest SGR code string for a foreground color.\n * - Basic 0-7: 4-bit code (30+N)\n * - Extended 8-255: 256-color (38;5;N)\n * - RGB: true color (38;2;R;G;B)\n */\nexport function fgColorCode(color: number | { r: number; g: number; b: number }): string {\n if (typeof color === \"number\") {\n if (color >= 0 && color <= 7) return `${30 + color}`\n return `38;5;${color}`\n }\n return `38;2;${color.r};${color.g};${color.b}`\n}\n\n/**\n * Emit the shortest SGR code string for a background color.\n * - Basic 0-7: 4-bit code (40+N)\n * - Extended 8-255: 256-color (48;5;N)\n * - RGB: true color (48;2;R;G;B)\n */\nexport function bgColorCode(color: number | { r: number; g: number; b: number }): string {\n if (typeof color === \"number\") {\n if (color >= 0 && color <= 7) return `${40 + color}`\n return `48;5;${color}`\n }\n return `48;2;${color.r};${color.g};${color.b}`\n}\n","/**\n * ANSI string utilities.\n *\n * This module can be imported separately via `@silvery/ansi/utils`\n * for projects that only need ANSI stripping without chalk.\n */\n\nimport stringWidth from \"string-width\"\n\n// =============================================================================\n// ANSI Regex Pattern\n// =============================================================================\n\n/**\n * ANSI escape code pattern for stripping.\n *\n * Matches:\n * - ESC CSI SGR sequences: \\x1b[31m, \\x1b[4:3m, \\x1b[38:2::255:100:0m\n * - C1 CSI SGR sequences: \\x9b31m, \\x9b4:3m\n * - ESC OSC 8 hyperlinks (BEL-terminated): \\x1b]8;;<url>\\x07\n * - ESC OSC 8 hyperlinks (ST-terminated): \\x1b]8;;<url>\\x1b\\\\\n * - C1 OSC 8 hyperlinks (BEL-terminated): \\x9d8;;<url>\\x07\n * - C1 OSC 8 hyperlinks (ST-terminated): \\x9d8;;<url>\\x1b\\\\\n * - C1 OSC 8 hyperlinks (C1 ST-terminated): \\x9d8;;<url>\\x9c\n */\nexport const ANSI_REGEX =\n /\\x1b\\[[0-9;:]*m|\\x9b[0-9;:]*m|\\x1b\\]8;;[^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x9d8;;[^\\x07\\x1b\\x9c]*(?:\\x07|\\x1b\\\\|\\x9c)/g\n\n// =============================================================================\n// String Utilities\n// =============================================================================\n\n/**\n * Strip all ANSI escape codes from a string.\n *\n * @param text - String potentially containing ANSI codes\n * @returns Clean string with all ANSI codes removed\n *\n * @example\n * ```ts\n * stripAnsi('\\x1b[31mred\\x1b[0m') // 'red'\n * stripAnsi('\\x1b[4:3mwavy\\x1b[4:0m') // 'wavy'\n * ```\n */\nexport function stripAnsi(text: string): string {\n return text.replace(ANSI_REGEX, \"\")\n}\n\n/**\n * Get the display width of a string, excluding ANSI escape codes.\n * Correctly handles CJK characters, emoji, and other wide characters.\n *\n * @param text - String potentially containing ANSI codes\n * @returns Number of terminal columns the text will occupy\n *\n * @example\n * ```ts\n * displayLength('\\x1b[31mhello\\x1b[0m') // 5\n * displayLength('hello') // 5\n * displayLength('한글') // 4 (2 chars × 2 cells each)\n * ```\n */\nexport function displayLength(text: string): number {\n return stringWidth(stripAnsi(text))\n}\n","/**\n * ANSI color maps and RGB-to-ANSI quantization.\n *\n * Provides named color maps (MODIFIERS, FG_COLORS, BG_COLORS) and\n * functions to generate SGR codes from RGB values at any color level.\n *\n * @see https://en.wikipedia.org/wiki/ANSI_escape_code#Colors\n */\n\nimport type { ColorLevel } from \"./types\"\n\n// =============================================================================\n// SGR Code Constants\n// =============================================================================\n\n/** Modifier SGR codes: open -> close */\nexport const MODIFIERS: Record<string, [number, number]> = {\n reset: [0, 0],\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n overline: [53, 55],\n}\n\n/** Foreground color name -> ANSI SGR code */\nexport const FG_COLORS: Record<string, number> = {\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 blackBright: 90,\n gray: 90,\n grey: 90,\n redBright: 91,\n greenBright: 92,\n yellowBright: 93,\n blueBright: 94,\n magentaBright: 95,\n cyanBright: 96,\n whiteBright: 97,\n}\n\n/** Background color name -> ANSI SGR code */\nexport const BG_COLORS: Record<string, number> = {\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 bgBlackBright: 100,\n bgGray: 100,\n bgGrey: 100,\n bgRedBright: 101,\n bgGreenBright: 102,\n bgYellowBright: 103,\n bgBlueBright: 104,\n bgMagentaBright: 105,\n bgCyanBright: 106,\n bgWhiteBright: 107,\n}\n\n// =============================================================================\n// Color Quantization (truecolor -> 256 -> 16)\n// =============================================================================\n\n/** Standard ANSI 16 color RGB values for nearest-color matching.\n * Uses xterm-256 standard values for consistent mapping (matches chalk/ansi-styles). */\nexport const ANSI_16_COLORS: Array<[number, number, number]> = [\n [0, 0, 0], // 0: black\n [128, 0, 0], // 1: red\n [0, 128, 0], // 2: green\n [128, 128, 0], // 3: yellow/brown\n [0, 0, 128], // 4: blue\n [128, 0, 128], // 5: magenta\n [0, 128, 128], // 6: cyan\n [192, 192, 192], // 7: white\n [128, 128, 128], // 8: bright black (gray)\n [255, 0, 0], // 9: bright red\n [0, 255, 0], // 10: bright green\n [255, 255, 0], // 11: bright yellow\n [0, 0, 255], // 12: bright blue\n [255, 0, 255], // 13: bright magenta\n [0, 255, 255], // 14: bright cyan\n [255, 255, 255], // 15: bright white\n]\n\n/** Find nearest ANSI 16 color index for an RGB value. */\nexport function nearestAnsi16(r: number, g: number, b: number): number {\n let bestIdx = 0\n let bestDist = Infinity\n for (let i = 0; i < 16; i++) {\n const [cr, cg, cb] = ANSI_16_COLORS[i]!\n const dist = (r - cr) ** 2 + (g - cg) ** 2 + (b - cb) ** 2\n if (dist < bestDist) {\n bestDist = dist\n bestIdx = i\n }\n }\n return bestIdx\n}\n\n/** Convert RGB to 256-color index (using the 6x6x6 color cube). */\nexport function rgbToAnsi256(r: number, g: number, b: number): number {\n // Check if it's a grayscale (r === g === b)\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 // Map to 6x6x6 cube\n const ri = Math.round((r / 255) * 5)\n const gi = Math.round((g / 255) * 5)\n const bi = Math.round((b / 255) * 5)\n return 16 + 36 * ri + 6 * gi + bi\n}\n\n/**\n * Generate SGR foreground code for an RGB color at the given color level.\n * Returns the SGR parameter string (e.g., \"31\" or \"38;5;196\" or \"38;2;255;0;0\").\n */\nexport function fgFromRgb(r: number, g: number, b: number, level: ColorLevel): string {\n if (level === \"truecolor\") return `38;2;${r};${g};${b}`\n if (level === \"256\") return `38;5;${rgbToAnsi256(r, g, b)}`\n // basic: map to ANSI 16\n const idx = nearestAnsi16(r, g, b)\n return idx < 8 ? `${30 + idx}` : `${82 + idx}` // 90-97 for bright\n}\n\n/**\n * Generate SGR background code for an RGB color at the given color level.\n */\nexport function bgFromRgb(r: number, g: number, b: number, level: ColorLevel): string {\n if (level === \"truecolor\") return `48;2;${r};${g};${b}`\n if (level === \"256\") return `48;5;${rgbToAnsi256(r, g, b)}`\n const idx = nearestAnsi16(r, g, b)\n return idx < 8 ? `${40 + idx}` : `${92 + idx}` // 100-107 for bright\n}\n","/**\n * ANSI terminal control helpers.\n *\n * Pure string-returning functions for terminal control sequences.\n * No side effects, no stdout writes -- consumers compose and write.\n *\n * Covers: screen management, cursor control, scroll regions,\n * mouse tracking, keyboard protocols, and bracketed paste.\n *\n * @see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\n// =============================================================================\n// Base Constants\n// =============================================================================\n\n/** Escape character (0x1B) */\nconst ESC = \"\\x1b\"\n\n/** Control Sequence Introducer: ESC [ */\nconst CSI = `${ESC}[`\n\n/** Operating System Command: ESC ] */\nconst OSC = `${ESC}]`\n\n/** Bell character (0x07) -- used as string terminator in OSC sequences */\nconst BEL = \"\\x07\"\n\n// =============================================================================\n// Screen\n// =============================================================================\n\n/**\n * Enter the alternate screen buffer (DEC private mode 1049).\n * The alternate screen preserves the main scrollback buffer.\n */\nexport function enterAltScreen(): string {\n return `${CSI}?1049h`\n}\n\n/**\n * Leave the alternate screen buffer and restore the main screen.\n */\nexport function leaveAltScreen(): string {\n return `${CSI}?1049l`\n}\n\n/**\n * Clear the entire screen (ED 2 -- Erase in Display, all).\n */\nexport function clearScreen(): string {\n return `${CSI}2J`\n}\n\n/**\n * Clear the current line (EL 2 -- Erase in Line, entire line).\n */\nexport function clearLine(): string {\n return `${CSI}2K`\n}\n\n// =============================================================================\n// Cursor\n// =============================================================================\n\n/**\n * Move cursor to an absolute position.\n * Uses 0-indexed row/col; converts to 1-indexed CUP (Cursor Position).\n */\nexport function cursorTo(row: number, col: number): string {\n return `${CSI}${row + 1};${col + 1}H`\n}\n\n/**\n * Move cursor to the home position (top-left, row 0, col 0).\n */\nexport function cursorHome(): string {\n return `${CSI}H`\n}\n\n/**\n * Hide the cursor (DEC private mode 25, reset).\n */\nexport function cursorHide(): string {\n return `${CSI}?25l`\n}\n\n/**\n * Show the cursor (DEC private mode 25, set).\n */\nexport function cursorShow(): string {\n return `${CSI}?25h`\n}\n\n/**\n * Set cursor style via DECSCUSR (DEC Set Cursor Style).\n *\n * | Style | Code | Description |\n * | ----------- | ---- | ------------------------ |\n * | block | 2 | Steady block |\n * | underline | 4 | Steady underline |\n * | beam | 6 | Steady bar (vertical) |\n *\n * Steady variants are used (even codes). Blinking would be odd codes.\n * Supported by: xterm, Ghostty, Kitty, WezTerm, iTerm2, Alacritty, foot.\n */\nexport function cursorStyle(style: \"block\" | \"underline\" | \"beam\"): string {\n const code = style === \"block\" ? 2 : style === \"underline\" ? 4 : 6\n return `${CSI}${code} q`\n}\n\n// =============================================================================\n// Terminal\n// =============================================================================\n\n/**\n * Set the terminal window title using OSC 2 (window title only).\n * Does not affect icon title. Widely supported.\n */\nexport function setTitle(title: string): string {\n return `${OSC}2;${title}${BEL}`\n}\n\n/**\n * Enable mouse tracking with full hover support.\n *\n * Uses two modes:\n * - **1003** (any-event tracking): Reports ALL mouse motion — clicks, drags, AND hover.\n * This is what makes onMouseEnter/onMouseLeave work. Without it, only clicks are reported.\n * - **1006** (SGR encoding): Decimal coordinates with no 223-column limit.\n *\n * WARNING: Do NOT replace 1003 with 1000+1002. The xterm mouse modes form a hierarchy:\n * 1000 = clicks only\n * 1002 = clicks + drag (motion while button held)\n * 1003 = clicks + drag + hover (ALL motion, even without button)\n * Mode 1003 supersedes 1000 and 1002. Using 1000+1002 instead of 1003 silently\n * disables hover — onMouseEnter/onMouseLeave stop firing with no error.\n */\nexport function enableMouse(): string {\n return `${CSI}?1003h${CSI}?1006h`\n}\n\n/**\n * Disable mouse tracking. Disables in reverse order of enabling.\n */\nexport function disableMouse(): string {\n return `${CSI}?1006l${CSI}?1003l`\n}\n\n/**\n * Enable bracketed paste mode (DEC private mode 2004).\n * Terminal wraps pasted text with markers so the app can distinguish\n * paste from typed input.\n */\nexport function enableBracketedPaste(): string {\n return `${CSI}?2004h`\n}\n\n/**\n * Disable bracketed paste mode.\n */\nexport function disableBracketedPaste(): string {\n return `${CSI}?2004l`\n}\n\n/**\n * Enable synchronized update mode (DEC private mode 2026).\n * Tells the terminal to batch output and paint atomically, preventing tearing.\n * Supported by: Ghostty, Kitty, WezTerm, iTerm2, Foot, Alacritty 0.14+, tmux 3.2+.\n * Terminals that don't support it safely ignore this sequence.\n */\nexport function enableSyncUpdate(): string {\n return `${CSI}?2026h`\n}\n\n/**\n * Disable synchronized update mode.\n * Sending this when not in sync mode is a harmless no-op.\n */\nexport function disableSyncUpdate(): string {\n return `${CSI}?2026l`\n}\n\n// =============================================================================\n// Scroll\n// =============================================================================\n\n/**\n * Set the terminal scroll region (DECSTBM -- DEC Set Top and Bottom Margins).\n * Uses 0-indexed top/bottom; converts to 1-indexed for the terminal.\n *\n * Supported by most modern terminals: xterm, iTerm2, Kitty, Ghostty, WezTerm, etc.\n */\nexport function setScrollRegion(top: number, bottom: number): string {\n return `${CSI}${top + 1};${bottom + 1}r`\n}\n\n/**\n * Reset the scroll region to the full terminal height.\n */\nexport function resetScrollRegion(): string {\n return `${CSI}r`\n}\n\n/**\n * Scroll content up by N lines within the current scroll region (SU).\n * New blank lines appear at the bottom.\n */\nexport function scrollUp(n: number): string {\n if (n <= 0) return \"\"\n return `${CSI}${n}S`\n}\n\n/**\n * Scroll content down by N lines within the current scroll region (SD).\n * New blank lines appear at the top.\n */\nexport function scrollDown(n: number): string {\n if (n <= 0) return \"\"\n return `${CSI}${n}T`\n}\n\n// =============================================================================\n// Keyboard\n// =============================================================================\n\n/**\n * Enable the Kitty keyboard protocol (push mode).\n *\n * Sends CSI > flags u to opt into the specified modes.\n * Supported by: Ghostty, Kitty, WezTerm, foot. Ignored by unsupported terminals.\n *\n * Flags are a bitfield:\n *\n * | Flag | Bit | Description |\n * | ---- | --- | ----------------------------------------- |\n * | 1 | 0 | Disambiguate escape codes |\n * | 2 | 1 | Report event types (press/repeat/release) |\n * | 4 | 2 | Report alternate keys |\n * | 8 | 3 | Report all keys as escape codes |\n * | 16 | 4 | Report associated text |\n *\n * @param flags Bitfield of Kitty keyboard flags\n */\nexport function enableKittyKeyboard(flags: number = 1): string {\n return `${CSI}>${flags}u`\n}\n\n/**\n * Disable the Kitty keyboard protocol (pop mode stack).\n * Sends CSI < u to restore the previous keyboard mode.\n */\nexport function disableKittyKeyboard(): string {\n return `${CSI}<u`\n}\n","/**\n * Color manipulation utilities.\n *\n * Operates in OKLCH for perceptual uniformity — hue rotations look right,\n * lightness changes feel linear, chroma is preserved.\n *\n * Currently uses simple RGB blending as a foundation. Full OKLCH conversion\n * will be added when needed for advanced derivation (shade generation,\n * palette generation from minimal input).\n */\n\nimport type { HSL } from \"./types.ts\"\n\n// ============================================================================\n// Hex ↔ RGB Parsing\n// ============================================================================\n\n/** Parse #rrggbb or #rgb to [r, g, b]. Returns null for invalid input. */\nexport function hexToRgb(hex: string): [number, number, number] | null {\n if (hex[0] !== \"#\") return null\n const h = hex.slice(1)\n if (h.length === 3) {\n return [parseInt(h[0]! + h[0]!, 16), parseInt(h[1]! + h[1]!, 16), parseInt(h[2]! + h[2]!, 16)]\n }\n if (h.length === 6) {\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)]\n }\n return null\n}\n\n/** Convert [r, g, b] (0-255) to hex string. */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (n: number) => Math.max(0, Math.min(255, Math.round(n)))\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`.toUpperCase()\n}\n\n// ============================================================================\n// Color Manipulation\n// ============================================================================\n\n/**\n * Blend two hex colors. t=0 returns a, t=1 returns b.\n * For non-hex inputs (ANSI names), returns `a` unchanged.\n */\nexport function blend(a: string, b: string, t: number): string {\n const rgbA = hexToRgb(a)\n const rgbB = hexToRgb(b)\n if (!rgbA || !rgbB) return a\n\n return rgbToHex(\n rgbA[0] + (rgbB[0] - rgbA[0]) * t,\n rgbA[1] + (rgbB[1] - rgbA[1]) * t,\n rgbA[2] + (rgbB[2] - rgbA[2]) * t,\n )\n}\n\n/**\n * Brighten a hex color. amount=0.1 adds 10% lightness toward white.\n * For non-hex inputs (ANSI names), returns the color unchanged.\n */\nexport function brighten(color: string, amount: number): string {\n return blend(color, \"#FFFFFF\", amount)\n}\n\n/**\n * Darken a hex color. amount=0.1 adds 10% darkness toward black.\n * For non-hex inputs (ANSI names), returns the color unchanged.\n */\nexport function darken(color: string, amount: number): string {\n return blend(color, \"#000000\", amount)\n}\n\n// ============================================================================\n// Luminance (WCAG 2.1)\n// ============================================================================\n\n/**\n * Linearize an sRGB channel value (0-255) for luminance calculation.\n * Per WCAG 2.1: values below the threshold use a linear scale,\n * above use the gamma-corrected formula.\n */\nexport function channelLuminance(c: number): number {\n const s = c / 255\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)\n}\n\n/**\n * Compute relative luminance of a hex color per WCAG 2.1.\n * Returns a value between 0 (darkest) and 1 (lightest), or null for invalid input.\n */\nexport function relativeLuminance(hex: string): number | null {\n const rgb = hexToRgb(hex)\n if (!rgb) return null\n return 0.2126 * channelLuminance(rgb[0]) + 0.7152 * channelLuminance(rgb[1]) + 0.0722 * channelLuminance(rgb[2])\n}\n\n/**\n * Pick black or white text for readability on the given background.\n * Uses relative luminance (WCAG formula).\n */\nexport function contrastFg(bg: string): \"#000000\" | \"#FFFFFF\" {\n const luminance = relativeLuminance(bg)\n if (luminance === null) return \"#FFFFFF\" // default to white for non-hex\n return luminance > 0.179 ? \"#000000\" : \"#FFFFFF\"\n}\n\n// ============================================================================\n// HSL Utilities\n// ============================================================================\n\nexport function rgbToHsl(r: number, g: number, b: number): HSL {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b)\n const l = (max + min) / 2\n if (max === min) return [0, 0, l]\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n let h = 0\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n else if (max === g) h = ((b - r) / d + 2) / 6\n else h = ((r - g) / d + 4) / 6\n return [h * 360, s, l]\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n h = ((h % 360) + 360) % 360\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n }\n return rgbToHex(f(0) * 255, f(8) * 255, f(4) * 255)\n}\n\nexport function hexToHsl(hex: string): HSL | null {\n const rgb = hexToRgb(hex)\n if (!rgb) return null\n return rgbToHsl(rgb[0], rgb[1], rgb[2])\n}\n\n/**\n * Desaturate a hex color by reducing saturation.\n * amount=0.4 reduces saturation by 40%.\n * For non-hex inputs, returns the color unchanged.\n */\nexport function desaturate(color: string, amount: number): string {\n const hsl = hexToHsl(color)\n if (!hsl) return color\n const [h, s, l] = hsl\n return hslToHex(h, s * (1 - amount), l)\n}\n\n/**\n * Get the complementary color (180° hue rotation).\n * For non-hex inputs, returns the color unchanged.\n */\nexport function complement(color: string): string {\n const hsl = hexToHsl(color)\n if (!hsl) return color\n const [h, s, l] = hsl\n return hslToHex(h + 180, s, l)\n}\n","/**\n * WCAG 2.1 contrast checking and enforcement.\n *\n * - checkContrast(): measure the ratio between two colors\n * - ensureContrast(): adjust a color until it meets a target ratio\n *\n * Uses the relative luminance formula from WCAG 2.1.\n */\n\nimport { hexToHsl, hslToHex, contrastFg, relativeLuminance } from \"./color.ts\"\nimport type { ContrastResult } from \"./types.ts\"\n\n/**\n * Check contrast ratio between foreground and background colors.\n *\n * Uses the WCAG 2.1 relative luminance formula to compute the contrast\n * ratio and check AA (>= 4.5:1) and AAA (>= 7:1) compliance for normal text.\n *\n * @param fg - Foreground hex color (e.g. \"#FFFFFF\")\n * @param bg - Background hex color (e.g. \"#000000\")\n * @returns Contrast ratio and AA/AAA pass/fail, or null if colors are not valid hex\n *\n * @example\n * ```typescript\n * const result = checkContrast(\"#FFFFFF\", \"#000000\")\n * // { ratio: 21, aa: true, aaa: true }\n *\n * const poor = checkContrast(\"#777777\", \"#888888\")\n * // { ratio: ~1.3, aa: false, aaa: false }\n * ```\n */\nexport function checkContrast(fg: string, bg: string): ContrastResult | null {\n const fgLum = relativeLuminance(fg)\n const bgLum = relativeLuminance(bg)\n if (fgLum === null || bgLum === null) return null\n\n const lighter = Math.max(fgLum, bgLum)\n const darker = Math.min(fgLum, bgLum)\n const ratio = (lighter + 0.05) / (darker + 0.05)\n\n return {\n ratio, // exact — callers round for display if needed\n aa: ratio >= 4.5,\n aaa: ratio >= 7,\n }\n}\n\n/**\n * Adjust a color's lightness until it meets a minimum contrast ratio\n * against a reference color. Preserves hue and saturation — only\n * lightness is shifted, and only as much as needed.\n *\n * Returns the original color unchanged if it already meets the target.\n *\n * @param color - The color to adjust (hex)\n * @param against - The reference background color (hex)\n * @param minRatio - Minimum contrast ratio to achieve (e.g. 4.5 for AA)\n * @returns Adjusted hex color meeting the target, or original if already OK\n *\n * For impossible targets (e.g. 21:1 against mid-gray), returns the\n * best achievable color (near-black or near-white in the same hue).\n *\n * @example\n * ```typescript\n * // Yellow on white — too low contrast, gets darkened\n * ensureContrast(\"#FFAB91\", \"#FFFFFF\", 4.5) // → \"#B35600\" (darker orange)\n *\n * // Blue on dark bg — already fine, returned unchanged\n * ensureContrast(\"#5C9FFF\", \"#1A1A2E\", 4.5) // → \"#5C9FFF\"\n * ```\n */\nexport function ensureContrast(color: string, against: string, minRatio: number): string {\n const current = checkContrast(color, against)\n if (!current) return color // non-hex input — return unchanged\n if (current.ratio >= minRatio) return color\n\n const hsl = hexToHsl(color)\n if (!hsl) return color\n const [h, s] = hsl\n\n // Light bg → darken (decrease L), dark bg → lighten (increase L)\n const lightBg = contrastFg(against) === \"#000000\"\n\n // Binary search for the minimum lightness shift that achieves the target.\n // lo/hi bracket the L range to search within.\n let lo: number, hi: number\n if (lightBg) {\n lo = 0 // maximum darkening\n hi = hsl[2] // current lightness\n } else {\n lo = hsl[2] // current lightness\n hi = 1 // maximum lightening\n }\n\n for (let i = 0; i < 20; i++) {\n const mid = (lo + hi) / 2\n const candidate = hslToHex(h, s, mid)\n const r = checkContrast(candidate, against)\n if (!r) break\n if (lightBg) {\n // Lower L = more contrast. Find highest L that still passes.\n if (r.ratio >= minRatio) lo = mid\n else hi = mid\n } else {\n // Higher L = more contrast. Find lowest L that still passes.\n if (r.ratio >= minRatio) hi = mid\n else lo = mid\n }\n }\n\n return hslToHex(h, s, lightBg ? lo : hi)\n}\n","/**\n * @silvery/color — Pure color math utilities.\n *\n * Hex/RGB/HSL conversion, blending, contrast checking (WCAG 2.1).\n * Zero dependencies.\n *\n * @example\n * ```ts\n * import { hexToRgb, blend, checkContrast } from \"@silvery/color\"\n *\n * hexToRgb(\"#ff0\") // → [255, 255, 0]\n * blend(\"#000\", \"#fff\", 0.5) // → \"#808080\"\n * checkContrast(\"#fff\", \"#000\") // → { ratio: 21, aa: true, aaa: true }\n * ```\n *\n * @module\n */\n\n// Types\nexport type { HSL, ContrastResult } from \"./types.ts\"\n\n// Color math — hex/RGB/HSL conversion, blending, lightness\nexport {\n hexToRgb,\n rgbToHex,\n blend,\n brighten,\n darken,\n channelLuminance,\n relativeLuminance,\n contrastFg,\n rgbToHsl,\n hslToHex,\n hexToHsl,\n desaturate,\n complement,\n} from \"./color.ts\"\n\n// Contrast checking and enforcement (WCAG 2.1)\nexport { checkContrast, ensureContrast } from \"./contrast.ts\"\n","/**\n * Color utilities — ANSI color maps, quantization, and theme token defaults.\n *\n * Re-exports from sibling modules (since we're inside @silvery/ansi now).\n */\n\nimport type { ColorLevel } from \"../types.ts\"\nimport { hexToRgb } from \"@silvery/color\"\n\nexport { hexToRgb }\n\n// Re-export ANSI primitives from sibling module\nexport { MODIFIERS, FG_COLORS, BG_COLORS, fgFromRgb, bgFromRgb } from \"../color-maps.ts\"\nexport type { ColorLevel }\n\n// =============================================================================\n// Theme Token Defaults (fallbacks when no theme is provided)\n// =============================================================================\n\n/** Default ANSI codes for theme tokens when no theme object is given. */\nexport const THEME_TOKEN_DEFAULTS: Record<string, number> = {\n primary: 33, // yellow\n secondary: 36, // cyan\n accent: 35, // magenta\n error: 31, // red\n warning: 33, // yellow\n success: 32, // green\n info: 36, // cyan\n muted: 2, // dim (modifier, not color)\n link: 34, // blue + underline\n border: 90, // gray\n surface: 37, // white\n}\n","/**\n * createStyle() — theme-aware chalk replacement.\n *\n * Returns a chainable Proxy-based style object. Access properties to\n * accumulate styles, call with a string to apply them.\n *\n * @example\n * ```ts\n * const s = createStyle()\n * s.bold.red(\"error\") // \"\\x1b[1;31merror\\x1b[22;39m\"\n * s.hex(\"#ff0000\")(\"text\") // truecolor foreground\n *\n * const s = createStyle({ theme })\n * s.primary(\"deploy\") // resolves $primary from theme\n * ```\n */\n\nimport { detectColor } from \"../detection.ts\"\n\nimport { BG_COLORS, FG_COLORS, MODIFIERS, THEME_TOKEN_DEFAULTS, bgFromRgb, fgFromRgb, hexToRgb } from \"./colors.ts\"\nimport type { Style, StyleOptions, ThemeLike } from \"./types.ts\"\n\n// =============================================================================\n// Core Types\n// =============================================================================\n\n/** Accumulated style state for one chain. */\ninterface ChainState {\n opens: string[] // SGR open codes (e.g., \"1\", \"31\", \"38;2;255;0;0\")\n closes: string[] // SGR close codes (e.g., \"22\", \"39\")\n visible?: boolean // chalk's `visible` modifier — suppresses output when level === 0\n}\n\n// =============================================================================\n// Theme Token Resolution\n// =============================================================================\n\n/**\n * Resolve a color value against a theme — the canonical token resolver.\n *\n * If the color starts with `$`, looks up the token in the theme.\n * Supports `$primary`, `$surface-bg` (hyphens stripped), `$color0`–`$color15` (palette).\n * Non-`$` strings pass through unchanged. Returns undefined if no theme or unknown token.\n *\n * Compatible with @silvery/theme's Theme type (or any object with string properties).\n */\nexport function resolveThemeColor(name: string | undefined, theme: object | undefined): string | undefined {\n if (!name) return undefined\n if (!name.startsWith(\"$\")) return name\n if (!theme) return undefined\n return resolveToken(name, theme as ThemeLike)\n}\n\n/** Internal: resolve a token name (with or without $ prefix) against a theme. */\nfunction resolveToken(name: string, theme: ThemeLike | undefined): string | undefined {\n if (!theme) return undefined\n const token = name.startsWith(\"$\") ? name.slice(1) : name\n // Palette colors: $color0–$color15\n if (token.startsWith(\"color\")) {\n const idx = parseInt(token.slice(5), 10)\n if (idx >= 0 && idx < 16 && theme.palette && idx < theme.palette.length) {\n return theme.palette[idx]\n }\n }\n // Strip hyphens for lookup ($surface-bg → surfacebg)\n const key = token.replace(/-/g, \"\")\n const val = (theme as Record<string, unknown>)[key]\n return typeof val === \"string\" ? val : undefined\n}\n\n// =============================================================================\n// Proxy-based Style Chain\n// =============================================================================\n\nconst ESC = \"\\x1b[\"\nconst KNOWN_METHODS = new Set([\"hex\", \"rgb\", \"bgHex\", \"bgRgb\", \"ansi256\", \"bgAnsi256\", \"resolve\"])\nconst THEME_TOKENS = new Set([\n \"primary\",\n \"secondary\",\n \"accent\",\n \"error\",\n \"warning\",\n \"success\",\n \"info\",\n \"muted\",\n \"link\",\n \"border\",\n \"surface\",\n])\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/** Convert chalk numeric level (0-3) to ColorLevel. */\nfunction fromChalkLevel(n: number): import(\"../types.ts\").ColorLevel | null {\n if (n <= 0) return null\n if (n === 1) return \"basic\"\n if (n === 2) return \"256\"\n return \"truecolor\"\n}\n\n/** Convert ColorLevel to chalk numeric level (0-3). */\nfunction toChalkLevel(cl: import(\"../types.ts\").ColorLevel | null): number {\n if (cl === null) return 0\n if (cl === \"basic\") return 1\n if (cl === \"256\") return 2\n return 3\n}\n\n/**\n * Create a style object for terminal output.\n *\n * @param options - Color level and optional theme\n * @returns A chainable style object (chalk-compatible API)\n *\n * @example\n * ```ts\n * import { createStyle } from \"@silvery/ansi\"\n *\n * const s = createStyle()\n * console.log(s.bold.red(\"Error!\"))\n * console.log(s.hex(\"#818cf8\")(\"Indigo\"))\n *\n * // With theme\n * const s = createStyle({ theme })\n * console.log(s.primary(\"Deploy\"))\n * console.log(s.success(\"Done\"))\n * ```\n */\nexport function createStyle(options?: StyleOptions): Style {\n // Mutable level ref — shared across all chains from this instance\n const ref = {\n level: null as import(\"../types.ts\").ColorLevel | null,\n theme: options?.theme as ThemeLike | undefined,\n }\n\n if (options?.level !== undefined) {\n ref.level = options.level\n } else {\n try {\n ref.level = detectColor(process.stdout)\n } catch {\n ref.level = null\n }\n }\n\n // Root chain with mutable level via ref\n const root = createChainWithRef({ opens: [], closes: [] }, ref)\n return root\n}\n\n/**\n * Create a plain style object — no theme, just color level.\n * Equivalent to `createStyle()` without a theme.\n *\n * @param level - Color level override. Auto-detected if omitted.\n */\nexport function createPlainStyle(level?: import(\"../types.ts\").ColorLevel | null): Style {\n return createStyle({ level })\n}\n\n/**\n * Pre-configured global style instance.\n * Auto-detects color level from the terminal.\n * No theme by default — use `createStyle({ theme })` for themed output.\n */\nexport const style: Style = createStyle()\n\n/**\n * Create a chain that reads level from a mutable ref.\n * This allows `style.level = 3` to affect all subsequent calls.\n */\nfunction createChainWithRef(\n state: ChainState,\n ref: { level: import(\"../types.ts\").ColorLevel | null; theme: ThemeLike | undefined },\n): Style {\n // proxyRef lets the handler reference its own proxy (needed for Function.prototype methods)\n const proxyRef: { proxy: Style | null } = { proxy: null }\n const handler: ProxyHandler<(...args: unknown[]) => string> = {\n apply(_target, _thisArg, args) {\n const level = ref.level\n\n // chalk compat: visible modifier suppresses output when level === 0\n if (state.visible && level === null) return \"\"\n\n // Resolve text from args — supports: string, multiple args (chalk compat), template literals\n let text: string\n if (args.length === 0) {\n text = \"\"\n } else if (Array.isArray(args[0]) && \"raw\" in args[0]) {\n text = String.raw(args[0] as TemplateStringsArray, ...args.slice(1))\n } else if (args.length > 1) {\n text = args.map((a) => String(a ?? \"\")).join(\" \")\n } else {\n text = String(args[0] ?? \"\")\n }\n\n // chalk compat: don't output escape codes if the input is empty\n if (text === \"\") return \"\"\n\n if (level === null || state.opens.length === 0) return text\n\n const open = `${ESC}${state.opens.join(\";\")}m`\n const close = `${ESC}${state.closes.join(\";\")}m`\n\n // chalk compat: replace inner close codes with close+reopen to restore parent styles.\n // When nesting like chalk.red(\"a\" + chalk.green(\"c\") + \"b\"), the inner chalk.green(\"c\")\n // produces \\x1b[32mc\\x1b[39m. The \\x1b[39m would reset fg to default, losing the red.\n // Chalk replaces inner close codes with close+open to restore the parent color.\n // This must happen BEFORE line-break splitting to avoid double-replacement.\n for (const closeCode of state.closes) {\n const closeSeq = `${ESC}${closeCode}m`\n const parts = text.split(closeSeq)\n if (parts.length > 1) {\n text = parts.join(`${closeSeq}${open}`)\n }\n }\n\n // chalk compat: split on line breaks — close before \\n, reopen after\n if (text.includes(\"\\n\")) {\n text = text.replace(/\\r?\\n/g, `${close}$&${open}`)\n }\n\n return `${open}${text}${close}`\n },\n\n get(_target, prop) {\n if (typeof prop === \"symbol\") return undefined\n\n // level getter/setter (chalk compat)\n if (prop === \"level\") return toChalkLevel(ref.level)\n\n // resolve() method\n if (prop === \"resolve\") {\n return (token: string): string | undefined => resolveToken(token, ref.theme)\n }\n\n // chalk compat: visible modifier — pass-through when level > 0, suppress when level === 0\n if (prop === \"visible\") {\n return createChainWithRef({ ...state, visible: true }, ref)\n }\n\n // Function.prototype methods — chalk compat (call, apply, bind)\n // Return the method bound to the proxy so the apply trap fires\n if (prop === \"call\" || prop === \"apply\" || prop === \"bind\") {\n return Function.prototype[prop as \"call\" | \"apply\" | \"bind\"].bind(proxyRef.proxy!)\n }\n\n const level = ref.level\n\n // Color methods\n if (prop === \"hex\" || prop === \"bgHex\") {\n return (color: string) => {\n if (level === null) return createChainWithRef(state, ref)\n const rgb = hexToRgb(color)\n if (!rgb) return createChainWithRef(state, ref)\n const code =\n prop === \"hex\" ? fgFromRgb(rgb[0], rgb[1], rgb[2], level) : bgFromRgb(rgb[0], rgb[1], rgb[2], level)\n const close = prop === \"hex\" ? \"39\" : \"49\"\n return createChainWithRef({ opens: [...state.opens, code], closes: [...state.closes, close] }, ref)\n }\n }\n\n if (prop === \"rgb\" || prop === \"bgRgb\") {\n return (r: number, g: number, b: number) => {\n if (level === null) return createChainWithRef(state, ref)\n const code = prop === \"rgb\" ? fgFromRgb(r, g, b, level) : bgFromRgb(r, g, b, level)\n const close = prop === \"rgb\" ? \"39\" : \"49\"\n return createChainWithRef({ opens: [...state.opens, code], closes: [...state.closes, close] }, ref)\n }\n }\n\n if (prop === \"ansi256\") {\n return (code: number) => {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef({ opens: [...state.opens, `38;5;${code}`], closes: [...state.closes, \"39\"] }, ref)\n }\n }\n\n if (prop === \"bgAnsi256\") {\n return (code: number) => {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef({ opens: [...state.opens, `48;5;${code}`], closes: [...state.closes, \"49\"] }, ref)\n }\n }\n\n // Modifiers\n if (prop in MODIFIERS) {\n if (level === null) return createChainWithRef(state, ref)\n const [open, close] = MODIFIERS[prop]!\n return createChainWithRef(\n { opens: [...state.opens, String(open)], closes: [...state.closes, String(close)] },\n ref,\n )\n }\n\n // Foreground colors\n if (prop in FG_COLORS) {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef(\n { opens: [...state.opens, String(FG_COLORS[prop]!)], closes: [...state.closes, \"39\"] },\n ref,\n )\n }\n\n // Background colors\n if (prop in BG_COLORS) {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef(\n { opens: [...state.opens, String(BG_COLORS[prop]!)], closes: [...state.closes, \"49\"] },\n ref,\n )\n }\n\n // Theme tokens\n if (THEME_TOKENS.has(prop)) {\n if (level === null) return createChainWithRef(state, ref)\n const hex = resolveToken(prop, ref.theme)\n if (hex) {\n const rgb = hexToRgb(hex)\n if (rgb) {\n const code = fgFromRgb(rgb[0], rgb[1], rgb[2], level)\n if (prop === \"link\") {\n return createChainWithRef(\n { opens: [...state.opens, code, \"4\"], closes: [...state.closes, \"39\", \"24\"] },\n ref,\n )\n }\n return createChainWithRef({ opens: [...state.opens, code], closes: [...state.closes, \"39\"] }, ref)\n }\n }\n const fallback = THEME_TOKEN_DEFAULTS[prop]\n if (fallback !== undefined) {\n if (prop === \"muted\") {\n return createChainWithRef(\n { opens: [...state.opens, String(fallback)], closes: [...state.closes, \"22\"] },\n ref,\n )\n }\n if (prop === \"link\") {\n return createChainWithRef(\n {\n opens: [...state.opens, String(fallback), \"4\"],\n closes: [...state.closes, \"39\", \"24\"],\n },\n ref,\n )\n }\n return createChainWithRef({ opens: [...state.opens, String(fallback)], closes: [...state.closes, \"39\"] }, ref)\n }\n }\n\n return undefined\n },\n\n set(_target, prop, value) {\n if (prop === \"level\") {\n ref.level = fromChalkLevel(value as number)\n return true\n }\n return false\n },\n\n has(_target, prop) {\n if (prop === \"level\") return true\n if (typeof prop === \"symbol\") return false\n return (\n prop in MODIFIERS || prop in FG_COLORS || prop in BG_COLORS || THEME_TOKENS.has(prop) || KNOWN_METHODS.has(prop)\n )\n },\n }\n\n const target = function () {} as unknown as (...args: unknown[]) => string\n const proxy = new Proxy(target, handler) as unknown as Style\n proxyRef.proxy = proxy\n return proxy\n}\n","/**\n * Mixed style proxy — combines a Style instance with additional properties.\n *\n * Used by ag-term to create a Term that is both a style chain (term.bold.red('text'))\n * and a terminal interface (term.write(), term.cols, etc.).\n */\n\nimport type { Style } from \"./types.ts\"\n\n/** Methods on Style that take arguments and return a new Style chain. */\nconst STYLE_METHODS = new Set([\"hex\", \"bgHex\", \"rgb\", \"bgRgb\", \"ansi256\", \"bgAnsi256\"])\n\n/**\n * Create a proxy that wraps a style instance with additional properties.\n *\n * The proxy makes the result:\n * - Callable: result('text') applies current styles\n * - Chainable: result.bold.red('text') chains styles\n * - Extended: result.anyExtraProp accesses extra properties\n *\n * Extra properties take priority over style properties on name collision.\n */\nexport function createMixedStyle<T extends object>(style: Style, extra: T): Style & T {\n return createChainProxy(style, extra) as Style & T\n}\n\n/**\n * Internal recursive proxy builder for style chain + extra properties.\n */\nfunction createChainProxy<T extends object>(currentStyle: Style, extra: T): Style & T {\n const handler: ProxyHandler<(...args: unknown[]) => string> = {\n apply(_target, _thisArg, args) {\n // Forward all args to the Style proxy — it handles multi-arg, template literals, etc.\n return (currentStyle as unknown as (...a: unknown[]) => string)(...args)\n },\n\n get(_target, prop) {\n if (prop in extra) {\n const value = (extra as Record<string | symbol, unknown>)[prop]\n if (typeof value === \"function\") return value\n return value\n }\n\n if (typeof prop === \"symbol\") {\n if (prop === Symbol.dispose) {\n return (extra as Record<symbol, unknown>)[Symbol.dispose]\n }\n return undefined\n }\n\n if (STYLE_METHODS.has(prop)) {\n const method = currentStyle[prop as keyof Style]\n if (typeof method === \"function\") {\n return (...args: unknown[]) => {\n const newStyle = (method as Function).apply(currentStyle, args) as Style\n return createChainProxy(newStyle, extra)\n }\n }\n }\n\n const styleProp = currentStyle[prop as keyof Style]\n if (styleProp !== undefined) {\n if (typeof styleProp === \"function\" || typeof styleProp === \"object\") {\n return createChainProxy(styleProp as Style, extra)\n }\n return styleProp\n }\n\n return undefined\n },\n\n set(_target, prop, value) {\n ;(extra as Record<string | symbol, unknown>)[prop] = value\n return true\n },\n\n defineProperty(_target, prop, descriptor) {\n Object.defineProperty(extra, prop, descriptor)\n return true\n },\n\n has(_target, prop) {\n if (prop in extra) return true\n if (typeof prop === \"string\" && prop in currentStyle) return true\n return false\n },\n }\n\n const proxyTarget = function () {} as unknown as (...args: unknown[]) => string\n return new Proxy(proxyTarget, handler) as unknown as Style & T\n}\n","/**\n * Theme derivation — transforms a ColorPalette into a Theme.\n */\n\nimport { blend, contrastFg, complement } from \"@silvery/color\"\nimport { checkContrast, ensureContrast } from \"@silvery/color\"\nimport type { ColorPalette, Theme } from \"./types.ts\"\n\nexport interface ThemeAdjustment {\n token: string\n from: string\n to: string\n against: string\n target: number\n ratioBefore: number\n ratioAfter: number\n}\n\nexport function deriveTheme(\n palette: ColorPalette,\n mode: \"ansi16\" | \"truecolor\" = \"truecolor\",\n adjustments?: ThemeAdjustment[],\n): Theme {\n if (mode === \"ansi16\") return deriveAnsi16Theme(palette)\n return deriveTruecolorTheme(palette, adjustments)\n}\n\nconst AA = 4.5\nconst DIM = 3.0\nconst FAINT = 1.5\nconst CONTROL = 3.0\n\nfunction deriveTruecolorTheme(p: ColorPalette, adjustments?: ThemeAdjustment[]): Theme {\n const dark = p.dark ?? true\n const bg = p.background\n\n function ensure(token: string, color: string, against: string, target: number): string {\n const result = ensureContrast(color, against, target)\n if (adjustments && result !== color) {\n const before = checkContrast(color, against)\n const after = checkContrast(result, against)\n adjustments.push({\n token,\n from: color,\n to: result,\n against,\n target,\n ratioBefore: before?.ratio ?? 0,\n ratioAfter: after?.ratio ?? 0,\n })\n }\n return result\n }\n\n const surfacebg = blend(bg, p.foreground, 0.05)\n const popoverbg = blend(bg, p.foreground, 0.08)\n const fg = ensure(\"fg\", p.foreground, popoverbg, AA)\n const primary = ensure(\"primary\", p.primary ?? (dark ? p.yellow : p.blue), bg, AA)\n const accent = ensure(\"accent\", complement(primary), bg, AA)\n const secondary = ensure(\"secondary\", blend(primary, accent, 0.35), bg, AA)\n const error = ensure(\"error\", p.red, bg, AA)\n const warning = ensure(\"warning\", p.yellow, bg, AA)\n const success = ensure(\"success\", p.green, bg, AA)\n const info = ensure(\"info\", blend(fg, accent, 0.5), bg, AA)\n const link = ensure(\"link\", dark ? p.brightBlue : p.blue, bg, AA)\n const mutedbg = blend(bg, p.foreground, 0.04)\n const muted = ensure(\"muted\", blend(fg, bg, 0.4), mutedbg, AA)\n const disabledfg = ensure(\"disabledfg\", blend(fg, bg, 0.5), bg, DIM)\n const border = ensure(\"border\", blend(bg, p.foreground, 0.15), bg, FAINT)\n const inputborder = ensure(\"inputborder\", blend(bg, p.foreground, 0.25), bg, CONTROL)\n const selection = ensure(\"selection\", p.selectionForeground, p.selectionBackground, AA)\n const cursor = ensure(\"cursor\", p.cursorText, p.cursorColor, AA)\n\n return {\n name: p.name ?? (dark ? \"derived-dark\" : \"derived-light\"),\n bg,\n fg,\n muted,\n mutedbg,\n surface: fg,\n surfacebg,\n popover: fg,\n popoverbg,\n inverse: contrastFg(blend(fg, bg, 0.1)),\n inversebg: blend(fg, bg, 0.1),\n cursor,\n cursorbg: p.cursorColor,\n selection,\n selectionbg: p.selectionBackground,\n primary,\n primaryfg: contrastFg(primary),\n secondary,\n secondaryfg: contrastFg(secondary),\n accent,\n accentfg: contrastFg(accent),\n error,\n errorfg: contrastFg(error),\n warning,\n warningfg: contrastFg(warning),\n success,\n successfg: contrastFg(success),\n info,\n infofg: contrastFg(info),\n border,\n inputborder,\n focusborder: link,\n link,\n disabledfg,\n palette: [\n p.black,\n p.red,\n p.green,\n p.yellow,\n p.blue,\n p.magenta,\n p.cyan,\n p.white,\n p.brightBlack,\n p.brightRed,\n p.brightGreen,\n p.brightYellow,\n p.brightBlue,\n p.brightMagenta,\n p.brightCyan,\n p.brightWhite,\n ],\n }\n}\n\nfunction deriveAnsi16Theme(p: ColorPalette): Theme {\n const dark = p.dark ?? true\n const primaryColor = dark ? p.yellow : p.blue\n return {\n name: p.name ?? (dark ? \"derived-ansi16-dark\" : \"derived-ansi16-light\"),\n bg: p.background,\n fg: p.foreground,\n muted: p.white,\n mutedbg: p.black,\n surface: p.foreground,\n surfacebg: p.black,\n popover: p.foreground,\n popoverbg: p.black,\n inverse: p.black,\n inversebg: p.brightWhite,\n cursor: p.cursorText,\n cursorbg: p.cursorColor,\n selection: p.selectionForeground,\n selectionbg: p.selectionBackground,\n primary: primaryColor,\n primaryfg: p.black,\n secondary: p.magenta,\n secondaryfg: p.black,\n accent: p.cyan,\n accentfg: p.black,\n error: dark ? p.brightRed : p.red,\n errorfg: p.black,\n warning: p.yellow,\n warningfg: p.black,\n success: dark ? p.brightGreen : p.green,\n successfg: p.black,\n info: p.cyan,\n infofg: p.black,\n border: p.brightBlack,\n inputborder: p.brightBlack,\n focusborder: dark ? p.brightBlue : p.blue,\n link: dark ? p.brightBlue : p.blue,\n disabledfg: p.brightBlack,\n palette: [\n p.black,\n p.red,\n p.green,\n p.yellow,\n p.blue,\n p.magenta,\n p.cyan,\n p.white,\n p.brightBlack,\n p.brightRed,\n p.brightGreen,\n p.brightYellow,\n p.brightBlue,\n p.brightMagenta,\n p.brightCyan,\n p.brightWhite,\n ],\n }\n}\n","/**\n * Default palettes and themes — shipped with @silvery/ansi.\n */\n\nimport type { ColorPalette, Theme } from \"./types.ts\"\n\nexport const ansi16DarkTheme: Theme = {\n name: \"dark-ansi16\",\n bg: \"\",\n fg: \"whiteBright\",\n muted: \"white\",\n mutedbg: \"black\",\n surface: \"whiteBright\",\n surfacebg: \"black\",\n popover: \"whiteBright\",\n popoverbg: \"black\",\n inverse: \"black\",\n inversebg: \"whiteBright\",\n cursor: \"black\",\n cursorbg: \"yellow\",\n selection: \"black\",\n selectionbg: \"yellow\",\n primary: \"yellow\",\n primaryfg: \"black\",\n secondary: \"white\",\n secondaryfg: \"black\",\n accent: \"blueBright\",\n accentfg: \"black\",\n error: \"redBright\",\n errorfg: \"black\",\n warning: \"yellow\",\n warningfg: \"black\",\n success: \"greenBright\",\n successfg: \"black\",\n info: \"cyan\",\n infofg: \"black\",\n border: \"gray\",\n inputborder: \"gray\",\n focusborder: \"blueBright\",\n link: \"blueBright\",\n disabledfg: \"gray\",\n palette: [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"blackBright\",\n \"redBright\",\n \"greenBright\",\n \"yellowBright\",\n \"blueBright\",\n \"magentaBright\",\n \"cyanBright\",\n \"whiteBright\",\n ],\n}\n\nexport const ansi16LightTheme: Theme = {\n name: \"light-ansi16\",\n bg: \"\",\n fg: \"black\",\n muted: \"blackBright\",\n mutedbg: \"white\",\n surface: \"black\",\n surfacebg: \"white\",\n popover: \"black\",\n popoverbg: \"white\",\n inverse: \"whiteBright\",\n inversebg: \"black\",\n cursor: \"black\",\n cursorbg: \"blue\",\n selection: \"black\",\n selectionbg: \"cyan\",\n primary: \"blue\",\n primaryfg: \"black\",\n secondary: \"blue\",\n secondaryfg: \"black\",\n accent: \"cyan\",\n accentfg: \"black\",\n error: \"red\",\n errorfg: \"black\",\n warning: \"yellow\",\n warningfg: \"black\",\n success: \"green\",\n successfg: \"black\",\n info: \"cyan\",\n infofg: \"black\",\n border: \"gray\",\n inputborder: \"gray\",\n focusborder: \"blue\",\n link: \"blueBright\",\n disabledfg: \"gray\",\n palette: [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"blackBright\",\n \"redBright\",\n \"greenBright\",\n \"yellowBright\",\n \"blueBright\",\n \"magentaBright\",\n \"cyanBright\",\n \"whiteBright\",\n ],\n}\n\nexport const defaultDarkPalette: ColorPalette = {\n name: \"default-dark\",\n dark: true,\n black: \"#2e3440\",\n red: \"#bf616a\",\n green: \"#a3be8c\",\n yellow: \"#ebcb8b\",\n blue: \"#81a1c1\",\n magenta: \"#b48ead\",\n cyan: \"#88c0d0\",\n white: \"#d8dee9\",\n brightBlack: \"#4c566a\",\n brightRed: \"#bf616a\",\n brightGreen: \"#a3be8c\",\n brightYellow: \"#ebcb8b\",\n brightBlue: \"#81a1c1\",\n brightMagenta: \"#b48ead\",\n brightCyan: \"#8fbcbb\",\n brightWhite: \"#eceff4\",\n foreground: \"#d8dee9\",\n background: \"#2e3440\",\n cursorColor: \"#d8dee9\",\n cursorText: \"#2e3440\",\n selectionBackground: \"#434c5e\",\n selectionForeground: \"#d8dee9\",\n}\n\nexport const defaultLightPalette: ColorPalette = {\n name: \"default-light\",\n dark: false,\n black: \"#5c6370\",\n red: \"#d20f39\",\n green: \"#40a02b\",\n yellow: \"#df8e1d\",\n blue: \"#1e66f5\",\n magenta: \"#8839ef\",\n cyan: \"#179299\",\n white: \"#dce0e8\",\n brightBlack: \"#6c7086\",\n brightRed: \"#d20f39\",\n brightGreen: \"#40a02b\",\n brightYellow: \"#df8e1d\",\n brightBlue: \"#1e66f5\",\n brightMagenta: \"#8839ef\",\n brightCyan: \"#179299\",\n brightWhite: \"#eff1f5\",\n foreground: \"#4c4f69\",\n background: \"#eff1f5\",\n cursorColor: \"#dc8a78\",\n cursorText: \"#eff1f5\",\n selectionBackground: \"#ccd0da\",\n selectionForeground: \"#4c4f69\",\n}\n","/**\n * Core type definitions for the theme system.\n *\n * Two-layer architecture:\n * Layer 1: ColorPalette — 22 terminal colors (what palette generators produce)\n * Layer 2: Theme — 33 semantic tokens (what UI apps consume)\n *\n * Pipeline: Palette generators → ColorPalette (22) → deriveTheme() → Theme (33)\n */\n\nexport interface ColorPalette {\n name?: string\n dark?: boolean\n primary?: string\n black: string\n red: string\n green: string\n yellow: string\n blue: string\n magenta: string\n cyan: string\n white: string\n brightBlack: string\n brightRed: string\n brightGreen: string\n brightYellow: string\n brightBlue: string\n brightMagenta: string\n brightCyan: string\n brightWhite: string\n foreground: string\n background: string\n cursorColor: string\n cursorText: string\n selectionBackground: string\n selectionForeground: string\n}\n\nexport const COLOR_PALETTE_FIELDS = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\",\n \"foreground\",\n \"background\",\n \"cursorColor\",\n \"cursorText\",\n \"selectionBackground\",\n \"selectionForeground\",\n] as const\n\nexport type AnsiColorName =\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\"\n\nexport interface Theme {\n name: string\n bg: string\n fg: string\n muted: string\n mutedbg: string\n surface: string\n surfacebg: string\n popover: string\n popoverbg: string\n inverse: string\n inversebg: string\n cursor: string\n cursorbg: string\n selection: string\n selectionbg: string\n primary: string\n primaryfg: string\n secondary: string\n secondaryfg: string\n accent: string\n accentfg: string\n error: string\n errorfg: string\n warning: string\n warningfg: string\n success: string\n successfg: string\n info: string\n infofg: string\n border: string\n inputborder: string\n focusborder: string\n link: string\n disabledfg: string\n palette: string[]\n}\n\nexport type AnsiPrimary = \"yellow\" | \"cyan\" | \"magenta\" | \"green\" | \"red\" | \"blue\" | \"white\"\nexport type HueName = \"red\" | \"orange\" | \"yellow\" | \"green\" | \"teal\" | \"blue\" | \"purple\" | \"pink\"\n","/**\n * OSC 4 Terminal Color Palette Query/Set — pure ANSI protocol.\n */\n\nconst ESC = \"\\x1b\"\nconst BEL = \"\\x07\"\n\nexport function queryPaletteColor(index: number, write: (data: string) => void): void {\n if (index < 0 || index > 255) throw new RangeError(`Palette index must be 0-255, got ${index}`)\n write(`${ESC}]4;${index};?${BEL}`)\n}\n\nexport function queryMultiplePaletteColors(indices: number[], write: (data: string) => void): void {\n for (const index of indices) queryPaletteColor(index, write)\n}\n\nexport function setPaletteColor(index: number, color: string, write: (data: string) => void): void {\n if (index < 0 || index > 255) throw new RangeError(`Palette index must be 0-255, got ${index}`)\n write(`${ESC}]4;${index};${color}${BEL}`)\n}\n\nconst OSC4_PREFIX = `${ESC}]4;`\nconst OSC4_BODY_RE = /^(\\d+);rgb:([0-9a-fA-F]{1,4})\\/([0-9a-fA-F]{1,4})\\/([0-9a-fA-F]{1,4})$/\n\nexport function parsePaletteResponse(input: string): { index: number; color: string } | null {\n const prefixIdx = input.indexOf(OSC4_PREFIX)\n if (prefixIdx === -1) return null\n const bodyStart = prefixIdx + OSC4_PREFIX.length\n let bodyEnd = input.indexOf(BEL, bodyStart)\n if (bodyEnd === -1) bodyEnd = input.indexOf(`${ESC}\\\\`, bodyStart)\n if (bodyEnd === -1) return null\n const body = input.slice(bodyStart, bodyEnd)\n const match = OSC4_BODY_RE.exec(body)\n if (!match) return null\n const index = Number.parseInt(match[1]!, 10)\n if (index < 0 || index > 255) return null\n const r = normalizeHexChannel(match[2]!)\n const g = normalizeHexChannel(match[3]!)\n const b = normalizeHexChannel(match[4]!)\n return { index, color: `#${r}${g}${b}` }\n}\n\nfunction normalizeHexChannel(hex: string): string {\n switch (hex.length) {\n case 1:\n return hex + hex\n case 2:\n return hex\n default:\n return hex.slice(0, 2)\n }\n}\n","/**\n * OSC 10/11/12 Terminal Color Queries — pure ANSI protocol.\n */\n\nconst ESC = \"\\x1b\"\nconst BEL = \"\\x07\"\n\nconst RGB_BODY_RE = /rgb:([0-9a-fA-F]{1,4})\\/([0-9a-fA-F]{1,4})\\/([0-9a-fA-F]{1,4})/\n\nfunction normalizeHexChannel(hex: string): string {\n switch (hex.length) {\n case 1:\n return hex + hex\n case 2:\n return hex\n default:\n return hex.slice(0, 2)\n }\n}\n\nfunction parseOscColorResponse(input: string, oscCode: number): string | null {\n const prefix = `${ESC}]${oscCode};`\n const prefixIdx = input.indexOf(prefix)\n if (prefixIdx === -1) return null\n const bodyStart = prefixIdx + prefix.length\n let bodyEnd = input.indexOf(BEL, bodyStart)\n if (bodyEnd === -1) bodyEnd = input.indexOf(`${ESC}\\\\`, bodyStart)\n if (bodyEnd === -1) return null\n const body = input.slice(bodyStart, bodyEnd)\n const match = RGB_BODY_RE.exec(body)\n if (!match) return null\n return `#${normalizeHexChannel(match[1]!)}${normalizeHexChannel(match[2]!)}${normalizeHexChannel(match[3]!)}`\n}\n\nasync function queryOscColor(\n write: (data: string) => void,\n read: (timeoutMs: number) => Promise<string | null>,\n oscCode: number,\n timeoutMs: number,\n): Promise<string | null> {\n write(`${ESC}]${oscCode};?${BEL}`)\n const data = await read(timeoutMs)\n if (data == null) return null\n return parseOscColorResponse(data, oscCode)\n}\n\nexport async function queryForegroundColor(\n write: (data: string) => void,\n read: (timeoutMs: number) => Promise<string | null>,\n timeoutMs = 200,\n): Promise<string | null> {\n return queryOscColor(write, read, 10, timeoutMs)\n}\n\nexport async function queryBackgroundColor(\n write: (data: string) => void,\n read: (timeoutMs: number) => Promise<string | null>,\n timeoutMs = 200,\n): Promise<string | null> {\n return queryOscColor(write, read, 11, timeoutMs)\n}\n\nexport async function queryCursorColor(\n write: (data: string) => void,\n read: (timeoutMs: number) => Promise<string | null>,\n timeoutMs = 200,\n): Promise<string | null> {\n return queryOscColor(write, read, 12, timeoutMs)\n}\n\nexport function setForegroundColor(write: (data: string) => void, color: string): void {\n write(`${ESC}]10;${color}${BEL}`)\n}\nexport function setBackgroundColor(write: (data: string) => void, color: string): void {\n write(`${ESC}]11;${color}${BEL}`)\n}\nexport function setCursorColor(write: (data: string) => void, color: string): void {\n write(`${ESC}]12;${color}${BEL}`)\n}\nexport function resetForegroundColor(write: (data: string) => void): void {\n write(`${ESC}]110${BEL}`)\n}\nexport function resetBackgroundColor(write: (data: string) => void): void {\n write(`${ESC}]111${BEL}`)\n}\nexport function resetCursorColor(write: (data: string) => void): void {\n write(`${ESC}]112${BEL}`)\n}\n\nexport async function detectColorScheme(\n write: (data: string) => void,\n read: (timeoutMs: number) => Promise<string | null>,\n timeoutMs = 200,\n): Promise<\"light\" | \"dark\" | null> {\n const bg = await queryBackgroundColor(write, read, timeoutMs)\n if (bg == null) return null\n const r = parseInt(bg.slice(1, 3), 16) / 255\n const g = parseInt(bg.slice(3, 5), 16) / 255\n const b = parseInt(bg.slice(5, 7), 16) / 255\n return 0.2126 * r + 0.7152 * g + 0.0722 * b > 0.5 ? \"light\" : \"dark\"\n}\n","/**\n * Terminal palette auto-detection via OSC queries.\n */\n\nimport type { ColorPalette, Theme } from \"./types.ts\"\nimport { deriveTheme } from \"./derive.ts\"\nimport { ansi16DarkTheme, ansi16LightTheme, defaultDarkPalette, defaultLightPalette } from \"./default-palettes.ts\"\nimport { queryMultiplePaletteColors, parsePaletteResponse } from \"../osc-palette.ts\"\nimport { queryForegroundColor, queryBackgroundColor } from \"../osc-colors.ts\"\n\nexport interface DetectedPalette {\n fg: string | null\n bg: string | null\n ansi: (string | null)[]\n dark: boolean\n palette: Partial<ColorPalette>\n}\n\nexport async function detectTerminalPalette(timeoutMs = 150): Promise<DetectedPalette | null> {\n const stdin = process.stdin\n const stdout = process.stdout\n if (!stdin.isTTY || !stdout.isTTY) return null\n\n const wasRaw = stdin.isRaw\n if (!wasRaw) stdin.setRawMode(true)\n\n let buffer = \"\"\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString()\n }\n stdin.on(\"data\", onData)\n\n try {\n const write = (s: string) => {\n stdout.write(s)\n }\n const read = (ms: number): Promise<string | null> =>\n new Promise((resolve) => {\n if (buffer.length > 0) {\n const result = buffer\n buffer = \"\"\n resolve(result)\n return\n }\n const timer = setTimeout(() => {\n resolve(buffer.length > 0 ? buffer : null)\n buffer = \"\"\n }, ms)\n const check = (_chunk: Buffer) => {\n clearTimeout(timer)\n stdin.removeListener(\"data\", check)\n const result = buffer\n buffer = \"\"\n resolve(result)\n }\n stdin.on(\"data\", check)\n })\n\n const bg = await queryBackgroundColor(write, read, timeoutMs)\n const fg = await queryForegroundColor(write, read, timeoutMs)\n\n const ansi: (string | null)[] = new Array(16).fill(null)\n queryMultiplePaletteColors(\n Array.from({ length: 16 }, (_, i) => i),\n write,\n )\n await new Promise((resolve) => setTimeout(resolve, timeoutMs))\n\n const remaining = buffer\n buffer = \"\"\n if (remaining) {\n const oscPrefix = \"\\x1b]4;\"\n let pos = 0\n while (pos < remaining.length) {\n const nextOsc = remaining.indexOf(oscPrefix, pos)\n if (nextOsc === -1) break\n let end = remaining.indexOf(\"\\x07\", nextOsc)\n if (end === -1) end = remaining.indexOf(\"\\x1b\\\\\", nextOsc)\n if (end === -1) break\n const chunk = remaining.slice(nextOsc, end + 1)\n const parsed = parsePaletteResponse(chunk)\n if (parsed && parsed.index >= 0 && parsed.index < 16) ansi[parsed.index] = parsed.color\n pos = end + 1\n }\n }\n\n const dark = bg ? isDarkColor(bg) : true\n const palette: Partial<ColorPalette> = { dark }\n if (bg) palette.background = bg\n if (fg) palette.foreground = fg\n\n const ansiFields: (keyof ColorPalette)[] = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\",\n ]\n for (let i = 0; i < 16; i++) {\n if (ansi[i]) (palette as Record<string, string>)[ansiFields[i]!] = ansi[i]!\n }\n if (fg) {\n palette.cursorColor = fg\n palette.selectionForeground = fg\n }\n if (bg) palette.cursorText = bg\n if (ansi[4]) palette.selectionBackground = ansi[4]\n\n return { fg, bg, ansi, dark, palette }\n } finally {\n stdin.removeListener(\"data\", onData)\n if (!wasRaw) stdin.setRawMode(false)\n }\n}\n\nexport interface DetectThemeOptions {\n fallback?: ColorPalette\n timeoutMs?: number\n caps?: { colorLevel?: string; darkBackground?: boolean }\n}\n\nexport async function detectTheme(opts: DetectThemeOptions = {}): Promise<Theme> {\n const colorLevel = opts.caps?.colorLevel\n if (colorLevel === \"none\" || colorLevel === \"basic\") {\n const isDark = opts.caps?.darkBackground ?? true\n return isDark ? ansi16DarkTheme : ansi16LightTheme\n }\n const detected = await detectTerminalPalette(opts.timeoutMs)\n const isDark = detected?.dark ?? opts.caps?.darkBackground ?? true\n const fallback = opts.fallback ?? (isDark ? defaultDarkPalette : defaultLightPalette)\n if (!detected) return deriveTheme(fallback)\n const merged: ColorPalette = { ...fallback, ...stripNulls(detected.palette) }\n return deriveTheme(merged)\n}\n\nfunction stripNulls(partial: Partial<ColorPalette>): Partial<ColorPalette> {\n const result: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(partial)) {\n if (v != null) result[k] = v\n }\n return result as Partial<ColorPalette>\n}\n\nfunction isDarkColor(hex: string): boolean {\n const r = parseInt(hex.slice(1, 3), 16) / 255\n const g = parseInt(hex.slice(3, 5), 16) / 255\n const b = parseInt(hex.slice(5, 7), 16) / 255\n return 0.2126 * r + 0.7152 * g + 0.0722 * b <= 0.5\n}\n","/**\n * Color scheme detection via Mode 2031.\n *\n * Mode 2031 is a terminal protocol for reporting the current color scheme\n * (dark/light). It works cross-platform (Linux, Windows Terminal, SSH sessions)\n * unlike macOS-only AppleInterfaceStyle detection.\n *\n * Protocol:\n * - Enable: \\x1b[?2031h\n * - Disable: \\x1b[?2031l\n * - Response: \\x1b[?2031;1n (dark) or \\x1b[?2031;2n (light)\n * - Terminal sends the same response when the scheme changes\n *\n * @see https://contour-terminal.org/vt-extensions/color-palette-update-notifications/\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst ESC = \"\\x1b\"\nconst CSI = `${ESC}[`\n\n/** Enable Mode 2031 color scheme reporting */\nexport const ENABLE_COLOR_SCHEME_REPORTING = `${CSI}?2031h`\n\n/** Disable Mode 2031 color scheme reporting */\nexport const DISABLE_COLOR_SCHEME_REPORTING = `${CSI}?2031l`\n\n/** Response pattern: \\x1b[?2031;Nn where N is 1 (dark) or 2 (light) */\nconst MODE_2031_RESPONSE_RE = /\\x1b\\[\\?2031;([12])n/\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ColorScheme = \"dark\" | \"light\" | \"unknown\"\n\nexport interface ColorSchemeDetector extends Disposable {\n /** Current detected scheme */\n readonly scheme: ColorScheme\n /** Subscribe to scheme changes. Returns unsubscribe function. */\n subscribe(listener: (scheme: \"dark\" | \"light\") => void): () => void\n /** Start detection (sends Mode 2031 enable to terminal) */\n start(): void\n /** Stop detection (sends Mode 2031 disable to terminal) */\n stop(): void\n}\n\nexport interface ColorSchemeDetectorOptions {\n /** Write data to the terminal */\n write: (data: string) => void\n /** Subscribe to terminal input. Returns unsubscribe function. */\n onData: (handler: (data: string) => void) => () => void\n /** Fallback detection when Mode 2031 is not supported */\n fallback?: () => ColorScheme\n /** Timeout in ms to wait for Mode 2031 response (default: 200) */\n timeoutMs?: number\n}\n\n// =============================================================================\n// Parser\n// =============================================================================\n\n/**\n * Parse a Mode 2031 response from terminal input data.\n * Returns \"dark\", \"light\", or null if not a Mode 2031 response.\n */\nexport function parseColorSchemeResponse(data: string): \"dark\" | \"light\" | null {\n const match = MODE_2031_RESPONSE_RE.exec(data)\n if (!match) return null\n return match[1] === \"1\" ? \"dark\" : \"light\"\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create a color scheme detector using Mode 2031.\n *\n * Strategy:\n * 1. Send Mode 2031 enable sequence\n * 2. Parse response within timeout\n * 3. If no response: terminal doesn't support 2031, use fallback\n * 4. If response: use it, continue listening for change notifications\n * 5. On dispose: send disable sequence\n *\n * @example\n * ```ts\n * const detector = createColorSchemeDetector({\n * write: (data) => process.stdout.write(data),\n * onData: (handler) => {\n * process.stdin.on(\"data\", handler)\n * return () => process.stdin.off(\"data\", handler)\n * },\n * fallback: () => \"dark\",\n * })\n * detector.start()\n * console.log(detector.scheme) // \"unknown\" until response arrives\n * detector.subscribe((scheme) => console.log(\"scheme changed:\", scheme))\n * ```\n */\nexport function createColorSchemeDetector(options: ColorSchemeDetectorOptions): ColorSchemeDetector {\n const { write, onData, fallback, timeoutMs = 200 } = options\n\n let scheme: ColorScheme = \"unknown\"\n let started = false\n let stopped = false\n let unsubData: (() => void) | null = null\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n let mode2031Supported = false\n\n const listeners = new Set<(scheme: \"dark\" | \"light\") => void>()\n\n function handleResponse(detected: \"dark\" | \"light\") {\n mode2031Supported = true\n if (timeoutId !== null) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n if (scheme !== detected) {\n scheme = detected\n for (const listener of listeners) {\n listener(detected)\n }\n }\n }\n\n function handleData(data: string) {\n const result = parseColorSchemeResponse(data)\n if (result !== null) {\n handleResponse(result)\n }\n }\n\n function applyFallback() {\n if (mode2031Supported || stopped) return\n if (fallback) {\n const result = fallback()\n if (result !== \"unknown\" && scheme === \"unknown\") {\n scheme = result\n for (const listener of listeners) {\n listener(result)\n }\n }\n }\n }\n\n return {\n get scheme() {\n return scheme\n },\n\n subscribe(listener: (scheme: \"dark\" | \"light\") => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n\n start() {\n if (started || stopped) return\n started = true\n\n // Subscribe to terminal input to catch responses\n unsubData = onData(handleData)\n\n // Send Mode 2031 enable\n write(ENABLE_COLOR_SCHEME_REPORTING)\n\n // Set timeout for fallback\n timeoutId = setTimeout(applyFallback, timeoutMs)\n },\n\n stop() {\n if (!started || stopped) return\n stopped = true\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n\n if (unsubData) {\n unsubData()\n unsubData = null\n }\n\n // Send Mode 2031 disable\n write(DISABLE_COLOR_SCHEME_REPORTING)\n\n listeners.clear()\n },\n\n [Symbol.dispose]() {\n if (started && !stopped) {\n // Only send disable if we successfully enabled\n stopped = true\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n\n if (unsubData) {\n unsubData()\n unsubData = null\n }\n\n write(DISABLE_COLOR_SCHEME_REPORTING)\n listeners.clear()\n }\n },\n }\n}\n","/**\n * @silvery/ansi — Everything terminal.\n *\n * Unified package for terminal styling, ANSI primitives, color detection,\n * theme derivation, and terminal control sequences.\n *\n * @example\n * ```ts\n * // Pre-configured global — zero config\n * import { style } from \"@silvery/ansi\"\n * style.bold.red(\"error\")\n * style.primary(\"deploy\")\n *\n * // Create your own\n * import { createStyle, createPlainStyle } from \"@silvery/ansi\"\n * const s = createStyle({ theme })\n *\n * // Terminal control\n * import { enterAltScreen, cursorTo, enableMouse } from \"@silvery/ansi\"\n *\n * // Theme derivation\n * import { deriveTheme, detectTheme } from \"@silvery/ansi\"\n * ```\n *\n * @module\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type { ColorLevel, RGB, AnsiColorName, Color, UnderlineStyle, TerminalCaps } from \"./types\"\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport {\n UNDERLINE_CODES,\n UNDERLINE_STANDARD,\n UNDERLINE_RESET_STANDARD,\n UNDERLINE_COLOR_RESET,\n buildUnderlineColorCode,\n HYPERLINK_START,\n HYPERLINK_END,\n buildHyperlink,\n} from \"./constants\"\n\n// =============================================================================\n// Detection\n// =============================================================================\n\nexport {\n detectCursor,\n detectInput,\n detectColor,\n detectUnicode,\n detectExtendedUnderline,\n detectTerminalCaps,\n defaultCaps,\n} from \"./detection\"\n\n// =============================================================================\n// SGR Codes\n// =============================================================================\n\nexport { fgColorCode, bgColorCode } from \"./sgr-codes\"\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { ANSI_REGEX, stripAnsi, displayLength } from \"./utils\"\n\n// =============================================================================\n// Color Maps & Quantization\n// =============================================================================\n\nexport {\n MODIFIERS,\n FG_COLORS,\n BG_COLORS,\n ANSI_16_COLORS,\n nearestAnsi16,\n rgbToAnsi256,\n fgFromRgb,\n bgFromRgb,\n} from \"./color-maps\"\n\n// =============================================================================\n// Terminal Control Sequences\n// =============================================================================\n\nexport {\n enterAltScreen,\n leaveAltScreen,\n clearScreen,\n clearLine,\n cursorTo,\n cursorHome,\n cursorHide,\n cursorShow,\n cursorStyle,\n setTitle,\n enableMouse,\n disableMouse,\n enableBracketedPaste,\n disableBracketedPaste,\n enableSyncUpdate,\n disableSyncUpdate,\n setScrollRegion,\n resetScrollRegion,\n scrollUp,\n scrollDown,\n enableKittyKeyboard,\n disableKittyKeyboard,\n} from \"./terminal-control\"\n\n// =============================================================================\n// Extended Underline Functions\n// =============================================================================\n\nexport {\n underline,\n curlyUnderline,\n dottedUnderline,\n dashedUnderline,\n doubleUnderline,\n underlineColor,\n styledUnderline,\n} from \"./underline-ext\"\n\n// =============================================================================\n// Hyperlink Functions\n// =============================================================================\n\nexport { hyperlink } from \"./hyperlink\"\n\n// =============================================================================\n// Style — Theme-aware chalk replacement\n// =============================================================================\n\nexport { createStyle, createPlainStyle, style, resolveThemeColor } from \"./style/style\"\nexport { createMixedStyle } from \"./style/mixed-proxy\"\nexport { THEME_TOKEN_DEFAULTS } from \"./style/colors\"\nexport type { Style, StyleOptions, ThemeLike } from \"./style/types\"\n\n// =============================================================================\n// Theme Derivation\n// =============================================================================\n\nexport { deriveTheme } from \"./theme/derive\"\nexport type { ThemeAdjustment } from \"./theme/derive\"\nexport { ansi16DarkTheme, ansi16LightTheme, defaultDarkPalette, defaultLightPalette } from \"./theme/default-palettes\"\nexport type { ColorPalette, Theme, AnsiPrimary, HueName } from \"./theme/types\"\nexport type { AnsiColorName as PaletteColorName } from \"./theme/types\"\nexport { COLOR_PALETTE_FIELDS } from \"./theme/types\"\n\n// =============================================================================\n// Theme Detection (async, OSC-based)\n// =============================================================================\n\nexport { detectTerminalPalette, detectTheme } from \"./theme/detect\"\nexport type { DetectedPalette, DetectThemeOptions } from \"./theme/detect\"\n\n// =============================================================================\n// OSC Protocol — Terminal color queries\n// =============================================================================\n\nexport { queryPaletteColor, queryMultiplePaletteColors, setPaletteColor, parsePaletteResponse } from \"./osc-palette\"\n\nexport {\n queryForegroundColor,\n queryBackgroundColor,\n queryCursorColor,\n setForegroundColor,\n setBackgroundColor,\n setCursorColor,\n resetForegroundColor,\n resetBackgroundColor,\n resetCursorColor,\n detectColorScheme,\n} from \"./osc-colors\"\n\n// =============================================================================\n// Color Scheme Detection (Mode 2031)\n// =============================================================================\n\nexport {\n createColorSchemeDetector,\n parseColorSchemeResponse,\n ENABLE_COLOR_SCHEME_REPORTING,\n DISABLE_COLOR_SCHEME_REPORTING,\n} from \"./color-scheme\"\nexport type { ColorSchemeDetector, ColorSchemeDetectorOptions, ColorScheme } from \"./color-scheme\"\n"],"mappings":"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"}