vivid-html is a single-page, self-contained HTML experience whose entire purpose is delight: an anonymous viewer opens the page and watches a 2D animation, drawn entirely with SVG, of a pelican riding a bicycle. There is no product funnel, no data collection, no trust surface, and no account. The emotional register is pure, generous fun, and the audience is anyone with a browser who enjoys a silly, well-drawn thing.
The product intent is narrow and complete: deliver one HTML page containing an SVG-drawn 2D animation of a pelican riding a bicycle. The user explicitly requires no tests and applies no restrictions to the work.
This document is the System Requirements Document for the product. It specifies the single accepted page, the accepted viewer persona, the animation behavior, the visual and motion direction, and the delivery boundary.
vivid-html is delivered as one HTML page. The page is anonymous and public: any viewer with a browser can open it, and the accepted outcome — the SVG pelican-on-bicycle animation rendering and playing — requires no identity, no input, and no persistence.
The only accepted human actor is the Viewer, who opens the page and watches the animation. The only accepted page is Landing, which owns the entire accepted outcome: it presents the scene and renders the auto-playing SVG animation.
The animation is a hand-built SVG scene: a modular vector pelican (soft warm-white body, mustard-orange beak, coral pouch, teal scarf) seated on a teal bicycle with ink tyres, riding left-to-right across a pastel landscape. The scene loops continuously — wheels rotate, the crank spins, legs pedal, the pelican bobs, the scarf flutters, and background hills scroll at two speeds for parallax depth.
The provisioned scaffold (a shared FastAPI backend, a MariaDB database, and a React frontend) is infrastructure inventory only. It does not add product requirements. The accepted product is a single static HTML page with an inline SVG animation; no backend API, database entity, authentication, or persistent data is justified by the accepted behavior. The page is served as a static asset.
Removed from scope
The product is a single, anonymous, publicly reachable HTML page. Delivery is static: the page and its inline SVG animation are served as one document, and the animation runs entirely in the browser using SVG markup and CSS/SMIL-style animation. There is no application-owned identity, no session, no server-side state, and no data persistence in the accepted scope.
Access is open to any viewer. The page does not gate, restrict, or personalize its content. The user explicitly stated that no restrictions are to be applied, and this document preserves that as a hard constraint on the accepted work.
The current horizon contains exactly one page and one animation. No future features are accepted. The provisioned backend, database, and frontend scaffold remain available infrastructure but carry no accepted product behavior; the accepted page can be delivered as a static HTML document without invoking them.
Information and state
Primary action
Supporting actions
Domain entities
Component responsibilities
States
prefers-reduced-motion, the SVG freezes in a composed still frame with the pelican mid-pedal, and entrance transforms are disabled.FR-1 — Deliver a single HTML page (explicit) As a Viewer, I should open one HTML page that contains the entire experience, so that I can see the animation without navigating anywhere else.
FR-2 — Render a 2D animation drawn with SVG (explicit) As a Viewer, I should see a 2D animation drawn entirely with SVG, so that the scene is crisp vector artwork that plays in the browser.
FR-3 — Depict a pelican riding a bicycle (explicit) As a Viewer, I should see a pelican riding a bicycle in the animation, so that the scene reads clearly as the requested subject.
FR-4 — Loop the animation continuously (required_inference) As a Viewer, I should see the animation loop continuously, so that the scene keeps playing for as long as I watch.
FR-5 — Replay the animation on demand (required_inference) As a Viewer, I should be able to press the "Ride again" CTA to restart the animation, so that I can rewatch the scene from its first frame.
FR-6 — Respect reduced-motion preference (required_inference) As a Viewer who prefers reduced motion, I should see a composed still frame instead of continuous motion, so that the page remains usable and comfortable.
prefers-reduced-motion: reduce.FR-7 — No tests required (explicit) As the project owner, I should not need any automated tests, so that the deliverable stays a single hand-made HTML page.
FR-8 — No restrictions applied (explicit) As the project owner, I should have no restrictions applied to the accepted work, so that the page can be built freely as requested.
Product context. The Viewer is anyone with a browser who opens the vivid-html page. They arrive with no account, no prior relationship to the product, and no task beyond curiosity. The page is a single anonymous public surface.
Primary goal. Watch a 2D SVG animation of a pelican riding a bicycle, and enjoy it.
Distinct accepted responsibilities.
Relevant inputs or decisions.
Interactions with other accepted participants. None. The Viewer is the only accepted human actor; there is no counterparty, recipient, or beneficiary whose state changes.
Observable success. The animation renders and plays in the browser without further interaction; the scene reads clearly as a pelican riding a bicycle; the loop continues; the "Ride again" CTA restarts it; reduced-motion viewers see a composed still frame.
prefers-reduced-motion: reduce, opens the page. (Landing)The creative direction is authoritative for this section: Warm modular whimsy for one very serious pelican on a bicycle, muse Pablo Stanley.
Palette (light mode)
#FFF6E5 (warm cream ground)#FFFFFF#1F2A44 (deep ink)#F4A62A (mustard-orange — pelican beak)#E4572E (coral-orange — pelican pouch, "Ride again" CTA)#7A8AA0#2A9D8F (bicycle frame, scarf), sky band #BFE3DD, road band #F6D8A8#1F2A44 at 3px on every illustration elementAccent is used only on the beak/pouch and the one pill CTA, never as a flood.
Typography
clamp(44px, 9vw, 128px) for the hero wordmark.Shape language
Layout
Imagery
Readable text and controls stay whole at every viewport (375px, 768px, 1280px), wrapping or scaling to fit; imagery, decoration and motion may be cropped, bled, rotated, overlapped or cut as the direction asks, as long as they cover no readable text or control.
The public entry is a single oversized rounded stage: a cream panel with a pastel sky band and a warm road band. The wordmark "vivid-html" is set in Baloo 2 at up to 128px, flush-left, deliberately overlapping the top edge of the stage card by 12px so type and illustration share one plane. The SVG pelican-on-bicycle is drawn large (roughly 70% of the stage width) riding left-to-right across the middle third. A single coral pill CTA ("Ride again") is pinned to the bottom-left of the stage card rather than centred beneath it, with a spring hover pop. Three sticker chips beneath the stage — circular, ink-outlined, pastel-filled — each name one element of the scene (Pelican / Bicycle / Motion) with a tiny inline SVG icon.
The dominant element is the pelican, not the type; the type is a bold supporting gesture. Nothing is centred in the SaaS sense; the composition is asymmetric and sticker-like. The stage card carries a 3px ink border and a 6px hard offset shadow in pastel peach, holding the entire SVG scene as one illustrated poster.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
prefers-reduced-motion freezes the SVG in a composed still frame with the pelican mid-pedal and disables entrance transforms.prefers-reduced-motion with a composed still frame.prefers-reduced-motion handling.prefers-reduced-motion browser preference, honored by freezing the SVG in a composed still frame.

No comments yet. Be the first!