The Contact page makes the act of submitting a message into a theatrical event. Rather than instantly confirming submission, it stages a deliberate 2.5-second “sending over a 56k modem” animation — a playful nod to the era when waiting for a web page to load was a significant part of the online experience. The form cycles through three distinct states —Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-domain/llms.txt
Use this file to discover all available pages before exploring further.
idle, sending, and success — each animated in and out by Framer Motion’s AnimatePresence. The success screen rewards the sender with bouncing text and spinning emoji stars.
Window Container
The page renders a singleWindow component titled “Send_Message.exe” with a Mail Lucide icon:
Visual appearance: A standard Win98 window with a blue title bar, a mail envelope icon, and the filename “Send_Message.exe”. The
!static class keeps it in document flow. The inner content area is p-6 bg-white font-comic — a white padded area in Comic Sans throughout.Form State Management
A singleuseState hook manages the three-state form lifecycle:
onSubmit handler prevents default form submission and triggers the state transitions:
e.preventDefault(), the status immediately moves to "sending". A setTimeout with a 2500ms delay (matching the progress bar animation duration) then transitions to "success". There is no actual HTTP request — the form is entirely front-end with simulated network delay.
State: Idle — Contact Form
Whenstatus === "idle", the form is displayed:
Form Header
Input Fields
Three form fields with Win98 inset-shadow styling:Visual appearance: Each input has a
border-2 border-win-gray shadow-win-in inset bevel — the characteristic sunken field appearance from Win98 dialog boxes. All three fields are full width. On focus, the background shifts to a very light yellow (focus:bg-yellow-50). All three fields are required, so the browser’s native validation will prevent submission if any are empty.Submit Button
Send icon (a paper-plane shape) and the double exclamation mark for maximum retro enthusiasm.
State: Sending — Modem Animation
Whenstatus === "sending", the form fades out and is replaced by the modem progress screen:
Visual appearance: The pulsing “Sending data packets over 56k modem…” text is displayed in
font-vt323 text-2xl with animate-pulse making it fade in and out continuously. Below it, a Win98-style progress bar: a grey inset-shadow track (bg-win-gray shadow-win-in) containing a blue fill (bg-titlebar) that animates from 0% to 100% width over exactly 2.5 seconds at a linear pace — matching the setTimeout delay precisely so the bar completes exactly as the success screen appears.The
AnimatePresence wrapper with mode="wait" ensures that the exiting state fully fades out before the entering state fades in, preventing overlap during transitions. The key prop on each motion element is what triggers the mount/unmount animation cycle.State: Success — Confirmation Screen
Whenstatus === "success", the success screen is displayed:
Visual appearance: The success screen enters with a scale-up animation from 80% to 100% size combined with an opacity fade-in. The “MESSAGE SENT!” heading is in
font-vt323 text-4xl text-retro-pink with animate-bounce making it continuously hop up and down. Three emoji spin using animate-spin-slow with staggered animationDelay values (0s, 0.2s, 0.4s): ⭐ 💖 ⭐. A grey “Send Another” BeveledButton resets status to "idle", restoring the form.AnimatePresence and Transition Flow
AnimatePresence wrapper:
Component Dependencies
| Component | Source | Usage |
|---|---|---|
Window (p) | components/Window.js | Send_Message.exe frame |
BeveledButton (d) | components/BeveledButton.js | Submit and Send Another buttons |
AnimatePresence (E) | framer-motion | State transition orchestration |
motion.form / motion.div | framer-motion | Per-state animated containers |
mail (Lucide) | lucide-react | Window title bar icon |
send (Lucide) | lucide-react | Submit button icon |
useState | React 18 | Form status state |