function Products() {
const [active, setActive] = React.useState(PRODUCT_CATEGORIES[0].id);
const cat = PRODUCT_CATEGORIES.find(c => c.id === active);
const [lightbox, setLightbox] = React.useState(null);
return (
{/* Header */}
§ 02 · Product catalogue
The complete range.
One vendor.
From 10-amp terminal connectors to 63-amp plug-and-socket assemblies, silicone gaskets, push button hardware, and precision-molded fittings — all engineered in-house.
{/* Category tabs */}
{PRODUCT_CATEGORIES.map(c => (
setActive(c.id)}
style={{
display: 'flex',
alignItems: 'center',
gap: 10,
padding: '14px 20px',
borderRadius: 8,
background: active === c.id ? 'var(--paper)' : 'transparent',
color: active === c.id ? 'var(--ink)' : 'var(--steel)',
transition: 'all 0.25s',
flex: '1 1 auto',
minWidth: 140,
justifyContent: 'center',
}}>
{c.kicker}
{c.label}
))}
{/* Active category panel */}
{/* Summary */}
Category {cat.kicker}
{cat.label}
{cat.summary}
{/* Product grid */}
{cat.items.filter(item => (item.images && item.images.length > 0) || item.name === 'SSE Push Button (All colours)').map((item, i) => (
setLightbox(item.images)} />
))}
{/* CTA rail */}
Need a spec sheet or volume pricing for {cat.label.toLowerCase()}?
Most enquiries answered within one business day.
Request quote
Download PDF
{/* Lightbox Modal */}
{lightbox && (
setLightbox(null)} />
)}
);
}
function ProductCard({ item, idx, onZoom }) {
const [hover, setHover] = React.useState(false);
return (
setHover(true)}
onMouseLeave={() => setHover(false)}
style={{
background: 'rgba(255,255,255,0.02)',
border: '1px solid rgba(255,255,255,0.08)',
borderRadius: 8,
padding: 16,
transition: 'all 0.2s',
transform: hover ? 'translateY(-2px)' : 'translateY(0)',
borderColor: hover ? 'rgba(212,160,23,0.4)' : 'rgba(255,255,255,0.08)',
cursor: 'pointer',
}}>
{item.images ? (
) : (
)}
SKU · {String(idx + 1).padStart(2, '0')}
IN-STOCK
{item.name}
{item.spec}
);
}
function ProductImageSlider({ images, onZoom }) {
const [currentIndex, setCurrentIndex] = React.useState(0);
const [hovered, setHovered] = React.useState(false);
React.useEffect(() => {
const interval = setInterval(() => {
setCurrentIndex((prev) => (prev + 1) % images.length);
}, 4000);
return () => clearInterval(interval);
}, [images.length]);
return (
setHovered(true)}
onMouseLeave={() => setHovered(false)}
onClick={(e) => { e.stopPropagation(); onZoom(); }}
style={{
aspectRatio: '4/3',
borderRadius: 4,
position: 'relative',
overflow: 'hidden',
background: 'rgba(0,0,0,0.2)',
}}>
{images.map((img, idx) => (
))}
{/* Hover zoom icon overlay */}
{/* Indicators */}
{images.map((_, idx) => (
))}
);
}
// Lightbox Modal Component
function Lightbox({ images, onClose }) {
const [idx, setIdx] = React.useState(0);
// Lock scroll
React.useEffect(() => {
document.body.style.overflow = 'hidden';
return () => { document.body.style.overflow = ''; };
}, []);
return (
{/* Top Bar */}
e.currentTarget.style.background = 'rgba(212,160,23,0.8)'} onMouseLeave={e => e.currentTarget.style.background = 'rgba(255,255,255,0.1)'}>
{/* Main Image */}
{/* Navigation Arrows */}
{images.length > 1 && (
<>
setIdx(i => (i - 1 + images.length) % images.length)} style={{
position: 'absolute', left: 40, top: '50%', transform: 'translateY(-50%)',
width: 56, height: 56, borderRadius: '50%',
background: 'rgba(255,255,255,0.1)', color: 'var(--paper)',
display: 'flex', alignItems: 'center', justifyContent: 'center',
}} onMouseEnter={e => e.currentTarget.style.background = 'var(--amber)'} onMouseLeave={e => e.currentTarget.style.background = 'rgba(255,255,255,0.1)'}>
setIdx(i => (i + 1) % images.length)} style={{
position: 'absolute', right: 40, top: '50%', transform: 'translateY(-50%)',
width: 56, height: 56, borderRadius: '50%',
background: 'rgba(255,255,255,0.1)', color: 'var(--paper)',
display: 'flex', alignItems: 'center', justifyContent: 'center',
}} onMouseEnter={e => e.currentTarget.style.background = 'var(--amber)'} onMouseLeave={e => e.currentTarget.style.background = 'rgba(255,255,255,0.1)'}>
>
)}
{/* Thumbnails */}
{images.length > 1 && (
{images.map((img, i) => (
setIdx(i)} style={{
width: 80, height: 60, borderRadius: 6, overflow: 'hidden',
border: i === idx ? '2px solid var(--amber)' : '2px solid transparent',
opacity: i === idx ? 1 : 0.5,
transition: 'all 0.2s',
}}>
))}
)}
);
}
Object.assign(window, { Products });