Vorlage ist die Pinterest-Web-App. Geaendert wurde ausschliesslich die Gestaltung: state, Tastaturkuerzel, deck/flash/commit/undo, die Drag-Handler und die Beispieldaten sind Byte-fuer-Byte identisch. - Hell statt dunkel: weisser Grund, Text #111, roter Akzent #e60023 statt Mint auf Tannen-/Weinrot-Verlauf - Sidebar (236px, beschriftet) wird zur 80px-Icon-Rail, Einstellungen sitzt unten; Zustaende ueber .rail/.rail.active statt inline, weil die dc-Laufzeit style-hover mit !important setzt und den aktiven Button sonst beim Hover aufhellt - Kopfzeile bekommt das Pinterest-Suchfeld (Pille, 48px) plus Konto; Tabs wandern in eine eigene Leiste mit 3px-Unterstrich - Karten randlos mit 16px-Radius; Merken-Pille erscheint beim Hover oben rechts, dazu ein Scrim - beides an :hover/:focus-within der Karte - Profil-Galerie wird Masonry (columns:5, gestaffelte Hoehen) - Nur noch Manrope, JetBrains Mono und backdrop-filter entfallen Der Tageszaehler "Karten gesichtet" hat mit der schmalen Rail seinen Platz verloren und sitzt jetzt in der Tab-Leiste. Offen: das Suchfeld ist eine Attrappe - die App hat keine Suche. Im README unter "Offene Punkte" vermerkt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Handoff: Videogen — Web-App (Desktop-Adaption der Mobile-App)
Überblick
Die bestehende Mobile-App („videogen", Swipe-Feed für Creator-/Produkt-Posts) als Desktop-Web-App. Statt einer schmalen Handy-Spalte im Browser: Icon-Rail links, breite Kopfzeile mit Suche, zentraler Kartenstapel und Detailspalte. Swipen wird durch Maus-Drag, Buttons und Tastatur ersetzt.
Visuelle Sprache: Pinterest Desktop. Heller Hintergrund, schmale Icon-Leiste ohne Beschriftung,
Suchfeld als breite Pille, rote Primäraktion („Merken"), randlose Karten mit 16px-Radius,
Masonry-Raster im Profil. Referenz ist die Pinterest-Web-App (de.pinterest.com); der Screenshot
dafür liegt bisher nicht im Repo, siehe Offene Punkte.
Die Funktionen sind gegenüber dem ersten Entwurf unverändert — Kartenstapel, Merken/Ablehnen, Undo, Tabs, die vier Screens und das State-Modell bleiben, wie sie waren. Geändert hat sich ausschließlich die Gestaltung.
Zu den Design-Dateien
Die Dateien in diesem Bundle sind Design-Referenzen in HTML — Prototypen, die Aussehen und Verhalten zeigen, kein Produktionscode zum Kopieren. Aufgabe ist, diese Designs in der bestehenden Umgebung des Ziel-Codebases nachzubauen (React, Vue, Svelte, Next.js …) mit dessen etablierten Patterns und Bibliotheken. Existiert noch keine Umgebung, das passendste Framework wählen (Empfehlung: React + TypeScript, Motion/Framer Motion für die Kartenanimation) und dort umsetzen.
Die HTML-Datei ist ein „Design Component"-Format: Videogen Web.dc.html enthält Template + Logikklasse,
support.js ist die Laufzeit dazu. Zum Ansehen: beide Dateien im selben Ordner belassen und die
.dc.html im Browser öffnen. Die Logikklasse am Dateiende ist lesbarer JS-Code und dient als Referenz
für Zustand und Interaktion.
Fidelity
High-fidelity. Farben, Typografie, Abstände, Radien, Übergänge und Interaktionen sind final gemeint und sollen pixelgenau nachgebaut werden — mit den Komponenten/Utilities des Ziel-Codebases.
Globales Layout (App-Shell)
- Wurzel:
display:flex,min-height:100vh,min-width:1180px(darunter horizontales Scrollen, die App ist Desktop-only gedacht). - Hintergrund durchgehend
#ffffff, Grundschrift#111111. Keine Verläufe, keinbackdrop-filter.
1. Icon-Rail (links)
- Breite
80px,flex:none,position:sticky; top:0; height:100vh,background:#ffffff, rechte Kante1px solid #efefef. Padding12px 0 16px, Inhalt zentrierte Flex-Spalte,gap:8px. - Brand: 32×32 Kreis
#e60023in einem 48px-Slot, weißes „V" 17px/700. - Nav-Buttons: 48×48,
border-radius:50%, Icon 20px, ohne Textlabel — der Name steht imtitle-Attribut und wird als Tooltip gezeigt.- Inaktiv: transparent, Icon
#111111. Hover:background:#e9e9e9. - Aktiv:
background:#111111, Icon#ffffff. Aktiv + Hover:background:#000000. - Transition
.12s ease. - Umsetzungshinweis: Die Zustände gehören in Klassen (
.rail,.rail.active), nicht in Inline-Styles. Im Prototyp setzt die.dc-Laufzeitstyle-hovermit!important; ein inline gesetztes Aktiv-Schwarz würde beim Hover überschrieben und der aktive Button hellte auf. - Reihenfolge oben: Feed, Profil, Erstellen. Unten (
margin-top:auto): Einstellungen. - Icons (im Prototyp Unicode-Glyphen als Platzhalter) — Lucide:
home,user,plus,settings.
- Inaktiv: transparent, Icon
2. Kopfzeile
padding:12px 16px 4px, Flex-Zeile,gap:8px.- Suchfeld:
flex:1, Höhe48px,border-radius:24px,background:#efefef,padding:0 16px, Platzhaltertext „Suchen" 16px#767676; links Lupe, rechts Objektiv-Symbol (Lucidesearchundcamera). - Konto: 40px Kreis
linear-gradient(140deg,#b2323c,#5d1620)mit weißer Initiale 15px/700, daneben 28px Chevron-Button (▾, Hover#e9e9e9).
3. Tab-Leiste
padding:0 24px, Unterkante1px solid #efefef, Tabs mitgap:24px, an der Grundlinie ausgerichtet.- Tabs: „Videos", „Folge ich", „Posts". Jeder Tab wechselt den Kartenstapel und springt zurück
auf den Feed-Screen (Index/History zurücksetzen).
padding:0 2px 12px, Unterkante3px solid— aktiv#111111, inaktivtransparent.- Aktiv:
#111111, 700. Inaktiv:#767676, 500; Hover →#111111. Schriftgröße 16px.
- Rechts: Tageszähler „NN heute gesichtet" (Zahl 700
#111111mittabular-nums, Rest 13px#767676), Stapelzähler „3 / 5" (13px#767676,tabular-nums) und runder Info-Button 36px (transparent, Hover#e9e9e9), der das Kürzel-Panel toggelt.
Screens
A. Feed (Startansicht)
Zweck: Karten sichten, merken oder überspringen.
Layout: display:grid; grid-template-columns: minmax(0,1fr) 372px; flex:1; min-height:0; overflow:auto.
A1 Kartenbühne (linke Spalte)
- Zentriert,
padding:26px 20px 30px,gap:22px,position:relative. - Bühne:
position:relative; width:min(404px,100%); height:560px; flex:none. - Es werden bis zu 3 Karten gestapelt gerendert (konfigurierbar 1–5).
- Karte k (0 = oben):
transform: translate3d(0, -12px·k, 0) scale(1 - 0.045·k),z-index: 10-k,pointer-eventsnur auf der obersten. - Karte:
position:absolute; inset:0; border-radius:26px→16px,overflow:hidden, kein Rahmen,box-shadow: 0 1px 20px rgba(0,0,0,.18),touch-action:none; user-select:none; cursor:grab(beim Ziehengrabbing). - Transition:
transform .34s cubic-bezier(.22,.9,.3,1), opacity .3s ease— während des aktiven Dragsnone.
- Karte k (0 = oben):
- Karteninhalt (von unten nach oben gestapelt):
- Grundfläche:
linear-gradient(155deg, <hue0> 0%, <hue1> 100%)(pro Karte, siehe Daten unten). - Streifen-Overlay:
repeating-linear-gradient(<40+9·i>deg, rgba(255,255,255,.08) 0 2px, transparent 2px 16px),opacity:.5. (Im Prototyp Platzhalter für das Video-/Bild-Asset — im Produkt liegt hier das Medium.) - Hover-Scrim:
rgba(0,0,0,.24),opacity0 → 1 in.12s, nur wenn die Karte gehovert wird. - Lesbarkeits-Verlauf:
linear-gradient(180deg, transparent 46%, rgba(0,0,0,.62) 100%). - Pills oben links (
padding:16px,gap:8px): Art („Produkt"/„Video") und Assets („3 Bilder").padding:6px 12px; border-radius:16px; background: rgba(255,255,255,.94); color:#111111; font:600 13px. - Merken-Pille oben rechts, nur auf der obersten Karte und erst beim Hover
(
opacity0 → 1 in.12s):padding:11px 16px; border-radius:22px; background:#e60023; color:#ffffff; font:700 15px, Hover#ad081b. Klick = dieselbe Aktion wie „Merken"/→. - Caption mittig, 104px über der Unterkante:
font:600 15px,padding:8px 14px,border-radius:16px,background: rgba(255,255,255,.94),color:#111111. - Creator-Zeile unten (
padding:18px,gap:12px, Text weiß): 44px Avatar-Kreis (Farbverlauf, ohne Rand), Name 18px/700letter-spacing:-.01em, Untertitel 14pxrgba(255,255,255,.82). - Entscheidungs-Badge (nur oberste Karte, erscheint ab 40px Drag oder beim Exit):
top:86px, links bei „GEMERKT" / rechts bei „SKIP",padding:10px 18px; border-radius:22px; font:700 15px; letter-spacing:.08em, Text immer#ffffff, Fläche#e60023(GEMERKT) bzw.#111111(SKIP),rotate(-10deg)bzw.rotate(10deg), Opacitymin(1, |dx|/110), Transition.16s.
- Grundfläche:
- Leerzustand (Stapel durch): Fläche
#f5f5f5,radius:16px, Titel „Alles gesichtet" 20px/700, Text „Für heute sind keine neuen Karten mehr in dieser Ansicht." 15px#5f5f5f, roter Pill-Button „Stapel neu laden" (#e60023, Hover#ad081b, weiß 15px/700,padding:12px 20px; radius:24px), EinblendungfadeIn .3s. - Aktions-Buttons unter der Bühne (
gap:16px), Hoverscale(1.04), Activescale(.96), Transition.12s:- ✕ Ablehnen — 56px Kreis,
background:#efefef, Icon#111111, Hover#e2e2e2. - ↺ Zurück — 48px Kreis, gleiche Flächen.
- Merken — roter Pill statt Kreis: Höhe 56px,
padding:0 30px,border-radius:28px,background:#e60023,color:#ffffff,font:700 17px, Hover#ad081b. (Icons in der Implementierung: Lucidex,rotate-ccw; „Merken" trägt Text, kein Icon.)
- ✕ Ablehnen — 56px Kreis,
- Kürzel-Panel (Info-Button): absolut
right:26px; top:26px, 250px,radius:16px,background:#ffffff,box-shadow: 0 1px 20px rgba(0,0,0,.16),padding:16px, EinblendungriseIn .22s. Inhalt: ← Ablehnen, → Merken, ↑ Zurücknehmen, Maus Karte ziehen.
A2 Detailspalte (rechts, 372px)
border-left:1px solid #efefef,background:#ffffff,padding:28px, Flex-Spaltegap:22px,overflow:auto.- Kicker „Aktuelle Karte" 12px/600
#767676, Titel = Caption der obersten Karte 28px/700letter-spacing:-.02em, darunter „Name · Untertitel" 15px#5f5f5f. - Hairline
1px #efefef. - Statistik-Raster 3 Spalten,
gap:10px: Kachelbackground:#f5f5f5,radius:16px,padding:14px; Wert 18px/700tabular-nums, Label 12px#767676. - Beschreibung: Kicker + Fließtext 15px,
line-height:1.7,#333333,text-wrap:pretty. - Tags: Pills
padding:8px 14px,radius:18px,background:#efefef, 13px/600#111111. - Aktionen unten (
margin-top:auto,gap:8px), beidepadding:14px; radius:24px; font:700 15px: „Zur Sammlung hinzufügen" (rot#e60023, weiß, Hover#ad081b) = gleiche Aktion wie „Merken"; „Überspringen" (#efefef,#111111, Hover#e2e2e2) = gleiche Aktion wie ✕.
B. Profil
padding:32px 24px 40px,overflow:auto, EinblendungriseIn .26s.- Kopf zentriert als Spalte,
gap:10px,padding-bottom:28px: 120px Avatar-Kreis (linear-gradient(140deg,#b2323c,#5d1620), ohne Rand), Name 36px/700letter-spacing:-.02em, Meta „Studio-Konto · seit März 2026" 15px#5f5f5f; darunter drei Kennzahlen nebeneinander (gap:28px, zentriert): Posts 38, Gemerkt (live aus dem Feed), Follower 1.204 — Werte 18px/700tabular-nums, Labels 13px#767676. - Masonry-Raster statt Gitter:
columns:5; column-gap:16px. Kachel:break-inside:avoid; margin-bottom:16px, unterschiedliche Höhen (Zyklus 320 / 240 / 400 / 280 / 360 / 220 / 300 / 260 px),radius:16px, kein Rahmen, Kartenverlauf + Streifen (opacity:.45),cursor:zoom-in. Titel unten auflinear-gradient(0deg, rgba(0,0,0,.62), transparent), 14px/600 weiß,padding:14px. Hover: Scrimrgba(0,0,0,.24)und rote Merken-Pille oben rechts (right:12px; top:12px,padding:11px 16px; radius:22px) blenden mit.12sein.
C. Erstellen
padding:32px 24px 40px; Inhalt in einer weißen Karte:max-width:920px, zentriert,radius:24px,box-shadow: 0 1px 20px rgba(0,0,0,.12),padding:32px,grid-template-columns: 1fr 320px,gap:32px.- Titel „Neuen Post erstellen" 30px/700, Untertitel 15px
#5f5f5f. - Dropzone: Höhe 220px,
border:2px dashed #cdcdcd,radius:16px,background:#f5f5f5; Hover Border#e60023, BG#fafafa. Text „Dateien hierher ziehen" 16px/700 + „MP4, MOV oder bis zu 10 Bilder" 14px#767676. - Felder Titel und Untertitel: Label 13px/700
#111111(keine Versalien, keinletter-spacing); Inputpadding:14px 16px,radius:16px,border:2px solid #cdcdcd,background:#ffffff, Text#111111, 15px. Beide sind an die Live-Vorschau gebunden. - Art: Pills „Produkt / Video / Serie",
padding:11px 18px,radius:22px,font:700 15px; aktivbackground:#111111, Text#ffffff; inaktivbackground:#efefef, Text#111111. - Aktionen: „Veröffentlichen" (rot
#e60023, weiß, löst Toast „Post veröffentlicht" aus), „Als Entwurf sichern" (#efefef), beidepadding:14px 24px,radius:24px,font:700 15px. - Vorschau (rechte Spalte): Kicker 12px/600
#767676+ Karte 420px hoch,radius:16px,linear-gradient(155deg,#1f8163,#0d4034)+repeating-linear-gradient(48deg, rgba(255,255,255,.07) 0 2px, transparent 2px 15px), unten Titel 18px/700 und Untertitel 14px auf schwarzem Verlauf — spiegelt die Eingaben live.
D. Einstellungen
padding:32px 24px 40px, Inhaltmax-width:660px, zentriert. Titel „Einstellungen" 30px/700.- Liste: Container
radius:16px,overflow:hidden,box-shadow: 0 1px 20px rgba(0,0,0,.12), kein Rahmen. Zeilepadding:20px,background:#ffffff, Trenner1px solid #efefef; Label 16px/700, Hinweis 14px#767676. - Toggle: Track 52×30,
radius:999px, kein Rahmen; aus →background:#cdcdcd, an →background:#e60023. Knopf 24px, immer#ffffffmitbox-shadow: 0 1px 3px rgba(0,0,0,.25), links 3px → 25px, Transitionleft .2s cubic-bezier(.22,.9,.3,1). - Einträge: Videos automatisch abspielen (an), Ton beim Öffnen (aus), Wochenrückblick (an), Bewegte Übergänge (an).
Interaktion & Verhalten
Karte entscheiden — vier gleichwertige Wege:
- Maus-Drag: Pointer Events auf der obersten Karte (
pointerdown→setPointerCapture,pointermove→ Delta,pointerup/pointercancel→ Auswertung). Live-Transform:translate3d(dx, dy, 0) rotate(dx/22 deg), Transition währenddessen aus. Schwelle ±120px:dx > 120= merken,dx < -120= ablehnen, sonst Rücksprung (Transition wieder an). - Buttons ✕ / ↺ / „Merken" unter der Bühne (und die beiden Buttons in der Detailspalte).
- Merken-Pille auf der Karte (erscheint beim Hover, oben rechts) — identisch mit „merken".
- Tastatur (global, nur auf dem Feed-Screen, mit
preventDefault):ArrowLeft= ablehnen,ArrowRight= merken,ArrowUp= zurücknehmen.
Hover-Zustände: Scrim und Merken-Pille hängen am Hover der Karte, nicht am eigenen Element
(im Prototyp .pin:hover .pin-save / .pin:hover .pin-scrim, zusätzlich :focus-within für
Tastaturbedienung). Im Ziel-Framework als Hover-State der Kartenkomponente umsetzen —
und den Fokusfall nicht vergessen, sonst ist die Pille per Tastatur nicht erreichbar.
Exit-Animation: transform: translate3d(±620px, -40px, 0) rotate(±22deg), opacity: 0,
Dauer 320ms, danach Index +1 und exiting zurücksetzen. Während exiting sind weitere
Entscheidungen gesperrt.
Undo: letzte Entscheidung aus der History, Index zurück, „Gemerkt"-Zähler ggf. −1. Leere History → Toast „Nichts zurückzunehmen".
Toast: fixiert bottom:28px, horizontal zentriert, padding:16px 22px, radius:16px,
background:#ffffff, box-shadow: 0 1px 20px rgba(0,0,0,.22), color:#111111, 15px/600,
Einblendung riseIn .2s, verschwindet nach 1700ms. Texte: „Zu ‚' gemerkt",
„Übersprungen", „Nichts zurückzunehmen", „Post veröffentlicht".
Keyframes:
riseIn:opacity:0; translateY(14px)→opacity:1; none(.2–.26s ease)fadeIn:opacity:0→1- Fokus:
:focus-visible { outline: 2px solid #0074e8; outline-offset: 2px; }— nie der Browser-Default.
Responsive: Desktop-only, min-width:1180px; darunter horizontal scrollen.
Der Feed-Bereich scrollt bei geringer Fensterhöhe (min-height:0; overflow:auto).
State
| State | Typ | Zweck |
|---|---|---|
screen |
'feed' | 'profile' | 'create' | 'settings' |
aktive Ansicht (Icon-Rail) |
tab |
'videos' | 'following' | 'posts' |
aktiver Stapel; Wechsel setzt idx/history zurück und springt auf feed |
idx |
number | Index der obersten Karte im aktuellen Stapel |
drag |
{x, y, active} | null |
laufende Drag-Geste |
exiting |
'left' | 'right' | null |
laufende Exit-Animation (sperrt Eingaben) |
history |
{idx, dir}[] |
für Undo |
seen, saved |
number | Zähler Tab-Leiste / Profil |
showInfo |
boolean | Kürzel-Panel |
toast |
string | Toast-Text (leer = versteckt) |
draftTitle, draftSub, draftKind |
string | Formular „Erstellen", live in der Vorschau |
settings |
{autoplay, sound, digest, motion} booleans |
Einstellungen |
Datenbedarf pro Karte: name, sub, kind, assets, caption, hue: [from, to],
avatar (Verlauf oder Bild-URL), body, tags: string[], stats: [wert, label][].
Im Produkt ersetzt das Medium (Bild/Video) die Verlaufs-/Streifenfläche; alles andere bleibt.
Die drei Tabs liefern drei Stapel (Videos, Folge ich, Posts).
Design-Tokens
Farben
| Rolle | Wert |
|---|---|
| Seite | #ffffff |
| Text | #111111 |
| Text gedämpft | #5f5f5f (Fließtext sekundär), #767676 (Labels, inaktive Tabs), #333333 (Beschreibung) |
| Akzent (Rot) | #e60023, Hover #ad081b |
| Dunkel | #111111 (aktiver Rail-Button, aktive Art-Pille, SKIP-Badge), Hover #000000 |
| Neutrale Flächen | #efefef (Suchfeld, Buttons, Tags), Hover #e2e2e2; #e9e9e9 (Rail-Hover); #f5f5f5 (Kacheln, Dropzone, Leerzustand) |
| Linien | #efefef (Trenner, Kanten), #cdcdcd (Eingabe-Rahmen, Toggle aus) |
| Auf Medien | rgba(255,255,255,.94) Pills, rgba(255,255,255,.82) Untertitel, rgba(0,0,0,.24) Hover-Scrim, rgba(0,0,0,.62) Lesbarkeitsverlauf |
| Fokus | #0074e8 |
| Karten-Verläufe | grün #1f8163→#0d4034, blau #256f8b→#0c2f3f, ocker #8a6a2f→#3a2a11, rot #7a2f38→#2c1014, tannen #2f6f5a→#0e332b, türkis #1c6f7f→#0a2c33, violett #6a2f7a→#26102c, gold #7a5a2a→#2f2110 |
Typografie — nur Manrope 400/500/600/700. JetBrains Mono entfällt; Zahlen laufen in Manrope
mit font-variant-numeric: tabular-nums.
Skala: 36 / 30 / 28 / 20 / 18 / 17 / 16 / 15 / 14 / 13 / 12 px.
Große Überschriften letter-spacing:-.02em. Keine Versalien-Kicker mehr — Kicker sind
12px/600 in #767676, normal geschrieben.
Abstände 2 / 4 / 6 / 8 / 10 / 12 / 14 / 16 / 18 / 20 / 22 / 24 / 26 / 28 / 30 / 32 / 40 px.
Radien 16px (Karten, Kacheln, Eingaben, Pills auf Medien, Toast, Panel),
18 / 22 / 24 / 28px (Tag-, Art-, Button-Pillen), 50% Kreise, 999px Toggle-Track.
Schatten 0 1px 20px rgba(0,0,0,.12) Flächen/Listen · .16 Kürzel-Panel · .18 Karte ·
.22 Toast · 0 1px 3px rgba(0,0,0,.25) Toggle-Knopf.
Kein backdrop-filter — die Pinterest-Oberfläche ist deckend.
Transitions .12s ease (Hover, Farbwechsel, Ein-/Ausblenden), .16s (Badge),
.2s (Toggle), Karten-Bewegung .34s cubic-bezier(.22,.9,.3,1), Exit 320ms.
Assets
Keine Binärdateien im Prototyp. Alle Medien sind Platzhalter aus CSS-Verläufen und Streifenmustern — im Produkt durch echte Bilder/Videos ersetzen. Icons: Lucide (im Prototyp Unicode-Glyphen als Platzhalter). Fonts: Google Fonts — nur Manrope.
Offene Punkte
- Suchfeld ohne Funktion. Die Pinterest-Kopfzeile lebt von der Suche, im Prototyp ist sie eine reine Attrappe — es gibt bisher keine Suchfunktion in der App. Vor der Umsetzung klären, ob Suche gebaut wird; wenn nicht, gehört das Feld raus, statt eine Funktion vorzutäuschen.
- Pinterest-Referenz liegt nicht im Repo. Die Vorlage kam als Screenshot im Chat. Wer sie
dauerhaft braucht, legt sie als
referenz/pinterest-desktop.pngdaneben.
Dateien in diesem Bundle
PROMPT.md— fertiger Auftrag zum Einfügen in Claude Code.Videogen Web.dc.html— der Prototyp (Template oben, Logikklasse mit Zustand/Interaktion unten, Beispieldaten inDATA).support.js— Laufzeit, damit die HTML-Datei sich lokal öffnen lässt. Nicht portieren.README.md— dieses Dokument.referenz/mobile-ansicht-im-browser.png— Ausgangslage: die Mobile-App als schmale Spalte untervideogen.project.webklar.com, die diese Desktop-Adaption ersetzt.