Composition Rules
Kompositionsregeln und Guardrails — Quelle: composition-rules.md
Seitenhintergrund und Cards bilden die visuelle Basis
Alle Seiten nutzen einen hellen Hintergrund (ce-zinc-50 / #FBFBFC). Content wird in weißen Cards (#FFFFFF) oder direkt auf der Surface platziert.
ce-zinc-50
#FBFBFC · --ce-surface-page
Weiß
#FFFFFF · --ce-surface-card
--ce-surface-muted
Dezenter Hintergrund für Code-Blöcke und gedämpfte Flächen. Light: #F3F3F3 (ce-zinc-100), Dark: #313337 (ce-zinc-800).
--ce-surface-subtle
Leicht abgesetzte Flächen wie Tabellen-Header und Hover-States. Light: #EDEEEF (ce-zinc-200), Dark: #313337 (ce-zinc-800).
Das Flat-Prinzip platziert Content direkt auf der Surface
Überschriften, Badges und Logo-Reihen werden direkt auf der Surface platziert — ohne Card-Container. Erzeugt Ruhe und visuelle Hierarchie. Typisch für Hero-Sections, Marken-Logos und große Headlines.
Hero-Titel
Pressura 42–54px / 500. Direkt auf Surface, kein Card-Wrapper. Großzügiges Padding (py-16 px-8) statt Card-Rahmen.
Badge / Label
Pressura Mono 12px / uppercase, tracking-wider. Kleine Tags über der Headline.
Logo-Reihe
Marken-Logos als Flat-Grid ohne Cards. opacity-60 default, hover:opacity-100.
Das Bento-Prinzip organisiert Content in Cards mit Shadow
Content wird in weißen Cards mit abgerundeten Ecken (16px), Border und Shadow organisiert — auf dem hellgrauen Seitenhintergrund. Hover verdoppelt die Shadow-Opacity.
Card Spec
background: --ce-surface-card. border: 1px solid --ce-border-default. border-radius: 16px. shadow: 0 8px 36px rgba(0,0,0,0.08) light / 0.24 dark. shadow:hover: 0.16 light / 0.36 dark. transition: 300ms ease (box-shadow).
Alle Buttons folgen einem einheitlichen Größensystem
Alle Buttons verwenden Pressura Mono. Im selben Kontext (Header, Card, Footer) haben alle Buttons dieselbe visuelle Höhe. Abweichungen (z.B. Icon-only) sind explizit dokumentiert.
Primary Default
Pressura Mono 15px / 500, py-2.5 px-5, rounded-[8px], ~40px Höhe. bg: --ce-surface-invert. Hover: --ce-surface-invert-hover. Focus: 2px outline offset 2px. Active: scale(0.98). Disabled: bg surface-muted, text text-muted.
Primary Small / Outline Small
Pressura Mono 15px / 500, py-1.5 px-3, rounded-[8px], ~32px Höhe. Header-Buttons und Footer-Pills nutzen Small. Outline-Variante: border --ce-border-strong, transparent bg, text: --ce-text-secondary.
Primary Compact / Outline Compact
Pressura Mono 12px / 500, py-1 px-2.5, rounded-[6px], ~24px Höhe. Für enge Kontexte wie Filter-Tags.
Remixicon ist die einzige Icon-Bibliothek
Einzige Icon-Bibliothek: Remixicon. Keine anderen Libraries, keine Emoji. Default-Stil: line (nicht fill). Ausnahme: Social-Icons (Facebook = fill). Farbe: currentColor (erbt Textfarbe).
SVG-Einbindung
viewBox="0 0 24 24" fill="currentColor" width="[size]" height="[size]". Keine stroke-Icons, immer fill mit currentColor. Größen: 14px (inline/USP), 16px (Buttons), 18px (Footer Social), 24px (Mobile Nav).
Alle Abstände folgen einem 4px-Raster
4px Base Grid. Alle Abstände sind Vielfache von 4px. Skala: xs(4) sm(8) md(12) base(16) lg(20) xl(24) 2xl(32) 3xl(48) 4xl(64). Tailwind-Mapping: gap-1 bis gap-16, p-1 bis p-16.
Kontexte
xs(4): Icon-Abstand minimal. sm(8): Button-Icon-Gap. md(12): Eng verbundene Elemente. base(16): Standard-Padding Mobile, Card kompakt. lg(20): Card-Padding Standard. xl(24): Header-Padding Desktop. 2xl(32): Section-Trennung. 3xl(48): Große Sections. 4xl(64): Abstand zwischen Section-Blöcken.
Drei Schriftfamilien mit klarer Rollenverteilung
Drei Font-Familien, klar getrennt: Pressura (Headings, Navigation, Display), Pressura Mono (Buttons, Labels, UI, Preise), Inter (Body, Beschreibungen, Fließtext).
Pressura
Page Title H1: 54px/500 (mob: 28px). Subtitle: 28px/300 (mob: 19px). Section H2: 24px/500. Card Title H3: 18px/500. Card Title Small: 16px/500. Nav Link: 15px/300. Footer Heading: 16px/500.
Pressura Mono
Button/UI: 15px/500. Button Outline/Small: 13px/400. Label/Caption: 12px/400. Brand Badge: 11px/400, uppercase, tracking-wider. Preis: 14px/400. Copyright: 12px/400.
Inter
Body: 16px/400, line-height 24px. Body Small: 14px/400, line-height 22px. Footer Link: 14px/400, line-height 28px.
Semantische Tokens steuern alle Farbentscheidungen
Alle Farben werden über semantische Tokens referenziert, nie über Palette-Werte (ce-zinc-*) direkt. Die Tokens tauschen im Dark Mode automatisch ihre Werte.
--ce-text-heading
Light: #18191A (zinc-950) · Dark: #FBFBFC (zinc-50)
H1–H3, Nav, Card Titles
--ce-text-body
Light: #313337 (zinc-800) · Dark: #EDEEEF (zinc-200)
Fließtext, Absätze
--ce-text-secondary
Light: #575A61 (zinc-600) · Dark: #B6B7BB (zinc-400)
Beschreibungen, Footer Links
--ce-text-tertiary
Light: #69727D (zinc-500) · Dark: #69727D (zinc-500)
Labels, Specs
--ce-text-muted
Light: #B6B7BB (zinc-400) · Dark: #69727D (zinc-500)
Placeholder, Divider-Text
--ce-text-on-invert
Light: #FFFFFF · Dark: #18191A (zinc-950)
Text auf dunklen Buttons
--ce-surface-page
Light: #FBFBFC (zinc-50) · Dark: #18191A (zinc-950)
Seitenhintergrund
--ce-surface-card
Light: #FFFFFF · Dark: #232528 (zinc-900)
Cards, Header, Footer
--ce-surface-muted
Light: #F3F3F3 (zinc-100) · Dark: #313337 (zinc-800)
Code-Blöcke, gedämpfte Flächen
--ce-surface-subtle
Light: #EDEEEF (zinc-200) · Dark: #313337 (zinc-800)
Tabellen-Header, Hover-States
--ce-surface-invert
Light: #18191A (zinc-950) · Dark: #FBFBFC (zinc-50)
Primary Buttons, Tags
--ce-border-default
Light: #EDEEEF (zinc-200) · Dark: #454850 (zinc-700)
Standard-Borders, Trennlinien
--ce-border-strong
Light: #D1D1D4 (zinc-300) · Dark: #575A61 (zinc-600)
Outline Buttons, betonte Borders
--ce-border-muted
Light: #F3F3F3 (zinc-100) · Dark: #313337 (zinc-800)
Subtile Borders
Mobile-first mit zwei Breakpoints und Container Queries
Mobile-first. Zwei Haupt-Breakpoints (md, xl) plus Container Queries für Grids. Kein lg-Breakpoint im aktuellen Design.
Mobile (< 768px)
Header 56px, Logo h-16px, Hamburger-Menu, Footer 2-col Grid, px-4.
md (≥ 768px)
Header 80px, Logo w-190px, Desktop-Nav sichtbar, Footer 3-col Grid, px-6/px-8.
xl (≥ 1280px)
Footer 6-col Grid (4 Links + Contact col-span-2). Max-widths: Header 1140px, Footer 1200px.
Inhalte werden zentriert und konsistent ausgerichtet
Content-Container nutzen mx-auto mit max-width. Padding ist kontextabhängig: Header px-4/px-6, Footer px-6/px-8, Cards p-4/p-5, Section-Abstand mb-16 (64px).
Border-Radius
6px: Compact Buttons, Nav-Hover. 8px (--radius-sm): Buttons, Contact Pills, Code-Blöcke. 12px: Cards in Showcases. 16px (--radius-lg): Bento Cards, Spec-Tabellen. 9999px (--radius-full): Badges, runde Elemente.
Dark Mode tauscht Tokens, nicht Layouts
Dark Mode wird via .dark-Klasse auf <html> aktiviert. Alle semantischen Tokens tauschen ihre Werte. Kein Element darf Palette-Werte direkt verwenden.
Besondere Elemente
Bilder: Keine Invertierung. Logos/Icons (monochrom): --ce-logo-filter: none → invert(1). Shadows: Erhöhte Opacity (0.08 → 0.24 card, 0.16 → 0.36 hover). Layout: Keine invertierten Sektionen — --ce-surface-invert nur für Buttons und Tags. Formulare: bg → surface-muted, text → text-heading. Code-Blöcke: bg → surface-card.
Buttons im selben Kontext haben gleiche visuelle Hoehe
Regel
Alle Buttons in einer Zeile (Header, Card-Footer, Form-Actions) nutzen dieselbe Size-Variante. Wenn einer Default ist, sind alle Default. Kein Mix von Default und Compact im selben Kontext.
Default (~40px)
Font 15px/500, padding py-2.5 px-5, radius 8px. Fuer primaere Aktionen (Add to Cart, Submit).
Small (~32px)
Font 15px/500, padding py-1.5 px-3, radius 8px. Fuer Header- und Card-Aktionen.
Compact (~24px)
Font 12px/500, padding py-1 px-2.5, radius 6px. Fuer Inline-Aktionen und Tag-aehnliche Buttons.
Icons nur aus Remixicon, einheitliche Groessen pro Kontext
Bibliothek
Einzige Quelle: Remixicon (remixicon.com). Keine anderen Libraries, keine Emoji, keine eigenen SVG-Pfade. Default-Stil: line (nicht fill). Ausnahme: Social-Icons (Facebook = fill).
Groessen
14px: Inline Text, USP Bar Items. 16px: Buttons. 18px: Footer Social Icons. 24px: Mobile Navigation Hamburger/Close.
SVG
Immer viewBox="0 0 24 24" fill="currentColor". Farbe erbt vom Parent via currentColor.
Alle Abstaende folgen dem 4px Grid
Erlaubte Werte
xs=4, sm=8, md=12, base=16, lg=20, xl=24, 2xl=32, 3xl=48, 4xl=64. Keine anderen Werte — nie 5, 7, 10, 15, 18, 22, 30px.
Konsistenz-Regel
Innerhalb einer Komponente: konsistente Stufen. Nicht 8px Gap hier und 12px Gap daneben ohne Grund. Wenn gap-sm (8px), dann durchgehend — oder bewusst eine Stufe hoeher/niedriger.
Schatten erzeugen Tiefe und reagieren auf Hover
--ce-shadow-card
Light: 0px 8px 36px rgba(0,0,0,0.08). Dark: 0px 8px 36px rgba(0,0,0,0.24). Cards Default-Shadow.
--ce-shadow-card-hover
Light: 0px 8px 36px rgba(0,0,0,0.16). Dark: 0px 8px 36px rgba(0,0,0,0.36). Cards Hover-Shadow.
--ce-shadow-elevated
Light: 0px 0px 31px rgba(183,183,183,0.5). Dark: 0px 0px 31px rgba(0,0,0,0.4). Erhöhte Elemente.
Alle Animationen nutzen einheitliche Werte
Standard-Transition: 200ms. Alle interaktiven Elemente nutzen transition-colors oder transition-all. Keine abweichenden Timings ohne expliziten Grund.
Kontext-Zuordnung
Buttons, Links, Nav: transition-colors 200ms. Cards (Shadow): transition-shadow 200ms. Active Press: transform scale(0.98) 200ms. Sidebar Collapse: transition-transform 200ms.