The Contact page turns the act of sending a message into a ritual. The form sits at the centre of a slowly rotating summoning circle — one outer dashed ring, one inner solid ring, and two overlapping triangles forming a hexagram — all rendered in SVG and spinning continuously in the background. Submitting the form triggers a 2-second “brewing” state before the form is replaced by a success confirmation panel.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/the-craft/llms.txt
Use this file to discover all available pages before exploring further.
The Rotating SVG Background
Amotion.svg with viewBox="0 0 500 500" forms the summoning circle backdrop. It is wrapped in an absolute inset-0 pointer-events-none opacity-20 div so it sits behind the form and doesn’t intercept clicks. The SVG itself is animated with:
| Shape | Element | Key attributes |
|---|---|---|
| Outer dashed ring | <circle cx="250" cy="250" r="240"> | strokeDasharray="10 20" |
| Inner solid ring | <circle cx="250" cy="250" r="220"> | No dash — continuous stroke |
| Upward triangle | <polygon points="250,30 440,380 60,380"> | Points form an equilateral upward triangle |
| Inverted triangle | <polygon points="250,470 60,120 440,120"> | Overlapping with the upward triangle to form a hexagram |
The Three Form Fields
The form is aglass-panel p-8 rounded-xl border border-spell/20 panel centred within the summoning circle container. It uses a space-y-6 wrapper for field spacing. Each field consists of a <label> in Pinyon Script and an <input> or <textarea> with a bottom-border-only focus style:
- True Name
- Ethereal Address
- Your Intent
Form Submission Flow
ThehandleSubmit function manages three pieces of state: formData (name, email, message), isSubmitting (boolean), and isSuccess (boolean).
User submits the form
onSubmit calls e.preventDefault() then sets isSubmitting: true. All inputs and the submit button receive disabled={isSubmitting} and the button label switches from "Cast the Message" to "Brewing...".2-second simulated delay
A
setTimeout fires after 2000ms, sets isSubmitting: false and isSuccess: true. This is the placeholder for a real API call.Success state replaces the form
When
isSuccess is true the form JSX is swapped for a motion.div confirmation panel containing a <Sigil> icon, "Message Cast" in Cinzel, and a prose line reading “The spirits have received your intent. Await my reply.”Success State UI
Wiring Up a Real Backend
Replace thesetTimeout in handleSubmit with a fetch POST to your chosen service. Here is an example using Formspree: