Design · Bausteine-Dossier

Kategorie

Templates & Layouts

Ganze Seiten-Gerüste und Layout-Muster: Rechtstexte, Detailseiten, Kontakt-Splits, Vergleichsslider, Hub-Grids und mehr. Akzentfarbe über --akzent in einer Zeile anpassbar; Layouts hier als verkleinerte, repräsentative Demos in der Bühne.

Legal-/Unterseiten-Template + Platzhalter-Markierung

Pol 2 · Klarheit Anlass: Impressum / Datenschutz

Schlanker Seitenkopf mit Akzent-Trennlinie und lesefreundlicher Rechtstext-Spalte; nummerierte Counter-Liste statt Standard-ol. Die .fx-ph-Hervorhebung markiert noch zu füllende Platzhalter mit ⚠ — fällt beim Korrekturlesen sofort auf. Vorbild: NDS, Silver, Nördlicht.

<section class="fx-legal-page">
  <header class="fx-legal-head">
    <a href="#" class="fx-legal-back">← Zurück zur Startseite</a>
    <h2>Datenschutzerklärung</h2>
  </header>
  <div class="fx-legal-body">
    <h3>1. Verantwortlicher</h3>
    <p>Verantwortlich ist <span class="fx-ph">Firmenname einsetzen</span>, vertreten
      durch die Geschäftsführung.</p>
    <h3>2. Ihre Rechte</h3>
    <ol>
      <li>Recht auf Auskunft über die gespeicherten Daten.</li>
      <li>Recht auf Berichtigung und Löschung.</li>
      <li>Beschwerderecht bei der <a href="#">zuständigen Aufsichtsbehörde</a>.</li>
    </ol>
    <p class="fx-legal-stand">Stand: <span class="fx-ph">Datum einsetzen</span></p>
  </div>
</section>

<style>
.fx-legal-page{max-width:560px;background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden}
.fx-legal-head{padding:26px 28px 22px;background:linear-gradient(180deg,#1c1c22,#16161a);position:relative}
.fx-legal-head::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:linear-gradient(90deg,transparent,var(--akzent, #7c87ff) 30%,var(--akzent, #7c87ff) 70%,transparent);opacity:.5}
.fx-legal-back{display:inline-flex;align-items:center;gap:6px;color:#a1a1aa;font-size:12px;font-weight:600;
  text-decoration:none;margin-bottom:14px;transition:color .2s ease}
.fx-legal-back:hover,.fx-legal-back:focus-visible{color:var(--akzent, #7c87ff)}
.fx-legal-head h2{margin:0;font-size:1.35rem;color:#f4f4f5}
.fx-legal-body{padding:22px 28px 26px;color:#a1a1aa;font-size:.86rem;line-height:1.75}
.fx-legal-body h3{color:#f4f4f5;font-size:.95rem;font-weight:700;margin:20px 0 8px}
.fx-legal-body h3:first-child{margin-top:0}
.fx-legal-body ol{counter-reset:lg;list-style:none;padding-left:0;margin:0 0 12px}
.fx-legal-body ol li{counter-increment:lg;position:relative;padding-left:24px;margin-bottom:7px}
.fx-legal-body ol li::before{content:counter(lg) ".";position:absolute;left:0;top:0;color:var(--akzent, #7c87ff);font-weight:700}
.fx-legal-body a{color:var(--akzent, #7c87ff);text-decoration:underline;text-underline-offset:3px}
/* Platzhalter-Markierung */
.fx-ph{color:var(--akzent, #7c87ff);background:#7c87ff14;border:1px dashed #7c87ff66;border-radius:3px;
  padding:1px 6px;font-weight:600;font-style:italic}
.fx-ph::before{content:"\26A0 ";font-style:normal}
.fx-legal-stand{margin-top:18px;padding-top:14px;border-top:1px solid #26262c;font-size:.78rem;color:#71717a;font-style:italic}
</style>

Container-System (3 Breiten) + Section-Rhythmus

Pol 2 · Klarheit Anlass: Grundgerüst jeder Seite

Drei zentrierte Container-Breiten (schmal / Standard / breit) plus ein wiederverwendbarer Section-Titel mit Akzent-Linie. Das Fundament für ein einheitliches Layout über alle Unterseiten. Vorbild: NDS.

.container-narrow
.container
.container-wide

Unsere Leistungen

Zentrierter Section-Titel mit Akzent-Linie und optionalem Untertitel.

<div class="container-narrow">Schmal — Lesetexte</div>
<div class="container">Standard — Inhalt</div>
<div class="container-wide">Breit — Galerien</div>

<div class="section-title">
  <h2>Unsere Leistungen</h2>
  <p>Zentrierter Section-Titel mit Akzent-Linie und Untertitel.</p>
</div>

<style>
.container        {max-width:1180px;margin:0 auto;padding:0 28px}
.container-narrow {max-width: 760px;margin:0 auto;padding:0 28px}
.container-wide   {max-width:1400px;margin:0 auto;padding:0 28px}
.section{padding:100px 0;position:relative}

.section-title{text-align:center;margin-bottom:56px}
.section-title h2{font-size:32px;font-weight:800;text-transform:uppercase;letter-spacing:.02em}
.section-title h2::after{content:"";display:block;width:56px;height:3px;border-radius:2px;
  background:var(--akzent, #7c87ff);margin:16px auto 0}
.section-title p{margin:20px auto 0;max-width:620px;color:#a1a1aa;font-size:15px}
</style>

Vorher/Nachher-Vergleichsslider

Pol 1 · Craft Anlass: Renovierung / Reinigung

Zwei deckungsgleiche Bilder; das obere wird per clip-path: inset() aufgedeckt, ein ziehbarer Knopf folgt Maus und Touch. Bilder hier als CSS-Verlauf angedeutet. Vorbild: Hauszeit, NDS. JS: ja.

Vorher Nachher
<div class="fx-ba" tabindex="0" role="slider" aria-label="Vorher/Nachher"
     aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
  <div class="fx-ba-img fx-ba-after"></div>   <!-- Bild „nachher" -->
  <div class="fx-ba-img fx-ba-before"></div>  <!-- Bild „vorher", oben, geclippt -->
  <span class="fx-ba-label fx-ba-label-v">Vorher</span>
  <span class="fx-ba-label fx-ba-label-n">Nachher</span>
  <div class="fx-ba-handle"></div>
  <div class="fx-ba-knob">↔</div>
</div>

<style>
.fx-ba{position:relative;max-width:420px;aspect-ratio:16/9;border-radius:12px;overflow:hidden;
  border:1px solid #26262c;cursor:ew-resize;user-select:none;-webkit-user-select:none;background:#0d0d10}
.fx-ba-img{position:absolute;inset:0}
.fx-ba-after{background:linear-gradient(135deg,#2a2a3a,#3b3b52)}              /* echtes Bild einsetzen */
.fx-ba-before{background:repeating-linear-gradient(45deg,#1c1c22 0 14px,#16161a 14px 28px);
  clip-path:inset(0 50% 0 0)}                                               /* echtes Bild einsetzen */
.fx-ba-handle{position:absolute;top:0;bottom:0;left:50%;width:2px;background:rgba(255,255,255,.85);
  transform:translateX(-50%);pointer-events:none;z-index:3}
.fx-ba-knob{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;
  background:rgba(255,255,255,.96);color:#16161a;display:grid;place-items:center;font-size:18px;font-weight:600;
  box-shadow:0 4px 18px rgba(0,0,0,.5);pointer-events:none;z-index:4}
.fx-ba-label{position:absolute;top:12px;padding:5px 12px;font-size:11px;font-weight:700;letter-spacing:.6px;
  text-transform:uppercase;border-radius:99px;background:rgba(0,0,0,.6);color:#f4f4f5;z-index:2}
.fx-ba-label-v{right:12px}.fx-ba-label-n{left:12px}
.fx-ba:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:3px}
</style>

<script>
document.querySelectorAll('.fx-ba').forEach(function(root){
  var before=root.querySelector('.fx-ba-before'),
      handle=root.querySelector('.fx-ba-handle'),
      knob=root.querySelector('.fx-ba-knob'), dragging=false;
  function set(clientX){
    var r=root.getBoundingClientRect();
    var x=Math.max(3,Math.min(97,((clientX-r.left)/r.width)*100));
    before.style.clipPath='inset(0 '+(100-x)+'% 0 0)';
    handle.style.left=x+'%'; knob.style.left=x+'%';
    root.setAttribute('aria-valuenow',Math.round(x));
  }
  function down(e){dragging=true;set(e.touches?e.touches[0].clientX:e.clientX);e.preventDefault();}
  function move(e){if(!dragging)return;set(e.touches?e.touches[0].clientX:e.clientX);}
  root.addEventListener('mousedown',down);
  root.addEventListener('touchstart',down,{passive:false});
  window.addEventListener('mousemove',move);
  window.addEventListener('touchmove',move,{passive:false});
  window.addEventListener('mouseup',function(){dragging=false;});
  window.addEventListener('touchend',function(){dragging=false;});
  /* Tastatur: Pfeile bewegen den Schieber */
  root.addEventListener('keydown',function(e){
    var v=parseFloat(root.getAttribute('aria-valuenow'))||50;
    if(e.key==='ArrowLeft'){v-=4;} else if(e.key==='ArrowRight'){v+=4;} else return;
    var r=root.getBoundingClientRect(); set(r.left+r.width*Math.max(3,Math.min(97,v))/100); e.preventDefault();
  });
});
</script>

Leistungs-Detailseiten-Template

Pol 2 · Klarheit Anlass: einzelne Dienstleistung

Komplettes Gerüst einer Leistungs-Unterseite: Banner-Hero mit Zurück-Pille, alternierende Text/Bild-Blöcke (.fx-rev), Vorteile-Liste mit Häkchen und CTA-Abschluss. Bild als Verlauf/Platzhalter angedeutet. Vorbild: Hauszeit/NDS.

← Alle Leistungen

Küchenmontage

Sauber geplant, präzise montiert

Wir übernehmen Aufmaß, Anlieferung und den fachgerechten Aufbau — termintreu und ohne versteckte Kosten.

Bild
  • Festpreis vorab, keine Überraschungen.
  • Termintreue mit verbindlichem Liefertag.

Interesse geweckt?

Fordern Sie ein unverbindliches Angebot an.

Angebot anfragen
<article class="fx-svc">
  <div class="fx-svc-banner">
    <div class="fx-svc-banner-in">
      <a href="#" class="fx-svc-back">← Alle Leistungen</a>
      <h3>Küchenmontage</h3>
    </div>
  </div>
  <div class="fx-svc-block">        <!-- <div class="fx-svc-block fx-rev"> spiegelt den Block -->
    <div class="fx-svc-txt">
      <h4>Sauber geplant, präzise montiert</h4>
      <p>Wir übernehmen Aufmaß, Anlieferung und Aufbau — termintreu.</p>
    </div>
    <div class="fx-svc-pic">Bild</div>
  </div>
  <ul class="fx-svc-benefits">
    <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
      aria-hidden="true"><path d="M5 12l5 5L20 6"/></svg> Festpreis vorab.</li>
    <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
      aria-hidden="true"><path d="M5 12l5 5L20 6"/></svg> Verbindlicher Liefertag.</li>
  </ul>
  <div class="fx-svc-cta">
    <h4>Interesse geweckt?</h4>
    <p>Fordern Sie ein unverbindliches Angebot an.</p>
    <a href="#">Angebot anfragen</a>
  </div>
</article>

<style>
.fx-svc{max-width:520px;background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden}
.fx-svc-banner{position:relative;aspect-ratio:21/9;background:linear-gradient(135deg,#23234a,#16161a)}
.fx-svc-banner::after{content:"";position:absolute;inset:0;
  background:linear-gradient(135deg,rgba(0,0,0,.6),rgba(0,0,0,.1) 60%)}
.fx-svc-banner-in{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;padding:18px 22px;z-index:1}
.fx-svc-back{align-self:flex-start;display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;color:#e9e9ee;
  text-decoration:none;background:rgba(255,255,255,.1);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  border:1px solid rgba(255,255,255,.16);border-radius:7px;padding:5px 11px;margin-bottom:12px;transition:border-color .2s ease}
.fx-svc-back:hover,.fx-svc-back:focus-visible{border-color:#f4f4f5}
.fx-svc-banner-in h3{margin:0;font-size:1.3rem;color:#fff}
.fx-svc-block{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:center;padding:22px}
.fx-svc-block.fx-rev .fx-svc-txt{grid-column:2;grid-row:1}
.fx-svc-block.fx-rev .fx-svc-pic{grid-column:1;grid-row:1}
.fx-svc-txt h4{margin:0 0 8px;font-size:1rem;color:#f4f4f5}
.fx-svc-txt p{margin:0;font-size:.82rem;color:#a1a1aa;line-height:1.65}
.fx-svc-pic{aspect-ratio:4/3;border-radius:9px;border:1.5px dashed #2f2f38;background:#ffffff04;display:grid;place-items:center;
  color:#52525b;font-size:11px;font-weight:600}
.fx-svc-benefits{list-style:none;margin:0;padding:0 22px 6px;display:flex;flex-direction:column;gap:10px}
.fx-svc-benefits li{display:flex;gap:10px;align-items:flex-start;color:#a1a1aa;font-size:.82rem;line-height:1.5}
.fx-svc-benefits svg{flex-shrink:0;width:16px;height:16px;color:#71717a;margin-top:2px;transition:color .2s ease}
.fx-svc-benefits li:hover svg{color:var(--akzent, #7c87ff)}
.fx-svc-cta{text-align:center;padding:22px;border-top:1px solid #26262c}
.fx-svc-cta h4{margin:0 0 8px;font-size:1.05rem;color:#f4f4f5}
.fx-svc-cta p{margin:0 0 16px;font-size:.82rem;color:#a1a1aa}
.fx-svc-cta a{display:inline-block;padding:.7rem 1.4rem;border-radius:9px;background:var(--akzent, #7c87ff);color:#fff;
  font-size:.85rem;font-weight:600;text-decoration:none;transition:transform .2s ease}
.fx-svc-cta a:hover,.fx-svc-cta a:focus-visible{transform:translateY(-2px)}
@media (max-width:480px){.fx-svc-block{grid-template-columns:1fr}
  .fx-svc-block.fx-rev .fx-svc-txt,.fx-svc-block.fx-rev .fx-svc-pic{grid-column:1}}
@media (prefers-reduced-motion:reduce){.fx-svc-back,.fx-svc-benefits svg,.fx-svc-cta a{transition:none}}
</style>

Zigzag-/Wechsel-Blöcke

Pol 2 · Klarheit Anlass: Feature-/Ablauf-Erklärung

Text und Bild abwechselnd nebeneinander; .reverse tauscht die Spalten per grid-column, ohne das Markup umzustellen. Ruhiger Lese-Rhythmus für längere Erklärseiten. Vorbild: Hauszeit.

Schritt 1 — Beratung

Wir nehmen vor Ort Maß und besprechen Ihre Wünsche im Detail.

Schritt 2 — Umsetzung

Die Ausführung erfolgt termintreu und sauber, ohne Folgekosten.

<div class="fx-zz">
  <div class="fx-zz-row">
    <div class="fx-zz-txt"><h4>Schritt 1 — Beratung</h4><p>Wir nehmen Maß …</p></div>
    <div class="fx-zz-img" aria-hidden="true"></div>
  </div>
  <div class="fx-zz-row reverse">       <!-- reverse tauscht die Spalten -->
    <div class="fx-zz-txt"><h4>Schritt 2 — Umsetzung</h4><p>Termintreu …</p></div>
    <div class="fx-zz-img" aria-hidden="true"></div>
  </div>
</div>

<style>
.fx-zz{max-width:520px;display:flex;flex-direction:column;gap:24px}
.fx-zz-row{display:grid;grid-template-columns:1fr 1fr;gap:20px;align-items:center}
.fx-zz-txt{grid-column:1;grid-row:1}
.fx-zz-img{grid-column:2;grid-row:1;aspect-ratio:4/3;border-radius:10px;min-height:120px;
  background:linear-gradient(135deg,#23234a,#16161a);border:1px solid #26262c}   /* echtes Bild einsetzen */
.fx-zz-row.reverse .fx-zz-txt{grid-column:2}
.fx-zz-row.reverse .fx-zz-img{grid-column:1}
.fx-zz-txt h4{margin:0 0 8px;font-size:1rem;color:#f4f4f5}
.fx-zz-txt p{margin:0;font-size:.82rem;color:#a1a1aa;line-height:1.6}
@media (max-width:480px){.fx-zz-row{grid-template-columns:1fr}
  .fx-zz-row.reverse .fx-zz-txt,.fx-zz-row.reverse .fx-zz-img{grid-column:1}}
</style>

Kontakt-Split-Layout

Pol 2 · Klarheit Anlass: Kontaktseite

Info-Spalte links, Formular rechts. Oben eine horizontale Info-Bar, deren Liste per display:contents direkt im Grid liegt — dadurch teilen sich die Einträge die Bar-Spalten ohne Zwischen-Wrapper. Vorbild: Silver.

<div class="fx-ct">
  <!-- horizontale Info-Bar: Liste per display:contents im Grid -->
  <div class="fx-ct-bar">
    <div class="fx-ct-bar-list">
      <a href="#" class="fx-ct-item">
        <span class="fx-ct-ico"><!-- Icon --></span>
        <span><span class="fx-ct-lbl">Telefon</span><br><span class="fx-ct-val">0123 456789</span></span>
      </a>
      <!-- weitere .fx-ct-item … -->
    </div>
  </div>
  <div class="fx-ct-split">
    <div class="fx-ct-info">
      <a href="#" class="fx-ct-info-item">…Öffnungszeiten…</a>
    </div>
    <form class="fx-ct-form">
      <input type="text"  placeholder="Ihr Name"   aria-label="Ihr Name">
      <input type="email" placeholder="Ihre E-Mail" aria-label="Ihre E-Mail">
      <textarea rows="2"  placeholder="Ihre Nachricht" aria-label="Ihre Nachricht"></textarea>
      <button type="submit">Absenden</button>
    </form>
  </div>
</div>

<style>
.fx-ct{max-width:560px;display:flex;flex-direction:column;gap:14px}
.fx-ct-bar{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:14px;border:1px solid #26262c;
  border-radius:10px;background:linear-gradient(180deg,#ffffff06,#ffffff01)}
.fx-ct-bar-list{display:contents}        /* Einträge liegen direkt im Bar-Grid */
.fx-ct-bar .fx-ct-item{display:flex;align-items:center;gap:10px;padding:6px 12px;border-left:1px solid #26262c}
.fx-ct-bar .fx-ct-item:first-child{border-left:0}
.fx-ct-ico{flex-shrink:0;width:30px;height:30px;display:grid;place-items:center;border:1px solid #26262c;
  border-radius:7px;background:#0d0d10;color:var(--akzent, #7c87ff)}
.fx-ct-ico svg{width:15px;height:15px}
.fx-ct-lbl{font-size:9px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#71717a}
.fx-ct-val{font-size:.78rem;font-weight:600;color:#e9e9ee}
.fx-ct-split{display:grid;grid-template-columns:1fr 1.1fr;gap:14px;align-items:stretch}
.fx-ct-info{display:flex;flex-direction:column;gap:8px}
a.fx-ct-info-item{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid #26262c;border-radius:9px;
  background:#0d0d10;text-decoration:none;color:inherit;transition:border-color .2s ease,transform .2s ease}
a.fx-ct-info-item:hover,a.fx-ct-info-item:focus-visible{border-color:var(--akzent, #7c87ff);transform:translateX(2px)}
.fx-ct-form{display:flex;flex-direction:column;gap:9px;padding:16px;border:1px solid #26262c;border-radius:10px;background:#16161a}
.fx-ct-form input,.fx-ct-form textarea{width:100%;background:#0d0d10;border:1px solid #26262c;border-radius:7px;
  padding:9px 11px;color:#e9e9ee;font:inherit;font-size:.82rem;transition:border-color .2s ease}
.fx-ct-form input:focus,.fx-ct-form textarea:focus{outline:none;border-color:var(--akzent, #7c87ff)}
.fx-ct-form button{margin-top:2px;padding:.65rem;border:0;border-radius:8px;background:var(--akzent, #7c87ff);
  color:#fff;font-weight:600;font-size:.85rem;cursor:pointer;transition:transform .2s ease}
.fx-ct-form button:hover,.fx-ct-form button:focus-visible{transform:translateY(-1px)}
@media (max-width:520px){.fx-ct-bar{grid-template-columns:1fr}
  .fx-ct-bar .fx-ct-item{border-left:0;border-bottom:1px solid #26262c}
  .fx-ct-bar .fx-ct-item:last-child{border-bottom:0}.fx-ct-split{grid-template-columns:1fr}}
@media (prefers-reduced-motion:reduce){a.fx-ct-info-item,.fx-ct-form input,.fx-ct-form textarea,.fx-ct-form button{transition:none}}
</style>

Blog/Story-Detail-Layout

Pol 2 · Klarheit Anlass: Beitrag / Referenz-Story

Schmale Lese-Spalte für maximale Lesbarkeit; Meta-Pill, Cover und wiederverwendbare Bausteine: Absatz, Zitat, Bild mit Bildunterschrift und Abschluss-CTA. Bilder als Verlauf angedeutet. Vorbild: Hauszeit.

Referenz5 Min. Lesezeit

Wie aus einer alten Küche ein neuer Treffpunkt wurde

Ein Projektbericht über Planung, Montage und das Ergebnis nach drei Tagen.

Den Auftakt machte ein ausführliches Aufmaß vor Ort, um Maße und Wünsche exakt zu erfassen.

„Am Ende zählt, dass alles auf den Millimeter passt."
Detail der fertig montierten Arbeitsplatte.

Nach drei Tagen war die Montage abgeschlossen — termintreu und ohne Folgekosten.

Auch Interesse an einer neuen Küche?

Wir beraten Sie unverbindlich.

Kontakt aufnehmen
<article class="fx-blog">
  <div class="fx-blog-meta"><span class="fx-blog-pill">Referenz</span><span>5 Min. Lesezeit</span></div>
  <h3>Wie aus einer alten Küche ein neuer Treffpunkt wurde</h3>
  <p class="fx-blog-lead">Ein Projektbericht über Planung, Montage und Ergebnis.</p>
  <div class="fx-blog-cover" aria-hidden="true"></div>
  <div class="fx-blog-body">
    <p>Den Auftakt machte ein ausführliches Aufmaß vor Ort …</p>
    <blockquote class="fx-blog-quote">„Am Ende zählt, dass alles auf den Millimeter passt."</blockquote>
    <figure class="fx-blog-figure">
      <div class="fx-blog-figimg" aria-hidden="true"></div>
      <figcaption>Detail der montierten Arbeitsplatte.</figcaption>
    </figure>
    <p>Nach drei Tagen war die Montage abgeschlossen — termintreu.</p>
  </div>
  <div class="fx-blog-cta">
    <h4>Auch Interesse an einer neuen Küche?</h4>
    <p>Wir beraten Sie unverbindlich.</p>
    <a href="#">Kontakt aufnehmen</a>
  </div>
</article>

<style>
.fx-blog{max-width:440px}
.fx-blog-meta{display:inline-flex;align-items:center;gap:10px;font-size:11px;font-weight:600;letter-spacing:.4px;
  text-transform:uppercase;color:#a1a1aa;margin-bottom:14px}
.fx-blog-pill{padding:4px 12px;border-radius:99px;background:#7c87ff22;color:var(--akzent, #7c87ff);font-size:11px}
.fx-blog h3{margin:0 0 12px;font-size:1.35rem;line-height:1.15;letter-spacing:-.02em;color:#f4f4f5}
.fx-blog-lead{margin:0 0 20px;font-size:.92rem;line-height:1.55;color:#c4c4cc}
.fx-blog-cover{width:100%;aspect-ratio:16/9;border-radius:12px;margin-bottom:20px;
  background:linear-gradient(135deg,#23234a,#16161a);border:1px solid #26262c}   /* echtes Bild --> img */
.fx-blog-body p{margin:0 0 14px;font-size:.88rem;line-height:1.65;color:#a1a1aa}
.fx-blog-quote{border-left:3px solid var(--akzent, #7c87ff);padding:4px 0 4px 18px;margin:20px 0;font-size:1.05rem;
  font-weight:600;line-height:1.4;color:var(--akzent, #7c87ff)}
.fx-blog-figure{margin:18px 0;border-radius:10px;overflow:hidden;border:1px solid #26262c}
.fx-blog-figure .fx-blog-figimg{aspect-ratio:16/10;
  background:repeating-linear-gradient(45deg,#1c1c22 0 14px,#16161a 14px 28px)}
.fx-blog-figure figcaption{padding:10px 14px;font-size:11px;color:#71717a;background:#16161a}
.fx-blog-cta{margin-top:24px;padding:24px 22px;border-radius:12px;text-align:center;color:#f4f4f5;
  background:linear-gradient(135deg,var(--akzent, #7c87ff),#23234a)}
.fx-blog-cta h4{margin:0 0 8px;font-size:1.05rem}
.fx-blog-cta p{margin:0 0 16px;font-size:.82rem;color:#e9e9eecc}
.fx-blog-cta a{display:inline-block;padding:.6rem 1.3rem;border-radius:8px;background:#f4f4f5;color:#16161a;
  font-weight:700;font-size:.82rem;text-decoration:none;transition:transform .2s ease}
.fx-blog-cta a:hover,.fx-blog-cta a:focus-visible{transform:translateY(-2px)}
@media (prefers-reduced-motion:reduce){.fx-blog-cta a{transition:none}}
</style>

Kategorie-Hub-Grid

Pol 2 · Klarheit Anlass: Leistungs-Übersicht

Klickbare Service-Karten in einer dezenten Gradient-Sektion; die ganze Karte ist ein Link, der „Mehr erfahren"-Pfeil schiebt beim Hover/Fokus nach rechts. Vorbild: NDS.

<div class="fx-hub">
  <div class="fx-hub-grid">
    <a href="#" class="fx-hub-card">
      <h4>Küchenmontage</h4>
      <p>Aufmaß, Lieferung und fachgerechter Aufbau.</p>
      <span class="fx-hub-more">Mehr erfahren
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
          aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg></span>
    </a>
    <!-- weitere .fx-hub-card … -->
  </div>
</div>

<style>
.fx-hub{max-width:520px;padding:22px;border-radius:14px;
  background:linear-gradient(180deg,#1c1c22,#16161a);border:1px solid #26262c}
.fx-hub-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
a.fx-hub-card{display:flex;flex-direction:column;background:#16161a;border:1px solid #26262c;border-radius:11px;
  padding:16px;text-decoration:none;color:inherit;
  transition:border-color .25s ease,transform .25s ease,background .25s ease}
a.fx-hub-card:hover,a.fx-hub-card:focus-visible{border-color:#3a3a44;background:#1c1c22;transform:translateY(-2px)}
.fx-hub-card h4{margin:0 0 5px;font-size:.95rem;color:#f4f4f5}
.fx-hub-card p{margin:0;font-size:.78rem;color:#a1a1aa;line-height:1.5}
.fx-hub-more{margin-top:14px;display:flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:#e9e9ee}
.fx-hub-more svg{width:14px;height:14px;color:var(--akzent, #7c87ff);transition:transform .25s ease}
a.fx-hub-card:hover .fx-hub-more svg,a.fx-hub-card:focus-visible .fx-hub-more svg{transform:translateX(4px)}
@media (max-width:440px){.fx-hub-grid{grid-template-columns:1fr}}
@media (prefers-reduced-motion:reduce){a.fx-hub-card,.fx-hub-more svg{transition:none}}
</style>

CSS-only Tabs/Filter

Pol 1 · Craft Anlass: Inhalts-Umschalter ohne JS

Versteckte Radio-Buttons schalten Panels per :checked ~-Selektor um — komplett ohne JavaScript, daher CSP-sicher. Tastatur-fokussierbar über die Radios. Vorbild: Silver.

Planung

Aufmaß vor Ort und detaillierte Abstimmung Ihrer Wünsche.

Montage

Fachgerechter, termintreuer Aufbau ohne Folgekosten.

Service

Nachbetreuung und schnelle Hilfe bei Rückfragen.
<div class="fx-tabs">
  <input type="radio" name="fxTabs" id="fxTab1" class="fx-tabs-radio" checked>
  <input type="radio" name="fxTabs" id="fxTab2" class="fx-tabs-radio">
  <input type="radio" name="fxTabs" id="fxTab3" class="fx-tabs-radio">
  <div class="fx-tabs-list" role="tablist">
    <label class="fx-tabs-tab" for="fxTab1">Planung</label>
    <label class="fx-tabs-tab" for="fxTab2">Montage</label>
    <label class="fx-tabs-tab" for="fxTab3">Service</label>
  </div>
  <div class="fx-tabs-panels">
    <div class="fx-tabs-panel fx-tabs-p1"><h4>Planung</h4>Aufmaß vor Ort …</div>
    <div class="fx-tabs-panel fx-tabs-p2"><h4>Montage</h4>Termintreuer Aufbau …</div>
    <div class="fx-tabs-panel fx-tabs-p3"><h4>Service</h4>Nachbetreuung …</div>
  </div>
</div>

<style>
.fx-tabs-radio{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.fx-tabs-list{display:inline-flex;flex-wrap:wrap;gap:4px;margin-bottom:14px;padding:4px;border:1px solid #26262c;
  border-radius:10px;background:#ffffff05}
.fx-tabs-tab{display:inline-flex;align-items:center;padding:8px 16px;border-radius:7px;font-size:.8rem;font-weight:600;
  color:#a1a1aa;cursor:pointer;user-select:none;transition:color .2s ease,background .2s ease}
.fx-tabs-tab:hover{color:#f4f4f5}
#fxTab1:checked~.fx-tabs-list label[for="fxTab1"],
#fxTab2:checked~.fx-tabs-list label[for="fxTab2"],
#fxTab3:checked~.fx-tabs-list label[for="fxTab3"]{background:var(--akzent, #7c87ff);color:#fff}
.fx-tabs-radio:focus-visible~.fx-tabs-list{outline:2px solid var(--akzent, #7c87ff);outline-offset:3px}
.fx-tabs-panel{display:none;border:1px solid #26262c;border-radius:10px;padding:18px;background:#16161a;
  color:#a1a1aa;font-size:.84rem;line-height:1.6}
.fx-tabs-panel h4{margin:0 0 8px;color:#f4f4f5;font-size:.95rem}
#fxTab1:checked~.fx-tabs-panels .fx-tabs-p1,
#fxTab2:checked~.fx-tabs-panels .fx-tabs-p2,
#fxTab3:checked~.fx-tabs-panels .fx-tabs-p3{display:block}
@media (prefers-reduced-motion:reduce){.fx-tabs-tab{transition:none}}
</style>

Danke-/Bestätigungsseite

Pol 2 · Klarheit Anlass: nach Formular-Absenden

Zentrierter Erfolgs-Block als eigene Seite nach erfolgreichem Absenden: Eyebrow, Inline-SVG-Symbol, klare Zusage und zwei Aktionen (anrufen / zurück). Eigenständige Seite, noindex empfohlen. Vorbild: Nördlicht.

Anfrage erhalten

Vielen Dank für Ihre Nachricht.

Ihre Anfrage ist bei uns eingegangen. Wir melden uns innerhalb von 24 Stunden.

Bei dringenden Anliegen erreichen Sie uns telefonisch.

<div class="fx-thanks">
  <svg class="fx-thanks-star" viewBox="0 0 64 64" aria-hidden="true">…Inline-SVG-Symbol…</svg>
  <span class="fx-thanks-eyebrow">Anfrage erhalten</span>
  <h3>Vielen Dank für Ihre Nachricht.</h3>
  <p class="fx-thanks-lead">Ihre Anfrage ist eingegangen. Wir melden uns innerhalb 24 Std.</p>
  <p class="fx-thanks-detail">Bei dringenden Anliegen erreichen Sie uns telefonisch.</p>
  <div class="fx-thanks-actions">
    <a class="fx-thanks-btn fx-thanks-primary" href="#">Jetzt anrufen</a>
    <a class="fx-thanks-btn fx-thanks-ghost" href="#">Zurück zur Startseite</a>
  </div>
</div>

<style>
.fx-thanks{position:relative;max-width:420px;text-align:center;border-radius:18px;padding:36px 30px;
  background:radial-gradient(ellipse at 30% 10%,#23234a 0%,#16161a 60%,#0d0d10 100%);
  border:1px solid #26262c;box-shadow:0 20px 60px rgba(0,0,0,.4)}
.fx-thanks-star{margin:0 auto 18px;width:64px;height:64px;display:block}
.fx-thanks-eyebrow{display:inline-block;background:#7c87ff22;border:1px solid #7c87ff55;color:var(--akzent, #7c87ff);
  font-size:10px;font-weight:700;letter-spacing:2px;text-transform:uppercase;padding:5px 14px;border-radius:99px;margin-bottom:14px}
.fx-thanks h3{margin:0 0 10px;font-size:1.45rem;line-height:1.15;color:#f4f4f5}
.fx-thanks-lead{margin:0 0 6px;font-size:.9rem;color:#c4c4cc}
.fx-thanks-detail{margin:0 0 24px;font-size:.8rem;color:#a1a1aa}
.fx-thanks-actions{display:flex;flex-direction:column;gap:10px;align-items:center}
.fx-thanks-btn{display:inline-flex;align-items:center;gap:8px;padding:11px 24px;border-radius:99px;font-size:.85rem;
  font-weight:700;text-decoration:none;border:1px solid transparent;transition:transform .2s ease,background .2s ease}
.fx-thanks-btn svg{width:15px;height:15px}
.fx-thanks-primary{background:var(--akzent, #7c87ff);color:#fff;border-color:var(--akzent, #7c87ff)}
.fx-thanks-primary:hover,.fx-thanks-primary:focus-visible{transform:translateY(-1px)}
.fx-thanks-ghost{background:#ffffff10;color:#e9e9ee;border-color:#ffffff22}
.fx-thanks-ghost:hover,.fx-thanks-ghost:focus-visible{background:#ffffff1c}
@media (prefers-reduced-motion:reduce){.fx-thanks-btn{transition:none}}
</style>

SPA Page-Switcher (Nische)

Pol 1 · Craft Anlass: One-Page-Site ohne Reload

Mehrere „Seiten" in einer Datei: nur die .page.active wird gezeigt, der Wechsel läuft ohne Neuladen. Kompakte Version des Musters; in echten Projekten zusätzlich History/Deep-Links absichern. Vorbild: Nördlicht. JS: ja.

Start

Willkommen — alle Bereiche liegen in einer Datei, der Wechsel läuft ohne Neuladen.

Leistungen

Hier stünde die Übersicht der Dienstleistungen.

Kontakt

Hier stünde das Kontaktformular.

<div class="fx-spa">
  <nav class="fx-spa-nav" aria-label="Seiten">
    <button type="button" class="active" data-fx-spa="home">Start</button>
    <button type="button" data-fx-spa="leistungen">Leistungen</button>
    <button type="button" data-fx-spa="kontakt">Kontakt</button>
  </nav>
  <div class="fx-spa-stage">
    <section class="fx-spa-page active" id="fx-spa-home"><h4>Start</h4><p>Willkommen …</p></section>
    <section class="fx-spa-page" id="fx-spa-leistungen"><h4>Leistungen</h4><p>…</p></section>
    <section class="fx-spa-page" id="fx-spa-kontakt"><h4>Kontakt</h4><p>…</p></section>
  </div>
</div>

<style>
.fx-spa{max-width:420px;border:1px solid #26262c;border-radius:12px;overflow:hidden;background:#16161a}
.fx-spa-nav{display:flex;gap:4px;padding:10px;border-bottom:1px solid #26262c;background:#1c1c22}
.fx-spa-nav button{flex:1;padding:8px;border:0;border-radius:7px;background:transparent;color:#a1a1aa;font:inherit;
  font-size:.8rem;font-weight:600;cursor:pointer;transition:color .2s ease,background .2s ease}
.fx-spa-nav button:hover,.fx-spa-nav button:focus-visible{color:#f4f4f5;background:#ffffff08}
.fx-spa-nav button.active{background:var(--akzent, #7c87ff);color:#fff}
.fx-spa-stage{padding:22px;min-height:120px}
.fx-spa-page{display:none}
.fx-spa-page.active{display:block;animation:fxSpaIn .3s ease}
.fx-spa-page h4{margin:0 0 8px;font-size:1.05rem;color:#f4f4f5}
.fx-spa-page p{margin:0;font-size:.84rem;color:#a1a1aa;line-height:1.6}
@keyframes fxSpaIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.fx-spa-page.active{animation:none}.fx-spa-nav button{transition:none}}
</style>

<script>
document.querySelectorAll('.fx-spa').forEach(function(spa){
  var buttons=spa.querySelectorAll('[data-fx-spa]');
  buttons.forEach(function(btn){
    btn.addEventListener('click',function(){
      var id=btn.getAttribute('data-fx-spa');
      spa.querySelectorAll('.fx-spa-page').forEach(function(p){p.classList.remove('active');});
      buttons.forEach(function(b){b.classList.remove('active');});
      spa.querySelector('#fx-spa-'+id).classList.add('active');
      btn.classList.add('active');
    });
  });
});
</script>

Druck-Dokument + Print-CSS (Nische)

Pol 2 · Klarheit Anlass: Vollmacht / Formular zum Drucken

Ein druckfertiges Dokument mit eigenem @media print, das die ganze Web-UI ausblendet und nur das Blatt druckt; der Knopf trägt data-action="print". Hier kompakt; den vollständigen Print-Block zeigt der Code. Vorbild: NDS. JS: ja (nur Druck-Knopf).

Vollmacht

zur Vorlage bei Behörden
Vollmachtgeber

Name, Anschrift und Geburtsdatum der vollmachtgebenden Person.

Umfang

Die bevollmächtigte Person ist berechtigt, in den genannten Angelegenheiten zu handeln.

Ort, Datum
Unterschrift
<div class="fx-doc">
  <div class="fx-doc-head"><h4>Vollmacht</h4><span>zur Vorlage bei Behörden</span></div>
  <div class="fx-doc-block">
    <div class="fx-doc-block-title">Vollmachtgeber</div>
    <p>Name, Anschrift und Geburtsdatum der vollmachtgebenden Person.</p>
  </div>
  <div class="fx-doc-block">
    <div class="fx-doc-block-title">Umfang</div>
    <p>Die bevollmächtigte Person ist berechtigt, … zu handeln.</p>
  </div>
  <div class="fx-doc-sign">
    <div><div class="fx-doc-line"></div><span class="fx-doc-line-lbl">Ort, Datum</span></div>
    <div><div class="fx-doc-line"></div><span class="fx-doc-line-lbl">Unterschrift</span></div>
  </div>
</div>
<button type="button" class="fx-doc-print" data-action="print">Dokument drucken</button>

<style>
.fx-doc{max-width:440px;background:#fff;color:#1a1a1a;padding:34px 38px;border-radius:8px;
  font-family:Georgia,"Times New Roman",serif;font-size:13px;line-height:1.55;box-shadow:0 8px 32px rgba(0,0,0,.4)}
.fx-doc-head{text-align:center;margin-bottom:26px;padding-bottom:16px;border-bottom:2px solid #1a1a1a}
.fx-doc-head h4{margin:0 0 6px;font-size:20px;font-weight:700;letter-spacing:.06em}
.fx-doc-head span{font-size:12px;color:#555;font-style:italic}
.fx-doc-block{margin-bottom:18px}
.fx-doc-block-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:#666;
  margin-bottom:6px;border-bottom:1px solid #ccc;padding-bottom:4px}
.fx-doc p{margin:0 0 10px}
.fx-doc-sign{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:36px}
.fx-doc-line{height:1px;background:#1a1a1a;margin-bottom:6px}
.fx-doc-line-lbl{font-size:10px;color:#666}
.fx-doc-print{display:inline-flex;align-items:center;gap:7px;margin-top:14px;padding:.6rem 1.2rem;border-radius:8px;
  border:1px solid #26262c;background:#16161a;color:#f4f4f5;font-size:.82rem;font-weight:600;cursor:pointer;
  transition:border-color .2s ease}
.fx-doc-print:hover,.fx-doc-print:focus-visible{border-color:var(--akzent, #7c87ff)}

/* Print: ganze UI ausblenden, nur das Dokument drucken */
@media print{
  @page{size:A4;margin:18mm}
  body *{visibility:hidden}
  .fx-doc,.fx-doc *{visibility:visible}
  .fx-doc{position:absolute;inset:0;border:0;box-shadow:none;padding:0;margin:0;max-width:100%;font-size:11pt}
  .fx-doc-print{display:none}
  .fx-doc-block,.fx-doc-sign{page-break-inside:avoid}
}
</style>

<script>
document.querySelectorAll('[data-action="print"]').forEach(function(btn){
  btn.addEventListener('click',function(){window.print();});
});
</script>

Versus-/Matchup + Timeline (Nische)

Pol 1 · Craft Anlass: Vergleich / Ablauf

Repräsentativ aus der Familie Versus/Bracket/Timeline: eine gespiegelte Matchup-Zeile (links/rechts via order, „VS" in der Mitte) plus eine nummerierte Timeline mit Counter-Punkten. Kompakt gehalten — der volle Turnierbaum folgt demselben Spiegel-Prinzip. Vorbild: Silver.

Anbieter AVariante West
VS
Anbieter BVariante Ost
  1. Anfrage

    Sie schildern Ihr Anliegen unverbindlich.

  2. Angebot

    Sie erhalten einen Festpreis vorab.

  3. Umsetzung

    Termintreue Ausführung ohne Folgekosten.

<div class="fx-vs">
  <!-- Matchup-Zeile: links gespiegelt (order), VS in der Mitte -->
  <div class="fx-vs-bout">
    <div class="fx-vs-fighter fx-vs-a">
      <span class="fx-vs-name">Anbieter A<small>Variante West</small></span>
      <span class="fx-vs-avatar" aria-hidden="true"></span>
    </div>
    <span class="fx-vs-mid">VS</span>
    <div class="fx-vs-fighter">
      <span class="fx-vs-avatar" aria-hidden="true"></span>
      <span class="fx-vs-name">Anbieter B<small>Variante Ost</small></span>
    </div>
  </div>
  <!-- nummerierte Timeline via CSS-Counter -->
  <ol class="fx-tl">
    <li class="fx-tl-step"><h4>Anfrage</h4><p>Unverbindlich schildern.</p></li>
    <li class="fx-tl-step"><h4>Angebot</h4><p>Festpreis vorab.</p></li>
    <li class="fx-tl-step"><h4>Umsetzung</h4><p>Termintreu, ohne Folgekosten.</p></li>
  </ol>
</div>

<style>
.fx-vs{max-width:520px;display:flex;flex-direction:column;gap:24px}
.fx-vs-bout{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:16px;padding:16px 18px;border-radius:10px;
  border:1px solid #26262c;background:linear-gradient(180deg,#ffffff06,#ffffff01);transition:border-color .25s ease}
.fx-vs-bout:hover,.fx-vs-bout:focus-within{border-color:var(--akzent, #7c87ff)}
.fx-vs-fighter{display:flex;align-items:center;gap:12px;min-width:0}
.fx-vs-a{justify-content:flex-end;text-align:right}
.fx-vs-a .fx-vs-name{order:0}.fx-vs-a .fx-vs-avatar{order:1}
.fx-vs-avatar{flex-shrink:0;width:46px;height:46px;border-radius:50%;border:1px solid #26262c;
  background:radial-gradient(circle at 50% 35%,#3b3b52,#16161a)}
.fx-vs-name{min-width:0;font-size:.95rem;font-weight:700;color:#f4f4f5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fx-vs-name small{display:block;font-size:11px;font-weight:500;color:#71717a;letter-spacing:.06em}
.fx-vs-mid{text-align:center;font-size:13px;font-weight:800;letter-spacing:.12em;color:var(--akzent, #7c87ff)}
.fx-tl{counter-reset:tl;position:relative;padding-left:28px;list-style:none;margin:0}
.fx-tl::before{content:"";position:absolute;left:9px;top:6px;bottom:6px;width:2px;background:#26262c}
.fx-tl-step{position:relative;padding-bottom:18px}
.fx-tl-step:last-child{padding-bottom:0}
.fx-tl-step::before{content:counter(tl);counter-increment:tl;position:absolute;left:-28px;top:0;width:20px;height:20px;
  border-radius:50%;background:var(--akzent, #7c87ff);color:#fff;font-size:11px;font-weight:700;display:grid;place-items:center}
.fx-tl-step h4{margin:0 0 3px;font-size:.92rem;color:#f4f4f5}
.fx-tl-step p{margin:0;font-size:.8rem;color:#a1a1aa;line-height:1.5}
@media (max-width:480px){.fx-vs-bout{grid-template-columns:1fr;text-align:center;gap:12px}
  .fx-vs-fighter{justify-content:center;flex-direction:column}
  .fx-vs-mid{padding:6px 0;border-top:1px dashed #26262c;border-bottom:1px dashed #26262c}}
@media (prefers-reduced-motion:reduce){.fx-vs-bout{transition:none}}
</style>

Impressum-Vorlage (§ 5 DDG) + Platzhalter-Markierung

Pol 2 · Klarheit Anlass: Pflicht-Impressum

Struktur-Vorlage, kein fertiger Rechtstext. Alle konkreten Angaben sind ⚠-Platzhalter und müssen ausgefüllt werden; die Rechtsgrundlagen (§ 5 DDG, § 18 Abs. 2 MStV, § 27a UStG) und der Streitschlichtungs-Hinweis sind vor Live an gesetze-im-internet.de auf den aktuellen Stand zu prüfen (die EU-Online-Streitbeilegungs-Plattform wurde 2025 eingestellt — alte OS-Link-Bausteine nicht mehr verwenden). Nutzt das Layout des Legal-Templates.

<!-- nutzt die .fx-legal-* Styles aus dem Legal-Template -->
<section class="fx-legal-page">
  <header class="fx-legal-head">
    <a href="#" class="fx-legal-back">← Zurück zur Startseite</a>
    <h2>Impressum</h2>
  </header>
  <div class="fx-legal-body">
    <h3>Angaben gemäß § 5 DDG</h3>
    <p><span class="fx-ph">Firmenname / Name</span><br><span class="fx-ph">Straße und Hausnummer</span><br><span class="fx-ph">PLZ Ort</span></p>
    <h3>Vertreten durch</h3>
    <p><span class="fx-ph">Geschäftsführung / Inhaber:in</span></p>
    <h3>Kontakt</h3>
    <p>Telefon: <span class="fx-ph">Nummer</span><br>E-Mail: <span class="fx-ph">adresse@domain.de</span></p>
    <h3>Umsatzsteuer-ID</h3>
    <p>USt-IdNr. gemäß § 27a UStG: <span class="fx-ph">falls vorhanden</span></p>
    <h3>Verantwortlich nach § 18 Abs. 2 MStV</h3>
    <p><span class="fx-ph">Name und Anschrift</span></p>
    <h3>Verbraucherstreitbeilegung</h3>
    <p><span class="fx-ph">Hinweis — aktuellen Stand prüfen</span></p>
    <p class="fx-legal-stand">Stand: <span class="fx-ph">Datum</span></p>
  </div>
</section>

Datenschutz-Vorlage (DSGVO/TDDDG) — vollständiger

Pol 2 · Klarheit Anlass: Pflicht-Datenschutz

Struktur-Vorlage, kein fertiger Rechtstext. Erweitert das kurze Legal-Demo um die üblichen Abschnitte (Verantwortlicher, Server-Logs, Kontaktformular, Cookies/§ 25 TDDDG, Rechte der Betroffenen, Empfänger). Alle Inhalte sind ⚠-Platzhalter und müssen projektspezifisch und rechtssicher ausgefüllt werden (Prüfung an gesetze-im-internet.de, im Zweifel anwaltlich).

<!-- nutzt die .fx-legal-* Styles aus dem Legal-Template -->
<section class="fx-legal-page">
  <header class="fx-legal-head">
    <a href="#" class="fx-legal-back">← Zurück zur Startseite</a>
    <h2>Datenschutzerklärung</h2>
  </header>
  <div class="fx-legal-body">
    <h3>1. Verantwortlicher</h3>
    <p>Verantwortlich ist <span class="fx-ph">Firmenname und Anschrift</span>.</p>
    <h3>2. Zugriffsdaten / Server-Logfiles</h3>
    <p><span class="fx-ph">Logdaten, Zweck, Art. 6 Abs. 1 lit. f DSGVO</span></p>
    <h3>3. Kontaktformular und E-Mail</h3>
    <p><span class="fx-ph">Daten, Zweck, Speicherdauer</span></p>
    <h3>4. Cookies und Einwilligung (§ 25 TDDDG)</h3>
    <p><span class="fx-ph">Einwilligung vor nicht-notwendigen Cookies</span></p>
    <h3>5. Ihre Rechte</h3>
    <ol><li>Auskunft, Berichtigung, Löschung …</li><li>… Widerspruch (Art. 21)</li><li>Beschwerde bei der Aufsichtsbehörde</li></ol>
    <h3>6. Empfänger / Auftragsverarbeiter</h3>
    <p><span class="fx-ph">Hoster, Analyse, Zahlung — mit Rechtsgrundlage</span></p>
    <p class="fx-legal-stand">Stand: <span class="fx-ph">Datum</span></p>
  </div>
</section>

Coming-Soon / Countdown-Landingpage

Pol 1 · Craft Anlass: Vorab-Seite vor Launch

Ganze Vorab-Seite als eine Sektion: pulsierende Status-Pille, großer Titel, ein Countdown aus vier Zellen (Live per JS, zählt auf ein Zieldatum herunter) und eine E-Mail-Vormerkung. Bei ausgeschaltetem JS bleiben Platzhalter-Ziffern stehen. JS: ja.

In Kürze verfügbar

Bald ist es soweit

Wir arbeiten an etwas Neuem. Tragen Sie sich ein und erfahren Sie als Erste, wenn wir starten.

00Tage
00Std
00Min
00Sek
<section class="fx-cs">
  <div class="fx-cs-in">
    <span class="fx-cs-eyebrow"><span class="fx-cs-dot" aria-hidden="true"></span> In Kürze verfügbar</span>
    <h3>Bald ist es soweit</h3>
    <p class="fx-cs-lead">Wir arbeiten an etwas Neuem. Tragen Sie sich ein …</p>
    <!-- data-fx-countdown = Zieldatum (ISO) -->
    <div class="fx-cs-count" data-fx-countdown="2026-12-31T00:00:00" role="timer" aria-label="Countdown bis zum Start">
      <div class="fx-cs-cell"><span class="fx-cs-num" data-cs="d">00</span><span class="fx-cs-unit">Tage</span></div>
      <div class="fx-cs-cell"><span class="fx-cs-num" data-cs="h">00</span><span class="fx-cs-unit">Std</span></div>
      <div class="fx-cs-cell"><span class="fx-cs-num" data-cs="m">00</span><span class="fx-cs-unit">Min</span></div>
      <div class="fx-cs-cell"><span class="fx-cs-num" data-cs="s">00</span><span class="fx-cs-unit">Sek</span></div>
    </div>
    <form class="fx-cs-form">
      <input type="email" placeholder="Ihre E-Mail" aria-label="Ihre E-Mail">
      <button type="submit">Benachrichtigen</button>
    </form>
  </div>
</section>

<style>
.fx-cs{position:relative;max-width:440px;overflow:hidden;text-align:center;border-radius:18px;padding:38px 28px 32px;
  border:1px solid #26262c;background:radial-gradient(120% 90% at 50% -10%,#23234a 0%,#16161a 55%,#0d0d10 100%)}
.fx-cs::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(60% 50% at 50% 0%,#7c87ff22,transparent 70%)}
.fx-cs-in{position:relative;z-index:1}
.fx-cs-eyebrow{display:inline-flex;align-items:center;gap:7px;background:#7c87ff1c;border:1px solid #7c87ff44;
  color:var(--akzent, #7c87ff);font-size:10px;font-weight:700;letter-spacing:2px;text-transform:uppercase;
  padding:5px 13px;border-radius:99px;margin-bottom:16px}
.fx-cs-dot{width:7px;height:7px;border-radius:50%;background:var(--akzent, #7c87ff);animation:fxCsPulse 2s ease-out infinite}
@keyframes fxCsPulse{0%{box-shadow:0 0 0 0 #7c87ff66}70%{box-shadow:0 0 0 8px #7c87ff00}100%{box-shadow:0 0 0 0 #7c87ff00}}
.fx-cs h3{margin:0 0 10px;font-size:1.6rem;line-height:1.1;letter-spacing:-.02em;color:#f4f4f5}
.fx-cs-lead{margin:0 auto 22px;max-width:34ch;font-size:.88rem;line-height:1.55;color:#a1a1aa}
.fx-cs-count{display:flex;justify-content:center;gap:10px;margin-bottom:24px}
.fx-cs-cell{flex:1;min-width:0;max-width:80px;padding:12px 4px;border-radius:11px;background:#ffffff06;border:1px solid #26262c}
.fx-cs-num{display:block;font-size:1.5rem;font-weight:800;color:#f4f4f5;font-variant-numeric:tabular-nums}
.fx-cs-unit{display:block;margin-top:2px;font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#71717a}
.fx-cs-form{display:flex;flex-wrap:wrap;gap:8px;max-width:340px;margin:0 auto}
.fx-cs-form input{flex:1 1 160px;min-width:0;background:#0d0d10;border:1px solid #26262c;border-radius:9px;
  padding:11px 13px;color:#e9e9ee;font:inherit;font-size:.85rem;transition:border-color .2s ease}
.fx-cs-form input:focus{outline:none;border-color:var(--akzent, #7c87ff)}
.fx-cs-form button{flex:0 0 auto;padding:11px 20px;border:0;border-radius:9px;background:var(--akzent, #7c87ff);
  color:#fff;font-weight:700;font-size:.85rem;cursor:pointer;transition:transform .2s ease}
.fx-cs-form button:hover,.fx-cs-form button:focus-visible{transform:translateY(-2px)}
@media (prefers-reduced-motion:reduce){.fx-cs-dot{animation:none}.fx-cs-form button{transition:none}}
</style>

<script>
document.querySelectorAll('[data-fx-countdown]').forEach(function(box){
  var target=new Date(box.getAttribute('data-fx-countdown')).getTime();
  var el={d:box.querySelector('[data-cs=d]'),h:box.querySelector('[data-cs=h]'),
          m:box.querySelector('[data-cs=m]'),s:box.querySelector('[data-cs=s]')};
  function pad(n){return (n<10?'0':'')+n;}
  function tick(){
    var diff=Math.max(0,target-Date.now()),sec=Math.floor(diff/1000);
    if(el.d)el.d.textContent=pad(Math.floor(sec/86400));
    if(el.h)el.h.textContent=pad(Math.floor(sec%86400/3600));
    if(el.m)el.m.textContent=pad(Math.floor(sec%3600/60));
    if(el.s)el.s.textContent=pad(sec%60);
  }
  tick(); setInterval(tick,1000);
});
</script>

404-Fehlerseite mit Glitch-Zahl

Pol 1 · Craft Anlass: Nicht-gefunden-Seite

Komplette 404-Seite: ein per CSS-Maske ausgeblendetes Raster im Hintergrund, eine große Zahl mit dezentem Glitch-Versatz (zwei farbige ::before/::after-Ebenen) und zwei klare Aktionen zurück. Rein CSS, kein JS.

Seite nicht gefunden

Die aufgerufene Seite existiert nicht oder wurde verschoben. Kein Grund zur Sorge.

<section class="fx-404">
  <div class="fx-404-grid" aria-hidden="true"></div>
  <div class="fx-404-in">
    <span class="fx-404-num" aria-hidden="true">404</span>
    <h3>Seite nicht gefunden</h3>
    <p class="fx-404-lead">Die aufgerufene Seite existiert nicht oder wurde verschoben.</p>
    <div class="fx-404-actions">
      <a class="fx-404-btn fx-404-primary" href="#">Zur Startseite</a>
      <a class="fx-404-btn fx-404-ghost" href="#">Eine Seite zurück</a>
    </div>
  </div>
</section>

<style>
.fx-404{position:relative;max-width:440px;overflow:hidden;text-align:center;border-radius:18px;padding:40px 28px;
  border:1px solid #26262c;background:#101014}
.fx-404-grid{position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:linear-gradient(#26262c 1px,transparent 1px),linear-gradient(90deg,#26262c 1px,transparent 1px);
  background-size:34px 34px;
  -webkit-mask-image:radial-gradient(70% 60% at 50% 40%,#000,transparent 75%);
  mask-image:radial-gradient(70% 60% at 50% 40%,#000,transparent 75%)}
.fx-404-in{position:relative;z-index:1}
.fx-404-num{position:relative;display:inline-block;font-size:5rem;line-height:1;font-weight:900;letter-spacing:-.04em;
  color:#f4f4f5;text-shadow:0 0 40px #7c87ff55}
.fx-404-num::before,.fx-404-num::after{content:"404";position:absolute;inset:0;opacity:0}
.fx-404-num::before{color:var(--akzent, #7c87ff);animation:fxGlitchA 3.2s steps(2,end) infinite}
.fx-404-num::after{color:#ff5c8a;animation:fxGlitchB 3.2s steps(2,end) infinite}
@keyframes fxGlitchA{0%,92%,100%{opacity:0;transform:none}93%{opacity:.85;transform:translate(-3px,1px)}96%{opacity:.85;transform:translate(2px,-2px)}}
@keyframes fxGlitchB{0%,92%,100%{opacity:0;transform:none}94%{opacity:.8;transform:translate(3px,-1px)}97%{opacity:.8;transform:translate(-2px,2px)}}
.fx-404 h3{margin:14px 0 8px;font-size:1.25rem;color:#f4f4f5}
.fx-404-lead{margin:0 auto 24px;max-width:32ch;font-size:.86rem;line-height:1.55;color:#a1a1aa}
.fx-404-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:10px}
.fx-404-btn{display:inline-flex;align-items:center;gap:7px;padding:10px 20px;border-radius:99px;font-size:.85rem;
  font-weight:700;text-decoration:none;border:1px solid transparent;transition:transform .2s ease,background .2s ease}
.fx-404-btn svg{width:15px;height:15px}
.fx-404-primary{background:var(--akzent, #7c87ff);color:#fff}
.fx-404-primary:hover,.fx-404-primary:focus-visible{transform:translateY(-2px)}
.fx-404-ghost{background:#ffffff0d;color:#e9e9ee;border-color:#ffffff1f}
.fx-404-ghost:hover,.fx-404-ghost:focus-visible{background:#ffffff1a}
@media (prefers-reduced-motion:reduce){.fx-404-num::before,.fx-404-num::after{animation:none}.fx-404-btn{transition:none}}
</style>

Dashboard-Grundgerüst (App-Shell)

Pol 2 · Klarheit Anlass: eingeloggter Bereich / Admin

Kompaktes App-Layout: schmale Icon-Sidebar links, Topbar mit Titel und Profil, Inhaltsbereich mit Kennzahl-Karten und einem CSS-Balkendiagramm. Fundament für jede eingeloggte Ansicht; die Zahlen sind generische Platzhalter. Rein CSS.

Übersicht

Besucher
2.480
+12 %
Anfragen
184
+5 %
Letzte 7 Tage
<div class="fx-dash">
  <nav class="fx-dash-side" aria-label="Hauptnavigation">
    <span class="fx-dash-logo" aria-hidden="true"></span>
    <button type="button" class="fx-dash-ico active" aria-label="Übersicht" aria-current="page"><!-- Icon --></button>
    <button type="button" class="fx-dash-ico" aria-label="Statistik"><!-- Icon --></button>
    <button type="button" class="fx-dash-ico" aria-label="Einstellungen"><!-- Icon --></button>
  </nav>
  <div class="fx-dash-main">
    <div class="fx-dash-top"><h4>Übersicht</h4><span class="fx-dash-avatar" aria-hidden="true"></span></div>
    <div class="fx-dash-body">
      <div class="fx-dash-stats">
        <div class="fx-dash-stat"><div class="fx-dash-lbl">Besucher</div><div class="fx-dash-val">2.480</div><span class="fx-dash-delta">+12 %</span></div>
        <div class="fx-dash-stat"><div class="fx-dash-lbl">Anfragen</div><div class="fx-dash-val">184</div><span class="fx-dash-delta">+5 %</span></div>
      </div>
      <div class="fx-dash-chart">
        <div class="fx-dash-lbl">Letzte 7 Tage</div>
        <div class="fx-dash-bars" aria-hidden="true">
          <span style="height:40%"></span><span style="height:65%"></span><span style="height:50%"></span>
          <span style="height:80%"></span><span style="height:60%"></span><span style="height:95%"></span><span style="height:72%"></span>
        </div>
      </div>
    </div>
  </div>
</div>

<style>
.fx-dash{max-width:440px;border:1px solid #26262c;border-radius:14px;overflow:hidden;background:#16161a;
  display:grid;grid-template-columns:56px 1fr}
.fx-dash-side{background:#101014;border-right:1px solid #26262c;padding:14px 0;display:flex;flex-direction:column;align-items:center;gap:6px}
.fx-dash-logo{width:30px;height:30px;border-radius:9px;margin-bottom:8px;background:linear-gradient(135deg,var(--akzent, #7c87ff),#3b3b52)}
.fx-dash-ico{width:36px;height:36px;border-radius:9px;display:grid;place-items:center;color:#71717a;cursor:pointer;
  background:transparent;border:0;transition:background .2s ease,color .2s ease}
.fx-dash-ico svg{width:17px;height:17px}
.fx-dash-ico:hover,.fx-dash-ico:focus-visible{color:#e9e9ee;background:#ffffff08}
.fx-dash-ico.active{color:#fff;background:var(--akzent, #7c87ff)}
.fx-dash-ico:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:2px}
.fx-dash-main{min-width:0;display:flex;flex-direction:column}
.fx-dash-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 16px;border-bottom:1px solid #26262c}
.fx-dash-top h4{margin:0;font-size:.98rem;color:#f4f4f5}
.fx-dash-avatar{flex-shrink:0;width:28px;height:28px;border-radius:50%;border:1px solid #26262c;
  background:radial-gradient(circle at 50% 35%,#3b3b52,#16161a)}
.fx-dash-body{padding:16px;display:flex;flex-direction:column;gap:14px}
.fx-dash-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
.fx-dash-stat{padding:12px 13px;border:1px solid #26262c;border-radius:10px;background:#ffffff04}
.fx-dash-lbl{font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#71717a}
.fx-dash-val{margin-top:5px;font-size:1.25rem;font-weight:800;color:#f4f4f5;letter-spacing:-.02em}
.fx-dash-delta{font-size:10px;font-weight:700;color:#5bd6a0}
.fx-dash-chart{border:1px solid #26262c;border-radius:10px;padding:12px 13px;background:#ffffff04}
.fx-dash-chart .fx-dash-lbl{margin-bottom:10px}
.fx-dash-bars{display:flex;align-items:flex-end;gap:6px;height:56px}
.fx-dash-bars span{flex:1;border-radius:4px 4px 0 0;background:linear-gradient(180deg,var(--akzent, #7c87ff),#7c87ff44);
  transition:transform .2s ease;transform-origin:bottom}
.fx-dash-bars span:hover{transform:scaleY(1.08)}
@media (prefers-reduced-motion:reduce){.fx-dash-ico,.fx-dash-bars span{transition:none}}
</style>

Preis-Seite mit Monat/Jahr-Umschalter

Pol 2 · Klarheit Anlass: Tarif-/Paket-Übersicht

Ganze Preis-Sektion mit drei Tarif-Karten; die mittlere ist als „Beliebt" hervorgehoben (Akzent-Rahmen, Glow, Badge). Ein versteckter Checkbox schaltet über den :checked-Selektor zwischen Monats- und Jahrespreis um — komplett ohne JavaScript.

Jährlich zahlen und zwei Monate sparen

Basis

Für den Einstieg.

990MonatJahr
  • Ein Projekt
  • E-Mail-Support
Auswählen
Beliebt

Pro

Für wachsende Teams.

29290MonatJahr
  • Zehn Projekte
  • Priorisierter Support
Auswählen
<div class="fx-price">
  <!-- versteckte Checkbox schaltet Monat/Jahr per :checked -->
  <input type="checkbox" id="fxPriceSwitch" class="fx-price-switch">
  <div class="fx-price-head">
    <label class="fx-price-toggle" for="fxPriceSwitch">
      <span class="fx-price-opt fx-price-m">Monatlich</span>
      <span class="fx-price-opt fx-price-y">Jährlich</span>
    </label>
    <span class="fx-price-save">Jährlich zahlen und zwei Monate sparen</span>
  </div>
  <div class="fx-price-grid">
    <div class="fx-price-card">
      <h4 class="fx-price-name">Basis</h4>
      <p class="fx-price-desc">Für den Einstieg.</p>
      <div class="fx-price-amount"><span class="fx-price-cur">€</span>
        <span class="fx-price-fig"><span class="fx-price-m-fig">9</span><span class="fx-price-y-fig">90</span></span>
        <span class="fx-price-per">/&nbsp;<span class="fx-price-m-fig">Monat</span><span class="fx-price-y-fig">Jahr</span></span></div>
      <ul class="fx-price-feats"><li><svg …><path d="M5 12l5 5L20 6"/></svg> Ein Projekt</li></ul>
      <a href="#" class="fx-price-btn">Auswählen</a>
    </div>
    <div class="fx-price-card fx-price-pop">
      <span class="fx-price-badge">Beliebt</span>
      <h4 class="fx-price-name">Pro</h4>
      <!-- gleicher Aufbau, Preise 29 / 290 -->
      <a href="#" class="fx-price-btn">Auswählen</a>
    </div>
  </div>
</div>

<style>
.fx-price{max-width:440px}
.fx-price-switch{display:none}
.fx-price-toggle{display:inline-flex;align-items:center;gap:10px;margin:0 auto 20px;padding:5px;border-radius:99px;
  border:1px solid #26262c;background:#ffffff05;cursor:pointer;font-size:.8rem;font-weight:600;color:#a1a1aa;
  user-select:none;-webkit-user-select:none}
.fx-price-opt{padding:6px 14px;border-radius:99px;transition:color .2s ease,background .2s ease}
.fx-price-toggle .fx-price-m{background:var(--akzent, #7c87ff);color:#fff}
.fx-price-switch:checked~.fx-price-head .fx-price-toggle .fx-price-m{background:transparent;color:#a1a1aa}
.fx-price-switch:checked~.fx-price-head .fx-price-toggle .fx-price-y{background:var(--akzent, #7c87ff);color:#fff}
.fx-price-switch:focus-visible~.fx-price-head .fx-price-toggle{outline:2px solid var(--akzent, #7c87ff);outline-offset:3px}
.fx-price-head{text-align:center}
.fx-price-save{display:block;margin-top:8px;font-size:11px;font-weight:600;color:#5bd6a0}
.fx-price-grid{display:flex;flex-direction:column;gap:12px;margin-top:4px}
.fx-price-card{position:relative;padding:20px 20px 22px;border:1px solid #26262c;border-radius:14px;background:#16161a;
  transition:border-color .2s ease,transform .2s ease}
.fx-price-card:hover,.fx-price-card:focus-within{border-color:#3a3a44;transform:translateY(-2px)}
.fx-price-card.fx-price-pop{border-color:var(--akzent, #7c87ff);background:linear-gradient(180deg,#1c1c26,#16161a);
  box-shadow:0 16px 40px -18px #7c87ff88}
.fx-price-badge{position:absolute;top:-10px;right:18px;padding:3px 11px;border-radius:99px;font-size:9px;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;background:var(--akzent, #7c87ff);color:#fff}
.fx-price-name{margin:0 0 4px;font-size:.95rem;font-weight:700;color:#f4f4f5}
.fx-price-desc{margin:0 0 14px;font-size:.78rem;color:#a1a1aa}
.fx-price-amount{display:flex;align-items:baseline;gap:4px;margin-bottom:14px}
.fx-price-cur{font-size:1rem;font-weight:700;color:#a1a1aa}
.fx-price-fig{font-size:2rem;font-weight:800;color:#f4f4f5;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.fx-price-per{font-size:.78rem;color:#71717a}
/* Umschaltung Monat <-> Jahr */
.fx-price-y-fig,.fx-price-switch:checked~.fx-price-grid .fx-price-m-fig{display:none}
.fx-price-switch:checked~.fx-price-grid .fx-price-y-fig{display:inline}
.fx-price-feats{list-style:none;margin:0 0 16px;padding:0;display:flex;flex-direction:column;gap:8px}
.fx-price-feats li{display:flex;gap:9px;align-items:flex-start;font-size:.8rem;color:#c4c4cc;line-height:1.4}
.fx-price-feats svg{flex-shrink:0;width:15px;height:15px;color:var(--akzent, #7c87ff);margin-top:1px}
.fx-price-btn{display:block;text-align:center;padding:11px;border-radius:9px;font-size:.85rem;font-weight:700;
  text-decoration:none;border:1px solid #3a3a45;color:#e9e9ee;background:transparent;
  transition:transform .2s ease,background .2s ease,border-color .2s ease}
.fx-price-btn:hover,.fx-price-btn:focus-visible{transform:translateY(-2px);border-color:#4a4a55;background:#ffffff08}
.fx-price-pop .fx-price-btn{background:var(--akzent, #7c87ff);border-color:var(--akzent, #7c87ff);color:#fff}
.fx-price-pop .fx-price-btn:hover,.fx-price-pop .fx-price-btn:focus-visible{background:#6b77ff}
@media (prefers-reduced-motion:reduce){.fx-price-opt,.fx-price-card,.fx-price-btn{transition:none}}
</style>