This document catalogs all components and CSS classes from the openadapt-viewer library that were used in the benchmark viewer refactor.
Purpose: High-level page construction with fluent API
Methods Used:
PageBuilder(title, include_alpine=True)- Initialize pageadd_header(title, subtitle)- Add page header with dark mode toggleadd_section(content, title)- Add content sectionsadd_css(css)- Add custom CSSadd_script(script)- Add JavaScriptrender()- Generate final HTML
Features Leveraged:
- Automatic dark mode toggle in header
- Core CSS inclusion from
styles/core.css - Alpine.js CDN integration
- Responsive container layout
- Automatic footer generation
Purpose: Display statistics in card grid format
Function: metrics_grid(cards, columns=4)
Usage:
metrics_grid([
{"label": "Total Tasks", "value": run.total_tasks},
{"label": "Passed", "value": run.passed_tasks, "color": "success"},
{"label": "Failed", "value": run.failed_tasks, "color": "error"},
{"label": "Success Rate", "value": f"{run.success_rate * 100:.1f}%", "color": "accent"},
], columns=4)CSS Classes Generated:
oa-metrics-grid- Grid containeroa-metrics-card- Individual metric cardoa-metrics-card-label- Metric labeloa-metrics-card-value- Metric valueoa-metrics-success,oa-metrics-error,oa-metrics-accent- Color variants
Purpose: Display domain statistics with pass/fail breakdown
Function: domain_stats_grid(domain_stats)
Usage:
domain_stats_grid({
"office": {"passed": 5, "failed": 2, "total": 7},
"browser": {"passed": 3, "failed": 1, "total": 4},
})CSS Classes Generated:
oa-domain-stats-grid- Grid containeroa-domain-stat-item- Individual domain item
Purpose: Filter dropdowns with Alpine.js integration
Function: filter_bar(filters, alpine_data_name)
Usage:
filter_bar(
filters=[
{"id": "domain", "label": "Domain", "options": domain_options},
{"id": "status", "label": "Status", "options": [
{"value": "passed", "label": "Passed"},
{"value": "failed", "label": "Failed"},
]},
],
alpine_data_name="viewer",
)CSS Classes Generated:
oa-filter-bar- Filter containeroa-filter-group- Individual filter groupoa-filter-label- Filter labeloa-filter-dropdown- Dropdown select
Features:
- Automatic Alpine.js
x-modelbinding - "All {label}s" default option
- Responsive flex layout
Purpose: Container for selectable list of items
Classes Used:
oa-list- List containeroa-list-header- List header sectionoa-list-title- Header titleoa-list-subtitle- Header subtitle (shows count)oa-list-items- Scrollable items containeroa-list-item- Individual list itemoa-list-item-selected- Selected item highlightoa-list-item-content- Item content wrapperoa-list-item-title- Item titleoa-list-item-subtitle- Item subtitle
Features:
- Auto-scrolling with max-height
- Hover effects
- Selection highlighting with accent color
- Border-left indicator for selected items
Purpose: Status indicators (pass/fail, etc.)
Classes Used:
oa-badge- Base badge classoa-badge-success- Green badge for passed/successoa-badge-error- Red badge for failed/erroroa-badge-warning- Orange badge for warningsoa-badge-info- Blue badge for info
Features:
- Pill-shaped with rounded corners
- Color-coded backgrounds and text
- Semantic status colors
- Consistent sizing
Purpose: Media playback controls for step navigation
Classes Used:
oa-playback-controls- Controls containeroa-playback-btn- Control buttonoa-playback-btn-primary- Primary button (play/pause)oa-playback-counter- Step counter displayoa-playback-speed- Speed selector dropdown
Features:
- Icon buttons with hover effects
- Disabled state styling
- Primary button accent color
- Responsive flex layout
Buttons Generated:
- Rewind (go to start)
- Previous step
- Play/Pause
- Next step
- Fast forward (go to end)
Purpose: Progress bar with click-to-seek
Classes Used:
oa-timeline- Timeline containeroa-timeline-track- Progress track backgroundoa-timeline-progress- Filled progress indicator
Features:
- Click to seek functionality
- Smooth progress transitions
- Gradient accent colors
- Pointer cursor on hover
Purpose: Display action types and details
Classes Used:
oa-action- Action containeroa-action-badge- Action type badgeoa-action-click,oa-action-type, etc. - Type-specific colorsoa-action-details- Action parameters in monospace
Features:
- Color-coded by action type
- Monospace for technical details
- Uppercase badge text
- Icon-style formatting
--oa-bg-primary: #0a0a0f /* Main background */
--oa-bg-secondary: #12121a /* Card/section backgrounds */
--oa-bg-tertiary: #1a1a24 /* Nested element backgrounds */
--oa-border-color: rgba(255, 255, 255, 0.06) /* Borders */
--oa-text-primary: #f0f0f0 /* Main text */
--oa-text-secondary: #888 /* Secondary text */
--oa-text-muted: #555 /* Muted text */
--oa-accent: #00d4aa /* Primary accent (teal) */
--oa-accent-dim: rgba(0, 212, 170, 0.15) /* Accent background */
--oa-accent-secondary: #a78bfa /* Secondary accent (purple) */
--oa-success: #34d399 /* Success/passed color */
--oa-success-bg: rgba(52, 211, 153, 0.15) /* Success background */
--oa-error: #ff5f5f /* Error/failed color */
--oa-error-bg: rgba(255, 95, 95, 0.15) /* Error background */
--oa-warning: #f59e0b /* Warning color */
--oa-info: #3b82f6 /* Info color */--oa-space-xs: 4px
--oa-space-sm: 8px
--oa-space-md: 16px
--oa-space-lg: 24px
--oa-space-xl: 32px--oa-border-radius: 8px
--oa-border-radius-lg: 12px--oa-font-sans: -apple-system, BlinkMacSystemFont, "Inter", sans-serif
--oa-font-mono: "SF Mono", Monaco, Consolas, monospace
--oa-font-size-xs: 0.75rem
--oa-font-size-sm: 0.85rem
--oa-font-size-md: 1rem
--oa-font-size-lg: 1.125rem
--oa-font-size-xl: 1.5rem--oa-transition-fast: 0.15s ease
--oa-transition-normal: 0.2s ease
--oa-transition-slow: 0.3s ease.oa-task-viewer {
display: grid;
grid-template-columns: 1fr 2fr;
gap: var(--oa-space-lg);
}
@media (max-width: 1024px) {
.oa-task-viewer {
grid-template-columns: 1fr;
}
}.screenshot-container {
aspect-ratio: 16/9;
background: var(--oa-bg-tertiary);
border-radius: var(--oa-border-radius);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.screenshot-container img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}Alpine.data('viewer', () => ({
tasks: [...],
selectedTask: null,
currentStep: 0,
isPlaying: false,
playbackSpeed: 1,
playbackInterval: null,
filters: {
domain: '',
status: '',
},
// Methods: init, selectTask, prevStep, nextStep,
// togglePlayback, startPlayback, stopPlayback
// Computed: filteredTasks
}))<!-- Filter binding -->
<select x-model="filters.domain">
<!-- List item binding -->
<div :class="{'oa-list-item-selected': selectedTask?.task_id === task.task_id}">
<!-- Progress binding -->
<div :style="'width: ' + ((currentStep + 1) / selectedTask.steps.length * 100) + '%'">
<!-- Conditional rendering -->
<template x-if="selectedTask.error">
<template x-show="selectedTask.steps.length > 0">
<!-- Event handlers -->
@click="selectTask(task)"
@click="togglePlayback()"
@change="if (isPlaying) { stopPlayback(); startPlayback(); }"- PageBuilder
- metrics_grid
- domain_stats_grid
- filter_bar
- List (oa-list-*)
- Badge (oa-badge-*)
- Playback Controls (oa-playback-*)
- Timeline (oa-timeline-*)
- Action Display (oa-action-*)
- Metrics (oa-metrics-*)
- Filters (oa-filter-*)
- Colors: 15
- Spacing: 5
- Typography: 7
- Borders: 2
- Transitions: 3
- Grid layout for task viewer
- Screenshot container styling
- ✅ PageBuilder (page structure)
- ✅ metrics_grid (training metrics: loss, accuracy, epoch)
- ✅ filter_bar (filter by model, dataset)
- ✅ oa-badge (training status)
- ✅ CSS variables (consistent theming)
- ✅ PageBuilder (page structure)
- ✅ oa-playback-controls (video playback)
- ✅ oa-timeline (progress tracking)
- ✅ oa-action-* (action display)
- ✅ screenshot-container (frame display)
- ✅ PageBuilder (page structure)
- ✅ oa-list-* (result list)
- ✅ filter_bar (filter results)
- ✅ oa-badge (relevance scores)
- ✅ CSS variables (consistent theming)
- ✅ PageBuilder (page structure)
- ✅ metrics_grid (comparison metrics)
- ✅ oa-badge (status indicators)
- ✅ screenshot-container (side-by-side screenshots)
- ✅ CSS variables (consistent theming)
- ✅ Header with dark mode toggle (built into PageBuilder)
- ✅ Metrics cards and grid layout (metrics_grid component)
- ✅ Domain statistics grid (domain_stats_grid component)
- ✅ Filter dropdowns with Alpine binding (filter_bar component)
- ✅ Status badges (oa-badge classes)
- ✅ List with selection (oa-list-* classes)
- ✅ Playback controls (oa-playback-* classes)
- ✅ Progress timeline (oa-timeline-* classes)
- ✅ Action display (oa-action-* classes)
- ✅ All CSS variables and theming
- Task viewer grid layout (2-column responsive grid)
- Screenshot container (16:9 aspect ratio container)
- Alpine.js state management (specific to benchmark viewer)
Coverage: ~90% of UI came from component library
The benchmark viewer refactor demonstrates comprehensive use of the component library:
- 4 Python components for high-level page structure and common UI patterns
- 7 CSS component systems for consistent, reusable styling
- 30+ CSS variables for easy theming and customization
- 90% coverage from existing components (only 10% custom code needed)
This proves the component library provides strong foundations for building viewers quickly while maintaining consistency and quality across the application.