{"version":3,"names":["lerpColor","packColor","TAU","Math","PI","read","v","shimmer","opts","speed","pad","ltr","direction","t","paused","base","baseColor","hi","highlightColor","near","far","x","_y","width","len","pos","floor","glimmer","dist","abs","wave","wavelength","from","to","tPhase","phase","sin","pulse","period","color","flashColor"],"sources":["effects.ts"],"sourcesContent":["import type { ColorInput } from \"bun\";\nimport type { Effect } from \"./animated.tsx\";\nimport { lerpColor, packColor } from \"./utils.ts\";\n\nconst TAU = Math.PI * 2;\n\n/** A value, or an accessor for one — so effect colors can themselves animate. */\nexport type MaybeAccessor<T> = T | (() => T);\n\nfunction read<T>(v: MaybeAccessor<T>): T {\n\treturn typeof v === \"function\" ? (v as () => T)() : v;\n}\n\nexport type ShimmerOptions = {\n\t/** Resting color. */\n\tbaseColor: MaybeAccessor<ColorInput>;\n\t/** Color at the crest of the sweep. */\n\thighlightColor: MaybeAccessor<ColorInput>;\n\t/** Milliseconds per cell. Lower = faster. Default 200. */\n\tspeed?: number;\n\t/** Sweep direction. Default \"ltr\". */\n\tdirection?: \"ltr\" | \"rtl\";\n};\n\n/**\n * A highlight crest that sweeps across the region by column, with a soft\n * two-cell falloff. The classic \"thinking\" shimmer.\n */\nexport function shimmer(opts: ShimmerOptions): Effect {\n\tconst speed = opts.speed ?? 200;\n\tconst pad = 10;\n\tconst ltr = (opts.direction ?? \"ltr\") === \"ltr\";\n\treturn ({ t, paused }) => {\n\t\t// Colors are sampled once per frame, not per cell.\n\t\tconst base = packColor(read(opts.baseColor));\n\t\tif (paused) return () => base;\n\t\tconst hi = packColor(read(opts.highlightColor));\n\t\tconst near = lerpColor(base, hi, 0.5);\n\t\tconst far = lerpColor(base, hi, 0.2);\n\t\treturn (x, _y, width) => {\n\t\t\tconst len = width + pad * 2;\n\t\t\tconst pos = Math.floor(t / speed) % len;\n\t\t\tconst glimmer = ltr ? pos - pad : width + pad - pos;\n\t\t\tconst dist = Math.abs(x - glimmer);\n\t\t\tif (dist === 0) return hi;\n\t\t\tif (dist === 1) return near;\n\t\t\tif (dist === 2) return far;\n\t\t\treturn base;\n\t\t};\n\t};\n}\n\nexport type WaveOptions = {\n\tfrom: MaybeAccessor<ColorInput>;\n\tto: MaybeAccessor<ColorInput>;\n\t/** Milliseconds per full cycle. Default 1500. */\n\tspeed?: number;\n\t/** Cells per wave. Lower = tighter bands. Default 6. */\n\twavelength?: number;\n};\n\n/**\n * A smooth color gradient that scrolls along the region by column — each cell\n * sits at a different point on a sine between `from` and `to`, so color \"flows\"\n * through the content. A gentler, continuous alternative to {@link shimmer}.\n */\nexport function wave(opts: WaveOptions): Effect {\n\tconst speed = opts.speed ?? 1500;\n\tconst wavelength = opts.wavelength ?? 6;\n\treturn ({ t, paused }) => {\n\t\tconst from = packColor(read(opts.from));\n\t\tif (paused) return () => from;\n\t\tconst to = packColor(read(opts.to));\n\t\tconst tPhase = (t / speed) * TAU;\n\t\treturn (x) => {\n\t\t\tconst phase = (Math.sin((x / wavelength) * TAU - tPhase) + 1) / 2;\n\t\t\treturn lerpColor(from, to, phase);\n\t\t};\n\t};\n}\n\nexport type PulseOptions = {\n\tbaseColor: MaybeAccessor<ColorInput>;\n\tflashColor: MaybeAccessor<ColorInput>;\n\t/** Full cycle period in ms. Default 2000. */\n\tperiod?: number;\n};\n\n/**\n * A uniform pulse — the whole region breathes between two colors in unison\n * (position-independent).\n */\nexport function pulse(opts: PulseOptions): Effect {\n\tconst period = opts.period ?? 2000;\n\treturn ({ t, paused }) => {\n\t\t// Position-independent: the whole region is one color per frame.\n\t\tconst base = packColor(read(opts.baseColor));\n\t\tif (paused) return () => base;\n\t\tconst phase = (Math.sin((t / period) * TAU) + 1) / 2;\n\t\tconst color = lerpColor(base, read(opts.flashColor), phase);\n\t\treturn () => color;\n\t};\n}\n"],"mappings":"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","ignoreList":[]}