@flare-engine/math 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @flare-engine/math
2
2
 
3
- 2D math primitives for the Flare engine — `Vec2`, `Rect`, `Circle`, `Transform2D`, `Mat3`, `Color`, 32 easing functions, seeded RNG, and intersection tests. Plain-object types with static method namespaces; zero-alloc forms take an `out` parameter to avoid GC pressure in game loops.
3
+ 2D math primitives for the Flare engine — `Vec2`, `Rect`, `Circle`, `Transform2D`, `Mat3`, `Color`, 32 easing functions, seeded RNG, intersection tests, angle/steering helpers (`angleDelta`, `rotateTowards`, `Vec2.turnVelocityToward`), weighted random picks (`weightedIndex`, `weightedIndexBy`, `weightedPick`), deterministic hash utils (`hashU32`, `seededIndex`), and timed-window reward math (`cappedBonus`, `advanceWindowedStreak`, `windowExpired`, `remainingInWindow`). Plain-object types with static method namespaces; zero-alloc forms take an `out` parameter to avoid GC pressure in game loops.
4
4
 
5
5
  ## Install
6
6
 
@@ -22,7 +22,7 @@ const rng = new SeededRNG(42);
22
22
  const t = easeOutQuad(rng.float());
23
23
  ```
24
24
 
25
- See [API spec](../../docs/design/api-specs.md#flare-enginemath--5kb-gzip) and [skill reference](../../.github/skills/flare-math/SKILL.md).
25
+ See [API spec](../../docs/design/api-specs.md#flare-enginemath--5kb-gzip).
26
26
 
27
27
  ## License
28
28
 
package/dist/index.d.mts CHANGED
@@ -20,6 +20,14 @@ declare function pingPong(t: number, length: number): number;
20
20
  declare function smoothStep(edge0: number, edge1: number, x: number): number;
21
21
  /** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */
22
22
  declare function sign(value: number): number;
23
+ /** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons
24
+ * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)
25
+ * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts
26
+ * results by ULPs at the +/-pi boundary). */
27
+ declare function angleDelta(a: number, b: number): number;
28
+ /** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new
29
+ * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */
30
+ declare function rotateTowards(cur: number, target: number, maxStep: number): number;
23
31
 
24
32
  /** Creates a Vec2 plain object. */
25
33
  declare function vec2(x?: number, y?: number): Vec2;
@@ -77,6 +85,10 @@ declare const Vec2: {
77
85
  readonly clone: (v: Vec2) => Vec2;
78
86
  /** Clamps the length of a vector to maxLength. */
79
87
  readonly clampLength: (v: Vec2, maxLength: number, out?: Vec2) => Vec2;
88
+ /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep
89
+ * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled
90
+ * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */
91
+ readonly turnVelocityToward: (vx: number, vy: number, dx: number, dy: number, maxStep: number, out: Vec2) => Vec2;
80
92
  };
81
93
 
82
94
  /** Axis-aligned bounding box. */
@@ -287,6 +299,63 @@ declare function randomPointInCircle(cx: number, cy: number, radius: number): Ve
287
299
  declare function shuffle<T>(array: T[]): T[];
288
300
  /** Returns a random element from the array. */
289
301
  declare function choose<T>(array: readonly T[]): T | undefined;
302
+ /**
303
+ * Picks an index from a weight array using a cumulative walk.
304
+ * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.
305
+ */
306
+ declare function weightedIndex(weights: readonly number[], roll01: number): number;
307
+ /**
308
+ * Picks an index from `items` using a per-item weight accessor.
309
+ * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.
310
+ */
311
+ declare function weightedIndexBy<T>(items: readonly T[], weight: (item: T) => number, roll01: number): number;
312
+ /**
313
+ * Picks an item from `items` using a per-item weight accessor.
314
+ * Returns `undefined` for an empty array; returns the last item on float-edge.
315
+ */
316
+ declare function weightedPick<T>(items: readonly T[], weight: (item: T) => number, roll01: number): T | undefined;
317
+ /**
318
+ * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds
319
+ * decorrelate into different output values. Returns an unsigned 32-bit integer.
320
+ *
321
+ * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).
322
+ */
323
+ declare function hashU32(seed: number): number;
324
+ /**
325
+ * Deterministically maps `seed` to an index in [0, count).
326
+ * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate
327
+ * adjacent seeds before the modulo.
328
+ */
329
+ declare function seededIndex(seed: number, count: number): number;
330
+
331
+ /**
332
+ * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.
333
+ */
334
+ /**
335
+ * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.
336
+ * `frac` is the current multiplier (e.g. `streak * fracPerStep`);
337
+ * `capFrac` bounds the multiplier so it cannot grow unboundedly.
338
+ * Returns 0 for zero or negative `pay`.
339
+ */
340
+ declare function cappedBonus(pay: number, frac: number, capFrac: number): number;
341
+ /**
342
+ * Advances a timed streak counter. A new event within `windowSec` of `lastT`
343
+ * increments `prev`; a gap (or `lastT < 0` meaning "no prior event") resets
344
+ * to 1. Pure — the caller stores the returned value and stamps the new time.
345
+ * `elapsed` is the monotonic clock at the new event.
346
+ */
347
+ declare function advanceWindowedStreak(prev: number, elapsed: number, lastT: number, windowSec: number): number;
348
+ /**
349
+ * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)
350
+ * and more than `windowSec` seconds have passed since `lastT`.
351
+ * `lastT < 0` means no event has ever occurred — never expired.
352
+ */
353
+ declare function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean;
354
+ /**
355
+ * How many more events may be awarded in the current window given `awarded`
356
+ * already counted. Clamped to 0 — never negative.
357
+ */
358
+ declare function remainingInWindow(awarded: number, capPerWindow: number): number;
290
359
 
291
360
  /** Returns true if point is inside rect (inclusive). */
292
361
  declare function pointInRect(p: Vec2, r: Rect): boolean;
@@ -305,4 +374,4 @@ declare function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c:
305
374
  /** Ray intersection with AABB. Returns t (distance) or null if no hit. */
306
375
  declare function rayVsRect(originX: number, originY: number, dirX: number, dirY: number, r: Rect): number | null;
307
376
 
308
- export { Circle, Color, type EasingFn, Mat3, type Oklab, type Oklch, Rect, SeededRNG, Transform2D, Vec2, approxEquals, choose, circleVsCircle, clamp, degToRad, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, inverseLerp, lerp, lineVsCircle, lineVsRect, linear, map, pingPong, pointInCircle, pointInRect, radToDeg, randomFloat, randomInt, randomPointInCircle, randomVec2InRect, rayVsRect, rectVsCircle, rectVsRect, shuffle, sign, smoothStep, springIn, springInOut, springOut, step, vec2, wrap };
377
+ export { Circle, Color, type EasingFn, Mat3, type Oklab, type Oklch, Rect, SeededRNG, Transform2D, Vec2, advanceWindowedStreak, angleDelta, approxEquals, cappedBonus, choose, circleVsCircle, clamp, degToRad, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, hashU32, inverseLerp, lerp, lineVsCircle, lineVsRect, linear, map, pingPong, pointInCircle, pointInRect, radToDeg, randomFloat, randomInt, randomPointInCircle, randomVec2InRect, rayVsRect, rectVsCircle, rectVsRect, remainingInWindow, rotateTowards, seededIndex, shuffle, sign, smoothStep, springIn, springInOut, springOut, step, vec2, weightedIndex, weightedIndexBy, weightedPick, windowExpired, wrap };
package/dist/index.d.ts CHANGED
@@ -20,6 +20,14 @@ declare function pingPong(t: number, length: number): number;
20
20
  declare function smoothStep(edge0: number, edge1: number, x: number): number;
21
21
  /** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */
22
22
  declare function sign(value: number): number;
23
+ /** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons
24
+ * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)
25
+ * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts
26
+ * results by ULPs at the +/-pi boundary). */
27
+ declare function angleDelta(a: number, b: number): number;
28
+ /** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new
29
+ * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */
30
+ declare function rotateTowards(cur: number, target: number, maxStep: number): number;
23
31
 
24
32
  /** Creates a Vec2 plain object. */
25
33
  declare function vec2(x?: number, y?: number): Vec2;
@@ -77,6 +85,10 @@ declare const Vec2: {
77
85
  readonly clone: (v: Vec2) => Vec2;
78
86
  /** Clamps the length of a vector to maxLength. */
79
87
  readonly clampLength: (v: Vec2, maxLength: number, out?: Vec2) => Vec2;
88
+ /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep
89
+ * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled
90
+ * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */
91
+ readonly turnVelocityToward: (vx: number, vy: number, dx: number, dy: number, maxStep: number, out: Vec2) => Vec2;
80
92
  };
81
93
 
82
94
  /** Axis-aligned bounding box. */
@@ -287,6 +299,63 @@ declare function randomPointInCircle(cx: number, cy: number, radius: number): Ve
287
299
  declare function shuffle<T>(array: T[]): T[];
288
300
  /** Returns a random element from the array. */
289
301
  declare function choose<T>(array: readonly T[]): T | undefined;
302
+ /**
303
+ * Picks an index from a weight array using a cumulative walk.
304
+ * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.
305
+ */
306
+ declare function weightedIndex(weights: readonly number[], roll01: number): number;
307
+ /**
308
+ * Picks an index from `items` using a per-item weight accessor.
309
+ * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.
310
+ */
311
+ declare function weightedIndexBy<T>(items: readonly T[], weight: (item: T) => number, roll01: number): number;
312
+ /**
313
+ * Picks an item from `items` using a per-item weight accessor.
314
+ * Returns `undefined` for an empty array; returns the last item on float-edge.
315
+ */
316
+ declare function weightedPick<T>(items: readonly T[], weight: (item: T) => number, roll01: number): T | undefined;
317
+ /**
318
+ * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds
319
+ * decorrelate into different output values. Returns an unsigned 32-bit integer.
320
+ *
321
+ * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).
322
+ */
323
+ declare function hashU32(seed: number): number;
324
+ /**
325
+ * Deterministically maps `seed` to an index in [0, count).
326
+ * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate
327
+ * adjacent seeds before the modulo.
328
+ */
329
+ declare function seededIndex(seed: number, count: number): number;
330
+
331
+ /**
332
+ * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.
333
+ */
334
+ /**
335
+ * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.
336
+ * `frac` is the current multiplier (e.g. `streak * fracPerStep`);
337
+ * `capFrac` bounds the multiplier so it cannot grow unboundedly.
338
+ * Returns 0 for zero or negative `pay`.
339
+ */
340
+ declare function cappedBonus(pay: number, frac: number, capFrac: number): number;
341
+ /**
342
+ * Advances a timed streak counter. A new event within `windowSec` of `lastT`
343
+ * increments `prev`; a gap (or `lastT < 0` meaning "no prior event") resets
344
+ * to 1. Pure — the caller stores the returned value and stamps the new time.
345
+ * `elapsed` is the monotonic clock at the new event.
346
+ */
347
+ declare function advanceWindowedStreak(prev: number, elapsed: number, lastT: number, windowSec: number): number;
348
+ /**
349
+ * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)
350
+ * and more than `windowSec` seconds have passed since `lastT`.
351
+ * `lastT < 0` means no event has ever occurred — never expired.
352
+ */
353
+ declare function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean;
354
+ /**
355
+ * How many more events may be awarded in the current window given `awarded`
356
+ * already counted. Clamped to 0 — never negative.
357
+ */
358
+ declare function remainingInWindow(awarded: number, capPerWindow: number): number;
290
359
 
291
360
  /** Returns true if point is inside rect (inclusive). */
292
361
  declare function pointInRect(p: Vec2, r: Rect): boolean;
@@ -305,4 +374,4 @@ declare function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c:
305
374
  /** Ray intersection with AABB. Returns t (distance) or null if no hit. */
306
375
  declare function rayVsRect(originX: number, originY: number, dirX: number, dirY: number, r: Rect): number | null;
307
376
 
308
- export { Circle, Color, type EasingFn, Mat3, type Oklab, type Oklch, Rect, SeededRNG, Transform2D, Vec2, approxEquals, choose, circleVsCircle, clamp, degToRad, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, inverseLerp, lerp, lineVsCircle, lineVsRect, linear, map, pingPong, pointInCircle, pointInRect, radToDeg, randomFloat, randomInt, randomPointInCircle, randomVec2InRect, rayVsRect, rectVsCircle, rectVsRect, shuffle, sign, smoothStep, springIn, springInOut, springOut, step, vec2, wrap };
377
+ export { Circle, Color, type EasingFn, Mat3, type Oklab, type Oklch, Rect, SeededRNG, Transform2D, Vec2, advanceWindowedStreak, angleDelta, approxEquals, cappedBonus, choose, circleVsCircle, clamp, degToRad, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, hashU32, inverseLerp, lerp, lineVsCircle, lineVsRect, linear, map, pingPong, pointInCircle, pointInRect, radToDeg, randomFloat, randomInt, randomPointInCircle, randomVec2InRect, rayVsRect, rectVsCircle, rectVsRect, remainingInWindow, rotateTowards, seededIndex, shuffle, sign, smoothStep, springIn, springInOut, springOut, step, vec2, weightedIndex, weightedIndexBy, weightedPick, windowExpired, wrap };
package/dist/index.js CHANGED
@@ -27,7 +27,10 @@ __export(index_exports, {
27
27
  SeededRNG: () => SeededRNG,
28
28
  Transform2D: () => Transform2D,
29
29
  Vec2: () => Vec2,
30
+ advanceWindowedStreak: () => advanceWindowedStreak,
31
+ angleDelta: () => angleDelta,
30
32
  approxEquals: () => approxEquals,
33
+ cappedBonus: () => cappedBonus,
31
34
  choose: () => choose,
32
35
  circleVsCircle: () => circleVsCircle,
33
36
  clamp: () => clamp,
@@ -62,6 +65,7 @@ __export(index_exports, {
62
65
  easeOutQuart: () => easeOutQuart,
63
66
  easeOutQuint: () => easeOutQuint,
64
67
  easeOutSine: () => easeOutSine,
68
+ hashU32: () => hashU32,
65
69
  inverseLerp: () => inverseLerp,
66
70
  lerp: () => lerp,
67
71
  lineVsCircle: () => lineVsCircle,
@@ -79,6 +83,9 @@ __export(index_exports, {
79
83
  rayVsRect: () => rayVsRect,
80
84
  rectVsCircle: () => rectVsCircle,
81
85
  rectVsRect: () => rectVsRect,
86
+ remainingInWindow: () => remainingInWindow,
87
+ rotateTowards: () => rotateTowards,
88
+ seededIndex: () => seededIndex,
82
89
  shuffle: () => shuffle,
83
90
  sign: () => sign,
84
91
  smoothStep: () => smoothStep,
@@ -87,6 +94,10 @@ __export(index_exports, {
87
94
  springOut: () => springOut,
88
95
  step: () => step,
89
96
  vec2: () => vec2,
97
+ weightedIndex: () => weightedIndex,
98
+ weightedIndexBy: () => weightedIndexBy,
99
+ weightedPick: () => weightedPick,
100
+ windowExpired: () => windowExpired,
90
101
  wrap: () => wrap
91
102
  });
92
103
  module.exports = __toCommonJS(index_exports);
@@ -137,6 +148,17 @@ function sign(value) {
137
148
  if (Number.isNaN(value)) return 0;
138
149
  return value > 0 ? 1 : value < 0 ? -1 : 0;
139
150
  }
151
+ function angleDelta(a, b) {
152
+ let diff = a - b;
153
+ if (diff > Math.PI) diff -= 2 * Math.PI;
154
+ else if (diff < -Math.PI) diff += 2 * Math.PI;
155
+ return diff;
156
+ }
157
+ function rotateTowards(cur, target, maxStep) {
158
+ const diff = angleDelta(target, cur);
159
+ const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;
160
+ return cur + turn;
161
+ }
140
162
 
141
163
  // src/vec2.ts
142
164
  function vec2(x = 0, y = 0) {
@@ -329,6 +351,16 @@ var Vec2 = {
329
351
  return out;
330
352
  }
331
353
  return { x: v.x * inv, y: v.y * inv };
354
+ },
355
+ /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep
356
+ * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled
357
+ * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */
358
+ turnVelocityToward(vx, vy, dx, dy, maxStep, out) {
359
+ const speed = Math.hypot(vx, vy);
360
+ const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);
361
+ out.x = Math.cos(newAng) * speed;
362
+ out.y = Math.sin(newAng) * speed;
363
+ return out;
332
364
  }
333
365
  };
334
366
 
@@ -942,6 +974,60 @@ function choose(array) {
942
974
  if (array.length === 0) return void 0;
943
975
  return array[Math.floor(Math.random() * array.length)];
944
976
  }
977
+ function weightedIndex(weights, roll01) {
978
+ let total = 0;
979
+ for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;
980
+ if (total <= 0) return 0;
981
+ const target = roll01 * total;
982
+ let acc = 0;
983
+ for (let i = 0; i < weights.length; i++) {
984
+ acc += weights[i] ?? 0;
985
+ if (target < acc) return i;
986
+ }
987
+ return weights.length - 1;
988
+ }
989
+ function weightedIndexBy(items, weight, roll01) {
990
+ let total = 0;
991
+ for (let i = 0; i < items.length; i++) total += weight(items[i]);
992
+ if (total <= 0) return 0;
993
+ const target = roll01 * total;
994
+ let acc = 0;
995
+ for (let i = 0; i < items.length; i++) {
996
+ acc += weight(items[i]);
997
+ if (target < acc) return i;
998
+ }
999
+ return items.length - 1;
1000
+ }
1001
+ function weightedPick(items, weight, roll01) {
1002
+ if (items.length === 0) return void 0;
1003
+ return items[weightedIndexBy(items, weight, roll01)];
1004
+ }
1005
+ function hashU32(seed) {
1006
+ let h = (seed | 0) >>> 0;
1007
+ h = Math.imul(h ^ h >>> 16, 73244475) >>> 0;
1008
+ h = Math.imul(h ^ h >>> 16, 73244475) >>> 0;
1009
+ return (h ^ h >>> 16) >>> 0;
1010
+ }
1011
+ function seededIndex(seed, count) {
1012
+ if (count <= 1) return 0;
1013
+ return hashU32(seed) % count;
1014
+ }
1015
+
1016
+ // src/reward.ts
1017
+ function cappedBonus(pay, frac, capFrac) {
1018
+ if (pay <= 0) return 0;
1019
+ return Math.floor(pay * Math.min(frac, capFrac));
1020
+ }
1021
+ function advanceWindowedStreak(prev, elapsed, lastT, windowSec) {
1022
+ if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;
1023
+ return 1;
1024
+ }
1025
+ function windowExpired(elapsed, lastT, windowSec) {
1026
+ return lastT >= 0 && elapsed - lastT > windowSec;
1027
+ }
1028
+ function remainingInWindow(awarded, capPerWindow) {
1029
+ return Math.max(0, capPerWindow - awarded);
1030
+ }
945
1031
 
946
1032
  // src/intersection.ts
947
1033
  function pointInRect(p, r) {
@@ -1037,7 +1123,10 @@ function rayVsRect(originX, originY, dirX, dirY, r) {
1037
1123
  SeededRNG,
1038
1124
  Transform2D,
1039
1125
  Vec2,
1126
+ advanceWindowedStreak,
1127
+ angleDelta,
1040
1128
  approxEquals,
1129
+ cappedBonus,
1041
1130
  choose,
1042
1131
  circleVsCircle,
1043
1132
  clamp,
@@ -1072,6 +1161,7 @@ function rayVsRect(originX, originY, dirX, dirY, r) {
1072
1161
  easeOutQuart,
1073
1162
  easeOutQuint,
1074
1163
  easeOutSine,
1164
+ hashU32,
1075
1165
  inverseLerp,
1076
1166
  lerp,
1077
1167
  lineVsCircle,
@@ -1089,6 +1179,9 @@ function rayVsRect(originX, originY, dirX, dirY, r) {
1089
1179
  rayVsRect,
1090
1180
  rectVsCircle,
1091
1181
  rectVsRect,
1182
+ remainingInWindow,
1183
+ rotateTowards,
1184
+ seededIndex,
1092
1185
  shuffle,
1093
1186
  sign,
1094
1187
  smoothStep,
@@ -1097,6 +1190,10 @@ function rayVsRect(originX, originY, dirX, dirY, r) {
1097
1190
  springOut,
1098
1191
  step,
1099
1192
  vec2,
1193
+ weightedIndex,
1194
+ weightedIndexBy,
1195
+ weightedPick,
1196
+ windowExpired,
1100
1197
  wrap
1101
1198
  });
1102
1199
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/scalar.ts","../src/vec2.ts","../src/rect.ts","../src/circle.ts","../src/transform2d.ts","../src/mat3.ts","../src/color.ts","../src/easings.ts","../src/random.ts","../src/intersection.ts"],"sourcesContent":["export {\n clamp,\n lerp,\n inverseLerp,\n map,\n degToRad,\n radToDeg,\n approxEquals,\n wrap,\n pingPong,\n smoothStep,\n sign,\n} from './scalar.js';\nexport { vec2, Vec2 } from './vec2.js';\nexport { Rect } from './rect.js';\nexport { Circle } from './circle.js';\nexport { Transform2D } from './transform2d.js';\nexport { Mat3 } from './mat3.js';\nexport { Color, type Oklab, type Oklch } from './color.js';\nexport {\n type EasingFn,\n linear,\n step,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeInQuart,\n easeOutQuart,\n easeInOutQuart,\n easeInQuint,\n easeOutQuint,\n easeInOutQuint,\n easeInSine,\n easeOutSine,\n easeInOutSine,\n easeInExpo,\n easeOutExpo,\n easeInOutExpo,\n easeInCirc,\n easeOutCirc,\n easeInOutCirc,\n easeInBack,\n easeOutBack,\n easeInOutBack,\n easeInElastic,\n easeOutElastic,\n easeInOutElastic,\n easeInBounce,\n easeOutBounce,\n easeInOutBounce,\n springIn,\n springOut,\n springInOut,\n} from './easings.js';\nexport {\n SeededRNG,\n randomFloat,\n randomInt,\n randomVec2InRect,\n randomPointInCircle,\n shuffle,\n choose,\n} from './random.js';\nexport {\n pointInRect,\n pointInCircle,\n rectVsRect,\n rectVsCircle,\n circleVsCircle,\n lineVsRect,\n lineVsCircle,\n rayVsRect,\n} from './intersection.js';\n","/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n","import { approxEquals } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc; writes into `out`. Mandatory `out` so callers avoid temporaries in hot paths. */\n normalizeOut(dx: number, dy: number, speed: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = speed / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","// 42 easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n"],"mappings":"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","names":["t2"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/scalar.ts","../src/vec2.ts","../src/rect.ts","../src/circle.ts","../src/transform2d.ts","../src/mat3.ts","../src/color.ts","../src/easings.ts","../src/random.ts","../src/reward.ts","../src/intersection.ts"],"sourcesContent":["export {\n clamp,\n lerp,\n inverseLerp,\n map,\n degToRad,\n radToDeg,\n approxEquals,\n wrap,\n pingPong,\n smoothStep,\n sign,\n angleDelta,\n rotateTowards,\n} from './scalar.js';\nexport { vec2, Vec2 } from './vec2.js';\nexport { Rect } from './rect.js';\nexport { Circle } from './circle.js';\nexport { Transform2D } from './transform2d.js';\nexport { Mat3 } from './mat3.js';\nexport { Color, type Oklab, type Oklch } from './color.js';\nexport {\n type EasingFn,\n linear,\n step,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeInQuart,\n easeOutQuart,\n easeInOutQuart,\n easeInQuint,\n easeOutQuint,\n easeInOutQuint,\n easeInSine,\n easeOutSine,\n easeInOutSine,\n easeInExpo,\n easeOutExpo,\n easeInOutExpo,\n easeInCirc,\n easeOutCirc,\n easeInOutCirc,\n easeInBack,\n easeOutBack,\n easeInOutBack,\n easeInElastic,\n easeOutElastic,\n easeInOutElastic,\n easeInBounce,\n easeOutBounce,\n easeInOutBounce,\n springIn,\n springOut,\n springInOut,\n} from './easings.js';\nexport {\n SeededRNG,\n randomFloat,\n randomInt,\n randomVec2InRect,\n randomPointInCircle,\n shuffle,\n choose,\n weightedIndex,\n weightedIndexBy,\n weightedPick,\n hashU32,\n seededIndex,\n} from './random.js';\nexport {\n cappedBonus,\n advanceWindowedStreak,\n windowExpired,\n remainingInWindow,\n} from './reward.js';\nexport {\n pointInRect,\n pointInCircle,\n rectVsRect,\n rectVsCircle,\n circleVsCircle,\n lineVsRect,\n lineVsCircle,\n rayVsRect,\n} from './intersection.js';\n","/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n\n/** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons\n * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)\n * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts\n * results by ULPs at the +/-pi boundary). */\nexport function angleDelta(a: number, b: number): number {\n let diff = a - b;\n if (diff > Math.PI) diff -= 2 * Math.PI;\n else if (diff < -Math.PI) diff += 2 * Math.PI;\n return diff;\n}\n\n/** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new\n * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */\nexport function rotateTowards(cur: number, target: number, maxStep: number): number {\n const diff = angleDelta(target, cur);\n const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;\n return cur + turn;\n}\n","import { approxEquals, rotateTowards } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc; writes into `out`. Mandatory `out` so callers avoid temporaries in hot paths. */\n normalizeOut(dx: number, dy: number, speed: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = speed / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep\n * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled\n * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */\n turnVelocityToward(\n vx: number,\n vy: number,\n dx: number,\n dy: number,\n maxStep: number,\n out: Vec2,\n ): Vec2 {\n const speed = Math.hypot(vx, vy);\n const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);\n out.x = Math.cos(newAng) * speed;\n out.y = Math.sin(newAng) * speed;\n return out;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","// 42 easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * Picks an index from a weight array using a cumulative walk.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.\n */\nexport function weightedIndex(weights: readonly number[], roll01: number): number {\n let total = 0;\n for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] ?? 0;\n if (target < acc) return i;\n }\n return weights.length - 1;\n}\n\n/**\n * Picks an index from `items` using a per-item weight accessor.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.\n */\nexport function weightedIndexBy<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): number {\n let total = 0;\n for (let i = 0; i < items.length; i++) total += weight(items[i] as T);\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < items.length; i++) {\n acc += weight(items[i] as T);\n if (target < acc) return i;\n }\n return items.length - 1;\n}\n\n/**\n * Picks an item from `items` using a per-item weight accessor.\n * Returns `undefined` for an empty array; returns the last item on float-edge.\n */\nexport function weightedPick<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): T | undefined {\n if (items.length === 0) return undefined;\n return items[weightedIndexBy(items, weight, roll01)];\n}\n\n/**\n * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds\n * decorrelate into different output values. Returns an unsigned 32-bit integer.\n *\n * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).\n */\nexport function hashU32(seed: number): number {\n let h = (seed | 0) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n return (h ^ (h >>> 16)) >>> 0;\n}\n\n/**\n * Deterministically maps `seed` to an index in [0, count).\n * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate\n * adjacent seeds before the modulo.\n */\nexport function seededIndex(seed: number, count: number): number {\n if (count <= 1) return 0;\n return hashU32(seed) % count;\n}\n","/**\n * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.\n */\n\n/**\n * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.\n * `frac` is the current multiplier (e.g. `streak * fracPerStep`);\n * `capFrac` bounds the multiplier so it cannot grow unboundedly.\n * Returns 0 for zero or negative `pay`.\n */\nexport function cappedBonus(pay: number, frac: number, capFrac: number): number {\n if (pay <= 0) return 0;\n return Math.floor(pay * Math.min(frac, capFrac));\n}\n\n/**\n * Advances a timed streak counter. A new event within `windowSec` of `lastT`\n * increments `prev`; a gap (or `lastT < 0` meaning \"no prior event\") resets\n * to 1. Pure — the caller stores the returned value and stamps the new time.\n * `elapsed` is the monotonic clock at the new event.\n */\nexport function advanceWindowedStreak(\n prev: number,\n elapsed: number,\n lastT: number,\n windowSec: number,\n): number {\n if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;\n return 1;\n}\n\n/**\n * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)\n * and more than `windowSec` seconds have passed since `lastT`.\n * `lastT < 0` means no event has ever occurred — never expired.\n */\nexport function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean {\n return lastT >= 0 && elapsed - lastT > windowSec;\n}\n\n/**\n * How many more events may be awarded in the current window given `awarded`\n * already counted. Clamped to 0 — never negative.\n */\nexport function remainingInWindow(awarded: number, capPerWindow: number): number {\n return Math.max(0, capPerWindow - awarded);\n}\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n"],"mappings":"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","names":["t2"]}
package/dist/index.mjs CHANGED
@@ -44,6 +44,17 @@ function sign(value) {
44
44
  if (Number.isNaN(value)) return 0;
45
45
  return value > 0 ? 1 : value < 0 ? -1 : 0;
46
46
  }
47
+ function angleDelta(a, b) {
48
+ let diff = a - b;
49
+ if (diff > Math.PI) diff -= 2 * Math.PI;
50
+ else if (diff < -Math.PI) diff += 2 * Math.PI;
51
+ return diff;
52
+ }
53
+ function rotateTowards(cur, target, maxStep) {
54
+ const diff = angleDelta(target, cur);
55
+ const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;
56
+ return cur + turn;
57
+ }
47
58
 
48
59
  // src/vec2.ts
49
60
  function vec2(x = 0, y = 0) {
@@ -236,6 +247,16 @@ var Vec2 = {
236
247
  return out;
237
248
  }
238
249
  return { x: v.x * inv, y: v.y * inv };
250
+ },
251
+ /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep
252
+ * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled
253
+ * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */
254
+ turnVelocityToward(vx, vy, dx, dy, maxStep, out) {
255
+ const speed = Math.hypot(vx, vy);
256
+ const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);
257
+ out.x = Math.cos(newAng) * speed;
258
+ out.y = Math.sin(newAng) * speed;
259
+ return out;
239
260
  }
240
261
  };
241
262
 
@@ -849,6 +870,60 @@ function choose(array) {
849
870
  if (array.length === 0) return void 0;
850
871
  return array[Math.floor(Math.random() * array.length)];
851
872
  }
873
+ function weightedIndex(weights, roll01) {
874
+ let total = 0;
875
+ for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;
876
+ if (total <= 0) return 0;
877
+ const target = roll01 * total;
878
+ let acc = 0;
879
+ for (let i = 0; i < weights.length; i++) {
880
+ acc += weights[i] ?? 0;
881
+ if (target < acc) return i;
882
+ }
883
+ return weights.length - 1;
884
+ }
885
+ function weightedIndexBy(items, weight, roll01) {
886
+ let total = 0;
887
+ for (let i = 0; i < items.length; i++) total += weight(items[i]);
888
+ if (total <= 0) return 0;
889
+ const target = roll01 * total;
890
+ let acc = 0;
891
+ for (let i = 0; i < items.length; i++) {
892
+ acc += weight(items[i]);
893
+ if (target < acc) return i;
894
+ }
895
+ return items.length - 1;
896
+ }
897
+ function weightedPick(items, weight, roll01) {
898
+ if (items.length === 0) return void 0;
899
+ return items[weightedIndexBy(items, weight, roll01)];
900
+ }
901
+ function hashU32(seed) {
902
+ let h = (seed | 0) >>> 0;
903
+ h = Math.imul(h ^ h >>> 16, 73244475) >>> 0;
904
+ h = Math.imul(h ^ h >>> 16, 73244475) >>> 0;
905
+ return (h ^ h >>> 16) >>> 0;
906
+ }
907
+ function seededIndex(seed, count) {
908
+ if (count <= 1) return 0;
909
+ return hashU32(seed) % count;
910
+ }
911
+
912
+ // src/reward.ts
913
+ function cappedBonus(pay, frac, capFrac) {
914
+ if (pay <= 0) return 0;
915
+ return Math.floor(pay * Math.min(frac, capFrac));
916
+ }
917
+ function advanceWindowedStreak(prev, elapsed, lastT, windowSec) {
918
+ if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;
919
+ return 1;
920
+ }
921
+ function windowExpired(elapsed, lastT, windowSec) {
922
+ return lastT >= 0 && elapsed - lastT > windowSec;
923
+ }
924
+ function remainingInWindow(awarded, capPerWindow) {
925
+ return Math.max(0, capPerWindow - awarded);
926
+ }
852
927
 
853
928
  // src/intersection.ts
854
929
  function pointInRect(p, r) {
@@ -943,7 +1018,10 @@ export {
943
1018
  SeededRNG,
944
1019
  Transform2D,
945
1020
  Vec2,
1021
+ advanceWindowedStreak,
1022
+ angleDelta,
946
1023
  approxEquals,
1024
+ cappedBonus,
947
1025
  choose,
948
1026
  circleVsCircle,
949
1027
  clamp,
@@ -978,6 +1056,7 @@ export {
978
1056
  easeOutQuart,
979
1057
  easeOutQuint,
980
1058
  easeOutSine,
1059
+ hashU32,
981
1060
  inverseLerp,
982
1061
  lerp,
983
1062
  lineVsCircle,
@@ -995,6 +1074,9 @@ export {
995
1074
  rayVsRect,
996
1075
  rectVsCircle,
997
1076
  rectVsRect,
1077
+ remainingInWindow,
1078
+ rotateTowards,
1079
+ seededIndex,
998
1080
  shuffle,
999
1081
  sign,
1000
1082
  smoothStep,
@@ -1003,6 +1085,10 @@ export {
1003
1085
  springOut,
1004
1086
  step,
1005
1087
  vec2,
1088
+ weightedIndex,
1089
+ weightedIndexBy,
1090
+ weightedPick,
1091
+ windowExpired,
1006
1092
  wrap
1007
1093
  };
1008
1094
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scalar.ts","../src/vec2.ts","../src/rect.ts","../src/circle.ts","../src/transform2d.ts","../src/mat3.ts","../src/color.ts","../src/easings.ts","../src/random.ts","../src/intersection.ts"],"sourcesContent":["/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n","import { approxEquals } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc; writes into `out`. Mandatory `out` so callers avoid temporaries in hot paths. */\n normalizeOut(dx: number, dy: number, speed: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = speed / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","// 42 easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n"],"mappings":";AACO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAM;AACjD;AAGO,SAAS,KAAK,GAAW,GAAW,GAAmB;AAC5D,SAAO,KAAK,IAAI,KAAK;AACvB;AAGO,SAAS,YAAY,GAAW,GAAW,OAAuB;AACvE,QAAM,QAAQ,IAAI;AAClB,MAAI,UAAU,EAAG,QAAO;AACxB,UAAQ,QAAQ,KAAK;AACvB;AAGO,SAAS,IACd,OACA,OACA,OACA,QACA,QACQ;AACR,SAAO,KAAK,QAAQ,QAAQ,YAAY,OAAO,OAAO,KAAK,CAAC;AAC9D;AAEA,IAAM,aAAa,KAAK,KAAK;AAC7B,IAAM,aAAa,MAAM,KAAK;AAGvB,SAAS,SAAS,SAAyB;AAChD,SAAO,UAAU;AACnB;AAGO,SAAS,SAAS,SAAyB;AAChD,SAAO,UAAU;AACnB;AAGO,SAAS,aAAa,GAAW,GAAW,UAAU,MAAe;AAC1E,SAAO,KAAK,IAAI,IAAI,CAAC,KAAK;AAC5B;AAGO,SAAS,KAAK,OAAe,KAAa,KAAqB;AACpE,QAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,QAAU,QAAQ,OAAO,QAAS,SAAS;AACpD;AAGO,SAAS,SAAS,GAAW,QAAwB;AAC1D,MAAI,WAAW,EAAG,QAAO;AACzB,QAAM,KAAK,KAAK,GAAG,GAAG,SAAS,CAAC;AAChC,SAAO,SAAS,KAAK,IAAI,KAAK,MAAM;AACtC;AAGO,SAAS,WAAW,OAAe,OAAe,GAAmB;AAC1E,QAAM,QAAQ,QAAQ;AACtB,MAAI,UAAU,EAAG,QAAO,KAAK,QAAQ,IAAI;AACzC,QAAM,IAAI,OAAO,IAAI,SAAS,OAAO,GAAG,CAAC;AACzC,SAAO,IAAI,KAAK,IAAI,IAAI;AAC1B;AAGO,SAAS,KAAK,OAAuB;AAC1C,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,SAAO,QAAQ,IAAI,IAAI,QAAQ,IAAI,KAAK;AAC1C;;;AClEO,SAAS,KAAK,IAAI,GAAG,IAAI,GAAS;AACvC,SAAO,EAAE,GAAG,EAAE;AAChB;AAIO,IAAM,OAAO;AAAA;AAAA,EAElB,OAAa;AACX,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAEA,MAAY;AACV,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAEA,KAAW;AACT,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG;AAAA,EACvB;AAAA;AAAA,EAEA,OAAa;AACX,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAEA,OAAa;AACX,WAAO,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,EACvB;AAAA;AAAA,EAEA,QAAc;AACZ,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,GAAS,GAAS,KAAkB;AACtC,QAAI,KAAK;AACP,UAAI,IAAI,EAAE,IAAI,EAAE;AAChB,UAAI,IAAI,EAAE,IAAI,EAAE;AAChB,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE;AAAA,EACtC;AAAA;AAAA,EAGA,IAAI,GAAS,GAAS,KAAkB;AACtC,QAAI,KAAK;AACP,UAAI,IAAI,EAAE,IAAI,EAAE;AAChB,UAAI,IAAI,EAAE,IAAI,EAAE;AAChB,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,GAAS,GAAW,KAAkB;AAC1C,QAAI,KAAK;AACP,UAAI,IAAI,EAAE,IAAI;AACd,UAAI,IAAI,EAAE,IAAI;AACd,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE;AAAA,EAClC;AAAA;AAAA,EAGA,UAAU,GAAS,KAAkB;AACnC,UAAM,MAAM,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC3C,QAAI,QAAQ,GAAG;AACb,UAAI,KAAK;AACP,YAAI,IAAI;AACR,YAAI,IAAI;AACR,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IACtB;AACA,UAAM,MAAM,IAAI;AAChB,QAAI,KAAK;AACP,UAAI,IAAI,EAAE,IAAI;AACd,UAAI,IAAI,EAAE,IAAI;AACd,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI;AAAA,EACtC;AAAA;AAAA,EAGA,aAAa,IAAY,IAAY,OAAe,KAAiB;AACnE,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACvC,QAAI,OAAO,MAAM;AACf,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO;AAAA,IACT;AACA,UAAM,MAAM,QAAQ;AACpB,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,GAAS,GAAiB;AAC5B,WAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAM,GAAS,GAAiB;AAC9B,WAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA,EAGA,KAAK,GAAS,GAAS,GAAW,KAAkB;AAClD,UAAM,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAC9B,UAAM,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAC9B,QAAI,KAAK;AACP,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,GAAS,GAAS,GAAW,KAAkB;AACnD,QAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAE5B,QAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;AAC9B,UAAM,QAAQ,KAAK,KAAK,CAAC;AACzB,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG;AAAA,IAC/B;AACA,UAAM,WAAW,KAAK,IAAI,KAAK;AAC/B,UAAM,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;AACvC,UAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI;AACjC,UAAM,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI;AAC3B,UAAM,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI;AAC3B,QAAI,KAAK;AACP,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB;AAAA;AAAA,EAGA,SAAS,GAAS,GAAiB;AACjC,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EACpC;AAAA;AAAA,EAGA,WAAW,GAAS,GAAiB;AACnC,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AAAA;AAAA,EAGA,OAAO,GAAiB;AACtB,WAAO,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,EACxC;AAAA;AAAA,EAGA,SAAS,GAAiB;AACxB,WAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAM,GAAiB;AACrB,WAAO,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAO,GAAS,OAAe,KAAkB;AAC/C,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI;AAC1B,UAAM,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI;AAC1B,QAAI,KAAK;AACP,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB;AAAA;AAAA,EAGA,OAAO,GAAS,GAAS,UAAU,MAAe;AAChD,WAAO,aAAa,EAAE,GAAG,EAAE,GAAG,OAAO,KAAK,aAAa,EAAE,GAAG,EAAE,GAAG,OAAO;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,GAAe;AACnB,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA,EAC1B;AAAA;AAAA,EAGA,YAAY,GAAS,WAAmB,KAAkB;AACxD,UAAM,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAClC,QAAI,SAAS,YAAY,WAAW;AAClC,UAAI,KAAK;AACP,YAAI,IAAI,EAAE;AACV,YAAI,IAAI,EAAE;AACV,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AAAA,IAC1B;AACA,UAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,UAAM,MAAM,YAAY;AACxB,QAAI,KAAK;AACP,UAAI,IAAI,EAAE,IAAI;AACd,UAAI,IAAI,EAAE,IAAI;AACd,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI;AAAA,EACtC;AACF;;;ACtNO,IAAM,OAAO;AAAA;AAAA,EAElB,SAAS,GAAS,GAAkB;AAClC,WAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;AAAA,EAC5E;AAAA;AAAA,EAGA,WAAW,GAAS,GAAkB;AACpC,WACE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,EAE7F;AAAA;AAAA,EAGA,aAAa,GAAS,GAAsB;AAC1C,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK;AACnD,UAAM,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;AACtD,QAAI,SAAS,KAAK,UAAU,EAAG,QAAO;AACtC,WAAO,EAAE,GAAG,GAAG,OAAO,QAAQ,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,GAAS,GAAe;AAC5B,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK;AACnD,UAAM,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM;AACtD,WAAO,EAAE,GAAG,GAAG,OAAO,QAAQ,GAAG,QAAQ,SAAS,EAAE;AAAA,EACtD;AAAA;AAAA,EAGA,WAAW,QAA+B;AACxC,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAClE,QAAI,OAAO,OAAO,CAAC,EAAG;AACtB,QAAI,OAAO,OAAO,CAAC,EAAG;AACtB,QAAI,OAAO;AACX,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AACzB,UAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AACzB,UAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AACzB,UAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AAAA,IAC3B;AACA,WAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AAAA,EACrE;AAAA;AAAA,EAGA,OAAO,GAAe;AACpB,WAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI;AAAA,EAC3D;AAAA;AAAA,EAGA,OAAO,GAAS,QAAsB;AACpC,WAAO;AAAA,MACL,GAAG,EAAE,IAAI;AAAA,MACT,GAAG,EAAE,IAAI;AAAA,MACT,OAAO,EAAE,QAAQ,SAAS;AAAA,MAC1B,QAAQ,EAAE,SAAS,SAAS;AAAA,IAC9B;AAAA,EACF;AACF;;;AC9DO,IAAM,SAAS;AAAA;AAAA,EAEpB,SAAS,GAAW,GAAkB;AACpC,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,WAAO,KAAK,KAAK,KAAK,MAAM,EAAE,SAAS,EAAE;AAAA,EAC3C;AAAA;AAAA,EAGA,WAAW,GAAW,GAAoB;AACxC,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,KAAK,EAAE,IAAI,EAAE;AACnB,UAAM,SAAS,KAAK,KAAK,KAAK;AAC9B,UAAM,SAAS,EAAE,SAAS,EAAE;AAC5B,WAAO,SAAS,SAAS;AAAA,EAC3B;AAAA;AAAA,EAGA,eAAe,GAAW,GAAkB;AAE1C,UAAM,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC3E,UAAM,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AAC7E,UAAM,KAAK,EAAE,IAAI;AACjB,UAAM,KAAK,EAAE,IAAI;AACjB,WAAO,KAAK,KAAK,KAAK,MAAM,EAAE,SAAS,EAAE;AAAA,EAC3C;AACF;;;ACvBO,IAAM,cAAc;AAAA;AAAA,EAEzB,WAAwB;AACtB,WAAO,EAAE,UAAU,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,UAAU,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AAAA,EACxE;AAAA;AAAA,EAGA,OAAO,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAgB;AACtE,WAAO;AAAA,MACL,UAAU,EAAE,GAAG,EAAE;AAAA,MACjB;AAAA,MACA,OAAO,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,GAAgB,OAAmB;AAC9C,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ;AAC7B,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ;AAC7B,UAAM,KAAK,MAAM,IAAI,EAAE,MAAM;AAC7B,UAAM,KAAK,MAAM,IAAI,EAAE,MAAM;AAC7B,WAAO;AAAA,MACL,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS;AAAA,MAChC,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,GAAgB,OAAmB;AAC9C,UAAM,KAAK,MAAM,IAAI,EAAE,SAAS;AAChC,UAAM,KAAK,MAAM,IAAI,EAAE,SAAS;AAChC,UAAM,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ;AAC9B,UAAM,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ;AAC9B,UAAM,KAAK,KAAK,IAAI,KAAK;AACzB,UAAM,KAAK,KAAK,IAAI,KAAK;AACzB,WAAO;AAAA,MACL,GAAG,EAAE,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI;AAAA,MACtC,GAAG,EAAE,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI;AAAA,IACxC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,GAA6B;AACjC,WAAO;AAAA,MACL,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,SAAS,EAAE;AAAA,MAC7C,UAAU,EAAE;AAAA,MACZ,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE;AAAA,IACtC;AAAA,EACF;AACF;;;AC9CO,IAAM,OAAO;AAAA;AAAA,EAElB,SAAe;AACb,UAAM,IAAI,IAAI,aAAa,CAAC;AAC5B,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,GAAe;AACtB,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,GAAS,GAAS,KAAkB;AAC3C,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AAEX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AAEX,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,MAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,IAAY,IAAY,KAAkB;AAClD,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,OAAe,KAAkB;AACtC,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,CAAC;AACR,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,IAAY,IAAY,KAAkB;AAC9C,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,GAAS,KAAyB;AACvC,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,UAAM,MAAM,EAAE,CAAC,GACb,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AAEX,UAAM,MACJ,OAAO,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,MAAM;AAE3F,QAAI,KAAK,IAAI,GAAG,IAAI,KAAM,QAAO;AAEjC,UAAM,SAAS,IAAI;AACnB,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,MAAE,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO;AACjC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,GAAgB,KAAkB;AAC9C,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ;AAC7B,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ;AAC7B,UAAM,KAAK,EAAE,MAAM;AACnB,UAAM,KAAK,EAAE,MAAM;AACnB,UAAM,IAAI,OAAO,IAAI,aAAa,CAAC;AACnC,MAAE,CAAC,IAAI,IAAI;AACX,MAAE,CAAC,IAAI,IAAI;AACX,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,CAAC,IAAI;AACZ,MAAE,CAAC,IAAI,IAAI;AACX,MAAE,CAAC,IAAI;AACP,MAAE,CAAC,IAAI,EAAE,SAAS;AAClB,MAAE,CAAC,IAAI,EAAE,SAAS;AAClB,MAAE,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AACF;;;ACvJA,SAAS,aAAa,GAAmB;AACvC,SAAO,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AAC7D;AAGA,SAAS,aAAa,GAAmB;AACvC,SAAO,KAAK,WAAY,QAAQ,IAAI,QAAQ,MAAM,IAAI,OAAO;AAC/D;AAEO,IAAM,QAAQ;AAAA,EACnB,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA;AAAA,EAGtC,OAAO,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAU;AACxC,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAGA,QAAQ,KAAoB;AAE1B,QAAI,IAAI,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;AAE7C,QAAI,EAAE,WAAW,GAAG;AAClB,UAAI,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC;AAAA,IACjD,WAAW,EAAE,WAAW,GAAG;AACzB,UAAI,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC,IAAK,EAAE,CAAC;AAAA,IACjE;AAEA,UAAM,IAAI,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC/C,UAAM,IAAI,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC/C,UAAM,IAAI,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC/C,UAAM,IAAI,EAAE,UAAU,IAAI,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,MAAM;AACrE,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,GAAkB;AACtB,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,EACxC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,EACxC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,EACxC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,QAAI,EAAE,IAAI,GAAG;AACX,YAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,EACxC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,aAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,IAC1B;AACA,WAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,EACtB;AAAA;AAAA,EAGA,KAAK,GAAU,GAAU,GAAkB;AACzC,WAAO;AAAA,MACL,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,MACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,MACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,MACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,GAAU,GAAiB;AAClC,WAAO;AAAA,MACL,GAAG,EAAE,IAAI,EAAE;AAAA,MACX,GAAG,EAAE,IAAI,EAAE;AAAA,MACX,GAAG,EAAE,IAAI,EAAE;AAAA,MACX,GAAG,EAAE,IAAI,EAAE;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,GAAkB;AAC1B,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI;AAC/C,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI;AAC/C,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI;AAC/C,UAAM,IAAI,KAAK,MAAM,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI;AAC/C,YAAS,KAAK,KAAO,KAAK,KAAO,KAAK,IAAK,OAAO;AAAA,EACpD;AAAA;AAAA,EAGA,QAAQ,GAAiB;AACvB,UAAM,KAAK,aAAa,EAAE,CAAC;AAC3B,UAAM,KAAK,aAAa,EAAE,CAAC;AAC3B,UAAM,KAAK,aAAa,EAAE,CAAC;AAE3B,UAAM,IAAI,eAAe,KAAK,eAAe,KAAK,eAAe;AACjE,UAAM,IAAI,eAAe,KAAK,eAAe,KAAK,eAAe;AACjE,UAAM,IAAI,eAAe,KAAK,eAAe,KAAK,eAAe;AAEjE,UAAM,KAAK,KAAK,KAAK,CAAC;AACtB,UAAM,KAAK,KAAK,KAAK,CAAC;AACtB,UAAM,KAAK,KAAK,KAAK,CAAC;AAEtB,WAAO;AAAA,MACL,GAAG,eAAe,KAAK,cAAc,KAAK,eAAe;AAAA,MACzD,GAAG,eAAe,KAAK,cAAc,KAAK,eAAe;AAAA,MACzD,GAAG,eAAe,KAAK,eAAe,KAAK,cAAc;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAY,QAAQ,GAAU;AACtC,UAAM,KAAK,IAAI,IAAI,eAAe,IAAI,IAAI,eAAe,IAAI;AAC7D,UAAM,KAAK,IAAI,IAAI,eAAe,IAAI,IAAI,eAAe,IAAI;AAC7D,UAAM,KAAK,IAAI,IAAI,eAAe,IAAI,IAAI,cAAc,IAAI;AAE5D,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,MAAM;AAChB,UAAM,IAAI,MAAM;AAEhB,UAAM,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe;AAChE,UAAM,KAAK,gBAAgB,IAAI,eAAe,IAAI,eAAe;AACjE,UAAM,KAAK,gBAAgB,IAAI,eAAe,IAAI,cAAc;AAEhE,WAAO;AAAA,MACL,GAAG,MAAM,aAAa,EAAE,GAAG,GAAG,CAAC;AAAA,MAC/B,GAAG,MAAM,aAAa,EAAE,GAAG,GAAG,CAAC;AAAA,MAC/B,GAAG,MAAM,aAAa,EAAE,GAAG,GAAG,CAAC;AAAA,MAC/B,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,GAAiB;AACvB,UAAM,MAAM,MAAM,QAAQ,CAAC;AAC3B,UAAM,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC;AACjC,UAAM,IAAI,IAAI,OAAO,KAAM,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,MAAO,KAAK,KAAK,OAAO;AAC9E,WAAO,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAY,QAAQ,GAAU;AACtC,UAAM,YAAa,IAAI,IAAI,MAAO,OAAO;AACzC,UAAM,OAAQ,WAAW,KAAK,KAAM;AACpC,WAAO,MAAM;AAAA,MACX,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,GAAU,GAAkB;AACnC,WAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC7D;AAAA;AAAA,EAGA,YAAY,GAAU,GAAkB;AACtC,WAAO,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,kBAAkB,GAAkB;AAClC,WAAO,SAAS,aAAa,EAAE,CAAC,IAAI,SAAS,aAAa,EAAE,CAAC,IAAI,SAAS,aAAa,EAAE,CAAC;AAAA,EAC5F;AAAA;AAAA,EAGA,cAAc,IAAW,IAAmB;AAC1C,UAAM,KAAK,MAAM,kBAAkB,EAAE;AACrC,UAAM,KAAK,MAAM,kBAAkB,EAAE;AACrC,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,YAAQ,OAAO,SAAS,OAAO;AAAA,EACjC;AACF;;;AC/LA,IAAM,KAAK,KAAK;AAChB,IAAM,UAAU,KAAK;AACrB,IAAM,MAAM,KAAK;AAGV,SAAS,OAAO,GAAmB;AACxC,SAAO;AACT;AAGO,SAAS,KAAK,GAAmB;AACtC,SAAO,IAAI,IAAI,IAAI;AACrB;AAGO,SAAS,WAAW,GAAmB;AAC5C,SAAO,IAAI;AACb;AACO,SAAS,YAAY,GAAmB;AAC7C,SAAO,KAAK,IAAI;AAClB;AACO,SAAS,cAAc,GAAmB;AAC/C,SAAO,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK;AAClD;AAGO,SAAS,YAAY,GAAmB;AAC7C,SAAO,IAAI,IAAI;AACjB;AACO,SAAS,aAAa,GAAmB;AAC9C,QAAM,KAAK,IAAI;AACf,SAAO,KAAK,KAAK,KAAK;AACxB;AACO,SAAS,eAAe,GAAmB;AAChD,SAAO,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI;AACxE;AAGO,SAAS,YAAY,GAAmB;AAC7C,SAAO,IAAI,IAAI,IAAI;AACrB;AACO,SAAS,aAAa,GAAmB;AAC9C,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,KAAK,KAAK,KAAK;AAC5B;AACO,SAAS,eAAe,GAAmB;AAChD,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAC9D;AAGO,SAAS,YAAY,GAAmB;AAC7C,SAAO,IAAI,IAAI,IAAI,IAAI;AACzB;AACO,SAAS,aAAa,GAAmB;AAC9C,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,KAAK,KAAK,KAAK,KAAK;AACjC;AACO,SAAS,eAAe,GAAmB;AAChD,QAAM,KAAK,IAAI;AACf,SAAO,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AACzE;AAGO,SAAS,WAAW,GAAmB;AAC5C,SAAO,IAAI,KAAK,IAAI,IAAI,OAAO;AACjC;AACO,SAAS,YAAY,GAAmB;AAC7C,SAAO,KAAK,IAAI,IAAI,OAAO;AAC7B;AACO,SAAS,cAAc,GAAmB;AAC/C,SAAO,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC;AACnC;AAGO,SAAS,WAAW,GAAmB;AAC5C,SAAO,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AACvC;AACO,SAAS,YAAY,GAAmB;AAC7C,SAAO,MAAM,IAAI,IAAI,IAAI,MAAM,MAAM;AACvC;AACO,SAAS,cAAc,GAAmB;AAC/C,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,IAAI,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI;AACxE;AAGO,SAAS,WAAW,GAAmB;AAC5C,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC;AAChC;AACO,SAAS,YAAY,GAAmB;AAC7C,QAAM,KAAK,IAAI;AACf,SAAO,KAAK,KAAK,IAAI,KAAK,EAAE;AAC9B;AACO,SAAS,cAAc,GAAmB;AAC/C,SAAO,IAAI,MACP,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAClC,OAAO,KAAK,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,IAAI;AACxD;AAGA,IAAM,IAAI;AACV,IAAM,KAAK,IAAI;AAER,SAAS,WAAW,GAAmB;AAC5C,SAAO,IAAI,MAAM,IAAI,KAAK,IAAI;AAChC;AACO,SAAS,YAAY,GAAmB;AAC7C,QAAM,KAAK,IAAI;AACf,SAAO,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK;AACxC;AACO,SAAS,cAAc,GAAmB;AAC/C,MAAI,IAAI,KAAK;AACX,UAAMA,MAAK,IAAI;AACf,WAAO,OAAOA,MAAKA,QAAO,KAAK,KAAKA,MAAK;AAAA,EAC3C;AACA,QAAM,KAAK,IAAI,IAAI;AACnB,SAAO,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,MAAM;AACjD;AAGO,SAAS,cAAc,GAAmB;AAC/C,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,SAAO,EAAE,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,UAAU,MAAM,EAAE;AACtE;AACO,SAAS,eAAe,GAAmB;AAChD,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,SAAO,MAAM,MAAM,KAAK,KAAK,KAAK,IAAI,KAAK,SAAS,MAAM,EAAE,IAAI;AAClE;AACO,SAAS,iBAAiB,GAAmB;AAClD,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,QAAM,IAAI,MAAM;AAChB,SAAO,IAAI,MACP,OAAO,MAAM,KAAK,IAAI,MAAM,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,IAC1D,MAAM,MAAM,MAAM,IAAI,MAAM,KAAK,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI;AACpE;AAGO,SAAS,cAAc,GAAmB;AAC/C,MAAI,IAAI,IAAI,MAAM;AAChB,WAAO,SAAS,IAAI;AAAA,EACtB;AACA,MAAI,IAAI,IAAI,MAAM;AAChB,UAAMA,MAAK,IAAI,MAAM;AACrB,WAAO,SAASA,MAAKA,MAAK;AAAA,EAC5B;AACA,MAAI,IAAI,MAAM,MAAM;AAClB,UAAMA,MAAK,IAAI,OAAO;AACtB,WAAO,SAASA,MAAKA,MAAK;AAAA,EAC5B;AACA,QAAM,KAAK,IAAI,QAAQ;AACvB,SAAO,SAAS,KAAK,KAAK;AAC5B;AACO,SAAS,aAAa,GAAmB;AAC9C,SAAO,IAAI,cAAc,IAAI,CAAC;AAChC;AACO,SAAS,gBAAgB,GAAmB;AACjD,SAAO,IAAI,MAAM,MAAM,aAAa,IAAI,CAAC,IAAI,MAAM,cAAc,IAAI,IAAI,CAAC,IAAI;AAChF;AAGO,SAAS,SAAS,GAAmB;AAC1C,SAAO,IAAI,MAAM,UAAU,KAAK,IAAI;AACtC;AACO,SAAS,UAAU,GAAmB;AAC3C,QAAM,KAAK,IAAI;AACf,SAAO,KAAK,OAAO,UAAU,KAAK,KAAK,WAAW;AACpD;AACO,SAAS,YAAY,GAAmB;AAC7C,MAAI,IAAI,KAAK;AACX,UAAMA,MAAK,IAAI;AACf,WAAO,MAAMA,MAAKA,QAAO,KAAK,KAAKA,MAAK;AAAA,EAC1C;AACA,QAAM,KAAK,IAAI,IAAI;AACnB,SAAO,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,MAAM;AACjD;;;AChLO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EAER,YAAY,MAAc;AACxB,SAAK,QAAQ,OAAO;AAAA,EACtB;AAAA;AAAA,EAGA,OAAe;AACb,SAAK,QAAS,KAAK,QAAQ,aAAc;AACzC,QAAI,IAAI,KAAK,KAAK,KAAK,QAAS,KAAK,UAAU,IAAK,IAAI,KAAK,KAAK;AAClE,QAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,CAAC,IAAK;AAC7C,aAAS,IAAK,MAAM,QAAS,KAAK;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,KAAa,KAAqB;AACtC,WAAO,MAAM,KAAK,KAAK,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,KAAa,KAAqB;AACpC,WAAO,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,EAC5C;AACF;AAGO,SAAS,YAAY,KAAa,KAAqB;AAC5D,SAAO,MAAM,KAAK,OAAO,KAAK,MAAM;AACtC;AAGO,SAAS,UAAU,KAAa,KAAqB;AAC1D,SAAO,KAAK,MAAM,YAAY,KAAK,MAAM,CAAC,CAAC;AAC7C;AAGO,SAAS,iBAAiB,GAAe;AAC9C,SAAO;AAAA,IACL,GAAG,EAAE,IAAI,KAAK,OAAO,IAAI,EAAE;AAAA,IAC3B,GAAG,EAAE,IAAI,KAAK,OAAO,IAAI,EAAE;AAAA,EAC7B;AACF;AAGO,SAAS,oBAAoB,IAAY,IAAY,QAAsB;AAEhF,QAAM,IAAI,SAAS,KAAK,KAAK,KAAK,OAAO,CAAC;AAC1C,QAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,KAAK;AACxC,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,IAC1B,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,EAC5B;AACF;AAGO,SAAS,QAAW,OAAiB;AAC1C,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,UAAM,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE;AAC5C,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,CAAC,IAAI,MAAM,CAAC;AAClB,UAAM,CAAC,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAGO,SAAS,OAAU,OAAoC;AAC5D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AACvD;;;ACrEO,SAAS,YAAY,GAAS,GAAkB;AACrD,SAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;AAC5E;AAGO,SAAS,cAAc,GAAS,GAAoB;AACzD,QAAM,KAAK,EAAE,IAAI,EAAE;AACnB,QAAM,KAAK,EAAE,IAAI,EAAE;AACnB,SAAO,KAAK,KAAK,KAAK,MAAM,EAAE,SAAS,EAAE;AAC3C;AAGO,SAAS,WAAW,GAAS,GAAkB;AACpD,SAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;AAClG;AAGO,SAAS,aAAa,GAAS,GAAoB;AACxD,QAAM,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC3E,QAAM,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;AAC7E,QAAM,KAAK,EAAE,IAAI;AACjB,QAAM,KAAK,EAAE,IAAI;AACjB,SAAO,KAAK,KAAK,KAAK,MAAM,EAAE,SAAS,EAAE;AAC3C;AAGO,SAAS,eAAe,GAAW,GAAoB;AAC5D,QAAM,KAAK,EAAE,IAAI,EAAE;AACnB,QAAM,KAAK,EAAE,IAAI,EAAE;AACnB,QAAM,SAAS,EAAE,SAAS,EAAE;AAC5B,SAAO,KAAK,KAAK,KAAK,KAAK,SAAS;AACtC;AAGO,SAAS,WAAW,IAAY,IAAY,IAAY,IAAY,GAAkB;AAC3F,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAEhB,MAAI,OAAO;AACX,MAAI,OAAO;AAGX,QAAM,QAAQ;AAAA,IACZ,EAAE,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE;AAAA,IACtB,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG;AAAA,IAC/B,EAAE,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE;AAAA,IACtB,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG;AAAA,EAClC;AAEA,aAAW,EAAE,GAAG,EAAE,KAAK,OAAO;AAC5B,QAAI,KAAK,IAAI,CAAC,IAAI,OAAO;AAEvB,UAAI,IAAI,EAAG,QAAO;AAAA,IACpB,OAAO;AACL,YAAM,IAAI,IAAI;AACd,UAAI,IAAI,GAAG;AACT,YAAI,IAAI,KAAM,QAAO;AACrB,YAAI,IAAI,KAAM,QAAO;AAAA,MACvB,OAAO;AACL,YAAI,IAAI,KAAM,QAAO;AACrB,YAAI,IAAI,KAAM,QAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ;AACjB;AAGO,SAAS,aAAa,IAAY,IAAY,IAAY,IAAY,GAAoB;AAC/F,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,EAAE;AAClB,QAAM,KAAK,KAAK,EAAE;AAElB,QAAM,IAAI,KAAK,KAAK,KAAK;AACzB,QAAM,IAAI,KAAK,KAAK,KAAK,KAAK;AAC9B,QAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,SAAS,EAAE;AAG5C,MAAI,IAAI,OAAO;AACb,WAAO,MAAM;AAAA,EACf;AAEA,MAAI,eAAe,IAAI,IAAI,IAAI,IAAI;AACnC,MAAI,eAAe,EAAG,QAAO;AAE7B,iBAAe,KAAK,KAAK,YAAY;AACrC,QAAM,MAAM,CAAC,IAAI,iBAAiB,IAAI;AACtC,QAAM,MAAM,CAAC,IAAI,iBAAiB,IAAI;AAGtC,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAE/B,MAAI,KAAK,KAAK,KAAK,EAAG,QAAO;AAE7B,SAAO;AACT;AAGO,SAAS,UACd,SACA,SACA,MACA,MACA,GACe;AACf,QAAM,QAAQ,SAAS,IAAI,IAAI,OAAO,OAAO;AAC7C,QAAM,QAAQ,SAAS,IAAI,IAAI,OAAO,OAAO;AAE7C,QAAM,OAAO,EAAE,IAAI,WAAW;AAC9B,QAAM,OAAO,EAAE,IAAI,EAAE,QAAQ,WAAW;AACxC,QAAM,OAAO,EAAE,IAAI,WAAW;AAC9B,QAAM,OAAO,EAAE,IAAI,EAAE,SAAS,WAAW;AAEzC,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAC5D,QAAM,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAE5D,MAAI,OAAO,KAAK,OAAO,KAAM,QAAO;AAEpC,SAAO,QAAQ,IAAI,OAAO;AAC5B;","names":["t2"]}
1
+ {"version":3,"sources":["../src/scalar.ts","../src/vec2.ts","../src/rect.ts","../src/circle.ts","../src/transform2d.ts","../src/mat3.ts","../src/color.ts","../src/easings.ts","../src/random.ts","../src/reward.ts","../src/intersection.ts"],"sourcesContent":["/** Clamps value between min and max. */\nexport function clamp(value: number, min: number, max: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/** Linearly interpolates between a and b by t (unclamped). */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** Returns the interpolation factor of value between a and b. */\nexport function inverseLerp(a: number, b: number, value: number): number {\n const range = b - a;\n if (range === 0) return 0;\n return (value - a) / range;\n}\n\n/** Maps value from [inMin, inMax] to [outMin, outMax]. */\nexport function map(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n): number {\n return lerp(outMin, outMax, inverseLerp(inMin, inMax, value));\n}\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\n/** Converts degrees to radians. */\nexport function degToRad(degrees: number): number {\n return degrees * DEG_TO_RAD;\n}\n\n/** Converts radians to degrees. */\nexport function radToDeg(radians: number): number {\n return radians * RAD_TO_DEG;\n}\n\n/** Returns true if a and b are approximately equal within epsilon. */\nexport function approxEquals(a: number, b: number, epsilon = 1e-6): boolean {\n return Math.abs(a - b) <= epsilon;\n}\n\n/** Wraps value into [min, max) range. */\nexport function wrap(value: number, min: number, max: number): number {\n const range = max - min;\n if (range === 0) return min;\n return min + ((((value - min) % range) + range) % range);\n}\n\n/** PingPong — bounces value back and forth in [0, length]. */\nexport function pingPong(t: number, length: number): number {\n if (length === 0) return 0;\n const tt = wrap(t, 0, length * 2);\n return length - Math.abs(tt - length);\n}\n\n/** Hermite smooth interpolation (0→1) with zero first-derivative at edges. */\nexport function smoothStep(edge0: number, edge1: number, x: number): number {\n const range = edge1 - edge0;\n if (range === 0) return x >= edge1 ? 1 : 0;\n const t = clamp((x - edge0) / range, 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** Returns -1, 0, or 1. Unlike Math.sign, returns 0 for NaN. */\nexport function sign(value: number): number {\n if (Number.isNaN(value)) return 0;\n return value > 0 ? 1 : value < 0 ? -1 : 0;\n}\n\n/** Shortest signed angle delta a - b, wrapped to [-pi, pi] (closed both ends — strict comparisons\n * leave exact +/-pi unwrapped). Branch form (single +/-2pi correction)\n * — byte-identical to hand-rolled aim/homing turn math; do NOT swap for a modulo form (it shifts\n * results by ULPs at the +/-pi boundary). */\nexport function angleDelta(a: number, b: number): number {\n let diff = a - b;\n if (diff > Math.PI) diff -= 2 * Math.PI;\n else if (diff < -Math.PI) diff += 2 * Math.PI;\n return diff;\n}\n\n/** Rotates angle cur toward target by at most maxStep radians, shortest direction. Returns the new\n * angle (NOT re-wrapped). Branch-form step clamp — byte-identical to hand-rolled homing steering. */\nexport function rotateTowards(cur: number, target: number, maxStep: number): number {\n const diff = angleDelta(target, cur);\n const turn = diff > maxStep ? maxStep : diff < -maxStep ? -maxStep : diff;\n return cur + turn;\n}\n","import { approxEquals, rotateTowards } from './scalar.js';\n\n/** Vec2 plain object type — no class, no GC pressure. */\nexport type Vec2 = { x: number; y: number };\n\n/** Creates a Vec2 plain object. */\nexport function vec2(x = 0, y = 0): Vec2 {\n return { x, y };\n}\n\n// ─── Static namespace ───────────────────────────────────────────\n\nexport const Vec2 = {\n /** Returns { 0, 0 }. */\n zero(): Vec2 {\n return { x: 0, y: 0 };\n },\n /** Returns { 1, 1 }. */\n one(): Vec2 {\n return { x: 1, y: 1 };\n },\n /** Returns { 0, -1 }. */\n up(): Vec2 {\n return { x: 0, y: -1 };\n },\n /** Returns { 0, 1 }. */\n down(): Vec2 {\n return { x: 0, y: 1 };\n },\n /** Returns { -1, 0 }. */\n left(): Vec2 {\n return { x: -1, y: 0 };\n },\n /** Returns { 1, 0 }. */\n right(): Vec2 {\n return { x: 1, y: 0 };\n },\n\n /** Component-wise addition. Writes into out if provided. */\n add(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x + b.x;\n out.y = a.y + b.y;\n return out;\n }\n return { x: a.x + b.x, y: a.y + b.y };\n },\n\n /** Component-wise subtraction a - b. */\n sub(a: Vec2, b: Vec2, out?: Vec2): Vec2 {\n if (out) {\n out.x = a.x - b.x;\n out.y = a.y - b.y;\n return out;\n }\n return { x: a.x - b.x, y: a.y - b.y };\n },\n\n /** Scales a vector by a scalar. */\n scale(v: Vec2, s: number, out?: Vec2): Vec2 {\n if (out) {\n out.x = v.x * s;\n out.y = v.y * s;\n return out;\n }\n return { x: v.x * s, y: v.y * s };\n },\n\n /** Returns a unit vector. Returns zero vector if length is 0. */\n normalize(v: Vec2, out?: Vec2): Vec2 {\n const len = Math.sqrt(v.x * v.x + v.y * v.y);\n if (len === 0) {\n if (out) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n return { x: 0, y: 0 };\n }\n const inv = 1 / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc; writes into `out`. Mandatory `out` so callers avoid temporaries in hot paths. */\n normalizeOut(dx: number, dy: number, speed: number, out: Vec2): Vec2 {\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len <= 1e-6) {\n out.x = 0;\n out.y = 0;\n return out;\n }\n const inv = speed / len;\n out.x = dx * inv;\n out.y = dy * inv;\n return out;\n },\n\n /** Dot product. */\n dot(a: Vec2, b: Vec2): number {\n return a.x * b.x + a.y * b.y;\n },\n\n /** 2D cross product (z-component of the 3D cross). */\n cross(a: Vec2, b: Vec2): number {\n return a.x * b.y - a.y * b.x;\n },\n\n /** Linearly interpolates between a and b (unclamped). */\n lerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n const x = a.x + (b.x - a.x) * t;\n const y = a.y + (b.y - a.y) * t;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Spherical linear interpolation for unit vectors. */\n slerp(a: Vec2, b: Vec2, t: number, out?: Vec2): Vec2 {\n let d = a.x * b.x + a.y * b.y;\n // Clamp dot to [-1, 1] for numerical safety\n d = d < -1 ? -1 : d > 1 ? 1 : d;\n const theta = Math.acos(d);\n if (theta < 1e-6) {\n return Vec2.lerp(a, b, t, out);\n }\n const sinTheta = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sinTheta;\n const wb = Math.sin(t * theta) / sinTheta;\n const x = a.x * wa + b.x * wb;\n const y = a.y * wa + b.y * wb;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Euclidean distance between two points. */\n distance(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /** Squared distance (avoids sqrt). */\n distanceSq(a: Vec2, b: Vec2): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return dx * dx + dy * dy;\n },\n\n /** Length of a vector. */\n length(v: Vec2): number {\n return Math.sqrt(v.x * v.x + v.y * v.y);\n },\n\n /** Squared length (avoids sqrt). */\n lengthSq(v: Vec2): number {\n return v.x * v.x + v.y * v.y;\n },\n\n /** Angle of vector in radians (atan2). */\n angle(v: Vec2): number {\n return Math.atan2(v.y, v.x);\n },\n\n /** Rotates a vector by angle (radians) around origin. */\n rotate(v: Vec2, angle: number, out?: Vec2): Vec2 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const x = v.x * c - v.y * s;\n const y = v.x * s + v.y * c;\n if (out) {\n out.x = x;\n out.y = y;\n return out;\n }\n return { x, y };\n },\n\n /** Component-wise approximate equality. */\n equals(a: Vec2, b: Vec2, epsilon = 1e-6): boolean {\n return approxEquals(a.x, b.x, epsilon) && approxEquals(a.y, b.y, epsilon);\n },\n\n /** Returns a copy of the vector. */\n clone(v: Vec2): Vec2 {\n return { x: v.x, y: v.y };\n },\n\n /** Clamps the length of a vector to maxLength. */\n clampLength(v: Vec2, maxLength: number, out?: Vec2): Vec2 {\n const lenSq = v.x * v.x + v.y * v.y;\n if (lenSq <= maxLength * maxLength) {\n if (out) {\n out.x = v.x;\n out.y = v.y;\n return out;\n }\n return { x: v.x, y: v.y };\n }\n const len = Math.sqrt(lenSq);\n const inv = maxLength / len;\n if (out) {\n out.x = v.x * inv;\n out.y = v.y * inv;\n return out;\n }\n return { x: v.x * inv, y: v.y * inv };\n },\n\n /** Zero-alloc homing steer: rotate velocity (vx,vy) toward direction (dx,dy) by at most maxStep\n * radians, preserving speed; writes into out. Mandatory out. Byte-identical to hand-rolled\n * homing-bullet steering (Math.hypot speed + atan2 + branch-form turn + cos/sin * speed). */\n turnVelocityToward(\n vx: number,\n vy: number,\n dx: number,\n dy: number,\n maxStep: number,\n out: Vec2,\n ): Vec2 {\n const speed = Math.hypot(vx, vy);\n const newAng = rotateTowards(Math.atan2(vy, vx), Math.atan2(dy, dx), maxStep);\n out.x = Math.cos(newAng) * speed;\n out.y = Math.sin(newAng) * speed;\n return out;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** Axis-aligned bounding box. */\nexport type Rect = { x: number; y: number; width: number; height: number };\n\nexport const Rect = {\n /** Returns true if point is inside rect (inclusive). */\n contains(r: Rect, p: Vec2): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n },\n\n /** Returns true if two rects overlap (share area). */\n intersects(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y\n );\n },\n\n /** Returns the overlapping rect, or null if no overlap. */\n intersection(a: Rect, b: Rect): Rect | null {\n const x = Math.max(a.x, b.x);\n const y = Math.max(a.y, b.y);\n const right = Math.min(a.x + a.width, b.x + b.width);\n const bottom = Math.min(a.y + a.height, b.y + b.height);\n if (right <= x || bottom <= y) return null;\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Returns the smallest rect containing both rects. */\n union(a: Rect, b: Rect): Rect {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const right = Math.max(a.x + a.width, b.x + b.width);\n const bottom = Math.max(a.y + a.height, b.y + b.height);\n return { x, y, width: right - x, height: bottom - y };\n },\n\n /** Creates a rect from an array of points (bounding box). */\n fromPoints(points: readonly Vec2[]): Rect {\n if (points.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n let minX = points[0]!.x;\n let minY = points[0]!.y;\n let maxX = minX;\n let maxY = minY;\n for (let i = 1; i < points.length; i++) {\n const p = points[i]!;\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n },\n\n /** Returns the center point of the rect. */\n center(r: Rect): Vec2 {\n return { x: r.x + r.width * 0.5, y: r.y + r.height * 0.5 };\n },\n\n /** Returns a new rect expanded by amount on each side. */\n expand(r: Rect, amount: number): Rect {\n return {\n x: r.x - amount,\n y: r.y - amount,\n width: r.width + amount * 2,\n height: r.height + amount * 2,\n };\n },\n} as const;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Circle shape: center position + radius. */\nexport type Circle = { x: number; y: number; radius: number };\n\nexport const Circle = {\n /** Returns true if point is inside or on the circle. */\n contains(c: Circle, p: Vec2): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n\n /** Returns true if two circles overlap (share area). */\n intersects(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const distSq = dx * dx + dy * dy;\n const radSum = a.radius + b.radius;\n return distSq < radSum * radSum;\n },\n\n /** Returns true if a circle and rect overlap. */\n intersectsRect(c: Circle, r: Rect): boolean {\n // Find closest point on rect to circle center\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n },\n} as const;\n","import type { Vec2 } from './vec2.js';\n\n/** 2D transform: position, rotation (radians), and scale. */\nexport type Transform2D = {\n position: Vec2;\n rotation: number;\n scale: Vec2;\n};\n\nexport const Transform2D = {\n /** Creates an identity transform. */\n identity(): Transform2D {\n return { position: { x: 0, y: 0 }, rotation: 0, scale: { x: 1, y: 1 } };\n },\n\n /** Creates a transform from components. */\n create(x = 0, y = 0, rotation = 0, scaleX = 1, scaleY = 1): Transform2D {\n return {\n position: { x, y },\n rotation,\n scale: { x: scaleX, y: scaleY },\n };\n },\n\n /** Transforms a local-space point to world-space. */\n localToWorld(t: Transform2D, point: Vec2): Vec2 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = point.x * t.scale.x;\n const sy = point.y * t.scale.y;\n return {\n x: sx * c - sy * s + t.position.x,\n y: sx * s + sy * c + t.position.y,\n };\n },\n\n /** Transforms a world-space point to local-space. */\n worldToLocal(t: Transform2D, point: Vec2): Vec2 {\n const dx = point.x - t.position.x;\n const dy = point.y - t.position.y;\n const c = Math.cos(-t.rotation);\n const s = Math.sin(-t.rotation);\n const rx = dx * c - dy * s;\n const ry = dx * s + dy * c;\n return {\n x: t.scale.x !== 0 ? rx / t.scale.x : 0,\n y: t.scale.y !== 0 ? ry / t.scale.y : 0,\n };\n },\n\n /** Returns a copy of the transform. */\n clone(t: Transform2D): Transform2D {\n return {\n position: { x: t.position.x, y: t.position.y },\n rotation: t.rotation,\n scale: { x: t.scale.x, y: t.scale.y },\n };\n },\n} as const;\n","import type { Transform2D } from './transform2d.js';\n\n/**\n * 3x3 matrix stored in column-major order on Float32Array.\n * Layout: [m00, m10, m20, m01, m11, m21, m02, m12, m22]\n *\n * | m00 m01 m02 | indices: | 0 3 6 |\n * | m10 m11 m12 | | 1 4 7 |\n * | m20 m21 m22 | | 2 5 8 |\n */\nexport type Mat3 = Float32Array;\n\nexport const Mat3 = {\n /** Creates a new identity matrix. */\n create(): Mat3 {\n const m = new Float32Array(9);\n m[0] = 1;\n m[4] = 1;\n m[8] = 1;\n return m;\n },\n\n /** Sets m to identity. */\n identity(m: Mat3): Mat3 {\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Multiplies a * b, writes into out (or allocates). */\n multiply(a: Mat3, b: Mat3, out?: Mat3): Mat3 {\n const a00 = a[0]!,\n a01 = a[3]!,\n a02 = a[6]!;\n const a10 = a[1]!,\n a11 = a[4]!,\n a12 = a[7]!;\n const a20 = a[2]!,\n a21 = a[5]!,\n a22 = a[8]!;\n\n const b00 = b[0]!,\n b01 = b[3]!,\n b02 = b[6]!;\n const b10 = b[1]!,\n b11 = b[4]!,\n b12 = b[7]!;\n const b20 = b[2]!,\n b21 = b[5]!,\n b22 = b[8]!;\n\n const o = out ?? new Float32Array(9);\n o[0] = a00 * b00 + a01 * b10 + a02 * b20;\n o[1] = a10 * b00 + a11 * b10 + a12 * b20;\n o[2] = a20 * b00 + a21 * b10 + a22 * b20;\n o[3] = a00 * b01 + a01 * b11 + a02 * b21;\n o[4] = a10 * b01 + a11 * b11 + a12 * b21;\n o[5] = a20 * b01 + a21 * b11 + a22 * b21;\n o[6] = a00 * b02 + a01 * b12 + a02 * b22;\n o[7] = a10 * b02 + a11 * b12 + a12 * b22;\n o[8] = a20 * b02 + a21 * b12 + a22 * b22;\n return o;\n },\n\n /** Creates a translation matrix. */\n translate(tx: number, ty: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = 1;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = 1;\n m[5] = 0;\n m[6] = tx;\n m[7] = ty;\n m[8] = 1;\n return m;\n },\n\n /** Creates a rotation matrix (radians). */\n rotate(angle: number, out?: Mat3): Mat3 {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const m = out ?? new Float32Array(9);\n m[0] = c;\n m[1] = s;\n m[2] = 0;\n m[3] = -s;\n m[4] = c;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Creates a scale matrix. */\n scale(sx: number, sy: number, out?: Mat3): Mat3 {\n const m = out ?? new Float32Array(9);\n m[0] = sx;\n m[1] = 0;\n m[2] = 0;\n m[3] = 0;\n m[4] = sy;\n m[5] = 0;\n m[6] = 0;\n m[7] = 0;\n m[8] = 1;\n return m;\n },\n\n /** Inverts the matrix. Returns null if singular. */\n invert(m: Mat3, out?: Mat3): Mat3 | null {\n const a00 = m[0]!,\n a01 = m[3]!,\n a02 = m[6]!;\n const a10 = m[1]!,\n a11 = m[4]!,\n a12 = m[7]!;\n const a20 = m[2]!,\n a21 = m[5]!,\n a22 = m[8]!;\n\n const det =\n a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);\n\n if (Math.abs(det) < 1e-8) return null;\n\n const invDet = 1 / det;\n const o = out ?? new Float32Array(9);\n o[0] = (a11 * a22 - a12 * a21) * invDet;\n o[1] = (a12 * a20 - a10 * a22) * invDet;\n o[2] = (a10 * a21 - a11 * a20) * invDet;\n o[3] = (a02 * a21 - a01 * a22) * invDet;\n o[4] = (a00 * a22 - a02 * a20) * invDet;\n o[5] = (a01 * a20 - a00 * a21) * invDet;\n o[6] = (a01 * a12 - a02 * a11) * invDet;\n o[7] = (a02 * a10 - a00 * a12) * invDet;\n o[8] = (a00 * a11 - a01 * a10) * invDet;\n return o;\n },\n\n /** Builds a matrix from a Transform2D (TRS order: translate * rotate * scale). */\n fromTransform(t: Transform2D, out?: Mat3): Mat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const sx = t.scale.x;\n const sy = t.scale.y;\n const m = out ?? new Float32Array(9);\n m[0] = c * sx;\n m[1] = s * sx;\n m[2] = 0;\n m[3] = -s * sy;\n m[4] = c * sy;\n m[5] = 0;\n m[6] = t.position.x;\n m[7] = t.position.y;\n m[8] = 1;\n return m;\n },\n} as const;\n","import { clamp } from './scalar.js';\n\n/** RGBA color with components normalized to 0-1. */\nexport type Color = { r: number; g: number; b: number; a: number };\n\n/** OKLab perceptual color space (L 0-1, a and b unbounded in practice ±0.5). */\nexport type Oklab = { L: number; a: number; b: number };\n\n/** OKLCH polar form of OKLab (L 0-1, C >= 0, h degrees [0,360)). */\nexport type Oklch = { L: number; C: number; h: number };\n\n/**\n * Converts a single sRGB channel to linear light.\n * The 0.04045 threshold (modern WCAG errata) is numerically identical to the\n * older 0.03928 for 8-bit inputs and is shared by OKLab and WCAG luminance.\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\n/** Converts a single linear-light channel back to sRGB. */\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;\n}\n\nexport const Color = {\n WHITE: { r: 1, g: 1, b: 1, a: 1 } as Color,\n BLACK: { r: 0, g: 0, b: 0, a: 1 } as Color,\n TRANSPARENT: { r: 0, g: 0, b: 0, a: 0 } as Color,\n\n /** Creates a Color from normalized 0-1 components. */\n create(r = 0, g = 0, b = 0, a = 1): Color {\n return { r, g, b, a };\n },\n\n /** Parses a hex string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA). */\n fromHex(hex: string): Color {\n // Strip leading #\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n if (h.length === 3) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]!;\n } else if (h.length === 4) {\n h = h[0]! + h[0]! + h[1]! + h[1]! + h[2]! + h[2]! + h[3]! + h[3]!;\n }\n\n const r = Number.parseInt(h.slice(0, 2), 16) / 255;\n const g = Number.parseInt(h.slice(2, 4), 16) / 255;\n const b = Number.parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length >= 8 ? Number.parseInt(h.slice(6, 8), 16) / 255 : 1;\n return { r, g, b, a };\n },\n\n /** Converts to hex string #RRGGBB or #RRGGBBAA if alpha < 1. */\n toHex(c: Color): string {\n const r = Math.round(clamp(c.r, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const g = Math.round(clamp(c.g, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n const b = Math.round(clamp(c.b, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n if (c.a < 1) {\n const a = Math.round(clamp(c.a, 0, 1) * 255)\n .toString(16)\n .padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n }\n return `#${r}${g}${b}`;\n },\n\n /** Linearly interpolates between two colors. */\n lerp(a: Color, b: Color, t: number): Color {\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a + (b.a - a.a) * t,\n };\n },\n\n /** Component-wise multiplication. */\n multiply(a: Color, b: Color): Color {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: a.a * b.a,\n };\n },\n\n /**\n * Converts to a Skia-compatible color number (0xAARRGGBB).\n * Compatible with @shopify/react-native-skia Skia.Color() format.\n */\n toSkColor(c: Color): number {\n const r = Math.round(clamp(c.r, 0, 1) * 255) & 0xff;\n const g = Math.round(clamp(c.g, 0, 1) * 255) & 0xff;\n const b = Math.round(clamp(c.b, 0, 1) * 255) & 0xff;\n const a = Math.round(clamp(c.a, 0, 1) * 255) & 0xff;\n return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n },\n\n /** Converts sRGB Color to OKLab. Alpha is dropped. */\n toOklab(c: Color): Oklab {\n const rl = srgbToLinear(c.r);\n const gl = srgbToLinear(c.g);\n const bl = srgbToLinear(c.b);\n\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n },\n\n /**\n * Converts OKLab to sRGB Color. Out-of-gamut results are clamped to [0,1];\n * round-trips are exact only for in-gamut colors.\n */\n fromOklab(lab: Oklab, alpha = 1): Color {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.291485548 * lab.b;\n\n const l = l_ ** 3;\n const m = m_ ** 3;\n const s = s_ ** 3;\n\n const rl = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n const gl = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n\n return {\n r: clamp(linearToSrgb(rl), 0, 1),\n g: clamp(linearToSrgb(gl), 0, 1),\n b: clamp(linearToSrgb(bl), 0, 1),\n a: alpha,\n };\n },\n\n /** Converts sRGB Color to OKLCH (polar OKLab). Achromatic colors get h = 0. */\n toOklch(c: Color): Oklch {\n const lab = Color.toOklab(c);\n const C = Math.hypot(lab.a, lab.b);\n const h = C < 1e-7 ? 0 : ((Math.atan2(lab.b, lab.a) * 180) / Math.PI + 360) % 360;\n return { L: lab.L, C, h };\n },\n\n /**\n * Converts OKLCH to sRGB Color. Hue is wrapped via ((h%360)+360)%360.\n * Out-of-gamut results are clamped; round-trips exact only in-gamut.\n */\n fromOklch(lch: Oklch, alpha = 1): Color {\n const hWrapped = ((lch.h % 360) + 360) % 360;\n const hRad = (hWrapped * Math.PI) / 180;\n return Color.fromOklab(\n { L: lch.L, a: lch.C * Math.cos(hRad), b: lch.C * Math.sin(hRad) },\n alpha,\n );\n },\n\n /** Euclidean distance in OKLab space between two sRGB colors. */\n deltaEOk(a: Color, b: Color): number {\n return Color.deltaEOkLab(Color.toOklab(a), Color.toOklab(b));\n },\n\n /** Euclidean distance between two OKLab values. */\n deltaEOkLab(a: Oklab, b: Oklab): number {\n return Math.hypot(a.L - b.L, a.a - b.a, a.b - b.b);\n },\n\n /** WCAG 2.x relative luminance. White = 1, black = 0. */\n relativeLuminance(c: Color): number {\n return 0.2126 * srgbToLinear(c.r) + 0.7152 * srgbToLinear(c.g) + 0.0722 * srgbToLinear(c.b);\n },\n\n /** WCAG 2.x contrast ratio. Order-independent; range [1, 21]. */\n contrastRatio(fg: Color, bg: Color): number {\n const l1 = Color.relativeLuminance(fg);\n const l2 = Color.relativeLuminance(bg);\n const lMax = Math.max(l1, l2);\n const lMin = Math.min(l1, l2);\n return (lMax + 0.05) / (lMin + 0.05);\n },\n} as const;\n","// 42 easing functions — all (t: number) => number, t in [0,1]\n// Robert Penner easings + spring, bounce, elastic variants.\n// Tree-shakeable named exports.\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\nconst TAU = PI * 2;\n\n// ─── Linear ─────────────────────────────────────────────────\nexport function linear(t: number): number {\n return t;\n}\n\n// ─── Step ───────────────────────────────────────────────────\nexport function step(t: number): number {\n return t < 1 ? 0 : 1;\n}\n\n// ─── Quad ───────────────────────────────────────────────────\nexport function easeInQuad(t: number): number {\n return t * t;\n}\nexport function easeOutQuad(t: number): number {\n return t * (2 - t);\n}\nexport function easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ─── Cubic ──────────────────────────────────────────────────\nexport function easeInCubic(t: number): number {\n return t * t * t;\n}\nexport function easeOutCubic(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * t1 + 1;\n}\nexport function easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t * t * t : 1 + (t - 1) * (2 * t - 2) * (2 * t - 2);\n}\n\n// ─── Quart ──────────────────────────────────────────────────\nexport function easeInQuart(t: number): number {\n return t * t * t * t;\n}\nexport function easeOutQuart(t: number): number {\n const t1 = t - 1;\n return 1 - t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuart(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * t1 * t1 * t1 * t1;\n}\n\n// ─── Quint ──────────────────────────────────────────────────\nexport function easeInQuint(t: number): number {\n return t * t * t * t * t;\n}\nexport function easeOutQuint(t: number): number {\n const t1 = t - 1;\n return 1 + t1 * t1 * t1 * t1 * t1;\n}\nexport function easeInOutQuint(t: number): number {\n const t1 = t - 1;\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * t1 * t1 * t1 * t1 * t1;\n}\n\n// ─── Sine ───────────────────────────────────────────────────\nexport function easeInSine(t: number): number {\n return 1 - Math.cos(t * HALF_PI);\n}\nexport function easeOutSine(t: number): number {\n return Math.sin(t * HALF_PI);\n}\nexport function easeInOutSine(t: number): number {\n return 0.5 * (1 - Math.cos(PI * t));\n}\n\n// ─── Expo ───────────────────────────────────────────────────\nexport function easeInExpo(t: number): number {\n return t === 0 ? 0 : 2 ** (10 * (t - 1));\n}\nexport function easeOutExpo(t: number): number {\n return t === 1 ? 1 : 1 - 2 ** (-10 * t);\n}\nexport function easeInOutExpo(t: number): number {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5 ? 0.5 * 2 ** (20 * t - 10) : 1 - 0.5 * 2 ** (-20 * t + 10);\n}\n\n// ─── Circ ───────────────────────────────────────────────────\nexport function easeInCirc(t: number): number {\n return 1 - Math.sqrt(1 - t * t);\n}\nexport function easeOutCirc(t: number): number {\n const t1 = t - 1;\n return Math.sqrt(1 - t1 * t1);\n}\nexport function easeInOutCirc(t: number): number {\n return t < 0.5\n ? 0.5 * (1 - Math.sqrt(1 - 4 * t * t))\n : 0.5 * (Math.sqrt(1 - (2 * t - 2) * (2 * t - 2)) + 1);\n}\n\n// ─── Back ───────────────────────────────────────────────────\nconst S = 1.70158;\nconst S2 = S * 1.525;\n\nexport function easeInBack(t: number): number {\n return t * t * ((S + 1) * t - S);\n}\nexport function easeOutBack(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((S + 1) * t1 + S) + 1;\n}\nexport function easeInOutBack(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 - S2));\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Elastic ────────────────────────────────────────────────\nexport function easeInElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * (TAU / 3));\n}\nexport function easeOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (TAU / 3)) + 1;\n}\nexport function easeInOutElastic(t: number): number {\n if (t === 0 || t === 1) return t;\n const p = TAU / 4.5;\n return t < 0.5\n ? -0.5 * 2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * p)\n : 0.5 * 2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * p) + 1;\n}\n\n// ─── Bounce ─────────────────────────────────────────────────\nexport function easeOutBounce(t: number): number {\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n }\n if (t < 2 / 2.75) {\n const t2 = t - 1.5 / 2.75;\n return 7.5625 * t2 * t2 + 0.75;\n }\n if (t < 2.5 / 2.75) {\n const t2 = t - 2.25 / 2.75;\n return 7.5625 * t2 * t2 + 0.9375;\n }\n const t2 = t - 2.625 / 2.75;\n return 7.5625 * t2 * t2 + 0.984375;\n}\nexport function easeInBounce(t: number): number {\n return 1 - easeOutBounce(1 - t);\n}\nexport function easeInOutBounce(t: number): number {\n return t < 0.5 ? 0.5 * easeInBounce(t * 2) : 0.5 * easeOutBounce(t * 2 - 1) + 0.5;\n}\n\n// ─── Spring ─────────────────────────────────────────────────\nexport function springIn(t: number): number {\n return t * t * ((1.70158 + 1) * t - 1.70158);\n}\nexport function springOut(t: number): number {\n const t1 = t - 1;\n return t1 * t1 * ((1.70158 + 1) * t1 + 1.70158) + 1;\n}\nexport function springInOut(t: number): number {\n if (t < 0.5) {\n const t2 = 2 * t;\n return 0.5 * t2 * t2 * ((S2 + 1) * t2 - S2);\n }\n const t2 = 2 * t - 2;\n return 0.5 * (t2 * t2 * ((S2 + 1) * t2 + S2) + 2);\n}\n\n// ─── Type ───────────────────────────────────────────────────\nexport type EasingFn = (t: number) => number;\n","import type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Seeded PRNG using mulberry32 algorithm. */\nexport class SeededRNG {\n private state: number;\n\n constructor(seed: number) {\n this.state = seed | 0;\n }\n\n /** Returns a float in [0, 1). */\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n\n /** Returns a float in [min, max). */\n float(min: number, max: number): number {\n return min + this.next() * (max - min);\n }\n\n /** Returns an integer in [min, max] (inclusive). */\n int(min: number, max: number): number {\n return Math.floor(this.float(min, max + 1));\n }\n}\n\n/** Returns a random float in [min, max). */\nexport function randomFloat(min: number, max: number): number {\n return min + Math.random() * (max - min);\n}\n\n/** Returns a random integer in [min, max] (inclusive). */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(randomFloat(min, max + 1));\n}\n\n/** Returns a random Vec2 within a rect. */\nexport function randomVec2InRect(r: Rect): Vec2 {\n return {\n x: r.x + Math.random() * r.width,\n y: r.y + Math.random() * r.height,\n };\n}\n\n/** Returns a random point inside a circle (uniform distribution). */\nexport function randomPointInCircle(cx: number, cy: number, radius: number): Vec2 {\n // Use sqrt for uniform distribution\n const r = radius * Math.sqrt(Math.random());\n const angle = Math.random() * Math.PI * 2;\n return {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n}\n\n/** Fisher-Yates shuffle (in-place). Returns the array. */\nexport function shuffle<T>(array: T[]): T[] {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = array[i]!;\n array[i] = array[j]!;\n array[j] = tmp;\n }\n return array;\n}\n\n/** Returns a random element from the array. */\nexport function choose<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * Picks an index from a weight array using a cumulative walk.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero array.\n */\nexport function weightedIndex(weights: readonly number[], roll01: number): number {\n let total = 0;\n for (let i = 0; i < weights.length; i++) total += weights[i] ?? 0;\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < weights.length; i++) {\n acc += weights[i] ?? 0;\n if (target < acc) return i;\n }\n return weights.length - 1;\n}\n\n/**\n * Picks an index from `items` using a per-item weight accessor.\n * `roll01` must be in [0, 1); returns 0 for an empty or all-zero-weight array.\n */\nexport function weightedIndexBy<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): number {\n let total = 0;\n for (let i = 0; i < items.length; i++) total += weight(items[i] as T);\n if (total <= 0) return 0;\n const target = roll01 * total;\n let acc = 0;\n for (let i = 0; i < items.length; i++) {\n acc += weight(items[i] as T);\n if (target < acc) return i;\n }\n return items.length - 1;\n}\n\n/**\n * Picks an item from `items` using a per-item weight accessor.\n * Returns `undefined` for an empty array; returns the last item on float-edge.\n */\nexport function weightedPick<T>(\n items: readonly T[],\n weight: (item: T) => number,\n roll01: number,\n): T | undefined {\n if (items.length === 0) return undefined;\n return items[weightedIndexBy(items, weight, roll01)];\n}\n\n/**\n * 32-bit avalanche finalizer (lowbias32). Mixes `seed` so that adjacent seeds\n * decorrelate into different output values. Returns an unsigned 32-bit integer.\n *\n * Constants from https://nullprogram.com/blog/2018/07/31/ (lowbias32).\n */\nexport function hashU32(seed: number): number {\n let h = (seed | 0) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n h = Math.imul(h ^ (h >>> 16), 0x45d9f3b) >>> 0;\n return (h ^ (h >>> 16)) >>> 0;\n}\n\n/**\n * Deterministically maps `seed` to an index in [0, count).\n * Single-entry pools short-circuit to 0. Uses `hashU32` to decorrelate\n * adjacent seeds before the modulo.\n */\nexport function seededIndex(seed: number, count: number): number {\n if (count <= 1) return 0;\n return hashU32(seed) % count;\n}\n","/**\n * Timed-window and capped-bonus math — pure, zero-alloc scoring helpers.\n */\n\n/**\n * Bonus pay floored to an integer: `pay × min(frac, capFrac)`.\n * `frac` is the current multiplier (e.g. `streak * fracPerStep`);\n * `capFrac` bounds the multiplier so it cannot grow unboundedly.\n * Returns 0 for zero or negative `pay`.\n */\nexport function cappedBonus(pay: number, frac: number, capFrac: number): number {\n if (pay <= 0) return 0;\n return Math.floor(pay * Math.min(frac, capFrac));\n}\n\n/**\n * Advances a timed streak counter. A new event within `windowSec` of `lastT`\n * increments `prev`; a gap (or `lastT < 0` meaning \"no prior event\") resets\n * to 1. Pure — the caller stores the returned value and stamps the new time.\n * `elapsed` is the monotonic clock at the new event.\n */\nexport function advanceWindowedStreak(\n prev: number,\n elapsed: number,\n lastT: number,\n windowSec: number,\n): number {\n if (lastT >= 0 && elapsed - lastT <= windowSec) return prev + 1;\n return 1;\n}\n\n/**\n * Returns true when a streak window has lapsed: a window was open (`lastT >= 0`)\n * and more than `windowSec` seconds have passed since `lastT`.\n * `lastT < 0` means no event has ever occurred — never expired.\n */\nexport function windowExpired(elapsed: number, lastT: number, windowSec: number): boolean {\n return lastT >= 0 && elapsed - lastT > windowSec;\n}\n\n/**\n * How many more events may be awarded in the current window given `awarded`\n * already counted. Clamped to 0 — never negative.\n */\nexport function remainingInWindow(awarded: number, capPerWindow: number): number {\n return Math.max(0, capPerWindow - awarded);\n}\n","import type { Circle } from './circle.js';\nimport type { Rect } from './rect.js';\nimport type { Vec2 } from './vec2.js';\n\n/** Returns true if point is inside rect (inclusive). */\nexport function pointInRect(p: Vec2, r: Rect): boolean {\n return p.x >= r.x && p.x <= r.x + r.width && p.y >= r.y && p.y <= r.y + r.height;\n}\n\n/** Returns true if point is inside circle (inclusive). */\nexport function pointInCircle(p: Vec2, c: Circle): boolean {\n const dx = p.x - c.x;\n const dy = p.y - c.y;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two rects overlap. */\nexport function rectVsRect(a: Rect, b: Rect): boolean {\n return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n/** Returns true if rect and circle overlap. */\nexport function rectVsCircle(r: Rect, c: Circle): boolean {\n const closestX = c.x < r.x ? r.x : c.x > r.x + r.width ? r.x + r.width : c.x;\n const closestY = c.y < r.y ? r.y : c.y > r.y + r.height ? r.y + r.height : c.y;\n const dx = c.x - closestX;\n const dy = c.y - closestY;\n return dx * dx + dy * dy <= c.radius * c.radius;\n}\n\n/** Returns true if two circles overlap. */\nexport function circleVsCircle(a: Circle, b: Circle): boolean {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const radSum = a.radius + b.radius;\n return dx * dx + dy * dy < radSum * radSum;\n}\n\n/** Line segment intersection with AABB. Uses Liang-Barsky algorithm. */\nexport function lineVsRect(x1: number, y1: number, x2: number, y2: number, r: Rect): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let tMin = 0;\n let tMax = 1;\n\n // Check each edge\n const edges = [\n { p: -dx, q: x1 - r.x },\n { p: dx, q: r.x + r.width - x1 },\n { p: -dy, q: y1 - r.y },\n { p: dy, q: r.y + r.height - y1 },\n ];\n\n for (const { p, q } of edges) {\n if (Math.abs(p) < 1e-12) {\n // Parallel to edge\n if (q < 0) return false;\n } else {\n const t = q / p;\n if (p < 0) {\n if (t > tMax) return false;\n if (t > tMin) tMin = t;\n } else {\n if (t < tMin) return false;\n if (t < tMax) tMax = t;\n }\n }\n }\n\n return tMin <= tMax;\n}\n\n/** Line segment intersection with circle. */\nexport function lineVsCircle(x1: number, y1: number, x2: number, y2: number, c: Circle): boolean {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const fx = x1 - c.x;\n const fy = y1 - c.y;\n\n const a = dx * dx + dy * dy;\n const b = 2 * (fx * dx + fy * dy);\n const cc = fx * fx + fy * fy - c.radius * c.radius;\n\n // Zero-length segment: just a point-in-circle test\n if (a < 1e-12) {\n return cc <= 0;\n }\n\n let discriminant = b * b - 4 * a * cc;\n if (discriminant < 0) return false;\n\n discriminant = Math.sqrt(discriminant);\n const t1 = (-b - discriminant) / (2 * a);\n const t2 = (-b + discriminant) / (2 * a);\n\n // Check if any intersection is within segment [0, 1]\n if (t1 >= 0 && t1 <= 1) return true;\n if (t2 >= 0 && t2 <= 1) return true;\n // Segment fully inside circle\n if (t1 < 0 && t2 > 1) return true;\n\n return false;\n}\n\n/** Ray intersection with AABB. Returns t (distance) or null if no hit. */\nexport function rayVsRect(\n originX: number,\n originY: number,\n dirX: number,\n dirY: number,\n r: Rect,\n): number | null {\n const invDx = dirX !== 0 ? 1 / dirX : Number.POSITIVE_INFINITY;\n const invDy = dirY !== 0 ? 1 / dirY : Number.POSITIVE_INFINITY;\n\n const tx1 = (r.x - originX) * invDx;\n const tx2 = (r.x + r.width - originX) * invDx;\n const ty1 = (r.y - originY) * invDy;\n const ty2 = (r.y + r.height - originY) * invDy;\n\n const tMin = Math.max(Math.min(tx1, tx2), Math.min(ty1, ty2));\n const tMax = Math.min(Math.max(tx1, tx2), Math.max(ty1, ty2));\n\n if (tMax < 0 || tMin > tMax) return null;\n\n return tMin >= 0 ? tMin : tMax;\n}\n"],"mappings":"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","names":["t2"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flare-engine/math",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Vec2, Rect, Transform, Color, easings, intersection tests",
5
5
  "keywords": ["flare-engine", "game-engine", "math", "vec2", "2d"],
6
6
  "license": "MIT",