The Contact page (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/sys-witch/llms.txt
Use this file to discover all available pages before exploring further.
contact.html) is the outreach endpoint for the portfolio. It renders two side-by-side sections: the interactive SummoningForm component for direct messages, and a collection of direct contact links — email address, GitHub profile, LinkedIn profile, and a downloadable résumé. Both sections are wrapped in the GlowFrame card container and share the magenta neon accent color used throughout contact.html.
SummoningForm
TheSummoningForm component lives at components/contact/SummoningForm.js. It is a client-side React form with three fields, a submit button, and an animated success state. There is no backend — the form captures input and simulates transmission client-side.
Form Fields
The form contains three required fields, each with a themed label that uses a small rune sigil icon alongside the field name:| Field | HTML Type | Label (Themed) | Placeholder |
|---|---|---|---|
| Name | text | ”Entity Identifier” (rune-1 sigil) | Your name |
email | ”Return Frequency” (rune-2 sigil) | your@email.com | |
| Message | textarea (5 rows) | “Transmission Payload” (rune-3 sigil) | What knowledge do you seek? |
required. The email field uses type="email" for native browser validation.
Submission Behavior
The form uses a simulated submission flow defined in the component’sonSubmit handler. When the submit button is clicked:
- The button immediately displays “Channeling…” and pulses via the
animate-pulseTailwind animation for 1,500ms. - After 1,500ms, the entire form is replaced by an animated success state: a large
rune-4sigil icon fades and scales in (opacity: 0, scale: 0.9→opacity: 1, scale: 1), followed by the heading “Signal Transmitted” and the line “The message has entered the void.” - The success state auto-dismisses after 3,000ms and the form reappears.
Styling
The form is wrapped in aGlowFrame component set to color="magenta" with animate={true}, giving the entire card a pulsing magenta glow border. Individual input and textarea elements share a consistent neon-bordered style:
- Background: Semi-transparent dark base (
bg-base/50) - Border: 1px solid magenta at 30% opacity at rest; full
neon-magentaon focus - Border radius:
rounded-none— sharp square corners throughout - Focus ring: 1px magenta ring matching the border color, activated via
:focus - Font: Inter (body font) for user-typed content; JetBrains Mono for labels
- Submit button: A full-width
GlyphButtoncomponent in solid magenta, labeled “Send The Signal”
text-glow-magenta), and is preceded by the contact sigil icon centered above it at 40px.
Contact Links Section
Alongside the SummoningForm,contact.html contains a direct links section for visitors who prefer not to use the form. This section is plain HTML in the page file and must be edited directly.
The four link types included by default are:
Email Address
A
mailto: link rendered as a styled anchor. Replace the placeholder href="#" with href="mailto:your@email.com" to make this functional.GitHub Profile
A link to the portfolio owner’s GitHub profile. Replace
href="#" with the full GitHub profile URL, e.g. href="https://github.com/yourusername".LinkedIn Profile
A link to the LinkedIn profile. Replace
href="#" with the full LinkedIn URL, e.g. href="https://linkedin.com/in/yourprofile".Résumé / CV Download
A downloadable file link. Replace
href="#" with the path to your résumé PDF, e.g. href="./files/resume.pdf", and store the file in the repository.How to Update the Contact Page
Open contact.html
Open
contact.html in a text editor. The contact links section is visible as a set of anchor elements near the lower portion of the page body. Each link has an href="#" placeholder.Replace the email link
Find the email anchor and update the Update the visible link text to your actual address as well.
href to use a mailto: URI:Replace the GitHub and LinkedIn links
Locate the GitHub and LinkedIn anchor elements and replace their
href values with your full profile URLs:Add your résumé file and update the download link
Place your résumé PDF in the repository, ideally in a The
files/ folder to keep the root tidy. Then update the résumé link:download attribute prompts the browser to download the file rather than open it inline.Accessibility Notes
The SummoningForm is built with accessibility in mind:- Every input has an explicit
<label>element with a matchinghtmlFor/idpair (name,email,message). Screen readers announce the field purpose when focus moves into each input. - Focus rings use
focus:ring-1 focus:ring-neon-magenta— a 1px magenta ring that is visible against the dark background and distinct from the resting border color. - The submit
GlyphButtonreceivesdisabled={true}and theanimate-pulseclass during the loading state, preventing double submission and providing visual feedback. - The success state is rendered inside the same DOM container as the form, so screen readers that are monitoring the region will announce the state change.
The
textarea element uses resize-none to disable manual resizing, which prevents layout breakage on smaller screens. If you want to allow resizing, remove the resize-none class from the textarea in SummoningForm.js and replace it with resize or resize-y.Production Recommendation: Use a Form Service
Because the SummoningForm has no built-in backend, messages typed into it on a published site will never be received. For a live portfolio, wire the form to one of these services instead of amailto: link — mailto: exposes your address to scrapers and requires the visitor to have a mail client configured.
Formspree
Formspree
Formspree provides a free tier for static site forms. Create an endpoint and replace the
onSubmit handler with a fetch POST to your Formspree URL. Submissions arrive in your email inbox and optionally a Formspree dashboard.Netlify Forms
Netlify Forms
If you deploy to Netlify instead of GitHub Pages, add
netlify and name="contact" attributes to the <form> element. Netlify’s build system detects and registers the form automatically. No JavaScript changes are required for basic submission capture.EmailJS
EmailJS
EmailJS sends form submissions directly to your email using browser-side JavaScript and an API key. It requires no server and integrates cleanly with the existing React component structure in
SummoningForm.js.