feat: plakat redesign for subpages (projects, books, legal, privacy)

- Shared SubpageShell (HeaderClient paper strip + ink footer) and SubpageIntro,
  btn/ghost/card helpers in app/_ui/subpage.tsx
- Projects list: poster cards with hard ink shadows, filter pills, ink search field;
  no fake 800ms skeleton and no framer-motion opacity:0 in SSR
- Project detail: poster hero, .plakat-prose markdown, links/stack aside,
  back link works without JS
- Books: server-side fetch (visible without JS), cover + rating pills
- Legal notice / privacy: moved to app/_ui/*Client.tsx, root routes removed
  (middleware always redirects to /[locale]), consent reset via useConsent
- ProjectThumbnail rebuilt on Plakat tokens
- Old Header.tsx + test removed; brown/cream/sand palettes and unused
  glass-panel/admin-glass(-light)/liquid-bg-blob/float CSS dropped
  (liquid palette, glass-card, admin-glass-card stay for admin + 404)
- .plakat-prose replaces the missing typography plugin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
denshooter
2026-10-16 00:00:58 +02:00
parent 9e6ae866d0
commit 486555dbf2
22 changed files with 918 additions and 1005 deletions
+122 -57
View File
@@ -106,16 +106,7 @@ html {
}
}
/* Liquid Glass Effects */
.glass-panel {
background: var(--card);
backdrop-filter: blur(20px) saturate(130%);
-webkit-backdrop-filter: blur(20px) saturate(130%);
border: 1px solid var(--border);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
will-change: backdrop-filter;
}
/* Glass-Karten, nur noch im Editor */
.glass-card {
background: var(--card);
backdrop-filter: blur(30px) saturate(200%);
@@ -177,31 +168,6 @@ h6 {
scrollbar-width: none;
}
/* Animations */
@keyframes float {
0%,
100% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
}
.animate-float {
animation: float 8s ease-in-out infinite;
will-change: transform;
}
/* Liquid Blobs Background */
.liquid-bg-blob {
position: absolute;
filter: blur(80px);
opacity: 0.6;
z-index: -1;
animation: float 10s ease-in-out infinite;
}
/* Markdown Specifics for Blog/Projects */
.markdown h1 {
@apply text-4xl font-bold mb-6 tracking-tight;
@@ -246,31 +212,130 @@ h6 {
z-index: -1;
}
.admin-glass {
background: rgba(250, 248, 243, 0.95);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid #d7ccc8;
color: #3e2723;
}
.admin-glass-light {
background: #fffcf5;
border: 1px solid #d7ccc8;
color: #3e2723;
transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
box-shadow: 0 1px 2px rgba(62, 39, 35, 0.05);
}
.admin-glass-light:hover {
background: #faf8f3;
border-color: #bcaaa4;
box-shadow: 0 4px 6px rgba(62, 39, 35, 0.08);
}
.admin-glass-card {
background: #fffcf5;
border: 1px solid #d7ccc8;
box-shadow: 0 4px 6px -1px rgba(62, 39, 35, 0.06);
color: #3e2723;
}
/* Fließtext der Unterseiten (Markdown, CMS-HTML) im Plakat-Stil.
Ersetzt das nicht installierte Typography-Plugin. */
.plakat-prose {
font-size: 17px;
line-height: 1.7;
overflow-wrap: anywhere;
}
.plakat-prose > * + * {
margin-top: 1em;
}
.plakat-prose h1,
.plakat-prose h2,
.plakat-prose h3,
.plakat-prose h4 {
font-family: var(--font-bricolage), "Avenir Next", "Segoe UI", sans-serif;
font-weight: 800;
letter-spacing: -0.035em;
line-height: 1;
margin-top: 1.8em;
}
.plakat-prose > :first-child {
margin-top: 0;
}
/* Markdown aus dem CMS beginnt oft mit dem Projekttitel als h1; die Seite hat schon einen */
.plakat-prose > h1:first-child {
display: none;
}
.plakat-prose > h1:first-child + * {
margin-top: 0;
}
.plakat-prose h1 {
font-size: clamp(2rem, 4vw, 2.75rem);
}
.plakat-prose h2 {
font-size: clamp(1.7rem, 3.2vw, 2.25rem);
}
.plakat-prose h3 {
font-size: 1.4rem;
}
.plakat-prose h4 {
font-size: 1.15rem;
}
.plakat-prose strong {
font-weight: 700;
}
.plakat-prose a {
text-decoration: underline;
text-decoration-thickness: 2px;
text-underline-offset: 3px;
text-decoration-color: rgb(var(--plakat-red));
transition: color 150ms var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
.plakat-prose a:hover {
color: rgb(var(--plakat-red));
}
}
.plakat-prose ul,
.plakat-prose ol {
padding-left: 1.25em;
}
.plakat-prose ul {
list-style: square;
}
.plakat-prose ol {
list-style: decimal;
}
.plakat-prose li + li {
margin-top: 0.35em;
}
.plakat-prose li::marker {
color: rgb(var(--plakat-red));
}
.plakat-prose blockquote {
border-left: 4px solid rgb(var(--plakat-red));
padding-left: 1em;
}
.plakat-prose code {
font-family: var(--font-geist-mono), "SF Mono", Menlo, monospace;
font-size: 0.9em;
background: rgb(var(--plakat-paper-2));
border-radius: 4px;
padding: 0.1em 0.35em;
}
.plakat-prose pre {
background: rgb(var(--plakat-ink));
color: rgb(var(--plakat-paper));
border-radius: 12px;
padding: 1rem 1.25rem;
overflow-x: auto;
overflow-wrap: normal;
}
.plakat-prose pre code {
background: transparent;
padding: 0;
color: inherit;
}
.plakat-prose img {
max-width: 100%;
height: auto;
border: 2px solid rgb(var(--plakat-ink));
border-radius: 12px;
}
.plakat-prose hr {
border: 0;
border-top: 2px solid rgb(var(--plakat-ink));
}
.plakat-prose table {
display: block;
max-width: 100%;
overflow-x: auto;
border-collapse: collapse;
}
.plakat-prose th,
.plakat-prose td {
border-bottom: 1px solid rgb(var(--plakat-ink) / 0.2);
padding: 0.5em 0.75em;
text-align: left;
}