feat(marketing): Cookie-Hinweis & Datenschutz an Laravel-Integration angepasst
Durch die Laravel-Integration setzt die Seite jetzt technisch notwendige Cookies (markemacht-session, XSRF-TOKEN). Der pauschale Hinweis „Keine Cookies" stimmt damit nicht mehr. - mm-wirkung wird nicht mehr als Cookie gespiegelt → nur noch localStorage (JS + Inline-Head-Script); kein Flash, da vor erstem Paint gesetzt - Footer: „Keine Cookies" → „DSGVO-konform · keine Weitergabe" - Datenschutz: neuer Absatz „Technisch notwendige Cookies" (markemacht-session, XSRF-TOKEN; § 25 Abs. 2 TTDSG i.V.m. Art. 6 Abs. 1 lit. f DSGVO, kein Banner nötig) - Feature-Tests für Footer-Hinweis und Datenschutz-Inhalt Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1f7c0aa430
commit
11a76f034b
5 changed files with 747 additions and 1 deletions
311
resources/js/web/markemacht.js
Normal file
311
resources/js/web/markemacht.js
Normal file
|
|
@ -0,0 +1,311 @@
|
|||
/* markemacht.de — Interaktionen (portiert aus _markemacht.de/assets/js/app.js)
|
||||
* Anpassungen für Laravel/Vite:
|
||||
* - Aktiv-Navigation kommt serverseitig (aria-current/is-active in der Nav-Komponente) → kein JS nötig.
|
||||
* - Fonts sind in theme-markemacht.css gebündelt → keine dynamische Font-Injektion mehr.
|
||||
* - Das Audit-Formular wird von der Livewire-Komponente versendet → hier nur Modal-Chrome.
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
/* ---------- Wirkung ---------------------------------------------------- */
|
||||
|
||||
const STORAGE_KEY = 'mm-wirkung';
|
||||
const VALID = ['monolith', 'editorial'];
|
||||
const DEFAULT = 'monolith';
|
||||
|
||||
function getStored() {
|
||||
try {
|
||||
const v = localStorage.getItem(STORAGE_KEY);
|
||||
return VALID.includes(v) ? v : null;
|
||||
} catch (_) { return null; }
|
||||
}
|
||||
|
||||
function applyMode(mode) {
|
||||
if (!VALID.includes(mode)) mode = DEFAULT;
|
||||
document.documentElement.setAttribute('data-theme', mode);
|
||||
// Persistenz ausschließlich im localStorage — kein Cookie (Datenschutz, siehe Footer/Datenschutz).
|
||||
try { localStorage.setItem(STORAGE_KEY, mode); } catch (_) {}
|
||||
syncButtons(mode);
|
||||
}
|
||||
|
||||
function syncButtons(mode) {
|
||||
document.querySelectorAll('[data-wirkung]').forEach((btn) => {
|
||||
const pressed = btn.getAttribute('data-wirkung') === mode;
|
||||
btn.setAttribute('aria-pressed', pressed ? 'true' : 'false');
|
||||
});
|
||||
}
|
||||
|
||||
function initWirkung() {
|
||||
const initial = getStored() || DEFAULT;
|
||||
applyMode(initial);
|
||||
|
||||
document.querySelectorAll('[data-wirkung]').forEach((btn) => {
|
||||
btn.addEventListener('click', () => {
|
||||
applyMode(btn.getAttribute('data-wirkung'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- Mobile Drawer --------------------------------------------- */
|
||||
|
||||
function initDrawer() {
|
||||
const drawer = document.querySelector('[data-mobile-drawer]');
|
||||
if (!drawer) return;
|
||||
|
||||
const openBtns = document.querySelectorAll('[data-drawer-open]');
|
||||
const closeBtns = document.querySelectorAll('[data-drawer-close]');
|
||||
|
||||
function open() {
|
||||
drawer.classList.add('is-open');
|
||||
document.body.classList.add('drawer-open');
|
||||
drawer.setAttribute('aria-hidden', 'false');
|
||||
openBtns.forEach((btn) => btn.setAttribute('aria-expanded', 'true'));
|
||||
const firstLink = drawer.querySelector('a, button');
|
||||
if (firstLink) firstLink.focus();
|
||||
}
|
||||
function close() {
|
||||
drawer.classList.remove('is-open');
|
||||
document.body.classList.remove('drawer-open');
|
||||
drawer.setAttribute('aria-hidden', 'true');
|
||||
openBtns.forEach((btn) => btn.setAttribute('aria-expanded', 'false'));
|
||||
}
|
||||
|
||||
openBtns.forEach((b) => b.addEventListener('click', open));
|
||||
closeBtns.forEach((b) => b.addEventListener('click', close));
|
||||
drawer.querySelectorAll('a[href]').forEach((a) => a.addEventListener('click', close));
|
||||
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && drawer.classList.contains('is-open')) close();
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- Audit Modal (nur Chrome: öffnen/schließen/Fokus) ----------- */
|
||||
|
||||
function initAuditModal() {
|
||||
const modal = document.querySelector('[data-audit-modal]');
|
||||
if (!modal) return;
|
||||
|
||||
const openButtons = document.querySelectorAll('[data-audit-modal-open]');
|
||||
const closeButtons = modal.querySelectorAll('[data-audit-modal-close]');
|
||||
const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled])';
|
||||
let lastActive = null;
|
||||
|
||||
function getFocusable() {
|
||||
return Array.from(modal.querySelectorAll(focusableSelector))
|
||||
.filter((el) => el.offsetParent !== null && el.tabIndex >= 0);
|
||||
}
|
||||
|
||||
function open() {
|
||||
lastActive = document.activeElement;
|
||||
modal.classList.add('is-open');
|
||||
modal.setAttribute('aria-hidden', 'false');
|
||||
document.body.classList.add('modal-open');
|
||||
const first = getFocusable()[0];
|
||||
if (first) first.focus();
|
||||
}
|
||||
|
||||
function close() {
|
||||
modal.classList.remove('is-open');
|
||||
modal.setAttribute('aria-hidden', 'true');
|
||||
document.body.classList.remove('modal-open');
|
||||
if (lastActive && typeof lastActive.focus === 'function') lastActive.focus();
|
||||
}
|
||||
|
||||
openButtons.forEach((button) => button.addEventListener('click', open));
|
||||
closeButtons.forEach((button) => button.addEventListener('click', close));
|
||||
modal.addEventListener('click', (event) => {
|
||||
if (event.target === modal) close();
|
||||
});
|
||||
document.addEventListener('keydown', (event) => {
|
||||
if (!modal.classList.contains('is-open')) return;
|
||||
if (event.key === 'Escape') { close(); return; }
|
||||
if (event.key !== 'Tab') return;
|
||||
|
||||
const focusable = getFocusable();
|
||||
if (!focusable.length) return;
|
||||
const first = focusable[0];
|
||||
const last = focusable[focusable.length - 1];
|
||||
if (event.shiftKey && document.activeElement === first) {
|
||||
event.preventDefault();
|
||||
last.focus();
|
||||
} else if (!event.shiftKey && document.activeElement === last) {
|
||||
event.preventDefault();
|
||||
first.focus();
|
||||
}
|
||||
});
|
||||
|
||||
// Livewire signalisiert erfolgreichen Versand → Modal schließen.
|
||||
window.addEventListener('audit-sent', () => window.setTimeout(close, 2500));
|
||||
}
|
||||
|
||||
/* ---------- Hero Keyvisual (Lazy Load) -------------------------------- */
|
||||
|
||||
function initHeroKeyvisual() {
|
||||
const slots = document.querySelectorAll('.monolith');
|
||||
if (!slots.length) return;
|
||||
|
||||
const resolveCssUrl = (value) => {
|
||||
const trimmed = (value || '').trim();
|
||||
if (!trimmed) return null;
|
||||
|
||||
// Manche Browser liefern bereits eine absolute URL ohne url()-Hülle.
|
||||
if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
||||
|
||||
const match = trimmed.match(/url\(\s*["']?([^"')]+)["']?\s*\)/i);
|
||||
if (!match) return null;
|
||||
|
||||
const raw = match[1].trim();
|
||||
if (/^https?:\/\//i.test(raw)) return raw;
|
||||
|
||||
// url(/web/…) wird in Custom Properties teils als //web/… serialisiert.
|
||||
// Das ist kein protocol-relative Host, sondern ein site-root-Pfad.
|
||||
if (raw.startsWith('//')) {
|
||||
return `${window.location.origin}/${raw.replace(/^\/+/, '')}`;
|
||||
}
|
||||
|
||||
if (raw.startsWith('/')) {
|
||||
return `${window.location.origin}${raw}`;
|
||||
}
|
||||
|
||||
const cssLink = document.querySelector('link[rel="stylesheet"][href*="theme-markemacht"]');
|
||||
const base = cssLink ? new URL(cssLink.href) : new URL(window.location.href);
|
||||
|
||||
return new URL(raw, base).href;
|
||||
};
|
||||
|
||||
const preloadImage = (url) => new Promise((resolve, reject) => {
|
||||
const img = new Image();
|
||||
img.onload = () => resolve();
|
||||
img.onerror = () => reject(new Error(`Hero image failed: ${url}`));
|
||||
img.src = url;
|
||||
});
|
||||
|
||||
const editorialActive = () =>
|
||||
document.documentElement.getAttribute('data-theme') === 'editorial';
|
||||
|
||||
slots.forEach((slot) => {
|
||||
const styles = getComputedStyle(slot);
|
||||
const monoUrl = resolveCssUrl(styles.getPropertyValue('--hero-monolith'));
|
||||
const editUrl = resolveCssUrl(styles.getPropertyValue('--hero-editorial'));
|
||||
|
||||
const loadMono = () => {
|
||||
if (slot.classList.contains('is-loaded-mono') || !monoUrl) return Promise.resolve();
|
||||
return preloadImage(monoUrl)
|
||||
.then(() => slot.classList.add('is-loaded-mono'))
|
||||
.catch((err) => console.warn(err));
|
||||
};
|
||||
|
||||
const loadEditorial = () => {
|
||||
if (slot.classList.contains('is-loaded-editorial') || !editUrl) return Promise.resolve();
|
||||
return preloadImage(editUrl)
|
||||
.then(() => slot.classList.add('is-loaded-editorial'))
|
||||
.catch((err) => console.warn(err));
|
||||
};
|
||||
|
||||
const loadForViewport = () => {
|
||||
loadMono().then(() => {
|
||||
if (editorialActive()) loadEditorial();
|
||||
});
|
||||
};
|
||||
|
||||
document.querySelectorAll('[data-wirkung="editorial"]').forEach((btn) => {
|
||||
btn.addEventListener('mouseenter', loadEditorial, { once: true });
|
||||
btn.addEventListener('focus', loadEditorial, { once: true });
|
||||
});
|
||||
|
||||
const themeObserver = new MutationObserver(() => {
|
||||
if (editorialActive()) loadEditorial();
|
||||
});
|
||||
themeObserver.observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ['data-theme'],
|
||||
});
|
||||
|
||||
if (!('IntersectionObserver' in window)) {
|
||||
loadForViewport();
|
||||
return;
|
||||
}
|
||||
|
||||
const target = slot.closest('.hero-keyvisual') || slot.closest('.split-visual') || slot;
|
||||
const io = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry) => {
|
||||
if (!entry.isIntersecting) return;
|
||||
loadForViewport();
|
||||
io.unobserve(entry.target);
|
||||
});
|
||||
}, { rootMargin: '120px 0px', threshold: 0.01 });
|
||||
|
||||
io.observe(target);
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- Reveal ----------------------------------------------------- */
|
||||
|
||||
function initReveal() {
|
||||
const items = document.querySelectorAll('[data-reveal]');
|
||||
if (!items.length) return;
|
||||
|
||||
const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
if (prefersReduced || !('IntersectionObserver' in window)) {
|
||||
items.forEach((el) => el.classList.add('is-revealed'));
|
||||
return;
|
||||
}
|
||||
|
||||
const io = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry) => {
|
||||
if (!entry.isIntersecting) return;
|
||||
const el = entry.target;
|
||||
const delay = parseInt(el.getAttribute('data-reveal-delay') || '0', 10);
|
||||
window.setTimeout(() => el.classList.add('is-revealed'), delay);
|
||||
io.unobserve(el);
|
||||
});
|
||||
}, { threshold: 0.08, rootMargin: '0px 0px -5% 0px' });
|
||||
|
||||
items.forEach((el) => io.observe(el));
|
||||
}
|
||||
|
||||
/* ---------- Scroll position on navigation ------------------------------ */
|
||||
|
||||
function initScrollPosition() {
|
||||
if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
|
||||
|
||||
function scrollToTargetOrTop() {
|
||||
const hash = location.hash;
|
||||
if (hash.length > 1) {
|
||||
const target = document.getElementById(decodeURIComponent(hash.slice(1)));
|
||||
if (target) { target.scrollIntoView(); return; }
|
||||
}
|
||||
window.scrollTo(0, 0);
|
||||
}
|
||||
|
||||
scrollToTargetOrTop();
|
||||
window.addEventListener('pageshow', (event) => {
|
||||
if (event.persisted) scrollToTargetOrTop();
|
||||
});
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
const active = document.activeElement;
|
||||
if (active && active.closest('.site-footer')) {
|
||||
active.blur();
|
||||
scrollToTargetOrTop();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* ---------- Boot ------------------------------------------------------- */
|
||||
|
||||
function boot() {
|
||||
initScrollPosition();
|
||||
initWirkung();
|
||||
initDrawer();
|
||||
initAuditModal();
|
||||
initHeroKeyvisual();
|
||||
initReveal();
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', boot);
|
||||
} else {
|
||||
boot();
|
||||
}
|
||||
})();
|
||||
323
resources/views/web/datenschutz.blade.php
Normal file
323
resources/views/web/datenschutz.blade.php
Normal file
|
|
@ -0,0 +1,323 @@
|
|||
<x-web::layouts.marketing
|
||||
active="datenschutz"
|
||||
title="Datenschutzerklärung · MARKE MACHT"
|
||||
description="Datenschutzerklärung von MARKE MACHT mit Informationen zu Hosting, Server-Logs, Kontakt und Analyse."
|
||||
ogTitle="Datenschutzerklärung · MARKE MACHT"
|
||||
ogType="website"
|
||||
ogDescription="Datenschutzerklärung von MARKE MACHT mit Informationen zu Hosting, Server-Logs, Kontakt und Analyse.">
|
||||
|
||||
<header class="article-head">
|
||||
<div class="shell grid-12">
|
||||
<div class="col-12 stack-24">
|
||||
<a class="link-arrow" href="{{ route('index') }}">
|
||||
<svg class="icon" aria-hidden="true"><use href="/web/markemacht/icons.svg#arrow-back"></use></svg>
|
||||
Zurück zur Startseite
|
||||
</a>
|
||||
<div class="article-meta">
|
||||
<span class="meta accent">Rechtliches</span>
|
||||
<span class="meta mute">Datenschutz</span>
|
||||
</div>
|
||||
<h1 class="hero-headline" style="max-width: 18ch; font-size: clamp(38px, 5.6vw, 68px);">
|
||||
Datenschutzerklärung
|
||||
</h1>
|
||||
<p class="lead dim max-wide">
|
||||
Informationen dazu, welche personenbezogenen Daten beim Besuch dieser Website verarbeitet werden.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<article class="section section-border-top">
|
||||
<div class="shell grid-12">
|
||||
<div class="col-12">
|
||||
<div class="prose">
|
||||
<h2>1. Datenschutz auf einen Blick</h2>
|
||||
<p><strong>Allgemeine Hinweise</strong></p>
|
||||
<p>
|
||||
Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie unsere Website besuchen.
|
||||
Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz
|
||||
entnehmen Sie unserer unter diesem Text aufgeführten Datenschutzerklärung.
|
||||
</p>
|
||||
|
||||
<p><strong>Datenerfassung auf unserer Website</strong></p>
|
||||
<p><strong>Wer ist verantwortlich für die Datenerfassung auf dieser Website?</strong></p>
|
||||
<p>
|
||||
Die Datenverarbeitung auf dieser Website erfolgt durch den Websitebetreiber. Dessen Kontaktdaten können Sie dem Impressum dieser Website entnehmen.
|
||||
</p>
|
||||
|
||||
<p><strong>Wie erfassen wir Ihre Daten?</strong></p>
|
||||
<p>
|
||||
Ihre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen. Hierbei kann es sich z.B. um Daten handeln, die Sie in ein Kontaktformular eingeben.
|
||||
</p>
|
||||
<p>
|
||||
Andere Daten werden automatisch beim Besuch der Website durch unsere IT-Systeme erfasst. Das sind vor allem technische Daten
|
||||
(z.B. Internetbrowser, Betriebssystem oder Uhrzeit des Seitenaufrufs). Die Erfassung dieser Daten erfolgt automatisch, sobald Sie unsere Website betreten.
|
||||
</p>
|
||||
|
||||
<p><strong>Wofür nutzen wir Ihre Daten?</strong></p>
|
||||
<p>
|
||||
Ein Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gewährleisten.
|
||||
Andere Daten werden zur anonymisierten Analyse Ihres Nutzerverhaltens verwendet.
|
||||
</p>
|
||||
|
||||
<p><strong>Welche Rechte haben Sie bezüglich Ihrer Daten?</strong></p>
|
||||
<p>
|
||||
Sie haben jederzeit das Recht unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten.
|
||||
Sie haben außerdem ein Recht, die Berichtigung, Sperrung oder Löschung dieser Daten zu verlangen. Hierzu sowie zu weiteren Fragen zum Thema Datenschutz
|
||||
können Sie sich jederzeit unter der im Impressum angegebenen Adresse an uns wenden. Des Weiteren steht Ihnen ein Beschwerderecht bei der zuständigen
|
||||
Aufsichtsbehörde zu.
|
||||
</p>
|
||||
<p>
|
||||
Außerdem haben Sie das Recht, unter bestimmten Umständen die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.
|
||||
Details hierzu entnehmen Sie der Datenschutzerklärung unter „Recht auf Einschränkung der Verarbeitung“.
|
||||
</p>
|
||||
|
||||
<h2>2. Hosting</h2>
|
||||
<p><strong>Externes Hosting</strong></p>
|
||||
<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. Hierbei kann es sich v. a. um IP-Adressen, Kontaktanfragen, Meta- und Kommunikationsdaten,
|
||||
Vertragsdaten, Kontaktdaten, Namen, Websitezugriffe und sonstige Daten, die über eine Website generiert werden, handeln.
|
||||
</p>
|
||||
<p>
|
||||
Der Einsatz des Hosters erfolgt zum Zwecke der Vertragserfüllung gegenüber unseren potenziellen und bestehenden Kunden
|
||||
(Art. 6 Abs. 1 lit. b DSGVO) und im Interesse einer sicheren, schnellen und effizienten Bereitstellung unseres Online-Angebots durch einen
|
||||
professionellen Anbieter (Art. 6 Abs. 1 lit. f DSGVO). Unser Hoster wird Ihre Daten nur insoweit verarbeiten, wie dies zur Erfüllung seiner
|
||||
Leistungspflichten erforderlich ist und unsere Weisungen in Bezug auf diese Daten befolgen.
|
||||
</p>
|
||||
<p>
|
||||
Wir setzen folgenden Hoster ein:<br />
|
||||
ALL-INKL.COM - Neue Medien Münnich<br />
|
||||
Inhaber: René Münnich<br />
|
||||
Hauptstraße 68<br />
|
||||
02742 Friedersdorf
|
||||
</p>
|
||||
|
||||
<p><strong>Abschluss eines Vertrages über Auftragsverarbeitung (AVV)</strong></p>
|
||||
<p>
|
||||
Wir haben einen Vertrag über Auftragsverarbeitung (AVV) mit dem oben genannten Anbieter geschlossen. Hierbei handelt es sich um einen
|
||||
datenschutzrechtlich vorgeschriebenen Vertrag, der gewährleistet, dass dieser die personenbezogenen Daten unserer Websitebesucher nur nach
|
||||
unseren Weisungen und unter Einhaltung der DSGVO verarbeitet.
|
||||
</p>
|
||||
|
||||
<h2>3. Allgemeine Hinweise und Pflichtinformationen</h2>
|
||||
<p><strong>Datenschutz</strong></p>
|
||||
<p>
|
||||
Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und
|
||||
entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese Website benutzen, werden verschiedene personenbezogene Daten erhoben. Personenbezogene Daten sind Daten, mit denen Sie persönlich
|
||||
identifiziert werden können. Die vorliegende Datenschutzerklärung erläutert, welche Daten wir erheben und wofür wir sie nutzen. Sie erläutert
|
||||
auch, wie und zu welchem Zweck das geschieht.
|
||||
</p>
|
||||
<p>
|
||||
Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann.
|
||||
Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.
|
||||
</p>
|
||||
|
||||
<p><strong>Hinweis zur verantwortlichen Stelle</strong></p>
|
||||
<p>
|
||||
Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:<br />
|
||||
<br />
|
||||
ADAMETZ.MEDIA<br />
|
||||
Kevin Adametz<br />
|
||||
In der Lake 4<br />
|
||||
33739 Bielefeld<br />
|
||||
<br />
|
||||
Tel: +49 5206 7076721<br />
|
||||
E-Mail: <a href="mailto:info@adametz.media">info@adametz.media</a>
|
||||
</p>
|
||||
<p>
|
||||
Verantwortliche Stelle ist die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der
|
||||
Verarbeitung von personenbezogenen Daten (z.B. Namen, E-Mail-Adressen o. Ä.) entscheidet.
|
||||
</p>
|
||||
|
||||
<p><strong>Widerruf Ihrer Einwilligung zur Datenverarbeitung</strong></p>
|
||||
<p>
|
||||
Viele Datenverarbeitungsvorgänge sind nur mit Ihrer ausdrücklichen Einwilligung möglich. Sie können eine bereits erteilte Einwilligung
|
||||
jederzeit widerrufen. Dazu reicht eine formlose Mitteilung per E-Mail an uns. Die Rechtmäßigkeit der bis zum Widerruf erfolgten Datenverarbeitung
|
||||
bleibt vom Widerruf unberührt.
|
||||
</p>
|
||||
|
||||
<p><strong>Widerspruchsrecht gegen die Datenerhebung in besonderen Fällen sowie gegen Direktwerbung (Art. 21 DSGVO)</strong></p>
|
||||
<p>
|
||||
Wenn die Datenverarbeitung auf Grundlage von Art. 6 Abs. 1 lit. e oder f DSGVO erfolgt, haben Sie jederzeit das Recht, aus Gründen, die sich aus
|
||||
Ihrer besonderen Situation ergeben, gegen die Verarbeitung Ihrer personenbezogenen Daten Widerspruch einzulegen; dies gilt auch für ein auf diese
|
||||
Bestimmungen gestütztes Profiling. Die jeweilige Rechtsgrundlage, auf denen eine Verarbeitung beruht, entnehmen Sie dieser Datenschutzerklärung.
|
||||
Wenn Sie Widerspruch einlegen, werden wir Ihre betroffenen personenbezogenen Daten nicht mehr verarbeiten, es sei denn, wir können zwingende
|
||||
schutzwürdige Gründe für die Verarbeitung nachweisen, die Ihre Interessen, Rechte und Freiheiten überwiegen oder die Verarbeitung dient der
|
||||
Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen (Widerspruch nach Art. 21 Abs. 1 DSGVO).
|
||||
</p>
|
||||
<p>
|
||||
Werden Ihre personenbezogenen Daten verarbeitet, um Direktwerbung zu betreiben, so haben Sie das Recht, jederzeit Widerspruch gegen die Verarbeitung
|
||||
Sie betreffender personenbezogener Daten zum Zwecke derartiger Werbung einzulegen; dies gilt auch für das Profiling, soweit es mit solcher
|
||||
Direktwerbung in Verbindung steht. Wenn Sie widersprechen, werden Ihre personenbezogenen Daten anschließend nicht mehr zum Zwecke der Direktwerbung
|
||||
verwendet (Widerspruch nach Art. 21 Abs. 2 DSGVO).
|
||||
</p>
|
||||
|
||||
<p><strong>Beschwerderecht bei der zuständigen Aufsichtsbehörde</strong></p>
|
||||
<p>
|
||||
Im Falle von Verstößen gegen die DSGVO steht den Betroffenen ein Beschwerderecht bei einer Aufsichtsbehörde, insbesondere in dem Mitgliedstaat
|
||||
ihres gewöhnlichen Aufenthalts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes zu. Das Beschwerderecht besteht unbeschadet
|
||||
anderweitiger verwaltungsrechtlicher oder gerichtlicher Rechtsbehelfe.
|
||||
</p>
|
||||
|
||||
<p><strong>Recht auf Datenübertragbarkeit</strong></p>
|
||||
<p>
|
||||
Sie haben das Recht, Daten, die wir auf Grundlage Ihrer Einwilligung oder in Erfüllung eines Vertrags automatisiert verarbeiten, an sich oder an
|
||||
einen Dritten in einem gängigen, maschinenlesbaren Format aushändigen zu lassen. Sofern Sie die direkte Übertragung der Daten an einen anderen
|
||||
Verantwortlichen verlangen, erfolgt dies nur, soweit es technisch machbar ist.
|
||||
</p>
|
||||
|
||||
<p><strong>SSL- bzw. TLS-Verschlüsselung</strong></p>
|
||||
<p>
|
||||
Diese Seite nutzt aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel Bestellungen oder Anfragen,
|
||||
die Sie an uns als Seitenbetreiber senden, eine SSL-bzw. TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die
|
||||
Adresszeile des Browsers von “http://” auf “https://” wechselt und an dem Schloss-Symbol in Ihrer Browserzeile. Wenn die SSL- bzw.
|
||||
TLS-Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.
|
||||
</p>
|
||||
|
||||
<p><strong>Auskunft, Sperrung, Löschung und Berichtigung</strong></p>
|
||||
<p>
|
||||
Sie haben im Rahmen der geltenden gesetzlichen Bestimmungen jederzeit das Recht auf unentgeltliche Auskunft über Ihre gespeicherten
|
||||
personenbezogenen Daten, deren Herkunft und Empfänger und den Zweck der Datenverarbeitung und ggf. ein Recht auf Berichtigung, Sperrung oder
|
||||
Löschung dieser Daten. Hierzu sowie zu weiteren Fragen zum Thema personenbezogene Daten können Sie sich jederzeit unter der im Impressum
|
||||
angegebenen Adresse an uns wenden.
|
||||
</p>
|
||||
|
||||
<p><strong>Recht auf Einschränkung der Verarbeitung</strong></p>
|
||||
<p>
|
||||
Sie haben das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen. Das Recht auf Einschränkung der Verarbeitung
|
||||
besteht in folgenden Fällen:
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie die Richtigkeit Ihrer bei uns gespeicherten personenbezogenen Daten bestreiten, benötigen wir in der Regel Zeit, um dies zu überprüfen.
|
||||
Für die Dauer der Prüfung haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.
|
||||
</p>
|
||||
<p>
|
||||
Wenn die Verarbeitung Ihrer personenbezogenen Daten unrechtmäßig geschah / geschieht, können Sie statt der Löschung die Einschränkung der
|
||||
Datenverarbeitung verlangen.
|
||||
</p>
|
||||
<p>
|
||||
Wenn wir Ihre personenbezogenen Daten nicht mehr benötigen, Sie sie jedoch zur Ausübung, Verteidigung oder Geltendmachung von Rechtsansprüchen
|
||||
benötigen, haben Sie das Recht, statt der Löschung die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie einen Widerspruch nach Art. 21 Abs. 1 DSGVO eingelegt haben, muss eine Abwägung zwischen Ihren und unseren Interessen vorgenommen werden.
|
||||
Solange noch nicht feststeht, wessen Interessen überwiegen, haben Sie das Recht, die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten
|
||||
zu verlangen.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie die Verarbeitung Ihrer personenbezogenen Daten eingeschränkt haben, dürfen diese Daten – von ihrer Speicherung abgesehen – nur mit Ihrer
|
||||
Einwilligung oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen oder zum Schutz der Rechte einer anderen natürlichen oder
|
||||
juristischen Person oder aus Gründen eines wichtigen öffentlichen Interesses der Europäischen Union oder eines Mitgliedstaats verarbeitet werden.
|
||||
</p>
|
||||
|
||||
<p><strong>Widerspruch gegen Werbe-E-Mails</strong></p>
|
||||
<p>
|
||||
Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten zur Übersendung von nicht ausdrücklich angeforderter Werbung und
|
||||
Informationsmaterialien wird hiermit widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der
|
||||
unverlangten Zusendung von Werbeinformationen, etwa durch Spam-E-Mails, vor.
|
||||
</p>
|
||||
|
||||
<h2>4. Datenerfassung auf unserer Website</h2>
|
||||
<p><strong>Technisch notwendige Cookies</strong></p>
|
||||
<p>
|
||||
Diese Webseite setzt ausschließlich technisch notwendige Cookies, die für den Betrieb und die Absicherung
|
||||
der Formulare (z. B. des Anfrage-/Kontaktformulars) erforderlich sind:
|
||||
</p>
|
||||
<p>
|
||||
<code>markemacht-session</code> — hält Ihre Sitzung, damit eine Formulareingabe dem richtigen Seitenaufruf zugeordnet werden kann.<br />
|
||||
<code>XSRF-TOKEN</code> — schützt Formulare vor websiteübergreifender Anfragefälschung (CSRF).
|
||||
</p>
|
||||
<p>
|
||||
Diese Cookies werden ausschließlich von uns selbst gesetzt (First-Party), enthalten keine Profil- oder
|
||||
Werbedaten, dienen weder der Analyse noch dem Tracking und werden nicht an Dritte weitergegeben. Rechtsgrundlage
|
||||
ist § 25 Abs. 2 Nr. 2 TTDSG (für den vom Nutzer ausdrücklich gewünschten Dienst unbedingt erforderlich) in
|
||||
Verbindung mit Art. 6 Abs. 1 lit. f DSGVO. Eine Einwilligung ist hierfür nicht erforderlich; ein Cookie-Banner
|
||||
entfällt entsprechend.
|
||||
</p>
|
||||
|
||||
<p><strong>Lokaler Speicher (localStorage)</strong></p>
|
||||
<p>
|
||||
Für die Darstellungseinstellung „Wirkung“ (monolithisch / editorial) wird Ihre Auswahl ausschließlich im
|
||||
<code>localStorage</code> Ihres Browsers gespeichert — nicht in Cookies. Es werden dabei keine personenbezogenen Daten
|
||||
übermittelt. Sie können den Eintrag jederzeit über die Browser-Einstellungen löschen.
|
||||
</p>
|
||||
|
||||
<p><strong>Server-Log-Dateien</strong></p>
|
||||
<p>
|
||||
Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien, die Ihr Browser automatisch an uns
|
||||
übermittelt. Dies sind:
|
||||
</p>
|
||||
<p>
|
||||
Browsertyp und Browserversion<br />
|
||||
verwendetes Betriebssystem<br />
|
||||
Referrer URL<br />
|
||||
Hostname des zugreifenden Rechners<br />
|
||||
Uhrzeit der Serveranfrage<br />
|
||||
IP-Adresse
|
||||
</p>
|
||||
<p>
|
||||
Eine Zusammenführung dieser Daten mit anderen Datenquellen wird nicht vorgenommen. Die Erfassung dieser Daten erfolgt auf Grundlage von
|
||||
Art. 6 Abs. 1 lit. f DSGVO. Der Websitebetreiber hat ein berechtigtes Interesse an der technisch fehlerfreien Darstellung und der Optimierung
|
||||
seiner Website – hierzu müssen die Server-Log-Files erfasst werden.
|
||||
</p>
|
||||
|
||||
<p><strong>Kontaktformular & E-Mail-Kontakt</strong></p>
|
||||
<p>
|
||||
Wenn Sie uns per Kontaktformular oder per E-Mail Anfragen zukommen lassen, werden Ihre Angaben (z. B. Name, E-Mail-Adresse und der Text Ihrer
|
||||
Anfrage) zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre
|
||||
Einwilligung weiter.
|
||||
</p>
|
||||
<p>
|
||||
Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags
|
||||
zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem
|
||||
berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung
|
||||
(Art. 6 Abs. 1 lit. a DSGVO), sofern diese abgefragt wurde.
|
||||
</p>
|
||||
<p>
|
||||
Die von Ihnen an uns übersendeten Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen
|
||||
oder der Zweck für die Datenspeicherung entfällt (z.B. nach abgeschlossener Bearbeitung Ihrer Anfrage). Zwingende gesetzliche Bestimmungen –
|
||||
insbesondere Aufbewahrungsfristen – bleiben unberührt.
|
||||
</p>
|
||||
|
||||
<p><strong>Verarbeiten von Daten (Kunden- und Vertragsdaten)</strong></p>
|
||||
<p>
|
||||
Wir erheben, verarbeiten und nutzen personenbezogene Daten nur, soweit sie für die Begründung, inhaltliche Ausgestaltung oder Änderung des
|
||||
Rechtsverhältnisses erforderlich sind (Bestandsdaten). Dies erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, der die Verarbeitung von Daten
|
||||
zur Erfüllung eines Vertrags oder vorvertraglicher Maßnahmen gestattet. Personenbezogene Daten über die Inanspruchnahme unserer Internetseiten
|
||||
(Nutzungsdaten) erheben, verarbeiten und nutzen wir nur, soweit dies erforderlich ist, um dem Nutzer die Inanspruchnahme des Dienstes zu
|
||||
ermöglichen oder abzurechnen.
|
||||
</p>
|
||||
<p>
|
||||
Die erhobenen Kundendaten werden nach Abschluss des Auftrags oder Beendigung der Geschäftsbeziehung gelöscht. Gesetzliche Aufbewahrungsfristen
|
||||
bleiben unberührt.
|
||||
</p>
|
||||
|
||||
<h2>5. Analyse-Tools</h2>
|
||||
<p><strong>Umami Analytics (selbst gehostet)</strong></p>
|
||||
<p>
|
||||
Diese Website nutzt das Open-Source-Webanalyse-Tool Umami für interne Auswertungen. Um höchste Datenschutzstandards zu gewährleisten, wird Umami
|
||||
vollständig auf einem eigenen Server gehostet. Dadurch bleiben alle erfassten Daten in unserer alleinigen Kontrolle und werden nicht an Dritte
|
||||
weitergegeben.
|
||||
</p>
|
||||
<p>Umami wurde datenschutzfreundlich konzipiert:</p>
|
||||
<p>
|
||||
Es werden keine Cookies in Ihrem Browser gespeichert.<br />
|
||||
Es findet kein website- oder geräteübergreifendes Tracking (Cross-Site Tracking) statt.<br />
|
||||
Alle IP-Adressen werden unmittelbar bei der Erfassung vollständig anonymisiert, sodass ein Rückschluss auf Ihre Person oder Ihr genaues Gerät ausgeschlossen ist.
|
||||
</p>
|
||||
<p>
|
||||
Es werden lediglich grundlegende, anonyme Telemetriedaten erfasst (z. B. aufgerufene Seiten, Browsertyp, Betriebssystem, Herkunftsland und
|
||||
Bildschirmauflösung). Die Nutzung von Umami erfolgt auf Grundlage unseres berechtigten Interesses gemäß Art. 6 Abs. 1 lit. f DSGVO. Unser
|
||||
berechtigtes Interesse liegt in der anonymisierten Analyse des Nutzerverhaltens, um unsere Website sowie unser Angebot technisch und inhaltlich
|
||||
fortlaufend zu optimieren.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
</x-web::layouts.marketing>
|
||||
85
resources/views/web/layouts/marketing.blade.php
Normal file
85
resources/views/web/layouts/marketing.blade.php
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
@props([
|
||||
'active' => '',
|
||||
'title' => 'MARKE MACHT · Denkraum für Unternehmer',
|
||||
'description' => 'Wenn Sie Ihr Unternehmen nicht erklären können, haben Sie kein Marketingproblem. Sondern ein Markenproblem. Denkraum für Unternehmer im Mittelstand.',
|
||||
'canonical' => null,
|
||||
'ogTitle' => null,
|
||||
'ogType' => 'website',
|
||||
'ogDescription' => 'Marke ist die Fähigkeit eines Unternehmens, sich selbst eindeutig zu erklären.',
|
||||
'bodyClass' => '',
|
||||
])
|
||||
@php
|
||||
$canonicalUrl = $canonical ?? url()->current();
|
||||
$ogTitle ??= $title;
|
||||
@endphp
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" data-theme="monolith">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||
<title>{{ $title }}</title>
|
||||
<meta name="description" content="{{ $description }}" />
|
||||
|
||||
<meta property="og:type" content="{{ $ogType }}" />
|
||||
<meta property="og:site_name" content="MARKE MACHT" />
|
||||
<meta property="og:title" content="{{ $ogTitle }}" />
|
||||
<meta property="og:description" content="{{ $ogDescription }}" />
|
||||
<meta property="og:url" content="{{ $canonicalUrl }}" />
|
||||
<link rel="canonical" href="{{ $canonicalUrl }}" />
|
||||
<meta property="og:locale" content="de_DE" />
|
||||
<meta property="og:image" content="{{ url('/web/markemacht/img/og-share.webp') }}" />
|
||||
<meta property="og:image:width" content="1200" />
|
||||
<meta property="og:image:height" content="630" />
|
||||
<meta property="og:image:alt" content="MARKE MACHT — Denkraum für Unternehmer" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:image" content="{{ url('/web/markemacht/img/og-share.webp') }}" />
|
||||
<meta name="theme-color" content="#0A0A0A" media="(prefers-color-scheme: dark)" />
|
||||
<meta name="theme-color" content="#FBFAF2" media="(prefers-color-scheme: light)" />
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/web/markemacht/favicon.svg" />
|
||||
<link rel="preconnect" href="https://sys.adametz.media" crossorigin />
|
||||
|
||||
{{-- Wirkung vor dem ersten Paint setzen (kein Flash). Fonts sind in theme-markemacht.css gebündelt. --}}
|
||||
<script>
|
||||
(function () {
|
||||
'use strict';
|
||||
if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
|
||||
if (!location.hash) window.scrollTo(0, 0);
|
||||
|
||||
var v = 'monolith';
|
||||
try {
|
||||
var stored = localStorage.getItem('mm-wirkung');
|
||||
if (stored === 'monolith' || stored === 'editorial') v = stored;
|
||||
} catch (_) {}
|
||||
document.documentElement.setAttribute('data-theme', v);
|
||||
})();
|
||||
</script>
|
||||
|
||||
@vite(['resources/css/web/theme-markemacht.css', 'resources/js/web/markemacht.js'])
|
||||
<script defer src="https://sys.adametz.media/config.js" data-website-id="40125fcf-49c4-43f3-a9a5-9eec5eb55696"></script>
|
||||
|
||||
@verbatim
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "MARKE MACHT",
|
||||
"url": "https://markemacht.de/",
|
||||
"description": "Denkraum für Unternehmer im Mittelstand. Marke ist die Fähigkeit eines Unternehmens, sich selbst eindeutig zu erklären.",
|
||||
"inLanguage": "de-DE"
|
||||
}
|
||||
</script>
|
||||
@endverbatim
|
||||
</head>
|
||||
<body @class([$bodyClass => $bodyClass])>
|
||||
|
||||
@include('web.partials.nav', ['active' => $active])
|
||||
|
||||
<main id="main">
|
||||
{{ $slot }}
|
||||
</main>
|
||||
|
||||
@include('web.partials.footer')
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<div class="footer-inner">
|
||||
<div class="footer-meta">
|
||||
<p class="footer-copy">© <strong>Marke macht<span class="accent">.</span></strong> · Denkraum für Unternehmer</p>
|
||||
<p class="footer-note">Keine Cookies</p>
|
||||
<p class="footer-note">DSGVO-konform · keine Weitergabe</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a class="footer-link" href="{{ route('impressum') }}">Impressum</a>
|
||||
|
|
|
|||
27
tests/Feature/Web/CookieHinweisTest.php
Normal file
27
tests/Feature/Web/CookieHinweisTest.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
use function Pest\Laravel\get;
|
||||
|
||||
test('der footer nennt den neuen datenschutz-hinweis statt „keine cookies"', function () {
|
||||
get(route('index'))
|
||||
->assertOk()
|
||||
->assertSee('keine Weitergabe')
|
||||
->assertDontSee('Keine Cookies');
|
||||
});
|
||||
|
||||
test('die datenschutzerklärung deklariert die technisch notwendigen cookies', function () {
|
||||
get(route('datenschutz'))
|
||||
->assertOk()
|
||||
->assertSee('Technisch notwendige Cookies')
|
||||
->assertSee('markemacht-session')
|
||||
->assertSee('XSRF-TOKEN')
|
||||
->assertDontSee('verwendet keine Cookies');
|
||||
});
|
||||
|
||||
test('die wirkungs-präferenz wird nicht mehr als cookie gesetzt', function () {
|
||||
// Der Inline-Head-Script liest die Präferenz nur noch aus localStorage, nicht aus Cookies.
|
||||
get(route('index'))
|
||||
->assertOk()
|
||||
->assertDontSee('document.cookie.match', false)
|
||||
->assertDontSee('mm-wirkung=', false);
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue