Files
cv-site/templates/partials/contact_error.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

32 lines
1.1 KiB
HTML

<div class="alert alert-error" role="alert" style="
padding: 1.5rem;
margin: 1rem 0;
border: 2px solid #ef4444;
border-radius: 0.5rem;
background-color: #fef2f2;
color: #991b1b;
animation: shake 0.4s 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="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<div style="flex: 1;">
<h3 style="margin: 0 0 0.5rem 0; font-size: 1.125rem; font-weight: 600;">
Unable to Send Message
</h3>
<p style="margin: 0; font-size: 0.95rem; line-height: 1.5;">
{{.Message}}
</p>
</div>
</div>
</div>
<style>
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
20%, 40%, 60%, 80% { transform: translateX(5px); }
}
</style>