silvery 0.19.2 → 0.21.1

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 (172) hide show
  1. package/README.md +9 -4
  2. package/dist/Text-BRf-59j2.mjs +237 -0
  3. package/dist/Text-BRf-59j2.mjs.map +1 -0
  4. package/dist/ag-BeFC4S2N.mjs +8727 -0
  5. package/dist/ag-BeFC4S2N.mjs.map +1 -0
  6. package/dist/{animation-Cn64yepo.mjs → animation-N8MFybTk.mjs} +2 -2
  7. package/dist/animation-N8MFybTk.mjs.map +1 -0
  8. package/dist/{ansi-CLOitHKx.mjs → ansi-C6Qs1Wn2.mjs} +1 -1
  9. package/dist/{ansi-CLOitHKx.mjs.map → ansi-C6Qs1Wn2.mjs.map} +1 -1
  10. package/dist/{ansi-Cc33mW54.d.mts → ansi-CBkam1ty.d.mts} +1 -1
  11. package/dist/{ansi-Cc33mW54.d.mts.map → ansi-CBkam1ty.d.mts.map} +1 -1
  12. package/dist/ansi-OYRLxxZQ.mjs +10669 -0
  13. package/dist/ansi-OYRLxxZQ.mjs.map +1 -0
  14. package/dist/bound-term-BumfuXXW.d.mts +4902 -0
  15. package/dist/bound-term-BumfuXXW.d.mts.map +1 -0
  16. package/dist/{chunk-Vs_PY4HZ.mjs → chunk-hT5z_Zn9.mjs} +1 -3
  17. package/dist/cli-DG6zsfsS.mjs +4 -0
  18. package/dist/context-BU5LkkIy.mjs.map +1 -1
  19. package/dist/{devtools-DxkSLXDA.mjs → devtools-9zfhpFyG.mjs} +3 -3
  20. package/dist/{devtools-DxkSLXDA.mjs.map → devtools-9zfhpFyG.mjs.map} +1 -1
  21. package/dist/devtools-nmPUmYU_.mjs +2 -0
  22. package/dist/easing-B0oZKDki.d.mts +24 -0
  23. package/dist/easing-B0oZKDki.d.mts.map +1 -0
  24. package/dist/{eta-Bb3RH3wh.mjs → eta-DGOuC8yU.mjs} +5 -1
  25. package/dist/{eta-Bb3RH3wh.mjs.map → eta-DGOuC8yU.mjs.map} +1 -1
  26. package/dist/flexily-zero-adapter-CEJOcbNp.mjs +306 -0
  27. package/dist/flexily-zero-adapter-CEJOcbNp.mjs.map +1 -0
  28. package/dist/{flexily-zero-adapter-CMxXhdOL.mjs → flexily-zero-adapter-D6hcFgrH.mjs} +1 -1
  29. package/dist/image-1nRyKa60.mjs +5960 -0
  30. package/dist/image-1nRyKa60.mjs.map +1 -0
  31. package/dist/{index-D3saHouR.d.mts → index-2E1jYgak.d.mts} +1057 -1133
  32. package/dist/index-2E1jYgak.d.mts.map +1 -0
  33. package/dist/index-Bi4Jdz5g.d.mts +453 -0
  34. package/dist/index-Bi4Jdz5g.d.mts.map +1 -0
  35. package/dist/index-Dg1YaeJb.d.mts +336 -0
  36. package/dist/index-Dg1YaeJb.d.mts.map +1 -0
  37. package/dist/{index-BXslOebb.d.mts → index-DnuadDNL.d.mts} +5750 -4158
  38. package/dist/index-DnuadDNL.d.mts.map +1 -0
  39. package/dist/index.d.mts +8 -5
  40. package/dist/index.d.mts.map +1 -1
  41. package/dist/index.mjs +16 -12
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/layout-engine-Ca_nbtfL.mjs +67 -0
  44. package/dist/layout-engine-Ca_nbtfL.mjs.map +1 -0
  45. package/dist/{layout-engine-B6Cdz1yZ.mjs → layout-engine-CgsoBRIn.mjs} +1 -1
  46. package/dist/layout-signals-Dch2EiCy.mjs +1111 -0
  47. package/dist/layout-signals-Dch2EiCy.mjs.map +1 -0
  48. package/dist/mouse-events-hnbJZRwK.mjs +1071 -0
  49. package/dist/mouse-events-hnbJZRwK.mjs.map +1 -0
  50. package/dist/{multi-progress-DAQC7eap.d.mts → multi-progress-Bg4ngK80.d.mts} +2 -2
  51. package/dist/{multi-progress-DAQC7eap.d.mts.map → multi-progress-Bg4ngK80.d.mts.map} +1 -1
  52. package/dist/{multi-progress-Bq9Oi_WI.mjs → multi-progress-CaXTuL9G.mjs} +3 -3
  53. package/dist/{multi-progress-Bq9Oi_WI.mjs.map → multi-progress-CaXTuL9G.mjs.map} +1 -1
  54. package/dist/{node-BeWlnCPY.mjs → node-BiFu8I9Y.mjs} +4 -4
  55. package/dist/node-BiFu8I9Y.mjs.map +1 -0
  56. package/dist/progress-B_UPy6zk.mjs +675 -0
  57. package/dist/progress-B_UPy6zk.mjs.map +1 -0
  58. package/dist/{progress-bar-CXE5Qfkd.mjs → progress-bar-DmIMPdL0.mjs} +4 -4
  59. package/dist/{progress-bar-CXE5Qfkd.mjs.map → progress-bar-DmIMPdL0.mjs.map} +1 -1
  60. package/dist/reconciler-NBDSEm8k.mjs +2178 -0
  61. package/dist/reconciler-NBDSEm8k.mjs.map +1 -0
  62. package/dist/render-string-B4h4SmK7.mjs +211 -0
  63. package/dist/render-string-B4h4SmK7.mjs.map +1 -0
  64. package/dist/{render-string-CDCeYkS3.mjs → render-string-BntLj7Xq.mjs} +1 -1
  65. package/dist/runtime.d.mts +3 -2
  66. package/dist/runtime.mjs +3 -3
  67. package/dist/{src-B5GjfG7g.mjs → schemes-DYt2ushj.mjs} +23 -1812
  68. package/dist/schemes-DYt2ushj.mjs.map +1 -0
  69. package/dist/{spinner-CGo34vyR.d.mts → spinner-CLgzJ_QF.d.mts} +2 -2
  70. package/dist/{spinner-CGo34vyR.d.mts.map → spinner-CLgzJ_QF.d.mts.map} +1 -1
  71. package/dist/{spinner-CeOmcuw_.mjs → spinner-Py8_-hn9.mjs} +23 -8
  72. package/dist/spinner-Py8_-hn9.mjs.map +1 -0
  73. package/dist/src-B9S_woYc.mjs +25024 -0
  74. package/dist/src-B9S_woYc.mjs.map +1 -0
  75. package/dist/src-CbhWmUnF.mjs +3928 -0
  76. package/dist/src-CbhWmUnF.mjs.map +1 -0
  77. package/dist/src-Dvq-s8iD.mjs +939 -0
  78. package/dist/src-Dvq-s8iD.mjs.map +1 -0
  79. package/dist/src-Oe6x5PrS.mjs +4621 -0
  80. package/dist/src-Oe6x5PrS.mjs.map +1 -0
  81. package/dist/{types-Bk2yw9Qj.mjs → src-WeA_J4BV.mjs} +34 -94
  82. package/dist/src-WeA_J4BV.mjs.map +1 -0
  83. package/dist/steps-DYrzCUCK.d.mts +202 -0
  84. package/dist/steps-DYrzCUCK.d.mts.map +1 -0
  85. package/dist/svg-DhxQkz-O.mjs +255 -0
  86. package/dist/svg-DhxQkz-O.mjs.map +1 -0
  87. package/dist/svg-Hk7lIl4F.d.mts +82 -0
  88. package/dist/svg-Hk7lIl4F.d.mts.map +1 -0
  89. package/dist/term.d.mts +3 -0
  90. package/dist/term.mjs +4 -0
  91. package/dist/theme.d.mts +95 -2
  92. package/dist/theme.d.mts.map +1 -0
  93. package/dist/theme.mjs +4 -3
  94. package/dist/{types-BH_v3iMT.d.mts → types-Bx-XZNbE.d.mts} +2 -15
  95. package/dist/types-Bx-XZNbE.d.mts.map +1 -0
  96. package/dist/ui/animation.d.mts +2 -1
  97. package/dist/ui/animation.mjs +1 -1
  98. package/dist/ui/ansi.d.mts +1 -1
  99. package/dist/ui/ansi.mjs +1 -1
  100. package/dist/ui/cli.d.mts +3 -3
  101. package/dist/ui/cli.mjs +5 -5
  102. package/dist/ui/display.d.mts +1 -1
  103. package/dist/ui/display.mjs.map +1 -1
  104. package/dist/ui/image.d.mts +2 -2
  105. package/dist/ui/image.mjs +2 -2
  106. package/dist/ui/input.d.mts +1 -1
  107. package/dist/ui/input.mjs.map +1 -1
  108. package/dist/ui/progress.d.mts +5 -249
  109. package/dist/ui/progress.mjs +5 -858
  110. package/dist/ui/react.d.mts +1 -1
  111. package/dist/ui/react.mjs +2 -2
  112. package/dist/ui/react.mjs.map +1 -1
  113. package/dist/ui/recording-chrome-react.d.mts +21 -0
  114. package/dist/ui/recording-chrome-react.d.mts.map +1 -0
  115. package/dist/ui/recording-chrome-react.mjs +105 -0
  116. package/dist/ui/recording-chrome-react.mjs.map +1 -0
  117. package/dist/ui/recording-chrome.d.mts +2 -0
  118. package/dist/ui/recording-chrome.mjs +2 -0
  119. package/dist/ui/utils.mjs +1 -1
  120. package/dist/ui/wrappers.d.mts +3 -3
  121. package/dist/ui/wrappers.mjs +2 -2
  122. package/dist/ui.d.mts +7 -6
  123. package/dist/ui.mjs +8 -7
  124. package/dist/{useLatest-Bg2x4bfP.d.mts → useLatest-DC8i7guK.d.mts} +5 -25
  125. package/dist/useLatest-DC8i7guK.d.mts.map +1 -0
  126. package/dist/useLayout-BKsQl2Or.mjs +424 -0
  127. package/dist/useLayout-BKsQl2Or.mjs.map +1 -0
  128. package/dist/{with-text-input-CRfoiFFG.d.mts → with-text-input-DG4f7JII.d.mts} +4 -55
  129. package/dist/with-text-input-DG4f7JII.d.mts.map +1 -0
  130. package/dist/wrapper-D7gNSsgf.mjs +3589 -0
  131. package/dist/wrapper-D7gNSsgf.mjs.map +1 -0
  132. package/dist/{wrappers-UTADQkSY.mjs → wrappers-CypAzrMO.mjs} +19 -161
  133. package/dist/wrappers-CypAzrMO.mjs.map +1 -0
  134. package/dist/yoga-adapter-1ex8r0ws.mjs +2 -0
  135. package/dist/{yoga-adapter-8oRGRw8V.mjs → yoga-adapter-SsEIqMc1.mjs} +28 -2
  136. package/dist/yoga-adapter-SsEIqMc1.mjs.map +1 -0
  137. package/package.json +63 -12
  138. package/dist/animation-Cn64yepo.mjs.map +0 -1
  139. package/dist/cli-BKp0YtBD.mjs +0 -4
  140. package/dist/devtools-9QY4teqI.mjs +0 -2
  141. package/dist/flexily-zero-adapter-BlQa46nr.mjs +0 -3385
  142. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +0 -1
  143. package/dist/image-CTII5QWI.mjs +0 -477
  144. package/dist/image-CTII5QWI.mjs.map +0 -1
  145. package/dist/index-BXslOebb.d.mts.map +0 -1
  146. package/dist/index-BnA7mNpo.d.mts +0 -175
  147. package/dist/index-BnA7mNpo.d.mts.map +0 -1
  148. package/dist/index-D3saHouR.d.mts.map +0 -1
  149. package/dist/layout-engine-ClUgv6jB.mjs +0 -50
  150. package/dist/layout-engine-ClUgv6jB.mjs.map +0 -1
  151. package/dist/node-BeWlnCPY.mjs.map +0 -1
  152. package/dist/reconciler-Cwgm8hRR.mjs +0 -8459
  153. package/dist/reconciler-Cwgm8hRR.mjs.map +0 -1
  154. package/dist/render-string-Darrg7ku.mjs +0 -5529
  155. package/dist/render-string-Darrg7ku.mjs.map +0 -1
  156. package/dist/spinner-CeOmcuw_.mjs.map +0 -1
  157. package/dist/src-B5GjfG7g.mjs.map +0 -1
  158. package/dist/src-CChwjk0Z.mjs +0 -738
  159. package/dist/src-CChwjk0Z.mjs.map +0 -1
  160. package/dist/src-CF-6UN01.mjs +0 -19434
  161. package/dist/src-CF-6UN01.mjs.map +0 -1
  162. package/dist/src-NCKb8kE5.mjs +0 -2660
  163. package/dist/src-NCKb8kE5.mjs.map +0 -1
  164. package/dist/types-BH_v3iMT.d.mts.map +0 -1
  165. package/dist/types-Bk2yw9Qj.mjs.map +0 -1
  166. package/dist/ui/progress.d.mts.map +0 -1
  167. package/dist/ui/progress.mjs.map +0 -1
  168. package/dist/useLatest-Bg2x4bfP.d.mts.map +0 -1
  169. package/dist/with-text-input-CRfoiFFG.d.mts.map +0 -1
  170. package/dist/wrappers-UTADQkSY.mjs.map +0 -1
  171. package/dist/yoga-adapter-8oRGRw8V.mjs.map +0 -1
  172. package/dist/yoga-adapter-D_CcxSt5.mjs +0 -2
@@ -0,0 +1,939 @@
1
+ import { P as ANSI16_SLOT_HEX, dt as deriveFields, i as STERLING_FLAT_TOKENS, it as deriveTheme, l as COLOR_SCHEME_FIELDS } from "./src-Oe6x5PrS.mjs";
2
+ import { s as getSchemeByName } from "./schemes-DYt2ushj.mjs";
3
+ import { blend, brighten, darken, hexToOklch, hexToRgb, oklchToHex, relativeLuminance } from "@silvery/color";
4
+ //#region packages/theme/src/generate.ts
5
+ /**
6
+ * Resolve an ANSI16 slot name (e.g. "yellow", "blueBright") to its canonical
7
+ * hex value. Falls back to the input string if not found (e.g., already hex).
8
+ */
9
+ function slotHex(name) {
10
+ return ANSI16_SLOT_HEX[name] ?? name;
11
+ }
12
+ /**
13
+ * Generate a complete ANSI 16 theme from a primary color + dark/light preference.
14
+ *
15
+ * All token values are hex strings (e.g. "#808000" for yellow).
16
+ * Terminal rendering quantizes these to 4-bit ANSI codes at paint time
17
+ * when colorLevel === "ansi16".
18
+ */
19
+ function generateTheme(primary, dark) {
20
+ const primaryHex = slotHex(primary);
21
+ const fgHex = slotHex(dark ? "whiteBright" : "black");
22
+ const accentHex = primaryHex;
23
+ const selectionbgHex = primaryHex;
24
+ const surfacebgHex = slotHex(dark ? "black" : "white");
25
+ const derived = deriveFields({
26
+ primary: primaryHex,
27
+ accent: accentHex,
28
+ fg: fgHex,
29
+ selectionbg: selectionbgHex,
30
+ surfacebg: surfacebgHex,
31
+ ring: {
32
+ red: slotHex(dark ? "redBright" : "red"),
33
+ orange: slotHex(dark ? "redBright" : "red"),
34
+ yellow: slotHex("yellow"),
35
+ green: slotHex(dark ? "greenBright" : "green"),
36
+ teal: slotHex("cyan"),
37
+ blue: slotHex(dark ? "blueBright" : "blue"),
38
+ purple: slotHex("magenta"),
39
+ pink: slotHex(dark ? "magentaBright" : "magenta")
40
+ }
41
+ });
42
+ return {
43
+ name: `${dark ? "dark" : "light"}-${primary}`,
44
+ bg: "",
45
+ fg: fgHex,
46
+ muted: slotHex(dark ? "white" : "blackBright"),
47
+ mutedbg: slotHex(dark ? "black" : "white"),
48
+ surface: slotHex(dark ? "whiteBright" : "black"),
49
+ surfacebg: surfacebgHex,
50
+ popover: slotHex(dark ? "whiteBright" : "black"),
51
+ popoverbg: slotHex(dark ? "blackBright" : "white"),
52
+ inverse: slotHex(dark ? "black" : "whiteBright"),
53
+ inversebg: slotHex(dark ? "whiteBright" : "black"),
54
+ cursor: slotHex("black"),
55
+ cursorbg: primaryHex,
56
+ selection: slotHex("black"),
57
+ selectionbg: primaryHex,
58
+ primary: primaryHex,
59
+ primaryfg: slotHex("black"),
60
+ secondary: primaryHex,
61
+ secondaryfg: slotHex("black"),
62
+ accent: primaryHex,
63
+ accentfg: slotHex("black"),
64
+ error: slotHex(dark ? "redBright" : "red"),
65
+ errorfg: slotHex("black"),
66
+ warning: primaryHex,
67
+ warningfg: slotHex("black"),
68
+ success: slotHex(dark ? "greenBright" : "green"),
69
+ successfg: slotHex("black"),
70
+ info: slotHex(dark ? "cyanBright" : "cyan"),
71
+ infofg: slotHex("black"),
72
+ border: slotHex("gray"),
73
+ inputborder: slotHex("gray"),
74
+ focusborder: slotHex(dark ? "blueBright" : "blue"),
75
+ disabledfg: slotHex("gray"),
76
+ palette: [
77
+ slotHex("black"),
78
+ slotHex("red"),
79
+ slotHex("green"),
80
+ slotHex("yellow"),
81
+ slotHex("blue"),
82
+ slotHex("magenta"),
83
+ slotHex("cyan"),
84
+ slotHex("white"),
85
+ slotHex("blackBright"),
86
+ slotHex("redBright"),
87
+ slotHex("greenBright"),
88
+ slotHex("yellowBright"),
89
+ slotHex("blueBright"),
90
+ slotHex("magentaBright"),
91
+ slotHex("cyanBright"),
92
+ slotHex("whiteBright")
93
+ ],
94
+ ...derived
95
+ };
96
+ }
97
+ //#endregion
98
+ //#region packages/theme/src/import/types.ts
99
+ /** All Base16 color keys in order. */
100
+ const BASE16_KEYS = [
101
+ "base00",
102
+ "base01",
103
+ "base02",
104
+ "base03",
105
+ "base04",
106
+ "base05",
107
+ "base06",
108
+ "base07",
109
+ "base08",
110
+ "base09",
111
+ "base0A",
112
+ "base0B",
113
+ "base0C",
114
+ "base0D",
115
+ "base0E",
116
+ "base0F"
117
+ ];
118
+ //#endregion
119
+ //#region packages/theme/src/import/base16.ts
120
+ /**
121
+ * Import Base16 YAML/JSON schemes into ColorScheme format.
122
+ *
123
+ * Base16 defines 16 colors (base00–base0F). We map them to ColorScheme's
124
+ * 22 colors, deriving bright variants and special colors.
125
+ *
126
+ * @see https://github.com/chriskempson/base16
127
+ */
128
+ /**
129
+ * Parse Base16 YAML into a Base16Scheme object.
130
+ * Handles both quoted and unquoted values, comments, and blank lines.
131
+ */
132
+ function parseBase16Yaml(yaml) {
133
+ const result = {};
134
+ for (const raw of yaml.split("\n")) {
135
+ const line = raw.trim();
136
+ if (!line || line.startsWith("#")) continue;
137
+ const colonIdx = line.indexOf(":");
138
+ if (colonIdx === -1) continue;
139
+ const key = line.slice(0, colonIdx).trim();
140
+ let value = line.slice(colonIdx + 1).trim();
141
+ if (value.startsWith("\"") && value.endsWith("\"") || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
142
+ const commentIdx = value.indexOf("#");
143
+ if (commentIdx > 0) value = value.slice(0, commentIdx).trim();
144
+ result[key] = value;
145
+ }
146
+ if (!result.scheme) throw new Error("Base16 YAML missing required field: scheme");
147
+ for (const key of BASE16_KEYS) {
148
+ if (!result[key]) throw new Error(`Base16 YAML missing required color: ${key}`);
149
+ if (!/^[0-9a-fA-F]{6}$/.test(result[key])) throw new Error(`Base16 color ${key} must be a 6-digit hex string without '#', got: "${result[key]}"`);
150
+ }
151
+ return result;
152
+ }
153
+ /** Compute relative luminance (WCAG 2.0) from a hex color with `#` prefix. */
154
+ function luminance(hex) {
155
+ const rgb = hexToRgb(hex);
156
+ if (!rgb) return 0;
157
+ const [r, g, b] = rgb.map((c) => {
158
+ const s = c / 255;
159
+ return s <= .03928 ? s / 12.92 : Math.pow((s + .055) / 1.055, 2.4);
160
+ });
161
+ return .2126 * r + .7152 * g + .0722 * b;
162
+ }
163
+ /** Normalize a bare hex string to `#RRGGBB` (uppercase). */
164
+ function hex(bare) {
165
+ return `#${bare.toUpperCase()}`;
166
+ }
167
+ /**
168
+ * Import a Base16 YAML (or JSON) scheme into a ColorScheme.
169
+ *
170
+ * Mapping:
171
+ * base00 → background, base01 → brightBlack, base02 → selectionBackground,
172
+ * base03 → white (muted fg), base05 → foreground/brightWhite,
173
+ * base08 → red, base09 → brightRed, base0A → yellow,
174
+ * base0B → green, base0C → cyan, base0D → blue, base0E → magenta,
175
+ * base0F → brightMagenta.
176
+ *
177
+ * Bright color variants are derived by brightening normals.
178
+ * `dark` is inferred from base00 luminance.
179
+ */
180
+ function importBase16(yamlOrJson) {
181
+ return base16ToColorScheme(parseBase16Yaml(yamlOrJson));
182
+ }
183
+ /** Convert a parsed Base16Scheme to ColorScheme. */
184
+ function base16ToColorScheme(scheme) {
185
+ const bg = hex(scheme.base00);
186
+ const fg = hex(scheme.base05);
187
+ const isDark = luminance(bg) < .179;
188
+ const black = isDark ? darken(bg, .15) : brighten(bg, .15);
189
+ const red = hex(scheme.base08);
190
+ const green = hex(scheme.base0B);
191
+ const yellow = hex(scheme.base0A);
192
+ const blue = hex(scheme.base0D);
193
+ const magenta = hex(scheme.base0E);
194
+ const cyan = hex(scheme.base0C);
195
+ return {
196
+ name: scheme.scheme,
197
+ dark: isDark,
198
+ black,
199
+ red,
200
+ green,
201
+ yellow,
202
+ blue,
203
+ magenta,
204
+ cyan,
205
+ white: hex(scheme.base03),
206
+ brightBlack: hex(scheme.base01),
207
+ brightRed: hex(scheme.base09),
208
+ brightGreen: brighten(green, .15),
209
+ brightYellow: brighten(yellow, .15),
210
+ brightBlue: brighten(blue, .15),
211
+ brightMagenta: hex(scheme.base0F),
212
+ brightCyan: brighten(cyan, .15),
213
+ brightWhite: fg,
214
+ foreground: fg,
215
+ background: bg,
216
+ cursorColor: fg,
217
+ cursorText: bg,
218
+ selectionBackground: hex(scheme.base02),
219
+ selectionForeground: fg
220
+ };
221
+ }
222
+ //#endregion
223
+ //#region packages/theme/src/generators.ts
224
+ /**
225
+ * Palette generators — produce a ColorScheme from various inputs.
226
+ *
227
+ * All generators return a complete ColorScheme (22 fields).
228
+ */
229
+ function isDarkColor$1(hex) {
230
+ const L = relativeLuminance(hex);
231
+ return L === null ? true : L < .5;
232
+ }
233
+ /**
234
+ * Target hues for each accent slot, in OKLCH degrees.
235
+ * OKLCH hues differ from HSL — red ≈ 29, green ≈ 142, blue ≈ 264. Calibrated
236
+ * per Ottosson's reference ramps for perceptually-uniform accent generation.
237
+ */
238
+ const targetHues = {
239
+ red: 29,
240
+ orange: 55,
241
+ yellow: 90,
242
+ green: 142,
243
+ teal: 195,
244
+ blue: 240,
245
+ purple: 305,
246
+ pink: 350
247
+ };
248
+ /** Find which hue slot the primary color best matches by OKLCH hue angle proximity. */
249
+ function assignPrimaryToSlot(primary) {
250
+ const o = hexToOklch(primary);
251
+ if (!o) return "blue";
252
+ const h = o.H;
253
+ for (const [lo, hi, name] of [
254
+ [
255
+ 0,
256
+ 15,
257
+ "red"
258
+ ],
259
+ [
260
+ 15,
261
+ 42,
262
+ "orange"
263
+ ],
264
+ [
265
+ 42,
266
+ 75,
267
+ "yellow"
268
+ ],
269
+ [
270
+ 75,
271
+ 170,
272
+ "green"
273
+ ],
274
+ [
275
+ 170,
276
+ 210,
277
+ "teal"
278
+ ],
279
+ [
280
+ 210,
281
+ 275,
282
+ "blue"
283
+ ],
284
+ [
285
+ 275,
286
+ 330,
287
+ "purple"
288
+ ],
289
+ [
290
+ 330,
291
+ 360,
292
+ "pink"
293
+ ]
294
+ ]) if (h >= lo && h < hi) return name;
295
+ return "red";
296
+ }
297
+ /** Generate 8 accent hues from a primary, placing it in its natural slot. */
298
+ function generateAccentsFromPrimary(primary) {
299
+ const o = hexToOklch(primary);
300
+ if (!o) return {
301
+ red: "#BF616A",
302
+ orange: "#D08770",
303
+ yellow: "#EBCB8B",
304
+ green: "#A3BE8C",
305
+ teal: "#88C0D0",
306
+ blue: "#5E81AC",
307
+ purple: "#B48EAD",
308
+ pink: "#D4879C"
309
+ };
310
+ const slot = assignPrimaryToSlot(primary);
311
+ const result = {};
312
+ for (const [name, targetH] of Object.entries(targetHues)) result[name] = name === slot ? primary : oklchToHex({
313
+ L: o.L,
314
+ C: o.C,
315
+ H: targetH
316
+ });
317
+ return result;
318
+ }
319
+ /**
320
+ * Generate a ColorScheme from a Base16 YAML scheme.
321
+ *
322
+ * Maps base00–base0F to ANSI palette colors, derives special colors.
323
+ */
324
+ function fromBase16(yamlOrJson) {
325
+ return importBase16(yamlOrJson);
326
+ }
327
+ /**
328
+ * Generate a full ColorScheme from 1-3 hex colors.
329
+ *
330
+ * At minimum, provide `background` or `primary`. Missing colors are
331
+ * generated via surface ramp (from bg) and hue rotation (from primary).
332
+ */
333
+ function fromColors(opts) {
334
+ const dark = opts.dark ?? (opts.background ? isDarkColor$1(opts.background) : true);
335
+ const step = dark ? brighten : darken;
336
+ const bg = opts.background ?? (dark ? "#2E3440" : "#FFFFFF");
337
+ const fg = opts.foreground ?? step(bg, .85);
338
+ const accents = opts.primary ? generateAccentsFromPrimary(opts.primary) : {
339
+ red: "#BF616A",
340
+ orange: "#D08770",
341
+ yellow: "#EBCB8B",
342
+ green: "#A3BE8C",
343
+ teal: "#88C0D0",
344
+ blue: "#5E81AC",
345
+ purple: "#B48EAD",
346
+ pink: "#D4879C"
347
+ };
348
+ const black = dark ? darken(bg, .05) : darken(bg, .1);
349
+ const white = dark ? blend(fg, bg, .3) : blend(bg, fg, .3);
350
+ const brightBlack = step(bg, .15);
351
+ const brightWhite = dark ? fg : brighten(fg, .1);
352
+ return {
353
+ name: opts.name ?? (dark ? "generated-dark" : "generated-light"),
354
+ dark,
355
+ primary: opts.primary,
356
+ black,
357
+ red: accents.red,
358
+ green: accents.green,
359
+ yellow: accents.yellow,
360
+ blue: accents.blue,
361
+ magenta: accents.purple,
362
+ cyan: accents.teal,
363
+ white,
364
+ brightBlack,
365
+ brightRed: accents.orange,
366
+ brightGreen: brighten(accents.green, .15),
367
+ brightYellow: brighten(accents.yellow, .15),
368
+ brightBlue: brighten(accents.blue, .15),
369
+ brightMagenta: accents.pink,
370
+ brightCyan: brighten(accents.teal, .15),
371
+ brightWhite,
372
+ foreground: fg,
373
+ background: bg,
374
+ cursorColor: fg,
375
+ cursorText: bg,
376
+ selectionBackground: blend(bg, accents.blue, .3),
377
+ selectionForeground: fg
378
+ };
379
+ }
380
+ /**
381
+ * Look up a built-in palette by name.
382
+ *
383
+ * @returns The ColorScheme, or undefined if not found.
384
+ */
385
+ function fromPreset(name) {
386
+ return getSchemeByName(name);
387
+ }
388
+ //#endregion
389
+ //#region packages/theme/src/builder.ts
390
+ /**
391
+ * Chainable theme builder — create themes from minimal input.
392
+ *
393
+ * @example
394
+ * ```typescript
395
+ * // Just a background color
396
+ * const theme = createTheme().bg('#2E3440').build()
397
+ *
398
+ * // Primary + explicit dark mode
399
+ * const theme = createTheme().primary('#EBCB8B').dark().build()
400
+ *
401
+ * // Three-color input (dark/light inferred from bg luminance)
402
+ * const theme = createTheme()
403
+ * .bg('#2E3440').fg('#ECEFF4').primary('#EBCB8B').build()
404
+ *
405
+ * // Preset with override
406
+ * const theme = createTheme().preset('nord').primary('#A3BE8C').build()
407
+ * ```
408
+ */
409
+ function isDarkColor(hex) {
410
+ const rgb = hexToRgb(hex);
411
+ if (!rgb) return true;
412
+ return (rgb[0] + rgb[1] + rgb[2]) / 765 < .5;
413
+ }
414
+ /** Create a chainable theme builder. */
415
+ function createTheme() {
416
+ const state = { colors: {} };
417
+ const builder = {
418
+ bg(color) {
419
+ state.bgColor = color;
420
+ return builder;
421
+ },
422
+ fg(color) {
423
+ state.fgColor = color;
424
+ return builder;
425
+ },
426
+ primary(color) {
427
+ state.primaryColor = color;
428
+ return builder;
429
+ },
430
+ accent(color) {
431
+ return builder.primary(color);
432
+ },
433
+ dark() {
434
+ state.dark = true;
435
+ return builder;
436
+ },
437
+ light() {
438
+ state.dark = false;
439
+ return builder;
440
+ },
441
+ color(name, value) {
442
+ state.colors[name] = value;
443
+ return builder;
444
+ },
445
+ palette(p) {
446
+ state.presetPalette = p;
447
+ return builder;
448
+ },
449
+ preset(name) {
450
+ const p = getSchemeByName(name);
451
+ if (p) state.presetPalette = p;
452
+ return builder;
453
+ },
454
+ build() {
455
+ const isDark = state.dark ?? (state.bgColor ? isDarkColor(state.bgColor) : true);
456
+ let palette;
457
+ if (state.presetPalette) {
458
+ palette = { ...state.presetPalette };
459
+ if (state.bgColor) palette.background = state.bgColor;
460
+ if (state.fgColor) palette.foreground = state.fgColor;
461
+ if (state.primaryColor) {
462
+ palette.primary = state.primaryColor;
463
+ const ansiName = hueToAnsiField(assignPrimaryToSlot(state.primaryColor));
464
+ palette[ansiName] = state.primaryColor;
465
+ }
466
+ palette.dark = isDark;
467
+ } else palette = fromColors({
468
+ background: state.bgColor,
469
+ foreground: state.fgColor,
470
+ primary: state.primaryColor,
471
+ dark: isDark
472
+ });
473
+ for (const [key, val] of Object.entries(state.colors)) if (val !== void 0 && typeof val === "string") palette[key] = val;
474
+ return deriveTheme(palette);
475
+ }
476
+ };
477
+ return builder;
478
+ }
479
+ /** Map a HueName to the corresponding ColorScheme field. */
480
+ function hueToAnsiField(hue) {
481
+ return {
482
+ red: "red",
483
+ orange: "brightRed",
484
+ yellow: "yellow",
485
+ green: "green",
486
+ teal: "cyan",
487
+ blue: "blue",
488
+ purple: "magenta",
489
+ pink: "brightMagenta"
490
+ }[hue];
491
+ }
492
+ /**
493
+ * Quick theme from a primary color or color name.
494
+ *
495
+ * @example
496
+ * ```typescript
497
+ * quickTheme('#EBCB8B', 'dark') // yellow primary, dark mode
498
+ * quickTheme('blue') // blue primary, default dark
499
+ * ```
500
+ */
501
+ function quickTheme(primaryOrHex, mode) {
502
+ const b = createTheme();
503
+ if (primaryOrHex.startsWith("#")) b.primary(primaryOrHex);
504
+ else b.primary({
505
+ red: "#BF616A",
506
+ orange: "#D08770",
507
+ yellow: "#EBCB8B",
508
+ green: "#A3BE8C",
509
+ teal: "#88C0D0",
510
+ cyan: "#88C0D0",
511
+ blue: "#5E81AC",
512
+ purple: "#B48EAD",
513
+ pink: "#D4879C",
514
+ magenta: "#B48EAD",
515
+ white: "#ECEFF4"
516
+ }[primaryOrHex] ?? "#5E81AC");
517
+ if (mode === "dark") b.dark();
518
+ else if (mode === "light") b.light();
519
+ return b.build();
520
+ }
521
+ /**
522
+ * Create a theme from a built-in preset name.
523
+ *
524
+ * @example
525
+ * ```typescript
526
+ * presetTheme('catppuccin-mocha')
527
+ * presetTheme('nord')
528
+ * ```
529
+ */
530
+ function presetTheme(name) {
531
+ return createTheme().preset(name).build();
532
+ }
533
+ //#endregion
534
+ //#region packages/theme/src/auto-generate.ts
535
+ /**
536
+ * Auto-generate themes — create a complete Theme from a single primary color.
537
+ *
538
+ * Uses OKLCH color manipulation to derive complementary and analogous colors
539
+ * for the full palette from one input color. OKLCH preserves perceived
540
+ * lightness and chroma across hue rotations, so accent ramps look balanced.
541
+ */
542
+ /** Standard OKLCH hue positions for semantic accents (degrees).
543
+ * OKLCH hues differ from HSL: red≈29, orange≈55, yellow≈90, green≈142,
544
+ * teal≈195, blue≈240, purple≈305, pink≈350. Calibrated against Ottosson's
545
+ * reference ramps. */
546
+ const HUE = {
547
+ red: 29,
548
+ orangeBright: 55,
549
+ yellow: 90,
550
+ green: 142,
551
+ cyan: 195,
552
+ blue: 240,
553
+ magenta: 310,
554
+ pinkBright: 350
555
+ };
556
+ /**
557
+ * Generate a complete Theme from a single primary color.
558
+ *
559
+ * Derives a full ColorScheme using OKLCH color manipulation:
560
+ * - Background/foreground from lightness endpoints using the primary's hue
561
+ * - Complementary and analogous accent colors from hue rotation
562
+ * - Surface ramp from bg lightness offsets
563
+ * - Status colors (error, warning, success, info) from standard hue positions
564
+ *
565
+ * @param primaryColor - A hex color string (e.g. "#5E81AC")
566
+ * @param mode - "dark" or "light" theme mode
567
+ * @returns A complete Theme with all 33 semantic tokens
568
+ *
569
+ * @example
570
+ * ```typescript
571
+ * const theme = autoGenerateTheme("#5E81AC", "dark")
572
+ * // Generates a full dark theme with blue as the primary accent
573
+ *
574
+ * const light = autoGenerateTheme("#E06C75", "light")
575
+ * // Generates a full light theme with red/rose as the primary accent
576
+ * ```
577
+ */
578
+ function autoGenerateTheme(primaryColor, mode) {
579
+ const o = hexToOklch(primaryColor);
580
+ if (!o) return deriveTheme(fromColors({ dark: mode === "dark" }));
581
+ const dark = mode === "dark";
582
+ const bgL = dark ? .22 : .96;
583
+ const fgL = dark ? .9 : .2;
584
+ const bgC = Math.min(o.C, .03);
585
+ const bg = oklchToHex({
586
+ L: bgL,
587
+ C: bgC,
588
+ H: o.H
589
+ });
590
+ const fg = oklchToHex({
591
+ L: fgL,
592
+ C: bgC * .5,
593
+ H: o.H
594
+ });
595
+ const accentL = dark ? .72 : .52;
596
+ const accentC = Math.max(o.C, .1);
597
+ const accent = (h) => oklchToHex({
598
+ L: accentL,
599
+ C: accentC,
600
+ H: h
601
+ });
602
+ const red = accent(HUE.red);
603
+ const green = accent(HUE.green);
604
+ const yellow = accent(HUE.yellow);
605
+ const blue = accent(HUE.blue);
606
+ const magenta = accent(HUE.magenta);
607
+ const cyan = accent(HUE.cyan);
608
+ const brightL = accentL + (dark ? .1 : -.1);
609
+ const brightAccent = (h) => oklchToHex({
610
+ L: brightL,
611
+ C: accentC,
612
+ H: h
613
+ });
614
+ const brightRed = brightAccent(HUE.orangeBright);
615
+ const brightGreen = brightAccent(HUE.green);
616
+ const brightYellow = brightAccent(HUE.yellow);
617
+ const brightBlue = brightAccent(HUE.blue);
618
+ const brightMagenta = brightAccent(HUE.pinkBright);
619
+ const brightCyan = brightAccent(HUE.cyan);
620
+ const black = oklchToHex({
621
+ L: dark ? bgL * .7 : bgL * .92,
622
+ C: bgC,
623
+ H: o.H
624
+ });
625
+ const white = oklchToHex({
626
+ L: dark ? .6 : .35,
627
+ C: bgC * .3,
628
+ H: o.H
629
+ });
630
+ const brightBlack = oklchToHex({
631
+ L: dark ? bgL + .1 : bgL - .08,
632
+ C: bgC,
633
+ H: o.H
634
+ });
635
+ const brightWhite = dark ? fg : oklchToHex({
636
+ L: fgL - .05,
637
+ C: bgC * .5,
638
+ H: o.H
639
+ });
640
+ return deriveTheme({
641
+ name: `generated-${mode}`,
642
+ dark,
643
+ primary: primaryColor,
644
+ black,
645
+ red,
646
+ green,
647
+ yellow,
648
+ blue,
649
+ magenta,
650
+ cyan,
651
+ white,
652
+ brightBlack,
653
+ brightRed,
654
+ brightGreen,
655
+ brightYellow,
656
+ brightBlue,
657
+ brightMagenta,
658
+ brightCyan,
659
+ brightWhite,
660
+ foreground: fg,
661
+ background: bg,
662
+ cursorColor: fg,
663
+ cursorText: bg,
664
+ selectionBackground: blend(bg, primaryColor, .3),
665
+ selectionForeground: fg
666
+ });
667
+ }
668
+ //#endregion
669
+ //#region packages/theme/src/validate.ts
670
+ /**
671
+ * Palette validation — checks ColorScheme fields and contrast.
672
+ */
673
+ /**
674
+ * Validate a ColorScheme.
675
+ *
676
+ * Checks:
677
+ * - All 22 color fields are present and non-empty hex strings
678
+ * - Warns on low-contrast foreground/background combinations
679
+ */
680
+ function validateColorScheme(p) {
681
+ const errors = [];
682
+ const warnings = [];
683
+ for (const field of COLOR_SCHEME_FIELDS) {
684
+ const val = p[field];
685
+ if (!val || typeof val !== "string") errors.push(`${field} is required and must be a non-empty string`);
686
+ }
687
+ if (p.foreground && p.background) {
688
+ const fgRgb = hexToRgb(p.foreground);
689
+ const bgRgb = hexToRgb(p.background);
690
+ if (fgRgb && bgRgb) {
691
+ const fgSum = fgRgb[0] + fgRgb[1] + fgRgb[2];
692
+ const bgSum = bgRgb[0] + bgRgb[1] + bgRgb[2];
693
+ if (fgSum > 384 === bgSum > 384) warnings.push(`Low contrast: foreground (${p.foreground}) and background (${p.background}) have similar lightness`);
694
+ }
695
+ }
696
+ return {
697
+ valid: errors.length === 0,
698
+ errors,
699
+ warnings
700
+ };
701
+ }
702
+ //#endregion
703
+ //#region packages/theme/src/validate-theme.ts
704
+ /**
705
+ * Theme validation — checks that all required semantic tokens are present.
706
+ *
707
+ * Complements validateColorScheme() which validates the lower-level
708
+ * ColorScheme. This validates the derived Theme object.
709
+ */
710
+ /**
711
+ * Required semantic token keys on Theme (excludes `name` and `palette`).
712
+ *
713
+ * Sterling owns selection / inverse / link styling via flat tokens
714
+ * (`bg-selected`, `fg-on-selected`, `bg-inverse`, `fg-on-inverse`, `fg-link`)
715
+ * baked in by `inlineSterlingTokens`. The legacy single-hex aliases
716
+ * (`selection`, `selectionbg`, `inverse`, `inversebg`, `link`) were removed
717
+ * in 0.21.0 (sterling-purge-legacy-tokens).
718
+ */
719
+ const THEME_TOKEN_KEYS = [
720
+ "bg",
721
+ "fg",
722
+ "muted",
723
+ "mutedbg",
724
+ "surface",
725
+ "surfacebg",
726
+ "popover",
727
+ "popoverbg",
728
+ "cursor",
729
+ "cursorbg",
730
+ "primary",
731
+ "primaryfg",
732
+ "secondary",
733
+ "secondaryfg",
734
+ "accent",
735
+ "accentfg",
736
+ "error",
737
+ "errorfg",
738
+ "warning",
739
+ "warningfg",
740
+ "success",
741
+ "successfg",
742
+ "info",
743
+ "infofg",
744
+ "border",
745
+ "inputborder",
746
+ "focusborder",
747
+ "disabledfg"
748
+ ];
749
+ /** All recognized keys on Theme (tokens + metadata). */
750
+ const ALL_KNOWN_KEYS = new Set([
751
+ ...THEME_TOKEN_KEYS,
752
+ "name",
753
+ "palette"
754
+ ]);
755
+ /**
756
+ * Validate a Theme object — check that all required tokens are present.
757
+ *
758
+ * @param theme - The theme object to validate
759
+ * @returns Validation result with missing and extra token lists
760
+ *
761
+ * @example
762
+ * ```typescript
763
+ * const result = validateTheme(myTheme)
764
+ * if (!result.valid) {
765
+ * console.log("Missing tokens:", result.missing)
766
+ * }
767
+ * ```
768
+ */
769
+ function validateTheme(theme) {
770
+ const missing = [];
771
+ const extra = [];
772
+ for (const key of THEME_TOKEN_KEYS) {
773
+ const val = theme[key];
774
+ if (val === void 0 || val === null || val === "") missing.push(key);
775
+ }
776
+ for (const key of Object.keys(theme)) if (!ALL_KNOWN_KEYS.has(key)) extra.push(key);
777
+ return {
778
+ valid: missing.length === 0,
779
+ missing,
780
+ extra
781
+ };
782
+ }
783
+ //#endregion
784
+ //#region packages/theme/src/alias.ts
785
+ /** Maximum depth for alias chain resolution before treating as circular. */
786
+ const MAX_ALIAS_DEPTH = 10;
787
+ /**
788
+ * Resolve all token aliases in a theme.
789
+ *
790
+ * Token values that start with `$` are treated as references to other tokens.
791
+ * Alias chains are followed until a concrete (non-$) value is reached.
792
+ * Circular references are detected via a depth limit and left unresolved.
793
+ *
794
+ * @param theme - A theme-like object where values may reference other tokens via `$name`
795
+ * @returns A new object with all aliases resolved to concrete values
796
+ *
797
+ * @example
798
+ * ```typescript
799
+ * const themed = resolveAliases({
800
+ * ...baseTheme,
801
+ * button: "$primary", // resolves to the value of 'primary'
802
+ * buttonHover: "$button", // chain: buttonHover -> button -> primary -> hex
803
+ * })
804
+ * ```
805
+ */
806
+ function resolveAliases(theme) {
807
+ const result = {};
808
+ for (const key of Object.keys(theme)) result[key] = resolveAlias(key, theme, 0);
809
+ return result;
810
+ }
811
+ /**
812
+ * Resolve a single token's alias chain.
813
+ *
814
+ * @param key - The token key to resolve
815
+ * @param tokens - The full token map
816
+ * @param depth - Current recursion depth (for loop detection)
817
+ * @returns The resolved concrete value, or the raw alias string if unresolvable
818
+ */
819
+ function resolveAlias(key, tokens, depth) {
820
+ if (depth >= MAX_ALIAS_DEPTH) return tokens[key] ?? "";
821
+ const value = tokens[key];
822
+ if (value === void 0) return "";
823
+ if (!value.startsWith("$")) return value;
824
+ const refKey = value.slice(1);
825
+ if (!(refKey in tokens)) return value;
826
+ return resolveAlias(refKey, tokens, depth + 1);
827
+ }
828
+ /**
829
+ * Resolve a single alias value against a Theme.
830
+ *
831
+ * Useful for resolving individual values without processing the entire theme.
832
+ *
833
+ * @param value - The value to resolve (may be "$tokenName" or a concrete value)
834
+ * @param theme - The theme to resolve against
835
+ * @returns The resolved concrete value
836
+ */
837
+ function resolveTokenAlias(value, theme) {
838
+ if (!value.startsWith("$")) return value;
839
+ const seen = /* @__PURE__ */ new Set();
840
+ let current = value;
841
+ for (let i = 0; i < MAX_ALIAS_DEPTH; i++) {
842
+ if (!current.startsWith("$")) return current;
843
+ const key = current.slice(1);
844
+ if (seen.has(key)) return current;
845
+ seen.add(key);
846
+ const resolved = theme[key];
847
+ if (typeof resolved !== "string") return current;
848
+ current = resolved;
849
+ }
850
+ return current;
851
+ }
852
+ //#endregion
853
+ //#region packages/theme/src/css.ts
854
+ /**
855
+ * Convert a Theme to CSS custom properties.
856
+ *
857
+ * Token names mirror Sterling's flat grammar with a `--` prefix:
858
+ * - `bg-surface-default` → `--bg-surface-default`
859
+ * - `fg-accent` → `--fg-accent`
860
+ * - `border-focus` → `--border-focus`
861
+ * - Palette entries: `--color0` through `--color15`
862
+ *
863
+ * @param theme - The theme to convert (Sterling flat tokens must be populated)
864
+ * @returns A record mapping CSS custom property names to color values
865
+ *
866
+ * @example
867
+ * ```typescript
868
+ * const vars = themeToCSSVars(myTheme)
869
+ * // { "--bg-surface-default": "#1E1E2E", "--fg-accent": "#F9E2AF", ... }
870
+ *
871
+ * // Apply to an element:
872
+ * Object.assign(element.style, vars)
873
+ * ```
874
+ */
875
+ function themeToCSSVars(theme) {
876
+ const vars = {};
877
+ const flat = theme;
878
+ for (const key of STERLING_FLAT_TOKENS) {
879
+ const value = flat[key];
880
+ if (typeof value === "string") vars[`--${key}`] = value;
881
+ }
882
+ if (theme.palette) for (let i = 0; i < theme.palette.length; i++) vars[`--color${i}`] = theme.palette[i];
883
+ return vars;
884
+ }
885
+ //#endregion
886
+ //#region packages/theme/src/export/base16.ts
887
+ /**
888
+ * Export ColorScheme to Base16 YAML format.
889
+ *
890
+ * Maps ColorScheme fields to base00–base0F. For fields that
891
+ * ColorScheme doesn't store directly (base04/base06/base07),
892
+ * we interpolate between neighboring values.
893
+ *
894
+ * @see https://github.com/chriskempson/base16
895
+ */
896
+ /** Strip `#` prefix from a hex color string and uppercase. */
897
+ function stripHash(hex) {
898
+ return (hex.startsWith("#") ? hex.slice(1) : hex).toUpperCase();
899
+ }
900
+ /**
901
+ * Export a ColorScheme to Base16 YAML format.
902
+ *
903
+ * Mapping:
904
+ * background → base00, brightBlack → base01, selectionBackground → base02,
905
+ * white → base03, (interpolated) → base04, foreground → base05,
906
+ * (interpolated) → base06, (interpolated) → base07,
907
+ * red → base08, brightRed → base09, yellow → base0A, green → base0B,
908
+ * cyan → base0C, blue → base0D, magenta → base0E, brightMagenta → base0F.
909
+ */
910
+ function exportBase16(palette) {
911
+ const dark = palette.dark ?? true;
912
+ const base04 = blend(palette.white, palette.foreground, .33);
913
+ const base06 = dark ? blend(palette.foreground, "#FFFFFF", .15) : blend(palette.foreground, "#000000", .15);
914
+ const base07 = palette.black;
915
+ return [
916
+ `scheme: "${palette.name ?? "exported"}"`,
917
+ `author: ""`,
918
+ `base00: "${stripHash(palette.background)}"`,
919
+ `base01: "${stripHash(palette.brightBlack)}"`,
920
+ `base02: "${stripHash(palette.selectionBackground)}"`,
921
+ `base03: "${stripHash(palette.white)}"`,
922
+ `base04: "${stripHash(base04)}"`,
923
+ `base05: "${stripHash(palette.foreground)}"`,
924
+ `base06: "${stripHash(base06)}"`,
925
+ `base07: "${stripHash(base07)}"`,
926
+ `base08: "${stripHash(palette.red)}"`,
927
+ `base09: "${stripHash(palette.brightRed)}"`,
928
+ `base0A: "${stripHash(palette.yellow)}"`,
929
+ `base0B: "${stripHash(palette.green)}"`,
930
+ `base0C: "${stripHash(palette.cyan)}"`,
931
+ `base0D: "${stripHash(palette.blue)}"`,
932
+ `base0E: "${stripHash(palette.magenta)}"`,
933
+ `base0F: "${stripHash(palette.brightMagenta)}"`
934
+ ].join("\n") + "\n";
935
+ }
936
+ //#endregion
937
+ export { generateTheme as _, THEME_TOKEN_KEYS as a, autoGenerateTheme as c, quickTheme as d, assignPrimaryToSlot as f, importBase16 as g, fromPreset as h, resolveTokenAlias as i, createTheme as l, fromColors as m, themeToCSSVars as n, validateTheme as o, fromBase16 as p, resolveAliases as r, validateColorScheme as s, exportBase16 as t, presetTheme as u };
938
+
939
+ //# sourceMappingURL=src-Dvq-s8iD.mjs.map