Design · Bausteine-Dossier

Kategorie

FAQ / Akkordeon

Aufklappbare Frage-Antwort-Listen — einmal barrierearm ganz ohne JavaScript über das native <details>-Element, einmal als geführtes Single-Open-Akkordeon mit weicher Höhen-Animation und „Mehr anzeigen". Akzentfarbe über --akzent in einer Zeile anpassbar.

Natives <details>-Akkordeon — drei Marker-Varianten

Pol 2 · Klarheit Anlass: FAQ ohne JavaScript

Reines HTML/CSS, kein Skript — daher barrierearm und auch ohne JS bedienbar. Drei austauschbare Marker: Chevron dreht 180°, Plus wird zum × (45°), Dreieck dreht 90°. Mehrere können gleichzeitig offen sein. Vorbild: Bernstein (Chevron), Hauszeit (Plus→×), NDS (▸).

Wie läuft eine Küchenmontage ab?

Nach kurzer Aufnahme vor Ort erhalten Sie einen festen Termin. Die Montage erledigen wir an einem Tag, sauber und mit Aufmaß.

Was kostet ein unverbindliches Angebot?

Das Angebot ist für Sie kostenlos. Sie zahlen erst, wenn Sie sich für die Umsetzung entscheiden.

In welchem Umkreis sind Sie tätig?

Im gesamten Stadtgebiet und im direkten Umland. Größere Aufträge auf Anfrage auch darüber hinaus.

<div class="fx-faq">
  <details open>
    <summary>Wie läuft eine Küchenmontage ab?<svg class="fx-chev" viewBox="0 0 24 24" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg></summary>
    <div class="fx-faq-a"><p>Nach kurzer Aufnahme vor Ort erhalten Sie einen festen Termin. Die Montage erledigen wir an einem Tag, sauber und mit Aufmaß.</p></div>
  </details>
  <details>
    <summary>Was kostet ein unverbindliches Angebot?<span class="fx-plus" aria-hidden="true">+</span></summary>
    <div class="fx-faq-a"><p>Das Angebot ist für Sie kostenlos. Sie zahlen erst, wenn Sie sich für die Umsetzung entscheiden.</p></div>
  </details>
  <details>
    <summary>In welchem Umkreis sind Sie tätig?<span class="fx-tri" aria-hidden="true">▸</span></summary>
    <div class="fx-faq-a"><p>Im gesamten Stadtgebiet und im direkten Umland. Größere Aufträge auf Anfrage auch darüber hinaus.</p></div>
  </details>
</div>

<style>
.fx-faq{display:flex;flex-direction:column;gap:10px;width:100%;max-width:520px}
.fx-faq details{background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden;
  transition:border-color .2s ease}
.fx-faq details[open]{border-color:#3a3a45}
.fx-faq summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:14px;
  padding:15px 18px;font-weight:600;font-size:.95rem;color:#f4f4f5}
.fx-faq summary::-webkit-details-marker{display:none}
.fx-faq summary:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:2px;border-radius:8px}
.fx-faq .fx-faq-a{padding:0 18px 16px;color:#a1a1aa;font-size:.88rem;line-height:1.7}
.fx-faq .fx-faq-a p{margin:0}

/* Variante A · Chevron dreht 180° */
.fx-faq .fx-chev{flex:0 0 auto;width:18px;height:18px;stroke:var(--akzent, #7c87ff);stroke-width:2;fill:none;
  transition:transform .25s cubic-bezier(.4,0,.2,1)}
.fx-faq details[open] .fx-chev{transform:rotate(180deg)}

/* Variante B · Plus wird zum × (rotate 45°) */
.fx-faq .fx-plus{flex:0 0 auto;font-size:1.4rem;line-height:1;color:var(--akzent, #7c87ff);font-weight:300;
  transition:transform .25s cubic-bezier(.4,0,.2,1)}
.fx-faq details[open] .fx-plus{transform:rotate(45deg)}

/* Variante C · Dreieck ▸ dreht 90° */
.fx-faq .fx-tri{flex:0 0 auto;color:var(--akzent, #7c87ff);font-size:.8rem;display:inline-block;
  transition:transform .25s cubic-bezier(.4,0,.2,1)}
.fx-faq details[open] .fx-tri{transform:rotate(90deg)}

@media (prefers-reduced-motion:reduce){
  .fx-faq .fx-chev,.fx-faq .fx-plus,.fx-faq .fx-tri,.fx-faq details{transition:none}
}
</style>

JS-Akkordeon: Single-Open + „Mehr anzeigen"

Pol 1 · Craft Anlass: längere FAQ-Liste

Klick öffnet eine Frage und schließt die anderen; die Antwort fährt weich über die gemessene scrollHeight auf (kein hartes max-height-Limit). Beim Laden blenden die Einträge gestaffelt ein, der „Weitere Fragen"-Button zeigt versteckte Items. Vorbild: Nördlicht und NDS (FAQ-Akkordeon).

In der Regel ein Arbeitstag. Den genauen Zeitrahmen nennen wir verbindlich mit dem Angebot.

Ja. Sie erhalten einen Festpreis, der erst nach Ihrer Freigabe verbindlich wird.

Ja, im gesetzlichen Rahmen. Bei Fragen nach der Montage sind wir weiterhin Ihr Ansprechpartner.

Ja. Verpackung und Reste nehmen wir mit, die Fläche bleibt besenrein.

Ja, auch Teilarbeiten. Beschreiben Sie kurz, was ansteht, dann melden wir uns.

<div class="fx-acc" data-fx-acc>
  <div class="fx-acc-item">
    <button type="button" class="fx-acc-q" aria-expanded="false">Wie lange dauert eine Montage?<span class="fx-acc-chev" aria-hidden="true">▼</span></button>
    <div class="fx-acc-a"><div class="fx-acc-a-inner"><p>In der Regel ein Arbeitstag. Den genauen Zeitrahmen nennen wir verbindlich mit dem Angebot.</p></div></div>
  </div>
  <div class="fx-acc-item">
    <button type="button" class="fx-acc-q" aria-expanded="false">Arbeiten Sie mit Festpreis?<span class="fx-acc-chev" aria-hidden="true">▼</span></button>
    <div class="fx-acc-a"><div class="fx-acc-a-inner"><p>Ja. Sie erhalten einen Festpreis, der erst nach Ihrer Freigabe verbindlich wird.</p></div></div>
  </div>
  <!-- weitere sichtbare Items … -->
  <div class="fx-acc-extra">
    <div class="fx-acc-item">
      <button type="button" class="fx-acc-q" aria-expanded="false">Räumen Sie das Material weg?<span class="fx-acc-chev" aria-hidden="true">▼</span></button>
      <div class="fx-acc-a"><div class="fx-acc-a-inner"><p>Ja. Verpackung und Reste nehmen wir mit, die Fläche bleibt besenrein.</p></div></div>
    </div>
    <!-- weitere versteckte Items … -->
  </div>
  <div class="fx-acc-more-wrap">
    <button type="button" class="fx-acc-more">Weitere Fragen anzeigen</button>
  </div>
</div>

<style>
.fx-acc{display:flex;flex-direction:column;gap:10px;width:100%;max-width:520px}
.fx-acc-item{background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden;
  transition:border-color .25s ease,opacity .5s ease,transform .5s ease;opacity:1;transform:translateY(0)}
.fx-acc-item.fx-pre{opacity:0;transform:translateY(16px)}
.fx-acc-item:hover,.fx-acc-item:focus-within{border-color:#3a3a45}
.fx-acc-q{width:100%;text-align:left;background:none;border:0;cursor:pointer;font-family:inherit;
  display:flex;justify-content:space-between;align-items:center;gap:14px;padding:15px 18px;
  font-weight:600;font-size:.95rem;color:#f4f4f5;transition:color .2s ease}
.fx-acc-q:hover{color:#fff}
.fx-acc-q:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:-2px}
.fx-acc-chev{flex:0 0 auto;width:22px;height:22px;border-radius:50%;background:#1c1c22;display:grid;place-items:center;
  font-size:.7rem;color:#a1a1aa;transition:transform .3s ease,background .3s ease,color .3s ease}
.fx-acc-item.open .fx-acc-chev{transform:rotate(180deg);background:var(--akzent, #7c87ff);color:#fff}
.fx-acc-a{max-height:0;overflow:hidden;transition:max-height .35s cubic-bezier(.4,0,.2,1)}
.fx-acc-a-inner{padding:0 18px 16px;color:#a1a1aa;font-size:.88rem;line-height:1.7}
.fx-acc-a-inner p{margin:0}
.fx-acc-extra{display:none}
.fx-acc-extra.show{display:block}
.fx-acc-more-wrap{text-align:center;margin-top:4px}
.fx-acc-more{background:#1c1c22;color:#e9e9ee;border:1px solid #26262c;border-radius:99px;
  padding:.55rem 1.4rem;font-size:.85rem;font-weight:600;font-family:inherit;cursor:pointer;
  transition:border-color .2s ease,background .2s ease,transform .2s ease}
.fx-acc-more:hover{background:#23232b;border-color:#3a3a45;transform:translateY(-1px)}
.fx-acc-more:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:2px}
@media (prefers-reduced-motion:reduce){
  .fx-acc-item,.fx-acc-chev,.fx-acc-a,.fx-acc-more{transition:none}
  .fx-acc-item.fx-pre{opacity:1;transform:none}
}
</style>

<script>
document.querySelectorAll('[data-fx-acc]').forEach(function(acc){
  var items=acc.querySelectorAll('.fx-acc-item');

  // Single-Open: Klick öffnet eines, schließt die anderen
  items.forEach(function(item){
    var q=item.querySelector('.fx-acc-q'), a=item.querySelector('.fx-acc-a');
    q.addEventListener('click',function(){
      var open=item.classList.contains('open');
      items.forEach(function(i){
        i.classList.remove('open');
        i.querySelector('.fx-acc-a').style.maxHeight='0';
        i.querySelector('.fx-acc-q').setAttribute('aria-expanded','false');
      });
      if(!open){
        item.classList.add('open');
        a.style.maxHeight=a.scrollHeight+'px';   // gemessene Höhe → weiches Auffahren
        q.setAttribute('aria-expanded','true');
      }
    });
  });

  // Gestaffeltes Einblenden der sichtbaren Items beim Laden
  var visible=acc.querySelectorAll(':scope > .fx-acc-item');
  visible.forEach(function(i){i.classList.add('fx-pre');});
  var d=0;
  visible.forEach(function(i){setTimeout(function(){i.classList.remove('fx-pre');},d);d+=110;});

  // „Weitere Fragen" blendet die versteckten Items ein
  var more=acc.querySelector('.fx-acc-more'), extra=acc.querySelector('.fx-acc-extra');
  if(more&&extra){
    more.addEventListener('click',function(){
      extra.classList.add('show');
      acc.querySelector('.fx-acc-more-wrap').style.display='none';
      var ex=extra.querySelectorAll('.fx-acc-item'), de=0;
      ex.forEach(function(i){i.classList.add('fx-pre');});
      ex.forEach(function(i){setTimeout(function(){i.classList.remove('fx-pre');},de);de+=110;});
    });
  }
});
</script>

Zweispaltiges FAQ-Grid — nummeriert, natives <details>

Pol 2 · Klarheit Anlass: viele Fragen, wenig Höhe

Zwei Spalten aus nativen <details>-Einträgen halten lange FAQ-Listen kompakt; mehrere dürfen offen sein, die Nummer-Kachel füllt sich beim Öffnen mit Akzent. Reines HTML/CSS, kein Skript — auf schmalen Bühnen fällt das Grid automatisch auf eine Spalte.

Wie schnell erhalte ich ein Angebot?

In der Regel innerhalb von zwei Werktagen nach Ihrer Anfrage.

Ist die Erstberatung kostenlos?

Ja, das erste Gespräch ist unverbindlich und für Sie kostenfrei.

Welche Zahlungsarten bieten Sie an?

Überweisung und Rechnung. Ratenzahlung ist auf Anfrage möglich.

Arbeiten Sie auch am Wochenende?

Nach Absprache übernehmen wir Termine auch samstags.

<div class="fx-grid">
  <details open>
    <summary><span class="fx-grid-n" aria-hidden="true">1</span>Wie schnell erhalte ich ein Angebot?</summary>
    <div class="fx-grid-a"><p>In der Regel innerhalb von zwei Werktagen nach Ihrer Anfrage.</p></div>
  </details>
  <details>
    <summary><span class="fx-grid-n" aria-hidden="true">2</span>Ist die Erstberatung kostenlos?</summary>
    <div class="fx-grid-a"><p>Ja, das erste Gespräch ist unverbindlich und für Sie kostenfrei.</p></div>
  </details>
  <details>
    <summary><span class="fx-grid-n" aria-hidden="true">3</span>Welche Zahlungsarten bieten Sie an?</summary>
    <div class="fx-grid-a"><p>Überweisung und Rechnung. Ratenzahlung ist auf Anfrage möglich.</p></div>
  </details>
  <details>
    <summary><span class="fx-grid-n" aria-hidden="true">4</span>Arbeiten Sie auch am Wochenende?</summary>
    <div class="fx-grid-a"><p>Nach Absprache übernehmen wir Termine auch samstags.</p></div>
  </details>
</div>

<style>
.fx-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;width:100%;align-items:start}
@media (max-width:440px){.fx-grid{grid-template-columns:1fr}}   /* eng → einspaltig */
.fx-grid details{background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden;
  transition:border-color .2s ease}
.fx-grid details[open]{border-color:var(--akzent, #7c87ff)}
.fx-grid summary{list-style:none;cursor:pointer;display:flex;gap:10px;align-items:flex-start;
  padding:13px 15px;font-weight:600;font-size:.9rem;color:#f4f4f5;line-height:1.35}
.fx-grid summary::-webkit-details-marker{display:none}
.fx-grid summary:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:2px;border-radius:8px}
.fx-grid .fx-grid-n{flex:0 0 auto;width:20px;height:20px;border-radius:6px;display:grid;place-items:center;
  background:#1c1c22;color:var(--akzent, #7c87ff);font-size:.72rem;font-weight:700;
  transition:background .25s ease,color .25s ease}
.fx-grid details[open] .fx-grid-n{background:var(--akzent, #7c87ff);color:#fff}
.fx-grid .fx-grid-a{padding:0 15px 14px 41px;color:#a1a1aa;font-size:.82rem;line-height:1.65}
.fx-grid .fx-grid-a p{margin:0}
@media (prefers-reduced-motion:reduce){
  .fx-grid details,.fx-grid .fx-grid-n{transition:none}
}
</style>

FAQ mit Live-Filter-Suche

Pol 1 · Craft Anlass: umfangreiche Hilfe / Support-FAQ

Ein Suchfeld filtert die Fragen beim Tippen und hebt den Treffer im Fragetext hervor (<mark>). Passt nichts, erscheint eine „keine Treffer"-Meldung; ein Klick auf eine Frage klappt die Antwort auf. Ohne JS bleiben alle Fragen sichtbar und aufklappbar — die Suche ist Zusatz, kein Muss.

<div class="fx-search" data-fx-search>
  <div class="fx-search-field">
    <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><line x1="21" y1="21" x2="16.5" y2="16.5"/></svg>
    <input type="search" class="fx-search-input" placeholder="Frage durchsuchen …" aria-label="FAQ durchsuchen">
  </div>
  <div class="fx-search-list">
    <div class="fx-search-item">
      <button type="button" class="fx-search-q" aria-expanded="false"><span class="fx-search-text">Wie kann ich einen Termin verschieben?</span></button>
      <div class="fx-search-a"><p>Antworten Sie auf Ihre Bestätigungs-E-Mail oder rufen Sie uns an — wir finden einen neuen Termin.</p></div>
    </div>
    <!-- weitere .fx-search-item … -->
  </div>
  <p class="fx-search-empty" role="status">Keine passende Frage gefunden.</p>
</div>

<style>
.fx-search{width:100%;max-width:520px}
.fx-search-field{position:relative;margin-bottom:12px}
.fx-search-field svg{position:absolute;left:14px;top:50%;transform:translateY(-50%);
  width:16px;height:16px;stroke:#a1a1aa;stroke-width:2;fill:none;pointer-events:none}
.fx-search-input{width:100%;box-sizing:border-box;padding:12px 14px 12px 40px;border-radius:10px;
  background:#16161a;border:1px solid #26262c;color:#f4f4f5;font-family:inherit;font-size:.9rem;
  transition:border-color .2s ease,box-shadow .2s ease}
.fx-search-input::placeholder{color:#a1a1aa}
.fx-search-input:focus{outline:none;border-color:var(--akzent, #7c87ff);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--akzent, #7c87ff) 25%,transparent)}
.fx-search-list{display:flex;flex-direction:column;gap:10px}
.fx-search-item{background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden;
  transition:border-color .2s ease}
.fx-search-item:hover,.fx-search-item:focus-within{border-color:#3a3a45}
.fx-search-item[hidden]{display:none}
.fx-search-q{width:100%;text-align:left;background:none;border:0;cursor:pointer;font-family:inherit;
  padding:13px 16px;font-weight:600;font-size:.9rem;color:#f4f4f5;transition:color .2s ease}
.fx-search-q:hover{color:#fff}
.fx-search-q:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:-2px}
.fx-search-a{padding:0 16px 14px;color:#a1a1aa;font-size:.83rem;line-height:1.65;display:none}
.fx-search-item.open .fx-search-a{display:block}
.fx-search-item.open .fx-search-q{color:var(--akzent, #7c87ff)}
.fx-search mark{background:color-mix(in srgb,var(--akzent, #7c87ff) 45%,transparent);
  color:#fff;border-radius:3px;padding:0 1px}
.fx-search-empty{display:none;padding:16px;text-align:center;color:#a1a1aa;font-size:.85rem;
  border:1px dashed #26262c;border-radius:12px}
.fx-search-empty.show{display:block}
@media (prefers-reduced-motion:reduce){
  .fx-search-input,.fx-search-item,.fx-search-q{transition:none}
}
</style>

<script>
document.querySelectorAll('[data-fx-search]').forEach(function(box){
  var input=box.querySelector('.fx-search-input');
  var items=box.querySelectorAll('.fx-search-item');
  var empty=box.querySelector('.fx-search-empty');
  if(!input) return;

  // Aufklappen der Antwort per Klick
  items.forEach(function(item){
    var q=item.querySelector('.fx-search-q');
    if(!q) return;
    q.addEventListener('click',function(){
      var open=item.classList.toggle('open');
      q.setAttribute('aria-expanded',open?'true':'false');
    });
  });

  // Live-Filter: Treffer markieren, Nicht-Treffer ausblenden
  function esc(s){return s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');}
  input.addEventListener('input',function(){
    var term=input.value.trim();
    var rx=term?new RegExp('('+esc(term)+')','ig'):null;
    var shown=0;
    items.forEach(function(item){
      var span=item.querySelector('.fx-search-text');
      if(!span) return;
      var raw=span.textContent;
      var hit=!term||raw.toLowerCase().indexOf(term.toLowerCase())!==-1;
      item.hidden=!hit;
      if(hit) shown++;
      // Treffer im Fragetext hervorheben (sicher: nur Text, kein HTML aus Eingabe)
      if(rx){
        span.textContent='';
        var last=0,m;
        while((m=rx.exec(raw))!==null){
          span.appendChild(document.createTextNode(raw.slice(last,m.index)));
          var mk=document.createElement('mark');
          mk.textContent=m[0];
          span.appendChild(mk);
          last=m.index+m[0].length;
          if(m.index===rx.lastIndex) rx.lastIndex++;   // Endlosschleife vermeiden
        }
        span.appendChild(document.createTextNode(raw.slice(last)));
      }else{
        span.textContent=raw;
      }
    });
    if(empty) empty.classList.toggle('show',shown===0);
  });
});
</script>

FAQ nach Kategorie — Chip-Filter

Pol 1 · Craft Anlass: FAQ mit klaren Themenblöcken

Chips oben schalten die sichtbaren Fragen nach Thema um („Alle" zeigt wieder alles); jede Frage trägt ihr Themen-Kürzel als Badge und klappt per Klick auf. Filterung über data-cat und das hidden-Attribut, Barrierefreiheit über aria-pressed. Ohne JS bleiben alle Fragen sichtbar und bedienbar.

Sie erhalten vorab einen Festpreis auf Basis von Aufmaß und Materialwahl — ohne versteckte Posten.

Freie Termine gibt es meist innerhalb einer Woche; Notfälle versuchen wir am selben Tag zu lösen.

Ja. Verpackung und Reste nehmen wir mit, die Fläche bleibt besenrein zurück.

Bei größeren Aufträgen bieten wir auf Wunsch eine Ratenzahlung an.

<div class="fx-cat" data-fx-cat>
  <div class="fx-cat-chips" role="group" aria-label="FAQ nach Thema filtern">
    <button type="button" class="fx-cat-chip" data-cat="all" aria-pressed="true">Alle</button>
    <button type="button" class="fx-cat-chip" data-cat="preis" aria-pressed="false">Preise</button>
    <button type="button" class="fx-cat-chip" data-cat="termin" aria-pressed="false">Termine</button>
    <button type="button" class="fx-cat-chip" data-cat="service" aria-pressed="false">Service</button>
  </div>
  <div class="fx-cat-list">
    <div class="fx-cat-item" data-cat="preis">
      <button type="button" class="fx-cat-q" aria-expanded="false">Wie setzen sich die Kosten zusammen?<span class="fx-cat-badge" aria-hidden="true">Preise</span></button>
      <div class="fx-cat-a"><p>Sie erhalten vorab einen Festpreis auf Basis von Aufmaß und Materialwahl.</p></div>
    </div>
    <!-- weitere .fx-cat-item mit data-cat="termin|service|…" -->
  </div>
</div>

<style>
.fx-cat{width:100%;max-width:520px}
.fx-cat-chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.fx-cat-chip{background:#16161a;border:1px solid #26262c;border-radius:99px;
  padding:.4rem 1rem;font-size:.82rem;font-weight:600;font-family:inherit;color:#a1a1aa;cursor:pointer;
  transition:background .2s ease,border-color .2s ease,color .2s ease}
.fx-cat-chip:hover{color:#f4f4f5;border-color:#3a3a45}
.fx-cat-chip:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:2px}
.fx-cat-chip[aria-pressed="true"]{background:var(--akzent, #7c87ff);border-color:var(--akzent, #7c87ff);color:#fff}
.fx-cat-list{display:flex;flex-direction:column;gap:10px}
.fx-cat-item{background:#16161a;border:1px solid #26262c;border-radius:12px;overflow:hidden;
  transition:border-color .2s ease,opacity .3s ease}
.fx-cat-item:hover,.fx-cat-item:focus-within{border-color:#3a3a45}
.fx-cat-item[hidden]{display:none}
.fx-cat-q{width:100%;text-align:left;background:none;border:0;cursor:pointer;font-family:inherit;
  display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:13px 16px;font-weight:600;font-size:.9rem;color:#f4f4f5;transition:color .2s ease}
.fx-cat-q:hover{color:#fff}
.fx-cat-q:focus-visible{outline:2px solid var(--akzent, #7c87ff);outline-offset:-2px}
.fx-cat-badge{flex:0 0 auto;font-size:.68rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--akzent, #7c87ff);background:#1c1c22;border-radius:6px;padding:.15rem .5rem}
.fx-cat-a{padding:0 16px 14px;color:#a1a1aa;font-size:.83rem;line-height:1.65;display:none}
.fx-cat-item.open .fx-cat-a{display:block}
@media (prefers-reduced-motion:reduce){
  .fx-cat-chip,.fx-cat-item,.fx-cat-q{transition:none}
}
</style>

<script>
document.querySelectorAll('[data-fx-cat]').forEach(function(box){
  var chips=box.querySelectorAll('.fx-cat-chip');
  var items=box.querySelectorAll('.fx-cat-item');

  // Aufklappen der Antwort per Klick
  items.forEach(function(item){
    var q=item.querySelector('.fx-cat-q');
    if(!q) return;
    q.addEventListener('click',function(){
      var open=item.classList.toggle('open');
      q.setAttribute('aria-expanded',open?'true':'false');
    });
  });

  // Chip-Filter: nur Items der gewählten Kategorie zeigen
  chips.forEach(function(chip){
    chip.addEventListener('click',function(){
      var cat=chip.getAttribute('data-cat');
      chips.forEach(function(c){c.setAttribute('aria-pressed',c===chip?'true':'false');});
      items.forEach(function(item){
        item.hidden=!(cat==='all'||item.getAttribute('data-cat')===cat);
      });
    });
  });
});
</script>