Impressum auf Luxemburg-Recht korrigiert + Zugangsseite auf 2 Kacheln umgebaut

- kontakt.html: Anbieterkennzeichnung zitierte faelschlich deutsches Recht
  (§5 TMG) trotz Sitz in Luxemburg. Jetzt korrekt Art. 5 der loi modifiee
  du 14 aout 2000 relative au commerce electronique. Telefonnummer ergaenzt
  (in Luxemburg fuer die Anbieterkennzeichnung ueblich, in Deutschland nicht
  zwingend noetig - dort galt bislang keine). Veraltete "§55 Abs.2 RStV"-Zeile
  entfernt: gilt inhaltlich wie rechtlich nicht (deutsches Landesmedienrecht,
  Sitzlandprinzip, zudem kein journalistisch-redaktionelles Angebot). EU-OS-
  Streitschlichtungslink + VSBG-Erklaerung ergaenzt (fehlten bisher, bei
  bezahltem Supporter-Abo EU-weit vorgeschrieben).
- gate.html: gemeinsame Zugangs-Box fuer Dogi/VanVan durch 2 getrennte
  Kacheln ersetzt (gleiches Muster wie bereits in verwaltung.html), nur die
  Kacheln selbst neu - Hintergrund/Logo/Buehne unveraendert. Beide Formulare
  rufen weiterhin denselben /gate-auth-Endpunkt auf, Rollen-Erkennung bleibt
  serverseitig ueber die Zugangscodes (server/gate.js unveraendert).
This commit is contained in:
2026-08-07 12:53:54 +02:00
parent 7201c6a300
commit fed6a1f7c7
2 changed files with 125 additions and 35 deletions
+120 -32
View File
@@ -144,6 +144,69 @@
.gate-box .btn-holo { width: 100%; justify-content: center; margin-top: .2rem; }
.gate-fehler { color: #ff9a9a; font-size: .9rem; margin-top: .9rem; display: none; }
.gate-fehler.zeige { display: block; }
/* ---------- Zwei getrennte Zugangskacheln (Dogi/VanVan) statt einer
gemeinsamen Box — Nutzer-Wunsch 07.08.2026 ("Eingang von VanVan wie bei
ihrer normalen Seite mit den 2 Kacheln"). Gleiches Muster wie schon in
verwaltung.html (.vw-gate-card) etabliert, hier nur farblich an die
bereits vorhandene Gold/Babyblau-Optik dieser Seite angepasst. Nur die
Kacheln sind neu — Hintergrund/Logo/Bühne bleiben unverändert. ---------- */
.gate-cards {
position: relative; z-index: 2; display: flex; flex-wrap: wrap; gap: 1.1rem;
justify-content: center; width: 100%; margin-top: 1.3rem;
}
.gate-card {
position: relative; isolation: isolate; overflow: hidden;
flex: 1 1 220px; max-width: 280px; text-align: center;
padding: 1.6rem 1.3rem 1.4rem; border-radius: 18px; border: 1.5px solid transparent;
background:
linear-gradient(180deg, rgba(20,23,29,.92), rgba(10,12,15,.96)) padding-box,
linear-gradient(110deg, #8fd9ea, #38bdf8, #d4af37, #8fd9ea) border-box;
background-size: 100% 100%, 320% 100%;
box-shadow: 0 30px 70px -25px rgba(0,0,0,.75), 0 0 50px -20px rgba(143,217,234,.3);
}
/* VanVans Kachel: eigene, femininere Farbwelt (Rosé/Lavendel/Gold statt
Babyblau) — gleiches Prinzip wie in verwaltung.html, keine bloße
Umfärbung von Dogis Kachel. */
.gate-card--vanvan {
background:
linear-gradient(180deg, rgba(24,15,20,.92), rgba(15,9,13,.96)) padding-box,
linear-gradient(110deg, #ff8fc6, #c084fc, #d4af37, #ff8fc6) border-box;
box-shadow: 0 30px 70px -25px rgba(0,0,0,.75), 0 0 50px -20px rgba(255,143,198,.35);
}
.gate-card-icon {
display: block; width: 60px; height: 60px; margin: 0 auto .6rem; border-radius: 50%;
background-size: cover; background-position: center;
border: 2px solid rgba(143,217,234,.6);
box-shadow: 0 0 18px rgba(143,217,234,.4), inset 0 0 10px rgba(255,255,255,.08);
}
.gate-card-icon--dogi { background-image: url('assets/img/vw-gate-dogi.jpg'); }
.gate-card-icon--vanvan { background-image: url('assets/img/vw-gate-vanvan.jpg'); }
.gate-card--vanvan .gate-card-icon { border-color: rgba(255,143,198,.65); }
.gate-card-name { font-size: 1.05rem; font-weight: 800; margin: 0 0 .8rem; color: var(--text); }
.gate-card--vanvan .gate-card-name { color: #ffd1e8; }
.gate-card input {
width: 100%; box-sizing: border-box; padding: .8rem .9rem; border-radius: 12px; text-align: center;
letter-spacing: .1em; font-size: 1rem; font-weight: 600; margin-bottom: .9rem;
background: rgba(255,255,255,.04); border: 1.5px solid var(--border); color: var(--text);
transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
}
.gate-card input::placeholder { letter-spacing: normal; font-weight: 400; color: rgba(154,164,178,.55); }
.gate-card input:focus {
outline: none; border-color: rgba(212,175,55,.7); background: rgba(255,255,255,.06);
box-shadow: 0 0 0 4px rgba(212,175,55,.14);
}
.gate-card--vanvan input:focus { border-color: rgba(255,143,198,.7); box-shadow: 0 0 0 4px rgba(255,143,198,.16); }
.gate-card .btn-holo.gate-card-btn { width: 100%; justify-content: center; padding: .65rem 1rem; font-size: .88rem; gap: .3rem; }
.gate-card-btn--vanvan {
background: linear-gradient(120deg, #ff8fc6 0%, #c084fc 30%, #ffd76a 55%, #ff8fc6 80%, #c084fc 100%);
background-size: 340% 340%;
}
.gate-card .gate-fehler { margin-top: .7rem; }
@media (max-width: 480px) {
.gate-cards { flex-direction: column; align-items: center; }
.gate-card { max-width: 300px; width: 100%; }
}
</style>
</head>
<body>
@@ -160,21 +223,38 @@
<!-- Nutzer-Wunsch 04.08.2026: Besucher ohne Zugangscode (z.B. über einen
gefundenen/geteilten Link) sollen HIER nicht mehr "Noch nicht
öffentlich / im Aufbau" lesen — stattdessen ein normal wirkender
Link auf die eigene Domain (die spätere, öffentliche Hauptseite).
Das Eingabefeld darunter bleibt unverändert für Dogi/VanVan. -->
Link auf die eigene Domain (die spätere, öffentliche Hauptseite). -->
<h1>DOGFATHER UNIVERSE</h1>
<p class="small" style="opacity:.85;">
<a href="https://dogfather-universe.com/" style="color:#8fd9ea; font-weight:700; text-decoration: underline; text-underline-offset: .2em;">dogfather-universe.com</a>
</p>
<form id="gate-form">
<input type="text" id="gate-code" placeholder="Zugangscode" autocomplete="off" autocapitalize="off" spellcheck="false" autofocus />
<button type="submit" class="btn-holo">
<span class="btn-holo-spark" aria-hidden="true">✨</span>
<span class="btn-holo-text">Weiter</span>
<span class="btn-holo-spark" aria-hidden="true">✨</span>
</div>
<!-- Nutzer-Wunsch 07.08.2026: statt einem gemeinsamen Eingabefeld für
Dogi/VanVan jetzt 2 getrennte Kacheln, gleiches Muster wie schon in
verwaltung.html — beide Formulare rufen weiterhin denselben
/gate-auth-Endpunkt auf, der Zugangscode selbst entscheidet
serverseitig, wer sich anmeldet (siehe server/gate.js). -->
<div class="gate-cards">
<form id="gate-form-dogi" class="gate-card gate-card--dogi" novalidate>
<span class="gate-card-icon gate-card-icon--dogi" aria-hidden="true"></span>
<h2 class="gate-card-name">Dogi</h2>
<input type="text" id="gate-code-dogi" placeholder="Zugangscode" autocomplete="off" autocapitalize="off" spellcheck="false" autofocus />
<button type="submit" class="btn-holo gate-card-btn">
<span class="btn-holo-text">💙 Öffnen</span>
</button>
<p class="gate-fehler" id="gate-fehler-dogi"></p>
</form>
<form id="gate-form-vanvan" class="gate-card gate-card--vanvan" novalidate>
<span class="gate-card-icon gate-card-icon--vanvan" aria-hidden="true"></span>
<h2 class="gate-card-name">VanVan</h2>
<input type="text" id="gate-code-vanvan" placeholder="Zugangscode" autocomplete="off" autocapitalize="off" spellcheck="false" />
<button type="submit" class="btn-holo gate-card-btn gate-card-btn--vanvan">
<span class="btn-holo-text">💗 Öffnen</span>
</button>
<p class="gate-fehler" id="gate-fehler-vanvan"></p>
</form>
<p class="gate-fehler" id="gate-fehler"></p>
</div>
</div>
@@ -197,31 +277,39 @@
const params = new URLSearchParams(location.search);
const next = params.get("next") || "/index.html";
const form = document.getElementById("gate-form");
const fehlerEl = document.getElementById("gate-fehler");
form.addEventListener("submit", async function (e) {
e.preventDefault();
fehlerEl.classList.remove("zeige");
const code = document.getElementById("gate-code").value.trim();
if (!code) return;
try {
const res = await fetch("/gate-auth", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ code, next }),
});
const data = await res.json();
if (!res.ok || !data.ok) {
fehlerEl.textContent = (data && data.error) || "Falscher Zugangscode.";
// Beide Kacheln (Dogi/VanVan) nutzen dieselbe Logik und denselben
// /gate-auth-Endpunkt — nur das jeweils eigene Formular/Eingabefeld/
// Fehlerfeld unterscheidet sich.
function bindeGateKachel(formId, inputId, fehlerId) {
const form = document.getElementById(formId);
const fehlerEl = document.getElementById(fehlerId);
form.addEventListener("submit", async function (e) {
e.preventDefault();
fehlerEl.classList.remove("zeige");
const code = document.getElementById(inputId).value.trim();
if (!code) return;
try {
const res = await fetch("/gate-auth", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ code, next }),
});
const data = await res.json();
if (!res.ok || !data.ok) {
fehlerEl.textContent = (data && data.error) || "Falscher Zugangscode.";
fehlerEl.classList.add("zeige");
return;
}
location.href = data.next || "/index.html";
} catch {
fehlerEl.textContent = "Verbindung fehlgeschlagen. Bitte nochmal versuchen.";
fehlerEl.classList.add("zeige");
return;
}
location.href = data.next || "/index.html";
} catch {
fehlerEl.textContent = "Verbindung fehlgeschlagen. Bitte nochmal versuchen.";
fehlerEl.classList.add("zeige");
}
});
});
}
bindeGateKachel("gate-form-dogi", "gate-code-dogi", "gate-fehler-dogi");
bindeGateKachel("gate-form-vanvan", "gate-code-vanvan", "gate-fehler-vanvan");
})();
</script>
</body>
+5 -3
View File
@@ -54,13 +54,15 @@
<h2 data-i18n="kt_impressum_h2">Impressum</h2>
<p class="small muted" data-i18n="kt_impressum_hinweis">Rechtstexte werden auf Deutsch bereitgestellt, um Übersetzungsfehler bei rechtlich verbindlichen Angaben zu vermeiden. / Legal texts are provided in German only to avoid translation errors in legally binding information.</p>
<p class="small muted">
Angaben gemäß Anbieterkennzeichnung (u.a. § 5 TMG bzw. vergleichbare Vorschriften)<br>
Angaben gemäß Art. 5 der loi modifiée du 14 août 2000 relative au commerce électronique (Luxemburg)<br>
Filipe Pereira Queiroz<br>
3, rue Arthur Thinnes<br>
L-3919 Mondercange<br>
Luxemburg<br><br>
Kontakt: <a href="mailto:[email protected]">[email protected]</a><br><br>
Verantwortlich für den Inhalt (auch i.S.v. § 55 Abs. 2 RStV bzw. vergleichbarer Vorschriften): Filipe Pereira Queiroz, Anschrift wie oben.<br><br>
Telefon: +49 177 3292805<br>
E-Mail: <a href="mailto:[email protected]">[email protected]</a><br><br>
<strong>EU-Streitschlichtung:</strong> Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: <a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>. Unsere E-Mail-Adresse finden Sie oben im Impressum.<br><br>
<strong>Verbraucherstreitbeilegung:</strong> Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.<br><br>
DOGFATHER UNIVERSE ist ein persönliches Content-/Community-Projekt von Filipe Pereira Queiroz (Künstlername „Dogfather"). Es besteht keine Verbindung dieser Angaben zu Namen weiterer auf der Seite gezeigter Personen (z. B. Team-/Community-Mitglieder), die ausschließlich mit ihren Spitz-/Künstlernamen auftreten.
</p>
</div>