Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
88e8030
feat: improve logs view with keyset pagination, column selection, and…
trieloff Feb 12, 2026
a5eb5a5
fix: address PR review feedback for logs view improvements
claude Feb 12, 2026
53eb32e
feat: integrate VirtualTable into logs view for virtual scrolling
claude Feb 12, 2026
873725b
fix: extract chart drawing helpers and improve test coverage
claude Feb 12, 2026
9e49c76
fix: virtual table layout, scroll direction, and column alignment
claude Feb 12, 2026
909ecc3
fix: virtual table UX — flexbox layout, column widths, scroll-to-end
trieloff Feb 12, 2026
859737f
fix: viewport overflow in logs view — use flex layout on #dashboard
claude Feb 12, 2026
54315ac
fix: logs view initialization in both URL restore and toggle paths
trieloff Feb 12, 2026
f9003ae
fix: infinite scroll — load more rows when scrolling past initial data
claude Feb 13, 2026
934ad13
fix: virtual table spacer — use div elements instead of tbody padding
trieloff Feb 13, 2026
20d86ed
feat: sync chart scrubber with table viewport scroll position
claude Feb 13, 2026
796af5f
feat: restore click-to-filter on virtual table cell values
claude Feb 13, 2026
3b6a5bf
fix: remove sample_hash from logs SELECT columns
claude Feb 13, 2026
42bb439
feat: click chart to scroll logs table to clicked timestamp
claude Feb 13, 2026
bcde0b0
perf: reduce initial logs page size from 500 to 100 rows
claude Feb 13, 2026
4e96527
fix: bucket-aware scroll interpolation to eliminate scroll acceleration
claude Feb 13, 2026
3e5478a
fix: cap virtual scroll height to prevent browser-induced acceleration
claude Feb 13, 2026
187d0bc
feat: bucket-row table replaces virtual scroll for smooth native scro…
claude Feb 13, 2026
6b7d8db
test: add bucket-row table unit tests
claude Feb 13, 2026
63557be
fix: render bucket table when chart data arrives after loadLogs
claude Feb 13, 2026
c023ff9
style: add zebra striping to bucket-row table for visual row distinction
claude Feb 13, 2026
1305180
style: repeating gradient stripes simulate data rows in bucket placeh…
claude Feb 13, 2026
1d14278
fix: remove hover effect on bucket placeholder rows
trieloff Feb 13, 2026
2845171
fix: remove range-mode scrubber and use instant scroll for chart-hove…
claude Feb 13, 2026
e6f616f
chore: add benchmark script for bucket fetch response times
claude Feb 13, 2026
de84e32
feat: split bucket placeholders into head and tail rows
claude Feb 13, 2026
dd7b097
feat: load actual log data per bucket via IntersectionObserver
claude Feb 13, 2026
8c0f250
feat: DOM virtualization with 2000-row cap for bucket logs
claude Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions css/chart.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,49 @@
margin: 0 -24px 24px -24px;
}

/* Chart section takes its natural size in flex layout */
.logs-active .chart-section {
flex-shrink: 0;
z-index: 20;
}

/* Collapse/expand toggle */
.chart-collapse-toggle {
display: none;
width: 100%;
height: 24px;
border: none;
background: var(--chart-bg);
border-top: 1px solid var(--border);
cursor: pointer;
padding: 0;
color: var(--text-secondary);
font-size: 10px;
line-height: 24px;
text-align: center;
opacity: 0.6;
transition: opacity 0.15s ease;
}

.chart-collapse-toggle:hover {
opacity: 1;
}

.logs-active .chart-collapse-toggle {
display: block;
}

/* Collapsed state */
.chart-section.chart-collapsed .chart-container {
height: 0;
overflow: hidden;
transition: height 0.2s ease;
}

.chart-section:not(.chart-collapsed) .chart-container {
transition: height 0.2s ease;
}

@media (max-width: 600px) {
.chart-section {
margin: 0 -12px 16px -12px;
Expand Down
83 changes: 81 additions & 2 deletions css/logs.css
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,36 @@
display: block;
}

/* Logs-active: make #dashboard a flex column so header + main fill exactly 100vh */
#dashboard:has(.logs-active) {
height: 100vh;
overflow: hidden;
display: flex;
flex-direction: column;
}

#dashboard:has(.logs-active) > header {
flex-shrink: 0;
}

.logs-active#dashboardContent {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}

/* Logs View fills remaining flex space */
.logs-active #logsView.visible {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
overflow: hidden;
padding: 0;
}

/* Logs View */
#logsView {
padding: 16px 0 24px 0;
Expand All @@ -25,6 +55,16 @@
border: 1px solid var(--border);
overflow-x: auto;
transition: filter 0.2s ease-out;
height: calc(100vh - 200px);
min-height: 400px;
}

/* In logs-active mode, container fills remaining flex space */
.logs-active .logs-table-container {
flex: 1;
min-height: 0;
height: auto;
overflow: auto;
}

@media (max-width: 600px) {
Expand All @@ -44,8 +84,9 @@
}

.logs-table {
width: 100%;
min-width: 100%;
border-collapse: collapse;
table-layout: fixed;
font-size: 12px;
font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;
}
Expand All @@ -59,6 +100,8 @@
position: sticky;
top: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
user-select: none;
}
Expand Down Expand Up @@ -103,7 +146,7 @@
padding: 8px 12px;
border-bottom: 1px solid var(--border);
vertical-align: top;
max-width: 300px;
max-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
Expand Down Expand Up @@ -175,6 +218,42 @@
color: var(--text-secondary);
}

/* Virtual table loading placeholder rows */
.logs-table .loading-row td {
background: var(--card-bg);
color: transparent;
}

/* Bucket-row table placeholder rows */
.bucket-table .bucket-row {
cursor: default;
}

.bucket-table .bucket-row .bucket-placeholder {
max-width: none;
vertical-align: middle;
text-align: center;
color: var(--text-secondary);
font-size: 11px;
border-bottom: 1px solid var(--border);
padding: 0 12px;
white-space: nowrap;
background: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 28px,
rgba(0, 0, 0, 0.02) 28px,
rgba(0, 0, 0, 0.02) 56px
);
}

/* Bucket table data rows (loaded on demand) */
.bucket-table tr[data-row-idx] td {
height: 28px;
padding: 4px 8px;
box-sizing: border-box;
}

/* Copy feedback toast */
.copy-feedback {
position: fixed;
Expand Down
7 changes: 7 additions & 0 deletions css/modals.css
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,13 @@
margin-bottom: 12px;
}

.log-detail-loading {
padding: 40px 20px;
text-align: center;
color: var(--text-secondary);
font-size: 14px;
}

@media (max-width: 600px) {
#logDetailModal {
width: 100vw;
Expand Down
1 change: 1 addition & 0 deletions dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ <h2>Requests over time</h2>
<div class="chart-container">
<canvas id="chart"></canvas>
</div>
<button class="chart-collapse-toggle" id="chartCollapseToggle" title="Collapse chart"><span aria-hidden="true">&#9650;</span> Hide chart</button>
</section>

<!-- Filters View (Breakdowns) -->
Expand Down
Loading
Loading