@ansh-ui/core 0.2.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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/dist/behaviours.cjs +64 -0
  3. package/dist/behaviours.cjs.map +1 -0
  4. package/dist/behaviours.d.cts +3 -0
  5. package/dist/behaviours.d.ts +3 -0
  6. package/dist/behaviours.js +7 -0
  7. package/dist/behaviours.js.map +1 -0
  8. package/dist/chunk-23GSSIMK.cjs +439 -0
  9. package/dist/chunk-23GSSIMK.cjs.map +1 -0
  10. package/dist/chunk-56NNBIAO.js +2446 -0
  11. package/dist/chunk-56NNBIAO.js.map +1 -0
  12. package/dist/chunk-6PFYGJWD.cjs +136 -0
  13. package/dist/chunk-6PFYGJWD.cjs.map +1 -0
  14. package/dist/chunk-7MEIXWPH.js +313 -0
  15. package/dist/chunk-7MEIXWPH.js.map +1 -0
  16. package/dist/chunk-7MYTSAPR.js +83 -0
  17. package/dist/chunk-7MYTSAPR.js.map +1 -0
  18. package/dist/chunk-BOQQHICI.js +1036 -0
  19. package/dist/chunk-BOQQHICI.js.map +1 -0
  20. package/dist/chunk-C6XPQO2O.js +1170 -0
  21. package/dist/chunk-C6XPQO2O.js.map +1 -0
  22. package/dist/chunk-DXJ63QAR.cjs +723 -0
  23. package/dist/chunk-DXJ63QAR.cjs.map +1 -0
  24. package/dist/chunk-FAVIEION.js +705 -0
  25. package/dist/chunk-FAVIEION.js.map +1 -0
  26. package/dist/chunk-FNR35HTL.cjs +107 -0
  27. package/dist/chunk-FNR35HTL.cjs.map +1 -0
  28. package/dist/chunk-GHBRGMSO.cjs +91 -0
  29. package/dist/chunk-GHBRGMSO.cjs.map +1 -0
  30. package/dist/chunk-GJRIHN76.cjs +359 -0
  31. package/dist/chunk-GJRIHN76.cjs.map +1 -0
  32. package/dist/chunk-ILKUL7GD.cjs +115 -0
  33. package/dist/chunk-ILKUL7GD.cjs.map +1 -0
  34. package/dist/chunk-KTUBCQC3.js +409 -0
  35. package/dist/chunk-KTUBCQC3.js.map +1 -0
  36. package/dist/chunk-KU2C6GEA.js +90 -0
  37. package/dist/chunk-KU2C6GEA.js.map +1 -0
  38. package/dist/chunk-LGA3N3YJ.cjs +413 -0
  39. package/dist/chunk-LGA3N3YJ.cjs.map +1 -0
  40. package/dist/chunk-MMO7KO53.cjs +1060 -0
  41. package/dist/chunk-MMO7KO53.cjs.map +1 -0
  42. package/dist/chunk-NSXKCJJ7.js +109 -0
  43. package/dist/chunk-NSXKCJJ7.js.map +1 -0
  44. package/dist/chunk-QALZKHWH.js +387 -0
  45. package/dist/chunk-QALZKHWH.js.map +1 -0
  46. package/dist/chunk-R7UJ7MWP.cjs +2479 -0
  47. package/dist/chunk-R7UJ7MWP.cjs.map +1 -0
  48. package/dist/chunk-UJBXY6QC.cjs +1186 -0
  49. package/dist/chunk-UJBXY6QC.cjs.map +1 -0
  50. package/dist/chunk-YFQXRC5R.js +99 -0
  51. package/dist/chunk-YFQXRC5R.js.map +1 -0
  52. package/dist/color.cjs +257 -0
  53. package/dist/color.cjs.map +1 -0
  54. package/dist/color.d.cts +303 -0
  55. package/dist/color.d.ts +303 -0
  56. package/dist/color.js +8 -0
  57. package/dist/color.js.map +1 -0
  58. package/dist/easing.cjs +189 -0
  59. package/dist/easing.cjs.map +1 -0
  60. package/dist/easing.d.cts +134 -0
  61. package/dist/easing.d.ts +134 -0
  62. package/dist/easing.js +4 -0
  63. package/dist/easing.js.map +1 -0
  64. package/dist/effects.cjs +99 -0
  65. package/dist/effects.cjs.map +1 -0
  66. package/dist/effects.d.cts +5 -0
  67. package/dist/effects.d.ts +5 -0
  68. package/dist/effects.js +10 -0
  69. package/dist/effects.js.map +1 -0
  70. package/dist/index-CCdpefMp.d.ts +967 -0
  71. package/dist/index-CQEEPu-D.d.ts +435 -0
  72. package/dist/index-DHOfsEIn.d.cts +967 -0
  73. package/dist/index-Dl8GCsya.d.cts +435 -0
  74. package/dist/index.cjs +2206 -0
  75. package/dist/index.cjs.map +1 -0
  76. package/dist/index.d.cts +1122 -0
  77. package/dist/index.d.ts +1122 -0
  78. package/dist/index.js +1182 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/math.cjs +238 -0
  81. package/dist/math.cjs.map +1 -0
  82. package/dist/math.d.cts +120 -0
  83. package/dist/math.d.ts +120 -0
  84. package/dist/math.js +5 -0
  85. package/dist/math.js.map +1 -0
  86. package/dist/noise.cjs +78 -0
  87. package/dist/noise.cjs.map +1 -0
  88. package/dist/noise.d.cts +190 -0
  89. package/dist/noise.d.ts +190 -0
  90. package/dist/noise.js +5 -0
  91. package/dist/noise.js.map +1 -0
  92. package/dist/palette-6HkVltYU.d.cts +219 -0
  93. package/dist/palette-6HkVltYU.d.ts +219 -0
  94. package/dist/random--4mSc5Lp.d.cts +75 -0
  95. package/dist/random--4mSc5Lp.d.ts +75 -0
  96. package/dist/reduced-motion-D0LUgZle.d.cts +120 -0
  97. package/dist/reduced-motion-D0LUgZle.d.ts +120 -0
  98. package/dist/types-B1FLLf3-.d.cts +21 -0
  99. package/dist/types-B1FLLf3-.d.ts +21 -0
  100. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/noise/tables.ts","../src/noise/perlin.ts","../src/noise/simplex.ts","../src/noise/fractal.ts","../src/noise/index.ts"],"names":[],"mappings":";;;;AAcO,IAAM,KAAA,GAAQ,IAAI,YAAA,CAAa;AAAA,EACpC,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAChG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI;AACnB,CAAC;AAGM,IAAM,KAAA,GAAQ,IAAI,YAAA,CAAa;AAAA,EACpC,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAC7F,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAC/F,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAC9F,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,CAAA;AAAA,EAC/F,EAAA;AAAA,EAAI,CAAA;AAA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","file":"chunk-FAVIEION.js","sourcesContent":["import { createRng } from '../math/random'\n\n/**\n * Gradient tables and permutation setup shared by every noise variant.\n *\n * The permutation table is a shuffled `0..255` sequence duplicated to 512 entries. Doubling\n * it lets the noise functions index `perm[i + perm[j]]` without a modulo on every lookup,\n * which matters when these run millions of times per second.\n *\n * The table is derived from the effect's seed, so noise fields are reproducible — the same\n * seed always produces the same landscape.\n */\n\n/** 12 edge-midpoint gradients of a cube. Used by 2D and 3D noise. */\nexport const GRAD3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0, 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1, 0, 1, 1, 0, -1, 1,\n 0, 1, -1, 0, -1, -1,\n])\n\n/** 32 gradients for 4D noise — the edge midpoints of a hypercube. */\nexport const GRAD4 = new Float32Array([\n 0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0,\n -1, -1, -1, 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 0, 1, 1, -1, 0, 1, -1, -1, 0,\n -1, 1, -1, 0, -1, -1, 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, -1, 1, 0, 1, -1, 1, 0,\n -1, -1, -1, 0, 1, -1, -1, 0, -1, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0,\n -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0,\n])\n\nexport interface NoiseTables {\n /** 512-entry doubled permutation table. */\n readonly perm: Uint8Array\n /** `perm[i] % 12`, precomputed — saves a modulo in the inner loop of 2D/3D noise. */\n readonly permMod12: Uint8Array\n /** `perm[i] % 32`, precomputed for 4D noise. */\n readonly permMod32: Uint8Array\n}\n\nconst tableCache = new Map<number, NoiseTables>()\nconst MAX_CACHED_TABLES = 32\n\n/**\n * Build (or reuse) permutation tables for a seed.\n *\n * Tables are 1.5 KB each and construction costs a shuffle, so we memoise them. The cache is\n * bounded because a page that animates its seed would otherwise grow it without limit; we\n * evict oldest-first, which suits the access pattern (a handful of stable seeds per page).\n */\nexport function createNoiseTables(seed = 0): NoiseTables {\n const key = seed >>> 0\n const cached = tableCache.get(key)\n if (cached) return cached\n\n const rng = createRng(key)\n const source = new Uint8Array(256)\n for (let i = 0; i < 256; i++) source[i] = i\n\n // Fisher–Yates over the base table.\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(rng.next() * (i + 1))\n const tmp = source[i]\n source[i] = source[j]\n source[j] = tmp\n }\n\n const perm = new Uint8Array(512)\n const permMod12 = new Uint8Array(512)\n const permMod32 = new Uint8Array(512)\n for (let i = 0; i < 512; i++) {\n const value = source[i & 255]\n perm[i] = value\n permMod12[i] = value % 12\n permMod32[i] = value % 32\n }\n\n const tables: NoiseTables = { perm, permMod12, permMod32 }\n\n if (tableCache.size >= MAX_CACHED_TABLES) {\n const oldest = tableCache.keys().next()\n if (!oldest.done) tableCache.delete(oldest.value)\n }\n tableCache.set(key, tables)\n return tables\n}\n\n/** Clear the memoised permutation tables. Exposed for tests and long-lived workers. */\nexport function clearNoiseTableCache(): void {\n tableCache.clear()\n}\n","import { createNoiseTables } from './tables'\n\n/**\n * Classic Perlin gradient noise (1985 formulation with the 2002 quintic fade).\n *\n * Simplex noise is usually the better choice, but Perlin is kept for two reasons:\n * it is what most reference material and shader ports assume, and its axis-aligned\n * structure is occasionally *desirable* — woodgrain and brushed-metal looks depend on it.\n *\n * Returns values in approximately `[-1, 1]`.\n */\n\n/** Quintic fade: 6t⁵ − 15t⁴ + 10t³. Zero first and second derivative at both ends. */\nfunction fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10)\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + t * (b - a)\n}\n\n/** Dot product of a hash-selected 2D gradient with the offset vector. */\nfunction grad2(hash: number, x: number, y: number): number {\n switch (hash & 7) {\n case 0:\n return x + y\n case 1:\n return -x + y\n case 2:\n return x - y\n case 3:\n return -x - y\n case 4:\n return x\n case 5:\n return -x\n case 6:\n return y\n default:\n return -y\n }\n}\n\nfunction grad3(hash: number, x: number, y: number, z: number): number {\n const h = hash & 15\n const u = h < 8 ? x : y\n const v = h < 4 ? y : h === 12 || h === 14 ? x : z\n return (h & 1 ? -u : u) + (h & 2 ? -v : v)\n}\n\nexport interface PerlinNoise {\n noise2D(x: number, y: number): number\n noise3D(x: number, y: number, z: number): number\n}\n\nexport function createPerlinNoise(seed = 0): PerlinNoise {\n const { perm } = createNoiseTables(seed)\n\n function noise2D(x: number, y: number): number {\n const xi = Math.floor(x) & 255\n const yi = Math.floor(y) & 255\n const xf = x - Math.floor(x)\n const yf = y - Math.floor(y)\n\n const u = fade(xf)\n const v = fade(yf)\n\n const aa = perm[perm[xi] + yi]\n const ab = perm[perm[xi] + yi + 1]\n const ba = perm[perm[xi + 1] + yi]\n const bb = perm[perm[xi + 1] + yi + 1]\n\n const x1 = lerp(grad2(aa, xf, yf), grad2(ba, xf - 1, yf), u)\n const x2 = lerp(grad2(ab, xf, yf - 1), grad2(bb, xf - 1, yf - 1), u)\n\n // Gradients reach ±√2 in 2D; normalise so the output sits in [-1, 1].\n return lerp(x1, x2, v) * 0.7071067811865475\n }\n\n function noise3D(x: number, y: number, z: number): number {\n const xi = Math.floor(x) & 255\n const yi = Math.floor(y) & 255\n const zi = Math.floor(z) & 255\n const xf = x - Math.floor(x)\n const yf = y - Math.floor(y)\n const zf = z - Math.floor(z)\n\n const u = fade(xf)\n const v = fade(yf)\n const w = fade(zf)\n\n const a = perm[xi] + yi\n const aa = perm[a] + zi\n const ab = perm[a + 1] + zi\n const b = perm[xi + 1] + yi\n const ba = perm[b] + zi\n const bb = perm[b + 1] + zi\n\n const x1 = lerp(grad3(perm[aa], xf, yf, zf), grad3(perm[ba], xf - 1, yf, zf), u)\n const x2 = lerp(grad3(perm[ab], xf, yf - 1, zf), grad3(perm[bb], xf - 1, yf - 1, zf), u)\n const y1 = lerp(x1, x2, v)\n\n const x3 = lerp(grad3(perm[aa + 1], xf, yf, zf - 1), grad3(perm[ba + 1], xf - 1, yf, zf - 1), u)\n const x4 = lerp(\n grad3(perm[ab + 1], xf, yf - 1, zf - 1),\n grad3(perm[bb + 1], xf - 1, yf - 1, zf - 1),\n u,\n )\n const y2 = lerp(x3, x4, v)\n\n return lerp(y1, y2, w)\n }\n\n return { noise2D, noise3D }\n}\n\n/**\n * Value noise: interpolates hashed *values* at lattice points rather than gradients.\n *\n * Cheaper than gradient noise and blockier in character. Good for film grain, dithering and\n * any place you want visible cell structure rather than smooth flow.\n */\nexport function createValueNoise(seed = 0) {\n const { perm } = createNoiseTables(seed)\n\n const valueAt = (x: number, y: number): number => (perm[perm[x & 255] + (y & 255)] / 255) * 2 - 1\n\n return {\n noise2D(x: number, y: number): number {\n const xi = Math.floor(x)\n const yi = Math.floor(y)\n const u = fade(x - xi)\n const v = fade(y - yi)\n const x1 = lerp(valueAt(xi, yi), valueAt(xi + 1, yi), u)\n const x2 = lerp(valueAt(xi, yi + 1), valueAt(xi + 1, yi + 1), u)\n return lerp(x1, x2, v)\n },\n }\n}\n","import { GRAD3, GRAD4, createNoiseTables } from './tables'\n\n/**\n * Simplex noise (Ken Perlin, 2001).\n *\n * Preferred over classic Perlin noise for anything with visible structure: it has no\n * directional artefacts along the axes, lower computational complexity in higher dimensions\n * (O(n²) rather than O(2ⁿ)), and a well-defined continuous gradient.\n *\n * All functions return values in approximately `[-1, 1]`. The scaling constants (70, 32, 27)\n * are the empirically derived normalisers for each dimensionality.\n */\n\n// Skew/unskew factors that map the square/cube/hypercube grid onto a simplex grid.\nconst F2 = 0.5 * (Math.sqrt(3) - 1)\nconst G2 = (3 - Math.sqrt(3)) / 6\nconst F3 = 1 / 3\nconst G3 = 1 / 6\nconst F4 = (Math.sqrt(5) - 1) / 4\nconst G4 = (5 - Math.sqrt(5)) / 20\n\nexport interface SimplexNoise {\n noise2D(x: number, y: number): number\n noise3D(x: number, y: number, z: number): number\n noise4D(x: number, y: number, z: number, w: number): number\n}\n\nexport function createSimplexNoise(seed = 0): SimplexNoise {\n const { perm, permMod12, permMod32 } = createNoiseTables(seed)\n\n function noise2D(x: number, y: number): number {\n // Skew the input space to determine which simplex cell we're in.\n const s = (x + y) * F2\n const i = Math.floor(x + s)\n const j = Math.floor(y + s)\n const t = (i + j) * G2\n\n // Unskew the cell origin back to (x, y) space and find the distance from it.\n const x0 = x - (i - t)\n const y0 = y - (j - t)\n\n // A 2D simplex is a triangle: determine which of the two we're in.\n const i1 = x0 > y0 ? 1 : 0\n const j1 = x0 > y0 ? 0 : 1\n\n const x1 = x0 - i1 + G2\n const y1 = y0 - j1 + G2\n const x2 = x0 - 1 + 2 * G2\n const y2 = y0 - 1 + 2 * G2\n\n const ii = i & 255\n const jj = j & 255\n\n let n0 = 0\n let n1 = 0\n let n2 = 0\n\n let t0 = 0.5 - x0 * x0 - y0 * y0\n if (t0 >= 0) {\n const gi0 = permMod12[ii + perm[jj]] * 3\n t0 *= t0\n n0 = t0 * t0 * (GRAD3[gi0] * x0 + GRAD3[gi0 + 1] * y0)\n }\n\n let t1 = 0.5 - x1 * x1 - y1 * y1\n if (t1 >= 0) {\n const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3\n t1 *= t1\n n1 = t1 * t1 * (GRAD3[gi1] * x1 + GRAD3[gi1 + 1] * y1)\n }\n\n let t2 = 0.5 - x2 * x2 - y2 * y2\n if (t2 >= 0) {\n const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3\n t2 *= t2\n n2 = t2 * t2 * (GRAD3[gi2] * x2 + GRAD3[gi2 + 1] * y2)\n }\n\n return 70 * (n0 + n1 + n2)\n }\n\n function noise3D(x: number, y: number, z: number): number {\n const s = (x + y + z) * F3\n const i = Math.floor(x + s)\n const j = Math.floor(y + s)\n const k = Math.floor(z + s)\n const t = (i + j + k) * G3\n\n const x0 = x - (i - t)\n const y0 = y - (j - t)\n const z0 = z - (k - t)\n\n // A 3D simplex is a tetrahedron; rank the coordinates to pick which of the six.\n let i1: number, j1: number, k1: number\n let i2: number, j2: number, k2: number\n\n if (x0 >= y0) {\n if (y0 >= z0) {\n i1 = 1\n j1 = 0\n k1 = 0\n i2 = 1\n j2 = 1\n k2 = 0\n } else if (x0 >= z0) {\n i1 = 1\n j1 = 0\n k1 = 0\n i2 = 1\n j2 = 0\n k2 = 1\n } else {\n i1 = 0\n j1 = 0\n k1 = 1\n i2 = 1\n j2 = 0\n k2 = 1\n }\n } else {\n if (y0 < z0) {\n i1 = 0\n j1 = 0\n k1 = 1\n i2 = 0\n j2 = 1\n k2 = 1\n } else if (x0 < z0) {\n i1 = 0\n j1 = 1\n k1 = 0\n i2 = 0\n j2 = 1\n k2 = 1\n } else {\n i1 = 0\n j1 = 1\n k1 = 0\n i2 = 1\n j2 = 1\n k2 = 0\n }\n }\n\n const x1 = x0 - i1 + G3\n const y1 = y0 - j1 + G3\n const z1 = z0 - k1 + G3\n const x2 = x0 - i2 + 2 * G3\n const y2 = y0 - j2 + 2 * G3\n const z2 = z0 - k2 + 2 * G3\n const x3 = x0 - 1 + 3 * G3\n const y3 = y0 - 1 + 3 * G3\n const z3 = z0 - 1 + 3 * G3\n\n const ii = i & 255\n const jj = j & 255\n const kk = k & 255\n\n let n0 = 0\n let n1 = 0\n let n2 = 0\n let n3 = 0\n\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0\n if (t0 >= 0) {\n const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3\n t0 *= t0\n n0 = t0 * t0 * (GRAD3[gi0] * x0 + GRAD3[gi0 + 1] * y0 + GRAD3[gi0 + 2] * z0)\n }\n\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1\n if (t1 >= 0) {\n const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3\n t1 *= t1\n n1 = t1 * t1 * (GRAD3[gi1] * x1 + GRAD3[gi1 + 1] * y1 + GRAD3[gi1 + 2] * z1)\n }\n\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2\n if (t2 >= 0) {\n const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3\n t2 *= t2\n n2 = t2 * t2 * (GRAD3[gi2] * x2 + GRAD3[gi2 + 1] * y2 + GRAD3[gi2 + 2] * z2)\n }\n\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3\n if (t3 >= 0) {\n const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3\n t3 *= t3\n n3 = t3 * t3 * (GRAD3[gi3] * x3 + GRAD3[gi3 + 1] * y3 + GRAD3[gi3 + 2] * z3)\n }\n\n return 32 * (n0 + n1 + n2 + n3)\n }\n\n function noise4D(x: number, y: number, z: number, w: number): number {\n const s = (x + y + z + w) * F4\n const i = Math.floor(x + s)\n const j = Math.floor(y + s)\n const k = Math.floor(z + s)\n const l = Math.floor(w + s)\n const t = (i + j + k + l) * G4\n\n const x0 = x - (i - t)\n const y0 = y - (j - t)\n const z0 = z - (k - t)\n const w0 = w - (l - t)\n\n // Rank the four coordinates by magnitude; the ranking directly gives the simplex corners.\n let rankx = 0\n let ranky = 0\n let rankz = 0\n let rankw = 0\n if (x0 > y0) rankx++\n else ranky++\n if (x0 > z0) rankx++\n else rankz++\n if (x0 > w0) rankx++\n else rankw++\n if (y0 > z0) ranky++\n else rankz++\n if (y0 > w0) ranky++\n else rankw++\n if (z0 > w0) rankz++\n else rankw++\n\n const i1 = rankx >= 3 ? 1 : 0\n const j1 = ranky >= 3 ? 1 : 0\n const k1 = rankz >= 3 ? 1 : 0\n const l1 = rankw >= 3 ? 1 : 0\n const i2 = rankx >= 2 ? 1 : 0\n const j2 = ranky >= 2 ? 1 : 0\n const k2 = rankz >= 2 ? 1 : 0\n const l2 = rankw >= 2 ? 1 : 0\n const i3 = rankx >= 1 ? 1 : 0\n const j3 = ranky >= 1 ? 1 : 0\n const k3 = rankz >= 1 ? 1 : 0\n const l3 = rankw >= 1 ? 1 : 0\n\n const x1 = x0 - i1 + G4\n const y1 = y0 - j1 + G4\n const z1 = z0 - k1 + G4\n const w1 = w0 - l1 + G4\n const x2 = x0 - i2 + 2 * G4\n const y2 = y0 - j2 + 2 * G4\n const z2 = z0 - k2 + 2 * G4\n const w2 = w0 - l2 + 2 * G4\n const x3 = x0 - i3 + 3 * G4\n const y3 = y0 - j3 + 3 * G4\n const z3 = z0 - k3 + 3 * G4\n const w3 = w0 - l3 + 3 * G4\n const x4 = x0 - 1 + 4 * G4\n const y4 = y0 - 1 + 4 * G4\n const z4 = z0 - 1 + 4 * G4\n const w4 = w0 - 1 + 4 * G4\n\n const ii = i & 255\n const jj = j & 255\n const kk = k & 255\n const ll = l & 255\n\n let n = 0\n\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0\n if (t0 >= 0) {\n const gi = permMod32[ii + perm[jj + perm[kk + perm[ll]]]] * 4\n t0 *= t0\n n += t0 * t0 * (GRAD4[gi] * x0 + GRAD4[gi + 1] * y0 + GRAD4[gi + 2] * z0 + GRAD4[gi + 3] * w0)\n }\n\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1\n if (t1 >= 0) {\n const gi = permMod32[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] * 4\n t1 *= t1\n n += t1 * t1 * (GRAD4[gi] * x1 + GRAD4[gi + 1] * y1 + GRAD4[gi + 2] * z1 + GRAD4[gi + 3] * w1)\n }\n\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2\n if (t2 >= 0) {\n const gi = permMod32[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] * 4\n t2 *= t2\n n += t2 * t2 * (GRAD4[gi] * x2 + GRAD4[gi + 1] * y2 + GRAD4[gi + 2] * z2 + GRAD4[gi + 3] * w2)\n }\n\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3\n if (t3 >= 0) {\n const gi = permMod32[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] * 4\n t3 *= t3\n n += t3 * t3 * (GRAD4[gi] * x3 + GRAD4[gi + 1] * y3 + GRAD4[gi + 2] * z3 + GRAD4[gi + 3] * w3)\n }\n\n let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4\n if (t4 >= 0) {\n const gi = permMod32[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] * 4\n t4 *= t4\n n += t4 * t4 * (GRAD4[gi] * x4 + GRAD4[gi + 1] * y4 + GRAD4[gi + 2] * z4 + GRAD4[gi + 3] * w4)\n }\n\n return 27 * n\n }\n\n return { noise2D, noise3D, noise4D }\n}\n","import { clamp } from '../math/scalar'\n\n/**\n * Fractal composition of a base noise function.\n *\n * A single octave of simplex noise is smooth and featureless. Real natural texture comes from\n * summing octaves at increasing frequency and decreasing amplitude — fractional Brownian\n * motion. This module provides the standard family of summations, all parameterised so that\n * no frequency, amplitude, or octave count is hardcoded inside an effect.\n */\n\nexport type Noise2DFn = (x: number, y: number) => number\nexport type Noise3DFn = (x: number, y: number, z: number) => number\n\nexport interface FractalOptions {\n /**\n * Number of summed layers. Each octave roughly doubles the cost, and beyond ~6 the added\n * detail is below a pixel for typical scales. Default `4`.\n */\n octaves?: number\n /** Frequency multiplier per octave. `2` is the classic choice. Default `2`. */\n lacunarity?: number\n /**\n * Amplitude multiplier per octave. Also called persistence. `0.5` gives the pink-noise\n * falloff that reads as natural. Default `0.5`.\n */\n gain?: number\n /** Frequency of the first octave. Default `1`. */\n frequency?: number\n /** Amplitude of the first octave. Default `1`. */\n amplitude?: number\n /**\n * Normalise the result back into `[-1, 1]` by dividing by the total amplitude.\n * Without this, more octaves means a quieter signal. Default `true`.\n */\n normalize?: boolean\n}\n\nexport const FRACTAL_DEFAULTS = {\n octaves: 4,\n lacunarity: 2,\n gain: 0.5,\n frequency: 1,\n amplitude: 1,\n normalize: true,\n} as const\n\nfunction resolve(options: FractalOptions | undefined) {\n return {\n octaves: Math.max(1, Math.floor(options?.octaves ?? FRACTAL_DEFAULTS.octaves)),\n lacunarity: options?.lacunarity ?? FRACTAL_DEFAULTS.lacunarity,\n gain: options?.gain ?? FRACTAL_DEFAULTS.gain,\n frequency: options?.frequency ?? FRACTAL_DEFAULTS.frequency,\n amplitude: options?.amplitude ?? FRACTAL_DEFAULTS.amplitude,\n normalize: options?.normalize ?? FRACTAL_DEFAULTS.normalize,\n }\n}\n\n/** Standard fBm over a 2D noise source. Output in `[-1, 1]` when normalised. */\nexport function fbm2D(noise: Noise2DFn, options?: FractalOptions): Noise2DFn {\n const { octaves, lacunarity, gain, frequency, amplitude, normalize } = resolve(options)\n return (x, y) => {\n let sum = 0\n let amp = amplitude\n let freq = frequency\n let total = 0\n for (let i = 0; i < octaves; i++) {\n sum += noise(x * freq, y * freq) * amp\n total += amp\n amp *= gain\n freq *= lacunarity\n }\n return normalize && total > 0 ? sum / total : sum\n }\n}\n\n/** Standard fBm over a 3D noise source — use the third axis as time for animated fields. */\nexport function fbm3D(noise: Noise3DFn, options?: FractalOptions): Noise3DFn {\n const { octaves, lacunarity, gain, frequency, amplitude, normalize } = resolve(options)\n return (x, y, z) => {\n let sum = 0\n let amp = amplitude\n let freq = frequency\n let total = 0\n for (let i = 0; i < octaves; i++) {\n sum += noise(x * freq, y * freq, z * freq) * amp\n total += amp\n amp *= gain\n freq *= lacunarity\n }\n return normalize && total > 0 ? sum / total : sum\n }\n}\n\n/**\n * Ridged multifractal. Inverts and sharpens each octave (`1 - |n|`, squared), producing crisp\n * ridge lines instead of rolling hills. This is what makes convincing mountain silhouettes,\n * lightning, and the filament structure in aurora curtains.\n *\n * Output is in `[0, 1]`.\n */\nexport function ridged2D(noise: Noise2DFn, options?: FractalOptions): Noise2DFn {\n const { octaves, lacunarity, gain, frequency, amplitude } = resolve(options)\n return (x, y) => {\n let sum = 0\n let amp = amplitude\n let freq = frequency\n let total = 0\n for (let i = 0; i < octaves; i++) {\n const n = 1 - Math.abs(noise(x * freq, y * freq))\n sum += n * n * amp\n total += amp\n amp *= gain\n freq *= lacunarity\n }\n return total > 0 ? clamp(sum / total, 0, 1) : 0\n }\n}\n\n/**\n * Turbulence: fBm over the absolute value of each octave. Produces the billowing,\n * smoke-like structure used for clouds and flame.\n *\n * Output is in `[0, 1]`.\n */\nexport function turbulence2D(noise: Noise2DFn, options?: FractalOptions): Noise2DFn {\n const { octaves, lacunarity, gain, frequency, amplitude } = resolve(options)\n return (x, y) => {\n let sum = 0\n let amp = amplitude\n let freq = frequency\n let total = 0\n for (let i = 0; i < octaves; i++) {\n sum += Math.abs(noise(x * freq, y * freq)) * amp\n total += amp\n amp *= gain\n freq *= lacunarity\n }\n return total > 0 ? clamp(sum / total, 0, 1) : 0\n }\n}\n\n/**\n * Domain warping — feed noise through itself.\n *\n * `warp(p) = noise(p + strength * noise(p))`. This single trick is responsible for most of\n * the \"organic liquid\" look in modern generative backgrounds: it turns the isotropic blobs of\n * plain fBm into flowing, marbled filaments.\n *\n * @param strength How far the domain is displaced, in noise-space units. `0.5`–`2` is useful.\n */\nexport function warp2D(noise: Noise2DFn, strength = 1, offset = 5.2): Noise2DFn {\n return (x, y) => {\n const qx = noise(x, y)\n const qy = noise(x + offset, y + offset * 0.7)\n return noise(x + strength * qx, y + strength * qy)\n }\n}\n\nexport interface CurlResult {\n x: number\n y: number\n}\n\n/**\n * Curl (divergence-free) noise for 2D flow fields.\n *\n * A particle advected by raw noise will pool in sinks and thin out in sources, because the\n * field has non-zero divergence. Taking the perpendicular gradient of a scalar potential —\n * `(∂N/∂y, −∂N/∂x)` — yields a field with zero divergence, so particle density is preserved\n * and the motion looks like real fluid.\n *\n * The derivative is a central difference; `epsilon` trades accuracy against smoothness.\n */\nexport function curl2D(noise: Noise2DFn, epsilon = 0.0001): (x: number, y: number) => CurlResult {\n const inv = 1 / (2 * epsilon)\n return (x, y) => {\n const dNdy = (noise(x, y + epsilon) - noise(x, y - epsilon)) * inv\n const dNdx = (noise(x + epsilon, y) - noise(x - epsilon, y)) * inv\n return { x: dNdy, y: -dNdx }\n }\n}\n\n/** The 3D-source variant of {@link curl2D}, letting you animate the field over time. */\nexport function curl2DAnimated(\n noise: Noise3DFn,\n epsilon = 0.0001,\n): (x: number, y: number, t: number) => CurlResult {\n const inv = 1 / (2 * epsilon)\n return (x, y, t) => {\n const dNdy = (noise(x, y + epsilon, t) - noise(x, y - epsilon, t)) * inv\n const dNdx = (noise(x + epsilon, y, t) - noise(x - epsilon, y, t)) * inv\n return { x: dNdy, y: -dNdx }\n }\n}\n\n/**\n * Make a 2D noise field seamlessly tileable over `[0, width) × [0, height)`.\n *\n * Works by sampling 4D noise on the surface of a torus: each axis becomes a circle, so the\n * field wraps exactly with no seam. This is the correct way to do it — blending mirrored\n * copies leaves visible symmetry artefacts.\n */\nexport function tileable2D(\n noise4D: (x: number, y: number, z: number, w: number) => number,\n width: number,\n height: number,\n): Noise2DFn {\n const TAU = Math.PI * 2\n const rx = width / TAU\n const ry = height / TAU\n return (x, y) => {\n const u = (x / Math.max(1e-6, width)) * TAU\n const v = (y / Math.max(1e-6, height)) * TAU\n return noise4D(Math.cos(u) * rx, Math.sin(u) * rx, Math.cos(v) * ry, Math.sin(v) * ry)\n }\n}\n","import { createPerlinNoise, createValueNoise } from './perlin'\nimport { createSimplexNoise } from './simplex'\nimport {\n type FractalOptions,\n curl2D,\n curl2DAnimated,\n fbm2D,\n fbm3D,\n ridged2D,\n tileable2D,\n turbulence2D,\n warp2D,\n} from './fractal'\n\nexport * from './tables'\nexport * from './simplex'\nexport * from './perlin'\nexport * from './fractal'\n\n/**\n * The one-stop noise factory.\n *\n * Effects generally want several related fields from a single seed — a base simplex, an fBm\n * for the large structure, and a curl field for advection. Creating them individually would\n * rebuild the permutation table each time (it is cached, but the wiring is still repetitive),\n * so `createNoise(seed)` hands back a coherent bundle.\n *\n * ```ts\n * const noise = createNoise('hero')\n * const height = noise.fbm2D({ octaves: 5, gain: 0.55 })\n * const flow = noise.curl({ octaves: 2 })\n * ```\n */\nexport function createNoise(seed: number | string = 0) {\n const numericSeed = typeof seed === 'string' ? hashSeed(seed) : seed\n const simplex = createSimplexNoise(numericSeed)\n const perlin = createPerlinNoise(numericSeed)\n const value = createValueNoise(numericSeed)\n\n return {\n seed: numericSeed,\n\n /** Raw single-octave sources. */\n simplex2D: simplex.noise2D,\n simplex3D: simplex.noise3D,\n simplex4D: simplex.noise4D,\n perlin2D: perlin.noise2D,\n perlin3D: perlin.noise3D,\n value2D: value.noise2D,\n\n /** Fractal compositions over simplex. */\n fbm2D: (options?: FractalOptions) => fbm2D(simplex.noise2D, options),\n fbm3D: (options?: FractalOptions) => fbm3D(simplex.noise3D, options),\n ridged2D: (options?: FractalOptions) => ridged2D(simplex.noise2D, options),\n turbulence2D: (options?: FractalOptions) => turbulence2D(simplex.noise2D, options),\n\n /** Domain-warped fBm — the organic, marbled look. */\n warped2D: (strength = 1, options?: FractalOptions) =>\n warp2D(fbm2D(simplex.noise2D, options), strength),\n\n /** Divergence-free flow field for particle advection. */\n curl: (options?: FractalOptions) => curl2D(fbm2D(simplex.noise2D, options)),\n curlAnimated: (options?: FractalOptions) => curl2DAnimated(fbm3D(simplex.noise3D, options)),\n\n /** Seamlessly tiling field over the given extent. */\n tileable: (width: number, height: number) => tileable2D(simplex.noise4D, width, height),\n }\n}\n\nexport type Noise = ReturnType<typeof createNoise>\n\nfunction hashSeed(input: string): number {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return hash >>> 0\n}\n"]}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ var chunkILKUL7GD_cjs = require('./chunk-ILKUL7GD.cjs');
4
+
5
+ // src/math/random.ts
6
+ function createRng(seed = 1) {
7
+ let state = (typeof seed === "string" ? hashString(seed) : Math.trunc(seed)) >>> 0;
8
+ if (state === 0) state = 2654435769;
9
+ let spareGaussian = null;
10
+ const next = () => {
11
+ state = state + 1831565813 >>> 0;
12
+ let t = state;
13
+ t = Math.imul(t ^ t >>> 15, t | 1);
14
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
15
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
16
+ };
17
+ const rng = {
18
+ next,
19
+ range: (min, max) => min + next() * (max - min),
20
+ int: (min, max) => Math.floor(min + next() * (max - min + 1)),
21
+ bool: (p = 0.5) => next() < p,
22
+ angle: () => next() * chunkILKUL7GD_cjs.TAU,
23
+ gaussian() {
24
+ if (spareGaussian !== null) {
25
+ const value = spareGaussian;
26
+ spareGaussian = null;
27
+ return value;
28
+ }
29
+ const u = 1 - next();
30
+ const v = next();
31
+ const mag = Math.sqrt(-2 * Math.log(u));
32
+ spareGaussian = mag * Math.sin(chunkILKUL7GD_cjs.TAU * v);
33
+ return mag * Math.cos(chunkILKUL7GD_cjs.TAU * v);
34
+ },
35
+ insideCircle() {
36
+ const r = Math.sqrt(next());
37
+ const a = next() * chunkILKUL7GD_cjs.TAU;
38
+ return { x: Math.cos(a) * r, y: Math.sin(a) * r };
39
+ },
40
+ pick(items) {
41
+ if (items.length === 0) throw new RangeError("rng.pick() called with an empty array");
42
+ return items[Math.floor(next() * items.length)];
43
+ },
44
+ shuffle(items) {
45
+ const out = items.slice();
46
+ for (let i = out.length - 1; i > 0; i--) {
47
+ const j = Math.floor(next() * (i + 1));
48
+ const tmp = out[i];
49
+ out[i] = out[j];
50
+ out[j] = tmp;
51
+ }
52
+ return out;
53
+ },
54
+ fork: () => createRng(Math.floor(next() * 4294967295))
55
+ };
56
+ return rng;
57
+ }
58
+ function hashString(input) {
59
+ let hash = 2166136261;
60
+ for (let i = 0; i < input.length; i++) {
61
+ hash ^= input.charCodeAt(i);
62
+ hash = Math.imul(hash, 16777619);
63
+ }
64
+ return hash >>> 0;
65
+ }
66
+ function deriveSeed(seed, index) {
67
+ let h = (seed ^ Math.imul(index + 1, 2654435769)) >>> 0;
68
+ h = Math.imul(h ^ h >>> 16, 2246822507) >>> 0;
69
+ h = Math.imul(h ^ h >>> 13, 3266489909) >>> 0;
70
+ return (h ^ h >>> 16) >>> 0;
71
+ }
72
+ function goldenRatioSequence(index, offset = 0) {
73
+ const PHI = 0.6180339887498949;
74
+ return (offset + index * PHI) % 1;
75
+ }
76
+ function r2Sequence(index) {
77
+ const A1 = 0.7548776662466927;
78
+ const A2 = 0.5698402909980532;
79
+ return { x: (0.5 + A1 * index) % 1, y: (0.5 + A2 * index) % 1 };
80
+ }
81
+ function weightedPick(rng, items, weights) {
82
+ if (items.length === 0) throw new RangeError("weightedPick() called with an empty array");
83
+ let total = 0;
84
+ for (let i = 0; i < items.length; i++) {
85
+ total += Math.max(0, weights[i] ?? 0);
86
+ }
87
+ if (total <= 0) return rng.pick(items);
88
+ let threshold = rng.next() * total;
89
+ for (let i = 0; i < items.length; i++) {
90
+ threshold -= Math.max(0, weights[i] ?? 0);
91
+ if (threshold <= 0) return items[i];
92
+ }
93
+ return items[items.length - 1];
94
+ }
95
+ function jitter(rng, value, amount, min = -Infinity, max = Infinity) {
96
+ return chunkILKUL7GD_cjs.clamp(value + (rng.next() * 2 - 1) * amount, min, max);
97
+ }
98
+
99
+ exports.createRng = createRng;
100
+ exports.deriveSeed = deriveSeed;
101
+ exports.goldenRatioSequence = goldenRatioSequence;
102
+ exports.hashString = hashString;
103
+ exports.jitter = jitter;
104
+ exports.r2Sequence = r2Sequence;
105
+ exports.weightedPick = weightedPick;
106
+ //# sourceMappingURL=chunk-FNR35HTL.cjs.map
107
+ //# sourceMappingURL=chunk-FNR35HTL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/math/random.ts"],"names":["TAU","clamp"],"mappings":"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","file":"chunk-FNR35HTL.cjs","sourcesContent":["import { TAU, clamp } from './scalar'\n\n/**\n * Seeded pseudo-random number generation.\n *\n * Determinism is a hard requirement in Ansh, not a nicety:\n *\n * - **SSR safety.** The server and the client must produce the same first frame, or React\n * and Vue will both scream about hydration mismatches.\n * - **Visual regression testing.** A screenshot diff is meaningless if the particle field\n * is different on every run.\n * - **Authoring.** A designer who likes seed `4821` can pin it and get that composition back.\n *\n * So no effect ever calls `Math.random()`. They all take a `seed` and derive a {@link Rng}.\n */\nexport interface Rng {\n /** Uniform in `[0, 1)`. */\n next(): number\n /** Uniform in `[min, max)`. */\n range(min: number, max: number): number\n /** Integer in `[min, max]`, inclusive on both ends. */\n int(min: number, max: number): number\n /** `true` with probability `p`. */\n bool(p?: number): boolean\n /** Uniform angle in `[0, 2π)`. */\n angle(): number\n /** Approximately standard-normal, mean 0 and standard deviation 1. */\n gaussian(): number\n /** A uniformly distributed point inside the unit circle. */\n insideCircle(): { x: number; y: number }\n /** Uniformly pick an element. Throws on an empty array. */\n pick<T>(items: readonly T[]): T\n /** A new shuffled copy (Fisher–Yates). The input is not mutated. */\n shuffle<T>(items: readonly T[]): T[]\n /** A fresh independent stream, deterministically derived from this one's current state. */\n fork(): Rng\n}\n\n/**\n * Mulberry32: 32-bit state, period 2³², passes gjrand's basic suites and is roughly as fast\n * as `Math.random()`. Chosen over xorshift because its avalanche is better for small seeds\n * (`seed = 1` and `seed = 2` produce visibly unrelated streams, which matters when authors\n * type small numbers).\n */\nexport function createRng(seed: number | string = 1): Rng {\n let state = (typeof seed === 'string' ? hashString(seed) : Math.trunc(seed)) >>> 0\n // A zero state is a valid mulberry32 seed but produces a poor first few outputs.\n if (state === 0) state = 0x9e3779b9\n\n // Cached second value from the Box–Muller pair; regenerated when null.\n let spareGaussian: number | null = null\n\n const next = (): number => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n\n const rng: Rng = {\n next,\n range: (min, max) => min + next() * (max - min),\n int: (min, max) => Math.floor(min + next() * (max - min + 1)),\n bool: (p = 0.5) => next() < p,\n angle: () => next() * TAU,\n\n gaussian() {\n if (spareGaussian !== null) {\n const value = spareGaussian\n spareGaussian = null\n return value\n }\n // Box–Muller. `1 - next()` keeps the argument of `log` strictly positive.\n const u = 1 - next()\n const v = next()\n const mag = Math.sqrt(-2 * Math.log(u))\n spareGaussian = mag * Math.sin(TAU * v)\n return mag * Math.cos(TAU * v)\n },\n\n insideCircle() {\n // sqrt of the radius, otherwise points bunch toward the centre.\n const r = Math.sqrt(next())\n const a = next() * TAU\n return { x: Math.cos(a) * r, y: Math.sin(a) * r }\n },\n\n pick(items) {\n if (items.length === 0) throw new RangeError('rng.pick() called with an empty array')\n return items[Math.floor(next() * items.length)]\n },\n\n shuffle(items) {\n const out = items.slice()\n for (let i = out.length - 1; i > 0; i--) {\n const j = Math.floor(next() * (i + 1))\n const tmp = out[i]\n out[i] = out[j]\n out[j] = tmp\n }\n return out\n },\n\n fork: () => createRng(Math.floor(next() * 0xffffffff)),\n }\n\n return rng\n}\n\n/** FNV-1a. Lets authors seed with a memorable string (`seed=\"hero-aurora\"`). */\nexport function hashString(input: string): number {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return hash >>> 0\n}\n\n/**\n * Deterministically derive a child seed from a parent seed and an index.\n *\n * Used so that particle *n* of an effect gets a stable stream regardless of how many\n * particles were created before it — which keeps a field visually stable when the count\n * changes at runtime under adaptive quality.\n */\nexport function deriveSeed(seed: number, index: number): number {\n let h = (seed ^ Math.imul(index + 1, 0x9e3779b9)) >>> 0\n h = Math.imul(h ^ (h >>> 16), 0x85ebca6b) >>> 0\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35) >>> 0\n return (h ^ (h >>> 16)) >>> 0\n}\n\n/**\n * Low-discrepancy 1D sequence. Fills `[0,1)` far more evenly than uniform random, which is\n * what you want for scattering stars or fireflies — pure random leaves visible clumps and\n * voids that read as a mistake.\n */\nexport function goldenRatioSequence(index: number, offset = 0): number {\n const PHI = 0.6180339887498949\n return (offset + index * PHI) % 1\n}\n\n/** 2D low-discrepancy sequence (R₂ / plastic constant). The 2D analogue of the above. */\nexport function r2Sequence(index: number): { x: number; y: number } {\n const A1 = 0.7548776662466927\n const A2 = 0.5698402909980532\n return { x: (0.5 + A1 * index) % 1, y: (0.5 + A2 * index) % 1 }\n}\n\n/**\n * Weighted pick. `weights` need not be normalised; non-finite or negative entries are\n * treated as zero. Falls back to the last item if floating point leaves a remainder.\n */\nexport function weightedPick<T>(rng: Rng, items: readonly T[], weights: readonly number[]): T {\n if (items.length === 0) throw new RangeError('weightedPick() called with an empty array')\n let total = 0\n for (let i = 0; i < items.length; i++) {\n total += Math.max(0, weights[i] ?? 0)\n }\n if (total <= 0) return rng.pick(items)\n\n let threshold = rng.next() * total\n for (let i = 0; i < items.length; i++) {\n threshold -= Math.max(0, weights[i] ?? 0)\n if (threshold <= 0) return items[i]\n }\n return items[items.length - 1]\n}\n\n/** Jitter a value by ±`amount` (absolute), clamped to an optional range. */\nexport function jitter(rng: Rng, value: number, amount: number, min = -Infinity, max = Infinity) {\n return clamp(value + (rng.next() * 2 - 1) * amount, min, max)\n}\n"]}
@@ -0,0 +1,91 @@
1
+ 'use strict';
2
+
3
+ var chunk23GSSIMK_cjs = require('./chunk-23GSSIMK.cjs');
4
+ var chunkLGA3N3YJ_cjs = require('./chunk-LGA3N3YJ.cjs');
5
+ var chunkILKUL7GD_cjs = require('./chunk-ILKUL7GD.cjs');
6
+
7
+ // src/color/contrast.ts
8
+ function contrastRatio(foreground, background) {
9
+ const bg = chunkLGA3N3YJ_cjs.parseColor(background);
10
+ const fgRaw = chunkLGA3N3YJ_cjs.parseColor(foreground);
11
+ const fg = fgRaw.a < 1 ? chunk23GSSIMK_cjs.composite(bg, fgRaw) : fgRaw;
12
+ const l1 = chunkLGA3N3YJ_cjs.relativeLuminance(fg);
13
+ const l2 = chunkLGA3N3YJ_cjs.relativeLuminance(bg);
14
+ const lighter = Math.max(l1, l2);
15
+ const darker = Math.min(l1, l2);
16
+ return (lighter + 0.05) / (darker + 0.05);
17
+ }
18
+ function requiredRatio(level, size) {
19
+ if (level === "AAA") return size === "large" ? 4.5 : 7;
20
+ return size === "large" ? 3 : 4.5;
21
+ }
22
+ function checkContrast(foreground, background, level = "AA", size = "normal") {
23
+ const ratio = contrastRatio(foreground, background);
24
+ const required = requiredRatio(level, size);
25
+ return { ratio, passes: ratio >= required, required, level, size };
26
+ }
27
+ function pickReadable(background, light = "#ffffff", dark = "#0b0b0f") {
28
+ const lightRatio = contrastRatio(light, background);
29
+ const darkRatio = contrastRatio(dark, background);
30
+ return chunkLGA3N3YJ_cjs.parseColor(lightRatio >= darkRatio ? light : dark);
31
+ }
32
+ function ensureContrast(foreground, background, target = 4.5) {
33
+ const fg = chunkLGA3N3YJ_cjs.parseColor(foreground);
34
+ const bg = chunkLGA3N3YJ_cjs.parseColor(background);
35
+ const initial = contrastRatio(fg, bg);
36
+ if (initial >= target) return { color: fg, ratio: initial, achieved: true };
37
+ const lch = chunkLGA3N3YJ_cjs.rgbToOklch(fg);
38
+ const bgLuminance = chunkLGA3N3YJ_cjs.relativeLuminance(bg);
39
+ const direction = bgLuminance > 0.35 ? -1 : 1;
40
+ let best = fg;
41
+ let bestRatio = initial;
42
+ const STEPS = 24;
43
+ const limit = direction > 0 ? 1 - lch.l : lch.l;
44
+ for (let i = 1; i <= STEPS; i++) {
45
+ const l = chunkILKUL7GD_cjs.clamp(lch.l + direction * (limit * (i / STEPS)), 0, 1);
46
+ const candidate = chunk23GSSIMK_cjs.oklchToRgbMapped({ l, c: lch.c, h: lch.h, alpha: fg.a });
47
+ const ratio = contrastRatio(candidate, bg);
48
+ if (ratio > bestRatio) {
49
+ bestRatio = ratio;
50
+ best = candidate;
51
+ if (ratio >= target) return { color: candidate, ratio, achieved: true };
52
+ }
53
+ }
54
+ for (let i = 1; i <= 8; i++) {
55
+ const c = lch.c * (1 - i / 8);
56
+ const l = direction > 0 ? 1 : 0;
57
+ const candidate = chunk23GSSIMK_cjs.oklchToRgbMapped({ l, c, h: lch.h, alpha: fg.a });
58
+ const ratio = contrastRatio(candidate, bg);
59
+ if (ratio > bestRatio) {
60
+ bestRatio = ratio;
61
+ best = candidate;
62
+ if (ratio >= target) return { color: candidate, ratio, achieved: true };
63
+ }
64
+ }
65
+ return { color: best, ratio: bestRatio, achieved: bestRatio >= target };
66
+ }
67
+ function worstContrast(foreground, backgrounds) {
68
+ let worst = Infinity;
69
+ let against = null;
70
+ for (const bg of backgrounds) {
71
+ const ratio = contrastRatio(foreground, bg);
72
+ if (ratio < worst) {
73
+ worst = ratio;
74
+ against = chunkLGA3N3YJ_cjs.parseColor(bg);
75
+ }
76
+ }
77
+ return { ratio: Number.isFinite(worst) ? worst : 21, against };
78
+ }
79
+ function perceivedLightness(color) {
80
+ return chunkLGA3N3YJ_cjs.rgbToOklch(chunkLGA3N3YJ_cjs.parseColor(color)).l;
81
+ }
82
+
83
+ exports.checkContrast = checkContrast;
84
+ exports.contrastRatio = contrastRatio;
85
+ exports.ensureContrast = ensureContrast;
86
+ exports.perceivedLightness = perceivedLightness;
87
+ exports.pickReadable = pickReadable;
88
+ exports.requiredRatio = requiredRatio;
89
+ exports.worstContrast = worstContrast;
90
+ //# sourceMappingURL=chunk-GHBRGMSO.cjs.map
91
+ //# sourceMappingURL=chunk-GHBRGMSO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/color/contrast.ts"],"names":["parseColor","composite","relativeLuminance","rgbToOklch","clamp","oklchToRgbMapped"],"mappings":";;;;;;;AAyBO,SAAS,aAAA,CAAc,YAAwB,UAAA,EAAgC;AACpF,EAAA,MAAM,EAAA,GAAKA,6BAAW,UAAU,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQA,6BAAW,UAAU,CAAA;AACnC,EAAA,MAAM,KAAK,KAAA,CAAM,CAAA,GAAI,IAAIC,2BAAA,CAAU,EAAA,EAAI,KAAK,CAAA,GAAI,KAAA;AAEhD,EAAA,MAAM,EAAA,GAAKC,oCAAkB,EAAE,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAKA,oCAAkB,EAAE,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,EAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,MAAA,GAAS,IAAA,CAAA;AACtC;AAGO,SAAS,aAAA,CAAc,OAAkB,IAAA,EAAwB;AACtE,EAAA,IAAI,KAAA,KAAU,KAAA,EAAO,OAAO,IAAA,KAAS,UAAU,GAAA,GAAM,CAAA;AACrD,EAAA,OAAO,IAAA,KAAS,UAAU,CAAA,GAAI,GAAA;AAChC;AAWO,SAAS,cACd,UAAA,EACA,UAAA,EACA,KAAA,GAAmB,IAAA,EACnB,OAAiB,QAAA,EACD;AAChB,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,UAAA,EAAY,UAAU,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC1C,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAK;AACnE;AAQO,SAAS,YAAA,CACd,UAAA,EACA,KAAA,GAAoB,SAAA,EACpB,OAAmB,SAAA,EACd;AACL,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO,UAAU,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAChD,EAAA,OAAOF,4BAAA,CAAW,UAAA,IAAc,SAAA,GAAY,KAAA,GAAQ,IAAI,CAAA;AAC1D;AAUO,SAAS,cAAA,CACd,UAAA,EACA,UAAA,EACA,MAAA,GAAS,GAAA,EACyC;AAClD,EAAA,MAAM,EAAA,GAAKA,6BAAW,UAAU,CAAA;AAChC,EAAA,MAAM,EAAA,GAAKA,6BAAW,UAAU,CAAA;AAEhC,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAA,EAAI,EAAE,CAAA;AACpC,EAAA,IAAI,OAAA,IAAW,QAAQ,OAAO,EAAE,OAAO,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,IAAA,EAAK;AAE1E,EAAA,MAAM,GAAA,GAAMG,6BAAW,EAAE,CAAA;AACzB,EAAA,MAAM,WAAA,GAAcD,oCAAkB,EAAE,CAAA;AAExC,EAAA,MAAM,SAAA,GAAY,WAAA,GAAc,IAAA,GAAO,EAAA,GAAK,CAAA;AAE5C,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,SAAA,GAAY,OAAA;AAIhB,EAAA,MAAM,KAAA,GAAQ,EAAA;AACd,EAAA,MAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,IAAI,GAAA,CAAI,CAAA;AAE9C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,CAAA,GAAIE,wBAAM,GAAA,CAAI,CAAA,GAAI,aAAa,KAAA,IAAS,CAAA,GAAI,KAAA,CAAA,CAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAYC,kCAAA,CAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,GAAG,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,EAAW,EAAE,CAAA;AACzC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAA,GAAO,SAAA;AACP,MAAA,IAAI,KAAA,IAAS,QAAQ,OAAO,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,IACxE;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,CAAA;AAC9B,IAAA,MAAM,SAAA,GAAYA,kCAAA,CAAiB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,CAAA,EAAG,CAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,SAAA,EAAW,EAAE,CAAA;AACzC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAA,GAAO,SAAA;AACP,MAAA,IAAI,KAAA,IAAS,QAAQ,OAAO,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA,EAAW,QAAA,EAAU,aAAa,MAAA,EAAO;AACxE;AASO,SAAS,aAAA,CACd,YACA,WAAA,EACwC;AACxC,EAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,EAAA,IAAI,OAAA,GAAsB,IAAA;AAC1B,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,UAAA,EAAY,EAAE,CAAA;AAC1C,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA,OAAA,GAAUL,6BAAW,EAAE,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAI,OAAA,EAAQ;AAC/D;AAUO,SAAS,mBAAmB,KAAA,EAA2B;AAC5D,EAAA,OAAOG,4BAAA,CAAWH,4BAAA,CAAW,KAAK,CAAC,CAAA,CAAE,CAAA;AACvC","file":"chunk-GHBRGMSO.cjs","sourcesContent":["import { clamp } from '../math/scalar'\nimport { relativeLuminance, rgbToOklch } from './convert'\nimport { oklchToRgbMapped } from './gamut'\nimport { parseColor } from './parse'\nimport { composite } from './interpolate'\nimport type { ColorInput, Rgb } from './types'\n\n/**\n * Contrast and legibility.\n *\n * Animated backgrounds are the single most common way a design ends up failing WCAG: the text\n * was legible against the mockup's midpoint and illegible against the animation's brightest\n * frame. These helpers let components check contrast against the *extremes* of their own\n * palette and adapt, rather than hoping.\n */\n\nexport type WcagLevel = 'AA' | 'AAA'\nexport type TextSize = 'normal' | 'large'\n\n/**\n * WCAG 2.x contrast ratio, from 1 (identical) to 21 (black on white).\n *\n * Semi-transparent colours are composited over `background` first, because a ratio computed\n * from a colour's own alpha is meaningless — what matters is what the eye actually receives.\n */\nexport function contrastRatio(foreground: ColorInput, background: ColorInput): number {\n const bg = parseColor(background)\n const fgRaw = parseColor(foreground)\n const fg = fgRaw.a < 1 ? composite(bg, fgRaw) : fgRaw\n\n const l1 = relativeLuminance(fg)\n const l2 = relativeLuminance(bg)\n const lighter = Math.max(l1, l2)\n const darker = Math.min(l1, l2)\n return (lighter + 0.05) / (darker + 0.05)\n}\n\n/** Minimum ratio required by WCAG 2.2 for the given level and text size. */\nexport function requiredRatio(level: WcagLevel, size: TextSize): number {\n if (level === 'AAA') return size === 'large' ? 4.5 : 7\n return size === 'large' ? 3 : 4.5\n}\n\nexport interface ContrastResult {\n ratio: number\n passes: boolean\n required: number\n level: WcagLevel\n size: TextSize\n}\n\n/** Check a foreground/background pair against a WCAG threshold. */\nexport function checkContrast(\n foreground: ColorInput,\n background: ColorInput,\n level: WcagLevel = 'AA',\n size: TextSize = 'normal',\n): ContrastResult {\n const ratio = contrastRatio(foreground, background)\n const required = requiredRatio(level, size)\n return { ratio, passes: ratio >= required, required, level, size }\n}\n\n/**\n * Pick whichever of `light`/`dark` reads better on `background`.\n *\n * This is the function to reach for when a component renders text over a user-supplied\n * colour, which is most of them.\n */\nexport function pickReadable(\n background: ColorInput,\n light: ColorInput = '#ffffff',\n dark: ColorInput = '#0b0b0f',\n): Rgb {\n const lightRatio = contrastRatio(light, background)\n const darkRatio = contrastRatio(dark, background)\n return parseColor(lightRatio >= darkRatio ? light : dark)\n}\n\n/**\n * Adjust a colour's lightness until it meets a contrast target against `background`.\n *\n * Works in OKLCH so hue and chroma survive the adjustment — the brand colour stays\n * recognisably itself, it just gets light or dark enough to read. Searches in whichever\n * direction has more headroom, and returns the best achievable colour if the target is\n * unreachable (a mid-grey background cannot support 7:1 with a saturated hue at any lightness).\n */\nexport function ensureContrast(\n foreground: ColorInput,\n background: ColorInput,\n target = 4.5,\n): { color: Rgb; ratio: number; achieved: boolean } {\n const fg = parseColor(foreground)\n const bg = parseColor(background)\n\n const initial = contrastRatio(fg, bg)\n if (initial >= target) return { color: fg, ratio: initial, achieved: true }\n\n const lch = rgbToOklch(fg)\n const bgLuminance = relativeLuminance(bg)\n // Move away from the background: darken against a light background, lighten against a dark one.\n const direction = bgLuminance > 0.35 ? -1 : 1\n\n let best = fg\n let bestRatio = initial\n\n // 24 steps across the available lightness range lands within ~4% of optimal, which is\n // finer than the eye can distinguish and costs 24 cheap conversions.\n const STEPS = 24\n const limit = direction > 0 ? 1 - lch.l : lch.l\n\n for (let i = 1; i <= STEPS; i++) {\n const l = clamp(lch.l + direction * (limit * (i / STEPS)), 0, 1)\n const candidate = oklchToRgbMapped({ l, c: lch.c, h: lch.h, alpha: fg.a })\n const ratio = contrastRatio(candidate, bg)\n if (ratio > bestRatio) {\n bestRatio = ratio\n best = candidate\n if (ratio >= target) return { color: candidate, ratio, achieved: true }\n }\n }\n\n // Last resort: drop chroma too. Desaturating buys real lightness range at the extremes.\n for (let i = 1; i <= 8; i++) {\n const c = lch.c * (1 - i / 8)\n const l = direction > 0 ? 1 : 0\n const candidate = oklchToRgbMapped({ l, c, h: lch.h, alpha: fg.a })\n const ratio = contrastRatio(candidate, bg)\n if (ratio > bestRatio) {\n bestRatio = ratio\n best = candidate\n if (ratio >= target) return { color: candidate, ratio, achieved: true }\n }\n }\n\n return { color: best, ratio: bestRatio, achieved: bestRatio >= target }\n}\n\n/**\n * Worst-case contrast of a foreground against every colour in a set.\n *\n * An animated gradient background cycles through many colours; text must be legible against\n * all of them. Components call this with their resolved palette and surface a dev warning when\n * it fails, which turns an invisible accessibility bug into a console message during development.\n */\nexport function worstContrast(\n foreground: ColorInput,\n backgrounds: readonly ColorInput[],\n): { ratio: number; against: Rgb | null } {\n let worst = Infinity\n let against: Rgb | null = null\n for (const bg of backgrounds) {\n const ratio = contrastRatio(foreground, bg)\n if (ratio < worst) {\n worst = ratio\n against = parseColor(bg)\n }\n }\n return { ratio: Number.isFinite(worst) ? worst : 21, against }\n}\n\n/**\n * APCA-style perceptual lightness, used for ordering colours by visual weight.\n *\n * Not a WCAG 3 implementation — that specification is still in flux and we won't ship a\n * moving target as if it were stable. This is OKLab's `L`, which is a better predictor of\n * perceived lightness than WCAG's relative luminance and is entirely sufficient for the\n * internal job of sorting a palette light-to-dark.\n */\nexport function perceivedLightness(color: ColorInput): number {\n return rgbToOklch(parseColor(color)).l\n}\n"]}