Design · Bausteine-Dossier

Seiten-Sektion

Referenzen / Galerie

Die ganze, gerahmte Projekt-Galerie einer Seite — neun Layouts: vom filterbaren Portfolio-Grid über Mosaik-Showcase, Vorher/Nachher-Slider und Fall-Highlight bis zu Scroll-Snap-Karussell, kompakter Projekt-Liste, Masonry-Spalten, Feature-Wechsler und Ergebnis-Karten. Alle copy-paste-fähig, Akzentfarbe über --akzent, barrierefrei (Fokus-States, prefers-reduced-motion).

Referenzen — Portfolio-Grid

Pol 2 · Klarheit Anlass: Referenzen, Portfolio, Handwerk

Sauberes 3-Spalten-Raster (mobil einspaltig). Bei Hover/Fokus gleitet ein ruhiges Overlay mit Titel + Kategorie herein. Die Filter-Chips oben sind dezente Optik und filtern per Progressive Enhancement — ohne JS bleiben alle Kacheln sichtbar. Bilder als CSS-Verlauf angedeutet (im Projekt durch <img> ersetzen).

<section class="rf-grid" aria-label="Referenzen">
  <div class="rf-grid-head">
    <p class="rf-grid-eyebrow">Referenzen</p>
    <h2 class="rf-grid-title">Ausgewählte Projekte</h2>
  </div>
  <ul class="rf-chips" role="group" aria-label="Nach Kategorie filtern">
    <li><button type="button" class="rf-chip" data-filter="alle" aria-pressed="true">Alle</button></li>
    <li><button type="button" class="rf-chip" data-filter="bad" aria-pressed="false">Bad</button></li>
    <li><button type="button" class="rf-chip" data-filter="kueche" aria-pressed="false">Küche</button></li>
  </ul>
  <div class="rf-tiles">
    <a class="rf-tile" href="#" data-kat="bad">
      <!-- statt Verlauf hier ein <img> in .rf-tile-img einsetzen -->
      <span class="rf-tile-img" aria-hidden="true"></span>
      <span class="rf-tile-veil" aria-hidden="true"></span>
      <span class="rf-tile-cap">
        <span class="rf-tile-kat">Badsanierung</span>
        <span class="rf-tile-name">Wellnessbad in Eiche</span>
      </span>
    </a>
    <!-- weitere .rf-tile analog; data-kat steuert den Filter -->
  </div>
</section>

<style>
.rf-grid{width:100%;background:#16161a;border:1px solid #26262c;border-radius:18px;
  padding:1.6rem;color:#e9e9ee}
@media(min-width:720px){.rf-grid{padding:2.4rem}}
.rf-grid-head{margin:0 0 1.4rem}
.rf-grid-eyebrow{margin:0 0 .5rem;font-size:.74rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--akzent,#7c87ff)}
.rf-grid-title{margin:0;font-size:clamp(1.4rem,3.2vw,1.95rem);line-height:1.15;
  letter-spacing:-.01em;color:#f4f4f5}
.rf-chips{list-style:none;display:flex;flex-wrap:wrap;gap:.5rem;margin:1.2rem 0 1.6rem;padding:0}
.rf-chip{font-size:.82rem;font-weight:600;color:#a1a1aa;background:#17171b;
  border:1px solid #26262c;border-radius:99px;padding:.42rem .95rem;cursor:pointer;
  transition:color .2s ease,border-color .2s ease,background .2s ease}
.rf-chip:hover,.rf-chip:focus-visible{color:#f4f4f5;border-color:#3a3a45;outline:none}
.rf-chip:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:2px}
.rf-chip[aria-pressed="true"]{color:#0f0f12;background:var(--akzent,#7c87ff);
  border-color:var(--akzent,#7c87ff)}
.rf-tiles{display:grid;gap:1rem;grid-template-columns:1fr}
@media(min-width:560px){.rf-tiles{grid-template-columns:repeat(2,1fr)}}
@media(min-width:840px){.rf-tiles{grid-template-columns:repeat(3,1fr)}}
.rf-tile{position:relative;display:block;aspect-ratio:4/3;border-radius:14px;overflow:hidden;
  border:1px solid #26262c;color:#f4f4f5;isolation:isolate}
.rf-tile.is-off{display:none}
.rf-tile-img{position:absolute;inset:0;z-index:0}
.rf-tile:nth-child(1) .rf-tile-img{background:radial-gradient(120% 110% at 25% 15%,#3b3b54 0%,#24242f 48%,#15151b 100%)}
.rf-tile:nth-child(2) .rf-tile-img{background:radial-gradient(120% 110% at 80% 20%,#2f4448 0%,#20303233 45%,#141a1c 100%)}
.rf-tile:nth-child(3) .rf-tile-img{background:radial-gradient(130% 120% at 50% 90%,#4a3550 0%,#2a2233 50%,#161018 100%)}
.rf-tile:nth-child(4) .rf-tile-img{background:radial-gradient(120% 110% at 20% 80%,#453b28 0%,#2b2620 48%,#171310 100%)}
.rf-tile:nth-child(5) .rf-tile-img{background:radial-gradient(120% 100% at 70% 30%,#28324e 0%,#1e2536 45%,#12151f 100%)}
.rf-tile:nth-child(6) .rf-tile-img{background:radial-gradient(120% 110% at 40% 20%,#3d3d46 0%,#26262f 48%,#141419 100%)}
.rf-tile-veil{position:absolute;inset:0;z-index:1;
  background:linear-gradient(to top,rgba(12,12,16,.82) 0%,rgba(12,12,16,.15) 55%,transparent 100%);
  opacity:0;transform:translateY(12px);
  transition:opacity .3s ease,transform .3s ease}
.rf-tile-cap{position:absolute;left:1rem;right:1rem;bottom:1rem;z-index:2;
  transform:translateY(10px);opacity:0;
  transition:opacity .3s ease .04s,transform .3s ease .04s}
.rf-tile-kat{display:block;font-size:.72rem;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--akzent,#7c87ff);margin:0 0 .25rem}
.rf-tile-name{font-size:1.02rem;font-weight:700;line-height:1.2;margin:0}
.rf-tile:hover .rf-tile-veil,.rf-tile:focus-visible .rf-tile-veil,
.rf-tile:hover .rf-tile-cap,.rf-tile:focus-visible .rf-tile-cap{opacity:1;transform:translateY(0)}
.rf-tile:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .rf-chip,.rf-tile-veil,.rf-tile-cap{transition:none}
}
</style>

<script>
// Filter-Chips (Progressive Enhancement — ohne JS bleiben alle Kacheln sichtbar)
document.querySelectorAll('.rf-grid').forEach((sec) => {
  const chips = sec.querySelectorAll('.rf-chip');
  const tiles = sec.querySelectorAll('.rf-tile');
  chips.forEach((chip) => chip.addEventListener('click', () => {
    const f = chip.dataset.filter;
    chips.forEach((c) => c.setAttribute('aria-pressed', String(c === chip)));
    tiles.forEach((t) => {
      const show = f === 'alle' || t.dataset.kat === f;
      t.classList.toggle('is-off', !show);
    });
  }));
});
</script>

Referenzen — Mosaik-Showcase

Pol 1 · Craft Anlass: Referenzen, Premium, Studio

Lebendiges Galerie-Mosaik: eine hervorgehobene, breitere Kachel, dazu unterschiedlich große Nachbarn. Bei Hover/Fokus hebt sich die Kachel, der Bild-Platzhalter zoomt sanft, ein Akzent-Rahmen erscheint und das Glas-Label steigt auf. Edler Showcase für Marken- und Studio-Auftritte. Der Bild-Zoom ruht bei prefers-reduced-motion.

<section class="rf-mosaic" aria-label="Referenzen">
  <p class="rf-mosaic-eyebrow">Portfolio</p>
  <h2 class="rf-mosaic-title">Was wir <span>gebaut</span> haben.</h2>
  <div class="rf-mos-grid">
    <a class="rf-card rf-card--wide" href="#">
      <!-- statt Verlauf hier ein <img> in .rf-card-img einsetzen -->
      <span class="rf-card-img" aria-hidden="true"></span>
      <span class="rf-card-veil" aria-hidden="true"></span>
      <span class="rf-card-ring" aria-hidden="true"></span>
      <span class="rf-card-label">
        <span class="rf-card-kat">Komplettumbau</span>
        <span class="rf-card-name">Altbauwohnung, kernsaniert</span>
      </span>
    </a>
    <!-- rf-card--tall = doppelte Höhe; normale .rf-card daneben -->
  </div>
</section>

<style>
.rf-mosaic{position:relative;width:100%;overflow:hidden;
  background:radial-gradient(130% 120% at 0% 0%,#1c1c28 0%,#141319 55%,#101014 100%);
  border:1px solid #26262c;border-radius:20px;padding:1.8rem;color:#e9e9ee}
@media(min-width:760px){.rf-mosaic{padding:2.6rem}}
.rf-mosaic-eyebrow{margin:0 0 .8rem;display:inline-flex;align-items:center;gap:.6em;font-size:.74rem;
  font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--akzent,#7c87ff)}
.rf-mosaic-eyebrow::before{content:"";width:26px;height:1px;background:var(--akzent,#7c87ff)}
.rf-mosaic-title{margin:0 0 1.6rem;font-size:clamp(1.5rem,3.6vw,2.1rem);line-height:1.12;
  letter-spacing:-.02em;color:#f4f4f5}
.rf-mosaic-title span{color:var(--akzent,#7c87ff)}
.rf-mos-grid{display:grid;gap:1rem;grid-template-columns:1fr}
@media(min-width:680px){.rf-mos-grid{grid-template-columns:repeat(3,1fr);grid-auto-rows:150px}}
.rf-card{position:relative;display:block;border-radius:16px;overflow:hidden;
  min-height:190px;color:#f4f4f5;isolation:isolate;
  border:1px solid rgba(255,255,255,.08);
  box-shadow:0 16px 34px rgba(0,0,0,.34);
  transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s ease,border-color .35s ease}
@media(min-width:680px){
  .rf-card{min-height:0}
  .rf-card--wide{grid-column:span 2;grid-row:span 2}
  .rf-card--tall{grid-row:span 2}
}
.rf-card-img{position:absolute;inset:0;z-index:0;transform:scale(1.02);
  transition:transform .5s cubic-bezier(.16,1,.3,1);will-change:transform}
.rf-card:nth-child(1) .rf-card-img{background:radial-gradient(120% 120% at 30% 20%,#42425f 0%,#272733 50%,#15151b 100%)}
.rf-card:nth-child(2) .rf-card-img{background:radial-gradient(130% 120% at 75% 15%,#324a4a 0%,#20302f 48%,#12191a 100%)}
.rf-card:nth-child(3) .rf-card-img{background:radial-gradient(130% 130% at 60% 85%,#4e3a54 0%,#2c2436 50%,#171019 100%)}
.rf-card:nth-child(4) .rf-card-img{background:radial-gradient(120% 120% at 20% 70%,#4a4028 0%,#2c2720 48%,#181310 100%)}
.rf-card:nth-child(5) .rf-card-img{background:radial-gradient(120% 120% at 70% 30%,#2b3654 0%,#1f2638 48%,#12151f 100%)}
.rf-card-veil{position:absolute;inset:0;z-index:1;
  background:linear-gradient(to top,rgba(11,11,15,.78) 0%,rgba(11,11,15,.1) 60%,transparent 100%)}
.rf-card-ring{position:absolute;inset:0;z-index:3;border-radius:16px;pointer-events:none;
  box-shadow:inset 0 0 0 1px transparent;
  transition:box-shadow .35s ease}
.rf-card-label{position:absolute;left:.85rem;right:.85rem;bottom:.85rem;z-index:2;margin:0;
  padding:.7rem .9rem;border-radius:12px;overflow-wrap:break-word;
  background:rgba(20,20,26,.5);border:1px solid rgba(255,255,255,.14);
  -webkit-backdrop-filter:blur(14px) saturate(1.3);backdrop-filter:blur(14px) saturate(1.3);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12);
  transform:translateY(6px);opacity:.82;
  transition:transform .35s cubic-bezier(.16,1,.3,1),opacity .35s ease}
.rf-card-kat{display:block;font-size:.68rem;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--akzent,#7c87ff);margin:0 0 .2rem}
.rf-card-name{font-size:1rem;font-weight:700;line-height:1.18;margin:0;color:#f4f4f5}
.rf-card--wide .rf-card-name{font-size:1.25rem}
.rf-card:hover,.rf-card:focus-visible{transform:translateY(-4px);
  box-shadow:0 26px 52px rgba(0,0,0,.5);border-color:rgba(255,255,255,.14);outline:none}
.rf-card:hover .rf-card-img,.rf-card:focus-visible .rf-card-img{transform:scale(1.1)}
.rf-card:hover .rf-card-ring,.rf-card:focus-visible .rf-card-ring{
  box-shadow:inset 0 0 0 2px var(--akzent,#7c87ff)}
.rf-card:hover .rf-card-label,.rf-card:focus-visible .rf-card-label{transform:translateY(0);opacity:1}
.rf-card:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .rf-card,.rf-card-img,.rf-card-ring,.rf-card-label{transition:none}
}
</style>

Referenzen — Vorher/Nachher-Vergleich

Pol 1 · Craft Anlass: Sanierung, Renovierung, Beweis

Ein Schieberegler enthüllt beim Ziehen das „Nachher" über dem „Vorher" — der stärkste Referenz-Beweis für Handwerk und Sanierung. Der unsichtbare <input type="range"> steuert per CSS-Variable die Trennlinie; damit ist er komplett tastatur- und touchbedienbar, ganz ohne Zeiger-Rechnerei. Bilder als CSS-Verlauf angedeutet (im Projekt durch zwei <img> ersetzen).

Referenz

Badsanierung — vorher & nachher

Regler ziehen oder mit den Pfeiltasten verschieben.

<section class="rf-ba" aria-label="Vorher-Nachher-Vergleich">
  <div class="rf-ba-head">
    <p class="rf-ba-eyebrow">Referenz</p>
    <h2 class="rf-ba-title">Badsanierung — vorher &amp; nachher</h2>
  </div>
  <div class="rf-ba-frame" style="--pos:50">
    <!-- statt Verläufen hier zwei <img> in .rf-ba-after / .rf-ba-before -->
    <span class="rf-ba-layer rf-ba-after" aria-hidden="true"></span>
    <span class="rf-ba-layer rf-ba-before" aria-hidden="true"></span>
    <span class="rf-ba-badge is-before" aria-hidden="true">Vorher</span>
    <span class="rf-ba-badge is-after" aria-hidden="true">Nachher</span>
    <input class="rf-ba-range" type="range" min="0" max="100" value="50"
           aria-label="Vergleich verschieben — links Vorher, rechts Nachher">
    <span class="rf-ba-divider" aria-hidden="true">
      <span class="rf-ba-knob">⇔</span>
    </span>
  </div>
  <p class="rf-ba-hint">Regler ziehen oder mit den Pfeiltasten verschieben.</p>
</section>

<style>
.rf-ba{width:100%;background:#16161a;border:1px solid #26262c;border-radius:18px;
  padding:1.6rem;color:#e9e9ee}
@media(min-width:720px){.rf-ba{padding:2.4rem}}
.rf-ba-head{margin:0 0 1.4rem}
.rf-ba-eyebrow{margin:0 0 .5rem;font-size:.74rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--akzent,#7c87ff)}
.rf-ba-title{margin:0;font-size:clamp(1.4rem,3.2vw,1.95rem);line-height:1.15;
  letter-spacing:-.01em;color:#f4f4f5}
/* Rahmen mit Bild-Ebenen; --pos steuert die Trennlinie (0–100) */
.rf-ba-frame{position:relative;width:100%;aspect-ratio:16/10;border-radius:14px;overflow:hidden;
  border:1px solid #26262c;isolation:isolate;--pos:50}
.rf-ba-layer{position:absolute;inset:0}
.rf-ba-after{background:radial-gradient(120% 130% at 70% 20%,#33405c 0%,#212a3d 48%,#141824 100%)}
.rf-ba-before{background:radial-gradient(120% 130% at 30% 80%,#3a3630 0%,#262320 50%,#15130f 100%);
  /* nur der linke Teil bis zur Trennlinie ist sichtbar */
  clip-path:inset(0 calc(100% - var(--pos)*1%) 0 0)}
.rf-ba-badge{position:absolute;top:.7rem;z-index:2;font-size:.66rem;font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;padding:.28rem .6rem;border-radius:99px;
  background:rgba(15,15,20,.62);border:1px solid rgba(255,255,255,.14);color:#f4f4f5;
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.rf-ba-badge.is-before{left:.7rem}
.rf-ba-badge.is-after{right:.7rem}
/* Trennlinie + Griff */
.rf-ba-divider{position:absolute;top:0;bottom:0;z-index:3;left:calc(var(--pos)*1%);
  width:2px;background:var(--akzent,#7c87ff);transform:translateX(-1px);pointer-events:none}
.rf-ba-knob{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:38px;height:38px;border-radius:50%;display:grid;place-items:center;
  background:var(--akzent,#7c87ff);color:#0d0d10;font-size:.9rem;font-weight:700;
  box-shadow:0 4px 14px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.3)}
/* Range-Input liegt unsichtbar über dem Rahmen und steuert alles */
.rf-ba-range{position:absolute;inset:0;z-index:4;width:100%;height:100%;margin:0;
  opacity:0;cursor:ew-resize;-webkit-appearance:none;appearance:none;background:transparent}
.rf-ba-range:focus-visible{outline:none}
.rf-ba-range:focus-visible~.rf-ba-divider{width:3px}
.rf-ba-range:focus-visible~.rf-ba-divider .rf-ba-knob{
  outline:2px solid #fff;outline-offset:2px}
.rf-ba-hint{margin:1rem 0 0;font-size:.82rem;color:#a1a1aa}
</style>

<script>
// Trennlinie folgt dem Range-Wert (touch/tastatur/maus in einem)
document.querySelectorAll('.rf-ba-range').forEach(function(r){
  var frame=r.closest('.rf-ba-frame');
  if(!frame) return;
  r.addEventListener('input',function(){frame.style.setProperty('--pos',r.value);});
});
</script>

Referenzen — Fall-Highlight

Pol 2 · Klarheit Anlass: Vorzeige-Projekt, Case-Study

Ein einzelnes Projekt bekommt die ganze Bühne: großes Bildfeld links, rechts Titel, Kurzbeschreibung, drei Kennzahlen und ein Kundenzitat. Statt vieler kleiner Kacheln erzählt dieser Block eine Referenz als überzeugende Mini-Case-Study — ideal direkt unter dem Hero. Bild als CSS-Verlauf angedeutet (im Projekt durch <img> ersetzen).

Referenz im Detail

Altbauwohnung, komplett kernsaniert

Vom Rohbau bis zur schlüsselfertigen Übergabe: Bad, Küche und Böden in acht Wochen erneuert — bei laufendem Zeitplan und fixem Festpreis.

  • 8 Wo.Bauzeit
  • 120 m²Wohnfläche
  • 3Gewerke
„Sauber geplant, pünktlich fertig und der Festpreis hat gehalten. Genau so stellt man sich das vor." Zufriedene Bauherrin, Musterstadt
Projekt ansehen
<section class="rf-case" aria-label="Referenz im Detail">
  <div class="rf-case-grid">
    <!-- statt Verlauf hier ein <img> in .rf-case-media -->
    <div class="rf-case-media" aria-hidden="true">
      <span class="rf-case-stamp">Vorzeige-Projekt</span>
    </div>
    <div class="rf-case-body">
      <p class="rf-case-eyebrow">Referenz im Detail</p>
      <h2 class="rf-case-title">Altbauwohnung, komplett kernsaniert</h2>
      <p class="rf-case-lead">Vom Rohbau bis zur schlüsselfertigen Übergabe: Bad, Küche und Böden
        in acht Wochen erneuert — bei laufendem Zeitplan und fixem Festpreis.</p>
      <ul class="rf-case-stats">
        <li class="rf-case-stat"><b>8 Wo.</b><span>Bauzeit</span></li>
        <li class="rf-case-stat"><b>120 m²</b><span>Wohnfläche</span></li>
        <li class="rf-case-stat"><b>3</b><span>Gewerke</span></li>
      </ul>
      <blockquote class="rf-case-quote">
        „Sauber geplant, pünktlich fertig und der Festpreis hat gehalten. Genau so stellt man sich das vor."
        <cite>Zufriedene Bauherrin, Musterstadt</cite>
      </blockquote>
      <a class="rf-case-link" href="#">Projekt ansehen <span aria-hidden="true">→</span></a>
    </div>
  </div>
</section>

<style>
.rf-case{position:relative;width:100%;overflow:hidden;
  background:radial-gradient(130% 130% at 100% 0%,#1c1c26 0%,#151419 55%,#101014 100%);
  border:1px solid #26262c;border-radius:20px;color:#e9e9ee}
.rf-case-grid{display:grid;grid-template-columns:1fr}
@media(min-width:820px){.rf-case-grid{grid-template-columns:1.05fr .95fr;align-items:stretch}}
.rf-case-media{position:relative;min-height:220px;overflow:hidden;
  background:radial-gradient(120% 120% at 30% 25%,#3b3b57 0%,#26263a 48%,#14141e 100%)}
.rf-case-media::after{content:"";position:absolute;inset:0;
  background:linear-gradient(to top,rgba(12,12,16,.55),transparent 60%)}
.rf-case-stamp{position:absolute;left:1.1rem;top:1.1rem;z-index:1;
  font-size:.68rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  padding:.34rem .7rem;border-radius:99px;color:#0d0d10;background:var(--akzent,#7c87ff)}
.rf-case-body{padding:1.8rem}
@media(min-width:720px){.rf-case-body{padding:2.6rem}}
.rf-case-eyebrow{margin:0 0 .7rem;display:inline-flex;align-items:center;gap:.6em;font-size:.74rem;
  font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--akzent,#7c87ff)}
.rf-case-eyebrow::before{content:"";width:24px;height:1px;background:var(--akzent,#7c87ff)}
.rf-case-title{margin:0 0 .8rem;font-size:clamp(1.5rem,3.4vw,2.05rem);line-height:1.14;
  letter-spacing:-.02em;color:#f4f4f5}
.rf-case-lead{margin:0 0 1.5rem;font-size:1rem;line-height:1.6;color:#c9c9d1}
.rf-case-stats{list-style:none;display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;
  margin:0 0 1.6rem;padding:1.3rem 0;border-top:1px solid #26262c;border-bottom:1px solid #26262c}
.rf-case-stat b{display:block;font-size:clamp(1.3rem,3vw,1.7rem);line-height:1;
  letter-spacing:-.02em;color:var(--akzent,#7c87ff)}
.rf-case-stat span{display:block;margin-top:.35rem;font-size:.76rem;color:#a1a1aa}
.rf-case-quote{margin:0 0 1.6rem;padding-left:1rem;border-left:2px solid var(--akzent,#7c87ff);
  font-size:.98rem;line-height:1.55;color:#e9e9ee;font-style:italic}
.rf-case-quote cite{display:block;margin-top:.5rem;font-style:normal;font-size:.8rem;color:#a1a1aa}
.rf-case-link{display:inline-flex;align-items:center;gap:.5rem;font-weight:600;font-size:.95rem;
  color:#f4f4f5;text-decoration:none;padding:.55rem 0;
  border-bottom:1px solid transparent;transition:border-color .2s ease,gap .2s ease}
.rf-case-link span{transition:transform .2s cubic-bezier(.4,0,.2,1)}
.rf-case-link:hover,.rf-case-link:focus-visible{border-color:var(--akzent,#7c87ff);outline:none}
.rf-case-link:hover span,.rf-case-link:focus-visible span{transform:translateX(4px)}
.rf-case-link:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:3px;border-radius:4px}
@media (prefers-reduced-motion:reduce){
  .rf-case-link,.rf-case-link span{transition:none}
}
</style>

Referenzen — Karussell (Scroll-Snap)

Pol 1 · Craft Anlass: Referenzen / Galerie

Horizontales Projekt-Karussell mit nativem Scroll-Snap: durchwischen am Handy, Prev/Next-Buttons und anklickbare Punkt-Indikatoren am Desktop. Der aktive Punkt aktualisiert sich beim Scrollen automatisch, die Buttons deaktivieren sich an den Enden. Barrierefrei über aria-label, aria-current, Fokus-Ringe und prefers-reduced-motion.

Ausgewählte Arbeiten

Projekte zum Durchblättern

Ein Querschnitt aus Umbau, Sanierung und Neubau — wischen oder mit den Pfeilen navigieren.

Innenausbau

Loft am Ahornweg

Offener Grundriss mit Sichtestrich und Eicheneinbauten.

Außenanlage

Gartenhof Lindenrain

Natursteinterrasse mit begrünter Pergola und Wegeführung.

Sanierung

Alte Speicherei

Denkmalgerechte Aufarbeitung von Fachwerk und Dielenboden.

Neubau

Stadthaus Uferstraße

Kompakter Neubau mit klarer Fassade und großen Fensterflächen.

Gewerbe

Werkstatt Nordspange

Robuster Innenausbau mit sichtbarer Technik und Stahlbühne.

<style>
/* Referenzen — Karussell (Scroll-Snap) · Pol 1 (Craft) · Präfix rf-carou */
.rf-carou-shell{
  background:radial-gradient(130% 120% at 0% 0%,#1c1c28 0%,#141319 55%,#101014 100%);
  border:1px solid #26262c;border-radius:20px;padding:1.8rem;color:#e9e9ee;
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
}
@media(min-width:760px){ .rf-carou-shell{ padding:2.6rem } }

.rf-carou-eyebrow{
  font-size:.74rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--akzent,#7c87ff);margin:0 0 .5rem;
}
.rf-carou-title{
  margin:0 0 .4rem;font-size:clamp(1.4rem,3.2vw,1.95rem);
  letter-spacing:-.01em;color:#f4f4f5;line-height:1.15;
}
.rf-carou-lead{ margin:0 0 1.6rem;color:#a1a1aa;max-width:52ch;line-height:1.5 }

/* Kopfzeile mit Titel links, Steuer-Buttons rechts */
.rf-carou-head{
  display:flex;flex-wrap:wrap;gap:1rem;align-items:flex-end;
  justify-content:space-between;margin-bottom:1.2rem;
}
.rf-carou-ctrls{ display:flex;gap:.6rem;flex-shrink:0 }
.rf-carou-btn{
  width:44px;height:44px;flex:0 0 44px;display:grid;place-items:center;
  border-radius:50%;background:#1c1c22;border:1px solid #26262c;
  color:#f4f4f5;cursor:pointer;transition:background .2s ease,border-color .2s ease,transform .2s ease;
}
.rf-carou-btn svg{ width:20px;height:20px }
.rf-carou-btn:disabled{ opacity:.38;cursor:not-allowed }
.rf-carou-btn:focus-visible{ outline:2px solid var(--akzent,#7c87ff);outline-offset:2px }
@media(hover:hover){
  .rf-carou-btn:not(:disabled):hover{
    background:#232330;border-color:var(--akzent,#7c87ff);transform:translateY(-1px);
  }
}

/* Track — horizontal, Scroll-Snap, dezente Scrollbar aus */
.rf-carou-track{
  display:flex;gap:1rem;overflow-x:auto;scroll-snap-type:x mandatory;
  scroll-behavior:smooth;padding:.25rem .25rem 1rem;margin:0 -.25rem;
  scrollbar-width:none;-ms-overflow-style:none;
}
.rf-carou-track::-webkit-scrollbar{ display:none }

.rf-carou-card{
  flex:0 0 78%;max-width:340px;scroll-snap-align:start;
  background:#17171b;border:1px solid #26262c;border-radius:16px;overflow:hidden;
  display:flex;flex-direction:column;transition:border-color .2s ease,transform .2s ease;
}
@media(min-width:560px){ .rf-carou-card{ flex-basis:46% } }
@media(min-width:900px){ .rf-carou-card{ flex-basis:31% } }
@media(hover:hover){
  .rf-carou-card:hover{ border-color:#3a3a46;transform:translateY(-2px) }
}

/* Bild-Platzhalter — im Projekt durch <img> ersetzen */
.rf-carou-thumb{
  aspect-ratio:16/10;width:100%;
  background:radial-gradient(120% 120% at 20% 10%,#3b3b54 0%,#24242f 55%,#15151b 100%);
}
.rf-carou-card:nth-child(2) .rf-carou-thumb{
  background:radial-gradient(120% 120% at 80% 15%,#1f3a34 0%,#1a2622 55%,#141814 100%);
}
.rf-carou-card:nth-child(3) .rf-carou-thumb{
  background:radial-gradient(120% 120% at 30% 80%,#3d2f14 0%,#2a2318 55%,#161310 100%);
}
.rf-carou-card:nth-child(4) .rf-carou-thumb{
  background:radial-gradient(120% 120% at 70% 20%,#2c2450 0%,#1e1a30 55%,#131118 100%);
}
.rf-carou-card:nth-child(5) .rf-carou-thumb{
  background:radial-gradient(120% 120% at 15% 60%,#153b4a 0%,#152730 55%,#101519 100%);
}

.rf-carou-body{ padding:1.1rem 1.2rem 1.3rem;display:flex;flex-direction:column;gap:.35rem }
.rf-carou-cat{
  font-size:.7rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--akzent,#7c87ff);
}
.rf-carou-name{ margin:0;font-size:1.05rem;color:#f4f4f5;letter-spacing:-.01em;line-height:1.25 }
.rf-carou-desc{ margin:.15rem 0 0;font-size:.9rem;color:#a1a1aa;line-height:1.45 }

/* Punkt-Indikatoren */
.rf-carou-dots{
  display:flex;gap:.5rem;justify-content:center;align-items:center;margin-top:1rem;
}
.rf-carou-dot{
  width:9px;height:9px;padding:0;border-radius:50%;cursor:pointer;
  background:#3a3a46;border:1px solid transparent;
  transition:background .2s ease,transform .2s ease,width .2s ease,border-radius .2s ease;
}
.rf-carou-dot[aria-current="true"]{
  background:var(--akzent,#7c87ff);width:22px;border-radius:6px;
}
.rf-carou-dot:focus-visible{ outline:2px solid var(--akzent,#7c87ff);outline-offset:3px }
@media(hover:hover){
  .rf-carou-dot:not([aria-current="true"]):hover{ background:#55555f;transform:scale(1.15) }
}

@media(prefers-reduced-motion:reduce){
  .rf-carou-track{ scroll-behavior:auto }
  .rf-carou-shell *{ transition:none!important;animation:none!important }
}
</style>

<section class="rf-carou-shell" aria-roledescription="Karussell" aria-label="Ausgewählte Projekte">
  <div class="rf-carou-head">
    <div>
      <p class="rf-carou-eyebrow">Ausgewählte Arbeiten</p>
      <h2 class="rf-carou-title">Projekte zum Durchblättern</h2>
      <p class="rf-carou-lead">Ein Querschnitt aus Umbau, Sanierung und Neubau — wischen oder mit den Pfeilen navigieren.</p>
    </div>
    <div class="rf-carou-ctrls">
      <button type="button" class="rf-carou-btn" data-rf-carou-prev aria-label="Vorheriges Projekt">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"/></svg>
      </button>
      <button type="button" class="rf-carou-btn" data-rf-carou-next aria-label="Nächstes Projekt">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
      </button>
    </div>
  </div>

  <div class="rf-carou-track" data-rf-carou-track tabindex="0" aria-label="Projekt-Galerie, horizontal scrollbar">
    <article class="rf-carou-card">
      <div class="rf-carou-thumb" role="img" aria-label="Vorschaubild Projekt Ahornweg"></div><!-- im Projekt durch <img> ersetzen -->
      <div class="rf-carou-body">
        <span class="rf-carou-cat">Innenausbau</span>
        <h3 class="rf-carou-name">Loft am Ahornweg</h3>
        <p class="rf-carou-desc">Offener Grundriss mit Sichtestrich und Eicheneinbauten.</p>
      </div>
    </article>
    <article class="rf-carou-card">
      <div class="rf-carou-thumb" role="img" aria-label="Vorschaubild Projekt Gartenhof"></div><!-- im Projekt durch <img> ersetzen -->
      <div class="rf-carou-body">
        <span class="rf-carou-cat">Außenanlage</span>
        <h3 class="rf-carou-name">Gartenhof Lindenrain</h3>
        <p class="rf-carou-desc">Natursteinterrasse mit begrünter Pergola und Wegeführung.</p>
      </div>
    </article>
    <article class="rf-carou-card">
      <div class="rf-carou-thumb" role="img" aria-label="Vorschaubild Projekt Speicherei"></div><!-- im Projekt durch <img> ersetzen -->
      <div class="rf-carou-body">
        <span class="rf-carou-cat">Sanierung</span>
        <h3 class="rf-carou-name">Alte Speicherei</h3>
        <p class="rf-carou-desc">Denkmalgerechte Aufarbeitung von Fachwerk und Dielenboden.</p>
      </div>
    </article>
    <article class="rf-carou-card">
      <div class="rf-carou-thumb" role="img" aria-label="Vorschaubild Projekt Uferstraße"></div><!-- im Projekt durch <img> ersetzen -->
      <div class="rf-carou-body">
        <span class="rf-carou-cat">Neubau</span>
        <h3 class="rf-carou-name">Stadthaus Uferstraße</h3>
        <p class="rf-carou-desc">Kompakter Neubau mit klarer Fassade und großen Fensterflächen.</p>
      </div>
    </article>
    <article class="rf-carou-card">
      <div class="rf-carou-thumb" role="img" aria-label="Vorschaubild Projekt Werkstatt"></div><!-- im Projekt durch <img> ersetzen -->
      <div class="rf-carou-body">
        <span class="rf-carou-cat">Gewerbe</span>
        <h3 class="rf-carou-name">Werkstatt Nordspange</h3>
        <p class="rf-carou-desc">Robuster Innenausbau mit sichtbarer Technik und Stahlbühne.</p>
      </div>
    </article>
  </div>

  <div class="rf-carou-dots" data-rf-carou-dots role="tablist" aria-label="Projekt auswählen"></div>
</section>

<script>
(function(){
  var shells = document.querySelectorAll('.rf-carou-shell');
  shells.forEach(function(shell){
    var track = shell.querySelector('[data-rf-carou-track]');
    var prev  = shell.querySelector('[data-rf-carou-prev]');
    var next  = shell.querySelector('[data-rf-carou-next]');
    var dotsWrap = shell.querySelector('[data-rf-carou-dots]');
    if(!track || !dotsWrap) return;

    var cards = Array.prototype.slice.call(track.querySelectorAll('.rf-carou-card'));
    if(!cards.length) return;

    // Punkt-Indikatoren erzeugen
    var dots = cards.map(function(card, i){
      var d = document.createElement('button');
      d.type = 'button';
      d.className = 'rf-carou-dot';
      d.setAttribute('role','tab');
      d.setAttribute('aria-label','Zu Projekt ' + (i+1));
      d.addEventListener('click', function(){
        track.scrollTo({ left: card.offsetLeft - track.offsetLeft, behavior:'smooth' });
      });
      dotsWrap.appendChild(d);
      return d;
    });

    // Kartenschritt aus tatsächlicher Breite + Lücke ableiten
    function step(){
      if(cards.length < 2) return cards[0].offsetWidth;
      return cards[1].offsetLeft - cards[0].offsetLeft;
    }

    // Aktiven Index anhand der Scroll-Position bestimmen
    function activeIndex(){
      var maxScroll = track.scrollWidth - track.clientWidth;
      if(maxScroll > 0 && track.scrollLeft >= maxScroll - 2) return cards.length - 1;
      var pos = track.scrollLeft;
      var best = 0, bestDist = Infinity;
      cards.forEach(function(card, i){
        var left = card.offsetLeft - track.offsetLeft;
        var dist = Math.abs(left - pos);
        if(dist < bestDist){ bestDist = dist; best = i; }
      });
      return best;
    }

    function sync(){
      var idx = activeIndex();
      dots.forEach(function(d, i){
        var on = i === idx;
        d.setAttribute('aria-current', on ? 'true' : 'false');
        d.setAttribute('aria-selected', on ? 'true' : 'false');
      });
      if(prev) prev.disabled = idx <= 0;
      if(next) next.disabled = idx >= cards.length - 1;
    }

    if(prev) prev.addEventListener('click', function(){
      track.scrollBy({ left: -step(), behavior:'smooth' });
    });
    if(next) next.addEventListener('click', function(){
      track.scrollBy({ left: step(), behavior:'smooth' });
    });

    var raf;
    track.addEventListener('scroll', function(){
      if(raf) cancelAnimationFrame(raf);
      raf = requestAnimationFrame(sync);
    }, { passive:true });
    window.addEventListener('resize', sync);

    sync();
  });
})();
</script>

Referenzen — kompakte Projekt-Liste

Pol 2 · Klarheit Anlass: viele Referenzen, Übersicht, scanbar

Tabellarische Referenz-Liste für viele Projekte: jede Zeile ist ein klickbarer Link im gleichen Spalten-Raster — Projektname, Kategorie-Chip, Ort, Jahr und ein Pfeil, der bei Hover oder Tastatur-Fokus nach rechts gleitet. Die Kopfzeile mit Spaltenlabels erscheint ab Tablet und ist am Handy ausgeblendet, wo jede Zeile sauber stapelt. Fokus-Rahmen sichtbar, Pfeil-Bewegung ruht bei prefers-reduced-motion.

<section class="rf-liste" aria-label="Referenzen">
  <div class="rf-liste-head-block">
    <p class="rf-liste-eyebrow">Referenzen</p>
    <h2 class="rf-liste-title">Alle Projekte im Überblick</h2>
  </div>
  <ul class="rf-liste-tbl">
    <!-- Kopfzeile: ab Tablet sichtbar, am Handy ausgeblendet -->
    <li class="rf-liste-head" aria-hidden="true">
      <p class="rf-liste-h is-name">Projekt</p>
      <p class="rf-liste-h is-kat">Kategorie</p>
      <p class="rf-liste-h is-ort">Ort</p>
      <p class="rf-liste-h is-jahr">Jahr</p>
    </li>
    <!-- eine Zeile = ein Link; weitere Zeilen analog -->
    <li>
      <a class="rf-liste-row" href="#">
        <span class="rf-liste-name">Dachgeschoss-Ausbau am Mühlenweg</span>
        <span class="rf-liste-meta">
          <span class="rf-liste-kat">Ausbau</span>
          <span class="rf-liste-ort">Buchenau</span>
          <span class="rf-liste-jahr">2025</span>
          <span class="rf-liste-pfeil" aria-hidden="true">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M13 6l6 6-6 6"/></svg>
          </span>
        </span>
      </a>
    </li>
  </ul>
</section>

<style>
.rf-liste{width:100%;background:#16161a;border:1px solid #26262c;border-radius:18px;
  padding:1.6rem;color:#e9e9ee}
@media(min-width:720px){.rf-liste{padding:2.4rem}}
.rf-liste-head-block{margin:0 0 1.4rem}
.rf-liste-eyebrow{margin:0 0 .5rem;font-size:.74rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--akzent,#7c87ff)}
.rf-liste-title{margin:0;font-size:clamp(1.4rem,3.2vw,1.95rem);line-height:1.15;
  letter-spacing:-.01em;color:#f4f4f5}

/* gemeinsames Spalten-Raster — Kopfzeile und Zeilen fluchten (ab 640px) */
.rf-liste-tbl{list-style:none;margin:0;padding:0}
.rf-liste-head,.rf-liste-row{display:grid;gap:.35rem .9rem;align-items:center;
  grid-template-columns:1fr;grid-template-areas:"name" "meta"}
@media(min-width:640px){
  .rf-liste-head,.rf-liste-row{gap:1rem;
    grid-template-columns:minmax(0,1.7fr) minmax(0,1fr) minmax(0,1fr) auto 20px;
    grid-template-areas:"name kat ort jahr pfeil"}
}

/* Kopfzeile mit Spaltenlabels — am Handy ausgeblendet */
.rf-liste-head{display:none}
@media(min-width:640px){
  .rf-liste-head{display:grid;padding:0 .9rem .7rem;border-bottom:1px solid #22222a}
}
.rf-liste-h{font-size:.7rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:#a1a1aa;margin:0}
.rf-liste-h.is-name{grid-area:name}
.rf-liste-h.is-kat{grid-area:kat}
.rf-liste-h.is-ort{grid-area:ort}
.rf-liste-h.is-jahr{grid-area:jahr;text-align:right}

/* Zeilen als klickbare Links */
.rf-liste-row{position:relative;text-decoration:none;color:inherit;
  padding:.95rem .9rem;border-bottom:1px solid #22222a;border-radius:10px;
  transition:background .2s ease}
.rf-liste-row:last-child{border-bottom:0}
.rf-liste-name{grid-area:name;font-size:1.02rem;font-weight:700;line-height:1.25;
  color:#f4f4f5;overflow-wrap:break-word}

/* am Handy Chip · Ort · Jahr · Pfeil in einer Zeile; ab 640px auf eigene Spalten */
.rf-liste-meta{grid-area:meta;display:flex;flex-wrap:wrap;align-items:center;gap:.55rem .7rem}
@media(min-width:640px){.rf-liste-meta{display:contents}}
.rf-liste-kat{grid-area:kat;justify-self:start;font-size:.74rem;font-weight:600;
  color:#a1a1aa;background:#17171b;border:1px solid #26262c;border-radius:99px;
  padding:.24rem .68rem;white-space:nowrap}
.rf-liste-ort{grid-area:ort;font-size:.88rem;color:#a1a1aa}
.rf-liste-jahr{grid-area:jahr;font-size:.88rem;color:#a1a1aa;
  font-variant-numeric:tabular-nums}
@media(min-width:640px){.rf-liste-jahr{text-align:right}}

/* Pfeil rechts — gleitet bei Hover/Fokus nach rechts */
.rf-liste-pfeil{grid-area:pfeil;margin-left:auto;flex:none;display:inline-flex;
  color:var(--akzent,#7c87ff)}
@media(min-width:640px){.rf-liste-pfeil{margin-left:0;justify-self:end}}
.rf-liste-pfeil svg{width:20px;height:20px;display:block;
  transition:transform .2s cubic-bezier(.4,0,.2,1)}

@media(hover:hover){
  .rf-liste-row:hover{background:#1c1c22}
  .rf-liste-row:hover .rf-liste-pfeil svg{transform:translateX(4px)}
}
.rf-liste-row:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:2px;
  background:#1c1c22}
.rf-liste-row:focus-visible .rf-liste-pfeil svg{transform:translateX(4px)}

@media(prefers-reduced-motion:reduce){
  .rf-liste-row,.rf-liste-pfeil svg{transition:none}
}
</style>

Referenzen — Masonry-Spalten

Pol 2 · Klarheit Anlass: Referenzen / Galerie

Pinterest-artige Galerie aus reinem CSS (column-count, 1/2/3 Spalten responsiv) — der bewusste Unterschied zum gleichförmigen Grid sind die bewegten Kachelhöhen. Jede Kachel ist ein Link; die Overlay-Caption blendet bei Hover und bei Tastatur-Fokus (:focus-visible) ein, Bewegung wird bei prefers-reduced-motion abgeschaltet.

Ausgewählte Projekte

Eine Auswahl unserer Arbeiten

Vom Altbau-Detail bis zur kompletten Sanierung — bewegen Sie den Zeiger über eine Kachel oder wählen Sie sie per Tastatur an, um Kategorie und Projektname zu sehen.

<style>
.rf-maso-wrap{
  background:#16161a;
  border:1px solid #26262c;
  border-radius:18px;
  padding:1.6rem;
  color:#e9e9ee;
}
@media (min-width:720px){
  .rf-maso-wrap{ padding:2.4rem; }
}
.rf-maso-eyebrow{
  font-size:.74rem;
  font-weight:600;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--akzent,#7c87ff);
  margin:0 0 .5rem;
}
.rf-maso-title{
  font-size:clamp(1.4rem,3.2vw,1.95rem);
  letter-spacing:-.01em;
  color:#f4f4f5;
  margin:0 0 .4rem;
  line-height:1.15;
}
.rf-maso-lead{
  color:#a1a1aa;
  font-size:.95rem;
  line-height:1.55;
  margin:0 0 1.6rem;
  max-width:56ch;
}
/* Masonry: unterschiedliche Kachelhöhen brechen die gleichförmige Grid-Optik */
.rf-maso-grid{
  column-count:1;
  column-gap:1rem;
}
@media (min-width:560px){
  .rf-maso-grid{ column-count:2; }
}
@media (min-width:840px){
  .rf-maso-grid{ column-count:3; }
}
.rf-maso-card{
  display:block;
  position:relative;
  break-inside:avoid;
  margin-bottom:1rem;
  border:1px solid #26262c;
  border-radius:15px;
  overflow:hidden;
  text-decoration:none;
  background:#1c1c22;
  transition:border-color .25s ease, transform .25s ease;
}
/* Bild-Platzhalter — im Projekt durch <img> ersetzen. Bewusst verschiedene Höhen. */
.rf-maso-img{
  width:100%;
  display:block;
}
.rf-maso-card:nth-child(1) .rf-maso-img{
  min-height:220px;
  background:radial-gradient(120% 130% at 20% 10%,#3b3b54 0%,#24242f 55%,#15151b 100%);
}
.rf-maso-card:nth-child(2) .rf-maso-img{
  min-height:320px;
  background:radial-gradient(120% 120% at 80% 0%,#2c3b3a 0%,#212a2a 50%,#15151b 100%);
}
.rf-maso-card:nth-child(3) .rf-maso-img{
  min-height:180px;
  background:radial-gradient(130% 130% at 10% 90%,#403050 0%,#28222f 55%,#15151b 100%);
}
.rf-maso-card:nth-child(4) .rf-maso-img{
  min-height:280px;
  background:radial-gradient(120% 120% at 90% 20%,#4a3b26 0%,#2c2620 55%,#15151b 100%);
}
.rf-maso-card:nth-child(5) .rf-maso-img{
  min-height:200px;
  background:radial-gradient(120% 130% at 30% 20%,#26364a 0%,#20272f 55%,#15151b 100%);
}
.rf-maso-card:nth-child(6) .rf-maso-img{
  min-height:340px;
  background:radial-gradient(130% 120% at 70% 90%,#3b3b54 0%,#242430 50%,#15151b 100%);
}
/* Overlay-Caption, standardmäßig verborgen — blendet bei Hover/Fokus ein */
.rf-maso-cap{
  position:absolute;
  inset:auto 0 0 0;
  padding:1rem;
  background:linear-gradient(to top,rgba(16,16,20,.92) 0%,rgba(16,16,20,.55) 60%,rgba(16,16,20,0) 100%);
  opacity:0;
  transform:translateY(12px);
  transition:opacity .3s ease, transform .3s ease;
  pointer-events:none;
}
.rf-maso-kat{
  display:block;
  font-size:.68rem;
  font-weight:600;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--akzent,#7c87ff);
  margin-bottom:.25rem;
}
.rf-maso-name{
  display:block;
  font-size:1rem;
  font-weight:600;
  color:#f4f4f5;
  line-height:1.3;
}
@media (hover:hover){
  .rf-maso-card:hover{
    border-color:var(--akzent,#7c87ff);
    transform:translateY(-3px);
  }
  .rf-maso-card:hover .rf-maso-cap{
    opacity:1;
    transform:translateY(0);
  }
}
/* Tastatur-Bedienung: Caption auch bei Fokus sichtbar */
.rf-maso-card:focus-visible{
  outline:2px solid var(--akzent,#7c87ff);
  outline-offset:3px;
}
.rf-maso-card:focus-visible .rf-maso-cap{
  opacity:1;
  transform:translateY(0);
}
@media (prefers-reduced-motion:reduce){
  .rf-maso-card,
  .rf-maso-cap{
    transition:none;
  }
}
</style>

<div class="rf-maso-wrap">
  <p class="rf-maso-eyebrow">Ausgewählte Projekte</p>
  <h2 class="rf-maso-title">Eine Auswahl unserer Arbeiten</h2>
  <p class="rf-maso-lead">Vom Altbau-Detail bis zur kompletten Sanierung — bewegen Sie den Zeiger über eine Kachel oder wählen Sie sie per Tastatur an, um Kategorie und Projektname zu sehen.</p>
  <div class="rf-maso-grid">
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Fassade Lindenhof"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Fassade</span>
        <span class="rf-maso-name">Fassadensanierung Lindenhof</span>
      </span>
    </a>
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Badumbau Ahornweg"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Bad</span>
        <span class="rf-maso-name">Badumbau Ahornweg</span>
      </span>
    </a>
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Treppenhaus Kastanienallee"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Innenausbau</span>
        <span class="rf-maso-name">Treppenhaus Kastanienallee</span>
      </span>
    </a>
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Dachausbau Birkengrund"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Dach</span>
        <span class="rf-maso-name">Dachausbau Birkengrund</span>
      </span>
    </a>
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Küche Erlengasse"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Küche</span>
        <span class="rf-maso-name">Küchenmontage Erlengasse</span>
      </span>
    </a>
    <a class="rf-maso-card" href="#">
      <span class="rf-maso-img" role="img" aria-label="Referenzbild: Terrasse Ulmenplatz"></span>
      <span class="rf-maso-cap">
        <span class="rf-maso-kat">Außenanlage</span>
        <span class="rf-maso-name">Terrasse Ulmenplatz</span>
      </span>
    </a>
  </div>
</div>

Referenzen — Feature + Thumbnail-Wechsler

Pol 1 · Craft Anlass: Referenzen / Galerie

Ein großes Hauptbild mit aufgesetztem Glas-Label (Kategorie + Projektname); vier Thumbnail-Buttons darunter tauschen per Klick oder Tastatur (Enter/Leertaste, Tab-Fokus) Bild und Label. Der aktive Thumbnail trägt aria-current="true" und einen Akzent-Rahmen, sichtbare :focus-visible-Outlines und reduzierte Bewegung sind berücksichtigt.

Ausgewählte Projekte

Ein Auszug aus unserer Arbeit

<style>
.rf-feat-wrap{
  background:radial-gradient(130% 120% at 0% 0%,#1c1c28 0%,#141319 55%,#101014 100%);
  border:1px solid #26262c;border-radius:20px;padding:1.8rem;color:#e9e9ee;
}
@media(min-width:760px){.rf-feat-wrap{padding:2.6rem}}
.rf-feat-eyebrow{
  display:block;font-size:.74rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--akzent,#7c87ff);margin:0 0 .5rem;
}
.rf-feat-h2{
  margin:0 0 1.4rem;font-size:clamp(1.4rem,3.2vw,1.95rem);
  letter-spacing:-.01em;color:#f4f4f5;line-height:1.2;
}
/* Hauptbild — im Projekt durch <img> ersetzen */
.rf-feat-main{
  position:relative;width:100%;aspect-ratio:16/10;border-radius:16px;
  border:1px solid #26262c;overflow:hidden;
  background:radial-gradient(120% 120% at 25% 20%,#3b3b54 0%,#24242f 55%,#15151b 100%);
  transition:background .45s ease;
}
.rf-feat-main--1{background:radial-gradient(120% 120% at 25% 20%,#3b3b54 0%,#24242f 55%,#15151b 100%)}
.rf-feat-main--2{background:radial-gradient(120% 120% at 75% 25%,#243b34 0%,#1c2a26 55%,#141a17 100%)}
.rf-feat-main--3{background:radial-gradient(120% 120% at 30% 75%,#3d2f4f 0%,#26202f 55%,#16121b 100%)}
.rf-feat-main--4{background:radial-gradient(120% 120% at 70% 70%,#4a3a24 0%,#2c241a 55%,#1a1510 100%)}
/* Glas-Label auf dem Hauptbild */
.rf-feat-label{
  position:absolute;left:1rem;bottom:1rem;right:1rem;max-width:30rem;
  padding:.85rem 1.05rem;border-radius:13px;
  border:1px solid rgba(255,255,255,.14);
  background:rgba(17,17,20,.55);
  -webkit-backdrop-filter:blur(11px);backdrop-filter:blur(11px);
}
.rf-feat-kat{
  display:block;font-size:.7rem;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--akzent,#7c87ff);margin:0 0 .25rem;
}
.rf-feat-name{
  display:block;font-size:1.05rem;font-weight:600;color:#f4f4f5;line-height:1.25;
}
/* Thumbnail-Reihe */
.rf-feat-thumbs{
  display:grid;grid-template-columns:repeat(4,1fr);gap:.7rem;margin-top:.9rem;
  padding:0;list-style:none;
}
.rf-feat-thumb{
  position:relative;display:block;width:100%;aspect-ratio:16/11;
  padding:0;cursor:pointer;border-radius:12px;overflow:hidden;
  border:1px solid #26262c;background:#1c1c22;color:inherit;
  transition:border-color .2s ease,transform .2s ease;
}
.rf-feat-thumb::after{
  content:"";position:absolute;inset:0;
}
.rf-feat-thumb--1::after{background:radial-gradient(120% 120% at 25% 20%,#3b3b54 0%,#24242f 60%,#15151b 100%)}
.rf-feat-thumb--2::after{background:radial-gradient(120% 120% at 75% 25%,#243b34 0%,#1c2a26 60%,#141a17 100%)}
.rf-feat-thumb--3::after{background:radial-gradient(120% 120% at 30% 75%,#3d2f4f 0%,#26202f 60%,#16121b 100%)}
.rf-feat-thumb--4::after{background:radial-gradient(120% 120% at 70% 70%,#4a3a24 0%,#2c241a 60%,#1a1510 100%)}
.rf-feat-thumb[aria-current="true"]{
  border-color:var(--akzent,#7c87ff);
  box-shadow:0 0 0 1px var(--akzent,#7c87ff);
}
.rf-feat-thumb:focus-visible{
  outline:2px solid var(--akzent,#7c87ff);outline-offset:2px;
}
.rf-feat-thumbnr{
  position:absolute;left:.4rem;top:.35rem;z-index:1;
  font-size:.65rem;font-weight:600;color:#f4f4f5;
  padding:.05rem .4rem;border-radius:6px;
  background:rgba(17,17,20,.6);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
@media(hover:hover){
  .rf-feat-thumb:hover{border-color:#3a3a44;transform:translateY(-2px)}
}
@media(prefers-reduced-motion:reduce){
  .rf-feat-main,.rf-feat-thumb{transition:none}
}
</style>

<div class="rf-feat-wrap">
  <span class="rf-feat-eyebrow">Ausgewählte Projekte</span>
  <h2 class="rf-feat-h2">Ein Auszug aus unserer Arbeit</h2>
  <div class="rf-feat-main rf-feat-main--1" role="img" aria-live="polite"
       aria-label="Referenzbild: Altbau-Sanierung — Projekt Uferzeile 12">
    <!-- im Projekt durch <img> ersetzen -->
    <div class="rf-feat-label">
      <span class="rf-feat-kat">Altbau-Sanierung</span>
      <span class="rf-feat-name">Projekt Uferzeile 12</span>
    </div>
  </div>
  <ul class="rf-feat-thumbs">
    <li>
      <button type="button" class="rf-feat-thumb rf-feat-thumb--1" aria-current="true"
        data-nr="1" data-kat="Altbau-Sanierung" data-name="Projekt Uferzeile 12"
        aria-label="Projekt Uferzeile 12 — Altbau-Sanierung anzeigen">
        <span class="rf-feat-thumbnr">01</span>
      </button>
    </li>
    <li>
      <button type="button" class="rf-feat-thumb rf-feat-thumb--2"
        data-nr="2" data-kat="Außenanlage" data-name="Gartenhof Lindenweg"
        aria-label="Gartenhof Lindenweg — Außenanlage anzeigen">
        <span class="rf-feat-thumbnr">02</span>
      </button>
    </li>
    <li>
      <button type="button" class="rf-feat-thumb rf-feat-thumb--3"
        data-nr="3" data-kat="Innenausbau" data-name="Loft am Speicher"
        aria-label="Loft am Speicher — Innenausbau anzeigen">
        <span class="rf-feat-thumbnr">03</span>
      </button>
    </li>
    <li>
      <button type="button" class="rf-feat-thumb rf-feat-thumb--4"
        data-nr="4" data-kat="Fassade" data-name="Kontorhaus Nordspange"
        aria-label="Kontorhaus Nordspange — Fassade anzeigen">
        <span class="rf-feat-thumbnr">04</span>
      </button>
    </li>
  </ul>
</div>

<script>
(function(){
  var wraps=document.querySelectorAll('.rf-feat-wrap');
  wraps.forEach(function(wrap){
    var main=wrap.querySelector('.rf-feat-main');
    var kat=wrap.querySelector('.rf-feat-kat');
    var name=wrap.querySelector('.rf-feat-name');
    var thumbs=wrap.querySelectorAll('.rf-feat-thumb');
    thumbs.forEach(function(btn){
      btn.addEventListener('click',function(){
        var nr=btn.getAttribute('data-nr');
        // Hauptbild-Verlauf umschalten
        main.classList.remove('rf-feat-main--1','rf-feat-main--2','rf-feat-main--3','rf-feat-main--4');
        main.classList.add('rf-feat-main--'+nr);
        // Label + Barrierefreiheit aktualisieren
        var k=btn.getAttribute('data-kat');
        var n=btn.getAttribute('data-name');
        kat.textContent=k;
        name.textContent=n;
        main.setAttribute('aria-label','Referenzbild: '+k+' — '+n);
        // aktiven Thumb markieren
        thumbs.forEach(function(t){t.removeAttribute('aria-current');});
        btn.setAttribute('aria-current','true');
      });
    });
  });
})();
</script>

Referenzen — Ergebnis-Karten

Pol 2 · Klarheit Anlass: Galerie / Referenz-Reihe

Reihe aus drei kompakten Mini-Case-Studies, jede mit Bild-Streifen, Kategorie, Titel, einer hervorgehobenen Kennzahl und Kurzbeschreibung. Ruhiger Hover (Border zu Akzent, leichtes Anheben), mobil einspaltig gestapelt. Barrierefrei: Hover in @media(hover:hover), :focus-within-Outline für spätere Verlinkung, prefers-reduced-motion respektiert.

Ausgewählte Projekte

Ergebnisse, die sich messen lassen

Drei Arbeiten im Überblick — jeweils mit der Kennzahl, auf die es beim Kunden ankam.

Sanierung

Altbauwohnung Lindenhof

8 Wo. Bauzeit

Komplette Kernsanierung mit neuem Grundriss, termingerecht übergeben.

Innenausbau

Familienhaus Ahornweg

120 m² Wohnfläche

Trockenbau, Böden und Malerarbeiten für den kompletten Wohnbereich.

Badumbau

Wellnessbad Seeblick

4,9 ★ Bewertung

Bodengleiche Dusche und Fliesenarbeiten — vom Kunden bestens bewertet.

<style>
/* Referenzen — Ergebnis-Karten (Pol 2 · Klarheit) — alles über .rf-ergeb-* gescopet */
.rf-ergeb-wrap{
  background:#16161a;
  border:1px solid #26262c;
  border-radius:18px;
  padding:1.6rem;
  color:#e9e9ee;
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
}
@media (min-width:720px){
  .rf-ergeb-wrap{padding:2.4rem;}
}
.rf-ergeb-eyebrow{
  font-size:.74rem;
  font-weight:600;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--akzent,#7c87ff);
  margin:0 0 .5rem;
}
.rf-ergeb-head{
  font-size:clamp(1.4rem,3.2vw,1.95rem);
  letter-spacing:-.01em;
  color:#f4f4f5;
  margin:0 0 .4rem;
  font-weight:700;
}
.rf-ergeb-lede{
  color:#a1a1aa;
  font-size:.95rem;
  line-height:1.6;
  margin:0 0 1.6rem;
  max-width:56ch;
}
.rf-ergeb-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:1rem;
}
@media (min-width:640px){
  .rf-ergeb-grid{grid-template-columns:repeat(2,1fr);}
}
@media (min-width:960px){
  .rf-ergeb-grid{grid-template-columns:repeat(3,1fr);}
}
.rf-ergeb-card{
  background:#1c1c22;
  border:1px solid #26262c;
  border-radius:16px;
  overflow:hidden;
  display:flex;
  flex-direction:column;
  transition:transform .22s ease,border-color .22s ease;
}
/* schmaler Bild-Verlauf-Streifen oben — im Projekt durch <img> ersetzen */
.rf-ergeb-strip{
  height:96px;
  position:relative;
}
.rf-ergeb-strip--a{
  background:radial-gradient(120% 140% at 20% 10%,#3b3b54 0%,#24242f 55%,#15151b 100%);
}
.rf-ergeb-strip--b{
  background:radial-gradient(120% 140% at 80% 0%,#2a3b34 0%,#1d2620 55%,#15151b 100%);
}
.rf-ergeb-strip--c{
  background:radial-gradient(120% 140% at 40% 20%,#4a3a24 0%,#2c241a 55%,#15151b 100%);
}
.rf-ergeb-body{
  padding:1.1rem 1.15rem 1.25rem;
  display:flex;
  flex-direction:column;
  gap:.55rem;
  flex:1;
}
.rf-ergeb-kat{
  font-size:.7rem;
  font-weight:600;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--akzent,#7c87ff);
}
.rf-ergeb-titel{
  font-size:1.08rem;
  font-weight:600;
  color:#f4f4f5;
  line-height:1.3;
  margin:0;
  letter-spacing:-.005em;
}
.rf-ergeb-kpi{
  margin-top:.35rem;
  padding-top:.85rem;
  border-top:1px solid #26262c;
}
.rf-ergeb-zahl{
  font-size:clamp(1.6rem,5vw,1.9rem);
  font-weight:700;
  line-height:1;
  color:var(--akzent,#7c87ff);
  letter-spacing:-.02em;
  display:block;
}
.rf-ergeb-label{
  font-size:.72rem;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:#71717a;
  margin-top:.35rem;
  display:block;
}
.rf-ergeb-text{
  color:#a1a1aa;
  font-size:.88rem;
  line-height:1.55;
  margin:.2rem 0 0;
}
/* Hover nur wo echtes Hovern möglich ist */
@media (hover:hover){
  .rf-ergeb-card:hover{
    transform:translateY(-4px);
    border-color:var(--akzent,#7c87ff);
  }
}
/* Tastatur-Bedienbarkeit falls Karte später verlinkt wird */
.rf-ergeb-card:focus-within{
  outline:2px solid var(--akzent,#7c87ff);
  outline-offset:2px;
}
@media (prefers-reduced-motion:reduce){
  .rf-ergeb-card{transition:none;}
  .rf-ergeb-card:hover{transform:none;}
}
</style>

<section class="rf-ergeb-wrap" aria-labelledby="rf-ergeb-titel-demo">
  <p class="rf-ergeb-eyebrow">Ausgewählte Projekte</p>
  <h2 class="rf-ergeb-head" id="rf-ergeb-titel-demo">Ergebnisse, die sich messen lassen</h2>
  <p class="rf-ergeb-lede">Drei Arbeiten im Überblick — jeweils mit der Kennzahl, auf die es beim Kunden ankam.</p>
  <div class="rf-ergeb-grid">
    <article class="rf-ergeb-card">
      <!-- Bild-Streifen: im Projekt durch <img> ersetzen -->
      <div class="rf-ergeb-strip rf-ergeb-strip--a" role="img" aria-label="Projektbild Altbau-Sanierung"></div>
      <div class="rf-ergeb-body">
        <span class="rf-ergeb-kat">Sanierung</span>
        <h3 class="rf-ergeb-titel">Altbauwohnung Lindenhof</h3>
        <div class="rf-ergeb-kpi">
          <span class="rf-ergeb-zahl">8 Wo.</span>
          <span class="rf-ergeb-label">Bauzeit</span>
        </div>
        <p class="rf-ergeb-text">Komplette Kernsanierung mit neuem Grundriss, termingerecht übergeben.</p>
      </div>
    </article>
    <article class="rf-ergeb-card">
      <div class="rf-ergeb-strip rf-ergeb-strip--b" role="img" aria-label="Projektbild Neubau-Innenausbau"></div>
      <div class="rf-ergeb-body">
        <span class="rf-ergeb-kat">Innenausbau</span>
        <h3 class="rf-ergeb-titel">Familienhaus Ahornweg</h3>
        <div class="rf-ergeb-kpi">
          <span class="rf-ergeb-zahl">120 m²</span>
          <span class="rf-ergeb-label">Wohnfläche</span>
        </div>
        <p class="rf-ergeb-text">Trockenbau, Böden und Malerarbeiten für den kompletten Wohnbereich.</p>
      </div>
    </article>
    <article class="rf-ergeb-card">
      <div class="rf-ergeb-strip rf-ergeb-strip--c" role="img" aria-label="Projektbild Badezimmer-Umbau"></div>
      <div class="rf-ergeb-body">
        <span class="rf-ergeb-kat">Badumbau</span>
        <h3 class="rf-ergeb-titel">Wellnessbad Seeblick</h3>
        <div class="rf-ergeb-kpi">
          <span class="rf-ergeb-zahl">4,9 ★</span>
          <span class="rf-ergeb-label">Bewertung</span>
        </div>
        <p class="rf-ergeb-text">Bodengleiche Dusche und Fliesenarbeiten — vom Kunden bestens bewertet.</p>
      </div>
    </article>
  </div>
</section>