silvery 0.21.1 → 0.23.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 (171) hide show
  1. package/dist/{Text-BRf-59j2.mjs → Text-Ci6UCSTL.mjs} +46 -46
  2. package/dist/Text-Ci6UCSTL.mjs.map +1 -0
  3. package/dist/{ag-BeFC4S2N.mjs → ag-q9lRlKlt.mjs} +42 -19
  4. package/dist/ag-q9lRlKlt.mjs.map +1 -0
  5. package/dist/{animation-N8MFybTk.mjs → animation-CZ4x2R7C.mjs} +1 -1
  6. package/dist/{animation-N8MFybTk.mjs.map → animation-CZ4x2R7C.mjs.map} +1 -1
  7. package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLmIMnop.mjs} +1 -1
  8. package/dist/{ansi-C6Qs1Wn2.mjs.map → ansi-CLmIMnop.mjs.map} +1 -1
  9. package/dist/{ansi-CBkam1ty.d.mts → ansi-zmNzgkPB.d.mts} +1 -1
  10. package/dist/{ansi-CBkam1ty.d.mts.map → ansi-zmNzgkPB.d.mts.map} +1 -1
  11. package/dist/backend-DSiSIc-h.mjs +13396 -0
  12. package/dist/backend-DSiSIc-h.mjs.map +1 -0
  13. package/dist/chain-bridge-CkYcMxlq.mjs +4149 -0
  14. package/dist/chain-bridge-CkYcMxlq.mjs.map +1 -0
  15. package/dist/{chunk-hT5z_Zn9.mjs → chunk-BEJ448es.mjs} +1 -1
  16. package/dist/cli-VNqUKlXw.mjs +4 -0
  17. package/dist/{context-BU5LkkIy.mjs → context-CEhuD1R_.mjs} +1 -1
  18. package/dist/{context-BU5LkkIy.mjs.map → context-CEhuD1R_.mjs.map} +1 -1
  19. package/dist/devtools-BF4IMumr.mjs +2 -0
  20. package/dist/{devtools-9zfhpFyG.mjs → devtools-td2AjFwc.mjs} +5 -4
  21. package/dist/{devtools-9zfhpFyG.mjs.map → devtools-td2AjFwc.mjs.map} +1 -1
  22. package/dist/{easing-B0oZKDki.d.mts → easing-C5MrdO7V.d.mts} +1 -1
  23. package/dist/{easing-B0oZKDki.d.mts.map → easing-C5MrdO7V.d.mts.map} +1 -1
  24. package/dist/{eta-DGOuC8yU.mjs → eta-BwYWEjfS.mjs} +1 -5
  25. package/dist/{eta-DGOuC8yU.mjs.map → eta-BwYWEjfS.mjs.map} +1 -1
  26. package/dist/{flexily-zero-adapter-D6hcFgrH.mjs → flexily-zero-adapter-DktX3HsX.mjs} +1 -1
  27. package/dist/{flexily-zero-adapter-CEJOcbNp.mjs → flexily-zero-adapter-VoBGHG14.mjs} +1 -1
  28. package/dist/{flexily-zero-adapter-CEJOcbNp.mjs.map → flexily-zero-adapter-VoBGHG14.mjs.map} +1 -1
  29. package/dist/hit-registry-D_nxOivS.d.mts +71 -0
  30. package/dist/hit-registry-D_nxOivS.d.mts.map +1 -0
  31. package/dist/{image-1nRyKa60.mjs → image-CIF75xMr.mjs} +24 -24
  32. package/dist/image-CIF75xMr.mjs.map +1 -0
  33. package/dist/{index-2E1jYgak.d.mts → index-377zdPLP.d.mts} +35 -12
  34. package/dist/index-377zdPLP.d.mts.map +1 -0
  35. package/dist/{index-DnuadDNL.d.mts → index-BcSr0RAQ.d.mts} +8590 -11173
  36. package/dist/index-BcSr0RAQ.d.mts.map +1 -0
  37. package/dist/{index-Dg1YaeJb.d.mts → index-DLnpxDAm.d.mts} +2 -2
  38. package/dist/{index-Dg1YaeJb.d.mts.map → index-DLnpxDAm.d.mts.map} +1 -1
  39. package/dist/{index-Bi4Jdz5g.d.mts → index-DlNmckTq.d.mts} +2 -2
  40. package/dist/{index-Bi4Jdz5g.d.mts.map → index-DlNmckTq.d.mts.map} +1 -1
  41. package/dist/index.d.mts +12 -8
  42. package/dist/index.d.mts.map +1 -1
  43. package/dist/index.mjs +18 -17
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/{layout-engine-Ca_nbtfL.mjs → layout-engine-BgR58vL0.mjs} +3 -3
  46. package/dist/{layout-engine-Ca_nbtfL.mjs.map → layout-engine-BgR58vL0.mjs.map} +1 -1
  47. package/dist/{layout-engine-CgsoBRIn.mjs → layout-engine-DNjTha8f.mjs} +1 -1
  48. package/dist/{layout-signals-Dch2EiCy.mjs → layout-signals-CGYbHmxy.mjs} +2 -2
  49. package/dist/layout-signals-CGYbHmxy.mjs.map +1 -0
  50. package/dist/{bound-term-BumfuXXW.d.mts → mouse-events-B2z5tbsL.d.mts} +540 -401
  51. package/dist/mouse-events-B2z5tbsL.d.mts.map +1 -0
  52. package/dist/{mouse-events-hnbJZRwK.mjs → mouse-events-WQ2h-uqG.mjs} +14 -6
  53. package/dist/mouse-events-WQ2h-uqG.mjs.map +1 -0
  54. package/dist/{multi-progress-Bg4ngK80.d.mts → multi-progress-BaEFfHKP.d.mts} +2 -2
  55. package/dist/{multi-progress-Bg4ngK80.d.mts.map → multi-progress-BaEFfHKP.d.mts.map} +1 -1
  56. package/dist/{multi-progress-CaXTuL9G.mjs → multi-progress-zCWHEm9P.mjs} +3 -3
  57. package/dist/{multi-progress-CaXTuL9G.mjs.map → multi-progress-zCWHEm9P.mjs.map} +1 -1
  58. package/dist/{node-BiFu8I9Y.mjs → node-CJ3J_rW-.mjs} +4 -4
  59. package/dist/node-CJ3J_rW-.mjs.map +1 -0
  60. package/dist/{progress-B_UPy6zk.mjs → progress-6vJ7nxUg.mjs} +4 -4
  61. package/dist/{progress-B_UPy6zk.mjs.map → progress-6vJ7nxUg.mjs.map} +1 -1
  62. package/dist/{progress-bar-DmIMPdL0.mjs → progress-bar-BlFNsZL8.mjs} +4 -4
  63. package/dist/{progress-bar-DmIMPdL0.mjs.map → progress-bar-BlFNsZL8.mjs.map} +1 -1
  64. package/dist/{reconciler-NBDSEm8k.mjs → reconciler--_-biN23.mjs} +111 -150
  65. package/dist/reconciler--_-biN23.mjs.map +1 -0
  66. package/dist/{render-string-BntLj7Xq.mjs → render-string-DaghHpLN.mjs} +1 -1
  67. package/dist/{render-string-B4h4SmK7.mjs → render-string-DtHZP0cU.mjs} +15 -11
  68. package/dist/render-string-DtHZP0cU.mjs.map +1 -0
  69. package/dist/runtime.d.mts +3 -2
  70. package/dist/runtime.mjs +3 -2
  71. package/dist/{schemes-DYt2ushj.mjs → schemes-DWQPxXAi.mjs} +2 -2
  72. package/dist/{schemes-DYt2ushj.mjs.map → schemes-DWQPxXAi.mjs.map} +1 -1
  73. package/dist/{spinner-Py8_-hn9.mjs → spinner-B50hILqx.mjs} +3 -3
  74. package/dist/{spinner-Py8_-hn9.mjs.map → spinner-B50hILqx.mjs.map} +1 -1
  75. package/dist/{spinner-CLgzJ_QF.d.mts → spinner-DN10UfF0.d.mts} +2 -2
  76. package/dist/{spinner-CLgzJ_QF.d.mts.map → spinner-DN10UfF0.d.mts.map} +1 -1
  77. package/dist/{src-Oe6x5PrS.mjs → src-B8lf1kiR.mjs} +190 -83
  78. package/dist/src-B8lf1kiR.mjs.map +1 -0
  79. package/dist/{src-Dvq-s8iD.mjs → src-BOLdi3WG.mjs} +3 -3
  80. package/dist/{src-Dvq-s8iD.mjs.map → src-BOLdi3WG.mjs.map} +1 -1
  81. package/dist/{src-B9S_woYc.mjs → src-BXeTHHlL.mjs} +20289 -23262
  82. package/dist/src-BXeTHHlL.mjs.map +1 -0
  83. package/dist/{src-WeA_J4BV.mjs → src-BqeBFB3X.mjs} +90 -47
  84. package/dist/src-BqeBFB3X.mjs.map +1 -0
  85. package/dist/{src-CbhWmUnF.mjs → src-DbqcSrhy.mjs} +1400 -1427
  86. package/dist/src-DbqcSrhy.mjs.map +1 -0
  87. package/dist/{steps-DYrzCUCK.d.mts → steps-B2kBmFpb.d.mts} +1 -1
  88. package/dist/{steps-DYrzCUCK.d.mts.map → steps-B2kBmFpb.d.mts.map} +1 -1
  89. package/dist/{svg-DhxQkz-O.mjs → svg-NmV9dgB9.mjs} +1 -1
  90. package/dist/{svg-DhxQkz-O.mjs.map → svg-NmV9dgB9.mjs.map} +1 -1
  91. package/dist/{svg-Hk7lIl4F.d.mts → svg-VUr78l5d.d.mts} +1 -1
  92. package/dist/{svg-Hk7lIl4F.d.mts.map → svg-VUr78l5d.d.mts.map} +1 -1
  93. package/dist/term.d.mts +2 -2
  94. package/dist/term.mjs +3 -3
  95. package/dist/test.d.mts +673 -0
  96. package/dist/test.d.mts.map +1 -0
  97. package/dist/test.mjs +2829 -0
  98. package/dist/test.mjs.map +1 -0
  99. package/dist/theme.d.mts +2 -2
  100. package/dist/theme.d.mts.map +1 -1
  101. package/dist/theme.mjs +3 -3
  102. package/dist/{types-Bx-XZNbE.d.mts → types-D_E0FbqA.d.mts} +1 -1
  103. package/dist/{types-Bx-XZNbE.d.mts.map → types-D_E0FbqA.d.mts.map} +1 -1
  104. package/dist/ui/animation.d.mts +2 -2
  105. package/dist/ui/animation.mjs +1 -1
  106. package/dist/ui/ansi.d.mts +1 -1
  107. package/dist/ui/ansi.mjs +1 -1
  108. package/dist/ui/cli.d.mts +3 -3
  109. package/dist/ui/cli.mjs +5 -5
  110. package/dist/ui/image.d.mts +1 -1
  111. package/dist/ui/image.mjs +1 -1
  112. package/dist/ui/progress.d.mts +4 -4
  113. package/dist/ui/progress.mjs +4 -4
  114. package/dist/ui/react.d.mts +1 -1
  115. package/dist/ui/react.mjs +2 -2
  116. package/dist/ui/react.mjs.map +1 -1
  117. package/dist/ui/recording-chrome-react.d.mts +1 -1
  118. package/dist/ui/recording-chrome-react.mjs +2 -2
  119. package/dist/ui/recording-chrome.d.mts +1 -1
  120. package/dist/ui/recording-chrome.mjs +1 -1
  121. package/dist/ui/utils.mjs +1 -1
  122. package/dist/ui/wrappers.d.mts +2 -2
  123. package/dist/ui/wrappers.mjs +1 -1
  124. package/dist/ui.d.mts +6 -6
  125. package/dist/ui.mjs +7 -7
  126. package/dist/{ansi-OYRLxxZQ.mjs → unicode-CxyxVGmB.mjs} +7317 -6909
  127. package/dist/unicode-CxyxVGmB.mjs.map +1 -0
  128. package/dist/{useLatest-DC8i7guK.d.mts → useLatest-UOvWy0ZW.d.mts} +2 -2
  129. package/dist/{useLatest-DC8i7guK.d.mts.map → useLatest-UOvWy0ZW.d.mts.map} +1 -1
  130. package/dist/{useLayout-BKsQl2Or.mjs → useLayout-D5cE8OCI.mjs} +4 -4
  131. package/dist/{useLayout-BKsQl2Or.mjs.map → useLayout-D5cE8OCI.mjs.map} +1 -1
  132. package/dist/{with-text-input-DG4f7JII.d.mts → with-text-input-DLoSCBrm.d.mts} +3 -3
  133. package/dist/{with-text-input-DG4f7JII.d.mts.map → with-text-input-DLoSCBrm.d.mts.map} +1 -1
  134. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts +3106 -0
  135. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts.map +1 -0
  136. package/dist/{wrapper-D7gNSsgf.mjs → wrapper-CD29afOs.mjs} +17 -37
  137. package/dist/wrapper-CD29afOs.mjs.map +1 -0
  138. package/dist/{wrappers-CypAzrMO.mjs → wrappers-CInBJm44.mjs} +6 -6
  139. package/dist/{wrappers-CypAzrMO.mjs.map → wrappers-CInBJm44.mjs.map} +1 -1
  140. package/dist/{yoga-adapter-SsEIqMc1.mjs → yoga-adapter-9uab5Qn-.mjs} +2 -2
  141. package/dist/{yoga-adapter-SsEIqMc1.mjs.map → yoga-adapter-9uab5Qn-.mjs.map} +1 -1
  142. package/dist/yoga-adapter-yqTl1aXK.mjs +2 -0
  143. package/package.json +20 -15
  144. package/dist/Text-BRf-59j2.mjs.map +0 -1
  145. package/dist/ag-BeFC4S2N.mjs.map +0 -1
  146. package/dist/ansi-OYRLxxZQ.mjs.map +0 -1
  147. package/dist/bound-term-BumfuXXW.d.mts.map +0 -1
  148. package/dist/cli-DG6zsfsS.mjs +0 -4
  149. package/dist/devtools-nmPUmYU_.mjs +0 -2
  150. package/dist/image-1nRyKa60.mjs.map +0 -1
  151. package/dist/index-2E1jYgak.d.mts.map +0 -1
  152. package/dist/index-DnuadDNL.d.mts.map +0 -1
  153. package/dist/layout-signals-Dch2EiCy.mjs.map +0 -1
  154. package/dist/mouse-events-hnbJZRwK.mjs.map +0 -1
  155. package/dist/node-BiFu8I9Y.mjs.map +0 -1
  156. package/dist/reconciler-NBDSEm8k.mjs.map +0 -1
  157. package/dist/render-string-B4h4SmK7.mjs.map +0 -1
  158. package/dist/src-B9S_woYc.mjs.map +0 -1
  159. package/dist/src-CbhWmUnF.mjs.map +0 -1
  160. package/dist/src-Oe6x5PrS.mjs.map +0 -1
  161. package/dist/src-WeA_J4BV.mjs.map +0 -1
  162. package/dist/ui/display.d.mts +0 -35
  163. package/dist/ui/display.d.mts.map +0 -1
  164. package/dist/ui/display.mjs +0 -123
  165. package/dist/ui/display.mjs.map +0 -1
  166. package/dist/ui/input.d.mts +0 -184
  167. package/dist/ui/input.d.mts.map +0 -1
  168. package/dist/ui/input.mjs +0 -283
  169. package/dist/ui/input.mjs.map +0 -1
  170. package/dist/wrapper-D7gNSsgf.mjs.map +0 -1
  171. package/dist/yoga-adapter-1ex8r0ws.mjs +0 -2
@@ -1,5 +1,5 @@
1
- import { f as createStyle, j as createTerminalProfile } from "./src-Oe6x5PrS.mjs";
2
- import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW } from "./ansi-C6Qs1Wn2.mjs";
1
+ import { f as createStyle, j as createTerminalProfile } from "./src-B8lf1kiR.mjs";
2
+ import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW } from "./ansi-CLmIMnop.mjs";
3
3
  //#region packages/ink/src/chalk.ts
4
4
  /**
5
5
  * silvery/chalk — Drop-in chalk replacement powered by @silvery/ansi.
@@ -310,4 +310,4 @@ function createSpinner(options) {
310
310
  //#endregion
311
311
  export { chalk as a, createSpinner as i, SPINNER_INTERVALS as n, Spinner as r, SPINNER_FRAMES as t };
312
312
 
313
- //# sourceMappingURL=spinner-Py8_-hn9.mjs.map
313
+ //# sourceMappingURL=spinner-B50hILqx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-Py8_-hn9.mjs","names":[],"sources":["../packages/ink/src/chalk.ts","../packages/ag-react/src/ui/cli/spinner.ts"],"sourcesContent":["/**\n * silvery/chalk — Drop-in chalk replacement powered by @silvery/ansi.\n *\n * ```ts\n * // Before:\n * import chalk from 'chalk'\n *\n * // After:\n * import chalk from 'silvery/chalk'\n * ```\n *\n * The default export is a chainable styling function with chalk-compatible API.\n * Under the hood it uses @silvery/ansi — no chalk dependency.\n *\n * @packageDocumentation\n */\n\nimport { createStyle, createTerminalProfile, type Style, type ColorLevel } from \"@silvery/ansi\"\n\n// =============================================================================\n// Color tier conversion (chalk uses 0-3, silvery uses ColorLevel)\n// =============================================================================\n\ntype ChalkLevel = 0 | 1 | 2 | 3\n\nfunction toChalkLevel(cl: ColorLevel): ChalkLevel {\n if (cl === \"mono\") return 0\n if (cl === \"ansi16\") return 1\n if (cl === \"256\") return 2\n return 3 // truecolor\n}\n\nfunction fromChalkLevel(level: ChalkLevel): ColorLevel {\n if (level === 0) return \"mono\"\n if (level === 1) return \"ansi16\"\n if (level === 2) return \"256\"\n return \"truecolor\"\n}\n\n// =============================================================================\n// Default instance (auto-detected)\n// =============================================================================\n\n// Post km-silvery.plateau-delete-legacy-shims (H6): `createTerminalProfile`\n// is the canonical single-source-of-truth entry point, replacing the former\n// `detectColor()` shim. Its `colorLevel` is the resolved tier through the\n// full NO_COLOR > FORCE_COLOR > auto precedence chain.\nconst detectedColor: ColorLevel =\n typeof process !== \"undefined\" && process.stdout\n ? createTerminalProfile({ stdout: process.stdout }).colorLevel\n : \"mono\"\n\n/**\n * Default chalk instance — drop-in replacement for `import chalk from 'chalk'`.\n *\n * Supports the full chainable API: `chalk.bold.red('error')`, `chalk.hex('#ff0')('hi')`, etc.\n * Also supports mutable `chalk.level` for chalk compat (0=none, 1=basic, 2=256, 3=truecolor).\n */\nconst chalk: Style = createStyle({ level: detectedColor })\nexport default chalk\n\n// =============================================================================\n// Named exports (chalk 5.x compatibility)\n// =============================================================================\n\n/**\n * Chalk constructor — creates a new style instance with a specific level.\n * Returns a callable Style (the constructor return overrides `this`).\n *\n * ```ts\n * const instance = new Chalk({ level: 3 })\n * console.log(instance.red('error'))\n * instance.level = 0 // disable colors\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Chalk extends Style {}\nexport class Chalk {\n constructor(options?: { level?: ChalkLevel }) {\n // chalk compat: validate level is 0-3\n if (options?.level !== undefined) {\n const lvl = options.level\n if (typeof lvl !== \"number\" || !Number.isInteger(lvl) || lvl < 0 || lvl > 3) {\n throw new Error(\"The `level` option should be an integer from 0 to 3\")\n }\n }\n // Returning an object from a constructor overrides `this` — chalk compat pattern\n return createStyle({\n level: fromChalkLevel(options?.level ?? toChalkLevel(detectedColor)),\n }) as any\n }\n}\n\nexport type ChalkInstance = Style\n\n/**\n * Color support detection for stdout.\n * Returns false if no color, or an object with the chalk level.\n */\nconst detectedLevel = toChalkLevel(detectedColor)\nexport const supportsColor: false | { level: ChalkLevel } =\n detectedLevel === 0 ? false : { level: detectedLevel }\n\n/**\n * Color support detection for stderr.\n */\nexport const supportsColorStderr: false | { level: ChalkLevel } = (() => {\n if (!process?.stderr) return false\n // stderr gets its own profile pass — a pipe may have different TTY state\n // than stdout (though in practice they track together). `createTerminalProfile`\n // accepts any `{ isTTY?: boolean }` structural shape.\n const level = toChalkLevel(createTerminalProfile({ stdout: process.stderr }).colorLevel)\n return level === 0 ? false : { level }\n})()\n\n// =============================================================================\n// Chalk name lists (for programmatic access)\n// =============================================================================\n\nexport const modifierNames = [\n \"reset\",\n \"bold\",\n \"dim\",\n \"italic\",\n \"underline\",\n \"overline\",\n \"inverse\",\n \"hidden\",\n \"strikethrough\",\n \"visible\",\n] as const\n\nexport const foregroundColorNames = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"gray\",\n \"grey\",\n \"blackBright\",\n \"redBright\",\n \"greenBright\",\n \"yellowBright\",\n \"blueBright\",\n \"magentaBright\",\n \"cyanBright\",\n \"whiteBright\",\n] as const\n\nexport const backgroundColorNames = [\n \"bgBlack\",\n \"bgRed\",\n \"bgGreen\",\n \"bgYellow\",\n \"bgBlue\",\n \"bgMagenta\",\n \"bgCyan\",\n \"bgWhite\",\n \"bgGray\",\n \"bgGrey\",\n \"bgBlackBright\",\n \"bgRedBright\",\n \"bgGreenBright\",\n \"bgYellowBright\",\n \"bgBlueBright\",\n \"bgMagentaBright\",\n \"bgCyanBright\",\n \"bgWhiteBright\",\n] as const\n\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames] as const\n\n// Re-export detection utilities that chalk users often need.\n// Post H6 (km-silvery.plateau-delete-legacy-shims): `detectColor` is gone —\n// chalk users reach for `createTerminalProfile` instead (it's a one-shot\n// call that returns a full TerminalProfile, of which `colorLevel` is one\n// field).\nexport { createTerminalProfile, toChalkLevel, fromChalkLevel }\nexport type { ColorLevel, ChalkLevel }\n","/**\n * CLI Spinner - Animated indeterminate progress indicator\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SpinnerOptions, SpinnerStyle } from \"../types.js\"\nimport { CURSOR_HIDE, CURSOR_SHOW, CURSOR_TO_START, CLEAR_LINE_END, write, isTTY } from \"./ansi\"\n\n/** Spinner animation frames by style */\nexport const SPINNER_FRAMES: Record<SpinnerStyle, string[]> = {\n dots: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n line: [\"-\", \"\\\\\", \"|\", \"/\"],\n arc: [\"◜\", \"◠\", \"◝\", \"◞\", \"◡\", \"◟\"],\n bounce: [\"⠁\", \"⠂\", \"⠄\", \"⠂\"],\n pulse: [\"█\", \"▓\", \"▒\", \"░\", \"▒\", \"▓\"],\n}\n\n/** Default intervals for each style (ms) */\nexport const SPINNER_INTERVALS: Record<SpinnerStyle, number> = {\n dots: 80,\n line: 120,\n arc: 100,\n bounce: 120,\n pulse: 100,\n}\n\n/**\n * Spinner class for CLI progress indication\n *\n * @example\n * ```ts\n * const spinner = new Spinner(\"Loading...\");\n * spinner.start();\n * await doWork();\n * spinner.succeed(\"Done!\");\n * ```\n */\nexport class Spinner {\n private text: string\n private style: SpinnerStyle\n private color: string\n private stream: NodeJS.WriteStream\n private hideCursor: boolean\n private interval: number\n\n private frameIndex = 0\n private timer: ReturnType<typeof setInterval> | null = null\n private isSpinning = false\n\n constructor(textOrOptions?: string | SpinnerOptions) {\n const options: SpinnerOptions =\n typeof textOrOptions === \"string\" ? { text: textOrOptions } : (textOrOptions ?? {})\n\n this.text = options.text ?? \"\"\n this.style = options.style ?? \"dots\"\n this.color = options.color ?? \"cyan\"\n this.stream = options.stream ?? process.stdout\n this.hideCursor = options.hideCursor ?? true\n this.interval = options.interval ?? SPINNER_INTERVALS[this.style]\n }\n\n /** Get current spinner text */\n get currentText(): string {\n return this.text\n }\n\n /** Set spinner text (updates immediately if spinning) */\n set currentText(value: string) {\n this.text = value\n if (this.isSpinning) {\n this.render()\n }\n }\n\n /** Check if spinner is currently active */\n get spinning(): boolean {\n return this.isSpinning\n }\n\n /**\n * Start the spinner animation\n */\n start(text?: string): this {\n if (text !== undefined) {\n this.text = text\n }\n\n if (this.isSpinning) {\n return this\n }\n\n this.isSpinning = true\n this.frameIndex = 0\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n this.timer = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES[this.style].length\n this.render()\n }, this.interval)\n\n return this\n }\n\n /**\n * Stop the spinner\n */\n stop(): this {\n if (!this.isSpinning) {\n return this\n }\n\n this.isSpinning = false\n\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n\n this.clear()\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /**\n * Stop with success message (green checkmark)\n */\n succeed(text?: string): this {\n return this.stopWithSymbol(chalk.green(\"✔\"), text ?? this.text)\n }\n\n /**\n * Stop with failure message (red X)\n */\n fail(text?: string): this {\n return this.stopWithSymbol(chalk.red(\"✖\"), text ?? this.text)\n }\n\n /**\n * Stop with warning message (yellow warning)\n */\n warn(text?: string): this {\n return this.stopWithSymbol(chalk.yellow(\"⚠\"), text ?? this.text)\n }\n\n /**\n * Stop with info message (blue info)\n */\n info(text?: string): this {\n return this.stopWithSymbol(chalk.blue(\"ℹ\"), text ?? this.text)\n }\n\n /**\n * Clear the spinner line\n */\n clear(): this {\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${CLEAR_LINE_END}`, this.stream)\n }\n return this\n }\n\n private render(): void {\n const frame = SPINNER_FRAMES[this.style][this.frameIndex]\n const colorFn = (chalk as unknown as Record<string, (s: string) => string>)[this.color]\n const coloredFrame = colorFn ? colorFn(frame!) : frame!\n const output = this.text ? `${coloredFrame} ${this.text}` : coloredFrame\n\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${output}${CLEAR_LINE_END}`, this.stream)\n }\n }\n\n private stopWithSymbol(symbol: string, text: string): this {\n this.stop()\n write(`${symbol} ${text}\\n`, this.stream)\n return this\n }\n\n /**\n * Dispose the spinner (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n\n /**\n * Static helper to quickly start a spinner\n * Returns a stop function\n *\n * @example\n * ```ts\n * const stop = Spinner.start(\"Loading...\");\n * await doWork();\n * stop();\n * ```\n */\n static start(textOrOptions?: string | SpinnerOptions): () => void {\n const spinner = new Spinner(textOrOptions)\n spinner.start()\n return () => spinner.stop()\n }\n}\n\n/**\n * Callable spinner interface - call with text to show/update\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * spinner(\"Loading...\"); // Shows spinner with text\n * spinner(\"Still loading...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport interface CallableSpinner extends Disposable {\n /** Call with text to show/update the spinner */\n (text: string): void\n /** Stop the spinner */\n stop(): void\n /** Stop with success message (green checkmark) */\n succeed(text?: string): void\n /** Stop with failure message (red X) */\n fail(text?: string): void\n /** Stop with warning message (yellow warning) */\n warn(text?: string): void\n /** Stop with info message (blue info) */\n info(text?: string): void\n}\n\n/**\n * Create a callable, disposable spinner\n *\n * The spinner is lazy - it won't show anything until you call it with text.\n * Use with `using` for automatic cleanup:\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * // Nothing visible yet\n *\n * spinner(\"Loading repo...\"); // Now shows spinner\n * spinner(\"Applying events...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport function createSpinner(options?: SpinnerOptions): CallableSpinner {\n const spinner = new Spinner({ ...options, text: \"\" })\n\n const callable = ((text: string) => {\n // Always restart if not spinning (handles initial call and after succeed/fail/etc)\n if (!spinner.spinning) {\n spinner.start(text)\n } else {\n spinner.currentText = text\n }\n }) as CallableSpinner\n\n callable.stop = () => spinner.stop()\n callable.succeed = (text) => spinner.succeed(text)\n callable.fail = (text) => spinner.fail(text)\n callable.warn = (text) => spinner.warn(text)\n callable.info = (text) => spinner.info(text)\n callable[Symbol.dispose] = () => spinner.stop()\n\n return callable\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"spinner-B50hILqx.mjs","names":[],"sources":["../packages/ink/src/chalk.ts","../packages/ag-react/src/ui/cli/spinner.ts"],"sourcesContent":["/**\n * silvery/chalk — Drop-in chalk replacement powered by @silvery/ansi.\n *\n * ```ts\n * // Before:\n * import chalk from 'chalk'\n *\n * // After:\n * import chalk from 'silvery/chalk'\n * ```\n *\n * The default export is a chainable styling function with chalk-compatible API.\n * Under the hood it uses @silvery/ansi — no chalk dependency.\n *\n * @packageDocumentation\n */\n\nimport { createStyle, createTerminalProfile, type Style, type ColorLevel } from \"@silvery/ansi\"\n\n// =============================================================================\n// Color tier conversion (chalk uses 0-3, silvery uses ColorLevel)\n// =============================================================================\n\ntype ChalkLevel = 0 | 1 | 2 | 3\n\nfunction toChalkLevel(cl: ColorLevel): ChalkLevel {\n if (cl === \"mono\") return 0\n if (cl === \"ansi16\") return 1\n if (cl === \"256\") return 2\n return 3 // truecolor\n}\n\nfunction fromChalkLevel(level: ChalkLevel): ColorLevel {\n if (level === 0) return \"mono\"\n if (level === 1) return \"ansi16\"\n if (level === 2) return \"256\"\n return \"truecolor\"\n}\n\n// =============================================================================\n// Default instance (auto-detected)\n// =============================================================================\n\n// Post km-silvery.plateau-delete-legacy-shims (H6): `createTerminalProfile`\n// is the canonical single-source-of-truth entry point, replacing the former\n// `detectColor()` shim. Its `colorLevel` is the resolved tier through the\n// full FORCE_COLOR > NO_COLOR > auto precedence chain.\nconst detectedColor: ColorLevel =\n typeof process !== \"undefined\" && process.stdout\n ? createTerminalProfile({ stdout: process.stdout }).colorLevel\n : \"mono\"\n\n/**\n * Default chalk instance — drop-in replacement for `import chalk from 'chalk'`.\n *\n * Supports the full chainable API: `chalk.bold.red('error')`, `chalk.hex('#ff0')('hi')`, etc.\n * Also supports mutable `chalk.level` for chalk compat (0=none, 1=basic, 2=256, 3=truecolor).\n */\nconst chalk: Style = createStyle({ level: detectedColor })\nexport default chalk\n\n// =============================================================================\n// Named exports (chalk 5.x compatibility)\n// =============================================================================\n\n/**\n * Chalk constructor — creates a new style instance with a specific level.\n * Returns a callable Style (the constructor return overrides `this`).\n *\n * ```ts\n * const instance = new Chalk({ level: 3 })\n * console.log(instance.red('error'))\n * instance.level = 0 // disable colors\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Chalk extends Style {}\nexport class Chalk {\n constructor(options?: { level?: ChalkLevel }) {\n // chalk compat: validate level is 0-3\n if (options?.level !== undefined) {\n const lvl = options.level\n if (typeof lvl !== \"number\" || !Number.isInteger(lvl) || lvl < 0 || lvl > 3) {\n throw new Error(\"The `level` option should be an integer from 0 to 3\")\n }\n }\n // Returning an object from a constructor overrides `this` — chalk compat pattern\n return createStyle({\n level: fromChalkLevel(options?.level ?? toChalkLevel(detectedColor)),\n }) as any\n }\n}\n\nexport type ChalkInstance = Style\n\n/**\n * Color support detection for stdout.\n * Returns false if no color, or an object with the chalk level.\n */\nconst detectedLevel = toChalkLevel(detectedColor)\nexport const supportsColor: false | { level: ChalkLevel } =\n detectedLevel === 0 ? false : { level: detectedLevel }\n\n/**\n * Color support detection for stderr.\n */\nexport const supportsColorStderr: false | { level: ChalkLevel } = (() => {\n if (!process?.stderr) return false\n // stderr gets its own profile pass — a pipe may have different TTY state\n // than stdout (though in practice they track together). `createTerminalProfile`\n // accepts any `{ isTTY?: boolean }` structural shape.\n const level = toChalkLevel(createTerminalProfile({ stdout: process.stderr }).colorLevel)\n return level === 0 ? false : { level }\n})()\n\n// =============================================================================\n// Chalk name lists (for programmatic access)\n// =============================================================================\n\nexport const modifierNames = [\n \"reset\",\n \"bold\",\n \"dim\",\n \"italic\",\n \"underline\",\n \"overline\",\n \"inverse\",\n \"hidden\",\n \"strikethrough\",\n \"visible\",\n] as const\n\nexport const foregroundColorNames = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"gray\",\n \"grey\",\n \"blackBright\",\n \"redBright\",\n \"greenBright\",\n \"yellowBright\",\n \"blueBright\",\n \"magentaBright\",\n \"cyanBright\",\n \"whiteBright\",\n] as const\n\nexport const backgroundColorNames = [\n \"bgBlack\",\n \"bgRed\",\n \"bgGreen\",\n \"bgYellow\",\n \"bgBlue\",\n \"bgMagenta\",\n \"bgCyan\",\n \"bgWhite\",\n \"bgGray\",\n \"bgGrey\",\n \"bgBlackBright\",\n \"bgRedBright\",\n \"bgGreenBright\",\n \"bgYellowBright\",\n \"bgBlueBright\",\n \"bgMagentaBright\",\n \"bgCyanBright\",\n \"bgWhiteBright\",\n] as const\n\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames] as const\n\n// Re-export detection utilities that chalk users often need.\n// Post H6 (km-silvery.plateau-delete-legacy-shims): `detectColor` is gone —\n// chalk users reach for `createTerminalProfile` instead (it's a one-shot\n// call that returns a full TerminalProfile, of which `colorLevel` is one\n// field).\nexport { createTerminalProfile, toChalkLevel, fromChalkLevel }\nexport type { ColorLevel, ChalkLevel }\n","/**\n * CLI Spinner - Animated indeterminate progress indicator\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SpinnerOptions, SpinnerStyle } from \"../types.js\"\nimport { CURSOR_HIDE, CURSOR_SHOW, CURSOR_TO_START, CLEAR_LINE_END, write, isTTY } from \"./ansi\"\n\n/** Spinner animation frames by style */\nexport const SPINNER_FRAMES: Record<SpinnerStyle, string[]> = {\n dots: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n line: [\"-\", \"\\\\\", \"|\", \"/\"],\n arc: [\"◜\", \"◠\", \"◝\", \"◞\", \"◡\", \"◟\"],\n bounce: [\"⠁\", \"⠂\", \"⠄\", \"⠂\"],\n pulse: [\"█\", \"▓\", \"▒\", \"░\", \"▒\", \"▓\"],\n}\n\n/** Default intervals for each style (ms) */\nexport const SPINNER_INTERVALS: Record<SpinnerStyle, number> = {\n dots: 80,\n line: 120,\n arc: 100,\n bounce: 120,\n pulse: 100,\n}\n\n/**\n * Spinner class for CLI progress indication\n *\n * @example\n * ```ts\n * const spinner = new Spinner(\"Loading...\");\n * spinner.start();\n * await doWork();\n * spinner.succeed(\"Done!\");\n * ```\n */\nexport class Spinner {\n private text: string\n private style: SpinnerStyle\n private color: string\n private stream: NodeJS.WriteStream\n private hideCursor: boolean\n private interval: number\n\n private frameIndex = 0\n private timer: ReturnType<typeof setInterval> | null = null\n private isSpinning = false\n\n constructor(textOrOptions?: string | SpinnerOptions) {\n const options: SpinnerOptions =\n typeof textOrOptions === \"string\" ? { text: textOrOptions } : (textOrOptions ?? {})\n\n this.text = options.text ?? \"\"\n this.style = options.style ?? \"dots\"\n this.color = options.color ?? \"cyan\"\n this.stream = options.stream ?? process.stdout\n this.hideCursor = options.hideCursor ?? true\n this.interval = options.interval ?? SPINNER_INTERVALS[this.style]\n }\n\n /** Get current spinner text */\n get currentText(): string {\n return this.text\n }\n\n /** Set spinner text (updates immediately if spinning) */\n set currentText(value: string) {\n this.text = value\n if (this.isSpinning) {\n this.render()\n }\n }\n\n /** Check if spinner is currently active */\n get spinning(): boolean {\n return this.isSpinning\n }\n\n /**\n * Start the spinner animation\n */\n start(text?: string): this {\n if (text !== undefined) {\n this.text = text\n }\n\n if (this.isSpinning) {\n return this\n }\n\n this.isSpinning = true\n this.frameIndex = 0\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n this.timer = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES[this.style].length\n this.render()\n }, this.interval)\n\n return this\n }\n\n /**\n * Stop the spinner\n */\n stop(): this {\n if (!this.isSpinning) {\n return this\n }\n\n this.isSpinning = false\n\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n\n this.clear()\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /**\n * Stop with success message (green checkmark)\n */\n succeed(text?: string): this {\n return this.stopWithSymbol(chalk.green(\"✔\"), text ?? this.text)\n }\n\n /**\n * Stop with failure message (red X)\n */\n fail(text?: string): this {\n return this.stopWithSymbol(chalk.red(\"✖\"), text ?? this.text)\n }\n\n /**\n * Stop with warning message (yellow warning)\n */\n warn(text?: string): this {\n return this.stopWithSymbol(chalk.yellow(\"⚠\"), text ?? this.text)\n }\n\n /**\n * Stop with info message (blue info)\n */\n info(text?: string): this {\n return this.stopWithSymbol(chalk.blue(\"ℹ\"), text ?? this.text)\n }\n\n /**\n * Clear the spinner line\n */\n clear(): this {\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${CLEAR_LINE_END}`, this.stream)\n }\n return this\n }\n\n private render(): void {\n const frame = SPINNER_FRAMES[this.style][this.frameIndex]\n const colorFn = (chalk as unknown as Record<string, (s: string) => string>)[this.color]\n const coloredFrame = colorFn ? colorFn(frame!) : frame!\n const output = this.text ? `${coloredFrame} ${this.text}` : coloredFrame\n\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${output}${CLEAR_LINE_END}`, this.stream)\n }\n }\n\n private stopWithSymbol(symbol: string, text: string): this {\n this.stop()\n write(`${symbol} ${text}\\n`, this.stream)\n return this\n }\n\n /**\n * Dispose the spinner (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n\n /**\n * Static helper to quickly start a spinner\n * Returns a stop function\n *\n * @example\n * ```ts\n * const stop = Spinner.start(\"Loading...\");\n * await doWork();\n * stop();\n * ```\n */\n static start(textOrOptions?: string | SpinnerOptions): () => void {\n const spinner = new Spinner(textOrOptions)\n spinner.start()\n return () => spinner.stop()\n }\n}\n\n/**\n * Callable spinner interface - call with text to show/update\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * spinner(\"Loading...\"); // Shows spinner with text\n * spinner(\"Still loading...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport interface CallableSpinner extends Disposable {\n /** Call with text to show/update the spinner */\n (text: string): void\n /** Stop the spinner */\n stop(): void\n /** Stop with success message (green checkmark) */\n succeed(text?: string): void\n /** Stop with failure message (red X) */\n fail(text?: string): void\n /** Stop with warning message (yellow warning) */\n warn(text?: string): void\n /** Stop with info message (blue info) */\n info(text?: string): void\n}\n\n/**\n * Create a callable, disposable spinner\n *\n * The spinner is lazy - it won't show anything until you call it with text.\n * Use with `using` for automatic cleanup:\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * // Nothing visible yet\n *\n * spinner(\"Loading repo...\"); // Now shows spinner\n * spinner(\"Applying events...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport function createSpinner(options?: SpinnerOptions): CallableSpinner {\n const spinner = new Spinner({ ...options, text: \"\" })\n\n const callable = ((text: string) => {\n // Always restart if not spinning (handles initial call and after succeed/fail/etc)\n if (!spinner.spinning) {\n spinner.start(text)\n } else {\n spinner.currentText = text\n }\n }) as CallableSpinner\n\n callable.stop = () => spinner.stop()\n callable.succeed = (text) => spinner.succeed(text)\n callable.fail = (text) => spinner.fail(text)\n callable.warn = (text) => spinner.warn(text)\n callable.info = (text) => spinner.info(text)\n callable[Symbol.dispose] = () => spinner.stop()\n\n return callable\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { c as SpinnerOptions, u as SpinnerStyle } from "./types-Bx-XZNbE.mjs";
1
+ import { c as SpinnerOptions, u as SpinnerStyle } from "./types-D_E0FbqA.mjs";
2
2
 
3
3
  //#region packages/ag-react/src/ui/cli/spinner.d.ts
4
4
  /** Spinner animation frames by style */
@@ -124,4 +124,4 @@ interface CallableSpinner extends Disposable {
124
124
  declare function createSpinner(options?: SpinnerOptions): CallableSpinner;
125
125
  //#endregion
126
126
  export { createSpinner as i, SPINNER_FRAMES as n, Spinner as r, CallableSpinner as t };
127
- //# sourceMappingURL=spinner-CLgzJ_QF.d.mts.map
127
+ //# sourceMappingURL=spinner-DN10UfF0.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-CLgzJ_QF.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/spinner.ts"],"mappings":";;;;cASa,cAAA,EAAgB,MAAA,CAAO,YAAA;AA4BpC;;;;;;;;;;;AAAA,cAAa,OAAA;EAAA,QACH,IAAA;EAAA,QACA,KAAA;EAAA,QACA,KAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,QAAA;EAAA,QAEA,UAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;cAEI,aAAA,YAAyB,cAAA;EAkBrB;EAAA,IALZ,WAAA,CAAA;EAoBJ;EAAA,IAfI,WAAA,CAAY,KAAA;EA2ChB;EAAA,IAnCI,QAAA,CAAA;EA2DI;;;EApDR,KAAA,CAAM,IAAA;EAkED;;;EAtCL,IAAA,CAAA;EA2DQ;;;EAnCR,OAAA,CAAQ,IAAA;EAsED;;;EA/DP,IAAA,CAAK,IAAA;EA+D+C;AAmBtD;;EA3EE,IAAA,CAAK,IAAA;EA2E4C;;;EApEjD,IAAA,CAAK,IAAA;EA0EL;;;EAnEA,KAAA,CAAA;EAAA,QAOQ,MAAA;EAAA,QAWA,cAAA;EAuDR;;;EAAA,CA9CC,MAAA,CAAO,OAAA;EAkEM;;;;;;;;;;;EAAA,OAnDP,KAAA,CAAM,aAAA,YAAyB,cAAA;AAAA;;;;;;;;;;;;;UAmBvB,eAAA,SAAwB,UAAA;;GAEtC,IAAA;;EAED,IAAA;;EAEA,OAAA,CAAQ,IAAA;;EAER,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;AAAA;;;;;;;;;;;;;;;;;;iBAoBS,aAAA,CAAc,OAAA,GAAU,cAAA,GAAiB,eAAA"}
1
+ {"version":3,"file":"spinner-DN10UfF0.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/spinner.ts"],"mappings":";;;;cASa,cAAA,EAAgB,MAAA,CAAO,YAAA;AA4BpC;;;;;;;;;;;AAAA,cAAa,OAAA;EAAA,QACH,IAAA;EAAA,QACA,KAAA;EAAA,QACA,KAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,QAAA;EAAA,QAEA,UAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;cAEI,aAAA,YAAyB,cAAA;EAkBrB;EAAA,IALZ,WAAA,CAAA;EAoBJ;EAAA,IAfI,WAAA,CAAY,KAAA;EA2ChB;EAAA,IAnCI,QAAA,CAAA;EA2DI;;;EApDR,KAAA,CAAM,IAAA;EAkED;;;EAtCL,IAAA,CAAA;EA2DQ;;;EAnCR,OAAA,CAAQ,IAAA;EAsED;;;EA/DP,IAAA,CAAK,IAAA;EA+D+C;AAmBtD;;EA3EE,IAAA,CAAK,IAAA;EA2E4C;;;EApEjD,IAAA,CAAK,IAAA;EA0EL;;;EAnEA,KAAA,CAAA;EAAA,QAOQ,MAAA;EAAA,QAWA,cAAA;EAuDR;;;EAAA,CA9CC,MAAA,CAAO,OAAA;EAkEM;;;;;;;;;;;EAAA,OAnDP,KAAA,CAAM,aAAA,YAAyB,cAAA;AAAA;;;;;;;;;;;;;UAmBvB,eAAA,SAAwB,UAAA;;GAEtC,IAAA;;EAED,IAAA;;EAEA,OAAA,CAAQ,IAAA;;EAER,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;AAAA;;;;;;;;;;;;;;;;;;iBAoBS,aAAA,CAAc,OAAA,GAAU,cAAA,GAAiB,eAAA"}
@@ -1,4 +1,4 @@
1
- import { blend, brighten, checkContrast, colorDistance, complement, contrastFg, darken, deltaE, ensureContrast, hexToOklch, hexToRgb as hexToRgb$1, oklchToHex, relativeLuminance } from "@silvery/color";
1
+ import { blend, brighten, checkContrast, colorDistance, complement, contrastFg, darken, deltaE, ensureContrast, hexToOklch, hexToRgb as hexToRgb$1, mixSrgb, oklchToHex, relativeLuminance } from "@silvery/color";
2
2
  import "string-width";
3
3
  //#region packages/ansi/src/constants.ts
4
4
  /**
@@ -12,19 +12,12 @@ import "string-width";
12
12
  * Uses colon-separated parameters (ISO 8613-6): \x1b[4:Nm
13
13
  */
14
14
  const UNDERLINE_CODES = {
15
- /** No underline */
16
15
  none: "\x1B[4:0m",
17
- /** Standard single underline */
18
16
  single: "\x1B[4:1m",
19
- /** Double underline (two parallel lines) */
20
17
  double: "\x1B[4:2m",
21
- /** Curly/wavy underline (spell check style) */
22
18
  curly: "\x1B[4:3m",
23
- /** Dotted underline */
24
19
  dotted: "\x1B[4:4m",
25
- /** Dashed underline */
26
20
  dashed: "\x1B[4:5m",
27
- /** Reset extended underline (same as none) */
28
21
  reset: "\x1B[4:0m"
29
22
  };
30
23
  /** Standard underline on (SGR 4) - works on all terminals */
@@ -253,6 +246,30 @@ const CONTRAST_PAIRS = [
253
246
  bg: "bg-selected",
254
247
  min: AA_RATIO
255
248
  },
249
+ {
250
+ rule: "contrast:fg-on-inverse/bg-inverse",
251
+ fg: "fg-on-inverse",
252
+ bg: "bg-inverse",
253
+ min: AA_RATIO
254
+ },
255
+ {
256
+ rule: "contrast:fg-on-inverse/bg-inverse-hover",
257
+ fg: "fg-on-inverse",
258
+ bg: "bg-inverse-hover",
259
+ min: AA_RATIO
260
+ },
261
+ {
262
+ rule: "contrast:fg-on-inverse-muted/bg-inverse",
263
+ fg: "fg-on-inverse-muted",
264
+ bg: "bg-inverse",
265
+ min: 3
266
+ },
267
+ {
268
+ rule: "contrast:fg-on-inverse-muted/bg-inverse-hover",
269
+ fg: "fg-on-inverse-muted",
270
+ bg: "bg-inverse-hover",
271
+ min: 3
272
+ },
256
273
  {
257
274
  rule: "contrast:fg-cursor/bg-cursor",
258
275
  fg: "fg-cursor",
@@ -807,6 +824,35 @@ function guardTarget(nestedPath, flatPath, rule, inputs, value, against, target,
807
824
  });
808
825
  return finalValue;
809
826
  }
827
+ /** Whether a foreground clears `target` against every supplied surface. */
828
+ function clearsEverySurface(value, surfaces, target) {
829
+ return surfaces.every((surface) => checkAA("contrast-bounded mix", value, surface, target) === null);
830
+ }
831
+ /**
832
+ * Preserve an alpha-like sRGB mix as far as its readability budget allows.
833
+ *
834
+ * `maxMix` is the desired amount of `toward` color. When that exact mix falls
835
+ * below the contrast floor on either surface, binary-search back toward the
836
+ * readable foreground and return the most-deemphasized passing hex. This keeps
837
+ * muted text on the same color line instead of allowing a generic contrast
838
+ * repair to flip it to the opposite light/dark pole.
839
+ */
840
+ function mixSrgbWithContrastFloor(foreground, toward, maxMix, surfaces, target) {
841
+ const desired = mixSrgb(foreground, toward, maxMix);
842
+ if (clearsEverySurface(desired, surfaces, target)) return desired;
843
+ let passingMix = 0;
844
+ let failingMix = maxMix;
845
+ let best = foreground;
846
+ for (let step = 0; step < 16; step++) {
847
+ const candidateMix = (passingMix + failingMix) / 2;
848
+ const candidate = mixSrgb(foreground, toward, candidateMix);
849
+ if (clearsEverySurface(candidate, surfaces, target)) {
850
+ passingMix = candidateMix;
851
+ best = candidate;
852
+ } else failingMix = candidateMix;
853
+ }
854
+ return best;
855
+ }
810
856
  /**
811
857
  * Derive a Theme's nested roles from a ColorScheme. Guardrails applied.
812
858
  */
@@ -856,6 +902,7 @@ function deriveRoles(scheme, opts) {
856
902
  fg: guard("muted.fg", "fg-muted", "blend(fg, bg, 0.4)", [fg, bg], blend(fg, bg, .4), mutedBg, 3),
857
903
  bg: mutedBg
858
904
  };
905
+ const faint = { fg: guard("faint.fg", "fg-faint", "blend(fg, bg, 0.55)", [fg, bg], blend(fg, bg, .55), mutedBg, 1.5) };
859
906
  const fgForSurfaceLift = ensureContrast(fg, blend(bg, fg, .08), WCAG_AA);
860
907
  const surfaceDefault = guard("surface.default", "bg-surface-default", "scheme.background", [bg], bg);
861
908
  const surface = {
@@ -885,9 +932,19 @@ function deriveRoles(scheme, opts) {
885
932
  hover: { bg: guard("selected.hover.bg", "bg-selected-hover", `OKLCH ${shiftLabel(selectedBg)} ${selectedDeltaH.hover}L on selected.bg`, [selectedBg], shiftL(selectedBg, selectedDeltaH.hover)) }
886
933
  };
887
934
  const inverseBg = guard("inverse.bg", "bg-inverse", "blend(fg, bg, 0.1)", [fg, bg], blend(fg, bg, .1));
935
+ const inverseFgOn = guard("inverse.fgOn", "fg-on-inverse", "contrast-pick(scheme.fg/bg/BW)", [inverseBg], pickFgOn(inverseBg, scheme), inverseBg);
936
+ const inverseHoverBg = guard("inverse.hover.bg", "bg-inverse-hover", "mixSrgb(inverse.bg, inverse.fgOn, 0.1)", [inverseBg, inverseFgOn], mixSrgb(inverseBg, inverseFgOn, .1), inverseFgOn);
937
+ const inverseMutedCandidate = mixSrgbWithContrastFloor(inverseFgOn, inverseBg, .35, [inverseBg, inverseHoverBg], 3);
938
+ const inverseMutedFgOn = guard("inverse.muted.fgOn", "fg-on-inverse-muted", "mixSrgb(inverse.fgOn, inverse.bg, ≤0.35), bounded to ≥3:1 on inverse surfaces", [
939
+ inverseFgOn,
940
+ inverseBg,
941
+ inverseHoverBg
942
+ ], inverseMutedCandidate, inverseBg, 3);
888
943
  const inverse = {
889
944
  bg: inverseBg,
890
- fgOn: guard("inverse.fgOn", "fg-on-inverse", "contrast-pick(scheme.fg/bg/BW)", [inverseBg], pickFgOn(inverseBg, scheme), inverseBg)
945
+ fgOn: inverseFgOn,
946
+ hover: { bg: inverseHoverBg },
947
+ muted: { fgOn: inverseMutedFgOn }
891
948
  };
892
949
  const link = { fg: guard("link.fg", "fg-link", mode === "dark" ? "scheme.brightBlue" : "scheme.blue", [mode === "dark" ? scheme.brightBlue : scheme.blue], mode === "dark" ? scheme.brightBlue : scheme.blue, bg) };
893
950
  const fgDisabledRaw = blend(surfaceDefault, fg, .38);
@@ -901,6 +958,7 @@ function deriveRoles(scheme, opts) {
901
958
  warning,
902
959
  error,
903
960
  muted,
961
+ faint,
904
962
  surface,
905
963
  border,
906
964
  cursor,
@@ -1215,6 +1273,8 @@ function inlineSterlingTokens(theme, scheme) {
1215
1273
  setIfAbsent("fg-muted", m.fg);
1216
1274
  setIfAbsent("bg-muted", m.bg);
1217
1275
  }
1276
+ const ft = roles.faint;
1277
+ if (ft) setIfAbsent("fg-faint", ft.fg);
1218
1278
  const sel = roles.selected;
1219
1279
  if (sel) {
1220
1280
  setIfAbsent("bg-selected", sel.bg);
@@ -1225,6 +1285,8 @@ function inlineSterlingTokens(theme, scheme) {
1225
1285
  if (inv) {
1226
1286
  setIfAbsent("bg-inverse", inv.bg);
1227
1287
  setIfAbsent("fg-on-inverse", inv.fgOn);
1288
+ setIfAbsent("bg-inverse-hover", inv.hover.bg);
1289
+ setIfAbsent("fg-on-inverse-muted", inv.muted.fgOn);
1228
1290
  }
1229
1291
  const lnk = roles.link;
1230
1292
  if (lnk) setIfAbsent("fg-link", lnk.fg);
@@ -2532,8 +2594,8 @@ function pickColorLevelWalk(obj, tier) {
2532
2594
  * Build a {@link TerminalProfile} from the current environment.
2533
2595
  *
2534
2596
  * Priority for the final `colorLevel` (highest wins):
2535
- * 1. `NO_COLOR` env var → `"mono"`
2536
- * 2. `FORCE_COLOR` env var → `0/false → mono, 1 → ansi16, 2 → 256, 3 → truecolor`
2597
+ * 1. `FORCE_COLOR` env var → `0/false → mono, 1 → ansi16, 2 → 256, 3 → truecolor`
2598
+ * 2. `NO_COLOR` env var → `"mono"`
2537
2599
  * 3. `options.colorLevel` (caller-supplied explicit tier)
2538
2600
  * 4. `options.caps.colorLevel` (base caps' pre-detected tier)
2539
2601
  * 5. Auto-detected tier from env (TERM, COLORTERM, TERM_PROGRAM, …)
@@ -2556,7 +2618,7 @@ function pickColorLevelWalk(obj, tier) {
2556
2618
  * const profile = createTerminalProfile()
2557
2619
  * console.log(profile.colorLevel) // "truecolor" on Ghostty
2558
2620
  *
2559
- * // Force a tier (still honors NO_COLOR / FORCE_COLOR env precedence)
2621
+ * // Force a tier (still honors FORCE_COLOR / NO_COLOR env precedence)
2560
2622
  * const forced = createTerminalProfile({ colorLevel: "256" })
2561
2623
  *
2562
2624
  * // Term path — base caps already detected, just resolve color tier.
@@ -2705,15 +2767,8 @@ async function probeTerminalProfile(options = {}) {
2705
2767
  * `process.env` twice.
2706
2768
  */
2707
2769
  function detectColorFromEnv(env, stdout) {
2708
- if (env.NO_COLOR !== void 0) return "mono";
2709
- const forceColor = env.FORCE_COLOR;
2710
- if (forceColor !== void 0) {
2711
- if (forceColor === "0" || forceColor === "false") return "mono";
2712
- if (forceColor === "1") return "ansi16";
2713
- if (forceColor === "2") return "256";
2714
- if (forceColor === "3") return "truecolor";
2715
- return "ansi16";
2716
- }
2770
+ const envTier = envColorTier(env);
2771
+ if (envTier !== void 0) return envTier;
2717
2772
  if (!stdout.isTTY) return "mono";
2718
2773
  if (env.TERM === "dumb") return "mono";
2719
2774
  const colorTerm = env.COLORTERM;
@@ -2736,7 +2791,6 @@ function detectColorFromEnv(env, stdout) {
2736
2791
  * env always beats caller-supplied overrides.
2737
2792
  */
2738
2793
  function envColorTier(env) {
2739
- if (env.NO_COLOR !== void 0) return "mono";
2740
2794
  const force = env.FORCE_COLOR;
2741
2795
  if (force !== void 0) {
2742
2796
  if (force === "0" || force === "false") return "mono";
@@ -2745,6 +2799,7 @@ function envColorTier(env) {
2745
2799
  if (force === "3") return "truecolor";
2746
2800
  return "ansi16";
2747
2801
  }
2802
+ if (env.NO_COLOR !== void 0) return "mono";
2748
2803
  }
2749
2804
  /**
2750
2805
  * Deterministic env-based detection of the full two-layer profile
@@ -2760,7 +2815,7 @@ function detectTerminalProfileFromEnv(env, stdout) {
2760
2815
  const TERM = env.TERM ?? "";
2761
2816
  const noColor = env.NO_COLOR !== void 0;
2762
2817
  const isAppleTerminal = programLower === "apple_terminal";
2763
- const colorLevel = noColor ? "mono" : detectColorFromEnv(env, stdout);
2818
+ const colorLevel = detectColorFromEnv(env, stdout);
2764
2819
  const isKitty = TERM === "xterm-kitty";
2765
2820
  const isITerm = programLower === "iterm.app";
2766
2821
  const isGhostty = programLower === "ghostty";
@@ -2820,7 +2875,7 @@ function detectTerminalProfileFromEnv(env, stdout) {
2820
2875
  sixel: !isDumb && (isFoot || isWezTerm),
2821
2876
  osc52: isModern || !isDumb && isAlacritty,
2822
2877
  hyperlinks: isModern || !isDumb && isAlacritty,
2823
- notifications: isITerm || isKitty,
2878
+ notifications: isDumb ? false : isKitty ? "osc99" : isITerm ? "osc9" : isGhostty || isWezTerm || isFoot ? "osc777" : false,
2824
2879
  syncOutput: isModern || !isDumb && isAlacritty,
2825
2880
  maybeDarkBackground,
2826
2881
  maybeNerdFont,
@@ -2990,6 +3045,7 @@ function warnOnce(id, emit) {
2990
3045
  * | `accent.fg` | `fg-accent` |
2991
3046
  * | `accent.bg` | `bg-accent` |
2992
3047
  * | `accent.fgOn` | `fg-on-accent` |
3048
+ * | `inverse.muted.fgOn` | `fg-on-inverse-muted` |
2993
3049
  * | `accent.border` | `border-accent` |
2994
3050
  * | `accent.hover.bg` | `bg-accent-hover` |
2995
3051
  * | `accent.active.fg` | `fg-accent-active` |
@@ -3012,7 +3068,10 @@ const defaultFlattenRule = (path) => {
3012
3068
  const role = path[0];
3013
3069
  const last = path[path.length - 1];
3014
3070
  const mid = path.slice(1, -1);
3015
- if (last === "fgOn") return `fg-on-${role}`;
3071
+ if (last === "fgOn") {
3072
+ const state = mid.length > 0 ? mid.join("-") : void 0;
3073
+ return state ? `fg-on-${role}-${state}` : `fg-on-${role}`;
3074
+ }
3016
3075
  if (last === "fg" || last === "bg" || last === "border") {
3017
3076
  const state = mid.length > 0 ? mid.join("-") : void 0;
3018
3077
  return state ? `${last}-${role}-${state}` : `${last}-${role}`;
@@ -3825,6 +3884,8 @@ const DEFAULT_MONO_ATTRS = {
3825
3884
  "bg-selected-hover": ["inverse"],
3826
3885
  "bg-inverse": ["inverse"],
3827
3886
  "fg-on-inverse": [],
3887
+ "bg-inverse-hover": ["inverse"],
3888
+ "fg-on-inverse-muted": ["dim"],
3828
3889
  "fg-link": ["underline"]
3829
3890
  };
3830
3891
  /**
@@ -4124,6 +4185,107 @@ async function detectSchemeTheme(opts = {}) {
4124
4185
  return theme;
4125
4186
  }
4126
4187
  //#endregion
4188
+ //#region packages/ansi/src/sterling/flat-tokens.ts
4189
+ const STERLING_FLAT_TOKENS = [
4190
+ "bg-surface-default",
4191
+ "bg-surface-subtle",
4192
+ "bg-surface-raised",
4193
+ "bg-surface-overlay",
4194
+ "bg-surface-hover",
4195
+ "border-default",
4196
+ "border-focus",
4197
+ "border-muted",
4198
+ "fg-cursor",
4199
+ "bg-cursor",
4200
+ "fg-muted",
4201
+ "bg-muted",
4202
+ "fg-faint",
4203
+ "fg-accent",
4204
+ "bg-accent",
4205
+ "fg-on-accent",
4206
+ "fg-accent-hover",
4207
+ "bg-accent-hover",
4208
+ "fg-accent-active",
4209
+ "bg-accent-active",
4210
+ "border-accent",
4211
+ "fg-info",
4212
+ "bg-info",
4213
+ "fg-on-info",
4214
+ "bg-info-hover",
4215
+ "bg-info-active",
4216
+ "fg-success",
4217
+ "bg-success",
4218
+ "fg-on-success",
4219
+ "bg-success-hover",
4220
+ "bg-success-active",
4221
+ "fg-warning",
4222
+ "bg-warning",
4223
+ "fg-on-warning",
4224
+ "bg-warning-hover",
4225
+ "bg-warning-active",
4226
+ "fg-error",
4227
+ "bg-error",
4228
+ "fg-on-error",
4229
+ "bg-error-hover",
4230
+ "bg-error-active",
4231
+ "bg-selected",
4232
+ "fg-on-selected",
4233
+ "bg-selected-hover",
4234
+ "bg-inverse",
4235
+ "fg-on-inverse",
4236
+ "bg-inverse-hover",
4237
+ "fg-on-inverse-muted",
4238
+ "fg-link",
4239
+ "fg-disabled",
4240
+ "bg-disabled",
4241
+ "border-disabled",
4242
+ "bg-backdrop",
4243
+ "fg-default",
4244
+ "bg-default"
4245
+ ];
4246
+ new Set([
4247
+ "bg",
4248
+ "fg",
4249
+ "muted",
4250
+ "mutedbg",
4251
+ "surface",
4252
+ "surfacebg",
4253
+ "popover",
4254
+ "popoverbg",
4255
+ "cursor",
4256
+ "cursorbg",
4257
+ "primary",
4258
+ "primaryfg",
4259
+ "secondary",
4260
+ "secondaryfg",
4261
+ "accent",
4262
+ "accentfg",
4263
+ "error",
4264
+ "errorfg",
4265
+ "warning",
4266
+ "warningfg",
4267
+ "success",
4268
+ "successfg",
4269
+ "info",
4270
+ "infofg",
4271
+ "border",
4272
+ "inputborder",
4273
+ "focusborder",
4274
+ "disabledfg",
4275
+ "palette",
4276
+ "name",
4277
+ "brand",
4278
+ "brand-hover",
4279
+ "brand-active",
4280
+ "primary-hover",
4281
+ "primary-active",
4282
+ "accent-hover",
4283
+ "accent-active",
4284
+ "fg-hover",
4285
+ "fg-active",
4286
+ ...STERLING_FLAT_TOKENS
4287
+ ]);
4288
+ //#endregion
4127
4289
  //#region packages/ansi/src/theme/tokens.ts
4128
4290
  /**
4129
4291
  * Runtime constant — the 12 built-in variant names shipped by silvery.
@@ -4240,62 +4402,6 @@ function generateTheme(primary, dark) {
4240
4402
  };
4241
4403
  }
4242
4404
  //#endregion
4243
- //#region packages/ansi/src/sterling/flat-tokens.ts
4244
- const STERLING_FLAT_TOKENS = [
4245
- "bg-surface-default",
4246
- "bg-surface-subtle",
4247
- "bg-surface-raised",
4248
- "bg-surface-overlay",
4249
- "bg-surface-hover",
4250
- "border-default",
4251
- "border-focus",
4252
- "border-muted",
4253
- "fg-cursor",
4254
- "bg-cursor",
4255
- "fg-muted",
4256
- "bg-muted",
4257
- "fg-accent",
4258
- "bg-accent",
4259
- "fg-on-accent",
4260
- "fg-accent-hover",
4261
- "bg-accent-hover",
4262
- "fg-accent-active",
4263
- "bg-accent-active",
4264
- "border-accent",
4265
- "fg-info",
4266
- "bg-info",
4267
- "fg-on-info",
4268
- "bg-info-hover",
4269
- "bg-info-active",
4270
- "fg-success",
4271
- "bg-success",
4272
- "fg-on-success",
4273
- "bg-success-hover",
4274
- "bg-success-active",
4275
- "fg-warning",
4276
- "bg-warning",
4277
- "fg-on-warning",
4278
- "bg-warning-hover",
4279
- "bg-warning-active",
4280
- "fg-error",
4281
- "bg-error",
4282
- "fg-on-error",
4283
- "bg-error-hover",
4284
- "bg-error-active",
4285
- "bg-selected",
4286
- "fg-on-selected",
4287
- "bg-selected-hover",
4288
- "bg-inverse",
4289
- "fg-on-inverse",
4290
- "fg-link",
4291
- "fg-disabled",
4292
- "bg-disabled",
4293
- "border-disabled",
4294
- "bg-backdrop",
4295
- "fg-default",
4296
- "bg-default"
4297
- ];
4298
- //#endregion
4299
4405
  //#region packages/ansi/src/sterling/defaults.ts
4300
4406
  /**
4301
4407
  * A hand-tuned neutral dark scheme — not a copy of any catalog palette, but
@@ -4457,6 +4563,7 @@ const STERLING_SHAPE = {
4457
4563
  "warning",
4458
4564
  "error",
4459
4565
  "muted",
4566
+ "faint",
4460
4567
  "surface",
4461
4568
  "border",
4462
4569
  "cursor",
@@ -4616,6 +4723,6 @@ function seedRule(role) {
4616
4723
  }
4617
4724
  }
4618
4725
  //#endregion
4619
- export { queryMultiplePaletteColors as $, fgColorCode as A, detectColorScheme as B, enableBracketedPaste as C, defaultFlattenRule as D, bakeFlat as E, pickColorLevel as F, resetCursorColor as G, queryCursorColor as H, quantizeHex as I, setCursorColor as J, resetForegroundColor as K, detectTerminalScheme as L, detectColorFromEnv as M, probeTerminalProfile as N, warnOnce as O, ANSI16_SLOT_HEX as P, parsePaletteResponse as Q, detectTheme as R, disableMouse as S, enableMouse as T, queryForegroundColor as U, queryBackgroundColor as V, resetBackgroundColor as W, ProtocolError as X, setForegroundColor as Y, isProtocolError as Z, kittyDeleteAllScrimPlacements as _, generateTheme as a, deriveRoles as at, disableBracketedPaste as b, detectSchemeTheme as c, WCAG_AA as ct, createMixedStyle as d, deriveFields as dt, queryPaletteColor as et, createStyle as f, defaultCaps as ft, cupTo as g, buildScrimPixels as h, STERLING_FLAT_TOKENS as i, deriveTheme as it, createTerminalProfile as j, bgColorCode as k, COLOR_SCHEME_FIELDS as l, autoLift as lt, backdropPlacementId as m, defineDesignSystem as n, ansi16DarkTheme as nt, KNOWN_VARIANTS as o, deriveTheme$1 as ot, resolveThemeColor as p, setBackgroundColor as q, defaultScheme as r, ansi16LightTheme as rt, detectScheme as s, ContrastError as st, sterling as t, setPaletteColor as tt, monoAttrsForColorString as u, checkAA as ut, kittyPlaceAt as v, enableKittyKeyboard as w, disableKittyKeyboard as x, kittyUploadScrimImage as y, probeColors as z };
4726
+ export { setForegroundColor as $, fgColorCode as A, rgbToAnsi256 as B, enableBracketedPaste as C, defaultFlattenRule as D, bakeFlat as E, bgFromRgb as F, queryBackgroundColor as G, detectTheme as H, fgFromRgb as I, resetBackgroundColor as J, queryCursorColor as K, nearestAnsi16 as L, detectColorFromEnv as M, probeTerminalProfile as N, warnOnce as O, ANSI16_SLOT_HEX as P, setCursorColor as Q, pickColorLevel as R, disableMouse as S, enableMouse as T, probeColors as U, detectTerminalScheme as V, detectColorScheme as W, resetForegroundColor as X, resetCursorColor as Y, setBackgroundColor as Z, kittyDeleteAllScrimPlacements as _, KNOWN_VARIANTS as a, setPaletteColor as at, disableBracketedPaste as b, detectSchemeTheme as c, deriveTheme as ct, createMixedStyle as d, ContrastError as dt, ProtocolError as et, createStyle as f, WCAG_AA as ft, cupTo as g, defaultCaps as gt, buildScrimPixels as h, deriveFields as ht, generateTheme as i, queryPaletteColor as it, createTerminalProfile as j, bgColorCode as k, COLOR_SCHEME_FIELDS as l, deriveRoles as lt, backdropPlacementId as m, checkAA as mt, defineDesignSystem as n, parsePaletteResponse as nt, STERLING_FLAT_TOKENS as o, ansi16DarkTheme as ot, resolveThemeColor as p, autoLift as pt, queryForegroundColor as q, defaultScheme as r, queryMultiplePaletteColors as rt, detectScheme as s, ansi16LightTheme as st, sterling as t, isProtocolError as tt, monoAttrsForColorString as u, deriveTheme$1 as ut, kittyPlaceAt as v, enableKittyKeyboard as w, disableKittyKeyboard as x, kittyUploadScrimImage as y, quantizeHex as z };
4620
4727
 
4621
- //# sourceMappingURL=src-Oe6x5PrS.mjs.map
4728
+ //# sourceMappingURL=src-B8lf1kiR.mjs.map