bobframes 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bobframes/__init__.py +3 -0
- bobframes/_version.py +1 -0
- bobframes/catalog.py +154 -0
- bobframes/cli.py +266 -0
- bobframes/derive_post_merge.py +365 -0
- bobframes/derives/__init__.py +0 -0
- bobframes/derives/pass_class_breakdown.py +102 -0
- bobframes/derives/texture_usage.py +121 -0
- bobframes/discovery.py +132 -0
- bobframes/global_entities.py +99 -0
- bobframes/html/__init__.py +0 -0
- bobframes/html/template.py +1056 -0
- bobframes/lint.py +114 -0
- bobframes/manifest.py +127 -0
- bobframes/parquetize.py +282 -0
- bobframes/parsers/__init__.py +0 -0
- bobframes/parsers/derive_program_transitions.py +73 -0
- bobframes/parsers/parse_init_state.py +675 -0
- bobframes/paths.py +111 -0
- bobframes/probes/__init__.py +0 -0
- bobframes/probes/whatif.py +165 -0
- bobframes/qrd_harness.py +119 -0
- bobframes/query_examples.py +222 -0
- bobframes/rdcmd.py +72 -0
- bobframes/replay/__init__.py +26 -0
- bobframes/replay/replay_main.py +2305 -0
- bobframes/reports/__init__.py +0 -0
- bobframes/reports/_dashboard.py +425 -0
- bobframes/reports/ab.py +88 -0
- bobframes/reports/base.py +114 -0
- bobframes/reports/cache.py +147 -0
- bobframes/reports/chrome.py +1306 -0
- bobframes/reports/cli.py +99 -0
- bobframes/reports/delta.py +167 -0
- bobframes/reports/discovery.py +118 -0
- bobframes/reports/draws_by_class.py +165 -0
- bobframes/reports/formatters.py +122 -0
- bobframes/reports/instancing_opportunities.py +276 -0
- bobframes/reports/orchestrator.py +59 -0
- bobframes/reports/overdraw.py +293 -0
- bobframes/reports/pass_gpu.py +190 -0
- bobframes/reports/shader_hotlist.py +240 -0
- bobframes/reports/trend_table.py +444 -0
- bobframes/resource_labels.py +162 -0
- bobframes/run.py +480 -0
- bobframes/schemas.py +426 -0
- bobframes/stable_keys.py +83 -0
- bobframes/tests/__init__.py +0 -0
- bobframes/tests/_render_util.py +84 -0
- bobframes/tests/data/golden/_reports/draws_by_class.html +323 -0
- bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html +1560 -0
- bobframes/tests/data/golden/_reports/index.html +264 -0
- bobframes/tests/data/golden/_reports/instancing_opportunities.html +266 -0
- bobframes/tests/data/golden/_reports/overdraw.html +275 -0
- bobframes/tests/data/golden/_reports/pass_gpu.html +277 -0
- bobframes/tests/data/golden/_reports/shader_hotlist.html +265 -0
- bobframes/tests/data/golden/_reports/trend_table.html +390 -0
- bobframes/tests/data/golden/index.html +1175 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json +51 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet +0 -0
- bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet +0 -0
- bobframes/tests/make_synthetic.py +171 -0
- bobframes/tests/smoke.py +199 -0
- bobframes/tests/test_determinism.py +19 -0
- bobframes/tests/test_discovery.py +97 -0
- bobframes/tests/test_hardening.py +142 -0
- bobframes/tests/test_parity.py +22 -0
- bobframes/tests/test_perf.py +18 -0
- bobframes/tests/test_replay_drift.py +115 -0
- bobframes/tests/test_schemas.py +26 -0
- bobframes/tests/test_schemas_unit.py +55 -0
- bobframes/tests/test_stable_keys.py +61 -0
- bobframes-0.1.0.dist-info/METADATA +144 -0
- bobframes-0.1.0.dist-info/RECORD +130 -0
- bobframes-0.1.0.dist-info/WHEEL +4 -0
- bobframes-0.1.0.dist-info/entry_points.txt +2 -0
- bobframes-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>trend table</title><link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect x='2' y='3' width='12' height='2' fill='%23888'/><rect x='2' y='7' width='12' height='2' fill='%234a8'/><rect x='2' y='11' width='12' height='2' fill='%23d54'/></svg>"><style>:root{color-scheme:light dark;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-6:24px;--sp-8:32px;--sp-12:48px;--fs-display:2.25rem;--fs-h1:1.5rem;--fs-h2:1.1rem;--fs-h3:0.9rem;--fs-body:14px;--fs-mono:13px;--fs-small:11px;--motion-hover:150ms ease-out;--motion-focus:100ms ease-out;--motion-vt:200ms ease-in-out;--motion-disclosure:180ms ease-out;--bg:light-dark(oklch(97.2% 0.012 80),oklch(16.4% 0.012 260));--surface-0:var(--bg);--surface-1:light-dark(oklch(94.6% 0.018 80),oklch(19.5% 0.013 260));--surface-2:light-dark(oklch(94.6% 0.020 80),oklch(20.7% 0.014 260));--code-bg:var(--surface-2);--fg:light-dark(oklch(22.0% 0.005 80),oklch(93.6% 0.005 260));--text-1:var(--fg);--muted:light-dark(oklch(49.4% 0.005 80),oklch(67.5% 0.005 260));--text-2:var(--muted);--text-3:light-dark(oklch(60.0% 0.012 80),oklch(56.4% 0.020 280));--border:light-dark(oklch(84.0% 0.024 82),oklch(28.0% 0.014 260));--border-1:var(--border);--border-strong:light-dark(oklch(75.0% 0.030 82),oklch(35.0% 0.018 260));--border-2:var(--border-strong);--row-alt:light-dark(oklch(93.2% 0.022 82),oklch(20.5% 0.015 260));--row-hover:light-dark(oklch(90.0% 0.038 82),oklch(25.0% 0.022 260));--accent-primary:light-dark(oklch(38.0% 0.020 260),oklch(78.0% 0.015 260));--accent-data:light-dark(oklch(55.0% 0.155 230),oklch(75.0% 0.115 230));--accent:var(--accent-primary);--status-alarm:light-dark(oklch(52.0% 0.180 28),oklch(70.0% 0.155 28));--status-warn:light-dark(oklch(70.0% 0.155 85),oklch(80.0% 0.130 85));--status-ok:light-dark(oklch(55.0% 0.135 145),oklch(72.0% 0.115 145));--status-info:light-dark(oklch(55.0% 0.115 260),oklch(75.0% 0.090 260));--c-opaque:light-dark(oklch(60.5% 0.110 135),oklch(73.5% 0.115 135));--c-prepass:light-dark(oklch(64.0% 0.135 50),oklch(73.0% 0.130 50));--c-translucent:light-dark(oklch(56.0% 0.085 240),oklch(71.0% 0.080 240));--c-additive:light-dark(oklch(56.0% 0.115 305),oklch(72.0% 0.105 305));--c-decal:light-dark(oklch(60.0% 0.115 65),oklch(71.0% 0.115 65));--c-shadow:light-dark(oklch(42.0% 0.025 285),oklch(55.0% 0.020 285));--c-ui:light-dark(oklch(71.0% 0.115 90),oklch(80.0% 0.115 90));--c-postprocess:light-dark(oklch(66.0% 0.055 240),oklch(78.0% 0.055 240));--c-other:light-dark(oklch(64.0% 0.000 0),oklch(75.0% 0.000 0));--pos:var(--status-ok);--neg:var(--status-alarm);--neutral:var(--text-2)}@media (prefers-reduced-motion:reduce){:root{--motion-hover:0s;--motion-focus:0s;--motion-vt:0s;--motion-disclosure:0s}}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--surface-0);color:var(--text-1)}body{padding:var(--sp-6) var(--sp-6) var(--sp-12);font:var(--fs-body)/1.5 'Inter','Segoe UI',system-ui,sans-serif;max-width:1600px;margin:0 auto}h1{font-size:var(--fs-h1);font-weight:600;color:var(--accent);margin:0 0 var(--sp-2);padding-bottom:var(--sp-2);border-bottom:1px solid var(--border-2);letter-spacing:-0.01em}h2{font-size:var(--fs-h2);font-weight:600;color:var(--text-1);margin:var(--sp-6) 0 var(--sp-3);padding:0 0 0 var(--sp-3);border-left:3px solid var(--accent);line-height:1.4;scroll-margin-top:64px}h2:first-of-type{margin-top:0}section[id],h2[id]{scroll-margin-top:64px}h2[id]:target{color:var(--accent)}h3{font-size:var(--fs-h3);font-weight:500;color:var(--text-2);margin:var(--sp-3) 0 var(--sp-2)}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline;text-decoration-thickness:2px}a:visited{color:var(--text-2)}a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}table.report a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}table.report a:visited{color:var(--text-3)}header.strip{display:flex;flex-wrap:wrap;gap:var(--sp-3) var(--sp-6);align-items:baseline;padding-bottom:var(--sp-3);border-bottom:1px solid var(--border-2);margin:0 0 var(--sp-4)}header.strip span{color:var(--text-2);font-size:var(--fs-small)}header.strip span strong{color:var(--text-1);font-weight:600}nav.crumb{font-size:var(--fs-small);color:var(--text-2);margin:0 0 var(--sp-3);display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center}nav.crumb a,nav.crumb a[data-link-kind]{display:inline-flex;align-items:center;gap:4px;color:var(--accent-primary);text-decoration:none;padding:2px 8px;border:1px solid var(--border-1);border-radius:2px;background:var(--surface-1);transition:border-color var(--motion-hover),background var(--motion-hover)}nav.crumb a:hover,nav.crumb a[data-link-kind]:hover{border-color:var(--accent-primary);background:var(--row-hover);text-decoration:none}nav.crumb a + a::before{content:''}.kpi-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--sp-3);margin:0 0 var(--sp-8)}.kpi-chip{background:var(--surface-1);border:1px solid var(--border-1);padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-1);min-height:88px}.kpi-chip .kpi-label{font:var(--fs-small) ui-monospace,monospace;color:var(--text-3);text-transform:lowercase;letter-spacing:0.04em}.kpi-chip .kpi-value{font:600 var(--fs-display)/1.05 ui-monospace,monospace;color:var(--text-1);font-variant-numeric:tabular-nums;letter-spacing:-0.02em}.kpi-chip .kpi-delta{font:var(--fs-small) ui-monospace,monospace;font-variant-numeric:tabular-nums;color:var(--text-3)}.kpi-chip.tone-pos .kpi-value,.kpi-chip.tone-pos .kpi-delta{color:var(--pos)}.kpi-chip.tone-neg .kpi-value,.kpi-chip.tone-neg .kpi-delta{color:var(--neg)}.table-wrap{overflow-x:auto;border:1px solid var(--border-1);border-radius:4px;margin:0 0 var(--sp-6)}.table-wrap > table.report{border:0;margin:0}nav.toc{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--sp-1) var(--sp-3);font:var(--fs-mono) ui-monospace,monospace;margin:0 0 var(--sp-6);padding:var(--sp-2) var(--sp-3);background:var(--surface-2);border:1px solid var(--border-1)}nav.toc a{display:inline-block;padding:2px 0}table.report{width:100%;border-collapse:collapse;font:var(--fs-mono) ui-monospace,'Cascadia Code',Consolas,monospace;margin-top:var(--sp-1)}table.report thead th{position:sticky;top:var(--hdr-offset);background:var(--surface-2);color:var(--accent);text-align:left;font-weight:600;padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border-2);white-space:nowrap;z-index:1}table.report thead th.num{text-align:right}table.report tbody td{padding:var(--sp-2) var(--sp-3);border-bottom:1px solid var(--border-1);vertical-align:top}table.report tbody td:first-child{font-weight:600;color:var(--text-1)}table.report td.num{text-align:right;font-variant-numeric:tabular-nums}table.report tbody tr:nth-child(even) td{background:var(--surface-2)}table.report tbody tr:hover td{background:var(--row-hover)}table.report tbody td .lbl{color:var(--text-2);margin-left:6px;font-style:italic;opacity:.85}table.report tr.area-break td{border-top:2px solid var(--border-2)}table.report td.area-cell{color:var(--text-2)}.bar-row{display:grid;grid-template-columns:minmax(240px,1fr) 2fr 90px;gap:var(--sp-3);align-items:center;padding:4px 0;font:var(--fs-mono) ui-monospace,'Cascadia Code',Consolas,monospace}.bar-row .key{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;color:var(--text-1)}.bar-row .total{text-align:right;font-variant-numeric:tabular-nums;color:var(--text-2)}.bar{display:flex;height:18px;background:var(--surface-2);border:1px solid var(--border-1);overflow:hidden}.bar .seg{flex:0 0 auto;color:#fff;font-size:10px;line-height:18px;text-align:center;overflow:hidden;white-space:nowrap}.ibar{display:inline-block;width:80px;height:6px;background:var(--surface-2);border:1px solid var(--border-1);vertical-align:middle;margin-left:6px}.ibar > div{height:100%;background:var(--accent)}.delta{font-variant-numeric:tabular-nums;padding:2px var(--sp-2);text-align:right}.delta-pill{display:inline-block;padding:1px 6px;border-radius:2px;background:var(--surface-2);font:600 var(--fs-small) ui-monospace,monospace}.delta.pos,.delta-pill.pos{color:var(--pos);font-weight:600}.delta.neg,.delta-pill.neg{color:var(--neg);font-weight:600}.delta.flat,.delta-pill.flat{color:var(--text-3)}.delta.new,.delta-pill.new{color:var(--text-3);font-style:italic}.delta.alarm{border-left:3px solid var(--status-alarm);padding-left:6px}.delta-latest{border-left:2px solid var(--border-2)}.legend{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);margin:0 0 var(--sp-3);font-size:var(--fs-small);color:var(--text-2)}.legend .chip{display:inline-flex;align-items:center;gap:6px}.legend .swatch{display:inline-block;width:12px;height:12px;border-radius:2px}.device-strip{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);background:var(--surface-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-1);margin:0 0 var(--sp-4)}.ab-strip{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);background:var(--surface-2);padding:var(--sp-2) var(--sp-3);border:1px solid var(--border-2);margin:0 0 var(--sp-4)}.rank{display:inline-block;width:1.4em;text-align:center;font:600 var(--fs-small) ui-monospace,monospace;margin-right:var(--sp-1);color:var(--text-3)}.rank.rank-1{color:var(--accent)}.rank.rank-2{color:var(--text-1)}.rank.rank-3{color:var(--text-2)}details.matrix,details.category{margin:0 0 var(--sp-4);background:var(--surface-1);border:1px solid var(--border-1)}details.matrix > summary,details.category > summary{cursor:pointer;list-style:none;user-select:none;padding:var(--sp-3) var(--sp-4);font:600 var(--fs-body) 'Inter',system-ui,sans-serif;color:var(--accent);border-bottom:1px solid transparent;display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-3)}details.matrix[open] > summary,details.category[open] > summary{border-bottom-color:var(--border-1)}details > summary::-webkit-details-marker{display:none}details.matrix > summary::before,details.category > summary::before{content:'+';margin-right:var(--sp-2);font-family:ui-monospace,monospace;color:var(--text-3);display:inline-block;width:0.8em}details[open] > summary::before{content:'-'}details.matrix > .matrix-body,details.category > .cat-body{padding:var(--sp-4)}.cat-meta{font:var(--fs-small) ui-monospace,monospace;color:var(--text-3);font-variant-numeric:tabular-nums}.spark{display:inline-block;vertical-align:middle;color:var(--text-2)}footer.legend{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);margin-top:var(--sp-12);padding-top:var(--sp-3);border-top:1px solid var(--border-1);display:block}.note{font-size:var(--fs-small);color:var(--text-2);margin-top:var(--sp-2)}.dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(360px,1fr));gap:var(--sp-6);margin:0 0 var(--sp-6)}a.dash-card{border:1px solid var(--border-1);padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-3);text-decoration:none;color:inherit;transition:border-color 0.1s,background 0.1s}a.dash-card:hover{background:var(--surface-1);border-color:var(--border-2);text-decoration:none}a.dash-card:visited{color:inherit}a.dash-card h3{margin:0;color:var(--accent);font-size:var(--fs-h2);border-left:3px solid var(--accent);padding-left:var(--sp-3)}a.dash-card table.report{font-size:var(--fs-small)}a.dash-card table.report a{pointer-events:none}a[data-link-kind="primary"]{display:inline-flex;align-items:center;gap:var(--sp-2);padding:6px 12px;background:var(--surface-1);border:1px solid var(--border-2);color:var(--accent-primary);text-decoration:none;transition:background var(--motion-hover),border-color var(--motion-hover)}a[data-link-kind="primary"]:hover{background:var(--row-hover);border-color:var(--accent-primary);text-decoration:none}a[data-link-kind="primary"]:visited{color:var(--accent-primary)}a[data-link-kind="inline"]{color:var(--accent-primary);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}a[data-link-kind="inline"]:hover{text-decoration-thickness:2px}a[data-link-kind="inline"] .icon{margin-left:3px;color:var(--text-2)}a[data-link-kind="drill"]{color:var(--text-1);text-decoration:underline;text-decoration-color:var(--border-2);text-decoration-thickness:1px;text-underline-offset:2px}a[data-link-kind="drill"]:hover{color:var(--accent-primary);text-decoration-color:var(--accent-primary);text-decoration-thickness:2px}tr:has(a[data-link-kind="drill"]):hover td{background:var(--row-hover)}a[data-link-kind="copy"]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--text-2);text-decoration:none;border-radius:2px;transition:color var(--motion-hover),background var(--motion-hover)}a[data-link-kind="copy"]:hover{color:var(--accent-primary);background:var(--row-hover)}a[data-link-kind="crumb"]{color:var(--text-2);text-decoration:none}a[data-link-kind="crumb"]:hover{color:var(--accent-primary);text-decoration:underline}.icon{width:11px;height:11px;display:inline-block;vertical-align:-1px;fill:currentColor}body{--hdr-offset:120px;--crumb-h:36px}nav.crumb{position:sticky;top:0;z-index:3;background:var(--bg);padding-top:var(--sp-1);padding-bottom:var(--sp-1)}.summary-bar{position:sticky;top:var(--crumb-h);z-index:3;display:grid;grid-template-columns:minmax(140px,max-content) 1fr auto;gap:var(--sp-2) var(--sp-6);align-items:center;background:var(--surface-1);border:1px solid var(--border-1);border-top:2px solid var(--accent-data);padding:var(--sp-3) var(--sp-4);margin:0 0 var(--sp-4)}.summary-bar .sb-label{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);text-transform:lowercase;letter-spacing:0.04em}.summary-bar .sb-headline{font:600 var(--fs-h1)/1.15 ui-monospace,monospace;color:var(--text-1);font-variant-numeric:tabular-nums;letter-spacing:-0.01em}.summary-bar .sb-sub{font:var(--fs-small) ui-monospace,monospace;color:var(--text-2);grid-column:2;font-variant-numeric:tabular-nums}.summary-bar .sb-link{align-self:center;grid-row:1 / span 2;grid-column:3}.summary-bar.tone-alarm{border-top-color:var(--status-alarm)}.summary-bar.tone-ok{border-top-color:var(--status-ok)}.summary-bar.tone-warn{border-top-color:var(--status-warn)}.summary-bar.tone-info{border-top-color:var(--status-info)}body{container-type:inline-size;container-name:page}@container page (max-width:1100px){nav.toc{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}}@container page (max-width:860px){.dash-grid{grid-template-columns:1fr}.summary-bar{grid-template-columns:1fr auto}.summary-bar .sb-sub{grid-column:1}.summary-bar .sb-link{grid-row:auto;grid-column:2}.summary-bar .sb-headline{font-size:var(--fs-h1)}}@container page (max-width:768px){.bar-row{grid-template-columns:1fr;grid-template-rows:auto auto auto;gap:var(--sp-1)}.bar-row .total{text-align:left}.kpi-strip{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}.kpi-chip .kpi-value{font-size:var(--fs-h1)}body{padding:var(--sp-3)}.summary-bar .sb-headline{font-size:var(--fs-h2)}table.report thead th,table.report tbody td{padding:var(--sp-1) var(--sp-2)}}@media print{@page{size:A4;margin:12mm}:root{color-scheme:light}html,body{background:#fff;color:#000}body{max-width:none;padding:0}nav.crumb,.device-strip,.ab-strip,rdc-copy-button,rdc-search-cards,rdc-ab-picker{display:none}.summary-bar{position:static;background:#fff;border-color:#888;border-top-width:3px;break-inside:avoid;break-after:avoid;print-color-adjust:exact}.summary-bar .sb-headline{color:#000}.summary-bar .sb-link{display:none}h1,h2{color:#000}h2[id]{position:static;background:transparent;break-after:avoid}table.report thead th{position:static;background:#f0f0f0;color:#000;print-color-adjust:exact}table.report thead{display:table-header-group}table.report tbody tr{break-inside:avoid}.kpi-strip{break-inside:avoid;grid-template-columns:repeat(4,1fr)}.kpi-chip{background:#fff;border-color:#888}.kpi-chip .kpi-value{color:#000}.dash-grid{grid-template-columns:repeat(2,1fr)}a.dash-card{break-inside:avoid}.bar,.bar .seg,.ibar,.ibar > div,.legend .swatch,.delta.pos,.delta.neg,.delta-pill{print-color-adjust:exact;-webkit-print-color-adjust:exact}details,details > summary{display:block}details > .matrix-body,details > .cat-body{display:block}a[data-link-kind="primary"]{background:transparent;border:1px solid #888;color:#000}a[data-link-kind="inline"]{color:#000}a[data-link-kind="inline"] .icon{display:none}body[data-multi-section="true"] h2[id] ~ h2[id]{break-before:page}body[data-page-kind="drop-browser"] > *{display:none}body[data-page-kind="drop-browser"]::before{content:"Per-drop browser is not designed for print. See the cumulative reports.";display:block;padding:20mm;font:bold 1.2rem system-ui,sans-serif;color:#000}}rdc-sortable-table{display:block}rdc-sortable-table table.report thead th{cursor:pointer;user-select:none}rdc-sortable-table table.report thead th[aria-sort="ascending"]::after{content:' \25B4';color:var(--text-3)}rdc-sortable-table table.report thead th[aria-sort="descending"]::after{content:' \25BE';color:var(--text-3)}rdc-copy-button{display:inline-flex;align-items:center;justify-content:center;min-width:28px;padding:0 6px;height:22px;color:var(--text-2);cursor:pointer;border:1px solid transparent;border-radius:2px;font:var(--fs-small) ui-monospace,monospace;margin-left:4px;transition:color var(--motion-hover),background var(--motion-hover),border-color var(--motion-hover)}rdc-copy-button:hover{color:var(--accent-primary);background:var(--row-hover);border-color:var(--border-1)}rdc-copy-button:focus-visible{outline:2px solid var(--accent-primary);outline-offset:1px}rdc-copy-button::before{content:'copy'}rdc-copy-button.copied{color:var(--status-ok);border-color:var(--status-ok)}rdc-copy-button.copied::before{content:'ok'}rdc-heatmap-cell{display:inline-block;padding:1px 4px;border-radius:2px;font-variant-numeric:tabular-nums}rdc-sticky-h2{display:contents}rdc-sticky-h2 h2[aria-current="section"]{border-left-color:var(--accent-data)}rdc-row-drill{display:contents}rdc-row-drill > tr{cursor:pointer}rdc-row-drill > tr:hover td{background:var(--row-hover)}rdc-search-cards{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-4);font:var(--fs-small) ui-monospace,monospace}rdc-search-cards input[type="search"]{font:inherit;padding:6px 10px;border:1px solid var(--border-1);background:var(--surface-0);color:var(--text-1);border-radius:2px;min-width:280px}rdc-search-cards input[type="search"]:focus{outline:2px solid var(--accent-primary);outline-offset:1px}rdc-search-cards .rdc-count{color:var(--text-2);font-variant-numeric:tabular-nums}rdc-ab-picker{display:inline-flex;align-items:center;gap:var(--sp-2);margin:0 0 var(--sp-4);font:var(--fs-small) ui-monospace,monospace}rdc-ab-picker label{color:var(--text-2)}rdc-ab-picker select{font:inherit;padding:4px 8px;border:1px solid var(--border-1);background:var(--surface-0);color:var(--text-1);border-radius:2px}rdc-alarm-banner{display:contents}.chip-cluster{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-4)}.chip-cluster a[data-link-kind="primary"]{padding:4px 10px;font-size:var(--fs-small)}.pair-list{display:flex;flex-direction:column;gap:var(--sp-4);margin:0 0 var(--sp-6)}.pair-group{border:1px solid var(--border-1);padding:var(--sp-3) var(--sp-4);background:var(--surface-1)}.pair-group > h3{margin:0 0 var(--sp-3);padding:0;font:var(--fs-mono) ui-monospace,monospace;color:var(--text-2);font-weight:500;text-transform:none;letter-spacing:0}.catalog-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-2);margin:0 0 var(--sp-6)}.catalog-grid a[data-link-kind="primary"]{justify-content:flex-start}</style><script>(function(){
|
|
2
|
+
if (typeof customElements === 'undefined') return;
|
|
3
|
+
class RdcBase extends HTMLElement {
|
|
4
|
+
connectedCallback(){
|
|
5
|
+
if (this._rdcUp) return;
|
|
6
|
+
this._rdcUp = true;
|
|
7
|
+
try { this.init(); } catch(e) { console.error('rdc init error', this.tagName, e); }
|
|
8
|
+
}
|
|
9
|
+
init(){}
|
|
10
|
+
}
|
|
11
|
+
class RdcSortableTable extends RdcBase {
|
|
12
|
+
init(){
|
|
13
|
+
const table = this.querySelector('table');
|
|
14
|
+
if (!table) return;
|
|
15
|
+
this._table = table;
|
|
16
|
+
const ths = table.querySelectorAll('thead th');
|
|
17
|
+
this._ths = ths;
|
|
18
|
+
ths.forEach((th, ci) => {
|
|
19
|
+
const isNum = th.classList.contains('num');
|
|
20
|
+
th.setAttribute('aria-sort', 'none');
|
|
21
|
+
th.addEventListener('click', () => this.sort(ci, isNum));
|
|
22
|
+
});
|
|
23
|
+
const liveId = 'rdc-live-' + Math.random().toString(36).slice(2, 8);
|
|
24
|
+
const live = document.createElement('div');
|
|
25
|
+
live.id = liveId;
|
|
26
|
+
live.setAttribute('aria-live', 'polite');
|
|
27
|
+
live.setAttribute('aria-atomic', 'true');
|
|
28
|
+
live.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)';
|
|
29
|
+
this.appendChild(live);
|
|
30
|
+
this._live = live;
|
|
31
|
+
const def = this.dataset.defaultSort;
|
|
32
|
+
const dir = this.dataset.defaultDir || 'desc';
|
|
33
|
+
if (def){
|
|
34
|
+
const cols = Array.from(ths).map(th => th.textContent.trim().toLowerCase());
|
|
35
|
+
const idx = cols.indexOf(def.toLowerCase());
|
|
36
|
+
if (idx >= 0){
|
|
37
|
+
const isNum = ths[idx].classList.contains('num');
|
|
38
|
+
this._applySort(idx, isNum, dir === 'asc' ? 'ascending' : 'descending');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
sort(ci, isNum){
|
|
43
|
+
const cur = this._ths[ci].getAttribute('aria-sort') || 'none';
|
|
44
|
+
const dir = cur === 'ascending' ? 'descending' : 'ascending';
|
|
45
|
+
this._applySort(ci, isNum, dir);
|
|
46
|
+
}
|
|
47
|
+
_applySort(ci, isNum, dir){
|
|
48
|
+
const tbody = this._table.tBodies[0];
|
|
49
|
+
if (!tbody) return;
|
|
50
|
+
const rows = Array.from(tbody.rows);
|
|
51
|
+
rows.sort((a, b) => {
|
|
52
|
+
const av = (a.cells[ci] ? a.cells[ci].textContent : '').trim();
|
|
53
|
+
const bv = (b.cells[ci] ? b.cells[ci].textContent : '').trim();
|
|
54
|
+
if (isNum){
|
|
55
|
+
const an = parseFloat(av.replace(/,/g, ''));
|
|
56
|
+
const bn = parseFloat(bv.replace(/,/g, ''));
|
|
57
|
+
const aok = !isNaN(an), bok = !isNaN(bn);
|
|
58
|
+
if (!aok && !bok) return 0;
|
|
59
|
+
if (!aok) return 1;
|
|
60
|
+
if (!bok) return -1;
|
|
61
|
+
return dir === 'ascending' ? an - bn : bn - an;
|
|
62
|
+
}
|
|
63
|
+
return dir === 'ascending' ? av.localeCompare(bv) : bv.localeCompare(av);
|
|
64
|
+
});
|
|
65
|
+
rows.forEach(r => tbody.appendChild(r));
|
|
66
|
+
this._ths.forEach(th => th.setAttribute('aria-sort', 'none'));
|
|
67
|
+
this._ths[ci].setAttribute('aria-sort', dir);
|
|
68
|
+
if (this._live) {
|
|
69
|
+
const colName = (this._ths[ci].textContent || '').trim();
|
|
70
|
+
this._live.textContent = 'sorted by ' + colName + ' ' + dir;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
customElements.define('rdc-sortable-table', RdcSortableTable);
|
|
75
|
+
class RdcCopyButton extends RdcBase {
|
|
76
|
+
init(){
|
|
77
|
+
const value = this.dataset.value || '';
|
|
78
|
+
const label = this.dataset.label || ('copy ' + value);
|
|
79
|
+
this.setAttribute('role', 'button');
|
|
80
|
+
this.setAttribute('tabindex', '0');
|
|
81
|
+
this.setAttribute('aria-label', label);
|
|
82
|
+
const handler = async () => {
|
|
83
|
+
try {
|
|
84
|
+
await navigator.clipboard.writeText(value);
|
|
85
|
+
} catch (e) {
|
|
86
|
+
const ta = document.createElement('textarea');
|
|
87
|
+
ta.value = value;
|
|
88
|
+
document.body.appendChild(ta);
|
|
89
|
+
ta.select();
|
|
90
|
+
try { document.execCommand('copy'); } catch(e2){}
|
|
91
|
+
ta.remove();
|
|
92
|
+
}
|
|
93
|
+
this.classList.add('copied');
|
|
94
|
+
setTimeout(() => this.classList.remove('copied'), 1000);
|
|
95
|
+
};
|
|
96
|
+
this.addEventListener('click', handler);
|
|
97
|
+
this.addEventListener('keydown', (e) => {
|
|
98
|
+
if (e.key === 'Enter' || e.key === ' '){
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
handler();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
customElements.define('rdc-copy-button', RdcCopyButton);
|
|
106
|
+
class RdcStickyH2 extends RdcBase {
|
|
107
|
+
init(){
|
|
108
|
+
const h2 = this.querySelector('h2[id]');
|
|
109
|
+
if (!h2) return;
|
|
110
|
+
const io = new IntersectionObserver((entries) => {
|
|
111
|
+
entries.forEach(e => {
|
|
112
|
+
if (e.isIntersecting){
|
|
113
|
+
h2.setAttribute('aria-current', 'section');
|
|
114
|
+
} else {
|
|
115
|
+
h2.removeAttribute('aria-current');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}, { rootMargin: '-50% 0px -50% 0px', threshold: 0 });
|
|
119
|
+
io.observe(h2);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
customElements.define('rdc-sticky-h2', RdcStickyH2);
|
|
123
|
+
class RdcHeatmapCell extends RdcBase {
|
|
124
|
+
init(){
|
|
125
|
+
const v = parseFloat(this.dataset.value);
|
|
126
|
+
const lo = parseFloat(this.dataset.min);
|
|
127
|
+
const hi = parseFloat(this.dataset.max);
|
|
128
|
+
const dir = this.dataset.direction || 'hot';
|
|
129
|
+
if (isNaN(v) || isNaN(lo) || isNaN(hi) || hi <= lo) return;
|
|
130
|
+
let t = (v - lo) / (hi - lo);
|
|
131
|
+
if (dir === 'cold') t = 1 - t;
|
|
132
|
+
t = Math.max(0, Math.min(1, t));
|
|
133
|
+
const pct = Math.round(t * 25);
|
|
134
|
+
this.style.background = 'color-mix(in oklch, var(--accent-data) ' + pct + '%, transparent)';
|
|
135
|
+
if (t >= 0.72){
|
|
136
|
+
this.style.color = 'light-dark(black, white)';
|
|
137
|
+
}
|
|
138
|
+
this.setAttribute('aria-label', v + ' (relative ' + Math.round(t * 100) + '%)');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
customElements.define('rdc-heatmap-cell', RdcHeatmapCell);
|
|
142
|
+
class RdcRowDrill extends RdcBase {
|
|
143
|
+
init(){
|
|
144
|
+
const href = this.dataset.href;
|
|
145
|
+
if (!href) return;
|
|
146
|
+
this.setAttribute('role', 'link');
|
|
147
|
+
this.setAttribute('tabindex', '0');
|
|
148
|
+
this.style.cursor = 'pointer';
|
|
149
|
+
const go = (ev) => {
|
|
150
|
+
if (ev.target && ev.target.closest('a')) return;
|
|
151
|
+
if (ev.target && ev.target.closest('rdc-copy-button')) return;
|
|
152
|
+
window.location.href = href;
|
|
153
|
+
};
|
|
154
|
+
this.addEventListener('click', go);
|
|
155
|
+
this.addEventListener('keydown', (ev) => {
|
|
156
|
+
if (ev.key === 'Enter'){
|
|
157
|
+
ev.preventDefault();
|
|
158
|
+
window.location.href = href;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
customElements.define('rdc-row-drill', RdcRowDrill);
|
|
164
|
+
class RdcSearchCards extends RdcBase {
|
|
165
|
+
init(){
|
|
166
|
+
const target = this.dataset.target || '.dash-grid';
|
|
167
|
+
const cards = document.querySelectorAll(target + ' > *');
|
|
168
|
+
const input = this.querySelector('input');
|
|
169
|
+
if (!input || !cards.length) return;
|
|
170
|
+
const counter = this.querySelector('.rdc-count');
|
|
171
|
+
const update = () => {
|
|
172
|
+
const q = input.value.trim().toLowerCase();
|
|
173
|
+
let shown = 0;
|
|
174
|
+
cards.forEach(c => {
|
|
175
|
+
const text = (c.textContent || '').toLowerCase();
|
|
176
|
+
const match = !q || text.indexOf(q) >= 0;
|
|
177
|
+
c.style.display = match ? '' : 'none';
|
|
178
|
+
if (match) shown++;
|
|
179
|
+
});
|
|
180
|
+
if (counter) counter.textContent = shown + ' / ' + cards.length;
|
|
181
|
+
};
|
|
182
|
+
input.addEventListener('input', update);
|
|
183
|
+
update();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
customElements.define('rdc-search-cards', RdcSearchCards);
|
|
187
|
+
class RdcAlarmBanner extends RdcBase {
|
|
188
|
+
init(){
|
|
189
|
+
const sev = this.dataset.severity || 'high';
|
|
190
|
+
const role = sev === 'high' ? 'alert' : 'status';
|
|
191
|
+
this.setAttribute('role', role);
|
|
192
|
+
this.setAttribute('aria-live', sev === 'high' ? 'assertive' : 'polite');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
customElements.define('rdc-alarm-banner', RdcAlarmBanner);
|
|
196
|
+
class RdcAbPicker extends RdcBase {
|
|
197
|
+
init(){
|
|
198
|
+
const select = this.querySelector('select');
|
|
199
|
+
if (!select) return;
|
|
200
|
+
this.setAttribute('role', 'combobox');
|
|
201
|
+
select.addEventListener('change', () => {
|
|
202
|
+
const url = select.value;
|
|
203
|
+
if (url) window.location.href = url;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
customElements.define('rdc-ab-picker', RdcAbPicker);
|
|
208
|
+
function _wireRowDrill(){
|
|
209
|
+
const seen = new WeakSet();
|
|
210
|
+
document.querySelectorAll('a[data-link-kind="drill"]').forEach(a => {
|
|
211
|
+
const tr = a.closest('tr');
|
|
212
|
+
if (!tr || seen.has(tr)) return;
|
|
213
|
+
seen.add(tr);
|
|
214
|
+
tr.addEventListener('click', (ev) => {
|
|
215
|
+
if (ev.target.closest('a')) return;
|
|
216
|
+
if (ev.target.closest('rdc-copy-button')) return;
|
|
217
|
+
a.click();
|
|
218
|
+
});
|
|
219
|
+
tr.style.cursor = 'pointer';
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (document.readyState === 'loading'){
|
|
223
|
+
document.addEventListener('DOMContentLoaded', _wireRowDrill);
|
|
224
|
+
} else {
|
|
225
|
+
_wireRowDrill();
|
|
226
|
+
}
|
|
227
|
+
})();</script></head><body style="--hdr-offset: 120px" data-multi-section="true">
|
|
228
|
+
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
|
|
229
|
+
<defs>
|
|
230
|
+
<symbol id="icon-link-out" viewBox="0 0 16 16">
|
|
231
|
+
<path d="M4 4h5v1H5v6h6V8h1v3.5a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-7a.5.5 0 0 1 .5-.5z"/>
|
|
232
|
+
<path d="M11 5L7.5 8.5M11 5h-3M11 5v3" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
233
|
+
</symbol>
|
|
234
|
+
<symbol id="icon-file" viewBox="0 0 16 16">
|
|
235
|
+
<path d="M4 2h5l3 3v9H4z" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
236
|
+
<path d="M9 2v3h3" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
237
|
+
</symbol>
|
|
238
|
+
<symbol id="icon-arrow-right" viewBox="0 0 16 16">
|
|
239
|
+
<path d="M4 8h8M9 5l3 3-3 3" stroke="currentColor" fill="none" stroke-width="1.5"/>
|
|
240
|
+
</symbol>
|
|
241
|
+
<symbol id="icon-copy" viewBox="0 0 16 16">
|
|
242
|
+
<path d="M5 5h7v8H5z" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
243
|
+
<path d="M3 3h7v2" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
244
|
+
</symbol>
|
|
245
|
+
<symbol id="icon-search" viewBox="0 0 16 16">
|
|
246
|
+
<circle cx="7" cy="7" r="4" stroke="currentColor" fill="none" stroke-width="1.5"/>
|
|
247
|
+
<path d="M10 10l3 3" stroke="currentColor" stroke-width="1.5"/>
|
|
248
|
+
</symbol>
|
|
249
|
+
<symbol id="icon-warn" viewBox="0 0 16 16">
|
|
250
|
+
<path d="M8 2l6 11H2L8 2zM8 7v3M8 11.5v.5" stroke="currentColor" fill="none" stroke-width="1"/>
|
|
251
|
+
</symbol>
|
|
252
|
+
</defs>
|
|
253
|
+
</svg>
|
|
254
|
+
|
|
255
|
+
<h1>trend table</h1>
|
|
256
|
+
<header class="strip">
|
|
257
|
+
<span>built <strong><TS></strong></span>
|
|
258
|
+
<span>drops <strong>2</strong></span>
|
|
259
|
+
</header>
|
|
260
|
+
<nav class="crumb"><a href="../index.html" data-link-kind="crumb">root catalog</a><a href="../_reports/index.html" data-link-kind="crumb">dashboard</a></nav>
|
|
261
|
+
|
|
262
|
+
<nav class="toc">
|
|
263
|
+
<a href="#total_gpu_duration_s" data-link-kind="crumb">gpu (s)</a>
|
|
264
|
+
<a href="#n_draws" data-link-kind="crumb">draws</a>
|
|
265
|
+
<a href="#vbo_bytes_bound_derived" data-link-kind="crumb">vbo bytes</a>
|
|
266
|
+
<a href="#ibo_bytes_bound_derived" data-link-kind="crumb">ibo bytes</a>
|
|
267
|
+
<a href="#program_switches" data-link-kind="crumb">prog switches</a>
|
|
268
|
+
<a href="#class_counts" data-link-kind="crumb">draws by class</a>
|
|
269
|
+
</nav>
|
|
270
|
+
<rdc-sticky-h2><h2 id="total_gpu_duration_s">gpu (s)</h2></rdc-sticky-h2>
|
|
271
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
272
|
+
<table class="report"><thead><tr>
|
|
273
|
+
<th>area</th>
|
|
274
|
+
<th class="num">2026-05-27_r110565</th>
|
|
275
|
+
<th class="num">2026-05-28_r110600</th>
|
|
276
|
+
<th class="num delta-latest">delta</th>
|
|
277
|
+
</tr></thead><tbody>
|
|
278
|
+
<tr>
|
|
279
|
+
<td>District 01</td>
|
|
280
|
+
<td class="num">0.292</td>
|
|
281
|
+
<td class="num">0.177</td>
|
|
282
|
+
<td class="delta delta-latest pos alarm">-0.115</td>
|
|
283
|
+
</tr>
|
|
284
|
+
</tbody></table></rdc-sortable-table></div>
|
|
285
|
+
<rdc-sticky-h2><h2 id="n_draws">draws</h2></rdc-sticky-h2>
|
|
286
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
287
|
+
<table class="report"><thead><tr>
|
|
288
|
+
<th>area</th>
|
|
289
|
+
<th class="num">2026-05-27_r110565</th>
|
|
290
|
+
<th class="num">2026-05-28_r110600</th>
|
|
291
|
+
<th class="num delta-latest">delta</th>
|
|
292
|
+
</tr></thead><tbody>
|
|
293
|
+
<tr>
|
|
294
|
+
<td>District 01</td>
|
|
295
|
+
<td class="num">7,957</td>
|
|
296
|
+
<td class="num">4,417</td>
|
|
297
|
+
<td class="delta delta-latest pos alarm">-3,540</td>
|
|
298
|
+
</tr>
|
|
299
|
+
</tbody></table></rdc-sortable-table></div>
|
|
300
|
+
<rdc-sticky-h2><h2 id="vbo_bytes_bound_derived">vbo bytes</h2></rdc-sticky-h2>
|
|
301
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
302
|
+
<table class="report"><thead><tr>
|
|
303
|
+
<th>area</th>
|
|
304
|
+
<th class="num">2026-05-27_r110565</th>
|
|
305
|
+
<th class="num">2026-05-28_r110600</th>
|
|
306
|
+
<th class="num delta-latest">delta</th>
|
|
307
|
+
</tr></thead><tbody>
|
|
308
|
+
<tr>
|
|
309
|
+
<td>District 01</td>
|
|
310
|
+
<td class="num">12</td>
|
|
311
|
+
<td class="num">12</td>
|
|
312
|
+
<td class="delta delta-latest flat">0</td>
|
|
313
|
+
</tr>
|
|
314
|
+
</tbody></table></rdc-sortable-table></div>
|
|
315
|
+
<rdc-sticky-h2><h2 id="ibo_bytes_bound_derived">ibo bytes</h2></rdc-sticky-h2>
|
|
316
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
317
|
+
<table class="report"><thead><tr>
|
|
318
|
+
<th>area</th>
|
|
319
|
+
<th class="num">2026-05-27_r110565</th>
|
|
320
|
+
<th class="num">2026-05-28_r110600</th>
|
|
321
|
+
<th class="num delta-latest">delta</th>
|
|
322
|
+
</tr></thead><tbody>
|
|
323
|
+
<tr>
|
|
324
|
+
<td>District 01</td>
|
|
325
|
+
<td class="num">0</td>
|
|
326
|
+
<td class="num">0</td>
|
|
327
|
+
<td class="delta delta-latest flat">0</td>
|
|
328
|
+
</tr>
|
|
329
|
+
</tbody></table></rdc-sortable-table></div>
|
|
330
|
+
<rdc-sticky-h2><h2 id="program_switches">prog switches</h2></rdc-sticky-h2>
|
|
331
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
332
|
+
<table class="report"><thead><tr>
|
|
333
|
+
<th>area</th>
|
|
334
|
+
<th class="num">2026-05-27_r110565</th>
|
|
335
|
+
<th class="num">2026-05-28_r110600</th>
|
|
336
|
+
<th class="num delta-latest">delta</th>
|
|
337
|
+
</tr></thead><tbody>
|
|
338
|
+
<tr>
|
|
339
|
+
<td>District 01</td>
|
|
340
|
+
<td class="num">576</td>
|
|
341
|
+
<td class="num">482</td>
|
|
342
|
+
<td class="delta delta-latest pos">-94</td>
|
|
343
|
+
</tr>
|
|
344
|
+
</tbody></table></rdc-sortable-table></div>
|
|
345
|
+
<rdc-sticky-h2><h2 id="class_counts">draws by class</h2></rdc-sticky-h2>
|
|
346
|
+
<div class="table-wrap"><rdc-sortable-table>
|
|
347
|
+
<table class="report"><thead><tr>
|
|
348
|
+
<th>area</th>
|
|
349
|
+
<th class="num">2026-05-27_r110565/opaque</th>
|
|
350
|
+
<th class="num">2026-05-27_r110565/prepass</th>
|
|
351
|
+
<th class="num">2026-05-27_r110565/shadow</th>
|
|
352
|
+
<th class="num">2026-05-27_r110565/translucent</th>
|
|
353
|
+
<th class="num">2026-05-27_r110565/additive</th>
|
|
354
|
+
<th class="num">2026-05-27_r110565/decal</th>
|
|
355
|
+
<th class="num">2026-05-27_r110565/ui</th>
|
|
356
|
+
<th class="num">2026-05-27_r110565/postprocess</th>
|
|
357
|
+
<th class="num">2026-05-27_r110565/other</th>
|
|
358
|
+
<th class="num">2026-05-28_r110600/opaque</th>
|
|
359
|
+
<th class="num">2026-05-28_r110600/prepass</th>
|
|
360
|
+
<th class="num">2026-05-28_r110600/shadow</th>
|
|
361
|
+
<th class="num">2026-05-28_r110600/translucent</th>
|
|
362
|
+
<th class="num">2026-05-28_r110600/additive</th>
|
|
363
|
+
<th class="num">2026-05-28_r110600/decal</th>
|
|
364
|
+
<th class="num">2026-05-28_r110600/ui</th>
|
|
365
|
+
<th class="num">2026-05-28_r110600/postprocess</th>
|
|
366
|
+
<th class="num">2026-05-28_r110600/other</th>
|
|
367
|
+
</tr></thead><tbody>
|
|
368
|
+
<tr>
|
|
369
|
+
<td>District 01</td>
|
|
370
|
+
<td class="num">0</td>
|
|
371
|
+
<td class="num">0</td>
|
|
372
|
+
<td class="num">0</td>
|
|
373
|
+
<td class="num">0</td>
|
|
374
|
+
<td class="num">0</td>
|
|
375
|
+
<td class="num">0</td>
|
|
376
|
+
<td class="num">0</td>
|
|
377
|
+
<td class="num">0</td>
|
|
378
|
+
<td class="num">0</td>
|
|
379
|
+
<td class="num">0</td>
|
|
380
|
+
<td class="num">46</td>
|
|
381
|
+
<td class="num">13</td>
|
|
382
|
+
<td class="num">0</td>
|
|
383
|
+
<td class="num">0</td>
|
|
384
|
+
<td class="num">0</td>
|
|
385
|
+
<td class="num">1</td>
|
|
386
|
+
<td class="num">0</td>
|
|
387
|
+
<td class="num">0</td>
|
|
388
|
+
</tr>
|
|
389
|
+
</tbody></table></rdc-sortable-table></div>
|
|
390
|
+
</body></html>
|