The Raven page is the portfolio’s contact entry point. It presents a message form that matches the overall dark, arcane aesthetic of witch-dev — frosted glass panels, glowing text, and deep-purple accents — while giving visitors a clear path to get in touch with Alysha directly. The Send icon (imported asDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/witch-dev/llms.txt
Use this file to discover all available pages before exploring further.
se from Lucide React) serves as the submit button icon, reinforcing the “dispatch a raven” metaphor.
Navigation
The contact route is registered as:| Property | Value |
|---|---|
| Route | /#/contact |
| Label | "Raven" |
| Icon | Mail (Lucide React) |
"Raven" label and Mail icon appear in the sidebar navigation alongside the other portfolio sections (Home, Skills / Affinities, Writing / Scrolls).
Design
The Contact page uses the same visual language as every other page in the portfolio:Glass Panel
The form sits inside a
glass-panel container — a frosted-glass card with a subtle backdrop blur, dark semi-transparent background, and a thin border that catches the ambient purple glow.Dark Typography
Input labels, placeholder text, and the page heading follow the portfolio-wide type scale. Headings use
text-glow-purple; body text and placeholders use muted slate tones.Send icon (aliased as se in the bundle) to echo the raven-dispatch theme rather than a plain text label.
Customization: Wiring Up a Real Form Backend
Because witch-dev is a fully static site deployed without a server, the contact form cannot send email on its own. The browser’s security model blocks direct SMTP connections from client-side code, so a third-party form service or serverless function is required to actually deliver messages.Popular options for static-site contact forms include Formspree, EmailJS, and Netlify Forms. Each requires only a small amount of configuration and a few lines of client-side JavaScript.
EmailJS Integration (Recommended)
EmailJS lets you send email directly from the browser by calling their API with your service credentials — no backend required.Create a service and template in the EmailJS dashboard
Log in to emailjs.com, connect your email provider, and create a message template. Note your Service ID, Template ID, and Public Key.
Wire the form to EmailJS
Replace or extend the existing The
handleSubmit stub in the Contact component:e.target argument passes the entire form element — EmailJS reads each input’s name attribute to map it to your template variables, so make sure your <input> and <textarea> elements carry matching name props.Controlled Form Pattern
Below is a minimal controlled-form implementation that fits the portfolio’s component style and can be dropped into the existing Contact page:Keep your EmailJS Public Key in a
.env file (e.g. VITE_EMAILJS_PUBLIC_KEY) and reference it as import.meta.env.VITE_EMAILJS_PUBLIC_KEY. Public keys are safe to expose in client-side bundles, but Service IDs and Template IDs should still be treated as semi-private and kept out of public repositories where possible.Alternative: Formspree
If you prefer a zero-SDK approach, Formspree accepts a standard<form> POST:
Static Deployment Context
witch-dev is a Vite + React SPA with no accompanying API server. When deployed to a static host (GitHub Pages, Vercel static output, Netlify, Cloudflare Pages, etc.) there is no Node.js process running server-side to handle form submissions. This means:- You cannot use
nodemaileror any server-only email library directly inside the React component. - Any service that requires a secret API key (SendGrid, Mailgun) must be called from a serverless function — not from the browser — to avoid exposing credentials in the client bundle.
- EmailJS and Formspree are designed for exactly this constraint: they handle the server-side email delivery on your behalf, requiring only a public-facing identifier on the client side.