silvery 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/{animation-DhINOJk8.mjs → animation-Cn64yepo.mjs} +1 -1
  2. package/dist/{animation-DhINOJk8.mjs.map → animation-Cn64yepo.mjs.map} +1 -1
  3. package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLOitHKx.mjs} +1 -1
  4. package/dist/ansi-CLOitHKx.mjs.map +1 -0
  5. package/dist/{ansi-CsjnZtAw.d.mts → ansi-Cc33mW54.d.mts} +1 -1
  6. package/dist/{ansi-CsjnZtAw.d.mts.map → ansi-Cc33mW54.d.mts.map} +1 -1
  7. package/dist/{chunk-BSw8zbkd.mjs → chunk-Vs_PY4HZ.mjs} +1 -1
  8. package/dist/cli-BKp0YtBD.mjs +4 -0
  9. package/dist/{context-BjWgrikx.mjs → context-BU5LkkIy.mjs} +8 -7
  10. package/dist/context-BU5LkkIy.mjs.map +1 -0
  11. package/dist/devtools-9QY4teqI.mjs +2 -0
  12. package/dist/{devtools-CeO9X_uv.mjs → devtools-DxkSLXDA.mjs} +4 -5
  13. package/dist/devtools-DxkSLXDA.mjs.map +1 -0
  14. package/dist/{eta-BnQSZcWf.mjs → eta-Bb3RH3wh.mjs} +1 -1
  15. package/dist/{eta-BnQSZcWf.mjs.map → eta-Bb3RH3wh.mjs.map} +1 -1
  16. package/dist/{flexily-zero-adapter-BOM0cl8R.mjs → flexily-zero-adapter-BlQa46nr.mjs} +21 -64
  17. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +1 -0
  18. package/dist/{flexily-zero-adapter-V8R3HQtK.mjs → flexily-zero-adapter-CMxXhdOL.mjs} +1 -1
  19. package/dist/{image-B0zMbVUr.mjs → image-CTII5QWI.mjs} +3 -3
  20. package/dist/image-CTII5QWI.mjs.map +1 -0
  21. package/dist/{index-Bh3U1K09.d.mts → index-BXslOebb.d.mts} +547 -137
  22. package/dist/index-BXslOebb.d.mts.map +1 -0
  23. package/dist/{index-C4vrhbud.d.mts → index-BnA7mNpo.d.mts} +1 -1
  24. package/dist/{index-C4vrhbud.d.mts.map → index-BnA7mNpo.d.mts.map} +1 -1
  25. package/dist/index-D3saHouR.d.mts +1392 -0
  26. package/dist/index-D3saHouR.d.mts.map +1 -0
  27. package/dist/index.d.mts +5 -33
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs +13 -13
  30. package/dist/{layout-engine--drvrWjD.mjs → layout-engine-B6Cdz1yZ.mjs} +1 -1
  31. package/dist/{layout-engine-Dr3cY5U4.mjs → layout-engine-ClUgv6jB.mjs} +3 -3
  32. package/dist/{layout-engine-Dr3cY5U4.mjs.map → layout-engine-ClUgv6jB.mjs.map} +1 -1
  33. package/dist/{multi-progress-CcdqJFlf.mjs → multi-progress-Bq9Oi_WI.mjs} +3 -3
  34. package/dist/{multi-progress-CcdqJFlf.mjs.map → multi-progress-Bq9Oi_WI.mjs.map} +1 -1
  35. package/dist/{multi-progress-DQ-uUzLf.d.mts → multi-progress-DAQC7eap.d.mts} +2 -2
  36. package/dist/{multi-progress-DQ-uUzLf.d.mts.map → multi-progress-DAQC7eap.d.mts.map} +1 -1
  37. package/dist/{node-CP5WChgr.mjs → node-BeWlnCPY.mjs} +4 -4
  38. package/dist/node-BeWlnCPY.mjs.map +1 -0
  39. package/dist/{progress-bar-IrUjkLfU.mjs → progress-bar-CXE5Qfkd.mjs} +4 -4
  40. package/dist/progress-bar-CXE5Qfkd.mjs.map +1 -0
  41. package/dist/reconciler-Cwgm8hRR.mjs +8459 -0
  42. package/dist/reconciler-Cwgm8hRR.mjs.map +1 -0
  43. package/dist/{render-string-DVfgc8xr.mjs → render-string-Cbuf63Ya.mjs} +936 -136
  44. package/dist/render-string-Cbuf63Ya.mjs.map +1 -0
  45. package/dist/{render-string-BwLG7rIX.mjs → render-string-Tv-jqM16.mjs} +1 -1
  46. package/dist/runtime.d.mts +2 -2
  47. package/dist/runtime.mjs +3 -3
  48. package/dist/{spinner-BRkaJI0N.d.mts → spinner-CGo34vyR.d.mts} +2 -2
  49. package/dist/{spinner-BRkaJI0N.d.mts.map → spinner-CGo34vyR.d.mts.map} +1 -1
  50. package/dist/{spinner-BmldKx0M.mjs → spinner-CeOmcuw_.mjs} +3 -3
  51. package/dist/spinner-CeOmcuw_.mjs.map +1 -0
  52. package/dist/src-B5GjfG7g.mjs +4305 -0
  53. package/dist/src-B5GjfG7g.mjs.map +1 -0
  54. package/dist/{src-CJPXf3fC.mjs → src-C2uvC-r0.mjs} +7535 -6467
  55. package/dist/src-C2uvC-r0.mjs.map +1 -0
  56. package/dist/{src-D8kLrQBT.mjs → src-CChwjk0Z.mjs} +8 -86
  57. package/dist/src-CChwjk0Z.mjs.map +1 -0
  58. package/dist/{src-D_BS-as7.mjs → src-NCKb8kE5.mjs} +777 -776
  59. package/dist/src-NCKb8kE5.mjs.map +1 -0
  60. package/dist/theme.d.mts +2 -130
  61. package/dist/theme.mjs +3 -8
  62. package/dist/{types-B4A8Ebba.d.mts → types-BH_v3iMT.d.mts} +1 -1
  63. package/dist/{types-B4A8Ebba.d.mts.map → types-BH_v3iMT.d.mts.map} +1 -1
  64. package/dist/{types-e4dpfbSa.mjs → types-Bk2yw9Qj.mjs} +3 -3
  65. package/dist/types-Bk2yw9Qj.mjs.map +1 -0
  66. package/dist/ui/animation.d.mts +1 -1
  67. package/dist/ui/animation.mjs +1 -1
  68. package/dist/ui/ansi.d.mts +1 -1
  69. package/dist/ui/ansi.mjs +1 -1
  70. package/dist/ui/cli.d.mts +3 -3
  71. package/dist/ui/cli.mjs +5 -5
  72. package/dist/ui/display.d.mts +1 -1
  73. package/dist/ui/display.mjs.map +1 -1
  74. package/dist/ui/image.d.mts +1 -1
  75. package/dist/ui/image.mjs +1 -1
  76. package/dist/ui/input.d.mts +1 -1
  77. package/dist/ui/input.d.mts.map +1 -1
  78. package/dist/ui/input.mjs +2 -4
  79. package/dist/ui/input.mjs.map +1 -1
  80. package/dist/ui/progress.d.mts +3 -3
  81. package/dist/ui/progress.d.mts.map +1 -1
  82. package/dist/ui/progress.mjs +3 -3
  83. package/dist/ui/progress.mjs.map +1 -1
  84. package/dist/ui/react.d.mts +1 -1
  85. package/dist/ui/react.d.mts.map +1 -1
  86. package/dist/ui/react.mjs +2 -2
  87. package/dist/ui/react.mjs.map +1 -1
  88. package/dist/ui/utils.mjs +1 -1
  89. package/dist/ui/wrappers.d.mts +2 -2
  90. package/dist/ui/wrappers.mjs +1 -1
  91. package/dist/ui.d.mts +5 -5
  92. package/dist/ui.mjs +6 -6
  93. package/dist/{useLatest-6xqnGIU6.d.mts → useLatest-Bg2x4bfP.d.mts} +1 -1
  94. package/dist/{useLatest-6xqnGIU6.d.mts.map → useLatest-Bg2x4bfP.d.mts.map} +1 -1
  95. package/dist/{with-text-input-lUh9gYAG.d.mts → with-text-input-CRfoiFFG.d.mts} +3 -3
  96. package/dist/with-text-input-CRfoiFFG.d.mts.map +1 -0
  97. package/dist/{wrappers-JrEYTuKA.mjs → wrappers-UTADQkSY.mjs} +4 -4
  98. package/dist/wrappers-UTADQkSY.mjs.map +1 -0
  99. package/dist/{yoga-adapter-Bc8XT9cN.mjs → yoga-adapter-8oRGRw8V.mjs} +2 -2
  100. package/dist/{yoga-adapter-Bc8XT9cN.mjs.map → yoga-adapter-8oRGRw8V.mjs.map} +1 -1
  101. package/dist/yoga-adapter-D_CcxSt5.mjs +2 -0
  102. package/package.json +54 -45
  103. package/dist/UPNG-DvKjM6wE.mjs +0 -5076
  104. package/dist/UPNG-DvKjM6wE.mjs.map +0 -1
  105. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs +0 -6
  106. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs.map +0 -1
  107. package/dist/ansi-C6Qs1Wn2.mjs.map +0 -1
  108. package/dist/apng-CvSlLBtc.mjs +0 -3
  109. package/dist/apng-DFFVOItr.mjs +0 -70
  110. package/dist/apng-DFFVOItr.mjs.map +0 -1
  111. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  112. package/dist/backend-DU0Y938U.mjs +0 -13396
  113. package/dist/backend-DU0Y938U.mjs.map +0 -1
  114. package/dist/backends-BihMKFY_.mjs +0 -1181
  115. package/dist/backends-BihMKFY_.mjs.map +0 -1
  116. package/dist/backends-Dk_5G_gC.mjs +0 -3
  117. package/dist/cli-GwJ0S2In.mjs +0 -4
  118. package/dist/context-BjWgrikx.mjs.map +0 -1
  119. package/dist/derive-O_Kb1Bk_.d.mts +0 -28
  120. package/dist/derive-O_Kb1Bk_.d.mts.map +0 -1
  121. package/dist/devtools-CeO9X_uv.mjs.map +0 -1
  122. package/dist/devtools-nX4tj6OH.mjs +0 -2
  123. package/dist/flexily-zero-adapter-BOM0cl8R.mjs.map +0 -1
  124. package/dist/gif-B9Uq4qZA.mjs +0 -73
  125. package/dist/gif-B9Uq4qZA.mjs.map +0 -1
  126. package/dist/gif-BdrLRBmM.mjs +0 -3
  127. package/dist/gifenc-DfhOb4xr.mjs +0 -730
  128. package/dist/gifenc-DfhOb4xr.mjs.map +0 -1
  129. package/dist/image-B0zMbVUr.mjs.map +0 -1
  130. package/dist/index-Bh3U1K09.d.mts.map +0 -1
  131. package/dist/index-dehZ18K-.d.mts +0 -679
  132. package/dist/index-dehZ18K-.d.mts.map +0 -1
  133. package/dist/key-mapping-7k2ufK2b.mjs +0 -3
  134. package/dist/key-mapping-WLUmxjx1.mjs +0 -132
  135. package/dist/key-mapping-WLUmxjx1.mjs.map +0 -1
  136. package/dist/node-CP5WChgr.mjs.map +0 -1
  137. package/dist/progress-bar-IrUjkLfU.mjs.map +0 -1
  138. package/dist/reconciler-B8uxQxaU.mjs +0 -16482
  139. package/dist/reconciler-B8uxQxaU.mjs.map +0 -1
  140. package/dist/render-string-DVfgc8xr.mjs.map +0 -1
  141. package/dist/resvg-js-Cwipz-_J.mjs +0 -203
  142. package/dist/resvg-js-Cwipz-_J.mjs.map +0 -1
  143. package/dist/spinner-BmldKx0M.mjs.map +0 -1
  144. package/dist/src-C0sOQW-t.mjs +0 -3866
  145. package/dist/src-C0sOQW-t.mjs.map +0 -1
  146. package/dist/src-CJPXf3fC.mjs.map +0 -1
  147. package/dist/src-D8kLrQBT.mjs.map +0 -1
  148. package/dist/src-D_BS-as7.mjs.map +0 -1
  149. package/dist/theme.d.mts.map +0 -1
  150. package/dist/theme.mjs.map +0 -1
  151. package/dist/types-e4dpfbSa.mjs.map +0 -1
  152. package/dist/with-text-input-lUh9gYAG.d.mts.map +0 -1
  153. package/dist/wrapper-CE6GQ27z.mjs +0 -3527
  154. package/dist/wrapper-CE6GQ27z.mjs.map +0 -1
  155. package/dist/wrappers-JrEYTuKA.mjs.map +0 -1
  156. package/dist/yoga-adapter-B8LZpQcE.mjs +0 -2
package/dist/theme.d.mts CHANGED
@@ -1,130 +1,2 @@
1
- import { $ as detectTheme, A as everforestDark, At as AnsiPrimary, B as oneDark, C as ayuMirage, Ct as presetTheme, D as snazzy, Dt as ThemeProvider, E as materialLight, Et as ThemeContext, F as rosePine, Ft as AnsiColorName, G as solarizedLight, H as tokyoNightDay, I as rosePineDawn, J as catppuccinFrappe, K as dracula, L as rosePineMoon, M as kanagawaDragon, Mt as ColorScheme, N as kanagawaLotus, Nt as HueName, O as monokai, Ot as ThemeProviderProps, P as kanagawaWave, Pt as Theme, Q as DetectThemeOptions, R as gruvboxDark, S as ayuLight, St as createTheme, T as materialDark, Tt as generateTheme, U as tokyoNightStorm, V as tokyoNight, W as solarizedDark, X as catppuccinMacchiato, Y as catppuccinLatte, Z as catppuccinMocha, _ as moonfly, _t as setActiveColorLevel, a as defaultDarkTheme, at as resolveAliases, b as nightfox, bt as fromColors, c as getThemeByName, ct as ThemeValidationResult, d as edgeDark, dt as validateColorScheme, et as exportBase16, f as edgeLight, ft as ActiveColorLevel, g as nightfly, gt as pushContextTheme, h as oxocarbonLight, ht as popContextTheme, i as builtinThemes, it as themeToCSSVars, j as everforestLight, jt as COLOR_SCHEME_FIELDS, k as monokaiPro, kt as useTheme, l as modusOperandi, lt as validateTheme, m as oxocarbonDark, mt as getActiveTheme, n as ansi16LightTheme, nt as Base16Scheme, o as defaultLightTheme, ot as resolveTokenAlias, p as sonokai, pt as getActiveColorLevel, q as nord, r as builtinPalettes, rt as autoGenerateTheme, s as getSchemeByName, st as THEME_TOKEN_KEYS, t as ansi16DarkTheme, tt as importBase16, u as modusVivendi, ut as ValidationResult, v as horizon, vt as setActiveTheme, w as palenight, wt as quickTheme, x as ayuDark, xt as fromPreset, y as dawnfox, yt as fromBase16, z as gruvboxLight } from "./index-dehZ18K-.mjs";
2
- import { n as deriveTheme, r as resolveThemeColor, t as ThemeAdjustment } from "./derive-O_Kb1Bk_.mjs";
3
-
4
- //#region packages/color/src/types.d.ts
5
- /** HSL color: [hue: 0-360, saturation: 0-1, lightness: 0-1] */
6
- type HSL = [number, number, number];
7
- /** Result of a contrast check between two colors. */
8
- interface ContrastResult {
9
- /** The contrast ratio (1:1 to 21:1), expressed as a single number (e.g. 4.5). */
10
- ratio: number;
11
- /** Whether the ratio meets WCAG AA for normal text (>= 4.5:1). */
12
- aa: boolean;
13
- /** Whether the ratio meets WCAG AAA for normal text (>= 7:1). */
14
- aaa: boolean;
15
- }
16
- //#endregion
17
- //#region packages/color/src/color.d.ts
18
- /** Parse #rrggbb or #rgb to [r, g, b]. Returns null for invalid input. */
19
- declare function hexToRgb(hex: string): [number, number, number] | null;
20
- /** Convert [r, g, b] (0-255) to hex string. */
21
- declare function rgbToHex(r: number, g: number, b: number): string;
22
- /**
23
- * Blend two hex colors in OKLab space. t=0 returns a, t=1 returns b.
24
- * Perceptually-uniform midpoints (unlike naive RGB blending which produces
25
- * muddy halfway colors).
26
- *
27
- * Interpolation is done in OKLab (rectangular a/b), not OKLCH (polar). This
28
- * matches CSS Color Module 4's default interpolation space and avoids hue-arc
29
- * weirdness when one endpoint is near-neutral (its hue is effectively
30
- * undefined). For explicit hue-rotation blending, use `lerpOklch` directly.
31
- *
32
- * For non-hex inputs (ANSI names), returns `a` unchanged.
33
- */
34
- declare function blend(a: string, b: string, t: number): string;
35
- /**
36
- * Brighten a hex color by raising OKLCH lightness. amount=0.1 adds 0.1 to L
37
- * (perceptually linear — 10% brighter looks 10% brighter regardless of hue).
38
- *
39
- * For non-hex inputs, returns the color unchanged.
40
- */
41
- declare function brighten(color: string, amount: number): string;
42
- /**
43
- * Darken a hex color by lowering OKLCH lightness. amount=0.1 subtracts 0.1 from L.
44
- *
45
- * For non-hex inputs, returns the color unchanged.
46
- */
47
- declare function darken(color: string, amount: number): string;
48
- /**
49
- * Desaturate a hex color by lowering OKLCH chroma. amount=0.4 reduces C by 40%
50
- * (relative — consistent with the original HSL-based contract). For a flat
51
- * subtraction, use `saturate(color, -amount)`.
52
- *
53
- * For non-hex inputs, returns the color unchanged.
54
- */
55
- declare function desaturate(color: string, amount: number): string;
56
- /**
57
- * Get the complementary color (180° hue rotation) in OKLCH. Preserves L + C,
58
- * so the complement has the same perceived brightness and colorfulness.
59
- *
60
- * For non-hex inputs, returns the color unchanged.
61
- */
62
- declare function complement(color: string): string;
63
- /**
64
- * Pick black or white text for readability on the given background.
65
- * Uses WCAG 2.1 relative luminance.
66
- */
67
- declare function contrastFg(bg: string): "#000000" | "#FFFFFF";
68
- declare function rgbToHsl(r: number, g: number, b: number): HSL;
69
- declare function hslToHex(h: number, s: number, l: number): string;
70
- declare function hexToHsl(hex: string): HSL | null;
71
- //#endregion
72
- //#region packages/color/src/contrast.d.ts
73
- /**
74
- * Check contrast ratio between foreground and background colors.
75
- *
76
- * Uses the WCAG 2.1 relative luminance formula to compute the contrast
77
- * ratio and check AA (>= 4.5:1) and AAA (>= 7:1) compliance for normal text.
78
- *
79
- * @param fg - Foreground hex color (e.g. "#FFFFFF")
80
- * @param bg - Background hex color (e.g. "#000000")
81
- * @returns Contrast ratio and AA/AAA pass/fail, or null if colors are not valid hex
82
- *
83
- * @example
84
- * ```typescript
85
- * const result = checkContrast("#FFFFFF", "#000000")
86
- * // { ratio: 21, aa: true, aaa: true }
87
- *
88
- * const poor = checkContrast("#777777", "#888888")
89
- * // { ratio: ~1.3, aa: false, aaa: false }
90
- * ```
91
- */
92
- declare function checkContrast(fg: string, bg: string): ContrastResult | null;
93
- /**
94
- * Adjust a color's OKLCH lightness until it meets a minimum WCAG contrast ratio
95
- * against a reference color. Preserves hue and chroma — only lightness shifts,
96
- * and only as much as needed.
97
- *
98
- * Returns the original color unchanged if it already meets the target.
99
- *
100
- * For impossible targets (e.g. 21:1 against mid-gray), returns the
101
- * best achievable color (near-black or near-white in the same hue).
102
- *
103
- * @param color - The color to adjust (hex)
104
- * @param against - The reference background color (hex)
105
- * @param minRatio - Minimum contrast ratio to achieve (e.g. 4.5 for AA)
106
- * @returns Adjusted hex color meeting the target, or original if already OK
107
- *
108
- * @example
109
- * ```typescript
110
- * // Yellow on white — too low contrast, gets darkened (perceptually; same hue preserved)
111
- * ensureContrast("#FFAB91", "#FFFFFF", 4.5)
112
- *
113
- * // Blue on dark bg — already fine, returned unchanged
114
- * ensureContrast("#5C9FFF", "#1A1A2E", 4.5) // → "#5C9FFF"
115
- * ```
116
- */
117
- declare function ensureContrast(color: string, against: string, minRatio: number): string;
118
- //#endregion
119
- //#region packages/ansi/src/theme/detect.d.ts
120
- interface DetectedScheme {
121
- fg: string | null;
122
- bg: string | null;
123
- ansi: (string | null)[];
124
- dark: boolean;
125
- palette: Partial<ColorScheme>;
126
- }
127
- declare function detectTerminalScheme(timeoutMs?: number): Promise<DetectedScheme | null>;
128
- //#endregion
129
- export { ActiveColorLevel, AnsiColorName, AnsiPrimary, Base16Scheme, COLOR_SCHEME_FIELDS, ColorScheme, ContrastResult, DetectThemeOptions, DetectedScheme, HSL, HueName, THEME_TOKEN_KEYS, Theme, ThemeAdjustment, ThemeContext, ThemeProvider, ThemeProviderProps, ThemeValidationResult, ValidationResult, ansi16DarkTheme, ansi16LightTheme, autoGenerateTheme, ayuDark, ayuLight, ayuMirage, blend, brighten, builtinPalettes, builtinThemes, catppuccinFrappe, catppuccinLatte, catppuccinMacchiato, catppuccinMocha, checkContrast, complement, contrastFg, createTheme, darken, dawnfox, defaultDarkTheme, defaultLightTheme, deriveTheme, desaturate, detectTerminalScheme, detectTheme, dracula, edgeDark, edgeLight, ensureContrast, everforestDark, everforestLight, exportBase16, fromBase16, fromColors, fromPreset, generateTheme, getActiveColorLevel, getActiveTheme, getSchemeByName, getThemeByName, gruvboxDark, gruvboxLight, hexToHsl, hexToRgb, horizon, hslToHex, importBase16, kanagawaDragon, kanagawaLotus, kanagawaWave, materialDark, materialLight, modusOperandi, modusVivendi, monokai, monokaiPro, moonfly, nightfly, nightfox, nord, oneDark, oxocarbonDark, oxocarbonLight, palenight, popContextTheme, presetTheme, pushContextTheme, quickTheme, resolveAliases, resolveThemeColor, resolveTokenAlias, rgbToHex, rgbToHsl, rosePine, rosePineDawn, rosePineMoon, setActiveColorLevel, setActiveTheme, snazzy, solarizedDark, solarizedLight, sonokai, themeToCSSVars, tokyoNight, tokyoNightDay, tokyoNightStorm, useTheme, validateColorScheme, validateTheme };
130
- //# sourceMappingURL=theme.d.mts.map
1
+ import { $ as ayuMirage, A as detectTheme, At as Base16Scheme, B as modusVivendi, Bt as createTheme, C as InteractiveRole, Ct as nord, D as SurfaceRole, Dn as bakeFlat, Dt as catppuccinMocha, E as StatePair, En as FlattenRule, Et as catppuccinMacchiato, F as defaultDarkTheme, Ft as ThemeValidationResult, G as oxocarbonLight, Gt as fromColors, H as edgeLight, Ht as quickTheme, I as defaultLightTheme, It as validateTheme, J as horizon, K as nightfly, Kt as fromPreset, L as getSchemeByName, Lt as ValidationResult, M as ansi16LightTheme, Mt as resolveAliases, N as builtinPalettes, Nt as resolveTokenAlias, O as Theme, On as defaultFlattenRule, Ot as exportBase16, P as builtinThemes, Pt as THEME_TOKEN_KEYS, Q as ayuLight, R as getThemeByName, Rt as validateColorScheme, S as FlatTokens, St as dracula, T as Roles, Tt as catppuccinLatte, U as sonokai, Ut as assignPrimaryToSlot, V as edgeDark, Vt as presetTheme, W as oxocarbonDark, Wt as fromBase16, X as nightfox, Y as dawnfox, Z as ayuDark, _ as DerivationStep, _t as tokyoNight, a as ContrastError, at as monokaiPro, b as DesignSystem, bt as solarizedDark, c as autoLift, ct as kanagawaDragon, d as sterling, dn as detectTerminalScheme, dt as rosePine, et as palenight, f as AccentRole, ft as rosePineDawn, g as DeepPartial, gt as oneDark, h as CursorRole, ht as gruvboxLight, i as deriveTheme, it as monokai, j as ansi16DarkTheme, jt as themeToCSSVars, k as ThemeShape, kt as importBase16, l as checkAA, ln as DetectThemeOptions, lt as kanagawaLotus, m as ContrastMode, mt as gruvboxDark, n as STERLING_FLAT_TOKENS, nt as materialLight, o as ContrastViolation, ot as everforestDark, p as BorderRole, pt as rosePineMoon, q as moonfly, qt as generateTheme, r as deriveRoles, rt as snazzy, s as WCAG_AA, st as everforestLight, t as defaultScheme, tt as materialDark, u as defineDesignSystem, un as DetectedScheme, ut as kanagawaWave, v as DerivationTrace, vn as COLOR_SCHEME_FIELDS, vt as tokyoNightDay, w as MutedRole, wt as catppuccinFrappe, x as FlatToken, xt as solarizedLight, y as DeriveOptions, yn as ColorScheme, yt as tokyoNightStorm, z as modusOperandi, zt as autoGenerateTheme } from "./index-D3saHouR.mjs";
2
+ export { AccentRole, Base16Scheme, BorderRole, COLOR_SCHEME_FIELDS, ColorScheme, CursorRole, DesignSystem, DetectThemeOptions, DetectedScheme, FlattenRule, InteractiveRole, MutedRole, STERLING_FLAT_TOKENS, StatePair, ContrastError as SterlingContrastError, ContrastMode as SterlingContrastMode, ContrastViolation as SterlingContrastViolation, DeepPartial as SterlingDeepPartial, DerivationStep as SterlingDerivationStep, DerivationTrace as SterlingDerivationTrace, DeriveOptions as SterlingDeriveOptions, FlatToken as SterlingFlatToken, FlatTokens as SterlingFlatTokens, Roles as SterlingRoles, Theme as SterlingTheme, SurfaceRole, THEME_TOKEN_KEYS, ThemeShape, ThemeValidationResult, ValidationResult, WCAG_AA, ansi16DarkTheme, ansi16LightTheme, assignPrimaryToSlot, autoGenerateTheme, ayuDark, ayuLight, ayuMirage, bakeFlat, builtinPalettes, builtinThemes, catppuccinFrappe, catppuccinLatte, catppuccinMacchiato, catppuccinMocha, createTheme, dawnfox, defaultDarkTheme, defaultFlattenRule, defaultLightTheme, defineDesignSystem, detectTerminalScheme, detectTheme, dracula, edgeDark, edgeLight, everforestDark, everforestLight, exportBase16, fromBase16, fromColors, fromPreset, generateTheme, getSchemeByName, getThemeByName, gruvboxDark, gruvboxLight, horizon, importBase16, kanagawaDragon, kanagawaLotus, kanagawaWave, materialDark, materialLight, modusOperandi, modusVivendi, monokai, monokaiPro, moonfly, nightfly, nightfox, nord, oneDark, oxocarbonDark, oxocarbonLight, palenight, presetTheme, quickTheme, resolveAliases, resolveTokenAlias, rosePine, rosePineDawn, rosePineMoon, snazzy, solarizedDark, solarizedLight, sonokai, sterling, autoLift as sterlingAutoLift, checkAA as sterlingCheckAA, defaultScheme as sterlingDefaultScheme, deriveRoles as sterlingDeriveRoles, deriveTheme as sterlingDeriveTheme, themeToCSSVars, tokyoNight, tokyoNightDay, tokyoNightStorm, validateColorScheme, validateTheme };
package/dist/theme.mjs CHANGED
@@ -1,8 +1,3 @@
1
- import { A as brighten, B as rgbToHsl, D as checkContrast, F as hexToHsl, I as hexToRgb, L as hslToHex, M as contrastFg, N as darken, O as ensureContrast, P as desaturate, S as deriveTheme, T as resolveThemeColor, b as COLOR_SCHEME_FIELDS, j as complement, k as blend, r as detectTerminalScheme, z as rgbToHex } from "./src-D_BS-as7.mjs";
2
- import { $ as ayuDark, A as pushContextTheme, B as getThemeByName, C as ThemeProvider, Ct as solarizedLight, D as getActiveTheme, Dt as catppuccinLatte, E as getActiveColorLevel, Et as catppuccinFrappe, F as builtinPalettes, G as sonokai, H as modusVivendi, I as builtinThemes, J as nightfly, K as oxocarbonDark, L as defaultDarkTheme, M as setActiveTheme, N as ansi16DarkTheme, Ot as catppuccinMacchiato, P as ansi16LightTheme, Q as nightfox, R as defaultLightTheme, S as ThemeContext, St as solarizedDark, T as useTheme, Tt as nord, U as edgeDark, V as modusOperandi, W as edgeLight, X as horizon, Y as moonfly, Z as dawnfox, _ as fromColors, _t as gruvboxLight, a as exportBase16, at as snazzy, b as generateTheme, bt as tokyoNightDay, c as resolveAliases, ct as everforestDark, d as validateTheme, dt as kanagawaLotus, et as ayuLight, f as validateColorScheme, ft as kanagawaWave, g as fromBase16, gt as gruvboxDark, h as quickTheme, ht as rosePineMoon, it as materialLight, j as setActiveColorLevel, k as popContextTheme, kt as catppuccinMocha, l as resolveTokenAlias, lt as everforestLight, m as presetTheme, mt as rosePineDawn, nt as palenight, o as autoGenerateTheme, ot as monokai, p as createTheme, pt as rosePine, q as oxocarbonLight, r as detectTheme, rt as materialDark, s as themeToCSSVars, st as monokaiPro, t as init_src, tt as ayuMirage, u as THEME_TOKEN_KEYS, ut as kanagawaDragon, v as fromPreset, vt as oneDark, wt as dracula, xt as tokyoNightStorm, y as importBase16, yt as tokyoNight, z as getSchemeByName } from "./src-C0sOQW-t.mjs";
3
- //#region src/theme.ts
4
- init_src();
5
- //#endregion
6
- export { COLOR_SCHEME_FIELDS, THEME_TOKEN_KEYS, ThemeContext, ThemeProvider, ansi16DarkTheme, ansi16LightTheme, autoGenerateTheme, ayuDark, ayuLight, ayuMirage, blend, brighten, builtinPalettes, builtinThemes, catppuccinFrappe, catppuccinLatte, catppuccinMacchiato, catppuccinMocha, checkContrast, complement, contrastFg, createTheme, darken, dawnfox, defaultDarkTheme, defaultLightTheme, deriveTheme, desaturate, detectTerminalScheme, detectTheme, dracula, edgeDark, edgeLight, ensureContrast, everforestDark, everforestLight, exportBase16, fromBase16, fromColors, fromPreset, generateTheme, getActiveColorLevel, getActiveTheme, getSchemeByName, getThemeByName, gruvboxDark, gruvboxLight, hexToHsl, hexToRgb, horizon, hslToHex, importBase16, kanagawaDragon, kanagawaLotus, kanagawaWave, materialDark, materialLight, modusOperandi, modusVivendi, monokai, monokaiPro, moonfly, nightfly, nightfox, nord, oneDark, oxocarbonDark, oxocarbonLight, palenight, popContextTheme, presetTheme, pushContextTheme, quickTheme, resolveAliases, resolveThemeColor, resolveTokenAlias, rgbToHex, rgbToHsl, rosePine, rosePineDawn, rosePineMoon, setActiveColorLevel, setActiveTheme, snazzy, solarizedDark, solarizedLight, sonokai, themeToCSSVars, tokyoNight, tokyoNightDay, tokyoNightStorm, useTheme, validateColorScheme, validateTheme };
7
-
8
- //# sourceMappingURL=theme.mjs.map
1
+ import { B as bakeFlat, C as COLOR_SCHEME_FIELDS, V as defaultFlattenRule, a as detectTerminalScheme } from "./src-NCKb8kE5.mjs";
2
+ import { $ as kanagawaLotus, A as modusVivendi, B as nightfox, C as builtinPalettes, Ct as checkAA, D as getSchemeByName, E as defaultLightTheme, F as oxocarbonLight, G as materialDark, H as ayuLight, I as nightfly, J as monokai, K as materialLight, L as moonfly, M as edgeLight, N as sonokai, O as getThemeByName, P as oxocarbonDark, Q as kanagawaDragon, R as horizon, S as ansi16LightTheme, St as autoLift, T as defaultDarkTheme, Tt as generateTheme, U as ayuMirage, V as ayuDark, W as palenight, X as everforestDark, Y as monokaiPro, Z as everforestLight, _ as assignPrimaryToSlot, _t as catppuccinMocha, a as exportBase16, at as gruvboxLight, b as fromPreset, bt as ContrastError, c as resolveAliases, ct as tokyoNightDay, d as validateTheme, dt as solarizedLight, et as kanagawaWave, f as validateColorScheme, ft as dracula, g as quickTheme, gt as catppuccinMacchiato, h as presetTheme, ht as catppuccinLatte, i as detectTheme, it as gruvboxDark, j as edgeDark, k as modusOperandi, l as resolveTokenAlias, lt as tokyoNightStorm, m as createTheme, mt as catppuccinFrappe, n as defineDesignSystem, nt as rosePineDawn, o as themeToCSSVars, ot as oneDark, p as autoGenerateTheme, pt as nord, q as snazzy, r as defaultScheme, rt as rosePineMoon, s as STERLING_FLAT_TOKENS, st as tokyoNight, t as sterling, tt as rosePine, u as THEME_TOKEN_KEYS, ut as solarizedDark, v as fromBase16, vt as deriveRoles, w as builtinThemes, wt as importBase16, x as ansi16DarkTheme, xt as WCAG_AA, y as fromColors, yt as deriveTheme, z as dawnfox } from "./src-B5GjfG7g.mjs";
3
+ export { COLOR_SCHEME_FIELDS, STERLING_FLAT_TOKENS, ContrastError as SterlingContrastError, THEME_TOKEN_KEYS, WCAG_AA, ansi16DarkTheme, ansi16LightTheme, assignPrimaryToSlot, autoGenerateTheme, ayuDark, ayuLight, ayuMirage, bakeFlat, builtinPalettes, builtinThemes, catppuccinFrappe, catppuccinLatte, catppuccinMacchiato, catppuccinMocha, createTheme, dawnfox, defaultDarkTheme, defaultFlattenRule, defaultLightTheme, defineDesignSystem, detectTerminalScheme, detectTheme, dracula, edgeDark, edgeLight, everforestDark, everforestLight, exportBase16, fromBase16, fromColors, fromPreset, generateTheme, getSchemeByName, getThemeByName, gruvboxDark, gruvboxLight, horizon, importBase16, kanagawaDragon, kanagawaLotus, kanagawaWave, materialDark, materialLight, modusOperandi, modusVivendi, monokai, monokaiPro, moonfly, nightfly, nightfox, nord, oneDark, oxocarbonDark, oxocarbonLight, palenight, presetTheme, quickTheme, resolveAliases, resolveTokenAlias, rosePine, rosePineDawn, rosePineMoon, snazzy, solarizedDark, solarizedLight, sonokai, sterling, autoLift as sterlingAutoLift, checkAA as sterlingCheckAA, defaultScheme as sterlingDefaultScheme, deriveRoles as sterlingDeriveRoles, deriveTheme as sterlingDeriveTheme, themeToCSSVars, tokyoNight, tokyoNightDay, tokyoNightStorm, validateColorScheme, validateTheme };
@@ -238,4 +238,4 @@ interface WithSelectOptions {
238
238
  }
239
239
  //#endregion
240
240
  export { TextInputOptions as _, ProgressInfo as a, WithSelectOptions as b, SpinnerOptions as c, StepProgress as d, TableColumn as f, TaskStatus as g, TaskState as h, ProgressGenerator as i, SpinnerProps as l, TaskProps as m, ProgressBarProps as n, SelectOption as o, TableProps as p, ProgressCallback as r, SelectProps as s, ProgressBarOptions as t, SpinnerStyle as u, TextInputProps as v, WithSpinnerOptions as x, WithProgressOptions as y };
241
- //# sourceMappingURL=types-B4A8Ebba.d.mts.map
241
+ //# sourceMappingURL=types-BH_v3iMT.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-B4A8Ebba.d.mts","names":[],"sources":["../packages/ag-react/src/ui/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types-BH_v3iMT.d.mts","names":[],"sources":["../packages/ag-react/src/ui/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/system.mjs
1
+ //#region node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/system.mjs
2
2
  function createReactiveSystem({ update, notify, unwatched }) {
3
3
  return {
4
4
  link,
@@ -168,7 +168,7 @@ function createReactiveSystem({ update, notify, unwatched }) {
168
168
  }
169
169
  }
170
170
  //#endregion
171
- //#region ../../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/index.mjs
171
+ //#region node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/index.mjs
172
172
  let cycle = 0;
173
173
  let notifyIndex = 0;
174
174
  let queuedLength = 0;
@@ -465,4 +465,4 @@ function rectEqual(a, b) {
465
465
  //#endregion
466
466
  export { syncTextContentSignal as a, signal as c, syncRectSignals as i, getLayoutSignals as n, computed as o, syncFocusedSignal as r, effect as s, rectEqual as t };
467
467
 
468
- //# sourceMappingURL=types-e4dpfbSa.mjs.map
468
+ //# sourceMappingURL=types-Bk2yw9Qj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-Bk2yw9Qj.mjs","names":[],"sources":["../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/system.mjs","../node_modules/.bun/alien-signals@3.1.2/node_modules/alien-signals/esm/index.mjs","../packages/ag/src/layout-signals.ts","../packages/ag/src/types.ts"],"sourcesContent":["export const ReactiveFlags = {\n None: 0,\n Mutable: 1,\n Watching: 2,\n RecursedCheck: 4,\n Recursed: 8,\n Dirty: 16,\n Pending: 32,\n};\nexport function createReactiveSystem({ update, notify, unwatched, }) {\n return {\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n };\n function link(dep, sub, version) {\n const prevDep = sub.depsTail;\n if (prevDep !== undefined && prevDep.dep === dep) {\n return;\n }\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps;\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version;\n sub.depsTail = nextDep;\n return;\n }\n const prevSub = dep.subsTail;\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) {\n return;\n }\n const newLink = sub.depsTail\n = dep.subsTail\n = {\n version,\n dep,\n sub,\n prevDep,\n nextDep,\n prevSub,\n nextSub: undefined,\n };\n if (nextDep !== undefined) {\n nextDep.prevDep = newLink;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = newLink;\n }\n else {\n sub.deps = newLink;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = newLink;\n }\n else {\n dep.subs = newLink;\n }\n }\n function unlink(link, sub = link.sub) {\n const dep = link.dep;\n const prevDep = link.prevDep;\n const nextDep = link.nextDep;\n const nextSub = link.nextSub;\n const prevSub = link.prevSub;\n if (nextDep !== undefined) {\n nextDep.prevDep = prevDep;\n }\n else {\n sub.depsTail = prevDep;\n }\n if (prevDep !== undefined) {\n prevDep.nextDep = nextDep;\n }\n else {\n sub.deps = nextDep;\n }\n if (nextSub !== undefined) {\n nextSub.prevSub = prevSub;\n }\n else {\n dep.subsTail = prevSub;\n }\n if (prevSub !== undefined) {\n prevSub.nextSub = nextSub;\n }\n else if ((dep.subs = nextSub) === undefined) {\n unwatched(dep);\n }\n return nextDep;\n }\n function propagate(link) {\n let next = link.nextSub;\n let stack;\n top: do {\n const sub = link.sub;\n let flags = sub.flags;\n if (!(flags & (4 | 8 | 16 | 32))) {\n sub.flags = flags | 32;\n }\n else if (!(flags & (4 | 8))) {\n flags = 0;\n }\n else if (!(flags & 4)) {\n sub.flags = (flags & ~8) | 32;\n }\n else if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n sub.flags = flags | (8 | 32);\n flags &= 1;\n }\n else {\n flags = 0;\n }\n if (flags & 2) {\n notify(sub);\n }\n if (flags & 1) {\n const subSubs = sub.subs;\n if (subSubs !== undefined) {\n const nextSub = (link = subSubs).nextSub;\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack };\n next = nextSub;\n }\n continue;\n }\n }\n if ((link = next) !== undefined) {\n next = link.nextSub;\n continue;\n }\n while (stack !== undefined) {\n link = stack.value;\n stack = stack.prev;\n if (link !== undefined) {\n next = link.nextSub;\n continue top;\n }\n }\n break;\n } while (true);\n }\n function checkDirty(link, sub) {\n let stack;\n let checkDepth = 0;\n let dirty = false;\n top: do {\n const dep = link.dep;\n const flags = dep.flags;\n if (sub.flags & 16) {\n dirty = true;\n }\n else if ((flags & (1 | 16)) === (1 | 16)) {\n if (update(dep)) {\n const subs = dep.subs;\n if (subs.nextSub !== undefined) {\n shallowPropagate(subs);\n }\n dirty = true;\n }\n }\n else if ((flags & (1 | 32)) === (1 | 32)) {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack };\n }\n link = dep.deps;\n sub = dep;\n ++checkDepth;\n continue;\n }\n if (!dirty) {\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue;\n }\n }\n while (checkDepth--) {\n const firstSub = sub.subs;\n const hasMultipleSubs = firstSub.nextSub !== undefined;\n if (hasMultipleSubs) {\n link = stack.value;\n stack = stack.prev;\n }\n else {\n link = firstSub;\n }\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub);\n }\n sub = link.sub;\n continue;\n }\n dirty = false;\n }\n else {\n sub.flags &= ~32;\n }\n sub = link.sub;\n const nextDep = link.nextDep;\n if (nextDep !== undefined) {\n link = nextDep;\n continue top;\n }\n }\n return dirty;\n } while (true);\n }\n function shallowPropagate(link) {\n do {\n const sub = link.sub;\n const flags = sub.flags;\n if ((flags & (32 | 16)) === 32) {\n sub.flags = flags | 16;\n if ((flags & (2 | 4)) === 2) {\n notify(sub);\n }\n }\n } while ((link = link.nextSub) !== undefined);\n }\n function isValidLink(checkLink, sub) {\n let link = sub.depsTail;\n while (link !== undefined) {\n if (link === checkLink) {\n return true;\n }\n link = link.prevDep;\n }\n return false;\n }\n}\n","import { createReactiveSystem } from './system.mjs';\nlet cycle = 0;\nlet batchDepth = 0;\nlet notifyIndex = 0;\nlet queuedLength = 0;\nlet activeSub;\nconst queued = [];\nconst { link, unlink, propagate, checkDirty, shallowPropagate, } = createReactiveSystem({\n update(node) {\n if (node.depsTail !== undefined) {\n return updateComputed(node);\n }\n else {\n return updateSignal(node);\n }\n },\n notify(effect) {\n let insertIndex = queuedLength;\n let firstInsertedIndex = insertIndex;\n do {\n queued[insertIndex++] = effect;\n effect.flags &= ~2;\n effect = effect.subs?.sub;\n if (effect === undefined || !(effect.flags & 2)) {\n break;\n }\n } while (true);\n queuedLength = insertIndex;\n while (firstInsertedIndex < --insertIndex) {\n const left = queued[firstInsertedIndex];\n queued[firstInsertedIndex++] = queued[insertIndex];\n queued[insertIndex] = left;\n }\n },\n unwatched(node) {\n if (!(node.flags & 1)) {\n effectScopeOper.call(node);\n }\n else if (node.depsTail !== undefined) {\n node.depsTail = undefined;\n node.flags = 1 | 16;\n purgeDeps(node);\n }\n },\n});\nexport function getActiveSub() {\n return activeSub;\n}\nexport function setActiveSub(sub) {\n const prevSub = activeSub;\n activeSub = sub;\n return prevSub;\n}\nexport function getBatchDepth() {\n return batchDepth;\n}\nexport function startBatch() {\n ++batchDepth;\n}\nexport function endBatch() {\n if (!--batchDepth) {\n flush();\n }\n}\nexport function isSignal(fn) {\n return fn.name === 'bound ' + signalOper.name;\n}\nexport function isComputed(fn) {\n return fn.name === 'bound ' + computedOper.name;\n}\nexport function isEffect(fn) {\n return fn.name === 'bound ' + effectOper.name;\n}\nexport function isEffectScope(fn) {\n return fn.name === 'bound ' + effectScopeOper.name;\n}\nexport function signal(initialValue) {\n return signalOper.bind({\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: 1,\n });\n}\nexport function computed(getter) {\n return computedOper.bind({\n value: undefined,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter: getter,\n });\n}\nexport function effect(fn) {\n const e = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 2 | 4,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n }\n try {\n e.fn();\n }\n finally {\n activeSub = prevSub;\n e.flags &= ~4;\n }\n return effectOper.bind(e);\n}\nexport function effectScope(fn) {\n const e = {\n deps: undefined,\n depsTail: undefined,\n subs: undefined,\n subsTail: undefined,\n flags: 0,\n };\n const prevSub = setActiveSub(e);\n if (prevSub !== undefined) {\n link(e, prevSub, 0);\n }\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n }\n return effectScopeOper.bind(e);\n}\nexport function trigger(fn) {\n const sub = {\n deps: undefined,\n depsTail: undefined,\n flags: 2,\n };\n const prevSub = setActiveSub(sub);\n try {\n fn();\n }\n finally {\n activeSub = prevSub;\n let link = sub.deps;\n while (link !== undefined) {\n const dep = link.dep;\n link = unlink(link, sub);\n const subs = dep.subs;\n if (subs !== undefined) {\n sub.flags = 0;\n propagate(subs);\n shallowPropagate(subs);\n }\n }\n if (!batchDepth) {\n flush();\n }\n }\n}\nfunction updateComputed(c) {\n ++cycle;\n c.depsTail = undefined;\n c.flags = 1 | 4;\n const prevSub = setActiveSub(c);\n try {\n const oldValue = c.value;\n return oldValue !== (c.value = c.getter(oldValue));\n }\n finally {\n activeSub = prevSub;\n c.flags &= ~4;\n purgeDeps(c);\n }\n}\nfunction updateSignal(s) {\n s.flags = 1;\n return s.currentValue !== (s.currentValue = s.pendingValue);\n}\nfunction run(e) {\n const flags = e.flags;\n if (flags & 16\n || (flags & 32\n && checkDirty(e.deps, e))) {\n ++cycle;\n e.depsTail = undefined;\n e.flags = 2 | 4;\n const prevSub = setActiveSub(e);\n try {\n e.fn();\n }\n finally {\n activeSub = prevSub;\n e.flags &= ~4;\n purgeDeps(e);\n }\n }\n else {\n e.flags = 2;\n }\n}\nfunction flush() {\n try {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n run(effect);\n }\n }\n finally {\n while (notifyIndex < queuedLength) {\n const effect = queued[notifyIndex];\n queued[notifyIndex++] = undefined;\n effect.flags |= 2 | 8;\n }\n notifyIndex = 0;\n queuedLength = 0;\n }\n}\nfunction computedOper() {\n const flags = this.flags;\n if (flags & 16\n || (flags & 32\n && (checkDirty(this.deps, this)\n || (this.flags = flags & ~32, false)))) {\n if (updateComputed(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n else if (!flags) {\n this.flags = 1 | 4;\n const prevSub = setActiveSub(this);\n try {\n this.value = this.getter();\n }\n finally {\n activeSub = prevSub;\n this.flags &= ~4;\n }\n }\n const sub = activeSub;\n if (sub !== undefined) {\n link(this, sub, cycle);\n }\n return this.value;\n}\nfunction signalOper(...value) {\n if (value.length) {\n if (this.pendingValue !== (this.pendingValue = value[0])) {\n this.flags = 1 | 16;\n const subs = this.subs;\n if (subs !== undefined) {\n propagate(subs);\n if (!batchDepth) {\n flush();\n }\n }\n }\n }\n else {\n if (this.flags & 16) {\n if (updateSignal(this)) {\n const subs = this.subs;\n if (subs !== undefined) {\n shallowPropagate(subs);\n }\n }\n }\n let sub = activeSub;\n while (sub !== undefined) {\n if (sub.flags & (1 | 2)) {\n link(this, sub, cycle);\n break;\n }\n sub = sub.subs?.sub;\n }\n return this.currentValue;\n }\n}\nfunction effectOper() {\n effectScopeOper.call(this);\n}\nfunction effectScopeOper() {\n this.depsTail = undefined;\n this.flags = 0;\n purgeDeps(this);\n const sub = this.subs;\n if (sub !== undefined) {\n unlink(sub);\n }\n}\nfunction purgeDeps(sub) {\n const depsTail = sub.depsTail;\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps;\n while (dep !== undefined) {\n dep = unlink(dep, sub);\n }\n}\n","/**\n * withLayoutSignals — reactive signal layer for AgNode layout outputs.\n *\n * Composable plugin that wraps an AgNode with reactive signals for layout\n * rects, text content, and focus state. Engine-agnostic — works with\n * Flexily, Yoga, or any future layout engine.\n *\n * Signals are WeakMap-backed and lazily created. Nodes without subscribers\n * pay zero cost. After layout completes, the pipeline calls `syncSignals()`\n * to propagate imperative state into signals.\n *\n * ## Usage\n *\n * ```ts\n * import { getLayoutSignals, syncSignals } from \"@silvery/ag/layout-signals\"\n *\n * // Get (or create) signals for a node\n * const signals = getLayoutSignals(node)\n * signals.boxRect() // read current rect\n * signals.textContent() // read current text\n *\n * // After layout/reconciler mutations, sync imperative → reactive\n * syncSignals(node)\n * ```\n *\n * ## Three-layer stack\n *\n * Layer 0: alien-signals (signal, computed, effect)\n * Layer 1: getLayoutSignals() — this module (@silvery/ag, framework-agnostic)\n * Layer 2: useSignal(signal) — @silvery/ag-react (React bridge)\n * Layer 3: useBoxRect(), useAgNode() — semantic convenience hooks\n */\n\nimport { signal } from \"@silvery/signals\"\nimport type { AgNode, Rect } from \"./types\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Writable signal — call with no args to read, call with value to write.\n */\ntype WritableSignal<T> = {\n (): T\n (value: T): void\n}\n\n/**\n * All reactive signals for an AgNode.\n *\n * Combined rect signals (layout outputs) + node signals (content/state).\n * One interface, one WeakMap, one sync function.\n */\nexport interface LayoutSignals {\n // Layout rects (synced after layout + scroll + sticky phases)\n readonly boxRect: WritableSignal<Rect | null>\n readonly scrollRect: WritableSignal<Rect | null>\n readonly screenRect: WritableSignal<Rect | null>\n\n // Node state (synced from reconciler + focus manager)\n readonly textContent: WritableSignal<string | undefined>\n readonly focused: WritableSignal<boolean>\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\nconst signalMap = new WeakMap<AgNode, LayoutSignals>()\n\n/**\n * Get or create layout signals for a node.\n *\n * Lazily created on first access. Automatically garbage-collected\n * when the node is removed from the tree (WeakMap semantics).\n */\nexport function getLayoutSignals(node: AgNode): LayoutSignals {\n let s = signalMap.get(node)\n if (!s) {\n s = {\n boxRect: signal<Rect | null>(node.boxRect),\n scrollRect: signal<Rect | null>(node.scrollRect),\n screenRect: signal<Rect | null>(node.screenRect),\n textContent: signal<string | undefined>(node.textContent),\n focused: signal<boolean>(node.interactiveState?.focused ?? false),\n }\n signalMap.set(node, s)\n }\n return s\n}\n\n/** Check whether a node has signals allocated (for testing). */\nexport function hasLayoutSignals(node: AgNode): boolean {\n return signalMap.has(node)\n}\n\n// ============================================================================\n// Sync: imperative state → signals\n// ============================================================================\n\n/**\n * Sync all rect signals from the node's current values.\n *\n * Called from notifyLayoutSubscribers after layout + scroll + sticky\n * phases complete. Only syncs nodes that have signals allocated.\n * Reference-equality check prevents unnecessary downstream updates.\n */\nexport function syncRectSignals(node: AgNode): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (node.boxRect !== s.boxRect()) s.boxRect(node.boxRect)\n if (node.scrollRect !== s.scrollRect()) s.scrollRect(node.scrollRect)\n if (node.screenRect !== s.screenRect()) s.screenRect(node.screenRect)\n}\n\n/**\n * Sync textContent signal from the node's current value.\n *\n * Called from commitTextUpdate in the reconciler.\n */\nexport function syncTextContentSignal(node: AgNode): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (node.textContent !== s.textContent()) s.textContent(node.textContent)\n}\n\n/**\n * Sync focused signal for a node.\n *\n * Called from FocusManager when focus changes.\n */\nexport function syncFocusedSignal(node: AgNode, focused: boolean): void {\n const s = signalMap.get(node)\n if (!s) return\n\n if (focused !== s.focused()) s.focused(focused)\n}\n","/**\n * Silvery Types\n *\n * Core types for the Silvery renderer architecture.\n */\n\nimport type { DragEventProps } from \"./drag-event-types\"\nimport type { FocusEventProps } from \"./focus-events\"\nimport type { LayoutNode } from \"./layout-types\"\nimport type { MouseEventProps } from \"./mouse-event-types\"\n\n// ============================================================================\n// Layout Types\n// ============================================================================\n\n// ============================================================================\n// Selection Types\n// ============================================================================\n\n/**\n * CSS user-select equivalent for controlling text selectability.\n * - \"auto\": inherit from parent (root resolves to \"text\")\n * - \"none\": not selectable\n * - \"text\": force selectable (overrides parent \"none\")\n * - \"contain\": selectable, but selection cannot escape this node's bounds\n */\nexport type UserSelect = \"auto\" | \"none\" | \"text\" | \"contain\"\n\n// ============================================================================\n// Layout Types\n// ============================================================================\n\n/**\n * A rectangle with position and size.\n * All values are in terminal columns/rows (integers).\n */\nexport interface Rect {\n /** X position (0-indexed terminal column) */\n x: number\n /** Y position (0-indexed terminal row) */\n y: number\n /** Width in terminal columns */\n width: number\n /** Height in terminal rows */\n height: number\n}\n\n/**\n * Check if two rects are equal (same position and size).\n */\nexport function rectEqual(a: Rect | null, b: Rect | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n}\n\n// ============================================================================\n// Interactive State Types\n// ============================================================================\n\n/**\n * Per-node interactive state — written by pointer/selection/focus state machines,\n * read by theme/render for automatic styling.\n *\n * These are plain mutable booleans, NOT reactive signals. State machines set them\n * synchronously during event processing, and the next render reads them.\n * React re-renders are driven by the event processing, not signal subscriptions.\n *\n * The object is lazily created on first write to avoid overhead on non-interactive nodes.\n */\nexport interface InteractiveState {\n /** Pointer is over this node (mouseenter/mouseleave) */\n hovered: boolean\n /** Pointer-down on this node, awaiting pointer-up (will receive click) */\n armed: boolean\n /** Node is in the current selection set */\n selected: boolean\n /** Node has keyboard focus */\n focused: boolean\n /** A drag operation is hovering over this node */\n dropTarget: boolean\n}\n\n// ============================================================================\n// Node Types\n// ============================================================================\n\n/**\n * Silvery node types - the primitive elements in the render tree.\n */\nexport type AgNodeType = \"silvery-root\" | \"silvery-box\" | \"silvery-text\"\n\n/**\n * Flexbox properties that can be applied to Box nodes.\n */\nexport interface FlexboxProps {\n // Size\n width?: number | string\n height?: number | string\n minWidth?: number | string\n minHeight?: number | string\n maxWidth?: number | string\n maxHeight?: number | string\n\n // Flex\n flexGrow?: number\n flexShrink?: number\n flexBasis?: number | string\n flexDirection?: \"row\" | \"column\" | \"row-reverse\" | \"column-reverse\"\n flexWrap?: \"nowrap\" | \"wrap\" | \"wrap-reverse\"\n\n // Alignment\n alignItems?: \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\"\n alignSelf?: \"auto\" | \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\"\n alignContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"stretch\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\n justifyContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\"\n\n // Spacing\n padding?: number\n paddingTop?: number\n paddingBottom?: number\n paddingLeft?: number\n paddingRight?: number\n paddingX?: number\n paddingY?: number\n margin?: number\n marginTop?: number\n marginBottom?: number\n marginLeft?: number\n marginRight?: number\n marginX?: number\n marginY?: number\n gap?: number\n columnGap?: number\n rowGap?: number\n\n // Position\n position?: \"relative\" | \"absolute\" | \"sticky\" | \"static\"\n\n // Position offsets (used with position='absolute' or position='relative')\n top?: number | string\n left?: number | string\n bottom?: number | string\n right?: number | string\n\n // Sticky offsets (only used when position='sticky')\n // The element will \"stick\" when it reaches this offset from the container edge\n stickyTop?: number\n stickyBottom?: number\n\n // Aspect ratio\n aspectRatio?: number\n\n // Display\n display?: \"flex\" | \"none\"\n\n // Overflow\n overflow?: \"visible\" | \"hidden\" | \"scroll\"\n overflowX?: \"visible\" | \"hidden\"\n overflowY?: \"visible\" | \"hidden\"\n\n // Scroll control (only used when overflow='scroll')\n /** Child index to ensure visible (edge-based: only scrolls if off-screen) */\n scrollTo?: number\n /** Explicit scroll offset in rows (used when scrollTo is undefined for frozen scroll state) */\n scrollOffset?: number\n}\n\n/**\n * Props for testing and identification.\n * These props are stored in the node for DOM query access.\n */\nexport interface TestProps {\n /** Element ID for DOM queries and visual debugging */\n id?: string\n /** Test ID for querying nodes (like Playwright's data-testid) */\n testID?: string\n /** Allow arbitrary data-* attributes for testing */\n [key: `data-${string}`]: unknown\n}\n\n/**\n * Underline style variants (SGR 4:x codes).\n * - false: no underline\n * - 'single': standard underline (SGR 4 or 4:1)\n * - 'double': double underline (SGR 4:2)\n * - 'curly': curly/wavy underline (SGR 4:3)\n * - 'dotted': dotted underline (SGR 4:4)\n * - 'dashed': dashed underline (SGR 4:5)\n */\nexport type UnderlineStyle = false | \"single\" | \"double\" | \"curly\" | \"dotted\" | \"dashed\"\n\n/**\n * Style properties for text rendering.\n */\nexport interface StyleProps {\n color?: string\n backgroundColor?: string\n bold?: boolean\n /**\n * @deprecated Use a semantic token instead: `$muted` for captions,\n * `$faint` (via `<Small>`) for fine print, `$disabledfg` for inactive.\n * `dim` is a rendering detail with uneven terminal support; tokens\n * resolve to pre-dimmed hex values at truecolor. Will be removed in the\n * next silvery major. Internal renderer still emits SGR 2 at ANSI 16\n * / mono tiers for tokens that resolve there.\n */\n dim?: boolean\n /**\n * @deprecated Alias for `dim` (Ink compatibility). Migrate to a semantic\n * token instead — `$muted` / `$faint` / `$disabledfg`. Will be removed in\n * the next silvery major.\n */\n dimColor?: boolean\n italic?: boolean\n /** Enable underline. Use underlineStyle for style variants. */\n underline?: boolean\n /**\n * Underline style variant: 'single' | 'double' | 'curly' | 'dotted' | 'dashed'.\n * Setting this implies underline=true. Takes precedence over underline prop.\n */\n underlineStyle?: UnderlineStyle\n /**\n * Underline color (independent of text color).\n * Uses SGR 58 (underline color). Falls back to text color if not specified.\n */\n underlineColor?: string\n strikethrough?: boolean\n inverse?: boolean\n\n /**\n * Text size scale factor via OSC 66 (Kitty v0.40+).\n *\n * Float multiplier: 2.0 = double (headings), 1.0 = normal, 0.5 = half (small print).\n * The terminal renders subsequent text at this scale until reset.\n * Requires a terminal that supports the kitty text sizing protocol.\n * Terminals without support silently ignore the escape sequence.\n */\n textSize?: number\n}\n\n/**\n * Props for Box component.\n */\nexport interface BoxProps\n extends FlexboxProps, StyleProps, TestProps, MouseEventProps, DragEventProps, FocusEventProps {\n /** Text truncation mode for child text content (passed through to Text children). */\n wrap?:\n | \"wrap\"\n | \"hard\"\n | \"even\"\n | \"truncate\"\n | \"truncate-start\"\n | \"truncate-middle\"\n | \"truncate-end\"\n | \"clip\"\n | boolean\n borderStyle?: \"single\" | \"double\" | \"round\" | \"bold\" | \"singleDouble\" | \"doubleSingle\" | \"classic\"\n borderColor?: string\n /** Background color for all border sides (shorthand). Per-side props override this. */\n borderBackgroundColor?: string\n /** Background color for the top border (overrides borderBackgroundColor). */\n borderTopBackgroundColor?: string\n /** Background color for the bottom border (overrides borderBackgroundColor). */\n borderBottomBackgroundColor?: string\n /** Background color for the left border (overrides borderBackgroundColor). */\n borderLeftBackgroundColor?: string\n /** Background color for the right border (overrides borderBackgroundColor). */\n borderRightBackgroundColor?: string\n borderTop?: boolean\n borderBottom?: boolean\n borderLeft?: boolean\n borderRight?: boolean\n\n /**\n * Outline style — renders border characters OUTSIDE the box without affecting layout.\n *\n * Unlike `borderStyle` which adds border dimensions inside the box (shrinking the\n * content area), `outlineStyle` draws one cell beyond each edge — in the gap/margin\n * space between siblings. The layout engine sees no border at all.\n *\n * This matches CSS `outline` semantics: outside the border box, no layout impact.\n *\n * Use cases: focus rings, hover highlights, selection indicators, edit bounds —\n * anything that should visually frame a box without affecting layout or content.\n */\n outlineStyle?:\n | \"single\"\n | \"double\"\n | \"round\"\n | \"bold\"\n | \"singleDouble\"\n | \"doubleSingle\"\n | \"classic\"\n /** Foreground color for the outline */\n outlineColor?: string\n /** Apply dim styling to the outline */\n outlineDimColor?: boolean\n /** Show top outline edge (default: true) */\n outlineTop?: boolean\n /** Show bottom outline edge (default: true) */\n outlineBottom?: boolean\n /** Show left outline edge (default: true) */\n outlineLeft?: boolean\n /** Show right outline edge (default: true) */\n outlineRight?: boolean\n\n /**\n * Override theme for this subtree — $token colors resolve against this theme.\n * Pushed onto the context theme stack during render phase tree walk.\n */\n theme?: import(\"@silvery/ansi\").Theme\n\n /** CSS pointer-events equivalent. \"none\" makes this node and its subtree invisible to hit testing. */\n pointerEvents?: \"auto\" | \"none\"\n\n /**\n * CSS user-select equivalent. Controls whether text in this node is selectable.\n * - \"auto\" (default): inherit from parent. Root resolves to \"text\".\n * - \"none\": not selectable. Mouse-drag on this node does not start text selection.\n * - \"text\": force selectable, even if parent is \"none\".\n * - \"contain\": selectable, but selection range cannot escape this node's bounds.\n */\n userSelect?: UserSelect\n\n /**\n * Whether this node can be dragged via mouse.\n * When true, mousedown + drag past threshold initiates a node drag gesture\n * instead of text selection. Not inherited — only the node with draggable=true\n * is draggable, not its children.\n */\n draggable?: boolean\n\n onLayout?: (layout: Rect) => void\n\n /**\n * Show scroll overflow indicators (▲N / ▼N) for scrollable containers.\n *\n * For bordered containers, indicators appear on the border.\n * For borderless containers, indicators overlay the content at top-right/bottom-right.\n *\n * Only applies when overflow='scroll'.\n */\n overflowIndicator?: boolean\n}\n\n/**\n * Props for Text component.\n */\nexport interface TextProps extends StyleProps, TestProps, MouseEventProps {\n children?: React.ReactNode\n wrap?:\n | \"wrap\"\n | \"hard\"\n | \"even\"\n | \"truncate\"\n | \"truncate-start\"\n | \"truncate-middle\"\n | \"truncate-end\"\n | \"clip\"\n | boolean\n /** Internal transform function applied to each rendered line. Used by Transform component. */\n internal_transform?: (line: string, index: number) => string\n}\n\n/**\n * The core Silvery node - represents an element in the render tree.\n *\n * Each node has:\n * - A Yoga node for layout calculation\n * - Computed layout after Yoga runs\n * - Subscribers that get notified when layout changes\n * - Dirty flags for incremental updates\n */\nexport interface AgNode {\n /** Node type */\n type: AgNodeType\n\n /** Props passed to this node */\n props: BoxProps | TextProps | Record<string, unknown>\n\n /** Child nodes */\n children: AgNode[]\n\n /** Parent node (null for root) */\n parent: AgNode | null\n\n /** The layout node for layout calculation (null for raw text nodes) */\n layoutNode: LayoutNode | null\n\n /** Computed layout from previous render (for change detection) */\n prevLayout: Rect | null\n\n /**\n * Content-relative position (like CSS offsetTop/offsetLeft).\n * Position within the scrollable content, ignoring scroll offsets.\n * Set after layout phase.\n */\n boxRect: Rect | null\n\n /**\n * Screen-relative position (like CSS getBoundingClientRect).\n * Actual position on the terminal screen, accounting for scroll offsets.\n * Set after screen rect phase.\n *\n * Note: For sticky children, this reflects the node's layout position\n * adjusted for scroll offsets, NOT the actual render position. Use\n * `screenRect` for the actual pixel position on screen.\n */\n scrollRect: Rect | null\n\n /** Previous screen rect (for change detection in notifyLayoutSubscribers) */\n prevScrollRect: Rect | null\n\n /**\n * Actual render position on the terminal screen.\n * For non-sticky nodes, this equals `scrollRect`.\n * For sticky nodes (position=\"sticky\"), this accounts for sticky render\n * offsets — the position where pixels are actually painted.\n *\n * Use this for hit testing, cursor positioning, and any feature that\n * needs to know where a node visually appears on screen.\n * Set after screen rect phase.\n */\n screenRect: Rect | null\n\n /** Previous render rect (for change detection) */\n prevScreenRect: Rect | null\n\n /** Epoch when layout changed (position or size).\n * Set by propagateLayout in layout phase. Compared against renderEpoch by render phase.\n * This is the authoritative signal for \"did layout change?\" — unlike\n * !rectEqual(prevLayout, boxRect) which becomes stale when layout\n * phase skips (no dirty nodes).\n * Value: renderEpoch when dirty, INITIAL_EPOCH (-1) when clean. */\n layoutChangedThisFrame: number\n\n /**\n * Bit-packed dirty flags for the current epoch.\n *\n * Seven dirty flags packed into a single number:\n * bit 0 (CONTENT_BIT): content changed (text content or content-affecting props)\n * bit 1 (STYLE_PROPS_BIT): visual props changed (color, bg, border, etc.)\n * bit 2 (BG_BIT): backgroundColor specifically changed\n * bit 3 (CHILDREN_BIT): direct children added/removed/reordered\n * bit 4 (SUBTREE_BIT): this node or any descendant has dirty content/layout\n * bit 5 (ABS_CHILD_BIT): absolute child had structural changes\n * bit 6 (DESC_OVERFLOW_BIT): descendant overflow changed\n *\n * Outlines do NOT get a dirty bit — the decoration phase redraws them\n * every frame with per-cell snapshots (see pipeline/decoration-phase.ts).\n *\n * Check: `isDirty(node.dirtyBits, node.dirtyEpoch, BIT)`\n * Set: `node.dirtyBits = setDirtyBit(node.dirtyBits, node.dirtyEpoch, BIT); node.dirtyEpoch = getRenderEpoch()`\n * Clear: `advanceRenderEpoch()` — all nodes instantly become clean\n *\n * NOTE: measure phase may clear CONTENT_BIT — STYLE_PROPS_BIT acts as the\n * surviving witness for style changes. See render-phase.ts contentAreaAffected.\n */\n dirtyBits: number\n\n /**\n * Epoch when dirtyBits was last written.\n * When `dirtyEpoch !== renderEpoch`, all bits are stale (node is clean).\n * Value: renderEpoch when any bit is dirty, INITIAL_EPOCH (-1) when clean.\n */\n dirtyEpoch: number\n\n /** Text content for text nodes */\n textContent?: string\n\n /** True if this is a raw text node (created by createTextInstance) */\n isRawText?: boolean\n\n /** True if this node is hidden (for Suspense support) */\n hidden?: boolean\n\n /** Sticky children with computed render positions (for non-scroll containers).\n * When a parent has sticky children but is NOT a scroll container, this array\n * holds the computed render offsets. Same shape as scrollState.stickyChildren. */\n stickyChildren?: Array<{\n /** Index of the sticky child */\n index: number\n /** Computed Y offset to render at (relative to parent content area) */\n renderOffset: number\n /** Original natural Y position (relative to parent content area) */\n naturalTop: number\n /** Height of the sticky element */\n height: number\n }>\n\n /** Inline rects for virtual text nodes (no layout node). Computed during text rendering.\n * Array for wrapped text (one rect per line fragment). Enables hit testing on nested Text. */\n inlineRects?: Array<{ x: number; y: number; width: number; height: number }> | null\n\n /**\n * Interactive state signals — written by pointer/selection/focus state machines,\n * read by theme/render for automatic styling (hover highlights, focus rings, etc.).\n *\n * Lazily created on first write. Null means no interactive state has been set.\n * See InteractiveState for field docs.\n */\n interactiveState?: InteractiveState | null\n\n /** Scroll state for overflow='scroll' containers */\n scrollState?: {\n /** Current scroll offset (in terminal rows) */\n offset: number\n /** Previous scroll offset from last render (for incremental rendering) */\n prevOffset: number\n /** Total content height (all children) */\n contentHeight: number\n /** Visible height (container height minus borders/padding) */\n viewportHeight: number\n /** Index of first visible child */\n firstVisibleChild: number\n /** Index of last visible child */\n lastVisibleChild: number\n /** Previous first visible child from last render (for incremental rendering) */\n prevFirstVisibleChild: number\n /** Previous last visible child from last render (for incremental rendering) */\n prevLastVisibleChild: number\n /** Count of items hidden above viewport */\n hiddenAbove: number\n /** Count of items hidden below viewport */\n hiddenBelow: number\n /** Sticky children with their computed render positions */\n stickyChildren?: Array<{\n /** Index of the sticky child */\n index: number\n /** Computed Y offset to render at (relative to viewport, not content) */\n renderOffset: number\n /** Original natural Y position (before sticky adjustment) */\n naturalTop: number\n /** Height of the sticky element */\n height: number\n }>\n }\n}\n\n// ============================================================================\n// Terminal Buffer Types\n// ============================================================================\n\n/**\n * Text attributes that can be applied to a cell.\n */\nexport interface CellAttrs {\n bold?: boolean\n dim?: boolean\n italic?: boolean\n /** Simple underline flag (for backwards compatibility) */\n underline?: boolean\n /**\n * Underline style: 'single' | 'double' | 'curly' | 'dotted' | 'dashed'.\n * When set, takes precedence over the underline boolean.\n */\n underlineStyle?: UnderlineStyle\n strikethrough?: boolean\n inverse?: boolean\n}\n\n/**\n * A single cell in the terminal buffer.\n */\nexport interface Cell {\n /** The character (grapheme cluster) in this cell */\n char: string\n /** Foreground color (ANSI code or RGB) */\n fg: string | null\n /** Background color (ANSI code or RGB) */\n bg: string | null\n /** Text attributes */\n attrs: CellAttrs\n /** True if this is a wide character (CJK) that takes 2 cells */\n wide: boolean\n /** True if this cell is the continuation of a wide character */\n continuation: boolean\n}\n\n/**\n * Interface for the terminal buffer.\n */\nexport interface TerminalBuffer {\n readonly width: number\n readonly height: number\n getCell(x: number, y: number): Cell\n setCell(x: number, y: number, cell: Cell): void\n clear(): void\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/**\n * Keyboard event with key information and modifiers.\n */\nexport interface KeyEvent {\n type: \"key\"\n /** The key pressed (character or key name like 'ArrowUp') */\n key: string\n /** Ctrl modifier was held */\n ctrl?: boolean\n /** Meta/Alt modifier was held */\n meta?: boolean\n /** Shift modifier was held */\n shift?: boolean\n /** Alt/Option modifier was held */\n alt?: boolean\n /** Super/Cmd modifier was held. Requires Kitty protocol. */\n super?: boolean\n /** Hyper modifier was held. Requires Kitty protocol. */\n hyper?: boolean\n /** Kitty event type. Requires Kitty flag 2. */\n eventType?: \"press\" | \"repeat\" | \"release\"\n /** CapsLock is active. Kitty modifier bit 6. */\n capsLock?: boolean\n /** NumLock is active. Kitty modifier bit 7. */\n numLock?: boolean\n}\n\n/**\n * Mouse event with position and button information.\n */\nexport interface MouseEvent {\n type: \"mouse\"\n /** X position in terminal columns (0-indexed) */\n x: number\n /** Y position in terminal rows (0-indexed) */\n y: number\n /** Mouse button (0=left, 1=middle, 2=right) */\n button: number\n /** Event action */\n action: \"down\" | \"up\" | \"move\" | \"wheel\"\n /** Wheel delta for scroll events */\n delta?: number\n}\n\n/**\n * Terminal resize event.\n */\nexport interface ResizeEvent {\n type: \"resize\"\n /** New width in columns */\n width: number\n /** New height in rows */\n height: number\n}\n\n/**\n * Terminal focus event.\n */\nexport interface FocusEvent {\n type: \"focus\"\n}\n\n/**\n * Terminal blur event.\n */\nexport interface BlurEvent {\n type: \"blur\"\n}\n\n/**\n * Signal event (SIGINT, SIGTERM, etc.).\n */\nexport interface SignalEvent {\n type: \"signal\"\n /** Signal name (e.g., 'SIGINT', 'SIGTERM') */\n signal: string\n}\n\n/**\n * Custom event for extensibility.\n */\nexport interface CustomEvent {\n type: \"custom\"\n /** Event name */\n name: string\n /** Event data */\n data: unknown\n}\n\n/**\n * Union of all event types.\n *\n * Events drive the render loop in interactive mode. When events are present,\n * the render loop runs until exit() is called. When events are absent,\n * the render completes when the UI is stable.\n */\nexport type Event =\n | KeyEvent\n | MouseEvent\n | ResizeEvent\n | FocusEvent\n | BlurEvent\n | SignalEvent\n | CustomEvent\n\n/**\n * Event source that can be subscribed to and unsubscribed from.\n */\nexport interface EventSource {\n /** Subscribe to events, returns unsubscribe function */\n subscribe(handler: (event: Event) => void): () => void\n /** Convert to async iterable */\n [Symbol.asyncIterator](): AsyncIterator<Event>\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as useTransition, c as useAnimation, d as easings, f as resolveEasing, i as UseTransitionOptions, l as EasingFn, n as useTimeout, o as UseAnimationOptions, r as useInterval, s as UseAnimationResult, t as useLatest, u as EasingName } from "../useLatest-6xqnGIU6.mjs";
1
+ import { a as useTransition, c as useAnimation, d as easings, f as resolveEasing, i as UseTransitionOptions, l as EasingFn, n as useTimeout, o as UseAnimationOptions, r as useInterval, s as UseAnimationResult, t as useLatest, u as EasingName } from "../useLatest-Bg2x4bfP.mjs";
2
2
  export { EasingFn, EasingName, UseAnimationOptions, UseAnimationResult, UseTransitionOptions, easings, resolveEasing, useTransition as useAnimatedTransition, useAnimation, useInterval, useLatest, useTimeout };
@@ -1,2 +1,2 @@
1
- import { a as useAnimation, i as useTransition, n as useTimeout, o as easings, r as useInterval, s as resolveEasing, t as useLatest } from "../animation-DhINOJk8.mjs";
1
+ import { a as useAnimation, i as useTransition, n as useTimeout, o as easings, r as useInterval, s as resolveEasing, t as useLatest } from "../animation-Cn64yepo.mjs";
2
2
  export { easings, resolveEasing, useTransition as useAnimatedTransition, useAnimation, useInterval, useLatest, useTimeout };
@@ -1,2 +1,2 @@
1
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-CsjnZtAw.mjs";
1
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-Cc33mW54.mjs";
2
2
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
package/dist/ui/ansi.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-C6Qs1Wn2.mjs";
1
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-CLOitHKx.mjs";
2
2
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
package/dist/ui/cli.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "../spinner-BRkaJI0N.mjs";
2
- import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DQ-uUzLf.mjs";
3
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-CsjnZtAw.mjs";
1
+ import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "../spinner-CGo34vyR.mjs";
2
+ import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DAQC7eap.mjs";
3
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-Cc33mW54.mjs";
4
4
  import { ColorizeHelpOptions, colorizeHelp } from "@silvery/commander";
5
5
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, CallableSpinner, type ColorizeHelpOptions, MultiProgress, ProgressBar, SPINNER_FRAMES, Spinner, TaskHandle, colorizeHelp, createSpinner, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
package/dist/ui/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "../spinner-BmldKx0M.mjs";
2
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-C6Qs1Wn2.mjs";
3
- import { t as ProgressBar } from "../progress-bar-IrUjkLfU.mjs";
4
- import { t as MultiProgress } from "../multi-progress-CcdqJFlf.mjs";
5
- import "../cli-GwJ0S2In.mjs";
1
+ import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "../spinner-CeOmcuw_.mjs";
2
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "../ansi-CLOitHKx.mjs";
3
+ import { t as ProgressBar } from "../progress-bar-CXE5Qfkd.mjs";
4
+ import { t as MultiProgress } from "../multi-progress-Bq9Oi_WI.mjs";
5
+ import "../cli-BKp0YtBD.mjs";
6
6
  import { colorizeHelp } from "@silvery/commander";
7
7
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, MultiProgress, ProgressBar, SPINNER_FRAMES, Spinner, colorizeHelp, createSpinner, cursorDown, cursorUp, getTerminalWidth, isTTY, withCursor, write, writeLine };
@@ -1,4 +1,4 @@
1
- import { f as TableColumn, p as TableProps } from "../types-B4A8Ebba.mjs";
1
+ import { f as TableColumn, p as TableProps } from "../types-BH_v3iMT.mjs";
2
2
  import React from "react";
3
3
 
4
4
  //#region packages/ag-react/src/ui/display/Table.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"display.mjs","names":[],"sources":["../../packages/ag-react/src/ui/display/Table.tsx"],"sourcesContent":["/**\n * React Table component for silvery/Ink TUI apps\n */\n\nimport React from \"react\"\nimport type { TableProps, TableColumn } from \"../types.js\"\n\n/**\n * Unicode box drawing characters for borders\n */\nconst BOX = {\n topLeft: \"┌\",\n topRight: \"┐\",\n bottomLeft: \"└\",\n bottomRight: \"┘\",\n horizontal: \"─\",\n vertical: \"│\",\n leftT: \"├\",\n rightT: \"┤\",\n topT: \"┬\",\n bottomT: \"┴\",\n cross: \"┼\",\n} as const\n\n/**\n * Data grid display component for React TUI apps\n *\n * @example\n * ```tsx\n * import { Table } from \"./index\";\n *\n * const columns = [\n * { key: \"name\", header: \"Name\", width: 20 },\n * { key: \"status\", header: \"Status\", width: 10, align: \"center\" },\n * { key: \"count\", header: \"Count\", width: 8, align: \"right\" },\n * ];\n *\n * const data = [\n * { name: \"Item 1\", status: \"active\", count: 42 },\n * { name: \"Item 2\", status: \"pending\", count: 7 },\n * ];\n *\n * function DataView() {\n * return <Table columns={columns} data={data} border />;\n * }\n * ```\n */\nexport function Table({ columns, data, border = false }: TableProps): React.ReactElement {\n // Calculate effective column widths\n const effectiveColumns = calculateColumnWidths(columns, data)\n\n const lines: string[] = []\n\n if (border) {\n // Top border\n lines.push(buildBorderLine(effectiveColumns, \"top\"))\n }\n\n // Header row\n lines.push(buildDataRow(effectiveColumns, getHeaderRow(effectiveColumns), border))\n\n if (border) {\n // Separator after header\n lines.push(buildBorderLine(effectiveColumns, \"middle\"))\n }\n\n // Data rows\n for (const row of data) {\n lines.push(buildDataRow(effectiveColumns, row, border))\n }\n\n if (border) {\n // Bottom border\n lines.push(buildBorderLine(effectiveColumns, \"bottom\"))\n }\n\n return (\n <span data-table data-border={border}>\n {lines.join(\"\\n\")}\n </span>\n )\n}\n\n/**\n * Calculate effective column widths based on content if not specified\n */\nfunction calculateColumnWidths(\n columns: TableColumn[],\n data: Array<Record<string, unknown>>,\n): Array<TableColumn & { effectiveWidth: number }> {\n return columns.map((col) => {\n if (col.width !== undefined) {\n return { ...col, effectiveWidth: col.width }\n }\n\n // Calculate width from content\n let maxWidth = col.header.length\n\n for (const row of data) {\n const value = String(row[col.key] ?? \"\")\n maxWidth = Math.max(maxWidth, value.length)\n }\n\n return { ...col, effectiveWidth: maxWidth }\n })\n}\n\n/**\n * Create header row object from columns\n */\nfunction getHeaderRow(columns: Array<TableColumn & { effectiveWidth: number }>): Record<string, unknown> {\n const row: Record<string, unknown> = {}\n for (const col of columns) {\n row[col.key] = col.header\n }\n return row\n}\n\n/**\n * Build a border line (top, middle, or bottom)\n */\nfunction buildBorderLine(\n columns: Array<TableColumn & { effectiveWidth: number }>,\n position: \"top\" | \"middle\" | \"bottom\",\n): string {\n const left = position === \"top\" ? BOX.topLeft : position === \"bottom\" ? BOX.bottomLeft : BOX.leftT\n const right = position === \"top\" ? BOX.topRight : position === \"bottom\" ? BOX.bottomRight : BOX.rightT\n const join = position === \"top\" ? BOX.topT : position === \"bottom\" ? BOX.bottomT : BOX.cross\n\n const segments = columns.map((col) => BOX.horizontal.repeat(col.effectiveWidth + 2))\n\n return left + segments.join(join) + right\n}\n\n/**\n * Build a data row (header or content)\n */\nfunction buildDataRow(\n columns: Array<TableColumn & { effectiveWidth: number }>,\n row: Record<string, unknown>,\n border: boolean,\n): string {\n const cells = columns.map((col) => {\n const value = String(row[col.key] ?? \"\")\n return formatCell(value, col.effectiveWidth, col.align ?? \"left\")\n })\n\n if (border) {\n return BOX.vertical + \" \" + cells.join(\" \" + BOX.vertical + \" \") + \" \" + BOX.vertical\n }\n\n return cells.join(\" \")\n}\n\n/**\n * Format a cell value with alignment and truncation\n */\nfunction formatCell(value: string, width: number, align: \"left\" | \"center\" | \"right\"): string {\n // Truncate if too long\n if (value.length > width) {\n return value.slice(0, width - 1) + \"…\"\n }\n\n // Pad according to alignment\n const padding = width - value.length\n\n switch (align) {\n case \"right\":\n return \" \".repeat(padding) + value\n case \"center\": {\n const leftPad = Math.floor(padding / 2)\n const rightPad = padding - leftPad\n return \" \".repeat(leftPad) + value + \" \".repeat(rightPad)\n }\n case \"left\":\n default:\n return value + \" \".repeat(padding)\n }\n}\n"],"mappings":";;;;;;AAUA,MAAM,MAAM;CACV,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,UAAU;CACV,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,MAAM,EAAE,SAAS,MAAM,SAAS,SAAyC;CAEvF,MAAM,mBAAmB,sBAAsB,SAAS,KAAK;CAE7D,MAAM,QAAkB,EAAE;AAE1B,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,MAAM,CAAC;AAItD,OAAM,KAAK,aAAa,kBAAkB,aAAa,iBAAiB,EAAE,OAAO,CAAC;AAElF,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,SAAS,CAAC;AAIzD,MAAK,MAAM,OAAO,KAChB,OAAM,KAAK,aAAa,kBAAkB,KAAK,OAAO,CAAC;AAGzD,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,SAAS,CAAC;AAGzD,QACE,oBAAC,QAAD;EAAM,cAAA;EAAW,eAAa;YAC3B,MAAM,KAAK,KAAK;EACZ,CAAA;;;;;AAOX,SAAS,sBACP,SACA,MACiD;AACjD,QAAO,QAAQ,KAAK,QAAQ;AAC1B,MAAI,IAAI,UAAU,KAAA,EAChB,QAAO;GAAE,GAAG;GAAK,gBAAgB,IAAI;GAAO;EAI9C,IAAI,WAAW,IAAI,OAAO;AAE1B,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,QAAQ,OAAO,IAAI,IAAI,QAAQ,GAAG;AACxC,cAAW,KAAK,IAAI,UAAU,MAAM,OAAO;;AAG7C,SAAO;GAAE,GAAG;GAAK,gBAAgB;GAAU;GAC3C;;;;;AAMJ,SAAS,aAAa,SAAmF;CACvG,MAAM,MAA+B,EAAE;AACvC,MAAK,MAAM,OAAO,QAChB,KAAI,IAAI,OAAO,IAAI;AAErB,QAAO;;;;;AAMT,SAAS,gBACP,SACA,UACQ;CACR,MAAM,OAAO,aAAa,QAAQ,IAAI,UAAU,aAAa,WAAW,IAAI,aAAa,IAAI;CAC7F,MAAM,QAAQ,aAAa,QAAQ,IAAI,WAAW,aAAa,WAAW,IAAI,cAAc,IAAI;CAChG,MAAM,OAAO,aAAa,QAAQ,IAAI,OAAO,aAAa,WAAW,IAAI,UAAU,IAAI;AAIvF,QAAO,OAFU,QAAQ,KAAK,QAAQ,IAAI,WAAW,OAAO,IAAI,iBAAiB,EAAE,CAAC,CAE7D,KAAK,KAAK,GAAG;;;;;AAMtC,SAAS,aACP,SACA,KACA,QACQ;CACR,MAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEjC,SAAO,WADO,OAAO,IAAI,IAAI,QAAQ,GAAG,EACf,IAAI,gBAAgB,IAAI,SAAS,OAAO;GACjE;AAEF,KAAI,OACF,QAAO,IAAI,WAAW,MAAM,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI,GAAG,MAAM,IAAI;AAG/E,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAS,WAAW,OAAe,OAAe,OAA4C;AAE5F,KAAI,MAAM,SAAS,MACjB,QAAO,MAAM,MAAM,GAAG,QAAQ,EAAE,GAAG;CAIrC,MAAM,UAAU,QAAQ,MAAM;AAE9B,SAAQ,OAAR;EACE,KAAK,QACH,QAAO,IAAI,OAAO,QAAQ,GAAG;EAC/B,KAAK,UAAU;GACb,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;GACvC,MAAM,WAAW,UAAU;AAC3B,UAAO,IAAI,OAAO,QAAQ,GAAG,QAAQ,IAAI,OAAO,SAAS;;EAG3D,QACE,QAAO,QAAQ,IAAI,OAAO,QAAQ"}
1
+ {"version":3,"file":"display.mjs","names":[],"sources":["../../packages/ag-react/src/ui/display/Table.tsx"],"sourcesContent":["/**\n * React Table component for silvery/Ink TUI apps\n */\n\nimport React from \"react\"\nimport type { TableProps, TableColumn } from \"../types.js\"\n\n/**\n * Unicode box drawing characters for borders\n */\nconst BOX = {\n topLeft: \"┌\",\n topRight: \"┐\",\n bottomLeft: \"└\",\n bottomRight: \"┘\",\n horizontal: \"─\",\n vertical: \"│\",\n leftT: \"├\",\n rightT: \"┤\",\n topT: \"┬\",\n bottomT: \"┴\",\n cross: \"┼\",\n} as const\n\n/**\n * Data grid display component for React TUI apps\n *\n * @example\n * ```tsx\n * import { Table } from \"./index\";\n *\n * const columns = [\n * { key: \"name\", header: \"Name\", width: 20 },\n * { key: \"status\", header: \"Status\", width: 10, align: \"center\" },\n * { key: \"count\", header: \"Count\", width: 8, align: \"right\" },\n * ];\n *\n * const data = [\n * { name: \"Item 1\", status: \"active\", count: 42 },\n * { name: \"Item 2\", status: \"pending\", count: 7 },\n * ];\n *\n * function DataView() {\n * return <Table columns={columns} data={data} border />;\n * }\n * ```\n */\nexport function Table({ columns, data, border = false }: TableProps): React.ReactElement {\n // Calculate effective column widths\n const effectiveColumns = calculateColumnWidths(columns, data)\n\n const lines: string[] = []\n\n if (border) {\n // Top border\n lines.push(buildBorderLine(effectiveColumns, \"top\"))\n }\n\n // Header row\n lines.push(buildDataRow(effectiveColumns, getHeaderRow(effectiveColumns), border))\n\n if (border) {\n // Separator after header\n lines.push(buildBorderLine(effectiveColumns, \"middle\"))\n }\n\n // Data rows\n for (const row of data) {\n lines.push(buildDataRow(effectiveColumns, row, border))\n }\n\n if (border) {\n // Bottom border\n lines.push(buildBorderLine(effectiveColumns, \"bottom\"))\n }\n\n return (\n <span data-table data-border={border}>\n {lines.join(\"\\n\")}\n </span>\n )\n}\n\n/**\n * Calculate effective column widths based on content if not specified\n */\nfunction calculateColumnWidths(\n columns: TableColumn[],\n data: Array<Record<string, unknown>>,\n): Array<TableColumn & { effectiveWidth: number }> {\n return columns.map((col) => {\n if (col.width !== undefined) {\n return { ...col, effectiveWidth: col.width }\n }\n\n // Calculate width from content\n let maxWidth = col.header.length\n\n for (const row of data) {\n const value = String(row[col.key] ?? \"\")\n maxWidth = Math.max(maxWidth, value.length)\n }\n\n return { ...col, effectiveWidth: maxWidth }\n })\n}\n\n/**\n * Create header row object from columns\n */\nfunction getHeaderRow(\n columns: Array<TableColumn & { effectiveWidth: number }>,\n): Record<string, unknown> {\n const row: Record<string, unknown> = {}\n for (const col of columns) {\n row[col.key] = col.header\n }\n return row\n}\n\n/**\n * Build a border line (top, middle, or bottom)\n */\nfunction buildBorderLine(\n columns: Array<TableColumn & { effectiveWidth: number }>,\n position: \"top\" | \"middle\" | \"bottom\",\n): string {\n const left = position === \"top\" ? BOX.topLeft : position === \"bottom\" ? BOX.bottomLeft : BOX.leftT\n const right =\n position === \"top\" ? BOX.topRight : position === \"bottom\" ? BOX.bottomRight : BOX.rightT\n const join = position === \"top\" ? BOX.topT : position === \"bottom\" ? BOX.bottomT : BOX.cross\n\n const segments = columns.map((col) => BOX.horizontal.repeat(col.effectiveWidth + 2))\n\n return left + segments.join(join) + right\n}\n\n/**\n * Build a data row (header or content)\n */\nfunction buildDataRow(\n columns: Array<TableColumn & { effectiveWidth: number }>,\n row: Record<string, unknown>,\n border: boolean,\n): string {\n const cells = columns.map((col) => {\n const value = String(row[col.key] ?? \"\")\n return formatCell(value, col.effectiveWidth, col.align ?? \"left\")\n })\n\n if (border) {\n return BOX.vertical + \" \" + cells.join(\" \" + BOX.vertical + \" \") + \" \" + BOX.vertical\n }\n\n return cells.join(\" \")\n}\n\n/**\n * Format a cell value with alignment and truncation\n */\nfunction formatCell(value: string, width: number, align: \"left\" | \"center\" | \"right\"): string {\n // Truncate if too long\n if (value.length > width) {\n return value.slice(0, width - 1) + \"…\"\n }\n\n // Pad according to alignment\n const padding = width - value.length\n\n switch (align) {\n case \"right\":\n return \" \".repeat(padding) + value\n case \"center\": {\n const leftPad = Math.floor(padding / 2)\n const rightPad = padding - leftPad\n return \" \".repeat(leftPad) + value + \" \".repeat(rightPad)\n }\n case \"left\":\n default:\n return value + \" \".repeat(padding)\n }\n}\n"],"mappings":";;;;;;AAUA,MAAM,MAAM;CACV,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,UAAU;CACV,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,OAAO;CACR;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,MAAM,EAAE,SAAS,MAAM,SAAS,SAAyC;CAEvF,MAAM,mBAAmB,sBAAsB,SAAS,KAAK;CAE7D,MAAM,QAAkB,EAAE;AAE1B,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,MAAM,CAAC;AAItD,OAAM,KAAK,aAAa,kBAAkB,aAAa,iBAAiB,EAAE,OAAO,CAAC;AAElF,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,SAAS,CAAC;AAIzD,MAAK,MAAM,OAAO,KAChB,OAAM,KAAK,aAAa,kBAAkB,KAAK,OAAO,CAAC;AAGzD,KAAI,OAEF,OAAM,KAAK,gBAAgB,kBAAkB,SAAS,CAAC;AAGzD,QACE,oBAAC,QAAD;EAAM,cAAA;EAAW,eAAa;YAC3B,MAAM,KAAK,KAAK;EACZ,CAAA;;;;;AAOX,SAAS,sBACP,SACA,MACiD;AACjD,QAAO,QAAQ,KAAK,QAAQ;AAC1B,MAAI,IAAI,UAAU,KAAA,EAChB,QAAO;GAAE,GAAG;GAAK,gBAAgB,IAAI;GAAO;EAI9C,IAAI,WAAW,IAAI,OAAO;AAE1B,OAAK,MAAM,OAAO,MAAM;GACtB,MAAM,QAAQ,OAAO,IAAI,IAAI,QAAQ,GAAG;AACxC,cAAW,KAAK,IAAI,UAAU,MAAM,OAAO;;AAG7C,SAAO;GAAE,GAAG;GAAK,gBAAgB;GAAU;GAC3C;;;;;AAMJ,SAAS,aACP,SACyB;CACzB,MAAM,MAA+B,EAAE;AACvC,MAAK,MAAM,OAAO,QAChB,KAAI,IAAI,OAAO,IAAI;AAErB,QAAO;;;;;AAMT,SAAS,gBACP,SACA,UACQ;CACR,MAAM,OAAO,aAAa,QAAQ,IAAI,UAAU,aAAa,WAAW,IAAI,aAAa,IAAI;CAC7F,MAAM,QACJ,aAAa,QAAQ,IAAI,WAAW,aAAa,WAAW,IAAI,cAAc,IAAI;CACpF,MAAM,OAAO,aAAa,QAAQ,IAAI,OAAO,aAAa,WAAW,IAAI,UAAU,IAAI;AAIvF,QAAO,OAFU,QAAQ,KAAK,QAAQ,IAAI,WAAW,OAAO,IAAI,iBAAiB,EAAE,CAAC,CAE7D,KAAK,KAAK,GAAG;;;;;AAMtC,SAAS,aACP,SACA,KACA,QACQ;CACR,MAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEjC,SAAO,WADO,OAAO,IAAI,IAAI,QAAQ,GAAG,EACf,IAAI,gBAAgB,IAAI,SAAS,OAAO;GACjE;AAEF,KAAI,OACF,QAAO,IAAI,WAAW,MAAM,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI,GAAG,MAAM,IAAI;AAG/E,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAS,WAAW,OAAe,OAAe,OAA4C;AAE5F,KAAI,MAAM,SAAS,MACjB,QAAO,MAAM,MAAM,GAAG,QAAQ,EAAE,GAAG;CAIrC,MAAM,UAAU,QAAQ,MAAM;AAE9B,SAAQ,OAAR;EACE,KAAK,QACH,QAAO,IAAI,OAAO,QAAQ,GAAG;EAC/B,KAAK,UAAU;GACb,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;GACvC,MAAM,WAAW,UAAU;AAC3B,UAAO,IAAI,OAAO,QAAQ,GAAG,QAAQ,IAAI,OAAO,SAAS;;EAG3D,QACE,QAAO,QAAQ,IAAI,OAAO,QAAQ"}
@@ -1,2 +1,2 @@
1
- import { a as isSixelSupported, c as encodeKittyImage, i as encodeSixel, l as isKittyGraphicsSupported, n as ImageProps, o as KittyImageOptions, r as SixelImageData, s as deleteKittyImage, t as Image } from "../index-C4vrhbud.mjs";
1
+ import { a as isSixelSupported, c as encodeKittyImage, i as encodeSixel, l as isKittyGraphicsSupported, n as ImageProps, o as KittyImageOptions, r as SixelImageData, s as deleteKittyImage, t as Image } from "../index-BnA7mNpo.mjs";
2
2
  export { Image, ImageProps, KittyImageOptions, SixelImageData, deleteKittyImage, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported };
package/dist/ui/image.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as encodeKittyImage, i as deleteKittyImage, n as encodeSixel, o as isKittyGraphicsSupported, r as isSixelSupported, t as Image } from "../image-B0zMbVUr.mjs";
1
+ import { a as encodeKittyImage, i as deleteKittyImage, n as encodeSixel, o as isKittyGraphicsSupported, r as isSixelSupported, t as Image } from "../image-CTII5QWI.mjs";
2
2
  export { Image, deleteKittyImage, encodeKittyImage, encodeSixel, isKittyGraphicsSupported, isSixelSupported };
@@ -1,4 +1,4 @@
1
- import { _ as TextInputOptions, o as SelectOption, s as SelectProps, v as TextInputProps } from "../types-B4A8Ebba.mjs";
1
+ import { _ as TextInputOptions, o as SelectOption, s as SelectProps, v as TextInputProps } from "../types-BH_v3iMT.mjs";
2
2
  import React from "react";
3
3
 
4
4
  //#region packages/ag-react/src/ui/input/TextInput.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4CgB,SAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,WAAA;EACA,IAAA;EACA,YAAA;EACA,cAAA;EACA,QAAA;EACA,cAAA;EACA;AAAA,GACC,cAAA,GAAiB,KAAA,CAAM,YAAA;AA2D1B;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAgB,YAAA,CACd,OAAA;EACE,YAAA;EACA,IAAA;EACA,YAAA;EACA,QAAA,IAAY,KAAA;AAAA;EAGd,KAAA;EACA,QAAA,GAAW,KAAA;EACX,YAAA;EACA,UAAA;EACA,cAAA;EACA,iBAAA,GAAoB,GAAA;EACpB,WAAA,GAAc,KAAA,UAAe,GAAA,EAAK,QAAA;EAClC,gBAAA;EACA,KAAA;AAAA;;UA2EQ,QAAA;EACR,MAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,GAAA;EACA,MAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCxLc,MAAA,GAAA,CAAA;EACd,OAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,cAAA,EAAgB,wBAAA;EAChB;AAAA,GACC,WAAA,CAAY,CAAA,IAAK,KAAA,CAAM,YAAA;;;;;;;;;;;;ADyE1B;;;;;;;;;;;;;;;iBCJgB,SAAA,GAAA,CAAA;EACd,OAAA;EACA,YAAA;EACA;AAAA;EAEA,OAAA,EAAS,YAAA,CAAa,CAAA;EACtB,YAAA,GAAe,CAAA;EACf,QAAA,IAAY,KAAA,EAAO,CAAA;AAAA;EAEnB,KAAA,EAAO,CAAA;EACP,cAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA;EACA,iBAAA,GAAoB,KAAA;AAAA"}
1
+ {"version":3,"file":"input.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4CgB,SAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,WAAA;EACA,IAAA;EACA,YAAA;EACA,cAAA;EACA,QAAA;EACA,cAAA;EACA;AAAA,GACC,cAAA,GAAiB,KAAA,CAAM,YAAA;AA2D1B;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAgB,YAAA,CACd,OAAA;EACE,YAAA;EACA,IAAA;EACA,YAAA;EACA,QAAA,IAAY,KAAA;AAAA;EAGd,KAAA;EACA,QAAA,GAAW,KAAA;EACX,YAAA;EACA,UAAA;EACA,cAAA;EACA,iBAAA,GAAoB,GAAA;EACpB,WAAA,GAAc,KAAA,UAAe,GAAA,EAAK,QAAA;EAClC,gBAAA;EACA,KAAA;AAAA;;UA2EQ,QAAA;EACR,MAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,GAAA;EACA,MAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCxLc,MAAA,GAAA,CAAA;EACd,OAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,cAAA,EAAgB,wBAAA;EAChB;AAAA,GACC,WAAA,CAAY,CAAA,IAAK,KAAA,CAAM,YAAA;;;;;;;;;;;;ADyE1B;;;;;;;;;;;;;;;iBCMgB,SAAA,GAAA,CAAA;EACd,OAAA;EACA,YAAA;EACA;AAAA;EAEA,OAAA,EAAS,YAAA,CAAa,CAAA;EACtB,YAAA,GAAe,CAAA;EACf,QAAA,IAAY,KAAA,EAAO,CAAA;AAAA;EAEnB,KAAA,EAAO,CAAA;EACP,cAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA;EACA,iBAAA,GAAoB,KAAA;AAAA"}
package/dist/ui/input.mjs CHANGED
@@ -48,11 +48,10 @@ function TextInput({ value, onChange, placeholder, mask, autocomplete, onAutocom
48
48
  const beforeCursor = displayValue.slice(0, cursor);
49
49
  const afterCursor = displayValue.slice(cursor);
50
50
  const suggestionSuffix = suggestion ? suggestion.slice(value.length) : "";
51
- const showPlaceholder = !value && placeholder;
52
51
  return /* @__PURE__ */ jsx("span", {
53
52
  "data-silvery-ui-text-input": true,
54
53
  "data-focused": focused,
55
- children: showPlaceholder ? /* @__PURE__ */ jsx("span", {
54
+ children: !value && placeholder ? /* @__PURE__ */ jsx("span", {
56
55
  "data-color": "dim",
57
56
  children: placeholder
58
57
  }) : /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -205,11 +204,10 @@ function Select({ options, value, onChange, maxVisible = 10, highlightIndex: con
205
204
  visibleOptions.map((option, visibleIdx) => {
206
205
  const actualIndex = scrollOffset + visibleIdx;
207
206
  const isSelected = option.value === value;
208
- const isHighlighted = actualIndex === highlightIndex;
209
207
  return /* @__PURE__ */ jsxs("div", {
210
208
  "data-silvery-select-option": true,
211
209
  "data-selected": isSelected,
212
- "data-highlighted": isHighlighted,
210
+ "data-highlighted": actualIndex === highlightIndex,
213
211
  children: [/* @__PURE__ */ jsx("span", {
214
212
  "data-silvery-select-indicator": true,
215
213
  children: isSelected ? ">" : " "
@@ -1 +1 @@
1
- {"version":3,"file":"input.mjs","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"sourcesContent":["/**\n * React TextInput component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useCallback } from \"react\"\nimport type { TextInputProps } from \"../types.js\"\n\n/**\n * Single-line text input component for React TUI apps\n *\n * This is a controlled component that renders the current input state.\n * It does NOT handle keyboard input directly - that's the caller's responsibility\n * (via useInput hook in Ink, or similar).\n *\n * @example\n * ```tsx\n * import { TextInput } from \"./index\";\n * import { useInput } from \"ink\";\n *\n * function MyForm() {\n * const [value, setValue] = useState(\"\");\n *\n * useInput((input, key) => {\n * if (key.backspace || key.delete) {\n * setValue(v => v.slice(0, -1));\n * } else if (!key.ctrl && !key.meta && input) {\n * setValue(v => v + input);\n * }\n * });\n *\n * return <TextInput value={value} onChange={setValue} placeholder=\"Type here...\" />;\n * }\n *\n * // With password masking\n * <TextInput value={password} onChange={setPassword} mask=\"*\" />\n *\n * // With autocomplete\n * <TextInput\n * value={query}\n * onChange={setQuery}\n * autocomplete={[\"apple\", \"apricot\", \"avocado\"]}\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n placeholder,\n mask,\n autocomplete,\n onAutocomplete,\n onSubmit,\n cursorPosition,\n focused = true,\n}: TextInputProps): React.ReactElement {\n // Calculate display value (masked or plain)\n const displayValue = mask ? mask.repeat(value.length) : value\n\n // Find matching autocomplete suggestion\n const suggestion = getAutocompleteSuggestion(value, autocomplete)\n\n // Cursor position defaults to end of input\n const cursor = cursorPosition ?? value.length\n\n // Build the display: value + cursor + suggestion suffix\n const beforeCursor = displayValue.slice(0, cursor)\n const afterCursor = displayValue.slice(cursor)\n const suggestionSuffix = suggestion ? suggestion.slice(value.length) : \"\"\n\n // Show placeholder if empty and not focused or no value\n const showPlaceholder = !value && placeholder\n\n return (\n <span data-silvery-ui-text-input data-focused={focused}>\n {showPlaceholder ? (\n <span data-color=\"dim\">{placeholder}</span>\n ) : (\n <>\n <span>{beforeCursor}</span>\n {focused && (\n <span data-cursor data-inverse>\n {afterCursor[0] || \" \"}\n </span>\n )}\n <span>{afterCursor.slice(1)}</span>\n {suggestionSuffix && <span data-color=\"dim\">{suggestionSuffix}</span>}\n </>\n )}\n </span>\n )\n}\n\n/**\n * Hook for managing text input state with autocomplete support\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const { value, displayValue, suggestion, handleInput, acceptSuggestion, clear } =\n * useTextInput({ autocomplete: [\"apple\", \"banana\", \"cherry\"] });\n *\n * useInput((input, key) => {\n * if (key.tab && suggestion) {\n * acceptSuggestion();\n * } else {\n * handleInput(input, key);\n * }\n * });\n *\n * return <Text>{displayValue}</Text>;\n * }\n * ```\n */\nexport function useTextInput(\n options: {\n initialValue?: string\n mask?: string\n autocomplete?: string[]\n onSubmit?: (value: string) => void\n } = {},\n): {\n value: string\n setValue: (value: string) => void\n displayValue: string\n suggestion: string | undefined\n cursorPosition: number\n setCursorPosition: (pos: number) => void\n handleInput: (input: string, key: InputKey) => void\n acceptSuggestion: () => void\n clear: () => void\n} {\n const [value, setValue] = useState(options.initialValue ?? \"\")\n const [cursorPosition, setCursorPosition] = useState(value.length)\n\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n\n const handleInput = useCallback(\n (input: string, key: InputKey) => {\n if (key.return) {\n options.onSubmit?.(value)\n return\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n setValue((v) => v.slice(0, cursorPosition - 1) + v.slice(cursorPosition))\n setCursorPosition((p) => Math.max(0, p - 1))\n }\n return\n }\n\n if (key.leftArrow) {\n setCursorPosition((p) => Math.max(0, p - 1))\n return\n }\n\n if (key.rightArrow) {\n setCursorPosition((p) => Math.min(value.length, p + 1))\n return\n }\n\n // Ignore control characters (but allow opt+key composed chars via key.text)\n if (key.ctrl || !input) {\n return\n }\n\n // Insert the actual typed character (pre-normalization), not the keybinding key.\n // E.g., Shift+3 should insert '#', not '3'.\n const char = key.text ?? input\n if (key.meta && !char) return // opt+key with no text output\n setValue((v) => v.slice(0, cursorPosition) + char + v.slice(cursorPosition))\n setCursorPosition((p) => p + char.length)\n },\n [value, cursorPosition, options.onSubmit],\n )\n\n const acceptSuggestion = useCallback(() => {\n if (suggestion) {\n setValue(suggestion)\n setCursorPosition(suggestion.length)\n }\n }, [suggestion])\n\n const clear = useCallback(() => {\n setValue(\"\")\n setCursorPosition(0)\n }, [])\n\n return {\n value,\n setValue,\n displayValue,\n suggestion,\n cursorPosition,\n setCursorPosition,\n handleInput,\n acceptSuggestion,\n clear,\n }\n}\n\n/** Key object type (matches Ink's Key interface) */\ninterface InputKey {\n return?: boolean\n backspace?: boolean\n delete?: boolean\n leftArrow?: boolean\n rightArrow?: boolean\n upArrow?: boolean\n downArrow?: boolean\n tab?: boolean\n escape?: boolean\n ctrl?: boolean\n meta?: boolean\n shift?: boolean\n text?: string\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find((item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length)\n}\n","/**\n * React Select component for silvery/Ink TUI apps\n *\n * Single-choice selection list with keyboard navigation.\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport type { SelectProps, SelectOption } from \"../types.js\"\n\n/**\n * Scrollable single-choice selection list\n *\n * @example\n * ```tsx\n * import { Select } from \"./index\";\n *\n * function SettingsView() {\n * const [theme, setTheme] = useState(\"light\");\n *\n * return (\n * <Select\n * options={[\n * { label: \"Light\", value: \"light\" },\n * { label: \"Dark\", value: \"dark\" },\n * { label: \"System\", value: \"system\" },\n * ]}\n * value={theme}\n * onChange={setTheme}\n * />\n * );\n * }\n * ```\n */\nexport function Select<T>({\n options,\n value,\n onChange,\n maxVisible = 10,\n highlightIndex: controlledHighlightIndex,\n onHighlightChange,\n}: SelectProps<T>): React.ReactElement {\n // Find the index of the currently selected value\n const selectedIndex = options.findIndex((opt) => opt.value === value)\n\n // Internal highlight state (for uncontrolled mode)\n const [internalHighlightIndex, setInternalHighlightIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0)\n\n // Use controlled or internal highlight index\n const highlightIndex = controlledHighlightIndex ?? internalHighlightIndex\n\n // Calculate scroll window\n const scrollOffset = Math.max(0, Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible))\n const visibleOptions = options.slice(scrollOffset, scrollOffset + maxVisible)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + maxVisible < options.length\n\n // Sync internal highlight when value changes externally\n useEffect(() => {\n if (controlledHighlightIndex === undefined && selectedIndex >= 0) {\n setInternalHighlightIndex(selectedIndex)\n }\n }, [selectedIndex, controlledHighlightIndex])\n\n return (\n <div data-silvery-select>\n {hasMoreAbove && <div data-silvery-select-scroll-indicator=\"up\">...</div>}\n {visibleOptions.map((option, visibleIdx) => {\n const actualIndex = scrollOffset + visibleIdx\n const isSelected = option.value === value\n const isHighlighted = actualIndex === highlightIndex\n\n return (\n <div key={actualIndex} data-silvery-select-option data-selected={isSelected} data-highlighted={isHighlighted}>\n <span data-silvery-select-indicator>{isSelected ? \">\" : \" \"}</span>\n <span data-silvery-select-label>{option.label}</span>\n </div>\n )\n })}\n {hasMoreBelow && <div data-silvery-select-scroll-indicator=\"down\">...</div>}\n </div>\n )\n}\n\n/**\n * Hook for managing select state with keyboard navigation\n *\n * @example\n * ```tsx\n * function MySelect() {\n * const options = [\n * { label: \"Option A\", value: \"a\" },\n * { label: \"Option B\", value: \"b\" },\n * ];\n *\n * const { highlightIndex, moveUp, moveDown, select, value } = useSelect({\n * options,\n * initialValue: \"a\",\n * });\n *\n * useInput((input, key) => {\n * if (key.upArrow) moveUp();\n * if (key.downArrow) moveDown();\n * if (key.return) select();\n * });\n *\n * return <Select options={options} value={value} highlightIndex={highlightIndex} />;\n * }\n * ```\n */\nexport function useSelect<T>({\n options,\n initialValue,\n onChange,\n}: {\n options: SelectOption<T>[]\n initialValue?: T\n onChange?: (value: T) => void\n}): {\n value: T | undefined\n highlightIndex: number\n moveUp: () => void\n moveDown: () => void\n select: () => void\n setHighlightIndex: (index: number) => void\n} {\n const initialIndex = initialValue !== undefined ? options.findIndex((opt) => opt.value === initialValue) : 0\n\n const [highlightIndex, setHighlightIndex] = useState(Math.max(0, initialIndex))\n const [value, setValue] = useState<T | undefined>(initialValue)\n\n const moveUp = useCallback(() => {\n setHighlightIndex((i) => Math.max(0, i - 1))\n }, [])\n\n const moveDown = useCallback(() => {\n setHighlightIndex((i) => Math.min(options.length - 1, i + 1))\n }, [options.length])\n\n const select = useCallback(() => {\n const option = options[highlightIndex]\n if (option) {\n setValue(option.value)\n onChange?.(option.value)\n }\n }, [highlightIndex, options, onChange])\n\n return {\n value,\n highlightIndex,\n moveUp,\n moveDown,\n select,\n setHighlightIndex,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"input.mjs","names":[],"sources":["../../packages/ag-react/src/ui/input/TextInput.tsx","../../packages/ag-react/src/ui/input/Select.tsx"],"sourcesContent":["/**\n * React TextInput component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useCallback } from \"react\"\nimport type { TextInputProps } from \"../types.js\"\n\n/**\n * Single-line text input component for React TUI apps\n *\n * This is a controlled component that renders the current input state.\n * It does NOT handle keyboard input directly - that's the caller's responsibility\n * (via useInput hook in Ink, or similar).\n *\n * @example\n * ```tsx\n * import { TextInput } from \"./index\";\n * import { useInput } from \"ink\";\n *\n * function MyForm() {\n * const [value, setValue] = useState(\"\");\n *\n * useInput((input, key) => {\n * if (key.backspace || key.delete) {\n * setValue(v => v.slice(0, -1));\n * } else if (!key.ctrl && !key.meta && input) {\n * setValue(v => v + input);\n * }\n * });\n *\n * return <TextInput value={value} onChange={setValue} placeholder=\"Type here...\" />;\n * }\n *\n * // With password masking\n * <TextInput value={password} onChange={setPassword} mask=\"*\" />\n *\n * // With autocomplete\n * <TextInput\n * value={query}\n * onChange={setQuery}\n * autocomplete={[\"apple\", \"apricot\", \"avocado\"]}\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n placeholder,\n mask,\n autocomplete,\n onAutocomplete,\n onSubmit,\n cursorPosition,\n focused = true,\n}: TextInputProps): React.ReactElement {\n // Calculate display value (masked or plain)\n const displayValue = mask ? mask.repeat(value.length) : value\n\n // Find matching autocomplete suggestion\n const suggestion = getAutocompleteSuggestion(value, autocomplete)\n\n // Cursor position defaults to end of input\n const cursor = cursorPosition ?? value.length\n\n // Build the display: value + cursor + suggestion suffix\n const beforeCursor = displayValue.slice(0, cursor)\n const afterCursor = displayValue.slice(cursor)\n const suggestionSuffix = suggestion ? suggestion.slice(value.length) : \"\"\n\n // Show placeholder if empty and not focused or no value\n const showPlaceholder = !value && placeholder\n\n return (\n <span data-silvery-ui-text-input data-focused={focused}>\n {showPlaceholder ? (\n <span data-color=\"dim\">{placeholder}</span>\n ) : (\n <>\n <span>{beforeCursor}</span>\n {focused && (\n <span data-cursor data-inverse>\n {afterCursor[0] || \" \"}\n </span>\n )}\n <span>{afterCursor.slice(1)}</span>\n {suggestionSuffix && <span data-color=\"dim\">{suggestionSuffix}</span>}\n </>\n )}\n </span>\n )\n}\n\n/**\n * Hook for managing text input state with autocomplete support\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const { value, displayValue, suggestion, handleInput, acceptSuggestion, clear } =\n * useTextInput({ autocomplete: [\"apple\", \"banana\", \"cherry\"] });\n *\n * useInput((input, key) => {\n * if (key.tab && suggestion) {\n * acceptSuggestion();\n * } else {\n * handleInput(input, key);\n * }\n * });\n *\n * return <Text>{displayValue}</Text>;\n * }\n * ```\n */\nexport function useTextInput(\n options: {\n initialValue?: string\n mask?: string\n autocomplete?: string[]\n onSubmit?: (value: string) => void\n } = {},\n): {\n value: string\n setValue: (value: string) => void\n displayValue: string\n suggestion: string | undefined\n cursorPosition: number\n setCursorPosition: (pos: number) => void\n handleInput: (input: string, key: InputKey) => void\n acceptSuggestion: () => void\n clear: () => void\n} {\n const [value, setValue] = useState(options.initialValue ?? \"\")\n const [cursorPosition, setCursorPosition] = useState(value.length)\n\n const displayValue = options.mask ? options.mask.repeat(value.length) : value\n\n const suggestion = getAutocompleteSuggestion(value, options.autocomplete)\n\n const handleInput = useCallback(\n (input: string, key: InputKey) => {\n if (key.return) {\n options.onSubmit?.(value)\n return\n }\n\n if (key.backspace || key.delete) {\n if (cursorPosition > 0) {\n setValue((v) => v.slice(0, cursorPosition - 1) + v.slice(cursorPosition))\n setCursorPosition((p) => Math.max(0, p - 1))\n }\n return\n }\n\n if (key.leftArrow) {\n setCursorPosition((p) => Math.max(0, p - 1))\n return\n }\n\n if (key.rightArrow) {\n setCursorPosition((p) => Math.min(value.length, p + 1))\n return\n }\n\n // Ignore control characters (but allow opt+key composed chars via key.text)\n if (key.ctrl || !input) {\n return\n }\n\n // Insert the actual typed character (pre-normalization), not the keybinding key.\n // E.g., Shift+3 should insert '#', not '3'.\n const char = key.text ?? input\n if (key.meta && !char) return // opt+key with no text output\n setValue((v) => v.slice(0, cursorPosition) + char + v.slice(cursorPosition))\n setCursorPosition((p) => p + char.length)\n },\n [value, cursorPosition, options.onSubmit],\n )\n\n const acceptSuggestion = useCallback(() => {\n if (suggestion) {\n setValue(suggestion)\n setCursorPosition(suggestion.length)\n }\n }, [suggestion])\n\n const clear = useCallback(() => {\n setValue(\"\")\n setCursorPosition(0)\n }, [])\n\n return {\n value,\n setValue,\n displayValue,\n suggestion,\n cursorPosition,\n setCursorPosition,\n handleInput,\n acceptSuggestion,\n clear,\n }\n}\n\n/** Key object type (matches Ink's Key interface) */\ninterface InputKey {\n return?: boolean\n backspace?: boolean\n delete?: boolean\n leftArrow?: boolean\n rightArrow?: boolean\n upArrow?: boolean\n downArrow?: boolean\n tab?: boolean\n escape?: boolean\n ctrl?: boolean\n meta?: boolean\n shift?: boolean\n text?: string\n}\n\n/**\n * Find a matching autocomplete suggestion for the current input\n */\nfunction getAutocompleteSuggestion(value: string, autocomplete?: string[]): string | undefined {\n if (!value || !autocomplete?.length) {\n return undefined\n }\n\n const lowerValue = value.toLowerCase()\n return autocomplete.find(\n (item) => item.toLowerCase().startsWith(lowerValue) && item.length > value.length,\n )\n}\n","/**\n * React Select component for silvery/Ink TUI apps\n *\n * Single-choice selection list with keyboard navigation.\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\"\nimport type { SelectProps, SelectOption } from \"../types.js\"\n\n/**\n * Scrollable single-choice selection list\n *\n * @example\n * ```tsx\n * import { Select } from \"./index\";\n *\n * function SettingsView() {\n * const [theme, setTheme] = useState(\"light\");\n *\n * return (\n * <Select\n * options={[\n * { label: \"Light\", value: \"light\" },\n * { label: \"Dark\", value: \"dark\" },\n * { label: \"System\", value: \"system\" },\n * ]}\n * value={theme}\n * onChange={setTheme}\n * />\n * );\n * }\n * ```\n */\nexport function Select<T>({\n options,\n value,\n onChange,\n maxVisible = 10,\n highlightIndex: controlledHighlightIndex,\n onHighlightChange,\n}: SelectProps<T>): React.ReactElement {\n // Find the index of the currently selected value\n const selectedIndex = options.findIndex((opt) => opt.value === value)\n\n // Internal highlight state (for uncontrolled mode)\n const [internalHighlightIndex, setInternalHighlightIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : 0,\n )\n\n // Use controlled or internal highlight index\n const highlightIndex = controlledHighlightIndex ?? internalHighlightIndex\n\n // Calculate scroll window\n const scrollOffset = Math.max(\n 0,\n Math.min(highlightIndex - Math.floor(maxVisible / 2), options.length - maxVisible),\n )\n const visibleOptions = options.slice(scrollOffset, scrollOffset + maxVisible)\n const hasMoreAbove = scrollOffset > 0\n const hasMoreBelow = scrollOffset + maxVisible < options.length\n\n // Sync internal highlight when value changes externally\n useEffect(() => {\n if (controlledHighlightIndex === undefined && selectedIndex >= 0) {\n setInternalHighlightIndex(selectedIndex)\n }\n }, [selectedIndex, controlledHighlightIndex])\n\n return (\n <div data-silvery-select>\n {hasMoreAbove && <div data-silvery-select-scroll-indicator=\"up\">...</div>}\n {visibleOptions.map((option, visibleIdx) => {\n const actualIndex = scrollOffset + visibleIdx\n const isSelected = option.value === value\n const isHighlighted = actualIndex === highlightIndex\n\n return (\n <div\n key={actualIndex}\n data-silvery-select-option\n data-selected={isSelected}\n data-highlighted={isHighlighted}\n >\n <span data-silvery-select-indicator>{isSelected ? \">\" : \" \"}</span>\n <span data-silvery-select-label>{option.label}</span>\n </div>\n )\n })}\n {hasMoreBelow && <div data-silvery-select-scroll-indicator=\"down\">...</div>}\n </div>\n )\n}\n\n/**\n * Hook for managing select state with keyboard navigation\n *\n * @example\n * ```tsx\n * function MySelect() {\n * const options = [\n * { label: \"Option A\", value: \"a\" },\n * { label: \"Option B\", value: \"b\" },\n * ];\n *\n * const { highlightIndex, moveUp, moveDown, select, value } = useSelect({\n * options,\n * initialValue: \"a\",\n * });\n *\n * useInput((input, key) => {\n * if (key.upArrow) moveUp();\n * if (key.downArrow) moveDown();\n * if (key.return) select();\n * });\n *\n * return <Select options={options} value={value} highlightIndex={highlightIndex} />;\n * }\n * ```\n */\nexport function useSelect<T>({\n options,\n initialValue,\n onChange,\n}: {\n options: SelectOption<T>[]\n initialValue?: T\n onChange?: (value: T) => void\n}): {\n value: T | undefined\n highlightIndex: number\n moveUp: () => void\n moveDown: () => void\n select: () => void\n setHighlightIndex: (index: number) => void\n} {\n const initialIndex =\n initialValue !== undefined ? options.findIndex((opt) => opt.value === initialValue) : 0\n\n const [highlightIndex, setHighlightIndex] = useState(Math.max(0, initialIndex))\n const [value, setValue] = useState<T | undefined>(initialValue)\n\n const moveUp = useCallback(() => {\n setHighlightIndex((i) => Math.max(0, i - 1))\n }, [])\n\n const moveDown = useCallback(() => {\n setHighlightIndex((i) => Math.min(options.length - 1, i + 1))\n }, [options.length])\n\n const select = useCallback(() => {\n const option = options[highlightIndex]\n if (option) {\n setValue(option.value)\n onChange?.(option.value)\n }\n }, [highlightIndex, options, onChange])\n\n return {\n value,\n highlightIndex,\n moveUp,\n moveDown,\n select,\n setHighlightIndex,\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { a as ProgressInfo, d as StepProgress } from "../types-B4A8Ebba.mjs";
2
- import { i as createSpinner, r as Spinner, t as CallableSpinner } from "../spinner-BRkaJI0N.mjs";
3
- import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DQ-uUzLf.mjs";
1
+ import { a as ProgressInfo, d as StepProgress } from "../types-BH_v3iMT.mjs";
2
+ import { i as createSpinner, r as Spinner, t as CallableSpinner } from "../spinner-CGo34vyR.mjs";
3
+ import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "../multi-progress-DAQC7eap.mjs";
4
4
 
5
5
  //#region packages/ag-react/src/ui/progress/step-node.d.ts
6
6
  /**