const SLIDES = [
{
EN: {
eyebrow: 'SERVICE · MANAGED SERVICES',
title: ['Infrastructure', 'that doesn\u2019t', 'get in the way.'],
italicWord: 'doesn\u2019t',
body: 'Streamline business processes through automation, optimized IT infrastructure, and proactive system management\u2014reducing downtime and improving productivity.',
metric: { value: '42%', label: 'Infra spend reduced' },
secondary: { value: '2.1\u00d7', label: 'Throughput' }
},
DE: {
eyebrow: 'SERVICE · MANAGED SERVICES',
title: ['Infrastruktur,', 'die nicht im', 'Weg steht.'],
italicWord: 'nicht',
body: 'Optimieren Sie Gesch\u00e4ftsprozesse durch Automatisierung, eine optimierte IT-Infrastruktur und proaktives Systemmanagement \u2014 weniger Ausfallzeiten, h\u00f6here Produktivit\u00e4t.',
metric: { value: '42%', label: 'Infrastrukturkosten reduziert' },
secondary: { value: '2.1\u00d7', label: 'Durchsatz' }
},
bg: 'dark',
diagram: 'architecture'
},
{
EN: {
eyebrow: 'SERVICE · MEDICAL DEVICE INTEGRATION',
title: ['Lab instruments, X-ray', 'systems and EMR/EHR,', 'finally talking.'],
italicWord: 'finally',
body: 'HL7, FHIR and DICOM integrations that connect lab analyzers, X-ray systems and EMR/EHR \u2014 automated, bidirectional, audit-ready.',
metric: { value: '0', label: 'Manual errors' },
secondary: { value: '2×', label: 'Faster turnaround' }
},
DE: {
eyebrow: 'SERVICE · INTEGRATION MEDIZINTECHNIK',
title: ['Laborger\u00e4te, R\u00f6ntgen-', 'systeme und EMR/EHR,', 'endlich verbunden.'],
italicWord: 'endlich',
body: 'HL7-, FHIR- und DICOM-Integrationen, die Laboranalyseger\u00e4te, R\u00f6ntgensysteme und EMR/EHR verbinden \u2014 automatisiert, bidirektional, audit-sicher.',
metric: { value: '0', label: 'Manuelle Fehler' },
secondary: { value: '2×', label: 'Schnellere Bearbeitung' }
},
bg: 'paper',
diagram: 'medlab'
},
{
EN: {
eyebrow: 'SERVICE · AI SOLUTIONS & SIMULATION',
title: ['From complex data', 'to smart', 'decisions—powered by AI'],
italicWord: 'smart',
body: 'Address industry-specific challenges with customized AI models and simulation environments.',
metric: { value: '6.4×', label: 'Faster simulation' },
secondary: { value: 'GPU', label: 'Accelerated compute' }
},
DE: {
eyebrow: 'SERVICE · KI-L\u00d6SUNGEN & SIMULATION',
title: ['Von komplexen Daten', 'zu klugen', 'Entscheidungen \u2014 mit KI'],
italicWord: 'klugen',
body: 'L\u00f6sen Sie branchenspezifische Herausforderungen mit ma\u00dfgeschneiderten KI-Modellen und Simulationsumgebungen.',
metric: { value: '6.4×', label: 'Schnellere Simulation' },
secondary: { value: 'GPU', label: 'Beschleunigte Rechenleistung' }
},
bg: 'dark',
diagram: 'aivis'
}];
function Diagram({ kind, dark, hovered }) {
const stroke = dark ? '#1F1F22' : '#DFE0E1';
const node = dark ? '#111114' : '#FFFFFF';
const nodeBorder = dark ? '#2A2A2D' : '#DFE0E1';
const dim = dark ? '#2A2A2D' : '#C5C6C8';
const text = dark ? '#6C6C65' : '#929596';
const liveGlow = dark ? 'url(#glowDark)' : 'url(#glowLight)';
if (kind === 'architecture') {
const accentOpacity = hovered ? 0.5 : 0.28;
const nodeStroke = hovered ? '#DF3E6F' : nodeBorder;
return (
);
}
if (kind === 'pipeline') {
const stages = ['SOURCE', 'INGEST', 'TRANSFORM', 'WAREHOUSE', 'SERVE'];
return (
);
}
// medlab — bidirectional lab ↔ hospital data exchange
if (kind === 'medlab') {
const LAB_INSTRUMENTS = ['Analyzer A', 'Centrifuge', 'Sequencer', 'Imager'];
const HOSPITAL_SYSTEMS = ['EMR / EHR', 'LIS', 'PACS', 'HIS'];
// 20% smaller: box w=128,h=45, spacing=72, hub=96×64
const boxW = 102, boxH = 36, rowGap = 58, startY = 112;
const hubX = 311, hubY = 220, hubW = 77, hubH = 51;
const hubCX = hubX + hubW / 2, hubCY = hubY + hubH / 2;
return (
);
}
// aivis — AI neural network + simulation visualization
if (kind === 'aivis') {
const layers = [
{ label: 'INPUT', nodes: 4, x: 100 },
{ label: 'HIDDEN', nodes: 6, x: 240 },
{ label: 'ATTENTION', nodes: 6, x: 380 },
{ label: 'OUTPUT', nodes: 3, x: 520 },
];
const nodeR = 13;
const totalH = 493;
const getY = (count, idx) => (totalH / 2) + (idx - (count - 1) / 2) * 56;
// Active path through the network — pink data flow
const activePath = [
{ layer: 0, node: 1 },
{ layer: 1, node: 2 },
{ layer: 2, node: 3 },
{ layer: 3, node: 1 },
];
const isActiveNode = (li, ni) => activePath.some(p => p.layer === li && p.node === ni);
const isActiveEdge = (li, ai, bi) => {
const a = activePath.find(p => p.layer === li);
const b = activePath.find(p => p.layer === li + 1);
return a && b && a.node === ai && b.node === bi;
};
return (
);
}
// matrix
const cols = 14,rows = 9;
return (
);
}
function SlideContent({ slide, lang, dark, idx, total, go }) {
const t = slide[lang] || slide.EN;
const fg = dark ? 'var(--gs-900)' : 'var(--gs-900)';
const fgMuted = dark ? 'var(--gs-600)' : 'var(--gs-600)';
const eyebrowColor = dark ? 'var(--gs-500)' : 'var(--fg-muted)';
const borderColor = dark ? 'rgba(0,0,0,0.1)' : 'var(--border)';
const cardBg = dark ? 'rgba(0,0,0,0.05)' : 'rgba(0,0,0,0.03)';
const [diagramHovered, setDiagramHovered] = React.useState(false);
return (
{/* Left — copy */}
{(() => {
const [leftHovered, setLeftHovered] = React.useState(false);
return (
setLeftHovered(true)}
onMouseLeave={() => setLeftHovered(false)}
style={{
padding: '44px 52px 40px',
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
borderRight: `1px solid ${borderColor}`,
position: 'relative',
background: dark
? (leftHovered ? '#D8D9DB' : '#EDEEEF')
: (leftHovered ? '#F0F0F0' : '#fff'),
transition: 'background 400ms var(--ease-standard)',
}}>
{/* Hover glow overlay */}
{/* Eyebrow with animated progress line */}
{t.eyebrow}
{/* Slide progress bar */}
{/* Read the brief — top right */}
{t.title.map((line, i) => {
const parts = line.split(t.italicWord);
if (parts.length === 2) {
return (
{parts[0]}
{t.italicWord}
{parts[1]}
);
}
return {line};
})}
{t.body}
{/* Bottom — metrics + CTA */}
{[t.metric, t.secondary].map((m, i) =>
{i === 0 &&
}
{m.label}
{m.value}
)}
);
})()}
{/* Right — diagram */}
setDiagramHovered(true)}
onMouseLeave={() => setDiagramHovered(false)}
style={{
position: 'relative',
background: dark ?
diagramHovered ? 'var(--gs-200)' : 'var(--gs-100)' :
diagramHovered ? 'var(--gs-200)' : 'var(--gs-100)',
overflow: 'hidden',
cursor: 'crosshair',
transition: 'background 400ms var(--ease-standard)'
}}>
{/* Decorative corner glow — expands on hover */}
{/* Centre glow on hover */}
{diagramHovered &&
}
{/* Diagram with scale on hover */}
{/* Gradient fade on left edge */}
LIVE
);
}
function Slider({ lang = 'EN' }) {
const [idx, setIdx] = React.useState(0);
const [paused, setPaused] = React.useState(false);
const total = SLIDES.length;
const touch = React.useRef({ x: 0, y: 0, t: 0, active: false });
React.useEffect(() => {
if (paused) return;
const t = setTimeout(() => setIdx((i) => (i + 1) % total), 6500);
return () => clearTimeout(t);
}, [idx, paused, total]);
const go = (n) => setIdx((n + total) % total);
const slide = SLIDES[idx];
const dark = slide.bg === 'dark';
const onTouchStart = (e) => {
const tc = e.touches[0];
touch.current = { x: tc.clientX, y: tc.clientY, t: Date.now(), active: true };
setPaused(true);
};
const onTouchEnd = (e) => {
if (!touch.current.active) return;
const tc = e.changedTouches[0];
const dx = tc.clientX - touch.current.x;
const dy = tc.clientY - touch.current.y;
const dt = Date.now() - touch.current.t;
touch.current.active = false;
// horizontal swipe, not too slow, not mostly vertical
if (Math.abs(dx) > 40 && Math.abs(dx) > Math.abs(dy) * 1.2 && dt < 800) {
if (dx < 0) go(idx + 1);
else go(idx - 1);
}
// brief unpause delay for autoplay
setTimeout(() => setPaused(false), 4000);
};
return (
setPaused(true)}
onMouseLeave={() => setPaused(false)}
onTouchStart={onTouchStart}
onTouchEnd={onTouchEnd}>
{/* Sliding track */}
{/* Bottom controls bar */}
{/* Progress dots + counter */}
{String(idx + 1).padStart(2, '0')} / {String(total).padStart(2, '0')}
{SLIDES.map((_, i) =>
{/* Prev / Next */}
{/* Top-left corner ticker */}
GREY SPACE IT SERVICES GMBH
);
}
function arrowBtn(dark) {
return {
width: 44,
height: 44,
borderRadius: 999,
border: `1px solid ${dark ? '#2A2A2D' : 'var(--border)'}`,
background: dark ? 'rgba(10,10,11,0.65)' : 'rgba(255,255,255,0.85)',
color: dark ? '#fff' : 'var(--gs-900)',
fontSize: 16,
cursor: 'pointer',
fontFamily: 'inherit',
backdropFilter: 'blur(8px)',
transition: 'background 160ms var(--ease-standard), transform 160ms var(--ease-standard)'
};
}
window.Slider = Slider;