Projekte aktualisiert und Design ueberarbeitet
All checks were successful
Deploy go.vanityontour.de / deploy (push) Successful in 7s

VanityCast fehlte komplett, obwohl die App in Version 1.4 im App Store ist.
Neu dazu kommt eine Karte fuer Code & Infrastruktur (Forgejo/GitHub). News und
Stats bleiben aussen vor - beide leiten auf /admin bzw. /login und sind nicht
oeffentlich nutzbar.

Design: Abstands- und Typo-Skala ueber Custom Properties statt frei gewaehlter
Pixelwerte, Karten-Grid auf auto-fit umgestellt, je Projekt ein eigener Akzent
als Farbkante. Dazu Fokus-Ringe fuer Tastaturnutzung, prefers-reduced-motion
und scroll-margin, damit der Sticky-Header keine Ankerziele verdeckt.

Ausgehende Links laufen jetzt ueber die eigenen Kurzlinks, womit die Seite
Klickstatistiken bekommt. Impressum, Datenschutz und Mailto bleiben direkt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Oliver 2026-07-27 09:45:46 +02:00
parent 94d3a2bae5
commit 03c1a526bd
No known key found for this signature in database
2 changed files with 383 additions and 179 deletions

View file

@ -1,36 +1,76 @@
:root{
--bg:#0b0f14;
--panel:#0f1720;
--panel2:#0c141c;
--text:#e9eef6;
--muted:#a8b3c2;
--line:rgba(255,255,255,.10);
--line-strong:rgba(255,255,255,.20);
--accent:#ff9b54;
--accent2:#ffd29a;
/* Pro Karte ueberschrieben, damit die Projekte visuell auseinandergehen,
ohne dass jede Karte eine eigene Regel braucht. */
--card-accent: var(--accent);
--shadow: 0 18px 60px rgba(0,0,0,.45);
--radius:18px;
--radius-sm:12px;
--max:1100px;
--font: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
/* Ein Abstands-Raster statt frei gewaehlter Pixelwerte. */
--sp-1:.5rem;
--sp-2:.75rem;
--sp-3:1rem;
--sp-4:1.5rem;
--sp-5:2rem;
--sp-6:3rem;
--sp-7:4.5rem;
--font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial,
"Apple Color Emoji", "Segoe UI Emoji";
color-scheme: dark;
}
*{ box-sizing:border-box; }
html,body{ height:100%; }
html{ scroll-behavior:smooth; }
/* Sticky Header darf Ankerziele nicht verdecken. */
:target{ scroll-margin-top: 6rem; }
body{
margin:0;
min-height:100%;
font-family:var(--font);
background: radial-gradient(1200px 700px at 20% -10%, rgba(255,155,84,.18), transparent 65%),
radial-gradient(900px 600px at 85% 5%, rgba(255,210,154,.12), transparent 60%),
var(--bg);
background:
radial-gradient(1200px 700px at 20% -10%, rgba(255,155,84,.18), transparent 65%),
radial-gradient(900px 600px at 85% 5%, rgba(255,210,154,.12), transparent 60%),
var(--bg);
background-attachment: fixed;
color:var(--text);
line-height:1.55;
line-height:1.6;
-webkit-font-smoothing: antialiased;
text-wrap: pretty;
}
a{ color:inherit; text-decoration:none; }
a:hover{ text-decoration:underline; }
/* Sichtbarer Fokus fuer Tastaturnutzung, aber kein Ring bei Mausklick. */
a:focus-visible,
summary:focus-visible{
outline:2px solid var(--accent2);
outline-offset:3px;
border-radius:6px;
text-decoration:none;
}
img, svg{ max-width:100%; }
h1,h2,h3{ text-wrap: balance; }
.container{
width: min(var(--max), calc(100% - 40px));
margin: 0 auto;
width: min(var(--max), calc(100% - 2.5rem));
margin-inline: auto;
}
.skip{
@ -38,97 +78,95 @@ a:hover{ text-decoration:underline; }
width:1px; height:1px; overflow:hidden;
}
.skip:focus{
left:20px; top:16px; width:auto; height:auto;
padding:10px 14px; border-radius:10px;
background:var(--panel); border:1px solid var(--line);
left:1.25rem; top:1rem; width:auto; height:auto;
padding:.625rem .875rem; border-radius:var(--radius-sm);
background:#0f1720; border:1px solid var(--line-strong);
z-index:999;
}
/* ---------- Header ---------- */
.site-header{
position:sticky; top:0; z-index:50;
background: rgba(11,15,20,.75);
backdrop-filter: blur(10px);
background: rgba(11,15,20,.72);
backdrop-filter: blur(12px);
border-bottom:1px solid var(--line);
}
.header-inner{
display:flex;
justify-content:space-between;
align-items:center;
padding: 14px 0;
gap:16px;
padding: var(--sp-2) 0;
gap: var(--sp-3);
flex-wrap:wrap;
}
.brand{ display:flex; align-items:center; gap:12px; }
.brand{ display:flex; align-items:center; gap:var(--sp-2); }
.brand:hover{ text-decoration:none; }
.brand-mark{ filter: drop-shadow(0 6px 18px rgba(0,0,0,.35)); }
.brand-text{ display:flex; flex-direction:column; line-height:1.25; }
.brand-title{ font-weight:800; letter-spacing:.2px; }
.brand-sub{ font-size:.92rem; color:var(--muted); }
.brand-sub{ font-size:.9rem; color:var(--muted); }
.top-nav{ display:flex; gap:14px; flex-wrap:wrap; justify-content:flex-end; }
.top-nav{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
.nav-link{
padding:8px 10px;
border-radius:10px;
padding:.5rem .75rem;
border-radius:var(--radius-sm);
border:1px solid transparent;
color:var(--muted);
font-size:.95rem;
transition: color .15s ease, border-color .15s ease, background .15s ease;
}
.nav-link:hover{
text-decoration:none;
color:var(--text);
border-color: var(--line);
background: rgba(255,255,255,.03);
background: rgba(255,255,255,.04);
}
.hero{ padding: 56px 0 36px; }
/* ---------- Hero ---------- */
.hero{ padding: var(--sp-7) 0 var(--sp-6); }
.hero-inner{
display:grid;
grid-template-columns: 1.2fr .8fr;
gap: 28px;
grid-template-columns: 1.15fr .85fr;
gap: var(--sp-5);
align-items:center;
}
.kicker{
display:inline-block;
padding:6px 10px;
padding:.375rem .75rem;
border-radius:999px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
color:var(--muted);
margin:0 0 14px;
font-size:.9rem;
margin:0 0 var(--sp-3);
}
h1{
margin:0 0 14px;
font-size: clamp(2.0rem, 3.4vw, 3.2rem);
line-height:1.1;
letter-spacing:-.6px;
margin:0 0 var(--sp-3);
font-size: clamp(2rem, 1.3rem + 2.9vw, 3.4rem);
line-height:1.08;
letter-spacing:-.02em;
font-weight:800;
}
.accent{ color: var(--accent2); }
.lead{
margin:0 0 18px;
margin:0 0 var(--sp-4);
color:var(--muted);
max-width: 52ch;
font-size: clamp(1rem, .96rem + .2vw, 1.125rem);
}
.hero-cta{ display:flex; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.btn{
display:inline-flex; align-items:center; justify-content:center;
padding: 11px 14px;
border-radius: 12px;
border:1px solid var(--line);
background: rgba(255,255,255,.03);
box-shadow: 0 0 0 rgba(0,0,0,0);
font-weight:700;
transition: transform .12s ease, background .12s ease, border-color .12s ease;
white-space:nowrap;
}
.btn:hover{ text-decoration:none; transform: translateY(-1px); border-color: rgba(255,255,255,.18); background: rgba(255,255,255,.06); }
.btn.primary{
border-color: rgba(255,155,84,.55);
background: linear-gradient(180deg, rgba(255,155,84,.28), rgba(255,155,84,.10));
}
.btn.ghost{ color:var(--text); }
.hero-cta{ display:flex; gap:var(--sp-2); flex-wrap:wrap; margin-bottom: var(--sp-4); }
.hero-badges{ display:flex; gap:10px; flex-wrap:wrap; }
.hero-badges{
display:flex; gap:var(--sp-1); flex-wrap:wrap;
list-style:none; margin:0; padding:0;
}
.badge{
font-size:.88rem;
padding:6px 10px;
font-size:.85rem;
padding:.375rem .75rem;
border-radius:999px;
border:1px solid var(--line);
color:var(--muted);
@ -138,57 +176,115 @@ h1{
.hero-art{
color: var(--accent);
background: linear-gradient(180deg, rgba(255,155,84,.16), rgba(255,155,84,.05));
border: 1px solid rgba(255,255,255,.10);
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: var(--shadow);
padding: 14px;
padding: var(--sp-2);
}
.hero-art svg{ width:100%; height:auto; display:block; }
.section{ padding: 44px 0; }
/* ---------- Buttons ---------- */
.btn{
display:inline-flex; align-items:center; justify-content:center;
padding: .7rem 1.05rem;
border-radius: var(--radius-sm);
border:1px solid var(--line);
background: rgba(255,255,255,.03);
font-weight:700;
font-size:.95rem;
transition: transform .12s ease, background .12s ease, border-color .12s ease;
}
.btn:hover{
text-decoration:none;
transform: translateY(-1px);
border-color: var(--line-strong);
background: rgba(255,255,255,.07);
}
.btn:active{ transform: translateY(0); }
.btn.primary{
border-color: color-mix(in srgb, var(--card-accent) 55%, transparent);
background: linear-gradient(180deg,
color-mix(in srgb, var(--card-accent) 28%, transparent),
color-mix(in srgb, var(--card-accent) 10%, transparent));
}
.btn.primary:hover{
border-color: color-mix(in srgb, var(--card-accent) 75%, transparent);
}
.btn.ghost{ color: var(--text); }
/* ---------- Sections ---------- */
.section{ padding: var(--sp-6) 0; }
.section.alt{
background: linear-gradient(180deg, rgba(255,255,255,.02), transparent);
background: linear-gradient(180deg, rgba(255,255,255,.025), transparent);
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
}
.section-head{ margin-bottom: var(--sp-4); }
.section-head h2{
margin:0 0 6px;
font-size: 1.6rem;
letter-spacing:-.2px;
margin:0 0 .375rem;
font-size: clamp(1.4rem, 1.2rem + .8vw, 1.9rem);
letter-spacing:-.01em;
}
.section-head p{ margin:0 0 18px; color:var(--muted); }
.section-head p{ margin:0; color:var(--muted); max-width: 60ch; }
/* ---------- Projektkarten ---------- */
.grid{
display:grid;
grid-template-columns: repeat(2, minmax(0,1fr));
gap: 16px;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
gap: var(--sp-3);
}
.card{
position:relative;
overflow:hidden;
border-radius: var(--radius);
background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02));
background: linear-gradient(180deg, rgba(255,255,255,.045), rgba(255,255,255,.02));
border:1px solid var(--line);
box-shadow: 0 10px 40px rgba(0,0,0,.25);
padding: 18px;
padding: var(--sp-4);
display:flex;
flex-direction:column;
gap: var(--sp-3);
justify-content:space-between;
min-height: 210px;
transition: border-color .15s ease, transform .15s ease;
}
.card h3{ margin:8px 0 10px; font-size:1.25rem; }
.card p{ margin:0 0 14px; color:var(--muted); }
/* Farbkante oben statt bunter Flaeche - ordnet zu, ohne laut zu sein. */
.card::before{
content:"";
position:absolute; inset:0 0 auto 0;
height:3px;
background: linear-gradient(90deg, var(--card-accent), transparent 70%);
opacity:.9;
}
.card:hover{
border-color: color-mix(in srgb, var(--card-accent) 40%, var(--line));
transform: translateY(-2px);
}
.card h3{ margin:.25rem 0 .5rem; font-size:1.3rem; letter-spacing:-.01em; }
.card p{ margin:0; color:var(--muted); }
.card strong{ color: var(--text); font-weight:700; }
.card-meta{
display:flex; align-items:center; gap:var(--sp-1);
flex-wrap:wrap; margin:0;
}
.card-tag{ font-size:.85rem; color:var(--muted); }
.card-actions{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
.card-actions{ display:flex; gap:10px; flex-wrap:wrap; }
.pill{
display:inline-flex;
align-items:center;
justify-content:center;
padding: 5px 10px;
padding: .3rem .7rem;
border-radius: 999px;
background: rgba(255,155,84,.18);
border:1px solid rgba(255,155,84,.35);
font-size:.85rem;
background: color-mix(in srgb, var(--card-accent) 18%, transparent);
border:1px solid color-mix(in srgb, var(--card-accent) 40%, transparent);
font-size:.8rem;
font-weight:800;
color: var(--accent2);
letter-spacing:.02em;
color: color-mix(in srgb, var(--card-accent) 65%, white);
}
.pill.subtle{
background: rgba(255,255,255,.05);
@ -196,71 +292,90 @@ h1{
color: var(--muted);
}
.note{
margin-top: 16px;
padding: 14px 16px;
border-radius: 14px;
border:1px dashed rgba(255,255,255,.18);
background: rgba(255,255,255,.02);
color: var(--muted);
}
/* Markenfarben der einzelnen Projekte. */
.is-cast{ --card-accent:#34bed1; }
.is-stay{ --card-accent:#7bd88f; }
.is-expense{ --card-accent:#ffd29a; }
.is-code{ --card-accent:#9d8cff; }
.is-blog{ --card-accent:#ff9b54; }
/* ---------- Support ---------- */
.split{
display:flex;
align-items:center;
justify-content:space-between;
gap: 18px;
gap: var(--sp-4);
flex-wrap:wrap;
}
.support-actions{ display:flex; gap:10px; flex-wrap:wrap; }
.split-copy{ max-width: 58ch; }
.split-copy h2{ margin:0 0 .5rem; font-size: clamp(1.4rem, 1.2rem + .8vw, 1.9rem); }
.split-copy p{ margin:0; color:var(--muted); }
.support-actions{ display:flex; gap:var(--sp-1); flex-wrap:wrap; }
/* ---------- Social & Kontakt ---------- */
.social{
display:flex;
gap:10px;
gap:var(--sp-1);
flex-wrap:wrap;
margin-bottom: 18px;
margin-bottom: var(--sp-4);
}
.social-link{
border:1px solid var(--line);
background: rgba(255,255,255,.03);
padding: 10px 12px;
border-radius: 12px;
padding: .6rem .9rem;
border-radius: var(--radius-sm);
color: var(--text);
font-size:.95rem;
transition: transform .12s ease, border-color .12s ease, background .12s ease;
}
.social-link:hover{
text-decoration:none;
transform: translateY(-1px);
border-color: var(--line-strong);
background: rgba(255,255,255,.06);
}
.social-link:hover{ text-decoration:none; transform: translateY(-1px); }
.contact{
border-radius: var(--radius);
border:1px solid var(--line);
background: rgba(255,255,255,.02);
padding: 16px;
background: rgba(255,255,255,.025);
padding: var(--sp-4);
}
.contact h3{ margin:0 0 8px; }
.fineprint{ margin:10px 0 0; color:var(--muted); font-size:.92rem; }
.contact h3{ margin:0 0 .5rem; }
.contact p{ margin:0; color:var(--muted); }
.contact-mail{
color: var(--accent2);
font-weight:700;
word-break: break-word;
}
.fineprint{ margin-top:.75rem !important; font-size:.92rem; }
.fineprint a{ color: var(--accent2); }
/* ---------- FAQ ---------- */
.faq{
border-radius: var(--radius);
border:1px solid var(--line);
background: rgba(255,255,255,.02);
padding: 12px 14px;
margin: 10px 0;
background: rgba(255,255,255,.025);
padding: var(--sp-2) var(--sp-3);
margin-bottom: var(--sp-1);
}
.faq summary{
cursor:pointer;
font-weight:800;
}
.faq-body{ color:var(--muted); padding-top: 10px; }
code{
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: .95em;
background: rgba(255,255,255,.06);
border: 1px solid var(--line);
padding: 2px 6px;
border-radius: 8px;
font-weight:700;
padding: .35rem 0;
list-style-position: outside;
}
.faq[open]{ border-color: var(--line-strong); }
.faq-body{ color:var(--muted); padding: .5rem 0 .35rem; }
.faq-body p{ margin:0; }
/* ---------- Footer ---------- */
.site-footer{
padding: 22px 0;
padding: var(--sp-4) 0;
border-top:1px solid var(--line);
color: var(--muted);
}
@ -268,17 +383,36 @@ code{
display:flex;
justify-content:space-between;
align-items:flex-start;
gap: 12px;
gap: var(--sp-3);
flex-wrap:wrap;
}
.footer-links{ display:flex; gap:12px; flex-wrap:wrap; }
.footer-brand{ margin:0; }
.footer-links{ display:flex; gap:var(--sp-3); flex-wrap:wrap; }
.footer-links a{ color: var(--muted); }
.footer-links a:hover{ color: var(--text); text-decoration:none; }
.muted{ color: var(--muted); }
/* ---------- Responsive ---------- */
@media (max-width: 900px){
.hero{ padding: var(--sp-5) 0 var(--sp-4); }
.hero-inner{ grid-template-columns: 1fr; }
.hero-art{ order: -1; }
.grid{ grid-template-columns: 1fr; }
.header-inner{ gap: var(--sp-1); }
}
@media (max-width: 560px){
.brand-sub{ display:none; }
.card-actions .btn,
.hero-cta .btn{ flex: 1 1 auto; }
}
@media (prefers-reduced-motion: reduce){
html{ scroll-behavior:auto; }
*, *::before, *::after{
animation-duration:.01ms !important;
transition-duration:.01ms !important;
}
.btn:hover, .card:hover, .social-link:hover{ transform:none; }
}