silvery 0.19.1 → 0.21.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 (218) hide show
  1. package/README.md +9 -4
  2. package/dist/Text-Lq0dmj8-.mjs +239 -0
  3. package/dist/Text-Lq0dmj8-.mjs.map +1 -0
  4. package/dist/UPNG-Bo33r8rA.mjs +3 -0
  5. package/dist/UPNG-DosRPdF4.mjs +5075 -0
  6. package/dist/UPNG-DosRPdF4.mjs.map +1 -0
  7. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +6 -0
  8. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +1 -0
  9. package/dist/{animation-Cn64yepo.mjs → animation-ZMN2_XKv.mjs} +2 -2
  10. package/dist/animation-ZMN2_XKv.mjs.map +1 -0
  11. package/dist/{ansi-Cc33mW54.d.mts → ansi-2Xn0yatP.d.mts} +1 -1
  12. package/dist/{ansi-Cc33mW54.d.mts.map → ansi-2Xn0yatP.d.mts.map} +1 -1
  13. package/dist/{ansi-CLOitHKx.mjs → ansi-D1KQMAbf.mjs} +1 -1
  14. package/dist/{ansi-CLOitHKx.mjs.map → ansi-D1KQMAbf.mjs.map} +1 -1
  15. package/dist/ansi-yC4RyBNY.mjs +22441 -0
  16. package/dist/ansi-yC4RyBNY.mjs.map +1 -0
  17. package/dist/apng-CR08rIaH.mjs +58 -0
  18. package/dist/apng-CR08rIaH.mjs.map +1 -0
  19. package/dist/apng-DaHfVaVI.mjs +3 -0
  20. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  21. package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
  22. package/dist/backend-B-WYLUib.mjs +13396 -0
  23. package/dist/backend-B-WYLUib.mjs.map +1 -0
  24. package/dist/backends-CUtan80W.mjs +3 -0
  25. package/dist/backends-DIVYzKqd.mjs +1083 -0
  26. package/dist/backends-DIVYzKqd.mjs.map +1 -0
  27. package/dist/bound-term-0sPrrzH1.d.mts +4640 -0
  28. package/dist/bound-term-0sPrrzH1.d.mts.map +1 -0
  29. package/dist/canvas-1v7dPT-_.mjs +3 -0
  30. package/dist/canvas-CSuPOMNt.mjs +1442 -0
  31. package/dist/canvas-CSuPOMNt.mjs.map +1 -0
  32. package/dist/{chunk-Vs_PY4HZ.mjs → chunk-BSw8zbkd.mjs} +1 -1
  33. package/dist/cli-dvo0r2fs.mjs +4 -0
  34. package/dist/compare-CQodSH4G.mjs +376 -0
  35. package/dist/compare-CQodSH4G.mjs.map +1 -0
  36. package/dist/compare-DHlcxEYA.mjs +3 -0
  37. package/dist/context-BU5LkkIy.mjs.map +1 -1
  38. package/dist/devtools-CJdt5H0X.mjs +2 -0
  39. package/dist/{devtools-DxkSLXDA.mjs → devtools-DcQjgyjL.mjs} +5 -4
  40. package/dist/{devtools-DxkSLXDA.mjs.map → devtools-DcQjgyjL.mjs.map} +1 -1
  41. package/dist/easing-BI-ASGMO.d.mts +24 -0
  42. package/dist/easing-BI-ASGMO.d.mts.map +1 -0
  43. package/dist/{eta-Bb3RH3wh.mjs → eta-CJlGH06n.mjs} +1 -1
  44. package/dist/{eta-Bb3RH3wh.mjs.map → eta-CJlGH06n.mjs.map} +1 -1
  45. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs +306 -0
  46. package/dist/flexily-zero-adapter-C3Vj0fPt.mjs.map +1 -0
  47. package/dist/{flexily-zero-adapter-CMxXhdOL.mjs → flexily-zero-adapter-C4lW_Ov5.mjs} +1 -1
  48. package/dist/fonts-BFmhXDv7.mjs +88 -0
  49. package/dist/fonts-BFmhXDv7.mjs.map +1 -0
  50. package/dist/gif-C_AjaT9d.mjs +188 -0
  51. package/dist/gif-C_AjaT9d.mjs.map +1 -0
  52. package/dist/gif-DaC4XrxA.mjs +3 -0
  53. package/dist/gifenc-BOUT-KFB.mjs +730 -0
  54. package/dist/gifenc-BOUT-KFB.mjs.map +1 -0
  55. package/dist/image-C2Birh2x.mjs +1252 -0
  56. package/dist/image-C2Birh2x.mjs.map +1 -0
  57. package/dist/index-BUMxS65f.d.mts +453 -0
  58. package/dist/index-BUMxS65f.d.mts.map +1 -0
  59. package/dist/{index-D3saHouR.d.mts → index-CSQf13CI.d.mts} +1057 -1133
  60. package/dist/index-CSQf13CI.d.mts.map +1 -0
  61. package/dist/{index-BXslOebb.d.mts → index-Cl9KKjQ_.d.mts} +4919 -3921
  62. package/dist/index-Cl9KKjQ_.d.mts.map +1 -0
  63. package/dist/index-XbNrPhWl.d.mts +336 -0
  64. package/dist/index-XbNrPhWl.d.mts.map +1 -0
  65. package/dist/index.d.mts +8 -5
  66. package/dist/index.d.mts.map +1 -1
  67. package/dist/index.mjs +14 -12
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/key-mapping-CS-YD_cD.mjs +132 -0
  70. package/dist/key-mapping-CS-YD_cD.mjs.map +1 -0
  71. package/dist/key-mapping-Yn-Jgrij.mjs +3 -0
  72. package/dist/{layout-engine-B6Cdz1yZ.mjs → layout-engine-C07LEXWT.mjs} +1 -1
  73. package/dist/layout-engine-C2px0RJE.mjs +67 -0
  74. package/dist/layout-engine-C2px0RJE.mjs.map +1 -0
  75. package/dist/layout-signals-Cnw6xk8Q.mjs +988 -0
  76. package/dist/layout-signals-Cnw6xk8Q.mjs.map +1 -0
  77. package/dist/mouse-events-Dki3ISIp.mjs +1044 -0
  78. package/dist/mouse-events-Dki3ISIp.mjs.map +1 -0
  79. package/dist/{multi-progress-Bq9Oi_WI.mjs → multi-progress-CIRjrzma.mjs} +3 -3
  80. package/dist/{multi-progress-Bq9Oi_WI.mjs.map → multi-progress-CIRjrzma.mjs.map} +1 -1
  81. package/dist/{multi-progress-DAQC7eap.d.mts → multi-progress-DHZ2xUT2.d.mts} +2 -2
  82. package/dist/{multi-progress-DAQC7eap.d.mts.map → multi-progress-DHZ2xUT2.d.mts.map} +1 -1
  83. package/dist/{node-BeWlnCPY.mjs → node-CjM5Rt-M.mjs} +4 -4
  84. package/dist/node-CjM5Rt-M.mjs.map +1 -0
  85. package/dist/playwright-D5YiZcNS.mjs +76397 -0
  86. package/dist/playwright-D5YiZcNS.mjs.map +1 -0
  87. package/dist/png-codec-Dp84742B.mjs +36 -0
  88. package/dist/png-codec-Dp84742B.mjs.map +1 -0
  89. package/dist/png-codec-QwOtJ8Zs.mjs +3 -0
  90. package/dist/progress-DB_Xo071.mjs +675 -0
  91. package/dist/progress-DB_Xo071.mjs.map +1 -0
  92. package/dist/{progress-bar-CXE5Qfkd.mjs → progress-bar-oJwq22CR.mjs} +4 -4
  93. package/dist/{progress-bar-CXE5Qfkd.mjs.map → progress-bar-oJwq22CR.mjs.map} +1 -1
  94. package/dist/rasterizer-BRXrDdWx.mjs +3 -0
  95. package/dist/rasterizer-CpEhJvdR.mjs +296 -0
  96. package/dist/rasterizer-CpEhJvdR.mjs.map +1 -0
  97. package/dist/reconciler-DldIJB93.mjs +2083 -0
  98. package/dist/reconciler-DldIJB93.mjs.map +1 -0
  99. package/dist/{render-string-0mN37DLf.mjs → render-string-BcoCpjCB.mjs} +1 -1
  100. package/dist/{render-string-X-CxpTdZ.mjs → render-string-DkQacASz.mjs} +2728 -555
  101. package/dist/render-string-DkQacASz.mjs.map +1 -0
  102. package/dist/resvg-js-DkOndZI3.mjs +203 -0
  103. package/dist/resvg-js-DkOndZI3.mjs.map +1 -0
  104. package/dist/runtime.d.mts +3 -2
  105. package/dist/runtime.mjs +3 -3
  106. package/dist/schemes-JjNp4aSl.mjs +2611 -0
  107. package/dist/schemes-JjNp4aSl.mjs.map +1 -0
  108. package/dist/{spinner-CGo34vyR.d.mts → spinner-CZINHpkV.d.mts} +2 -2
  109. package/dist/{spinner-CGo34vyR.d.mts.map → spinner-CZINHpkV.d.mts.map} +1 -1
  110. package/dist/{spinner-CeOmcuw_.mjs → spinner-D9lrHr8s.mjs} +7 -7
  111. package/dist/spinner-D9lrHr8s.mjs.map +1 -0
  112. package/dist/src-5w9QR6_8.mjs +1071 -0
  113. package/dist/src-5w9QR6_8.mjs.map +1 -0
  114. package/dist/src-BNTToU7l.mjs +4387 -0
  115. package/dist/src-BNTToU7l.mjs.map +1 -0
  116. package/dist/{src-Bd7ezSgG.mjs → src-BR4xNwdG.mjs} +10436 -2622
  117. package/dist/src-BR4xNwdG.mjs.map +1 -0
  118. package/dist/{types-Bk2yw9Qj.mjs → src-DKp-_OFG.mjs} +34 -94
  119. package/dist/src-DKp-_OFG.mjs.map +1 -0
  120. package/dist/src-bt8wSrfJ.mjs +258 -0
  121. package/dist/src-bt8wSrfJ.mjs.map +1 -0
  122. package/dist/src-e33Y6kNJ.mjs +3 -0
  123. package/dist/src-iDwu25UD.mjs +1814 -0
  124. package/dist/src-iDwu25UD.mjs.map +1 -0
  125. package/dist/steps-Bp2uNqnn.d.mts +202 -0
  126. package/dist/steps-Bp2uNqnn.d.mts.map +1 -0
  127. package/dist/svg-15lZZzxq.mjs +486 -0
  128. package/dist/svg-15lZZzxq.mjs.map +1 -0
  129. package/dist/svg-Cz0UXcDj.mjs +255 -0
  130. package/dist/svg-Cz0UXcDj.mjs.map +1 -0
  131. package/dist/svg-DY72a4HK.mjs +3 -0
  132. package/dist/svg-g1D6ErwR.d.mts +82 -0
  133. package/dist/svg-g1D6ErwR.d.mts.map +1 -0
  134. package/dist/term.d.mts +3 -0
  135. package/dist/term.mjs +9 -0
  136. package/dist/term.mjs.map +1 -0
  137. package/dist/theme.d.mts +95 -2
  138. package/dist/theme.d.mts.map +1 -0
  139. package/dist/theme.mjs +9 -3
  140. package/dist/theme.mjs.map +1 -0
  141. package/dist/{types-BH_v3iMT.d.mts → types-kt_fKR37.d.mts} +2 -15
  142. package/dist/types-kt_fKR37.d.mts.map +1 -0
  143. package/dist/ui/animation.d.mts +2 -1
  144. package/dist/ui/animation.mjs +1 -1
  145. package/dist/ui/ansi.d.mts +1 -1
  146. package/dist/ui/ansi.mjs +1 -1
  147. package/dist/ui/cli.d.mts +3 -3
  148. package/dist/ui/cli.mjs +5 -5
  149. package/dist/ui/display.d.mts +1 -1
  150. package/dist/ui/image.d.mts +2 -2
  151. package/dist/ui/image.mjs +2 -2
  152. package/dist/ui/input.d.mts +1 -1
  153. package/dist/ui/input.mjs +4 -2
  154. package/dist/ui/input.mjs.map +1 -1
  155. package/dist/ui/progress.d.mts +5 -249
  156. package/dist/ui/progress.mjs +5 -858
  157. package/dist/ui/react.d.mts +1 -1
  158. package/dist/ui/react.mjs +2 -2
  159. package/dist/ui/recording-chrome-react.d.mts +21 -0
  160. package/dist/ui/recording-chrome-react.d.mts.map +1 -0
  161. package/dist/ui/recording-chrome-react.mjs +105 -0
  162. package/dist/ui/recording-chrome-react.mjs.map +1 -0
  163. package/dist/ui/recording-chrome.d.mts +2 -0
  164. package/dist/ui/recording-chrome.mjs +2 -0
  165. package/dist/ui/utils.mjs +1 -1
  166. package/dist/ui/wrappers.d.mts +3 -3
  167. package/dist/ui/wrappers.mjs +2 -2
  168. package/dist/ui.d.mts +7 -6
  169. package/dist/ui.mjs +8 -7
  170. package/dist/{useLatest-Bg2x4bfP.d.mts → useLatest-DRDDVwjh.d.mts} +5 -25
  171. package/dist/useLatest-DRDDVwjh.d.mts.map +1 -0
  172. package/dist/{with-text-input-CRfoiFFG.d.mts → with-text-input-YeohVLeo.d.mts} +4 -55
  173. package/dist/with-text-input-YeohVLeo.d.mts.map +1 -0
  174. package/dist/wrapper-C70ATkVv.mjs +3527 -0
  175. package/dist/wrapper-C70ATkVv.mjs.map +1 -0
  176. package/dist/{wrappers-UTADQkSY.mjs → wrappers-BCUYITrY.mjs} +5 -157
  177. package/dist/wrappers-BCUYITrY.mjs.map +1 -0
  178. package/dist/{yoga-adapter-8oRGRw8V.mjs → yoga-adapter-BnZX1PAY.mjs} +28 -2
  179. package/dist/yoga-adapter-BnZX1PAY.mjs.map +1 -0
  180. package/dist/yoga-adapter-DxgsQ_gg.mjs +2 -0
  181. package/dist/zipBundle-3nqeDRtm.mjs +3 -0
  182. package/dist/zipBundle-VNAYFmqJ.mjs +2003 -0
  183. package/dist/zipBundle-VNAYFmqJ.mjs.map +1 -0
  184. package/package.json +20 -9
  185. package/dist/animation-Cn64yepo.mjs.map +0 -1
  186. package/dist/cli-BKp0YtBD.mjs +0 -4
  187. package/dist/devtools-9QY4teqI.mjs +0 -2
  188. package/dist/flexily-zero-adapter-BlQa46nr.mjs +0 -3385
  189. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +0 -1
  190. package/dist/image-CTII5QWI.mjs +0 -477
  191. package/dist/image-CTII5QWI.mjs.map +0 -1
  192. package/dist/index-BXslOebb.d.mts.map +0 -1
  193. package/dist/index-BnA7mNpo.d.mts +0 -175
  194. package/dist/index-BnA7mNpo.d.mts.map +0 -1
  195. package/dist/index-D3saHouR.d.mts.map +0 -1
  196. package/dist/layout-engine-ClUgv6jB.mjs +0 -50
  197. package/dist/layout-engine-ClUgv6jB.mjs.map +0 -1
  198. package/dist/node-BeWlnCPY.mjs.map +0 -1
  199. package/dist/reconciler-Cwgm8hRR.mjs +0 -8459
  200. package/dist/reconciler-Cwgm8hRR.mjs.map +0 -1
  201. package/dist/render-string-X-CxpTdZ.mjs.map +0 -1
  202. package/dist/spinner-CeOmcuw_.mjs.map +0 -1
  203. package/dist/src-B5GjfG7g.mjs +0 -4305
  204. package/dist/src-B5GjfG7g.mjs.map +0 -1
  205. package/dist/src-Bd7ezSgG.mjs.map +0 -1
  206. package/dist/src-CChwjk0Z.mjs +0 -738
  207. package/dist/src-CChwjk0Z.mjs.map +0 -1
  208. package/dist/src-NCKb8kE5.mjs +0 -2660
  209. package/dist/src-NCKb8kE5.mjs.map +0 -1
  210. package/dist/types-BH_v3iMT.d.mts.map +0 -1
  211. package/dist/types-Bk2yw9Qj.mjs.map +0 -1
  212. package/dist/ui/progress.d.mts.map +0 -1
  213. package/dist/ui/progress.mjs.map +0 -1
  214. package/dist/useLatest-Bg2x4bfP.d.mts.map +0 -1
  215. package/dist/with-text-input-CRfoiFFG.d.mts.map +0 -1
  216. package/dist/wrappers-UTADQkSY.mjs.map +0 -1
  217. package/dist/yoga-adapter-8oRGRw8V.mjs.map +0 -1
  218. package/dist/yoga-adapter-D_CcxSt5.mjs +0 -2
@@ -0,0 +1,1071 @@
1
+ import { n as __esmMin, r as __exportAll } from "./chunk-BSw8zbkd.mjs";
2
+ import { D as bakeFlat, L as detectTerminalScheme, O as defaultFlattenRule, P as ANSI16_SLOT_HEX, R as detectTheme, a as STERLING_FLAT_TOKENS, at as deriveRoles, c as detectScheme, ct as WCAG_AA, dt as deriveFields, i as defaultScheme, it as deriveTheme, l as detectSchemeTheme, lt as autoLift, n as sterling, ot as deriveTheme$1, r as defineDesignSystem, st as ContrastError, t as init_src$1, u as COLOR_SCHEME_FIELDS, ut as checkAA, z as probeColors } from "./src-BNTToU7l.mjs";
3
+ import { A as monokaiPro, B as gruvboxLight, C as ayuLight, D as materialLight, E as materialDark, F as kanagawaWave, G as solarizedDark, H as tokyoNight, I as rosePine, J as nord, K as solarizedLight, L as rosePineDawn, M as everforestLight, N as kanagawaDragon, O as snazzy, P as kanagawaLotus, Q as catppuccinMocha, R as rosePineMoon, S as ayuDark, T as palenight, U as tokyoNightDay, V as oneDark, W as tokyoNightStorm, X as catppuccinLatte, Y as catppuccinFrappe, Z as catppuccinMacchiato, _ as nightfly, a as defaultDarkTheme, b as dawnfox, c as getThemeByName, d as modusVivendi, f as edgeDark, g as oxocarbonLight, h as oxocarbonDark, i as builtinThemes, j as everforestDark, k as monokai, l as init_schemes, m as sonokai, n as ansi16LightTheme, o as defaultLightTheme, p as edgeLight, q as dracula, r as builtinPalettes, s as getSchemeByName, t as ansi16DarkTheme, u as modusOperandi, v as moonfly, w as ayuMirage, x as nightfox, y as horizon, z as gruvboxDark } from "./schemes-JjNp4aSl.mjs";
4
+ import { blend, brighten, darken, hexToOklch, hexToRgb, oklchToHex, relativeLuminance } from "@silvery/color";
5
+ //#region packages/theme/src/generate.ts
6
+ /**
7
+ * Resolve an ANSI16 slot name (e.g. "yellow", "blueBright") to its canonical
8
+ * hex value. Falls back to the input string if not found (e.g., already hex).
9
+ */
10
+ function slotHex(name) {
11
+ return ANSI16_SLOT_HEX[name] ?? name;
12
+ }
13
+ /**
14
+ * Generate a complete ANSI 16 theme from a primary color + dark/light preference.
15
+ *
16
+ * All token values are hex strings (e.g. "#808000" for yellow).
17
+ * Terminal rendering quantizes these to 4-bit ANSI codes at paint time
18
+ * when colorLevel === "ansi16".
19
+ */
20
+ function generateTheme(primary, dark) {
21
+ const primaryHex = slotHex(primary);
22
+ const fgHex = slotHex(dark ? "whiteBright" : "black");
23
+ const accentHex = primaryHex;
24
+ const selectionbgHex = primaryHex;
25
+ const surfacebgHex = slotHex(dark ? "black" : "white");
26
+ const derived = deriveFields({
27
+ primary: primaryHex,
28
+ accent: accentHex,
29
+ fg: fgHex,
30
+ selectionbg: selectionbgHex,
31
+ surfacebg: surfacebgHex,
32
+ ring: {
33
+ red: slotHex(dark ? "redBright" : "red"),
34
+ orange: slotHex(dark ? "redBright" : "red"),
35
+ yellow: slotHex("yellow"),
36
+ green: slotHex(dark ? "greenBright" : "green"),
37
+ teal: slotHex("cyan"),
38
+ blue: slotHex(dark ? "blueBright" : "blue"),
39
+ purple: slotHex("magenta"),
40
+ pink: slotHex(dark ? "magentaBright" : "magenta")
41
+ }
42
+ });
43
+ return {
44
+ name: `${dark ? "dark" : "light"}-${primary}`,
45
+ bg: "",
46
+ fg: fgHex,
47
+ muted: slotHex(dark ? "white" : "blackBright"),
48
+ mutedbg: slotHex(dark ? "black" : "white"),
49
+ surface: slotHex(dark ? "whiteBright" : "black"),
50
+ surfacebg: surfacebgHex,
51
+ popover: slotHex(dark ? "whiteBright" : "black"),
52
+ popoverbg: slotHex(dark ? "blackBright" : "white"),
53
+ inverse: slotHex(dark ? "black" : "whiteBright"),
54
+ inversebg: slotHex(dark ? "whiteBright" : "black"),
55
+ cursor: slotHex("black"),
56
+ cursorbg: primaryHex,
57
+ selection: slotHex("black"),
58
+ selectionbg: primaryHex,
59
+ primary: primaryHex,
60
+ primaryfg: slotHex("black"),
61
+ secondary: primaryHex,
62
+ secondaryfg: slotHex("black"),
63
+ accent: primaryHex,
64
+ accentfg: slotHex("black"),
65
+ error: slotHex(dark ? "redBright" : "red"),
66
+ errorfg: slotHex("black"),
67
+ warning: primaryHex,
68
+ warningfg: slotHex("black"),
69
+ success: slotHex(dark ? "greenBright" : "green"),
70
+ successfg: slotHex("black"),
71
+ info: slotHex(dark ? "cyanBright" : "cyan"),
72
+ infofg: slotHex("black"),
73
+ border: slotHex("gray"),
74
+ inputborder: slotHex("gray"),
75
+ focusborder: slotHex(dark ? "blueBright" : "blue"),
76
+ disabledfg: slotHex("gray"),
77
+ palette: [
78
+ slotHex("black"),
79
+ slotHex("red"),
80
+ slotHex("green"),
81
+ slotHex("yellow"),
82
+ slotHex("blue"),
83
+ slotHex("magenta"),
84
+ slotHex("cyan"),
85
+ slotHex("white"),
86
+ slotHex("blackBright"),
87
+ slotHex("redBright"),
88
+ slotHex("greenBright"),
89
+ slotHex("yellowBright"),
90
+ slotHex("blueBright"),
91
+ slotHex("magentaBright"),
92
+ slotHex("cyanBright"),
93
+ slotHex("whiteBright")
94
+ ],
95
+ ...derived
96
+ };
97
+ }
98
+ var init_generate = __esmMin((() => {
99
+ init_src$1();
100
+ }));
101
+ //#endregion
102
+ //#region packages/theme/src/import/types.ts
103
+ var BASE16_KEYS;
104
+ var init_types = __esmMin((() => {
105
+ BASE16_KEYS = [
106
+ "base00",
107
+ "base01",
108
+ "base02",
109
+ "base03",
110
+ "base04",
111
+ "base05",
112
+ "base06",
113
+ "base07",
114
+ "base08",
115
+ "base09",
116
+ "base0A",
117
+ "base0B",
118
+ "base0C",
119
+ "base0D",
120
+ "base0E",
121
+ "base0F"
122
+ ];
123
+ }));
124
+ //#endregion
125
+ //#region packages/theme/src/import/base16.ts
126
+ /**
127
+ * Import Base16 YAML/JSON schemes into ColorScheme format.
128
+ *
129
+ * Base16 defines 16 colors (base00–base0F). We map them to ColorScheme's
130
+ * 22 colors, deriving bright variants and special colors.
131
+ *
132
+ * @see https://github.com/chriskempson/base16
133
+ */
134
+ /**
135
+ * Parse Base16 YAML into a Base16Scheme object.
136
+ * Handles both quoted and unquoted values, comments, and blank lines.
137
+ */
138
+ function parseBase16Yaml(yaml) {
139
+ const result = {};
140
+ for (const raw of yaml.split("\n")) {
141
+ const line = raw.trim();
142
+ if (!line || line.startsWith("#")) continue;
143
+ const colonIdx = line.indexOf(":");
144
+ if (colonIdx === -1) continue;
145
+ const key = line.slice(0, colonIdx).trim();
146
+ let value = line.slice(colonIdx + 1).trim();
147
+ if (value.startsWith("\"") && value.endsWith("\"") || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
148
+ const commentIdx = value.indexOf("#");
149
+ if (commentIdx > 0) value = value.slice(0, commentIdx).trim();
150
+ result[key] = value;
151
+ }
152
+ if (!result.scheme) throw new Error("Base16 YAML missing required field: scheme");
153
+ for (const key of BASE16_KEYS) {
154
+ if (!result[key]) throw new Error(`Base16 YAML missing required color: ${key}`);
155
+ 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]}"`);
156
+ }
157
+ return result;
158
+ }
159
+ /** Compute relative luminance (WCAG 2.0) from a hex color with `#` prefix. */
160
+ function luminance(hex) {
161
+ const rgb = hexToRgb(hex);
162
+ if (!rgb) return 0;
163
+ const [r, g, b] = rgb.map((c) => {
164
+ const s = c / 255;
165
+ return s <= .03928 ? s / 12.92 : Math.pow((s + .055) / 1.055, 2.4);
166
+ });
167
+ return .2126 * r + .7152 * g + .0722 * b;
168
+ }
169
+ /** Normalize a bare hex string to `#RRGGBB` (uppercase). */
170
+ function hex(bare) {
171
+ return `#${bare.toUpperCase()}`;
172
+ }
173
+ /**
174
+ * Import a Base16 YAML (or JSON) scheme into a ColorScheme.
175
+ *
176
+ * Mapping:
177
+ * base00 → background, base01 → brightBlack, base02 → selectionBackground,
178
+ * base03 → white (muted fg), base05 → foreground/brightWhite,
179
+ * base08 → red, base09 → brightRed, base0A → yellow,
180
+ * base0B → green, base0C → cyan, base0D → blue, base0E → magenta,
181
+ * base0F → brightMagenta.
182
+ *
183
+ * Bright color variants are derived by brightening normals.
184
+ * `dark` is inferred from base00 luminance.
185
+ */
186
+ function importBase16(yamlOrJson) {
187
+ return base16ToColorScheme(parseBase16Yaml(yamlOrJson));
188
+ }
189
+ /** Convert a parsed Base16Scheme to ColorScheme. */
190
+ function base16ToColorScheme(scheme) {
191
+ const bg = hex(scheme.base00);
192
+ const fg = hex(scheme.base05);
193
+ const isDark = luminance(bg) < .179;
194
+ const black = isDark ? darken(bg, .15) : brighten(bg, .15);
195
+ const red = hex(scheme.base08);
196
+ const green = hex(scheme.base0B);
197
+ const yellow = hex(scheme.base0A);
198
+ const blue = hex(scheme.base0D);
199
+ const magenta = hex(scheme.base0E);
200
+ const cyan = hex(scheme.base0C);
201
+ return {
202
+ name: scheme.scheme,
203
+ dark: isDark,
204
+ black,
205
+ red,
206
+ green,
207
+ yellow,
208
+ blue,
209
+ magenta,
210
+ cyan,
211
+ white: hex(scheme.base03),
212
+ brightBlack: hex(scheme.base01),
213
+ brightRed: hex(scheme.base09),
214
+ brightGreen: brighten(green, .15),
215
+ brightYellow: brighten(yellow, .15),
216
+ brightBlue: brighten(blue, .15),
217
+ brightMagenta: hex(scheme.base0F),
218
+ brightCyan: brighten(cyan, .15),
219
+ brightWhite: fg,
220
+ foreground: fg,
221
+ background: bg,
222
+ cursorColor: fg,
223
+ cursorText: bg,
224
+ selectionBackground: hex(scheme.base02),
225
+ selectionForeground: fg
226
+ };
227
+ }
228
+ var init_base16$1 = __esmMin((() => {
229
+ init_types();
230
+ }));
231
+ //#endregion
232
+ //#region packages/theme/src/generators.ts
233
+ /**
234
+ * Palette generators — produce a ColorScheme from various inputs.
235
+ *
236
+ * All generators return a complete ColorScheme (22 fields).
237
+ */
238
+ function isDarkColor$1(hex) {
239
+ const L = relativeLuminance(hex);
240
+ return L === null ? true : L < .5;
241
+ }
242
+ /** Find which hue slot the primary color best matches by OKLCH hue angle proximity. */
243
+ function assignPrimaryToSlot(primary) {
244
+ const o = hexToOklch(primary);
245
+ if (!o) return "blue";
246
+ const h = o.H;
247
+ for (const [lo, hi, name] of [
248
+ [
249
+ 0,
250
+ 15,
251
+ "red"
252
+ ],
253
+ [
254
+ 15,
255
+ 42,
256
+ "orange"
257
+ ],
258
+ [
259
+ 42,
260
+ 75,
261
+ "yellow"
262
+ ],
263
+ [
264
+ 75,
265
+ 170,
266
+ "green"
267
+ ],
268
+ [
269
+ 170,
270
+ 210,
271
+ "teal"
272
+ ],
273
+ [
274
+ 210,
275
+ 275,
276
+ "blue"
277
+ ],
278
+ [
279
+ 275,
280
+ 330,
281
+ "purple"
282
+ ],
283
+ [
284
+ 330,
285
+ 360,
286
+ "pink"
287
+ ]
288
+ ]) if (h >= lo && h < hi) return name;
289
+ return "red";
290
+ }
291
+ /** Generate 8 accent hues from a primary, placing it in its natural slot. */
292
+ function generateAccentsFromPrimary(primary) {
293
+ const o = hexToOklch(primary);
294
+ if (!o) return {
295
+ red: "#BF616A",
296
+ orange: "#D08770",
297
+ yellow: "#EBCB8B",
298
+ green: "#A3BE8C",
299
+ teal: "#88C0D0",
300
+ blue: "#5E81AC",
301
+ purple: "#B48EAD",
302
+ pink: "#D4879C"
303
+ };
304
+ const slot = assignPrimaryToSlot(primary);
305
+ const result = {};
306
+ for (const [name, targetH] of Object.entries(targetHues)) result[name] = name === slot ? primary : oklchToHex({
307
+ L: o.L,
308
+ C: o.C,
309
+ H: targetH
310
+ });
311
+ return result;
312
+ }
313
+ /**
314
+ * Generate a ColorScheme from a Base16 YAML scheme.
315
+ *
316
+ * Maps base00–base0F to ANSI palette colors, derives special colors.
317
+ */
318
+ function fromBase16(yamlOrJson) {
319
+ return importBase16(yamlOrJson);
320
+ }
321
+ /**
322
+ * Generate a full ColorScheme from 1-3 hex colors.
323
+ *
324
+ * At minimum, provide `background` or `primary`. Missing colors are
325
+ * generated via surface ramp (from bg) and hue rotation (from primary).
326
+ */
327
+ function fromColors(opts) {
328
+ const dark = opts.dark ?? (opts.background ? isDarkColor$1(opts.background) : true);
329
+ const step = dark ? brighten : darken;
330
+ const bg = opts.background ?? (dark ? "#2E3440" : "#FFFFFF");
331
+ const fg = opts.foreground ?? step(bg, .85);
332
+ const accents = opts.primary ? generateAccentsFromPrimary(opts.primary) : {
333
+ red: "#BF616A",
334
+ orange: "#D08770",
335
+ yellow: "#EBCB8B",
336
+ green: "#A3BE8C",
337
+ teal: "#88C0D0",
338
+ blue: "#5E81AC",
339
+ purple: "#B48EAD",
340
+ pink: "#D4879C"
341
+ };
342
+ const black = dark ? darken(bg, .05) : darken(bg, .1);
343
+ const white = dark ? blend(fg, bg, .3) : blend(bg, fg, .3);
344
+ const brightBlack = step(bg, .15);
345
+ const brightWhite = dark ? fg : brighten(fg, .1);
346
+ return {
347
+ name: opts.name ?? (dark ? "generated-dark" : "generated-light"),
348
+ dark,
349
+ primary: opts.primary,
350
+ black,
351
+ red: accents.red,
352
+ green: accents.green,
353
+ yellow: accents.yellow,
354
+ blue: accents.blue,
355
+ magenta: accents.purple,
356
+ cyan: accents.teal,
357
+ white,
358
+ brightBlack,
359
+ brightRed: accents.orange,
360
+ brightGreen: brighten(accents.green, .15),
361
+ brightYellow: brighten(accents.yellow, .15),
362
+ brightBlue: brighten(accents.blue, .15),
363
+ brightMagenta: accents.pink,
364
+ brightCyan: brighten(accents.teal, .15),
365
+ brightWhite,
366
+ foreground: fg,
367
+ background: bg,
368
+ cursorColor: fg,
369
+ cursorText: bg,
370
+ selectionBackground: blend(bg, accents.blue, .3),
371
+ selectionForeground: fg
372
+ };
373
+ }
374
+ /**
375
+ * Look up a built-in palette by name.
376
+ *
377
+ * @returns The ColorScheme, or undefined if not found.
378
+ */
379
+ function fromPreset(name) {
380
+ return getSchemeByName(name);
381
+ }
382
+ var targetHues;
383
+ var init_generators = __esmMin((() => {
384
+ init_base16$1();
385
+ init_schemes();
386
+ targetHues = {
387
+ red: 29,
388
+ orange: 55,
389
+ yellow: 90,
390
+ green: 142,
391
+ teal: 195,
392
+ blue: 240,
393
+ purple: 305,
394
+ pink: 350
395
+ };
396
+ }));
397
+ //#endregion
398
+ //#region packages/theme/src/builder.ts
399
+ /**
400
+ * Chainable theme builder — create themes from minimal input.
401
+ *
402
+ * @example
403
+ * ```typescript
404
+ * // Just a background color
405
+ * const theme = createTheme().bg('#2E3440').build()
406
+ *
407
+ * // Primary + explicit dark mode
408
+ * const theme = createTheme().primary('#EBCB8B').dark().build()
409
+ *
410
+ * // Three-color input (dark/light inferred from bg luminance)
411
+ * const theme = createTheme()
412
+ * .bg('#2E3440').fg('#ECEFF4').primary('#EBCB8B').build()
413
+ *
414
+ * // Preset with override
415
+ * const theme = createTheme().preset('nord').primary('#A3BE8C').build()
416
+ * ```
417
+ */
418
+ function isDarkColor(hex) {
419
+ const rgb = hexToRgb(hex);
420
+ if (!rgb) return true;
421
+ return (rgb[0] + rgb[1] + rgb[2]) / 765 < .5;
422
+ }
423
+ /** Create a chainable theme builder. */
424
+ function createTheme() {
425
+ const state = { colors: {} };
426
+ const builder = {
427
+ bg(color) {
428
+ state.bgColor = color;
429
+ return builder;
430
+ },
431
+ fg(color) {
432
+ state.fgColor = color;
433
+ return builder;
434
+ },
435
+ primary(color) {
436
+ state.primaryColor = color;
437
+ return builder;
438
+ },
439
+ accent(color) {
440
+ return builder.primary(color);
441
+ },
442
+ dark() {
443
+ state.dark = true;
444
+ return builder;
445
+ },
446
+ light() {
447
+ state.dark = false;
448
+ return builder;
449
+ },
450
+ color(name, value) {
451
+ state.colors[name] = value;
452
+ return builder;
453
+ },
454
+ palette(p) {
455
+ state.presetPalette = p;
456
+ return builder;
457
+ },
458
+ preset(name) {
459
+ const p = getSchemeByName(name);
460
+ if (p) state.presetPalette = p;
461
+ return builder;
462
+ },
463
+ build() {
464
+ const isDark = state.dark ?? (state.bgColor ? isDarkColor(state.bgColor) : true);
465
+ let palette;
466
+ if (state.presetPalette) {
467
+ palette = { ...state.presetPalette };
468
+ if (state.bgColor) palette.background = state.bgColor;
469
+ if (state.fgColor) palette.foreground = state.fgColor;
470
+ if (state.primaryColor) {
471
+ palette.primary = state.primaryColor;
472
+ const ansiName = hueToAnsiField(assignPrimaryToSlot(state.primaryColor));
473
+ palette[ansiName] = state.primaryColor;
474
+ }
475
+ palette.dark = isDark;
476
+ } else palette = fromColors({
477
+ background: state.bgColor,
478
+ foreground: state.fgColor,
479
+ primary: state.primaryColor,
480
+ dark: isDark
481
+ });
482
+ for (const [key, val] of Object.entries(state.colors)) if (val !== void 0 && typeof val === "string") palette[key] = val;
483
+ return deriveTheme(palette);
484
+ }
485
+ };
486
+ return builder;
487
+ }
488
+ /** Map a HueName to the corresponding ColorScheme field. */
489
+ function hueToAnsiField(hue) {
490
+ return {
491
+ red: "red",
492
+ orange: "brightRed",
493
+ yellow: "yellow",
494
+ green: "green",
495
+ teal: "cyan",
496
+ blue: "blue",
497
+ purple: "magenta",
498
+ pink: "brightMagenta"
499
+ }[hue];
500
+ }
501
+ /**
502
+ * Quick theme from a primary color or color name.
503
+ *
504
+ * @example
505
+ * ```typescript
506
+ * quickTheme('#EBCB8B', 'dark') // yellow primary, dark mode
507
+ * quickTheme('blue') // blue primary, default dark
508
+ * ```
509
+ */
510
+ function quickTheme(primaryOrHex, mode) {
511
+ const b = createTheme();
512
+ if (primaryOrHex.startsWith("#")) b.primary(primaryOrHex);
513
+ else b.primary({
514
+ red: "#BF616A",
515
+ orange: "#D08770",
516
+ yellow: "#EBCB8B",
517
+ green: "#A3BE8C",
518
+ teal: "#88C0D0",
519
+ cyan: "#88C0D0",
520
+ blue: "#5E81AC",
521
+ purple: "#B48EAD",
522
+ pink: "#D4879C",
523
+ magenta: "#B48EAD",
524
+ white: "#ECEFF4"
525
+ }[primaryOrHex] ?? "#5E81AC");
526
+ if (mode === "dark") b.dark();
527
+ else if (mode === "light") b.light();
528
+ return b.build();
529
+ }
530
+ /**
531
+ * Create a theme from a built-in preset name.
532
+ *
533
+ * @example
534
+ * ```typescript
535
+ * presetTheme('catppuccin-mocha')
536
+ * presetTheme('nord')
537
+ * ```
538
+ */
539
+ function presetTheme(name) {
540
+ return createTheme().preset(name).build();
541
+ }
542
+ var init_builder = __esmMin((() => {
543
+ init_src$1();
544
+ init_generators();
545
+ init_schemes();
546
+ }));
547
+ //#endregion
548
+ //#region packages/theme/src/auto-generate.ts
549
+ /**
550
+ * Auto-generate themes — create a complete Theme from a single primary color.
551
+ *
552
+ * Uses OKLCH color manipulation to derive complementary and analogous colors
553
+ * for the full palette from one input color. OKLCH preserves perceived
554
+ * lightness and chroma across hue rotations, so accent ramps look balanced.
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
+ var HUE;
669
+ var init_auto_generate = __esmMin((() => {
670
+ init_generators();
671
+ init_src$1();
672
+ HUE = {
673
+ red: 29,
674
+ orangeBright: 55,
675
+ yellow: 90,
676
+ green: 142,
677
+ cyan: 195,
678
+ blue: 240,
679
+ magenta: 310,
680
+ pinkBright: 350
681
+ };
682
+ }));
683
+ //#endregion
684
+ //#region packages/theme/src/validate.ts
685
+ /**
686
+ * Palette validation — checks ColorScheme fields and contrast.
687
+ */
688
+ /**
689
+ * Validate a ColorScheme.
690
+ *
691
+ * Checks:
692
+ * - All 22 color fields are present and non-empty hex strings
693
+ * - Warns on low-contrast foreground/background combinations
694
+ */
695
+ function validateColorScheme(p) {
696
+ const errors = [];
697
+ const warnings = [];
698
+ for (const field of COLOR_SCHEME_FIELDS) {
699
+ const val = p[field];
700
+ if (!val || typeof val !== "string") errors.push(`${field} is required and must be a non-empty string`);
701
+ }
702
+ if (p.foreground && p.background) {
703
+ const fgRgb = hexToRgb(p.foreground);
704
+ const bgRgb = hexToRgb(p.background);
705
+ if (fgRgb && bgRgb) {
706
+ const fgSum = fgRgb[0] + fgRgb[1] + fgRgb[2];
707
+ const bgSum = bgRgb[0] + bgRgb[1] + bgRgb[2];
708
+ if (fgSum > 384 === bgSum > 384) warnings.push(`Low contrast: foreground (${p.foreground}) and background (${p.background}) have similar lightness`);
709
+ }
710
+ }
711
+ return {
712
+ valid: errors.length === 0,
713
+ errors,
714
+ warnings
715
+ };
716
+ }
717
+ var init_validate = __esmMin((() => {
718
+ init_src$1();
719
+ }));
720
+ //#endregion
721
+ //#region packages/theme/src/validate-theme.ts
722
+ /**
723
+ * Validate a Theme object — check that all required tokens are present.
724
+ *
725
+ * @param theme - The theme object to validate
726
+ * @returns Validation result with missing and extra token lists
727
+ *
728
+ * @example
729
+ * ```typescript
730
+ * const result = validateTheme(myTheme)
731
+ * if (!result.valid) {
732
+ * console.log("Missing tokens:", result.missing)
733
+ * }
734
+ * ```
735
+ */
736
+ function validateTheme(theme) {
737
+ const missing = [];
738
+ const extra = [];
739
+ for (const key of THEME_TOKEN_KEYS) {
740
+ const val = theme[key];
741
+ if (val === void 0 || val === null || val === "") missing.push(key);
742
+ }
743
+ for (const key of Object.keys(theme)) if (!ALL_KNOWN_KEYS.has(key)) extra.push(key);
744
+ return {
745
+ valid: missing.length === 0,
746
+ missing,
747
+ extra
748
+ };
749
+ }
750
+ var THEME_TOKEN_KEYS, ALL_KNOWN_KEYS;
751
+ var init_validate_theme = __esmMin((() => {
752
+ THEME_TOKEN_KEYS = [
753
+ "bg",
754
+ "fg",
755
+ "muted",
756
+ "mutedbg",
757
+ "surface",
758
+ "surfacebg",
759
+ "popover",
760
+ "popoverbg",
761
+ "cursor",
762
+ "cursorbg",
763
+ "primary",
764
+ "primaryfg",
765
+ "secondary",
766
+ "secondaryfg",
767
+ "accent",
768
+ "accentfg",
769
+ "error",
770
+ "errorfg",
771
+ "warning",
772
+ "warningfg",
773
+ "success",
774
+ "successfg",
775
+ "info",
776
+ "infofg",
777
+ "border",
778
+ "inputborder",
779
+ "focusborder",
780
+ "disabledfg"
781
+ ];
782
+ ALL_KNOWN_KEYS = new Set([
783
+ ...THEME_TOKEN_KEYS,
784
+ "name",
785
+ "palette"
786
+ ]);
787
+ }));
788
+ //#endregion
789
+ //#region packages/theme/src/alias.ts
790
+ /**
791
+ * Resolve all token aliases in a theme.
792
+ *
793
+ * Token values that start with `$` are treated as references to other tokens.
794
+ * Alias chains are followed until a concrete (non-$) value is reached.
795
+ * Circular references are detected via a depth limit and left unresolved.
796
+ *
797
+ * @param theme - A theme-like object where values may reference other tokens via `$name`
798
+ * @returns A new object with all aliases resolved to concrete values
799
+ *
800
+ * @example
801
+ * ```typescript
802
+ * const themed = resolveAliases({
803
+ * ...baseTheme,
804
+ * button: "$primary", // resolves to the value of 'primary'
805
+ * buttonHover: "$button", // chain: buttonHover -> button -> primary -> hex
806
+ * })
807
+ * ```
808
+ */
809
+ function resolveAliases(theme) {
810
+ const result = {};
811
+ for (const key of Object.keys(theme)) result[key] = resolveAlias(key, theme, 0);
812
+ return result;
813
+ }
814
+ /**
815
+ * Resolve a single token's alias chain.
816
+ *
817
+ * @param key - The token key to resolve
818
+ * @param tokens - The full token map
819
+ * @param depth - Current recursion depth (for loop detection)
820
+ * @returns The resolved concrete value, or the raw alias string if unresolvable
821
+ */
822
+ function resolveAlias(key, tokens, depth) {
823
+ if (depth >= MAX_ALIAS_DEPTH) return tokens[key] ?? "";
824
+ const value = tokens[key];
825
+ if (value === void 0) return "";
826
+ if (!value.startsWith("$")) return value;
827
+ const refKey = value.slice(1);
828
+ if (!(refKey in tokens)) return value;
829
+ return resolveAlias(refKey, tokens, depth + 1);
830
+ }
831
+ /**
832
+ * Resolve a single alias value against a Theme.
833
+ *
834
+ * Useful for resolving individual values without processing the entire theme.
835
+ *
836
+ * @param value - The value to resolve (may be "$tokenName" or a concrete value)
837
+ * @param theme - The theme to resolve against
838
+ * @returns The resolved concrete value
839
+ */
840
+ function resolveTokenAlias(value, theme) {
841
+ if (!value.startsWith("$")) return value;
842
+ const seen = /* @__PURE__ */ new Set();
843
+ let current = value;
844
+ for (let i = 0; i < MAX_ALIAS_DEPTH; i++) {
845
+ if (!current.startsWith("$")) return current;
846
+ const key = current.slice(1);
847
+ if (seen.has(key)) return current;
848
+ seen.add(key);
849
+ const resolved = theme[key];
850
+ if (typeof resolved !== "string") return current;
851
+ current = resolved;
852
+ }
853
+ return current;
854
+ }
855
+ var MAX_ALIAS_DEPTH;
856
+ var init_alias = __esmMin((() => {
857
+ MAX_ALIAS_DEPTH = 10;
858
+ }));
859
+ //#endregion
860
+ //#region packages/theme/src/css.ts
861
+ /**
862
+ * Convert a Theme to CSS custom properties.
863
+ *
864
+ * Token names mirror Sterling's flat grammar with a `--` prefix:
865
+ * - `bg-surface-default` → `--bg-surface-default`
866
+ * - `fg-accent` → `--fg-accent`
867
+ * - `border-focus` → `--border-focus`
868
+ * - Palette entries: `--color0` through `--color15`
869
+ *
870
+ * @param theme - The theme to convert (Sterling flat tokens must be populated)
871
+ * @returns A record mapping CSS custom property names to color values
872
+ *
873
+ * @example
874
+ * ```typescript
875
+ * const vars = themeToCSSVars(myTheme)
876
+ * // { "--bg-surface-default": "#1E1E2E", "--fg-accent": "#F9E2AF", ... }
877
+ *
878
+ * // Apply to an element:
879
+ * Object.assign(element.style, vars)
880
+ * ```
881
+ */
882
+ function themeToCSSVars(theme) {
883
+ const vars = {};
884
+ const flat = theme;
885
+ for (const key of STERLING_FLAT_TOKENS) {
886
+ const value = flat[key];
887
+ if (typeof value === "string") vars[`--${key}`] = value;
888
+ }
889
+ if (theme.palette) for (let i = 0; i < theme.palette.length; i++) vars[`--color${i}`] = theme.palette[i];
890
+ return vars;
891
+ }
892
+ var init_css = __esmMin((() => {
893
+ init_src$1();
894
+ }));
895
+ //#endregion
896
+ //#region packages/theme/src/export/base16.ts
897
+ /**
898
+ * Export ColorScheme to Base16 YAML format.
899
+ *
900
+ * Maps ColorScheme fields to base00–base0F. For fields that
901
+ * ColorScheme doesn't store directly (base04/base06/base07),
902
+ * we interpolate between neighboring values.
903
+ *
904
+ * @see https://github.com/chriskempson/base16
905
+ */
906
+ /** Strip `#` prefix from a hex color string and uppercase. */
907
+ function stripHash(hex) {
908
+ return (hex.startsWith("#") ? hex.slice(1) : hex).toUpperCase();
909
+ }
910
+ /**
911
+ * Export a ColorScheme to Base16 YAML format.
912
+ *
913
+ * Mapping:
914
+ * background → base00, brightBlack → base01, selectionBackground → base02,
915
+ * white → base03, (interpolated) → base04, foreground → base05,
916
+ * (interpolated) → base06, (interpolated) → base07,
917
+ * red → base08, brightRed → base09, yellow → base0A, green → base0B,
918
+ * cyan → base0C, blue → base0D, magenta → base0E, brightMagenta → base0F.
919
+ */
920
+ function exportBase16(palette) {
921
+ const dark = palette.dark ?? true;
922
+ const base04 = blend(palette.white, palette.foreground, .33);
923
+ const base06 = dark ? blend(palette.foreground, "#FFFFFF", .15) : blend(palette.foreground, "#000000", .15);
924
+ const base07 = palette.black;
925
+ return [
926
+ `scheme: "${palette.name ?? "exported"}"`,
927
+ `author: ""`,
928
+ `base00: "${stripHash(palette.background)}"`,
929
+ `base01: "${stripHash(palette.brightBlack)}"`,
930
+ `base02: "${stripHash(palette.selectionBackground)}"`,
931
+ `base03: "${stripHash(palette.white)}"`,
932
+ `base04: "${stripHash(base04)}"`,
933
+ `base05: "${stripHash(palette.foreground)}"`,
934
+ `base06: "${stripHash(base06)}"`,
935
+ `base07: "${stripHash(base07)}"`,
936
+ `base08: "${stripHash(palette.red)}"`,
937
+ `base09: "${stripHash(palette.brightRed)}"`,
938
+ `base0A: "${stripHash(palette.yellow)}"`,
939
+ `base0B: "${stripHash(palette.green)}"`,
940
+ `base0C: "${stripHash(palette.cyan)}"`,
941
+ `base0D: "${stripHash(palette.blue)}"`,
942
+ `base0E: "${stripHash(palette.magenta)}"`,
943
+ `base0F: "${stripHash(palette.brightMagenta)}"`
944
+ ].join("\n") + "\n";
945
+ }
946
+ var init_base16 = __esmMin((() => {}));
947
+ //#endregion
948
+ //#region packages/theme/src/detect.ts
949
+ var init_detect = __esmMin((() => {
950
+ init_src$1();
951
+ }));
952
+ //#endregion
953
+ //#region packages/theme/src/sterling/index.ts
954
+ var init_sterling = __esmMin((() => {
955
+ init_src$1();
956
+ }));
957
+ //#endregion
958
+ //#region packages/theme/src/theme.ts
959
+ var init_theme = __esmMin((() => {
960
+ init_src$1();
961
+ init_generate();
962
+ init_generators();
963
+ init_builder();
964
+ init_auto_generate();
965
+ init_validate();
966
+ init_validate_theme();
967
+ init_alias();
968
+ init_css();
969
+ init_base16$1();
970
+ init_base16();
971
+ init_schemes();
972
+ init_detect();
973
+ init_sterling();
974
+ }));
975
+ //#endregion
976
+ //#region packages/theme/src/index.ts
977
+ var src_exports = /* @__PURE__ */ __exportAll({
978
+ COLOR_SCHEME_FIELDS: () => COLOR_SCHEME_FIELDS,
979
+ STERLING_FLAT_TOKENS: () => STERLING_FLAT_TOKENS,
980
+ SterlingContrastError: () => ContrastError,
981
+ THEME_TOKEN_KEYS: () => THEME_TOKEN_KEYS,
982
+ WCAG_AA: () => WCAG_AA,
983
+ ansi16DarkTheme: () => ansi16DarkTheme,
984
+ ansi16LightTheme: () => ansi16LightTheme,
985
+ assignPrimaryToSlot: () => assignPrimaryToSlot,
986
+ autoGenerateTheme: () => autoGenerateTheme,
987
+ ayuDark: () => ayuDark,
988
+ ayuLight: () => ayuLight,
989
+ ayuMirage: () => ayuMirage,
990
+ bakeFlat: () => bakeFlat,
991
+ builtinPalettes: () => builtinPalettes,
992
+ builtinThemes: () => builtinThemes,
993
+ catppuccinFrappe: () => catppuccinFrappe,
994
+ catppuccinLatte: () => catppuccinLatte,
995
+ catppuccinMacchiato: () => catppuccinMacchiato,
996
+ catppuccinMocha: () => catppuccinMocha,
997
+ createTheme: () => createTheme,
998
+ dawnfox: () => dawnfox,
999
+ defaultDarkTheme: () => defaultDarkTheme,
1000
+ defaultFlattenRule: () => defaultFlattenRule,
1001
+ defaultLightTheme: () => defaultLightTheme,
1002
+ defineDesignSystem: () => defineDesignSystem,
1003
+ detectScheme: () => detectScheme,
1004
+ detectSchemeTheme: () => detectSchemeTheme,
1005
+ detectTerminalScheme: () => detectTerminalScheme,
1006
+ detectTheme: () => detectTheme,
1007
+ dracula: () => dracula,
1008
+ edgeDark: () => edgeDark,
1009
+ edgeLight: () => edgeLight,
1010
+ everforestDark: () => everforestDark,
1011
+ everforestLight: () => everforestLight,
1012
+ exportBase16: () => exportBase16,
1013
+ fromBase16: () => fromBase16,
1014
+ fromColors: () => fromColors,
1015
+ fromPreset: () => fromPreset,
1016
+ generateTheme: () => generateTheme,
1017
+ getSchemeByName: () => getSchemeByName,
1018
+ getThemeByName: () => getThemeByName,
1019
+ gruvboxDark: () => gruvboxDark,
1020
+ gruvboxLight: () => gruvboxLight,
1021
+ horizon: () => horizon,
1022
+ importBase16: () => importBase16,
1023
+ kanagawaDragon: () => kanagawaDragon,
1024
+ kanagawaLotus: () => kanagawaLotus,
1025
+ kanagawaWave: () => kanagawaWave,
1026
+ materialDark: () => materialDark,
1027
+ materialLight: () => materialLight,
1028
+ modusOperandi: () => modusOperandi,
1029
+ modusVivendi: () => modusVivendi,
1030
+ monokai: () => monokai,
1031
+ monokaiPro: () => monokaiPro,
1032
+ moonfly: () => moonfly,
1033
+ nightfly: () => nightfly,
1034
+ nightfox: () => nightfox,
1035
+ nord: () => nord,
1036
+ oneDark: () => oneDark,
1037
+ oxocarbonDark: () => oxocarbonDark,
1038
+ oxocarbonLight: () => oxocarbonLight,
1039
+ palenight: () => palenight,
1040
+ presetTheme: () => presetTheme,
1041
+ probeColors: () => probeColors,
1042
+ quickTheme: () => quickTheme,
1043
+ resolveAliases: () => resolveAliases,
1044
+ resolveTokenAlias: () => resolveTokenAlias,
1045
+ rosePine: () => rosePine,
1046
+ rosePineDawn: () => rosePineDawn,
1047
+ rosePineMoon: () => rosePineMoon,
1048
+ snazzy: () => snazzy,
1049
+ solarizedDark: () => solarizedDark,
1050
+ solarizedLight: () => solarizedLight,
1051
+ sonokai: () => sonokai,
1052
+ sterling: () => sterling,
1053
+ sterlingAutoLift: () => autoLift,
1054
+ sterlingCheckAA: () => checkAA,
1055
+ sterlingDefaultScheme: () => defaultScheme,
1056
+ sterlingDeriveRoles: () => deriveRoles,
1057
+ sterlingDeriveTheme: () => deriveTheme$1,
1058
+ themeToCSSVars: () => themeToCSSVars,
1059
+ tokyoNight: () => tokyoNight,
1060
+ tokyoNightDay: () => tokyoNightDay,
1061
+ tokyoNightStorm: () => tokyoNightStorm,
1062
+ validateColorScheme: () => validateColorScheme,
1063
+ validateTheme: () => validateTheme
1064
+ });
1065
+ var init_src = __esmMin((() => {
1066
+ init_theme();
1067
+ }));
1068
+ //#endregion
1069
+ export { fromPreset as _, resolveAliases as a, validateTheme as c, createTheme as d, presetTheme as f, fromColors as g, fromBase16 as h, themeToCSSVars as i, validateColorScheme as l, assignPrimaryToSlot as m, src_exports as n, resolveTokenAlias as o, quickTheme as p, exportBase16 as r, THEME_TOKEN_KEYS as s, init_src as t, autoGenerateTheme as u, importBase16 as v, generateTheme as y };
1070
+
1071
+ //# sourceMappingURL=src-5w9QR6_8.mjs.map