Grundlegend umgebaut: eine Seite pro Tier-Familie mit mehreren Charakteren statt einer Seite pro Charakter

Bisher war jeder Charakter (HasiDog, Frieda, Sam, ...) eine eigene
Unterkategorie mit eigener Seite. Das passte nicht mehr, sobald eine
Familie mehrere Charaktere bekommt (HasiDog, HasiGott, Mama Hase) — die
sollten alle auf EINER Seite erscheinen, nicht auf drei getrennten.

Neues Modell:
- Unterkategorie = die ganze Tier-Familie (z.B. "hase", "kuh", "wal"),
  nicht mehr ein einzelner Charakter.
- Jede Familie hat jetzt ein "characters"-Array (categories.ts,
  config.yml) — beliebig viele Charaktere, jeder mit eigenem Namen,
  Vorstellungstext und optionalem "Mehr über mich"-Link.
- Produkte bekommen ein neues optionales Feld "charakter", das sie einem
  bestimmten Charakter innerhalb der Unterkategorie zuordnet (Product.
  charakter in products.ts + Adminbereich-Feld).
- Die Unterkategorie-Seite zeigt jetzt JEDEN Charakter als eigene Box
  untereinander, mit automatisch abwechselnder Foto-/Text-Seite (1. links,
  2. rechts, 3. wieder links, ...). Ein Charakter ohne zugeordnetes
  Produkt zeigt trotzdem schon seine Box (nur ohne Foto) — die Seite
  "wächst" mit, sobald neue Charaktere/Produkte dazukommen, für jede
  Tier-Familie (Hase, Kuh, Wal, Oktopus, Schildkröte, Pinguin).
- "Hase" hat jetzt drei Charaktere (HasiDog mit echtem Produkt, HasiGott
  und Mama Hase als Platzhalter-Boxen).
- Unterkategorien-Chips zeigen jetzt sauber die Familiennamen (Kuh, Hase,
  Wal, ...) statt "Kuh „Frieda"" etc.
- Alte, verwaiste /hasidog/-Seite entfernt (war durch die Umstellung
  kaputt und nirgends mehr verlinkt).

Verifiziert per Puppeteer gegen den echten Build: /shop/diy-plushies/hase/
zeigt alle drei Charaktere korrekt alternierend, Ein-Charakter-Familien
(Kuh etc.) funktionieren unverändert, Adminbereich lädt ohne
Konfigurationsfehler, alte Hase-URLs geben korrekt 404.
This commit is contained in:
qcigano
2026-08-02 20:08:51 +02:00
parent b8f4454bea
commit 46aae63bcf
13 changed files with 332 additions and 411 deletions
+15 -3
View File
@@ -8,16 +8,28 @@ import type { Locale } from "../i18n/config";
type LocalizedText = Record<Locale, string>;
export interface Subcategory {
// Ein einzelner Charakter innerhalb einer Tier-Familie (z.B. "HasiDog" innerhalb der
// Unterkategorie "Hase"). Jede Familie kann beliebig viele Charaktere haben — die Seite
// "wächst" automatisch mit, wenn VanVan hier neue Charaktere ergänzt.
export interface Character {
slug: string;
name: LocalizedText;
// Persönliche Vorstellung des Charakters (z.B. bei DIY-Plushies-Unterkategorien) — optional,
// wird auf der Unterkategorie-Seite als eigene Box unter der Überschrift angezeigt.
// Persönliche Vorstellung des Charakters — wird als eigene Box mit abwechselnder
// Foto-/Text-Seite auf der Unterkategorie-Seite angezeigt.
vorstellung?: LocalizedText;
// Optionales Ziel für einen "Mehr über ..."-Button (z.B. HasiDog hat eine eigene Seite).
mehrLink?: string;
}
export interface Subcategory {
slug: string;
name: LocalizedText;
// Ein oder mehrere Charaktere dieser Tier-Familie — jeder bekommt seine eigene Box auf der
// Unterkategorie-Seite (Foto/Text abwechselnd links/rechts), verknüpft mit dem passenden
// Produkt über Product.charakter (siehe products.ts).
characters?: Character[];
}
export interface Category {
slug: string;
order: number;
+5 -1
View File
@@ -16,7 +16,11 @@ export interface Product {
name: LocalizedText;
artikelnummer?: string;
kategorie: string; // slug aus categories.ts
unterkategorie?: string; // optionaler Unterkategorie-Slug aus categories.ts
unterkategorie?: string; // optionaler Unterkategorie-Slug aus categories.ts (z.B. "hase")
// Ordnet das Produkt einem bestimmten Charakter innerhalb der Unterkategorie zu (z.B. "hasidog"
// innerhalb der Unterkategorie "hase") — so weiß die Seite, welches Foto/welcher Text zu
// welchem Charakter gehört. Leer lassen, wenn die Unterkategorie nur einen Charakter hat.
charakter?: string;
preis: number; // in Euro
preisAlt?: number; // falls Sale
bestand: number; // 0 = ausverkauft, bleibt trotzdem sichtbar