TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/dyed-in-the-wool/llms.txt
Use this file to discover all available pages before exploring further.
Contact component (internally function X) presents a minimal contact form styled around the dye-splash aesthetic. On submission, the button transitions to a “Soaking…” loading state for 1 500 ms before the background animates with an SVG contact-dye displacement filter and a success message replaces the form.
What It Displays
The page contains:- Section header — title “LEAVE A MARK” and subtitle “Got a project in mind? Let’s mix some colors together.”
- Form — three fields:
- Name —
type="text", required - Email —
type="email", required - Message —
<textarea>, required
- Name —
- Submit button — labeled “Send Message” at rest. During the simulated async delay it shows “Soaking…” with a disabled state.
- Success state — after the 1 500 ms delay the form is replaced by the heading “Message soaked in!” and the paragraph “I’ll get back to you before the dye dries.” The background simultaneously transitions to the
contact-dyeSVG filter effect (afeTurbulence+feDisplacementMapapplied to a teal rect and magenta circle).
Content Data
All strings are inline in the component JSX:placeholder attributes are also inline strings — edit them directly in the JSX.
Animation Details
| Element | Technique | Details |
|---|---|---|
| Section title + form block | Framer Motion initial → animate on mount | y: 20 → 0, opacity: 0 → 1 |
| Submit button | hover:scale-[1.02] / active:scale-[0.98] | CSS utility scale classes; inner fill uses Framer Motion whileHover radial expand |
| Loading state | State-driven re-render | isLoading state swap replaces button text and disables interaction |
| Success message | State-driven swap | isSuccess state replaces the form with the success block; Framer Motion initial: {opacity:0, scale:0.9} → animate: {opacity:1, scale:1} |
| Background filter | Framer Motion animate opacity | On success, the contact-dye SVG filter overlay fades from opacity: 0 → 1 over 2 s |
Customization
Wire up a real form service (Formspree example) Replace thesetTimeout mock in the submit handler with a real fetch call:
setTimeout:
<input> or <textarea> element with its own useState entry, include it in the validation check, and pass it to your form service payload.