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.
- package/dist/{Text-BRf-59j2.mjs → Text-Ci6UCSTL.mjs} +46 -46
- package/dist/Text-Ci6UCSTL.mjs.map +1 -0
- package/dist/{ag-BeFC4S2N.mjs → ag-q9lRlKlt.mjs} +42 -19
- package/dist/ag-q9lRlKlt.mjs.map +1 -0
- package/dist/{animation-N8MFybTk.mjs → animation-CZ4x2R7C.mjs} +1 -1
- package/dist/{animation-N8MFybTk.mjs.map → animation-CZ4x2R7C.mjs.map} +1 -1
- package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLmIMnop.mjs} +1 -1
- package/dist/{ansi-C6Qs1Wn2.mjs.map → ansi-CLmIMnop.mjs.map} +1 -1
- package/dist/{ansi-CBkam1ty.d.mts → ansi-zmNzgkPB.d.mts} +1 -1
- package/dist/{ansi-CBkam1ty.d.mts.map → ansi-zmNzgkPB.d.mts.map} +1 -1
- package/dist/backend-DSiSIc-h.mjs +13396 -0
- package/dist/backend-DSiSIc-h.mjs.map +1 -0
- package/dist/chain-bridge-CkYcMxlq.mjs +4149 -0
- package/dist/chain-bridge-CkYcMxlq.mjs.map +1 -0
- package/dist/{chunk-hT5z_Zn9.mjs → chunk-BEJ448es.mjs} +1 -1
- package/dist/cli-VNqUKlXw.mjs +4 -0
- package/dist/{context-BU5LkkIy.mjs → context-CEhuD1R_.mjs} +1 -1
- package/dist/{context-BU5LkkIy.mjs.map → context-CEhuD1R_.mjs.map} +1 -1
- package/dist/devtools-BF4IMumr.mjs +2 -0
- package/dist/{devtools-9zfhpFyG.mjs → devtools-td2AjFwc.mjs} +5 -4
- package/dist/{devtools-9zfhpFyG.mjs.map → devtools-td2AjFwc.mjs.map} +1 -1
- package/dist/{easing-B0oZKDki.d.mts → easing-C5MrdO7V.d.mts} +1 -1
- package/dist/{easing-B0oZKDki.d.mts.map → easing-C5MrdO7V.d.mts.map} +1 -1
- package/dist/{eta-DGOuC8yU.mjs → eta-BwYWEjfS.mjs} +1 -5
- package/dist/{eta-DGOuC8yU.mjs.map → eta-BwYWEjfS.mjs.map} +1 -1
- package/dist/{flexily-zero-adapter-D6hcFgrH.mjs → flexily-zero-adapter-DktX3HsX.mjs} +1 -1
- package/dist/{flexily-zero-adapter-CEJOcbNp.mjs → flexily-zero-adapter-VoBGHG14.mjs} +1 -1
- package/dist/{flexily-zero-adapter-CEJOcbNp.mjs.map → flexily-zero-adapter-VoBGHG14.mjs.map} +1 -1
- package/dist/hit-registry-D_nxOivS.d.mts +71 -0
- package/dist/hit-registry-D_nxOivS.d.mts.map +1 -0
- package/dist/{image-1nRyKa60.mjs → image-CIF75xMr.mjs} +24 -24
- package/dist/image-CIF75xMr.mjs.map +1 -0
- package/dist/{index-2E1jYgak.d.mts → index-377zdPLP.d.mts} +35 -12
- package/dist/index-377zdPLP.d.mts.map +1 -0
- package/dist/{index-DnuadDNL.d.mts → index-BcSr0RAQ.d.mts} +8590 -11173
- package/dist/index-BcSr0RAQ.d.mts.map +1 -0
- package/dist/{index-Dg1YaeJb.d.mts → index-DLnpxDAm.d.mts} +2 -2
- package/dist/{index-Dg1YaeJb.d.mts.map → index-DLnpxDAm.d.mts.map} +1 -1
- package/dist/{index-Bi4Jdz5g.d.mts → index-DlNmckTq.d.mts} +2 -2
- package/dist/{index-Bi4Jdz5g.d.mts.map → index-DlNmckTq.d.mts.map} +1 -1
- package/dist/index.d.mts +12 -8
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +18 -17
- package/dist/index.mjs.map +1 -1
- package/dist/{layout-engine-Ca_nbtfL.mjs → layout-engine-BgR58vL0.mjs} +3 -3
- package/dist/{layout-engine-Ca_nbtfL.mjs.map → layout-engine-BgR58vL0.mjs.map} +1 -1
- package/dist/{layout-engine-CgsoBRIn.mjs → layout-engine-DNjTha8f.mjs} +1 -1
- package/dist/{layout-signals-Dch2EiCy.mjs → layout-signals-CGYbHmxy.mjs} +2 -2
- package/dist/layout-signals-CGYbHmxy.mjs.map +1 -0
- package/dist/{bound-term-BumfuXXW.d.mts → mouse-events-B2z5tbsL.d.mts} +540 -401
- package/dist/mouse-events-B2z5tbsL.d.mts.map +1 -0
- package/dist/{mouse-events-hnbJZRwK.mjs → mouse-events-WQ2h-uqG.mjs} +14 -6
- package/dist/mouse-events-WQ2h-uqG.mjs.map +1 -0
- package/dist/{multi-progress-Bg4ngK80.d.mts → multi-progress-BaEFfHKP.d.mts} +2 -2
- package/dist/{multi-progress-Bg4ngK80.d.mts.map → multi-progress-BaEFfHKP.d.mts.map} +1 -1
- package/dist/{multi-progress-CaXTuL9G.mjs → multi-progress-zCWHEm9P.mjs} +3 -3
- package/dist/{multi-progress-CaXTuL9G.mjs.map → multi-progress-zCWHEm9P.mjs.map} +1 -1
- package/dist/{node-BiFu8I9Y.mjs → node-CJ3J_rW-.mjs} +4 -4
- package/dist/node-CJ3J_rW-.mjs.map +1 -0
- package/dist/{progress-B_UPy6zk.mjs → progress-6vJ7nxUg.mjs} +4 -4
- package/dist/{progress-B_UPy6zk.mjs.map → progress-6vJ7nxUg.mjs.map} +1 -1
- package/dist/{progress-bar-DmIMPdL0.mjs → progress-bar-BlFNsZL8.mjs} +4 -4
- package/dist/{progress-bar-DmIMPdL0.mjs.map → progress-bar-BlFNsZL8.mjs.map} +1 -1
- package/dist/{reconciler-NBDSEm8k.mjs → reconciler--_-biN23.mjs} +111 -150
- package/dist/reconciler--_-biN23.mjs.map +1 -0
- package/dist/{render-string-BntLj7Xq.mjs → render-string-DaghHpLN.mjs} +1 -1
- package/dist/{render-string-B4h4SmK7.mjs → render-string-DtHZP0cU.mjs} +15 -11
- package/dist/render-string-DtHZP0cU.mjs.map +1 -0
- package/dist/runtime.d.mts +3 -2
- package/dist/runtime.mjs +3 -2
- package/dist/{schemes-DYt2ushj.mjs → schemes-DWQPxXAi.mjs} +2 -2
- package/dist/{schemes-DYt2ushj.mjs.map → schemes-DWQPxXAi.mjs.map} +1 -1
- package/dist/{spinner-Py8_-hn9.mjs → spinner-B50hILqx.mjs} +3 -3
- package/dist/{spinner-Py8_-hn9.mjs.map → spinner-B50hILqx.mjs.map} +1 -1
- package/dist/{spinner-CLgzJ_QF.d.mts → spinner-DN10UfF0.d.mts} +2 -2
- package/dist/{spinner-CLgzJ_QF.d.mts.map → spinner-DN10UfF0.d.mts.map} +1 -1
- package/dist/{src-Oe6x5PrS.mjs → src-B8lf1kiR.mjs} +190 -83
- package/dist/src-B8lf1kiR.mjs.map +1 -0
- package/dist/{src-Dvq-s8iD.mjs → src-BOLdi3WG.mjs} +3 -3
- package/dist/{src-Dvq-s8iD.mjs.map → src-BOLdi3WG.mjs.map} +1 -1
- package/dist/{src-B9S_woYc.mjs → src-BXeTHHlL.mjs} +20289 -23262
- package/dist/src-BXeTHHlL.mjs.map +1 -0
- package/dist/{src-WeA_J4BV.mjs → src-BqeBFB3X.mjs} +90 -47
- package/dist/src-BqeBFB3X.mjs.map +1 -0
- package/dist/{src-CbhWmUnF.mjs → src-DbqcSrhy.mjs} +1400 -1427
- package/dist/src-DbqcSrhy.mjs.map +1 -0
- package/dist/{steps-DYrzCUCK.d.mts → steps-B2kBmFpb.d.mts} +1 -1
- package/dist/{steps-DYrzCUCK.d.mts.map → steps-B2kBmFpb.d.mts.map} +1 -1
- package/dist/{svg-DhxQkz-O.mjs → svg-NmV9dgB9.mjs} +1 -1
- package/dist/{svg-DhxQkz-O.mjs.map → svg-NmV9dgB9.mjs.map} +1 -1
- package/dist/{svg-Hk7lIl4F.d.mts → svg-VUr78l5d.d.mts} +1 -1
- package/dist/{svg-Hk7lIl4F.d.mts.map → svg-VUr78l5d.d.mts.map} +1 -1
- package/dist/term.d.mts +2 -2
- package/dist/term.mjs +3 -3
- package/dist/test.d.mts +673 -0
- package/dist/test.d.mts.map +1 -0
- package/dist/test.mjs +2829 -0
- package/dist/test.mjs.map +1 -0
- package/dist/theme.d.mts +2 -2
- package/dist/theme.d.mts.map +1 -1
- package/dist/theme.mjs +3 -3
- package/dist/{types-Bx-XZNbE.d.mts → types-D_E0FbqA.d.mts} +1 -1
- package/dist/{types-Bx-XZNbE.d.mts.map → types-D_E0FbqA.d.mts.map} +1 -1
- package/dist/ui/animation.d.mts +2 -2
- package/dist/ui/animation.mjs +1 -1
- package/dist/ui/ansi.d.mts +1 -1
- package/dist/ui/ansi.mjs +1 -1
- package/dist/ui/cli.d.mts +3 -3
- package/dist/ui/cli.mjs +5 -5
- package/dist/ui/image.d.mts +1 -1
- package/dist/ui/image.mjs +1 -1
- package/dist/ui/progress.d.mts +4 -4
- package/dist/ui/progress.mjs +4 -4
- package/dist/ui/react.d.mts +1 -1
- package/dist/ui/react.mjs +2 -2
- package/dist/ui/react.mjs.map +1 -1
- package/dist/ui/recording-chrome-react.d.mts +1 -1
- package/dist/ui/recording-chrome-react.mjs +2 -2
- package/dist/ui/recording-chrome.d.mts +1 -1
- package/dist/ui/recording-chrome.mjs +1 -1
- package/dist/ui/utils.mjs +1 -1
- package/dist/ui/wrappers.d.mts +2 -2
- package/dist/ui/wrappers.mjs +1 -1
- package/dist/ui.d.mts +6 -6
- package/dist/ui.mjs +7 -7
- package/dist/{ansi-OYRLxxZQ.mjs → unicode-CxyxVGmB.mjs} +7317 -6909
- package/dist/unicode-CxyxVGmB.mjs.map +1 -0
- package/dist/{useLatest-DC8i7guK.d.mts → useLatest-UOvWy0ZW.d.mts} +2 -2
- package/dist/{useLatest-DC8i7guK.d.mts.map → useLatest-UOvWy0ZW.d.mts.map} +1 -1
- package/dist/{useLayout-BKsQl2Or.mjs → useLayout-D5cE8OCI.mjs} +4 -4
- package/dist/{useLayout-BKsQl2Or.mjs.map → useLayout-D5cE8OCI.mjs.map} +1 -1
- package/dist/{with-text-input-DG4f7JII.d.mts → with-text-input-DLoSCBrm.d.mts} +3 -3
- package/dist/{with-text-input-DG4f7JII.d.mts.map → with-text-input-DLoSCBrm.d.mts.map} +1 -1
- package/dist/wrap-measurer-registration-IV2HtcCd.d.mts +3106 -0
- package/dist/wrap-measurer-registration-IV2HtcCd.d.mts.map +1 -0
- package/dist/{wrapper-D7gNSsgf.mjs → wrapper-CD29afOs.mjs} +17 -37
- package/dist/wrapper-CD29afOs.mjs.map +1 -0
- package/dist/{wrappers-CypAzrMO.mjs → wrappers-CInBJm44.mjs} +6 -6
- package/dist/{wrappers-CypAzrMO.mjs.map → wrappers-CInBJm44.mjs.map} +1 -1
- package/dist/{yoga-adapter-SsEIqMc1.mjs → yoga-adapter-9uab5Qn-.mjs} +2 -2
- package/dist/{yoga-adapter-SsEIqMc1.mjs.map → yoga-adapter-9uab5Qn-.mjs.map} +1 -1
- package/dist/yoga-adapter-yqTl1aXK.mjs +2 -0
- package/package.json +20 -15
- package/dist/Text-BRf-59j2.mjs.map +0 -1
- package/dist/ag-BeFC4S2N.mjs.map +0 -1
- package/dist/ansi-OYRLxxZQ.mjs.map +0 -1
- package/dist/bound-term-BumfuXXW.d.mts.map +0 -1
- package/dist/cli-DG6zsfsS.mjs +0 -4
- package/dist/devtools-nmPUmYU_.mjs +0 -2
- package/dist/image-1nRyKa60.mjs.map +0 -1
- package/dist/index-2E1jYgak.d.mts.map +0 -1
- package/dist/index-DnuadDNL.d.mts.map +0 -1
- package/dist/layout-signals-Dch2EiCy.mjs.map +0 -1
- package/dist/mouse-events-hnbJZRwK.mjs.map +0 -1
- package/dist/node-BiFu8I9Y.mjs.map +0 -1
- package/dist/reconciler-NBDSEm8k.mjs.map +0 -1
- package/dist/render-string-B4h4SmK7.mjs.map +0 -1
- package/dist/src-B9S_woYc.mjs.map +0 -1
- package/dist/src-CbhWmUnF.mjs.map +0 -1
- package/dist/src-Oe6x5PrS.mjs.map +0 -1
- package/dist/src-WeA_J4BV.mjs.map +0 -1
- package/dist/ui/display.d.mts +0 -35
- package/dist/ui/display.d.mts.map +0 -1
- package/dist/ui/display.mjs +0 -123
- package/dist/ui/display.mjs.map +0 -1
- package/dist/ui/input.d.mts +0 -184
- package/dist/ui/input.d.mts.map +0 -1
- package/dist/ui/input.mjs +0 -283
- package/dist/ui/input.mjs.map +0 -1
- package/dist/wrapper-D7gNSsgf.mjs.map +0 -1
- package/dist/yoga-adapter-1ex8r0ws.mjs +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as createStyle, j as createTerminalProfile } from "./src-
|
|
2
|
-
import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW } from "./ansi-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;AAyBA,SAAS,aAAa,IAA4B;AAChD,KAAI,OAAO,OAAQ,QAAO;AAC1B,KAAI,OAAO,SAAU,QAAO;AAC5B,KAAI,OAAO,MAAO,QAAO;AACzB,QAAO;;AAkBT,MAAM,gBACJ,OAAO,YAAY,eAAe,QAAQ,SACtC,sBAAsB,EAAE,QAAQ,QAAQ,QAAQ,CAAC,CAAC,aAClD;;;;;;;AAQN,MAAM,QAAe,YAAY,EAAE,OAAO,eAAe,CAAC;AAyCpC,aAAa,cAAc;OAOwB;AACvE,KAAI,CAAC,SAAS,OAAQ,QAAO;CAI7B,MAAM,QAAQ,aAAa,sBAAsB,EAAE,QAAQ,QAAQ,QAAQ,CAAC,CAAC,WAAW;AACxF,QAAO,UAAU,IAAI,QAAQ,EAAE,OAAO;IACpC;AAmBJ,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAEyB,CAAC,GAAG,sBAAsB,GAAG,qBAAqB;;;;;;;ACrK5E,MAAa,iBAAiD;CAC5D,MAAM;EAAC;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI;CACxD,MAAM;EAAC;EAAK;EAAM;EAAK;EAAI;CAC3B,KAAK;EAAC;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI;CACnC,QAAQ;EAAC;EAAK;EAAK;EAAK;EAAI;CAC5B,OAAO;EAAC;EAAK;EAAK;EAAK;EAAK;EAAK;EAAI;CACtC;;AAGD,MAAa,oBAAkD;CAC7D,MAAM;CACN,MAAM;CACN,KAAK;CACL,QAAQ;CACR,OAAO;CACR;;;;;;;;;;;;AAaD,IAAa,UAAb,MAAa,QAAQ;CACnB;CACA;CACA;CACA;CACA;CACA;CAEA,aAAqB;CACrB,QAAuD;CACvD,aAAqB;CAErB,YAAY,eAAyC;EACnD,MAAM,UACJ,OAAO,kBAAkB,WAAW,EAAE,MAAM,eAAe,GAAI,iBAAiB,EAAE;AAEpF,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,QAAQ,QAAQ,SAAS;AAC9B,OAAK,QAAQ,QAAQ,SAAS;AAC9B,OAAK,SAAS,QAAQ,UAAU,QAAQ;AACxC,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,WAAW,QAAQ,YAAY,kBAAkB,KAAK;;;CAI7D,IAAI,cAAsB;AACxB,SAAO,KAAK;;;CAId,IAAI,YAAY,OAAe;AAC7B,OAAK,OAAO;AACZ,MAAI,KAAK,WACP,MAAK,QAAQ;;;CAKjB,IAAI,WAAoB;AACtB,SAAO,KAAK;;;;;CAMd,MAAM,MAAqB;AACzB,MAAI,SAAS,KAAA,EACX,MAAK,OAAO;AAGd,MAAI,KAAK,WACP,QAAO;AAGT,OAAK,aAAa;AAClB,OAAK,aAAa;AAElB,MAAI,KAAK,cAAc,MAAM,KAAK,OAAO,CACvC,OAAM,aAAa,KAAK,OAAO;AAGjC,OAAK,QAAQ;AACb,OAAK,QAAQ,kBAAkB;AAC7B,QAAK,cAAc,KAAK,aAAa,KAAK,eAAe,KAAK,OAAO;AACrE,QAAK,QAAQ;KACZ,KAAK,SAAS;AAEjB,SAAO;;;;;CAMT,OAAa;AACX,MAAI,CAAC,KAAK,WACR,QAAO;AAGT,OAAK,aAAa;AAElB,MAAI,KAAK,OAAO;AACd,iBAAc,KAAK,MAAM;AACzB,QAAK,QAAQ;;AAGf,OAAK,OAAO;AAEZ,MAAI,KAAK,cAAc,MAAM,KAAK,OAAO,CACvC,OAAM,aAAa,KAAK,OAAO;AAGjC,SAAO;;;;;CAMT,QAAQ,MAAqB;AAC3B,SAAO,KAAK,eAAe,MAAM,MAAM,IAAI,EAAE,QAAQ,KAAK,KAAK;;;;;CAMjE,KAAK,MAAqB;AACxB,SAAO,KAAK,eAAe,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,KAAK;;;;;CAM/D,KAAK,MAAqB;AACxB,SAAO,KAAK,eAAe,MAAM,OAAO,IAAI,EAAE,QAAQ,KAAK,KAAK;;;;;CAMlE,KAAK,MAAqB;AACxB,SAAO,KAAK,eAAe,MAAM,KAAK,IAAI,EAAE,QAAQ,KAAK,KAAK;;;;;CAMhE,QAAc;AACZ,MAAI,MAAM,KAAK,OAAO,CACpB,OAAM;MAAuC,KAAK,OAAO;AAE3D,SAAO;;CAGT,SAAuB;EACrB,MAAM,QAAQ,eAAe,KAAK,OAAO,KAAK;EAC9C,MAAM,UAAW,MAA2D,KAAK;EACjF,MAAM,eAAe,UAAU,QAAQ,MAAO,GAAG;EACjD,MAAM,SAAS,KAAK,OAAO,GAAG,aAAa,GAAG,KAAK,SAAS;AAE5D,MAAI,MAAM,KAAK,OAAO,CACpB,OAAM;EAAqB,aAA2B,KAAK,OAAO;;CAItE,eAAuB,QAAgB,MAAoB;AACzD,OAAK,MAAM;AACX,QAAM,GAAG,OAAO,GAAG,KAAK,KAAK,KAAK,OAAO;AACzC,SAAO;;;;;CAMT,CAAC,OAAO,WAAiB;AACvB,OAAK,MAAM;;;;;;;;;;;;;CAcb,OAAO,MAAM,eAAqD;EAChE,MAAM,UAAU,IAAI,QAAQ,cAAc;AAC1C,UAAQ,OAAO;AACf,eAAa,QAAQ,MAAM;;;;;;;;;;;;;;;;;;;;AAgD/B,SAAgB,cAAc,SAA2C;CACvE,MAAM,UAAU,IAAI,QAAQ;EAAE,GAAG;EAAS,MAAM;EAAI,CAAC;CAErD,MAAM,aAAa,SAAiB;AAElC,MAAI,CAAC,QAAQ,SACX,SAAQ,MAAM,KAAK;MAEnB,SAAQ,cAAc;;AAI1B,UAAS,aAAa,QAAQ,MAAM;AACpC,UAAS,WAAW,SAAS,QAAQ,QAAQ,KAAK;AAClD,UAAS,QAAQ,SAAS,QAAQ,KAAK,KAAK;AAC5C,UAAS,QAAQ,SAAS,QAAQ,KAAK,KAAK;AAC5C,UAAS,QAAQ,SAAS,QAAQ,KAAK,KAAK;AAC5C,UAAS,OAAO,iBAAiB,QAAQ,MAAM;AAE/C,QAAO"}
|
|
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-
|
|
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-
|
|
127
|
+
//# sourceMappingURL=spinner-DN10UfF0.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner-
|
|
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:
|
|
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. `
|
|
2536
|
-
* 2. `
|
|
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
|
|
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
|
-
|
|
2709
|
-
|
|
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 =
|
|
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 ||
|
|
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")
|
|
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 {
|
|
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-
|
|
4728
|
+
//# sourceMappingURL=src-B8lf1kiR.mjs.map
|