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 }
+44
View File
@@ -0,0 +1,44 @@
{
"sections": [
{
"heading": "§ 1 Geltungsbereich",
"body": "Diese Allgemeinen Geschäftsbedingungen gelten für alle Bestellungen, die Verbraucher über den Onlineshop von Van's DIY & Bastelbedarf (Einzelunternehmen, [Anschrift]) aufgeben."
},
{
"heading": "§ 2 Vertragspartner, Vertragsschluss",
"body": "Der Kaufvertrag kommt zustande mit Van's DIY & Bastelbedarf. Die Darstellung der Produkte im Shop stellt kein rechtlich bindendes Angebot dar, sondern eine unverbindliche Aufforderung, ein Angebot abzugeben. Mit Anklicken des Buttons „Jetzt zahlungspflichtig bestellen\" gibst du ein verbindliches Angebot zum Kauf ab. Wir bestätigen den Eingang deiner Bestellung per E-Mail; diese Bestätigung stellt noch keine Vertragsannahme dar. Der Vertrag kommt erst mit unserer gesonderten Auftragsbestätigung oder Versand der Ware zustande."
},
{
"heading": "§ 3 Preise und Versandkosten",
"body": "Alle angegebenen Preise verstehen sich als Endpreise. Gemäß §19 UStG wird als Kleinunternehmer keine Umsatzsteuer berechnet und ausgewiesen. Es kommen ggf. Versandkosten hinzu, die im Bestellprozess vor Abschluss der Bestellung ausgewiesen werden. Wir liefern versandkostenfrei ab einem Warenwert von 75 € (Deutschland), 85 € (Österreich, Luxemburg) bzw. 100 € (Schweiz)."
},
{
"heading": "§ 4 Zahlung",
"body": "Die Zahlung erfolgt wahlweise per PayPal, Klarna, Kreditkarte (Visa & Mastercard) oder Banküberweisung (Vorkasse)."
},
{
"heading": "§ 5 Lieferung",
"body": "Die Lieferung erfolgt ausschließlich mit DHL innerhalb Deutschlands, Österreichs, der Schweiz und Luxemburgs. Die Lieferzeit beträgt in der Regel 27 Werktage nach Zahlungseingang."
},
{
"heading": "§ 6 Eigentumsvorbehalt",
"body": "Bis zur vollständigen Bezahlung bleibt die gelieferte Ware unser Eigentum."
},
{
"heading": "§ 7 Widerrufsrecht",
"body": "Es gilt das gesetzliche Widerrufsrecht für Verbraucher gemäß unserer gesonderten Widerrufsbelehrung. Bei Waren, die nach Kundenspezifikation angefertigt oder eindeutig auf die persönlichen Bedürfnisse zugeschnitten sind, kann das Widerrufsrecht gemäß § 312g Abs. 2 Nr. 1 BGB ausgeschlossen sein."
},
{
"heading": "§ 8 Gewährleistung",
"body": "Es gilt das gesetzliche Mängelhaftungsrecht."
},
{
"heading": "§ 9 Streitbeilegung",
"body": "Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: https://ec.europa.eu/consumers/odr/. Wir sind nicht verpflichtet und nicht bereit, an einem Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen."
},
{
"heading": "§ 10 Schlussbestimmungen",
"body": "Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts. Hast du als Verbraucher:in deinen gewöhnlichen Aufenthalt in einem anderen EU-Mitgliedstaat, bleiben die zwingenden Verbraucherschutzvorschriften dieses Staates von dieser Rechtswahl unberührt."
}
]
}
+44
View File
@@ -0,0 +1,44 @@
{
"sections": [
{
"heading": "1. Verantwortlicher",
"body": "[Vorname Nachname], Van's DIY & Bastelbedarf, [Anschrift], [E-Mail-Adresse]"
},
{
"heading": "2. Allgemeines zur Datenverarbeitung",
"body": "Wir verarbeiten personenbezogene Daten unserer Nutzer grundsätzlich nur, soweit dies zur Bereitstellung einer funktionsfähigen Website sowie unserer Inhalte und Leistungen erforderlich ist, auf Grundlage der Art. 6 Abs. 1 lit. a, b und f DSGVO."
},
{
"heading": "3. Hosting",
"body": "Diese Website wird bei einem externen Dienstleister gehostet (Hoster). Die personenbezogenen Daten, die auf dieser Website erfasst werden, werden auf den Servern des Hosters gespeichert. [Konkreten Hosting-Anbieter, z. B. Cloudflare Pages, hier ergänzen inkl. Standort der Server und ggf. Auftragsverarbeitungsvertrag.]"
},
{
"heading": "4. Bestellabwicklung",
"body": "Zur Abwicklung deiner Bestellung erheben und verarbeiten wir personenbezogene Daten, wenn dies zur Erfüllung des Vertrags erforderlich ist (Art. 6 Abs. 1 lit. b DSGVO). Dazu gehören Name, Anschrift, E-Mail-Adresse und Zahlungsdaten. Die Daten werden ausschließlich zur Vertragsabwicklung genutzt."
},
{
"heading": "5. Zahlungsdienstleister",
"body": "Je nach gewählter Zahlungsart geben wir Daten an die eingesetzten Zahlungsdienstleister weiter (PayPal, Klarna, Kreditkartenanbieter). Es gelten deren jeweils eigene Datenschutzhinweise. Bei Banküberweisung werden Daten an unser kontoführendes Kreditinstitut übermittelt."
},
{
"heading": "6. Kontaktformular",
"body": "Wenn du uns über das Kontaktformular oder per E-Mail Anfragen zukommen lässt, werden deine Angaben aus dem Anfrageformular inklusive der von dir dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Die Verarbeitung dieser Daten erfolgt auf Grundlage deiner Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) bzw., sofern die Anfrage der Anbahnung eines Vertrags dient, auf Grundlage des Art. 6 Abs. 1 lit. b DSGVO. Eine erteilte Einwilligung kannst du jederzeit mit Wirkung für die Zukunft widerrufen, etwa per E-Mail an die oben genannte Adresse."
},
{
"heading": "7. Cookies",
"body": "Diese Website verwendet, soweit technisch erforderlich, Cookies zur Bereitstellung des Warenkorbs. Weitere, nicht zwingend erforderliche Cookies (z. B. Statistik/Marketing) werden nur nach vorheriger Einwilligung gesetzt. [Cookie-Banner/Consent-Tool ergänzen, sobald solche Cookies tatsächlich eingesetzt werden.]"
},
{
"heading": "8. Deine Rechte",
"body": "Du hast jederzeit das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16 DSGVO), Löschung (Art. 17 DSGVO), Einschränkung der Verarbeitung (Art. 18 DSGVO), Datenübertragbarkeit (Art. 20 DSGVO) und Widerspruch gegen die Verarbeitung deiner personenbezogenen Daten (Art. 21 DSGVO). Soweit die Verarbeitung auf deiner Einwilligung beruht, kannst du diese jederzeit mit Wirkung für die Zukunft widerrufen (Art. 7 Abs. 3 DSGVO), ohne dass die Rechtmäßigkeit der bis zum Widerruf erfolgten Verarbeitung berührt wird. Außerdem hast du das Recht, dich bei einer Datenschutz-Aufsichtsbehörde zu beschweren — insbesondere in dem Mitgliedstaat deines gewöhnlichen Aufenthaltsorts, deines Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes."
},
{
"heading": "9. Automatisierte Entscheidungsfindung",
"body": "Wir setzen keine automatisierte Entscheidungsfindung einschließlich Profiling im Sinne von Art. 22 DSGVO ein."
},
{
"heading": "10. Speicherdauer",
"body": "Wir speichern personenbezogene Daten nur so lange, wie es für den jeweiligen Zweck erforderlich ist oder gesetzliche Aufbewahrungsfristen (insbesondere handels- und steuerrechtlich) dies vorschreiben."
}
]
}
+42
View File
@@ -0,0 +1,42 @@
{
"de": [
{ "q": "Wie lange dauert die Lieferung?", "a": "In der Regel 27 Werktage innerhalb Deutschlands, Österreichs, der Schweiz und Luxemburgs. Bei Sonderanfertigungen kann es etwas länger dauern das steht dann direkt auf der Produktseite." },
{ "q": "Ab wann ist der Versand kostenlos?", "a": "Das hängt vom Lieferland ab: Deutschland ab 75 €, Österreich und Luxemburg ab 85 €, Schweiz ab 100 € Warenwert dann versenden wir kostenfrei mit DHL. Darunter richten sich die Versandkosten nach Produkt, Land und Warenwert Details dazu findest du auf der Seite Versand & Zahlung." },
{ "q": "Kann ich Sonderwünsche oder individuelle Anfertigungen bestellen?", "a": "Ja, gerne! Schreib uns einfach über das Kontaktformular wir schauen, was möglich ist." },
{ "q": "Wie pflege ich meine handgemachten Produkte?", "a": "Die genauen Pflegehinweise stehen jeweils auf der Produktseite. Da unsere Stücke handgehäkelt bzw. handgestrickt sind, empfehlen wir grundsätzlich schonende Handwäsche bei niedriger Temperatur, keinen Trockner und liegend an der Luft trocknen, damit Form und Fasern erhalten bleiben." },
{ "q": "Welche Zahlungsarten werden akzeptiert?", "a": "PayPal, Klarna, Kreditkarte (Visa & Mastercard) und Banküberweisung (Vorkasse)." },
{ "q": "Kann ich meine Bestellung zurückgeben?", "a": "Es gilt das gesetzliche 14-tägige Widerrufsrecht (siehe unsere Widerrufsbelehrung). Bei individuell auf dich zugeschnittenen Sonderanfertigungen kann das Widerrufsrecht gesetzlich ausgeschlossen sein, bei Standardartikeln aus unserem Sortiment gilt es regulär." },
{ "q": "Muss ich Umsatzsteuer zahlen?", "a": "Nein. Van's DIY & Bastelbedarf ist Kleinunternehmer gemäß §19 UStG es wird keine Umsatzsteuer berechnet und ausgewiesen." },
{ "q": "Brauche ich ein Kundenkonto zum Bestellen?", "a": "Nein, du kannst auch bequem als Gast bestellen. Ein Konto lohnt sich aber für Bestellhistorie, Wunschliste und Sendungsverfolgung an einem Ort." }
],
"en": [
{ "q": "How long does delivery take?", "a": "Usually 27 business days within Germany, Austria, Switzerland and Luxembourg. Custom pieces may take a little longer noted directly on the product page." },
{ "q": "From when is shipping free?", "a": "It depends on the delivery country: Germany from €75, Austria and Luxembourg from €85, Switzerland from €100 order value above that we ship free of charge via DHL. Below that, shipping costs depend on the product, country and order value details on our Shipping & Payment page." },
{ "q": "Can I request custom or personalized items?", "a": "Yes, gladly! Just reach out via the contact form we'll see what's possible." },
{ "q": "How do I care for my handmade items?", "a": "Care instructions are listed on the respective product page. As our pieces are hand-crocheted or hand-knitted, we generally recommend gentle hand-washing at a low temperature, no tumble dryer, and drying flat to preserve shape and fibres." },
{ "q": "Which payment methods are accepted?", "a": "PayPal, Klarna, credit card (Visa & Mastercard) and bank transfer (prepayment)." },
{ "q": "Can I return my order?", "a": "The statutory 14-day right of withdrawal applies (see our withdrawal notice). For custom-made pieces tailored to you, the right of withdrawal may be excluded by law; for standard items from our range it applies as usual." },
{ "q": "Do I have to pay VAT?", "a": "No. Van's DIY & Bastelbedarf is a small business per §19 UStG no VAT is charged or shown." },
{ "q": "Do I need an account to order?", "a": "No, you can conveniently check out as a guest. An account is worthwhile though for order history, wishlist and shipment tracking all in one place." }
],
"ch": [
{ "q": "Wie lang geits bis d'Lieferig chunnt?", "a": "Normalerwiis 27 Werktäg innerhalb Dütschland, Öschterrych, dr Schwiz und Luxemburg. Bi Sondranfertigunge cha's chli länger gah das staht denn direkt uf dr Produktsyte." },
{ "q": "Ab wenn isch dr Versand gratis?", "a": "Das chunnt uf's Liferland a: Dütschland ab 75 €, Öschterrych und Luxemburg ab 85 €, d'Schwiz ab 100 € Warewärt drüber schicke mir gratis mit DHL. Drunder richte sich d'Versandchoschte nach Produkt, Land und Warewärt Details dezue findsch uf dr Syte Versand & Zahlig." },
{ "q": "Cha ich Sonderwünsch oder öppis Individuells bstelle?", "a": "Ja, gärn! Schrib eus eifach übers Kontaktformular mir luege, was geit." },
{ "q": "Wie pfläg ich mini vo Hang gmachte Sächeli?", "a": "D'gnaue Pflegehinwys stöh jewils uf dr Produktsyte. Wil eusi Sächeli vo Hang ghäklet oder gstrickt sind, empfähle mir grundsätzlich schonendi Handwösch bi niedriger Temperatur, kei Tumbler und liegend a dr Luft träechne, dass Form und Fase erhalte bliebe." },
{ "q": "Weli Zahligsarte werded akzeptiert?", "a": "PayPal, Klarna, Kreditkarte (Visa & Mastercard) und Banküberwysig (Vorusszahlig)." },
{ "q": "Cha ich mini Bschtellig zrugg gäh?", "a": "Es gilt das gsetzlichi 14-tägig Widerrufsrächt (lueg üsi Widerrufsbelehrig aa). Bi Sondranfertigunge, wo speziell uf dich gmacht sind, cha das Widerrufsrächt gsetzlich usgschlosse si, bi Standardartikel us eusem Sortimänt gilt's regulär." },
{ "q": "Muess ich Umsatzsteuer zahle?", "a": "Nei. Van's DIY & Bastelbedarf isch Kleinunternehmer gemäss §19 UStG es wird kei Umsatzsteuer berechnet und usgwiese." },
{ "q": "Bruuch ich es Kundekonto zum Bstelle?", "a": "Nei, du chasch au eifach als Gast bstelle. Es Konto lohnt sich aber für d'Bstellhistorie, d'Wunschlischte und d'Sändigsverfolgig a eim Ort." }
],
"fr": [
{ "q": "Combien de temps prend la livraison ?", "a": "Généralement 2 à 7 jours ouvrés en Allemagne, Autriche, Suisse et au Luxembourg. Pour les pièces sur mesure, cela peut prendre un peu plus de temps indiqué directement sur la page produit." },
{ "q": "À partir de quand la livraison est-elle gratuite ?", "a": "Cela dépend du pays de livraison : Allemagne à partir de 75 €, Autriche et Luxembourg à partir de 85 €, Suisse à partir de 100 € d'achat au-delà, nous livrons gratuitement via DHL. En dessous, les frais de port dépendent du produit, du pays et du montant de la commande détails sur notre page Livraison & Paiement." },
{ "q": "Puis-je commander une pièce personnalisée ?", "a": "Oui, avec plaisir ! Écrivez-nous simplement via le formulaire de contact nous verrons ce qui est possible." },
{ "q": "Comment entretenir mes produits faits main ?", "a": "Les instructions d'entretien figurent sur chaque page produit. Nos pièces étant crochetées ou tricotées à la main, nous recommandons en général un lavage à la main délicat à basse température, sans sèche-linge, et un séchage à plat pour préserver la forme et les fibres." },
{ "q": "Quels moyens de paiement sont acceptés ?", "a": "PayPal, Klarna, carte bancaire (Visa & Mastercard) et virement bancaire (paiement anticipé)." },
{ "q": "Puis-je retourner ma commande ?", "a": "Le droit de rétractation légal de 14 jours s'applique (voir notre notice de rétractation). Pour les pièces personnalisées sur mesure, le droit de rétractation peut être exclu par la loi ; pour les articles standards de notre gamme, il s'applique normalement." },
{ "q": "Dois-je payer la TVA ?", "a": "Non. Van's DIY & Bastelbedarf est une petite entreprise selon l'§19 UStG aucune TVA n'est calculée ni indiquée." },
{ "q": "Ai-je besoin d'un compte client pour commander ?", "a": "Non, vous pouvez aussi commander confortablement en tant qu'invité. Un compte est toutefois utile pour regrouper l'historique des commandes, la liste de souhaits et le suivi de livraison." }
]
}
+29
View File
@@ -0,0 +1,29 @@
{
"ustId": "",
"sections": [
{
"heading": "Angaben gemäß § 5 DDG",
"body": "[Vorname Nachname] („VanVan\")\nVan's DIY & Bastelbedarf\nEinzelunternehmen\n[Straße und Hausnummer]\n[PLZ Ort]\nDeutschland"
},
{
"heading": "Kontakt",
"body": "Telefon: [Telefonnummer]\nE-Mail: [E-Mail-Adresse]"
},
{
"heading": "Umsatzsteuer",
"body": "Gemäß §19 UStG wird als Kleinunternehmer keine Umsatzsteuer berechnet und ausgewiesen."
},
{
"heading": "Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV",
"body": "[Vorname Nachname], Anschrift wie oben."
},
{
"heading": "EU-Streitschlichtung",
"body": "Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: https://ec.europa.eu/consumers/odr/. Unsere E-Mail-Adresse finden Sie oben im Impressum."
},
{
"heading": "Verbraucherstreitbeilegung/Universalschlichtungsstelle",
"body": "Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen. [Ggf. anpassen, falls sich das ändert.]"
}
]
}
+6
View File
@@ -1,4 +1,10 @@
{
"freigrenze": {
"de": 75,
"at": 85,
"ch": 100,
"lu": 85
},
"de": [
{
"abWarenwert": 0,
+16
View File
@@ -0,0 +1,16 @@
{
"sections": [
{
"heading": "Widerrufsrecht",
"body": "Du hast das Recht, binnen vierzehn Tagen ohne Angabe von Gründen diesen Vertrag zu widerrufen. Die Widerrufsfrist beträgt vierzehn Tage ab dem Tag, an dem du oder ein von dir benannter Dritter, der nicht der Beförderer ist, die Waren in Besitz genommen hast bzw. hat.\n\nUm dein Widerrufsrecht auszuüben, musst du uns ([Vorname Nachname], Van's DIY & Bastelbedarf, [Anschrift], [E-Mail-Adresse]) mittels einer eindeutigen Erklärung (z. B. ein mit der Post versandter Brief oder E-Mail) über deinen Entschluss, diesen Vertrag zu widerrufen, informieren. Ein Muster-Widerrufsformular findest du unten auf dieser Seite verlinkt, das jedoch nicht vorgeschrieben ist.\n\nZur Wahrung der Widerrufsfrist reicht es aus, dass du die Mitteilung über die Ausübung des Widerrufsrechts vor Ablauf der Widerrufsfrist absendest."
},
{
"heading": "Folgen des Widerrufs",
"body": "Wenn du diesen Vertrag widerrufst, haben wir dir alle Zahlungen, die wir von dir erhalten haben, einschließlich der Lieferkosten (mit Ausnahme der zusätzlichen Kosten, die sich daraus ergeben, dass du eine andere Art der Lieferung als die von uns angebotene, günstigste Standardlieferung gewählt hast), unverzüglich und spätestens binnen vierzehn Tagen ab dem Tag zurückzuzahlen, an dem die Mitteilung über deinen Widerruf dieses Vertrags bei uns eingegangen ist. Für diese Rückzahlung verwenden wir dasselbe Zahlungsmittel, das du bei der ursprünglichen Transaktion eingesetzt hast, es sei denn, mit dir wurde ausdrücklich etwas anderes vereinbart; in keinem Fall werden dir wegen dieser Rückzahlung Entgelte berechnet.\n\nWir können die Rückzahlung verweigern, bis wir die Waren wieder zurückerhalten haben oder bis du den Nachweis erbracht hast, dass du die Waren zurückgesandt hast, je nachdem, welches der frühere Zeitpunkt ist.\n\nDu hast die Waren unverzüglich und in jedem Fall spätestens binnen vierzehn Tagen ab dem Tag, an dem du uns über den Widerruf dieses Vertrags unterrichtest, an uns zurückzusenden oder zu übergeben. Die Frist ist gewahrt, wenn du die Waren vor Ablauf der Frist von vierzehn Tagen absendest. Du trägst die unmittelbaren Kosten der Rücksendung der Waren.\n\nDu musst für einen etwaigen Wertverlust der Waren nur aufkommen, wenn dieser Wertverlust auf einen zur Prüfung der Beschaffenheit, Eigenschaften und Funktionsweise der Waren nicht notwendigen Umgang mit ihnen zurückzuführen ist."
},
{
"heading": "Ausschluss/vorzeitiges Erlöschen des Widerrufsrechts",
"body": "Das Widerrufsrecht besteht nicht bzw. erlischt vorzeitig unter anderem bei Verträgen zur Lieferung von Waren, die nicht vorgefertigt sind und für deren Herstellung eine individuelle Auswahl oder Bestimmung durch dich maßgeblich ist oder die eindeutig auf deine persönlichen Bedürfnisse zugeschnitten sind (§ 312g Abs. 2 Nr. 1 BGB) — z. B. bei individuellen Sonderanfertigungen auf Kundenwunsch. Bei Standardartikeln aus unserem Sortiment gilt das Widerrufsrecht regulär."
}
]
}
+19
View File
@@ -0,0 +1,19 @@
// FAQ-Inhalte — seit 03.08.2026 admin-editierbar (siehe public/admin/config.yml, Collection
// "faq") statt fest in src/i18n/ui.ts zu stehen, damit VanVan Fragen/Antworten selbst pflegen
// kann. Weiterhin in allen 4 Sprachen (DE/EN/CH/FR), je eigene Liste.
import type { Locale } from "../i18n/config";
// @ts-ignore -- JSON-Import, zur Build-Zeit von Astro/Vite aufgelöst
import faqRaw from "../content/faq.json";
export interface FaqEintrag {
q: string;
a: string;
}
const faq = faqRaw as Record<Locale, FaqEintrag[]>;
export function faqEintraege(lang: Locale): FaqEintrag[] {
return faq[lang] ?? faq.de ?? [];
}
+63
View File
@@ -0,0 +1,63 @@
// Rechtstexte (Impressum, AGB, Datenschutz, Widerrufsbelehrung) — seit 03.08.2026 admin-editierbar
// (siehe public/admin/config.yml, Collections "impressum"/"agb"/"datenschutz"/"widerruf") statt
// fest im Code zu stehen. Jede Seite besteht aus einer frei bearbeitbaren Liste von Abschnitten
// (Überschrift + Text) — so kann VanVan selbst Abschnitte ergänzen/ändern/löschen, wenn sich z.B.
// Gesetze ändern oder ein neuer Dienstleister hinzukommt, ohne dass Code angefasst werden muss.
// @ts-ignore -- JSON-Import, zur Build-Zeit von Astro/Vite aufgelöst
import impressumRaw from "../content/impressum.json";
// @ts-ignore
import agbRaw from "../content/agb.json";
// @ts-ignore
import datenschutzRaw from "../content/datenschutz.json";
// @ts-ignore
import widerrufRaw from "../content/widerruf.json";
export interface LegalSection {
heading: string;
body: string;
}
export interface LegalPage {
sections: LegalSection[];
}
export interface ImpressumDaten extends LegalPage {
/** USt-IdNr. — optional (Kleinunternehmer nach §19 UStG haben oft keine), admin-editierbar,
* bewusst als eigenes Feld statt Teil des freien Fließtexts, damit sie nicht versehentlich beim
* Bearbeiten des Umsatzsteuer-Absatzes mitgelöscht wird. */
ustId?: string;
}
export const impressum = impressumRaw as ImpressumDaten;
export const agb = agbRaw as LegalPage;
export const datenschutz = datenschutzRaw as LegalPage;
export const widerruf = widerrufRaw as LegalPage;
/** Wandelt einen frei im Adminbereich editierbaren Rechtstext-Absatz SICHER in HTML um:
* 1. Escaped zuerst konsequent ALLES (&, <, >) — ein Tippfehler mit einem "<" im Admin kann so
* nie das Seiten-Layout kaputt machen oder (im denkbar schlimmsten Fall) Schadcode einschleusen.
* 2. Verlinkt danach automatisch nackte URLs (z.B. den EU-Streitschlichtung-Link) zu echten,
* klickbaren <a>-Tags — ganz ohne dass VanVan im Admin HTML schreiben müsste.
* 3. Leerzeilen werden zu neuen Absätzen, einzelne Zeilenumbrüche zu <br> (z.B. für Adresszeilen). */
export function rechtstextAlsHtml(body: string): string {
const escaped = (body ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;");
const linkifiziert = escaped.replace(
/(https?:\/\/[^\s<]+)/g,
(url) => {
// Satzzeichen am Ende (Punkt, Komma, Klammer, ...) gehören zum Satz, nicht zum Link —
// sonst landet z.B. der Punkt am Satzende mit im href/Linktext.
const match = url.match(/^(.*?)([.,;:!?)]*)$/);
const [, reinerLink, satzzeichen] = match ?? [null, url, ""];
return `<a href="${reinerLink}" target="_blank" rel="noopener">${reinerLink}</a>${satzzeichen}`;
}
);
return linkifiziert
.split(/\n\s*\n/)
.filter((absatz) => absatz.trim().length > 0)
.map((absatz) => `<p>${absatz.trim().replace(/\n/g, "<br />")}</p>`)
.join("");
}
+20 -4
View File
@@ -1,5 +1,8 @@
// Versandkosten-Logik. Regeln (mit dem Nutzer am 02.08.2026 abgestimmt):
// 1. Warenkorb-Gesamtwert >= 75 € → Versand immer kostenlos, egal wie viele Produkte/Stück.
// Versandkosten-Logik. Regeln (mit dem Nutzer am 02.08.2026 abgestimmt, Freigrenze am
// 03.08.2026 auf länderspezifische Werte umgestellt — die tatsächlichen Versandkosten
// unterscheiden sich je nach Land zu stark, um eine einzige Grenze für alle zu rechtfertigen):
// 1. Warenkorb-Gesamtwert >= länderspezifischer Freigrenze → Versand immer kostenlos, egal wie
// viele Produkte/Stück (siehe FREIGRENZE_FALLBACK/freieVersandGrenze() unten).
// 2. Genau 1 Stück von genau 1 Produkt im Warenkorb → der am Produkt selbst hinterlegte
// Versandpreis für das Zielland gilt (falls hinterlegt, sonst Fallback auf die Staffel).
// 3. Alles andere (mehrere Produkte und/oder mehrere Stück) → Versandkosten-Staffel nach
@@ -16,6 +19,8 @@ export interface VersandStufe {
}
export interface Versandstaffel {
/** Versandkostenfreigrenze pro Land (€) — admin-editierbar, siehe config.yml "versandkosten". */
freigrenze?: Record<CountryCode, number>;
de: VersandStufe[];
at: VersandStufe[];
ch: VersandStufe[];
@@ -26,7 +31,18 @@ export interface Versandstaffel {
import versandstaffelRaw from "../content/versandstaffel.json";
export const versandstaffel = versandstaffelRaw as Versandstaffel;
export const FREE_SHIPPING_FROM = 75;
// Rückfallwerte, falls im Adminbereich (noch) keine Freigrenze hinterlegt ist — die aktuell
// gültigen, mit VanVan abgestimmten Standardwerte (03.08.2026): Deutschland 75 €, Österreich/
// Luxemburg 85 €, Schweiz 100 € (höhere Versandkosten in die Schweiz rechtfertigen eine höhere
// Freigrenze).
const FREIGRENZE_FALLBACK: Record<CountryCode, number> = { de: 75, at: 85, ch: 100, lu: 85 };
/** Versandkostenfreigrenze (€) für ein bestimmtes Land — admin-editierbar (siehe
* versandstaffel.json "freigrenze"), fällt bei fehlendem/unvollständigem Wert auf die
* abgestimmten Standardwerte zurück. */
export function freieVersandGrenze(land: CountryCode): number {
return versandstaffel.freigrenze?.[land] ?? FREIGRENZE_FALLBACK[land];
}
function tierLookup(land: CountryCode, warenwert: number): number {
const stufen = versandstaffel[land] ?? [];
@@ -57,7 +73,7 @@ export function berechneVersandkosten(
if (items.length === 0) return 0;
const warenwert = items.reduce((sum, i) => sum + i.preis * i.menge, 0);
if (warenwert >= FREE_SHIPPING_FROM) return 0;
if (warenwert >= freieVersandGrenze(land)) return 0;
const gesamtmenge = items.reduce((sum, i) => sum + i.menge, 0);
const istEinzelkauf = items.length === 1 && gesamtmenge === 1;
+20 -52
View File
@@ -9,7 +9,7 @@ export const ui = {
de: {
nav: { shop: "Shop", sale: "Sale", creative: "Über die Kreative", faq: "FAQ", contact: "Kontakt", account: "Mein Konto", login: "Anmelden" },
accountMenu: { myAccount: "Mein Konto", logout: "Abmelden" },
topbar: "Versandkostenfrei ab 75 € innerhalb DE/AT/CH/LU",
topbar: "Versandkostenfrei ab 75 € (DE) / 85 € (AT, LU) / 100 € (CH)",
footer: {
tagline: "Handgemacht mit Liebe Kreativität zum Verschenken und Selbstbehalten.",
shopHeading: "Shop", serviceHeading: "Service", legalHeading: "Rechtliches",
@@ -66,16 +66,8 @@ export const ui = {
},
faq: {
title: "Häufig gestellte Fragen",
items: [
{ q: "Wie lange dauert die Lieferung?", a: "In der Regel 27 Werktage innerhalb Deutschlands, Österreichs, der Schweiz und Luxemburgs. Bei Sonderanfertigungen kann es etwas länger dauern das steht dann direkt auf der Produktseite." },
{ q: "Ab wann ist der Versand kostenlos?", a: "Ab einem Warenwert von 75 € versenden wir innerhalb der belieferten Länder kostenfrei mit DHL. Darunter richten sich die Versandkosten nach Produkt, Land und Warenwert Details dazu findest du auf der Seite Versand & Zahlung." },
{ q: "Kann ich Sonderwünsche oder individuelle Anfertigungen bestellen?", a: "Ja, gerne! Schreib uns einfach über das Kontaktformular wir schauen, was möglich ist." },
{ q: "Wie pflege ich meine handgemachten Produkte?", a: "Die genauen Pflegehinweise stehen jeweils auf der Produktseite. Da unsere Stücke handgehäkelt bzw. handgestrickt sind, empfehlen wir grundsätzlich schonende Handwäsche bei niedriger Temperatur, keinen Trockner und liegend an der Luft trocknen, damit Form und Fasern erhalten bleiben." },
{ q: "Welche Zahlungsarten werden akzeptiert?", a: "PayPal, Klarna, Kreditkarte (Visa & Mastercard) und Banküberweisung (Vorkasse)." },
{ q: "Kann ich meine Bestellung zurückgeben?", a: "Es gilt das gesetzliche 14-tägige Widerrufsrecht (siehe unsere Widerrufsbelehrung). Bei individuell auf dich zugeschnittenen Sonderanfertigungen kann das Widerrufsrecht gesetzlich ausgeschlossen sein, bei Standardartikeln aus unserem Sortiment gilt es regulär." },
{ q: "Muss ich Umsatzsteuer zahlen?", a: "Nein. Van's DIY & Bastelbedarf ist Kleinunternehmer gemäß §19 UStG es wird keine Umsatzsteuer berechnet und ausgewiesen." },
{ q: "Brauche ich ein Kundenkonto zum Bestellen?", a: "Nein, du kannst auch bequem als Gast bestellen. Ein Konto lohnt sich aber für Bestellhistorie, Wunschliste und Sendungsverfolgung an einem Ort." },
],
// Inhalte (Fragen/Antworten) seit 03.08.2026 admin-editierbar in src/content/faq.json
// (siehe src/data/faq.ts) statt hier fest zu stehen.
},
contact: {
title: "Schreib uns", lead: "Fragen zu einem Produkt, deiner Bestellung oder eine individuelle Anfrage? Melde dich gerne!",
@@ -156,7 +148,7 @@ export const ui = {
shippingItems: [
"Versand ausschließlich mit DHL", "Lieferländer: Deutschland, Österreich, Schweiz, Luxemburg",
"Lieferzeit: 27 Werktage", "Versandkosten sind pro Produkt hinterlegt und zusätzlich nach Warenwert & Land gestaffelt",
"Versandkostenfrei ab 75 € Warenwert", "Der Versand erfolgt erst nach Zahlungseingang",
"Versandkostenfrei ab 75 € Warenwert (Deutschland), 85 € (Österreich, Luxemburg) bzw. 100 € (Schweiz)", "Der Versand erfolgt erst nach Zahlungseingang",
"Bei Lieferungen in die Schweiz können Schweizer Einfuhrumsatzsteuer und Zollgebühren anfallen, die von dir als Empfänger:in getragen werden",
],
paymentTitle: "💳 Zahlungsarten", paymentItems: ["PayPal", "Klarna", "Kreditkarte (Visa & Mastercard)", "Banküberweisung (Vorkasse)"],
@@ -202,7 +194,7 @@ export const ui = {
bankPlaceholder: "Die Bankverbindung wird dir nach Bestelleingang per E-Mail zugesendet.",
bankHolder: "Kontoinhaber:in", bankIban: "IBAN", bankBic: "BIC", bankBankName: "Bank",
shippingHintTitle: "Versandhinweis",
shippingHint: "Versand ausschließlich per DHL nach Deutschland, Österreich, Schweiz und Luxemburg. Lieferzeit 27 Werktage. Versandkostenfrei ab 75 €. Versand erst nach Zahlungseingang.",
shippingHint: "Versand ausschließlich per DHL nach Deutschland, Österreich, Schweiz und Luxemburg. Lieferzeit 27 Werktage. Versandkostenfrei ab 75 € (Deutschland), 85 € (Österreich, Luxemburg) bzw. 100 € (Schweiz). Versand erst nach Zahlungseingang.",
shippingLink: "Mehr zu Versand & Zahlung →",
thankYouEyebrow: "Danke", thankYouTitle: "Deine Bestellung ist eingegangen",
thankYouLead: "Das ist aktuell eine Demo-Bestätigung (Phase 1, ohne echte Zahlungsabwicklung). Sobald der echte Checkout live ist, bekommst du hier und per E-Mail eine richtige Bestellbestätigung.",
@@ -321,7 +313,7 @@ export const ui = {
en: {
nav: { shop: "Shop", sale: "Sale", creative: "About the Maker", faq: "FAQ", contact: "Contact", account: "My Account", login: "Sign in" },
accountMenu: { myAccount: "My Account", logout: "Sign out" },
topbar: "Free shipping from €75 within DE/AT/CH/LU",
topbar: "Free shipping from €75 (DE) / €85 (AT, LU) / €100 (CH)",
footer: {
tagline: "Handmade with love creativity to gift and to keep.",
shopHeading: "Shop", serviceHeading: "Service", legalHeading: "Legal",
@@ -378,16 +370,8 @@ export const ui = {
},
faq: {
title: "Frequently Asked Questions",
items: [
{ q: "How long does delivery take?", a: "Usually 27 business days within Germany, Austria, Switzerland and Luxembourg. Custom pieces may take a little longer noted directly on the product page." },
{ q: "From when is shipping free?", a: "From an order value of €75 we ship free of charge via DHL within the countries we deliver to. Below that, shipping costs depend on the product, country and order value details on our Shipping & Payment page." },
{ q: "Can I request custom or personalized items?", a: "Yes, gladly! Just reach out via the contact form we'll see what's possible." },
{ q: "How do I care for my handmade items?", a: "Care instructions are listed on the respective product page. As our pieces are hand-crocheted or hand-knitted, we generally recommend gentle hand-washing at a low temperature, no tumble dryer, and drying flat to preserve shape and fibres." },
{ q: "Which payment methods are accepted?", a: "PayPal, Klarna, credit card (Visa & Mastercard) and bank transfer (prepayment)." },
{ q: "Can I return my order?", a: "The statutory 14-day right of withdrawal applies (see our withdrawal notice). For custom-made pieces tailored to you, the right of withdrawal may be excluded by law; for standard items from our range it applies as usual." },
{ q: "Do I have to pay VAT?", a: "No. Van's DIY & Bastelbedarf is a small business per §19 UStG no VAT is charged or shown." },
{ q: "Do I need an account to order?", a: "No, you can conveniently check out as a guest. An account is worthwhile though for order history, wishlist and shipment tracking all in one place." },
],
// Content (questions/answers) admin-editable since 03.08.2026 in src/content/faq.json
// (see src/data/faq.ts) instead of hardcoded here.
},
contact: {
title: "Get in touch", lead: "Questions about a product, your order, or a custom request? Feel free to reach out!",
@@ -468,7 +452,7 @@ export const ui = {
shippingItems: [
"Shipped exclusively via DHL", "Countries we deliver to: Germany, Austria, Switzerland, Luxembourg",
"Delivery time: 27 business days", "Shipping costs are set per product and further tiered by order value & country",
"Free shipping from €75 order value", "Shipping only starts after payment has been received",
"Free shipping from €75 order value (Germany), €85 (Austria, Luxembourg) or €100 (Switzerland)", "Shipping only starts after payment has been received",
"Deliveries to Switzerland may be subject to Swiss import VAT and customs fees, payable by you as the recipient",
],
paymentTitle: "💳 Payment methods", paymentItems: ["PayPal", "Klarna", "Credit card (Visa & Mastercard)", "Bank transfer (prepayment)"],
@@ -514,7 +498,7 @@ export const ui = {
bankPlaceholder: "Bank details will be sent to you by email after your order.",
bankHolder: "Account holder", bankIban: "IBAN", bankBic: "BIC", bankBankName: "Bank",
shippingHintTitle: "Shipping note",
shippingHint: "Shipped exclusively via DHL to Germany, Austria, Switzerland and Luxembourg. Delivery time 27 business days. Free shipping from €75. Shipping only starts after payment has been received.",
shippingHint: "Shipped exclusively via DHL to Germany, Austria, Switzerland and Luxembourg. Delivery time 27 business days. Free shipping from €75 (Germany), €85 (Austria, Luxembourg) or €100 (Switzerland). Shipping only starts after payment has been received.",
shippingLink: "More on shipping & payment →",
thankYouEyebrow: "Thank you", thankYouTitle: "Your order has been received",
thankYouLead: "This is currently a demo confirmation (Phase 1, no real payment processing). Once the real checkout is live, you'll receive a proper order confirmation here and by email.",
@@ -633,7 +617,7 @@ export const ui = {
ch: {
nav: { shop: "Shop", sale: "Aktion", creative: "Über d'Kreativi", faq: "FAQ", contact: "Kontakt", account: "Mis Konto", login: "Aamälde" },
accountMenu: { myAccount: "Mis Konto", logout: "Abmälde" },
topbar: "Gratisversand ab 75 € innerhalb DE/AT/CH/LU",
topbar: "Gratisversand ab 75 € (DE) / 85 € (AT, LU) / 100 € (CH)",
footer: {
tagline: "Vo Hang gmacht mit Härz Sächeli zum Verschänke und Sälber Bhalte.",
shopHeading: "Shop", serviceHeading: "Service", legalHeading: "Rechtligs",
@@ -690,16 +674,8 @@ export const ui = {
},
faq: {
title: "Häufigi Frage",
items: [
{ q: "Wie lang geits bis d'Lieferig chunnt?", a: "Normalerwiis 27 Werktäg innerhalb Dütschland, Öschterrych, dr Schwiz und Luxemburg. Bi Sondranfertigunge cha's chli länger gah das staht denn direkt uf dr Produktsyte." },
{ q: "Ab wenn isch dr Versand gratis?", a: "Ab emene Warewärt vo 75 € schicke mir innerhalb vo de belieferte Länder gratis mit DHL. Drunder richte sich d'Versandchoschte nach Produkt, Land und Warewärt Details dezue findsch uf dr Syte Versand & Zahlig." },
{ q: "Cha ich Sonderwünsch oder öppis Individuells bstelle?", a: "Ja, gärn! Schrib eus eifach übers Kontaktformular mir luege, was geit." },
{ q: "Wie pfläg ich mini vo Hang gmachte Sächeli?", a: "D'gnaue Pflegehinwys stöh jewils uf dr Produktsyte. Wil eusi Sächeli vo Hang ghäklet oder gstrickt sind, empfähle mir grundsätzlich schonendi Handwösch bi niedriger Temperatur, kei Tumbler und liegend a dr Luft träechne, dass Form und Fase erhalte bliebe." },
{ q: "Weli Zahligsarte werded akzeptiert?", a: "PayPal, Klarna, Kreditkarte (Visa & Mastercard) und Banküberwysig (Vorusszahlig)." },
{ q: "Cha ich mini Bschtellig zrugg gäh?", a: "Es gilt das gsetzlichi 14-tägig Widerrufsrächt (lueg üsi Widerrufsbelehrig aa). Bi Sondranfertigunge, wo speziell uf dich gmacht sind, cha das Widerrufsrächt gsetzlich usgschlosse si, bi Standardartikel us eusem Sortimänt gilt's regulär." },
{ q: "Muess ich Umsatzsteuer zahle?", a: "Nei. Van's DIY & Bastelbedarf isch Kleinunternehmer gemäss §19 UStG es wird kei Umsatzsteuer berechnet und usgwiese." },
{ q: "Bruuch ich es Kundekonto zum Bstelle?", a: "Nei, du chasch au eifach als Gast bstelle. Es Konto lohnt sich aber für d'Bstellhistorie, d'Wunschlischte und d'Sändigsverfolgig a eim Ort." },
],
// Inhalt (Frage/Antwort) sit 03.08.2026 admin-editierbar in src/content/faq.json (lueg
// src/data/faq.ts) statt fescht do z'stah.
},
contact: {
title: "Schrib eus", lead: "Hesch Frage zu emene Produkt, dinere Bschtellig oder öppis Spezielles? Mäld dich gärn!",
@@ -780,7 +756,7 @@ export const ui = {
shippingItems: [
"Versand nume mit DHL", "Lieferländer: Dütschland, Öschterrych, d'Schwiz, Luxemburg",
"Lieferzyt: 27 Werktäg", "Versandchoschte sind pro Produkt hinterlegt und zuesätzlich nach Warewärt & Land gstaffelt",
"Gratisversand ab 75 € Warewärt", "Dr Versand geit erscht los, wenn d'Zahlig igange isch",
"Gratisversand ab 75 € Warewärt (Dütschland), 85 € (Öschterrych, Luxemburg) bzw. 100 € (Schwiz)", "Dr Versand geit erscht los, wenn d'Zahlig igange isch",
"Bi Liefrige i d'Schwiz chöi schwyzerischi Iifuehrumsatzsteuer und Zollgebühre afalle, wo du als Empfänger:in trage muesch",
],
paymentTitle: "💳 Zahligsarte", paymentItems: ["PayPal", "Klarna", "Kreditkarte (Visa & Mastercard)", "Banküberwysig (Vorusszahlig)"],
@@ -826,7 +802,7 @@ export const ui = {
bankPlaceholder: "D'Bankverbindig wird dir nach Bstelligang per E-Mail zuegschickt.",
bankHolder: "Kontoinhaber:in", bankIban: "IBAN", bankBic: "BIC", bankBankName: "Bank",
shippingHintTitle: "Versandhinwys",
shippingHint: "Versand nume per DHL nach Dütschland, Öschterrych, d'Schwiz und Luxemburg. Lieferzyt 27 Werktäg. Gratisversand ab 75 €. Dr Versand geit erscht los, wenn d'Zahlig igange isch.",
shippingHint: "Versand nume per DHL nach Dütschland, Öschterrych, d'Schwiz und Luxemburg. Lieferzyt 27 Werktäg. Gratisversand ab 75 € (Dütschland), 85 € (Öschterrych, Luxemburg) bzw. 100 € (Schwiz). Dr Versand geit erscht los, wenn d'Zahlig igange isch.",
shippingLink: "Meh zu Versand & Zahlig →",
thankYouEyebrow: "Merci", thankYouTitle: "Dini Bschtellig isch igange",
thankYouLead: "Das isch momentan e Demo-Bstätigung (Phase 1, ohni echti Zahligsabwicklig). Sobald dr echt Checkout live isch, überchunnsch du da und per E-Mail e richtigi Bstellbstätigung.",
@@ -945,7 +921,7 @@ export const ui = {
fr: {
nav: { shop: "Boutique", sale: "Soldes", creative: "À propos de la créatrice", faq: "FAQ", contact: "Contact", account: "Mon compte", login: "Se connecter" },
accountMenu: { myAccount: "Mon compte", logout: "Se déconnecter" },
topbar: "Livraison gratuite dès 75 € en DE/AT/CH/LU",
topbar: "Livraison gratuite dès 75 € (DE) / 85 € (AT, LU) / 100 € (CH)",
footer: {
tagline: "Fait main avec amour de la créativité à offrir ou à garder.",
shopHeading: "Boutique", serviceHeading: "Service", legalHeading: "Mentions légales",
@@ -1002,16 +978,8 @@ export const ui = {
},
faq: {
title: "Questions fréquentes",
items: [
{ q: "Combien de temps prend la livraison ?", a: "Généralement 2 à 7 jours ouvrés en Allemagne, Autriche, Suisse et au Luxembourg. Pour les pièces sur mesure, cela peut prendre un peu plus de temps indiqué directement sur la page produit." },
{ q: "À partir de quand la livraison est-elle gratuite ?", a: "À partir de 75 € d'achat, nous livrons gratuitement via DHL dans les pays desservis. En dessous, les frais de port dépendent du produit, du pays et du montant de la commande détails sur notre page Livraison & Paiement." },
{ q: "Puis-je commander une pièce personnalisée ?", a: "Oui, avec plaisir ! Écrivez-nous simplement via le formulaire de contact nous verrons ce qui est possible." },
{ q: "Comment entretenir mes produits faits main ?", a: "Les instructions d'entretien figurent sur chaque page produit. Nos pièces étant crochetées ou tricotées à la main, nous recommandons en général un lavage à la main délicat à basse température, sans sèche-linge, et un séchage à plat pour préserver la forme et les fibres." },
{ q: "Quels moyens de paiement sont acceptés ?", a: "PayPal, Klarna, carte bancaire (Visa & Mastercard) et virement bancaire (paiement anticipé)." },
{ q: "Puis-je retourner ma commande ?", a: "Le droit de rétractation légal de 14 jours s'applique (voir notre notice de rétractation). Pour les pièces personnalisées sur mesure, le droit de rétractation peut être exclu par la loi ; pour les articles standards de notre gamme, il s'applique normalement." },
{ q: "Dois-je payer la TVA ?", a: "Non. Van's DIY & Bastelbedarf est une petite entreprise selon l'§19 UStG aucune TVA n'est calculée ni indiquée." },
{ q: "Ai-je besoin d'un compte client pour commander ?", a: "Non, vous pouvez aussi commander confortablement en tant qu'invité. Un compte est toutefois utile pour regrouper l'historique des commandes, la liste de souhaits et le suivi de livraison." },
],
// Contenu (questions/réponses) modifiable depuis l'admin depuis le 03.08.2026 dans
// src/content/faq.json (voir src/data/faq.ts) au lieu d'être codé en dur ici.
},
contact: {
title: "Écrivez-nous", lead: "Des questions sur un produit, votre commande ou une demande personnalisée ? N'hésitez pas à nous contacter !",
@@ -1092,7 +1060,7 @@ export const ui = {
shippingItems: [
"Livraison exclusivement par DHL", "Pays livrés : Allemagne, Autriche, Suisse, Luxembourg",
"Délai de livraison : 2 à 7 jours ouvrés", "Les frais de port sont définis par produit et échelonnés selon la valeur de la commande et le pays",
"Livraison gratuite dès 75 € d'achat", "L'expédition n'a lieu qu'après réception du paiement",
"Livraison gratuite dès 75 € d'achat (Allemagne), 85 € (Autriche, Luxembourg) ou 100 € (Suisse)", "L'expédition n'a lieu qu'après réception du paiement",
"Pour les livraisons en Suisse, la TVA à l'importation suisse et des frais de douane peuvent s'appliquer, à la charge du/de la destinataire",
],
paymentTitle: "💳 Moyens de paiement", paymentItems: ["PayPal", "Klarna", "Carte bancaire (Visa & Mastercard)", "Virement bancaire (paiement anticipé)"],
@@ -1138,7 +1106,7 @@ export const ui = {
bankPlaceholder: "Les coordonnées bancaires vous seront envoyées par e-mail après votre commande.",
bankHolder: "Titulaire du compte", bankIban: "IBAN", bankBic: "BIC", bankBankName: "Banque",
shippingHintTitle: "Remarque sur la livraison",
shippingHint: "Livraison exclusivement par DHL en Allemagne, Autriche, Suisse et au Luxembourg. Délai de livraison 2 à 7 jours ouvrés. Livraison gratuite dès 75 €. L'expédition n'a lieu qu'après réception du paiement.",
shippingHint: "Livraison exclusivement par DHL en Allemagne, Autriche, Suisse et au Luxembourg. Délai de livraison 2 à 7 jours ouvrés. Livraison gratuite dès 75 € (Allemagne), 85 € (Autriche, Luxembourg) ou 100 € (Suisse). L'expédition n'a lieu qu'après réception du paiement.",
shippingLink: "En savoir plus sur la livraison & le paiement →",
thankYouEyebrow: "Merci", thankYouTitle: "Votre commande a bien été reçue",
thankYouLead: "Ceci est actuellement une confirmation de démonstration (phase 1, sans traitement réel du paiement). Une fois le vrai paiement en ligne, vous recevrez ici et par e-mail une véritable confirmation de commande.",
+9 -65
View File
@@ -1,5 +1,6 @@
---
import Layout from "../../layouts/Layout.astro";
import { agb, rechtstextAlsHtml } from "../../data/legal";
---
<Layout title="Allgemeine Geschäftsbedingungen (AGB)" path="/agb/" legalOnly={true}>
<section class="section-tight">
@@ -7,73 +8,16 @@ import Layout from "../../layouts/Layout.astro";
<h1>Allgemeine Geschäftsbedingungen</h1>
<div class="legal-note">
⚠️ <strong>Muster-Text.</strong> Vorbereiteter Platzhalter, ersetzt keine rechtliche
Prüfung durch eine fachkundige Stelle vor Veröffentlichung.
Prüfung durch eine fachkundige Stelle vor Veröffentlichung — im Adminbereich unter
„⚖️ Rechtstexte & FAQ" bearbeitbar.
</div>
<h2>§ 1 Geltungsbereich</h2>
<p>
Diese Allgemeinen Geschäftsbedingungen gelten für alle Bestellungen, die Verbraucher über
den Onlineshop von Van's DIY & Bastelbedarf (Einzelunternehmen, [Anschrift]) aufgeben.
</p>
<h2>§ 2 Vertragspartner, Vertragsschluss</h2>
<p>
Der Kaufvertrag kommt zustande mit Van's DIY & Bastelbedarf. Die Darstellung der Produkte
im Shop stellt kein rechtlich bindendes Angebot dar, sondern eine unverbindliche
Aufforderung, ein Angebot abzugeben. Mit Anklicken des Buttons „Jetzt zahlungspflichtig
bestellen" gibst du ein verbindliches Angebot zum Kauf ab. Wir bestätigen den Eingang
deiner Bestellung per E-Mail; diese Bestätigung stellt noch keine Vertragsannahme dar. Der
Vertrag kommt erst mit unserer gesonderten Auftragsbestätigung oder Versand der Ware
zustande.
</p>
<h2>§ 3 Preise und Versandkosten</h2>
<p>
Alle angegebenen Preise verstehen sich als Endpreise. Gemäß §19 UStG wird als
Kleinunternehmer keine Umsatzsteuer berechnet und ausgewiesen. Es kommen ggf.
Versandkosten hinzu, die im Bestellprozess vor Abschluss der Bestellung ausgewiesen
werden. Ab einem Warenwert von 75 € liefern wir versandkostenfrei.
</p>
<h2>§ 4 Zahlung</h2>
<p>Die Zahlung erfolgt wahlweise per PayPal, Klarna, Kreditkarte (Visa & Mastercard) oder Banküberweisung (Vorkasse).</p>
<h2>§ 5 Lieferung</h2>
<p>
Die Lieferung erfolgt ausschließlich mit DHL innerhalb Deutschlands, Österreichs, der
Schweiz und Luxemburgs. Die Lieferzeit beträgt in der Regel 27 Werktage nach
Zahlungseingang.
</p>
<h2>§ 6 Eigentumsvorbehalt</h2>
<p>Bis zur vollständigen Bezahlung bleibt die gelieferte Ware unser Eigentum.</p>
<h2>§ 7 Widerrufsrecht</h2>
<p>
Es gilt das gesetzliche Widerrufsrecht für Verbraucher gemäß unserer gesonderten
Widerrufsbelehrung. Bei Waren, die nach Kundenspezifikation angefertigt oder eindeutig auf
die persönlichen Bedürfnisse zugeschnitten sind, kann das Widerrufsrecht gemäß § 312g Abs.
2 Nr. 1 BGB ausgeschlossen sein.
</p>
<h2>§ 8 Gewährleistung</h2>
<p>Es gilt das gesetzliche Mängelhaftungsrecht.</p>
<h2>§ 9 Streitbeilegung</h2>
<p>
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:
<a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>.
Wir sind nicht verpflichtet und nicht bereit, an einem Streitbeilegungsverfahren vor einer
Verbraucherschlichtungsstelle teilzunehmen.
</p>
<h2>§ 10 Schlussbestimmungen</h2>
<p>
Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts. Hast
du als Verbraucher:in deinen gewöhnlichen Aufenthalt in einem anderen EU-Mitgliedstaat,
bleiben die zwingenden Verbraucherschutzvorschriften dieses Staates von dieser
Rechtswahl unberührt.
</p>
{agb.sections.map((s) => (
<>
<h2>{s.heading}</h2>
<Fragment set:html={rechtstextAlsHtml(s.body)} />
</>
))}
</div>
</section>
</Layout>
+3 -1
View File
@@ -2,9 +2,11 @@
import Layout from "../../../layouts/Layout.astro";
import type { Locale } from "../../../i18n/config";
import { useTranslations } from "../../../i18n/ui";
import { faqEintraege } from "../../../data/faq";
const lang: Locale = "ch";
const t = useTranslations(lang);
const items = faqEintraege(lang);
---
<Layout title="FAQ" description="Häufigi Frage zu Van's DIY & Bastelbedarf." lang={lang} path="/faq/">
<section class="section-tight">
@@ -15,7 +17,7 @@ const t = useTranslations(lang);
</section>
<section class="section-tight">
<div class="container faq-list">
{t.faq.items.map((f) => (
{items.map((f) => (
<details class="card faq-item">
<summary>{f.q}</summary>
<p class="small">{f.a}</p>
+5 -4
View File
@@ -78,19 +78,19 @@ const t = useTranslations(lang);
</section>
</Layout>
<script define:vars={{ freeShipFrom: 75, removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
<script define:vars={{ removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
// WICHTIG: define:vars-Skripte laufen als IIFE, keine "import"-Anweisungen möglich.
window.__cartVars = { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
window.__cartVars = { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
</script>
<script type="module">
import { getCart, updateQuantity, removeFromCart, cartTotal, appliedCoupon, couponDiscount, setCouponCode, clearCoupon, appliedPartnerCode, partnerCodeDiscount, setPartnerCode, clearPartnerCode, totalDiscount, treuebonusDiscount, aboDiscount, istAusgewaehlt, setAusgewaehlt, zeilenpreisFuer } from "../../../scripts/cart";
import { formatPrice } from "../../../i18n/format";
import { getProduct, products } from "../../../data/products";
import { berechneVersandkosten } from "../../../data/versand";
import { berechneVersandkosten, freieVersandGrenze } from "../../../data/versand";
import { mengenrabattProzent } from "../../../data/rabatt";
import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scripts/account";
const { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const landSelect = document.getElementById("cart-land");
function render() {
@@ -177,6 +177,7 @@ import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scr
).join("");
const subtotal = cartTotal();
const freeShipFrom = freieVersandGrenze(landSelect.value);
const remaining = Math.max(0, freeShipFrom - subtotal);
const shipping = berechneVersandkosten(landSelect.value, ausgewaehlteZeilen.map(({ item: i }) => ({ slug: i.slug, preis: i.preis, menge: i.menge })), products);
const coupon = appliedCoupon();
+9 -79
View File
@@ -1,5 +1,6 @@
---
import Layout from "../../layouts/Layout.astro";
import { datenschutz, rechtstextAlsHtml } from "../../data/legal";
---
<Layout title="Datenschutzerklärung" path="/datenschutz/" legalOnly={true}>
<section class="section-tight">
@@ -8,87 +9,16 @@ import Layout from "../../layouts/Layout.astro";
<div class="legal-note">
⚠️ <strong>Muster-Text.</strong> Vorbereiteter Platzhalter, ersetzt keine rechtliche
Prüfung. Vor Veröffentlichung an die tatsächlich eingesetzten Dienste (z. B. konkreter
Hosting-Anbieter, Zahlungsdienstleister, Versandtool) anpassen und rechtlich prüfen lassen.
Hosting-Anbieter, Zahlungsdienstleister, Versandtool) anpassen und rechtlich prüfen
lassen — im Adminbereich unter „⚖️ Rechtstexte & FAQ" bearbeitbar.
</div>
<h2>1. Verantwortlicher</h2>
<p>[Vorname Nachname], Van's DIY & Bastelbedarf, [Anschrift], [E-Mail-Adresse]</p>
<h2>2. Allgemeines zur Datenverarbeitung</h2>
<p>
Wir verarbeiten personenbezogene Daten unserer Nutzer grundsätzlich nur, soweit dies zur
Bereitstellung einer funktionsfähigen Website sowie unserer Inhalte und Leistungen
erforderlich ist, auf Grundlage der Art. 6 Abs. 1 lit. a, b und f DSGVO.
</p>
<h2>3. Hosting</h2>
<p>
Diese Website wird bei einem externen Dienstleister gehostet (Hoster). Die personenbezogenen
Daten, die auf dieser Website erfasst werden, werden auf den Servern des Hosters
gespeichert. [Konkreten Hosting-Anbieter, z. B. Cloudflare Pages, hier ergänzen inkl.
Standort der Server und ggf. Auftragsverarbeitungsvertrag.]
</p>
<h2>4. Bestellabwicklung</h2>
<p>
Zur Abwicklung deiner Bestellung erheben und verarbeiten wir personenbezogene Daten, wenn
dies zur Erfüllung des Vertrags erforderlich ist (Art. 6 Abs. 1 lit. b DSGVO). Dazu gehören
Name, Anschrift, E-Mail-Adresse und Zahlungsdaten. Die Daten werden ausschließlich zur
Vertragsabwicklung genutzt.
</p>
<h2>5. Zahlungsdienstleister</h2>
<p>
Je nach gewählter Zahlungsart geben wir Daten an die eingesetzten Zahlungsdienstleister
weiter (PayPal, Klarna, Kreditkartenanbieter). Es gelten deren jeweils eigene
Datenschutzhinweise. Bei Banküberweisung werden Daten an unser kontoführendes
Kreditinstitut übermittelt.
</p>
<h2>6. Kontaktformular</h2>
<p>
Wenn du uns über das Kontaktformular oder per E-Mail Anfragen zukommen lässt, werden deine
Angaben aus dem Anfrageformular inklusive der von dir dort angegebenen Kontaktdaten zwecks
Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Die
Verarbeitung dieser Daten erfolgt auf Grundlage deiner Einwilligung (Art. 6 Abs. 1 lit. a
DSGVO) bzw., sofern die Anfrage der Anbahnung eines Vertrags dient, auf Grundlage des
Art. 6 Abs. 1 lit. b DSGVO. Eine erteilte Einwilligung kannst du jederzeit mit Wirkung für
die Zukunft widerrufen, etwa per E-Mail an die oben genannte Adresse.
</p>
<h2>7. Cookies</h2>
<p>
Diese Website verwendet, soweit technisch erforderlich, Cookies zur Bereitstellung des
Warenkorbs. Weitere, nicht zwingend erforderliche Cookies (z. B. Statistik/Marketing)
werden nur nach vorheriger Einwilligung gesetzt. [Cookie-Banner/Consent-Tool ergänzen,
sobald solche Cookies tatsächlich eingesetzt werden.]
</p>
<h2>8. Deine Rechte</h2>
<p>
Du hast jederzeit das Recht auf Auskunft (Art. 15 DSGVO), Berichtigung (Art. 16 DSGVO),
Löschung (Art. 17 DSGVO), Einschränkung der Verarbeitung (Art. 18 DSGVO),
Datenübertragbarkeit (Art. 20 DSGVO) und Widerspruch gegen die Verarbeitung deiner
personenbezogenen Daten (Art. 21 DSGVO). Soweit die Verarbeitung auf deiner Einwilligung
beruht, kannst du diese jederzeit mit Wirkung für die Zukunft widerrufen (Art. 7 Abs. 3
DSGVO), ohne dass die Rechtmäßigkeit der bis zum Widerruf erfolgten Verarbeitung berührt
wird. Außerdem hast du das Recht, dich bei einer Datenschutz-Aufsichtsbehörde zu
beschweren — insbesondere in dem Mitgliedstaat deines gewöhnlichen Aufenthaltsorts,
deines Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes.
</p>
<h2>9. Automatisierte Entscheidungsfindung</h2>
<p>
Wir setzen keine automatisierte Entscheidungsfindung einschließlich Profiling im Sinne
von Art. 22 DSGVO ein.
</p>
<h2>10. Speicherdauer</h2>
<p>
Wir speichern personenbezogene Daten nur so lange, wie es für den jeweiligen Zweck
erforderlich ist oder gesetzliche Aufbewahrungsfristen (insbesondere handels- und
steuerrechtlich) dies vorschreiben.
</p>
{datenschutz.sections.map((s) => (
<>
<h2>{s.heading}</h2>
<Fragment set:html={rechtstextAlsHtml(s.body)} />
</>
))}
</div>
</section>
</Layout>
+3 -1
View File
@@ -2,9 +2,11 @@
import Layout from "../../../layouts/Layout.astro";
import type { Locale } from "../../../i18n/config";
import { useTranslations } from "../../../i18n/ui";
import { faqEintraege } from "../../../data/faq";
const lang: Locale = "en";
const t = useTranslations(lang);
const items = faqEintraege(lang);
---
<Layout title="FAQ" description="Frequently asked questions about Van's DIY & Bastelbedarf." lang={lang} path="/faq/">
<section class="section-tight">
@@ -15,7 +17,7 @@ const t = useTranslations(lang);
</section>
<section class="section-tight">
<div class="container faq-list">
{t.faq.items.map((f) => (
{items.map((f) => (
<details class="card faq-item">
<summary>{f.q}</summary>
<p class="small">{f.a}</p>
+5 -4
View File
@@ -78,19 +78,19 @@ const t = useTranslations(lang);
</section>
</Layout>
<script define:vars={{ freeShipFrom: 75, removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
<script define:vars={{ removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
// WICHTIG: define:vars-Skripte laufen als IIFE, keine "import"-Anweisungen möglich.
window.__cartVars = { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
window.__cartVars = { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
</script>
<script type="module">
import { getCart, updateQuantity, removeFromCart, cartTotal, appliedCoupon, couponDiscount, setCouponCode, clearCoupon, appliedPartnerCode, partnerCodeDiscount, setPartnerCode, clearPartnerCode, totalDiscount, treuebonusDiscount, aboDiscount, istAusgewaehlt, setAusgewaehlt, zeilenpreisFuer } from "../../../scripts/cart";
import { formatPrice } from "../../../i18n/format";
import { getProduct, products } from "../../../data/products";
import { berechneVersandkosten } from "../../../data/versand";
import { berechneVersandkosten, freieVersandGrenze } from "../../../data/versand";
import { mengenrabattProzent } from "../../../data/rabatt";
import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scripts/account";
const { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const landSelect = document.getElementById("cart-land");
function render() {
@@ -177,6 +177,7 @@ import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scr
).join("");
const subtotal = cartTotal();
const freeShipFrom = freieVersandGrenze(landSelect.value);
const remaining = Math.max(0, freeShipFrom - subtotal);
const shipping = berechneVersandkosten(landSelect.value, ausgewaehlteZeilen.map(({ item: i }) => ({ slug: i.slug, preis: i.preis, menge: i.menge })), products);
const coupon = appliedCoupon();
+3 -1
View File
@@ -2,9 +2,11 @@
import Layout from "../../layouts/Layout.astro";
import type { Locale } from "../../i18n/config";
import { useTranslations } from "../../i18n/ui";
import { faqEintraege } from "../../data/faq";
const lang: Locale = "de";
const t = useTranslations(lang);
const items = faqEintraege(lang);
---
<Layout title="FAQ" description="Häufig gestellte Fragen zu Van's DIY & Bastelbedarf." lang={lang} path="/faq/">
<section class="section-tight">
@@ -15,7 +17,7 @@ const t = useTranslations(lang);
</section>
<section class="section-tight">
<div class="container faq-list">
{t.faq.items.map((f) => (
{items.map((f) => (
<details class="card faq-item">
<summary>{f.q}</summary>
<p class="small">{f.a}</p>
+3 -1
View File
@@ -2,9 +2,11 @@
import Layout from "../../../layouts/Layout.astro";
import type { Locale } from "../../../i18n/config";
import { useTranslations } from "../../../i18n/ui";
import { faqEintraege } from "../../../data/faq";
const lang: Locale = "fr";
const t = useTranslations(lang);
const items = faqEintraege(lang);
---
<Layout title="FAQ" description="Questions fréquentes sur Van's DIY & Bastelbedarf." lang={lang} path="/faq/">
<section class="section-tight">
@@ -15,7 +17,7 @@ const t = useTranslations(lang);
</section>
<section class="section-tight">
<div class="container faq-list">
{t.faq.items.map((f) => (
{items.map((f) => (
<details class="card faq-item">
<summary>{f.q}</summary>
<p class="small">{f.a}</p>
+5 -4
View File
@@ -78,19 +78,19 @@ const t = useTranslations(lang);
</section>
</Layout>
<script define:vars={{ freeShipFrom: 75, removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
<script define:vars={{ removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
// WICHTIG: define:vars-Skripte laufen als IIFE, keine "import"-Anweisungen möglich.
window.__cartVars = { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
window.__cartVars = { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
</script>
<script type="module">
import { getCart, updateQuantity, removeFromCart, cartTotal, appliedCoupon, couponDiscount, setCouponCode, clearCoupon, appliedPartnerCode, partnerCodeDiscount, setPartnerCode, clearPartnerCode, totalDiscount, treuebonusDiscount, aboDiscount, istAusgewaehlt, setAusgewaehlt, zeilenpreisFuer } from "../../../scripts/cart";
import { formatPrice } from "../../../i18n/format";
import { getProduct, products } from "../../../data/products";
import { berechneVersandkosten } from "../../../data/versand";
import { berechneVersandkosten, freieVersandGrenze } from "../../../data/versand";
import { mengenrabattProzent } from "../../../data/rabatt";
import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scripts/account";
const { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const landSelect = document.getElementById("cart-land");
function render() {
@@ -177,6 +177,7 @@ import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../../scr
).join("");
const subtotal = cartTotal();
const freeShipFrom = freieVersandGrenze(landSelect.value);
const remaining = Math.max(0, freeShipFrom - subtotal);
const shipping = berechneVersandkosten(landSelect.value, ausgewaehlteZeilen.map(({ item: i }) => ({ slug: i.slug, preis: i.preis, menge: i.menge })), products);
const coupon = appliedCoupon();
+15 -34
View File
@@ -1,5 +1,6 @@
---
import Layout from "../../layouts/Layout.astro";
import { impressum, rechtstextAlsHtml } from "../../data/legal";
---
<Layout title="Impressum" path="/impressum/" legalOnly={true}>
<section class="section-tight">
@@ -9,43 +10,23 @@ import Layout from "../../layouts/Layout.astro";
⚠️ <strong>Muster-Text.</strong> Dies ist ein vorbereiteter Platzhalter gemäß Pflichtenheft
und ersetzt keine rechtliche Prüfung. Vor Veröffentlichung bitte von einer fachkundigen
Stelle (z. B. Anwalt/Anwältin oder IHK-Impressumsgenerator) prüfen und mit den echten
Angaben von VanVan vervollständigen.
Angaben von VanVan vervollständigen — im Adminbereich unter „⚖️ Rechtstexte & FAQ"
bearbeitbar.
</div>
<h2>Angaben gemäß § 5 DDG</h2>
<p>
[Vorname Nachname] („VanVan")<br />
Van's DIY & Bastelbedarf<br />
Einzelunternehmen<br />
[Straße und Hausnummer]<br />
[PLZ Ort]<br />
Deutschland
</p>
{impressum.sections.map((s) => (
<>
<h2>{s.heading}</h2>
<Fragment set:html={rechtstextAlsHtml(s.body)} />
</>
))}
<h2>Kontakt</h2>
<p>
Telefon: [Telefonnummer]<br />
E-Mail: [E-Mail-Adresse]
</p>
<h2>Umsatzsteuer</h2>
<p>Gemäß §19 UStG wird als Kleinunternehmer keine Umsatzsteuer berechnet und ausgewiesen.</p>
<h2>Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</h2>
<p>[Vorname Nachname], Anschrift wie oben.</p>
<h2>EU-Streitschlichtung</h2>
<p>
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:
<a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>.
Unsere E-Mail-Adresse finden Sie oben im Impressum.
</p>
<h2>Verbraucherstreitbeilegung/Universalschlichtungsstelle</h2>
<p>
Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer
Verbraucherschlichtungsstelle teilzunehmen. [Ggf. anpassen, falls sich das ändert.]
</p>
{impressum.ustId && impressum.ustId.trim() !== "" && (
<>
<h2>Umsatzsteuer-Identifikationsnummer</h2>
<p>{impressum.ustId}</p>
</>
)}
</div>
</section>
</Layout>
+5 -4
View File
@@ -78,19 +78,19 @@ const t = useTranslations(lang);
</section>
</Layout>
<script define:vars={{ freeShipFrom: 75, removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
<script define:vars={{ removeLabel: t.cart.remove, perItemLabel: t.cart.perItem, remainingTemplate: t.cart.remaining("__V__"), freeShippingText: t.cart.freeShipping, freeLabel: t.checkout.free, cartLang: lang, mengenrabattTemplate: t.cart.mengenrabatt("__P__"), couponInvalid: t.cart.couponInvalid, couponAppliedTemplate: t.cart.couponApplied("__C__"), couponRemoveLabel: t.cart.couponRemove, buyNowLabel: t.cart.buyNow, keptInCartLabel: t.cart.keptInCart, partnerCodeInvalid: t.cart.partnerCodeInvalid, partnerCodeAppliedTemplate: t.cart.partnerCodeApplied("__C__"), partnerCodeRemoveLabel: t.cart.partnerCodeRemove, loyaltySelectLabel: t.cart.loyaltySelectLabel, loyaltySelectedLabel: t.cart.loyaltySelectedLabel, gratisLabel: t.cart.gratisPraemie }}>
// WICHTIG: define:vars-Skripte laufen als IIFE, keine "import"-Anweisungen möglich.
window.__cartVars = { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
window.__cartVars = { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel };
</script>
<script type="module">
import { getCart, updateQuantity, removeFromCart, cartTotal, appliedCoupon, couponDiscount, setCouponCode, clearCoupon, appliedPartnerCode, partnerCodeDiscount, setPartnerCode, clearPartnerCode, totalDiscount, treuebonusDiscount, aboDiscount, istAusgewaehlt, setAusgewaehlt, zeilenpreisFuer } from "../../scripts/cart";
import { formatPrice } from "../../i18n/format";
import { getProduct, products } from "../../data/products";
import { berechneVersandkosten } from "../../data/versand";
import { berechneVersandkosten, freieVersandGrenze } from "../../data/versand";
import { mengenrabattProzent } from "../../data/rabatt";
import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../scripts/account";
const { freeShipFrom, removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const { removeLabel, perItemLabel, remainingTemplate, freeShippingText, freeLabel, cartLang, mengenrabattTemplate, couponInvalid, couponAppliedTemplate, couponRemoveLabel, buyNowLabel, keptInCartLabel, partnerCodeInvalid, partnerCodeAppliedTemplate, partnerCodeRemoveLabel, loyaltySelectLabel, loyaltySelectedLabel, gratisLabel } = window.__cartVars;
const landSelect = document.getElementById("cart-land");
function render() {
@@ -179,6 +179,7 @@ import { getAccount, treueFortschritt, setTreuebonusArtikel } from "../../script
).join("");
const subtotal = cartTotal();
const freeShipFrom = freieVersandGrenze(landSelect.value);
const remaining = Math.max(0, freeShipFrom - subtotal);
const shipping = berechneVersandkosten(landSelect.value, ausgewaehlteZeilen.map(({ item: i }) => ({ slug: i.slug, preis: i.preis, menge: i.menge })), products);
const coupon = appliedCoupon();
+13 -54
View File
@@ -1,5 +1,6 @@
---
import Layout from "../../layouts/Layout.astro";
import { widerruf, rechtstextAlsHtml } from "../../data/legal";
---
<Layout title="Widerrufsbelehrung" path="/widerruf/" legalOnly={true}>
<section class="section-tight">
@@ -7,64 +8,22 @@ import Layout from "../../layouts/Layout.astro";
<h1>Widerrufsbelehrung</h1>
<div class="legal-note">
⚠️ <strong>Muster-Text.</strong> Vorbereiteter Platzhalter, ersetzt keine rechtliche
Prüfung durch eine fachkundige Stelle vor Veröffentlichung.
Prüfung durch eine fachkundige Stelle vor Veröffentlichung — im Adminbereich unter
„⚖️ Rechtstexte & FAQ" bearbeitbar.
</div>
<h2>Widerrufsrecht</h2>
<p>
Du hast das Recht, binnen vierzehn Tagen ohne Angabe von Gründen diesen Vertrag zu
widerrufen. Die Widerrufsfrist beträgt vierzehn Tage ab dem Tag, an dem du oder ein von dir
benannter Dritter, der nicht der Beförderer ist, die Waren in Besitz genommen hast bzw. hat.
</p>
<p>
Um dein Widerrufsrecht auszuüben, musst du uns ([Vorname Nachname], Van's DIY &
Bastelbedarf, [Anschrift], [E-Mail-Adresse]) mittels einer eindeutigen Erklärung (z. B. ein
mit der Post versandter Brief oder E-Mail) über deinen Entschluss, diesen Vertrag zu
widerrufen, informieren. Du kannst dafür das beigefügte
<a href="/muster-widerrufsformular/">Muster-Widerrufsformular</a> verwenden, das jedoch
nicht vorgeschrieben ist.
</p>
<p>
Zur Wahrung der Widerrufsfrist reicht es aus, dass du die Mitteilung über die Ausübung des
Widerrufsrechts vor Ablauf der Widerrufsfrist absendest.
</p>
{widerruf.sections.map((s) => (
<>
<h2>{s.heading}</h2>
<Fragment set:html={rechtstextAlsHtml(s.body)} />
</>
))}
<h2>Folgen des Widerrufs</h2>
{/* Fester, nicht editierbarer Link auf das separate Formular-Seiten-Template — bewusst
nicht Teil des frei bearbeitbaren Textes oben, damit dieser wichtige Link nie aus
Versehen beim Bearbeiten verloren gehen kann. */}
<p>
Wenn du diesen Vertrag widerrufst, haben wir dir alle Zahlungen, die wir von dir erhalten
haben, einschließlich der Lieferkosten (mit Ausnahme der zusätzlichen Kosten, die sich
daraus ergeben, dass du eine andere Art der Lieferung als die von uns angebotene, günstigste
Standardlieferung gewählt hast), unverzüglich und spätestens binnen vierzehn Tagen ab dem
Tag zurückzuzahlen, an dem die Mitteilung über deinen Widerruf dieses Vertrags bei uns
eingegangen ist. Für diese Rückzahlung verwenden wir dasselbe Zahlungsmittel, das du bei der
ursprünglichen Transaktion eingesetzt hast, es sei denn, mit dir wurde ausdrücklich etwas
anderes vereinbart; in keinem Fall werden dir wegen dieser Rückzahlung Entgelte berechnet.
</p>
<p>
Wir können die Rückzahlung verweigern, bis wir die Waren wieder zurückerhalten haben oder
bis du den Nachweis erbracht hast, dass du die Waren zurückgesandt hast, je nachdem, welches
der frühere Zeitpunkt ist.
</p>
<p>
Du hast die Waren unverzüglich und in jedem Fall spätestens binnen vierzehn Tagen ab dem
Tag, an dem du uns über den Widerruf dieses Vertrags unterrichtest, an uns zurückzusenden
oder zu übergeben. Die Frist ist gewahrt, wenn du die Waren vor Ablauf der Frist von
vierzehn Tagen absendest. Du trägst die unmittelbaren Kosten der Rücksendung der Waren.
</p>
<p>
Du musst für einen etwaigen Wertverlust der Waren nur aufkommen, wenn dieser Wertverlust auf
einen zur Prüfung der Beschaffenheit, Eigenschaften und Funktionsweise der Waren nicht
notwendigen Umgang mit ihnen zurückzuführen ist.
</p>
<h2>Ausschluss/vorzeitiges Erlöschen des Widerrufsrechts</h2>
<p>
Das Widerrufsrecht besteht nicht bzw. erlischt vorzeitig unter anderem bei Verträgen zur
Lieferung von Waren, die nicht vorgefertigt sind und für deren Herstellung eine individuelle
Auswahl oder Bestimmung durch dich maßgeblich ist oder die eindeutig auf deine persönlichen
Bedürfnisse zugeschnitten sind (§ 312g Abs. 2 Nr. 1 BGB) — z. B. bei individuellen
Sonderanfertigungen auf Kundenwunsch. Bei Standardartikeln aus unserem Sortiment gilt das
Widerrufsrecht regulär.
📄 <a href="/muster-widerrufsformular/">Muster-Widerrufsformular</a> (nicht verpflichtend, kann für den Widerruf genutzt werden).
</p>
</div>
</section>