Six custom animation classes are defined via Tailwind’sDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/neocities-dev/llms.txt
Use this file to discover all available pages before exploring further.
keyframes extension in tailwind.config.js and compiled into main.css. Every animation is pure CSS — no JavaScript timers or requestAnimationFrame loops. This means they run on the browser’s compositor thread, keeping the main thread free and the page fully interactive even while animations are running.
Animation Classes
animate-chromatic
Keyframe: chromatic-shift
Property animated: text-shadow (horizontal offsets in magenta and cyan)
Duration / timing: 3 s, ease (default), alternate infinite
Applies an alternating chromatic aberration effect to text by offsetting magenta and cyan text-shadows in opposite horizontal directions. The offsets shift between frames, producing a subtle glitchy split that mimics the misaligned RGB guns of a degraded CRT monitor.
Used on: Home hero heading, SYS_ADMIN navigation label.
animate-blink
Keyframe: blink
Property animated: opacity (step toggle: 1 → 0 → 1)
Duration / timing: 1 s, step-end, infinite
A hard step-function blink — opacity jumps instantly between 1 and 0 with no easing, exactly as a cursor or LED indicator would flash on real hardware. Using step-end (rather than linear) means the element is visible for the first half of each cycle and dark for the second half.
Used on: “Status: ONLINE” indicator dot, blinking cursor characters in terminal panels.
animate-ticker
Keyframe: scroll-left
Property animated: transform: translate() (from translate(100%) to translate(-100%))
Duration / timing: 20 s, linear, infinite
Translates an element from fully off-screen right (translate(100%)) to fully off-screen left (translate(-100%)), creating a continuous horizontal marquee. The 20 s linear duration produces a smooth, steady scroll speed regardless of the content length.
Used on: The homepage news ticker bar at the bottom of the hero section.
animate-bg-drift
Keyframe: bg-drift
Property animated: background-position (from 0 0 to 100px 100px)
Duration / timing: 60 s, linear, infinite
Slowly drifts a repeating background image or pattern diagonally down and to the right. The 60 s duration makes the movement imperceptible moment-to-moment but noticeable over time — a living, breathing texture rather than a static wallpaper.
Used on: Panel backgrounds with the bg-grid-pattern utility (the SVG dot/line grid overlay on content sections).
animate-bounce
Keyframe: bounce
Property animated: transform: translateY (up–down with easing)
Duration / timing: 1 s, custom cubic-bezier per half-cycle, infinite
The standard Tailwind bounce — the element eases up with cubic-bezier(0.8, 0, 1, 1) (fast start, slow end at apex) and eases down with cubic-bezier(0, 0, 0.2, 1) (slow start, fast impact). The combination gives a convincing physical bounce without any spring physics library.
Used on: The avatar / profile icon in the about_me panel.
animate-pulse
Keyframe: pulse
Property animated: opacity (dips to 0.5 at 50%)
Duration / timing: 2 s, cubic-bezier(0.4, 0, 0.6, 1), infinite
A gentle breathing pulse — opacity eases down to 50% at the midpoint and back to 100%, using a symmetrical cubic-bezier for a smooth sine-like rhythm. Softer and slower than animate-blink; suitable for loading states and elements that need to draw the eye without being distracting.
Used on: Loading skeletons, emphasis overlays, and subtle attention-drawing indicators.
Keyframe Definitions
Below is the raw CSS for@keyframes chromatic-shift — the most visually distinctive animation in the system. The offsets are deliberately asymmetric to avoid a mechanical back-and-forth; each frame feels slightly different, producing an organic glitch quality.
alternate, Tailwind plays it forward (0% → 100%) then reverses (100% → 0%) on each cycle, giving eight distinct shadow states per full loop.
All six animations are CSS-only — no JavaScript intervals, timeouts, or
requestAnimationFrame. CSS animations that animate opacity, text-shadow, and transform are handled entirely by the browser’s compositor thread, meaning they continue to run smoothly even when the main thread is busy parsing JavaScript or re-rendering the React tree.