@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
- /** Compile 0.55.6 */
1
+ /** Compile 0.56.0 */
2
2
  (function(global,factory){typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'],factory):(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Compile = {}));})(this, (function (exports) { 'use strict';
3
3
  var Compile = (() => {
4
4
  var __defProp = Object.defineProperty;
@@ -1544,6 +1544,7 @@ var Compile = (() => {
1544
1544
  ];
1545
1545
  var VALUE_TYPES = [
1546
1546
  "value",
1547
+ "color",
1547
1548
  ...COLLECTION_TYPES,
1548
1549
  ...SCALAR_TYPES
1549
1550
  ];
@@ -3239,6 +3240,7 @@ var Compile = (() => {
3239
3240
  symbol: [],
3240
3241
  boolean: [],
3241
3242
  string: [],
3243
+ color: [],
3242
3244
  expression: EXPRESSION_TYPES
3243
3245
  };
3244
3246
  function isPrimitiveSubtype(lhs, rhs) {
@@ -8826,6 +8828,8 @@ var Compile = (() => {
8826
8828
  precedence: DIVISION_PRECEDENCE,
8827
8829
  parse: "Mod"
8828
8830
  },
8831
+ // Function-style alias: `\operatorname{mod}(a, b)`
8832
+ { latexTrigger: "\\operatorname{mod}", parse: "Mod" },
8829
8833
  {
8830
8834
  latexTrigger: "\\pmod",
8831
8835
  kind: "prefix",
@@ -9066,6 +9070,13 @@ var Compile = (() => {
9066
9070
  const rhs = serializer.wrap(operand(expr, 2), ADDITION_PRECEDENCE + 3);
9067
9071
  return joinLatex([lhs, "-", rhs]);
9068
9072
  }
9073
+ },
9074
+ // Euclidean distance between two points (tuples of numbers).
9075
+ {
9076
+ name: "Distance",
9077
+ latexTrigger: ["\\operatorname{distance}"],
9078
+ kind: "function",
9079
+ serialize: (serializer, expr) => "\\operatorname{distance}" + serializer.wrapArguments(expr)
9069
9080
  }
9070
9081
  ];
9071
9082
  function getIndexAssignment(expr, upper) {
@@ -10490,7 +10501,9 @@ var Compile = (() => {
10490
10501
  if (!expr || !symbol(expr)) return null;
10491
10502
  return ["Mean", expr];
10492
10503
  }
10493
- }
10504
+ },
10505
+ // Function-style alias: `\operatorname{var}(...)`
10506
+ { latexTrigger: "\\operatorname{var}", parse: "Variance" }
10494
10507
  ];
10495
10508
 
10496
10509
  // src/compute-engine/numerics/unit-data.ts
@@ -11498,7 +11511,7 @@ var Compile = (() => {
11498
11511
  36: "\\qquad"
11499
11512
  }[v] ?? "";
11500
11513
  }
11501
- }
11514
+ },
11502
11515
  // if (
11503
11516
  // [
11504
11517
  // '\\!',
@@ -11522,6 +11535,121 @@ var Compile = (() => {
11522
11535
  // name: '',
11523
11536
  // trigger: '\\check',
11524
11537
  // },
11538
+ // ---------------------------------------------------------------------------
11539
+ // Function-style aliases for collection / random operators that some
11540
+ // notations write in lowercase (e.g. `\operatorname{shuffle}(L)`).
11541
+ // The capitalized library entries already exist; these are pure parse
11542
+ // aliases so the lowercase names don't land in `unsupported-operator`.
11543
+ // ---------------------------------------------------------------------------
11544
+ { latexTrigger: "\\operatorname{random}", parse: "Random" },
11545
+ { latexTrigger: "\\operatorname{shuffle}", parse: "Shuffle" },
11546
+ { latexTrigger: "\\operatorname{repeat}", parse: "Repeat" },
11547
+ { latexTrigger: "\\operatorname{join}", parse: "Join" },
11548
+ // ---------------------------------------------------------------------------
11549
+ // Geometric primitive heads. Registered as known typed heads so consumers
11550
+ // can branch on the operator name; CE itself doesn't render them. The
11551
+ // library entries (with no evaluator) live in `library/core.ts`.
11552
+ // ---------------------------------------------------------------------------
11553
+ {
11554
+ name: "Triangle",
11555
+ latexTrigger: ["\\operatorname{triangle}"],
11556
+ kind: "function",
11557
+ serialize: (serializer, expr) => "\\operatorname{triangle}" + serializer.wrapArguments(expr)
11558
+ },
11559
+ // Desmos's geometric `vector(p1, p2)` — a directed segment between two
11560
+ // points. Routed to a dedicated head (not the existing column-vector
11561
+ // `Vector`, which has a narrower `(number+) -> vector` signature).
11562
+ {
11563
+ name: "GeometricVector",
11564
+ latexTrigger: ["\\operatorname{vector}"],
11565
+ kind: "function",
11566
+ serialize: (serializer, expr) => "\\operatorname{vector}" + serializer.wrapArguments(expr)
11567
+ },
11568
+ {
11569
+ name: "Sphere",
11570
+ latexTrigger: ["\\operatorname{sphere}"],
11571
+ kind: "function",
11572
+ serialize: (serializer, expr) => "\\operatorname{sphere}" + serializer.wrapArguments(expr)
11573
+ },
11574
+ {
11575
+ name: "Segment",
11576
+ latexTrigger: ["\\operatorname{segment}"],
11577
+ kind: "function",
11578
+ serialize: (serializer, expr) => "\\operatorname{segment}" + serializer.wrapArguments(expr)
11579
+ }
11580
+ ];
11581
+
11582
+ // src/compute-engine/latex-syntax/dictionary/definitions-colors.ts
11583
+ var DEFINITIONS_COLORS = [
11584
+ // Color constructors (one per colorspace, preserves space on evaluation)
11585
+ {
11586
+ name: "Rgb",
11587
+ latexTrigger: ["\\operatorname{rgb}"],
11588
+ kind: "function",
11589
+ serialize: (serializer, expr) => "\\operatorname{rgb}" + serializer.wrapArguments(expr)
11590
+ },
11591
+ {
11592
+ name: "Hsv",
11593
+ latexTrigger: ["\\operatorname{hsv}"],
11594
+ kind: "function",
11595
+ serialize: (serializer, expr) => "\\operatorname{hsv}" + serializer.wrapArguments(expr)
11596
+ },
11597
+ {
11598
+ name: "Hsl",
11599
+ latexTrigger: ["\\operatorname{hsl}"],
11600
+ kind: "function",
11601
+ serialize: (serializer, expr) => "\\operatorname{hsl}" + serializer.wrapArguments(expr)
11602
+ },
11603
+ {
11604
+ name: "Oklab",
11605
+ latexTrigger: ["\\operatorname{oklab}"],
11606
+ kind: "function",
11607
+ serialize: (serializer, expr) => "\\operatorname{oklab}" + serializer.wrapArguments(expr)
11608
+ },
11609
+ {
11610
+ name: "Oklch",
11611
+ latexTrigger: ["\\operatorname{oklch}"],
11612
+ kind: "function",
11613
+ serialize: (serializer, expr) => "\\operatorname{oklch}" + serializer.wrapArguments(expr)
11614
+ },
11615
+ // Conversion functions (color → color in the named space)
11616
+ {
11617
+ name: "AsRgb",
11618
+ latexTrigger: ["\\operatorname{asRgb}"],
11619
+ kind: "function",
11620
+ serialize: (serializer, expr) => "\\operatorname{asRgb}" + serializer.wrapArguments(expr)
11621
+ },
11622
+ {
11623
+ name: "AsHsv",
11624
+ latexTrigger: ["\\operatorname{asHsv}"],
11625
+ kind: "function",
11626
+ serialize: (serializer, expr) => "\\operatorname{asHsv}" + serializer.wrapArguments(expr)
11627
+ },
11628
+ {
11629
+ name: "AsHsl",
11630
+ latexTrigger: ["\\operatorname{asHsl}"],
11631
+ kind: "function",
11632
+ serialize: (serializer, expr) => "\\operatorname{asHsl}" + serializer.wrapArguments(expr)
11633
+ },
11634
+ {
11635
+ name: "AsOklab",
11636
+ latexTrigger: ["\\operatorname{asOklab}"],
11637
+ kind: "function",
11638
+ serialize: (serializer, expr) => "\\operatorname{asOklab}" + serializer.wrapArguments(expr)
11639
+ },
11640
+ {
11641
+ name: "AsOklch",
11642
+ latexTrigger: ["\\operatorname{asOklch}"],
11643
+ kind: "function",
11644
+ serialize: (serializer, expr) => "\\operatorname{asOklch}" + serializer.wrapArguments(expr)
11645
+ },
11646
+ // Perceptual difference (returns a scalar in [0, ~1])
11647
+ {
11648
+ name: "ColorDelta",
11649
+ latexTrigger: ["\\operatorname{colorDelta}"],
11650
+ kind: "function",
11651
+ serialize: (serializer, expr) => "\\operatorname{colorDelta}" + serializer.wrapArguments(expr)
11652
+ }
11525
11653
  ];
11526
11654
 
11527
11655
  // src/compute-engine/latex-syntax/dictionary/default-dictionary.ts
@@ -11552,7 +11680,8 @@ var Compile = (() => {
11552
11680
  ...DEFINITIONS_STATISTICS,
11553
11681
  ...DEFINITIONS_UNITS,
11554
11682
  ...DEFINITIONS_OTHERS,
11555
- ...DEFINITIONS_PHYSICS
11683
+ ...DEFINITIONS_PHYSICS,
11684
+ ...DEFINITIONS_COLORS
11556
11685
  ];
11557
11686
 
11558
11687
  // src/math-json/symbols.ts
@@ -15187,8 +15316,7 @@ ${lines.join("\n")}`;
15187
15316
  ce.pushScope();
15188
15317
  try {
15189
15318
  if (vars && typeof vars === "object") {
15190
- for (const [k, v] of Object.entries(vars))
15191
- ce.assign(k, v);
15319
+ for (const [k, v] of Object.entries(vars)) ce.assign(k, v);
15192
15320
  }
15193
15321
  return expr.evaluate().re;
15194
15322
  } finally {
@@ -15275,8 +15403,7 @@ ${lines.join("\n")}`;
15275
15403
  return { re: null, im: formatFloat(iScale) };
15276
15404
  }
15277
15405
  const compiledFactors = remaining.map((r) => compile2(r));
15278
- if (iScale !== 1)
15279
- compiledFactors.unshift(formatFloat(iScale));
15406
+ if (iScale !== 1) compiledFactors.unshift(formatFloat(iScale));
15280
15407
  const imCode = foldTerms(compiledFactors, "1.0", "*");
15281
15408
  return { re: null, im: imCode };
15282
15409
  }
@@ -15341,6 +15468,40 @@ ${lines.join("\n")}`;
15341
15468
  else h = ((r - g) / d + 4) / 6;
15342
15469
  return { h: h * 360, s, l };
15343
15470
  }
15471
+ function hsvToRgb(h, s, v) {
15472
+ h = (h % 360 + 360) % 360;
15473
+ s = Math.max(0, Math.min(1, s));
15474
+ v = Math.max(0, Math.min(1, v));
15475
+ const c = v * s;
15476
+ const x = c * (1 - Math.abs(h / 60 % 2 - 1));
15477
+ const m = v - c;
15478
+ let r = 0, g = 0, b = 0;
15479
+ if (h < 60) [r, g, b] = [c, x, 0];
15480
+ else if (h < 120) [r, g, b] = [x, c, 0];
15481
+ else if (h < 180) [r, g, b] = [0, c, x];
15482
+ else if (h < 240) [r, g, b] = [0, x, c];
15483
+ else if (h < 300) [r, g, b] = [x, 0, c];
15484
+ else [r, g, b] = [c, 0, x];
15485
+ return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255 };
15486
+ }
15487
+ function rgbToHsv(r, g, b) {
15488
+ r /= 255;
15489
+ g /= 255;
15490
+ b /= 255;
15491
+ const max2 = Math.max(r, g, b);
15492
+ const min2 = Math.min(r, g, b);
15493
+ const d = max2 - min2;
15494
+ let h = 0;
15495
+ if (d > 0) {
15496
+ if (max2 === r) h = (g - b) / d % 6;
15497
+ else if (max2 === g) h = (b - r) / d + 2;
15498
+ else h = (r - g) / d + 4;
15499
+ h *= 60;
15500
+ if (h < 0) h += 360;
15501
+ }
15502
+ const s = max2 === 0 ? 0 : d / max2;
15503
+ return { h, s, v: max2 };
15504
+ }
15344
15505
  function parseHexColor(s) {
15345
15506
  const hex = s.startsWith("#") ? s.substring(1) : s;
15346
15507
  let r, g, b;
@@ -15796,6 +15957,13 @@ ${lines.join("\n")}`;
15796
15957
  };
15797
15958
  function parseColor(s, darkMode) {
15798
15959
  const str = s.trim().toLowerCase();
15960
+ const opacityMatch = str.match(/^(.+?)\s*\/\s*(\d+(?:\.\d+)?)%?\s*$/);
15961
+ if (opacityMatch) {
15962
+ const base = parseColor(opacityMatch[1].trim(), darkMode);
15963
+ const opacity = Math.max(0, Math.min(100, parseFloat(opacityMatch[2])));
15964
+ const alpha = Math.round(opacity / 100 * 255);
15965
+ return base & 4294967040 | alpha;
15966
+ }
15799
15967
  if (str.startsWith("#")) {
15800
15968
  const hex = str.substring(1);
15801
15969
  let r, g, b, a = 255;
@@ -15928,14 +16096,6 @@ ${lines.join("\n")}`;
15928
16096
  console.warn(`parseColor: unrecognized color "${s}"`);
15929
16097
  return 0;
15930
16098
  }
15931
- function parseColorToRgb01(s, darkMode) {
15932
- const color = parseColor(s, darkMode);
15933
- return [
15934
- (color >>> 24 & 255) / 255,
15935
- (color >>> 16 & 255) / 255,
15936
- (color >>> 8 & 255) / 255
15937
- ];
15938
- }
15939
16099
  function apca(bgColor, fgColor) {
15940
16100
  const bgRgb = asRgb(bgColor);
15941
16101
  const fgRgb = asRgb(fgColor);
@@ -15994,6 +16154,12 @@ ${lines.join("\n")}`;
15994
16154
  const contrast2 = Math.abs(apca(fg2, bg));
15995
16155
  return contrast1 >= contrast2 ? asColorNumber(fg1) : asColorNumber(fg2);
15996
16156
  }
16157
+ function oklabDeltaE(a, b) {
16158
+ const dL = a.L - b.L;
16159
+ const da = a.a - b.a;
16160
+ const db = a.b - b.b;
16161
+ return Math.sqrt(dL * dL + da * da + db * db);
16162
+ }
15997
16163
  var TYCHO_11 = [
15998
16164
  "#4e79a7",
15999
16165
  // Blue
@@ -20205,39 +20371,130 @@ ${lines.join("\n")}`;
20205
20371
  if (args.length >= 2)
20206
20372
  return `_SYS.colormap(${compile2(args[0])}, ${compile2(args[1])})`;
20207
20373
  return `_SYS.colormap(${compile2(args[0])})`;
20374
+ },
20375
+ // -----------------------------------------------------------------------
20376
+ // Color constructor heads. All compile to OKLCh arrays at runtime — the
20377
+ // canonical color representation in this target. The constructors take
20378
+ // their own colorspace's components and convert internally.
20379
+ // (Mirrors the GPU target's design: color values are vec3 OKLCh.)
20380
+ // -----------------------------------------------------------------------
20381
+ Rgb: (args, compile2) => {
20382
+ if (args.length < 3) throw new Error("Rgb: need 3 components");
20383
+ return `_SYS.rgb(${args.map(compile2).join(", ")})`;
20384
+ },
20385
+ Hsv: (args, compile2) => {
20386
+ if (args.length < 3) throw new Error("Hsv: need 3 components");
20387
+ return `_SYS.hsv(${args.map(compile2).join(", ")})`;
20388
+ },
20389
+ Hsl: (args, compile2) => {
20390
+ if (args.length < 3) throw new Error("Hsl: need 3 components");
20391
+ return `_SYS.hsl(${args.map(compile2).join(", ")})`;
20392
+ },
20393
+ Oklab: (args, compile2) => {
20394
+ if (args.length < 3) throw new Error("Oklab: need 3 components");
20395
+ return `_SYS.oklab(${args.map(compile2).join(", ")})`;
20396
+ },
20397
+ Oklch: (args, compile2) => {
20398
+ if (args.length < 3) throw new Error("Oklch: need 3 components");
20399
+ return `_SYS.oklch(${args.map(compile2).join(", ")})`;
20400
+ },
20401
+ // -----------------------------------------------------------------------
20402
+ // As* converters. Compile-time output convention matches the engine and
20403
+ // the GPU target: each returns components in the named space as a 3- or
20404
+ // 4-element array. `AsRgb` uses 0-1 sRGB channels (consistent across all
20405
+ // layers). `AsOklch` is the identity (canonical form).
20406
+ // -----------------------------------------------------------------------
20407
+ AsRgb: ([c], compile2) => {
20408
+ if (c === null) throw new Error("AsRgb: no argument");
20409
+ return `_SYS.asRgb(${compile2(c)})`;
20410
+ },
20411
+ AsHsv: ([c], compile2) => {
20412
+ if (c === null) throw new Error("AsHsv: no argument");
20413
+ return `_SYS.asHsv(${compile2(c)})`;
20414
+ },
20415
+ AsHsl: ([c], compile2) => {
20416
+ if (c === null) throw new Error("AsHsl: no argument");
20417
+ return `_SYS.asHsl(${compile2(c)})`;
20418
+ },
20419
+ AsOklab: ([c], compile2) => {
20420
+ if (c === null) throw new Error("AsOklab: no argument");
20421
+ return `_SYS.asOklab(${compile2(c)})`;
20422
+ },
20423
+ AsOklch: ([c], compile2) => {
20424
+ if (c === null) throw new Error("AsOklch: no argument");
20425
+ return compile2(c);
20426
+ },
20427
+ // Perceptual color difference (ΔE_OK).
20428
+ ColorDelta: ([a, b], compile2) => {
20429
+ if (a === null || b === null)
20430
+ throw new Error("ColorDelta: need two colors");
20431
+ return `_SYS.colorDelta(${compile2(a)}, ${compile2(b)})`;
20432
+ },
20433
+ // Euclidean distance between two tuples (any positive dimension).
20434
+ // The GPU target maps `Distance` to the GLSL/WGSL `distance()` builtin
20435
+ // (vec-only); this JS handler works on plain arrays of any length.
20436
+ Distance: ([a, b], compile2) => {
20437
+ if (a === null || b === null) throw new Error("Distance: need two points");
20438
+ return `_SYS.distance(${compile2(a)}, ${compile2(b)})`;
20208
20439
  }
20209
20440
  };
20210
20441
  function toRI(c) {
20211
20442
  return { re: c.re, im: c.im };
20212
20443
  }
20444
+ function normalizeAlpha(a) {
20445
+ if (a === void 0) return void 0;
20446
+ if (!Number.isFinite(a)) return void 0;
20447
+ if (Math.abs(a - 1) < 1e-9) return void 0;
20448
+ return a;
20449
+ }
20213
20450
  function toRgb255(input) {
20214
20451
  if (typeof input === "string") {
20215
20452
  const c = parseColor(input);
20216
- return {
20453
+ const rgb2 = {
20217
20454
  r: c >>> 24 & 255,
20218
20455
  g: c >>> 16 & 255,
20219
- b: c >>> 8 & 255,
20220
- alpha: (c & 255) / 255
20456
+ b: c >>> 8 & 255
20221
20457
  };
20458
+ const alpha = normalizeAlpha((c & 255) / 255);
20459
+ if (alpha !== void 0) rgb2.alpha = alpha;
20460
+ return rgb2;
20461
+ }
20462
+ const rgb = oklchToRgb({ L: input[0], C: input[1], H: input[2] });
20463
+ if (input.length >= 4) {
20464
+ const alpha = normalizeAlpha(input[3]);
20465
+ if (alpha !== void 0) rgb.alpha = alpha;
20222
20466
  }
20223
- const rgb = {
20224
- r: input[0] * 255,
20225
- g: input[1] * 255,
20226
- b: input[2] * 255
20227
- };
20228
- if (input.length >= 4) rgb.alpha = input[3];
20229
20467
  return rgb;
20230
20468
  }
20231
- function packedToArray(c) {
20232
- const r = (c >>> 24 & 255) / 255;
20233
- const g = (c >>> 16 & 255) / 255;
20234
- const b = (c >>> 8 & 255) / 255;
20235
- const a = (c & 255) / 255;
20236
- return Math.abs(a - 1) < 1e-4 ? [r, g, b] : [r, g, b, a];
20469
+ function toOklch(input) {
20470
+ if (typeof input === "string") {
20471
+ const c = parseColor(input);
20472
+ const r = c >>> 24 & 255;
20473
+ const g = c >>> 16 & 255;
20474
+ const b = c >>> 8 & 255;
20475
+ const oklch2 = rgbToOklch({ r, g, b });
20476
+ const alpha = normalizeAlpha((c & 255) / 255);
20477
+ if (alpha !== void 0) oklch2.alpha = alpha;
20478
+ return oklch2;
20479
+ }
20480
+ return {
20481
+ L: input[0],
20482
+ C: input[1],
20483
+ H: input[2],
20484
+ alpha: input.length >= 4 ? normalizeAlpha(input[3]) : void 0
20485
+ };
20486
+ }
20487
+ function packedToOklch(c) {
20488
+ const r = c >>> 24 & 255;
20489
+ const g = c >>> 16 & 255;
20490
+ const b = c >>> 8 & 255;
20491
+ const oklch2 = rgbToOklch({ r, g, b });
20492
+ const alpha = normalizeAlpha((c & 255) / 255);
20493
+ return alpha !== void 0 ? [oklch2.L, oklch2.C, oklch2.H, alpha] : [oklch2.L, oklch2.C, oklch2.H];
20237
20494
  }
20238
20495
  var colorHelpers = {
20239
20496
  color(input) {
20240
- return packedToArray(parseColor(input));
20497
+ return packedToOklch(parseColor(input));
20241
20498
  },
20242
20499
  colorToString(input, format) {
20243
20500
  const rgb = toRgb255(input);
@@ -20248,7 +20505,7 @@ ${lines.join("\n")}`;
20248
20505
  const g = Math.round(Math.max(0, Math.min(255, rgb.g)));
20249
20506
  const b = Math.round(Math.max(0, Math.min(255, rgb.b)));
20250
20507
  let hex = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
20251
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4) {
20508
+ if (rgb.alpha !== void 0) {
20252
20509
  const a = Math.round(Math.max(0, Math.min(255, rgb.alpha * 255)));
20253
20510
  hex += a.toString(16).padStart(2, "0");
20254
20511
  }
@@ -20258,7 +20515,7 @@ ${lines.join("\n")}`;
20258
20515
  const r = Math.round(rgb.r);
20259
20516
  const g = Math.round(rgb.g);
20260
20517
  const b = Math.round(rgb.b);
20261
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20518
+ if (rgb.alpha !== void 0)
20262
20519
  return `rgb(${r} ${g} ${b} / ${rgb.alpha})`;
20263
20520
  return `rgb(${r} ${g} ${b})`;
20264
20521
  }
@@ -20267,7 +20524,7 @@ ${lines.join("\n")}`;
20267
20524
  const h = Math.round(hsl.h * 10) / 10;
20268
20525
  const s = Math.round(hsl.s * 1e3) / 10;
20269
20526
  const l = Math.round(hsl.l * 1e3) / 10;
20270
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20527
+ if (rgb.alpha !== void 0)
20271
20528
  return `hsl(${h} ${s}% ${l}% / ${rgb.alpha})`;
20272
20529
  return `hsl(${h} ${s}% ${l}%)`;
20273
20530
  }
@@ -20276,7 +20533,7 @@ ${lines.join("\n")}`;
20276
20533
  const L = Math.round(c.L * 1e3) / 1e3;
20277
20534
  const C = Math.round(c.C * 1e3) / 1e3;
20278
20535
  const H = Math.round(c.H * 10) / 10;
20279
- if (rgb.alpha !== void 0 && Math.abs(rgb.alpha - 1) > 1e-4)
20536
+ if (rgb.alpha !== void 0)
20280
20537
  return `oklch(${L} ${C} ${H} / ${rgb.alpha})`;
20281
20538
  return `oklch(${L} ${C} ${H})`;
20282
20539
  }
@@ -20285,29 +20542,29 @@ ${lines.join("\n")}`;
20285
20542
  }
20286
20543
  },
20287
20544
  colorMix(input1, input2, ratio = 0.5) {
20288
- const rgb1 = toRgb255(input1);
20289
- const rgb2 = toRgb255(input2);
20545
+ const c1 = toOklch(input1);
20546
+ const c2 = toOklch(input2);
20290
20547
  ratio = Math.max(0, Math.min(1, ratio));
20291
- const c1 = rgbToOklch(rgb1);
20292
- const c2 = rgbToOklch(rgb2);
20293
- let dh = c2.H - c1.H;
20294
- if (dh > 180) dh -= 360;
20295
- if (dh < -180) dh += 360;
20296
- let H = c1.H + dh * ratio;
20297
- if (H < 0) H += 360;
20298
- if (H >= 360) H -= 360;
20299
- const mixed = oklchToRgb({
20300
- L: c1.L + (c2.L - c1.L) * ratio,
20301
- C: c1.C + (c2.C - c1.C) * ratio,
20302
- H
20303
- });
20304
- const r = mixed.r / 255;
20305
- const g = mixed.g / 255;
20306
- const b = mixed.b / 255;
20307
- const a1 = rgb1.alpha ?? 1;
20308
- const a2 = rgb2.alpha ?? 1;
20309
- const alpha = a1 + (a2 - a1) * ratio;
20310
- return Math.abs(alpha - 1) > 1e-4 ? [r, g, b, alpha] : [r, g, b];
20548
+ const c1Achromatic = c1.C < 1e-6;
20549
+ const c2Achromatic = c2.C < 1e-6;
20550
+ let H;
20551
+ if (c1Achromatic && c2Achromatic) H = c1.H;
20552
+ else if (c1Achromatic) H = c2.H;
20553
+ else if (c2Achromatic) H = c1.H;
20554
+ else {
20555
+ let dh = c2.H - c1.H;
20556
+ if (dh > 180) dh -= 360;
20557
+ if (dh < -180) dh += 360;
20558
+ H = c1.H + dh * ratio;
20559
+ if (H < 0) H += 360;
20560
+ if (H >= 360) H -= 360;
20561
+ }
20562
+ const L = c1.L + (c2.L - c1.L) * ratio;
20563
+ const C = c1.C + (c2.C - c1.C) * ratio;
20564
+ const a1 = c1.alpha ?? 1;
20565
+ const a2 = c2.alpha ?? 1;
20566
+ const alpha = normalizeAlpha(a1 + (a2 - a1) * ratio);
20567
+ return alpha !== void 0 ? [L, C, H, alpha] : [L, C, H];
20311
20568
  },
20312
20569
  colorContrast(bg, fg) {
20313
20570
  return apca(toRgb255(bg), toRgb255(fg));
@@ -20315,11 +20572,11 @@ ${lines.join("\n")}`;
20315
20572
  contrastingColor(bg, fg1, fg2) {
20316
20573
  const bgRgb = toRgb255(bg);
20317
20574
  if (fg1 !== void 0 && fg2 !== void 0) {
20318
- return packedToArray(
20575
+ return packedToOklch(
20319
20576
  contrastingColor({ bg: bgRgb, fg1: toRgb255(fg1), fg2: toRgb255(fg2) })
20320
20577
  );
20321
20578
  }
20322
- return packedToArray(contrastingColor(bgRgb));
20579
+ return packedToOklch(contrastingColor(bgRgb));
20323
20580
  },
20324
20581
  colorToColorspace(input, space) {
20325
20582
  const rgb = toRgb255(input);
@@ -20348,7 +20605,7 @@ ${lines.join("\n")}`;
20348
20605
  default:
20349
20606
  throw new Error(`Unknown color space: ${space}`);
20350
20607
  }
20351
- if (alpha !== void 0 && Math.abs(alpha - 1) > 1e-4) result.push(alpha);
20608
+ if (alpha !== void 0) result.push(alpha);
20352
20609
  return result;
20353
20610
  },
20354
20611
  colormap(name, arg) {
@@ -20360,7 +20617,7 @@ ${lines.join("\n")}`;
20360
20617
  const palette = allPalettes[name];
20361
20618
  if (!palette) throw new Error(`Unknown palette: ${name}`);
20362
20619
  const colors = palette.map(
20363
- (hex) => parseColorToRgb01(hex)
20620
+ (hex) => packedToOklch(parseColor(hex))
20364
20621
  );
20365
20622
  if (arg === void 0) return colors;
20366
20623
  if (Number.isInteger(arg) && arg >= 2) {
@@ -20384,62 +20641,128 @@ ${lines.join("\n")}`;
20384
20641
  const frac = pos - i;
20385
20642
  if (frac === 0 || i >= colors.length - 1)
20386
20643
  return [...colors[Math.min(i, colors.length - 1)]];
20387
- const rgb1 = {
20388
- r: colors[i][0] * 255,
20389
- g: colors[i][1] * 255,
20390
- b: colors[i][2] * 255
20391
- };
20392
- const rgb2 = {
20393
- r: colors[i + 1][0] * 255,
20394
- g: colors[i + 1][1] * 255,
20395
- b: colors[i + 1][2] * 255
20396
- };
20397
- const c1 = rgbToOklch(rgb1);
20398
- const c2 = rgbToOklch(rgb2);
20399
- let dh = c2.H - c1.H;
20400
- if (dh > 180) dh -= 360;
20401
- if (dh < -180) dh += 360;
20402
- let H = c1.H + dh * frac;
20403
- if (H < 0) H += 360;
20404
- if (H >= 360) H -= 360;
20405
- const mixed = oklchToRgb({
20406
- L: c1.L + (c2.L - c1.L) * frac,
20407
- C: c1.C + (c2.C - c1.C) * frac,
20408
- H
20409
- });
20410
- return [mixed.r / 255, mixed.g / 255, mixed.b / 255];
20644
+ const [L1, C1, H1] = colors[i];
20645
+ const [L2, C2, H2] = colors[i + 1];
20646
+ const c1Achromatic = C1 < 1e-6;
20647
+ const c2Achromatic = C2 < 1e-6;
20648
+ let H;
20649
+ if (c1Achromatic && c2Achromatic) H = H1;
20650
+ else if (c1Achromatic) H = H2;
20651
+ else if (c2Achromatic) H = H1;
20652
+ else {
20653
+ let dh = H2 - H1;
20654
+ if (dh > 180) dh -= 360;
20655
+ if (dh < -180) dh += 360;
20656
+ H = H1 + dh * frac;
20657
+ if (H < 0) H += 360;
20658
+ if (H >= 360) H -= 360;
20659
+ }
20660
+ return [L1 + (L2 - L1) * frac, C1 + (C2 - C1) * frac, H];
20411
20661
  },
20412
20662
  colorFromColorspace(components, space) {
20413
20663
  const c0 = components[0];
20414
20664
  const c1 = components[1];
20415
20665
  const c2 = components[2];
20416
20666
  const alpha = components.length >= 4 ? components[3] : void 0;
20417
- let result;
20667
+ let oklch2;
20418
20668
  switch (space.toLowerCase()) {
20419
20669
  case "rgb":
20420
- result = [c0, c1, c2];
20670
+ oklch2 = rgbToOklch({ r: c0 * 255, g: c1 * 255, b: c2 * 255 });
20421
20671
  break;
20422
20672
  case "hsl": {
20423
- const r = hslToRgb(c0, c1, c2);
20424
- result = [r.r / 255, r.g / 255, r.b / 255];
20673
+ const rgb = hslToRgb(c0, c1, c2);
20674
+ oklch2 = rgbToOklch(rgb);
20425
20675
  break;
20426
20676
  }
20427
- case "oklch": {
20428
- const r = oklchToRgb({ L: c0, C: c1, H: c2 });
20429
- result = [r.r / 255, r.g / 255, r.b / 255];
20677
+ case "oklch":
20678
+ oklch2 = { L: c0, C: c1, H: c2 };
20430
20679
  break;
20431
- }
20432
20680
  case "oklab":
20433
- case "lab": {
20434
- const r = oklabToRgb({ L: c0, a: c1, b: c2 });
20435
- result = [r.r / 255, r.g / 255, r.b / 255];
20681
+ case "lab":
20682
+ oklch2 = oklabToOklch({ L: c0, a: c1, b: c2 });
20436
20683
  break;
20437
- }
20438
20684
  default:
20439
20685
  throw new Error(`Unknown color space: ${space}`);
20440
20686
  }
20441
- if (alpha !== void 0 && Math.abs(alpha - 1) > 1e-4) result.push(alpha);
20442
- return result;
20687
+ return alpha !== void 0 ? [oklch2.L, oklch2.C, oklch2.H, alpha] : [oklch2.L, oklch2.C, oklch2.H];
20688
+ },
20689
+ // -----------------------------------------------------------------------
20690
+ // Color constructors. Each accepts components in its colorspace's natural
20691
+ // units and returns the canonical OKLCh array `[L, C, H]` (or with alpha).
20692
+ // -----------------------------------------------------------------------
20693
+ rgb(r, g, b, alpha) {
20694
+ const c = rgbToOklch({ r: r * 255, g: g * 255, b: b * 255 });
20695
+ const a = normalizeAlpha(alpha);
20696
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20697
+ },
20698
+ hsv(h, s, v, alpha) {
20699
+ const rgb = hsvToRgb(h, s, v);
20700
+ const c = rgbToOklch(rgb);
20701
+ const a = normalizeAlpha(alpha);
20702
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20703
+ },
20704
+ hsl(h, s, l, alpha) {
20705
+ const rgb = hslToRgb(h, s, l);
20706
+ const c = rgbToOklch({ r: rgb.r, g: rgb.g, b: rgb.b });
20707
+ const a = normalizeAlpha(alpha);
20708
+ return a !== void 0 ? [c.L, c.C, c.H, a] : [c.L, c.C, c.H];
20709
+ },
20710
+ oklab(L, a, b, alpha) {
20711
+ const c = oklabToOklch({ L, a, b });
20712
+ const al = normalizeAlpha(alpha);
20713
+ return al !== void 0 ? [c.L, c.C, c.H, al] : [c.L, c.C, c.H];
20714
+ },
20715
+ oklch(L, C, H, alpha) {
20716
+ const a = normalizeAlpha(alpha);
20717
+ return a !== void 0 ? [L, C, H, a] : [L, C, H];
20718
+ },
20719
+ // -----------------------------------------------------------------------
20720
+ // As* converters. Inputs are anything `toOklch` accepts (string, packed
20721
+ // int, or OKLCh array). Outputs are 3- or 4-element arrays in the named
20722
+ // space. sRGB-based outputs (asRgb/asHsv/asHsl) use 0-1 channels for
20723
+ // consistency with the GPU target's shader convention.
20724
+ // -----------------------------------------------------------------------
20725
+ asRgb(input) {
20726
+ const rgb = toRgb255(input);
20727
+ const r = rgb.r / 255;
20728
+ const g = rgb.g / 255;
20729
+ const b = rgb.b / 255;
20730
+ return rgb.alpha !== void 0 ? [r, g, b, rgb.alpha] : [r, g, b];
20731
+ },
20732
+ asHsv(input) {
20733
+ const rgb = toRgb255(input);
20734
+ const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
20735
+ return rgb.alpha !== void 0 ? [hsv.h, hsv.s, hsv.v, rgb.alpha] : [hsv.h, hsv.s, hsv.v];
20736
+ },
20737
+ asHsl(input) {
20738
+ const rgb = toRgb255(input);
20739
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
20740
+ return rgb.alpha !== void 0 ? [hsl.h, hsl.s, hsl.l, rgb.alpha] : [hsl.h, hsl.s, hsl.l];
20741
+ },
20742
+ asOklab(input) {
20743
+ const c = toOklch(input);
20744
+ const lab = oklchToOklab({ L: c.L, C: c.C, H: c.H });
20745
+ return c.alpha !== void 0 ? [lab.L, lab.a, lab.b, c.alpha] : [lab.L, lab.a, lab.b];
20746
+ },
20747
+ // asOklch is identity — handled at compile time as a pass-through
20748
+ // Perceptual color difference (ΔE_OK).
20749
+ colorDelta(a, b) {
20750
+ const labA = oklchToOklab(toOklch(a));
20751
+ const labB = oklchToOklab(toOklch(b));
20752
+ return oklabDeltaE(labA, labB);
20753
+ },
20754
+ // Euclidean distance between two tuples. Plain numeric — not a color
20755
+ // operation despite living in the same helpers block.
20756
+ distance(a, b) {
20757
+ if (!Array.isArray(a) || !Array.isArray(b))
20758
+ throw new Error("Distance: expected two arrays");
20759
+ if (a.length !== b.length) throw new Error("Distance: dimension mismatch");
20760
+ let sumSq = 0;
20761
+ for (let i = 0; i < a.length; i++) {
20762
+ const d = a[i] - b[i];
20763
+ sumSq += d * d;
20764
+ }
20765
+ return Math.sqrt(sumSq);
20443
20766
  }
20444
20767
  };
20445
20768
  var SYS_HELPERS = {
@@ -20878,6 +21201,13 @@ ${lines.join("\n")}`;
20878
21201
  function gpuVec2(target) {
20879
21202
  return target?.language === "wgsl" ? "vec2f" : "vec2";
20880
21203
  }
21204
+ function gpuVec3(target) {
21205
+ return target?.language === "wgsl" ? "vec3f" : "vec3";
21206
+ }
21207
+ function readStringLiteral(expr) {
21208
+ if (!isString(expr)) return null;
21209
+ return expr.string?.toLowerCase() ?? null;
21210
+ }
20881
21211
  function compileIntArg(expr, compile2, target) {
20882
21212
  const c = tryGetConstant(expr);
20883
21213
  if (c !== void 0 && Number.isInteger(c)) return c.toString();
@@ -20936,7 +21266,7 @@ ${lines.join("\n")}`;
20936
21266
  `for (${indexDecl} = ${lowerStr}; ${index} <= ${upperStr}; ${index}++) {`,
20937
21267
  ` ${acc} ${op}= ${body};`,
20938
21268
  `}`,
20939
- `return ${acc}`
21269
+ `return ${acc};`
20940
21270
  ];
20941
21271
  return lines.join("\n");
20942
21272
  }
@@ -20990,8 +21320,7 @@ ${lines.join("\n")}`;
20990
21320
  const iScale = isSymbol2(iFactor, "ImaginaryUnit") ? 1 : iFactor.im;
20991
21321
  const realFactors = args.filter((_, i) => i !== iIndex);
20992
21322
  const v2 = gpuVec2(target);
20993
- if (realFactors.length === 0)
20994
- return `${v2}(0.0, ${formatFloat(iScale)})`;
21323
+ if (realFactors.length === 0) return `${v2}(0.0, ${formatFloat(iScale)})`;
20995
21324
  const factors = realFactors.map((f) => compile2(f));
20996
21325
  if (iScale !== 1) factors.unshift(formatFloat(iScale));
20997
21326
  const imCode = foldTerms(factors, "1.0", "*");
@@ -21044,8 +21373,7 @@ ${lines.join("\n")}`;
21044
21373
  if (isNumber(x) && x.im !== 0) {
21045
21374
  return `${gpuVec2(target)}(${formatFloat(-x.re)}, ${formatFloat(-x.im)})`;
21046
21375
  }
21047
- if (isSymbol2(x, "ImaginaryUnit"))
21048
- return `${gpuVec2(target)}(0.0, -1.0)`;
21376
+ if (isSymbol2(x, "ImaginaryUnit")) return `${gpuVec2(target)}(0.0, -1.0)`;
21049
21377
  return `(-${compile2(x)})`;
21050
21378
  },
21051
21379
  // Standard math functions with complex dispatch
@@ -21418,17 +21746,127 @@ ${lines.join("\n")}`;
21418
21746
  }
21419
21747
  const isWGSL = target?.language === "wgsl";
21420
21748
  const v3 = isWGSL ? "vec3f" : "vec3";
21421
- return `((_gpu_apca(${bg}, ${v3}(0.0)) > 50.0) ? ${v3}(0.0) : ${v3}(1.0))`;
21749
+ const black = `${v3}(0.0)`;
21750
+ const white = `${v3}(1.0, 0.0, 0.0)`;
21751
+ return `((_gpu_apca(${bg}, ${black}) > 50.0) ? ${black} : ${white})`;
21422
21752
  },
21423
21753
  ColorToColorspace: ([color, space], compile2) => {
21424
21754
  if (color === null || space === null)
21425
21755
  throw new Error("ColorToColorspace: need color and space");
21426
- return `_gpu_srgb_to_oklab(${compile2(color)})`;
21756
+ const spaceName = readStringLiteral(space);
21757
+ if (spaceName === null)
21758
+ throw new Error("ColorToColorspace: space must be a string literal");
21759
+ const c = compile2(color);
21760
+ switch (spaceName) {
21761
+ case "oklch":
21762
+ return c;
21763
+ case "oklab":
21764
+ case "lab":
21765
+ return `_gpu_oklch_to_oklab(${c})`;
21766
+ case "rgb":
21767
+ return `_gpu_oklch_to_srgb(${c})`;
21768
+ case "hsl":
21769
+ return `_gpu_rgb_to_hsl(_gpu_oklch_to_srgb(${c}))`;
21770
+ case "hsv":
21771
+ return `_gpu_rgb_to_hsv(_gpu_oklch_to_srgb(${c}))`;
21772
+ default:
21773
+ throw new Error(
21774
+ `ColorToColorspace: unsupported space "${spaceName}" on GPU target`
21775
+ );
21776
+ }
21427
21777
  },
21428
21778
  ColorFromColorspace: ([components, space], compile2) => {
21429
21779
  if (components === null || space === null)
21430
21780
  throw new Error("ColorFromColorspace: need components and space");
21431
- return `_gpu_oklab_to_srgb(${compile2(components)})`;
21781
+ const spaceName = readStringLiteral(space);
21782
+ if (spaceName === null)
21783
+ throw new Error("ColorFromColorspace: space must be a string literal");
21784
+ const c = compile2(components);
21785
+ switch (spaceName) {
21786
+ case "oklch":
21787
+ return c;
21788
+ case "oklab":
21789
+ case "lab":
21790
+ return `_gpu_oklab_to_oklch(${c})`;
21791
+ case "rgb":
21792
+ return `_gpu_srgb_to_oklch(${c})`;
21793
+ case "hsl":
21794
+ return `_gpu_srgb_to_oklch(_gpu_hsl_to_rgb(${c}))`;
21795
+ case "hsv":
21796
+ return `_gpu_srgb_to_oklch(_gpu_hsv_to_rgb(${c}))`;
21797
+ default:
21798
+ throw new Error(
21799
+ `ColorFromColorspace: unsupported space "${spaceName}" on GPU target`
21800
+ );
21801
+ }
21802
+ },
21803
+ // ---------------------------------------------------------------------------
21804
+ // Color literals. Each typed head compiles to a canonical OKLCh vec3.
21805
+ // Alpha (4th argument) is dropped — GPU color values are vec3 only. Pass
21806
+ // alpha as a separate uniform if it's needed at the framebuffer boundary.
21807
+ // ---------------------------------------------------------------------------
21808
+ Color: ([s], _compile, target) => {
21809
+ if (s === null) throw new Error("Color: no argument");
21810
+ const str = readStringLiteral(s);
21811
+ if (str === null)
21812
+ throw new Error("Color: argument must be a string literal on GPU target");
21813
+ const packed = parseColor(str);
21814
+ if (packed === 0 && str.trim().toLowerCase() !== "transparent")
21815
+ throw new Error(`Color: invalid color string "${str}"`);
21816
+ const r = packed >>> 24 & 255;
21817
+ const g = packed >>> 16 & 255;
21818
+ const b = packed >>> 8 & 255;
21819
+ const oklch2 = rgbToOklch({ r, g, b });
21820
+ return `${gpuVec3(target)}(${formatFloat(oklch2.L)}, ${formatFloat(oklch2.C)}, ${formatFloat(oklch2.H)})`;
21821
+ },
21822
+ Rgb: (args, compile2, target) => {
21823
+ if (args.length < 3) throw new Error("Rgb: need 3 components");
21824
+ const v3 = gpuVec3(target);
21825
+ return `_gpu_srgb_to_oklch(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])}))`;
21826
+ },
21827
+ Hsv: (args, compile2, target) => {
21828
+ if (args.length < 3) throw new Error("Hsv: need 3 components");
21829
+ const v3 = gpuVec3(target);
21830
+ return `_gpu_srgb_to_oklch(_gpu_hsv_to_rgb(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})))`;
21831
+ },
21832
+ Hsl: (args, compile2, target) => {
21833
+ if (args.length < 3) throw new Error("Hsl: need 3 components");
21834
+ const v3 = gpuVec3(target);
21835
+ return `_gpu_srgb_to_oklch(_gpu_hsl_to_rgb(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})))`;
21836
+ },
21837
+ Oklab: (args, compile2, target) => {
21838
+ if (args.length < 3) throw new Error("Oklab: need 3 components");
21839
+ const v3 = gpuVec3(target);
21840
+ return `_gpu_oklab_to_oklch(${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])}))`;
21841
+ },
21842
+ Oklch: (args, compile2, target) => {
21843
+ if (args.length < 3) throw new Error("Oklch: need 3 components");
21844
+ const v3 = gpuVec3(target);
21845
+ return `${v3}(${compile2(args[0])}, ${compile2(args[1])}, ${compile2(args[2])})`;
21846
+ },
21847
+ // ---------------------------------------------------------------------------
21848
+ // As* operators. AsOklch is identity (canonical). The other As* return
21849
+ // components in the named space, equivalent to ColorToColorspace(c, 'x').
21850
+ // ---------------------------------------------------------------------------
21851
+ AsOklch: ([c], compile2) => {
21852
+ if (c === null) throw new Error("AsOklch: no argument");
21853
+ return compile2(c);
21854
+ },
21855
+ AsOklab: ([c], compile2) => {
21856
+ if (c === null) throw new Error("AsOklab: no argument");
21857
+ return `_gpu_oklch_to_oklab(${compile2(c)})`;
21858
+ },
21859
+ AsRgb: ([c], compile2) => {
21860
+ if (c === null) throw new Error("AsRgb: no argument");
21861
+ return `_gpu_oklch_to_srgb(${compile2(c)})`;
21862
+ },
21863
+ AsHsv: ([c], compile2) => {
21864
+ if (c === null) throw new Error("AsHsv: no argument");
21865
+ return `_gpu_rgb_to_hsv(_gpu_oklch_to_srgb(${compile2(c)}))`;
21866
+ },
21867
+ AsHsl: ([c], compile2) => {
21868
+ if (c === null) throw new Error("AsHsl: no argument");
21869
+ return `_gpu_rgb_to_hsl(_gpu_oklch_to_srgb(${compile2(c)}))`;
21432
21870
  },
21433
21871
  // Fractal functions
21434
21872
  Mandelbrot: ([c, maxIter], compile2, target) => {
@@ -22121,28 +22559,124 @@ vec3 _gpu_oklab_to_srgb(vec3 lab) {
22121
22559
 
22122
22560
  vec3 _gpu_oklab_to_oklch(vec3 lab) {
22123
22561
  float C = length(lab.yz);
22124
- float H = atan(lab.z, lab.y);
22562
+ float H = atan(lab.z, lab.y) * (180.0 / 3.14159265359);
22563
+ if (H < 0.0) H += 360.0;
22125
22564
  return vec3(lab.x, C, H);
22126
22565
  }
22127
22566
 
22128
22567
  vec3 _gpu_oklch_to_oklab(vec3 lch) {
22129
- return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));
22568
+ float h_rad = lch.z * (3.14159265359 / 180.0);
22569
+ return vec3(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));
22570
+ }
22571
+
22572
+ vec3 _gpu_srgb_to_oklch(vec3 rgb) {
22573
+ return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));
22574
+ }
22575
+
22576
+ vec3 _gpu_oklch_to_srgb(vec3 lch) {
22577
+ return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));
22578
+ }
22579
+
22580
+ // HSL conversion. Hue in degrees, saturation/lightness in 0-1.
22581
+ vec3 _gpu_hsl_to_rgb(vec3 hsl) {
22582
+ float h = hsl.x;
22583
+ float s = hsl.y;
22584
+ float l = hsl.z;
22585
+ float c = (1.0 - abs(2.0 * l - 1.0)) * s;
22586
+ float h6 = h / 60.0;
22587
+ float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));
22588
+ float r = 0.0;
22589
+ float g = 0.0;
22590
+ float b = 0.0;
22591
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22592
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22593
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22594
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22595
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22596
+ else { r = c; g = 0.0; b = x; }
22597
+ float m = l - c / 2.0;
22598
+ return vec3(r + m, g + m, b + m);
22599
+ }
22600
+
22601
+ vec3 _gpu_rgb_to_hsl(vec3 rgb) {
22602
+ float maxc = max(max(rgb.x, rgb.y), rgb.z);
22603
+ float minc = min(min(rgb.x, rgb.y), rgb.z);
22604
+ float l = (maxc + minc) / 2.0;
22605
+ float d = maxc - minc;
22606
+ if (d < 1e-6) return vec3(0.0, 0.0, l);
22607
+ float s = d / (1.0 - abs(2.0 * l - 1.0));
22608
+ float h;
22609
+ if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);
22610
+ else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;
22611
+ else h = (rgb.x - rgb.y) / d + 4.0;
22612
+ h *= 60.0;
22613
+ if (h < 0.0) h += 360.0;
22614
+ return vec3(h, s, l);
22615
+ }
22616
+
22617
+ // HSV conversion. Hue in degrees, saturation/value in 0-1.
22618
+ vec3 _gpu_hsv_to_rgb(vec3 hsv) {
22619
+ float h = hsv.x;
22620
+ float s = hsv.y;
22621
+ float v = hsv.z;
22622
+ float c = v * s;
22623
+ float h6 = h / 60.0;
22624
+ float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));
22625
+ float r = 0.0;
22626
+ float g = 0.0;
22627
+ float b = 0.0;
22628
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22629
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22630
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22631
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22632
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22633
+ else { r = c; g = 0.0; b = x; }
22634
+ float m = v - c;
22635
+ return vec3(r + m, g + m, b + m);
22636
+ }
22637
+
22638
+ vec3 _gpu_rgb_to_hsv(vec3 rgb) {
22639
+ float maxc = max(max(rgb.x, rgb.y), rgb.z);
22640
+ float minc = min(min(rgb.x, rgb.y), rgb.z);
22641
+ float v = maxc;
22642
+ float d = maxc - minc;
22643
+ if (d < 1e-6) return vec3(0.0, 0.0, v);
22644
+ float s = (maxc < 1e-6) ? 0.0 : d / maxc;
22645
+ float h;
22646
+ if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);
22647
+ else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;
22648
+ else h = (rgb.x - rgb.y) / d + 4.0;
22649
+ h *= 60.0;
22650
+ if (h < 0.0) h += 360.0;
22651
+ return vec3(h, s, v);
22130
22652
  }
22131
22653
 
22132
- vec3 _gpu_color_mix(vec3 rgb1, vec3 rgb2, float t) {
22133
- vec3 lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));
22134
- vec3 lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));
22654
+ vec3 _gpu_color_mix(vec3 lch1, vec3 lch2, float t) {
22135
22655
  float L = mix(lch1.x, lch2.x, t);
22136
22656
  float C = mix(lch1.y, lch2.y, t);
22137
- float dh = lch2.z - lch1.z;
22138
- const float PI = 3.14159265359;
22139
- if (dh > PI) dh -= 2.0 * PI;
22140
- if (dh < -PI) dh += 2.0 * PI;
22141
- float H = lch1.z + dh * t;
22142
- return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3(L, C, H)));
22657
+ bool a1 = lch1.y < 1e-6;
22658
+ bool a2 = lch2.y < 1e-6;
22659
+ float H;
22660
+ if (a1 && a2) {
22661
+ H = lch1.z;
22662
+ } else if (a1) {
22663
+ H = lch2.z;
22664
+ } else if (a2) {
22665
+ H = lch1.z;
22666
+ } else {
22667
+ float dh = lch2.z - lch1.z;
22668
+ if (dh > 180.0) dh -= 360.0;
22669
+ if (dh < -180.0) dh += 360.0;
22670
+ H = lch1.z + dh * t;
22671
+ if (H < 0.0) H += 360.0;
22672
+ if (H >= 360.0) H -= 360.0;
22673
+ }
22674
+ return vec3(L, C, H);
22143
22675
  }
22144
22676
 
22145
- float _gpu_apca(vec3 bg, vec3 fg) {
22677
+ float _gpu_apca(vec3 lch_bg, vec3 lch_fg) {
22678
+ vec3 bg = _gpu_oklch_to_srgb(lch_bg);
22679
+ vec3 fg = _gpu_oklch_to_srgb(lch_fg);
22146
22680
  float bgR = _gpu_srgb_to_linear(bg.x);
22147
22681
  float bgG = _gpu_srgb_to_linear(bg.y);
22148
22682
  float bgB = _gpu_srgb_to_linear(bg.z);
@@ -22153,9 +22687,7 @@ float _gpu_apca(vec3 bg, vec3 fg) {
22153
22687
  float fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;
22154
22688
  float bgC = pow(bgY, 0.56);
22155
22689
  float fgC = pow(fgY, 0.57);
22156
- float contrast = (bgC > fgC)
22157
- ? (bgC - fgC) * 1.14
22158
- : (bgC - fgC) * 1.14;
22690
+ float contrast = (bgC - fgC) * 1.14;
22159
22691
  return contrast * 100.0;
22160
22692
  }
22161
22693
  `;
@@ -22199,28 +22731,133 @@ fn _gpu_oklab_to_srgb(lab: vec3f) -> vec3f {
22199
22731
 
22200
22732
  fn _gpu_oklab_to_oklch(lab: vec3f) -> vec3f {
22201
22733
  let C = length(lab.yz);
22202
- let H = atan2(lab.z, lab.y);
22734
+ var H = atan2(lab.z, lab.y) * (180.0 / 3.14159265359);
22735
+ if (H < 0.0) { H = H + 360.0; }
22203
22736
  return vec3f(lab.x, C, H);
22204
22737
  }
22205
22738
 
22206
22739
  fn _gpu_oklch_to_oklab(lch: vec3f) -> vec3f {
22207
- return vec3f(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));
22740
+ let h_rad = lch.z * (3.14159265359 / 180.0);
22741
+ return vec3f(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));
22742
+ }
22743
+
22744
+ fn _gpu_srgb_to_oklch(rgb: vec3f) -> vec3f {
22745
+ return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));
22746
+ }
22747
+
22748
+ fn _gpu_oklch_to_srgb(lch: vec3f) -> vec3f {
22749
+ return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));
22750
+ }
22751
+
22752
+ fn _gpu_hsl_to_rgb(hsl: vec3f) -> vec3f {
22753
+ let h = hsl.x;
22754
+ let s = hsl.y;
22755
+ let l = hsl.z;
22756
+ let c = (1.0 - abs(2.0 * l - 1.0)) * s;
22757
+ let h6 = h / 60.0;
22758
+ let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));
22759
+ var r: f32 = 0.0;
22760
+ var g: f32 = 0.0;
22761
+ var b: f32 = 0.0;
22762
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22763
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22764
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22765
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22766
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22767
+ else { r = c; g = 0.0; b = x; }
22768
+ let m = l - c / 2.0;
22769
+ return vec3f(r + m, g + m, b + m);
22770
+ }
22771
+
22772
+ fn _gpu_rgb_to_hsl(rgb: vec3f) -> vec3f {
22773
+ let maxc = max(max(rgb.x, rgb.y), rgb.z);
22774
+ let minc = min(min(rgb.x, rgb.y), rgb.z);
22775
+ let l = (maxc + minc) / 2.0;
22776
+ let d = maxc - minc;
22777
+ if (d < 1e-6) { return vec3f(0.0, 0.0, l); }
22778
+ let s = d / (1.0 - abs(2.0 * l - 1.0));
22779
+ var h: f32;
22780
+ if (maxc == rgb.x) {
22781
+ let v = (rgb.y - rgb.z) / d;
22782
+ h = v - 6.0 * floor(v / 6.0);
22783
+ } else if (maxc == rgb.y) {
22784
+ h = (rgb.z - rgb.x) / d + 2.0;
22785
+ } else {
22786
+ h = (rgb.x - rgb.y) / d + 4.0;
22787
+ }
22788
+ h = h * 60.0;
22789
+ if (h < 0.0) { h = h + 360.0; }
22790
+ return vec3f(h, s, l);
22791
+ }
22792
+
22793
+ fn _gpu_hsv_to_rgb(hsv: vec3f) -> vec3f {
22794
+ let h = hsv.x;
22795
+ let s = hsv.y;
22796
+ let v = hsv.z;
22797
+ let c = v * s;
22798
+ let h6 = h / 60.0;
22799
+ let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));
22800
+ var r: f32 = 0.0;
22801
+ var g: f32 = 0.0;
22802
+ var b: f32 = 0.0;
22803
+ if (h6 < 1.0) { r = c; g = x; b = 0.0; }
22804
+ else if (h6 < 2.0) { r = x; g = c; b = 0.0; }
22805
+ else if (h6 < 3.0) { r = 0.0; g = c; b = x; }
22806
+ else if (h6 < 4.0) { r = 0.0; g = x; b = c; }
22807
+ else if (h6 < 5.0) { r = x; g = 0.0; b = c; }
22808
+ else { r = c; g = 0.0; b = x; }
22809
+ let m = v - c;
22810
+ return vec3f(r + m, g + m, b + m);
22811
+ }
22812
+
22813
+ fn _gpu_rgb_to_hsv(rgb: vec3f) -> vec3f {
22814
+ let maxc = max(max(rgb.x, rgb.y), rgb.z);
22815
+ let minc = min(min(rgb.x, rgb.y), rgb.z);
22816
+ let v = maxc;
22817
+ let d = maxc - minc;
22818
+ if (d < 1e-6) { return vec3f(0.0, 0.0, v); }
22819
+ var s: f32 = 0.0;
22820
+ if (maxc >= 1e-6) { s = d / maxc; }
22821
+ var h: f32;
22822
+ if (maxc == rgb.x) {
22823
+ let q = (rgb.y - rgb.z) / d;
22824
+ h = q - 6.0 * floor(q / 6.0);
22825
+ } else if (maxc == rgb.y) {
22826
+ h = (rgb.z - rgb.x) / d + 2.0;
22827
+ } else {
22828
+ h = (rgb.x - rgb.y) / d + 4.0;
22829
+ }
22830
+ h = h * 60.0;
22831
+ if (h < 0.0) { h = h + 360.0; }
22832
+ return vec3f(h, s, v);
22208
22833
  }
22209
22834
 
22210
- fn _gpu_color_mix(rgb1: vec3f, rgb2: vec3f, t: f32) -> vec3f {
22211
- let lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));
22212
- let lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));
22835
+ fn _gpu_color_mix(lch1: vec3f, lch2: vec3f, t: f32) -> vec3f {
22213
22836
  let L = mix(lch1.x, lch2.x, t);
22214
22837
  let C = mix(lch1.y, lch2.y, t);
22215
- let PI = 3.14159265359;
22216
- var dh = lch2.z - lch1.z;
22217
- if (dh > PI) { dh -= 2.0 * PI; }
22218
- if (dh < -PI) { dh += 2.0 * PI; }
22219
- let H = lch1.z + dh * t;
22220
- return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3f(L, C, H)));
22838
+ let a1 = lch1.y < 1e-6;
22839
+ let a2 = lch2.y < 1e-6;
22840
+ var H: f32;
22841
+ if (a1 && a2) {
22842
+ H = lch1.z;
22843
+ } else if (a1) {
22844
+ H = lch2.z;
22845
+ } else if (a2) {
22846
+ H = lch1.z;
22847
+ } else {
22848
+ var dh = lch2.z - lch1.z;
22849
+ if (dh > 180.0) { dh = dh - 360.0; }
22850
+ if (dh < -180.0) { dh = dh + 360.0; }
22851
+ H = lch1.z + dh * t;
22852
+ if (H < 0.0) { H = H + 360.0; }
22853
+ if (H >= 360.0) { H = H - 360.0; }
22854
+ }
22855
+ return vec3f(L, C, H);
22221
22856
  }
22222
22857
 
22223
- fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
22858
+ fn _gpu_apca(lch_bg: vec3f, lch_fg: vec3f) -> f32 {
22859
+ let bg = _gpu_oklch_to_srgb(lch_bg);
22860
+ let fg = _gpu_oklch_to_srgb(lch_fg);
22224
22861
  let bgR = _gpu_srgb_to_linear(bg.x);
22225
22862
  let bgG = _gpu_srgb_to_linear(bg.y);
22226
22863
  let bgB = _gpu_srgb_to_linear(bg.z);
@@ -22508,7 +23145,7 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
22508
23145
  if (stmts.length === 0) return "";
22509
23146
  const last = stmts.length - 1;
22510
23147
  stmts[last] = `return ${stmts[last]}`;
22511
- return stmts.join(";\n");
23148
+ return stmts.join(";\n") + ";";
22512
23149
  },
22513
23150
  ...options
22514
23151
  };
@@ -22607,7 +23244,7 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
22607
23244
  if (body.includes("\n")) {
22608
23245
  const indented = body.split("\n").map((l) => ` ${l}`).join("\n");
22609
23246
  return `${returnType} ${functionName}(${params}) {
22610
- ${indented};
23247
+ ${indented}
22611
23248
  }`;
22612
23249
  }
22613
23250
  return `${returnType} ${functionName}(${params}) {
@@ -22718,7 +23355,7 @@ ${indented};
22718
23355
  return `fn ${functionName}(${params}) -> ${toWGSLType(
22719
23356
  returnType
22720
23357
  )} {
22721
- ${indented};
23358
+ ${indented}
22722
23359
  }`;
22723
23360
  }
22724
23361
  return `fn ${functionName}(${params}) -> ${toWGSLType(returnType)} {
@@ -24897,7 +25534,7 @@ ${code}`;
24897
25534
  }
24898
25535
 
24899
25536
  // src/compile.ts
24900
- var version = "0.55.6";
25537
+ var version = "0.56.0";
24901
25538
  return __toCommonJS(compile_exports);
24902
25539
  })();
24903
25540
  /*! Bundled license information: