"Preise & Zeit" entfernt -- Inhalte in die Leistungen uebernommen

"leistungen und preis&zeit ist ja das gleiche, nimm die kategorie
preise&zeit komplett weg"

Stimmt bei den Paketen und Preisen: Beide Seiten zeigten dieselben
Zahlen. Zwei Orte fuer dieselbe Zahl sind eine Einladung, dass sie
irgendwann auseinanderlaufen -- und dann steht ein falscher Preis auf
der Seite, ohne dass es jemand merkt.

NICHT ALLES WAR DOPPELT

Vor dem Loeschen nachgesehen statt einfach geloescht. Zwei Abschnitte
gab es NUR dort:

  "Was den Preis bewegt"  -- beantwortet die Frage, die nach jeder
       Preisliste kommt: Warum kostet es bei mir mehr oder weniger?
       Ohne sie ist eine Preisspanne eine Behauptung.

  "Wie bezahlt wird"  -- Angebot, 30 % Anzahlung, Restbetrag, Betreuung.
       Rechtlich relevant und aus den AGB verlinkt.

Beide sind in die Leistungen umgezogen, samt ihrer 24 Textbausteine in
allen fuenf Sprachen. Waeren sie mitgeloescht worden, haette es niemand
sofort bemerkt -- und die Seite haette ab dann Preise genannt, ohne sie
zu erklaeren.

WEITERLEITUNG STATT 404

Die Adresse /webdesign/preise.html bleibt bedient und fuehrt auf die
Leistungen. Lesezeichen, alte Links aus Nachrichten und die installierte
App zeigen sonst ins Leere, und ein 404 auf einer Preisseite ist der
denkbar schlechteste erste Eindruck.

302 statt 301: Eine dauerhafte Weiterleitung merken sich Browser
hartnaeckig; sollte die Seite je zurueckkehren, muesste jeder Besucher
seinen Zwischenspeicher leeren.

EIN FEHLER BEIM EINBAU

Die Weiterleitung stand zuerst weiter unten in der Schranke, bei den
ohne Code erreichbaren Seiten. Dort haette sie nur fuer NICHT angemeldete
Besucher gegriffen -- wer angemeldet ist, passiert die Schranke vorher
mit next() und haette einen 404 auf die geloeschte Datei bekommen.
Genau die Person also, die die Seite am ehesten im Lesezeichen hat.
Jetzt steht sie ganz vorne, vor jeder Zugangspruefung.

GEPRUEFT: 10 Pruefungen -- beide uebernommenen Abschnitte erscheinen in
allen fuenf Sprachen, kein unuebersetzter Schluessel sichtbar. Kein
Verweis auf die alte Seite blieb irgendwo stehen (ablauf.html hatte
einen, der ist umgebogen). Gestaltung 0 Befunde, Textkodierung sauber,
Designsystem 5.

Versionsstempel und Cache auf v20.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-23 19:00:49 +02:00
co-authored by Claude Opus 5
parent d6e75ce56a
commit 4fe66e1e0e
18 changed files with 236 additions and 394 deletions
+78
View File
@@ -210,4 +210,82 @@ window.I18N_WD = {
fr: "Décris simplement ton projet. Si une formule plus petite suffit, je le dirai — même si cela signifie moins de chiffre d'affaires.", fr: "Décris simplement ton projet. Si une formule plus petite suffit, je le dirai — même si cela signifie moins de chiffre d'affaires.",
pt: "Descreve simplesmente o teu projeto. Se um pacote menor chegar, eu digo-o — mesmo que isso signifique menos faturação.", pt: "Descreve simplesmente o teu projeto. Se um pacote menor chegar, eu digo-o — mesmo que isso signifique menos faturação.",
}, },
/* ---------- Uebernommen von der frueheren Seite "Preise & Zeit" ----------
Die Seite wurde am 23.08.2026 entfernt, weil sie dieselben Pakete und
Preise zeigte wie die Leistungen. Diese Texte gehoerten aber zu den
beiden Abschnitten, die es dort ZUSAETZLICH gab und die hierher
umgezogen sind -- ohne sie waeren die Abschnitte einsprachig. */
pr_hoch_1: { de: "Viele Unterseiten oder viele Produkte", "de-CH": "Viili Undersite oder viili Produkt", en: "Many sub-pages or many products", fr: "Beaucoup de sous-pages ou de produits", pt: "Muitas subpáginas ou muitos produtos" },
pr_hoch_2: { de: "Zusätzliche Sprachen", "de-CH": "Zuesätzlichi Sprooche", en: "Additional languages", fr: "Langues supplémentaires", pt: "Idiomas adicionais" },
pr_hoch_3: { de: "Texte und Bilder müssen erst erstellt werden", "de-CH": "Täxt und Bilder mönd zerscht gmacht wärde", en: "Texts and images still have to be created", fr: "Les textes et images doivent encore être créés", pt: "Textos e imagens ainda têm de ser criados" },
pr_hoch_4: { de: "Anbindung an fremde Systeme (Kasse, Kalender, Warenwirtschaft)", "de-CH": "Aabindig a frömdi Syschtem (Kasse, Kaländer, Warewirtschaft)", en: "Connections to third-party systems (checkout, calendar, inventory)", fr: "Connexions à des systèmes tiers (caisse, agenda, gestion des stocks)", pt: "Ligações a sistemas externos (caixa, calendário, gestão de stock)" },
pr_hoch_5: { de: "Mehr Feedbackrunden als vereinbart", "de-CH": "Meh Feedbackrunde als vereinbart", en: "More feedback rounds than agreed", fr: "Plus de tours de retours que convenu", pt: "Mais rondas de feedback do que o acordado" },
pr_hoch_h3: { de: "Macht es teurer und länger", "de-CH": "Macht s tüürer und länger", en: "Makes it more expensive and longer", fr: "Rend le projet plus cher et plus long", pt: "Torna mais caro e mais demorado" },
pr_keine_zusage_text: {
de: "Die Angaben auf dieser Seite sind Richtwerte, kein Vertrag. Auch das Anfrageformular erzeugt keine verbindliche Zusage. Der Endpreis entsteht ausschließlich durch ein schriftliches Angebot nach Prüfung des tatsächlichen Umfangs.",
"de-CH": "D Aagabe uf dere Site sind Richtwärt, kein Vertrag. Au s Aafrogformular macht kei verbindlichi Zuesag. Dr Ändpriis entstoht uusschliesslich dur es schriftlichs Aagebot nach Prüefig vom tatsächliche Umfang.",
en: "The figures on this page are guide values, not a contract. The enquiry form does not create a binding commitment either. The final price arises exclusively from a written quote after the actual scope has been reviewed.",
fr: "Les indications de cette page sont des valeurs indicatives, pas un contrat. Le formulaire de demande ne crée pas non plus d'engagement ferme. Le prix final résulte exclusivement d'un devis écrit après examen de l'étendue réelle.",
pt: "Os valores nesta página são indicativos, não um contrato. O formulário de pedido também não cria compromisso vinculativo. O preço final resulta exclusivamente de um orçamento escrito após análise do âmbito real.",
},
pr_keine_zusage_titel: {
de: "Keine automatische Preiszusage",
"de-CH": "Kei automatischi Priiszuesag",
en: "No automatic price commitment",
fr: "Aucun engagement de prix automatique",
pt: "Sem compromisso automático de preço",
},
pr_runter_1: { de: "Texte, Logo und Bilder liegen fertig vor", "de-CH": "Täxt, Logo und Bilder sind fertig do", en: "Texts, logo and images are ready", fr: "Textes, logo et images sont prêts", pt: "Textos, logótipo e imagens já prontos" },
pr_runter_2: { de: "Klare Vorstellung vom Ziel der Seite", "de-CH": "Klari Vorstellig vom Ziel vo dr Site", en: "A clear idea of what the site should achieve", fr: "Une idée claire de l'objectif du site", pt: "Uma ideia clara do objetivo do site" },
pr_runter_3: { de: "Eine Person entscheidet, nicht ein Gremium", "de-CH": "Ei Person entscheidet, nöd es Gremium", en: "One person decides, not a committee", fr: "Une personne décide, pas un comité", pt: "Uma pessoa decide, não um comité" },
pr_runter_4: { de: "Rückmeldungen gebündelt statt tröpfchenweise", "de-CH": "Rückmäldige bündlet statt tröpfliwiis", en: "Feedback bundled instead of trickling in", fr: "Des retours groupés plutôt qu'au compte-gouttes", pt: "Feedback agrupado em vez de aos poucos" },
pr_runter_5: { de: "Bestehende Domain und bestehendes Hosting", "de-CH": "Bestehendi Domain und bestehends Hosting", en: "An existing domain and existing hosting", fr: "Un domaine et un hébergement existants", pt: "Domínio e alojamento já existentes" },
pr_runter_h3: { de: "Macht es günstiger und schneller", "de-CH": "Macht s günschtiger und schnäller", en: "Makes it cheaper and faster", fr: "Rend le projet moins cher et plus rapide", pt: "Torna mais barato e mais rápido" },
pr_was_h2: {
de: "Was den Preis bewegt",
"de-CH": "Was dä Priis bewegt",
en: "What moves the price",
fr: "Ce qui fait bouger le prix",
pt: "O que faz mexer o preço",
},
pr_z1_h3: { de: "1. Angebot", "de-CH": "1. Aagebot", en: "1. Quote", fr: "1. Devis", pt: "1. Orçamento" },
pr_z1_p: {
de: "Nach dem Briefing bekommst du Preis, Umfang und Zeitrahmen schriftlich. Bis dahin entstehen dir keine Kosten.",
"de-CH": "Nach em Briefing überchunnsch Priis, Umfang und Ziitrahme schriftlich. Bis dete entstöhnd dir kei Choschte.",
en: "After the briefing you receive price, scope and timeframe in writing. Up to that point you incur no costs.",
fr: "Après le briefing, tu reçois le prix, l'étendue et le délai par écrit. Jusque-là, aucun frais pour toi.",
pt: "Após o briefing recebes preço, âmbito e prazo por escrito. Até aí não tens custos.",
},
pr_z2_h3: { de: "2. Anzahlung 30 %", "de-CH": "2. Aazahlig 30 %", en: "2. Deposit 30 %", fr: "2. Acompte 30 %", pt: "2. Sinal 30 %" },
pr_z2_p: {
de: "Mit der Annahme des Angebots und dem Eingang der Anzahlung wird dein Zeitfenster fest reserviert. Erst dann beginnt die Arbeit.",
"de-CH": "Mit dr Aanahm vom Aagebot und em Iigang vo dr Aazahlig wird dis Ziitfenschter fescht reserviert. Erscht denn foht d Arbet a.",
en: "Accepting the quote and the arrival of the deposit firmly reserve your time slot. Only then does work begin.",
fr: "L'acceptation du devis et la réception de l'acompte réservent fermement ton créneau. Le travail commence seulement ensuite.",
pt: "A aceitação do orçamento e a entrada do sinal reservam firmemente a tua janela. Só então começa o trabalho.",
},
pr_z3_h3: { de: "3. Restbetrag", "de-CH": "3. Rescht", en: "3. Remaining amount", fr: "3. Solde", pt: "3. Valor restante" },
pr_z3_p: {
de: "Der Rest wird nach deiner Abnahme fällig, vor der Veröffentlichung. Die Nutzungsrechte gehen mit der vollständigen Bezahlung an dich über.",
"de-CH": "Dr Rescht wird nach dinere Abnahm fällig, vor dr Veröffentlichig. D Nutzigsrächt göhnd mit dr vollständige Zahlig a dich über.",
en: "The remainder is due after your acceptance, before publication. Usage rights transfer to you upon full payment.",
fr: "Le solde est dû après ta validation, avant la mise en ligne. Les droits d'utilisation te sont transférés au paiement intégral.",
pt: "O restante é devido após a tua aceitação, antes da publicação. Os direitos de utilização passam para ti com o pagamento integral.",
},
pr_z4_h3: { de: "Betreuung", "de-CH": "Betreuig", en: "Support", fr: "Suivi", pt: "Acompanhamento" },
pr_z4_p: {
de: "Läuft monatlich und ist jederzeit zum Monatsende kündbar. Keine Mindestlaufzeit, keine automatische Verlängerung um ein ganzes Jahr.",
"de-CH": "Lauft monetlich und isch jederziit uf s Monetsänd kündbar. Kei Mindeschtlaufziit, kei automatischi Verlängerig um es ganzes Jahr.",
en: "Runs monthly and can be cancelled at any time to the end of the month. No minimum term, no automatic renewal for a whole year.",
fr: "Mensuel et résiliable à tout moment pour la fin du mois. Pas de durée minimale, pas de reconduction automatique d'un an.",
pt: "É mensal e cancelável a qualquer momento para o fim do mês. Sem prazo mínimo, sem renovação automática por um ano inteiro.",
},
pr_zahlung_h2: {
de: "Wie bezahlt wird",
"de-CH": "Wie zahlt wird",
en: "How payment works",
fr: "Comment se passe le paiement",
pt: "Como se paga",
},
}; };
-140
View File
@@ -1,140 +0,0 @@
/* =====================================================================
i18n-wd-preise.js — Preise & Zeit (Masterplan S.8)
Die konkreten Beträge und Zeitrahmen stehen NICHT hier, sondern in
wd-core.js — siehe dort den Abschnitt "EINZIGE QUELLE DER WAHRHEIT".
Hier nur die Texte drumherum.
===================================================================== */
window.I18N_WD = {
seiten_titel: {
de: "Preise & Zeit — Dogfather Webdesign",
"de-CH": "Priis & Ziit — Dogfather Webdesign",
en: "Pricing & time — Dogfather Web Design",
fr: "Tarifs & délais — Dogfather Web Design",
pt: "Preços & prazos — Dogfather Web Design",
},
pr_eyebrow: { de: "Preise &amp; Zeit", "de-CH": "Priis &amp; Ziit", en: "Pricing &amp; time", fr: "Tarifs &amp; délais", pt: "Preços &amp; prazos" },
pr_h1: {
de: "Was es kostet und wie lange es dauert",
"de-CH": "Was es choschtet und wie lang s duuret",
en: "What it costs and how long it takes",
fr: "Combien ça coûte et combien de temps ça prend",
pt: "Quanto custa e quanto tempo demora",
},
pr_lead: {
de: "Alle Werte sind transparente Einstiegspunkte. Personalisierung, Funktionsumfang, Materialien und zusätzliche Änderungswünsche können Preis und Dauer verändern.",
"de-CH": "Alli Wärt sind transparänti Iistiegspünkt. Personalisierig, Funktionsumfang, Material und zuesätzlichi Änderigswünsch chönd Priis und Duur verändere.",
en: "All figures are transparent starting points. Personalisation, feature scope, materials and additional change requests can alter price and duration.",
fr: "Tous les montants sont des points de départ transparents. La personnalisation, l'étendue des fonctions, les matériaux et les demandes de modification supplémentaires peuvent modifier le prix et la durée.",
pt: "Todos os valores são pontos de partida transparentes. Personalização, âmbito de funcionalidades, materiais e pedidos de alteração adicionais podem alterar preço e duração.",
},
pr_tabelle_titel: {
de: "Alles auf einen Blick",
"de-CH": "Alles uf ei Blick",
en: "Everything at a glance",
fr: "Tout en un coup d'œil",
pt: "Tudo num relance",
},
pr_sp_paket: { de: "Paket", "de-CH": "Paket", en: "Package", fr: "Formule", pt: "Pacote" },
pr_sp_preis: { de: "Einstiegspreis", "de-CH": "Iistiegspriis", en: "Starting price", fr: "Prix de départ", pt: "Preço inicial" },
pr_sp_dauer: { de: "Zeitrahmen", "de-CH": "Ziitrahme", en: "Timeframe", fr: "Délai", pt: "Prazo" },
pr_sp_fuer: { de: "Gedacht für", "de-CH": "Dänkt für", en: "Intended for", fr: "Destiné à", pt: "Destinado a" },
pr_kurz_onepager: { de: "Eine Person, ein Angebot, eine Aktion", "de-CH": "Ei Person, es Aagebot, ei Aktion", en: "One person, one offer, one campaign", fr: "Une personne, une offre, une action", pt: "Uma pessoa, uma oferta, uma ação" },
pr_kurz_website: { de: "Firmen, Teams, mehrere Themen", "de-CH": "Firme, Teams, mehreri Thema", en: "Companies, teams, several topics", fr: "Entreprises, équipes, plusieurs thèmes", pt: "Empresas, equipas, vários temas" },
pr_kurz_shop: { de: "Wer wirklich online verkauft", "de-CH": "Wär würklich online verchauft", en: "Anyone genuinely selling online", fr: "Ceux qui vendent vraiment en ligne", pt: "Quem vende mesmo online" },
pr_kurz_verwaltung: { de: "Belege und Zahlen organisieren", "de-CH": "Bäläg und Zahle organisiere", en: "Organising receipts and figures", fr: "Organiser justificatifs et chiffres", pt: "Organizar comprovativos e números" },
pr_kurz_betreuung: { de: "Nach der Übergabe weiterlaufen lassen", "de-CH": "Nach dr Übergab wiiterlaufe lo", en: "Keeping things running after handover", fr: "Faire vivre le site après la remise", pt: "Manter tudo a funcionar após a entrega" },
pr_was_h2: {
de: "Was den Preis bewegt",
"de-CH": "Was dä Priis bewegt",
en: "What moves the price",
fr: "Ce qui fait bouger le prix",
pt: "O que faz mexer o preço",
},
pr_hoch_h3: { de: "Macht es teurer und länger", "de-CH": "Macht s tüürer und länger", en: "Makes it more expensive and longer", fr: "Rend le projet plus cher et plus long", pt: "Torna mais caro e mais demorado" },
pr_hoch_1: { de: "Viele Unterseiten oder viele Produkte", "de-CH": "Viili Undersite oder viili Produkt", en: "Many sub-pages or many products", fr: "Beaucoup de sous-pages ou de produits", pt: "Muitas subpáginas ou muitos produtos" },
pr_hoch_2: { de: "Zusätzliche Sprachen", "de-CH": "Zuesätzlichi Sprooche", en: "Additional languages", fr: "Langues supplémentaires", pt: "Idiomas adicionais" },
pr_hoch_3: { de: "Texte und Bilder müssen erst erstellt werden", "de-CH": "Täxt und Bilder mönd zerscht gmacht wärde", en: "Texts and images still have to be created", fr: "Les textes et images doivent encore être créés", pt: "Textos e imagens ainda têm de ser criados" },
pr_hoch_4: { de: "Anbindung an fremde Systeme (Kasse, Kalender, Warenwirtschaft)", "de-CH": "Aabindig a frömdi Syschtem (Kasse, Kaländer, Warewirtschaft)", en: "Connections to third-party systems (checkout, calendar, inventory)", fr: "Connexions à des systèmes tiers (caisse, agenda, gestion des stocks)", pt: "Ligações a sistemas externos (caixa, calendário, gestão de stock)" },
pr_hoch_5: { de: "Mehr Feedbackrunden als vereinbart", "de-CH": "Meh Feedbackrunde als vereinbart", en: "More feedback rounds than agreed", fr: "Plus de tours de retours que convenu", pt: "Mais rondas de feedback do que o acordado" },
pr_runter_h3: { de: "Macht es günstiger und schneller", "de-CH": "Macht s günschtiger und schnäller", en: "Makes it cheaper and faster", fr: "Rend le projet moins cher et plus rapide", pt: "Torna mais barato e mais rápido" },
pr_runter_1: { de: "Texte, Logo und Bilder liegen fertig vor", "de-CH": "Täxt, Logo und Bilder sind fertig do", en: "Texts, logo and images are ready", fr: "Textes, logo et images sont prêts", pt: "Textos, logótipo e imagens já prontos" },
pr_runter_2: { de: "Klare Vorstellung vom Ziel der Seite", "de-CH": "Klari Vorstellig vom Ziel vo dr Site", en: "A clear idea of what the site should achieve", fr: "Une idée claire de l'objectif du site", pt: "Uma ideia clara do objetivo do site" },
pr_runter_3: { de: "Eine Person entscheidet, nicht ein Gremium", "de-CH": "Ei Person entscheidet, nöd es Gremium", en: "One person decides, not a committee", fr: "Une personne décide, pas un comité", pt: "Uma pessoa decide, não um comité" },
pr_runter_4: { de: "Rückmeldungen gebündelt statt tröpfchenweise", "de-CH": "Rückmäldige bündlet statt tröpfliwiis", en: "Feedback bundled instead of trickling in", fr: "Des retours groupés plutôt qu'au compte-gouttes", pt: "Feedback agrupado em vez de aos poucos" },
pr_runter_5: { de: "Bestehende Domain und bestehendes Hosting", "de-CH": "Bestehendi Domain und bestehends Hosting", en: "An existing domain and existing hosting", fr: "Un domaine et un hébergement existants", pt: "Domínio e alojamento já existentes" },
pr_zahlung_h2: {
de: "Wie bezahlt wird",
"de-CH": "Wie zahlt wird",
en: "How payment works",
fr: "Comment se passe le paiement",
pt: "Como se paga",
},
pr_z1_h3: { de: "1. Angebot", "de-CH": "1. Aagebot", en: "1. Quote", fr: "1. Devis", pt: "1. Orçamento" },
pr_z1_p: {
de: "Nach dem Briefing bekommst du Preis, Umfang und Zeitrahmen schriftlich. Bis dahin entstehen dir keine Kosten.",
"de-CH": "Nach em Briefing überchunnsch Priis, Umfang und Ziitrahme schriftlich. Bis dete entstöhnd dir kei Choschte.",
en: "After the briefing you receive price, scope and timeframe in writing. Up to that point you incur no costs.",
fr: "Après le briefing, tu reçois le prix, l'étendue et le délai par écrit. Jusque-là, aucun frais pour toi.",
pt: "Após o briefing recebes preço, âmbito e prazo por escrito. Até aí não tens custos.",
},
pr_z2_h3: { de: "2. Anzahlung 30 %", "de-CH": "2. Aazahlig 30 %", en: "2. Deposit 30 %", fr: "2. Acompte 30 %", pt: "2. Sinal 30 %" },
pr_z2_p: {
de: "Mit der Annahme des Angebots und dem Eingang der Anzahlung wird dein Zeitfenster fest reserviert. Erst dann beginnt die Arbeit.",
"de-CH": "Mit dr Aanahm vom Aagebot und em Iigang vo dr Aazahlig wird dis Ziitfenschter fescht reserviert. Erscht denn foht d Arbet a.",
en: "Accepting the quote and the arrival of the deposit firmly reserve your time slot. Only then does work begin.",
fr: "L'acceptation du devis et la réception de l'acompte réservent fermement ton créneau. Le travail commence seulement ensuite.",
pt: "A aceitação do orçamento e a entrada do sinal reservam firmemente a tua janela. Só então começa o trabalho.",
},
pr_z3_h3: { de: "3. Restbetrag", "de-CH": "3. Rescht", en: "3. Remaining amount", fr: "3. Solde", pt: "3. Valor restante" },
pr_z3_p: {
de: "Der Rest wird nach deiner Abnahme fällig, vor der Veröffentlichung. Die Nutzungsrechte gehen mit der vollständigen Bezahlung an dich über.",
"de-CH": "Dr Rescht wird nach dinere Abnahm fällig, vor dr Veröffentlichig. D Nutzigsrächt göhnd mit dr vollständige Zahlig a dich über.",
en: "The remainder is due after your acceptance, before publication. Usage rights transfer to you upon full payment.",
fr: "Le solde est dû après ta validation, avant la mise en ligne. Les droits d'utilisation te sont transférés au paiement intégral.",
pt: "O restante é devido após a tua aceitação, antes da publicação. Os direitos de utilização passam para ti com o pagamento integral.",
},
pr_z4_h3: { de: "Betreuung", "de-CH": "Betreuig", en: "Support", fr: "Suivi", pt: "Acompanhamento" },
pr_z4_p: {
de: "Läuft monatlich und ist jederzeit zum Monatsende kündbar. Keine Mindestlaufzeit, keine automatische Verlängerung um ein ganzes Jahr.",
"de-CH": "Lauft monetlich und isch jederziit uf s Monetsänd kündbar. Kei Mindeschtlaufziit, kei automatischi Verlängerig um es ganzes Jahr.",
en: "Runs monthly and can be cancelled at any time to the end of the month. No minimum term, no automatic renewal for a whole year.",
fr: "Mensuel et résiliable à tout moment pour la fin du mois. Pas de durée minimale, pas de reconduction automatique d'un an.",
pt: "É mensal e cancelável a qualquer momento para o fim do mês. Sem prazo mínimo, sem renovação automática por um ano inteiro.",
},
pr_keine_zusage_titel: {
de: "Keine automatische Preiszusage",
"de-CH": "Kei automatischi Priiszuesag",
en: "No automatic price commitment",
fr: "Aucun engagement de prix automatique",
pt: "Sem compromisso automático de preço",
},
pr_keine_zusage_text: {
de: "Die Angaben auf dieser Seite sind Richtwerte, kein Vertrag. Auch das Anfrageformular erzeugt keine verbindliche Zusage. Der Endpreis entsteht ausschließlich durch ein schriftliches Angebot nach Prüfung des tatsächlichen Umfangs.",
"de-CH": "D Aagabe uf dere Site sind Richtwärt, kein Vertrag. Au s Aafrogformular macht kei verbindlichi Zuesag. Dr Ändpriis entstoht uusschliesslich dur es schriftlichs Aagebot nach Prüefig vom tatsächliche Umfang.",
en: "The figures on this page are guide values, not a contract. The enquiry form does not create a binding commitment either. The final price arises exclusively from a written quote after the actual scope has been reviewed.",
fr: "Les indications de cette page sont des valeurs indicatives, pas un contrat. Le formulaire de demande ne crée pas non plus d'engagement ferme. Le prix final résulte exclusivement d'un devis écrit après examen de l'étendue réelle.",
pt: "Os valores nesta página são indicativos, não um contrato. O formulário de pedido também não cria compromisso vinculativo. O preço final resulta exclusivamente de um orçamento escrito após análise do âmbito real.",
},
pr_cta_h2: {
de: "Passt das zu deinem Budget?",
"de-CH": "Passt das zu dim Budget?",
en: "Does that fit your budget?",
fr: "Est-ce compatible avec ton budget ?",
pt: "Isto encaixa no teu orçamento?",
},
pr_cta_p: {
de: "Sag im Formular einfach, welcher Rahmen realistisch ist. Wenn es nicht passt, sage ich das offen — statt ein Angebot zu schreiben, das nachher niemand bezahlen will.",
"de-CH": "Säg im Formular eifach, wele Rahme realistisch isch. Wenn s nöd passt, säg i das offe — statt es Aagebot z schriibe, wo nachher niemert zahle will.",
en: "Just state in the form what range is realistic. If it doesn't fit, I'll say so openly — instead of writing a quote nobody wants to pay afterwards.",
fr: "Indique simplement dans le formulaire la fourchette réaliste. Si cela ne convient pas, je le dirai franchement — plutôt que d'écrire un devis que personne ne voudra payer.",
pt: "Diz simplesmente no formulário que intervalo é realista. Se não encaixar, digo-o abertamente — em vez de escrever um orçamento que depois ninguém quer pagar.",
},
};
-1
View File
@@ -335,7 +335,6 @@
var NAV = [ var NAV = [
{ key: "nav_start", href: "/webdesign/" }, { key: "nav_start", href: "/webdesign/" },
{ key: "nav_leistungen", href: "/webdesign/leistungen.html" }, { key: "nav_leistungen", href: "/webdesign/leistungen.html" },
{ key: "nav_preise", href: "/webdesign/preise.html" },
{ key: "nav_portfolio", href: "/webdesign/portfolio.html" }, { key: "nav_portfolio", href: "/webdesign/portfolio.html" },
{ key: "nav_ablauf", href: "/webdesign/ablauf.html" }, { key: "nav_ablauf", href: "/webdesign/ablauf.html" },
{ key: "nav_ueber", href: "/webdesign/ueber.html" }, { key: "nav_ueber", href: "/webdesign/ueber.html" },
+27
View File
@@ -300,6 +300,33 @@ export function webdesignGate(req, res, next) {
// Alles außerhalb von /webdesign geht diese Schranke nichts an. // Alles außerhalb von /webdesign geht diese Schranke nichts an.
if (pfad !== WD_PRAEFIX && !pfad.startsWith(WD_PRAEFIX + "/")) return next(); if (pfad !== WD_PRAEFIX && !pfad.startsWith(WD_PRAEFIX + "/")) return next();
/* WEITERLEITUNG DER ENTFERNTEN PREISSEITE (23.08.2026)
"Preise & Zeit" zeigte dieselben Pakete und Preise wie die
Leistungen. Zwei Orte fuer dieselbe Zahl sind eine Einladung, dass
sie irgendwann auseinanderlaufen -- und dann steht ein falscher
Preis auf der Seite, ohne dass es jemand merkt.
Die Seite ist weg, aber die Adresse bleibt bedient. Lesezeichen,
alte Links aus Nachrichten und die installierte App zeigen sonst
ins Leere, und ein 404 auf einer Preisseite ist der denkbar
schlechteste erste Eindruck.
302 statt 301: Eine dauerhafte Weiterleitung merken sich Browser
hartnaeckig. Sollte die Seite je zurueckkehren, muesste jeder
Besucher seinen Zwischenspeicher leeren. Suchmaschinen spielt das
ohnehin keine Rolle -- der Bereich ist nicht oeffentlich.
⚠️ Diese Pruefung steht GANZ VORNE, noch vor der Zugangspruefung.
Weiter unten (bei den ohne Code erreichbaren Seiten) waere sie nur
fuer NICHT angemeldete Besucher gelaufen -- wer angemeldet ist,
passiert die Schranke vorher mit next() und bekaeme einen 404 auf
die geloeschte Datei. Beim ersten Einbau stand sie genau dort. */
if (pfad === "/webdesign/preise.html") {
return res.redirect(302, "/webdesign/leistungen.html");
}
/* Noindex für den GESAMTEN Bereich, unabhängig vom Anmeldezustand /* Noindex für den GESAMTEN Bereich, unabhängig vom Anmeldezustand
(Masterplan S.14: "Noindex, Zugriffsschutz und interne Linksperre (Masterplan S.14: "Noindex, Zugriffsschutz und interne Linksperre
bleiben aktiv, bis Dogfather den Launch ausdrücklich bestätigt"). bleiben aktiv, bis Dogfather den Launch ausdrücklich bestätigt").
+5 -5
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* Zeitstrahl: die Linie verbindet die Nummernkreise. Sie liegt hinter /* Zeitstrahl: die Linie verbindet die Nummernkreise. Sie liegt hinter
den Kreisen (z-index) und endet beim letzten Schritt, damit sie nicht den Kreisen (z-index) und endet beim letzten Schritt, damit sie nicht
@@ -174,7 +174,7 @@
<p class="wd-lead wd-auf" data-i18n="ab_dauer_p">Die Zeitrahmen auf der Preisseite gelten ab dem Eingang der Anzahlung — nicht ab der ersten Nachricht. Der häufigste Grund für Verzögerungen ist nicht die Technik, sondern dass Texte oder Bilder noch fehlen. Deshalb wird im Formular gleich danach gefragt.</p> <p class="wd-lead wd-auf" data-i18n="ab_dauer_p">Die Zeitrahmen auf der Preisseite gelten ab dem Eingang der Anzahlung — nicht ab der ersten Nachricht. Der häufigste Grund für Verzögerungen ist nicht die Technik, sondern dass Texte oder Bilder noch fehlen. Deshalb wird im Formular gleich danach gefragt.</p>
<div class="wd-btn-reihe"> <div class="wd-btn-reihe">
<a class="wd-btn wd-btn--haupt" href="/webdesign/anfrage.html" data-i18n="nav_anfrage">Projekt anfragen</a> <a class="wd-btn wd-btn--haupt" href="/webdesign/anfrage.html" data-i18n="nav_anfrage">Projekt anfragen</a>
<a class="wd-btn wd-btn--zweit" href="/webdesign/preise.html" data-i18n="ab_zu_preise">Zu den Zeitrahmen</a> <a class="wd-btn wd-btn--zweit" href="/webdesign/leistungen.html" data-i18n="ab_zu_preise">Zu den Zeitrahmen</a>
</div> </div>
</div> </div>
</section> </section>
@@ -183,7 +183,7 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ablauf.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-ablauf.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+5 -5
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* ---------- Schrittanzeige ---------- /* ---------- Schrittanzeige ----------
Zeigt alle vier Schritte gleichzeitig statt nur "3 von 4". Man sieht Zeigt alle vier Schritte gleichzeitig statt nur "3 von 4". Man sieht
@@ -418,8 +418,8 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-anfrage.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-anfrage.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script src="/assets/js/wd-anfrage.js?v=20260823wd19"></script> <script src="/assets/js/wd-anfrage.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
.fq-thema { scroll-margin-top: 90px; } .fq-thema { scroll-margin-top: 90px; }
.fq-thema + .fq-thema { margin-top: clamp(2rem, 4vw, 3rem); } .fq-thema + .fq-thema { margin-top: clamp(2rem, 4vw, 3rem); }
@@ -195,7 +195,7 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-faq.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-faq.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -16,8 +16,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* ---------- Nur auf der Startseite gebraucht ---------- */ /* ---------- Nur auf der Startseite gebraucht ---------- */
@@ -407,8 +407,8 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-index.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-index.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script> <script>
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
Marken-Intro (Masterplan S.3, Schritt 02: "Nach erfolgreichem Code Marken-Intro (Masterplan S.3, Schritt 02: "Nach erfolgreichem Code
+84 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* Sprungmarken. /* Sprungmarken.
Frueher eine waagerecht wischbare Leiste. Rueckmeldung 22.08.2026: Frueher eine waagerecht wischbare Leiste. Rueckmeldung 22.08.2026:
@@ -317,6 +317,86 @@
</div> </div>
</section> </section>
<!-- ================================================================
Uebernommen von der frueheren Seite "Preise & Zeit" (23.08.2026).
Die Seite wurde entfernt, weil sie dieselben Pakete und Preise
zeigte wie diese hier -- zwei Orte fuer dieselbe Zahl sind eine
Einladung, dass sie irgendwann auseinanderlaufen.
Diese beiden Abschnitte gab es dort aber ZUSAETZLICH, und sie
waeren beim blossen Loeschen verlorengegangen:
"Was den Preis bewegt" -- beantwortet die Frage, die nach jeder
Preisliste kommt, und macht den Preis nachvollziehbar
"Wie bezahlt wird" -- die 30-%-Anzahlung. Rechtlich
relevant und aus den AGB und den Fragen verlinkt
================================================================ -->
<section class="wd-abschnitt wd-abschnitt--gehoben">
<div class="wd-container">
<h2 class="wd-auf" data-i18n="pr_was_h2">Was den Preis bewegt</h2>
<div class="wd-grid wd-grid--2" style="margin-top:1.8rem">
<div class="wd-karte wd-karte--lila wd-karte--kappe wd-auf">
<h3 data-i18n="pr_hoch_h3">Macht es teurer und länger</h3>
<ul class="wd-liste">
<li data-i18n="pr_hoch_1">Viele Unterseiten oder viele Produkte</li>
<li data-i18n="pr_hoch_2">Zusätzliche Sprachen</li>
<li data-i18n="pr_hoch_3">Texte und Bilder müssen erst erstellt werden</li>
<li data-i18n="pr_hoch_4">Anbindung an fremde Systeme (Kasse, Kalender, Warenwirtschaft)</li>
<li data-i18n="pr_hoch_5">Mehr Feedbackrunden als vereinbart</li>
</ul>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_runter_h3">Macht es günstiger und schneller</h3>
<ul class="wd-liste">
<li data-i18n="pr_runter_1">Texte, Logo und Bilder liegen fertig vor</li>
<li data-i18n="pr_runter_2">Klare Vorstellung vom Ziel der Seite</li>
<li data-i18n="pr_runter_3">Eine Person entscheidet, nicht ein Gremium</li>
<li data-i18n="pr_runter_4">Rückmeldungen gebündelt statt tröpfchenweise</li>
<li data-i18n="pr_runter_5">Bestehende Domain und bestehendes Hosting</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ---------------- Zahlung ---------------- -->
<section class="wd-abschnitt">
<div class="wd-container">
<h2 class="wd-auf" data-i18n="pr_zahlung_h2">Wie bezahlt wird</h2>
<div class="pr-zahlung" style="margin-top:1.8rem">
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z1_h3">1. Angebot</h3>
<p data-i18n="pr_z1_p">Nach dem Briefing bekommst du Preis, Umfang und Zeitrahmen schriftlich. Bis dahin entstehen dir keine Kosten.</p>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z2_h3">2. Anzahlung 30 %</h3>
<p data-i18n="pr_z2_p">Mit der Annahme des Angebots und dem Eingang der Anzahlung wird dein Zeitfenster fest reserviert. Erst dann beginnt die Arbeit.</p>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z3_h3">3. Restbetrag</h3>
<p data-i18n="pr_z3_p">Der Rest wird nach deiner Abnahme fällig, vor der Veröffentlichung. Die Nutzungsrechte gehen mit der vollständigen Bezahlung an dich über.</p>
</div>
<div class="wd-karte wd-karte--lila wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z4_h3">Betreuung</h3>
<p data-i18n="pr_z4_p">Läuft monatlich und ist jederzeit zum Monatsende kündbar. Keine Mindestlaufzeit, keine automatische Verlängerung um ein ganzes Jahr.</p>
</div>
</div>
<!-- Gold: Zahlungsinformation — genau der vorgesehene Zweck. -->
<div class="wd-hinweis wd-auf" style="margin-top:1.5rem">
<p class="wd-hinweis-titel" data-i18n="anzahlung_titel">Wichtig: 30 % Anzahlung</p>
<p data-i18n="anzahlung_text">Der Projektstart wird nach Annahme des schriftlichen Angebots und Eingang einer Anzahlung von 30 % des vereinbarten Gesamtpreises reserviert.</p>
</div>
<div class="wd-hinweis wd-auf" style="margin-top:1rem">
<p class="wd-hinweis-titel" data-i18n="pr_keine_zusage_titel">Keine automatische Preiszusage</p>
<p data-i18n="pr_keine_zusage_text">Die Angaben auf dieser Seite sind Richtwerte, kein Vertrag. Auch das Anfrageformular erzeugt keine verbindliche Zusage. Der Endpreis entsteht ausschließlich durch ein schriftliches Angebot nach Prüfung des tatsächlichen Umfangs.</p>
</div>
</div>
</section>
<section class="wd-abschnitt wd-abschnitt--gehoben"> <section class="wd-abschnitt wd-abschnitt--gehoben">
<div class="wd-container wd-container--schmal" style="text-align:center"> <div class="wd-container wd-container--schmal" style="text-align:center">
<h2 data-i18n="cta_h2">Nicht sicher, welches Paket passt?</h2> <h2 data-i18n="cta_h2">Nicht sicher, welches Paket passt?</h2>
@@ -331,7 +411,7 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-leistungen.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-leistungen.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+5 -5
View File
@@ -12,8 +12,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
.po-login { max-width: 440px; margin: clamp(1.5rem,6vh,4rem) auto; } .po-login { max-width: 440px; margin: clamp(1.5rem,6vh,4rem) auto; }
@@ -134,8 +134,8 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portal.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-portal.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script src="/assets/js/wd-portal.js?v=20260823wd19"></script> <script src="/assets/js/wd-portal.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
.pfo-projekt { overflow: hidden; padding: 0; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .pfo-projekt { overflow: hidden; padding: 0; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); }
.pfo-bild { .pfo-bild {
@@ -192,7 +192,7 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-portfolio.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-portfolio.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
-202
View File
@@ -1,202 +0,0 @@
<!DOCTYPE html>
<html lang="de" data-i18n-titel="seiten_titel">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Preise &amp; Zeit — Dogfather Webdesign</title>
<meta name="description" content="Einstiegspreise, Zeitrahmen, 30 % Anzahlung und was den Preis nach oben oder unten bewegt — offen aufgeschrieben." />
<meta name="robots" content="noindex, nofollow, noarchive" />
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<meta name="theme-color" content="#05070b" />
<link rel="manifest" href="/webdesign/app.webmanifest" />
<link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" />
<style>
.pr-preis-gross { font-family: var(--font-head); font-weight: 800; color: var(--wd-blau); white-space: nowrap; }
/* Die Übersichtstabelle wird auf dem Handy zu Karten umgebaut, statt
waagerecht zu scrollen. Vier Spalten mit langen deutschen Texten sind
auf 390px auch mit Scrollbalken nicht lesbar — man verliert beim
Wischen sofort den Bezug zur Zeile. Deshalb: jede Zeile wird eine
eigene Karte, die Spaltenüberschrift steht per ::before davor. */
@media (max-width: 760px) {
.pr-tabelle, .pr-tabelle tbody, .pr-tabelle tr, .pr-tabelle td { display: block; width: 100%; }
.pr-tabelle { min-width: 0; }
.pr-tabelle thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.pr-tabelle tr {
border: 1px solid var(--wd-rand); border-radius: var(--wd-r);
margin-bottom: .8rem; padding: .3rem .2rem; background: rgb(var(--wd-glas-rgb) / .5);
}
.pr-tabelle td { border: none; padding: .45rem 1rem; }
.pr-tabelle td::before {
content: attr(data-titel);
display: block; font-size: 0.75rem; letter-spacing: .12em; text-transform: uppercase;
font-weight: 800; color: var(--wd-blau); margin-bottom: .1rem;
}
/* Die erste Zelle ist der Paketname — der braucht keine Beschriftung. */
.pr-tabelle td:first-child { padding-top: .8rem; }
.pr-tabelle td:first-child::before { display: none; }
.pr-tabelle td:first-child strong { font-size: 1.1rem; }
.pr-tabelle td:last-child { padding-bottom: .8rem; }
}
.pr-zahlung { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; }
@media (max-width: 980px) { .pr-zahlung { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .pr-zahlung { grid-template-columns: 1fr; } }
</style>
</head>
<body class="wd">
<div id="wd-kopf"></div>
<main id="wd-inhalt">
<section class="wd-abschnitt wd-abschnitt--eng" style="padding-top:clamp(2.4rem,6vw,4rem)">
<div class="wd-container">
<span class="wd-eyebrow" data-i18n="pr_eyebrow">Preise &amp; Zeit</span>
<h1 data-i18n="pr_h1">Was es kostet und wie lange es dauert</h1>
<p class="wd-lead" style="max-width:72ch" data-i18n="pr_lead">Alle Werte sind transparente Einstiegspunkte. Personalisierung, Funktionsumfang, Materialien und zusätzliche Änderungswünsche können Preis und Dauer verändern.</p>
</div>
</section>
<!-- ---------------- Übersicht ---------------- -->
<section class="wd-abschnitt" style="padding-top:0">
<div class="wd-container">
<h2 class="wd-auf" data-i18n="pr_tabelle_titel">Alles auf einen Blick</h2>
<div class="wd-tabelle-rahmen wd-auf" style="margin-top:1.4rem">
<table class="wd-tabelle pr-tabelle">
<thead>
<tr>
<th scope="col" data-i18n="pr_sp_paket">Paket</th>
<th scope="col" data-i18n="pr_sp_preis">Einstiegspreis</th>
<th scope="col" data-i18n="pr_sp_dauer">Zeitrahmen</th>
<th scope="col" data-i18n="pr_sp_fuer">Gedacht für</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong data-i18n="pk_onepager_h3">Onepager</strong></td>
<td data-titel="Einstiegspreis" data-i18n-attr="data-titel:pr_sp_preis"><span class="pr-preis-gross">ab 300&nbsp;€</span></td>
<td data-titel="Zeitrahmen" data-i18n-attr="data-titel:pr_sp_dauer"><span data-i18n="pk_onepager_dauer">ca. 5–10 Arbeitstage</span></td>
<td data-titel="Gedacht für" data-i18n-attr="data-titel:pr_sp_fuer"><span data-i18n="pr_kurz_onepager">Eine Person, ein Angebot, eine Aktion</span></td>
</tr>
<tr>
<td><strong data-i18n="pk_website_h3">Professionelle Website</strong></td>
<td data-titel="Einstiegspreis" data-i18n-attr="data-titel:pr_sp_preis"><span class="pr-preis-gross">ab 500&nbsp;€</span></td>
<td data-titel="Zeitrahmen" data-i18n-attr="data-titel:pr_sp_dauer"><span data-i18n="pk_website_dauer">ca. 2–4 Wochen</span></td>
<td data-titel="Gedacht für" data-i18n-attr="data-titel:pr_sp_fuer"><span data-i18n="pr_kurz_website">Firmen, Teams, mehrere Themen</span></td>
</tr>
<tr>
<td><strong data-i18n="pk_shop_h3">Shop &amp; umfangreiche Website</strong></td>
<td data-titel="Einstiegspreis" data-i18n-attr="data-titel:pr_sp_preis"><span class="pr-preis-gross">ab 1.000&nbsp;€</span></td>
<td data-titel="Zeitrahmen" data-i18n-attr="data-titel:pr_sp_dauer"><span data-i18n="pk_shop_dauer">ca. 4–8 Wochen</span></td>
<td data-titel="Gedacht für" data-i18n-attr="data-titel:pr_sp_fuer"><span data-i18n="pr_kurz_shop">Wer wirklich online verkauft</span></td>
</tr>
<tr>
<td><strong data-i18n="pk_verwaltung_h3">Buchhaltungs- &amp; Steuerverwaltungsseiten</strong></td>
<td data-titel="Einstiegspreis" data-i18n-attr="data-titel:pr_sp_preis"><span class="pr-preis-gross">ab 1.500&nbsp;€</span></td>
<td data-titel="Zeitrahmen" data-i18n-attr="data-titel:pr_sp_dauer"><span data-i18n="pk_verwaltung_dauer">ca. 6–12 Wochen</span></td>
<td data-titel="Gedacht für" data-i18n-attr="data-titel:pr_sp_fuer"><span data-i18n="pr_kurz_verwaltung">Belege und Zahlen organisieren</span></td>
</tr>
<tr>
<td><strong data-i18n="betreuung_h3">Laufende Betreuung</strong></td>
<td data-titel="Einstiegspreis" data-i18n-attr="data-titel:pr_sp_preis"><span class="pr-preis-gross" data-i18n="betreuung_preis">ab 49 € / Monat</span></td>
<td data-titel="Zeitrahmen" data-i18n-attr="data-titel:pr_sp_dauer">—</td>
<td data-titel="Gedacht für" data-i18n-attr="data-titel:pr_sp_fuer"><span data-i18n="pr_kurz_betreuung">Nach der Übergabe weiterlaufen lassen</span></td>
</tr>
</tbody>
</table>
</div>
<p class="wd-personalisierung wd-auf" style="margin-top:.9rem" data-i18n="pk_personalisierung">Personalisierung möglich — verändert Preis und Dauer.</p>
</div>
</section>
<!-- ---------------- Was den Preis bewegt ---------------- -->
<section class="wd-abschnitt wd-abschnitt--gehoben">
<div class="wd-container">
<h2 class="wd-auf" data-i18n="pr_was_h2">Was den Preis bewegt</h2>
<div class="wd-grid wd-grid--2" style="margin-top:1.8rem">
<div class="wd-karte wd-karte--lila wd-karte--kappe wd-auf">
<h3 data-i18n="pr_hoch_h3">Macht es teurer und länger</h3>
<ul class="wd-liste">
<li data-i18n="pr_hoch_1">Viele Unterseiten oder viele Produkte</li>
<li data-i18n="pr_hoch_2">Zusätzliche Sprachen</li>
<li data-i18n="pr_hoch_3">Texte und Bilder müssen erst erstellt werden</li>
<li data-i18n="pr_hoch_4">Anbindung an fremde Systeme (Kasse, Kalender, Warenwirtschaft)</li>
<li data-i18n="pr_hoch_5">Mehr Feedbackrunden als vereinbart</li>
</ul>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_runter_h3">Macht es günstiger und schneller</h3>
<ul class="wd-liste">
<li data-i18n="pr_runter_1">Texte, Logo und Bilder liegen fertig vor</li>
<li data-i18n="pr_runter_2">Klare Vorstellung vom Ziel der Seite</li>
<li data-i18n="pr_runter_3">Eine Person entscheidet, nicht ein Gremium</li>
<li data-i18n="pr_runter_4">Rückmeldungen gebündelt statt tröpfchenweise</li>
<li data-i18n="pr_runter_5">Bestehende Domain und bestehendes Hosting</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ---------------- Zahlung ---------------- -->
<section class="wd-abschnitt">
<div class="wd-container">
<h2 class="wd-auf" data-i18n="pr_zahlung_h2">Wie bezahlt wird</h2>
<div class="pr-zahlung" style="margin-top:1.8rem">
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z1_h3">1. Angebot</h3>
<p data-i18n="pr_z1_p">Nach dem Briefing bekommst du Preis, Umfang und Zeitrahmen schriftlich. Bis dahin entstehen dir keine Kosten.</p>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z2_h3">2. Anzahlung 30 %</h3>
<p data-i18n="pr_z2_p">Mit der Annahme des Angebots und dem Eingang der Anzahlung wird dein Zeitfenster fest reserviert. Erst dann beginnt die Arbeit.</p>
</div>
<div class="wd-karte wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z3_h3">3. Restbetrag</h3>
<p data-i18n="pr_z3_p">Der Rest wird nach deiner Abnahme fällig, vor der Veröffentlichung. Die Nutzungsrechte gehen mit der vollständigen Bezahlung an dich über.</p>
</div>
<div class="wd-karte wd-karte--lila wd-karte--kappe wd-auf">
<h3 data-i18n="pr_z4_h3">Betreuung</h3>
<p data-i18n="pr_z4_p">Läuft monatlich und ist jederzeit zum Monatsende kündbar. Keine Mindestlaufzeit, keine automatische Verlängerung um ein ganzes Jahr.</p>
</div>
</div>
<!-- Gold: Zahlungsinformation — genau der vorgesehene Zweck. -->
<div class="wd-hinweis wd-auf" style="margin-top:1.5rem">
<p class="wd-hinweis-titel" data-i18n="anzahlung_titel">Wichtig: 30 % Anzahlung</p>
<p data-i18n="anzahlung_text">Der Projektstart wird nach Annahme des schriftlichen Angebots und Eingang einer Anzahlung von 30 % des vereinbarten Gesamtpreises reserviert.</p>
</div>
<div class="wd-hinweis wd-auf" style="margin-top:1rem">
<p class="wd-hinweis-titel" data-i18n="pr_keine_zusage_titel">Keine automatische Preiszusage</p>
<p data-i18n="pr_keine_zusage_text">Die Angaben auf dieser Seite sind Richtwerte, kein Vertrag. Auch das Anfrageformular erzeugt keine verbindliche Zusage. Der Endpreis entsteht ausschließlich durch ein schriftliches Angebot nach Prüfung des tatsächlichen Umfangs.</p>
</div>
</div>
</section>
<section class="wd-abschnitt wd-abschnitt--gehoben">
<div class="wd-container wd-container--schmal" style="text-align:center">
<h2 data-i18n="pr_cta_h2">Passt das zu deinem Budget?</h2>
<p class="wd-lead" data-i18n="pr_cta_p">Sag im Formular einfach, welcher Rahmen realistisch ist. Wenn es nicht passt, sage ich das offen — statt ein Angebot zu schreiben, das nachher niemand bezahlen will.</p>
<div class="wd-btn-reihe" style="justify-content:center">
<a class="wd-btn wd-btn--haupt" href="/webdesign/anfrage.html" data-i18n="nav_anfrage">Projekt anfragen</a>
<a class="wd-btn wd-btn--zweit" href="/webdesign/leistungen.html" data-i18n="nav_leistungen">Leistungen</a>
</div>
</div>
</section>
</main>
<div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-preise.js?v=20260823wd19"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script>
</body>
</html>
+3 -3
View File
@@ -8,8 +8,8 @@
<link rel="icon" type="image/png" href="/assets/img/favicon.png" /> <link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<link rel="manifest" href="/webdesign/app.webmanifest" /> <link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#05070b" /> <meta name="theme-color" content="#05070b" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
</head> </head>
<body class="wd"> <body class="wd">
<div id="wd-kopf"></div> <div id="wd-kopf"></div>
@@ -400,6 +400,6 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+1 -1
View File
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */ Stand fest. */
const CACHE_NAME = "dogfather-webdesign-v19"; const CACHE_NAME = "dogfather-webdesign-v20";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE /* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */ HTML-Datei in dieser Liste. */
+4 -4
View File
@@ -13,8 +13,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
.ue-kopf { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.5rem, 4vw, 3rem); align-items: center; } .ue-kopf { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.5rem, 4vw, 3rem); align-items: center; }
/* Auf dem Handy zuerst der Text, dann das Bild: sonst schiebt ein /* Auf dem Handy zuerst der Text, dann das Bild: sonst schiebt ein
@@ -127,7 +127,7 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-ueber.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-ueber.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -11,8 +11,8 @@
<link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" /> <link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" />
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-title" content="DF Verwaltung" /> <meta name="apple-mobile-web-app-title" content="DF Verwaltung" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* ===================================================================== /* =====================================================================
Verwaltungsbereich — bewusst NUR AUF DEUTSCH. Verwaltungsbereich — bewusst NUR AUF DEUTSCH.
@@ -761,7 +761,7 @@
<div class="vw-detail-blatt" id="vw-detail-blatt"></div> <div class="vw-detail-blatt" id="vw-detail-blatt"></div>
</div> </div>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script> <script>
/* ===================================================================== /* =====================================================================
Verwaltung: Anfragen ansehen, Status ändern, Notizen, Archivieren. Verwaltung: Anfragen ansehen, Status ändern, Notizen, Archivieren.
+5 -5
View File
@@ -9,8 +9,8 @@
<link rel="icon" type="image/png" href="/assets/img/favicon.png" /> <link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<link rel="manifest" href="/webdesign/app.webmanifest" /> <link rel="manifest" href="/webdesign/app.webmanifest" />
<meta name="theme-color" content="#05070b" /> <meta name="theme-color" content="#05070b" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
</head> </head>
<body class="wd"> <body class="wd">
<div id="wd-kopf"></div> <div id="wd-kopf"></div>
@@ -137,8 +137,8 @@
<div id="wd-fuss"></div> <div id="wd-fuss"></div>
<script src="/assets/js/i18n-wd-widerruf.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-widerruf.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script src="/assets/js/wd-widerruf.js?v=20260823wd19"></script> <script src="/assets/js/wd-widerruf.js?v=20260823wd20"></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -21,8 +21,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" /> <meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
<link rel="stylesheet" href="/assets/css/main.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/main.css?v=20260823wd20" />
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd19" /> <link rel="stylesheet" href="/assets/css/webdesign.css?v=20260823wd20" />
<style> <style>
/* ===================================================================== /* =====================================================================
Zugangswand — nur hier gebraucht, deshalb bewusst NICHT in Zugangswand — nur hier gebraucht, deshalb bewusst NICHT in
@@ -177,8 +177,8 @@
</div> </div>
</main> </main>
<script src="/assets/js/i18n-wd-zugang.js?v=20260823wd19"></script> <script src="/assets/js/i18n-wd-zugang.js?v=20260823wd20"></script>
<script src="/assets/js/wd-core.js?v=20260823wd19"></script> <script src="/assets/js/wd-core.js?v=20260823wd20"></script>
<script> <script>
(function () { (function () {
"use strict"; "use strict";