From 50fee336c166f442aff3150925ef7678ea4add0c Mon Sep 17 00:00:00 2001 From: DeNNiiInc Date: Sun, 28 Dec 2025 02:31:10 +1100 Subject: [PATCH] Waterfall Phase 1.1 - Add request numbering, status colors, inline metrics --- waterfall.html | 63 ++++++++++++++++++++++++++++++++++++++++++++++---- waterfall.js | 25 +++++++++++++++++++- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/waterfall.html b/waterfall.html index 4142d29..55f85a8 100644 --- a/waterfall.html +++ b/waterfall.html @@ -21,31 +21,84 @@ background: var(--color-bg-tertiary); border-radius: 8px; padding: 1rem; + position: relative; + } + + .waterfall-timescale { + height: 25px; + position: relative; + margin-bottom: 10px; + margin-left: 370px; + border-bottom: 2px solid var(--color-border); + } + + .time-marker { + position: absolute; + top: 0; + font-size: 11px; + color: var(--color-text-secondary); + transform: translateX(-50%); } .waterfall-row { display: flex; align-items: center; - height: 25px; - margin-bottom: 2px; + height: 28px; + margin-bottom: 1px; cursor: pointer; transition: background 0.2s ease; + gap: 8px; } .waterfall-row:hover { background: rgba(114, 9, 183, 0.2); } + .request-number { + width: 35px; + text-align: right; + font-size: 11px; + color: var(--color-text-secondary); + font-weight: 600; + } + + .status-badge { + width: 40px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + font-size: 10px; + font-weight: 700; + color: white; + } + .request-label { - width: 300px; - padding: 0 10px; - font-size: 12px; + width: 250px; + padding: 0 8px; + font-size: 11px; color: var(--color-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .request-size { + width: 65px; + font-size: 10px; + color: var(--color-text-secondary); + text-align: right; + } + + .request-time { + width: 60px; + font-size: 10px; + color: var(--color-text-secondary); + text-align: right; + font-weight: 600; + } + .timeline { flex: 1; position: relative; diff --git a/waterfall.js b/waterfall.js index c9f2040..575930b 100644 --- a/waterfall.js +++ b/waterfall.js @@ -50,14 +50,29 @@ function renderWaterfall() { let html = ''; + // Add time scale header + html += '
'; + for (let sec = 0; sec <= Math.ceil(maxTime); sec++) { + const pos = sec * scale; + html += `
${sec}s
`; + } + html += '
'; + filteredEntries.forEach((entry, index) => { - const label = truncateUrl(entry.url, 50); + const label = truncateUrl(entry.url, 35); const timingBars = renderTimingBars(entry.timing, scale); + const statusColor = getStatusColor(entry.status); + const sizeKB = (entry.size.transferSize / 1024).toFixed(1); + const timeMS = entry.timing.total.toFixed(0); html += `
+
${entry.requestId}
+
${entry.status}
${label}
${timingBars}
+
${sizeKB} KB
+
${timeMS} ms
`; }); @@ -73,6 +88,14 @@ function renderWaterfall() { }); } +function getStatusColor(status) { + if (status >= 200 && status < 300) return '#4CAF50'; // Green + if (status >= 300 && status < 400) return '#FF9800'; // Orange + if (status >= 400 && status < 500) return '#F44336'; // Red + if (status >= 500) return '#B71C1C'; // Dark Red + return '#9E9E9E'; // Grey for others +} + function renderTimingBars(timing, scale) { let html = ''; let currentOffset = timing.startTime * scale;