import type { ColorInput } from "bun"; import type { Accessor, Element as JSXElement } from "solid-js"; import { Animated } from "./animated.tsx"; import { pulse, shimmer, wave } from "./effects.ts"; /** * Named wrappers for the built-in effects. Each runs its effect across all of * its children as one linked region — so a shimmer (or wave, or pulse) sweeps a * spinner glyph and the text beside it together: * * ```tsx * * * {` ${verb}…`} * * ``` * * For a custom effect, use `` directly. */ type GroupProps = { children: JSXElement; /** Freeze the animation at its resting color. */ paused?: boolean; /** Clock tick in ms. Default 50. */ tick?: number; /** Share an external clock instead of creating one. */ time?: Accessor; }; export type ShimmerProps = GroupProps & { baseColor: ColorInput; highlightColor: ColorInput; /** Milliseconds per cell. Lower = faster. Default 200. */ speed?: number; /** Sweep direction. Default "ltr". */ direction?: "ltr" | "rtl"; }; export function Shimmer(props: ShimmerProps) { return ( props.baseColor, highlightColor: () => props.highlightColor, speed: props.speed, direction: props.direction, })} paused={props.paused} tick={props.tick} time={props.time} > {props.children} ); } export type WaveProps = GroupProps & { from: ColorInput; to: ColorInput; /** Milliseconds per full cycle. Default 1500. */ speed?: number; /** Cells per wave. Default 6. */ wavelength?: number; }; export function Wave(props: WaveProps) { return ( props.from, to: () => props.to, speed: props.speed, wavelength: props.wavelength, })} paused={props.paused} tick={props.tick} time={props.time} > {props.children} ); } export type PulseProps = GroupProps & { baseColor: ColorInput; flashColor: ColorInput; /** Full cycle period in ms. Default 2000. */ period?: number; }; export function Pulse(props: PulseProps) { return ( props.baseColor, flashColor: () => props.flashColor, period: props.period, })} paused={props.paused} tick={props.tick} time={props.time} > {props.children} ); }