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:
+15
-3
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user