Files
cv-site/templates/partials/contact_success.html
T
juanatsap f91a24ea9b feat: Add plain text CV endpoint and contact form with security
Plain text endpoint:
- Add /text route for plain text CV (for curl/AI crawlers)
- Use k3a/html2text library for HTML-to-text conversion
- Add Plain Text button to hamburger menu with UI translations

Contact form feature:
- Add ContactHandler with proper email service integration
- Add CSRF protection middleware
- Add rate limiting (5 submissions/hour per IP)
- Add honeypot and timing-based bot protection
- Add input validation with detailed error messages
- Add security logging middleware
- Add browser-only middleware for API protection

Code quality:
- Fix all golangci-lint errcheck warnings for w.Write calls
- Remove duplicate getClientIP functions
- Wire up ContactHandler in routes.Setup
2025-11-30 13:47:49 +00:00

37 lines
1.2 KiB
HTML

<div class="alert alert-success" role="alert" style="
padding: 1.5rem;
margin: 1rem 0;
border: 2px solid #22c55e;
border-radius: 0.5rem;
background-color: #f0fdf4;
color: #166534;
animation: slideIn 0.3s ease-out;
">
<div style="display: flex; align-items: start; gap: 1rem;">
<svg style="flex-shrink: 0; width: 1.5rem; height: 1.5rem; margin-top: 0.125rem;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<div style="flex: 1;">
<h3 style="margin: 0 0 0.5rem 0; font-size: 1.125rem; font-weight: 600;">
Message Sent Successfully!
</h3>
<p style="margin: 0; font-size: 0.95rem; line-height: 1.5;">
Thank you for reaching out. I've received your message and will get back to you as soon as possible.
</p>
</div>
</div>
</div>
<style>
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>