Versandfreigrenze pro Land, USt-ID, Rechtstexte+FAQ jetzt admin-editierbar

1) Versandkostenfreigrenze ist jetzt länderabhängig statt einer einzigen Zahl für alle:
   Deutschland 75 €, Österreich/Luxemburg 85 €, Schweiz 100 € (im Adminbereich unter
   "Versandkosten-Staffel" änderbar). Betrifft Warenkorb (live je nach gewähltem Land),
   Checkout-Berechnung, sowie alle Text-Hinweise (Topbar, FAQ, AGB) in allen 4 Sprachen.

2) Neues Feld "USt-IdNr." im Impressum (optional, admin-editierbar) — erscheint nur, wenn
   ausgefüllt.

3) Impressum, AGB, Datenschutzerklärung, Widerrufsbelehrung und FAQ sind jetzt vollständig
   im Adminbereich editierbar (neue Collection "⚖️ Rechtstexte & FAQ") statt fest im Code zu
   stehen. Jede Rechtsseite besteht aus frei bearbeitbaren Abschnitten (Überschrift + Text) —
   VanVan kann selbst Abschnitte ergänzen, ändern oder löschen. Freitext wird beim Anzeigen
   sicher escaped (kein kaputtes HTML durch Tippfehler möglich) und nackte Links automatisch
   klickbar gemacht. FAQ bleibt dabei weiterhin in allen 4 Sprachen separat pflegbar.

Ausführlich getestet: Freigrenze pro Land im echten Warenkorb verifiziert (Puppeteer,
84€ Warenwert -> DE kostenlos, AT/LU "noch 1€", CH "noch 16€"), Rechtstexte/FAQ/USt-ID
gegen den fertigen Build geprüft, EU-Streitschlichtung-Link-Bug (Satzzeichen wurde
mitverlinkt) gefunden und behoben.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 22:04:01 +02:00
co-authored by Claude Sonnet 5
parent 9a2c75ebe6
commit 0c1c8f075f
23 changed files with 495 additions and 310 deletions
+114 -2
View File
@@ -247,9 +247,17 @@ collections:
description: >
Gilt automatisch im Warenkorb/an der Kasse, sobald jemand mehrere Produkte oder
mehrere Stück kauft (bei genau 1 Stück von 1 Produkt gilt stattdessen der eigene
Versandpreis am Produkt, falls dort einer eingetragen ist). Ab 75 € Warenwert ist der
Versand immer kostenlos, unabhängig von dieser Tabelle.
Versandpreis am Produkt, falls dort einer eingetragen ist). Ab der unten je Land
eingestellten Freigrenze ist der Versand immer kostenlos, unabhängig von dieser Tabelle.
fields:
- label: "Versandkostenfreigrenze pro Land (€) — ab diesem Warenwert ist der Versand immer kostenlos"
name: freigrenze
widget: object
fields:
- { label: Deutschland, name: de, widget: number, value_type: float, step: 0.01 }
- { label: Österreich, name: at, widget: number, value_type: float, step: 0.01 }
- { label: Schweiz, name: ch, widget: number, value_type: float, step: 0.01 }
- { label: Luxemburg, name: lu, widget: number, value_type: float, step: 0.01 }
- label: Deutschland
name: de
widget: list
@@ -433,3 +441,107 @@ collections:
- { label: IBAN, name: iban, widget: string, required: false, hint: "z.B. DE12 3456 7890 1234 5678 90" }
- { label: BIC, name: bic, widget: string, required: false }
- { label: Bank (Name), name: bank, widget: string, required: false }
- name: rechtstexte
label: "⚖️ Rechtstexte & FAQ"
icon: gavel
files:
- name: impressum
label: "Impressum"
file: src/content/impressum.json
description: >
Erscheint auf /impressum/. Jeder Abschnitt hat eine Überschrift + einen Text — Absätze
durch eine Leerzeile trennen, einzelne Zeilenumbrüche (z.B. für Adresszeilen) reichen
mit Enter. Links (z.B. https://...) werden automatisch klickbar, du musst kein HTML
schreiben. Abschnitte können frei ergänzt, umbenannt oder gelöscht werden.
fields:
- label: "USt-IdNr. (optional)"
name: ustId
widget: string
required: false
hint: "Nur ausfüllen, falls vorhanden — als Kleinunternehmer nach §19 UStG oft nicht nötig. Erscheint als eigener Absatz unter den Abschnitten."
- label: Abschnitte
name: sections
widget: list
summary: "{{fields.heading}}"
fields:
- { label: Überschrift, name: heading, widget: string }
- { label: Text, name: body, widget: text }
- name: agb
label: "Allgemeine Geschäftsbedingungen (AGB)"
file: src/content/agb.json
description: >
Erscheint auf /agb/. Gleiches Prinzip wie beim Impressum — Abschnitte mit Überschrift +
Text, frei ergänzbar/änderbar.
fields:
- label: Abschnitte
name: sections
widget: list
summary: "{{fields.heading}}"
fields:
- { label: Überschrift, name: heading, widget: string }
- { label: Text, name: body, widget: text }
- name: datenschutz
label: "Datenschutzerklärung"
file: src/content/datenschutz.json
description: >
Erscheint auf /datenschutz/. Gleiches Prinzip — Abschnitte mit Überschrift + Text.
fields:
- label: Abschnitte
name: sections
widget: list
summary: "{{fields.heading}}"
fields:
- { label: Überschrift, name: heading, widget: string }
- { label: Text, name: body, widget: text }
- name: widerruf
label: "Widerrufsbelehrung"
file: src/content/widerruf.json
description: >
Erscheint auf /widerruf/. Gleiches Prinzip — Abschnitte mit Überschrift + Text. Der
Link zum Muster-Widerrufsformular am Ende der Seite ist fest eingebaut und muss hier
nicht gepflegt werden.
fields:
- label: Abschnitte
name: sections
widget: list
summary: "{{fields.heading}}"
fields:
- { label: Überschrift, name: heading, widget: string }
- { label: Text, name: body, widget: text }
- name: faq
label: "FAQ (Häufig gestellte Fragen)"
file: src/content/faq.json
description: >
Erscheint auf /faq/ — in allen 4 Sprachen separat pflegbar. Achtung: die 4 Sprachen
sind unabhängig voneinander, eine neue Frage muss in jeder Sprache einzeln ergänzt
werden, damit sie überall erscheint.
fields:
- label: Deutsch
name: de
widget: list
summary: "{{fields.q}}"
fields:
- { label: Frage, name: q, widget: string }
- { label: Antwort, name: a, widget: text }
- label: Englisch
name: en
widget: list
summary: "{{fields.q}}"
fields:
- { label: Frage, name: q, widget: string }
- { label: Antwort, name: a, widget: text }
- label: "Schweizerdeutsch"
name: ch
widget: list
summary: "{{fields.q}}"
fields:
- { label: Frage, name: q, widget: string }
- { label: Antwort, name: a, widget: text }
- label: Französisch
name: fr
widget: list
summary: "{{fields.q}}"
fields:
- { label: Frage, name: q, widget: string }
- { label: Antwort, name: a, widget: text }