);
}
function Endhuelsen({ tip }) {
const OPTS = [
{ name: 'Ohne Endhülsen', tag: 'Standard', brand: false, note: 'Strebenenden direkt in den Gewebelaschen — wirtschaftlich für gelegentlichen Einsatz oder als Reservegerät.' },
{ name: 'Mit Endhülsen', tag: 'Premium', brand: true, note: 'Metallhülse an jeder Strebe verstärkt die Kraftübertragung — die Bespannung hält länger, der Schirm bleibt in Form.' },
];
return (
);
}
function PhotoMosaic() {
// Entdeckt fortlaufend nummerierte Bilder in images/mosaik/ (01.jpg, 02.jpg …),
// akzeptiert auch unpadded (1.jpg). Stoppt bei der ersten Lücke.
const [imgs, setImgs] = React.useState(null);
React.useEffect(() => {
let cancelled = false;
const pad = (n) => String(n).padStart(2, '0');
const probeOne = (n) => new Promise((res) => {
const cands = ['images/mosaik/' + pad(n) + '.jpg', 'images/mosaik/' + n + '.jpg'];
const tryC = (k) => {
if (k >= cands.length) return res(null);
const im = new Image();
im.onload = () => res(cands[k]);
im.onerror = () => tryC(k + 1);
im.src = cands[k];
};
tryC(0);
});
const found = [];
const step = (n) => {
if (n > 60) { if (!cancelled) setImgs(found); return; }
probeOne(n).then((path) => {
if (path) { found.push(path); step(n + 1); }
else if (!cancelled) setImgs(found);
});
};
step(1);
return () => { cancelled = true; };
}, []);
const list = imgs || [];
const tiles = [[], [], []];
list.forEach((src, idx) => { tiles[idx % 3].push(src); });
return (
{tiles.map((srcs, ti) => )}
);
}
function Modelle() {
const ref = React.useRef(null);
// Höhenausgleich der Beschreibungs-Blöcke je Raster — hält Name/Beschreibung/
// Farben/Tabelle bei JEDER Breite auf gleicher Höhe (responsiv).
React.useLayoutEffect(() => {
const root = ref.current;
if (!root) return;
const ROWS = ['.ab-mcard-chip', '.ab-mcard-benefit', '.ab-mcard-variants'];
const equalize = () => {
root.querySelectorAll('.ab-modell-grid, .ab-modell-grid2').forEach((grid) => {
ROWS.forEach((sel) => {
const els = grid.querySelectorAll(sel);
els.forEach((el) => { el.style.minHeight = ''; });
let max = 0;
els.forEach((el) => { if (el.offsetHeight > max) max = el.offsetHeight; });
els.forEach((el) => { el.style.minHeight = max + 'px'; });
});
});
};
equalize();
let ro = null;
if (window.ResizeObserver) { ro = new ResizeObserver(equalize); ro.observe(root); }
window.addEventListener('resize', equalize);
return () => { if (ro) ro.disconnect(); window.removeEventListener('resize', equalize); };
}, []);
return (
Die Premiumklasse — Worker, Heavy und die beiden Pipeliner. Schwere Bauart für die härtesten Einsätze: 36 Streben gibt's nur hier, das macht sie windstabil — rund 12 kg in Ø 2,5 m, 15,5 kg in Ø 3,0 m. Wo Funken fliegen, hält die schwer entflammbare Bespannung dagegen. Gebaut, um zu bleiben.}
/>