@cortex-js/compute-engine 0.55.6 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/compile.esm.js +776 -139
  2. package/dist/compile.min.esm.js +277 -78
  3. package/dist/compile.min.umd.cjs +277 -78
  4. package/dist/compile.umd.cjs +776 -139
  5. package/dist/compute-engine.esm.js +1299 -260
  6. package/dist/compute-engine.min.esm.js +298 -99
  7. package/dist/compute-engine.min.umd.cjs +298 -99
  8. package/dist/compute-engine.umd.cjs +1299 -260
  9. package/dist/core.esm.js +1298 -259
  10. package/dist/core.min.esm.js +297 -98
  11. package/dist/core.min.umd.cjs +297 -98
  12. package/dist/core.umd.cjs +1298 -259
  13. package/dist/interval.esm.js +134 -5
  14. package/dist/interval.min.esm.js +6 -6
  15. package/dist/interval.min.umd.cjs +6 -6
  16. package/dist/interval.umd.cjs +134 -5
  17. package/dist/latex-syntax.esm.js +160 -11
  18. package/dist/latex-syntax.min.esm.js +7 -7
  19. package/dist/latex-syntax.min.umd.cjs +7 -7
  20. package/dist/latex-syntax.umd.cjs +160 -11
  21. package/dist/math-json.esm.js +2 -2
  22. package/dist/math-json.min.esm.js +2 -2
  23. package/dist/math-json.min.umd.cjs +2 -2
  24. package/dist/math-json.umd.cjs +2 -2
  25. package/dist/numerics.esm.js +4 -2
  26. package/dist/numerics.min.esm.js +3 -3
  27. package/dist/numerics.min.umd.cjs +3 -3
  28. package/dist/numerics.umd.cjs +4 -2
  29. package/dist/types/big-decimal/big-decimal.d.ts +1 -1
  30. package/dist/types/big-decimal/index.d.ts +1 -1
  31. package/dist/types/big-decimal/transcendentals.d.ts +1 -1
  32. package/dist/types/big-decimal/utils.d.ts +1 -1
  33. package/dist/types/common/ansi-codes.d.ts +1 -1
  34. package/dist/types/common/configuration-change.d.ts +1 -1
  35. package/dist/types/common/fuzzy-string-match.d.ts +1 -1
  36. package/dist/types/common/grapheme-splitter.d.ts +1 -1
  37. package/dist/types/common/interruptible.d.ts +1 -1
  38. package/dist/types/common/one-of.d.ts +1 -1
  39. package/dist/types/common/signals.d.ts +1 -1
  40. package/dist/types/common/type/ast-nodes.d.ts +1 -1
  41. package/dist/types/common/type/boxed-type.d.ts +1 -1
  42. package/dist/types/common/type/lexer.d.ts +1 -1
  43. package/dist/types/common/type/parse.d.ts +1 -1
  44. package/dist/types/common/type/parser.d.ts +1 -1
  45. package/dist/types/common/type/primitive.d.ts +1 -1
  46. package/dist/types/common/type/reduce.d.ts +1 -1
  47. package/dist/types/common/type/serialize.d.ts +1 -1
  48. package/dist/types/common/type/subtype.d.ts +1 -1
  49. package/dist/types/common/type/type-builder.d.ts +1 -1
  50. package/dist/types/common/type/types.d.ts +2 -2
  51. package/dist/types/common/type/utils.d.ts +1 -1
  52. package/dist/types/common/utils.d.ts +1 -1
  53. package/dist/types/compile.d.ts +1 -1
  54. package/dist/types/compute-engine/assume.d.ts +1 -1
  55. package/dist/types/compute-engine/boxed-expression/abstract-boxed-expression.d.ts +1 -1
  56. package/dist/types/compute-engine/boxed-expression/apply.d.ts +1 -1
  57. package/dist/types/compute-engine/boxed-expression/arithmetic-add.d.ts +1 -1
  58. package/dist/types/compute-engine/boxed-expression/arithmetic-mul-div.d.ts +1 -1
  59. package/dist/types/compute-engine/boxed-expression/arithmetic-power.d.ts +1 -1
  60. package/dist/types/compute-engine/boxed-expression/ascii-math.d.ts +1 -1
  61. package/dist/types/compute-engine/boxed-expression/box.d.ts +1 -1
  62. package/dist/types/compute-engine/boxed-expression/boxed-dictionary.d.ts +1 -1
  63. package/dist/types/compute-engine/boxed-expression/boxed-function.d.ts +1 -1
  64. package/dist/types/compute-engine/boxed-expression/boxed-number.d.ts +1 -1
  65. package/dist/types/compute-engine/boxed-expression/boxed-operator-definition.d.ts +1 -1
  66. package/dist/types/compute-engine/boxed-expression/boxed-patterns.d.ts +1 -1
  67. package/dist/types/compute-engine/boxed-expression/boxed-string.d.ts +1 -1
  68. package/dist/types/compute-engine/boxed-expression/boxed-symbol.d.ts +1 -1
  69. package/dist/types/compute-engine/boxed-expression/boxed-tensor.d.ts +1 -1
  70. package/dist/types/compute-engine/boxed-expression/boxed-value-definition.d.ts +1 -1
  71. package/dist/types/compute-engine/boxed-expression/cache.d.ts +1 -1
  72. package/dist/types/compute-engine/boxed-expression/canonical-utils.d.ts +1 -1
  73. package/dist/types/compute-engine/boxed-expression/canonical.d.ts +1 -1
  74. package/dist/types/compute-engine/boxed-expression/compare.d.ts +1 -1
  75. package/dist/types/compute-engine/boxed-expression/constants.d.ts +1 -1
  76. package/dist/types/compute-engine/boxed-expression/expand.d.ts +1 -1
  77. package/dist/types/compute-engine/boxed-expression/expression-map.d.ts +1 -1
  78. package/dist/types/compute-engine/boxed-expression/factor.d.ts +1 -1
  79. package/dist/types/compute-engine/boxed-expression/flatten.d.ts +1 -1
  80. package/dist/types/compute-engine/boxed-expression/hold.d.ts +1 -1
  81. package/dist/types/compute-engine/boxed-expression/inequality-bounds.d.ts +1 -1
  82. package/dist/types/compute-engine/boxed-expression/init-lazy-refs.d.ts +1 -1
  83. package/dist/types/compute-engine/boxed-expression/invisible-operator.d.ts +1 -1
  84. package/dist/types/compute-engine/boxed-expression/match.d.ts +1 -1
  85. package/dist/types/compute-engine/boxed-expression/negate.d.ts +1 -1
  86. package/dist/types/compute-engine/boxed-expression/numerics.d.ts +1 -1
  87. package/dist/types/compute-engine/boxed-expression/order.d.ts +1 -1
  88. package/dist/types/compute-engine/boxed-expression/pattern-utils.d.ts +1 -1
  89. package/dist/types/compute-engine/boxed-expression/polynomial-degree.d.ts +1 -1
  90. package/dist/types/compute-engine/boxed-expression/polynomials.d.ts +1 -1
  91. package/dist/types/compute-engine/boxed-expression/predicates.d.ts +1 -1
  92. package/dist/types/compute-engine/boxed-expression/rules.d.ts +1 -1
  93. package/dist/types/compute-engine/boxed-expression/serialize.d.ts +1 -1
  94. package/dist/types/compute-engine/boxed-expression/sgn.d.ts +1 -1
  95. package/dist/types/compute-engine/boxed-expression/simplify.d.ts +1 -1
  96. package/dist/types/compute-engine/boxed-expression/solve-linear-system.d.ts +1 -1
  97. package/dist/types/compute-engine/boxed-expression/solve.d.ts +1 -1
  98. package/dist/types/compute-engine/boxed-expression/stochastic-equal.d.ts +1 -1
  99. package/dist/types/compute-engine/boxed-expression/trigonometry.d.ts +1 -1
  100. package/dist/types/compute-engine/boxed-expression/type-guards.d.ts +1 -1
  101. package/dist/types/compute-engine/boxed-expression/utils.d.ts +1 -1
  102. package/dist/types/compute-engine/boxed-expression/validate.d.ts +1 -1
  103. package/dist/types/compute-engine/collection-utils.d.ts +1 -1
  104. package/dist/types/compute-engine/compilation/base-compiler.d.ts +1 -1
  105. package/dist/types/compute-engine/compilation/compile-expression.d.ts +1 -1
  106. package/dist/types/compute-engine/compilation/constant-folding.d.ts +1 -1
  107. package/dist/types/compute-engine/compilation/glsl-target.d.ts +1 -1
  108. package/dist/types/compute-engine/compilation/gpu-target.d.ts +15 -5
  109. package/dist/types/compute-engine/compilation/interval-javascript-target.d.ts +1 -1
  110. package/dist/types/compute-engine/compilation/javascript-target.d.ts +25 -3
  111. package/dist/types/compute-engine/compilation/python-target.d.ts +1 -1
  112. package/dist/types/compute-engine/compilation/types.d.ts +1 -1
  113. package/dist/types/compute-engine/compilation/wgsl-target.d.ts +1 -1
  114. package/dist/types/compute-engine/cost-function.d.ts +1 -1
  115. package/dist/types/compute-engine/engine-assumptions.d.ts +1 -1
  116. package/dist/types/compute-engine/engine-cache.d.ts +1 -1
  117. package/dist/types/compute-engine/engine-common-symbols.d.ts +1 -1
  118. package/dist/types/compute-engine/engine-compilation-targets.d.ts +1 -1
  119. package/dist/types/compute-engine/engine-configuration-lifecycle.d.ts +1 -1
  120. package/dist/types/compute-engine/engine-declarations.d.ts +1 -1
  121. package/dist/types/compute-engine/engine-expression-entrypoints.d.ts +1 -1
  122. package/dist/types/compute-engine/engine-extension-contracts.d.ts +1 -1
  123. package/dist/types/compute-engine/engine-library-bootstrap.d.ts +1 -1
  124. package/dist/types/compute-engine/engine-numeric-configuration.d.ts +1 -1
  125. package/dist/types/compute-engine/engine-runtime-state.d.ts +1 -1
  126. package/dist/types/compute-engine/engine-scope.d.ts +1 -1
  127. package/dist/types/compute-engine/engine-sequences.d.ts +1 -1
  128. package/dist/types/compute-engine/engine-simplification-rules.d.ts +1 -1
  129. package/dist/types/compute-engine/engine-startup-coordinator.d.ts +1 -1
  130. package/dist/types/compute-engine/engine-type-resolver.d.ts +1 -1
  131. package/dist/types/compute-engine/engine-validation-entrypoints.d.ts +1 -1
  132. package/dist/types/compute-engine/free-functions.d.ts +1 -1
  133. package/dist/types/compute-engine/function-utils.d.ts +1 -1
  134. package/dist/types/compute-engine/global-types.d.ts +1 -1
  135. package/dist/types/compute-engine/index.d.ts +22 -2
  136. package/dist/types/compute-engine/interval/arithmetic.d.ts +1 -1
  137. package/dist/types/compute-engine/interval/comparison.d.ts +1 -1
  138. package/dist/types/compute-engine/interval/elementary.d.ts +1 -1
  139. package/dist/types/compute-engine/interval/index.d.ts +1 -1
  140. package/dist/types/compute-engine/interval/trigonometric.d.ts +1 -1
  141. package/dist/types/compute-engine/interval/types.d.ts +1 -1
  142. package/dist/types/compute-engine/interval/util.d.ts +1 -1
  143. package/dist/types/compute-engine/latex-syntax/dictionary/default-dictionary.d.ts +4 -3
  144. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-algebra.d.ts +1 -1
  145. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-arithmetic.d.ts +1 -1
  146. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-calculus.d.ts +1 -1
  147. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-colors.d.ts +10 -0
  148. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-complex.d.ts +1 -1
  149. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
  150. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-linear-algebra.d.ts +1 -1
  151. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +1 -1
  152. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
  153. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-relational-operators.d.ts +1 -1
  154. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
  155. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-statistics.d.ts +1 -1
  156. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
  157. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
  158. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-units.d.ts +1 -1
  159. package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +1 -1
  160. package/dist/types/compute-engine/latex-syntax/dictionary/indexed-types.d.ts +9 -1
  161. package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
  162. package/dist/types/compute-engine/latex-syntax/parse-number.d.ts +1 -1
  163. package/dist/types/compute-engine/latex-syntax/parse-symbol.d.ts +1 -1
  164. package/dist/types/compute-engine/latex-syntax/parse.d.ts +1 -1
  165. package/dist/types/compute-engine/latex-syntax/serialize-dms.d.ts +1 -1
  166. package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -1
  167. package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
  168. package/dist/types/compute-engine/latex-syntax/serializer.d.ts +1 -1
  169. package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
  170. package/dist/types/compute-engine/latex-syntax/types.d.ts +1 -1
  171. package/dist/types/compute-engine/latex-syntax/utils.d.ts +1 -1
  172. package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
  173. package/dist/types/compute-engine/library/calculus.d.ts +1 -1
  174. package/dist/types/compute-engine/library/collections.d.ts +1 -1
  175. package/dist/types/compute-engine/library/colors.d.ts +1 -1
  176. package/dist/types/compute-engine/library/combinatorics.d.ts +1 -1
  177. package/dist/types/compute-engine/library/complex.d.ts +1 -1
  178. package/dist/types/compute-engine/library/control-structures.d.ts +1 -1
  179. package/dist/types/compute-engine/library/core.d.ts +1 -1
  180. package/dist/types/compute-engine/library/fractals.d.ts +1 -1
  181. package/dist/types/compute-engine/library/library.d.ts +1 -1
  182. package/dist/types/compute-engine/library/linear-algebra.d.ts +1 -1
  183. package/dist/types/compute-engine/library/logic-analysis.d.ts +1 -1
  184. package/dist/types/compute-engine/library/logic.d.ts +1 -1
  185. package/dist/types/compute-engine/library/number-theory.d.ts +1 -1
  186. package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
  187. package/dist/types/compute-engine/library/quantity-arithmetic.d.ts +1 -1
  188. package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
  189. package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
  190. package/dist/types/compute-engine/library/sets.d.ts +1 -1
  191. package/dist/types/compute-engine/library/statistics.d.ts +1 -1
  192. package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
  193. package/dist/types/compute-engine/library/type-handlers.d.ts +1 -1
  194. package/dist/types/compute-engine/library/unit-data.d.ts +1 -1
  195. package/dist/types/compute-engine/library/units.d.ts +1 -1
  196. package/dist/types/compute-engine/library/utils.d.ts +1 -1
  197. package/dist/types/compute-engine/numeric-value/big-numeric-value.d.ts +1 -1
  198. package/dist/types/compute-engine/numeric-value/exact-numeric-value.d.ts +1 -1
  199. package/dist/types/compute-engine/numeric-value/machine-numeric-value.d.ts +1 -1
  200. package/dist/types/compute-engine/numeric-value/types.d.ts +1 -1
  201. package/dist/types/compute-engine/numerics/bigint.d.ts +1 -1
  202. package/dist/types/compute-engine/numerics/expression.d.ts +1 -1
  203. package/dist/types/compute-engine/numerics/interval.d.ts +1 -1
  204. package/dist/types/compute-engine/numerics/linear-algebra.d.ts +1 -1
  205. package/dist/types/compute-engine/numerics/monte-carlo.d.ts +1 -1
  206. package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
  207. package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
  208. package/dist/types/compute-engine/numerics/numeric-complex.d.ts +1 -1
  209. package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
  210. package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
  211. package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
  212. package/dist/types/compute-engine/numerics/richardson.d.ts +1 -1
  213. package/dist/types/compute-engine/numerics/special-functions.d.ts +1 -1
  214. package/dist/types/compute-engine/numerics/statistics.d.ts +1 -1
  215. package/dist/types/compute-engine/numerics/strings.d.ts +1 -1
  216. package/dist/types/compute-engine/numerics/types.d.ts +1 -1
  217. package/dist/types/compute-engine/numerics/unit-data.d.ts +1 -1
  218. package/dist/types/compute-engine/oeis.d.ts +1 -1
  219. package/dist/types/compute-engine/sequence.d.ts +1 -1
  220. package/dist/types/compute-engine/symbolic/antiderivative.d.ts +1 -1
  221. package/dist/types/compute-engine/symbolic/derivative.d.ts +1 -1
  222. package/dist/types/compute-engine/symbolic/distribute.d.ts +1 -1
  223. package/dist/types/compute-engine/symbolic/fu-cost.d.ts +1 -1
  224. package/dist/types/compute-engine/symbolic/fu-transforms.d.ts +1 -1
  225. package/dist/types/compute-engine/symbolic/fu.d.ts +1 -1
  226. package/dist/types/compute-engine/symbolic/logic-utils.d.ts +1 -1
  227. package/dist/types/compute-engine/symbolic/simplify-abs.d.ts +1 -1
  228. package/dist/types/compute-engine/symbolic/simplify-divide.d.ts +1 -1
  229. package/dist/types/compute-engine/symbolic/simplify-factorial.d.ts +1 -1
  230. package/dist/types/compute-engine/symbolic/simplify-hyperbolic.d.ts +1 -1
  231. package/dist/types/compute-engine/symbolic/simplify-infinity.d.ts +1 -1
  232. package/dist/types/compute-engine/symbolic/simplify-log.d.ts +1 -1
  233. package/dist/types/compute-engine/symbolic/simplify-logic.d.ts +1 -1
  234. package/dist/types/compute-engine/symbolic/simplify-power.d.ts +1 -1
  235. package/dist/types/compute-engine/symbolic/simplify-product.d.ts +1 -1
  236. package/dist/types/compute-engine/symbolic/simplify-rules.d.ts +1 -1
  237. package/dist/types/compute-engine/symbolic/simplify-sum.d.ts +1 -1
  238. package/dist/types/compute-engine/symbolic/simplify-trig.d.ts +1 -1
  239. package/dist/types/compute-engine/tensor/tensor-fields.d.ts +1 -1
  240. package/dist/types/compute-engine/tensor/tensors.d.ts +1 -1
  241. package/dist/types/compute-engine/types-definitions.d.ts +1 -1
  242. package/dist/types/compute-engine/types-engine.d.ts +6 -2
  243. package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
  244. package/dist/types/compute-engine/types-expression.d.ts +1 -1
  245. package/dist/types/compute-engine/types-kernel-evaluation.d.ts +1 -1
  246. package/dist/types/compute-engine/types-kernel-serialization.d.ts +1 -1
  247. package/dist/types/compute-engine/types-serialization.d.ts +1 -1
  248. package/dist/types/compute-engine/types.d.ts +1 -1
  249. package/dist/types/compute-engine.d.ts +1 -2
  250. package/dist/types/core.d.ts +1 -1
  251. package/dist/types/interval.d.ts +1 -1
  252. package/dist/types/latex-syntax.d.ts +2 -2
  253. package/dist/types/math-json/symbols.d.ts +1 -1
  254. package/dist/types/math-json/types.d.ts +1 -1
  255. package/dist/types/math-json/utils.d.ts +1 -1
  256. package/dist/types/math-json.d.ts +2 -2
  257. package/dist/types/numerics.d.ts +1 -1
  258. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- /** Compute Engine 0.55.6 */
1
+ /** Compute Engine 0.56.0 */
2
2
 
3
3
  // src/compute-engine/numerics/richardson.ts
4
4
  function extrapolate(f, x0, options = {}) {
@@ -1511,6 +1511,7 @@ var SCALAR_TYPES = [
1511
1511
  ];
1512
1512
  var VALUE_TYPES = [
1513
1513
  "value",
1514
+ "color",
1514
1515
  ...COLLECTION_TYPES,
1515
1516
  ...SCALAR_TYPES
1516
1517
  ];
@@ -3206,6 +3207,7 @@ var PRIMITIVE_SUBTYPES = {
3206
3207
  symbol: [],
3207
3208
  boolean: [],
3208
3209
  string: [],
3210
+ color: [],
3209
3211
  expression: EXPRESSION_TYPES
3210
3212
  };
3211
3213
  function isPrimitiveSubtype(lhs, rhs) {
@@ -8793,6 +8795,8 @@ var DEFINITIONS_ARITHMETIC = [
8793
8795
  precedence: DIVISION_PRECEDENCE,
8794
8796
  parse: "Mod"
8795
8797
  },
8798
+ // Function-style alias: `\operatorname{mod}(a, b)`
8799
+ { latexTrigger: "\\operatorname{mod}", parse: "Mod" },
8796
8800
  {
8797
8801
  latexTrigger: "\\pmod",
8798
8802
  kind: "prefix",
@@ -9033,6 +9037,13 @@ var DEFINITIONS_ARITHMETIC = [
9033
9037
  const rhs = serializer.wrap(operand(expr, 2), ADDITION_PRECEDENCE + 3);
9034
9038
  return joinLatex([lhs, "-", rhs]);
9035
9039
  }
9040
+ },
9041
+ // Euclidean distance between two points (tuples of numbers).
9042
+ {
9043
+ name: "Distance",
9044
+ latexTrigger: ["\\operatorname{distance}"],
9045
+ kind: "function",
9046
+ serialize: (serializer, expr) => "\\operatorname{distance}" + serializer.wrapArguments(expr)
9036
9047
  }
9037
9048
  ];
9038
9049
  function getIndexAssignment(expr, upper) {
@@ -10457,7 +10468,9 @@ var DEFINITIONS_STATISTICS = [
10457
10468
  if (!expr || !symbol(expr)) return null;
10458
10469
  return ["Mean", expr];
10459
10470
  }
10460
- }
10471
+ },
10472
+ // Function-style alias: `\operatorname{var}(...)`
10473
+ { latexTrigger: "\\operatorname{var}", parse: "Variance" }
10461
10474
  ];
10462
10475
 
10463
10476
  // src/compute-engine/numerics/unit-data.ts
@@ -11465,7 +11478,7 @@ var DEFINITIONS_OTHERS = [
11465
11478
  36: "\\qquad"
11466
11479
  }[v] ?? "";
11467
11480
  }
11468
- }
11481
+ },
11469
11482
  // if (
11470
11483
  // [
11471
11484
  // '\\!',
@@ -11489,6 +11502,121 @@ var DEFINITIONS_OTHERS = [
11489
11502
  // name: '',
11490
11503
  // trigger: '\\check',
11491
11504
  // },
11505
+ // ---------------------------------------------------------------------------
11506
+ // Function-style aliases for collection / random operators that some
11507
+ // notations write in lowercase (e.g. `\operatorname{shuffle}(L)`).
11508
+ // The capitalized library entries already exist; these are pure parse
11509
+ // aliases so the lowercase names don't land in `unsupported-operator`.
11510
+ // ---------------------------------------------------------------------------
11511
+ { latexTrigger: "\\operatorname{random}", parse: "Random" },
11512
+ { latexTrigger: "\\operatorname{shuffle}", parse: "Shuffle" },
11513
+ { latexTrigger: "\\operatorname{repeat}", parse: "Repeat" },
11514
+ { latexTrigger: "\\operatorname{join}", parse: "Join" },
11515
+ // ---------------------------------------------------------------------------
11516
+ // Geometric primitive heads. Registered as known typed heads so consumers
11517
+ // can branch on the operator name; CE itself doesn't render them. The
11518
+ // library entries (with no evaluator) live in `library/core.ts`.
11519
+ // ---------------------------------------------------------------------------
11520
+ {
11521
+ name: "Triangle",
11522
+ latexTrigger: ["\\operatorname{triangle}"],
11523
+ kind: "function",
11524
+ serialize: (serializer, expr) => "\\operatorname{triangle}" + serializer.wrapArguments(expr)
11525
+ },
11526
+ // Desmos's geometric `vector(p1, p2)` — a directed segment between two
11527
+ // points. Routed to a dedicated head (not the existing column-vector
11528
+ // `Vector`, which has a narrower `(number+) -> vector` signature).
11529
+ {
11530
+ name: "GeometricVector",
11531
+ latexTrigger: ["\\operatorname{vector}"],
11532
+ kind: "function",
11533
+ serialize: (serializer, expr) => "\\operatorname{vector}" + serializer.wrapArguments(expr)
11534
+ },
11535
+ {
11536
+ name: "Sphere",
11537
+ latexTrigger: ["\\operatorname{sphere}"],
11538
+ kind: "function",
11539
+ serialize: (serializer, expr) => "\\operatorname{sphere}" + serializer.wrapArguments(expr)
11540
+ },
11541
+ {
11542
+ name: "Segment",
11543
+ latexTrigger: ["\\operatorname{segment}"],
11544
+ kind: "function",
11545
+ serialize: (serializer, expr) => "\\operatorname{segment}" + serializer.wrapArguments(expr)
11546
+ }
11547
+ ];
11548
+
11549
+ // src/compute-engine/latex-syntax/dictionary/definitions-colors.ts
11550
+ var DEFINITIONS_COLORS = [
11551
+ // Color constructors (one per colorspace, preserves space on evaluation)
11552
+ {
11553
+ name: "Rgb",
11554
+ latexTrigger: ["\\operatorname{rgb}"],
11555
+ kind: "function",
11556
+ serialize: (serializer, expr) => "\\operatorname{rgb}" + serializer.wrapArguments(expr)
11557
+ },
11558
+ {
11559
+ name: "Hsv",
11560
+ latexTrigger: ["\\operatorname{hsv}"],
11561
+ kind: "function",
11562
+ serialize: (serializer, expr) => "\\operatorname{hsv}" + serializer.wrapArguments(expr)
11563
+ },
11564
+ {
11565
+ name: "Hsl",
11566
+ latexTrigger: ["\\operatorname{hsl}"],
11567
+ kind: "function",
11568
+ serialize: (serializer, expr) => "\\operatorname{hsl}" + serializer.wrapArguments(expr)
11569
+ },
11570
+ {
11571
+ name: "Oklab",
11572
+ latexTrigger: ["\\operatorname{oklab}"],
11573
+ kind: "function",
11574
+ serialize: (serializer, expr) => "\\operatorname{oklab}" + serializer.wrapArguments(expr)
11575
+ },
11576
+ {
11577
+ name: "Oklch",
11578
+ latexTrigger: ["\\operatorname{oklch}"],
11579
+ kind: "function",
11580
+ serialize: (serializer, expr) => "\\operatorname{oklch}" + serializer.wrapArguments(expr)
11581
+ },
11582
+ // Conversion functions (color → color in the named space)
11583
+ {
11584
+ name: "AsRgb",
11585
+ latexTrigger: ["\\operatorname{asRgb}"],
11586
+ kind: "function",
11587
+ serialize: (serializer, expr) => "\\operatorname{asRgb}" + serializer.wrapArguments(expr)
11588
+ },
11589
+ {
11590
+ name: "AsHsv",
11591
+ latexTrigger: ["\\operatorname{asHsv}"],
11592
+ kind: "function",
11593
+ serialize: (serializer, expr) => "\\operatorname{asHsv}" + serializer.wrapArguments(expr)
11594
+ },
11595
+ {
11596
+ name: "AsHsl",
11597
+ latexTrigger: ["\\operatorname{asHsl}"],
11598
+ kind: "function",
11599
+ serialize: (serializer, expr) => "\\operatorname{asHsl}" + serializer.wrapArguments(expr)
11600
+ },
11601
+ {
11602
+ name: "AsOklab",
11603
+ latexTrigger: ["\\operatorname{asOklab}"],
11604
+ kind: "function",
11605
+ serialize: (serializer, expr) => "\\operatorname{asOklab}" + serializer.wrapArguments(expr)
11606
+ },
11607
+ {
11608
+ name: "AsOklch",
11609
+ latexTrigger: ["\\operatorname{asOklch}"],
11610
+ kind: "function",
11611
+ serialize: (serializer, expr) => "\\operatorname{asOklch}" + serializer.wrapArguments(expr)
11612
+ },
11613
+ // Perceptual difference (returns a scalar in [0, ~1])
11614
+ {
11615
+ name: "ColorDelta",
11616
+ latexTrigger: ["\\operatorname{colorDelta}"],
11617
+ kind: "function",
11618
+ serialize: (serializer, expr) => "\\operatorname{colorDelta}" + serializer.wrapArguments(expr)
11619
+ }
11492
11620
  ];
11493
11621
 
11494
11622
  // src/compute-engine/latex-syntax/dictionary/default-dictionary.ts
@@ -11519,7 +11647,8 @@ var LATEX_DICTIONARY = [
11519
11647
  ...DEFINITIONS_STATISTICS,
11520
11648
  ...DEFINITIONS_UNITS,
11521
11649
  ...DEFINITIONS_OTHERS,
11522
- ...DEFINITIONS_PHYSICS
11650
+ ...DEFINITIONS_PHYSICS,
11651
+ ...DEFINITIONS_COLORS
11523
11652
  ];
11524
11653
 
11525
11654
  // src/math-json/symbols.ts
@@ -15154,8 +15283,7 @@ function compile(expr, options) {
15154
15283
  ce.pushScope();
15155
15284
  try {
15156
15285
  if (vars && typeof vars === "object") {
15157
- for (const [k, v] of Object.entries(vars))
15158
- ce.assign(k, v);
15286
+ for (const [k, v] of Object.entries(vars)) ce.assign(k, v);
15159
15287
  }
15160
15288
  return expr.evaluate().re;
15161
15289
  } finally {
@@ -15242,8 +15370,7 @@ function tryGetComplexParts(expr, compile2) {
15242
15370
  return { re: null, im: formatFloat(iScale) };
15243
15371
  }
15244
15372
  const compiledFactors = remaining.map((r) => compile2(r));
15245
- if (iScale !== 1)
15246
- compiledFactors.unshift(formatFloat(iScale));
15373
+ if (iScale !== 1) compiledFactors.unshift(formatFloat(iScale));
15247
15374
  const imCode = foldTerms(compiledFactors, "1.0", "*");
15248
15375
  return { re: null, im: imCode };
15249
15376
  }
@@ -15308,6 +15435,40 @@ function rgbToHsl(r, g, b) {
15308
15435
  else h = ((r - g) / d + 4) / 6;
15309
15436
  return { h: h * 360, s, l };
15310
15437
  }
15438
+ function hsvToRgb(h, s, v) {
15439
+ h = (h % 360 + 360) % 360;
15440
+ s = Math.max(0, Math.min(1, s));
15441
+ v = Math.max(0, Math.min(1, v));
15442
+ const c = v * s;
15443
+ const x = c * (1 - Math.abs(h / 60 % 2 - 1));
15444
+ const m = v - c;
15445
+ let r = 0, g = 0, b = 0;
15446
+ if (h < 60) [r, g, b] = [c, x, 0];
15447
+ else if (h < 120) [r, g, b] = [x, c, 0];
15448
+ else if (h < 180) [r, g, b] = [0, c, x];
15449
+ else if (h < 240) [r, g, b] = [0, x, c];
15450
+ else if (h < 300) [r, g, b] = [x, 0, c];
15451
+ else [r, g, b] = [c, 0, x];
15452
+ return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 };
15453
+ }
15454
+ function rgbToHsv(r, g, b) {
15455
+ r /= 255;
15456
+ g /= 255;
15457
+ b /= 255;
15458
+ const max2 = Math.max(r, g, b);
15459
+ const min2 = Math.min(r, g, b);
15460
+ const d = max2 - min2;
15461
+ let h = 0;
15462
+ if (d > 0) {
15463
+ if (max2 === r) h = (g - b) / d % 6;
15464
+ else if (max2 === g) h = (b - r) / d + 2;
15465
+ else h = (r - g) / d + 4;
15466
+ h *= 60;
15467
+ if (h < 0) h += 360;
15468
+ }
15469
+ const s = max2 === 0 ? 0 : d / max2;
15470
+ return { h, s, v: max2 };
15471
+ }
15311
15472
  function parseHexColor(s) {
15312
15473
  const hex = s.startsWith("#") ? s.substring(1) : s;
15313
15474
  let r, g, b;
@@ -15763,6 +15924,13 @@ var NAMED_COLORS = {
15763
15924
  };
15764
15925
  function parseColor(s, darkMode) {
15765
15926
  const str = s.trim().toLowerCase();
15927
+ const opacityMatch = str.match(/^(.+?)\s*\/\s*(\d+(?:\.\d+)?)%?\s*$/);
15928
+ if (opacityMatch) {
15929
+ const base = parseColor(opacityMatch[1].trim(), darkMode);
15930
+ const opacity = Math.max(0, Math.min(100, parseFloat(opacityMatch[2])));
15931
+ const alpha = Math.round(opacity / 100 * 255);
15932
+ return base & 4294967040 | alpha;
15933
+ }
15766
15934
  if (str.startsWith("#")) {
15767
15935
  const hex = str.substring(1);
15768
15936
  let r, g, b, a = 255;
@@ -15895,14 +16063,6 @@ function parseColor(s, darkMode) {
15895
16063
  console.warn(`parseColor: unrecognized color "${s}"`);
15896
16064
  return 0;
15897
16065
  }
15898
- function parseColorToRgb01(s, darkMode) {
15899
- const color = parseColor(s, darkMode);
15900
- return [
15901
- (color >>> 24 & 255) / 255,
15902
- (color >>> 16 & 255) / 255,
15903
- (color >>> 8 & 255) / 255
15904
- ];
15905
- }
15906
16066
  function apca(bgColor, fgColor) {
15907
16067
  const bgRgb = asRgb(bgColor);
15908
16068
  const fgRgb = asRgb(fgColor);
@@ -15961,6 +16121,12 @@ function contrastingColor(arg) {
15961
16121
  const contrast2 = Math.abs(apca(fg2, bg));
15962
16122
  return contrast1 >= contrast2 ? asColorNumber(fg1) : asColorNumber(fg2);
15963
16123
  }
16124
+ function oklabDeltaE(a, b) {
16125
+ const dL = a.L - b.L;
16126
+ const da = a.a - b.a;
16127
+ const db = a.b - b.b;
16128
+ return Math.sqrt(dL * dL + da * da + db * db);
16129
+ }
15964
16130
  var TYCHO_11 = [
15965
16131
  "#4e79a7",
15966
16132
  // Blue
@@ -20172,39 +20338,130 @@ var JAVASCRIPT_FUNCTIONS = {
20172
20338
  if (args.length >= 2)
20173
20339
  return `_SYS.colormap(${compile2(args[0])}, ${compile2(args[1])})`;
20174
20340
  return `_SYS.colormap(${compile2(args[0])})`;
20341
+ },
20342
+ // -----------------------------------------------------------------------
20343
+ // Color constructor heads. All compile to OKLCh arrays at runtime — the
20344
+ // canonical color representation in this target. The constructors take
20345
+ // their own colorspace's components and convert internally.
20346
+ // (Mirrors the GPU target's design: color values are vec3 OKLCh.)
20347
+ // -----------------------------------------------------------------------
20348
+ Rgb: (args, compile2) => {
20349
+ if (args.length < 3) throw new Error("Rgb: need 3 components");
20350
+ return `_SYS.rgb(${args.map(compile2).join(", ")})`;
20351
+ },
20352
+ Hsv: (args, compile2) => {
20353
+ if (args.length < 3) throw new Error("Hsv: need 3 components");
20354
+ return `_SYS.hsv(${args.map(compile2).join(", ")})`;
20355
+ },
20356
+ Hsl: (args, compile2) => {
20357
+ if (args.length < 3) throw new Error("Hsl: need 3 components");
20358
+ return `_SYS.hsl(${args.map(compile2).join(", ")})`;
20359
+ },
20360
+ Oklab: (args, compile2) => {
20361
+ if (args.length < 3) throw new Error("Oklab: need 3 components");
20362
+ return `_SYS.oklab(${args.map(compile2).join(", ")})`;
20363
+ },
20364
+ Oklch: (args, compile2) => {
20365
+ if (args.length < 3) throw new Error("Oklch: need 3 components");
20366
+ return `_SYS.oklch(${args.map(compile2).join(", ")})`;
20367
+ },
20368
+ // -----------------------------------------------------------------------
20369
+ // As* converters. Compile-time output convention matches the engine and
20370
+ // the GPU target: each returns components in the named space as a 3- or
20371
+ // 4-element array. `AsRgb` uses 0-1 sRGB channels (consistent across all
20372
+ // layers). `AsOklch` is the identity (canonical form).
20373
+ // -----------------------------------------------------------------------
20374
+ AsRgb: ([c], compile2) => {
20375
+ if (c === null) throw new Error("AsRgb: no argument");
20376
+ return `_SYS.asRgb(${compile2(c)})`;
20377
+ },
20378
+ AsHsv: ([c], compile2) => {
20379
+ if (c === null) throw new Error("AsHsv: no argument");
20380
+ return `_SYS.asHsv(${compile2(c)})`;
20381
+ },
20382
+ AsHsl: ([c], compile2) => {
20383
+ if (c === null) throw new Error("AsHsl: no argument");
20384
+ return `_SYS.asHsl(${compile2(c)})`;
20385
+ },
20386
+ AsOklab: ([c], compile2) => {
20387
+ if (c === null) throw new Error("AsOklab: no argument");
20388
+ return `_SYS.asOklab(${compile2(c)})`;
20389
+ },
20390
+ AsOklch: ([c], compile2) => {
20391
+ if (c === null) throw new Error("AsOklch: no argument");
20392
+ return compile2(c);
20393
+ },
20394
+ // Perceptual color difference (ΔE_OK).
20395
+ ColorDelta: ([a, b], compile2) => {
20396
+ if (a === null || b === null)
20397
+ throw new Error("ColorDelta: need two colors");
20398
+ return `_SYS.colorDelta(${compile2(a)}, ${compile2(b)})`;
20399
+ },
20400
+ // Euclidean distance between two tuples (any positive dimension).
20401
+ // The GPU target maps `Distance` to the GLSL/WGSL `distance()` builtin
20402
+ // (vec-only); this JS handler works on plain arrays of any length.
20403
+ Distance: ([a, b], compile2) => {
20404
+ if (a === null || b === null) throw new Error("Distance: need two points");
20405
+ return `_SYS.distance(${compile2(a)}, ${compile2(b)})`;
20175
20406
  }
20176
20407
  };
20177
20408
  function toRI(c) {
20178
20409
  return { re: c.re, im: c.im };
20179
20410
  }
20411
+ function normalizeAlpha(a) {
20412
+ if (a === void 0) return void 0;
20413
+ if (!Number.isFinite(a)) return void 0;
20414
+ if (Math.abs(a - 1) < 1e-9) return void 0;
20415
+ return a;
20416
+ }
20180
20417
  function toRgb255(input) {
20181
20418
  if (typeof input === "string") {
20182
20419
  const c = parseColor(input);
20183
- return {
20420
+ const rgb2 = {
20184
20421
  r: c >>> 24 & 255,
20185
20422
  g: c >>> 16 & 255,
20186
- b: c >>> 8 & 255,
20187
- alpha: (c & 255) / 255
20423
+ b: c >>> 8 & 255
20188
20424
  };
20425
+ const alpha = normalizeAlpha((c & 255) / 255);
20426
+ if (alpha !== void 0) rgb2.alpha = alpha;
20427
+ return rgb2;
20428
+ }
20429
+ const rgb = oklchToRgb({ L: input[0], C: input[1], H: input[2] });
20430
+ if (input.length >= 4) {
20431
+ const alpha = normalizeAlpha(input[3]);
20432
+ if (alpha !== void 0) rgb.alpha = alpha;
20189
20433
  }
20190
- const rgb = {
20191
- r: input[0] * 255,
20192
- g: input[1] * 255,
20193
- b: input[2] * 255
20194
- };
20195
- if (input.length >= 4) rgb.alpha = input[3];
20196
20434
  return rgb;
20197
20435
  }
20198
- function packedToArray(c) {
20199
- const r = (c >>> 24 & 255) / 255;
20200
- const g = (c >>> 16 & 255) / 255;
20201
- const b = (c >>> 8 & 255) / 255;
20202
- const a = (c & 255) / 255;
20203
- return Math.abs(a - 1) < 1e-4 ? [r, g, b] : [r, g, b, a];
20436
+ function toOklch(input) {
20437
+ if (typeof input === "string") {
20438
+ const c = parseColor(input);
20439
+ const r = c >>> 24 & 255;
20440
+ const g = c >>> 16 & 255;
20441
+ const b = c >>> 8 & 255;
20442
+ const oklch2 = rgbToOklch({ r, g, b });
20443
+ const alpha = normalizeAlpha((c & 255) / 255);
20444
+ if (alpha !== void 0) oklch2.alpha = alpha;
20445
+ return oklch2;
20446
+ }
20447
+ return {
20448
+ L: input[0],
20449
+ C: input[1],
20450
+ H: input[2],
20451
+ alpha: input.length >= 4 ? normalizeAlpha(input[3]) : void 0
20452
+ };
20453
+ }
20454
+ function packedToOklch(c) {
20455
+ const r = c >>> 24 & 255;
20456
+ const g = c >>> 16 & 255;
20457
+ const b = c >>> 8 & 255;
20458
+ const oklch2 = rgbToOklch({ r, g, b });
20459
+ const alpha = normalizeAlpha((c & 255) / 255);
20460
+ return alpha !== void 0 ? [oklch2.L, oklch2.C, oklch2.H, alpha] : [oklch2.L, oklch2.C, oklch2.H];
20204
20461
  }
20205
20462
  var colorHelpers = {
20206
20463
  color(input) {
20207
- return packedToArray(parseColor(input));
20464
+ return packedToOklch(parseColor(input));
20208
20465
  },
20209
20466
  colorToString(input, format) {
20210
20467
  const rgb = toRgb255(input);
@@ -20215,7 +20472,7 @@ var colorHelpers = {
20215
20472
  const g = Math.round(Math.max(0, Math.min(255, rgb.g)));
20216
20473
  const b = Math.round(Math.max(0, Math.min(255, rgb.b)));
20217
20474
  let hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
20218
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4) {
20475
+ if (rgb.alpha !== void 0) {
20219
20476
  const a = Math.round(Math.max(0, Math.min(255, rgb.alpha * 255)));
20220
20477
  hex += a.toString(16).padStart(2, "0");
20221
20478
  }
@@ -20225,7 +20482,7 @@ var colorHelpers = {
20225
20482
  const r = Math.round(rgb.r);
20226
20483
  const g = Math.round(rgb.g);
20227
20484
  const b = Math.round(rgb.b);
20228
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20485
+ if (rgb.alpha !== void 0)
20229
20486
  return `rgb(${r} ${g} ${b} / ${rgb.alpha})`;
20230
20487
  return `rgb(${r} ${g} ${b})`;
20231
20488
  }
@@ -20234,7 +20491,7 @@ var colorHelpers = {
20234
20491
  const h = Math.round(hsl.h * 10) / 10;
20235
20492
  const s = Math.round(hsl.s * 1e3) / 10;
20236
20493
  const l = Math.round(hsl.l * 1e3) / 10;
20237
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20494
+ if (rgb.alpha !== void 0)
20238
20495
  return `hsl(${h} ${s}% ${l}% / ${rgb.alpha})`;
20239
20496
  return `hsl(${h} ${s}% ${l}%)`;
20240
20497
  }
@@ -20243,7 +20500,7 @@ var colorHelpers = {
20243
20500
  const L = Math.round(c.L * 1e3) / 1e3;
20244
20501
  const C = Math.round(c.C * 1e3) / 1e3;
20245
20502
  const H = Math.round(c.H * 10) / 10;
20246
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20503
+ if (rgb.alpha !== void 0)
20247
20504
  return `oklch(${L} ${C} ${H} / ${rgb.alpha})`;
20248
20505
  return `oklch(${L} ${C} ${H})`;
20249
20506
  }
@@ -20252,29 +20509,29 @@ var colorHelpers = {
20252
20509
  }
20253
20510
  },
20254
20511
  colorMix(input1, input2, ratio = 0.5) {
20255
- const rgb1 = toRgb255(input1);
20256
- const rgb2 = toRgb255(input2);
20512
+ const c1 = toOklch(input1);
20513
+ const c2 = toOklch(input2);
20257
20514
  ratio = Math.max(0, Math.min(1, ratio));
20258
- const c1 = rgbToOklch(rgb1);
20259
- const c2 = rgbToOklch(rgb2);
20260
- let dh = c2.H - c1.H;
20261
- if (dh > 180) dh -= 360;
20262
- if (dh < -180) dh += 360;
20263
- let H = c1.H + dh * ratio;
20264
- if (H < 0) H += 360;
20265
- if (H >= 360) H -= 360;
20266
- const mixed = oklchToRgb({
20267
- L: c1.L + (c2.L - c1.L) * ratio,
20268
- C: c1.C + (c2.C - c1.C) * ratio,
20269
- H
20270
- });
20271
- const r = mixed.r / 255;
20272
- const g = mixed.g / 255;
20273
- const b = mixed.b / 255;
20274
- const a1 = rgb1.alpha ?? 1;
20275
- const a2 = rgb2.alpha ?? 1;
20276
- const alpha = a1 + (a2 - a1) * ratio;
20277
- return Math.abs(alpha - 1) > 1e-4 ? [r, g, b, alpha] : [r, g, b];
20515
+ const c1Achromatic = c1.C < 1e-6;
20516
+ const c2Achromatic = c2.C < 1e-6;
20517
+ let H;
20518
+ if (c1Achromatic && c2Achromatic) H = c1.H;
20519
+ else if (c1Achromatic) H = c2.H;
20520
+ else if (c2Achromatic) H = c1.H;
20521
+ else {
20522
+ let dh = c2.H - c1.H;
20523
+ if (dh > 180) dh -= 360;
20524
+ if (dh < -180) dh += 360;
20525
+ H = c1.H + dh * ratio;
20526
+ if (H < 0) H += 360;
20527
+ if (H >= 360) H -= 360;
20528
+ }
20529
+ const L = c1.L + (c2.L - c1.L) * ratio;
20530
+ const C = c1.C + (c2.C - c1.C) * ratio;
20531
+ const a1 = c1.alpha ?? 1;
20532
+ const a2 = c2.alpha ?? 1;
20533
+ const alpha = normalizeAlpha(a1 + (a2 - a1) * ratio);
20534
+ return alpha !== void 0 ? [L, C, H, alpha] : [L, C, H];
20278
20535
  },
20279
20536
  colorContrast(bg, fg) {
20280
20537
  return apca(toRgb255(bg), toRgb255(fg));
@@ -20282,11 +20539,11 @@ var colorHelpers = {
20282
20539
  contrastingColor(bg, fg1, fg2) {
20283
20540
  const bgRgb = toRgb255(bg);
20284
20541
  if (fg1 !== void 0 && fg2 !== void 0) {
20285
- return packedToArray(
20542
+ return packedToOklch(
20286
20543
  contrastingColor({ bg: bgRgb, fg1: toRgb255(fg1), fg2: toRgb255(fg2) })
20287
20544
  );
20288
20545
  }
20289
- return packedToArray(contrastingColor(bgRgb));
20546
+ return packedToOklch(contrastingColor(bgRgb));
20290
20547
  },
20291
20548
  colorToColorspace(input, space) {
20292
20549
  const rgb = toRgb255(input);
@@ -20315,7 +20572,7 @@ var colorHelpers = {
20315
20572
  default:
20316
20573
  throw new Error(`Unknown color space: ${space}`);
20317
20574
  }
20318
- if (alpha !== void 0 && Math.abs(alpha - 1) > 1e-4) result.push(alpha);
20575
+ if (alpha !== void 0) result.push(alpha);
20319
20576
  return result;
20320
20577
  },
20321
20578
  colormap(name, arg) {
@@ -20327,7 +20584,7 @@ var colorHelpers = {
20327
20584
  const palette = allPalettes[name];
20328
20585
  if (!palette) throw new Error(`Unknown palette: ${name}`);
20329
20586
  const colors = palette.map(
20330
- (hex) => parseColorToRgb01(hex)
20587
+ (hex) => packedToOklch(parseColor(hex))
20331
20588
  );
20332
20589
  if (arg === void 0) return colors;
20333
20590
  if (Number.isInteger(arg) && arg >= 2) {
@@ -20351,62 +20608,128 @@ var colorHelpers = {
20351
20608
  const frac = pos - i;
20352
20609
  if (frac === 0 || i >= colors.length - 1)
20353
20610
  return [...colors[Math.min(i, colors.length - 1)]];
20354
- const rgb1 = {
20355
- r: colors[i][0] * 255,
20356
- g: colors[i][1] * 255,
20357
- b: colors[i][2] * 255
20358
- };
20359
- const rgb2 = {
20360
- r: colors[i + 1][0] * 255,
20361
- g: colors[i + 1][1] * 255,
20362
- b: colors[i + 1][2] * 255
20363
- };
20364
- const c1 = rgbToOklch(rgb1);
20365
- const c2 = rgbToOklch(rgb2);
20366
- let dh = c2.H - c1.H;
20367
- if (dh > 180) dh -= 360;
20368
- if (dh < -180) dh += 360;
20369
- let H = c1.H + dh * frac;
20370
- if (H < 0) H += 360;
20371
- if (H >= 360) H -= 360;
20372
- const mixed = oklchToRgb({
20373
- L: c1.L + (c2.L - c1.L) * frac,
20374
- C: c1.C + (c2.C - c1.C) * frac,
20375
- H
20376
- });
20377
- return [mixed.r / 255, mixed.g / 255, mixed.b / 255];
20611
+ const [L1, C1, H1] = colors[i];
20612
+ const [L2, C2, H2] = colors[i + 1];
20613
+ const c1Achromatic = C1 < 1e-6;
20614
+ const c2Achromatic = C2 < 1e-6;
20615
+ let H;
20616
+ if (c1Achromatic && c2Achromatic) H = H1;
20617
+ else if (c1Achromatic) H = H2;
20618
+ else if (c2Achromatic) H = H1;
20619
+ else {
20620
+ let dh = H2 - H1;
20621
+ if (dh > 180) dh -= 360;
20622
+ if (dh < -180) dh += 360;
20623
+ H = H1 + dh * frac;
20624
+ if (H < 0) H += 360;
20625
+ if (H >= 360) H -= 360;
20626
+ }
20627
+ return [L1 + (L2 - L1) * frac, C1 + (C2 - C1) * frac, H];
20378
20628
  },
20379
20629
  colorFromColorspace(components, space) {
20380
20630
  const c0 = components[0];
20381
20631
  const c1 = components[1];
20382
20632
  const c2 = components[2];
20383
20633
  const alpha = components.length >= 4 ? components[3] : void 0;
20384
- let result;
20634
+ let oklch2;
20385
20635
  switch (space.toLowerCase()) {
20386
20636
  case "rgb":
20387
- result = [c0, c1, c2];
20637
+ oklch2 = rgbToOklch({ r: c0 * 255, g: c1 * 255, b: c2 * 255 });
20388
20638
  break;
20389
20639
  case "hsl": {
20390
- const r = hslToRgb(c0, c1, c2);
20391
- result = [r.r / 255, r.g / 255, r.b / 255];
20640
+ const rgb = hslToRgb(c0, c1, c2);
20641
+ oklch2 = rgbToOklch(rgb);
20392
20642
  break;
20393
20643
  }
20394
- case "oklch": {
20395
- const r = oklchToRgb({ L: c0, C: c1, H: c2 });
20396
- result = [r.r / 255, r.g / 255, r.b / 255];
20644
+ case "oklch":
20645
+ oklch2 = { L: c0, C: c1, H: c2 };
20397
20646
  break;
20398
- }
20399
20647
  case "oklab":
20400
- case "lab": {
20401
- const r = oklabToRgb({ L: c0, a: c1, b: c2 });
20402
- result = [r.r / 255, r.g / 255, r.b / 255];
20648
+ case "lab":
20649
+ oklch2 = oklabToOklch({ L: c0, a: c1, b: c2 });
20403
20650
  break;
20404
- }
20405
20651
  default:
20406
20652
  throw new Error(`Unknown color space: ${space}`);
20407
20653
  }
20408
- if (alpha !== void 0 && Math.abs(alpha - 1) > 1e-4) result.push(alpha);
20409
- return result;
20654
+ return alpha !== void 0 ? [oklch2.L, oklch2.C, oklch2.H, alpha] : [oklch2.L, oklch2.C, oklch2.H];
20655
+ },
20656
+ // -----------------------------------------------------------------------
20657
+ // Color constructors. Each accepts components in its colorspace's natural
20658
+ // units and returns the canonical OKLCh array `[L, C, H]` (or with alpha).
20659
+ // -----------------------------------------------------------------------
20660
+ rgb(r, g, b, alpha) {
20661
+ const c = rgbToOklch({ r: r * 255, g: g * 255, b: b * 255 });
20662
+ const a = normalizeAlpha(alpha);
20663
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20664
+ },
20665
+ hsv(h, s, v, alpha) {
20666
+ const rgb = hsvToRgb(h, s, v);
20667
+ const c = rgbToOklch(rgb);
20668
+ const a = normalizeAlpha(alpha);
20669
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20670
+ },
20671
+ hsl(h, s, l, alpha) {
20672
+ const rgb = hslToRgb(h, s, l);
20673
+ const c = rgbToOklch({ r: rgb.r, g: rgb.g, b: rgb.b });
20674
+ const a = normalizeAlpha(alpha);
20675
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20676
+ },
20677
+ oklab(L, a, b, alpha) {
20678
+ const c = oklabToOklch({ L, a, b });
20679
+ const al = normalizeAlpha(alpha);
20680
+ return al !== void 0 ? [c.L, c.C, c.H, al] : [c.L, c.C, c.H];
20681
+ },
20682
+ oklch(L, C, H, alpha) {
20683
+ const a = normalizeAlpha(alpha);
20684
+ return a !== void 0 ? [L, C, H, a] : [L, C, H];
20685
+ },
20686
+ // -----------------------------------------------------------------------
20687
+ // As* converters. Inputs are anything `toOklch` accepts (string, packed
20688
+ // int, or OKLCh array). Outputs are 3- or 4-element arrays in the named
20689
+ // space. sRGB-based outputs (asRgb/asHsv/asHsl) use 0-1 channels for
20690
+ // consistency with the GPU target's shader convention.
20691
+ // -----------------------------------------------------------------------
20692
+ asRgb(input) {
20693
+ const rgb = toRgb255(input);
20694
+ const r = rgb.r / 255;
20695
+ const g = rgb.g / 255;
20696
+ const b = rgb.b / 255;
20697
+ return rgb.alpha !== void 0 ? [r, g, b, rgb.alpha] : [r, g, b];
20698
+ },
20699
+ asHsv(input) {
20700
+ const rgb = toRgb255(input);
20701
+ const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
20702
+ return rgb.alpha !== void 0 ? [hsv.h, hsv.s, hsv.v, rgb.alpha] : [hsv.h, hsv.s, hsv.v];
20703
+ },
20704
+ asHsl(input) {
20705
+ const rgb = toRgb255(input);
20706
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
20707
+ return rgb.alpha !== void 0 ? [hsl.h, hsl.s, hsl.l, rgb.alpha] : [hsl.h, hsl.s, hsl.l];
20708
+ },
20709
+ asOklab(input) {
20710
+ const c = toOklch(input);
20711
+ const lab = oklchToOklab({ L: c.L, C: c.C, H: c.H });
20712
+ return c.alpha !== void 0 ? [lab.L, lab.a, lab.b, c.alpha] : [lab.L, lab.a, lab.b];
20713
+ },
20714
+ // asOklch is identity — handled at compile time as a pass-through
20715
+ // Perceptual color difference (ΔE_OK).
20716
+ colorDelta(a, b) {
20717
+ const labA = oklchToOklab(toOklch(a));
20718
+ const labB = oklchToOklab(toOklch(b));
20719
+ return oklabDeltaE(labA, labB);
20720
+ },
20721
+ // Euclidean distance between two tuples. Plain numeric — not a color
20722
+ // operation despite living in the same helpers block.
20723
+ distance(a, b) {
20724
+ if (!Array.isArray(a) || !Array.isArray(b))
20725
+ throw new Error("Distance: expected two arrays");
20726
+ if (a.length !== b.length) throw new Error("Distance: dimension mismatch");
20727
+ let sumSq = 0;
20728
+ for (let i = 0; i < a.length; i++) {
20729
+ const d = a[i] - b[i];
20730
+ sumSq += d * d;
20731
+ }
20732
+ return Math.sqrt(sumSq);
20410
20733
  }
20411
20734
  };
20412
20735
  var SYS_HELPERS = {
@@ -20845,6 +21168,13 @@ var GPU_OPERATORS = {
20845
21168
  function gpuVec2(target) {
20846
21169
  return target?.language === "wgsl" ? "vec2f" : "vec2";
20847
21170
  }
21171
+ function gpuVec3(target) {
21172
+ return target?.language === "wgsl" ? "vec3f" : "vec3";
21173
+ }
21174
+ function readStringLiteral(expr) {
21175
+ if (!isString(expr)) return null;
21176
+ return expr.string?.toLowerCase() ?? null;
21177
+ }
20848
21178
  function compileIntArg(expr, compile2, target) {
20849
21179
  const c = tryGetConstant(expr);
20850
21180
  if (c !== void 0 && Number.isInteger(c)) return c.toString();
@@ -20903,7 +21233,7 @@ function compileGPUSumProduct(kind, args, _compile, target) {
20903
21233
  `for (${indexDecl} = ${lowerStr}; ${index} <= ${upperStr}; ${index}++) {`,
20904
21234
  ` ${acc} ${op}= ${body};`,
20905
21235
  `}`,
20906
- `return ${acc}`
21236
+ `return ${acc};`
20907
21237
  ];
20908
21238
  return lines.join("\n");
20909
21239
  }
@@ -20957,8 +21287,7 @@ var GPU_FUNCTIONS = {
20957
21287
  const iScale = isSymbol2(iFactor, "ImaginaryUnit") ? 1 : iFactor.im;
20958
21288
  const realFactors = args.filter((_, i) => i !== iIndex);
20959
21289
  const v2 = gpuVec2(target);
20960
- if (realFactors.length === 0)
20961
- return `${v2}(0.0, ${formatFloat(iScale)})`;
21290
+ if (realFactors.length === 0) return `${v2}(0.0, ${formatFloat(iScale)})`;
20962
21291
  const factors = realFactors.map((f) => compile2(f));
20963
21292
  if (iScale !== 1) factors.unshift(formatFloat(iScale));
20964
21293
  const imCode = foldTerms(factors, "1.0", "*");
@@ -21011,8 +21340,7 @@ var GPU_FUNCTIONS = {
21011
21340
  if (isNumber(x) && x.im !== 0) {
21012
21341
  return `${gpuVec2(target)}(${formatFloat(-x.re)}, ${formatFloat(-x.im)})`;
21013
21342
  }
21014
- if (isSymbol2(x, "ImaginaryUnit"))
21015
- return `${gpuVec2(target)}(0.0, -1.0)`;
21343
+ if (isSymbol2(x, "ImaginaryUnit")) return `${gpuVec2(target)}(0.0, -1.0)`;
21016
21344
  return `(-${compile2(x)})`;
21017
21345
  },
21018
21346
  // Standard math functions with complex dispatch
@@ -21385,17 +21713,127 @@ var GPU_FUNCTIONS = {
21385
21713
  }
21386
21714
  const isWGSL = target?.language === "wgsl";
21387
21715
  const v3 = isWGSL ? "vec3f" : "vec3";
21388
- return `((_gpu_apca(${bg}, ${v3}(0.0)) > 50.0) ? ${v3}(0.0) : ${v3}(1.0))`;
21716
+ const black = `${v3}(0.0)`;
21717
+ const white = `${v3}(1.0, 0.0, 0.0)`;
21718
+ return `((_gpu_apca(${bg}, ${black}) > 50.0) ? ${black} : ${white})`;
21389
21719
  },
21390
21720
  ColorToColorspace: ([color, space], compile2) => {
21391
21721
  if (color === null || space === null)
21392
21722
  throw new Error("ColorToColorspace: need color and space");
21393
- return `_gpu_srgb_to_oklab(${compile2(color)})`;
21723
+ const spaceName = readStringLiteral(space);
21724
+ if (spaceName === null)
21725
+ throw new Error("ColorToColorspace: space must be a string literal");
21726
+ const c = compile2(color);
21727
+ switch (spaceName) {
21728
+ case "oklch":
21729
+ return c;
21730
+ case "oklab":
21731
+ case "lab":
21732
+ return `_gpu_oklch_to_oklab(${c})`;
21733
+ case "rgb":
21734
+ return `_gpu_oklch_to_srgb(${c})`;
21735
+ case "hsl":
21736
+ return `_gpu_rgb_to_hsl(_gpu_oklch_to_srgb(${c}))`;
21737
+ case "hsv":
21738
+ return `_gpu_rgb_to_hsv(_gpu_oklch_to_srgb(${c}))`;
21739
+ default:
21740
+ throw new Error(
21741
+ `ColorToColorspace: unsupported space "${spaceName}" on GPU target`
21742
+ );
21743
+ }
21394
21744
  },
21395
21745
  ColorFromColorspace: ([components, space], compile2) => {
21396
21746
  if (components === null || space === null)
21397
21747
  throw new Error("ColorFromColorspace: need components and space");
21398
- return `_gpu_oklab_to_srgb(${compile2(components)})`;
21748
+ const spaceName = readStringLiteral(space);
21749
+ if (spaceName === null)
21750
+ throw new Error("ColorFromColorspace: space must be a string literal");
21751
+ const c = compile2(components);
21752
+ switch (spaceName) {
21753
+ case "oklch":
21754
+ return c;
21755
+ case "oklab":
21756
+ case "lab":
21757
+ return `_gpu_oklab_to_oklch(${c})`;
21758
+ case "rgb":
21759
+ return `_gpu_srgb_to_oklch(${c})`;
21760
+ case "hsl":
21761
+ return `_gpu_srgb_to_oklch(_gpu_hsl_to_rgb(${c}))`;
21762
+ case "hsv":
21763
+ return `_gpu_srgb_to_oklch(_gpu_hsv_to_rgb(${c}))`;
21764
+ default:
21765
+ throw new Error(
21766
+ `ColorFromColorspace: unsupported space "${spaceName}" on GPU target`
21767
+ );
21768
+ }
21769
+ },
21770
+ // ---------------------------------------------------------------------------
21771
+ // Color literals. Each typed head compiles to a canonical OKLCh vec3.
21772
+ // Alpha (4th argument) is dropped — GPU color values are vec3 only. Pass
21773
+ // alpha as a separate uniform if it's needed at the framebuffer boundary.
21774
+ // ---------------------------------------------------------------------------
21775
+ Color: ([s], _compile, target) => {
21776
+ if (s === null) throw new Error("Color: no argument");
21777
+ const str = readStringLiteral(s);
21778
+ if (str === null)
21779
+ throw new Error("Color: argument must be a string literal on GPU target");
21780
+ const packed = parseColor(str);
21781
+ if (packed === 0 && str.trim().toLowerCase() !== "transparent")
21782
+ throw new Error(`Color: invalid color string "${str}"`);
21783
+ const r = packed >>> 24 & 255;
21784
+ const g = packed >>> 16 & 255;
21785
+ const b = packed >>> 8 & 255;
21786
+ const oklch2 = rgbToOklch({ r, g, b });
21787
+ return `${gpuVec3(target)}(${formatFloat(oklch2.L)}, ${formatFloat(oklch2.C)}, ${formatFloat(oklch2.H)})`;
21788
+ },
21789
+ Rgb: (args, compile2, target) => {
21790
+ if (args.length < 3) throw new Error("Rgb: need 3 components");
21791
+ const v3 = gpuVec3(target);
21792
+ return `_gpu_srgb_to_oklch(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])}))`;
21793
+ },
21794
+ Hsv: (args, compile2, target) => {
21795
+ if (args.length < 3) throw new Error("Hsv: need 3 components");
21796
+ const v3 = gpuVec3(target);
21797
+ return `_gpu_srgb_to_oklch(_gpu_hsv_to_rgb(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})))`;
21798
+ },
21799
+ Hsl: (args, compile2, target) => {
21800
+ if (args.length < 3) throw new Error("Hsl: need 3 components");
21801
+ const v3 = gpuVec3(target);
21802
+ return `_gpu_srgb_to_oklch(_gpu_hsl_to_rgb(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})))`;
21803
+ },
21804
+ Oklab: (args, compile2, target) => {
21805
+ if (args.length < 3) throw new Error("Oklab: need 3 components");
21806
+ const v3 = gpuVec3(target);
21807
+ return `_gpu_oklab_to_oklch(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])}))`;
21808
+ },
21809
+ Oklch: (args, compile2, target) => {
21810
+ if (args.length < 3) throw new Error("Oklch: need 3 components");
21811
+ const v3 = gpuVec3(target);
21812
+ return `${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})`;
21813
+ },
21814
+ // ---------------------------------------------------------------------------
21815
+ // As* operators. AsOklch is identity (canonical). The other As* return
21816
+ // components in the named space, equivalent to ColorToColorspace(c, 'x').
21817
+ // ---------------------------------------------------------------------------
21818
+ AsOklch: ([c], compile2) => {
21819
+ if (c === null) throw new Error("AsOklch: no argument");
21820
+ return compile2(c);
21821
+ },
21822
+ AsOklab: ([c], compile2) => {
21823
+ if (c === null) throw new Error("AsOklab: no argument");
21824
+ return `_gpu_oklch_to_oklab(${compile2(c)})`;
21825
+ },
21826
+ AsRgb: ([c], compile2) => {
21827
+ if (c === null) throw new Error("AsRgb: no argument");
21828
+ return `_gpu_oklch_to_srgb(${compile2(c)})`;
21829
+ },
21830
+ AsHsv: ([c], compile2) => {
21831
+ if (c === null) throw new Error("AsHsv: no argument");
21832
+ return `_gpu_rgb_to_hsv(_gpu_oklch_to_srgb(${compile2(c)}))`;
21833
+ },
21834
+ AsHsl: ([c], compile2) => {
21835
+ if (c === null) throw new Error("AsHsl: no argument");
21836
+ return `_gpu_rgb_to_hsl(_gpu_oklch_to_srgb(${compile2(c)}))`;
21399
21837
  },
21400
21838
  // Fractal functions
21401
21839
  Mandelbrot: ([c, maxIter], compile2, target) => {
@@ -22088,28 +22526,124 @@ vec3 _gpu_oklab_to_srgb(vec3 lab) {
22088
22526
 
22089
22527
  vec3 _gpu_oklab_to_oklch(vec3 lab) {
22090
22528
  float C = length(lab.yz);
22091
- float H = atan(lab.z, lab.y);
22529
+ float H = atan(lab.z, lab.y) * (180.0 / 3.14159265359);
22530
+ if (H < 0.0) H += 360.0;
22092
22531
  return vec3(lab.x, C, H);
22093
22532
  }
22094
22533
 
22095
22534
  vec3 _gpu_oklch_to_oklab(vec3 lch) {
22096
- return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));
22535
+ float h_rad = lch.z * (3.14159265359 / 180.0);
22536
+ return vec3(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));
22537
+ }
22538
+
22539
+ vec3 _gpu_srgb_to_oklch(vec3 rgb) {
22540
+ return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));
22541
+ }
22542
+
22543
+ vec3 _gpu_oklch_to_srgb(vec3 lch) {
22544
+ return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));
22545
+ }
22546
+
22547
+ // HSL conversion. Hue in degrees, saturation/lightness in 0-1.
22548
+ vec3 _gpu_hsl_to_rgb(vec3 hsl) {
22549
+ float h = hsl.x;
22550
+ float s = hsl.y;
22551
+ float l = hsl.z;
22552
+ float c = (1.0 - abs(2.0 * l - 1.0)) * s;
22553
+ float h6 = h / 60.0;
22554
+ float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));
22555
+ float r = 0.0;
22556
+ float g = 0.0;
22557
+ float b = 0.0;
22558
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22559
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22560
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22561
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22562
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22563
+ else { r = c; g = 0.0; b = x; }
22564
+ float m = l - c / 2.0;
22565
+ return vec3(r + m, g + m, b + m);
22566
+ }
22567
+
22568
+ vec3 _gpu_rgb_to_hsl(vec3 rgb) {
22569
+ float maxc = max(max(rgb.x, rgb.y), rgb.z);
22570
+ float minc = min(min(rgb.x, rgb.y), rgb.z);
22571
+ float l = (maxc + minc) / 2.0;
22572
+ float d = maxc - minc;
22573
+ if (d < 1e-6) return vec3(0.0, 0.0, l);
22574
+ float s = d / (1.0 - abs(2.0 * l - 1.0));
22575
+ float h;
22576
+ if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);
22577
+ else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;
22578
+ else h = (rgb.x - rgb.y) / d + 4.0;
22579
+ h *= 60.0;
22580
+ if (h < 0.0) h += 360.0;
22581
+ return vec3(h, s, l);
22582
+ }
22583
+
22584
+ // HSV conversion. Hue in degrees, saturation/value in 0-1.
22585
+ vec3 _gpu_hsv_to_rgb(vec3 hsv) {
22586
+ float h = hsv.x;
22587
+ float s = hsv.y;
22588
+ float v = hsv.z;
22589
+ float c = v * s;
22590
+ float h6 = h / 60.0;
22591
+ float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));
22592
+ float r = 0.0;
22593
+ float g = 0.0;
22594
+ float b = 0.0;
22595
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22596
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22597
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22598
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22599
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22600
+ else { r = c; g = 0.0; b = x; }
22601
+ float m = v - c;
22602
+ return vec3(r + m, g + m, b + m);
22097
22603
  }
22098
22604
 
22099
- vec3 _gpu_color_mix(vec3 rgb1, vec3 rgb2, float t) {
22100
- vec3 lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));
22101
- vec3 lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));
22605
+ vec3 _gpu_rgb_to_hsv(vec3 rgb) {
22606
+ float maxc = max(max(rgb.x, rgb.y), rgb.z);
22607
+ float minc = min(min(rgb.x, rgb.y), rgb.z);
22608
+ float v = maxc;
22609
+ float d = maxc - minc;
22610
+ if (d < 1e-6) return vec3(0.0, 0.0, v);
22611
+ float s = (maxc < 1e-6) ? 0.0 : d / maxc;
22612
+ float h;
22613
+ if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);
22614
+ else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;
22615
+ else h = (rgb.x - rgb.y) / d + 4.0;
22616
+ h *= 60.0;
22617
+ if (h < 0.0) h += 360.0;
22618
+ return vec3(h, s, v);
22619
+ }
22620
+
22621
+ vec3 _gpu_color_mix(vec3 lch1, vec3 lch2, float t) {
22102
22622
  float L = mix(lch1.x, lch2.x, t);
22103
22623
  float C = mix(lch1.y, lch2.y, t);
22104
- float dh = lch2.z - lch1.z;
22105
- const float PI = 3.14159265359;
22106
- if (dh > PI) dh -= 2.0 * PI;
22107
- if (dh < -PI) dh += 2.0 * PI;
22108
- float H = lch1.z + dh * t;
22109
- return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3(L, C, H)));
22624
+ bool a1 = lch1.y < 1e-6;
22625
+ bool a2 = lch2.y < 1e-6;
22626
+ float H;
22627
+ if (a1 && a2) {
22628
+ H = lch1.z;
22629
+ } else if (a1) {
22630
+ H = lch2.z;
22631
+ } else if (a2) {
22632
+ H = lch1.z;
22633
+ } else {
22634
+ float dh = lch2.z - lch1.z;
22635
+ if (dh > 180.0) dh -= 360.0;
22636
+ if (dh < -180.0) dh += 360.0;
22637
+ H = lch1.z + dh * t;
22638
+ if (H < 0.0) H += 360.0;
22639
+ if (H >= 360.0) H -= 360.0;
22640
+ }
22641
+ return vec3(L, C, H);
22110
22642
  }
22111
22643
 
22112
- float _gpu_apca(vec3 bg, vec3 fg) {
22644
+ float _gpu_apca(vec3 lch_bg, vec3 lch_fg) {
22645
+ vec3 bg = _gpu_oklch_to_srgb(lch_bg);
22646
+ vec3 fg = _gpu_oklch_to_srgb(lch_fg);
22113
22647
  float bgR = _gpu_srgb_to_linear(bg.x);
22114
22648
  float bgG = _gpu_srgb_to_linear(bg.y);
22115
22649
  float bgB = _gpu_srgb_to_linear(bg.z);
@@ -22120,9 +22654,7 @@ float _gpu_apca(vec3 bg, vec3 fg) {
22120
22654
  float fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;
22121
22655
  float bgC = pow(bgY, 0.56);
22122
22656
  float fgC = pow(fgY, 0.57);
22123
- float contrast = (bgC > fgC)
22124
- ? (bgC - fgC) * 1.14
22125
- : (bgC - fgC) * 1.14;
22657
+ float contrast = (bgC - fgC) * 1.14;
22126
22658
  return contrast * 100.0;
22127
22659
  }
22128
22660
  `;
@@ -22166,28 +22698,133 @@ fn _gpu_oklab_to_srgb(lab: vec3f) -> vec3f {
22166
22698
 
22167
22699
  fn _gpu_oklab_to_oklch(lab: vec3f) -> vec3f {
22168
22700
  let C = length(lab.yz);
22169
- let H = atan2(lab.z, lab.y);
22701
+ var H = atan2(lab.z, lab.y) * (180.0 / 3.14159265359);
22702
+ if (H < 0.0) { H = H + 360.0; }
22170
22703
  return vec3f(lab.x, C, H);
22171
22704
  }
22172
22705
 
22173
22706
  fn _gpu_oklch_to_oklab(lch: vec3f) -> vec3f {
22174
- return vec3f(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));
22707
+ let h_rad = lch.z * (3.14159265359 / 180.0);
22708
+ return vec3f(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));
22175
22709
  }
22176
22710
 
22177
- fn _gpu_color_mix(rgb1: vec3f, rgb2: vec3f, t: f32) -> vec3f {
22178
- let lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));
22179
- let lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));
22711
+ fn _gpu_srgb_to_oklch(rgb: vec3f) -> vec3f {
22712
+ return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));
22713
+ }
22714
+
22715
+ fn _gpu_oklch_to_srgb(lch: vec3f) -> vec3f {
22716
+ return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));
22717
+ }
22718
+
22719
+ fn _gpu_hsl_to_rgb(hsl: vec3f) -> vec3f {
22720
+ let h = hsl.x;
22721
+ let s = hsl.y;
22722
+ let l = hsl.z;
22723
+ let c = (1.0 - abs(2.0 * l - 1.0)) * s;
22724
+ let h6 = h / 60.0;
22725
+ let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));
22726
+ var r: f32 = 0.0;
22727
+ var g: f32 = 0.0;
22728
+ var b: f32 = 0.0;
22729
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22730
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22731
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22732
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22733
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22734
+ else { r = c; g = 0.0; b = x; }
22735
+ let m = l - c / 2.0;
22736
+ return vec3f(r + m, g + m, b + m);
22737
+ }
22738
+
22739
+ fn _gpu_rgb_to_hsl(rgb: vec3f) -> vec3f {
22740
+ let maxc = max(max(rgb.x, rgb.y), rgb.z);
22741
+ let minc = min(min(rgb.x, rgb.y), rgb.z);
22742
+ let l = (maxc + minc) / 2.0;
22743
+ let d = maxc - minc;
22744
+ if (d < 1e-6) { return vec3f(0.0, 0.0, l); }
22745
+ let s = d / (1.0 - abs(2.0 * l - 1.0));
22746
+ var h: f32;
22747
+ if (maxc == rgb.x) {
22748
+ let v = (rgb.y - rgb.z) / d;
22749
+ h = v - 6.0 * floor(v / 6.0);
22750
+ } else if (maxc == rgb.y) {
22751
+ h = (rgb.z - rgb.x) / d + 2.0;
22752
+ } else {
22753
+ h = (rgb.x - rgb.y) / d + 4.0;
22754
+ }
22755
+ h = h * 60.0;
22756
+ if (h < 0.0) { h = h + 360.0; }
22757
+ return vec3f(h, s, l);
22758
+ }
22759
+
22760
+ fn _gpu_hsv_to_rgb(hsv: vec3f) -> vec3f {
22761
+ let h = hsv.x;
22762
+ let s = hsv.y;
22763
+ let v = hsv.z;
22764
+ let c = v * s;
22765
+ let h6 = h / 60.0;
22766
+ let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));
22767
+ var r: f32 = 0.0;
22768
+ var g: f32 = 0.0;
22769
+ var b: f32 = 0.0;
22770
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22771
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22772
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22773
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22774
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22775
+ else { r = c; g = 0.0; b = x; }
22776
+ let m = v - c;
22777
+ return vec3f(r + m, g + m, b + m);
22778
+ }
22779
+
22780
+ fn _gpu_rgb_to_hsv(rgb: vec3f) -> vec3f {
22781
+ let maxc = max(max(rgb.x, rgb.y), rgb.z);
22782
+ let minc = min(min(rgb.x, rgb.y), rgb.z);
22783
+ let v = maxc;
22784
+ let d = maxc - minc;
22785
+ if (d < 1e-6) { return vec3f(0.0, 0.0, v); }
22786
+ var s: f32 = 0.0;
22787
+ if (maxc >= 1e-6) { s = d / maxc; }
22788
+ var h: f32;
22789
+ if (maxc == rgb.x) {
22790
+ let q = (rgb.y - rgb.z) / d;
22791
+ h = q - 6.0 * floor(q / 6.0);
22792
+ } else if (maxc == rgb.y) {
22793
+ h = (rgb.z - rgb.x) / d + 2.0;
22794
+ } else {
22795
+ h = (rgb.x - rgb.y) / d + 4.0;
22796
+ }
22797
+ h = h * 60.0;
22798
+ if (h < 0.0) { h = h + 360.0; }
22799
+ return vec3f(h, s, v);
22800
+ }
22801
+
22802
+ fn _gpu_color_mix(lch1: vec3f, lch2: vec3f, t: f32) -> vec3f {
22180
22803
  let L = mix(lch1.x, lch2.x, t);
22181
22804
  let C = mix(lch1.y, lch2.y, t);
22182
- let PI = 3.14159265359;
22183
- var dh = lch2.z - lch1.z;
22184
- if (dh > PI) { dh -= 2.0 * PI; }
22185
- if (dh < -PI) { dh += 2.0 * PI; }
22186
- let H = lch1.z + dh * t;
22187
- return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3f(L, C, H)));
22805
+ let a1 = lch1.y < 1e-6;
22806
+ let a2 = lch2.y < 1e-6;
22807
+ var H: f32;
22808
+ if (a1 && a2) {
22809
+ H = lch1.z;
22810
+ } else if (a1) {
22811
+ H = lch2.z;
22812
+ } else if (a2) {
22813
+ H = lch1.z;
22814
+ } else {
22815
+ var dh = lch2.z - lch1.z;
22816
+ if (dh > 180.0) { dh = dh - 360.0; }
22817
+ if (dh < -180.0) { dh = dh + 360.0; }
22818
+ H = lch1.z + dh * t;
22819
+ if (H < 0.0) { H = H + 360.0; }
22820
+ if (H >= 360.0) { H = H - 360.0; }
22821
+ }
22822
+ return vec3f(L, C, H);
22188
22823
  }
22189
22824
 
22190
- fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
22825
+ fn _gpu_apca(lch_bg: vec3f, lch_fg: vec3f) -> f32 {
22826
+ let bg = _gpu_oklch_to_srgb(lch_bg);
22827
+ let fg = _gpu_oklch_to_srgb(lch_fg);
22191
22828
  let bgR = _gpu_srgb_to_linear(bg.x);
22192
22829
  let bgG = _gpu_srgb_to_linear(bg.y);
22193
22830
  let bgB = _gpu_srgb_to_linear(bg.z);
@@ -22475,7 +23112,7 @@ var GPUShaderTarget = class {
22475
23112
  if (stmts.length === 0) return "";
22476
23113
  const last = stmts.length - 1;
22477
23114
  stmts[last] = `return ${stmts[last]}`;
22478
- return stmts.join(";\n");
23115
+ return stmts.join(";\n") + ";";
22479
23116
  },
22480
23117
  ...options
22481
23118
  };
@@ -22574,7 +23211,7 @@ var GLSLTarget = class extends GPUShaderTarget {
22574
23211
  if (body.includes("\n")) {
22575
23212
  const indented = body.split("\n").map((l) => ` ${l}`).join("\n");
22576
23213
  return `${returnType} ${functionName}(${params}) {
22577
- ${indented};
23214
+ ${indented}
22578
23215
  }`;
22579
23216
  }
22580
23217
  return `${returnType} ${functionName}(${params}) {
@@ -22685,7 +23322,7 @@ var WGSLTarget = class extends GPUShaderTarget {
22685
23322
  return `fn ${functionName}(${params}) -> ${toWGSLType(
22686
23323
  returnType
22687
23324
  )} {
22688
- ${indented};
23325
+ ${indented}
22689
23326
  }`;
22690
23327
  }
22691
23328
  return `fn ${functionName}(${params}) -> ${toWGSLType(returnType)} {
@@ -24864,7 +25501,7 @@ function compileToIntervalTarget(expr, target) {
24864
25501
  }
24865
25502
 
24866
25503
  // src/compile.ts
24867
- var version = "0.55.6";
25504
+ var version = "0.56.0";
24868
25505
  export {
24869
25506
  BaseCompiler,
24870
25507
  GLSLTarget,