The Séance Circle page (route:Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/mystery-haunting/llms.txt
Use this file to discover all available pages before exploring further.
/contact) transforms the humble contact form into a fully illustrated ouija board experience. The page title reads “SÉANCE CIRCLE” with the subtitle “Communicate with the developer.” The board itself is rendered on an antique parchment background (#d4c4a8) overlaid with a diagonal hatch pattern, bordered with an 8px #2d1b15 dark-wood edge, and it displays the classic ouija layout: an arc of 26 alphabet letters across the upper face, YES and NO in the corners, a row of digits 1234567890 in the middle, and GOODBYE at the bottom. As the visitor types their name into the form below, a teardrop-shaped planchette SVG glides across the board on a spring animation, pausing over each successive letter — channelling the séance energy of the message before it is sent into the void.
Form Fields
| Field | Label | Type | Required |
|---|---|---|---|
| name | Your Name (to guide the planchette) | Text input | Yes |
| message | Your Message | Textarea | Yes |
Planchette Animation Mechanics
Map each typed character to an alphabet index
When the user types into the name field, the component reads the last character of the current value and looks it up in an A–Z array (index 0–25). This index determines which letter on the arc the planchette should travel toward next.
Calculate letter position on the arc
Each letter’s position on the ouija arc is computed using a polar-to-Cartesian conversion. The 26 letters are distributed evenly across the arc, and a fixed radius of 150px from the arc’s origin determines how far from centre each letter sits. The
y value is offset by +50 to shift the arc’s baseline downward into the board face.Spring-animate the planchette to the target position
Framer Motion’s
animate prop drives the planchette’s x, y, and rotate values toward the computed letter coordinates. A spring transition with stiffness: 100 gives the movement a weighted, otherworldly glide rather than a sharp mechanical jump.Form States
The form cycles through three states managed by astatus variable in React state:
| State | Button Label | Board Behaviour |
|---|---|---|
idle | SEND INTO THE VOID | Planchette tracks typed letters |
summoning | SUMMONING… | Planchette slides to y:150 (GOODBYE) |
sent | (hidden) | Board replaced by success message |
status reaches 'sent', the form is replaced with the success message:
MESSAGE RECEIVED The spirits will reply shortly.
Customization
How to wire up form submission
How to wire up form submission
The default Popular options include EmailJS (client-side, no backend required), Formspree (form endpoint hosting), and Resend (API-based transactional email). Each requires only minor changes to the
handleSubmit function simulates a backend call with a setTimeout. Replace the timeout with a real API call to your preferred email delivery service before going live.fetch call above.