color-map 2.2.0 → 2.3.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 (366) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.codex-plugin/plugin.json +12 -0
  3. package/.cursor-plugin/plugin.json +12 -0
  4. package/CHANGELOG.md +100 -0
  5. package/README.md +71 -8
  6. package/bin/cli-CELmx3Y9.js +6414 -0
  7. package/bin/color-map.js +9 -0
  8. package/bin/index.js +1 -0
  9. package/cjs/color/index.d.ts +5 -0
  10. package/cjs/color/index.js +52 -0
  11. package/cjs/color-wNrkrhC7.js +374 -0
  12. package/cjs/color-wNrkrhC7.js.map +1 -0
  13. package/cjs/contrast-XjF5Rwui.js +293 -0
  14. package/cjs/contrast-XjF5Rwui.js.map +1 -0
  15. package/cjs/gamut-CG1J2aat.d.ts +158 -0
  16. package/cjs/gamut-CG1J2aat.d.ts.map +1 -0
  17. package/cjs/index-BcEqCPHz.d.ts +137 -0
  18. package/cjs/index-BcEqCPHz.d.ts.map +1 -0
  19. package/cjs/index-CGKCqRqD.d.ts +111 -0
  20. package/cjs/index-CGKCqRqD.d.ts.map +1 -0
  21. package/cjs/index-Cv3iUUYE.d.ts +171 -0
  22. package/cjs/index-Cv3iUUYE.d.ts.map +1 -0
  23. package/cjs/index-Dw43Hj4v.d.ts +41 -0
  24. package/cjs/index-Dw43Hj4v.d.ts.map +1 -0
  25. package/cjs/index-Dy8UARqO.d.ts +72 -0
  26. package/cjs/index-Dy8UARqO.d.ts.map +1 -0
  27. package/cjs/index.d.ts +26 -36
  28. package/cjs/index.d.ts.map +1 -1
  29. package/cjs/index.js +83 -62
  30. package/cjs/index.js.map +1 -1
  31. package/cjs/legacy/index.d.ts +2 -0
  32. package/cjs/legacy/index.js +75 -0
  33. package/cjs/legacy/index.js.map +1 -0
  34. package/cjs/mix-Cs4owSbW.js +158 -0
  35. package/cjs/mix-Cs4owSbW.js.map +1 -0
  36. package/cjs/mix-DGlKoUw4.d.ts +31 -0
  37. package/cjs/mix-DGlKoUw4.d.ts.map +1 -0
  38. package/cjs/palette/index.d.ts +3 -0
  39. package/cjs/palette/index.js +8 -0
  40. package/cjs/palette-DyFV_KoJ.js +332 -0
  41. package/cjs/palette-DyFV_KoJ.js.map +1 -0
  42. package/cjs/parse-8mt2OMKf.js +1508 -0
  43. package/cjs/parse-8mt2OMKf.js.map +1 -0
  44. package/cjs/scale/index.d.ts +2 -0
  45. package/cjs/scale/index.js +11 -0
  46. package/cjs/scale-Cq9pXrc1.js +318 -0
  47. package/cjs/scale-Cq9pXrc1.js.map +1 -0
  48. package/cjs/semantic-CrEIo8tS.d.ts +52 -0
  49. package/cjs/semantic-CrEIo8tS.d.ts.map +1 -0
  50. package/cjs/serialize-C69DAmoE.d.ts +25 -0
  51. package/cjs/serialize-C69DAmoE.d.ts.map +1 -0
  52. package/cjs/serialize-Ci2X0cPN.js +103 -0
  53. package/cjs/serialize-Ci2X0cPN.js.map +1 -0
  54. package/cjs/tokens/index.d.ts +2 -0
  55. package/cjs/tokens/index.js +6 -0
  56. package/cjs/tokens-CzXxaMgM.js +168 -0
  57. package/cjs/tokens-CzXxaMgM.js.map +1 -0
  58. package/cjs/tone-BAhu-QzQ.js +118 -0
  59. package/cjs/tone-BAhu-QzQ.js.map +1 -0
  60. package/dist/color-map.es5.js.map +1 -1
  61. package/esm/color/a98-rgb.d.ts +7 -0
  62. package/esm/color/a98-rgb.d.ts.map +1 -0
  63. package/esm/color/a98-rgb.js +13 -0
  64. package/esm/color/a98-rgb.js.map +1 -0
  65. package/esm/color/argb.d.ts +6 -0
  66. package/esm/color/argb.d.ts.map +1 -0
  67. package/esm/color/argb.js +25 -0
  68. package/esm/color/argb.js.map +1 -0
  69. package/esm/color/calc.js +82 -0
  70. package/esm/color/calc.js.map +1 -0
  71. package/esm/color/compare.d.ts +20 -0
  72. package/esm/color/compare.d.ts.map +1 -0
  73. package/esm/color/compare.js +46 -0
  74. package/esm/color/compare.js.map +1 -0
  75. package/esm/color/contrast.d.ts +107 -0
  76. package/esm/color/contrast.d.ts.map +1 -0
  77. package/esm/color/contrast.js +242 -0
  78. package/esm/color/contrast.js.map +1 -0
  79. package/esm/color/convert.d.ts +9 -0
  80. package/esm/color/convert.d.ts.map +1 -0
  81. package/esm/color/convert.js +45 -0
  82. package/esm/color/convert.js.map +1 -0
  83. package/esm/color/display-p3-linear.d.ts +7 -0
  84. package/esm/color/display-p3-linear.d.ts.map +1 -0
  85. package/esm/color/display-p3-linear.js +12 -0
  86. package/esm/color/display-p3-linear.js.map +1 -0
  87. package/esm/color/display-p3.d.ts +7 -0
  88. package/esm/color/display-p3.d.ts.map +1 -0
  89. package/esm/color/display-p3.js +12 -0
  90. package/esm/color/display-p3.js.map +1 -0
  91. package/esm/color/expr.d.ts +43 -0
  92. package/esm/color/expr.d.ts.map +1 -0
  93. package/esm/color/expr.js +160 -0
  94. package/esm/color/expr.js.map +1 -0
  95. package/esm/color/gamut.d.ts +31 -0
  96. package/esm/color/gamut.d.ts.map +1 -0
  97. package/esm/color/gamut.js +210 -0
  98. package/esm/color/gamut.js.map +1 -0
  99. package/esm/color/hsl.d.ts +7 -0
  100. package/esm/color/hsl.d.ts.map +1 -0
  101. package/esm/color/hsl.js +67 -0
  102. package/esm/color/hsl.js.map +1 -0
  103. package/esm/color/hwb.d.ts +7 -0
  104. package/esm/color/hwb.d.ts.map +1 -0
  105. package/esm/color/hwb.js +40 -0
  106. package/esm/color/hwb.js.map +1 -0
  107. package/esm/color/index.d.ts +28 -0
  108. package/esm/color/index.js +27 -0
  109. package/esm/color/lab.d.ts +7 -0
  110. package/esm/color/lab.d.ts.map +1 -0
  111. package/esm/color/lab.js +33 -0
  112. package/esm/color/lab.js.map +1 -0
  113. package/esm/color/lch.d.ts +7 -0
  114. package/esm/color/lch.d.ts.map +1 -0
  115. package/esm/color/lch.js +11 -0
  116. package/esm/color/lch.js.map +1 -0
  117. package/esm/color/math.js +32 -0
  118. package/esm/color/math.js.map +1 -0
  119. package/esm/color/matrices.js +180 -0
  120. package/esm/color/matrices.js.map +1 -0
  121. package/esm/color/mix.d.ts +30 -0
  122. package/esm/color/mix.d.ts.map +1 -0
  123. package/esm/color/mix.js +152 -0
  124. package/esm/color/mix.js.map +1 -0
  125. package/esm/color/named.js +11 -0
  126. package/esm/color/named.js.map +1 -0
  127. package/esm/color/oklab.d.ts +7 -0
  128. package/esm/color/oklab.d.ts.map +1 -0
  129. package/esm/color/oklab.js +21 -0
  130. package/esm/color/oklab.js.map +1 -0
  131. package/esm/color/oklch.d.ts +7 -0
  132. package/esm/color/oklch.d.ts.map +1 -0
  133. package/esm/color/oklch.js +11 -0
  134. package/esm/color/oklch.js.map +1 -0
  135. package/esm/color/parse.d.ts +9 -0
  136. package/esm/color/parse.d.ts.map +1 -0
  137. package/esm/color/parse.js +452 -0
  138. package/esm/color/parse.js.map +1 -0
  139. package/esm/color/polar.js +27 -0
  140. package/esm/color/polar.js.map +1 -0
  141. package/esm/color/prophoto-rgb.d.ts +7 -0
  142. package/esm/color/prophoto-rgb.d.ts.map +1 -0
  143. package/esm/color/prophoto-rgb.js +18 -0
  144. package/esm/color/prophoto-rgb.js.map +1 -0
  145. package/esm/color/rec2020.d.ts +7 -0
  146. package/esm/color/rec2020.d.ts.map +1 -0
  147. package/esm/color/rec2020.js +13 -0
  148. package/esm/color/rec2020.js.map +1 -0
  149. package/esm/color/resolve.d.ts +18 -0
  150. package/esm/color/resolve.d.ts.map +1 -0
  151. package/esm/color/resolve.js +98 -0
  152. package/esm/color/resolve.js.map +1 -0
  153. package/esm/color/rgb.js +20 -0
  154. package/esm/color/rgb.js.map +1 -0
  155. package/esm/color/serialize.d.ts +24 -0
  156. package/esm/color/serialize.d.ts.map +1 -0
  157. package/esm/color/serialize.js +88 -0
  158. package/esm/color/serialize.js.map +1 -0
  159. package/esm/color/spaces.d.ts +6 -0
  160. package/esm/color/spaces.d.ts.map +1 -0
  161. package/esm/color/spaces.js +42 -0
  162. package/esm/color/spaces.js.map +1 -0
  163. package/esm/color/srgb-linear.d.ts +7 -0
  164. package/esm/color/srgb-linear.d.ts.map +1 -0
  165. package/esm/color/srgb-linear.js +12 -0
  166. package/esm/color/srgb-linear.js.map +1 -0
  167. package/esm/color/srgb.d.ts +7 -0
  168. package/esm/color/srgb.d.ts.map +1 -0
  169. package/esm/color/srgb.js +12 -0
  170. package/esm/color/srgb.js.map +1 -0
  171. package/esm/color/transfer.js +11 -0
  172. package/esm/color/transfer.js.map +1 -0
  173. package/esm/color/types.d.ts +23 -0
  174. package/esm/color/types.d.ts.map +1 -0
  175. package/esm/color/unknown-name.js +16 -0
  176. package/esm/color/unknown-name.js.map +1 -0
  177. package/esm/color/xyz-d50.d.ts +7 -0
  178. package/esm/color/xyz-d50.d.ts.map +1 -0
  179. package/esm/color/xyz-d50.js +15 -0
  180. package/esm/color/xyz-d50.js.map +1 -0
  181. package/esm/color/xyz-d65.d.ts +4 -0
  182. package/esm/color/xyz-d65.d.ts.map +1 -0
  183. package/esm/color/xyz-d65.js +10 -0
  184. package/esm/color/xyz-d65.js.map +1 -0
  185. package/esm/index.d.ts +63 -6
  186. package/esm/index.d.ts.map +1 -0
  187. package/esm/index.js +54 -5
  188. package/esm/index.js.map +1 -0
  189. package/esm/legacy/createColors.d.ts +9 -0
  190. package/esm/legacy/createColors.d.ts.map +1 -0
  191. package/esm/{createColors.js → legacy/createColors.js} +7 -2
  192. package/esm/legacy/createColors.js.map +1 -0
  193. package/esm/legacy/createColorsFromMap.d.ts +9 -0
  194. package/esm/legacy/createColorsFromMap.d.ts.map +1 -0
  195. package/esm/{createColorsFromMap.js → legacy/createColorsFromMap.js} +4 -2
  196. package/esm/legacy/createColorsFromMap.js.map +1 -0
  197. package/esm/legacy/index.d.ts +6 -0
  198. package/esm/legacy/index.js +5 -0
  199. package/esm/legacy/interfaces.d.ts +19 -0
  200. package/esm/legacy/interfaces.d.ts.map +1 -0
  201. package/esm/{rgbHex.d.ts → legacy/rgbHex.d.ts} +1 -4
  202. package/esm/legacy/rgbHex.d.ts.map +1 -0
  203. package/esm/{rgbHex.js → legacy/rgbHex.js} +1 -2
  204. package/esm/legacy/rgbHex.js.map +1 -0
  205. package/esm/legacy/rgbaString.d.ts +4 -0
  206. package/esm/{rgbaString.d.ts.map → legacy/rgbaString.d.ts.map} +1 -1
  207. package/esm/legacy/rgbaString.js +8 -0
  208. package/esm/legacy/rgbaString.js.map +1 -0
  209. package/esm/palette/dark.d.ts +23 -0
  210. package/esm/palette/dark.d.ts.map +1 -0
  211. package/esm/palette/dark.js +54 -0
  212. package/esm/palette/dark.js.map +1 -0
  213. package/esm/palette/harmony.d.ts +56 -0
  214. package/esm/palette/harmony.d.ts.map +1 -0
  215. package/esm/palette/harmony.js +115 -0
  216. package/esm/palette/harmony.js.map +1 -0
  217. package/esm/palette/index.d.ts +5 -0
  218. package/esm/palette/index.js +5 -0
  219. package/esm/palette/semantic.d.ts +53 -0
  220. package/esm/palette/semantic.d.ts.map +1 -0
  221. package/esm/palette/semantic.js +96 -0
  222. package/esm/palette/semantic.js.map +1 -0
  223. package/esm/palette/validate.d.ts +39 -0
  224. package/esm/palette/validate.d.ts.map +1 -0
  225. package/esm/palette/validate.js +56 -0
  226. package/esm/palette/validate.js.map +1 -0
  227. package/esm/scale/brand.d.ts +21 -0
  228. package/esm/scale/brand.d.ts.map +1 -0
  229. package/esm/scale/brand.js +63 -0
  230. package/esm/scale/brand.js.map +1 -0
  231. package/esm/scale/contrast-scale.d.ts +33 -0
  232. package/esm/scale/contrast-scale.d.ts.map +1 -0
  233. package/esm/scale/contrast-scale.js +26 -0
  234. package/esm/scale/contrast-scale.js.map +1 -0
  235. package/esm/scale/gradient.d.ts +38 -0
  236. package/esm/scale/gradient.d.ts.map +1 -0
  237. package/esm/scale/gradient.js +73 -0
  238. package/esm/scale/gradient.js.map +1 -0
  239. package/esm/scale/index.d.ts +6 -0
  240. package/esm/scale/index.js +6 -0
  241. package/esm/scale/scale.d.ts +31 -0
  242. package/esm/scale/scale.d.ts.map +1 -0
  243. package/esm/scale/scale.js +152 -0
  244. package/esm/scale/scale.js.map +1 -0
  245. package/esm/scale/tone.d.ts +25 -0
  246. package/esm/scale/tone.d.ts.map +1 -0
  247. package/esm/scale/tone.js +96 -0
  248. package/esm/scale/tone.js.map +1 -0
  249. package/esm/tokens/css.d.ts +18 -0
  250. package/esm/tokens/css.d.ts.map +1 -0
  251. package/esm/tokens/css.js +23 -0
  252. package/esm/tokens/css.js.map +1 -0
  253. package/esm/tokens/dtcg.d.ts +33 -0
  254. package/esm/tokens/dtcg.d.ts.map +1 -0
  255. package/esm/tokens/dtcg.js +42 -0
  256. package/esm/tokens/dtcg.js.map +1 -0
  257. package/esm/tokens/index.d.ts +5 -0
  258. package/esm/tokens/index.js +4 -0
  259. package/esm/tokens/tailwind.d.ts +19 -0
  260. package/esm/tokens/tailwind.d.ts.map +1 -0
  261. package/esm/tokens/tailwind.js +19 -0
  262. package/esm/tokens/tailwind.js.map +1 -0
  263. package/esm/tokens/tokens.d.ts +11 -0
  264. package/esm/tokens/tokens.d.ts.map +1 -0
  265. package/esm/tokens/tokens.js +77 -0
  266. package/esm/tokens/tokens.js.map +1 -0
  267. package/llms.txt +48 -0
  268. package/package.json +277 -64
  269. package/plugin.json +18 -0
  270. package/schemas/contrast.schema.json +24 -0
  271. package/schemas/convert.schema.json +60 -0
  272. package/schemas/export.schema.json +106 -0
  273. package/schemas/find-contrast.schema.json +51 -0
  274. package/schemas/harmony.schema.json +58 -0
  275. package/schemas/mix.schema.json +72 -0
  276. package/schemas/palette.schema.json +56 -0
  277. package/schemas/scale.schema.json +86 -0
  278. package/skills/color-map/SKILL.md +38 -0
  279. package/src/cli/bin.ts +11 -0
  280. package/src/cli/cli.ts +40 -0
  281. package/src/cli/commands/contrast.ts +36 -0
  282. package/src/cli/commands/convert.ts +37 -0
  283. package/src/cli/commands/export.ts +102 -0
  284. package/src/cli/commands/find-contrast.ts +37 -0
  285. package/src/cli/commands/harmony.ts +30 -0
  286. package/src/cli/commands/mix.ts +29 -0
  287. package/src/cli/commands/palette.ts +66 -0
  288. package/src/cli/commands/scale.ts +75 -0
  289. package/src/cli/index.ts +3 -0
  290. package/src/cli/schema-command.ts +31 -0
  291. package/src/cli/schemas.ts +86 -0
  292. package/src/cli/shared.ts +72 -0
  293. package/src/cli/testing.ts +27 -0
  294. package/src/color/a98-rgb.ts +11 -0
  295. package/src/color/argb.ts +21 -0
  296. package/src/color/calc.ts +84 -0
  297. package/src/color/compare.ts +53 -0
  298. package/src/color/contrast.ts +277 -0
  299. package/src/color/convert.ts +43 -0
  300. package/src/color/display-p3-linear.ts +9 -0
  301. package/src/color/display-p3.ts +9 -0
  302. package/src/color/expr.ts +158 -0
  303. package/src/color/gamut.ts +215 -0
  304. package/src/color/hsl.ts +57 -0
  305. package/src/color/hwb.ts +26 -0
  306. package/src/color/index.ts +43 -0
  307. package/src/color/lab.ts +29 -0
  308. package/src/color/lch.ts +8 -0
  309. package/src/color/math.ts +30 -0
  310. package/src/color/matrices.ts +91 -0
  311. package/src/color/mix.ts +158 -0
  312. package/src/color/named.ts +13 -0
  313. package/src/color/oklab.ts +19 -0
  314. package/src/color/oklch.ts +8 -0
  315. package/src/color/parse.ts +355 -0
  316. package/src/color/polar.ts +17 -0
  317. package/src/color/prophoto-rgb.ts +18 -0
  318. package/src/color/rec2020.ts +11 -0
  319. package/src/color/resolve.ts +87 -0
  320. package/src/color/rgb.ts +20 -0
  321. package/src/color/serialize.ts +96 -0
  322. package/src/color/spaces.ts +42 -0
  323. package/src/color/srgb-linear.ts +9 -0
  324. package/src/color/srgb.ts +9 -0
  325. package/src/color/test-utils.ts +10 -0
  326. package/src/color/transfer.ts +14 -0
  327. package/src/color/types.ts +41 -0
  328. package/src/color/unknown-name.ts +15 -0
  329. package/src/color/xyz-d50.ts +13 -0
  330. package/src/color/xyz-d65.ts +8 -0
  331. package/src/index.ts +37 -0
  332. package/{ts → src/legacy}/createColors.ts +6 -0
  333. package/{ts → src/legacy}/createColorsFromMap.ts +3 -0
  334. package/{ts → src/legacy}/interfaces.ts +4 -0
  335. package/{ts → src/legacy}/rgbaString.ts +1 -0
  336. package/src/palette/dark.ts +55 -0
  337. package/src/palette/harmony.ts +107 -0
  338. package/src/palette/index.ts +18 -0
  339. package/src/palette/semantic.ts +120 -0
  340. package/src/palette/validate.ts +82 -0
  341. package/src/scale/brand.ts +50 -0
  342. package/src/scale/contrast-scale.ts +48 -0
  343. package/src/scale/gradient.ts +91 -0
  344. package/src/scale/index.ts +5 -0
  345. package/src/scale/scale.ts +127 -0
  346. package/src/scale/tone.ts +69 -0
  347. package/src/tokens/css.ts +32 -0
  348. package/src/tokens/dtcg.ts +62 -0
  349. package/src/tokens/index.ts +11 -0
  350. package/src/tokens/tailwind.ts +24 -0
  351. package/src/tokens/tokens.ts +82 -0
  352. package/esm/createColors.d.ts +0 -6
  353. package/esm/createColors.d.ts.map +0 -1
  354. package/esm/createColors.js.map +0 -1
  355. package/esm/createColorsFromMap.d.ts +0 -9
  356. package/esm/createColorsFromMap.d.ts.map +0 -1
  357. package/esm/createColorsFromMap.js.map +0 -1
  358. package/esm/interfaces.d.ts +0 -18
  359. package/esm/interfaces.d.ts.map +0 -1
  360. package/esm/rgbHex.d.ts.map +0 -1
  361. package/esm/rgbHex.js.map +0 -1
  362. package/esm/rgbaString.d.ts +0 -6
  363. package/esm/rgbaString.js +0 -8
  364. package/esm/rgbaString.js.map +0 -1
  365. /package/{ts → src/legacy}/index.ts +0 -0
  366. /package/{ts → src/legacy}/rgbHex.ts +0 -0
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { n as createApp } from "./cli-CELmx3Y9.js";
3
+ import { readFileSync } from "node:fs";
4
+ // src/cli/bin.ts
5
+ const { version } = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
6
+ createApp({ version }).parse(process.argv).then((code) => {
7
+ if (typeof code === "number") process.exitCode = code;
8
+ });
9
+ export {};
package/bin/index.js ADDED
@@ -0,0 +1 @@
1
+ export { t as commands, n as createApp, r as schemaCommand, i as schemaOf } from "./cli-CELmx3Y9.js";
@@ -0,0 +1,5 @@
1
+ import { C as ColorSpaceId, E as Vec3, S as Color, T as Space, _ as createOnColor, a as inGamut, b as onColor, c as ContrastFn, d as FoundContrast, f as OnColorOptions, g as createMeets, h as createFindContrast, i as createToGamut, l as ContrastOption, m as createContrast, n as ToGamutOptions, o as toGamut, p as contrast, r as createInGamut, s as ContrastAlgorithm, t as GamutId, u as FindContrastOptions, v as findContrast, w as Component, x as wcag2, y as meets } from "../gamut-CG1J2aat.js";
2
+ import { A as a98Rgb, C as createEquals, D as createConverter, E as convertComponents, O as fromArgb, S as createDeltaEOk, T as equals, _ as hsl, a as convert, b as displayP3Linear, c as resolve, d as parse, f as oklch, g as hwb, h as lab, i as srgb, k as toArgb, l as rec2020, m as lch, n as xyzD50, o as spaces, p as oklab, r as srgbLinear, s as ResolveContext, t as xyzD65, u as prophotoRgb, v as ColorExpr, w as deltaEOk, x as displayP3, y as parseExpr } from "../index-Cv3iUUYE.js";
3
+ import { i as mix, n as MixOptions, r as createMix, t as HueMethod } from "../mix-DGlKoUw4.js";
4
+ import { i as toHex, n as createToHex, r as toCss, t as ToCssOptions } from "../serialize-C69DAmoE.js";
5
+ export { type Color, type ColorExpr, type ColorSpaceId, type Component, type ContrastAlgorithm, type ContrastFn, type ContrastOption, type FindContrastOptions, type FoundContrast, type GamutId, type HueMethod, type MixOptions, type OnColorOptions, type ResolveContext, type Space, type ToCssOptions, type ToGamutOptions, type Vec3, a98Rgb, contrast, convert, convertComponents, createContrast, createConverter, createDeltaEOk, createEquals, createFindContrast, createInGamut, createMeets, createMix, createOnColor, createToGamut, createToHex, deltaEOk, displayP3, displayP3Linear, equals, findContrast, fromArgb, hsl, hwb, inGamut, lab, lch, meets, mix, oklab, oklch, onColor, parse, parseExpr, prophotoRgb, rec2020, resolve, spaces, srgb, srgbLinear, toArgb, toCss, toGamut, toHex, wcag2, xyzD50, xyzD65 };
@@ -0,0 +1,52 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_parse = require("../parse-8mt2OMKf.js");
3
+ const require_color = require("../color-wNrkrhC7.js");
4
+ const require_contrast = require("../contrast-XjF5Rwui.js");
5
+ const require_mix = require("../mix-Cs4owSbW.js");
6
+ const require_serialize = require("../serialize-Ci2X0cPN.js");
7
+ exports.a98Rgb = require_parse.a98Rgb;
8
+ exports.contrast = require_contrast.contrast;
9
+ exports.convert = require_parse.convert;
10
+ exports.convertComponents = require_parse.convertComponents;
11
+ exports.createContrast = require_contrast.createContrast;
12
+ exports.createConverter = require_parse.createConverter;
13
+ exports.createDeltaEOk = require_parse.createDeltaEOk;
14
+ exports.createEquals = require_parse.createEquals;
15
+ exports.createFindContrast = require_contrast.createFindContrast;
16
+ exports.createInGamut = require_parse.createInGamut;
17
+ exports.createMeets = require_contrast.createMeets;
18
+ exports.createMix = require_mix.createMix;
19
+ exports.createOnColor = require_contrast.createOnColor;
20
+ exports.createToGamut = require_parse.createToGamut;
21
+ exports.createToHex = require_serialize.createToHex;
22
+ exports.deltaEOk = require_parse.deltaEOk;
23
+ exports.displayP3 = require_parse.displayP3;
24
+ exports.displayP3Linear = require_parse.displayP3Linear;
25
+ exports.equals = require_parse.equals;
26
+ exports.findContrast = require_contrast.findContrast;
27
+ exports.fromArgb = require_color.fromArgb;
28
+ exports.hsl = require_parse.hsl;
29
+ exports.hwb = require_parse.hwb;
30
+ exports.inGamut = require_parse.inGamut;
31
+ exports.lab = require_parse.lab;
32
+ exports.lch = require_parse.lch;
33
+ exports.meets = require_contrast.meets;
34
+ exports.mix = require_mix.mix;
35
+ exports.oklab = require_parse.oklab;
36
+ exports.oklch = require_parse.oklch;
37
+ exports.onColor = require_contrast.onColor;
38
+ exports.parse = require_parse.parse;
39
+ exports.parseExpr = require_color.parseExpr;
40
+ exports.prophotoRgb = require_parse.prophotoRgb;
41
+ exports.rec2020 = require_parse.rec2020;
42
+ exports.resolve = require_color.resolve;
43
+ exports.spaces = require_parse.spaces;
44
+ exports.srgb = require_parse.srgb;
45
+ exports.srgbLinear = require_parse.srgbLinear;
46
+ exports.toArgb = require_color.toArgb;
47
+ exports.toCss = require_serialize.toCss;
48
+ exports.toGamut = require_parse.toGamut;
49
+ exports.toHex = require_serialize.toHex;
50
+ exports.wcag2 = require_contrast.wcag2;
51
+ exports.xyzD50 = require_parse.xyzD50;
52
+ exports.xyzD65 = require_parse.xyzD65;
@@ -0,0 +1,374 @@
1
+ const require_parse = require("./parse-8mt2OMKf.js");
2
+ const require_contrast = require("./contrast-XjF5Rwui.js");
3
+ const require_mix = require("./mix-Cs4owSbW.js");
4
+ // src/color/argb.ts
5
+ const byte = (n) => Math.min(255, Math.max(0, Math.round(n * 255)));
6
+ /** An sRGB color from a 32-bit ARGB integer, as Material Color Utilities uses. */
7
+ function fromArgb(argb) {
8
+ const n = argb >>> 0;
9
+ return {
10
+ colorSpace: "srgb",
11
+ components: [
12
+ (n >>> 16 & 255) / 255,
13
+ (n >>> 8 & 255) / 255,
14
+ (n & 255) / 255
15
+ ],
16
+ alpha: (n >>> 24) / 255
17
+ };
18
+ }
19
+ /** The unsigned 32-bit ARGB integer for an sRGB color. Convert other spaces to `srgb` first. */
20
+ function toArgb(color) {
21
+ if (color.colorSpace !== "srgb") throw new Error(`color-map: toArgb needs an srgb color, got "${color.colorSpace}"`);
22
+ const [r, g, b] = color.components;
23
+ const a = color.alpha ?? 1;
24
+ return (byte(a) << 24 | byte(r ?? 0) << 16 | byte(g ?? 0) << 8 | byte(b ?? 0)) >>> 0;
25
+ }
26
+ // src/color/expr.ts
27
+ const INTERPOLATION_SPACES = {
28
+ __proto__: null,
29
+ ...require_parse.COLOR_SPACES,
30
+ hsl: "hsl",
31
+ hwb: "hwb",
32
+ lab: "lab",
33
+ lch: "lch",
34
+ oklab: "oklab",
35
+ oklch: "oklch"
36
+ };
37
+ const HUE_METHODS = /* @__PURE__ */ new Set([
38
+ "shorter",
39
+ "longer",
40
+ "increasing",
41
+ "decreasing"
42
+ ]);
43
+ const RELATIVE = /* @__PURE__ */ new Set([
44
+ "rgb",
45
+ "rgba",
46
+ "hsl",
47
+ "hsla",
48
+ "hwb",
49
+ "lab",
50
+ "lch",
51
+ "oklab",
52
+ "oklch",
53
+ "color"
54
+ ]);
55
+ const PERCENT = /^[+-]?(?:\d+\.?\d*|\.\d+)%$/;
56
+ /** Splits at top-level commas, or at top-level whitespace with `/` as its own item. */
57
+ function split(text, commas, input) {
58
+ const out = [];
59
+ let depth = 0;
60
+ let current = "";
61
+ const flush = () => {
62
+ if (commas || current) out.push(current.trim());
63
+ current = "";
64
+ };
65
+ for (const ch of text) {
66
+ if (ch === "(") depth++;
67
+ else if (ch === ")") depth--;
68
+ if (depth === 0 && (commas ? ch === "," : /\s|\//.test(ch))) {
69
+ flush();
70
+ if (ch === "/") out.push("/");
71
+ } else current += ch;
72
+ }
73
+ if (depth !== 0) return require_parse.fail(input, "unbalanced parentheses");
74
+ flush();
75
+ return out;
76
+ }
77
+ /** Splits `name(body)`, or returns undefined when the text is not one call that ends the text. */
78
+ function call(text) {
79
+ const open = text.indexOf("(");
80
+ if (open < 1 || !text.endsWith(")") || !/^[a-z-]+$/.test(text.slice(0, open))) return void 0;
81
+ let depth = 0;
82
+ for (let i = open; i < text.length; i++) if (text[i] === "(") depth++;
83
+ else if (text[i] === ")" && --depth === 0 && i < text.length - 1) return void 0;
84
+ return [text.slice(0, open), text.slice(open + 1, -1)];
85
+ }
86
+ function colorMix(body, input) {
87
+ const [head, ...rest] = split(body, true, input);
88
+ const words = head.split(/\s+/);
89
+ if (words[0] !== "in" || !INTERPOLATION_SPACES[words[1]]) return require_parse.fail(input, "color-mix() needs \"in <space>\"", words[1]);
90
+ const space = INTERPOLATION_SPACES[words[1]];
91
+ let hue;
92
+ if (words.length > 2) {
93
+ if (words.length !== 4 || words[3] !== "hue" || !HUE_METHODS.has(words[2])) return require_parse.fail(input, "invalid hue interpolation", words.slice(2).join(" "));
94
+ hue = words[2];
95
+ }
96
+ if (rest.length !== 2) return require_parse.fail(input, `color-mix() needs two colors, got ${rest.length}`);
97
+ const items = rest.map((text) => {
98
+ const parts = split(text, false, input);
99
+ const percents = parts.filter((p) => PERCENT.test(p));
100
+ if (parts.length - percents.length !== 1 || percents.length > 1) return require_parse.fail(input, "invalid color-mix() item", text);
101
+ const percent = percents.length === 1 ? Number.parseFloat(percents[0]) : void 0;
102
+ if (percent !== void 0 && percent < 0) return require_parse.fail(input, "negative percentage", text);
103
+ const color = parseExpr(parts.find((p) => !PERCENT.test(p)));
104
+ return percent === void 0 ? { color } : {
105
+ color,
106
+ percent
107
+ };
108
+ });
109
+ return hue === void 0 ? {
110
+ type: "color-mix",
111
+ space,
112
+ items
113
+ } : {
114
+ type: "color-mix",
115
+ space,
116
+ hue,
117
+ items
118
+ };
119
+ }
120
+ function relative(name, words, input) {
121
+ const from = words[1] === void 0 ? require_parse.fail(input, "missing origin color") : parseExpr(words[1]);
122
+ let space;
123
+ let at = 2;
124
+ const fn = name === "rgba" ? "rgb" : name === "hsla" ? "hsl" : name;
125
+ if (fn === "color") {
126
+ const id = require_parse.COLOR_SPACES[words[2]];
127
+ if (!id) return require_parse.fail(input, "unknown color space", words[2]);
128
+ space = id;
129
+ at = 3;
130
+ } else space = require_parse.FUNCTIONS[fn].space;
131
+ const channels = words.slice(at, at + 3);
132
+ const tail = words.slice(at + 3);
133
+ if (channels.length !== 3) return require_parse.fail(input, `expected 3 components, got ${channels.length}`);
134
+ if (tail.length > 0 && (tail[0] !== "/" || tail.length !== 2)) return require_parse.fail(input, "expected \"/ alpha\" after the components");
135
+ const node = {
136
+ type: "relative",
137
+ fn,
138
+ space,
139
+ from,
140
+ channels
141
+ };
142
+ if (tail.length === 2) node.alpha = tail[1];
143
+ return node;
144
+ }
145
+ /**
146
+ * Parses any CSS Color 4 or 5 color into a {@link ColorExpr}: everything
147
+ * `parse` takes, plus `currentcolor`, system colors, `light-dark()`,
148
+ * `color-mix()`, `contrast-color()` and relative colors such as
149
+ * `oklch(from #3b82f6 calc(l + 0.1) c h)`. A concrete color comes back as a
150
+ * plain {@link Color}; the rest are nodes that {@link resolve} turns into one.
151
+ */
152
+ function parseExpr(input) {
153
+ const text = input.trim().toLowerCase();
154
+ if (text === "currentcolor") return { type: "currentcolor" };
155
+ if (require_parse.VALUES_NEEDING_RESOLVE.test(text)) return {
156
+ type: "system",
157
+ name: text
158
+ };
159
+ const parts = call(text);
160
+ if (!parts) return require_parse.parse(text);
161
+ const [name, body] = parts;
162
+ if (name === "color-mix") return colorMix(body, input);
163
+ if (name === "light-dark") {
164
+ const list = split(body, true, input);
165
+ if (list.length !== 2) return require_parse.fail(input, `light-dark() needs two colors, got ${list.length}`);
166
+ return {
167
+ type: "light-dark",
168
+ light: parseExpr(list[0]),
169
+ dark: parseExpr(list[1])
170
+ };
171
+ }
172
+ if (name === "contrast-color") return {
173
+ type: "contrast-color",
174
+ color: parseExpr(body)
175
+ };
176
+ if (RELATIVE.has(name)) {
177
+ const words = split(body, false, input);
178
+ if (words[0] === "from") return relative(name, words, input);
179
+ }
180
+ return require_parse.parse(text);
181
+ }
182
+ // src/color/calc.ts
183
+ const TOKEN = /\s*(?:(\d*\.?\d+(?:e[+-]?\d+)?)([a-z%]*)|([a-z][a-z0-9-]*)|([-+*/(),]))/y;
184
+ /**
185
+ * Evaluates the `calc()` subset relative colors accept: numbers (angles become
186
+ * degrees), `+ - * /`, parentheses, `calc`, `min`, `max`, `clamp`, the
187
+ * constants `pi` and `e`, and the channel keywords in `vars`.
188
+ */
189
+ function evaluate(text, vars) {
190
+ const tokens = [];
191
+ TOKEN.lastIndex = 0;
192
+ let end = 0;
193
+ for (let m = TOKEN.exec(text); m; m = TOKEN.exec(text)) {
194
+ end = TOKEN.lastIndex;
195
+ if (m[1] === void 0) tokens.push(m[3] ?? m[4]);
196
+ else {
197
+ const unit = require_parse.UNITS[m[2]];
198
+ if (unit === void 0) return require_parse.fail(text, "units other than angles are not supported in calc()", m[1] + m[2]);
199
+ tokens.push(String(Number(m[1]) * unit));
200
+ }
201
+ }
202
+ if (end !== text.trimEnd().length) return require_parse.fail(text, "invalid calc() expression");
203
+ let pos = 0;
204
+ const next = () => tokens[pos++];
205
+ const eat = (t) => tokens[pos] === t ? ++pos > 0 : false;
206
+ const need = (t) => {
207
+ if (!eat(t)) require_parse.fail(text, `expected "${t}" in calc()`, tokens[pos]);
208
+ };
209
+ function sum() {
210
+ let v = product();
211
+ for (;;) if (eat("+")) v += product();
212
+ else if (eat("-")) v -= product();
213
+ else return v;
214
+ }
215
+ function product() {
216
+ let v = unary();
217
+ for (;;) if (eat("*")) v *= unary();
218
+ else if (eat("/")) v /= unary();
219
+ else return v;
220
+ }
221
+ function unary() {
222
+ if (eat("-")) return -unary();
223
+ if (eat("+")) return unary();
224
+ return atom();
225
+ }
226
+ function args() {
227
+ const list = [sum()];
228
+ while (eat(",")) list.push(sum());
229
+ need(")");
230
+ return list;
231
+ }
232
+ function atom() {
233
+ const t = next();
234
+ if (t === void 0) return require_parse.fail(text, "unfinished calc() expression");
235
+ if (/^[\d.]/.test(t)) return Number(t);
236
+ if (t === "(") {
237
+ const v = sum();
238
+ need(")");
239
+ return v;
240
+ }
241
+ if (!/^[a-z]/.test(t)) return require_parse.fail(text, "unexpected token", t);
242
+ if (eat("(")) {
243
+ const list = args();
244
+ if (t === "calc" && list.length === 1) return list[0];
245
+ if (t === "min") return Math.min(...list);
246
+ if (t === "max") return Math.max(...list);
247
+ if (t === "clamp" && list.length === 3) return Math.min(list[2], Math.max(list[0], list[1]));
248
+ return require_parse.fail(text, "unknown function", t);
249
+ }
250
+ if (t === "pi") return Math.PI;
251
+ if (t === "e") return Math.E;
252
+ const v = vars[t];
253
+ if (typeof v === "number") return v;
254
+ return require_parse.fail(text, "unknown keyword", t);
255
+ }
256
+ const value = sum();
257
+ if (pos < tokens.length) return require_parse.fail(text, "unexpected token", tokens[pos]);
258
+ return value;
259
+ }
260
+ // src/color/resolve.ts
261
+ /** The names a relative color's channel keywords have, by space, one letter each. The RGB spaces use `rgb`. */
262
+ const KEYWORDS = {
263
+ __proto__: null,
264
+ hsl: "hsl",
265
+ hwb: "hwb",
266
+ lab: "lab",
267
+ lch: "lch",
268
+ oklab: "lab",
269
+ oklch: "lch",
270
+ "xyz-d50": "xyz",
271
+ "xyz-d65": "xyz"
272
+ };
273
+ const SIMPLE = /^(?:none|[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?[a-z%]*)$/;
274
+ const WHITE = {
275
+ colorSpace: "srgb",
276
+ components: [
277
+ 1,
278
+ 1,
279
+ 1
280
+ ]
281
+ };
282
+ const BLACK = {
283
+ colorSpace: "srgb",
284
+ components: [
285
+ 0,
286
+ 0,
287
+ 0
288
+ ]
289
+ };
290
+ /** WCAG 2 choice between white and black: whichever contrasts more with the color. */
291
+ function contrastColor(color) {
292
+ return require_contrast.wcag2(WHITE, color) >= require_contrast.wcag2(BLACK, color) ? WHITE : BLACK;
293
+ }
294
+ function resolveRelative(node, context) {
295
+ const origin = resolve(node.from, context);
296
+ const c = require_parse.componentsIn(origin, node.space);
297
+ const scale = node.fn === "rgb" ? 255 : 1;
298
+ const names = KEYWORDS[node.space] ?? "rgb";
299
+ const vars = { alpha: origin.alpha === void 0 ? 1 : origin.alpha ?? 0 };
300
+ for (let i = 0; i < 3; i++) vars[names[i]] = (c[i] ?? 0) * scale;
301
+ const specs = node.fn === "color" ? [
302
+ require_parse.UNIT,
303
+ require_parse.UNIT,
304
+ require_parse.UNIT
305
+ ] : require_parse.FUNCTIONS[node.fn].channels;
306
+ const value = (token, spec) => require_parse.channel(SIMPLE.test(token) ? token : String(evaluate(token, vars)), spec, token);
307
+ const result = {
308
+ colorSpace: node.space,
309
+ components: node.channels.map((t, i) => value(t, specs[i]))
310
+ };
311
+ const alpha = node.alpha === void 0 ? origin.alpha : value(node.alpha, require_parse.ALPHA);
312
+ if (alpha !== void 0) result.alpha = alpha;
313
+ return result;
314
+ }
315
+ function resolveMix(node, context) {
316
+ const [first, second] = node.items;
317
+ const p1 = first.percent ?? (second.percent === void 0 ? 50 : 100 - second.percent);
318
+ const p2 = second.percent ?? 100 - p1;
319
+ const sum = p1 + p2;
320
+ if (sum <= 0) return require_parse.fail("color-mix()", "the percentages must add up to more than 0");
321
+ const options = node.hue === void 0 ? { in: node.space } : {
322
+ in: node.space,
323
+ hue: node.hue
324
+ };
325
+ const result = require_mix.mix(resolve(first.color, context), resolve(second.color, context), p2 / sum, options);
326
+ if (sum < 100 && result.alpha !== null) result.alpha = (result.alpha ?? 1) * (sum / 100);
327
+ return result;
328
+ }
329
+ /**
330
+ * Turns a color, a CSS string or a {@link ColorExpr} into a concrete {@link Color}.
331
+ * `currentcolor`, system colors and `light-dark()` read `context`; nothing is
332
+ * guessed, so a missing entry throws and names the value.
333
+ */
334
+ function resolve(input, context = {}) {
335
+ const expr = typeof input === "string" ? parseExpr(input) : input;
336
+ if ("colorSpace" in expr) return expr;
337
+ if (expr.type === "light-dark") return resolve(context.colorScheme === "dark" ? expr.dark : expr.light, context);
338
+ if (expr.type === "color-mix") return resolveMix(expr, context);
339
+ if (expr.type === "relative") return resolveRelative(expr, context);
340
+ if (expr.type === "contrast-color") return contrastColor(resolve(expr.color, context));
341
+ const name = expr.type === "currentcolor" ? "currentcolor" : expr.name;
342
+ const value = expr.type === "currentcolor" ? context.currentColor : context.systemColors?.[name];
343
+ if (value === void 0) return require_parse.fail(name, `needs ${expr.type === "currentcolor" ? "currentColor" : `systemColors.${name}`} to resolve`);
344
+ return resolve(value, {
345
+ ...context,
346
+ currentColor: void 0
347
+ });
348
+ }
349
+ Object.defineProperty(exports, "fromArgb", {
350
+ enumerable: true,
351
+ get: function() {
352
+ return fromArgb;
353
+ }
354
+ });
355
+ Object.defineProperty(exports, "parseExpr", {
356
+ enumerable: true,
357
+ get: function() {
358
+ return parseExpr;
359
+ }
360
+ });
361
+ Object.defineProperty(exports, "resolve", {
362
+ enumerable: true,
363
+ get: function() {
364
+ return resolve;
365
+ }
366
+ });
367
+ Object.defineProperty(exports, "toArgb", {
368
+ enumerable: true,
369
+ get: function() {
370
+ return toArgb;
371
+ }
372
+ });
373
+
374
+ //# sourceMappingURL=color-wNrkrhC7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-wNrkrhC7.js","names":["COLOR_SPACES","fail","FUNCTIONS","VALUES_NEEDING_RESOLVE","parse","UNITS","fail","wcag2","componentsIn","UNIT","FUNCTIONS","channel","ALPHA","fail","mix"],"sources":["../src/color/argb.ts","../src/color/expr.ts","../src/color/calc.ts","../src/color/resolve.ts"],"sourcesContent":["import type { Color } from './types.js'\n\nconst byte = (n: number): number => Math.min(255, Math.max(0, Math.round(n * 255)))\n\n/** An sRGB color from a 32-bit ARGB integer, as Material Color Utilities uses. */\nexport function fromArgb(argb: number): Color {\n\tconst n = argb >>> 0\n\treturn {\n\t\tcolorSpace: 'srgb',\n\t\tcomponents: [((n >>> 16) & 255) / 255, ((n >>> 8) & 255) / 255, (n & 255) / 255],\n\t\talpha: (n >>> 24) / 255\n\t}\n}\n\n/** The unsigned 32-bit ARGB integer for an sRGB color. Convert other spaces to `srgb` first. */\nexport function toArgb(color: Color): number {\n\tif (color.colorSpace !== 'srgb') throw new Error(`color-map: toArgb needs an srgb color, got \"${color.colorSpace}\"`)\n\tconst [r, g, b] = color.components\n\tconst a = color.alpha ?? 1\n\treturn ((byte(a) << 24) | (byte(r ?? 0) << 16) | (byte(g ?? 0) << 8) | byte(b ?? 0)) >>> 0\n}\n","import type { HueMethod } from './mix.js'\nimport { COLOR_SPACES, FUNCTIONS, fail, parse, VALUES_NEEDING_RESOLVE } from './parse.js'\nimport type { Color, ColorSpaceId } from './types.js'\n\n/** A color that needs a context to become concrete: see {@link resolve}. */\nexport type ColorExpr =\n\t| Color\n\t| { type: 'currentcolor' }\n\t| { type: 'system'; name: string }\n\t| { type: 'light-dark'; light: ColorExpr; dark: ColorExpr }\n\t| { type: 'contrast-color'; color: ColorExpr }\n\t| {\n\t\t\ttype: 'color-mix'\n\t\t\tspace: ColorSpaceId\n\t\t\thue?: HueMethod\n\t\t\t/** Exactly two. `percent` is 0 to 100, absent when not written. */\n\t\t\titems: { color: ColorExpr; percent?: number }[]\n\t }\n\t| {\n\t\t\t/** `rgb(from red r g b)` and the like. The channels are kept as written, for `resolve` to evaluate. */\n\t\t\ttype: 'relative'\n\t\t\t/** The function name: `rgb`, `hsl`, `hwb`, `lab`, `lch`, `oklab`, `oklch` or `color`. */\n\t\t\tfn: string\n\t\t\tspace: ColorSpaceId\n\t\t\tfrom: ColorExpr\n\t\t\tchannels: [string, string, string]\n\t\t\talpha?: string\n\t }\n\nconst INTERPOLATION_SPACES: Record<string, ColorSpaceId> = {\n\t__proto__: null as never,\n\t...COLOR_SPACES,\n\thsl: 'hsl',\n\thwb: 'hwb',\n\tlab: 'lab',\n\tlch: 'lch',\n\toklab: 'oklab',\n\toklch: 'oklch'\n}\nconst HUE_METHODS = new Set(['shorter', 'longer', 'increasing', 'decreasing'])\nconst RELATIVE = new Set(['rgb', 'rgba', 'hsl', 'hsla', 'hwb', 'lab', 'lch', 'oklab', 'oklch', 'color'])\nconst PERCENT = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)%$/\n\n/** Splits at top-level commas, or at top-level whitespace with `/` as its own item. */\nfunction split(text: string, commas: boolean, input: string): string[] {\n\tconst out: string[] = []\n\tlet depth = 0\n\tlet current = ''\n\tconst flush = (): void => {\n\t\tif (commas || current) out.push(current.trim())\n\t\tcurrent = ''\n\t}\n\tfor (const ch of text) {\n\t\tif (ch === '(') depth++\n\t\telse if (ch === ')') depth--\n\t\tif (depth === 0 && (commas ? ch === ',' : /\\s|\\//.test(ch))) {\n\t\t\tflush()\n\t\t\tif (ch === '/') out.push('/')\n\t\t} else current += ch\n\t}\n\tif (depth !== 0) return fail(input, 'unbalanced parentheses')\n\tflush()\n\treturn out\n}\n\n/** Splits `name(body)`, or returns undefined when the text is not one call that ends the text. */\nfunction call(text: string): [string, string] | undefined {\n\tconst open = text.indexOf('(')\n\tif (open < 1 || !text.endsWith(')') || !/^[a-z-]+$/.test(text.slice(0, open))) return undefined\n\tlet depth = 0\n\tfor (let i = open; i < text.length; i++) {\n\t\tif (text[i] === '(') depth++\n\t\telse if (text[i] === ')' && --depth === 0 && i < text.length - 1) return undefined\n\t}\n\treturn [text.slice(0, open), text.slice(open + 1, -1)]\n}\n\nfunction colorMix(body: string, input: string): ColorExpr {\n\tconst [head, ...rest] = split(body, true, input)\n\tconst words = head.split(/\\s+/)\n\tif (words[0] !== 'in' || !INTERPOLATION_SPACES[words[1]])\n\t\treturn fail(input, 'color-mix() needs \"in <space>\"', words[1])\n\tconst space = INTERPOLATION_SPACES[words[1]]\n\tlet hue: HueMethod | undefined\n\tif (words.length > 2) {\n\t\tif (words.length !== 4 || words[3] !== 'hue' || !HUE_METHODS.has(words[2])) {\n\t\t\treturn fail(input, 'invalid hue interpolation', words.slice(2).join(' '))\n\t\t}\n\t\thue = words[2] as HueMethod\n\t}\n\tif (rest.length !== 2) return fail(input, `color-mix() needs two colors, got ${rest.length}`)\n\tconst items = rest.map((text) => {\n\t\tconst parts = split(text, false, input)\n\t\tconst percents = parts.filter((p) => PERCENT.test(p))\n\t\tif (parts.length - percents.length !== 1 || percents.length > 1)\n\t\t\treturn fail(input, 'invalid color-mix() item', text)\n\t\tconst percent = percents.length === 1 ? Number.parseFloat(percents[0]) : undefined\n\t\tif (percent !== undefined && percent < 0) return fail(input, 'negative percentage', text)\n\t\tconst color = parseExpr(parts.find((p) => !PERCENT.test(p)) as string)\n\t\treturn percent === undefined ? { color } : { color, percent }\n\t})\n\treturn hue === undefined ? { type: 'color-mix', space, items } : { type: 'color-mix', space, hue, items }\n}\n\nfunction relative(name: string, words: string[], input: string): ColorExpr {\n\tconst from = words[1] === undefined ? fail(input, 'missing origin color') : parseExpr(words[1])\n\tlet space: ColorSpaceId\n\tlet at = 2\n\tconst fn = name === 'rgba' ? 'rgb' : name === 'hsla' ? 'hsl' : name\n\tif (fn === 'color') {\n\t\tconst id = COLOR_SPACES[words[2]]\n\t\tif (!id) return fail(input, 'unknown color space', words[2])\n\t\tspace = id\n\t\tat = 3\n\t} else space = FUNCTIONS[fn].space\n\tconst channels = words.slice(at, at + 3)\n\tconst tail = words.slice(at + 3)\n\tif (channels.length !== 3) return fail(input, `expected 3 components, got ${channels.length}`)\n\tif (tail.length > 0 && (tail[0] !== '/' || tail.length !== 2))\n\t\treturn fail(input, 'expected \"/ alpha\" after the components')\n\tconst node: Extract<ColorExpr, { type: 'relative' }> = {\n\t\ttype: 'relative',\n\t\tfn,\n\t\tspace,\n\t\tfrom,\n\t\tchannels: channels as [string, string, string]\n\t}\n\tif (tail.length === 2) node.alpha = tail[1]\n\treturn node\n}\n\n/**\n * Parses any CSS Color 4 or 5 color into a {@link ColorExpr}: everything\n * `parse` takes, plus `currentcolor`, system colors, `light-dark()`,\n * `color-mix()`, `contrast-color()` and relative colors such as\n * `oklch(from #3b82f6 calc(l + 0.1) c h)`. A concrete color comes back as a\n * plain {@link Color}; the rest are nodes that {@link resolve} turns into one.\n */\nexport function parseExpr(input: string): ColorExpr {\n\tconst text = input.trim().toLowerCase()\n\tif (text === 'currentcolor') return { type: 'currentcolor' }\n\tif (VALUES_NEEDING_RESOLVE.test(text)) return { type: 'system', name: text }\n\tconst parts = call(text)\n\tif (!parts) return parse(text)\n\tconst [name, body] = parts\n\tif (name === 'color-mix') return colorMix(body, input)\n\tif (name === 'light-dark') {\n\t\tconst list = split(body, true, input)\n\t\tif (list.length !== 2) return fail(input, `light-dark() needs two colors, got ${list.length}`)\n\t\treturn { type: 'light-dark', light: parseExpr(list[0]), dark: parseExpr(list[1]) }\n\t}\n\tif (name === 'contrast-color') return { type: 'contrast-color', color: parseExpr(body) }\n\tif (RELATIVE.has(name)) {\n\t\tconst words = split(body, false, input)\n\t\tif (words[0] === 'from') return relative(name, words, input)\n\t}\n\treturn parse(text)\n}\n","import { fail, UNITS } from './parse.js'\n\nconst TOKEN = /\\s*(?:(\\d*\\.?\\d+(?:e[+-]?\\d+)?)([a-z%]*)|([a-z][a-z0-9-]*)|([-+*/(),]))/y\n\n/**\n * Evaluates the `calc()` subset relative colors accept: numbers (angles become\n * degrees), `+ - * /`, parentheses, `calc`, `min`, `max`, `clamp`, the\n * constants `pi` and `e`, and the channel keywords in `vars`.\n */\nexport function evaluate(text: string, vars: Record<string, number>): number {\n\tconst tokens: string[] = []\n\tTOKEN.lastIndex = 0\n\tlet end = 0\n\tfor (let m = TOKEN.exec(text); m; m = TOKEN.exec(text)) {\n\t\tend = TOKEN.lastIndex\n\t\tif (m[1] === undefined) tokens.push(m[3] ?? m[4])\n\t\telse {\n\t\t\tconst unit = UNITS[m[2]]\n\t\t\tif (unit === undefined) return fail(text, 'units other than angles are not supported in calc()', m[1] + m[2])\n\t\t\ttokens.push(String(Number(m[1]) * unit))\n\t\t}\n\t}\n\tif (end !== text.trimEnd().length) return fail(text, 'invalid calc() expression')\n\tlet pos = 0\n\tconst next = (): string => tokens[pos++]\n\tconst eat = (t: string): boolean => (tokens[pos] === t ? ++pos > 0 : false)\n\tconst need = (t: string): void => {\n\t\tif (!eat(t)) fail(text, `expected \"${t}\" in calc()`, tokens[pos])\n\t}\n\tfunction sum(): number {\n\t\tlet v = product()\n\t\tfor (;;) {\n\t\t\tif (eat('+')) v += product()\n\t\t\telse if (eat('-')) v -= product()\n\t\t\telse return v\n\t\t}\n\t}\n\tfunction product(): number {\n\t\tlet v = unary()\n\t\tfor (;;) {\n\t\t\tif (eat('*')) v *= unary()\n\t\t\telse if (eat('/')) v /= unary()\n\t\t\telse return v\n\t\t}\n\t}\n\tfunction unary(): number {\n\t\tif (eat('-')) return -unary()\n\t\tif (eat('+')) return unary()\n\t\treturn atom()\n\t}\n\tfunction args(): number[] {\n\t\tconst list = [sum()]\n\t\twhile (eat(',')) list.push(sum())\n\t\tneed(')')\n\t\treturn list\n\t}\n\tfunction atom(): number {\n\t\tconst t = next()\n\t\tif (t === undefined) return fail(text, 'unfinished calc() expression')\n\t\tif (/^[\\d.]/.test(t)) return Number(t)\n\t\tif (t === '(') {\n\t\t\tconst v = sum()\n\t\t\tneed(')')\n\t\t\treturn v\n\t\t}\n\t\tif (!/^[a-z]/.test(t)) return fail(text, 'unexpected token', t)\n\t\tif (eat('(')) {\n\t\t\tconst list = args()\n\t\t\tif (t === 'calc' && list.length === 1) return list[0]\n\t\t\tif (t === 'min') return Math.min(...list)\n\t\t\tif (t === 'max') return Math.max(...list)\n\t\t\tif (t === 'clamp' && list.length === 3) return Math.min(list[2], Math.max(list[0], list[1]))\n\t\t\treturn fail(text, 'unknown function', t)\n\t\t}\n\t\tif (t === 'pi') return Math.PI\n\t\tif (t === 'e') return Math.E\n\t\tconst v = vars[t]\n\t\tif (typeof v === 'number') return v\n\t\treturn fail(text, 'unknown keyword', t)\n\t}\n\tconst value = sum()\n\tif (pos < tokens.length) return fail(text, 'unexpected token', tokens[pos])\n\treturn value\n}\n","import { evaluate } from './calc.js'\nimport { wcag2 } from './contrast.js'\nimport { type ColorExpr, parseExpr } from './expr.js'\nimport { mix } from './mix.js'\nimport { ALPHA, channel, FUNCTIONS, fail, UNIT } from './parse.js'\nimport { componentsIn } from './spaces.js'\nimport type { Color, Component } from './types.js'\n\n/** What `resolve` needs from its surroundings to settle `currentcolor`, `light-dark()` and system colors. */\nexport interface ResolveContext {\n\t/** What `currentcolor` means. */\n\tcurrentColor?: string | ColorExpr\n\t/** Which side `light-dark()` takes. Default `light`. */\n\tcolorScheme?: 'light' | 'dark'\n\t/** What each system color (`canvas`, `buttontext`, ...) means, by lowercase name. */\n\tsystemColors?: Record<string, string | ColorExpr>\n}\n\n/** The names a relative color's channel keywords have, by space, one letter each. The RGB spaces use `rgb`. */\nconst KEYWORDS: Record<string, string> = {\n\t__proto__: null as never,\n\thsl: 'hsl',\n\thwb: 'hwb',\n\tlab: 'lab',\n\tlch: 'lch',\n\toklab: 'lab',\n\toklch: 'lch',\n\t'xyz-d50': 'xyz',\n\t'xyz-d65': 'xyz'\n}\nconst SIMPLE = /^(?:none|[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?[a-z%]*)$/\n\nconst WHITE: Color = { colorSpace: 'srgb', components: [1, 1, 1] }\nconst BLACK: Color = { colorSpace: 'srgb', components: [0, 0, 0] }\n\n/** WCAG 2 choice between white and black: whichever contrasts more with the color. */\nfunction contrastColor(color: Color): Color {\n\treturn wcag2(WHITE, color) >= wcag2(BLACK, color) ? WHITE : BLACK\n}\n\nfunction resolveRelative(node: Extract<ColorExpr, { type: 'relative' }>, context: ResolveContext): Color {\n\tconst origin = resolve(node.from, context)\n\tconst c = componentsIn(origin, node.space)\n\tconst scale = node.fn === 'rgb' ? 255 : 1\n\tconst names = KEYWORDS[node.space] ?? 'rgb'\n\tconst vars: Record<string, number> = { alpha: origin.alpha === undefined ? 1 : (origin.alpha ?? 0) }\n\tfor (let i = 0; i < 3; i++) vars[names[i]] = (c[i] ?? 0) * scale\n\tconst specs = node.fn === 'color' ? [UNIT, UNIT, UNIT] : FUNCTIONS[node.fn].channels\n\tconst value = (token: string, spec: typeof ALPHA): Component =>\n\t\tchannel(SIMPLE.test(token) ? token : String(evaluate(token, vars)), spec, token)\n\tconst result: Color = { colorSpace: node.space, components: node.channels.map((t, i) => value(t, specs[i])) }\n\tconst alpha = node.alpha === undefined ? origin.alpha : value(node.alpha, ALPHA)\n\tif (alpha !== undefined) result.alpha = alpha\n\treturn result\n}\n\nfunction resolveMix(node: Extract<ColorExpr, { type: 'color-mix' }>, context: ResolveContext): Color {\n\tconst [first, second] = node.items\n\tconst p1 = first.percent ?? (second.percent === undefined ? 50 : 100 - second.percent)\n\tconst p2 = second.percent ?? 100 - p1\n\tconst sum = p1 + p2\n\tif (sum <= 0) return fail('color-mix()', 'the percentages must add up to more than 0')\n\tconst options = node.hue === undefined ? { in: node.space } : { in: node.space, hue: node.hue }\n\tconst result = mix(resolve(first.color, context), resolve(second.color, context), p2 / sum, options)\n\t// Percentages adding up to less than 100% make the result translucent.\n\tif (sum < 100 && result.alpha !== null) result.alpha = (result.alpha ?? 1) * (sum / 100)\n\treturn result\n}\n\n/**\n * Turns a color, a CSS string or a {@link ColorExpr} into a concrete {@link Color}.\n * `currentcolor`, system colors and `light-dark()` read `context`; nothing is\n * guessed, so a missing entry throws and names the value.\n */\nexport function resolve(input: string | ColorExpr, context: ResolveContext = {}): Color {\n\tconst expr = typeof input === 'string' ? parseExpr(input) : input\n\tif ('colorSpace' in expr) return expr\n\tif (expr.type === 'light-dark') return resolve(context.colorScheme === 'dark' ? expr.dark : expr.light, context)\n\tif (expr.type === 'color-mix') return resolveMix(expr, context)\n\tif (expr.type === 'relative') return resolveRelative(expr, context)\n\tif (expr.type === 'contrast-color') return contrastColor(resolve(expr.color, context))\n\tconst name = expr.type === 'currentcolor' ? 'currentcolor' : expr.name\n\tconst value = expr.type === 'currentcolor' ? context.currentColor : context.systemColors?.[name]\n\tif (value === undefined)\n\t\treturn fail(name, `needs ${expr.type === 'currentcolor' ? 'currentColor' : `systemColors.${name}`} to resolve`)\n\treturn resolve(value, { ...context, currentColor: undefined })\n}\n"],"mappings":";;;;AAEA,MAAM,QAAQ,MAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC;;AAGlF,SAAgB,SAAS,MAAqB;CAC7C,MAAM,IAAI,SAAS;CACnB,OAAO;EACN,YAAY;EACZ,YAAY;IAAG,MAAM,KAAM,OAAO;IAAO,MAAM,IAAK,OAAO;IAAM,IAAI,OAAO;EAAG;EAC/E,QAAQ,MAAM,MAAM;CACrB;AACD;;AAGA,SAAgB,OAAO,OAAsB;CAC5C,IAAI,MAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,+CAA+C,MAAM,WAAW,EAAE;CACnH,MAAM,CAAC,GAAG,GAAG,KAAK,MAAM;CACxB,MAAM,IAAI,MAAM,SAAS;CACzB,QAAS,KAAK,CAAC,KAAK,KAAO,KAAK,KAAK,CAAC,KAAK,KAAO,KAAK,KAAK,CAAC,KAAK,IAAK,KAAK,KAAK,CAAC,OAAO;AAC1F;;ACSA,MAAM,uBAAqD;CAC1D,WAAW;CACX,GAAGA,cAAAA;CACH,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;AACR;AACA,MAAM,8BAAc,IAAI,IAAI;CAAC;CAAW;CAAU;CAAc;AAAY,CAAC;AAC7E,MAAM,2BAAW,IAAI,IAAI;CAAC;CAAO;CAAQ;CAAO;CAAQ;CAAO;CAAO;CAAO;CAAS;CAAS;AAAO,CAAC;AACvG,MAAM,UAAU;;AAGhB,SAAS,MAAM,MAAc,QAAiB,OAAyB;CACtE,MAAM,MAAgB,CAAC;CACvB,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,MAAM,cAAoB;EACzB,IAAI,UAAU,SAAS,IAAI,KAAK,QAAQ,KAAK,CAAC;EAC9C,UAAU;CACX;CACA,KAAK,MAAM,MAAM,MAAM;EACtB,IAAI,OAAO,KAAK;OACX,IAAI,OAAO,KAAK;EACrB,IAAI,UAAU,MAAM,SAAS,OAAO,MAAM,QAAQ,KAAK,EAAE,IAAI;GAC5D,MAAM;GACN,IAAI,OAAO,KAAK,IAAI,KAAK,GAAG;EAC7B,OAAO,WAAW;CACnB;CACA,IAAI,UAAU,GAAG,OAAOC,cAAAA,KAAK,OAAO,wBAAwB;CAC5D,MAAM;CACN,OAAO;AACR;;AAGA,SAAS,KAAK,MAA4C;CACzD,MAAM,OAAO,KAAK,QAAQ,GAAG;CAC7B,IAAI,OAAO,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,YAAY,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,KAAA;CACtF,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,QAAQ,KACnC,IAAI,KAAK,OAAO,KAAK;MAChB,IAAI,KAAK,OAAO,OAAO,EAAE,UAAU,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,KAAA;CAE1E,OAAO,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,KAAK,MAAM,OAAO,GAAG,EAAE,CAAC;AACtD;AAEA,SAAS,SAAS,MAAc,OAA0B;CACzD,MAAM,CAAC,MAAM,GAAG,QAAQ,MAAM,MAAM,MAAM,KAAK;CAC/C,MAAM,QAAQ,KAAK,MAAM,KAAK;CAC9B,IAAI,MAAM,OAAO,QAAQ,CAAC,qBAAqB,MAAM,KACpD,OAAOA,cAAAA,KAAK,OAAO,oCAAkC,MAAM,EAAE;CAC9D,MAAM,QAAQ,qBAAqB,MAAM;CACzC,IAAI;CACJ,IAAI,MAAM,SAAS,GAAG;EACrB,IAAI,MAAM,WAAW,KAAK,MAAM,OAAO,SAAS,CAAC,YAAY,IAAI,MAAM,EAAE,GACxE,OAAOA,cAAAA,KAAK,OAAO,6BAA6B,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;EAEzE,MAAM,MAAM;CACb;CACA,IAAI,KAAK,WAAW,GAAG,OAAOA,cAAAA,KAAK,OAAO,qCAAqC,KAAK,QAAQ;CAC5F,MAAM,QAAQ,KAAK,KAAK,SAAS;EAChC,MAAM,QAAQ,MAAM,MAAM,OAAO,KAAK;EACtC,MAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC;EACpD,IAAI,MAAM,SAAS,SAAS,WAAW,KAAK,SAAS,SAAS,GAC7D,OAAOA,cAAAA,KAAK,OAAO,4BAA4B,IAAI;EACpD,MAAM,UAAU,SAAS,WAAW,IAAI,OAAO,WAAW,SAAS,EAAE,IAAI,KAAA;EACzE,IAAI,YAAY,KAAA,KAAa,UAAU,GAAG,OAAOA,cAAAA,KAAK,OAAO,uBAAuB,IAAI;EACxF,MAAM,QAAQ,UAAU,MAAM,MAAM,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAW;EACrE,OAAO,YAAY,KAAA,IAAY,EAAE,MAAM,IAAI;GAAE;GAAO;EAAQ;CAC7D,CAAC;CACD,OAAO,QAAQ,KAAA,IAAY;EAAE,MAAM;EAAa;EAAO;CAAM,IAAI;EAAE,MAAM;EAAa;EAAO;EAAK;CAAM;AACzG;AAEA,SAAS,SAAS,MAAc,OAAiB,OAA0B;CAC1E,MAAM,OAAO,MAAM,OAAO,KAAA,IAAYA,cAAAA,KAAK,OAAO,sBAAsB,IAAI,UAAU,MAAM,EAAE;CAC9F,IAAI;CACJ,IAAI,KAAK;CACT,MAAM,KAAK,SAAS,SAAS,QAAQ,SAAS,SAAS,QAAQ;CAC/D,IAAI,OAAO,SAAS;EACnB,MAAM,KAAKD,cAAAA,aAAa,MAAM;EAC9B,IAAI,CAAC,IAAI,OAAOC,cAAAA,KAAK,OAAO,uBAAuB,MAAM,EAAE;EAC3D,QAAQ;EACR,KAAK;CACN,OAAO,QAAQC,cAAAA,UAAU,GAAG,CAAC;CAC7B,MAAM,WAAW,MAAM,MAAM,IAAI,KAAK,CAAC;CACvC,MAAM,OAAO,MAAM,MAAM,KAAK,CAAC;CAC/B,IAAI,SAAS,WAAW,GAAG,OAAOD,cAAAA,KAAK,OAAO,8BAA8B,SAAS,QAAQ;CAC7F,IAAI,KAAK,SAAS,MAAM,KAAK,OAAO,OAAO,KAAK,WAAW,IAC1D,OAAOA,cAAAA,KAAK,OAAO,2CAAyC;CAC7D,MAAM,OAAiD;EACtD,MAAM;EACN;EACA;EACA;EACU;CACX;CACA,IAAI,KAAK,WAAW,GAAG,KAAK,QAAQ,KAAK;CACzC,OAAO;AACR;;;;;;;;AASA,SAAgB,UAAU,OAA0B;CACnD,MAAM,OAAO,MAAM,KAAK,CAAC,CAAC,YAAY;CACtC,IAAI,SAAS,gBAAgB,OAAO,EAAE,MAAM,eAAe;CAC3D,IAAIE,cAAAA,uBAAuB,KAAK,IAAI,GAAG,OAAO;EAAE,MAAM;EAAU,MAAM;CAAK;CAC3E,MAAM,QAAQ,KAAK,IAAI;CACvB,IAAI,CAAC,OAAO,OAAOC,cAAAA,MAAM,IAAI;CAC7B,MAAM,CAAC,MAAM,QAAQ;CACrB,IAAI,SAAS,aAAa,OAAO,SAAS,MAAM,KAAK;CACrD,IAAI,SAAS,cAAc;EAC1B,MAAM,OAAO,MAAM,MAAM,MAAM,KAAK;EACpC,IAAI,KAAK,WAAW,GAAG,OAAOH,cAAAA,KAAK,OAAO,sCAAsC,KAAK,QAAQ;EAC7F,OAAO;GAAE,MAAM;GAAc,OAAO,UAAU,KAAK,EAAE;GAAG,MAAM,UAAU,KAAK,EAAE;EAAE;CAClF;CACA,IAAI,SAAS,kBAAkB,OAAO;EAAE,MAAM;EAAkB,OAAO,UAAU,IAAI;CAAE;CACvF,IAAI,SAAS,IAAI,IAAI,GAAG;EACvB,MAAM,QAAQ,MAAM,MAAM,OAAO,KAAK;EACtC,IAAI,MAAM,OAAO,QAAQ,OAAO,SAAS,MAAM,OAAO,KAAK;CAC5D;CACA,OAAOG,cAAAA,MAAM,IAAI;AAClB;;AC3JA,MAAM,QAAQ;;;;;;AAOd,SAAgB,SAAS,MAAc,MAAsC;CAC5E,MAAM,SAAmB,CAAC;CAC1B,MAAM,YAAY;CAClB,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,GAAG,GAAG,IAAI,MAAM,KAAK,IAAI,GAAG;EACvD,MAAM,MAAM;EACZ,IAAI,EAAE,OAAO,KAAA,GAAW,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;OAC3C;GACJ,MAAM,OAAOC,cAAAA,MAAM,EAAE;GACrB,IAAI,SAAS,KAAA,GAAW,OAAOC,cAAAA,KAAK,MAAM,uDAAuD,EAAE,KAAK,EAAE,EAAE;GAC5G,OAAO,KAAK,OAAO,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC;EACxC;CACD;CACA,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,QAAQ,OAAOA,cAAAA,KAAK,MAAM,2BAA2B;CAChF,IAAI,MAAM;CACV,MAAM,aAAqB,OAAO;CAClC,MAAM,OAAO,MAAwB,OAAO,SAAS,IAAI,EAAE,MAAM,IAAI;CACrE,MAAM,QAAQ,MAAoB;EACjC,IAAI,CAAC,IAAI,CAAC,GAAG,cAAA,KAAK,MAAM,aAAa,EAAE,cAAc,OAAO,IAAI;CACjE;CACA,SAAS,MAAc;EACtB,IAAI,IAAI,QAAQ;EAChB,SACC,IAAI,IAAI,GAAG,GAAG,KAAK,QAAQ;OACtB,IAAI,IAAI,GAAG,GAAG,KAAK,QAAQ;OAC3B,OAAO;CAEd;CACA,SAAS,UAAkB;EAC1B,IAAI,IAAI,MAAM;EACd,SACC,IAAI,IAAI,GAAG,GAAG,KAAK,MAAM;OACpB,IAAI,IAAI,GAAG,GAAG,KAAK,MAAM;OACzB,OAAO;CAEd;CACA,SAAS,QAAgB;EACxB,IAAI,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM;EAC5B,IAAI,IAAI,GAAG,GAAG,OAAO,MAAM;EAC3B,OAAO,KAAK;CACb;CACA,SAAS,OAAiB;EACzB,MAAM,OAAO,CAAC,IAAI,CAAC;EACnB,OAAO,IAAI,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC;EAChC,KAAK,GAAG;EACR,OAAO;CACR;CACA,SAAS,OAAe;EACvB,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,KAAA,GAAW,OAAOA,cAAAA,KAAK,MAAM,8BAA8B;EACrE,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,OAAO,CAAC;EACrC,IAAI,MAAM,KAAK;GACd,MAAM,IAAI,IAAI;GACd,KAAK,GAAG;GACR,OAAO;EACR;EACA,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,OAAOA,cAAAA,KAAK,MAAM,oBAAoB,CAAC;EAC9D,IAAI,IAAI,GAAG,GAAG;GACb,MAAM,OAAO,KAAK;GAClB,IAAI,MAAM,UAAU,KAAK,WAAW,GAAG,OAAO,KAAK;GACnD,IAAI,MAAM,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI;GACxC,IAAI,MAAM,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI;GACxC,IAAI,MAAM,WAAW,KAAK,WAAW,GAAG,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;GAC3F,OAAOA,cAAAA,KAAK,MAAM,oBAAoB,CAAC;EACxC;EACA,IAAI,MAAM,MAAM,OAAO,KAAK;EAC5B,IAAI,MAAM,KAAK,OAAO,KAAK;EAC3B,MAAM,IAAI,KAAK;EACf,IAAI,OAAO,MAAM,UAAU,OAAO;EAClC,OAAOA,cAAAA,KAAK,MAAM,mBAAmB,CAAC;CACvC;CACA,MAAM,QAAQ,IAAI;CAClB,IAAI,MAAM,OAAO,QAAQ,OAAOA,cAAAA,KAAK,MAAM,oBAAoB,OAAO,IAAI;CAC1E,OAAO;AACR;;;AChEA,MAAM,WAAmC;CACxC,WAAW;CACX,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,WAAW;CACX,WAAW;AACZ;AACA,MAAM,SAAS;AAEf,MAAM,QAAe;CAAE,YAAY;CAAQ,YAAY;EAAC;EAAG;EAAG;CAAC;AAAE;AACjE,MAAM,QAAe;CAAE,YAAY;CAAQ,YAAY;EAAC;EAAG;EAAG;CAAC;AAAE;;AAGjE,SAAS,cAAc,OAAqB;CAC3C,OAAOC,iBAAAA,MAAM,OAAO,KAAK,KAAKA,iBAAAA,MAAM,OAAO,KAAK,IAAI,QAAQ;AAC7D;AAEA,SAAS,gBAAgB,MAAgD,SAAgC;CACxG,MAAM,SAAS,QAAQ,KAAK,MAAM,OAAO;CACzC,MAAM,IAAIC,cAAAA,aAAa,QAAQ,KAAK,KAAK;CACzC,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM;CACxC,MAAM,QAAQ,SAAS,KAAK,UAAU;CACtC,MAAM,OAA+B,EAAE,OAAO,OAAO,UAAU,KAAA,IAAY,IAAK,OAAO,SAAS,EAAG;CACnG,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,MAAM,OAAO,EAAE,MAAM,KAAK;CAC3D,MAAM,QAAQ,KAAK,OAAO,UAAU;EAACC,cAAAA;EAAMA,cAAAA;EAAMA,cAAAA;CAAI,IAAIC,cAAAA,UAAU,KAAK,GAAG,CAAC;CAC5E,MAAM,SAAS,OAAe,SAC7BC,cAAAA,QAAQ,OAAO,KAAK,KAAK,IAAI,QAAQ,OAAO,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM,KAAK;CAChF,MAAM,SAAgB;EAAE,YAAY,KAAK;EAAO,YAAY,KAAK,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;CAAE;CAC5G,MAAM,QAAQ,KAAK,UAAU,KAAA,IAAY,OAAO,QAAQ,MAAM,KAAK,OAAOC,cAAAA,KAAK;CAC/E,IAAI,UAAU,KAAA,GAAW,OAAO,QAAQ;CACxC,OAAO;AACR;AAEA,SAAS,WAAW,MAAiD,SAAgC;CACpG,MAAM,CAAC,OAAO,UAAU,KAAK;CAC7B,MAAM,KAAK,MAAM,YAAY,OAAO,YAAY,KAAA,IAAY,KAAK,MAAM,OAAO;CAC9E,MAAM,KAAK,OAAO,WAAW,MAAM;CACnC,MAAM,MAAM,KAAK;CACjB,IAAI,OAAO,GAAG,OAAOC,cAAAA,KAAK,eAAe,4CAA4C;CACrF,MAAM,UAAU,KAAK,QAAQ,KAAA,IAAY,EAAE,IAAI,KAAK,MAAM,IAAI;EAAE,IAAI,KAAK;EAAO,KAAK,KAAK;CAAI;CAC9F,MAAM,SAASC,YAAAA,IAAI,QAAQ,MAAM,OAAO,OAAO,GAAG,QAAQ,OAAO,OAAO,OAAO,GAAG,KAAK,KAAK,OAAO;CAEnG,IAAI,MAAM,OAAO,OAAO,UAAU,MAAM,OAAO,SAAS,OAAO,SAAS,MAAM,MAAM;CACpF,OAAO;AACR;;;;;;AAOA,SAAgB,QAAQ,OAA2B,UAA0B,CAAC,GAAU;CACvF,MAAM,OAAO,OAAO,UAAU,WAAW,UAAU,KAAK,IAAI;CAC5D,IAAI,gBAAgB,MAAM,OAAO;CACjC,IAAI,KAAK,SAAS,cAAc,OAAO,QAAQ,QAAQ,gBAAgB,SAAS,KAAK,OAAO,KAAK,OAAO,OAAO;CAC/G,IAAI,KAAK,SAAS,aAAa,OAAO,WAAW,MAAM,OAAO;CAC9D,IAAI,KAAK,SAAS,YAAY,OAAO,gBAAgB,MAAM,OAAO;CAClE,IAAI,KAAK,SAAS,kBAAkB,OAAO,cAAc,QAAQ,KAAK,OAAO,OAAO,CAAC;CACrF,MAAM,OAAO,KAAK,SAAS,iBAAiB,iBAAiB,KAAK;CAClE,MAAM,QAAQ,KAAK,SAAS,iBAAiB,QAAQ,eAAe,QAAQ,eAAe;CAC3F,IAAI,UAAU,KAAA,GACb,OAAOD,cAAAA,KAAK,MAAM,SAAS,KAAK,SAAS,iBAAiB,iBAAiB,gBAAgB,OAAO,YAAY;CAC/G,OAAO,QAAQ,OAAO;EAAE,GAAG;EAAS,cAAc,KAAA;CAAU,CAAC;AAC9D"}