TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/web-surfer/llms.txt
Use this file to discover all available pages before exploring further.
Layout component is the outermost wrapper for every page in Web Surfer. It stitches together the teal header bar, the animated PageTransition region, and the retro footer complete with a scrolling webring marquee — all on top of a warm bg-win-cream background. A SparkleCursor canvas overlay sits at the very top of the stacking context so sparkle effects are always visible across the entire viewport.
Component structure
Layout is composed of three primary regions rendered inside a full-height flex column:
| Region | Purpose |
|---|---|
<header> | Teal bar — visitor counter (left) and last-updated date (right) |
<main> | Flex-grow content area — wraps children in PageTransition |
<footer> | Copyright notice + scrolling webring Marquee |
Layout like this:
The Layout component is automatically applied to all routes in the app — you do not need to wrap individual pages manually.
Header
The header bar usesbg-win-teal text-white and is split into two sides with justify-between:
- Left side — the
VisitorCountercomponent (described below). - Right side — a small italic string displaying today’s date, formatted with
new Date().toLocaleDateString().
border-b-4 border-win-teal-light) and a drop shadow to lift it above the page content.
VisitorCounter
The visitor counter is the retro hit-counter widget rendered in the left side of the header. It displays the labelYOU ARE VISITOR: followed by a 7-digit number shown as individual digit tiles.
- Font:
font-pixel(Press Start 2P) attext-xs - Digit tiles: lime green text (
text-y2k-lime) on a black background (bg-black), separated by subtleborder-gray-800dividers - The counter starts at
1333337and increments by 1 every 1500 ms via asetTimeoutloop
padStart(7, "0") so the display always shows exactly 7 characters.
PageTransition
Whenever the active route changes,PageTransition intercepts the render and shows a full-screen Win98-style loading dialog for 800 ms before revealing the incoming page. The dialog is centred over a bg-win-teal overlay and contains:
Spinning ball
A
w-8 h-8 bg-win-blue rounded-full animate-spin border-4 border-dashed border-white div — a solid navy circle with a dashed white border that spins, evoking the classic Netscape Navigator loading indicator.Progress bar
A Framer Motion
motion.div that animates its width from 0% to 100% over 700 ms with a linear ease, drawn inside a shadow-bevel-inset track.AnimatePresence in "wait" mode (initial opacity: 0, animate opacity: 1, exit opacity: 0). After 800 ms the timeout clears, the overlay is removed, and the incoming page is revealed.
prefers-reduced-motion: reduce in their OS settings, PageTransition skips the animation entirely and swaps the page content immediately without showing the loading dialog.
Webring marquee
The footer contains aMarquee component — a horizontally scrolling strip of retro webring links rendered inside a bg-win-gray bar with top and bottom border lines.
The inner content div uses animate-marquee (a custom Tailwind keyframe that translates from 100% to -100% over 15 seconds, linear, infinite) and the following link set:
hover:[animation-play-state:paused], so visitors can click individual links without the text racing past.