PageSourceSearch

https://firmendo-test.netlify.app/js/homepage.js?v=20260504-3

js firmendo-test.netlify.app collected 2026-10-03 10:44:11 UTC 21,882 bytes, 397 lines download raw bytes

1function scrollBusinesskontoFinderIntoView() {
2  var finder = document.getElementById('businesskonto-finder');
3  if (!finder) return;
4
5  var target = finder.querySelector('.section-header') || finder;
6  var nav = document.getElementById('site-nav');
7  var navHeight = nav ? nav.getBoundingClientRect().height : 72;
8  var breathingRoom = window.matchMedia('(max-width: 700px)').matches ? 18 : 28;
9  var targetTop = target.getBoundingClientRect().top + window.pageYOffset;
10
11  window.scrollTo({
12    top: Math.max(0, targetTop - navHeight - breathingRoom),
13    behavior: 'smooth'
14  });
15}
16
17(function() {
18var heroFinder = document.querySelector('[data-hero-finder]');
19if (!heroFinder) return;
20
21var hQ1 = null;
22var hContinueBtn = heroFinder.querySelector('[data-hero-action="continue"]');
23
24function setHeroProgressSelected() {
25  var dot1 = heroFinder.querySelector('[data-hero-step-dot="1"]');
26  var dot2 = heroFinder.querySelector('[data-hero-step-dot="2"]');
27  var line1 = heroFinder.querySelector('[data-hero-step-line="1"]');
28  if (!dot1 || !dot2 || !line1) return;
29
30  dot1.classList.remove('is-active');
31  dot1.classList.add('is-done');
32  line1.classList.add('is-done');
33  dot2.classList.add('is-active');
34}
35
36function handOffToMainFinder() {
37  if (!hQ1) return;
38
39  document.dispatchEvent(new CustomEvent('firmendo:heroFinderSelected', {
40    detail: { q1: hQ1 }
41  }));
42
43  var mainFinder = document.getElementById('businesskonto-finder');
44  if (mainFinder) scrollBusinesskontoFinderIntoView();
45}
46
47heroFinder.addEventListener('click', function(event) {
48  var q1Button = event.target.closest('[data-hero-q1]');
49  if (q1Button) {
50    hQ1 = q1Button.dataset.heroQ1;
51    heroFinder.querySelectorAll('[data-hero-q1]').forEach(function(btn) {
52      btn.classList.toggle('is-selected', btn === q1Button);
53    });
54    hContinueBtn.disabled = false;
55    setHeroProgressSelected();
56    handOffToMainFinder();
57    return;
58  }
59
60  var actionButton = event.target.closest('[data-hero-action="continue"]');
61  if (actionButton) handOffToMainFinder();
62});
63})();
64
65(function() {
66var fQ1 = null, fQ2 = null;
67var fQ1FromHero = false;
68var fLogos = {
69  'Finom':         '../images/mini-logos/finom.svg',
70  'Kontist':       '../images/mini-logos/kontist.png',
71  'Holvi':         '../images/mini-logos/holvi.webp',
72  'FYRST':         '../images/mini-logos/fyrst.svg',
73  'Qonto':         '../images/mini-logos/qonto.png',
74  'Vivid Business':'../images/mini-logos/vivid-money.png'
75};
76var fQ1Labels = {
77  einzelunternehmer: 'Freelancer / Selbstständig',
78  gruender: 'Gründer / Startup',
79  gmbh: 'GmbH oder UG',
80  teams: 'Team / Unternehmen'
81};
82var fDB = {
83  einzelunternehmer: {
84    kostenlos: [
85      { name:'Finom', tag:'Konto & Buchhaltung in einer App', pros:['Solo-Tarif dauerhaft kostenlos','Sofort-IBAN in wenigen Minuten','Rechnungsstellung inklusive'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
86      { name:'Kontist', tag:'Speziell für Selbstständige', pros:['Steuervorauszahlungen automatisch berechnet','IBAN sofort – Konto in 8 Minuten','Visa Business Debitkarte inklusive'], price:'Kostenlos im Free-Tarif', affiliate:'https://kontist.com/?ref=firmendo', review:'/kontist-geschaeftskonto/', top:false }
87    ],
88    buchhaltung: [
89      { name:'Finom', tag:'Konto & Buchhaltung in einer App', pros:['DATEV & Lexoffice-Integration','Rechnungsstellung inklusive','Sofort-IBAN in wenigen Minuten'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
90      { name:'Kontist', tag:'Automatische Steuerberechnung', pros:['DATEV & Lexoffice inklusive','Steuervorauszahlungen automatisch','Visa Business Debitkarte'], price:'Kostenlos im Free-Tarif', affiliate:'https://kontist.com/?ref=firmendo', review:'/kontist-geschaeftskonto/', top:false }
91    ],
92    komplett: [
93      { name:'Finom', tag:'Konto & Buchhaltung in einer App', pros:['Rechnungsstellung inklusive','DATEV & Lexoffice-Integration','Sofort-IBAN in wenigen Minuten'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
94      { name:'Holvi', tag:'All-in-One für Selbstständige', pros:['Buchhaltung & Belege integriert','Rechnungsstellung aus dem Konto','Mehrere Währungen möglich'], price:'Kostenlos im Flex-Tarif', affiliate:'https://holvi.com/?ref=firmendo', review:'/h
94olvi-geschaeftskonto/', top:false }
95    ],
96    cashback: [
97      { name:'Finom', tag:'1 % Cashback auf Kartenzahlungen', pros:['1 % Cashback ab Basic-Tarif','Visa Business Karte inklusive','Sofort-IBAN in wenigen Minuten'], price:'Solo kostenlos · Basic ab 10,99 €/Monat', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
98      { name:'Kontist', tag:'Visa Business Debitkarte', pros:['Visa Business Debitkarte','Steuerberechnung automatisch','IBAN sofort verfügbar'], price:'Kostenlos im Free-Tarif', affiliate:'https://kontist.com/?ref=firmendo', review:'/kontist-geschaeftskonto/', top:false }
99    ]
100  },
101  gruender: {
102    kostenlos: [
103      { name:'FYRST', tag:'Deutsche Bank Tochter – 1. Jahr gratis', pros:['1. Jahr komplett kostenlos','Deutsches IBAN & Bankgarantie','DATEV-Schnittstelle inklusive'], price:'Gratis im 1. Jahr', affiliate:'https://www.fyrst.de/?ref=firmendo', review:'/fyrst-geschaeftskonto/', top:true },
104      { name:'Finom', tag:'Sofort startklar für Gründer', pros:['Solo-Tarif dauerhaft kostenlos','Sofort-IBAN in wenigen Minuten','Rechnungsstellung inklusive'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
105    ],
106    buchhaltung: [
107      { name:'FYRST', tag:'DATEV & Buchhaltungs-Integration', pros:['DATEV-Schnittstelle inklusive','Deutsche-Bank-Infrastruktur','Online + Filiale kombinierbar'], price:'Gratis im 1. Jahr', affiliate:'https://www.fyrst.de/?ref=firmendo', review:'/fyrst-geschaeftskonto/', top:true },
108      { name:'Finom', tag:'Buchhaltung in einer App', pros:['DATEV & Lexoffice-Integration','Rechnungsstellung inklusive','Belege erfassen & kategorisieren'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
109    ],
110    komplett: [
111      { name:'Finom', tag:'All-in-One für Startups & Gründer', pros:['Rechnungsstellung inklusive','Buchhaltung & Belege in einer App','Sofort-IBAN in wenigen Minuten'], price:'Solo-Tarif kostenlos', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
112      { name:'FYRST', tag:'Deutsch, sicher und vollständig', pros:['1. Jahr kostenlos','DATEV inklusive','Online + Filiale kombinierbar'], price:'Gratis im 1. Jahr', affiliate:'https://www.fyrst.de/?ref=firmendo', review:'/fyrst-geschaeftskonto/', top:false }
113    ],
114    cashback: [
115      { name:'Vivid Business', tag:'Cashback & moderne Features', pros:['Cashback auf Kartenzahlungen','Unterkonten für Budgets','Virtuelle Karten verfügbar'], price:'Start-Tarif kostenlos', affiliate:'https://vivid.money/business?ref=firmendo', review:'/vivid-business/', top:true },
116      { name:'Finom', tag:'1 % Cashback ab Basic', pros:['1 % Cashback auf Kartenzahlungen','Visa Business Karte','Sofort-IBAN in wenigen Minuten'], price:'Solo kostenlos · Basic ab 10,99 €/Monat', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
117    ]
118  },
119  gmbh: {
120    kostenlos: [
121      { name:'FYRST', tag:'Deutsche Bank Tochter für GmbH & UG', pros:['Stammkapital-Einzahlung möglich','Deutsche-Bank-Infrastruktur','DATEV-Schnittstelle inklusive'], price:'Ab 6 €/Monat für juristische Personen', affiliate:'https://www.fyrst.de/?ref=firmendo', review:'/fyrst-geschaeftskonto/', top:true },
122      { name:'Finom', tag:'Für GmbH, UG & Startups', pros:['2 Nutzer im Basic-Tarif','1 % Cashback auf Kartenzahlungen','Sofort-IBAN in wenigen Minuten'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
123    ],
124    buchhaltung: [
125      { name:'Qonto', tag:'DATEV-Integration für GmbH & UG', pros:['DATEV ab höheren Tarifen','Für alle deutschen Rechtsformen','Echtzeit-Benachrichtigungen'], price:'Ab 9 €/Monat (zzgl. MwSt.)', affiliate:'https://qonto.com/?ref=firmendo', review:'/qonto-geschaeftskonto/', top:true },
126      { name:'FYRST', tag:'DATEV & Filiale kombinierbar', pros:['DATEV-Schnittstelle inklusive','Stammkapital-Einzahlung möglich','Online + Filiale kombinierbar'], price:'Ab 6 €/Monat', affiliate:'https://www.fyrst.de/?ref=firmendo', review:'/fyrst-geschaeftskonto/', top:false }
127    ],
128    komplett: [
129      { name:'Qonto', tag:'Ideal für GmbH & UG', pros:['Stammkapital-Einzahlung möglich','Echtzeit-Benachrichtigungen','DATEV ab höheren Tarifen'], price:'Ab 9 €/Monat (zzgl. MwSt.)', affiliate:'https://qonto.com/?ref=firmendo', review:'/qonto-geschaeftskonto/', top:true },
130      { name:'Finom', tag:'All-in-One für GmbH', pros:['Buchhaltung & Belege integriert','2 Nutzer im Basic-Tarif','Visa Business Karte inklusive'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
131    ],
132    cashback: [
133      { name:'Finom', tag:'1 % Cashback für GmbH & UG', pros:['1 % Cashback auf Kartenzahlungen','2 Nutzer im Basic-Tarif inklusive','Visa Business Karte inklusive'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
134      { name:'Qonto', tag:'Vollständig für GmbH', pros:['Stammkapital-Einzahlung möglich','DATEV-fähig','Strukturierte Kontoführung'], price:'Ab 9 €/Monat (zzgl. MwSt.)', affiliate:'https://qonto.com/?ref=firmendo', review:'/qonto-geschaeftskonto/', top:false }
135    ]
136  },
137  teams: {
138    kostenlos: [
139      { name:'Vivid Business', tag:'Flexibel für Budgets und Teams', pros:['Start-Tarif dauerhaft kostenlos','Unterkonten für Teambudgets','Virtuelle Karten verfügbar'], price:'Start-Tarif kostenlos', affiliate:'https://vivid.money/business?ref=firmendo', review:'/vivid-business/', top:true },
140      { name:'Finom', tag:'2 Nutzer im Basic-Tarif', pros:['2 Nutzer im Basic-Tarif inklusive','1 % Cashback auf Kartenzahlungen','Echtzeit-Benachrichtigungen'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
141    ],
142    buchhaltung: [
143      { name:'Qonto', tag:'DATEV & Teamzugänge', pros:['DATEV inklusive ab Smart-Tarif','Admin- und Teamzugänge','1 Unterkonto inklusive'], price:'Smart ab 19 €/Monat (zzgl. MwSt.)', affiliate:'https://qonto.com/?ref=firmendo', review:'/qonto-geschaeftskonto/', top:true },
144      { name:'Finom', tag:'Buchhaltung für kleine Teams', pros:['DATEV & Lexoffice-Integration','Buchhaltung & Belege inklusive','2 Nutzer im Basic-Tarif'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:false }
145    ],
146    komplett: [
147      { name:'Qonto', tag:'Stark für strukturierte Teams', pros:['Ausgabenrichtlinien & Budgets','Admin- und Teamzugänge','DATEV inklusive ab Smart'], price:'Smart ab 19 €/Monat (zzgl. MwSt.)', affiliate:'https://qonto.com/?ref=firmendo', review:'/qonto-geschaeftskonto/', top:true },
148      { name:'Vivid Business', tag:'Unterkonten & virtuelle Karten', pros:['Unterkonten für Teambudgets','Virtuelle Karten verfügbar','Start-Tarif kostenlos'], price:'Start-Tarif kostenlos', affiliate:'https://vivid.money/business?ref=firmendo', review:'/vivid-business/', top:false }
149    ],
150    cashback: [
151      { name:'Finom', tag:'Cashback für Teams', pros:['1 % Cashback auf Kartenzahlungen','Mehrere Nutzer inklusive','Echtzeit-Benachrichtigungen'], price:'Basic ab 10,99 €/Monat (zzgl. MwSt.)', affiliate:'https://finom.co/?ref=firmendo', review:'/finom-geschaeftskonto/', top:true },
152      { name:'Vivid Business', tag:'Cashback & Unterkonten', pros:['Cashback ab Prime-Tarif','Unterkonten für Budgets','Virtuelle Karten verfügbar'], price:'Start-Tarif kostenlos', affiliate:'https://vivid.money/business?ref=firmendo', review:'/vivid-business/', top:false }
153    ]
154  }
155};
156
157function fSelectQ1(val, btn) {
158  fQ1 = val;
159  document.querySelectorAll('#fstep1 .finder-opt').forEach(function(b) { b.classList.remove('selected'); });
160  if (btn) btn.classList.add('selected');
161  document.getElementById('fbtn1').disabled = false;
162  document.getElementById('fresult').hidden = true;
163};
164function fUpdateQ1Summary() {
165  var prefillNote = document.getElementById('finder-prefill-note');
166  if (!prefillNote || !fQ1) return;
167
168  var source = prefillNote.querySelector('[data-finder-prefill-source]');
169  var label = prefillNote.querySelector('[data-finder-prefill-label]');
170  if (source) source.textContent = fQ1FromHero ? 'Aus der Auswahl oben übernommen' : 'Ausgewählt in Schritt 1';
171  if (label) label.textContent = fQ1Labels[fQ1] || 'Ihre Auswahl';
172  prefillNote.hidden = false;
173}
174function fSelectQ2(val, btn) {
175  fQ2 = val;
176  document.querySelectorAll('#fstep2 .finder-opt').forEach(function(b) { b.classList.remove('selected'); });
177  if (btn) btn.classList.add('selected');
178  document.getElementById('fbtn2').disabled = false;
179  document.getElementById('fresult').hidden = true;
180};
181function fGoStep2() {
182  document.getElementById('fstep1').hidden = true;
183  var s2 = document.getElementById('fstep2');
184  s2.hidden = false;
185  document.getElementById('fresult').hidden = true;
186  fUpdateQ1Summary();
187  document.getElementById('fdot1').className = 'finder-step-dot done';
188  document.getElementById('fline1').className = 'finder-step-line done';
189  document.getElementById('fdot2').className = 'finder-step-dot active';
190  document.getElementById('fline2').className = 'finder-step-line';
191  document.getElementById('fdot3').className = 'finder-step-dot pending';
192};
193function fGoStep1() {
194  document.getElementById('fstep2').hidden = true;
195  document.getElementById('fstep1').hidden = false;
196  document.getElementById('fresult').hidden = true;
197  var prefillNote = document.getElementById('finder-prefill-note');
198  if (prefillNote) prefillNote.hidden = true;
199  document.getElementById('fdot1').className = 'finder-step-dot active';
200  document.getElementById('fline1').className = 'finder-step-line';
201  document.getElementById('fdot2').className = 'finder-step-dot pending';
202  document.getElementById('fline2').className = 'finder-step-line';
203  document.getElementById('fdot3').className = 'finder-step-dot pending';
204};
205function fShowResult() {
206  if (!fQ1 || !fQ2) return;
207  var recs = fDB[fQ1][fQ2];
208  document.getElementById('fstep2').hidden = true;
209  document.getElementById('fdot2').className = 'finder-step-dot done';
210  document.getElementById('fline2').className = 'finder-step-line done';
211  document.getElementById('fdot3').className = 'finder-step-dot done';
212  var html = '<div class="finder-result-grid">';
213  recs.forEach(function(r) {
214    var logoSrc = fLogos[r.name] || '';
215    var logoHtml = logoSrc
216      ? '<img src="' + logoSrc + '" class="finder-result-logo" alt="' + r.name + '">'
217      : '<div class="finder-result-logo finder-result-logo-fallback">' + r.name.charAt(0) + '</div>';
218    html += '<div class="finder-result-card' + (r.top ? ' is-top' : '') + '">';
219    html += '<span class="finder-result-badge ' + (r.top ? 'top' : 'alt') + '">' + (r.top ? 'Top-Empfehlung' : 'Alternative') + '</span>';
220    html += '<div class="finder-result-header">' + logoHtml + '<div><div class="finder-result-name">' + r.name + '</div><div class="finder-result-tag">' + r.tag + '</div></div></div>';
221    html += '<ul class="finder-result-pros">' + r.pros.map(function(p) { return '<li>' + p + '</li>'; }).join('') + '</ul>';
222    html += '<div class="finder-result-price">Preis: <strong>' + r.price + '</strong></div>';
223    html += '<div class="finder-result-trust"><span>Redaktionell geprüft</span><span>Stand: März 2026</span><span>Kriterienbasiert</span></div>';
224    html += '<div class="finder-result-links">';
225    html += '<a href="' + r.affiliate + '" class="finder-link-primary" target="_blank" rel="noopener">Jetzt testen →</a>';
226    html += '<a href="' + r.review + '" class="finder-link-secondary">Detailtest lesen</a>';
227    html += '</div></div>';
228  });
229  html += '</div><button class="finder-restart" data-finder-action="restart">← Neu starten</button>';
230  var rv = document.getElementById('fresult');
231  rv.innerHTML = html;
232  rv.hidden = false;
233};
234function fRestart() {
235  fQ1 = null; fQ2 = null;
236  fQ1FromHero = false;
237  document.getElementById('fresult').hidden = true;
238  document.getElementById('fstep1').hidden = false;
239  document.getElementById('fstep2').hidden = true;
240  var prefillNote = document.getElementById('finder-prefill-note');
241  if (prefillNote) prefillNote.hidden = true;
242  document.querySelectorAll('.finder-opt').forEach(function(b) { b.classList.remove('selected'); });
243  document.getElementById('fbtn1').disabled = true;
244  document.getElementById('fbtn2').disabled = true;
245  document.getElementById('fdot1').className = 'finder-step-dot active';
246  document.getElementById('fdot2').className = 'finder-step-dot pending';
247  document.getElementById('fdot3').className = 'finder-step-dot pending';
248  document.getElementById('fline1').className = 'finder-step-line';
249  document.getElementById('fline2').className = 'finder-step-line';
250};
251
252function initFinderControls() {
253  const finder = document.querySelector('.section-finder');
254  if (!finder) return;
255
256  finder.addEventListener('click', function(event) {
257    const q1Button = event.target.closest('[data-finder-q1]');
258    if (q1Button) {
259      fQ1FromHero = false;
260      fSelectQ1(q1Button.dataset.finderQ1, q1Button);
261      var prefillNote = document.getElementById('finder-prefill-note');
262      if (prefillNote) prefillNote.hidden = true;
263      return;
264    }
265
266    const q2Button = event.target.closest('[data-finder-q2]');
267    if (q2Button) {
268      fSelectQ2(q2Button.dataset.finderQ2, q2Button);
269      return;
270    }
271
272    const actionButton = event.target.closest('[data-finder-action]');
273    if (!actionButton) return;
274
275    if (actionButton.dataset.finderAction === 'next') fGoStep2();
276    if (actionButton.dataset.finderAction === 'back') fGoStep1();
277    if (actionButton.dataset.finderAction === 'result') fShowResult();
278    if (actionButton.dataset.finderAction === 'restart') fRestart();
279  });
280
281  document.addEventListener('firmendo:heroFinderSelected', function(event) {
282    const q1 = event.detail && event.detail.q1;
283    if (!q1) return;
284
285    const q1Button = finder.querySelector('[data-finder-q1="' + q1 + '"]');
286    if (!q1Button) return;
287
288    fSelectQ1(q1, q1Button);
289    fQ1FromHero = true;
290    fQ2 = null;
291    finder.querySelectorAll('#fstep2 .finder-opt').forEach(function(btn) {
292      btn.classList.remove('selected');
293    });
294    document.getElementById('fbtn2').disabled = true;
295    fGoStep2();
296  });
297
298  document.addEventListener('click', function(event) {
299    const scrollLink = event.target.closest('[data-scroll-to-finder]');
300    if (!scrollLink) return;
301    event.preventDefault();
302    scrollBusinesskontoFinderIntoView();
303  });
304}
305
306initFinderControls();
307})();
308
309(() => {
310  function toggleFaq(btn) {
311    const item = btn.closest(".faq-item");
312    if (!item) return;
313
314    const answer = item.querySelector(".faq-a");
315    if (!answer) return;
316
317    const isOpen = item.classList.contains("open");
318
319    const setFaqState = (faqItem, open) => {
320      const faqButton = faqItem.querySelector(".faq-q");
321      const faqAnswer = faqItem.querySelector(".faq-a");
322      if (!faqButton || !faqAnswer) return;
323
324      faqItem.classList.toggle("open", open);
325      faqButton.setAttribute("aria-expanded", open ? "true" : "false");
326      faqAnswer.hidden = !open;
327    };
328
329    document.querySelectorAll(".faq-item.open").forEach((openItem) => {
330      setFaqState(openItem, false);
331    });
332
333    if (!isOpen) {
334      setFaqState(item, true);
335    }
336  }
337
338  window.FirmendoSiteShell = {
339    ...(window.FirmendoSiteShell || {}),
340    toggleFaq,
341  };
342
343  document.querySelectorAll(".faq-q").forEach((button) => {
344    button.addEventListener("click", () => toggleFaq(button));
345  });
346})();
347
348// ── Segment card switcher ──
349const segmentTitles = {
350  einzelunternehmer: 'Einzelunternehmer',
351  gruender: 'Gründer',
352  gmbh: 'GmbH & UG',
353  teams: 'Teams'
354};
355
356function switchSegment(seg, btn) {
357  document.querySelectorAll('.seg-btn').forEach(b => b.classList.remove('active'));
358  if (btn) btn.classList.add('active');
359
360  const title = segmentTitles[seg] || segmentTitles.einzelunternehmer;
361  const titleNode = document.getElementById('segment-title');
362  if (titleNode) titleNode.textContent = title;
363
364  const container = document.getElementById('cards-container');
365  if (!container) return;
366
367  container.querySelectorAll('[data-segment-card]').forEach(card => {
368    card.hidden = card.dataset.segmentCard !== seg;
369  });
370}
371
372function initSegmentSwitcher() {
373  const activeButton = document.querySelector('.seg-btn.active[data-seg]') || document.querySelector('.seg-btn[data-seg]');
374
375  document.addEventListener('click', event => {
376    const button = event.target.closest('.seg-btn[data-seg]');
377    if (!button) return;
378    switchSegment(button.dataset.seg, button);
379  });
380
381  if (activeButton) switchSegment(activeButton.dataset.seg, activeButton);
382}
383
384initSegmentSwitcher();
385
386// Activate first seg-card by default + handle click toggle
387(function() {
388  const cards = document.querySelectorAll('.seg-card');
389  if (!cards.length) return;
390  cards[0].classList.add('active');
391  cards.forEach(card => {
392    card.addEventListener('click', function(e) {
393      cards.forEach(c => c.classList.remove('active'));
394      this.classList.add('active');
395    });
396  });
397})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.