Commit Graph
226 Commits
Author SHA1 Message Date
qcigano ab3a5da892 Sicherheits-, Stabilitaets- und Domainkorrekturen nach vollstaendiger Pruefung
Build & Deploy / deploy (push) Waiting to run
- Absturzsicherheit: Express 4 faengt Fehler aus async-Handlern nicht ab, eine
  einzige fehlerhafte Anfrage konnte den ganzen Shop beenden - besonders heikel
  bei capture-order, wo das direkt nach der PayPal-Abbuchung passieren wuerde.
  Neu: lib/async-wrap.js um alle Handler, zentraler Fehler-Handler in index.js,
  .catch(next) in der Zugangsschranke, unhandledRejection/uncaughtException-Netz.
- Fehlerhaftes JSON lieferte bisher Express' HTML-Fehlerseite mit komplettem
  Stacktrace und Serverpfaden (weil NODE_ENV nicht gesetzt war). Jetzt saubere
  JSON-Antwort, NODE_ENV=production in .env.example ergaenzt.
- Sicherheits-Header und x-powered-by wie bei der DogFather-Seite.
- Falsche Domain .de statt .com korrigiert: astro.config.mjs (betraf alle
  Canonical-URLs und die komplette Sitemap), robots.txt, Layout.astro sowie den
  Verwaltungs-Link in jeder Bestellbenachrichtigung (war ein toter Link).
- Fehlende Uebersetzung nav.cart in EN/CH/FR ergaenzt: das Warenkorb-Symbol hatte
  in drei von vier Sprachen keinen Namen fuer Screenreader.
2026-08-05 22:33:49 +02:00
qcigano 654f4455cc Zugangs-Sperre: Code wird nach dem Schliessen des Browsers wieder gefragt
Build & Deploy / deploy (push) Waiting to run
Sitzungs-Cookie ohne maxAge/expires statt 90-Tage-Cookie (auch fuer die
zweite Verwaltungs-Schranke); zusaetzlich Notbremse von 12 Stunden im
signierten Token, falls ein Browser sehr lange offen bleibt.
Kundenkonten (customer-auth.js, 30 Tage) bleiben bewusst unveraendert.
2026-08-05 20:00:34 +02:00
qcigano c9e4b0cdbb Fix: dotenv-Paket ergaenzen, Node-Mindestversion auf 20 gesenkt
Build & Deploy / deploy (push) Waiting to run
2026-08-05 16:36:32 +02:00
qcigano b8b8ec7b7a Node.js/Express-Server als Ersatz für Cloudflare Pages Functions + D1 (läuft auf eigenem Server statt Cloudflare)
Build & Deploy / deploy (push) Waiting to run
2026-08-05 15:06:17 +02:00
qciganoandClaude Sonnet 5 53e7bb158a Fix: Produktanzahl auf Unterkategorie-Seiten jetzt direkt über der ersten
Produktkarte statt direkt unter dem Banner

Auf den anderen Seitentypen (Kategorie, Sale) stand die Zahl schon immer direkt
über dem Produkt-Grid. Auf den Unterkategorie-Seiten (Charakter-Familien wie
Glasperlenarmbänder, Kuh, Wal, ...) saß sie dagegen in einem eigenen Container
direkt unter dem Banner-Bild, mit teils viel Abstand zur ersten echten Karte
(z.B. wenn vorher noch eine Charakter-Story-Box kommt). Jetzt wird sie direkt
in der Sektion angezeigt, die auch wirklich die erste Produktkarte enthält —
in allen 4 Sprachen (de/en/fr/ch).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-04 20:26:48 +02:00
qcigano a92a8e9666 Fix: Artikel-Anzahl auf Unterkategorie-Seiten stand über statt unter dem großen Bild
Auf den drei anderen Seitentypen (Kategorie, Sale) stand die Anzahl bereits korrekt unter dem
Banner — nur auf den Unterkategorie-Seiten (z.B. /shop/modeschmuck-accessoires/
glasperlenarmbaender/) landete sie versehentlich VOR dem Bannerbild, direkt nach der Breadcrumb.
Jetzt hinter das Banner verschoben, in allen 4 Sprachen.
2026-08-04 20:00:31 +02:00
qcigano bac6ae3090 Merge branch 'main' of https://github.com/vans-diy-bastelbedarf/website 2026-08-04 19:36:47 +02:00
qcigano aa8631f95f Artikel-Anzahl jetzt auf wirklich jeder Produktlisten-Seite sichtbar (Kategorie/Unterkategorie/Sale)
Bisher zeigte nur /shop/ (die Hauptübersicht) an, wie viele Produkte gerade zu sehen sind. Auf
ausdrücklichen Wunsch jetzt auch auf: Kategorie-Seiten, Unterkategorie-Seiten (Gesamtzahl aus
Charakter-Karten + "weitere Modelle", ohne reine Platzhalterkarten) und der Sale-Seite — jeweils
in allen 4 Sprachen. Server-seitig fest berechnet (kein Filter-JS wie im Haupt-Shop nötig, da
diese Seiten keine Live-Filterung haben), gleiche Optik/Wortlaut wie im Shop-Filter
(t.shop.resultCount), neue gemeinsame CSS-Klasse .result-count-static für den Abstand vor dem
Grid. Nur sichtbar, wenn tatsächlich Produkte da sind (bei leeren Kategorien bleibt der bisherige
Hinweistext ohne zusätzliche "0 Produkte"-Zeile).

Per Build + Browsertest über alle drei Seitentypen verifiziert.
2026-08-04 19:36:00 +02:00
vansdiyundbastelbedarfandGitHub 075ac1b1a2 Create Produkt “schluesselanhaenger-glas-note-gold” +3 2026-08-04 19:15:56 +02:00
vansdiyundbastelbedarfandGitHub 5b458165fe Create Produkt “glasperlenarmband-klein-set” +1 2026-08-04 18:45:41 +02:00
vansdiyundbastelbedarfandGitHub b52a49df17 Update Produkt “glasperlenarmband-lila-accessoires” +1 2026-08-04 18:40:08 +02:00
vansdiyundbastelbedarfandGitHub e628dba24b Update Produkt “glasperlenarmband-lila-stern” 2026-08-04 18:37:35 +02:00
vansdiyundbastelbedarfandGitHub 115b6eaab8 Update Produkt “glasperlenarmband-lila-rechteck” 2026-08-04 18:37:21 +02:00
vansdiyundbastelbedarfandGitHub 8ce5a70a4a Update Produkt “glasperlenarmband-gelb-drache” 2026-08-04 18:36:56 +02:00
vansdiyundbastelbedarfandGitHub 4a6ac4821e Update Produkt “glasperlenarmband-blau-blume” 2026-08-04 18:36:22 +02:00
vansdiyundbastelbedarfandGitHub 4cd50f3c0a Create Produkt “glasperlenarmband-lila-accessoires” +1 2026-08-04 18:35:19 +02:00
vansdiyundbastelbedarfandGitHub 3f3f092efe Update Produkt “glasperlenarmband-blau-rund” 2026-08-04 18:31:17 +02:00
vansdiyundbastelbedarfandGitHub 796e4e5ab5 Create Produkt “glasperlenarmband-lila-kugel” +1 2026-08-04 18:30:19 +02:00
vansdiyundbastelbedarfandGitHub 771e207f4e Create Produkt “glasperlenarmband-blau-rund” +2 2026-08-04 18:27:02 +02:00
vansdiyundbastelbedarfandGitHub 4875b58c47 Create Produkt “glasperlenarmband-blau-weiß-krone” +2 2026-08-04 18:15:36 +02:00
vansdiyundbastelbedarfandGitHub cfe5975e3a Create Produkt “glasperlenarmband-lila-blume” +2 2026-08-04 18:06:00 +02:00
vansdiyundbastelbedarfandGitHub 908364f18d Create Produkt “glasperlenarmband-hellblau-kugel” +1 2026-08-04 17:54:20 +02:00
vansdiyundbastelbedarfandGitHub cb6797998e Create Produkt “glasperlenarmband-lila-rechteck” +2 2026-08-04 17:48:07 +02:00
vansdiyundbastelbedarfandGitHub ef761441c6 Create Produkt “glasperlenarmband-weiß-raute” +2 2026-08-04 17:44:30 +02:00
vansdiyundbastelbedarfandGitHub 5c3f4cad8b Update Kategorie “modeschmuck-accessoires” 2026-08-04 17:31:36 +02:00
qcigano f56621ac77 Zugangsseite: Gold durch kräftiges Lila ersetzt (Badge, Kopf-Kiste, VanVan-Fenster)
Neue Farbvariablen --c-lila/--c-lila-hover (sattes, kräftiges Violett) ersetzen das bisherige
Gold/Gelb überall dort, wo es verwendet wurde: "Noch nicht öffentlich"-Badge, Verlaufsrand der
Kopf-Kiste, sowie komplett das VanVan-Fenster (Rand, Avatar-Glow, Name, Eingabefeld-Fokus,
Button). Gelbes Herz-Emoji im VanVan-Button ebenfalls zu einem violetten Herz gewechselt, damit
nichts mehr gold/gelb übrig bleibt. Dogis Cyan-Fenster bleibt unverändert.

Per Build + Browsertest verifiziert: neue Farbe korrekt angezeigt, Login-Funktion unverändert.
2026-08-04 17:25:56 +02:00
qcigano 8d0d6702da Zugangsseite: VanVan-Fenster nach links, Dogi-Fenster nach rechts getauscht 2026-08-04 17:07:28 +02:00
qcigano 3c1e0775c9 Zugangsseite: Kopfbereich in eigener "speziellen" Kiste + echter Zentrierungs-Bug behoben
Gemeldeter Bug: Bei kleineren Fensterhöhen (z.B. Laptop mit wenig Höhe, manche Handy-Größen) hat
"overflow: hidden" auf <body> zusammen mit der vertikal zentrierten Flexbox den oberen Teil des
Inhalts (Badge/Überschrift) und/oder die unteren Fenster einfach abgeschnitten, OHNE dass man
dorthin scrollen konnte — der Inhalt war schlicht nicht mehr erreichbar. Behoben:
- "align-items: safe center" statt nur "center" — zentriert normal, springt aber auf
  Start-Ausrichtung um, sobald der Inhalt höher als der sichtbare Bereich ist.
- overflow-y: auto statt hidden — falls "safe center" von einem Browser nicht unterstützt wird,
  kann trotzdem ganz normal zu den restlichen Fenstern heruntergescrollt werden.
- Logo-Wasserzeichen von position:absolute auf position:fixed umgestellt, damit es IMMER exakt in
  der Mitte des sichtbaren Fensters bleibt, unabhängig von der tatsächlichen Seitenhöhe.

Zusätzlich auf ausdrücklichen Wunsch: der Kopfbereich (Badge + Überschrift + Text) sitzt jetzt in
einer eigenen "speziellen" Kiste im selben Stil wie die beiden Personen-Fenster darunter
(wandernder Verlaufsrand aus allen drei Markenfarben + Glanz-Sweep) statt als loser Text über den
Kisten zu schweben — liest sich jetzt sichtbar als gemeinsames "Dach" über beiden Fenstern.

Per Browsertest über mehrere Fenstergrößen (inkl. absichtlich sehr niedriger Höhe) verifiziert:
Inhalt vollständig erreichbar/scrollbar, Login-Funktion beider Fenster weiterhin unverändert.
2026-08-04 16:47:31 +02:00
qcigano cebb59d910 Zugangsseite: echte Fotos für Dogi + VanVan, "Dogi" statt "qciga", Herz statt Schlüssel
- qciga-Fenster zeigt jetzt Dogi (Name + echtes Foto) statt Icon-Platzhalter — Rolle/Code-Prüfung
  im Hintergrund bleibt unverändert "qciga" (nur die Anzeige wurde umbenannt).
- VanVan-Fenster bekommt ein neues, eigenes Foto für die Zugangsseite.
- Beide Quellfotos (~1,8 MB PNG) auf 400×400 zugeschnitten (gesichtsfokussiert) und als WebP
  komprimiert (7–14 KB) — eigene Dateien nur für diese Seite, NICHT die sitehweit verwendete
  öffentliche vanvan-portrait.png ersetzt oder angetastet.
- Schlüssel-Emoji im Dogi-Button durch 🩵 (Baby-Blau-Herz) ersetzt, passend zur Cyan-Akzentfarbe
  seines Fensters.
- functions/_middleware.js: alte Freigabe von /img/vanvan-portrait.png entfernt, stattdessen
  gezielt nur die zwei neuen Avatar-Dateien freigegeben (kein Shop-/Kundendatum).

Per Build + wrangler pages dev + Browsertest verifiziert: beide Avatare laden korrekt (200),
alte Foto-Freigabe korrekt entfernt (wieder 302), Layout/Funktion unverändert intakt.
2026-08-04 16:37:46 +02:00
qcigano c6f8465e64 Zugangsseite: zwei eigene Fenster für qciga und VanVan statt einer gemeinsamen Box
Auf ausdrücklichen Wunsch im Stil einer bereits bestehenden Zwei-Personen-Zugangsseite umgebaut,
aber komplett an Van's eigene Marke angepasst (Farben/Schrift/Wasserzeichen unverändert: Lila/
Anthrazit/Hellblau/Gold statt fremder Projektfarben). Jede Person bekommt ihr eigenes Fenster mit
Avatar (VanVan: ihr echtes Porträtfoto; qciga: passendes Icon, da noch kein Foto in diesem Projekt
hinterlegt ist), eigenem Codefeld und eigenem "Öffnen"-Button in unterschiedlicher Akzentfarbe
(Cyan/Violett für qciga, Gold/Violett für VanVan). Technisch unverändert: /gate-auth erkennt die
Rolle weiterhin selbst anhand des eingegebenen Codes, unabhängig vom benutzten Fenster.

Dabei gefundener und behobener Bug: /img/vanvan-portrait.png wurde von der Zugangs-Schranke selbst
blockiert (302) — das für den Avatar gebrauchte Foto zeigte deshalb nur einen leeren Kreis. Gezielt
nur diese eine Datei freigegeben (kein Shop-/Kundendatum, ohnehin VanVans öffentliches Porträtfoto).

Per echtem Browsertest verifiziert: beide Fenster funktional getrennt (falscher Code im einen
Fenster zeigt den Fehler nur dort, richtiger Code im anderen Fenster loggt korrekt ein), Layout auf
Desktop nebeneinander und auf schmalen Bildschirmen sauber gestapelt.
2026-08-04 16:28:05 +02:00
qcigano 2efba64d4f Shop-Filter: echte, automatisch berechnete Bestseller (Top 6) anzeigbar
Neues Kästchen "🔥 Nur Bestseller (Top 6)" im Shop-Filter (alle 4 Sprachen) — zeigt beim Anhaken
genau die 6 Produkte mit den meisten echten Verkäufen. Keine manuelle Pflege nötig: neuer
öffentlicher Endpunkt GET /api/bestseller berechnet die Rangliste live per SQL-Aggregation aus
den echten Bestelldaten (order_items JOIN orders, GROUP BY Produkt-Slug, SUM der Menge), NICHT
die manuell im Admin-Bereich setzbare "Bestseller"-Auszeichnung.

Zählweise: stornierte und noch nicht bezahlte (zahlungOffen) Bestellungen zählen nicht mit (sonst
würden Fehlbestellungen/nie eingegangene Zahlungen die Rangliste verfälschen), ebenso wenig
kostenlose Positionen wie der Abo-Teddy (kein echtes Kaufinteresse). Liefert ausschließlich
Produkt-Slugs zurück, keinerlei Bestell-/Kundendaten — bleiben weiterhin nur in /api/verwaltung/*.

Verifiziert: SQL-Aggregation mit Testdaten geprüft (korrekte Rangfolge, korrekter Ausschluss von
storniert/zahlungOffen/gratis, LIMIT 6 exakt). Frontend-Verdrahtung (Checkbox -> fetch -> Filter)
per echtem Browsertest mit vorgetäuschter API-Antwort bestätigt (checken zeigt genau die
vorgegebenen Produkte, abwählen zeigt wieder alle).
2026-08-04 16:05:57 +02:00
qcigano 99ddd43519 Verwaltung: eigens gestalteter Abmelde-Button rechts über der Hero-Kiste
Neuer Endpunkt POST /gate-logout (functions/_middleware.js) löscht alle drei Zugangs-Cookies auf
einmal (normale 90-Tage-Sitzung, Rollen-Anzeige, tägliche Verwaltungs-Sitzung) — "abmelden"
bedeutet also wirklich abmelden von allem, nicht nur einen Teil der Schranke offen lassen. Button
im selben "besonderen" Look wie die Hero-Kiste darunter (wandernder Verlaufsrand in den drei
Markenfarben + Funkeln) statt eines schlichten Standard-Buttons.

Per curl (Cookie-Löschung + anschließende 302-Sperre auf /verwaltung/ und /) und per echtem
Browser-Klicktest (Playwright) end-to-end verifiziert.
2026-08-04 15:49:00 +02:00
qcigano ea9a2954d0 Fix: /sw.js + /manifest.webmanifest wurden von der Zugangs-Schranke blockiert
Live per Browsertest gefunden: Auf /admin/ (das die Haupt-Schranke bewusst umgeht) versucht ein
eigenes Skript, den Service Worker unter /sw.js zu registrieren (für die "Installieren"-Funktion) —
das schlug mit einem echten Browserfehler fehl ("script resource is behind a redirect"), weil
/sw.js und /manifest.webmanifest bisher nicht auf der Liste öffentlich erreichbarer Dateien standen
und deshalb selbst einen 302 auf die Zugangscode-Seite bekamen. Betrifft jeden Aufruf von /admin/
ohne aktive Haupt-Gate-Sitzung (z.B. direkt per Lesezeichen). Beide Dateien enthalten keinerlei
Shop-/Kundendaten (reines Caching-Skript bzw. App-Metadaten), Freigabe also unbedenklich — vor der
Änderung geprüft, dass wirklich nichts Sensibles drin steht.
2026-08-04 15:30:10 +02:00
qcigano 27438426d9 Fix: *.pages.dev-Vorschau-Adresse bleibt für immer gesperrt, unabhängig von SITE_PUBLIC
Bisher hätte SITE_PUBLIC=true (gedacht für den Go-Live der eigenen Domain) versehentlich auch die
interne *.pages.dev-Werkstatt-Adresse für jede/n im Internet geöffnet, weil die Middleware nur den
Pfad, nie den aufgerufenen Hostnamen geprüft hat. Jetzt hart anhand des Hostnamens geprüft: nur ein
Hostname außerhalb von *.pages.dev darf durch SITE_PUBLIC öffentlich werden. Per wrangler pages dev
mit Host-Header-Overrides verifiziert (pages.dev -> weiterhin 302 Gate-Redirect, andere Domain -> 200).

Nebenbei: totes, seit 04.08.2026 ungenutztes Secret VERWALTUNG_ACCESS_CODE live + lokal entfernt
(Code prüft seitdem denselben Zugangscode wie der normale Seitenzugang), sowie zwei veraltete
Kommentare bereinigt, die noch auf die längst entfernte Seite /demo-abo/ verwiesen.
2026-08-04 15:19:56 +02:00
qcigano 6fae5a0694 Fix: Shop-Filter-Dropdowns (Kategorie/Mindestbewertung) reagierten nach Client-Router-Navigation nicht mehr
Beide <script>-Blöcke am Ende von shop/index.astro (+en/ch/fr) liefen bisher direkt beim Parsen,
statt wie in Layout.astro etabliert in "astro:page-load" gekapselt zu sein. Da <ClientRouter
fallback="swap" /> Inline-Skripte bei einem clientseitigen Seitenwechsel nicht erneut ausführt,
wurden die Klick-Listener der beiden eigenen Dropdowns nie angehängt, wenn man per Link (statt
Direktaufruf) auf /shop/ navigiert ist — Preis-Regler/Checkbox blieben unbemerkt funktionsfähig,
weil das natives Browser-Verhalten ohne JS ist.
2026-08-04 14:55:24 +02:00
qciganoandClaude Sonnet 5 f4329da1c1 Verwaltungsseite: 6 kleine verteilte Hintergrund-Logos statt 2 große + Custom-Scrollbar im Shop-Filter
Auf ausdrücklichen Wunsch: das rotierende Logo-Wasserzeichen im Hintergrund der Verwaltungs-
Hauptseite wirkte als EIN großer zentraler Fleck (zwei große, zentrierte Ebenen). Jetzt sechs
kleinere Logos (150-260px statt 950-1500px), über den ganzen Viewport verteilt (obere/mittlere/
untere Zeile, je links und rechts), weiterhin gegenläufig rotierend, jetzt zusätzlich mit einer
dritten Markenfarbe (Cyan) neben Gold/Violett für mehr Abwechslung. Reine Markup-/CSS-Änderung.

Zusätzlich: die Standard-Browser-Scrollbar im Kategorie-Dropdown des Shop-Filters (schwarz-weiß,
wirkte fremd im dunklen Design) durch eine gestylte, schlanke, markenfarbene Verlaufs-Scrollbar
ersetzt (Firefox über scrollbar-color/-width, Chrome/Edge/Safari über ::-webkit-scrollbar).

Lokal mit wrangler pages dev getestet (beide Änderungen im ausgelieferten CSS bestätigt).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-04 14:49:55 +02:00
qciganoandClaude Sonnet 5 90dfca2d4f Produktseiten: Zurück-Button oben, springt zur echten vorherigen Seite (alle 4 Sprachen)
Auf ausdrücklichen Wunsch: oben auf jeder Produktseite jetzt ein "← Zurück"-Button vor dem
Breadcrumb. Nutzt den Browser-Verlauf (history.back()) statt fest zur Kategorieseite zu
springen — landet man z.B. von der Startseite, einer Suche oder "Das könnte dir gefallen" auf
einer Produktseite, kommt man genau dahin zurück. Fällt sauber auf einen normalen Link zur
Kategorieseite zurück, wenn kein echter vorheriger Seitenaufruf im Verlauf existiert (Direkt-
aufruf, neuer Tab, Suchmaschine). In allen 4 Sprachversionen (de/en/ch/fr) umgesetzt.

Nebenbei behoben: t.common.skipToContent (Skip-Link aus der BFSG-Barrierefreiheits-Arbeit vom
04.08.) war nur für "de" gepflegt und dadurch auf den en/ch/fr-Seiten leer — jetzt für alle
4 Sprachen ergänzt (gleicher Commit, da hier ohnehin dieselbe common-Sektion bearbeitet wurde).

Lokal mit wrangler pages dev end-to-end getestet (Login, echtes Produkt, Button + Skript im
gerenderten HTML bestätigt).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-04 14:22:20 +02:00
qciganoandClaude Sonnet 5 e37d12b4c7 Verwaltungs-Hauptseite ultra-speziell für VanVan: Begrüßung, Sparkline, Konfetti, Stepper, Logo-Hintergrund
Auf ausdrücklichen Wunsch NUR die Haupt-Bestellverwaltungsseite (nicht die Zugangscode-Seite,
nicht deren Formular-Logik) grundlegend aufgewertet:

- Rollenbasierte, tageszeitabhängige Begrüßung ("Guten Morgen, VanVan!") aus dem vorhandenen
  Vorschau-Rollen-Cookie
- Van's-Logo als großes, fix positioniertes, warm eingefärbtes Wasserzeichen im gesamten
  Seitenhintergrund (zwei gegenläufig rotierende Ebenen, derselbe CSS-Trick wie auf der
  Zugangscode-Seite, aber eigenständig für diese scrollbare Seite nachgebaut)
- Handgebaute SVG-Sparkline (Umsatztrend der letzten 14 Tage) + Wochenvergleich-Badge
- Sanft hochzählende Kennzahlen-Kacheln statt abruptem Zahlensprung
- Sichtbarer Status-Fortschrittsbalken pro Bestellkarte + Ein-Klick-"nächster Schritt"-Knopf
  neben dem bisherigen Dropdown
- Konfetti + Erfolgs-Banner bei runden Bestell-Meilensteinen (10er/25er/50er-Schritte)
- Tab-Titel zeigt die Anzahl offener Bestellungen, auch wenn der Tab im Hintergrund ist
- Optionaler Ton (Web-Audio-Glöckchen, keine Audio-Datei) und Desktop-Benachrichtigungen bei
  neuen Bestellungen, beides einzeln togglebar und in localStorage gemerkt

Alles handgebaut ohne externe Bibliotheken/Kosten, respektiert prefers-reduced-motion. Lokal mit
wrangler pages dev + echter D1-Bindung end-to-end getestet (Login, Bestell-API, Status-PATCH,
alle neuen UI-Elemente im Seiten-HTML verifiziert).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-04 14:15:09 +02:00
qciganoandClaude Sonnet 5 aeb76a277d Fix: Klick auf Bildwechsel-Pfeil der Produktkarte öffnete ungewollt die Produktseite
Bug: bei Produkten mit mehreren Fotos (z.B. Armbändern) sprang ein Klick auf den ‹/›-Pfeil
zum Bildwechsel kurz zum nächsten Foto und öffnete dann trotzdem sofort die volle
Produktseite. Ursache: Astros <ClientRouter /> (View-Transitions, siehe Layout.astro) fängt
Klicks auf <a>-Links über einen eigenen, früher registrierten document-Klick-Listener in der
Bubble-Phase ab und startet die Navigation, BEVOR der Karussell-Klick-Handler von ProductCard
(der ebenfalls in der Bubble-Phase lief) preventDefault()/stopPropagation() aufrufen konnte.

Fix: Karussell-Klick-Handler läuft jetzt in der Capture-Phase (wie schon beim benachbarten
Wisch-Sperr-Handler etwas weiter unten in derselben Datei) — läuft dadurch garantiert vor
ClientRouters eigenem Listener und verhindert die Navigation zuverlässig, bevor sie startet.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-04 13:55:10 +02:00
vansdiyundbastelbedarfandGitHub d9e59ab585 Delete Produkt “makramee-ohrringe” 2026-08-04 13:52:30 +02:00
vansdiyundbastelbedarfandGitHub 990416a3fc Create Produkt “glasperlenarmband-blau-blume” +2 2026-08-04 13:45:06 +02:00
vansdiyundbastelbedarfandGitHub ddaf683bd0 Update Produkt “glasperlenarmband-gelb-drache” +1 2026-08-04 13:39:43 +02:00
vansdiyundbastelbedarfandGitHub de1816b6fe Create Produkt “glasperlenarmband-gelb-drache” +2 2026-08-04 13:35:04 +02:00
vansdiyundbastelbedarfandGitHub 6ce8447703 Update Produkt “glasperlenarmband-lila-stern” 2026-08-04 13:27:50 +02:00
vansdiyundbastelbedarfandGitHub f69aac1e66 Update Produkt “perlen-armband-hellblau” 2026-08-04 13:27:04 +02:00
vansdiyundbastelbedarfandGitHub 3911865a0a Update Produkt “glasperlenarmband-lila-stern” +1 2026-08-04 13:25:16 +02:00
vansdiyundbastelbedarfandGitHub 628699b87e Update Produkt “perlen-armband-hellblau” 2026-08-04 13:22:01 +02:00
vansdiyundbastelbedarfandGitHub f9761e475b Create Produkt “glasperlenarmband-lila-stern” +2 2026-08-04 13:20:30 +02:00
vansdiyundbastelbedarfandGitHub 0eb5987f13 Update Produkt “perlen-armband-hellblau” 2026-08-04 13:12:52 +02:00
vansdiyundbastelbedarfandGitHub 2c521a410e Update Produkt “perlen-armband-hellblau” 2026-08-04 13:07:09 +02:00