@@ -4648,22 +4673,46 @@ async function loadStandardsList() {
_allStandards = data.data || [];
}
filterStandardsTable();
- // Also load form factors (lazy)
- if (_allFormFactors.length === 0) loadFormFactors();
+}
+
+// ── SUB-TAB SWITCHING ───────────────────────────────────────────────────────
+function switchStdSubtab(tab) {
+ ['standards','formfaktoren'].forEach(function(t) {
+ var content = el('std-subtab-' + t);
+ var btn = el('std-sub-btn-' + t);
+ if (!content || !btn) return;
+ var active = t === tab;
+ content.classList.toggle('hidden', !active);
+ btn.style.color = active ? 'var(--accent)' : 'var(--text-dim)';
+ btn.style.borderBottom = active ? '2px solid var(--accent)' : '2px solid transparent';
+ });
+ if (tab === 'formfaktoren') {
+ if (_allFormFactors.length === 0) loadFormFactors(); else renderFormFactors();
+ }
}
async function loadFormFactors() {
if (_allFormFactors.length > 0) { renderFormFactors(); return; }
+ var grid = el('ff-grid');
+ if (grid) grid.innerHTML = '
Lade Bauformen…
';
var data = await api('/api/form-factors').catch(function() { return {}; });
_allFormFactors = data.data || [];
renderFormFactors();
}
function filterFormFactors() {
- var family = el('ff-family-filter') ? el('ff-family-filter').value : '';
- var filtered = family
- ? _allFormFactors.filter(function(f) { return (f.family || '') === family; })
- : _allFormFactors;
+ var q = (el('ff-search') ? el('ff-search').value.toLowerCase() : '');
+ var family = (el('ff-family-filter') ? el('ff-family-filter').value : '');
+ var status = (el('ff-status-filter') ? el('ff-status-filter').value : '');
+ var filtered = _allFormFactors.filter(function(f) {
+ var matchQ = !q || (f.name || '').toLowerCase().includes(q)
+ || (f.full_name || '').toLowerCase().includes(q)
+ || (f.description || '').toLowerCase().includes(q)
+ || String(f.max_speed_gbps || '').includes(q);
+ var matchFamily = !family || (f.family || '') === family;
+ var matchStatus = !status || (f.status || '') === status;
+ return matchQ && matchFamily && matchStatus;
+ });
renderFormFactors(filtered);
}
@@ -4715,67 +4764,234 @@ function renderFormFactors(items) {
}).join('');
}
-function openFormFactorDetail(name) {
+// ── FORM FACTOR HYPE CYCLE DATA (static, curated per form factor) ────────────
+var FF_HYPE = {
+ 'CXP': { phase:'LEGACY_DECLINE', pct:98, signal:'AVOID', sigCol:'#c1121f', sigLbl:'Veraltet — nicht mehr einsetzen' },
+ 'XFP': { phase:'LEGACY_DECLINE', pct:93, signal:'AVOID', sigCol:'#c1121f', sigLbl:'Legacy — durch SFP+ vollständig ersetzt' },
+ 'CFP': { phase:'LEGACY_DECLINE', pct:90, signal:'MIGRATE', sigCol:'#888', sigLbl:'Migration zu CFP2/CFP4 planen' },
+ 'SFP': { phase:'PLATEAU_OF_PRODUCTIVITY', pct:88, signal:'BUY_NOW', sigCol:'#2d6a4f', sigLbl:'Stabil & günstig — jetzt kaufen' },
+ 'SFP+': { phase:'PLATEAU_OF_PRODUCTIVITY', pct:84, signal:'BUY_NOW', sigCol:'#2d6a4f', sigLbl:'Bewährt & preislich ausgereift' },
+ 'QSFP+': { phase:'PLATEAU_OF_PRODUCTIVITY', pct:80, signal:'BUY_NOW', sigCol:'#2d6a4f', sigLbl:'40G-Standard — stabile Preise' },
+ 'SFP28': { phase:'PLATEAU_OF_PRODUCTIVITY', pct:77, signal:'BUY_NOW', sigCol:'#2d6a4f', sigLbl:'25G-Standard — bestes Preis-Leistungs-Verhältnis' },
+ 'QSFP28': { phase:'PLATEAU_OF_PRODUCTIVITY', pct:74, signal:'BUY_NOW', sigCol:'#2d6a4f', sigLbl:'100G-Standard — Top Preis-Leistung' },
+ 'CFP4': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:68, signal:'BUY_NOW', sigCol:'#4287f5', sigLbl:'Kompaktes 100G-WDM — Preise stabil' },
+ 'CFP2': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:65, signal:'BUY_NOW', sigCol:'#4287f5', sigLbl:'Kohärent WDM — Reifephase' },
+ 'QSFP56': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:60, signal:'CONSIDER', sigCol:'#4287f5', sigLbl:'200G — Preise fallen noch' },
+ 'SFP56': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:56, signal:'CONSIDER', sigCol:'#4287f5', sigLbl:'50G — noch frühe Marktphase' },
+ 'SFP56-DD': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:53, signal:'CONSIDER', sigCol:'#4287f5', sigLbl:'100G SFP-Dichte — noch teuer' },
+ 'QSFP-DD': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:50, signal:'CONSIDER', sigCol:'#4287f5', sigLbl:'400G — stark wachsend, Preise sinken' },
+ 'OSFP': { phase:'SLOPE_OF_ENLIGHTENMENT', pct:47, signal:'CONSIDER', sigCol:'#4287f5', sigLbl:'400G/800G — Reifung in Gang' },
+ 'QSFP112': { phase:'TROUGH_OF_DISILLUSIONMENT', pct:40, signal:'WAIT', sigCol:'#e6a800', sigLbl:'400G QP112 — Preise noch hoch' },
+ 'QSFP-DD800': { phase:'PEAK_OF_INFLATED_EXPECTATIONS', pct:32, signal:'WAIT', sigCol:'#FF8100', sigLbl:'800G QSFP-DD — hoher Hype, hohe Preise' },
+ 'OSFP112': { phase:'PEAK_OF_INFLATED_EXPECTATIONS', pct:22, signal:'HOLD', sigCol:'#FF8100', sigLbl:'800G/1.6T — sehr früh, nur wenn nötig' },
+ 'SFP112': { phase:'PEAK_OF_INFLATED_EXPECTATIONS', pct:18, signal:'HOLD', sigCol:'#FF8100', sigLbl:'100G SFP-Dichte — Pilotphase' },
+ 'OSFP224': { phase:'INNOVATION_TRIGGER', pct:5, signal:'HOLD', sigCol:'#7c3aed', sigLbl:'1.6T — zu früh, noch kein Massenmarkt' }
+};
+
+// ── FORM FACTOR USE CASES ─────────────────────────────────────────────────────
+var FF_USE_CASES = {
+ 'SFP': ['Endgeräte: PCs, IP-Telefone, Drucker, Kameras', '1G Management-Ports an Switches & Routern', 'Out-of-Band Management (Konsolen-Server)', 'Kleine Büronetzwerke & Campus LAN', 'IoT-Geräte und Sensorknoten'],
+ 'SFP+': ['10G Server → Top-of-Rack-Switch (klassischer Enterprise-Standard)', 'Campus-Aggregation und Enterprise-Zugangslayer', 'Storage-Netzwerke (iSCSI, NFS over 10G)', 'VMware vSphere / vSAN Cluster Fabric', 'Uplinks zwischen Switches in mittleren RZs'],
+ 'SFP28': ['25G Server-NIC → ToR-Switch (Standard seit 2017)', 'Hyperscaler Server-zu-Switch in modernen RZs', 'NVMe-oF Storage-Fabric (25G)', 'ToR-zu-Aggregation in Leaf/Spine-Architekturen', '25G BreakOut aus QSFP28 (4×25G)'],
+ 'SFP56': ['50G Server-NICs (selten, Nischenmarkt)', 'High-Density 50G Zugangslayer', 'BreakOut aus QSFP56 (4×50G)', 'Übergangsformat zwischen 25G und 100G'],
+ 'SFP56-DD': ['100G in SFP-Portdichte (Hochdichte ToR)', 'Alternativer 100G-Slot ohne QSFP28-Hardware', 'Selten — QSFP28 meist bevorzugt'],
+ 'SFP112': ['Zukünftig: 100G im kleinen SFP-Formfaktor', 'Ultra-Hochdichte Server-Fabric', 'Noch nicht weit verfügbar (2024+)'],
+ 'XFP': ['Sehr alte 10G Switches und Router (Legacy)', '10G WAN-Verbindungen in alter Telko-Infrastruktur', 'Ersatz nur für bestehende Slots nötig — keine Neuinstallation'],
+ 'QSFP+': ['40G Spine-Uplinks (Legacy — wird durch 100G abgelöst)', '40G Blade-Server-Anbindung', 'Bonding aus 4×10G SFP+-Verbindungen', '40G BreakOut: 4×10G SFP+ über ein Kabel'],
+ 'QSFP28': ['100G Spine/Leaf in modernen Rechenzentren', '100G Server-Uplinks (AI/ML Cluster, Standard)', '100G Campus-Core und WAN-Edge', 'BreakOut: 4×25G SFP28 oder 2×50G SFP56', 'Dominant für 100G weltweit — bestes Preis-Leistungs-Verhältnis'],
+ 'QSFP56': ['200G Spine-Uplinks und Aggregation', 'Hochdichte 200G Server-Fabric', '200G als BreakOut: 2×100G QSFP28', 'Übergangsformat auf dem Weg zu 400G'],
+ 'QSFP112': ['400G mit maximaler QSFP-Portdichte', 'Next-Gen Hyperscale ToR-Switches', 'BreakOut: 4×100G mit einem Modul', 'Alternative zu QSFP-DD bei höherer Dichte'],
+ 'QSFP-DD': ['400G Spine-Fabric in Hyperscale RZs', 'AI/ML Training-Cluster-Interconnect (400G)', '400G WAN-Edge und Carrier-Grade-Verbindungen', 'BreakOut: 4×100G QSFP28 oder 8×50G SFP56', 'Standard 400G neben OSFP — breite Unterstützung'],
+ 'QSFP-DD800': ['800G AI/ML GPU-Cluster (NVIDIA H100, H200, Grace-Hopper)', 'Nächste Generation Hyperscale Spine-Switches', '800G BreakOut: 2×400G oder 8×100G', 'Hohes Wachstum durch AI-Infrastruktur-Boom'],
+ 'OSFP': ['400G/800G Spine (Cisco Nexus 9000, Arista 7800)', 'Kohärente 400G/800G ZR/ZR+ WAN-Module (mehr Platz für DCO)', 'High-Power-Optiken: mehr Kühlung als QSFP-DD möglich', 'AI/ML Cluster in Cisco-basierten Setups'],
+ 'OSFP112': ['800G und zukünftige 1.6T AI-Cluster', 'Nächste Generation GPU-Fabric (NVIDIA Scale-out)', 'Ultra-High-Bandwidth Spine für KI-Infrastruktur', '2×800G BreakOut in einem Modul'],
+ 'OSFP224': ['1.6T AI/ML Mega-Cluster (zukünftig)', 'NVIDIA GB200 NVLink 5.0 / Spectrum-X Scale-out', 'Next-Gen 800G/1.6T Hyperscale Fabrics (2025/2026)'],
+ 'CFP': ['Historisch: Erste 100G WAN-Verbindungen (veraltet)', 'Nur noch Ersatz für bestehende Slots'],
+ 'CFP2': ['Kohärente 100G/200G WAN (DWDM Transponder)', 'Tunable DWDM für Metro und Long-Haul-Netze', 'Telko-Backbone und Provider-Core-Equipment', 'Pluggable Coherent für 400G-ZR (CFP2-DCO)'],
+ 'CFP4': ['Kompaktes tunable 100G DWDM (doppelte CFP2-Dichte)', 'Provider-Edge-Equipment und Metro-Netze', 'DWDM wo mehr Ports als CFP2 nötig sind'],
+ 'CXP': ['Praktisch nicht mehr im Einsatz', 'Nur in allerersten 100G-Pilotinstallationen (2010-2012)', 'Ersatz: QSFP28 verwenden']
+};
+
+function _ffMiniHypeSVG(pct, col) {
+ // Compact 240×54px hype cycle curve SVG with a dot
+ var W = 240, H = 52;
+ // Approximate Gartner curve via cubic bezier (normalized 0-1, scaled to W×H)
+ // key points: start(0,0.45), peak(0.28,0.05), trough(0.52,0.70), slope(0.74,0.25), plateau(1.0,0.30)
+ var pts = [[0,0.46],[0.14,0.35],[0.22,0.07],[0.28,0.05],[0.34,0.12],[0.44,0.60],[0.52,0.70],[0.61,0.55],[0.72,0.24],[0.80,0.22],[1.0,0.25]];
+ // Convert to SVG coords (Y flipped, add 4px padding)
+ var pad = 6;
+ function sx(x){ return pad + x * (W - 2*pad); }
+ function sy(y){ return pad + y * (H - 2*pad - 6); }
+ // Build smooth polyline
+ var d = 'M ' + sx(pts[0][0]) + ' ' + sy(pts[0][1]);
+ for (var i=1; i'
+ + ''
+ + ''
+ + ''
+ + '';
+}
+
+async function openFormFactorDetail(name) {
var f = _allFormFactors.find(function(x) { return x.name === name; });
if (!f) return;
var fCl = { 'SFP family': '#0ea5e9', 'QSFP family': '#6366f1', 'OSFP family': '#FF8100', 'CFP family': '#2d6a4f', 'legacy': '#888' }[f.family] || '#888';
var descFull = f.description || '';
- var descDE = descFull.split('//')[0].trim();
- var descEN = descFull.includes('//') ? descFull.split('//')[1].trim() : '';
- var maxSpd = f.max_speed_gbps >= 1000 ? (f.max_speed_gbps/1000) + 'T' : (f.max_speed_gbps || '?') + 'G';
+ var descDE = descFull.split('//')[0].trim();
+ var descEN = descFull.includes('//') ? descFull.split('//')[1].trim() : '';
+ var maxSpd = f.max_speed_gbps >= 1000 ? (f.max_speed_gbps/1000) + 'T' : (f.max_speed_gbps || '?') + 'G';
var supersedes = Array.isArray(f.supersedes) ? f.supersedes.filter(Boolean) : [];
+ var hype = FF_HYPE[f.name] || { phase:'—', pct:50, signal:'—', sigCol:'#888', sigLbl:'Keine Daten' };
+ var useCases = FF_USE_CASES[f.name] || [];
+ var phaseLabels = { INNOVATION_TRIGGER:'Innovation Trigger', PEAK_OF_INFLATED_EXPECTATIONS:'Peak of Inflated Expectations',
+ TROUGH_OF_DISILLUSIONMENT:'Trough of Disillusionment', SLOPE_OF_ENLIGHTENMENT:'Slope of Enlightenment',
+ PLATEAU_OF_PRODUCTIVITY:'Plateau of Productivity', LEGACY_DECLINE:'Legacy / Decline' };
+
+ // Open panel immediately with skeleton
+ openPanel('
Lade ' + esc(name) + '…
');
+
+ // Fetch transceivers for this form factor
+ var txData = await api('/api/transceivers?form_factor=' + encodeURIComponent(f.name) + '&limit=10').catch(function(){ return {}; });
+ var txRows = txData.data || [];
+
var h = '';
- h += '
';
- h += '' + esc(f.name) + '';
- h += '' + esc(f.full_name || '') + '';
+
+ // ── Header ─────────────────────────────────────────────────────────────────
+ h += '
';
+ h += '
';
+ h += '
';
+ h += '' + esc(f.name) + '';
+ h += '' + maxSpd + '';
+ var sLbl = { current:'Aktuell', emerging:'Neu', legacy:'Legacy', obsolete:'Veraltet' }[f.status] || f.status || '';
+ var sCl = { current:'#2d6a4f', emerging:'#e6a800', legacy:'#888', obsolete:'#c1121f' }[f.status] || '#888';
+ h += '' + esc(sLbl) + '';
h += '
';
- // Plain-language description
+ h += '
' + esc(f.full_name || '') + '
';
+ h += '
';
+ h += '
';
+
+ // ── Plain-language description ─────────────────────────────────────────────
if (descDE) {
- h += '