+
+
@@ -393,19 +622,18 @@
+
+
+
+ Transceivers
+ —
+
+
+
+ Vendors
+ —
+
+
+
+ Standards
+ —
+
+
+
+ News Articles
+ —
+ Vector Collections
-
+
-
Recent News
+ Recent Intelligence
API Endpoints
-
+
-
-
+
+
-
@@ -433,6 +668,7 @@
+
@@ -449,9 +685,7 @@
-
+
+
+
- Optical Transceiver Hype Cycle
- 2026
-
- Norton-Bass Model — click any technology for details
+ Optical Transceiver Hype Cycle 2026
+ Norton-Bass Multigenerational Diffusion Model — click any technology for details
- Innovation
- Peak
- Trough
- Slope
- Plateau
+
@@ -413,7 +641,14 @@
+ Innovation
+ Peak
+ Trough
+ Slope
+ Plateau
| Technology | Phase | Position | Adoption | Peak | To Plateau |
|---|---|---|---|---|---|
| Technology | +Phase | +Position | +Adoption | +Peak | +To Plateau | +
-
@@ -474,7 +708,9 @@
-
-
+
@@ -521,13 +757,30 @@ function closePanel() { el('detail-panel').classList.remove('open'); }
el('panel-close').addEventListener('click', closePanel);
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') closePanel(); });
+// Animated number counter
+function animateValue(el, target, duration) {
+ if (!el || isNaN(target)) { if (el) el.textContent = target; return; }
+ var start = 0, startTime = null;
+ target = parseInt(target);
+ function step(ts) {
+ if (!startTime) startTime = ts;
+ var p = Math.min((ts - startTime) / duration, 1);
+ p = 1 - Math.pow(1 - p, 3); // ease-out cubic
+ el.textContent = Math.floor(p * target).toLocaleString();
+ if (p < 1) requestAnimationFrame(step);
+ }
+ requestAnimationFrame(step);
+}
+
// TABS
document.querySelectorAll('.tab').forEach(function(tab) {
tab.addEventListener('click', function() {
document.querySelectorAll('.tab').forEach(function(t) { t.classList.remove('active'); });
tab.classList.add('active');
document.querySelectorAll('[id^="tab-"]').forEach(function(p) { p.classList.add('hidden'); });
- el('tab-' + tab.dataset.tab).classList.remove('hidden');
+ var target = el('tab-' + tab.dataset.tab);
+ target.classList.remove('hidden');
+ target.classList.add('fade-in');
if (tab.dataset.tab === 'hype') loadHypeCycle();
if (tab.dataset.tab === 'transceivers') searchTransceivers();
if (tab.dataset.tab === 'news') loadNews();
@@ -539,30 +792,42 @@ document.querySelectorAll('.tab').forEach(function(tab) {
async function loadOverview() {
try {
var h = await api('/api/health');
- el('stat-transceivers').textContent = h.database.stats.transceiver_count;
- el('stat-vendors').textContent = h.database.stats.vendor_count;
- el('stat-standards').textContent = h.database.stats.standard_count;
- el('stat-news').textContent = h.database.stats.news_count;
+ animateValue(el('stat-transceivers'), h.database.stats.transceiver_count, 800);
+ animateValue(el('stat-vendors'), h.database.stats.vendor_count, 600);
+ animateValue(el('stat-standards'), h.database.stats.standard_count, 500);
+ animateValue(el('stat-news'), h.database.stats.news_count, 700);
+ animateValue(el('ov-transceivers'), h.database.stats.transceiver_count, 1000);
+ animateValue(el('ov-vendors'), h.database.stats.vendor_count, 800);
+ animateValue(el('ov-standards'), h.database.stats.standard_count, 700);
+ animateValue(el('ov-news'), h.database.stats.news_count, 900);
el('version-label').textContent = 'v' + h.version;
el('api-status').className = 'dot ' + (h.success ? 'dot-ok' : 'dot-err');
el('db-status').className = 'dot ' + (h.database.connected ? 'dot-ok' : 'dot-err');
- } catch(e) { el('api-status').className = 'dot dot-err'; }
+ if (!h.success) el('api-pill').classList.add('err');
+ if (!h.database.connected) el('db-pill').classList.add('err');
+ } catch(e) {
+ el('api-status').className = 'dot dot-err';
+ el('api-pill').classList.add('err');
+ }
try {
var stats = await api('/api/search/stats');
buildDOM(el('collections-list'), stats.collections.map(function(c) {
- return '
'
- + '' + esc(c.collection) + ''
- + '' + esc(c.pointsCount) + ''
+ return '
';
- }).join('') || ''
+ + '' + esc(c.collection) + ''
+ + '' + esc(c.pointsCount) + ' vectors'
+ '
';
}).join(''));
el('qdrant-status').className = 'dot dot-ok';
- } catch(e) { el('qdrant-status').className = 'dot dot-err'; }
+ } catch(e) {
+ el('qdrant-status').className = 'dot dot-err';
+ el('qdrant-pill').classList.add('err');
+ }
try {
var root = await api('/');
buildDOM(el('endpoints-list'), (root.endpoints || []).map(function(e) {
- return '' + esc(e) + '
';
+ return '' + esc(e) + '
';
}).join(''));
} catch(e) {}
@@ -573,7 +838,7 @@ async function loadOverview() {
+ '' + esc(n.title) + '
'
+ ''
+ 'No news
');
+ }).join('') || 'No news yet
');
} catch(e) {}
}
@@ -582,15 +847,17 @@ function doSearch() {
var q = el('search-input').value;
var col = el('search-collection').value;
if (!q) return;
- el('search-results').textContent = 'Searching...';
+ el('search-results').innerHTML = 'Searching...
';
api('/api/search?q=' + encodeURIComponent(q) + '&collection=' + col + '&limit=15').then(function(data) {
buildDOM(el('search-results'), (data.results || []).map(function(r) {
var title = r.standard_name || r.title || r.question || r.symptom || (r.text ? r.text.slice(0,80) : 'Result');
var body = r.answer || r.solution || r.summary || (r.text ? r.text.slice(0,300) : '');
+ var score = (r.score * 100).toFixed(1);
+ var scoreColor = score > 70 ? 'var(--green)' : score > 40 ? 'var(--yellow)' : 'var(--text-dim)';
return ''
+ '
';
- }).join('') || ''
+ '
'
+ '' + esc(title) + '
'
- + '' + (r.score * 100).toFixed(1) + '%'
+ + '' + score + '%'
+ '' + esc(body) + '
'
+ 'No results
');
+ }).join('') || 'No results found
');
});
}
el('search-btn').addEventListener('click', doSearch);
@@ -609,10 +876,10 @@ el('search-input').addEventListener('keydown', function(e) { if (e.key === 'Ente
// HYPE CYCLE
var PC = {
'Innovation Trigger': '#4f8ff7',
- 'Peak of Inflated Expectations': '#eab308',
+ 'Peak of Inflated Expectations': '#f59e0b',
'Trough of Disillusionment': '#ef4444',
'Slope of Enlightenment': '#a78bfa',
- 'Plateau of Productivity': '#22c55e'
+ 'Plateau of Productivity': '#10b981'
};
var PHASE_MAP = {
'INNOVATION_TRIGGER': 'Innovation Trigger',
@@ -622,11 +889,11 @@ var PHASE_MAP = {
'PLATEAU_OF_PRODUCTIVITY': 'Plateau of Productivity'
};
var PHASE_DESC = {
- 'Innovation Trigger': 'Early-stage technology breakthrough. First proof-of-concept demos, limited vendor support. High risk, high potential. Expect interop issues and premium pricing.',
- 'Peak of Inflated Expectations': 'Maximum hype and media attention. Vendors announce products, but real-world deployments are rare. Expectations exceed what the technology can deliver today.',
- 'Trough of Disillusionment': 'Reality check. Early deployments reveal limitations — interop failures, cost overruns, performance gaps. Interest wanes. Only committed adopters remain.',
- 'Slope of Enlightenment': 'Practical benefits become clear. Second and third-generation products fix early issues. Multi-vendor support grows. Best practices emerge from real deployments.',
- 'Plateau of Productivity': 'Mainstream adoption. Stable pricing, broad vendor support, proven reliability. The technology is a standard part of network infrastructure.'
+ 'Innovation Trigger': 'Early-stage technology breakthrough. First proof-of-concept demos, limited vendor support.',
+ 'Peak of Inflated Expectations': 'Maximum hype and media attention. Vendors announce products, but real-world deployments are rare.',
+ 'Trough of Disillusionment': 'Reality check. Early deployments reveal limitations. Only committed adopters remain.',
+ 'Slope of Enlightenment': 'Practical benefits become clear. Multi-vendor support grows. Best practices emerge.',
+ 'Plateau of Productivity': 'Mainstream adoption. Stable pricing, broad vendor support, proven reliability.'
};
function curveY(x, w, h) {
@@ -640,19 +907,41 @@ function curveY(x, w, h) {
}
function renderHypeSvg(techs) {
- var W = 1000, H = 300, P = 35;
+ var W = 1000, H = 320, P = 40;
var cw = W - P * 2, ch = H - P * 2;
var pts = [];
for (var i = 0; i <= cw; i += 2) pts.push((i + P) + ',' + (curveY(i, cw, ch) + P));
- var svg = '