@jesscss/core 2.0.0-alpha.5 → 2.0.0-alpha.6

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 (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -98
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -319
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -0,0 +1,629 @@
1
+ import type { Class } from 'type-fest';
2
+ import { Node, F_STATIC, defineType, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
3
+ import { calculate, type Operator } from './util/calculate.js';
4
+ import { type Context } from '../context.js';
5
+ import { isNode } from './util/is-node.js';
6
+ import { N } from './node-type.js';
7
+ import round from 'lodash-es/round.js';
8
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
9
+ type ColorValues = [number, number, number, number] | number[];
10
+ type ChannelTuple = [number, string];
11
+ type ChannelValue = number | ChannelTuple;
12
+ type AlphaValue = number | ChannelTuple;
13
+ type RGBChannels = [ChannelValue, ChannelValue, ChannelValue];
14
+ type HSLChannels = [ChannelValue, ChannelValue, ChannelValue];
15
+
16
+ export enum ColorFormat {
17
+ HEX,
18
+ RGB,
19
+ HSL
20
+ }
21
+
22
+ function clamp(v: number, max: number) {
23
+ return Math.min(Math.max(v, 0), max);
24
+ }
25
+
26
+ function parseHexString(hex: string): { rgb: [number, number, number]; alpha: number } {
27
+ let rgba: number[] = [];
28
+ let hexValue = hex.slice(1);
29
+
30
+ if (hexValue.length >= 6) {
31
+ (hexValue.match(/.{2}/g) as RegExpMatchArray).forEach((c, i) => {
32
+ if (i < 3) {
33
+ rgba.push(parseInt(c, 16));
34
+ } else {
35
+ rgba.push(parseInt(c, 16) / 255);
36
+ }
37
+ });
38
+ } else {
39
+ hexValue.split('').forEach((c, i) => {
40
+ if (i < 3) {
41
+ rgba.push(parseInt(c + c, 16));
42
+ } else {
43
+ rgba.push(parseInt(c + c, 16) / 255);
44
+ }
45
+ });
46
+ }
47
+
48
+ return {
49
+ rgb: [rgba[0]!, rgba[1]!, rgba[2]!] as [number, number, number],
50
+ alpha: rgba.length === 3 ? 1 : rgba[3]!
51
+ };
52
+ }
53
+
54
+ const { isArray } = Array;
55
+
56
+ export interface ColorData {
57
+ node?: string | Node;
58
+ /** Legacy field; format now lives on Color options. */
59
+ format?: ColorFormat;
60
+ rgb?: RGBChannels;
61
+ hsl?: HSLChannels;
62
+ alpha?: AlphaValue;
63
+ }
64
+
65
+ export interface ColorOptions extends NodeOptions {
66
+ format?: ColorFormat;
67
+ modernSyntax?: boolean;
68
+ }
69
+
70
+ export interface Color extends Node<ColorData, ColorOptions> {
71
+ type: 'Color';
72
+ shortType: 'color';
73
+ eval(context: Context): Color;
74
+ node: string | Node | undefined;
75
+ }
76
+
77
+ /**
78
+ * Color's `value` will store RGB, HSL, and alpha separately to avoid unnecessary conversions.
79
+ * Conversion only happens when modifying colors or when explicitly requested.
80
+ */
81
+ export class Color extends Node<ColorData, ColorOptions> {
82
+ static override childKeys = null as null;
83
+
84
+ _rgbChannels: RGBChannels | undefined;
85
+ _hslChannels: HSLChannels | undefined;
86
+ _alphaValue: AlphaValue | undefined;
87
+ _nodeValue: string | Node | undefined;
88
+
89
+ get node(): string | Node | undefined {
90
+ return this._nodeValue;
91
+ }
92
+
93
+ set node(value: string | Node | undefined) {
94
+ this._nodeValue = value;
95
+ }
96
+
97
+ constructor(
98
+ value: ColorData | string | ColorValues,
99
+ options?: ColorOptions,
100
+ location?: OptionalLocation,
101
+ context?: TreeContext
102
+ ) {
103
+ let colorData: ColorData;
104
+ let colorOptions: ColorOptions = options ?? {};
105
+
106
+ if (isArray(value)) {
107
+ // Handle color array [r, g, b, a]
108
+ const [r, g, b, a] = value as [number, number, number, number];
109
+ colorData = {
110
+ rgb: [r, g, b],
111
+ alpha: a
112
+ };
113
+ colorOptions = { ...colorOptions, format: colorOptions.format ?? ColorFormat.RGB };
114
+ } else if (typeof value === 'object' && value !== null && !isNode(value)) {
115
+ // Handle ColorData object
116
+ colorData = value as ColorData;
117
+
118
+ // Validate that we have either rgb, hsl, or a node to parse
119
+ if (!colorData.rgb && !colorData.hsl && !colorData.node) {
120
+ throw new TypeError('Color constructor requires rgb, hsl, or node property');
121
+ }
122
+ if (colorData.format !== undefined && colorOptions.format === undefined) {
123
+ colorOptions = { ...colorOptions, format: colorData.format };
124
+ }
125
+ } else if (typeof value === 'string') {
126
+ // Handle hex string - parse it immediately to set RGB values
127
+ const { rgb, alpha } = parseHexString(value);
128
+ colorData = {
129
+ node: value,
130
+ rgb,
131
+ alpha
132
+ };
133
+ colorOptions = { ...colorOptions, format: colorOptions.format ?? ColorFormat.HEX };
134
+ } else {
135
+ throw new TypeError('Color constructor requires ColorData object, hex string, or color array');
136
+ }
137
+
138
+ // Keep value focused on channels/node; rendering intent is held in options.
139
+ colorData.format = undefined;
140
+ super(colorData, colorOptions, location, context);
141
+ this._rgbChannels = colorData.rgb;
142
+ this._hslChannels = colorData.hsl;
143
+ this._alphaValue = colorData.alpha;
144
+ this._nodeValue = colorData.node;
145
+ this.addFlag(F_STATIC);
146
+ }
147
+
148
+ override clone(deep?: boolean): this {
149
+ const options = this._meta?.options;
150
+ const colorData: any = {
151
+ node: this._nodeValue,
152
+ rgb: this._rgbChannels ? [...this._rgbChannels] : undefined,
153
+ hsl: this._hslChannels ? [...this._hslChannels] : undefined,
154
+ alpha: this._alphaValue
155
+ };
156
+ const newNode = new (this.constructor as Class<this>)(
157
+ colorData,
158
+ options ? { ...options } : undefined,
159
+ this.location,
160
+ this.treeContext
161
+ );
162
+ newNode.inherit(this);
163
+ return newNode;
164
+ }
165
+
166
+ override compare(b: Node, context?: Context): 0 | 1 | -1 | undefined {
167
+ if (!(b instanceof Color)) {
168
+ return super.compare(b, context);
169
+ }
170
+
171
+ const aRgba = [...this._rgb, this._alpha] as const;
172
+ const bRgba = [...b._rgb, b._alpha] as const;
173
+
174
+ for (let i = 0; i < aRgba.length; i++) {
175
+ const cmp = Node.numericCompare(aRgba[i]!, bRgba[i]!);
176
+ if (cmp !== 0) {
177
+ return cmp;
178
+ }
179
+ }
180
+
181
+ return 0;
182
+ }
183
+
184
+ private normalizeChannelValue(value: unknown): ChannelValue {
185
+ if (typeof value === 'number') {
186
+ return value;
187
+ }
188
+ if (isNode(value, N.Dimension)) {
189
+ const { number, unit } = value;
190
+ return unit ? [number, unit] : number;
191
+ }
192
+ return value as ChannelValue;
193
+ }
194
+
195
+ private hueToDegrees(value: ChannelValue): number {
196
+ value = this.normalizeChannelValue(value) as ChannelValue;
197
+ if (typeof value === 'number') {
198
+ return value;
199
+ }
200
+ const [number, unit] = value;
201
+ switch (unit) {
202
+ case 'turn':
203
+ return number * 360;
204
+ case 'rad':
205
+ return number * (180 / Math.PI);
206
+ case 'grad':
207
+ return number * 0.9;
208
+ default:
209
+ return number;
210
+ }
211
+ }
212
+
213
+ private percentToUnit(value: ChannelValue): number {
214
+ value = this.normalizeChannelValue(value) as ChannelValue;
215
+ if (typeof value === 'number') {
216
+ return value;
217
+ }
218
+ const [number, unit] = value;
219
+ return unit === '%' ? number / 100 : number;
220
+ }
221
+
222
+ private rgbChannelToNumber(value: ChannelValue): number {
223
+ value = this.normalizeChannelValue(value) as ChannelValue;
224
+ if (typeof value === 'number') {
225
+ return value;
226
+ }
227
+ const [number, unit] = value;
228
+ return unit === '%' ? (number * 255) / 100 : number;
229
+ }
230
+
231
+ private alphaToNumber(value: AlphaValue): number {
232
+ value = this.normalizeChannelValue(value) as AlphaValue;
233
+ if (typeof value === 'number') {
234
+ return value;
235
+ }
236
+ const [number, unit] = value;
237
+ return unit === '%' ? number / 100 : number;
238
+ }
239
+
240
+ private getSerializedAlphaText(compress: boolean): string {
241
+ const alphaSource = this._alphaValue;
242
+ if (compress && this.alpha === 0) {
243
+ return '0';
244
+ }
245
+ const normalizedAlphaSource = this.normalizeChannelValue(alphaSource) as AlphaValue;
246
+ if (Array.isArray(normalizedAlphaSource)) {
247
+ const [alphaValue, alphaUnit] = normalizedAlphaSource;
248
+ return `${round(alphaValue, 8)}${alphaUnit}`;
249
+ }
250
+ return `${this.alpha}`;
251
+ }
252
+
253
+ private getSerializedRgbText(): [string, string, string] {
254
+ const rgbSource = this._rgbChannels;
255
+ if (!rgbSource) {
256
+ const [r, g, b] = this.rgb;
257
+ return [`${r}`, `${g}`, `${b}`];
258
+ }
259
+ return rgbSource.map((channel, idx) => {
260
+ channel = this.normalizeChannelValue(channel) as ChannelValue;
261
+ if (typeof channel === 'number') {
262
+ return `${this.rgb[idx]!}`;
263
+ }
264
+ const [number, unit] = channel;
265
+ if (unit === '%') {
266
+ return `${round(clamp(number, 100), 8)}%`;
267
+ }
268
+ return `${this.rgb[idx]!}`;
269
+ }) as [string, string, string];
270
+ }
271
+
272
+ /**
273
+ * Get RGB values, converting from HSL if needed.
274
+ * Returns clamped values (0-255) for better developer experience.
275
+ * For internal calculations, use _rgb instead.
276
+ */
277
+ get rgb(): [number, number, number] {
278
+ const [r, g, b] = this._rgb;
279
+ return [
280
+ clamp(round(r), 255),
281
+ clamp(round(g), 255),
282
+ clamp(round(b), 255)
283
+ ];
284
+ }
285
+
286
+ /**
287
+ * Internal getter for unclamped RGB values.
288
+ * Use this for calculations and conversions.
289
+ */
290
+ get _rgb(): [number, number, number] {
291
+ if (this._rgbChannels) {
292
+ const [r, g, b] = this._rgbChannels;
293
+ return [
294
+ this.rgbChannelToNumber(r),
295
+ this.rgbChannelToNumber(g),
296
+ this.rgbChannelToNumber(b)
297
+ ];
298
+ }
299
+
300
+ if (this._hslChannels) {
301
+ // Convert HSL to RGB
302
+ const [h, s, l] = this._hslChannels;
303
+ const hue = this.hueToDegrees(h) / 360;
304
+ const sat = this.percentToUnit(s);
305
+ const light = this.percentToUnit(l);
306
+
307
+ let r, g, b;
308
+
309
+ if (sat === 0) {
310
+ r = g = b = light;
311
+ } else {
312
+ const hue2rgb = (p: number, q: number, t: number) => {
313
+ if (t < 0) {
314
+ t += 1;
315
+ }
316
+ if (t > 1) {
317
+ t -= 1;
318
+ }
319
+ if (t < 1 / 6) {
320
+ return p + (q - p) * 6 * t;
321
+ }
322
+ if (t < 1 / 2) {
323
+ return q;
324
+ }
325
+ if (t < 2 / 3) {
326
+ return p + (q - p) * (2 / 3 - t) * 6;
327
+ }
328
+ return p;
329
+ };
330
+
331
+ const q = light < 0.5 ? light * (1 + sat) : light + sat - light * sat;
332
+ const p = 2 * light - q;
333
+
334
+ r = hue2rgb(p, q, hue + 1 / 3);
335
+ g = hue2rgb(p, q, hue);
336
+ b = hue2rgb(p, q, hue - 1 / 3);
337
+ }
338
+
339
+ // Convert from 0-1 to 0-255 range
340
+ const rgb = [r * 255, g * 255, b * 255] as [number, number, number];
341
+ this._rgbChannels = rgb;
342
+ this._hslChannels = undefined;
343
+ return rgb;
344
+ }
345
+
346
+ // If value has a node that's a string, parse it as hex
347
+ if (this._nodeValue && typeof this._nodeValue === 'string') {
348
+ const { rgb, alpha } = parseHexString(this._nodeValue);
349
+ this._rgbChannels = rgb;
350
+ this._alphaValue = alpha;
351
+ this._hslChannels = undefined;
352
+ return rgb;
353
+ }
354
+
355
+ throw new TypeError('Cannot convert color value to rgb');
356
+ }
357
+
358
+ set rgb(rgb: [number, number, number] | RGBChannels) {
359
+ this._rgbChannels = rgb;
360
+ this._hslChannels = undefined;
361
+ }
362
+
363
+ /**
364
+ * Get HSL values, converting from RGB if needed.
365
+ * Returns clamped values (hue: 0-360, saturation/lightness: 0-1) for better developer experience.
366
+ * For internal calculations, use _hsl instead.
367
+ */
368
+ get hsl(): [number, number, number] {
369
+ const [h, s, l] = this._hsl;
370
+ return [
371
+ ((h % 360) + 360) % 360, // Wrap hue to 0-360
372
+ clamp(s, 1), // Clamp saturation to 0-1
373
+ clamp(l, 1) // Clamp lightness to 0-1
374
+ ];
375
+ }
376
+
377
+ /**
378
+ * Internal getter for unclamped HSL values.
379
+ * Use this for calculations and conversions.
380
+ */
381
+ get _hsl(): [number, number, number] {
382
+ if (this._hslChannels) {
383
+ const [h, s, l] = this._hslChannels;
384
+ return [
385
+ this.hueToDegrees(h),
386
+ this.percentToUnit(s),
387
+ this.percentToUnit(l)
388
+ ];
389
+ }
390
+
391
+ // Convert RGB to HSL
392
+ let [r, g, b] = this._rgb;
393
+ // Convert RGB from 0-255 range to 0-1 range for HSL calculation
394
+ r = r / 255;
395
+ g = g / 255;
396
+ b = b / 255;
397
+
398
+ let max = Math.max(r, g, b);
399
+ let min = Math.min(r, g, b);
400
+ let h: number;
401
+ let s: number;
402
+ let l = (max + min) / 2;
403
+
404
+ if (max === min) {
405
+ h = s = 0;
406
+ } else {
407
+ let d = max - min;
408
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
409
+ switch (max) {
410
+ case r: {
411
+ h = (g - b) / d + (g < b ? 6 : 0);
412
+ break;
413
+ }
414
+ case g: {
415
+ h = (b - r) / d + 2;
416
+ break;
417
+ }
418
+ case b: {
419
+ h = (r - g) / d + 4;
420
+ break;
421
+ }
422
+ }
423
+ h! /= 6;
424
+ }
425
+
426
+ const hsl = [h! * 360, s, l] as [number, number, number];
427
+ this._hslChannels = hsl;
428
+ this._rgbChannels = undefined;
429
+ return hsl;
430
+ }
431
+
432
+ set hsl(hsl: [number, number, number] | HSLChannels) {
433
+ this._hslChannels = hsl;
434
+ this._rgbChannels = undefined;
435
+ }
436
+
437
+ /**
438
+ * Get alpha value.
439
+ * Returns clamped value (0-1) for better developer experience.
440
+ * For internal calculations, use _alpha instead.
441
+ */
442
+ get alpha(): number {
443
+ return clamp(this._alpha, 1);
444
+ }
445
+
446
+ /**
447
+ * Internal getter for unclamped alpha value.
448
+ * Use this for calculations and conversions.
449
+ */
450
+ get _alpha(): number {
451
+ const alpha = this._alphaValue ?? 1;
452
+ return this.alphaToNumber(alpha);
453
+ }
454
+
455
+ set alpha(alpha: AlphaValue) {
456
+ this._alphaValue = alpha;
457
+ }
458
+
459
+ /**
460
+ * Get RGBA values for backward compatibility.
461
+ * Returns clamped values for better developer experience.
462
+ */
463
+ get rgba(): ColorValues {
464
+ return [...this.rgb, this.alpha];
465
+ }
466
+
467
+ set rgba(rgba: ColorValues) {
468
+ const [r, g, b, a] = rgba as [number, number, number, number];
469
+ this._rgbChannels = [r, g, b];
470
+ this._alphaValue = a;
471
+ this._hslChannels = undefined;
472
+ }
473
+
474
+ /**
475
+ * Get HSLA values for backward compatibility.
476
+ * Returns clamped values for better developer experience.
477
+ */
478
+ get hsla(): [number, number, number, number] {
479
+ return [...this.hsl, this.alpha];
480
+ }
481
+
482
+ set hsla(hsla: [number, number, number, number]) {
483
+ const [h, s, l, a] = hsla;
484
+ this._hslChannels = [h, s, l];
485
+ this._alphaValue = a;
486
+ this._rgbChannels = undefined;
487
+ }
488
+
489
+ toHSL(): [number, number, number] {
490
+ return this.hsl;
491
+ }
492
+
493
+ toHex(): string {
494
+ const values = this.rgb;
495
+ let alpha = this.alpha;
496
+ if (alpha < 1) {
497
+ values.push(round(alpha * 255));
498
+ }
499
+ let hex = '#' + values.map(function(c) {
500
+ let hex = c.toString(16);
501
+ return hex.length === 1 ? '0' + hex : hex;
502
+ }).join('');
503
+ return hex;
504
+ }
505
+
506
+ override toTrimmedString(options?: PrintOptions) {
507
+ options = getPrintOptions(options);
508
+ const w = options.writer!;
509
+ const mark = w.mark();
510
+ const compress = Boolean(options.compress);
511
+
512
+ // If value has a node that's a Node, serialize it directly
513
+ if (this._nodeValue && isNode(this._nodeValue)) {
514
+ return this._nodeValue.toTrimmedString(options);
515
+ }
516
+
517
+ // If value has a node that's a string, output it as-is
518
+ if (this._nodeValue && typeof this._nodeValue === 'string') {
519
+ w.add(this._nodeValue, this);
520
+ return w.getSince(mark);
521
+ }
522
+
523
+ // Handle format-based serialization
524
+ const format = this.options.format ?? ColorFormat.HEX;
525
+ if (format === ColorFormat.RGB) {
526
+ const useModernSyntax = Boolean(this.options.modernSyntax || compress);
527
+ const rgbText = this.getSerializedRgbText();
528
+ const alphaText = this.getSerializedAlphaText(compress);
529
+ if (useModernSyntax) {
530
+ if (this.alpha < 1) {
531
+ w.add('rgb(', this);
532
+ w.add(`${rgbText[0]} ${rgbText[1]} ${rgbText[2]} / ${alphaText}`);
533
+ w.add(')');
534
+ } else {
535
+ w.add('rgb(', this);
536
+ w.add(`${rgbText[0]} ${rgbText[1]} ${rgbText[2]}`);
537
+ w.add(')');
538
+ }
539
+ } else {
540
+ if (this.alpha < 1) {
541
+ w.add('rgba(', this);
542
+ w.add(`${rgbText[0]}, ${rgbText[1]}, ${rgbText[2]}, ${alphaText}`);
543
+ w.add(')');
544
+ } else {
545
+ w.add('rgb(', this);
546
+ w.add(`${rgbText[0]}, ${rgbText[1]}, ${rgbText[2]}`);
547
+ w.add(')');
548
+ }
549
+ }
550
+ return w.getSince(mark);
551
+ } else if (format === ColorFormat.HSL) {
552
+ const [h, s, l] = this.hsl;
553
+ const hueSource = this._hslChannels?.[0];
554
+ const alphaText = this.getSerializedAlphaText(compress);
555
+ const authoredHueUnit = Array.isArray(hueSource) ? hueSource[1] : '';
556
+ const roundedHue = round(h, 8);
557
+ const canDropHueUnitForCompression = compress && roundedHue === 0;
558
+ const modernHueUnit = canDropHueUnitForCompression
559
+ ? ''
560
+ : (authoredHueUnit || 'deg');
561
+ const preservedHueUnit = canDropHueUnitForCompression ? '' : authoredHueUnit;
562
+ const useModernSyntax = Boolean(this.options.modernSyntax || compress);
563
+ if (useModernSyntax) {
564
+ if (this.alpha < 1) {
565
+ w.add('hsl(', this);
566
+ w.add(`${roundedHue}${modernHueUnit} ${round(s * 100, 8)}% ${round(l * 100, 8)}% / ${alphaText}`);
567
+ w.add(')');
568
+ } else {
569
+ w.add('hsl(', this);
570
+ w.add(`${roundedHue}${modernHueUnit} ${round(s * 100, 8)}% ${round(l * 100, 8)}%`);
571
+ w.add(')');
572
+ }
573
+ } else {
574
+ if (this.alpha < 1) {
575
+ w.add('hsla(', this);
576
+ w.add(`${roundedHue}${preservedHueUnit}, ${round(s * 100, 8)}%, ${round(l * 100, 8)}%, ${alphaText}`);
577
+ w.add(')');
578
+ } else {
579
+ w.add('hsl(', this);
580
+ w.add(`${roundedHue}${preservedHueUnit}, ${round(s * 100, 8)}%, ${round(l * 100, 8)}%`);
581
+ w.add(')');
582
+ }
583
+ }
584
+ return w.getSince(mark);
585
+ }
586
+
587
+ // Default to hex
588
+ w.add(this.toHex(), this);
589
+ return w.getSince(mark);
590
+ }
591
+
592
+ override operate(b: Node, op: Operator, context?: Context | undefined): Color {
593
+ let aRGB = this._rgb;
594
+ let newColorValues: [number, number, number];
595
+ let newAlpha = this._alpha;
596
+
597
+ if (isNode(b, N.Dimension)) {
598
+ const { number: bVal, unit: bUnit } = b;
599
+ const unitMode = context?.opts?.unitMode ?? 'loose';
600
+ const isStrictLikeMode = unitMode === 'strict' || unitMode === 'preserve';
601
+ if (bUnit && isStrictLikeMode) {
602
+ throw new TypeError(`Cannot convert "${b}" to a color`);
603
+ }
604
+ // Apply operation to each RGB component with the number
605
+ newColorValues = aRGB.map(a => calculate(a, op, bVal)) as [number, number, number];
606
+ } else if (b instanceof Color) {
607
+ // Color-to-color operation
608
+ let bRGB = b._rgb;
609
+ newColorValues = aRGB.map((a, i) => calculate(a, op, bRGB[i]!)) as [number, number, number];
610
+ newAlpha = this._alpha * (1 - b._alpha) + b._alpha;
611
+ } else {
612
+ throw new TypeError(`Cannot operate on ${b.type}`);
613
+ }
614
+
615
+ // Create new color with preserved data
616
+ const newColor = new Color({
617
+ rgb: newColorValues,
618
+ alpha: newAlpha
619
+ // Don't preserve HSL - new RGB values represent a new color
620
+ }, {
621
+ format: this.options.format,
622
+ modernSyntax: this.options.modernSyntax
623
+ }).inherit(this);
624
+
625
+ return newColor;
626
+ }
627
+ }
628
+
629
+ export const color = defineType(Color, 'Color');
@@ -0,0 +1,30 @@
1
+ import type { Context } from '../context.js';
2
+ import { defineType, F_STATIC, type OptionalLocation, type NodeOptions, type TreeContext } from './node.js';
3
+ import { Selector } from './selector.js';
4
+
5
+ export type Combinators = ' ' | '>' | '+' | '~' | '|' | '||';
6
+
7
+ export interface Combinator extends Selector<Combinators> {
8
+ type: 'Combinator';
9
+ shortType: 'co';
10
+ eval(context: Context): Combinator;
11
+ }
12
+
13
+ export class Combinator extends Selector<Combinators> {
14
+ static override childKeys = null as null;
15
+
16
+ readonly value!: Combinators;
17
+
18
+ constructor(
19
+ value: Combinators,
20
+ options?: NodeOptions,
21
+ location?: OptionalLocation,
22
+ treeContext?: TreeContext
23
+ ) {
24
+ super(value, options, location, treeContext);
25
+ this.value = value;
26
+ this.addFlag(F_STATIC);
27
+ }
28
+ }
29
+
30
+ export const co = defineType(Combinator, 'Combinator', 'co');
@@ -0,0 +1,36 @@
1
+ import { type Context } from '../context.js';
2
+ import { Node, F_VISIBLE, F_STATIC, defineType, type OptionalLocation, type TreeContext } from './node.js';
3
+
4
+ export type CommentOptions = {
5
+ lineComment?: boolean;
6
+ };
7
+
8
+ export interface Comment extends Node<string, CommentOptions> {
9
+ type: 'Comment';
10
+ shortType: 'comment';
11
+ eval(context: Context): Comment;
12
+ }
13
+
14
+ /**
15
+ * A comment node
16
+ */
17
+ export class Comment extends Node<string, CommentOptions> {
18
+ static override childKeys = null as null;
19
+
20
+ readonly value!: string;
21
+ readonly lineComment: boolean;
22
+
23
+ constructor(value: string, options?: CommentOptions, location?: OptionalLocation, treeContext?: TreeContext) {
24
+ super(value, options, location, treeContext);
25
+ this.value = value;
26
+ this.lineComment = !!options?.lineComment;
27
+ this.allowRoot = true;
28
+ this.allowRuleRoot = true;
29
+ this.addFlag(F_STATIC);
30
+ if (this.lineComment || value.startsWith('//')) {
31
+ this.removeFlag(F_VISIBLE);
32
+ }
33
+ }
34
+ }
35
+
36
+ export const comment = defineType(Comment, 'Comment');