[Story] Contact page #6
Closed
bot-implementer
wants to merge 6 commits from
feature/5 into master
pull from: feature/5
merge into: :master
:main
No Reviewers
Labels
Clear labels
agent/analyst-drafted
agent/analyst-drafted
needs/human-decision
needs/human-decision
needs/security-review
needs/security-review
tier/t0
tier/t1
tier/t2
tier/t3
kind
bug
kind
bug
kind
epic
kind
epic
kind
initiative
EPPP programme initiative
kind
story
kind
story
kind
task
EPPP engineering card/task decomposed from a story
kind
toil
kind
toil
loop
1
loop
1
loop
2
loop
2
loop
3
loop
3
risk
agent-full
risk
agent-full
risk
human-gated
risk
human-gated
risk
human-only
risk
human-only
size
l
size
l
size
m
size
m
size
s
size
s
status
blocked
status
blocked
status
done
Workflow: Done
status
in-progress
status
in-progress
status
proposed
status
proposed
status
ready
status
ready
status
review
status
review
stream
checkout
stream
checkout
stream
onboarding
stream
onboarding
stream
platform
stream
platform
trivial — implementer only, auto-merge
standard — implementer + reviewer + tester
complex — security if triggered, human merge
critical — full chain + security, human merge
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Fabrika/PersonalBlog#6
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Implements the contact page for the personal blog (issue #5) — a static form that opens the visitor's mail client pre-filled via
mailto:. No backend, no spam filtering (per scope).What changed
contact.html— new static contact page with name, email, and message fields (all required, accessible labels, responsive styling).js/mailto.js— pure, unit-testedmailto:URL builder (URL-encodes subject/body).js/contact.js— on submit, reads the form values and navigates the visitor's mail client to the pre-filledmailto:URL. Browser-only wiring is guarded so the module is importable in tests.node --test, zero dependencies) plus a CI workflow (.gitea/workflows/ci.yml).Criterion → test mapping
tests/contact.test.js→ "contact page renders a form with name, email, and message fields"; "all three contact form fields are required"tests/mailto.test.js→ "includes subject and body as URL-encoded query parameters"; "encodes spaces and special characters so the mail client opens pre-filled";tests/contact.test.js→ "buildContactMailto pre-fills subject and body from entered values"; "handleContactSubmit navigates the visitor to the built mailto URL"tests/contact.test.js→ "home page nav links to the contact page"; "contact page nav marks the contact link as the current page" (nav layout verified manually for desktop and mobile)Out of scope (as specified in the issue)
Risks / notes
MAILTO_TARGETinjs/contact.jsis a placeholder (hello@example.com) — replace with the real address at deploy time.mailto:varies; this is the standard client-side approach and requires no backend.npm teston Node ≥ 18.13.Rollback
Pull request closed