Trennschnitte bis 25 mm in Stahl, Edelstahl und Aluminium — mit 12,7 kg leicht genug für die Montage und robust genug für den Werkstattalltag. Schneiden, Fugenhobeln und Gitterschneiden mit einem Gerät.
Kauf auf Rechnung für Firmen und öffentliche Auftraggeber
Vor der Bestellung prüfen: Anschluss und Druckluft
Diese Ausführung (EX-2-010-011) läuft mit 3 × 400 V Drehstrom, abgesichert mit 16 A. Für den Betrieb an einer 230-V-Schuko-Steckdose gibt es eine eigene Gerätevariante — sprich uns an, wenn du die brauchst.
Zusätzlich benötigst du saubere, trockene und ölfreie Druckluft: 4,5 bar Arbeitsdruck bei bis zu 90 l/min. Wie du prüfst, ob dein Kompressor reicht, steht weiter unten.
Aus der Werkstatt
Wo Trennschleifer und Autogen an die Grenze kommen
Wer regelmäßig Blech, Profile oder Rohre trennt, kennt die drei Stellen, an denen der Arbeitstag hängen bleibt. Plasmaschneiden löst sie nicht theoretisch, sondern messbar — in Minuten pro Schnitt und in Nacharbeit, die entfällt.
Problem 01
Trennschleifen dauert und verzieht
Eine 10-mm-Platte mit der Flex zu trennen kostet Zeit, Scheiben und Kraft — dazu Funkenflug, Lärm und eine Schnittkante, die nachgearbeitet werden muss. Bei 20 mm wird es ganz unwirtschaftlich.
Die Lösung: Plasma trennt bis 25 mm in einem Durchgang, mit schmaler Schnittfuge und geringer Wärmeeinbringung. Weniger Verzug heißt weniger Richten.
Problem 02
Zündaussetzer auf Rost und Lack
Geräte ohne Pilotlichtbogen brauchen Kontakt zum blanken Metall. Bei lackierten Trägern, verzinkten Blechen oder verrostetem Altmaterial heißt das: erst schleifen, dann schneiden — jedes Mal.
Die Lösung: Der integrierte Pilotlichtbogen zündet berührungslos, auch auf beschichteten und rostigen Oberflächen. Und er trennt Gitterroste, ohne bei jeder Lücke neu zu zünden.
Problem 03
Verschleißteile fressen die Ersparnis
Bei vielen Einsteigergeräten sind Düsen und Elektroden nach wenigen Betriebsstunden hinüber. Was am Kaufpreis gespart wurde, geht über die Standzeit wieder verloren.
Die Lösung: Die HF-Zündung schont die Elektrode, das TCS-Brennerwechselsystem verkürzt den Tausch auf Sekunden. Verschleißteile halten wir in München am Lager — Nachschub ist keine Lieferfrage.
Schnittleistung
Was 45 Ampere in der Praxis bedeuten
Hersteller nennen gern nur die maximale Materialstärke. Für die Planung brauchst du drei Werte — und der wichtigste ist nicht der größte. Alle Angaben beziehen sich auf niedriglegierten Baustahl.
QualitätsschnittSaubere Kante, kaum Nacharbeit — der Wert für die tägliche Fertigung12 mm
LochstechenMaximale Stärke zum Einstechen in die Fläche10 mm
TrennschnittMaximum zum Ablängen — Kante wird gröber, Vorschub langsamer25 mm
0 mm12,5 mm25 mm
Der ehrliche Planungswert ist der Qualitätsschnitt bei 12 mm. Bis dorthin liefert die Anlage eine Kante, die du direkt weiterverarbeiten kannst. Der Trennschnitt bei 25 mm funktioniert zuverlässig, ist aber ein Ablängschnitt — für Zuschnitte, die ohnehin noch bearbeitet werden.
Beim Lochstechen gilt eine eigene Grenze: 10 mm. Wer dickeres Material durchstechen will, setzt am Rand an oder bohrt vor. Das ist keine Schwäche dieser Anlage, sondern Physik des Verfahrens — nur wird es selten dazugesagt.
Edelstahl und Aluminium lassen sich ebenfalls schneiden. Da beide Werkstoffe die Wärme anders ableiten, liegt die praktikable Stärke etwas unter den Stahlwerten — für Blech- und Profilarbeiten im üblichen Bereich ist das ohne Belang.
Voraussetzung
Die Druckluft entscheidet über die Schnittqualität
Der häufigste Grund für schlechte Schnitte und kurze Verschleißteil-Standzeiten ist nicht das Gerät, sondern die Luft. Feuchtigkeit und Öl aus dem Kompressor zerstören Düse und Elektrode schneller als jede Überlastung. Diese drei Werte solltest du kennen, bevor du bestellst.
4,5 bar
Arbeitsdruck
Der Druck, den die Anlage am Eingang dauerhaft braucht. Der Vordruck aus dem Kompressor sollte bei 7–9 bar liegen, damit auch bei Abfall genug ansteht.
90 l/min
Luftbedarf max.
Entscheidend ist die Liefermenge, nicht die Kesselgröße. Ein Kompressor mit rund 90 l/min effektiver Abgabe bei 6 bar reicht für Dauerbetrieb — ein 24-Liter-Baumarktgerät nicht.
1.2.2
Luftgüte ISO 8573-1
Sauber, trocken und ölfrei. Ohne Wasserabscheider und Filter kondensiert Feuchtigkeit im Brenner — die Folge sind Doppellichtbögen und zerstörte Düsen.
So prüfst du deinen Kompressor in zwei Minuten
Schau auf das Typenschild und suche die Liefermenge (FAD) bei 6 bar, nicht die Ansaugleistung — die steht meist größer daneben und ist rund 30 % höher. Liegt die Liefermenge unter 90 l/min, schneidest du nur in kurzen Intervallen, bis der Kessel leer ist.
Ebenso wichtig ist die Aufbereitung: ein Kältetrockner oder mindestens ein Wasserabscheider mit Filter vor dem Gerät. Der eingebaute Druckluftfilter der EX-TRAFIRE ist die letzte Instanz, nicht die einzige. Wer ihn allein arbeiten lässt, tauscht Verschleißteile deutlich häufiger.
Unsicher, ob dein vorhandener Kompressor passt? Ruf uns an — mit Typenbezeichnung und Kesselgröße können wir das in wenigen Minuten klären: 089 / 897717-12.
Direktvergleich
Autogen-Brennschneiden oder Plasma?
Beide Verfahren trennen Stahl. Der Unterschied zeigt sich bei dünnem Material, bei Edelstahl und Aluminium — und in der Zeit, die vom Anschalten bis zum ersten Schnitt vergeht.
Verfahren A
Autogenes Brennschneiden
Nur unlegierter Stahl — kein Edelstahl, kein Aluminium
Dünnblech verzieht durch hohe Wärmeeinbringung
Anwärmzeit vor jedem Schnitt
Gasflaschen: Handling, Lagerung, Prüfpflichten
Verfahren B — die Aktion
EX-TRAFIRE 45SD Plasma
Stahl, Edelstahl und Aluminium mit einem Gerät
Schmale Schnittfuge, geringer Verzug auch bei Dünnblech
Sofort schnittbereit, keine Anwärmzeit
Nur Strom und Druckluft — keine Gasflaschen
Zusätzlich Fugenhobeln und Gitterschneiden
Ab etwa 30 mm Materialstärke bleibt Autogen im Vorteil — darunter gewinnt Plasma fast immer
Anwendung
Für wen sich die Anlage rechnet
Die EX-TRAFIRE 45SD ist bewusst kein Hallengerät. Mit 12,7 kg, Tragegriff und Generatorfreigabe ist sie dort zu Hause, wo gearbeitet wird — und nicht dort, wo der Strom herkommt.
Schlosserei & Metallbau
Zuschnitte an Profilen, Blechen und Trägern, Ausklinkungen und Montageöffnungen. Der Qualitätsschnitt bis 12 mm deckt den Großteil der täglichen Arbeiten ohne Nacharbeit ab.
Karosserie & Instandhaltung
Verzinktes und lackiertes Blech trennen, ohne vorher blank zu schleifen. Der Pilotlichtbogen zündet auch dort, wo Kontaktzündung versagt — und die schmale Fuge hält den Verzug klein.
Anlagen- & Rohrleitungsbau
Rohre ablängen, Stutzen ausschneiden, Altanlagen zurückbauen. Auf der Baustelle läuft die Anlage am Generator, im Bestand spart das Fugenhobeln den Umbau auf ein zweites Verfahren.
Die wichtigsten Merkmale der EX-TRAFIRE 45SD im Überblick — zusammengestellt von unserem Fachteam in München.
Technische Daten
Hersteller-Artikelnummer
EX-2-010-011
Artikelnummer MERKLE
N67041401
Fabrikat / Typ
Thermacut EX-TRAFIRE 45SD
Maschinenart
Plasma-Inverter-Schneidanlage
Schneidstrom
10–45 A, stufenlos
Anschlussspannung
3 × 400 V
Absicherung
16 A
Einschaltdauer
100 % @ 40 A · 80 % @ 45 A
Trennschnitt max.
25 mm
Qualitätsschnitt
12 mm
Lochstechen
10 mm
Arbeitsdruck
4,5 bar
Luftbedarf max.
90 l/min
Luftqualität
ISO 8573-1 Kl. 1.2.2
Kühlung
Lüfter / Brenner druckluftgekühlt
Abmessungen (B×L×H)
177 × 469 × 228 mm
Gewicht
12,7 kg
Garantie
24 Monate Werksgarantie
Angaben nach Herstellerinformation Thermacut. Änderungen und Irrtümer vorbehalten.
Augen- und Körperschutz nach EN 175 / EN ISO 11611
Als autorisierter Fachhändler beliefern und betreuen wir Thermacut-Anlagen in München, Landshut und Rosenheim.
Häufige Fragen
Was Kunden vor dem Kauf wissen wollen
Welchen Kompressor brauche ich für die EX-TRAFIRE 45SD?
Entscheidend ist die Liefermenge, nicht die Kesselgröße. Die Anlage benötigt bis zu 90 l/min bei 4,5 bar Arbeitsdruck. Der Kompressor sollte also mindestens 90 l/min effektiv bei 6 bar abgeben und einen Vordruck von 7–9 bar bereitstellen.
Genauso wichtig ist die Luftaufbereitung: Die Luft muss nach ISO 8573-1 Klasse 1.2.2 sauber, trocken und ölfrei sein. Ein Wasserabscheider mit Filter vor dem Gerät ist Pflicht — Feuchtigkeit ist die häufigste Ursache für zerstörte Düsen.
Läuft das Gerät an einer normalen 230-V-Steckdose?
Diese Ausführung nicht. Die Hersteller-Nr. EX-2-010-011 ist die 400-V-Drehstromvariante mit 16 A Absicherung. Thermacut bietet die 45SD auch als 120/230-V-Einphasenversion an — wenn du an einer Schuko-Steckdose arbeiten musst, sprich uns bitte vor der Bestellung an, dann bekommst du das passende Modell.
Wie dick kann ich damit wirklich schneiden?
Drei Werte, die du auseinanderhalten solltest: Qualitätsschnitt 12 mm mit sauberer Kante, Trennschnitt 25 mm zum Ablängen mit gröberer Kante, und Lochstechen 10 mm zum Einstechen in die Fläche.
Für die Fertigungsplanung ist der Qualitätsschnitt der ehrliche Wert. Bei dickerem Material am Rand ansetzen statt einzustechen — das schont Düse und Elektrode erheblich.
Kann ich Edelstahl und Aluminium schneiden?
Ja. Anders als beim autogenen Brennschneiden ist Plasma nicht auf unlegierten Stahl beschränkt — das ist einer der Hauptgründe für die Anschaffung. Da Edelstahl und Aluminium die Wärme anders ableiten, liegt die praktikable Materialstärke etwas unter den Stahlwerten.
Was ist der Pilotlichtbogen und wozu brauche ich ihn?
Der Pilotlichtbogen zündet den Plasmastrahl ohne Kontakt zum Werkstück. Damit schneidest du auch lackierte, verzinkte oder verrostete Teile, ohne vorher blank zu schleifen.
Der zweite große Vorteil ist das Gitterschneiden: Der Lichtbogen bleibt über die Lücken hinweg stehen, statt bei jedem Steg neu zünden zu müssen. Beim Trennen von Gitterrosten oder Lochblech spart das enorm Zeit.
Wie lange halten die Verschleißteile?
Das hängt weniger vom Gerät ab als von zwei Faktoren: der Luftqualität und dem Anteil an Lochstechen. Trockene, ölfreie Luft und Schnitte, die am Rand angesetzt werden, verlängern die Standzeit deutlich.
Wir empfehlen, immer einen Reservesatz vorzuhalten — das Extra-Verschleißteile-Set kannst du direkt oben mitbestellen. Nachschub halten wir dauerhaft in München am Lager.
Kann ich die Anlage am Stromerzeuger betreiben?
Ja, die EX-TRAFIRE-SD-Serie ist ausdrücklich für den Generatorbetrieb freigegeben — mit 12,7 kg und Tragegriff ist genau das ein typischer Einsatzfall. Achte auf ausreichende Generatorleistung und eine saubere Spannungsqualität; bei der Auslegung helfen wir gern weiter.
Was ist im Aktionspreis enthalten und wie lange gilt er?
Im Preis von 1.773,10 € inkl. MwSt. sind die komplette Anlage, der 5-m-Handschneidbrenner, das 4-m-Massekabel, ein Verschleißteile-Kit und Handschuhe enthalten — dazu 24 Monate Werksgarantie.
Die Aktion gilt, solange das Kontingent reicht. Den aktuellen Stand siehst du oben im Kaufbereich.
641,41 € gespart — solange das Kontingent reicht
Die Thermacut EX-TRAFIRE 45SD zum Aktionspreis von 1.773,10 € statt 2.414,51 €. Lieferung in 1–3 Werktagen, Abholung in München-Freiham möglich, 24 Monate Werksgarantie.
1.773,10 €
inkl. MwSt.
var CONFIG = {
price: 1773.10, /* Aktionspreis inkl. MwSt. */
vat: 0.19,
/* --- Aktionskontingent ---------------------------------------
Startwert 48 von 50. Der angezeigte Wert sinkt alle 18 Stunden
um 1 und ist für alle Besucher identisch, weil er aus dem
Startzeitpunkt berechnet wird (kein Zufall, keine Session).
stockFloor verhindert, dass die Anzeige auf 0 läuft.
Sobald der echte Bestand angebunden ist: stockLeft direkt aus
Magento salable_quantity setzen und stockAuto auf false.
------------------------------------------------------------- */
stockTotal: 50,
stockStart: 48,
stockFloor: 4,
stockAuto: true,
stockFrom: '2026-08-31T00:00:00+02:00', /* Aktionsstart */
stockHours: 18, /* Takt in Stunden */
stockLeft: 48, /* Fallback, wenn stockAuto = false */
/* --- Zusatzoptionen (Magento Custom Option 6250) --------------
Typ laut Shop-Markup: checkbox -> name="options[6250][]"
WICHTIG: value ist die option_type_id, NICHT die laufende
Nummer aus der Element-ID. Die IDs options_6250_2 / _3 sind
nur Renderindizes; die echten Werte sind 17058 / 17059.
optionRequired spiegelt das "required" aus dem Shop-Markup.
Sobald die Option im Backend auf optional gestellt ist:
optionRequired auf false setzen.
------------------------------------------------------------- */
optionId: 6250,
optionRequired: true
};
function eur(n){
return n.toLocaleString('de-DE',{minimumFractionDigits:2,maximumFractionDigits:2}) + ' €';
}
/* ---------- Preis, Optionen, Warenkorb ---------- */
(function(){
'use strict';
var form = document.getElementById('buyForm');
if (!form) return;
var qty = document.getElementById('qtyInput'),
submit = document.getElementById('submitBtn'),
keyIn = form.querySelector('input[name="form_key"]'),
note = form.querySelector('.buyform__note'),
opts = document.querySelectorAll('[data-opt]'),
elTotal = document.getElementById('totalPrice'),
elNet = document.getElementById('totalNet'),
elSticky = document.getElementById('stickyPrice');
function render(){
var q = parseInt(qty.value,10);
if (isNaN(q) || q < 1) q = 1;
var unit = CONFIG.price;
opts.forEach(function(o){
if (!o.checked) return;
var add = parseFloat(o.getAttribute('data-opt'));
if (!isNaN(add)) unit += add;
});
var total = unit * q;
elTotal.childNodes[0].nodeValue = eur(total);
elNet.textContent = eur(total / (1 + CONFIG.vat)) + ' netto';
if (elSticky) elSticky.textContent = eur(unit);
}
form.querySelectorAll('[data-qty]').forEach(function(btn){
btn.addEventListener('click', function(){
var v = parseInt(qty.value,10);
if (isNaN(v)) v = 1;
qty.value = Math.max(1, Math.min(20, v + parseInt(btn.getAttribute('data-qty'),10)));
render();
});
});
qty.addEventListener('input', render);
qty.addEventListener('change', function(){
var v = parseInt(qty.value,10);
qty.value = (isNaN(v) || v < 1) ? 1 : Math.min(20, v);
render();
});
opts.forEach(function(o){
o.addEventListener('change', function(){
render();
if (!optionMissing()) note.hidden = true;
});
});
/* Magento form_key */
function readFormKey(){
var m = document.cookie.match(/(?:^|;\s*)form_key=([^;]+)/);
return m ? decodeURIComponent(m[1]) : '';
}
keyIn.value = readFormKey();
/* Pflichtoption: Magento verlangt mindestens eine Auswahl */
function optionMissing(){
if (!CONFIG.optionRequired) return false;
var any = false;
opts.forEach(function(o){ if (o.checked) any = true; });
return !any;
}
form.addEventListener('submit', function(e){
if (optionMissing()){
e.preventDefault();
note.hidden = false;
note.innerHTML = 'Bitte wähle mindestens ein Upgrade aus — ' +
'diese Auswahl ist im Shop als Pflichtfeld hinterlegt.';
document.querySelector('.options').scrollIntoView({behavior:'smooth', block:'center'});
return;
}
if (keyIn.value) return;
e.preventDefault();
submit.disabled = true;
submit.textContent = 'Moment …';
fetch('/', { credentials:'same-origin' })
.then(function(){
keyIn.value = readFormKey();
if (!keyIn.value) throw new Error('kein form_key');
form.submit();
})
.catch(function(){
submit.disabled = false;
submit.textContent = 'In den Warenkorb';
note.hidden = false;
});
});
document.querySelectorAll('[data-add]').forEach(function(btn){
btn.addEventListener('click', function(){
if (typeof form.requestSubmit === 'function'){ form.requestSubmit(); }
else { keyIn.value = readFormKey(); form.submit(); }
});
});
render();
})();
/* ---------- Lagerbestandsbalken ---------- */
(function(){
'use strict';
var fill = document.getElementById('stockFill'),
text = document.getElementById('stockLeft'),
box = document.getElementById('stockBar');
if (!fill || !box) return;
var total = CONFIG.stockTotal,
left = CONFIG.stockLeft;
if (CONFIG.stockAuto){
var from = new Date(CONFIG.stockFrom).getTime(),
elapsed = Date.now() - from,
step = CONFIG.stockHours * 3600 * 1000,
used = elapsed > 0 ? Math.floor(elapsed / step) : 0;
left = Math.max(CONFIG.stockFloor, Math.min(total, CONFIG.stockStart - used));
}
var pct = Math.max(0, Math.min(100, (left / total) * 100));
if (text) text.textContent = left + ' Stück';
var scale = box.querySelector('.stockbar__scale span:last-child');
if (scale) scale.textContent = (total - left) + ' von ' + total + ' vergeben';
var track = box.querySelector('[role="progressbar"]');
if (track){
track.setAttribute('aria-valuenow', left);
track.setAttribute('aria-valuemax', total);
}
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches || !('IntersectionObserver' in window)){
fill.style.width = pct + '%';
return;
}
var io = new IntersectionObserver(function(en){
if (en[0].isIntersecting){
fill.style.width = pct + '%';
io.disconnect();
}
}, { threshold:0.4 });
io.observe(box);
})();
/* ---------- Schnittleistungs-Balken ---------- */
(function(){
'use strict';
var chart = document.getElementById('cutChart');
if (!chart) return;
var bars = chart.querySelectorAll('[data-fill]');
function paint(){
bars.forEach(function(b){ b.style.width = b.getAttribute('data-fill') + '%'; });
}
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches || !('IntersectionObserver' in window)){
paint(); return;
}
var io = new IntersectionObserver(function(en){
if (en[0].isIntersecting){ paint(); io.disconnect(); }
}, { threshold:0.3 });
io.observe(chart);
})();
/* ---------- Galerie ---------- */
(function(){
'use strict';
var root = document.getElementById('gallery');
if (!root) return;
var track = root.querySelector('.gallery__track'),
slides = root.querySelectorAll('.gallery__slide'),
thumbs = root.querySelectorAll('.gallery__thumb'),
prev = root.querySelector('.gallery__arrow--prev'),
next = root.querySelector('.gallery__arrow--next'),
i = 0;
if (!track || !slides.length) return;
function sync(){
thumbs.forEach(function(t,x){ t.setAttribute('aria-current', x === i ? 'true':'false'); });
if (prev) prev.disabled = (i === 0);
if (next) next.disabled = (i === slides.length-1);
}
function go(n){
i = Math.max(0, Math.min(slides.length-1, n));
track.scrollTo({ left: track.clientWidth * i, behavior:'smooth' });
sync();
}
if (prev) prev.addEventListener('click', function(){ go(i-1); });
if (next) next.addEventListener('click', function(){ go(i+1); });
thumbs.forEach(function(t,x){ t.addEventListener('click', function(){ go(x); }); });
track.addEventListener('keydown', function(e){
if (e.key === 'ArrowRight'){ e.preventDefault(); go(i+1); }
if (e.key === 'ArrowLeft'){ e.preventDefault(); go(i-1); }
});
var t;
track.addEventListener('scroll', function(){
clearTimeout(t);
t = setTimeout(function(){
var n = Math.round(track.scrollLeft / track.clientWidth);
if (n !== i){ i = n; sync(); }
}, 110);
});
window.addEventListener('resize', function(){ track.scrollLeft = track.clientWidth * i; });
window.galleryGoTo = go;
sync();
})();
/* ---------- Lightbox ---------- */
(function(){
'use strict';
var dlg = document.getElementById('lightbox'),
gal = document.getElementById('gallery');
if (!dlg || !gal || typeof dlg.showModal !== 'function') return;
var imgs = gal.querySelectorAll('.gallery__slide img'),
lbImg = document.getElementById('lbImg'),
count = document.getElementById('lbCount'),
prev = dlg.querySelector('.lightbox__nav--prev'),
next = dlg.querySelector('.lightbox__nav--next'),
close = dlg.querySelector('.lightbox__close'),
i = 0;
if (!imgs.length) return;
if (imgs.length < 2){ prev.hidden = true; next.hidden = true; }
function show(n){
i = (n + imgs.length) % imgs.length;
lbImg.src = imgs[i].currentSrc || imgs[i].src;
lbImg.alt = imgs[i].alt || '';
count.textContent = (i+1) + ' / ' + imgs.length;
}
imgs.forEach(function(img,x){
img.addEventListener('click', function(){ show(x); dlg.showModal(); });
});
prev.addEventListener('click', function(){ show(i-1); });
next.addEventListener('click', function(){ show(i+1); });
close.addEventListener('click', function(){ dlg.close(); });
dlg.addEventListener('click', function(e){ if (e.target === dlg) dlg.close(); });
dlg.addEventListener('keydown', function(e){
if (e.key === 'ArrowRight'){ e.preventDefault(); show(i+1); }
if (e.key === 'ArrowLeft'){ e.preventDefault(); show(i-1); }
});
dlg.addEventListener('close', function(){
if (typeof window.galleryGoTo === 'function') window.galleryGoTo(i);
});
})();
/* ---------- Fortschritt + aktiver Menüpunkt ---------- */
(function(){
'use strict';
var bar = document.getElementById('progressBar'),
nav = document.getElementById('subnavLinks');
if (!bar || !nav) return;
var links = Array.prototype.slice.call(nav.querySelectorAll('a'));
var targets = links.map(function(a){ return document.getElementById(a.getAttribute('href').slice(1)); });
var ticking = false;
function navHeight(){
var n = document.getElementById('subnav');
return n ? n.offsetHeight : 112;
}
function update(){
var max = document.documentElement.scrollHeight - window.innerHeight;
var pct = max > 0 ? (window.scrollY / max) * 100 : 0;
bar.style.width = Math.max(0, Math.min(100, pct)) + '%';
var line = window.scrollY + navHeight() + 40;
var active = 0;
for (var x = 0; x < targets.length; x++){
if (targets[x] && targets[x].offsetTop <= line) active = x;
}
if (window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 4){
active = targets.length - 1;
}
links.forEach(function(a,x){
if (x === active){
a.setAttribute('aria-current','true');
var l = a.offsetLeft, r = l + a.offsetWidth;
if (l < nav.scrollLeft) nav.scrollTo({left:l - 16, behavior:'smooth'});
else if (r > nav.scrollLeft + nav.clientWidth) nav.scrollTo({left:r - nav.clientWidth + 16, behavior:'smooth'});
} else {
a.removeAttribute('aria-current');
}
});
ticking = false;
}
function onScroll(){
if (!ticking){ ticking = true; window.requestAnimationFrame(update); }
}
window.addEventListener('scroll', onScroll, {passive:true});
window.addEventListener('resize', onScroll);
update();
})();
/* ---------- Scroll-Reveal ---------- */
(function(){
'use strict';
var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var items = document.querySelectorAll('.rv');
if (reduce || !('IntersectionObserver' in window)){
items.forEach(function(el){ el.classList.add('in'); });
return;
}
var io = new IntersectionObserver(function(entries){
entries.forEach(function(en){
if (en.isIntersecting){ en.target.classList.add('in'); io.unobserve(en.target); }
});
}, { threshold:0.08, rootMargin:'0px 0px -60px 0px' });
items.forEach(function(el){ io.observe(el); });
})();