P2503 · Theme · SDC

SDC: Slider-Container & Slider-Item — Erweiterungen

DONE P2503-164 Erstellt: 2026-05-19

User Story

Als Site-Builder möchte ich den Slider-Container mit erweitertem Funktionsumfang (Infinite-Carousel, sichtbarer Cursor beim Hovern, Bleed-Effekt) nutzen können, damit ich Karussell-Sektionen nach Figma-Spec umsetzen kann, ohne am Quellcode des Themes zu arbeiten.

Betroffene SDCs

SDCVerzeichnisArt
byte_theme:slider-container components/slider-container/ Refactor — neue Props + JS-Erweiterungen
byte_theme:slider-item components/slider-item/ Referenz — unverändert, Canvas-Editor-Styles bereits vorhanden

Implementierte Features

1 — Infinite Carousel mit Mobile-Disable

Neuer Bool-Prop infinite auf slider-container. Wenn aktiv, wird das aktive Slide zentriert dargestellt, benachbarte Slides sind beidseitig sichtbar, Navigation wraps nahtlos. Auf Mobile (< 768 px) ist Infinite automatisch deaktiviert — der Slider verhält sich dort wie ein normaler Paged-Slider.

Technisch: JS trennt #infinite (Prop-Wert) von #infiniteActive (effektiver Wert nach Breakpoint-Check). Alle Methoden arbeiten ausschließlich mit #infiniteActive. Ein resize-Listener aktualisiert #infiniteActive bei Viewport-Änderungen.

2 — Cursor-Grab beim Hovern

Nutzer sehen beim Hovern über den Slider eine Hand-Cursor-Geste, die andeutet, dass der Slider per Drag/Maus bedienbar ist. Beim aktiven Drag wechselt der Cursor zu grabbing.

Technisch: cursor-grab [&_*]:cursor-grab (Descendant-Selektor nötig, da Kind-Elemente — z. B. Links in Cards — inherited cursor überschreiben). JS setzt data-grabbing am Container-Element statt inline-style, damit der CSS-Selektor [.slider-container[data-grabbing]_&]:cursor-grabbing greift. Im Canvas-Editor ist der Grab-Cursor deaktiviert.

3 — Bleed-Prop (Kartenüberlauf)

Neuer Enum-Prop bleed (none | sm). Bei sm werden die äußeren Kanten der sichtbaren Slides um 15 px abgeschnitten — links und rechts — was den Effekt „da ist noch mehr" erzeugt, ohne benachbarte Slides vollständig zu zeigen (anders als peek). Wird von infinite und peek ignoriert, wenn diese aktiv sind.

Technisch: #activeBleed()-Methode im JS; Korrektur des initialen translateX um den Bleed-Betrag (sonst liegt das erste Slide bündig an der Viewport-Kante — kein linker Clip).

Props-Schema (Änderungen / Ergänzungen)

PropTypDefaultEnum-WerteNeu?
infinitebooleanfalseNeu
bleedstringnonenone, smNeu
peekstringnonenone, sm, md, lgvorhanden
loopbooleantruevorhanden
slides_per_viewnumber31, 2, 3, 4vorhanden
autoplaybooleanfalsevorhanden
autoplay_intervalnumber40002000–8000vorhanden

Akzeptanzkriterien

  1. Der Prop infinite: true zentriert das aktive Slide mit beidseitig sichtbaren Nachbar-Slides; Navigation wraps endlos.
  2. Auf Viewports < 768 px ist Infinite automatisch deaktiviert — der Slider zeigt data-infinite="false" im DOM, unabhängig vom gesetzten Prop.
  3. Beim Hovern über einen Slider-Slide erscheint der Hand-Cursor (cursor: grab) — auch auf Kind-Elementen wie Links oder Bilder.
  4. Während des Drag-Vorgangs wechselt der Cursor zu cursor: grabbing.
  5. Der Prop bleed: sm schneidet die äußeren Kanten der sichtbaren Slides links und rechts sichtbar ab (~15 px).
  6. Alle 7 bestehenden Kernel-Tests für slider-container und slider-item sind grün.
  7. Canvas-Editor-Kompatibilität: Im Canvas-Editor (data-canvas-editor) ist kein Grab-Cursor, keine Transform-Animation und kein Overflow-Clip aktiv.

QA-Plan

AK 1 — Infinite-Modus Desktop

Slider-Container mit infinite: true auf einer Canvas-Seite einfügen (mindestens 5 Slides). Im Browser (Desktop ≥ 768 px): aktives Slide ist zentriert, linker und rechter Nachbar-Slide sind sichtbar. Pfeile navigieren endlos (kein Disable am letzten Slide).

AK 2 — Infinite-Disable Mobile

Viewport auf 375 px verkleinern (DevTools): data-infinite-Attribut im DOM ist "false", Slider verhält sich wie Paged-Slider.
Kernel-Test testSliderContainerInfiniteDataAttribute grün: ddev exec ./vendor/bin/phpunit --group slider.

AK 3 & 4 — Cursor-Grab

Maus über Slide-Fläche hovern: Cursor ist Hand (grab). Über ein Kind-Element (Link, Bild) hovern: Cursor ist ebenfalls Hand.
Klicken und Maus gedrückt halten: Cursor wechselt zu grabbing.

AK 5 — Bleed

Slider mit slides_per_view: 2, bleed: sm auf einer Seite einfügen. Im Browser: erster und letzter sichtbare Slide sind links/rechts sichtbar abgeschnitten (~15 px). Erster Slide hat sichtbaren Clip an der linken Kante (kein bündiges Anlegen am Viewport).

AK 6 — Kernel-Tests

ddev exec ./vendor/bin/phpunit --group slider → 7 Tests, 0 Failures.

AK 7 — Canvas-Editor

Slider-Container im Canvas-Editor öffnen: kein Grab-Cursor, Slides untereinander (kein horizontales Flex), kein Overflow-Clip, Slides haben gestrichelte Drag-and-Drop-Border.