Admin-CMS für VanVan optisch und strukturell deutlich aufgewertet
- Farbschema/Schriftart der Website übernommen (Sveltias eigenes CSS-Variablen- Theming-System genutzt: --sui-base-hue, --sui-primary-accent-color* auf den Türkis-Akzent + Lila-Grundton der Seite gesetzt, Inter-Schriftart) - Eigenes Logo + Seitentitel "Van's Shop – Adminbereich" auf dem Login-Bildschirm - Icons pro Bereich in der Seitenleiste (Produkte/Kategorien/Versandkosten) - Zahlenfelder ohne die klobigen Browser-Spinner-Pfeile - Produktformular neu geordnet nach natürlichem Ablauf: Fotos → Name → Beschreibung → Preis/Bestand (mit klareren Erklärtexten) → Kategorie → Auszeichnungen → weitere Detailangaben → Versand → interner Code
This commit is contained in:
+61
-45
@@ -4,6 +4,11 @@ backend:
|
|||||||
branch: main
|
branch: main
|
||||||
base_url: https://vans-diy-bastelbedarf-cms-auth.dogfather1608.workers.dev
|
base_url: https://vans-diy-bastelbedarf-cms-auth.dogfather1608.workers.dev
|
||||||
|
|
||||||
|
logo:
|
||||||
|
src: /logo.png
|
||||||
|
|
||||||
|
app_title: "Van's Shop – Adminbereich"
|
||||||
|
|
||||||
# Bilder, die VanVan hier hochlädt, landen automatisch hier im Projekt und sind danach
|
# Bilder, die VanVan hier hochlädt, landen automatisch hier im Projekt und sind danach
|
||||||
# unter /img/products/<dateiname> auf der Website erreichbar.
|
# unter /img/products/<dateiname> auf der Website erreichbar.
|
||||||
media_folder: "public/img/products"
|
media_folder: "public/img/products"
|
||||||
@@ -13,6 +18,7 @@ collections:
|
|||||||
- name: products
|
- name: products
|
||||||
label: Produkte
|
label: Produkte
|
||||||
label_singular: Produkt
|
label_singular: Produkt
|
||||||
|
icon: shopping_bag
|
||||||
folder: src/content/products
|
folder: src/content/products
|
||||||
create: true
|
create: true
|
||||||
delete: true
|
delete: true
|
||||||
@@ -22,15 +28,11 @@ collections:
|
|||||||
format: json
|
format: json
|
||||||
summary: "{{name.de}} — {{preis}} €"
|
summary: "{{name.de}} — {{preis}} €"
|
||||||
fields:
|
fields:
|
||||||
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
|
|
||||||
name: slug
|
|
||||||
widget: string
|
|
||||||
hint: "Nur Kleinbuchstaben, Zahlen und Bindestriche, z.B. wolke-plushie-lavendel"
|
|
||||||
- label: "📷 Fotos"
|
- label: "📷 Fotos"
|
||||||
name: bilder
|
name: bilder
|
||||||
widget: list
|
widget: list
|
||||||
required: false
|
required: false
|
||||||
hint: "Hier Fotos hochladen oder per Drag & Drop reinziehen. Das erste Foto ist das Hauptbild."
|
hint: "Hier Fotos hochladen oder per Drag & Drop reinziehen. Das erste Foto ist das Hauptbild, das überall zuerst angezeigt wird."
|
||||||
field: { label: Foto, name: bild, widget: image }
|
field: { label: Foto, name: bild, widget: image }
|
||||||
- label: Name
|
- label: Name
|
||||||
name: name
|
name: name
|
||||||
@@ -40,10 +42,32 @@ collections:
|
|||||||
- { label: Englisch, name: en, widget: string }
|
- { label: Englisch, name: en, widget: string }
|
||||||
- { label: "Schweizerdeutsch", name: ch, widget: string }
|
- { label: "Schweizerdeutsch", name: ch, widget: string }
|
||||||
- { label: Französisch, name: fr, widget: string }
|
- { label: Französisch, name: fr, widget: string }
|
||||||
- label: Artikelnummer
|
- label: Beschreibung
|
||||||
name: artikelnummer
|
name: beschreibung
|
||||||
widget: string
|
widget: object
|
||||||
|
fields:
|
||||||
|
- { label: Deutsch, name: de, widget: text }
|
||||||
|
- { label: Englisch, name: en, widget: text }
|
||||||
|
- { label: "Schweizerdeutsch", name: ch, widget: text }
|
||||||
|
- { label: Französisch, name: fr, widget: text }
|
||||||
|
- label: "Preis (€)"
|
||||||
|
name: preis
|
||||||
|
widget: number
|
||||||
|
value_type: float
|
||||||
|
step: 0.01
|
||||||
|
hint: "Der ganz normale Verkaufspreis, z.B. 19.99"
|
||||||
|
- label: "Reduzierter Preis? (nur ausfüllen, wenn im Sale)"
|
||||||
|
name: preisAlt
|
||||||
|
widget: number
|
||||||
|
value_type: float
|
||||||
|
step: 0.01
|
||||||
required: false
|
required: false
|
||||||
|
hint: "Hier den ALTEN, höheren Preis eintragen — er wird dann durchgestrichen neben dem neuen Preis angezeigt. Leer lassen, wenn kein Sale."
|
||||||
|
- label: "Auf Lager"
|
||||||
|
name: bestand
|
||||||
|
widget: number
|
||||||
|
value_type: int
|
||||||
|
hint: "Wie viele Stück hast du vorrätig? 0 = ausverkauft (Artikel bleibt trotzdem sichtbar)."
|
||||||
- label: Kategorie
|
- label: Kategorie
|
||||||
name: kategorie
|
name: kategorie
|
||||||
widget: relation
|
widget: relation
|
||||||
@@ -55,23 +79,19 @@ collections:
|
|||||||
name: unterkategorie
|
name: unterkategorie
|
||||||
widget: string
|
widget: string
|
||||||
required: false
|
required: false
|
||||||
hint: "Interner Code der Unterkategorie eintragen, z.B. kuh-frieda (siehe Kategorien-Bereich)"
|
hint: "Interner Code der Unterkategorie eintragen, z.B. kuh-frieda (siehe Bereich Kategorien)"
|
||||||
- { label: "Preis (in Euro)", name: preis, widget: number, value_type: float, step: 0.01 }
|
- label: Auszeichnungen
|
||||||
- label: "Alter Preis (nur ausfüllen, wenn im Sale)"
|
name: badges
|
||||||
name: preisAlt
|
widget: select
|
||||||
widget: number
|
multiple: true
|
||||||
value_type: float
|
|
||||||
step: 0.01
|
|
||||||
required: false
|
required: false
|
||||||
- { label: "Bestand (Anzahl auf Lager)", name: bestand, widget: number, value_type: int }
|
hint: "Erscheinen als kleine Sticker auf dem Produktbild"
|
||||||
- label: Beschreibung
|
options:
|
||||||
name: beschreibung
|
- { label: "✨ Neu", value: neu }
|
||||||
widget: object
|
- { label: "🔥 Bestseller", value: bestseller }
|
||||||
fields:
|
- { label: "🏷️ Im Sale", value: sale }
|
||||||
- { label: Deutsch, name: de, widget: text }
|
- { label: "🧶 Handgemacht", value: handgemacht }
|
||||||
- { label: Englisch, name: en, widget: text }
|
- { label: Artikelnummer, name: artikelnummer, widget: string, required: false }
|
||||||
- { label: "Schweizerdeutsch", name: ch, widget: text }
|
|
||||||
- { label: Französisch, name: fr, widget: text }
|
|
||||||
- { label: Material, name: material, widget: string, required: false }
|
- { label: Material, name: material, widget: string, required: false }
|
||||||
- { label: "Größe / Maße", name: groesse, widget: string, required: false }
|
- { label: "Größe / Maße", name: groesse, widget: string, required: false }
|
||||||
- label: Farben
|
- label: Farben
|
||||||
@@ -82,30 +102,25 @@ collections:
|
|||||||
- { label: Lieferumfang, name: lieferumfang, widget: string, required: false }
|
- { label: Lieferumfang, name: lieferumfang, widget: string, required: false }
|
||||||
- { label: Pflegehinweise, name: pflegehinweise, widget: string, required: false }
|
- { label: Pflegehinweise, name: pflegehinweise, widget: string, required: false }
|
||||||
- { label: Lieferzeit, name: lieferzeit, widget: string, required: false }
|
- { label: Lieferzeit, name: lieferzeit, widget: string, required: false }
|
||||||
- label: Auszeichnungen
|
|
||||||
name: badges
|
|
||||||
widget: select
|
|
||||||
multiple: true
|
|
||||||
required: false
|
|
||||||
options:
|
|
||||||
- { label: Neu, value: neu }
|
|
||||||
- { label: Bestseller, value: bestseller }
|
|
||||||
- { label: "Im Sale", value: sale }
|
|
||||||
- { label: Handgemacht, value: handgemacht }
|
|
||||||
- label: "🚚 Eigene Versandkosten (nur für Einzelkauf dieses Produkts)"
|
- label: "🚚 Eigene Versandkosten (nur für Einzelkauf dieses Produkts)"
|
||||||
name: versand
|
name: versand
|
||||||
widget: object
|
widget: object
|
||||||
required: false
|
required: false
|
||||||
hint: "Gilt NUR, wenn jemand genau 1 Stück von genau diesem Produkt kauft. Bei mehreren Produkten/Stück im Warenkorb gilt automatisch die allgemeine Versandkosten-Staffel (siehe eigener Bereich 'Versandkosten-Staffel' im Menü links). Leer lassen = Staffel gilt auch beim Einzelkauf."
|
hint: "Gilt NUR, wenn jemand genau 1 Stück von genau diesem Produkt kauft. Bei mehreren Produkten/Stück im Warenkorb gilt automatisch die allgemeine Versandkosten-Staffel (siehe Bereich 'Versandkosten-Staffel'). Leer lassen = Staffel gilt auch beim Einzelkauf."
|
||||||
fields:
|
fields:
|
||||||
- { label: "Deutschland (€)", name: de, widget: number, value_type: float, step: 0.01, required: false }
|
- { label: "Deutschland (€)", name: de, widget: number, value_type: float, step: 0.01, required: false }
|
||||||
- { label: "Österreich (€)", name: at, widget: number, value_type: float, step: 0.01, required: false }
|
- { label: "Österreich (€)", name: at, widget: number, value_type: float, step: 0.01, required: false }
|
||||||
- { label: "Schweiz (€)", name: ch, widget: number, value_type: float, step: 0.01, required: false }
|
- { label: "Schweiz (€)", name: ch, widget: number, value_type: float, step: 0.01, required: false }
|
||||||
- { label: "Luxemburg (€)", name: lu, widget: number, value_type: float, step: 0.01, required: false }
|
- { label: "Luxemburg (€)", name: lu, widget: number, value_type: float, step: 0.01, required: false }
|
||||||
|
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
|
||||||
|
name: slug
|
||||||
|
widget: string
|
||||||
|
hint: "Nur Kleinbuchstaben, Zahlen und Bindestriche, z.B. wolke-plushie-lavendel"
|
||||||
|
|
||||||
- name: categories
|
- name: categories
|
||||||
label: Kategorien
|
label: Kategorien
|
||||||
label_singular: Kategorie
|
label_singular: Kategorie
|
||||||
|
icon: category
|
||||||
folder: src/content/categories
|
folder: src/content/categories
|
||||||
create: true
|
create: true
|
||||||
delete: false
|
delete: false
|
||||||
@@ -115,13 +130,10 @@ collections:
|
|||||||
format: json
|
format: json
|
||||||
summary: "{{name.de}}"
|
summary: "{{name.de}}"
|
||||||
fields:
|
fields:
|
||||||
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
|
- label: "Icon (Emoji)"
|
||||||
name: slug
|
name: icon
|
||||||
widget: string
|
widget: string
|
||||||
- label: "Reihenfolge (0 = zuerst)"
|
hint: "z.B. 🧸"
|
||||||
name: order
|
|
||||||
widget: number
|
|
||||||
value_type: int
|
|
||||||
- label: Name
|
- label: Name
|
||||||
name: name
|
name: name
|
||||||
widget: object
|
widget: object
|
||||||
@@ -138,10 +150,6 @@ collections:
|
|||||||
- { label: Englisch, name: en, widget: text }
|
- { label: Englisch, name: en, widget: text }
|
||||||
- { label: "Schweizerdeutsch", name: ch, widget: text }
|
- { label: "Schweizerdeutsch", name: ch, widget: text }
|
||||||
- { label: Französisch, name: fr, widget: text }
|
- { label: Französisch, name: fr, widget: text }
|
||||||
- label: "Icon (Emoji)"
|
|
||||||
name: icon
|
|
||||||
widget: string
|
|
||||||
hint: "z.B. 🧸"
|
|
||||||
- label: Unterkategorien
|
- label: Unterkategorien
|
||||||
name: subcategories
|
name: subcategories
|
||||||
widget: list
|
widget: list
|
||||||
@@ -157,9 +165,17 @@ collections:
|
|||||||
- { label: Englisch, name: en, widget: string }
|
- { label: Englisch, name: en, widget: string }
|
||||||
- { label: "Schweizerdeutsch", name: ch, widget: string }
|
- { label: "Schweizerdeutsch", name: ch, widget: string }
|
||||||
- { label: Französisch, name: fr, widget: string }
|
- { label: Französisch, name: fr, widget: string }
|
||||||
|
- label: "Reihenfolge (0 = zuerst)"
|
||||||
|
name: order
|
||||||
|
widget: number
|
||||||
|
value_type: int
|
||||||
|
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
|
||||||
|
name: slug
|
||||||
|
widget: string
|
||||||
|
|
||||||
- name: versandkosten
|
- name: versandkosten
|
||||||
label: "🚚 Versandkosten-Staffel"
|
label: "🚚 Versandkosten-Staffel"
|
||||||
|
icon: local_shipping
|
||||||
files:
|
files:
|
||||||
- name: staffel
|
- name: staffel
|
||||||
label: "Versandkosten-Staffel nach Warenwert"
|
label: "Versandkosten-Staffel nach Warenwert"
|
||||||
|
|||||||
@@ -6,6 +6,49 @@
|
|||||||
<meta name="robots" content="noindex" />
|
<meta name="robots" content="noindex" />
|
||||||
<title>Van's DIY & Bastelbedarf – Admin</title>
|
<title>Van's DIY & Bastelbedarf – Admin</title>
|
||||||
<link rel="icon" href="/favicon.svg" />
|
<link rel="icon" href="/favicon.svg" />
|
||||||
|
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
||||||
|
<style>
|
||||||
|
/* Sveltia CMS optisch an die eigentliche Website angepasst — nutzt Sveltias eigenes
|
||||||
|
CSS-Variablen-Theming-System (--sui-*, "Sveltia UI"), keine geratenen internen
|
||||||
|
Klassennamen. Das ist zwar nirgends offiziell als öffentliche Theming-API dokumentiert,
|
||||||
|
aber es sind echte, durchgängig im ganzen Sveltia-Interface verwendete Design-Tokens —
|
||||||
|
deutlich robuster als CSS gegen zufällige Klassennamen zu schreiben. Falls ein
|
||||||
|
künftiges Sveltia-Update diese Variablennamen ändert, fällt die Oberfläche einfach
|
||||||
|
wieder auf ihr Standard-Blau zurück statt kaputtzugehen.
|
||||||
|
*/
|
||||||
|
/* !important nötig: Sveltia hängt sein eigenes Stylesheet erst NACH dieser Seite ein,
|
||||||
|
gewinnt also bei gleicher Spezifität normalerweise die Kaskade. Mit !important setzt
|
||||||
|
sich unsere Optik trotzdem zuverlässig durch, unabhängig von der Ladereihenfolge. */
|
||||||
|
:root {
|
||||||
|
/* Schiebt alle neutralen Grautöne/Ränder der Oberfläche Richtung Lila — wie der
|
||||||
|
Rest der Seite (statt Sveltias Standard-Blaugrau). */
|
||||||
|
--sui-base-hue: 248 !important;
|
||||||
|
|
||||||
|
/* Türkiser Akzent der Website statt Sveltias Standard-Blau. */
|
||||||
|
--sui-primary-accent-color: #5fd3ec !important;
|
||||||
|
--sui-primary-accent-color-light: #7fdcf0 !important;
|
||||||
|
--sui-primary-accent-color-dark: #3ca9c2 !important;
|
||||||
|
--sui-primary-accent-color-text: #5fd3ec !important;
|
||||||
|
--sui-primary-accent-color-inverted: #0a0910 !important;
|
||||||
|
--sui-primary-accent-color-translucent: rgba(95, 211, 236, 0.5) !important;
|
||||||
|
--sui-primary-accent-color-translucent-light: rgba(95, 211, 236, 0.3) !important;
|
||||||
|
|
||||||
|
/* Gleiche Schriftart wie der Rest der Seite statt Sveltias Standardschrift. */
|
||||||
|
--sui-font-family-default: "Inter", system-ui, sans-serif !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zahlenfelder ohne die klobigen Auf/Ab-Pfeile — dezenter, aufgeräumter. */
|
||||||
|
input[type="number"]::-webkit-outer-spin-button,
|
||||||
|
input[type="number"]::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
input[type="number"] {
|
||||||
|
-moz-appearance: textfield;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Sveltia CMS: quelloffen (MIT), läuft komplett im Browser, bearbeitet die Inhalte
|
<!-- Sveltia CMS: quelloffen (MIT), läuft komplett im Browser, bearbeitet die Inhalte
|
||||||
|
|||||||
Reference in New Issue
Block a user