Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/apursley2012/oracle/llms.txt

Use this file to discover all available pages before exploring further.

The Divination Request is Oracle’s contact form — a single-page ritual that lets visitors cast a message into the ether and reach Alex Weaver directly. Every label is written in the project’s mystical vocabulary (“Whisper your name”, “Leave a sigil”), and the submit button reads “Send Across the Veil.” The real centrepiece, however, is what happens after the form is submitted: a burst of five turquoise orbs erupts across the card, the form fades away, and a “Message Received” confirmation materialises in its place — all choreographed with Framer Motion before the form quietly resets itself four seconds later.

Form Fields

LabelTypePlaceholderRequired
Whisper your nametexte.g. Merlin
Leave a sigil (email)emailmerlin@camelot.com
What spell do you need cast?textarea (4 rows)I seek a frontend alchemist to...
All three inputs use bottom-border-only styling (border-b border-turquoise/30) on a transparent background, keeping the look minimal and arcane. The textarea swaps to a full border variant with a dark bg-dark/50 fill to visually distinguish multi-line input from single-line fields. Placeholders are rendered at parchment/20 opacity — just visible enough to guide without distracting.

Submit Flow

1

Fill in your name, email, and message

Complete all three required fields. The required attribute on each input activates native browser validation, so the form will not submit if any field is empty or the email address is malformed.
2

Click "Send Across the Veil"

The full-width button at the bottom of the card triggers the form’s onSubmit handler. A radial-gradient overlay (from-turquoise/20 to-transparent) fades in on hover, hinting at the magic about to be unleashed.
3

"Brewing..." — 1.5 second delay

The button immediately becomes disabled and its label switches to "Brewing...". The disabled:opacity-50 and disabled:cursor-not-allowed Tailwind classes reflect the waiting state visually. This 1.5 s window simulates an async operation and builds anticipation before the success state fires.
4

Turquoise particle explosion + success message

After 1.5 seconds the form card fades and shrinks (opacity: 0, scale: 0.9) while five turquoise orbs burst outward and a “Message Received” confirmation fades in with a sparkle emoji above it and the caption “The spirits will deliver your words shortly.”
5

Form auto-resets after 4 seconds

A nested setTimeout of 4 000 ms calls form.reset() and returns all state flags to their defaults, restoring the blank form so the visitor could submit again if needed.

Success State

The success animation is composed of two Framer Motion layers that mount simultaneously inside an AnimatePresence block: Particle layer — five motion.div elements are generated with [...Array(5)].map(...). Each orb starts invisible and collapsed (scale: 0, opacity: 0.8) then animates through three keyframes:
initial={{ scale: 0, opacity: 0.8, y: 0 }}
animate={{
  scale:   [0, 2, 3],
  opacity: [0.8, 0.4, 0],
  y: -100 - Math.random() * 100,   // 100–200 px upward
  x: (Math.random() - 0.5) * 100,  // ±50 px sideways
}}
transition={{ duration: 2, ease: "easeOut", delay: index * 0.2 }}
Each orb is a heavily blurred (blur-xl) circular div styled bg-turquoise/20, so in aggregate they produce a soft, luminous explosion rather than harsh shapes. The staggered 0.2 s delays make the burst feel like a fountain rather than a simultaneous flash. Text layer — a motion.div wrapping the confirmation copy starts at opacity: 0, y: 20 and eases to full visibility with a 0.5 s entrance delay, ensuring the particle burst is already in flight before the words appear:
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.5 }}
The confirmation block contains a emoji, an h3 reading “Message Received” in parchment serif, and a font-mono subtitle in turquoise/60.
The form’s onSubmit handler calls event.preventDefault() before doing anything else — this is what prevents the browser from performing a full page reload on submission. Without it, the entire Oracle SPA would navigate away the moment the button is clicked, and none of the particle animations would ever play. Keep this in mind when wiring up any form inside a React or Vite single-page application.

Build docs developers (and LLMs) love