
Die spannendsten Releases des Monats
Von epischen Rollenspielen bis zu gefeierten Indie-Perlen – diese Games solltet ihr auf dem Schirm haben.
Pixel Pakt · Frontend
Design-Token und Layout-Primitives aus Schritt 1 der Spec. Jede Komponente mit Live-Beispiel und Aufruf. Diese Seite ist selbst nur aus den Primitives und Token gebaut.
Die Wortmarke liegt als WebP unter shared/assets/logo, die Quelle als PNG unter docs/design (Git LFS). Vite hasht den Import. Die Logo-Primitive mit den Varianten full und mark (Spec §2.1) folgt, sobald eine SVG-Fassung existiert.
Transparenter Hintergrund. PAKT ist weiß gesetzt, die Marke funktioniert daher nur auf Ink (Header, Footer, Hero). Für helle Flächen fehlt noch eine Variante. Breite setzt der Elternteil.
import wordmark from '@/shared/assets/logo/pixelpakt-wordmark.webp'
<header className="bg-ink">
<img src={wordmark} alt="Pixel Pakt" className="w-full max-w-(--container-xs)" />
</header>drop-shadow folgt dem Alphakanal: nur die Würfel werfen Schatten, nicht die Bildbox. pixel-shadow ist ein harter Versatz in em, glow ein weicher Schein in der Akzentfarbe. Beide lassen sich kombinieren. Filter nicht animieren. Auf Paper konturiert der Versatz das weiße PAKT.
pixel-shadow-lg auf Paperpixel-shadow-lg auf Inkglowpixel-shadow glow-lg, data-accent=games<img src={wordmark} className="pixel-shadow" />
<img src={wordmark} className="glow" /> /* Akzent: brand oder data-accent */
<div data-accent="games"><img src={wordmark} className="pixel-shadow glow-lg" /></div>Die Marke als Komponente: Wortmarke als Bild, wo Platz ist, sonst die Textfassung in der Display-Font – Regenbogen auf „Pixel“, Weiß auf „Pakt“, Strays in derselben Farbe (Font-Feature ss03, strays-text). Nur auf dunklen Flächen.
Props: variant (auto = Bild ab md, Text darunter | image | text), size (sm | md | lg), to (Default /, null ohne Link).
autoPixel Pakttext smPixel Pakttext mdPixel Pakttext lgPixel Pakt<Brand /> /* auto: Fenster schmaler ziehen */
<Brand variant="image" size="md" />
<Brand variant="text" size="lg" to={null} />Alle Farben sind Token in app.css. Utilities: bg-*, text-*, border-*. Es gibt keine Standard-Tailwind-Palette und keine arbitrary values.
Zwei Stufen je Seite. Cards haben dieselbe Fläche wie die Seite und heben sich nur über den Rahmen ab; paper-muted ist für Chips, Panel-Innenflächen und Code. Auf Dunkel gibt es nur ink und die Rahmenfarbe.
paperpaper-mutedpaper-borderinkink-border<div className="bg-paper">…</div>
<span className="bg-paper-muted">Chip</span>
<header className="bg-ink text-fg-on-dark">…</header>Zwei Stufen je Seite: fg für Headlines, Namen und Links, fg-muted für Fließtext, Labels und Chips (6,0:1 auf Paper). Auf Dunkel fg-on-dark und fg-on-dark-muted (9,3:1 auf Ink) für Sublines, Footer-Links und Copyright.
fgfg-mutedfg-on-darkfg-on-dark-muted<h1 className="text-fg">Headline</h1>
<p className="text-fg-muted">Fließtext</p>
<footer className="bg-ink text-fg-on-dark-muted">…</footer>brand auf Paper erreicht nur ~4,2:1 – für kleinen Fließtext brand-text nehmen.
brandbrand-hotbrand-softbrand-text<span className="text-brand-text">Link</span>
<button className="bg-brand-hot text-fg-on-dark">Beitreten</button>Neon-Grün und Cyan nur als Fläche auf Dunkel oder als Icon-Füllung. Für Text auf Hell die *-text-Varianten.
newsnews-deepnews-textcommunitycommunity-deepcommunity-texteventsevents-deepevents-textgamesgames-deepgames-textevents-badge/* direkt – nur in Ausnahmen, sonst über data-accent (nächster Abschnitt) */
<span className="text-news-text">Releases</span>onlinesuccesslink-green<span className="size-2 bg-online" aria-hidden />data-accent am Elternteil setzt --accent, --accent-deep und --accent-text. Primitives nutzen nur bg-accent, text-accent-text, border-accent – und wissen nichts von Kategorien.
text-accent-text
text-accent-text
text-accent-text
text-accent-text
<article data-accent="news">
<span className="bg-accent px-2 text-ink">Badge</span>
<h3 className="text-accent-text">Titel</h3>
<button className="border-2 border-accent">→</button>
</article>Das Gegenstück für Flächen: data-surface=dark setzt Text (text-copy, text-copy-muted), Rahmen (border-rule, divide-rule), Fläche (bg-surface) und den lesbaren Akzent (text-accent-copy) um. Card setzt es bei tone=dark selbst; dunkle Sektionen bekommen es am Wrapper. Komponenten brauchen so kein tone-Prop.
text-copy auf Paper
text-copy-muted
text-copy auf Dark
text-copy-muted
<section className="bg-ink" data-surface="dark">
<h2 className="text-copy">Headline</h2>
<p className="text-copy-muted">Subline</p>
<hr className="border-rule" />
<div data-accent="games"><a className="text-accent-copy">Link</a></div>
</section>Default-Akzent ist Brand-Rot.
Brand als Fallback
<div className="border-2 border-accent">…</div>bg-grad-* für Flächen, text-grad-* für Headline-Zeilen. Gradient-Text bleibt echter Text; ohne background-clip-Support fällt er auf --accent zurück.
<button className="bg-grad-cta px-5 py-3 text-fg-on-dark">Jetzt Teil des Pakts werden</button>Spec: GAMES. in grad-warm, ONE PAKT. in grad-cool.
Different Games.
One Pakt.
<h1 className="font-display text-hero">
Different <span className="text-grad-warm">Games.</span>
<span className="text-grad-cool">One Pakt.</span>
</h1>font-display ist die eigene PixelPakt-Font: COLRv1, jede Zelle ein schattierter Pixel-Würfel, die Buchstaben nehmen die Textfarbe. Kleinbuchstaben nutzen die Großbuchstaben-Glyphen. font-body ist Inter mit System-Fallback. Die Root-Schriftgröße ist fluid, alles in rem skaliert mit.
Different Games.
Aktuelle News 0123456789
Community Hub · Spielwelten
<h1 className="font-display text-hero leading-tight">Different Games. One Pakt.</h1>OpenType-Feature der Font. ss01 (strays) reserviert Platz neben dem Wort, ss02 (strays-overhang) lässt die Pixel ohne Vorschub überhängen – in Boxen mit overflow: hidden braucht ss02 Padding. Am Textanfang und -ende sitzen mehr Pixel als an Leerzeichen.
ohneDifferent Games. One Pakt.
strays (ss01)Different Games. One Pakt.
strays-overhang (ss02)Different Games. One Pakt.
<h2 className="font-display text-3xl strays">Different Games.</h2>
<h2 className="font-display text-3xl strays-overhang">Different Games.</h2>Die Strays haben einen eigenen Paletteneintrag und lassen sich per font-palette getrennt von den Buchstaben färben. strays-accent folgt data-accent, Default ist Brand-Rot. Feste Paletten: strays-brand, -news, -community, -events, -games, -ink, -paper.
Brand als Default
news Strays
community Strays
events Strays
games Strays
<article data-accent="events">
<h3 className="font-display strays strays-accent">Pixel Pakt Night</h3>
</article>
<h3 className="font-display strays strays-games">…</h3>strays-text (ss03) und strays-text-overhang (ss04) malen die Strays in der Textfarbe statt aus der Palette. Damit folgen sie Gradient-Text und currentColor.
Pixel Pakt
One Pakt.
Grün mit grünen Strays
<span className="text-grad-logo strays-text">Pixel</span>
<span className="text-fg-on-dark strays-text">Pakt</span>
<p className="text-news strays-text">Grün mit grünen Strays</p>Buchstaben in Textfarbe, Strays in der Palette. Für einfarbige Strays strays-paper oder strays-ink.
Werde Teil des Pakts
Werde Teil des Pakts
Unsere Spielwelten
<div className="bg-ink text-fg-on-dark">
<h2 className="font-display strays strays-accent">Werde Teil des Pakts</h2>
<h2 className="font-display strays strays-paper">Werde Teil des Pakts</h2>
</div>Gradient-Text färbt nur die Buchstaben (die Font nutzt dafür die Textfarbe), die Strays behalten ihre Palette.
Different Games.
One Pakt.
<h1 className="font-display text-hero leading-tight strays strays-accent">
Different <span className="text-grad-warm">Games.</span>
</h1>Dieselben Utilities wie beim Logo. Der harte Versatz ist in em und wächst mit der Schrift, etwa eine Pixelzelle. Strays werfen mit.
Aktuelle News
Pixel Pakt Night
Neue Releases
<h2 className="font-display strays pixel-shadow">Aktuelle News</h2>
<div data-accent="events">
<h2 className="font-display strays strays-accent glow">Pixel Pakt Night</h2>
</div>font-display hat eine kompakte Zeilenbox, Strays der Nachbarzeile können sich berühren. font-display-strays nutzt die nativen Metriken der Font mit Platz für die Stray-Zone. Für mehrzeilige Headlines mit Strays die zweite Familie nehmen.
font-display (kompakt)Spiele
verbinden
Menschen
font-display-strays (native Zeilenbox)Spiele
verbinden
Menschen
<h2 className="font-display-strays text-3xl strays">
Spiele verbinden<br />Menschen
</h2>A–Z, Ziffern, Umlaute, ß und die Satzzeichen .,!?:;-+=/()_*. Kein Gedankenstrich, kein Halbgeviertstrich – die fallen auf die Systemschrift zurück. Satzzeichen sind kleiner skaliert und bekommen am Wortende keine eigenen Strays.
ABCDEFGHIJKLM NOPQRSTUVWXYZ
ÄÖÜß 0123456789
Hallo, Welt! (Pakt) 20:00 Uhr - Co-op?
lowercase wird zu uppercase
<p className="font-display">ÄÖÜß 0123456789 .,!?:;-+=/()</p>text-xs … text-3xl plus text-hero (clamp). Zeilenhöhen: leading-tight für Headlines, leading-body für Text.
text-xsPixel Pakt – Different Games, One Pakt.0.75remtext-smPixel Pakt – Different Games, One Pakt.0.875remtext-mdPixel Pakt – Different Games, One Pakt.1remtext-lgPixel Pakt – Different Games, One Pakt.1.125remtext-xlPixel Pakt – Different Games, One Pakt.1.5remtext-2xlPixel Pakt – Different Games, One Pakt.2remtext-3xlPixel Pakt – Different Games, One Pakt.2.75remeyebrowImmer up to date<p className="text-lg leading-body">…</p>
<p className="eyebrow text-brand">Immer up to date</p>Neun Stufen, alle in rem. Dazu gutter (fluid, 1–4rem) und touch (2.75rem = 44px Mindest-Touchziel). Komponenten setzen keine Außenabstände – der Elternteil verteilt über Stack, Cluster, Grid.
10.25rem20.5rem30.75rem41rem51.5rem62rem73rem84rem96remgutgutter · clamp(1rem, 4vw, 4rem)tchtouch · 2.75rem<div className="p-4 gap-5">…</div> /* 1rem padding, 1.5rem gap */
<main className="px-gutter">…</main>
<button className="min-h-touch">…</button>Mobile-first. Media Queries nur in Widgets und Pages für Spaltenlogik, Komponenten reagieren per Container Query (@xs … @2xl) auf ihre eigene Breite.
xs: ≥ 480pxsm: ≥ 768pxmd: ≥ 1024pxlg: ≥ 1440pxxl: ≥ 1920px2xl: ≥ 2560pxAktive Stufe: basexssmmdlgxl2xl
<div className="grid-cols-1 sm:grid-cols-2 md:grid-cols-3">…</div>
<div className="@container"><p className="@sm:text-lg">…</p></div>Zentrierter Seitenrahmen: volle Breite bis max-w-site (3072px), seitlicher Gutter fluid. Das einzige Primitive, das Seitenbreite kennt.
Props: as (section, main, …), className (Layout-Primitive dürfen className durchreichen).
<Container as="section" className="py-7">
…
</Container>Vertikaler Fluss mit einheitlichem Abstand. Ersetzt jede Form von margin-bottom.
Props: gap (1–9, Default 4), align (start | center | end | stretch), as.
gap={2}gap={4}gap={6}<Stack gap={3}>
<Box />
<Box />
<Box />
</Stack>align="start"align="center"align="end"<Stack gap={2} align="start">…</Stack>Horizontale Gruppe, die umbricht: Buttons, Chips, Meta-Zeilen, Navigation.
Props: gap (Default 3), align (Default center), justify (start | center | end | between), wrap (Default true), as.
<Cluster gap={2}>
<Chip>RPG</Chip><Chip>Co-op</Chip><Chip>Indie</Chip>
</Cluster>
<Cluster justify="between">
<Logo /> <Nav />
</Cluster>Spaltenraster mit Token-Gap. Feste Spalten je Breakpoint, oder auto-fill nach Mindestbreite – letzteres nur wo auch mehr Inhalt existiert (News-Übersicht, Server-Liste).
Mobile-first Objekt: base, xs, sm, md, lg, xl mit 1–6 Spalten.
<Grid cols={{ base: 1, sm: 2, md: 3 }} gap={5}>
<ArticleCard /> ×3
</Grid>So viele Spalten wie passen, jede mindestens min breit. Fenster schmaler ziehen.
<Grid min="12rem" gap={4}>
<ServerCard /> ×n
</Grid>Fläche mit Pixel-Ecken (quadratische Kerben, Größe --pixel-notch). Die Kerben leben nur hier. Zwei geclippte Ebenen: außen Rahmenfarbe, innen um --border-w eingerückt die Füllung.
Props: tone (paper | dark), padding (none | sm | md | lg), interactive, as. Kein className – Abstand setzt der Elternteil.
tone="paper"
News-Cards, Hub-Panels, Spotlight.
tone="dark"
Quick-Links, Spielwelten.
<Card>Paper</Card>
<Card tone="dark">Dark</Card>Bei Hover wird der Rahmen zum aktuellen Akzent. Nur unter (hover: hover).
news
Hover mich.
community
Hover mich.
events
Hover mich.
games
Hover mich.
<Grid cols={{ base: 2, md: 4 }}>
<div data-accent="news"><Card tone="dark" interactive>…</Card></div>
…
</Grid><Card padding="none"><CoverImage /></Card>
<Card padding="lg">…</Card>--pixel-notch ist in rem und skaliert mit der Root-Schrift. Hier lokal überschrieben, um die Wirkung zu zeigen.
0.25rem0.5rem1rem/* nur Demo – im Produkt bleibt der Token global */
<div style={{ '--pixel-notch': '1rem' }}><Card>…</Card></div>Trennlinie in der Rahmenfarbe der aktuellen Fläche.
Keine Props. Die Farbe folgt data-surface.
<Divider />
<section data-surface="dark" className="bg-ink"><Divider /></section>Eigene Pixel-Icons auf einem 16×16-Raster, als ein <path> in currentColor mit crispEdges gerendert – kein Sprite-File, keine Library. Neue Icons kommen als Rasterzeichnung in shared/ui/Icon/icons.ts dazu.
Props: name, size (em folgt der Schriftgröße, sm/md/lg = Token 4/5/6), label (macht das Icon zugänglich, sonst aria-hidden).
arrow-rightchevron-rightchevron-downplusclosemenusearchnewscommunityeventsgamescommentclockcrowntrophydiscordyoutubeinstagramtwitcharrow-leftchevron-leftchevron-upx<Icon name="arrow-right" /> /* 1em, dekorativ */
<Icon name="search" size="md" label="Suche" />Icons erben die Textfarbe. In Fließtext folgt size=em der Schrift.
smmdlgMehr erfahren
<p className="text-brand-text">Mehr <Icon name="arrow-right" /></p>Kleines Uppercase-Label mit Pixel-Marker über Sektionsüberschriften. Marker und Text folgen data-accent und data-surface, Default Brand.
Props: as (p | span | div). Auf Paper nutzt der Text die *-text-Stufe des Akzents, auf data-surface=dark den reinen Akzent.
Immer up to date
Gemeinsam mehr erleben
Von AAA bis Indie
Gaming · Community · Events · Für alle Spielwelten
<Eyebrow>Immer up to date</Eyebrow>
<div data-accent="events"><Eyebrow>Gemeinsam mehr erleben</Eyebrow></div>
<header className="bg-ink" data-surface="dark"><Eyebrow>Gaming · Community · Events</Eyebrow></header>Heading trennt semantische Ebene (as) von der Größe. xs und sm sind Body-Font für Card- und Panel-Titel, md bis hero Display-Font für Sektionen und Seiten. Text ist Fließtext. Beide nehmen die Textfarbe der Fläche.
Props: as (h1–h4, p, span), size (xs | sm | md | lg | hero), gradient (warm | cool), strays.
Different Games.
Aktuelle News
Community Hub
Die spannendsten Releases des Monats
Nächste Events
Games.
One Pakt.
Pixel Pakt Night
<Heading as="h2" size="lg" strays>Aktuelle News</Heading>
<Heading as="h1" size="hero">Different <span>Games.</span></Heading>
<Heading as="h3" size="sm">Die spannendsten Releases</Heading>Props: as (p | span | div), size (xs | sm | md | lg), tone (default | muted).
Pixel Pakt ist die Gaming-Community für alle, die Spiele lieben.
Unabhängig von Genre, Plattform oder Spielstil. Gemeinsam spielen, gemeinsam mehr erleben.
Aktuelle Entwicklungen, Releases und mehr.
28. Nov. 2024 · 64 Kommentare
Pixel Pakt ist die Gaming-Community für alle, die Spiele lieben.
Aktuelle Entwicklungen, Releases und mehr.
<Text>Pixel Pakt ist die Gaming-Community für alle.</Text>
<Text size="sm" tone="muted">Aktuelle Entwicklungen, Releases und mehr.</Text>Inline-Link im lesbaren Akzent mit Pfeil, für „Alle anzeigen“-Links in Sektions- und Panel-Headern.
Props: to und alles von Link, icon (Default arrow-right, null für keins).
<TextLink to="/news">Alle News anzeigen</TextLink>
<div data-accent="events"><TextLink to="/events">Alle Events</TextLink></div>
<TextLink to="/impressum" icon={null}>Impressum</TextLink>Button rendert <button>, ButtonLink einen React-Router-Link – beide teilen buttonStyles({ variant, size }). outline und ghost nehmen die Textfarbe des Kontexts, der Gradient-Hover ist ein Overlay mit opacity (Gradients lassen sich nicht animieren).
primary | accent | gradient | outline | ghost. accent folgt data-accent (Default Brand). Mindesthöhe 2.75rem auf Touch-Geräten.
<Button>Jetzt Teil des Pakts werden</Button>
<div data-accent="games"><Button variant="accent">Spielwelten</Button></div>
<ButtonLink to="/community" variant="gradient" trailingIcon="arrow-right">Jetzt beitreten</ButtonLink>
<Button variant="outline">Login</Button>
<Button variant="ghost" leadingIcon="search">Suche</Button>chipped schneidet unregelmäßige Bruchstellen in die Kante, in em – sie skalieren mit der Schriftgröße. Bei outline folgt der Rahmen der Bruchkante über zwei Ebenen; die Innenfläche nimmt die Farbe der Fläche aus data-surface.
<Button chipped>Jetzt Teil des Pakts werden</Button>
<ButtonLink to="/community" variant="gradient" chipped trailingIcon="arrow-right">Jetzt beitreten</ButtonLink>
<Button variant="outline" chipped>Login</Button>
<header className="bg-ink" data-surface="dark"><Button variant="outline" chipped>Mehr erfahren</Button></header><Button size="sm">Klein</Button>
<Button size="lg" trailingIcon="arrow-right">Groß</Button>
<Button disabled>Deaktiviert</Button>Quadrat in der Akzentfarbe mit Icon. Sitzt in Quick-Link-Cards und Panel-Headern, ist dekorativ – die Überschrift daneben trägt die Bedeutung.
Quadratischer Icon-Button in der Akzentfarbe, in jeder Card. ArrowButton rendert <button>, ArrowLink einen Link. label ist Pflicht, weil kein Text sichtbar ist.
Props: label, icon (Default arrow-right), size (sm = 2rem, auf Touch 2.75rem | md = 2.75rem), chipped. Hover: accent-deep.
<ArrowLink to="/news/release" label="Artikel lesen" />
<ArrowButton label="Schließen" icon="close" size="md" onClick={…} />Badge ist das gefüllte Kategorie-Label in der Akzentfarbe (RELEASES, COMMUNITY, EVENTS). Chip ist das kleine Outline-Tag (RPG, Co-op, Indie).
Keine Props außer children. Farbe über data-accent.
<div data-accent="news"><Badge>Releases</Badge></div><Cluster gap={2}><Chip>RPG</Chip><Chip>Co-op</Chip><Chip>Indie</Chip></Cluster>MetaItem ist Icon + Text für Meta-Zeilen (Datum, Uhrzeit, Kommentare), mehrere in einem Cluster. CountBadge ist Icon + Zahl mit unsichtbarer Einheit für Screenreader.
Props: icon, children.
<Cluster gap={4}>
<MetaItem icon="events">28. Nov. 2024</MetaItem>
<MetaItem icon="comment">64 Kommentare</MetaItem>
</Cluster>Props: count, icon (Default comment), label (Pflicht, Einheit für Screenreader).
<CountBadge count={24} label="Antworten" />Avatar ist quadratisch (Pixel-Stil, keine Rundung) mit Initialen-Fallback und optionaler Krone. DateBlock zeigt Tag groß und Monat klein in der Akzentfarbe.
Props: name, src, size (sm | md | lg), decoration (crown).

<Avatar name="Lunara" src={lunara} size="lg" decoration="crown" />
<Avatar name="Kael" size="sm" /> /* Initialen-Fallback */Props: date (Date | ISO-String). Rendert ein time-Element mit vollem Datum als Label.
<DateBlock date="2024-11-15T20:00:00+01:00" />Eine Kennzahl mit Label, optional mit Icon. box stapelt, row setzt alles in eine Zeile. Mehrere Stats in Grid, Stack oder Cluster.
Props: value, label, icon, layout (box | row).
<Grid cols={{ base: 2 }} gap={4}>
<Stat icon="community" value="2.437" label="Mitglieder insgesamt" />
</Grid>
<Stat layout="row" icon="events" value="3" label="Nächste Events" />Bildbox mit festem Seitenverhältnis, Lazy Loading, optionalem Fokuspunkt für den Beschnitt und einem Overlay-Slot mit dunklem Verlauf für Text. Die Mock-Cover sind generierte Pixel-Muster.
Props: src, alt, srcSet, sizes, ratio (16/9 | 4/3 | 3/2 | 1/1), focus, overlay, priority (LCP), children (Overlay).


Overlay-Titel
mit Verlauf

<CoverImage src={cover} alt="…" ratio="4/3" overlay>
<Badge>Releases</Badge>
</CoverImage>Eyebrow + Heading + Text + optionaler Link. Mit size=lg wird daraus der PageHeader jeder Unterseite (h1, hero). Akzent und Fläche kommen aus dem Kontext.
Props: eyebrow, title, text, link ({ to, label }), size (md | lg), as (h1 | h2), strays.
Immer up to date
Hier findest du die neuesten Inhalte aus der Pixel Pakt Community – Spiele-News, Community-Highlights, Event-Ankündigungen und vieles mehr.
Von AAA bis Indie
Egal ob kompetitiv, kooperativ oder entspannt – bei uns findest du immer die passende Spielwelt und Mitspieler.
Gemeinsam mehr erleben
Tausch dich aus, finde Mitspieler, nimm an Events teil.
<SectionHeader
eyebrow="Immer up to date"
title="Aktuelle News"
text="Hier findest du die neuesten Inhalte aus der Pixel Pakt Community."
link={{ to: '/news', label: 'Alle News anzeigen' }}
strays
/>News
Spiele-News, Community-Highlights, Event-Ankündigungen und vieles mehr.
<SectionHeader size="lg" eyebrow="News" title="Aktuelle News" text="Spiele-News, Community-Highlights, Event-Ankündigungen." strays />Card mit Header-Zeile aus IconTile, Titel und optionalem Link, darunter freier Inhalt. Die vier Hub-Boxen, später Sidebar-Boxen.
Props: icon, title, link, tone (paper | dark), as (section | div | aside), children.
<Panel icon="events" title="Nächste Events" link={{ to: '/events', label: 'Alle Events' }}>
<Stack as="ul" gap={0} className="divide-y divide-rule">
<ListRow … />
</Stack>
</Panel>Eine Zeile mit den Slots leading, body (title + subline) und trailing. Event-Zeilen, Forum-Themen und Server-Listen sind strukturell identisch. Trennlinien setzt die Liste über divide-y divide-rule.
Props: as (li | div), leading, title, subline, trailing.
<Stack as="ul" gap={0} className="divide-y divide-rule">
<ListRow leading={<Avatar />} title={<Link to="/t/1">Welches Spiel hat euch zuletzt…</Link>} subline="von Nekro · vor 2 Std." trailing={<CountBadge>24</CountBadge>} />
</Stack>Quick-Link-Card: IconTile, Titel, Text und Pfeil. Setzt ihren data-accent selbst. Die ganze Card ist ein Link (gestreckter Titel-Link), der Pfeil ist dekorativ.
Props: accent, icon, title, text, to, tone (Default dark).
<Grid cols={{ base: 1, xs: 2, md: 4 }} gap={4}>
<FeatureCard accent="news" icon="news" title="News" text="Aktuelle Entwicklungen, Releases und mehr." to="/news" />
…
</Grid>entities/article – Typ Article, Mapping Kategorie → data-accent (releases → news), ArticleCard und ArticleMeta. Daten aus mockArticles.
Props: article. Cover mit Badge, Titel als gestreckter Link, Teaser, Meta, Pfeil.

Von epischen Rollenspielen bis zu gefeierten Indie-Perlen – diese Games solltet ihr auf dem Schirm haben.

Wir haben für euch ausgewertet, welche Spiele unsere Community aktuell am meisten zockt – und warum.

Volle Server, starke Matches und eine großartige Community – das war die Pixel Pakt Night. Hier sind die besten Momente!
import { ArticleCard, mockArticles } from '@/entities/article'
<Grid cols={{ base: 1, sm: 2, md: 3 }} gap={5}>
{mockArticles.map(a => <ArticleCard key={a.id} article={a} />)}
</Grid>entities/event – Typ Event mit Plattform (Discord, Turnier, Ingame), EventRow aus ListRow + DateBlock, EventPlatform. Daten aus mockEvents.
import { EventRow, mockEvents } from '@/entities/event'
<Panel icon="events" title="Nächste Events" link={{ to: '/events', label: 'Alle Events' }}>
<Stack as="ul" gap={0} className="divide-y divide-rule">
{mockEvents.map(e => <EventRow key={e.id} event={e} />)}
</Stack>
</Panel>entities/thread – Typ Thread, ThreadRow aus ListRow + Avatar + CountBadge, relative Zeit über shared/lib. Daten aus mockThreads mit festem Bezugszeitpunkt, damit SSR und Client dasselbe rendern.
import { ThreadRow, mockThreads, mockNow } from '@/entities/thread'
<Panel icon="comment" title="Letzte Forum-Themen" link={{ to: '/community', label: 'Alle Themen' }}>
<Stack as="ul" gap={0} className="divide-y divide-rule">
{mockThreads.map(t => <ThreadRow key={t.id} thread={t} now={mockNow} />)}
</Stack>
</Panel>entities/game – Typ GameCategory mit eigenem Akzent, GameCategoryCard aus Card dark + CoverImage mit Overlay + Icon + Pfeil, Rahmen in der Akzentfarbe. Daten aus mockGameCategories.
import { GameCategoryCard, mockGameCategories } from '@/entities/game'
<Grid cols={{ base: 2, md: 5 }} gap={4}>
{mockGameCategories.map(c => <GameCategoryCard key={c.slug} category={c} />)}
</Grid>Kurzfassung aus CLAUDE.md und Spec §1.
text-[#…], p-[13px]), kein Hex außerhalb von app.css.className nur bei Layout-Primitives (Container, Stack, Cluster, Grid).data-variant. Slots statt Flags.data-accent, dunkle Flächen über data-surface="dark" am Elternteil. Primitives nutzen nur accent-*, copy, rule, surface.chipped bei Buttons. Keine rounded-*-Radien – es gibt keine.Name.css neben der Komponente.
SocialIcon & LinkList
SocialIcon ist der quadratische Icon-Link zu einem Netzwerk, öffnet in neuem Tab. LinkList ist Überschrift plus Linkliste für Footer-Spalten und Sidebars. Die Netzwerke und URLs kommen aus shared/config/site.
SocialIcon
Props: network (discord | youtube | instagram | x | twitch), href, label.
LinkList
Props: title, links ({ label, to, external? }).
Navigation
Rechtliches
Community