feat(website): SEO, a11y, and build pipeline overhaul

- SEO: per-locale og:locale, Organization+WebSite schema, FAQPage replacing ItemList
- SEO: BreadcrumbList on legal pages, site.webmanifest, expanded sitemap
- a11y: hamburger ARIA+ESC, skip-to-content, aria-hidden on step-num
- a11y: focus-visible states, prefers-reduced-motion, emoji→SVG icons
- CSS: extract .mock-section-label, replace transition:all, will-change hints
- Build: esbuild JS minifier (-46%), sharp AVIF conversion (26 files, quality 70)
- Build: content hashing (style.XXXX.min.css), SVG minification, picture injection
- Cleanup: remove lightningcss (caused CSS merging bugs)
This commit is contained in:
Koala
2026-06-01 03:20:51 +02:00
parent 9eab699e2a
commit 72180ba817
58 changed files with 2569 additions and 1513 deletions
+82 -12
View File
@@ -255,13 +255,12 @@ nav {
border-radius: 12px;
font-weight: 600;
text-decoration: none;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1), color 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-size: 0.95rem;
}
.btn-primary {
background: var(--accent);
color: white;
@@ -400,7 +399,7 @@ nav {
padding: 8px 4px;
cursor: pointer;
border-radius: 8px;
transition: all 0.2s;
transition: color 0.2s, background-color 0.2s;
text-align: center;
}
@@ -455,6 +454,15 @@ nav {
margin-bottom: 0.4rem;
}
.mock-section-label {
display: block;
font-size: 11px;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: 4px;
font-weight: 700;
}
.mock-input {
background: #1e293b;
border: 1px solid #334155;
@@ -729,7 +737,7 @@ input:checked + .mock-slider:before {
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
}
@@ -769,7 +777,7 @@ input:checked + .mock-slider:before {
color: var(--accent);
border-radius: 12px;
margin-right: 14px;
transition: all 0.3s ease;
transition: background 0.3s ease, color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;
}
.feature-card:hover .feature-icon-svg {
@@ -977,7 +985,7 @@ input:checked + .mock-slider:before {
align-items: center;
justify-content: center;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.05);
transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.4s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}
.step-illustration-1:hover, .step-illustration-2:hover, .step-illustration-3:hover {
@@ -1056,7 +1064,7 @@ input:checked + .mock-slider:before {
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
transition: opacity 0.3s, box-shadow 0.3s;
}
.illus-extension-btn.active {
@@ -1142,7 +1150,7 @@ input:checked + .mock-slider:before {
background: rgba(255, 255, 255, 0.03);
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
cursor: default;
transition: all 0.2s;
transition: opacity 0.2s, transform 0.2s;
}
.illus-store-btn img {
@@ -1692,7 +1700,7 @@ input:checked + .mock-slider:before {
padding: 0.35rem 0.75rem;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
transition: color 0.2s, background-color 0.2s;
}
.terminal-tab-btn:hover {
@@ -1751,7 +1759,7 @@ input:checked + .mock-slider:before {
font-weight: 600;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
transition: background-color 0.2s, color 0.2s, opacity 0.2s;
display: flex;
align-items: center;
gap: 0.3rem;
@@ -1779,7 +1787,7 @@ footer {
[data-reveal] {
opacity: 0;
transform: translateY(30px);
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
transition: opacity 0.8s cubic-bezier(0.4, 0, 0.2, 1), transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
[data-reveal].revealed {
@@ -1902,7 +1910,7 @@ html:not(.lang-de) [lang="de"] {
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 9999px;
padding: 6px 14px 6px 12px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transition: background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1), color 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
color: var(--text-muted);
}
@@ -2570,3 +2578,65 @@ html:not(.lang-de) [lang="de"] {
box-shadow: 0 20px 25px -5px rgba(34, 197, 94, 0.4);
}
/* --- Focus states for interactive cards --- */
.feature-card:focus-visible,
.use-case-card:focus-visible,
.compat-logo:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 4px;
transform: translateY(-5px);
}
.feature-card,
.use-case-card,
.compat-logo {
scroll-margin-top: 100px;
}
/* --- Skip-to-content accessibility link --- */
.skip-link {
position: absolute;
left: -9999px;
top: 0;
background: var(--accent);
color: white;
padding: 0.75rem 1.25rem;
border-radius: 0 0 8px 0;
font-weight: 700;
z-index: 9999;
text-decoration: none;
}
.skip-link:focus {
left: 0;
}
/* --- Reduced motion support --- */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.blob { animation: none; }
.join-status-pulse { animation: none; }
.status-ring.active-pulse { animation: none; }
}
/* --- will-change hints for animated elements --- */
.blob,
.join-status-pulse,
.status-ring.active-pulse,
.hero-mockup-wrapper,
.cta-group .btn {
will-change: transform, opacity;
}
@media (prefers-reduced-motion: reduce) {
.blob,
.join-status-pulse,
.status-ring.active-pulse,
.hero-mockup-wrapper,
.cta-group .btn {
will-change: auto;
}
}