add rate limiting, CSRF, newsletter, auto-checker, /uses and /projects pages

This commit is contained in:
Blake Ridgway
2026-03-11 14:12:52 -05:00
parent 261745a5b7
commit 58831e2429
17 changed files with 913 additions and 19 deletions

View File

@@ -1328,6 +1328,157 @@ blockquote {
.resume-skills dd { color: #333 !important; }
}
/* === Honeypot field (hidden from humans) === */
.hp-field {
position: absolute;
left: -9999px;
top: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
opacity: 0;
pointer-events: none;
tab-index: -1;
}
/* === Subscribe widget === */
.subscribe-section {
margin-bottom: 2.5rem;
padding-bottom: 2rem;
border-bottom: 1px solid var(--border);
}
.subscribe-section h2 { margin-bottom: 0.3em; }
.subscribe-form {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
margin-top: 0.85rem;
max-width: 440px;
}
.subscribe-form input[type="email"] {
flex: 1;
min-width: 200px;
padding: 0.5em 0.75em;
background: var(--bg);
border: 1px solid var(--border-dark);
border-radius: var(--radius);
color: var(--text);
font-size: 0.95rem;
font-family: var(--font-sans);
}
.subscribe-form input[type="email"]:focus {
outline: 2px solid var(--accent);
outline-offset: 1px;
border-color: var(--accent);
}
/* === Uses Page === */
.uses-page { max-width: var(--max-w); }
.uses-section {
margin-bottom: 2.5rem;
}
.uses-section h2 {
font-size: 1.1rem;
border-bottom: 1px solid var(--border);
padding-bottom: 0.35em;
margin-bottom: 1.25rem;
}
.uses-item {
margin-bottom: 1.5rem;
padding-bottom: 1.5rem;
border-bottom: 1px solid var(--border);
}
.uses-item:last-child {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
.uses-item-header {
display: flex;
align-items: baseline;
gap: 0.75rem;
margin-bottom: 0.4em;
flex-wrap: wrap;
}
.uses-name {
font-family: var(--font-mono);
font-weight: 700;
font-size: 1rem;
color: var(--accent);
}
.uses-role {
font-size: 0.85rem;
color: var(--text-muted);
font-family: var(--font-mono);
}
.uses-item p { margin: 0; font-size: 0.9rem; line-height: 1.7; }
.uses-list {
font-size: 0.9rem;
line-height: 1.7;
margin: 0;
}
.uses-list li { margin-bottom: 0.4em; }
/* === Projects Page === */
.projects-page { max-width: var(--max-w); }
.project-list { display: flex; flex-direction: column; gap: 0; }
.project-item {
padding: 1.75rem 0;
border-bottom: 1px solid var(--border);
}
.project-item:first-child { padding-top: 0; }
.project-item:last-child { border-bottom: none; }
.project-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
margin-bottom: 0.6em;
}
.project-title {
font-size: 1.15rem;
margin: 0;
line-height: 1.3;
}
.project-item p {
font-size: 0.9rem;
line-height: 1.7;
color: var(--text);
margin-bottom: 0.75em;
}
.project-links {
display: flex;
gap: 1rem;
font-size: 0.85rem;
font-family: var(--font-mono);
}
/* === Responsive === */
@media (max-width: 600px) {