silvery 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/{animation-DhINOJk8.mjs → animation-Cn64yepo.mjs} +1 -1
  2. package/dist/{animation-DhINOJk8.mjs.map → animation-Cn64yepo.mjs.map} +1 -1
  3. package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLOitHKx.mjs} +1 -1
  4. package/dist/ansi-CLOitHKx.mjs.map +1 -0
  5. package/dist/{ansi-CsjnZtAw.d.mts → ansi-Cc33mW54.d.mts} +1 -1
  6. package/dist/{ansi-CsjnZtAw.d.mts.map → ansi-Cc33mW54.d.mts.map} +1 -1
  7. package/dist/{chunk-BSw8zbkd.mjs → chunk-Vs_PY4HZ.mjs} +1 -1
  8. package/dist/cli-BKp0YtBD.mjs +4 -0
  9. package/dist/{context-BjWgrikx.mjs → context-BU5LkkIy.mjs} +8 -7
  10. package/dist/context-BU5LkkIy.mjs.map +1 -0
  11. package/dist/devtools-9QY4teqI.mjs +2 -0
  12. package/dist/{devtools-CeO9X_uv.mjs → devtools-DxkSLXDA.mjs} +4 -5
  13. package/dist/devtools-DxkSLXDA.mjs.map +1 -0
  14. package/dist/{eta-BnQSZcWf.mjs → eta-Bb3RH3wh.mjs} +1 -1
  15. package/dist/{eta-BnQSZcWf.mjs.map → eta-Bb3RH3wh.mjs.map} +1 -1
  16. package/dist/{flexily-zero-adapter-BOM0cl8R.mjs → flexily-zero-adapter-BlQa46nr.mjs} +21 -64
  17. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +1 -0
  18. package/dist/{flexily-zero-adapter-V8R3HQtK.mjs → flexily-zero-adapter-CMxXhdOL.mjs} +1 -1
  19. package/dist/{image-B0zMbVUr.mjs → image-CTII5QWI.mjs} +3 -3
  20. package/dist/image-CTII5QWI.mjs.map +1 -0
  21. package/dist/{index-Bh3U1K09.d.mts → index-BXslOebb.d.mts} +547 -137
  22. package/dist/index-BXslOebb.d.mts.map +1 -0
  23. package/dist/{index-C4vrhbud.d.mts → index-BnA7mNpo.d.mts} +1 -1
  24. package/dist/{index-C4vrhbud.d.mts.map → index-BnA7mNpo.d.mts.map} +1 -1
  25. package/dist/index-D3saHouR.d.mts +1392 -0
  26. package/dist/index-D3saHouR.d.mts.map +1 -0
  27. package/dist/index.d.mts +5 -33
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs +13 -13
  30. package/dist/{layout-engine--drvrWjD.mjs → layout-engine-B6Cdz1yZ.mjs} +1 -1
  31. package/dist/{layout-engine-Dr3cY5U4.mjs → layout-engine-ClUgv6jB.mjs} +3 -3
  32. package/dist/{layout-engine-Dr3cY5U4.mjs.map → layout-engine-ClUgv6jB.mjs.map} +1 -1
  33. package/dist/{multi-progress-CcdqJFlf.mjs → multi-progress-Bq9Oi_WI.mjs} +3 -3
  34. package/dist/{multi-progress-CcdqJFlf.mjs.map → multi-progress-Bq9Oi_WI.mjs.map} +1 -1
  35. package/dist/{multi-progress-DQ-uUzLf.d.mts → multi-progress-DAQC7eap.d.mts} +2 -2
  36. package/dist/{multi-progress-DQ-uUzLf.d.mts.map → multi-progress-DAQC7eap.d.mts.map} +1 -1
  37. package/dist/{node-CP5WChgr.mjs → node-BeWlnCPY.mjs} +4 -4
  38. package/dist/node-BeWlnCPY.mjs.map +1 -0
  39. package/dist/{progress-bar-IrUjkLfU.mjs → progress-bar-CXE5Qfkd.mjs} +4 -4
  40. package/dist/progress-bar-CXE5Qfkd.mjs.map +1 -0
  41. package/dist/reconciler-Cwgm8hRR.mjs +8459 -0
  42. package/dist/reconciler-Cwgm8hRR.mjs.map +1 -0
  43. package/dist/{render-string-DVfgc8xr.mjs → render-string-Cbuf63Ya.mjs} +936 -136
  44. package/dist/render-string-Cbuf63Ya.mjs.map +1 -0
  45. package/dist/{render-string-BwLG7rIX.mjs → render-string-Tv-jqM16.mjs} +1 -1
  46. package/dist/runtime.d.mts +2 -2
  47. package/dist/runtime.mjs +3 -3
  48. package/dist/{spinner-BRkaJI0N.d.mts → spinner-CGo34vyR.d.mts} +2 -2
  49. package/dist/{spinner-BRkaJI0N.d.mts.map → spinner-CGo34vyR.d.mts.map} +1 -1
  50. package/dist/{spinner-BmldKx0M.mjs → spinner-CeOmcuw_.mjs} +3 -3
  51. package/dist/spinner-CeOmcuw_.mjs.map +1 -0
  52. package/dist/src-B5GjfG7g.mjs +4305 -0
  53. package/dist/src-B5GjfG7g.mjs.map +1 -0
  54. package/dist/{src-CJPXf3fC.mjs → src-C2uvC-r0.mjs} +7535 -6467
  55. package/dist/src-C2uvC-r0.mjs.map +1 -0
  56. package/dist/{src-D8kLrQBT.mjs → src-CChwjk0Z.mjs} +8 -86
  57. package/dist/src-CChwjk0Z.mjs.map +1 -0
  58. package/dist/{src-D_BS-as7.mjs → src-NCKb8kE5.mjs} +777 -776
  59. package/dist/src-NCKb8kE5.mjs.map +1 -0
  60. package/dist/theme.d.mts +2 -130
  61. package/dist/theme.mjs +3 -8
  62. package/dist/{types-B4A8Ebba.d.mts → types-BH_v3iMT.d.mts} +1 -1
  63. package/dist/{types-B4A8Ebba.d.mts.map → types-BH_v3iMT.d.mts.map} +1 -1
  64. package/dist/{types-e4dpfbSa.mjs → types-Bk2yw9Qj.mjs} +3 -3
  65. package/dist/types-Bk2yw9Qj.mjs.map +1 -0
  66. package/dist/ui/animation.d.mts +1 -1
  67. package/dist/ui/animation.mjs +1 -1
  68. package/dist/ui/ansi.d.mts +1 -1
  69. package/dist/ui/ansi.mjs +1 -1
  70. package/dist/ui/cli.d.mts +3 -3
  71. package/dist/ui/cli.mjs +5 -5
  72. package/dist/ui/display.d.mts +1 -1
  73. package/dist/ui/display.mjs.map +1 -1
  74. package/dist/ui/image.d.mts +1 -1
  75. package/dist/ui/image.mjs +1 -1
  76. package/dist/ui/input.d.mts +1 -1
  77. package/dist/ui/input.d.mts.map +1 -1
  78. package/dist/ui/input.mjs +2 -4
  79. package/dist/ui/input.mjs.map +1 -1
  80. package/dist/ui/progress.d.mts +3 -3
  81. package/dist/ui/progress.d.mts.map +1 -1
  82. package/dist/ui/progress.mjs +3 -3
  83. package/dist/ui/progress.mjs.map +1 -1
  84. package/dist/ui/react.d.mts +1 -1
  85. package/dist/ui/react.d.mts.map +1 -1
  86. package/dist/ui/react.mjs +2 -2
  87. package/dist/ui/react.mjs.map +1 -1
  88. package/dist/ui/utils.mjs +1 -1
  89. package/dist/ui/wrappers.d.mts +2 -2
  90. package/dist/ui/wrappers.mjs +1 -1
  91. package/dist/ui.d.mts +5 -5
  92. package/dist/ui.mjs +6 -6
  93. package/dist/{useLatest-6xqnGIU6.d.mts → useLatest-Bg2x4bfP.d.mts} +1 -1
  94. package/dist/{useLatest-6xqnGIU6.d.mts.map → useLatest-Bg2x4bfP.d.mts.map} +1 -1
  95. package/dist/{with-text-input-lUh9gYAG.d.mts → with-text-input-CRfoiFFG.d.mts} +3 -3
  96. package/dist/with-text-input-CRfoiFFG.d.mts.map +1 -0
  97. package/dist/{wrappers-JrEYTuKA.mjs → wrappers-UTADQkSY.mjs} +4 -4
  98. package/dist/wrappers-UTADQkSY.mjs.map +1 -0
  99. package/dist/{yoga-adapter-Bc8XT9cN.mjs → yoga-adapter-8oRGRw8V.mjs} +2 -2
  100. package/dist/{yoga-adapter-Bc8XT9cN.mjs.map → yoga-adapter-8oRGRw8V.mjs.map} +1 -1
  101. package/dist/yoga-adapter-D_CcxSt5.mjs +2 -0
  102. package/package.json +54 -45
  103. package/dist/UPNG-DvKjM6wE.mjs +0 -5076
  104. package/dist/UPNG-DvKjM6wE.mjs.map +0 -1
  105. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs +0 -6
  106. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs.map +0 -1
  107. package/dist/ansi-C6Qs1Wn2.mjs.map +0 -1
  108. package/dist/apng-CvSlLBtc.mjs +0 -3
  109. package/dist/apng-DFFVOItr.mjs +0 -70
  110. package/dist/apng-DFFVOItr.mjs.map +0 -1
  111. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  112. package/dist/backend-DU0Y938U.mjs +0 -13396
  113. package/dist/backend-DU0Y938U.mjs.map +0 -1
  114. package/dist/backends-BihMKFY_.mjs +0 -1181
  115. package/dist/backends-BihMKFY_.mjs.map +0 -1
  116. package/dist/backends-Dk_5G_gC.mjs +0 -3
  117. package/dist/cli-GwJ0S2In.mjs +0 -4
  118. package/dist/context-BjWgrikx.mjs.map +0 -1
  119. package/dist/derive-O_Kb1Bk_.d.mts +0 -28
  120. package/dist/derive-O_Kb1Bk_.d.mts.map +0 -1
  121. package/dist/devtools-CeO9X_uv.mjs.map +0 -1
  122. package/dist/devtools-nX4tj6OH.mjs +0 -2
  123. package/dist/flexily-zero-adapter-BOM0cl8R.mjs.map +0 -1
  124. package/dist/gif-B9Uq4qZA.mjs +0 -73
  125. package/dist/gif-B9Uq4qZA.mjs.map +0 -1
  126. package/dist/gif-BdrLRBmM.mjs +0 -3
  127. package/dist/gifenc-DfhOb4xr.mjs +0 -730
  128. package/dist/gifenc-DfhOb4xr.mjs.map +0 -1
  129. package/dist/image-B0zMbVUr.mjs.map +0 -1
  130. package/dist/index-Bh3U1K09.d.mts.map +0 -1
  131. package/dist/index-dehZ18K-.d.mts +0 -679
  132. package/dist/index-dehZ18K-.d.mts.map +0 -1
  133. package/dist/key-mapping-7k2ufK2b.mjs +0 -3
  134. package/dist/key-mapping-WLUmxjx1.mjs +0 -132
  135. package/dist/key-mapping-WLUmxjx1.mjs.map +0 -1
  136. package/dist/node-CP5WChgr.mjs.map +0 -1
  137. package/dist/progress-bar-IrUjkLfU.mjs.map +0 -1
  138. package/dist/reconciler-B8uxQxaU.mjs +0 -16482
  139. package/dist/reconciler-B8uxQxaU.mjs.map +0 -1
  140. package/dist/render-string-DVfgc8xr.mjs.map +0 -1
  141. package/dist/resvg-js-Cwipz-_J.mjs +0 -203
  142. package/dist/resvg-js-Cwipz-_J.mjs.map +0 -1
  143. package/dist/spinner-BmldKx0M.mjs.map +0 -1
  144. package/dist/src-C0sOQW-t.mjs +0 -3866
  145. package/dist/src-C0sOQW-t.mjs.map +0 -1
  146. package/dist/src-CJPXf3fC.mjs.map +0 -1
  147. package/dist/src-D8kLrQBT.mjs.map +0 -1
  148. package/dist/src-D_BS-as7.mjs.map +0 -1
  149. package/dist/theme.d.mts.map +0 -1
  150. package/dist/theme.mjs.map +0 -1
  151. package/dist/types-e4dpfbSa.mjs.map +0 -1
  152. package/dist/with-text-input-lUh9gYAG.d.mts.map +0 -1
  153. package/dist/wrapper-CE6GQ27z.mjs +0 -3527
  154. package/dist/wrapper-CE6GQ27z.mjs.map +0 -1
  155. package/dist/wrappers-JrEYTuKA.mjs.map +0 -1
  156. package/dist/yoga-adapter-B8LZpQcE.mjs +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-NCKb8kE5.mjs","names":["isHexLeaf","HEX_LEAF_RE","CSI","ESC","ESC","hexToRgb","oklchDeltaE","ESC","BEL","normalizeHexChannel","stripNulls"],"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/flatten.ts","../packages/ansi/src/terminal-control.ts","../packages/ansi/src/kitty-graphics.ts","../packages/ansi/src/style/colors.ts","../packages/ansi/src/style/style.ts","../packages/ansi/src/style/mixed-proxy.ts","../packages/ansi/src/theme/invariants.ts","../packages/ansi/src/theme/derived.ts","../packages/ansi/src/theme/derive.ts","../packages/ansi/src/theme/monochrome.ts","../packages/ansi/src/theme/fingerprint.ts","../packages/ansi/src/theme/types.ts","../packages/ansi/src/theme/default-schemes.ts","../packages/ansi/src/osc-palette.ts","../packages/ansi/src/osc-colors.ts","../packages/ansi/src/theme/detect.ts","../packages/ansi/src/theme/orchestrator.ts","../packages/ansi/src/theme/tokens.ts","../packages/ansi/src/color-scheme.ts","../packages/ansi/src/theme/generators.ts","../packages/ansi/src/theme/auto-generate.ts","../packages/ansi/src/theme/generate.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 = [\n \"CI\",\n \"GITHUB_ACTIONS\",\n \"GITLAB_CI\",\n \"JENKINS_URL\",\n \"BUILDKITE\",\n \"CIRCLECI\",\n \"TRAVIS\",\n]\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 (\n term.includes(\"xterm\") ||\n term.includes(\"rxvt\") ||\n term.includes(\"screen\") ||\n term.includes(\"tmux\")\n ) {\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/**\n * Canonical hex values for the 16 standard ANSI color slots.\n *\n * These are the xterm-256 reference values — the same RGB values used by\n * `nearestAnsi16` for quantization. Used to convert ANSI16 slot-name themes\n * (e.g., \"yellow\") into hex-valued themes (e.g., \"#808000\") so Theme objects\n * are pure hex across all tiers.\n *\n * Terminal-rendering behavior is unchanged: the output phase reads `colorLevel`\n * and emits 4-bit ANSI codes when `colorLevel === \"basic\"` — the hex value is\n * only carried in the Theme object itself, not emitted verbatim.\n */\nexport const ANSI16_SLOT_HEX: Record<string, string> = {\n black: \"#000000\",\n red: \"#800000\",\n green: \"#008000\",\n yellow: \"#808000\",\n blue: \"#000080\",\n magenta: \"#800080\",\n cyan: \"#008080\",\n white: \"#c0c0c0\",\n blackBright: \"#808080\",\n gray: \"#808080\",\n grey: \"#808080\",\n redBright: \"#ff0000\",\n greenBright: \"#00ff00\",\n yellowBright: \"#ffff00\",\n blueBright: \"#0000ff\",\n magentaBright: \"#ff00ff\",\n cyanBright: \"#00ffff\",\n whiteBright: \"#ffffff\",\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// =============================================================================\n// Hex-in / hex-out tier quantization (for previews)\n// =============================================================================\n\n/**\n * Convert a 256-palette index back to its canonical xterm hex value.\n *\n * Mirrors `rgbToAnsi256`:\n * - 16–231: 6×6×6 color cube. Index = 16 + 36·r + 6·g + b (each channel 0..5).\n * - 232–255: 24-step grayscale ramp.\n * - 0–15: ANSI 16 slots (reuses ANSI16_SLOT_HEX for exact parity with\n * `nearestAnsi16`).\n */\nexport function ansi256ToHex(idx: number): string {\n if (idx < 0 || idx > 255 || !Number.isInteger(idx)) return \"#000000\"\n if (idx < 16) {\n // ANSI16 slot — index order matches ANSI_16_COLORS above.\n const [r, g, b] = ANSI_16_COLORS[idx]!\n return rgbToHexHash(r, g, b)\n }\n if (idx < 232) {\n // 6×6×6 cube. xterm levels: 0, 95, 135, 175, 215, 255.\n const levels = [0, 95, 135, 175, 215, 255] as const\n const i = idx - 16\n const r = levels[Math.floor(i / 36)]!\n const g = levels[Math.floor((i % 36) / 6)]!\n const b = levels[i % 6]!\n return rgbToHexHash(r, g, b)\n }\n // 232..255 grayscale ramp: 8, 18, 28, ..., 238.\n const gray = 8 + (idx - 232) * 10\n return rgbToHexHash(gray, gray, gray)\n}\n\nfunction rgbToHexHash(r: number, g: number, b: number): string {\n const h = (n: number) => n.toString(16).padStart(2, \"0\")\n return `#${h(r)}${h(g)}${h(b)}`\n}\n\nfunction parseHexLocal(hex: string): [number, number, number] | null {\n if (typeof hex !== \"string\") return null\n let s = hex.trim()\n if (s.startsWith(\"#\")) s = s.slice(1)\n if (s.length === 3) {\n s = s\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n }\n if (s.length !== 6) return null\n const r = parseInt(s.slice(0, 2), 16)\n const g = parseInt(s.slice(2, 4), 16)\n const b = parseInt(s.slice(4, 6), 16)\n if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) return null\n return [r, g, b]\n}\n\n/**\n * Color tier for preview quantization.\n *\n * Mirrors the tiers a real terminal would resolve to when the output phase\n * emits ANSI: `truecolor` (pass-through), `256` (6×6×6 cube + grayscale ramp),\n * `ansi16` (nearest of 16 slots), `mono` (luminance → black/white).\n */\nexport type ColorTier = \"truecolor\" | \"256\" | \"ansi16\" | \"mono\"\n\n/**\n * Hex-in / hex-out quantization for previews.\n *\n * Takes any hex color and returns the hex a real terminal at that tier would\n * actually emit. Used by the Sterling storybook to make the `1/2/3/4` tier\n * toggle visibly different in-process — the output phase already does this\n * when writing to a real TTY, but preview surfaces (theme swatches, rendered\n * components inside a storybook app) bypass output-phase quantization. Apply\n * `quantizeHex` at render time to mimic tier-specific terminal output.\n *\n * - `truecolor`: returns the input unchanged (normalized to `#rrggbb`).\n * - `256`: snaps to the nearest xterm-256 slot, then returns that slot's hex.\n * - `ansi16`: snaps to one of the 16 standard slots (canonical xterm RGB).\n * - `mono`: luminance threshold (>= 0.5 → `#ffffff`, else `#000000`).\n *\n * Returns the input unchanged if it cannot be parsed as a hex color.\n */\nexport function quantizeHex(hex: string, tier: ColorTier): string {\n const rgb = parseHexLocal(hex)\n if (!rgb) return hex\n const [r, g, b] = rgb\n if (tier === \"truecolor\") return rgbToHexHash(r, g, b)\n if (tier === \"256\") return ansi256ToHex(rgbToAnsi256(r, g, b))\n if (tier === \"ansi16\") {\n const idx = nearestAnsi16(r, g, b)\n const [cr, cg, cb] = ANSI_16_COLORS[idx]!\n return rgbToHexHash(cr, cg, cb)\n }\n // mono: Rec. 709 luminance threshold.\n const y = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255\n return y >= 0.5 ? \"#ffffff\" : \"#000000\"\n}\n\n/**\n * Hex-regex used to detect hex leaves during tier quantization walks.\n * Matches `#rgb` and `#rrggbb` (case-insensitive).\n */\nconst HEX_LEAF_RE = /^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/\n\nfunction isHexLeaf(value: unknown): value is string {\n return typeof value === \"string\" && HEX_LEAF_RE.test(value)\n}\n\n/**\n * Pre-quantize every hex leaf in a Theme (or any object tree) to the\n * requested color tier.\n *\n * Walks the input recursively — each string leaf matching `#rgb` / `#rrggbb`\n * is passed through {@link quantizeHex}; all other values (numbers, booleans,\n * non-hex strings like `\"Nord\"`, null/undefined, arrays of non-hex values)\n * pass through unchanged. Arrays and nested objects are rebuilt with\n * quantized leaves.\n *\n * Works on both the legacy ANSI Theme (flat hex tokens + `palette` array)\n * and the Sterling Theme (nested roles + flat tokens) — the structural rule\n * \"any leaf that looks like a hex is a color value\" holds for both.\n *\n * @example Pre-cache tier variants\n * ```ts\n * import { pickColorLevel } from \"silvery\"\n *\n * const themes = {\n * truecolor: theme,\n * ansi16: pickColorLevel(theme, \"ansi16\"),\n * mono: pickColorLevel(theme, \"mono\"),\n * }\n * ```\n *\n * @example Storybook — show multiple tiers simultaneously\n * ```tsx\n * <ThemeProvider theme={pickColorLevel(theme, \"ansi16\")}>\n * <AlertPreview />\n * </ThemeProvider>\n * ```\n *\n * Notes:\n * - `truecolor` is a no-op — returns the input unchanged (identity).\n * - The result is structurally identical to the input (same keys, same\n * nesting); only hex leaves are remapped.\n * - Idempotent per tier: `pickColorLevel(pickColorLevel(t, \"ansi16\"), \"ansi16\")`\n * yields the same hex values as `pickColorLevel(t, \"ansi16\")`.\n * - Does not freeze the returned object. Callers that want immutability\n * should `Object.freeze()` (or deep-freeze) the result themselves.\n */\nexport function pickColorLevel<T>(theme: T, tier: ColorTier): T {\n if (tier === \"truecolor\") return theme\n return pickColorLevelWalk(theme, tier)\n}\n\nfunction pickColorLevelWalk<T>(obj: T, tier: ColorTier): T {\n if (obj == null) return obj\n if (isHexLeaf(obj)) return quantizeHex(obj, tier) as unknown as T\n if (Array.isArray(obj)) {\n return obj.map((v) => pickColorLevelWalk(v, tier)) as unknown as T\n }\n if (typeof obj === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n out[k] = pickColorLevelWalk(v, tier)\n }\n return out as T\n }\n return obj\n}\n","/**\n * Generic flat-projection helper for design-system Themes.\n *\n * Any DesignSystem whose Theme is a nested POJO of hex-string leaves can\n * project those leaves as hyphen-keyed siblings on the SAME object — the\n * \"flat form\" — with no copy and no Proxy. Both paths reference the same\n * string. The object is frozen at the end.\n *\n * ```ts\n * const theme = bakeFlat({\n * accent: { fg: \"#0969da\", bg: \"#0969da\", fgOn: \"#ffffff\",\n * hover: { fg: \"#0550ae\", bg: \"#0550ae\" } },\n * surface: { default: \"#ffffff\", subtle: \"#f6f8fa\" },\n * cursor: { fg: \"#ffffff\", bg: \"#0969da\" },\n * })\n *\n * theme.accent.bg === theme[\"bg-accent\"] // true — same reference\n * theme[\"bg-accent-hover\"] // \"#0550ae\"\n * theme[\"bg-surface-subtle\"] // \"#f6f8fa\"\n * ```\n *\n * Consumed by:\n * - Sterling (`@silvery/theme/sterling`) via `defineDesignSystem({ flatten: true })`\n * - Any alternative DesignSystem that wants flat-projection for free\n *\n * @see defaultFlattenRule — the channel-role-state rule Sterling uses\n * @see FlattenRule — bring-your-own rule for non-Sterling conventions\n */\n\n/**\n * Given a nested path to a hex leaf, return the flat-key sibling to write\n * onto the root object. Return `null` to skip that leaf (no flat alias).\n *\n * Paths are arrays of segment names as they appear in the nested object,\n * e.g. `[\"accent\", \"hover\", \"bg\"]`.\n */\nexport type FlattenRule = (path: readonly string[]) => string | null\n\n/**\n * Channel-role-state default rule. Matches Sterling / Primer / CSS-var\n * conventions: `{kind}-{role}[-{state}]`, with `fg-on-{role}` for `fgOn`,\n * and implicit-kind collapse for the `surface` / `border` roles.\n *\n * Mapping examples:\n * | Path | Flat key |\n * | ---------------------------- | --------------------------- |\n * | `accent.fg` | `fg-accent` |\n * | `accent.bg` | `bg-accent` |\n * | `accent.fgOn` | `fg-on-accent` |\n * | `accent.border` | `border-accent` |\n * | `accent.hover.bg` | `bg-accent-hover` |\n * | `accent.active.fg` | `fg-accent-active` |\n * | `info.hover.bg` | `bg-info-hover` |\n * | `cursor.fg` | `fg-cursor` |\n * | `muted.bg` | `bg-muted` |\n * | `surface.default` | `bg-surface-default` |\n * | `surface.subtle` | `bg-surface-subtle` |\n * | `surface.hover` | `bg-surface-hover` |\n * | `border.default` | `border-default` |\n * | `border.focus` | `border-focus` |\n * | `border.muted` | `border-muted` |\n *\n * Returns `null` for depth-1 leaves (e.g. `mode`, `name` — not role-scoped)\n * so metadata doesn't get flattened. The caller (`bakeFlat`) already filters\n * non-hex leaves, but the rule also guards paths shorter than 2 segments.\n */\nexport const defaultFlattenRule: FlattenRule = (path) => {\n // Metadata at the root (mode, name) — no flat alias.\n if (path.length < 2) return null\n\n const role = path[0]!\n const last = path[path.length - 1]!\n const mid = path.slice(1, -1)\n\n // Rule B: fgOn → fg-on-{role}\n if (last === \"fgOn\") return `fg-on-${role}`\n\n // Rule A: last segment is a channel kind (fg | bg | border)\n if (last === \"fg\" || last === \"bg\" || last === \"border\") {\n // Optional state variant: mid[0] when present (hover, active, …).\n const state = mid.length > 0 ? mid.join(\"-\") : undefined\n return state ? `${last}-${role}-${state}` : `${last}-${role}`\n }\n\n // Rule C: role implies a channel kind; leaf is a level/state name.\n // surface → bg-surface-{last}\n // border → border-{last} (collapse — don't emit \"border-border-…\")\n if (role === \"surface\") return `bg-surface-${last}`\n if (role === \"border\") return `border-${last}`\n\n // Unknown shape — no flat alias.\n return null\n}\n\n/** Matches `#rgb`, `#rrggbb`, and `#rrggbbaa` (case-insensitive). */\nconst HEX_LEAF_RE = /^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?([0-9a-fA-F]{2})?$/\n\nfunction isHexLeaf(value: unknown): value is string {\n return typeof value === \"string\" && HEX_LEAF_RE.test(value)\n}\n\n/**\n * Populate flat hyphen-keys onto `theme` in-place by walking hex leaves and\n * asking `rule` where each leaf should also live at the root.\n *\n * Both the nested and flat forms reference the SAME string (not copies) —\n * `bakeFlat({...}).accent.bg === bakeFlat({...})[\"bg-accent\"]`.\n *\n * `rule` defaults to {@link defaultFlattenRule} (channel-role-state).\n * Rules returning `null` for a path skip that leaf — useful for suppressing\n * metadata or implementing partial projections.\n *\n * The returned object is deep-frozen. The input object is mutated in place\n * and returned; callers that want an unfrozen copy should `structuredClone`\n * before calling.\n *\n * @param theme nested POJO of hex-string leaves (plus optional metadata)\n * @param rule how to compute flat keys from nested paths\n * @returns the same object, with flat keys added and frozen\n */\nexport function bakeFlat<T extends object>(theme: T, rule: FlattenRule = defaultFlattenRule): T {\n const root = theme as Record<string, unknown>\n // Idempotence: re-baking a frozen Theme is a no-op. Callers sometimes\n // bake defensively (e.g. ThemeProvider round-trips) — don't throw on\n // the second bake.\n if (Object.isFrozen(root)) return theme\n walk(root, [], root, rule)\n freezeDeep(root)\n return theme\n}\n\nfunction walk(\n node: Record<string, unknown>,\n path: string[],\n root: Record<string, unknown>,\n rule: FlattenRule,\n): void {\n for (const key of Object.keys(node)) {\n // Skip flat keys we've already written during this walk so we don't\n // recurse into them (they're siblings at the root and would otherwise\n // be re-visited with path=[flatKey], which produces garbage mappings).\n if (node === root && key.includes(\"-\")) continue\n\n const value = node[key]\n const subpath = [...path, key]\n\n if (isHexLeaf(value)) {\n const flatKey = rule(subpath)\n if (flatKey !== null) {\n root[flatKey] = value\n }\n continue\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n walk(value as Record<string, unknown>, subpath, root, rule)\n }\n }\n}\n\nfunction freezeDeep(o: unknown): void {\n if (o === null || typeof o !== \"object\") return\n if (Object.isFrozen(o)) return\n Object.freeze(o)\n for (const k of Object.keys(o as object)) {\n freezeDeep((o as Record<string, unknown>)[k])\n }\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 * Kitty graphics protocol — minimal encoder for cell-sized overlay placements.\n *\n * Used by the backdrop-fade pass to fade emoji/wide-char glyphs (SGR 2 \"dim\"\n * is a no-op on bitmap emoji in most terminals). We upload a single tiny\n * translucent RGBA image once, then emit `a=p` placements over specific cells\n * with `z=1` so the overlay sits on top of the already-rendered emoji glyph.\n *\n * ## Protocol summary\n *\n * The Kitty graphics protocol uses APC escapes: `\\x1b_G<control>;<payload>\\x1b\\\\`.\n * Control parameters are key=value pairs separated by commas. Payload is\n * base64-encoded image data (only on upload).\n *\n * Key commands we use:\n *\n * | Command | Meaning |\n * | ----------- | ------------------------------------------------------------- |\n * | `a=t` | Transmit (upload) image data |\n * | `a=p` | Place a previously-uploaded image |\n * | `a=d` | Delete (remove placements and/or free images) |\n * | `f=32` | RGBA pixel format (4 bytes per pixel) |\n * | `s=W,v=H` | Source image dimensions in pixels |\n * | `i=<id>` | Image ID (stable across frames) |\n * | `p=<id>` | Placement ID (stable per cell) |\n * | `C=1` | Disable cursor movement after placement (crucial for overlay) |\n * | `c=<cols>` | Cell column extent |\n * | `r=<rows>` | Cell row extent |\n * | `z=<zidx>` | Z-index (0 = below text, 1 = above text) |\n * | `q=2` | Quiet mode (suppress OK/error responses from terminal) |\n *\n * Because the image is tiled into a single cell, `c=1,r=1,C=1` keeps the\n * placement local — it doesn't shift the rendered text layout.\n *\n * @see https://sw.kovidgoyal.net/kitty/graphics-protocol/\n */\n\n// =============================================================================\n// Image ID namespace\n// =============================================================================\n\n/**\n * Stable image ID for the backdrop scrim overlay. Uploaded once per terminal\n * session; placements reuse this ID. Value is arbitrary — just needs to be\n * unique within the process. 0xBEEF picked for grep-ability.\n */\nexport const BACKDROP_SCRIM_IMAGE_ID = 0xbeef\n\n/**\n * Placement ID base for backdrop scrim placements. Each cell gets a unique\n * placement ID derived from `x * OFFSET + y`. This lets us target individual\n * placements for deletion while leaving others alive. `i=<id>,p=<pid>` refers\n * to a single placement.\n */\nexport const BACKDROP_PLACEMENT_X_STRIDE = 10_000\n\n/**\n * Derive a stable placement ID for a given (x, y) cell. Max column = 9999,\n * which comfortably exceeds any realistic terminal width.\n */\nexport function backdropPlacementId(x: number, y: number): number {\n return x * BACKDROP_PLACEMENT_X_STRIDE + y + 1 // +1 to avoid ID=0 (reserved)\n}\n\n// =============================================================================\n// Base64 encoding (minimal, no deps)\n// =============================================================================\n\n/**\n * Encode a Uint8Array as base64. Kitty expects standard base64 (with `+`/`/`\n * and `=` padding). We use Buffer when available (Node/Bun), fall back to\n * btoa for browser/canvas adapters (the canvas target may never actually\n * need to emit Kitty escapes — this is just defensive).\n */\nfunction base64Encode(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\")\n }\n let binary = \"\"\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]!)\n // btoa may not exist in non-browser; guard.\n const g = globalThis as { btoa?: (s: string) => string }\n if (typeof g.btoa === \"function\") return g.btoa(binary)\n throw new Error(\"base64 encoding unavailable in this environment\")\n}\n\n// =============================================================================\n// Scrim pixel data — translucent neutral\n// =============================================================================\n\n/**\n * Build a tiny RGBA pixel grid for the scrim overlay.\n *\n * Kitty's graphics protocol paints images at native pixel resolution scaled\n * to `c` x `r` cells. A 2x2 RGBA image scaled to a single cell (~10x20 px\n * depending on font) gives us a smooth fill. We intentionally keep the\n * image tiny to minimize base64 payload size on the upload frame.\n *\n * Pixel color: `(r, g, b, a)` where `r/g/b` is the scrim tint and `a` is the\n * alpha (0-255). For a dark backdrop we use near-black at ~50% alpha, which\n * darkens the emoji underneath without completely hiding it.\n *\n * Width/height = 2 pixels — 16 bytes total, ~24 bytes base64. Upload is ~60\n * bytes including control chars. One-time cost per modal session.\n */\nexport function buildScrimPixels(\n tint: { r: number; g: number; b: number },\n alpha: number, // 0-255\n): Uint8Array {\n const a = Math.max(0, Math.min(255, Math.round(alpha)))\n const r = Math.max(0, Math.min(255, Math.round(tint.r)))\n const g = Math.max(0, Math.min(255, Math.round(tint.g)))\n const b = Math.max(0, Math.min(255, Math.round(tint.b)))\n const bytes = new Uint8Array(2 * 2 * 4)\n for (let i = 0; i < 4; i++) {\n bytes[i * 4 + 0] = r\n bytes[i * 4 + 1] = g\n bytes[i * 4 + 2] = b\n bytes[i * 4 + 3] = a\n }\n return bytes\n}\n\n// =============================================================================\n// Escape emitters\n// =============================================================================\n\n/**\n * APC wrapper: `\\x1b_G<control>[;<payload>]\\x1b\\\\`.\n *\n * The protocol allows chunking large payloads via `m=1` but our scrim is\n * tiny — always fits in one chunk.\n */\nfunction apc(control: string, payload?: string): string {\n if (payload === undefined || payload === \"\") {\n return `\\x1b_G${control}\\x1b\\\\`\n }\n return `\\x1b_G${control};${payload}\\x1b\\\\`\n}\n\n/**\n * Emit a one-shot image upload. Terminal stores the RGBA pixels under\n * `i=<imageId>` and keeps them until explicitly freed. Subsequent placements\n * reference the image by ID without re-sending pixel data.\n *\n * `q=2` suppresses the terminal's OK/error reply — otherwise we'd see stray\n * APC sequences back on stdin.\n */\nexport function kittyUploadScrimImage(\n pixels: Uint8Array,\n width: number,\n height: number,\n imageId: number = BACKDROP_SCRIM_IMAGE_ID,\n): string {\n const payload = base64Encode(pixels)\n // a=t: transmit. f=32: RGBA. s/v: image pixel dims. i: stable image ID.\n // q=2: quiet (no response). o=z: no compression.\n const control = `a=t,f=32,s=${width},v=${height},i=${imageId},q=2`\n return apc(control, payload)\n}\n\n/**\n * Emit a cell placement. Places `imageId` at the current cursor position\n * covering `c` cols and `r` rows with z-index `z`. `C=1` prevents the cursor\n * from advancing after placement (critical — otherwise every placement\n * shifts the cursor, breaking the caller's positioning).\n *\n * Placement ID (`p=<pid>`) is stable per cell so incremental frames can\n * replace placements without accumulating duplicates.\n */\nexport function kittyPlaceAt(opts: {\n imageId?: number\n placementId: number\n cols?: number\n rows?: number\n z?: number\n}): string {\n const imageId = opts.imageId ?? BACKDROP_SCRIM_IMAGE_ID\n const cols = opts.cols ?? 1\n const rows = opts.rows ?? 1\n const z = opts.z ?? 1\n // a=p: place. i: image. p: placement. c/r: cell extent. C=1: don't move cursor.\n // z: z-index (>0 = above text). q=2: quiet.\n return apc(`a=p,i=${imageId},p=${opts.placementId},c=${cols},r=${rows},z=${z},C=1,q=2`)\n}\n\n/**\n * Delete a single placement by (imageId, placementId) without freeing the\n * image itself. The image stays cached for future placements.\n */\nexport function kittyDeletePlacement(\n placementId: number,\n imageId: number = BACKDROP_SCRIM_IMAGE_ID,\n): string {\n // a=d: delete. d=i: delete by image+placement id. Lowercase `i`/`p` means\n // \"don't free stored data, just remove these placements\" (uppercase `I`/`P`\n // would free the stored image too).\n return apc(`a=d,d=i,i=${imageId},p=${placementId},q=2`)\n}\n\n/**\n * Delete ALL placements of our scrim image without freeing the image.\n * Used when the modal closes — we leave the image cached in case another\n * modal opens, but remove every overlay cell at once.\n */\nexport function kittyDeleteAllScrimPlacements(imageId: number = BACKDROP_SCRIM_IMAGE_ID): string {\n // d=i with no placement ID targets all placements of the given image.\n return apc(`a=d,d=i,i=${imageId},q=2`)\n}\n\n// =============================================================================\n// Cursor positioning helpers\n// =============================================================================\n\n/**\n * Absolute cursor position (CUP). 1-based row/col per VT100.\n *\n * Used to position the cursor before emitting a placement so the placement\n * lands in the right cell. Kept small and local — the rest of the pipeline\n * uses more elaborate cursor tracking, but for out-of-band overlay emission\n * we just want a deterministic \"jump here, place, done.\"\n */\nexport function cupTo(col: number, row: number): string {\n return `\\x1b[${row + 1};${col + 1}H`\n}\n\n/**\n * Save cursor (DECSC) / restore cursor (DECRC). The overlay emitter wraps its\n * own emissions in save/restore so it doesn't disturb the main output phase's\n * cursor tracking.\n */\nexport const CURSOR_SAVE = \"\\x1b7\"\nexport const CURSOR_RESTORE = \"\\x1b8\"\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 {\n BG_COLORS,\n FG_COLORS,\n MODIFIERS,\n THEME_TOKEN_DEFAULTS,\n bgFromRgb,\n fgFromRgb,\n hexToRgb,\n} 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(\n name: string | undefined,\n theme: object | undefined,\n): 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.\n *\n * Resolution order:\n * 1. Direct key lookup — finds Sterling flat keys (`bg-accent`,\n * `fg-on-error`, `border-focus`, …) and legacy kebab keys\n * (`primary-hover`, `fg-hover`, `bg-surface-hover`) and plain names\n * (`bg`, `primary`, `muted`).\n * 2. No-hyphen fallback — `$surface-bg` → `theme.surfacebg`,\n * `$focus-border` → `theme.focusborder`.\n *\n * The old `LEGACY_ALIASES` table (e.g. `fgmuted` → `muted`, `bgsurface` →\n * `surfacebg`) was removed in 0.18.1 once every shipped default Theme ships\n * with Sterling flat tokens baked in — `theme[\"fg-muted\"]` and\n * `theme[\"bg-surface-subtle\"]` are direct fields now, so no alias fallback\n * is required for canonical Sterling tokens. Tokens that existed only as\n * aliases (e.g. `$bg-surface`, `$fg-on-primary`, `$border-input`,\n * `$fg-disabled`) no longer resolve — callers should use the canonical\n * Sterling equivalents (`$bg-surface-default`, `$fg-on-accent`,\n * `$border-default`, `$fg-muted`).\n */\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 const themeObj = theme as Record<string, unknown>\n // Direct kebab lookup — covers Sterling flat keys AND legacy kebab keys\n // AND plain tokens (`bg`, `primary`, `muted`, …).\n const direct = themeObj[token]\n if (typeof direct === \"string\") return direct\n // No-hyphen fallback for legacy names: `$surface-bg` → `surfacebg`,\n // `$focus-border` → `focusborder`, etc.\n const noHyphen = token.replace(/-/g, \"\")\n if (noHyphen !== token) {\n const stripped = themeObj[noHyphen]\n if (typeof stripped === \"string\") return stripped\n }\n return 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\"\n ? fgFromRgb(rgb[0], rgb[1], rgb[2], level)\n : bgFromRgb(rgb[0], rgb[1], rgb[2], level)\n const close = prop === \"hex\" ? \"39\" : \"49\"\n return createChainWithRef(\n { opens: [...state.opens, code], closes: [...state.closes, close] },\n ref,\n )\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(\n { opens: [...state.opens, code], closes: [...state.closes, close] },\n ref,\n )\n }\n }\n\n if (prop === \"ansi256\") {\n return (code: number) => {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef(\n { opens: [...state.opens, `38;5;${code}`], closes: [...state.closes, \"39\"] },\n ref,\n )\n }\n }\n\n if (prop === \"bgAnsi256\") {\n return (code: number) => {\n if (level === null) return createChainWithRef(state, ref)\n return createChainWithRef(\n { opens: [...state.opens, `48;5;${code}`], closes: [...state.closes, \"49\"] },\n ref,\n )\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(\n { opens: [...state.opens, code], closes: [...state.closes, \"39\"] },\n ref,\n )\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(\n { opens: [...state.opens, String(fallback)], closes: [...state.closes, \"39\"] },\n ref,\n )\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 ||\n prop in FG_COLORS ||\n prop in BG_COLORS ||\n THEME_TOKENS.has(prop) ||\n 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 invariants — post-derivation visibility + optional WCAG checks.\n *\n * Two independent invariant groups:\n *\n * 1. **Visibility (always checked)** — selection and cursor must be\n * distinguishable from bg. These fail silently because ensureContrast\n * doesn't touch `bg-selected`/`bg-cursor`; you get \"invisible selection\"\n * bugs that only surface via user complaints.\n *\n * 2. **WCAG contrast (opt-in)** — `deriveTheme()` already runs `ensureContrast`\n * on every text/bg pair as it builds the Theme (lenient auto-adjust). A\n * second validation pass is redundant for normal use. Enable it explicitly\n * at build time to *verify* that shipped themes meet the targets, or when\n * loading a hand-authored Theme object that skipped `deriveTheme`.\n *\n * This is why `validateThemeInvariants` defaults to `{ wcag: false }` — the\n * existing derivation already handles contrast. Callers opt in via\n * `validateThemeInvariants(theme, { wcag: true })` for strict pre-ship audits.\n *\n * All token access is Sterling-shaped — flat hyphen keys (`bg-accent`,\n * `fg-on-error`, `border-focus`) exist on every Theme via the derive +\n * bakeFlat pipeline. No concat-kebab legacy names (`primaryfg`, `mutedbg`, …)\n * — those were removed in silvery 0.19.0 (Sterling interior migration).\n */\n\nimport { checkContrast, hexToOklch, deltaE as oklchDeltaE } from \"@silvery/color\"\nimport type { Theme } from \"./types.ts\"\n\n// WCAG thresholds (match derive.ts)\nexport const AA_RATIO = 4.5\nexport const LARGE_RATIO = 3.0\nexport const FAINT_RATIO = 1.5\n\n// Visibility thresholds — calibrated against real terminal schemes (Catppuccin,\n// Dracula, Nord, Solarized). The design spec's 0.15 was aspirational; light\n// themes have less L range to work with, so a 0.08 floor is realistic while\n// still catching \"selection invisible\" bugs.\nexport const SELECTION_DELTA_L = 0.08\nexport const CURSOR_DELTA_E = 0.15 // OKLCH ΔE (≈15 on ×100 scale)\n\nexport interface InvariantViolation {\n /** Which invariant failed (e.g. \"contrast:fg/bg-surface-overlay\", \"visibility:selection\"). */\n rule: string\n /** Token pair or concept involved. */\n tokens: string[]\n /** Measured value (e.g. contrast ratio or ΔE). */\n actual: number\n /** Required threshold. */\n required: number\n /** Human-readable error for logs/throws. */\n message: string\n}\n\nexport interface InvariantResult {\n /** True when all invariants pass. */\n ok: boolean\n /** Every failing invariant. */\n violations: InvariantViolation[]\n}\n\nexport interface InvariantOptions {\n /**\n * Check WCAG contrast ratios. Default `false` because `deriveTheme` already\n * runs `ensureContrast` during derivation (lenient auto-adjust). Enable for\n * build-time audits of bundled themes or to validate hand-authored Theme\n * objects that bypassed derivation.\n */\n wcag?: boolean\n /**\n * Check selection + cursor visibility (ΔL / ΔE vs bg). Default `true`\n * because these aren't handled by ensureContrast — they're independent\n * visibility invariants.\n */\n visibility?: boolean\n}\n\ninterface Pair {\n rule: string\n /**\n * Sterling flat-token key for the fg hex. Access via bracket lookup\n * (`theme[pair.fg]`). Keys follow `<channel>-<role>[-<state>]` or\n * `<channel>-on-<role>` grammar (see `@silvery/ansi/flatten.ts`).\n *\n * Two non-Sterling keys survive: `fg` and `bg` — they are the raw scheme\n * foreground and background. Sterling carries them at the top level as\n * convenience shortcuts (see `Theme` type).\n */\n fg: string\n /** Sterling flat-token key for the bg hex. */\n bg: string\n min: number\n}\n\n/**\n * Contrast invariant pairs — all Sterling flat-token keys.\n *\n * These keys are populated on every Theme at derivation time via `bakeFlat`;\n * bracket access (`theme[\"bg-accent\"]`) is the canonical lookup form and is\n * what `validateThemeInvariants` uses below.\n */\nconst CONTRAST_PAIRS: Pair[] = [\n // AA — body text and accent-on-surface pairs\n { rule: \"contrast:fg/bg\", fg: \"fg\", bg: \"bg\", min: AA_RATIO },\n { rule: \"contrast:fg/bg-surface-subtle\", fg: \"fg\", bg: \"bg-surface-subtle\", min: AA_RATIO },\n { rule: \"contrast:fg/bg-surface-overlay\", fg: \"fg\", bg: \"bg-surface-overlay\", min: AA_RATIO },\n { rule: \"contrast:fg-muted/bg-muted\", fg: \"fg-muted\", bg: \"bg-muted\", min: LARGE_RATIO },\n { rule: \"contrast:fg-accent/bg\", fg: \"fg-accent\", bg: \"bg\", min: AA_RATIO },\n { rule: \"contrast:fg-error/bg\", fg: \"fg-error\", bg: \"bg\", min: AA_RATIO },\n { rule: \"contrast:fg-warning/bg\", fg: \"fg-warning\", bg: \"bg\", min: AA_RATIO },\n { rule: \"contrast:fg-success/bg\", fg: \"fg-success\", bg: \"bg\", min: AA_RATIO },\n { rule: \"contrast:fg-info/bg\", fg: \"fg-info\", bg: \"bg\", min: AA_RATIO },\n\n // AA — fg-on-<role> pairs (text on filled emphasis surfaces)\n { rule: \"contrast:fg-on-accent/bg-accent\", fg: \"fg-on-accent\", bg: \"bg-accent\", min: AA_RATIO },\n { rule: \"contrast:fg-on-error/bg-error\", fg: \"fg-on-error\", bg: \"bg-error\", min: AA_RATIO },\n {\n rule: \"contrast:fg-on-warning/bg-warning\",\n fg: \"fg-on-warning\",\n bg: \"bg-warning\",\n min: AA_RATIO,\n },\n {\n rule: \"contrast:fg-on-success/bg-success\",\n fg: \"fg-on-success\",\n bg: \"bg-success\",\n min: AA_RATIO,\n },\n { rule: \"contrast:fg-on-info/bg-info\", fg: \"fg-on-info\", bg: \"bg-info\", min: AA_RATIO },\n\n // AA — selection + cursor pairs\n {\n rule: \"contrast:fg-on-selected/bg-selected\",\n fg: \"fg-on-selected\",\n bg: \"bg-selected\",\n min: AA_RATIO,\n },\n { rule: \"contrast:fg-cursor/bg-cursor\", fg: \"fg-cursor\", bg: \"bg-cursor\", min: AA_RATIO },\n\n // Non-text chrome (WCAG 1.4.11)\n {\n rule: \"contrast:border-default/bg\",\n fg: \"border-default\",\n bg: \"bg\",\n min: LARGE_RATIO,\n },\n { rule: \"contrast:border-focus/bg\", fg: \"border-focus\", bg: \"bg\", min: LARGE_RATIO },\n\n // Structural dividers — border-muted is the subtle rule line\n { rule: \"contrast:border-muted/bg\", fg: \"border-muted\", bg: \"bg\", min: FAINT_RATIO },\n]\n\nfunction lightness(hex: string): number | null {\n const o = hexToOklch(hex)\n return o ? o.L : null\n}\n\n/**\n * Validate post-derivation invariants on a Theme.\n *\n * Default: visibility checks only (selection ΔL, cursor ΔE). These are\n * invariants that `deriveTheme` doesn't enforce and that matter for every\n * theme regardless of authoring pedigree.\n *\n * Opt into WCAG contrast checks via `{ wcag: true }`. Use at build-time to\n * verify bundled themes, or when loading hand-authored Theme objects that\n * didn't flow through `deriveTheme`'s `ensureContrast` pass.\n *\n * Non-hex values (ANSI names from `ansi16` mode) are skipped with no\n * violation — ANSI 16 themes can't be contrast-checked in hex space.\n *\n * @example\n * ```ts\n * // Default — visibility only, fast\n * const { ok, violations } = validateThemeInvariants(theme)\n *\n * // Build-time audit — full WCAG check\n * const audit = validateThemeInvariants(theme, { wcag: true })\n * ```\n */\nexport function validateThemeInvariants(\n theme: Theme,\n opts: InvariantOptions = {},\n): InvariantResult {\n const checkWcag = opts.wcag ?? false\n const checkVisibility = opts.visibility ?? true\n const violations: InvariantViolation[] = []\n\n if (checkWcag) {\n // Bracket access into Sterling flat tokens + the `fg`/`bg` root shortcuts.\n // We type-cast through Record because `pair.fg` / `pair.bg` are strings\n // (Sterling flat keys) rather than legacy `keyof Theme` members.\n const themeRecord = theme as unknown as Record<string, string | undefined>\n for (const pair of CONTRAST_PAIRS) {\n const fg = themeRecord[pair.fg]\n const bg = themeRecord[pair.bg]\n if (typeof fg !== \"string\" || typeof bg !== \"string\") continue\n const r = checkContrast(fg, bg)\n if (r === null) continue // non-hex — skip (ANSI16 mode)\n if (r.ratio < pair.min) {\n violations.push({\n rule: pair.rule,\n tokens: [pair.fg, pair.bg],\n actual: r.ratio,\n required: pair.min,\n message: `${pair.fg} (${fg}) on ${pair.bg} (${bg}) is ${r.ratio.toFixed(2)}:1, needs ${pair.min.toFixed(1)}:1`,\n })\n }\n }\n }\n\n if (checkVisibility) {\n // Read Sterling flat keys first, fall back to legacy fields. Sterling\n // doesn't yet ship `bg-selected` or `bg-cursor` as first-class flat\n // tokens (only `bg-selected-hover`), so the legacy shape `selectionbg`\n // / `cursorbg` is the authoritative source until Sterling's selection +\n // cursor flat tokens land. Tracked under\n // `km-silvery.sterling-selection-tokens`.\n const themeAny = theme as unknown as Record<string, string | undefined>\n const selectionBg = themeAny[\"bg-selected\"] ?? themeAny[\"selectionbg\"] ?? \"\"\n const cursorBg = themeAny[\"bg-cursor\"] ?? themeAny[\"cursorbg\"] ?? \"\"\n // Prefer Sterling key in violation tokens/messages when populated.\n const selectionKey = themeAny[\"bg-selected\"] !== undefined ? \"bg-selected\" : \"selectionbg\"\n const cursorKey = themeAny[\"bg-cursor\"] !== undefined ? \"bg-cursor\" : \"cursorbg\"\n\n // Selection visibility — ΔL ≥ 0.08 between selection bg and bg (so highlight is distinguishable)\n const lBg = lightness(theme.bg)\n const lSelBg = lightness(selectionBg)\n if (lBg !== null && lSelBg !== null) {\n const dL = Math.abs(lSelBg - lBg)\n if (dL < SELECTION_DELTA_L) {\n violations.push({\n rule: \"visibility:selection\",\n tokens: [selectionKey, \"bg\"],\n actual: dL,\n required: SELECTION_DELTA_L,\n message: `${selectionKey} (${selectionBg}) differs from bg (${theme.bg}) by ΔL=${dL.toFixed(3)}, needs ≥ ${SELECTION_DELTA_L.toFixed(2)}`,\n })\n }\n }\n\n // Cursor visibility — ΔE ≥ 0.15 (OKLCH) between cursor bg and bg\n const oBg = hexToOklch(theme.bg)\n const oCursorBg = hexToOklch(cursorBg)\n if (oBg && oCursorBg) {\n const de = oklchDeltaE(oBg, oCursorBg)\n if (de < CURSOR_DELTA_E) {\n violations.push({\n rule: \"visibility:cursor\",\n tokens: [cursorKey, \"bg\"],\n actual: de,\n required: CURSOR_DELTA_E,\n message: `${cursorKey} (${cursorBg}) differs from bg (${theme.bg}) by ΔE=${de.toFixed(3)}, needs ≥ ${CURSOR_DELTA_E.toFixed(2)}`,\n })\n }\n }\n }\n\n return { ok: violations.length === 0, violations }\n}\n\n/**\n * Format violations as a multiline error message for throws/logs.\n */\nexport function formatViolations(violations: InvariantViolation[]): string {\n if (violations.length === 0) return \"\"\n return violations.map((v) => ` - [${v.rule}] ${v.message}`).join(\"\\n\")\n}\n\n/**\n * Thrown by `loadTheme({ mode: \"strict\" })` when invariants fail.\n * Carries the violations array for programmatic inspection.\n */\nexport class ThemeInvariantError extends Error {\n readonly violations: InvariantViolation[]\n constructor(violations: InvariantViolation[]) {\n super(\n `Theme invariants failed (${violations.length} violation${violations.length === 1 ? \"\" : \"s\"}):\\n${formatViolations(violations)}`,\n )\n this.name = \"ThemeInvariantError\"\n this.violations = violations\n }\n}\n","/**\n * deriveFields — single helper that fills all derived theme sections.\n *\n * Eliminates 4-way duplication of brand, categorical ring, state-variant, and\n * variants population across:\n * - derive.ts (deriveTruecolorTheme + deriveAnsi16Theme)\n * - default-schemes.ts (ansi16DarkTheme + ansi16LightTheme)\n * - @silvery/theme/generate.ts (generateTheme)\n * - @silvery/theme/schemes/index.ts (ansi16DarkTheme + ansi16LightTheme)\n *\n * Canonical authority: derive.ts truecolor path. ANSI16 paths are aligned to\n * deriveAnsi16Theme output (which is itself the canonical ANSI16 reference).\n */\n\nimport { brighten, darken } from \"@silvery/color\"\nimport type { Theme, Variant } from \"./types.ts\"\n\n// =============================================================================\n// Shared DEFAULT_VARIANTS constant — single source of truth.\n// All 4 sites reference this exact object (or a structurally identical copy).\n// =============================================================================\n\n/** Default typography variants — token-based, works across any theme. */\nexport const DEFAULT_VARIANTS: Record<string, Variant> = {\n h1: { color: \"$primary\", bold: true },\n h2: { color: \"$accent\", bold: true },\n h3: { bold: true },\n body: {},\n \"body-muted\": { color: \"$muted\" },\n \"fine-print\": { color: \"$muted\", dim: true },\n strong: { bold: true },\n em: { italic: true },\n link: { color: \"$link\", underlineStyle: \"single\" },\n key: { color: \"$accent\", bold: true },\n code: { backgroundColor: \"$mutedbg\" },\n kbd: { backgroundColor: \"$mutedbg\", color: \"$accent\", bold: true },\n}\n\n// =============================================================================\n// Input type\n// =============================================================================\n\n/**\n * Inputs for `deriveFields`.\n *\n * `shift` controls hover/active lightness derivation:\n * - Truecolor: pass `(hex, amount) => dark ? brighten(hex, amount) : darken(hex, amount)`\n * - ANSI16: omit (or pass `undefined`) — hover/active fall back to the base color.\n */\nexport interface DeriveFieldsInput {\n /**\n * Truecolor shift mode: when `dark === true` hover/active brighten;\n * when `dark === false` they darken. Omit (or pass `undefined`) for ANSI16\n * — hover/active fall back to the base color (no OKLCH math on 16-color).\n *\n * Moved inside derived.ts to avoid the cross-chunk closure bug that broke\n * Verify Publishable #111 — tsdown split `shift` callers from their\n * brighten/darken imports.\n */\n dark?: boolean\n /**\n * @deprecated Pass `dark` instead. Retained one release; ignored when\n * `dark` is provided. If present without `dark`, invoked as before.\n */\n shift?: (color: string, amount: number) => string\n /** The primary color. */\n primary: string\n /** The accent color. */\n accent: string\n /** The foreground color. */\n fg: string\n /** The selectionbg color — used for bgSelectedHover. */\n selectionbg: string\n /** The surfacebg color — used for bgSurfaceHover. */\n surfacebg: string\n /**\n * Pre-computed categorical ring colors. ANSI16 callers pass named slots;\n * truecolor callers pass ensureContrast-adjusted hex values.\n */\n ring: {\n red: string\n orange: string\n yellow: string\n green: string\n teal: string\n blue: string\n purple: string\n pink: string\n }\n}\n\n// Legacy discriminant-union type aliases — retained for any external callers\n// that still reference the old named types. Both are now identical to\n// DeriveFieldsInput (the `mode` field is no longer read).\n// @deprecated Use DeriveFieldsInput directly and pass `shift` instead of `mode`.\nexport type DeriveFieldsAnsi16Input = DeriveFieldsInput\nexport type DeriveFieldsTruecolorInput = DeriveFieldsInput\n\n// =============================================================================\n// Output type\n// =============================================================================\n\nexport interface DerivedFields {\n // Brand\n brand: string\n \"brand-hover\": string\n \"brand-active\": string\n\n // Categorical ring (canonical names)\n red: string\n orange: string\n yellow: string\n green: string\n teal: string\n blue: string\n purple: string\n pink: string\n\n // State variants — flat kebab keys, resolved via direct lookup.\n \"primary-hover\": string\n \"primary-active\": string\n \"accent-hover\": string\n \"accent-active\": string\n \"fg-hover\": string\n \"fg-active\": string\n \"bg-selected-hover\": string\n \"bg-surface-hover\": string\n\n // Typography variants\n variants: Theme[\"variants\"]\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Derive the shared \"delta\" fields common to every theme object:\n * brand tokens, categorical ring, state variants, and typography variants.\n *\n * Pass a `shift` function for truecolor hover/active derivation (OKLCH\n * brighten/darken). Omit `shift` for ANSI16 — hover/active fall back to the\n * base color (no intermediate intensities available on 16-color terminals).\n *\n * @example\n * // Truecolor (dark theme)\n * import { brighten, darken } from \"@silvery/color\"\n * deriveFields({ shift: (hex, a) => brighten(hex, a), primary, ... })\n *\n * @example\n * // ANSI16 — no shift function\n * deriveFields({ primary, accent, fg, selectionbg, surfacebg, ring })\n */\nexport function deriveFields(input: DeriveFieldsInput): DerivedFields {\n const { dark, shift, primary, accent, fg, selectionbg, surfacebg, ring } = input\n\n // Priority: explicit `dark` flag (uses local brighten/darken, survives tsdown\n // chunking) → legacy `shift` callback (deprecated) → identity (ANSI16).\n const applyShift =\n dark !== undefined\n ? (color: string, amount: number) => (dark ? brighten(color, amount) : darken(color, amount))\n : (shift ?? ((color: string, _amount: number) => color))\n\n return {\n // Brand — maps to primary; hover/active use OKLCH shift or passthrough\n brand: primary,\n \"brand-hover\": applyShift(primary, 0.04),\n \"brand-active\": applyShift(primary, 0.08),\n\n // Categorical ring\n ...ring,\n\n // State variants — OKLCH shift or passthrough (ANSI16)\n \"primary-hover\": applyShift(primary, 0.04),\n \"primary-active\": applyShift(primary, 0.08),\n \"accent-hover\": applyShift(accent, 0.04),\n \"accent-active\": applyShift(accent, 0.08),\n \"fg-hover\": applyShift(fg, 0.04),\n \"fg-active\": applyShift(fg, 0.08),\n \"bg-selected-hover\": applyShift(selectionbg, 0.04),\n \"bg-surface-hover\": applyShift(surfacebg, 0.04),\n\n variants: DEFAULT_VARIANTS,\n }\n}\n","/**\n * Theme derivation — transforms a ColorScheme into a Theme.\n */\n\nimport {\n blend,\n contrastFg,\n complement,\n hexToOklch,\n oklchToHex,\n colorDistance,\n} from \"@silvery/color\"\nimport { checkContrast, ensureContrast } from \"@silvery/color\"\nimport type { ColorScheme, Theme, Variant } from \"./types.ts\"\nimport {\n validateThemeInvariants,\n ThemeInvariantError,\n SELECTION_DELTA_L,\n CURSOR_DELTA_E,\n type InvariantViolation,\n} from \"./invariants.ts\"\nimport { deriveFields } from \"./derived.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: ColorScheme,\n mode: \"ansi16\" | \"truecolor\" = \"truecolor\",\n adjustments?: ThemeAdjustment[],\n): Theme {\n if (mode === \"ansi16\") return deriveAnsi16Theme(palette)\n return deriveTruecolorTheme(palette, adjustments)\n}\n\nexport interface LoadThemeOptions {\n /** Output mode. Default: \"truecolor\". */\n mode?: \"ansi16\" | \"truecolor\"\n /**\n * Invariant enforcement:\n * - `\"strict\"` — throw `ThemeInvariantError` when invariants fail.\n * - `\"lenient\"` (default) — accept auto-adjustments, populate `violations` out-param.\n * - `\"off\"` — skip invariant validation entirely.\n *\n * Note: `deriveTheme()` already runs `ensureContrast` on every text/bg pair\n * it builds (thresholds: AA=4.5, DIM=3.0, FAINT=1.5, CONTROL=3.0 — tuned for\n * terminals, not blind WCAG imports). Invariant validation is a second pass\n * that catches things derive can't fix. Default: visibility only.\n */\n enforce?: \"strict\" | \"lenient\" | \"off\"\n /**\n * Run WCAG contrast validation in addition to visibility. Default: false.\n * `deriveTheme` already applies the project-tweaked thresholds via\n * `ensureContrast`; only enable `wcag: true` for build-time audits of\n * bundled themes or to validate hand-authored Theme objects.\n */\n wcag?: boolean\n /** Out-parameter: adjustments applied by `deriveTheme`'s ensureContrast calls. */\n adjustments?: ThemeAdjustment[]\n /** Out-parameter: invariant violations (only populated in \"lenient\" mode; \"strict\" throws). */\n violations?: InvariantViolation[]\n}\n\n/**\n * Load and validate a theme from a ColorScheme.\n *\n * Combines `deriveTheme()` (auto-adjust via ensureContrast with project-tuned\n * thresholds) with `validateThemeInvariants()` (post-derivation visibility +\n * optional WCAG).\n *\n * We don't re-impose WCAG on top of derive's tweaked thresholds — default\n * validation checks visibility invariants only (selection/cursor vs bg) that\n * derive doesn't handle.\n *\n * @example\n * ```ts\n * // Default: lenient + visibility-only (derive already handled contrast)\n * const theme = loadTheme(myScheme)\n *\n * // Build-time audit: strict + full WCAG\n * const theme = loadTheme(myScheme, { enforce: \"strict\", wcag: true })\n * ```\n */\nexport function loadTheme(palette: ColorScheme, opts: LoadThemeOptions = {}): Theme {\n const mode = opts.mode ?? \"truecolor\"\n const enforce = opts.enforce ?? \"lenient\"\n const theme = deriveTheme(palette, mode, opts.adjustments)\n if (enforce === \"off\") return theme\n\n const { ok, violations } = validateThemeInvariants(theme, { wcag: opts.wcag })\n if (!ok) {\n if (enforce === \"strict\") throw new ThemeInvariantError(violations)\n if (opts.violations) opts.violations.push(...violations)\n }\n return theme\n}\n\nconst AA = 4.5\nconst DIM = 3.0\nconst FAINT = 1.5\nconst CONTROL = 3.0\n\nfunction deriveTruecolorTheme(p: ColorScheme, 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\n // Categorical color ring — 8 harmonious hues for tagging / chart series /\n // categories. ensureContrast-adjusted against bg.\n const red = ensure(\"red\", p.red, bg, AA)\n const orange = ensure(\"orange\", blend(p.red, p.yellow, 0.5), bg, AA)\n const yellow = ensure(\"yellow\", p.yellow, bg, AA)\n const green = ensure(\"green\", p.green, bg, AA)\n const teal = ensure(\"teal\", blend(p.green, p.cyan, 0.5), bg, AA)\n const blue = ensure(\"blue\", dark ? p.brightBlue : p.blue, bg, AA)\n const purple = ensure(\"purple\", p.magenta, bg, AA)\n const pink = ensure(\"pink\", blend(p.magenta, p.red, 0.5), 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 // Repair selection visibility — nudge selectionbg L away from bg until ΔL ≥ threshold.\n // Preserves hue + chroma. For ultra-subtle themes (one-light, serendipity-morning, etc.)\n // this shifts the selection ~0.05 L while keeping the aesthetic.\n const selectionBg = repairSelectionBg(p.selectionBackground, bg)\n const selection = ensure(\"selection\", p.selectionForeground, selectionBg, AA)\n\n // Repair cursor visibility — nudge cursorbg ΔE away from bg (OKLCH).\n const cursorBgRepaired = repairCursorBg(p.cursorColor, bg)\n const cursor = ensure(\"cursor\", p.cursorText, cursorBgRepaired, AA)\n\n const derived = deriveFields({\n dark,\n primary,\n accent,\n fg,\n selectionbg: selectionBg,\n surfacebg,\n ring: { red, orange, yellow, green, teal, blue, purple, pink },\n })\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: cursorBgRepaired,\n selection,\n selectionbg: selectionBg,\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 ...derived,\n }\n}\n\nexport function deriveAnsi16Theme(p: ColorScheme): Theme {\n const dark = p.dark ?? true\n const primaryColor = dark ? p.yellow : p.blue\n const accentColor = p.cyan\n\n const derived = deriveFields({\n primary: primaryColor,\n accent: accentColor,\n fg: p.foreground,\n selectionbg: p.selectionBackground,\n surfacebg: p.black,\n ring: {\n red: dark ? p.brightRed : p.red,\n orange: dark ? p.brightRed : p.red, // no orange slot in ANSI 16\n yellow: p.yellow,\n green: dark ? p.brightGreen : p.green,\n teal: p.cyan,\n blue: dark ? p.brightBlue : p.blue,\n purple: p.magenta,\n pink: dark ? p.brightMagenta : p.magenta,\n },\n })\n\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: accentColor,\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 ...derived,\n }\n}\n\n/**\n * Nudge `selectionBg`'s OKLCH lightness until it differs from `bg` by at least\n * `SELECTION_DELTA_L`. Preserves hue + chroma. Non-hex input returns unchanged.\n *\n * Direction: shift away from bg — if bg is dark, lift L; if bg is light, drop L.\n * If the input already meets the threshold, it's returned unchanged.\n */\nfunction repairSelectionBg(selectionBg: string, bg: string): string {\n const oSel = hexToOklch(selectionBg)\n const oBg = hexToOklch(bg)\n if (!oSel || !oBg) return selectionBg\n const dL = Math.abs(oSel.L - oBg.L)\n if (dL >= SELECTION_DELTA_L) return selectionBg\n\n const needed = SELECTION_DELTA_L - dL + 0.005 // small overshoot to land above floor after gamut-map\n const direction = oSel.L >= oBg.L ? 1 : -1\n const newL = Math.max(0, Math.min(1, oSel.L + direction * needed))\n return oklchToHex({ L: newL, C: oSel.C, H: oSel.H })\n}\n\n/**\n * Nudge `cursorBg`'s OKLCH values until it differs from `bg` by at least\n * `CURSOR_DELTA_E`. Shifts lightness first (preserves hue/chroma aesthetics).\n * Non-hex input returns unchanged.\n */\nfunction repairCursorBg(cursorBg: string, bg: string): string {\n const d = colorDistance(cursorBg, bg)\n if (d === null || d >= CURSOR_DELTA_E) return cursorBg\n\n const oCur = hexToOklch(cursorBg)!\n const oBg = hexToOklch(bg)!\n // Shift L in the direction that increases distance.\n const lGap = SELECTION_DELTA_L + 0.02\n const direction = oCur.L >= oBg.L ? 1 : -1\n const newL = Math.max(0, Math.min(1, oCur.L + direction * lGap))\n const candidate = oklchToHex({ L: newL, C: oCur.C, H: oCur.H })\n const d2 = colorDistance(candidate, bg)\n if (d2 !== null && d2 >= CURSOR_DELTA_E) return candidate\n\n // Fallback: high-contrast neutral pick.\n return oBg.L > 0.5 ? \"#000000\" : \"#FFFFFF\"\n}\n","/**\n * Monochrome theme — per-token SGR attrs for terminals without color.\n *\n * When color is unavailable (NO_COLOR env, TERM=dumb, SILVERY_COLOR=mono,\n * OSC-queried ColorLevel=\"none\"), silvery apps stay hierarchical via per-token\n * SGR attrs: bold for emphasis, dim for muted, inverse for selection, italic\n * for info, underline for links.\n *\n * This is Option B from the design spec — state-colored content gets genuine\n * distinguishability without color (not just \"stripped\"). Error, warning, and\n * success remain visually distinct via attrs combinations.\n *\n * Universally-supported SGR subset: bold, dim, italic, underline, inverse,\n * strikethrough. Any other attr is ignored by the renderer at mono tier.\n *\n * @module\n */\n\nimport type { Theme } from \"./types.ts\"\n\n/** SGR attrs recognized by the monochrome theme system. Universally-supported subset. */\nexport type MonoAttr = \"bold\" | \"dim\" | \"italic\" | \"underline\" | \"inverse\" | \"strikethrough\"\n\n/**\n * Per-token SGR attrs for monochrome rendering.\n *\n * Keyed by Theme token name. Tokens not in this map have no attrs (default\n * rendering). Callers apply these attrs at paint time when color tier is none.\n *\n * The key space is legacy `keyof Theme` UNION the Sterling flat token strings\n * (`\"fg-muted\"`, `\"border-focus\"`, `\"bg-surface-default\"`, …). Both are\n * first-class entries so `$fg-muted` in a `<Text color=…>` resolves via a\n * single direct lookup — no alias table required.\n */\nexport type MonochromeAttrs = Partial<Record<keyof Theme | string, readonly MonoAttr[]>>\n\n/**\n * Default monochrome attrs — Polaris-aligned mapping from the design spec.\n *\n * The philosophy: every *semantic* token that would normally carry color gets an\n * attrs set that preserves its hierarchy rank and state semantics. Example:\n * error (danger) is bold+inverse so it *grabs* attention even without red;\n * warning is bold to stand out but not as aggressively; info is italic to\n * indicate auxiliary information.\n *\n * Structural surfaces (bg/mutedbg/surfacebg/popoverbg) have no attrs — they\n * represent background planes that monochrome terminals can't vary anyway.\n */\nexport const DEFAULT_MONO_ATTRS: MonochromeAttrs = {\n // Structural — no attrs (background planes, container chrome)\n bg: [],\n mutedbg: [],\n surfacebg: [],\n popoverbg: [],\n border: [],\n cursorbg: [],\n\n // Text hierarchy\n fg: [], // default body text — no attrs\n muted: [\"dim\"], // secondary info\n disabledfg: [\"dim\"], // clearly inactive\n surface: [],\n popover: [],\n inverse: [\"inverse\"],\n\n // Brand / accent emphasis\n primary: [\"bold\"], // brand emphasis\n secondary: [\"bold\"], // secondary emphasis\n accent: [\"italic\", \"bold\"], // complement — italic+bold for distinct rank below primary\n\n // States — distinguishable combinations\n error: [\"bold\", \"inverse\"], // danger: loudest\n warning: [\"bold\"], // caution\n success: [\"bold\"], // positive confirmation\n info: [\"italic\"], // auxiliary info\n\n // On-fill text (contrast against accent/state bg)\n primaryfg: [],\n secondaryfg: [],\n accentfg: [],\n errorfg: [\"inverse\"],\n warningfg: [],\n successfg: [],\n infofg: [],\n\n // Interactive chrome\n link: [\"underline\"], // hyperlinks: underlined even in mono\n focusborder: [\"bold\"],\n inputborder: [],\n\n // Selection / cursor — explicit inverse so they're visible\n selection: [],\n selectionbg: [\"inverse\"],\n cursor: [],\n\n // Sterling flat tokens — paired with their legacy-attr equivalents so that\n // `$fg-muted`, `$border-focus`, `$bg-selected`, etc. resolve to the same\n // mono attrs as their legacy counterparts without an alias table. Extending\n // the map keeps the resolution path a single direct lookup.\n \"fg-muted\": [\"dim\"],\n \"bg-muted\": [],\n \"fg-accent\": [\"italic\", \"bold\"],\n \"bg-accent\": [],\n \"fg-on-accent\": [],\n \"border-accent\": [],\n \"fg-accent-hover\": [\"italic\", \"bold\"],\n \"bg-accent-hover\": [],\n \"fg-accent-active\": [\"italic\", \"bold\"],\n \"bg-accent-active\": [],\n \"fg-info\": [\"italic\"],\n \"bg-info\": [],\n \"fg-on-info\": [],\n \"bg-info-hover\": [],\n \"bg-info-active\": [],\n \"fg-success\": [\"bold\"],\n \"bg-success\": [],\n \"fg-on-success\": [],\n \"bg-success-hover\": [],\n \"bg-success-active\": [],\n \"fg-warning\": [\"bold\"],\n \"bg-warning\": [],\n \"fg-on-warning\": [],\n \"bg-warning-hover\": [],\n \"bg-warning-active\": [],\n \"fg-error\": [\"bold\", \"inverse\"],\n \"bg-error\": [],\n \"fg-on-error\": [\"inverse\"],\n \"bg-error-hover\": [],\n \"bg-error-active\": [],\n \"bg-surface-default\": [],\n \"bg-surface-subtle\": [],\n \"bg-surface-raised\": [],\n \"bg-surface-overlay\": [],\n \"bg-surface-hover\": [],\n \"border-default\": [],\n \"border-focus\": [\"bold\"],\n \"border-muted\": [],\n \"fg-cursor\": [],\n \"bg-cursor\": [],\n}\n\n/**\n * Produce per-token monochrome attrs from a base Theme.\n *\n * Currently returns `DEFAULT_MONO_ATTRS` — a canonical mapping. Passed the\n * theme to allow per-theme overrides in the future (e.g., a palette that\n * prefers `underline` for accents over `italic`). The argument is reserved.\n */\nexport function deriveMonochromeTheme(theme: Theme): MonochromeAttrs {\n void theme\n return DEFAULT_MONO_ATTRS\n}\n\n/**\n * Resolve attrs for a specific Theme token. Returns `[]` if the token has no\n * mapped attrs (meaning: render with default attrs).\n */\nexport function monoAttrsFor(theme: Theme, token: keyof Theme): readonly MonoAttr[] {\n const attrs = deriveMonochromeTheme(theme)\n return attrs[token] ?? []\n}\n\n/**\n * Resolve mono-attrs from a color *string* — the high-level entry point\n * consumed by the render pipeline.\n *\n * Accepts strings like `\"$primary\"`, `\"$fg-muted\"`, `\"$border-focus\"`. Strips\n * the `$` prefix and looks the name up directly against `DEFAULT_MONO_ATTRS`,\n * which carries both legacy keys (`muted`, `surfacebg`, `focusborder`, …) AND\n * Sterling flat tokens (`fg-muted`, `bg-surface-default`, `border-focus`, …)\n * as first-class entries. Returns `undefined` for non-token strings (hex,\n * rgb(), named ANSI colors) — callers should treat this as \"no attrs\".\n *\n * A secondary no-hyphen fallback (`$surface-bg` → `surfacebg`) keeps the\n * legacy hyphenated-compound form working for callers that still emit that\n * shape.\n *\n * @param color The color string (e.g. `\"$primary\"`, `\"#ff0000\"`, `\"red\"`)\n * @param theme Active theme (reserved for per-theme overrides)\n * @returns Array of mono-attrs for the token, or `undefined` if not a\n * recognized token.\n */\nexport function monoAttrsForColorString(\n color: string,\n theme: Theme,\n): readonly MonoAttr[] | undefined {\n if (!color.startsWith(\"$\")) return undefined\n const name = color.slice(1)\n const attrs = deriveMonochromeTheme(theme)\n // Direct lookup — covers Sterling flat keys AND legacy names.\n const direct = attrs[name as keyof Theme]\n if (direct !== undefined) return direct\n // No-hyphen fallback for compound legacy names (`$surface-bg` → `surfacebg`).\n const noHyphen = name.replace(/-/g, \"\")\n if (noHyphen !== name) {\n const stripped = attrs[noHyphen as keyof Theme]\n if (stripped !== undefined) return stripped\n }\n return undefined\n}\n","/**\n * Scheme fingerprinting — match a terminal's probed colors against a catalog\n * of known schemes.\n *\n * OSC 10/11/4 probing yields up to 18 slots (fg + bg + 16 ANSI colors).\n * Fingerprint matching compares that probed slot-set against every catalog\n * scheme using OKLCH ΔE distance, returning the best match with a confidence\n * score. This unlocks \"detect the user's scheme\" UX — apps can style\n * themselves to match the terminal without the user picking a theme.\n *\n * Match criteria (both required for a match):\n * 1. ΔE sum across probed slots < `sumThreshold` (default 30)\n * 2. Per-slot max ΔE < `perSlotThreshold` (default 8)\n *\n * The per-slot check prevents false positives where most slots are close but\n * one slot is wildly off (e.g., same ansi[0..14] but different red) — those\n * are different schemes, not noisy matches.\n */\n\nimport type { ColorScheme } from \"./types.ts\"\nimport { colorDistance } from \"@silvery/color\"\n\n/** Fields that are always probed and used for fingerprinting. */\nconst FINGERPRINT_FIELDS: readonly (keyof ColorScheme)[] = [\n \"foreground\",\n \"background\",\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] as const\n\nexport interface FingerprintOptions {\n /** Sum-of-ΔE threshold for match acceptance. Default: 30. */\n sumThreshold?: number\n /** Per-slot max ΔE threshold. Default: 8. */\n perSlotThreshold?: number\n}\n\nexport interface FingerprintMatch {\n /** The catalog scheme that matched. */\n scheme: ColorScheme\n /** Total ΔE across all probed slots (lower = better). */\n sumDeltaE: number\n /** Largest per-slot ΔE (lower = better). */\n maxDeltaE: number\n /** Number of slots compared (can be < 18 if some probed slots are null). */\n slotsCompared: number\n /** Heuristic 0–1 confidence score. */\n confidence: number\n}\n\n/**\n * Map ΔE thresholds into a 0–1 confidence.\n *\n * sumΔE=0 + maxΔE=0 → 1.0 (perfect match)\n * sumΔE=30 (threshold) → ~0.5\n * sumΔE≥60 → ~0.0\n */\nfunction computeConfidence(sumDE: number, maxDE: number, sumThreshold: number): number {\n const sumScore = Math.max(0, 1 - sumDE / (sumThreshold * 2))\n const maxScore = Math.max(0, 1 - maxDE / 16)\n // Weight sum more heavily — a good average with one outlier isn't a real match.\n return Math.max(0, Math.min(1, 0.7 * sumScore + 0.3 * maxScore))\n}\n\n/**\n * Match probed slots against a catalog, returning the best candidate if it\n * satisfies both sum and per-slot thresholds. Returns `null` if nothing matches.\n *\n * `probed` is a partial ColorScheme — whatever slots OSC queries returned. Missing\n * slots are skipped (still counted as \"not compared\"). Non-hex values are\n * ignored (ΔE can't be computed).\n */\nexport function fingerprintMatch(\n probed: Partial<ColorScheme>,\n catalog: readonly ColorScheme[],\n opts: FingerprintOptions = {},\n): FingerprintMatch | null {\n const sumThreshold = opts.sumThreshold ?? 30\n const perSlotThreshold = opts.perSlotThreshold ?? 8\n\n let best: FingerprintMatch | null = null\n\n for (const scheme of catalog) {\n let sumDE = 0\n let maxDE = 0\n let slotsCompared = 0\n\n for (const field of FINGERPRINT_FIELDS) {\n const probedVal = probed[field]\n const catalogVal = scheme[field]\n if (typeof probedVal !== \"string\" || typeof catalogVal !== \"string\") continue\n const de = colorDistance(probedVal, catalogVal)\n if (de === null) continue\n // Scale ΔE to the ×100 convention used in the thresholds.\n const scaled = de * 100\n sumDE += scaled\n if (scaled > maxDE) maxDE = scaled\n slotsCompared++\n }\n\n if (slotsCompared === 0) continue\n if (maxDE > perSlotThreshold) continue\n if (sumDE > sumThreshold) continue\n\n if (best === null || sumDE < best.sumDeltaE) {\n best = {\n scheme,\n sumDeltaE: sumDE,\n maxDeltaE: maxDE,\n slotsCompared,\n confidence: computeConfidence(sumDE, maxDE, sumThreshold),\n }\n }\n }\n\n return best\n}\n\n/**\n * Like `fingerprintMatch`, but returns all candidates that pass the thresholds\n * sorted by `sumDeltaE` ascending. Useful for UX where the user picks among\n * a shortlist (\"Looks like you're using one of: Dracula, Horizon, Tokyo Night\").\n */\nexport function fingerprintCandidates(\n probed: Partial<ColorScheme>,\n catalog: readonly ColorScheme[],\n opts: FingerprintOptions = {},\n): FingerprintMatch[] {\n const sumThreshold = opts.sumThreshold ?? 30\n const perSlotThreshold = opts.perSlotThreshold ?? 8\n const out: FingerprintMatch[] = []\n\n for (const scheme of catalog) {\n let sumDE = 0\n let maxDE = 0\n let slotsCompared = 0\n\n for (const field of FINGERPRINT_FIELDS) {\n const probedVal = probed[field]\n const catalogVal = scheme[field]\n if (typeof probedVal !== \"string\" || typeof catalogVal !== \"string\") continue\n const de = colorDistance(probedVal, catalogVal)\n if (de === null) continue\n const scaled = de * 100\n sumDE += scaled\n if (scaled > maxDE) maxDE = scaled\n slotsCompared++\n }\n\n if (slotsCompared === 0) continue\n if (maxDE > perSlotThreshold) continue\n if (sumDE > sumThreshold) continue\n\n out.push({\n scheme,\n sumDeltaE: sumDE,\n maxDeltaE: maxDE,\n slotsCompared,\n confidence: computeConfidence(sumDE, maxDE, sumThreshold),\n })\n }\n\n out.sort((a, b) => a.sumDeltaE - b.sumDeltaE)\n return out\n}\n","/**\n * Core type definitions for the theme system.\n *\n * Two-layer architecture:\n * Layer 1: ColorScheme — 22 terminal colors (what schemes expose; auto-detectable)\n * Layer 2: Theme — ~33 semantic tokens (what UI apps consume)\n *\n * Pipeline: Scheme catalog → ColorScheme (22) → deriveTheme() → Theme (33)\n */\n\nexport interface ColorScheme {\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_SCHEME_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 // ── Root pair ────────────────────────────────────────────────────\n bg: string\n fg: string\n // ── Surface pairs ────────────────────────────────────────────────\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 + selection ───────────────────────────────────────────\n cursor: string\n cursorbg: string\n selection: string\n selectionbg: string\n // ── Accents ──────────────────────────────────────────────────────\n primary: string\n primaryfg: string\n secondary: string\n secondaryfg: string\n accent: string\n accentfg: string\n // ── Semantic states ──────────────────────────────────────────────\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 // ── Borders + links ──────────────────────────────────────────────\n border: string\n inputborder: string\n focusborder: string\n link: string\n disabledfg: string\n palette: string[]\n\n // Brand anchor (Apple system-color model) — THE app's identity. Auto-derives\n // from scheme.primary; apps override via <ThemeProvider tokens={{ brand: \"#…\" }}>.\n brand: string\n /** Kebab key for $brand-hover. Hover lightness shift (+0.04L OKLCH). */\n \"brand-hover\": string\n /** Kebab key for $brand-active. Active lightness shift (+0.08L OKLCH). */\n \"brand-active\": string\n\n // State variants — hover (+0.04L) and active (+0.08L) shifts from base in OKLCH.\n // Direction: dark themes brighten, light themes darken.\n // Access via $primary-hover, $primary-active, $accent-hover, etc. in JSX.\n /** Kebab key for $primary-hover. */\n \"primary-hover\": string\n /** Kebab key for $primary-active. */\n \"primary-active\": string\n /** Kebab key for $accent-hover. */\n \"accent-hover\": string\n /** Kebab key for $accent-active. */\n \"accent-active\": string\n /** Kebab key for $fg-hover. */\n \"fg-hover\": string\n /** Kebab key for $fg-active. */\n \"fg-active\": string\n /** Kebab key for $bg-selected-hover. */\n \"bg-selected-hover\": string\n /** Kebab key for $bg-surface-hover. */\n \"bg-surface-hover\": string\n\n // Categorical color ring — 8 harmonious hues for tags, chart series, calendar\n // categories, priority levels, any color that's CATEGORICAL, not stateful.\n // ensureContrast-adjusted against bg. Use $red, $orange, …, $pink in JSX.\n //\n // Distinguish from:\n // - $color0..$color15 — raw terminal ANSI (user's theme verbatim)\n // - $error/$warning/$success — semantic state (communicates meaning)\n // - $brand — app identity anchor (one color)\n red: string\n orange: string\n yellow: string\n green: string\n teal: string\n blue: string\n purple: string\n pink: string\n\n /**\n * Named typography variants — resolved by `<Text variant=\"h1\">`.\n *\n * Each variant is a bundle of visual defaults (color, bold, italic, dim,\n * underlineStyle). Caller props always win over variant values — the variant\n * is the *default*, not an override.\n *\n * Apps extend variants via:\n * ```tsx\n * <ThemeProvider tokens={{ variants: { hero: { color: \"$brand\", bold: true } } }}>\n * ```\n */\n variants: Record<string, Variant>\n}\n\n/**\n * Metadata describing how the active color scheme was determined.\n *\n * Returned by `detectScheme()` and surfaced at runtime via `useActiveScheme()`.\n * Lets apps log how the theme was detected (\"catppuccin-mocha at 87% confidence via\n * fingerprint\") or render a debug badge without re-running detection.\n *\n * @example\n * ```tsx\n * const scheme = useActiveScheme()\n * if (scheme?.source === \"fingerprint\") {\n * console.log(`detected ${scheme.matchedName} at ${Math.round((scheme.confidence ?? 0) * 100)}%`)\n * }\n * ```\n */\nexport interface ActiveScheme {\n /** Scheme name pulled from Theme.name or the override. */\n name: string\n /** How the active theme was determined. */\n source: \"probe\" | \"fingerprint\" | \"fallback\" | \"override\"\n /** Confidence [0,1] — only meaningful for \"fingerprint\" source. */\n confidence?: number\n /** Catalog scheme name matched (only for \"fingerprint\" source). */\n matchedName?: 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/**\n * A typography variant — a named bundle of visual properties that can be\n * applied to a Text component via `variant=\"h1\"`. The variant acts as a\n * *default*: caller props always win over variant values.\n *\n * Color values follow the same syntax as `TextColor` — `$token` strings,\n * hex values, ANSI names, or any string accepted by the color system.\n */\nexport interface Variant {\n color?: string\n backgroundColor?: string\n bold?: boolean\n italic?: boolean\n dim?: boolean\n underlineStyle?: \"single\" | \"double\" | \"curly\" | \"dotted\" | \"dashed\"\n}\n","/**\n * Default palettes and themes — shipped with @silvery/ansi.\n */\n\nimport type { ColorScheme, Theme } from \"./types.ts\"\nimport { deriveAnsi16Theme } from \"./derive.ts\"\n\nexport const defaultDarkScheme: ColorScheme = {\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 defaultLightScheme: ColorScheme = {\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/**\n * Dark ANSI 16 theme — hex-valued, derived from the default dark scheme.\n *\n * All token values are hex strings. Terminal rendering quantizes hex to\n * 4-bit ANSI codes at paint time when colorLevel === \"basic\".\n */\nexport const ansi16DarkTheme: Theme = deriveAnsi16Theme(defaultDarkScheme)\n\n/**\n * Light ANSI 16 theme — hex-valued, derived from the default light scheme.\n *\n * All token values are hex strings. Terminal rendering quantizes hex to\n * 4-bit ANSI codes at paint time when colorLevel === \"basic\".\n */\nexport const ansi16LightTheme: Theme = deriveAnsi16Theme(defaultLightScheme)\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 { ColorScheme, Theme } from \"./types.ts\"\nimport { deriveTheme } from \"./derive.ts\"\nimport {\n ansi16DarkTheme,\n ansi16LightTheme,\n defaultDarkScheme,\n defaultLightScheme,\n} from \"./default-schemes.ts\"\nimport { queryMultiplePaletteColors, parsePaletteResponse } from \"../osc-palette.ts\"\nimport { queryForegroundColor, queryBackgroundColor } from \"../osc-colors.ts\"\n\nexport interface DetectedScheme {\n fg: string | null\n bg: string | null\n ansi: (string | null)[]\n dark: boolean\n palette: Partial<ColorScheme>\n}\n\nexport async function detectTerminalScheme(timeoutMs = 150): Promise<DetectedScheme | 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<ColorScheme> = { dark }\n if (bg) palette.background = bg\n if (fg) palette.foreground = fg\n\n const ansiFields: (keyof ColorScheme)[] = [\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 ColorScheme when detection fails or returns partial data.\n * Detected colors override matching fallback fields.\n * When omitted, defaults based on dark/light detection:\n * dark → `fallbackDark` (if set) or built-in defaultDarkScheme\n * light → `fallbackLight` (if set) or built-in defaultLightScheme */\n fallback?: ColorScheme\n /** Fallback for dark terminals (overrides `fallback` for dark mode). */\n fallbackDark?: ColorScheme\n /** Fallback for light terminals (overrides `fallback` for light mode). */\n fallbackLight?: ColorScheme\n /** Timeout per OSC query in ms (default 150). */\n timeoutMs?: number\n /** Terminal capabilities (from detectTerminalCaps). When provided:\n * - colorLevel \"none\"/\"basic\" skips OSC detection and returns ANSI 16 theme\n * - darkBackground informs fallback selection when detection fails */\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 detectTerminalScheme(opts.timeoutMs)\n const isDark = detected?.dark ?? opts.caps?.darkBackground ?? true\n const fallback =\n opts.fallback ??\n (isDark ? (opts.fallbackDark ?? defaultDarkScheme) : (opts.fallbackLight ?? defaultLightScheme))\n if (!detected) return deriveTheme(fallback)\n const merged: ColorScheme = { ...fallback, ...stripNulls(detected.palette) }\n return deriveTheme(merged)\n}\n\nfunction stripNulls(partial: Partial<ColorScheme>): Partial<ColorScheme> {\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<ColorScheme>\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 * Unified scheme detection orchestrator.\n *\n * Consolidates the four detection layers into a single entry point:\n *\n * 1. **Override** — `SILVERY_COLOR` env var / explicit option forces a scheme\n * 2. **Probe** — OSC 10/11/4 query the terminal for its 22 slots\n * 3. **Fingerprint** — match probed slots against a catalog → named scheme\n * 4. **Fallback** — `defaultDarkScheme` / `defaultLightScheme` based on BgMode\n *\n * Returns `{ scheme, theme, source, confidence, slotSources }` so callers can\n * tell apart \"detected Dracula at 0.98 confidence\" from \"falling back to\n * default-dark because probing failed.\"\n */\n\nimport type { ColorScheme, Theme } from \"./types.ts\"\nimport { COLOR_SCHEME_FIELDS } from \"./types.ts\"\nimport { deriveTheme, loadTheme } from \"./derive.ts\"\nimport { detectTerminalScheme } from \"./detect.ts\"\nimport { fingerprintMatch } from \"./fingerprint.ts\"\nimport { defaultDarkScheme, defaultLightScheme } from \"./default-schemes.ts\"\n\n/** How the final scheme was decided. */\nexport type DetectSource =\n | \"override\" // explicit option or SILVERY_COLOR env var\n | \"fingerprint\" // probed + matched a catalog scheme\n | \"probed\" // probed but no catalog match (custom scheme)\n | \"bg-mode\" // bg-mode detection only (no full probe)\n | \"fallback\" // nothing worked, using defaultDark/Light\n\n/** Where each slot's value came from. */\nexport type SlotSource = \"probed\" | \"catalog\" | \"fallback\"\n\nexport interface DetectSchemeResult {\n /** The resolved 22-slot color scheme. */\n scheme: ColorScheme\n /** The derived, validated Theme (via loadTheme). */\n theme: Theme\n /** How the scheme was determined overall. */\n source: DetectSource\n /** 0–1 confidence heuristic (exact override = 1, fingerprint = match score, fallback = 0). */\n confidence: number\n /** Per-slot provenance. Keys are ColorScheme field names. */\n slotSources: Partial<Record<keyof ColorScheme, SlotSource>>\n /** If fingerprint matched, the catalog scheme name. */\n matchedName?: string\n}\n\nexport interface DetectSchemeOptions {\n /** Explicit override — if provided, skips all probing. */\n override?: ColorScheme\n /** Catalog to fingerprint against. If empty or undefined, skip fingerprinting. */\n catalog?: readonly ColorScheme[]\n /** OSC probe timeout (ms). Default 150. */\n timeoutMs?: number\n /** Force dark/light inference when no bg is probed. */\n darkFallback?: boolean\n /**\n * Apply strict invariant validation to the loaded Theme. Default `lenient`.\n * See `loadTheme`'s `enforce` parameter.\n */\n enforce?: \"strict\" | \"lenient\" | \"off\"\n /** Add WCAG contrast check to the invariant validation. Default `false`. */\n wcag?: boolean\n}\n\nfunction envOverride(): \"truecolor\" | \"256\" | \"ansi16\" | \"scheme\" | \"mono\" | \"auto\" | null {\n const v = process.env.SILVERY_COLOR\n if (!v) return null\n if (\n v === \"truecolor\" ||\n v === \"256\" ||\n v === \"ansi16\" ||\n v === \"scheme\" ||\n v === \"mono\" ||\n v === \"auto\"\n )\n return v\n return null\n}\n\n/**\n * Detect the terminal's color scheme + derive a theme in one call.\n *\n * Runs the 4-layer detection cascade (override → probe → fingerprint →\n * fallback) and returns a fully-resolved Theme along with provenance metadata\n * so callers can log how the scheme was determined.\n *\n * This is the recommended entry point for apps — it handles all the gotchas\n * (non-TTY environments, failed probes, partial OSC responses, catalog matches,\n * bg-mode inference) and returns something you can hand to `ThemeProvider`.\n *\n * @example\n * ```ts\n * import { detectScheme } from \"@silvery/ansi\"\n * import { builtinPalettes } from \"@silvery/theme/schemes\"\n *\n * const { scheme, theme, source, matchedName, confidence } = await detectScheme({\n * catalog: Object.values(builtinPalettes),\n * enforce: \"lenient\",\n * })\n * console.log(`${source === \"fingerprint\" ? `detected ${matchedName}` : source} (${(confidence * 100).toFixed(0)}%)`)\n * ```\n */\nexport async function detectScheme(opts: DetectSchemeOptions = {}): Promise<DetectSchemeResult> {\n const enforce = opts.enforce ?? \"lenient\"\n const wcag = opts.wcag ?? false\n\n // 1. Explicit override (option or env var)\n if (opts.override) {\n const theme = loadTheme(opts.override, { enforce, wcag })\n return {\n scheme: opts.override,\n theme,\n source: \"override\",\n confidence: 1,\n slotSources: allSlotsFrom(\"fallback\"), // override is opaque — we don't know provenance\n matchedName: opts.override.name,\n }\n }\n\n const envMode = envOverride()\n if (envMode === \"mono\" || envMode === \"ansi16\") {\n // These tiers have their own theme shapes — return dark fallback + mark as override\n const fallback = opts.darkFallback !== false ? defaultDarkScheme : defaultLightScheme\n const theme = loadTheme(fallback, { enforce, wcag })\n return {\n scheme: fallback,\n theme,\n source: \"override\",\n confidence: 1,\n slotSources: allSlotsFrom(\"fallback\"),\n matchedName: fallback.name,\n }\n }\n\n // 2. Probe terminal\n const detected = await detectTerminalScheme(opts.timeoutMs)\n\n // No probe result → pure fallback\n if (!detected) {\n const dark = opts.darkFallback !== false\n const fallback = dark ? defaultDarkScheme : defaultLightScheme\n const theme = loadTheme(fallback, { enforce, wcag })\n return {\n scheme: fallback,\n theme,\n source: \"fallback\",\n confidence: 0,\n slotSources: allSlotsFrom(\"fallback\"),\n matchedName: fallback.name,\n }\n }\n\n // 3. Fingerprint if catalog provided\n const catalog = opts.catalog ?? []\n if (catalog.length > 0) {\n const match = fingerprintMatch(detected.palette, catalog)\n if (match) {\n const theme = loadTheme(match.scheme, { enforce, wcag })\n return {\n scheme: match.scheme,\n theme,\n source: \"fingerprint\",\n confidence: match.confidence,\n slotSources: allSlotsFrom(\"catalog\"),\n matchedName: match.scheme.name,\n }\n }\n }\n\n // 4. Probed but no catalog match — merge probed slots over fallback\n const dark = detected.dark\n const fallback = dark ? defaultDarkScheme : defaultLightScheme\n const merged: ColorScheme = { ...fallback, ...stripNulls(detected.palette) }\n const theme = loadTheme(merged, { enforce, wcag })\n\n // Per-slot provenance: probed slots come from detected.palette, the rest from fallback\n const slotSources: Partial<Record<keyof ColorScheme, SlotSource>> = {}\n for (const field of COLOR_SCHEME_FIELDS) {\n const probed = (detected.palette as Record<string, unknown>)[field]\n slotSources[field] = typeof probed === \"string\" ? \"probed\" : \"fallback\"\n }\n\n // Confidence heuristic: proportion of slots that were probed (of the 18 trackable: fg + bg + 16 ansi)\n const probedCount = Object.values(slotSources).filter((s) => s === \"probed\").length\n const confidence = Math.min(1, probedCount / 18)\n\n return {\n scheme: merged,\n theme,\n source: \"probed\",\n confidence,\n slotSources,\n matchedName: undefined,\n }\n}\n\nfunction stripNulls(partial: Partial<ColorScheme>): Partial<ColorScheme> {\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<ColorScheme>\n}\n\nfunction allSlotsFrom(src: SlotSource): Partial<Record<keyof ColorScheme, SlotSource>> {\n const out: Partial<Record<keyof ColorScheme, SlotSource>> = {}\n for (const field of COLOR_SCHEME_FIELDS) out[field] = src\n return out\n}\n\n/**\n * Shortcut: detect scheme + return the Theme only. For apps that don't care\n * about provenance. Same defaults as `detectScheme`.\n *\n * @example\n * ```ts\n * const theme = await detectSchemeTheme({ catalog: Object.values(builtinPalettes) })\n * render(<ThemeProvider theme={theme}>…</ThemeProvider>)\n * ```\n */\nexport async function detectSchemeTheme(opts: DetectSchemeOptions = {}): Promise<Theme> {\n const { theme } = await detectScheme(opts)\n return theme\n}\n","/**\n * Type-safe theme token strings.\n *\n * `ThemeToken` is the union of every known `$token` string. Using `TextColor`\n * in a component API gives autocomplete for tokens while still accepting\n * arbitrary hex strings via the `(string & {})` tail (Tailwind trick —\n * preserves the literal union for IDE suggestions while falling back to\n * `string` for runtime-computed values).\n *\n * App-specific custom tokens (`\"$priority-p0\"`, `\"$app-brand\"`) are\n * represented by the template literal `` `$${string}` `` tail — still\n * type-safe (must start with `$`) but open-ended.\n *\n * @module\n */\n\nimport type { HueName } from \"./types.ts\"\n\n/** Standard Theme tokens (Primer-aligned + brand family).\n *\n * Since 0.18.1: the tokens `$bg-surface`, `$bg-popover`, `$bg-inverse`,\n * `$bg-selected`, `$fg-selected`, `$fg-disabled`, `$fg-on-primary`,\n * `$fg-on-secondary`, and `$border-input` have been dropped — the\n * `LEGACY_ALIASES` translation layer that made them resolve was deleted when\n * Sterling flat tokens started shipping directly on every Theme. Callers\n * should migrate to the canonical Sterling forms: `$bg-surface-default`,\n * `$bg-surface-overlay`, `$fg-muted`, `$fg-on-accent`, `$border-default`.\n */\nexport type StandardThemeToken =\n // Root pair\n | \"$fg\"\n | \"$bg\"\n // Surfaces — legacy roots (Sterling variants live as $bg-surface-default etc.)\n | \"$surface\"\n | \"$popover\"\n | \"$inverse\"\n // Muted + disabled\n | \"$muted\"\n | \"$fg-muted\"\n | \"$mutedbg\"\n | \"$bg-muted\"\n | \"$disabledfg\"\n // Cursor + selection\n | \"$cursor\"\n | \"$fg-cursor\"\n | \"$cursorbg\"\n | \"$bg-cursor\"\n | \"$selection\"\n | \"$selectionbg\"\n // Accents + their fg\n | \"$primary\"\n | \"$primaryfg\"\n | \"$secondary\"\n | \"$secondaryfg\"\n | \"$accent\"\n | \"$accentfg\"\n | \"$fg-on-accent\"\n // Semantic states\n | \"$error\"\n | \"$errorfg\"\n | \"$fg-on-error\"\n | \"$warning\"\n | \"$warningfg\"\n | \"$fg-on-warning\"\n | \"$success\"\n | \"$successfg\"\n | \"$fg-on-success\"\n | \"$info\"\n | \"$infofg\"\n | \"$fg-on-info\"\n // Borders + links\n | \"$border\"\n | \"$inputborder\"\n | \"$focusborder\"\n | \"$border-focus\"\n | \"$border-default\"\n | \"$link\"\n // Sterling flat — surface/border/accent variants baked in by every shipped Theme\n | \"$bg-surface-default\"\n | \"$bg-surface-subtle\"\n | \"$bg-surface-raised\"\n | \"$bg-surface-overlay\"\n | \"$fg-accent\"\n | \"$bg-accent\"\n | \"$border-accent\"\n // State variants — hover/active lightness shifts (dark: +L, light: -L)\n | \"$primary-hover\"\n | \"$primary-active\"\n | \"$accent-hover\"\n | \"$accent-active\"\n | \"$fg-hover\"\n | \"$fg-active\"\n | \"$bg-selected-hover\"\n | \"$bg-surface-hover\"\n\n/** Categorical color ring — harmonious hues for tagging / chart series / categories. */\nexport type ColorRingToken = `$${HueName}` // $red, $orange, $yellow, $green, $teal, $blue, $purple, $pink\n\n/** Brand tokens (Apple system-color model) — app identity anchor. */\nexport type BrandToken = \"$brand\" | \"$brand-hover\" | \"$brand-active\"\n\n/** Raw ANSI palette slots. */\nexport type PaletteToken =\n `$color${0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15}`\n\n/** Every known token shipped by silvery — useful for `switch` exhaustiveness. */\nexport type KnownThemeToken = StandardThemeToken | ColorRingToken | BrandToken | PaletteToken\n\n/**\n * Any `$token` string — known or app-specific. Template literal narrows to\n * strings starting with `$` so typos like `\"primary\"` (missing `$`) fail at\n * compile time.\n */\nexport type ThemeToken = KnownThemeToken | `$${string}`\n\n/**\n * A color value accepted by `<Text color=…>`, `<Box backgroundColor=…>`, etc.\n *\n * Accepts: any ThemeToken, \"inherit\", \"currentColor\", or a raw hex/ANSI name.\n * The `(string & {})` tail preserves autocomplete for tokens while still\n * accepting any runtime-computed string value.\n */\nexport type TextColor = ThemeToken | \"inherit\" | \"currentColor\" | (string & {})\n\n/**\n * Cascade keywords — accepted alongside tokens + hex.\n * \"inherit\" — use nearest ancestor's computed color\n * \"currentColor\" — resolves to the container text's current color\n */\nexport type ColorKeyword = \"inherit\" | \"currentColor\"\n\n// =============================================================================\n// Typography Variants\n// =============================================================================\n\n/**\n * Built-in variant names — the standard typography presets shipped by silvery.\n * These are the default keys in `Theme.variants`.\n */\nexport type VariantName =\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"body\"\n | \"body-muted\"\n | \"fine-print\"\n | \"strong\"\n | \"em\"\n | \"link\"\n | \"key\"\n | \"code\"\n | \"kbd\"\n\n/**\n * Any variant name — built-in or app-defined. The `(string & {})` tail is the\n * Tailwind trick: preserves IDE autocomplete for the literal union while still\n * accepting any runtime string value.\n */\nexport type KnownVariant = VariantName | (string & {})\n\n/**\n * Runtime constant — the 12 built-in variant names shipped by silvery.\n *\n * Used in dev warnings when an unknown variant is looked up in Text.tsx:\n * ```\n * Warning: Unknown variant \"h11\". Known variants: h1, h2, h3, …\n * ```\n *\n * Mirrors `VariantName` exactly — update both when variants change.\n */\nexport const KNOWN_VARIANTS: readonly VariantName[] = [\n \"h1\",\n \"h2\",\n \"h3\",\n \"body\",\n \"body-muted\",\n \"fine-print\",\n \"strong\",\n \"em\",\n \"link\",\n \"key\",\n \"code\",\n \"kbd\",\n] as const\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_BG_MODE_REPORTING = `${CSI}?2031h`\n\n/** Disable Mode 2031 color scheme reporting */\nexport const DISABLE_BG_MODE_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 BgMode = \"dark\" | \"light\" | \"unknown\"\n\nexport interface BgModeDetector extends Disposable {\n /** Current detected scheme */\n readonly scheme: BgMode\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 BgModeDetectorOptions {\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?: () => BgMode\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 parseBgModeResponse(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 = createBgModeDetector({\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 createBgModeDetector(options: BgModeDetectorOptions): BgModeDetector {\n const { write, onData, fallback, timeoutMs = 200 } = options\n\n let scheme: BgMode = \"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 = parseBgModeResponse(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_BG_MODE_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_BG_MODE_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_BG_MODE_REPORTING)\n listeners.clear()\n }\n },\n }\n}\n","/**\n * Palette generators — produce a ColorScheme from color inputs.\n *\n * These generators are scheme-independent (no built-in palette lookup).\n * For preset lookup, use fromPreset() in @silvery/theme.\n */\n\nimport { hexToOklch, oklchToHex, brighten, darken, blend, relativeLuminance } from \"@silvery/color\"\nimport type { ColorScheme, HueName } from \"./types\"\n\n// ============================================================================\n// Luminance\n// ============================================================================\n\nfunction isDarkColor(hex: string): boolean {\n const L = relativeLuminance(hex)\n return L === null ? true : L < 0.5\n}\n\n// ============================================================================\n// Accent Generation\n// ============================================================================\n\n/**\n * Target hues for each accent slot, in OKLCH degrees.\n * OKLCH hues differ from HSL — red ≈ 29, green ≈ 142, blue ≈ 264. Calibrated\n * per Ottosson's reference ramps for perceptually-uniform accent generation.\n */\nconst targetHues: Record<HueName, number> = {\n red: 29,\n orange: 55,\n yellow: 90,\n green: 142,\n teal: 195,\n blue: 240,\n purple: 305,\n pink: 350,\n}\n\n/** Find which hue slot the primary color best matches by OKLCH hue angle proximity. */\nexport function assignPrimaryToSlot(primary: string): HueName {\n const o = hexToOklch(primary)\n if (!o) return \"blue\"\n const h = o.H\n const slots: [number, number, HueName][] = [\n [0, 15, \"red\"],\n [15, 42, \"orange\"],\n [42, 75, \"yellow\"],\n [75, 170, \"green\"],\n [170, 210, \"teal\"],\n [210, 275, \"blue\"],\n [275, 330, \"purple\"],\n [330, 360, \"pink\"],\n ]\n for (const [lo, hi, name] of slots) {\n if (h >= lo && h < hi) return name\n }\n // Fallback: red band wraps around 0 — anything >345 or <15 is red.\n return \"red\"\n}\n\n/** Generate 8 accent hues from a primary, placing it in its natural slot. */\nfunction generateAccentsFromPrimary(primary: string): Record<HueName, string> {\n const o = hexToOklch(primary)\n if (!o) {\n return {\n red: \"#BF616A\",\n orange: \"#D08770\",\n yellow: \"#EBCB8B\",\n green: \"#A3BE8C\",\n teal: \"#88C0D0\",\n blue: \"#5E81AC\",\n purple: \"#B48EAD\",\n pink: \"#D4879C\",\n }\n }\n const slot = assignPrimaryToSlot(primary)\n const result = {} as Record<HueName, string>\n for (const [name, targetH] of Object.entries(targetHues) as [HueName, number][]) {\n // Hue rotation in OKLCH preserves L + C so all accents have equal\n // perceived lightness and colorfulness — the defining property of a\n // visually-balanced accent ramp.\n result[name] = name === slot ? primary : oklchToHex({ L: o.L, C: o.C, H: targetH })\n }\n return result\n}\n\n// ============================================================================\n// fromColors — Generate full palette from 1-3 hex colors\n// ============================================================================\n\ninterface FromColorsOptions {\n /** Background color (infers dark/light). */\n background?: string\n /** Foreground/text color. Generated if omitted. */\n foreground?: string\n /** Primary accent color. Generated if omitted. */\n primary?: string\n /** Force dark mode. */\n dark?: boolean\n /** Theme name. */\n name?: string\n}\n\n/**\n * Generate a full ColorScheme from 1-3 hex colors.\n *\n * At minimum, provide `background` or `primary`. Missing colors are\n * generated via surface ramp (from bg) and hue rotation (from primary).\n */\nexport function fromColors(opts: FromColorsOptions): ColorScheme {\n const dark = opts.dark ?? (opts.background ? isDarkColor(opts.background) : true)\n const step = dark ? brighten : darken\n\n // Generate background if not provided\n const bg = opts.background ?? (dark ? \"#2E3440\" : \"#FFFFFF\")\n const fg = opts.foreground ?? step(bg, 0.85)\n\n // Generate accents from primary or defaults\n const accents = opts.primary\n ? generateAccentsFromPrimary(opts.primary)\n : {\n red: \"#BF616A\",\n orange: \"#D08770\",\n yellow: \"#EBCB8B\",\n green: \"#A3BE8C\",\n teal: \"#88C0D0\",\n blue: \"#5E81AC\",\n purple: \"#B48EAD\",\n pink: \"#D4879C\",\n }\n\n // Surface ramp for grayscale ANSI colors\n const black = dark ? darken(bg, 0.05) : darken(bg, 0.1)\n const white = dark ? blend(fg, bg, 0.3) : blend(bg, fg, 0.3)\n const brightBlack = step(bg, 0.15)\n const brightWhite = dark ? fg : brighten(fg, 0.1)\n\n return {\n name: opts.name ?? (dark ? \"generated-dark\" : \"generated-light\"),\n dark,\n primary: opts.primary,\n black,\n red: accents.red,\n green: accents.green,\n yellow: accents.yellow,\n blue: accents.blue,\n magenta: accents.purple,\n cyan: accents.teal,\n white,\n brightBlack,\n brightRed: accents.orange,\n brightGreen: brighten(accents.green, 0.15),\n brightYellow: brighten(accents.yellow, 0.15),\n brightBlue: brighten(accents.blue, 0.15),\n brightMagenta: accents.pink,\n brightCyan: brighten(accents.teal, 0.15),\n brightWhite,\n foreground: fg,\n background: bg,\n cursorColor: fg,\n cursorText: bg,\n selectionBackground: blend(bg, accents.blue, 0.3),\n selectionForeground: fg,\n }\n}\n","/**\n * Auto-generate themes — create a complete Theme from a single primary color.\n *\n * Uses OKLCH color manipulation to derive complementary and analogous colors\n * for the full palette from one input color. OKLCH preserves perceived\n * lightness and chroma across hue rotations, so accent ramps look balanced.\n */\n\nimport { hexToOklch, oklchToHex, blend } from \"@silvery/color\"\nimport { fromColors } from \"./generators\"\nimport { deriveTheme } from \"./derive\"\nimport type { Theme } from \"./types\"\n\n/** Standard OKLCH hue positions for semantic accents (degrees).\n * OKLCH hues differ from HSL: red≈29, orange≈55, yellow≈90, green≈142,\n * teal≈195, blue≈240, purple≈305, pink≈350. Calibrated against Ottosson's\n * reference ramps. */\nconst HUE = {\n red: 29,\n orangeBright: 55,\n yellow: 90,\n green: 142,\n cyan: 195,\n blue: 240,\n magenta: 310,\n pinkBright: 350,\n} as const\n\n/**\n * Generate a complete Theme from a single primary color.\n *\n * Derives a full ColorScheme using OKLCH color manipulation:\n * - Background/foreground from lightness endpoints using the primary's hue\n * - Complementary and analogous accent colors from hue rotation\n * - Surface ramp from bg lightness offsets\n * - Status colors (error, warning, success, info) from standard hue positions\n *\n * @param primaryColor - A hex color string (e.g. \"#5E81AC\")\n * @param mode - \"dark\" or \"light\" theme mode\n * @returns A complete Theme with all 33 semantic tokens\n *\n * @example\n * ```typescript\n * const theme = autoGenerateTheme(\"#5E81AC\", \"dark\")\n * // Generates a full dark theme with blue as the primary accent\n *\n * const light = autoGenerateTheme(\"#E06C75\", \"light\")\n * // Generates a full light theme with red/rose as the primary accent\n * ```\n */\nexport function autoGenerateTheme(primaryColor: string, mode: \"dark\" | \"light\"): Theme {\n const o = hexToOklch(primaryColor)\n if (!o) {\n // Fallback: use default colors if input is not valid hex\n const palette = fromColors({ dark: mode === \"dark\" })\n return deriveTheme(palette)\n }\n\n const dark = mode === \"dark\"\n\n // Background and foreground — use the primary's hue at low chroma for subtle\n // tinting, OKLCH L endpoints calibrated perceptually.\n const bgL = dark ? 0.22 : 0.96\n const fgL = dark ? 0.9 : 0.2\n const bgC = Math.min(o.C, 0.03) // keep bg chroma low — it's a neutral\n const bg = oklchToHex({ L: bgL, C: bgC, H: o.H })\n const fg = oklchToHex({ L: fgL, C: bgC * 0.5, H: o.H })\n\n // Accent ring — same L and C as primary, different H. Preserves perceived\n // weight across the ramp so no one color pops more than another.\n const accentL = dark ? 0.72 : 0.52\n const accentC = Math.max(o.C, 0.1) // ensure accents are vivid enough\n const accent = (h: number) => oklchToHex({ L: accentL, C: accentC, H: h })\n\n const red = accent(HUE.red)\n const green = accent(HUE.green)\n const yellow = accent(HUE.yellow)\n const blue = accent(HUE.blue)\n const magenta = accent(HUE.magenta)\n const cyan = accent(HUE.cyan)\n\n // Bright variants — shift L by ±0.08 in the appropriate direction.\n const brightL = accentL + (dark ? 0.1 : -0.1)\n const brightAccent = (h: number) => oklchToHex({ L: brightL, C: accentC, H: h })\n\n const brightRed = brightAccent(HUE.orangeBright)\n const brightGreen = brightAccent(HUE.green)\n const brightYellow = brightAccent(HUE.yellow)\n const brightBlue = brightAccent(HUE.blue)\n const brightMagenta = brightAccent(HUE.pinkBright)\n const brightCyan = brightAccent(HUE.cyan)\n\n // Surface ramp — neutral grays at the bg's hue\n const black = oklchToHex({ L: dark ? bgL * 0.7 : bgL * 0.92, C: bgC, H: o.H })\n const white = oklchToHex({ L: dark ? 0.6 : 0.35, C: bgC * 0.3, H: o.H })\n const brightBlack = oklchToHex({ L: dark ? bgL + 0.1 : bgL - 0.08, C: bgC, H: o.H })\n const brightWhite = dark ? fg : oklchToHex({ L: fgL - 0.05, C: bgC * 0.5, H: o.H })\n\n const palette = {\n name: `generated-${mode}`,\n dark,\n primary: primaryColor,\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: fg,\n background: bg,\n cursorColor: fg,\n cursorText: bg,\n selectionBackground: blend(bg, primaryColor, 0.3),\n selectionForeground: fg,\n }\n\n // Primary seed is on the palette — deriveTheme() uses it directly,\n // ensuring contrast and deriving secondary/accent consistently.\n return deriveTheme(palette)\n}\n","/**\n * ANSI 16 theme generation — derives a complete Theme from a primary color + dark/light.\n *\n * Uses ANSI color names (not hex) so it works on any terminal without truecolor support.\n */\n\nimport type { AnsiPrimary, Theme } from \"./types\"\nimport { deriveFields, DEFAULT_VARIANTS } from \"./derived\"\n\n// Re-export for consumers that import DEFAULT_VARIANTS from here.\nexport { DEFAULT_VARIANTS }\n\n/**\n * Generate a complete ANSI 16 theme from a primary color + dark/light preference.\n *\n * All token values are ANSI color names (e.g. \"yellow\", \"blueBright\").\n */\nexport function generateTheme(primary: AnsiPrimary, dark: boolean): Theme {\n const fg = dark ? \"whiteBright\" : \"black\"\n const accent = primary // generate.ts: accent = primary (single-color generator)\n const selectionbg = primary\n const surfacebg = dark ? \"black\" : \"white\"\n\n // Categorical ring — computed from dark flag alone (no ColorScheme available)\n const ring = {\n red: dark ? \"redBright\" : \"red\",\n orange: dark ? \"redBright\" : \"red\", // no orange slot in ANSI 16\n yellow: \"yellow\",\n green: dark ? \"greenBright\" : \"green\",\n teal: \"cyan\", // canonical: cyan (not cyanBright — aligned to deriveAnsi16Theme)\n blue: dark ? \"blueBright\" : \"blue\",\n purple: \"magenta\",\n pink: dark ? \"magentaBright\" : \"magenta\",\n }\n\n const derived = deriveFields({ primary, accent, fg, selectionbg, surfacebg, ring })\n\n return {\n name: `${dark ? \"dark\" : \"light\"}-${primary}`,\n\n // ── Root pair ─────────────────────────────────────────────────\n bg: \"\",\n fg,\n\n // ── Surface pairs (base = text, *bg = background) ──────────\n muted: dark ? \"white\" : \"blackBright\",\n mutedbg: dark ? \"black\" : \"white\",\n surface: dark ? \"whiteBright\" : \"black\",\n surfacebg,\n popover: dark ? \"whiteBright\" : \"black\",\n popoverbg: dark ? \"blackBright\" : \"white\",\n inverse: dark ? \"black\" : \"whiteBright\",\n inversebg: dark ? \"whiteBright\" : \"black\",\n cursor: \"black\",\n cursorbg: primary,\n selection: \"black\",\n selectionbg: primary,\n\n // ── Accent pairs (base = area bg, *fg = text on area) ──────\n primary,\n primaryfg: \"black\",\n secondary: primary,\n secondaryfg: \"black\",\n accent: primary,\n accentfg: \"black\",\n error: dark ? \"redBright\" : \"red\",\n errorfg: \"black\",\n warning: primary,\n warningfg: \"black\",\n success: dark ? \"greenBright\" : \"green\",\n successfg: \"black\",\n info: dark ? \"cyanBright\" : \"cyan\",\n infofg: \"black\",\n\n // ── Standalone ───────────────────────────────────────────────\n border: \"gray\",\n inputborder: \"gray\",\n focusborder: dark ? \"blueBright\" : \"blue\",\n link: \"blueBright\",\n disabledfg: \"gray\",\n\n // ── Palette ──────────────────────────────────────────────────\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 // ── Derived fields (brand, ring, state variants, variants) ───\n ...derived,\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 ANSI16_SLOT_HEX,\n nearestAnsi16,\n rgbToAnsi256,\n ansi256ToHex,\n fgFromRgb,\n bgFromRgb,\n quantizeHex,\n pickColorLevel,\n type ColorTier,\n} from \"./color-maps\"\n\n// =============================================================================\n// Flat Projection (generic — any nested-hex DesignSystem Theme)\n// =============================================================================\n\nexport { bakeFlat, defaultFlattenRule } from \"./flatten\"\nexport type { FlattenRule } from \"./flatten\"\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// Kitty Graphics Protocol — cell-sized overlay placements\n// =============================================================================\n\nexport {\n BACKDROP_SCRIM_IMAGE_ID,\n BACKDROP_PLACEMENT_X_STRIDE,\n backdropPlacementId,\n buildScrimPixels,\n kittyUploadScrimImage,\n kittyPlaceAt,\n kittyDeletePlacement,\n kittyDeleteAllScrimPlacements,\n cupTo,\n CURSOR_SAVE,\n CURSOR_RESTORE,\n} from \"./kitty-graphics\"\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, deriveAnsi16Theme, loadTheme } from \"./theme/derive\"\nexport type { ThemeAdjustment, LoadThemeOptions } from \"./theme/derive\"\nexport { deriveFields, DEFAULT_VARIANTS } from \"./theme/derived\"\nexport type {\n DeriveFieldsInput,\n DeriveFieldsAnsi16Input,\n DeriveFieldsTruecolorInput,\n DerivedFields,\n} from \"./theme/derived\"\nexport {\n deriveMonochromeTheme,\n monoAttrsFor,\n monoAttrsForColorString,\n DEFAULT_MONO_ATTRS,\n} from \"./theme/monochrome\"\nexport type { MonoAttr, MonochromeAttrs } from \"./theme/monochrome\"\nexport { fingerprintMatch, fingerprintCandidates } from \"./theme/fingerprint\"\nexport type { FingerprintMatch, FingerprintOptions } from \"./theme/fingerprint\"\nexport { detectScheme, detectSchemeTheme } from \"./theme/orchestrator\"\nexport type {\n DetectSchemeResult,\n DetectSchemeOptions,\n DetectSource,\n SlotSource,\n} from \"./theme/orchestrator\"\nexport type { ActiveScheme } from \"./theme/types\"\nexport type {\n ThemeToken,\n StandardThemeToken,\n ColorRingToken,\n BrandToken,\n PaletteToken,\n KnownThemeToken,\n TextColor,\n ColorKeyword,\n} from \"./theme/tokens\"\nexport { defineTokens, resolveCustomToken, CustomTokenError } from \"./theme/custom\"\nexport type {\n DeriveTokenDef,\n BrandTokenDef,\n CustomTokenDef,\n CustomTokenRegistry,\n} from \"./theme/custom\"\nexport {\n validateThemeInvariants,\n formatViolations,\n ThemeInvariantError,\n AA_RATIO,\n LARGE_RATIO,\n FAINT_RATIO,\n SELECTION_DELTA_L,\n CURSOR_DELTA_E,\n} from \"./theme/invariants\"\nexport type { InvariantViolation, InvariantResult, InvariantOptions } from \"./theme/invariants\"\nexport {\n ansi16DarkTheme,\n ansi16LightTheme,\n defaultDarkScheme,\n defaultLightScheme,\n} from \"./theme/default-schemes\"\nexport type { ColorScheme, Theme, Variant, AnsiPrimary, HueName } from \"./theme/types\"\nexport type { AnsiColorName as PaletteColorName } from \"./theme/types\"\nexport { COLOR_SCHEME_FIELDS } from \"./theme/types\"\nexport type { VariantName, KnownVariant } from \"./theme/tokens\"\nexport { KNOWN_VARIANTS } from \"./theme/tokens\"\n\n// =============================================================================\n// Theme Detection (async, OSC-based)\n// =============================================================================\n\nexport { detectTerminalScheme, detectTheme } from \"./theme/detect\"\nexport type { DetectedScheme, DetectThemeOptions } from \"./theme/detect\"\n\n// =============================================================================\n// OSC Protocol — Terminal color queries\n// =============================================================================\n\nexport {\n queryPaletteColor,\n queryMultiplePaletteColors,\n setPaletteColor,\n parsePaletteResponse,\n} 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 createBgModeDetector,\n parseBgModeResponse,\n ENABLE_BG_MODE_REPORTING,\n DISABLE_BG_MODE_REPORTING,\n} from \"./color-scheme\"\nexport type { BgModeDetector, BgModeDetectorOptions, BgMode } from \"./color-scheme\"\n\n// =============================================================================\n// Palette Generation (scheme-independent — no built-in lookup)\n// =============================================================================\n\nexport { fromColors, assignPrimaryToSlot } from \"./theme/generators\"\nexport { autoGenerateTheme } from \"./theme/auto-generate\"\nexport { generateTheme } from \"./theme/generate\"\n"],"mappings":"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"}