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:
co-authored by
Claude Sonnet 5
parent
9a2c75ebe6
commit
0c1c8f075f
+114
-2
@@ -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 }
|
||||
|
||||
@@ -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 2–7 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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"de": [
|
||||
{ "q": "Wie lange dauert die Lieferung?", "a": "In der Regel 2–7 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 2–7 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 2–7 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." }
|
||||
]
|
||||
}
|
||||
@@ -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.]"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"freigrenze": {
|
||||
"de": 75,
|
||||
"at": 85,
|
||||
"ch": 100,
|
||||
"lu": 85
|
||||
},
|
||||
"de": [
|
||||
{
|
||||
"abWarenwert": 0,
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 ?? [];
|
||||
}
|
||||
@@ -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, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">");
|
||||
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
@@ -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
@@ -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 2–7 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: 2–7 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 2–7 Werktage. Versandkostenfrei ab 75 €. Versand erst nach Zahlungseingang.",
|
||||
shippingHint: "Versand ausschließlich per DHL nach Deutschland, Österreich, Schweiz und Luxemburg. Lieferzeit 2–7 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 2–7 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: 2–7 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 2–7 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 2–7 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 2–7 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: 2–7 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 2–7 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 2–7 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.",
|
||||
|
||||
@@ -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 2–7 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user