Benchmarks
Compare Master CSS output size, page CSS delivery, and build characteristics with reproducible benchmark fixtures.
Overview
Benchmarks make Master CSS output and delivery costs inspectable. They are useful for understanding tradeoffs, but they are not universal guarantees for every application.
This page is the public benchmark roadmap and results index for Master CSS. Current results stay close to their methodology, and planned work is listed here before it becomes a measured claim.
Benchmark roadmap
| Status | Suite | What it answers |
|---|---|---|
| Available | Page CSS size | How much inline and external CSS do popular documentation pages transfer? |
| Available | CSS output size | How large is generated CSS for shared fixtures across Master CSS and Tailwind CSS? |
| Available | Production build performance | How do cold and repeat production commands compare across Master CSS and Tailwind CSS? |
| Available | CSS structure metrics | How many rules, selectors, declarations, at-rules, layers, and selector-complexity signals explain CSS byte differences? |
| Internal | Build path diagnostics | Which Master CSS build, startup, extraction, and compiler substeps explain full command cost? |
| Available | Browser CSS cost | How does CSS rule volume affect stylesheet parsing, style calculation, layout, paint, and long tasks with fixed DOM, and how does DOM scaling behave as a fixed-CSS control? |
| Available | Master CSS delivery modes | What are the initial payload, browser load, runtime bootstrap, and progressive adoption costs of static, runtime, and progressive delivery? |
| Available | Interaction cost | How expensive are class toggles, rule generation, DOM insertion/removal, theme switches, and resize-triggered recalculation? |
| Internal | Runtime mutation diagnostics | Which MutationObserver and ensure/delete rule substeps explain cleanup-cycle cost in runtime and progressive modes? |
| Internal | Browser lifecycle and INP-style interactions | Does a small runtime plus fewer generated CSS rules reduce style recalculation, route, and long-session interaction cost enough to offset runtime work? |
| Research | Tailwind CSS runtime-equivalent comparisons | Tailwind CSS is build-time-first, so runtime claims must be limited to comparable browser CSS costs. |
The benchmark target is reproducible comparison, not a single universal score. Each result should include the fixture, command, package versions, machine/browser, sample count, and known limits.
Benchmark guardrails
Benchmarks on this page are advisory. They are meant to make tradeoffs inspectable, not to promise the same result for every application, browser, machine, CDN, or framework integration.
Before a performance or size number becomes a public result, the fixture must first pass correctness checks: rendered output should match the intended UI, computed styles should cover critical assertions, generated output should be attributable to the fixture, and missing-rule checks should fail loudly.
Every published result should include package versions, command, fixture, adapter, machine, operating system, browser version when relevant, warmup and measured rounds, cache mode, viewport/device scale, and known limits. Cold-cache and warm-cache runs should be separated whenever cache behavior changes the interpretation.
No benchmark result is permission to change CSS output, cascade order, hydration behavior, runtime behavior, extraction behavior, or public APIs. If a benchmark exposes a real hot path, the fix still needs the owning package's normal tests and compatibility review.
Current evidence and remaining gap
The current benchmark set already answers the first part of the browser-rendering question. Static comparison snapshots record generated rule, selector, declaration, layer, at-rule, and byte counts. The browser CSS cost suite separately isolates a fixed DOM while deterministic external CSS grows from small to xlarge rule volumes, then records Chromium style recalculation, layout, and paint.
The delivery-mode and interaction suites add the Master CSS runtime side of the question. They measure HTML, CSS, runtime JavaScript, manifest payloads, runtime bootstrap, observe/hydrate time, runtime generated rule count, style raw bytes, post-load class toggles, new-rule generation, DOM append/remove, theme switching, viewport resize, and cleanup cycles. Tailwind CSS remains a static browser-control variant in those suites, not a runtime-equivalent comparison.
Internal runtime diagnostics have also localized one important interaction hotspot: cleanup-cycle cost was dominated by browser style invalidation from runtime stylesheet changes and retained generated stylesheet volume, while MutationObserver delivery and ensureClassRules/deleteClassRules instrumentation were measurable but not the primary cost in that diagnostic run.
The remaining public gap is lifecycle evidence. The browser lifecycle suite now has a committed internal snapshot refreshed from a 2026-06-30 review-grade all-scenario baseline, but this page should not yet claim that runtime rendering produces better real-user interaction performance overall. Segmented five-minute long-session evidence now has committed curated evidence across Master static, runtime, progressive, and Tailwind static browser-control modes; public conclusions still require repeated review and presentation.
Current result: Page CSS size
The current page CSS size benchmark compares the CSS transferred by several official documentation sites. It counts both inline style tags and external stylesheets discovered in the initial HTML response.
Master CSS keeps this documentation site's page CSS around 6 kB with brotli compression because progressive rendering emits only the rules required by the page. The Master CSS segment is the generated style#master-css; Other inline covers non-Master inline style tags; External CSS covers linked stylesheets.
The page CSS size snapshot is generated from benchmarks/docs-page-css-size. It fetches each documentation page, parses the initial HTML, follows link[rel*="stylesheet"], and records raw and brotli-compressed byte counts.
Current result: Static CSS output, structure, and production build
The current Tailwind CSS comparison uses equivalent static fixtures for Master CSS and Tailwind CSS v4. It reports generated CSS artifact size, AST-derived CSS structure metrics, and full production command elapsed time for CLI and Vite setups.
Snapshot summary
This curated snapshot is generated from css-output-size, build-performance, and css-structure on Apple M3 Max with Node v24.15.0. View the committed snapshot data.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 4 | |
| CSS output | 4/4 | fixtures where Master CSS is smaller than Tailwind CSS by brotli bytes in the CLI setup |
| Build command | 4/4 | fixtures where Tailwind CSS has the lower cold production command median in the CLI setup |
| Build samples | 3 | measured command rounds per variant |
| CSS structure | AST | rules, selectors, declarations, layers, at-rules, and selector scores are parsed from generated CSS |
Representative fixture
The primary charts show the docs fixture so the visual comparison stays focused. This fixture represents a dense article and documentation layout with navigation, code blocks, and tables.
The primary charts compare Master CSS and Tailwind CSS using CLI output so the headline view stays focused on static artifact output. CLI setup means Master CSS static CLI versus Tailwind CSS CLI. Vite setup data remains available in the expanded detail tables.
Brotli CSS output
Master CSS versus Tailwind CSS compressed output for the docs fixture. Lower is smaller generated CSS, not browser style cost.
docs fixture using the CLI setup.Cold production command
Master CSS versus Tailwind CSS full production command timing for the docs fixture. Lower is faster and this is not watch mode.
docs fixture using the CLI setup.CSS structure
Master CSS versus Tailwind CSS declaration counts for the docs fixture. These AST-derived metrics are structure signals, not browser style-calculation timings.
docs fixture from a CSS AST parse.Complete data tables
The tables keep every measured fixture and both CLI/Vite setup variants for verification.
CSS bytes
Raw, gzip, and brotli byte counts for each generated CSS artifact.
| Fixture | Variant | Raw | Gzip | Brotli | Files |
|---|---|---|---|---|---|
| Minimal | Master CSS static CLI | 5.1 kB | 1.9 kB | 1.6 kB | 1 |
| Minimal | Master CSS static Vite | 5.1 kB | 1.9 kB | 1.6 kB | 1 |
| Minimal | Tailwind CSS CLI | 9.2 kB | 2.6 kB | 2.2 kB | 1 |
| Minimal | Tailwind CSS Vite | 7.7 kB | 2.4 kB | 2.1 kB | 1 |
| Docs | Master CSS static CLI | 5.8 kB | 2.2 kB | 1.8 kB | 1 |
| Docs | Master CSS static Vite | 5.8 kB | 2.2 kB | 1.8 kB | 1 |
| Docs | Tailwind CSS CLI | 12.0 kB | 3.0 kB | 2.6 kB | 1 |
| Docs | Tailwind CSS Vite | 10.0 kB | 2.8 kB | 2.4 kB | 1 |
| Dashboard | Master CSS static CLI | 6.0 kB | 2.1 kB | 1.8 kB | 1 |
| Dashboard | Master CSS static Vite | 6.0 kB | 2.1 kB | 1.8 kB | 1 |
| Dashboard | Tailwind CSS CLI | 10.5 kB | 2.8 kB | 2.4 kB | 1 |
| Dashboard | Tailwind CSS Vite | 8.7 kB | 2.6 kB | 2.3 kB | 1 |
| Stress CSS | Master CSS static CLI | 11.7 kB | 3.1 kB | 2.1 kB | 1 |
| Stress CSS | Master CSS static Vite | 11.7 kB | 3.1 kB | 2.1 kB | 1 |
| Stress CSS | Tailwind CSS CLI | 17.1 kB | 3.7 kB | 2.5 kB | 1 |
| Stress CSS | Tailwind CSS Vite | 12.7 kB | 3.4 kB | 2.3 kB | 1 |
Production build
Median elapsed time for cold and repeat production commands.
| Fixture | Variant | Cold median | Repeat median | Samples |
|---|---|---|---|---|
| Minimal | Master CSS static CLI | 182 ms | 179 ms | 3 |
| Minimal | Master CSS static Vite | 276 ms | 253 ms | 3 |
| Minimal | Tailwind CSS CLI | 95.1 ms | 93.4 ms | 3 |
| Minimal | Tailwind CSS Vite | 160 ms | 163 ms | 3 |
| Docs | Master CSS static CLI | 194 ms | 188 ms | 3 |
| Docs | Master CSS static Vite | 265 ms | 266 ms | 3 |
| Docs | Tailwind CSS CLI | 96.3 ms | 95.0 ms | 3 |
| Docs | Tailwind CSS Vite | 162 ms | 163 ms | 3 |
| Dashboard | Master CSS static CLI | 192 ms | 186 ms | 3 |
| Dashboard | Master CSS static Vite | 268 ms | 269 ms | 3 |
| Dashboard | Tailwind CSS CLI | 95.8 ms | 93.7 ms | 3 |
| Dashboard | Tailwind CSS Vite | 165 ms | 163 ms | 3 |
| Stress CSS | Master CSS static CLI | 209 ms | 203 ms | 3 |
| Stress CSS | Master CSS static Vite | 282 ms | 279 ms | 3 |
| Stress CSS | Tailwind CSS CLI | 96.6 ms | 96.2 ms | 3 |
| Stress CSS | Tailwind CSS Vite | 166 ms | 163 ms | 3 |
CSS structure table
Rule, selector, declaration, at-rule, layer, and selector-shape counts parsed from generated CSS artifacts.
| Fixture | Variant | Rules | Selectors | Declarations | Custom properties | At-rules | Layer blocks | Unlayered rules | Combinators | Max specificity | Max complexity |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Minimal | Master CSS static CLI | 84 | 135 | 124 | 11 | 5 | 3 | 1 | 0 | 11 | 2 |
| Minimal | Master CSS static Vite | 84 | 135 | 124 | 11 | 5 | 3 | 1 | 0 | 11 | 2 |
| Minimal | Tailwind CSS CLI | 86 | 131 | 174 | 41 | 13 | 4 | 1 | 3 | 10 | 9 |
| Minimal | Tailwind CSS Vite | 99 | 132 | 199 | 41 | 12 | 4 | 1 | 3 | 10 | 9 |
| Docs | Master CSS static CLI | 98 | 149 | 142 | 14 | 6 | 3 | 1 | 0 | 11 | 2 |
| Docs | Master CSS static Vite | 98 | 149 | 142 | 14 | 6 | 3 | 1 | 0 | 11 | 2 |
| Docs | Tailwind CSS CLI | 102 | 147 | 226 | 56 | 25 | 4 | 1 | 3 | 10 | 9 |
| Docs | Tailwind CSS Vite | 116 | 149 | 251 | 56 | 23 | 4 | 1 | 3 | 10 | 9 |
| Dashboard | Master CSS static CLI | 103 | 154 | 147 | 15 | 5 | 3 | 1 | 0 | 20 | 2 |
| Dashboard | Master CSS static Vite | 103 | 154 | 147 | 15 | 5 | 3 | 1 | 0 | 20 | 2 |
| Dashboard | Tailwind CSS CLI | 106 | 151 | 195 | 42 | 13 | 4 | 1 | 3 | 10 | 9 |
| Dashboard | Tailwind CSS Vite | 118 | 151 | 220 | 42 | 12 | 4 | 1 | 3 | 20 | 9 |
| Stress CSS | Master CSS static CLI | 316 | 367 | 364 | 20 | 5 | 3 | 1 | 0 | 11 | 2 |
| Stress CSS | Master CSS static Vite | 316 | 367 | 364 | 20 | 5 | 3 | 1 | 0 | 11 | 2 |
| Stress CSS | Tailwind CSS CLI | 300 | 345 | 369 | 28 | 11 | 4 | 1 | 3 | 10 | 9 |
| Stress CSS | Tailwind CSS Vite | 312 | 346 | 393 | 28 | 10 | 4 | 1 | 3 | 10 | 9 |
These numbers do not measure browser parsing, style recalculation, layout, paint, interaction cost, watch mode, or HMR. CSS structure metrics explain generated output shape; they are not browser timing metrics. Tailwind CSS and Master CSS fixtures target equivalent rendered UI intent, not identical class strings.
Current result: Browser CSS cost
The browser CSS cost benchmark uses local fixture pages, deterministic external CSS, Playwright, and Chromium tracing. It is a browser-only calibration suite, not a Master CSS versus Tailwind CSS comparison.
Snapshot summary
This curated snapshot is generated from browser-css-cost. It keeps the CSS and DOM axes separate so later delivery-mode results can explain whether a cost comes from upfront rule volume, DOM size, or runtime work.
| Metric | Value | Detail |
|---|---|---|
| CSS levels | 4 | fixed visible DOM while deterministic external CSS grows |
| Largest CSS | 45.6 kB | 90,042 declarations in the warm-cache xlarge-css variant |
| DOM controls | 3 | fixed CSS while repeated DOM items grow |
| Largest DOM | 21,012 | measured DOM nodes in the warm-cache large-dom variant |
| Browser | Chromium 149.0.7827.55 | headless browser used for the committed trace snapshot |
| Trace samples | 3 | measured browser rounds per warm-cache variant |
CSS rule volume
The primary curve keeps visible DOM fixed and varies deterministic external CSS rule volume. The charts show warm-cache median Chromium trace timings for style recalculation, layout, and paint.
Style recalculation
Warm-cache medianLayout
Warm-cache medianPaint
Warm-cache medianDOM scaling control
The secondary control keeps CSS fixed and increases repeated DOM items. This helps separate DOM, style, and layout scaling from CSS payload size.
Style recalculation
Warm-cache medianLayout
Warm-cache medianPaint
Warm-cache medianBrowser cost data table
The complete table includes cold-cache and warm-cache variants for both axes.
| Axis | Variant | Cache | CSS brotli | Rules | Declarations | DOM nodes | Style recalc | Layout | Paint | Samples |
|---|---|---|---|---|---|---|---|---|---|---|
| CSS volume | Small CSS | Cold cache | 1.6 kB | 263 | 792 | 205 | 0.6 ms | 4.1 ms | 1.1 ms | 3 |
| CSS volume | Small CSS | Warm cache | 1.6 kB | 263 | 792 | 205 | 0.5 ms | 1 ms | 0.6 ms | 3 |
| CSS volume | Medium CSS | Cold cache | 5.4 kB | 2,513 | 7,542 | 205 | 0.9 ms | 4.1 ms | 1.1 ms | 3 |
| CSS volume | Medium CSS | Warm cache | 5.4 kB | 2,513 | 7,542 | 205 | 0.4 ms | 1 ms | 0.7 ms | 3 |
| CSS volume | Large CSS | Cold cache | 16.4 kB | 10,013 | 30,042 | 205 | 1.9 ms | 4.1 ms | 1 ms | 3 |
| CSS volume | Large CSS | Warm cache | 16.4 kB | 10,013 | 30,042 | 205 | 0.4 ms | 1 ms | 0.6 ms | 3 |
| CSS volume | XLarge CSS | Cold cache | 45.6 kB | 30,013 | 90,042 | 205 | 3.9 ms | 3.9 ms | 1.1 ms | 3 |
| CSS volume | XLarge CSS | Warm cache | 45.6 kB | 30,013 | 90,042 | 205 | 0.5 ms | 1 ms | 0.6 ms | 3 |
| DOM scaling | Small DOM | Cold cache | 0.5 kB | 15 | 50 | 712 | 1.2 ms | 5.3 ms | 2 ms | 3 |
| DOM scaling | Small DOM | Warm cache | 0.5 kB | 15 | 50 | 712 | 1.1 ms | 2.1 ms | 1.4 ms | 3 |
| DOM scaling | Medium DOM | Cold cache | 0.5 kB | 15 | 50 | 7,012 | 8.1 ms | 24.6 ms | 6.2 ms | 3 |
| DOM scaling | Medium DOM | Warm cache | 0.5 kB | 15 | 50 | 7,012 | 8 ms | 19.9 ms | 5.7 ms | 3 |
| DOM scaling | Large DOM | Cold cache | 0.5 kB | 15 | 50 | 21,012 | 23.4 ms | 69 ms | 13.8 ms | 3 |
| DOM scaling | Large DOM | Warm cache | 0.5 kB | 15 | 50 | 21,012 | 23.1 ms | 63 ms | 13.7 ms | 3 |
These numbers do not measure runtime rule generation, interaction mutation cost, HMR, real application JavaScript, Firefox, WebKit, CDN behavior, or public real-world page variance. Chromium trace event names can change across browser versions, so browser-cost conclusions should be read with the fixture source, package versions, browser version, sample count, and committed snapshot data.
Current result: Master CSS delivery modes
The Master CSS delivery modes benchmark compares initial payload, local Chromium load cost, runtime bootstrap, manifest loading, and progressive adoption across Master CSS static, runtime, progressive, and Tailwind CSS static variants.
Snapshot summary
This curated snapshot is generated from master-delivery-modes. It uses the static fixture set and reports local Chromium medians beside payload bytes and delivered CSS structure.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 4 | static fixture set measured across every delivery mode |
| Modes | 4 | Master static, runtime, progressive, and Tailwind static |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Trace samples | 3 | measured browser rounds per variant |
| Progressive adoption | 4/4 | fixtures where progressive runtime adopted server-rendered CSS |
Representative fixture
The primary charts show the docs fixture so the visual comparison stays focused on a dense article and documentation layout.
Initial payload
Payload composition includes HTML, external CSS, inline CSS, runtime JavaScript, manifest JSON, and progressive hydration manifest bytes. Values use brotli compression.
docs fixture.Browser load
Load timing charts show local Chromium medians for navigation-ready, style recalculation, layout, and paint.
Navigation to ready
MedianStyle recalculation
MedianLayout
MedianPaint
Mediandocs fixture.Runtime bootstrap
Runtime bootstrap and observe timings apply to Master runtime and progressive modes.
Runtime bootstrap
MedianRuntime observe
Mediandocs fixture.Complete data table
The full table keeps every measured fixture and delivery mode for verification.
| Fixture | Mode | Payload | HTML | External CSS | Inline CSS | Runtime JS | Manifest JSON | Hydration manifest | Rules | Declarations | Navigation ready | Style recalc | Layout | Paint | Runtime bootstrap | Runtime observe | Progressive adopted |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Minimal | Master CSS static | 2.3 kB | 0.7 kB | 1.6 kB | 0 kB | 0 kB | 0 kB | 0 kB | 84 | 124 | 23.6 ms | 0.7 ms | 6.5 ms | 1 ms | 0 ms | 0 ms | 0 |
| Minimal | Master CSS runtime | 33.7 kB | 1.1 kB | 0 kB | 0 kB | 22.7 kB | 9.9 kB | 0 kB | 0 | 0 | 38.6 ms | 0.7 ms | 3.8 ms | 0.5 ms | 14 ms | 5.8 ms | 0 |
| Minimal | Master CSS progressive | 36.9 kB | 2.6 kB | 0 kB | 0.6 kB | 22.7 kB | 9.9 kB | 1.1 kB | 46 | 56 | 32.4 ms | 0.5 ms | 3.7 ms | 0.6 ms | 15.9 ms | 1.5 ms | 1 |
| Minimal | Tailwind CSS static | 2.9 kB | 0.7 kB | 2.2 kB | 0 kB | 0 kB | 0 kB | 0 kB | 86 | 174 | 20.8 ms | 0.9 ms | 6.5 ms | 0.8 ms | 0 ms | 0 ms | 0 |
| Docs | Master CSS static | 3 kB | 1.2 kB | 1.8 kB | 0 kB | 0 kB | 0 kB | 0 kB | 98 | 142 | 23.7 ms | 1 ms | 8.2 ms | 1.5 ms | 0 ms | 0 ms | 0 |
| Docs | Master CSS runtime | 34.2 kB | 1.6 kB | 0 kB | 0 kB | 22.7 kB | 9.9 kB | 0 kB | 0 | 0 | 40.5 ms | 1 ms | 4.8 ms | 1 ms | 14.9 ms | 6.4 ms | 0 |
| Docs | Master CSS progressive | 38.6 kB | 3.6 kB | 0 kB | 0.9 kB | 22.7 kB | 9.9 kB | 1.6 kB | 60 | 74 | 43.3 ms | 0.7 ms | 5 ms | 1 ms | 19.9 ms | 3 ms | 1 |
| Docs | Tailwind CSS static | 3.7 kB | 1.1 kB | 2.6 kB | 0 kB | 0 kB | 0 kB | 0 kB | 102 | 226 | 24.5 ms | 1.3 ms | 9.3 ms | 1.4 ms | 0 ms | 0 ms | 0 |
| Dashboard | Master CSS static | 2.9 kB | 1.1 kB | 1.8 kB | 0 kB | 0 kB | 0 kB | 0 kB | 103 | 147 | 26 ms | 10.9 ms | 3.3 ms | 1.8 ms | 0 ms | 0 ms | 0 |
| Dashboard | Master CSS runtime | 34.2 kB | 1.6 kB | 0 kB | 0 kB | 22.7 kB | 9.9 kB | 0 kB | 0 | 0 | 41.7 ms | 7.5 ms | 2.8 ms | 1.1 ms | 14.1 ms | 6.4 ms | 0 |
| Dashboard | Master CSS progressive | 38.4 kB | 3.5 kB | 0 kB | 0.8 kB | 22.7 kB | 9.9 kB | 1.5 kB | 66 | 80 | 38.4 ms | 8.1 ms | 2.7 ms | 1.2 ms | 18.9 ms | 3.1 ms | 1 |
| Dashboard | Tailwind CSS static | 3.5 kB | 1.1 kB | 2.4 kB | 0 kB | 0 kB | 0 kB | 0 kB | 106 | 195 | 24.8 ms | 10.9 ms | 3 ms | 1.5 ms | 0 ms | 0 ms | 0 |
| Stress CSS | Master CSS static | 3.5 kB | 1.5 kB | 2.1 kB | 0 kB | 0 kB | 0 kB | 0 kB | 316 | 364 | 24.2 ms | 1.8 ms | 7.3 ms | 1.4 ms | 0 ms | 0 ms | 0 |
| Stress CSS | Master CSS runtime | 34.5 kB | 1.9 kB | 0 kB | 0 kB | 22.7 kB | 9.9 kB | 0 kB | 0 | 0 | 44.9 ms | 1.6 ms | 4.4 ms | 0.9 ms | 19 ms | 11.6 ms | 0 |
| Stress CSS | Master CSS progressive | 41.3 kB | 5.2 kB | 0 kB | 1.1 kB | 22.7 kB | 9.9 kB | 2.4 kB | 279 | 297 | 35.2 ms | 1.5 ms | 4.5 ms | 1 ms | 19.7 ms | 2.1 ms | 1 |
| Stress CSS | Tailwind CSS static | 4 kB | 1.5 kB | 2.5 kB | 0 kB | 0 kB | 0 kB | 0 kB | 300 | 369 | 25.6 ms | 2.4 ms | 7.5 ms | 1.2 ms | 0 ms | 0 ms | 0 |
These numbers measure initial local fixture loads only. They do not measure post-load mutation, route transitions, HMR, dev workflow, Vite injection cost, CDN behavior, Firefox, WebKit, or public real-world page variance. Master static and Tailwind static use CLI-generated CSS from equivalent rendered fixture intent, not identical class strings.
Current result: Interaction cost
The interaction cost benchmark measures post-load user-facing changes in local Chromium: class toggles, runtime rule generation, DOM append/remove, theme switches, viewport resize, and repeated mutation cleanup.
Snapshot summary
This curated snapshot is generated from interaction-cost. It uses dynamic, dashboard, and stress-dom fixtures across supported Master CSS static, runtime, progressive, and Tailwind CSS static variants.
| Metric | Value | Detail |
|---|---|---|
| Fixtures | 3 | dynamic, dashboard, and stress-dom interaction fixtures |
| Variants | 54 | supported fixture, mode, and scenario combinations |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Samples | 1 | measured rounds per default interaction variant |
| Progressive adoption | 3/3 | fixtures with at least one adopted progressive interaction variant |
Representative fixture
The primary charts show the dynamic fixture because it covers class toggles, new-rule generation, DOM mutation, and cleanup-cycle behavior.
Mutation readiness
Mutation-ready timing is measured from the interaction start until the page completes the post-mutation settle frame and correctness assertions.
Existing class toggle
Mutation-ready medianNew class toggle
Mutation-ready medianDOM append/remove
Mutation-ready mediandynamic fixture scenarios.Runtime update cost
Runtime update charts isolate Master runtime/progressive stylesheet work during interaction scenarios.
Existing class runtime update
Runtime mutation medianNew class runtime update
Runtime mutation medianCleanup-cycle runtime update
Runtime mutation mediandynamic fixture scenarios.Complete data table
The full table keeps every supported fixture, mode, and scenario combination for verification.
| Fixture | Scenario | Mode | Ready | Runtime update | Rule delta | Style byte delta | Style recalc | Layout | Paint | DOM nodes | Affected | Computed style | Cleanup | Progressive adopted | Samples |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dynamic | Existing class toggle | Master CSS static | 27.6 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Existing class toggle | Master CSS runtime | 22.2 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Existing class toggle | Master CSS progressive | 23.3 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Existing class toggle | Tailwind CSS static | 28.3 ms | 0 ms | 0 | 0 kB | 0.4 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | New class toggle | Master CSS runtime | 32.8 ms | 0.1 ms | 1 | 0.1 kB | 0.7 ms | 0 ms | 1.5 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | New class toggle | Master CSS progressive | 24.6 ms | 0.7 ms | 1 | 0 kB | 0.8 ms | 0 ms | 0.6 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | DOM append/remove | Master CSS static | 28.2 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 308 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | DOM append/remove | Master CSS runtime | 21.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 309 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | DOM append/remove | Master CSS progressive | 27.7 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 310 | 48 | 1 | 1 | 1 | 1 |
| Dynamic | DOM append/remove | Tailwind CSS static | 27.1 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 308 | 48 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS static | 28.6 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS runtime | 20.5 ms | 0.1 ms | 1 | 0.1 kB | 0.5 ms | 0 ms | 0.4 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Theme switch | Master CSS progressive | 24.5 ms | 0.4 ms | 1 | 0 kB | 0.5 ms | 0 ms | 0.4 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Theme switch | Tailwind CSS static | 28.1 ms | 0 ms | 0 | 0 kB | 0.4 ms | 0 ms | 0.4 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS static | 60.5 ms | 0 ms | 0 | 0 kB | 0.5 ms | 0.8 ms | 0.9 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS runtime | 54.7 ms | 0 ms | 0 | 0 kB | 0.2 ms | 0.8 ms | 0.9 ms | 309 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Viewport resize | Master CSS progressive | 59 ms | 0 ms | 0 | 0 kB | 0.2 ms | 0.8 ms | 0.9 ms | 310 | 64 | 1 | 1 | 1 | 1 |
| Dynamic | Viewport resize | Tailwind CSS static | 61.6 ms | 0 ms | 0 | 0 kB | 0.3 ms | 0.9 ms | 0.9 ms | 308 | 64 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS static | 161.3 ms | 0 ms | 0 | 0 kB | 1.1 ms | 1.5 ms | 3.7 ms | 308 | 192 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS runtime | 154.5 ms | 0.2 ms | 2 | 0.1 kB | 1.8 ms | 1.4 ms | 3.6 ms | 309 | 192 | 1 | 1 | 0 | 1 |
| Dynamic | Mutation cleanup cycle | Master CSS progressive | 157.7 ms | 0.9 ms | 2 | 0 kB | 1.7 ms | 1.4 ms | 3.6 ms | 310 | 192 | 1 | 1 | 1 | 1 |
| Dynamic | Mutation cleanup cycle | Tailwind CSS static | 160.9 ms | 0 ms | 0 | 0 kB | 1.3 ms | 1.4 ms | 3.8 ms | 308 | 192 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS static | 26.2 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.7 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS runtime | 29 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.9 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Existing class toggle | Master CSS progressive | 23.4 ms | 0 ms | 0 | 0 kB | 0.7 ms | 0 ms | 0.8 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Existing class toggle | Tailwind CSS static | 27.3 ms | 0 ms | 0 | 0 kB | 0.9 ms | 0 ms | 0.8 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS static | 33.3 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 980 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS runtime | 27.1 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 981 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | DOM append/remove | Master CSS progressive | 21.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 982 | 80 | 1 | 1 | 1 | 1 |
| Dashboard | DOM append/remove | Tailwind CSS static | 27.8 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 980 | 80 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS static | 28.7 ms | 0 ms | 0 | 0 kB | 0.6 ms | 0 ms | 0.8 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS runtime | 26.9 ms | 0.1 ms | 1 | 0.1 kB | 1 ms | 0 ms | 0.8 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Theme switch | Master CSS progressive | 26.6 ms | 0.4 ms | 1 | 0 kB | 1 ms | 0 ms | 0.7 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Theme switch | Tailwind CSS static | 25 ms | 0 ms | 0 | 0 kB | 0.8 ms | 0 ms | 0.5 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS static | 61.5 ms | 0 ms | 0 | 0 kB | 0.3 ms | 2.2 ms | 1.7 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS runtime | 54.5 ms | 0 ms | 0 | 0 kB | 0.2 ms | 2.2 ms | 1.6 ms | 981 | 160 | 1 | 1 | 0 | 1 |
| Dashboard | Viewport resize | Master CSS progressive | 55.1 ms | 0 ms | 0 | 0 kB | 0.2 ms | 2.1 ms | 1.7 ms | 982 | 160 | 1 | 1 | 1 | 1 |
| Dashboard | Viewport resize | Tailwind CSS static | 56.3 ms | 0 ms | 0 | 0 kB | 0.3 ms | 2.1 ms | 1.9 ms | 980 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS static | 25.1 ms | 0 ms | 0 | 0 kB | 2.2 ms | 0 ms | 1.1 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS runtime | 25.9 ms | 0 ms | 0 | 0 kB | 2.2 ms | 0 ms | 1.1 ms | 3,621 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Existing class toggle | Master CSS progressive | 29.6 ms | 0 ms | 0 | 0 kB | 2.2 ms | 0 ms | 1.1 ms | 3,622 | 600 | 1 | 1 | 1 | 1 |
| Stress DOM | Existing class toggle | Tailwind CSS static | 24.8 ms | 0 ms | 0 | 0 kB | 3.1 ms | 0 ms | 0.9 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS static | 26.4 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,620 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS runtime | 26.7 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,621 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | DOM append/remove | Master CSS progressive | 22.5 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,622 | 160 | 1 | 1 | 1 | 1 |
| Stress DOM | DOM append/remove | Tailwind CSS static | 26.9 ms | 0 ms | 0 | 0 kB | 0 ms | 0 ms | 0 ms | 3,620 | 160 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS static | 61.7 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.8 ms | 3.4 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS runtime | 59.5 ms | 0 ms | 0 | 0 kB | 0.5 ms | 7.7 ms | 3.4 ms | 3,621 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Viewport resize | Master CSS progressive | 61.7 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.8 ms | 3.5 ms | 3,622 | 600 | 1 | 1 | 1 | 1 |
| Stress DOM | Viewport resize | Tailwind CSS static | 57 ms | 0 ms | 0 | 0 kB | 0.4 ms | 7.2 ms | 3.7 ms | 3,620 | 600 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS static | 125 ms | 0 ms | 0 | 0 kB | 2 ms | 2.8 ms | 9.3 ms | 3,620 | 480 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS runtime | 129.9 ms | 0.2 ms | 2 | 0.1 kB | 6.9 ms | 3.1 ms | 9.7 ms | 3,621 | 480 | 1 | 1 | 0 | 1 |
| Stress DOM | Mutation cleanup cycle | Master CSS progressive | 126.2 ms | 1 ms | 2 | 0 kB | 7.1 ms | 2.9 ms | 9.5 ms | 3,622 | 480 | 1 | 1 | 1 | 1 |
| Stress DOM | Mutation cleanup cycle | Tailwind CSS static | 127.4 ms | 0 ms | 0 | 0 kB | 2.5 ms | 2.8 ms | 9.5 ms | 3,620 | 480 | 1 | 1 | 0 | 1 |
These numbers measure local Chromium post-load fixture interactions only. They do not measure route transitions, HMR, dev workflow, CDN behavior, Firefox, WebKit, or public real-world application variance. Tailwind CSS static variants are browser controls for style/layout/paint work; they do not have a client-side runtime rule-generation equivalent.
Fixture matrix
Future fixture-based suites should use equivalent UI output rather than identical class strings.
| Fixture | Purpose | Expected stress |
|---|---|---|
minimal | Small useful page or landing section | Framework overhead, cold-start cost, and minimum payload |
docs | Dense article, navigation, code blocks, tables | Real documentation layout, typography, and nested content |
dashboard | Repeated cards, tables, filters, charts, states | Rule reuse, duplicated utilities, and large DOM |
dynamic | Insert, remove, and toggle classes during interaction | Runtime mutation, extraction limits, and recalculation cost |
stress-css | Controlled small, medium, and large CSS outputs | Browser style calculation as CSS volume grows |
stress-dom | Large DOM with fixed CSS | DOM/style/layout scaling isolated from CSS output size |
Each fixture should publish source markup, Master CSS setup, Tailwind CSS setup, generated outputs, and the exact commands used to produce results.
Metrics
| Area | Metrics |
|---|---|
| Transfer | Raw, gzip, and brotli bytes for CSS, HTML, runtime JS, manifest JSON, hydration manifest, request count, cacheability |
| CSS structure | Rule count, declaration count, selector count, cascade layers, media/container/support blocks, custom properties, selector complexity |
| DOM | DOM node count, affected element count, average class count per element where stable |
| Runtime JavaScript | Runtime bootstrap, observe/hydrate, rule generation, insert/delete rule work, MutationObserver callback count and duration |
| Build | Cold build, warm rebuild, changed-file rebuild cost, startup diagnostics, scanner time |
| Browser load | CSS rule-volume curve with fixed DOM, fixed-CSS DOM scaling control, stylesheet parse/attach, style recalculation, layout, paint, long tasks, memory where stable |
| Interaction | Class toggle cost, new-rule generation, existing-rule toggle, DOM append/remove, theme switch, viewport/container resize |
| Lifecycle | Route navigation, CSSOM growth, retained generated rule volume, long-session memory, GC pressure where Chromium exposes stable signals |
| User metrics | FCP, LCP, and INP-style interaction latency when local fixture variance is low enough to explain |
| Correctness | Output hash, screenshot smoke, computed-style assertions, missing-rule checks, generated file inventory |
| Payload | Runtime bundle, manifest JSON, hydration manifest, inline style#master-css, external CSS, per-route HTML variance |
Browser timings should be measured with fixed viewport, device scale, browser version, warmup rounds, and measured rounds. Chromium tracing is the primary public path for browser-cost metrics. These numbers are advisory because browser scheduling, hardware, memory pressure, and cache state affect them.
CSS structure metrics are published beside byte size and production build timing. They explain how generated byte differences relate to rule count, selector count, declaration count, at-rule shape, layer distribution, and selector complexity before browser-cost claims are introduced.
Master CSS delivery modes
| Mode | Benchmark focus |
|---|---|
| Runtime | Bundle size, manifest preload/no-preload, manifest failure fallback, initial DOM scan, CSSOM insertion/deletion, mutation handling, repeated mutation cleanup |
| Static | Generated stylesheet size, source scanning, source include/exclude behavior, safelist/blocklist, warm rebuild, mixed authored CSS |
| Progressive | Inline first-page CSS, hydration manifest size, runtime adoption success/fallback, post-hydration dynamic classes |
Progressive begins with server/build-time CSS in the HTML and adds a runtime handoff, so its benchmark needs both first-response payload metrics and post-hydration mutation metrics.
The delivery-mode suite measures initial payload, local Chromium page load, runtime bootstrap, manifest loading, and progressive style adoption across Master CSS static, runtime, progressive, and Tailwind CSS static variants. It does not measure post-load mutation; those interaction costs stay in the next suite.
Tailwind CSS comparisons
Tailwind CSS comparisons should use pinned Tailwind CSS v4 tooling and official entrypoints:
@tailwindcss/clifor command-line builds.@tailwindcss/vitefor Vite build comparisons.- Tailwind source detection behavior from Detecting classes in source files.
The available Tailwind CSS suites compare static outputs and production build behavior. Runtime claims should be avoided unless the benchmark is explicitly measuring browser CSS cost from static CSS output, because Tailwind CSS does not perform the same client-side class observation work as Master CSS runtime rendering.
Tailwind CSS and Master CSS fixtures should render equivalent UI, but they do not need identical class strings. Setup labels should be explicit: recommended/default setup and utility-only setup are separate results if both are measured. Dynamic-class fixtures should document extraction limits and capability differences separately from raw benchmark wins.
Browser CSS cost
Large CSS can affect the browser even when no JavaScript framework is involved. The browser-cost suite keeps the CSS and DOM axes separate so later delivery-mode comparisons can explain whether a result came from upfront rule volume, DOM size, or runtime work.
Primary: CSS rule volume
The primary calibration keeps visible DOM fixed and varies deterministic external CSS rule volume:
small-css,medium-css,large-css, andxlarge-cssexternal stylesheets.- A fixed repeated DOM item count for every CSS volume level.
- Raw, gzip, and brotli CSS bytes for each volume level.
- Rule, selector, and declaration counts parsed from the generated CSS.
- Initial stylesheet attachment and parse cost.
- Style recalculation, layout, and paint while the visible DOM stays fixed.
- Long tasks where Chromium exposes stable trace data.
This curve is the main input for judging how much upfront CSS a delivery mode asks the browser to load before interaction.
Secondary: DOM scaling control
The stress-dom control stays in the suite, but it answers a different question. It keeps CSS fixed and varies DOM volume:
small-dom,medium-dom, andlarge-domrepeated item counts.- Measured DOM node count after the page reaches the benchmark-ready marker.
- The same fixed CSS bytes and CSS structure metadata for each DOM scale.
- Style recalculation, layout, paint, navigation-ready time, and long tasks while CSS volume stays fixed.
This control is useful for interpreting runtime scan, mutation, route transition, and layout sensitivity later. It is not the main input for comparing CSS delivery modes because delivery modes primarily change when and how many CSS rules are loaded or generated.
This suite uses local fixture pages, Playwright, and browser tracing with fixed viewport, fixed device scale, and disabled unrelated network variance. It reports medians plus raw samples as ignored artifacts, with cold-cache and warm-cache results separated when cache state affects the measurement.
Interaction cost
The interaction-cost suite measures changes users can feel:
- Toggle state classes on many elements.
- Toggle classes that are already represented in CSS versus classes that require new rule generation.
- Insert and remove repeated components.
- Switch light/dark or theme mode.
- Resize viewport and container-query layouts.
- Repeat mutation cycles to catch cleanup and memory issues.
For Master CSS runtime and progressive modes, the suite reports both DOM work and runtime stylesheet work. For static Tailwind CSS output, the comparable measurement is the browser's style/layout/paint cost after the DOM or class change.
The internal runtime mutation diagnostics suite narrows the cleanup-cycle hotspot to dynamic and stress-dom fixtures in Master runtime and progressive modes. It records MutationObserver delivery counts, ensureClassRules/deleteClassRules call shape, temporary class cleanup, retained rule state, and Chromium trace timings so optimization work can target the confirmed source of cost.
Browser lifecycle suite
The internal browser lifecycle suite tests the lifecycle version of the runtime tradeoff: does a small amount of runtime work buy enough reduction in generated CSS rules to lower style recalculation, selector matching proxies, and user-visible interaction latency over time?
This suite should keep Tailwind CSS as a static browser-control setup and Master CSS as static, runtime, and progressive setups. It should publish only measured comparisons that share equivalent rendered UI intent and should keep "INP" labels reserved for measurements that match the platform metric closely enough; otherwise use INP-style interaction latency.
A curated internal snapshot is generated from the all-scenario browser-lifecycle baseline and has been refreshed from the 2026-06-30 review-grade run. Committed five-minute long-session evidence also covers Master static, runtime, progressive, and Tailwind static browser-control modes. A same-machine repeat review has passed coverage, correctness, sample-count, and long-session duration gates, but the suite remains internal until the deltas have final claim and narrative review; the current data should be used for benchmark validation rather than public performance claims.
Internal evidence: Browser lifecycle
This internal evidence summarizes the committed all-scenario snapshot and the committed five-minute segmented long-session evidence. It is not an Available benchmark result, and the latency value remains INP-style interaction latency rather than real Web Vitals INP.
| Metric | Value | Detail |
|---|---|---|
| Snapshot variants | 64 | 7 scenarios across 4 modes |
| Evidence modes | 4/4 | segmented five-minute long-session reports |
| Browser | Chromium 149.0.7827.55 | headless browser used for local trace measurements |
| Long-session samples | 1 | measured five-minute rounds per mode in committed evidence |
| Computed style checks | 4/4 | five-minute evidence variants with computed-style-valid = 1 |
| Progressive adoption | 1/1 | Master progressive long-session evidence variant |
The five-minute evidence keeps Tailwind CSS as a static browser-control mode. It shows local fixture medians for browser work and runtime instrumentation, while selector matching remains an inference from CSSOM/rule volume plus style recalculation.
Style recalculation
Five-minute medianLayout
Five-minute medianPaint
Five-minute medianLong tasks
Five-minute medianCSSOM rules
Five-minute medianRuntime mutation work
Five-minute median| Mode | INP-style latency | Style recalc | Layout | Paint | Long tasks | CSSOM rules | Runtime rules | Runtime mutation | JS heap | Computed style | Progressive adopted | Samples |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Master CSS static | 300,051.7 ms | 13,395.8 ms | 2,823.7 ms | 13,357.1 ms | 28 | 2 | 0 | 0 ms | 1,429.7 kB | 1 | 0 | 1 |
| Master CSS runtime | 300,066.3 ms | 6,773.4 ms | 1,193 ms | 6,006.2 ms | 0 | 0 | 47 | 36.2 ms | 4,121.5 kB | 1 | 0 | 1 |
| Master CSS progressive | 300,059.6 ms | 6,761.9 ms | 1,178.1 ms | 5,975.8 ms | 0 | 0 | 47 | 42.4 ms | 3,527 kB | 1 | 1 | 1 |
| Tailwind CSS static | 300,060.2 ms | 12,101.9 ms | 1,353.6 ms | 6,553.9 ms | 0 | 22 | 0 | 0 ms | 1,798.3 kB | 1 | 0 | 1 |
Lifecycle scenarios
| Scenario | Internal measurement |
|---|---|
| Initial load | Runtime initialization, stylesheet parse/attach, CSSOM creation, FCP, LCP, style recalculation, layout, paint, and long tasks. |
| Large DOM | Start with 1,000, 5,000, and 10,000 node scales before treating 50,000 nodes as publishable; measure style recalculation, layout, paint, and memory where stable. |
| Large append | Add 100, 500, and 1,000 elements before larger counts; separate existing-rule append from new-rule generation. |
| Repeated class toggles | Toggle selected, active, expanded, and hover-equivalent states across many elements and rounds; measure runtime cost and browser recalculation cost separately. |
| Theme switch | Compare class swap, data attribute, and CSS variable variants for light/dark changes. |
| Route navigation | Navigate between home, dashboard, and settings fixtures; track generated CSS growth, retained rules, runtime reparse/observe work, and CSSOM size after each route. |
| Long session | Simulate repeated add, remove, toggle, resize, scroll, and route operations for at least five minutes; track retained rules, memory, long tasks, and GC pressure when Chromium exposes stable signals. |
Lifecycle limits
Selector matching time should remain an inference unless Chromium exposes a stable trace metric for it. CSSOM memory and GC pressure should be reported only when the collection method is stable enough to reproduce on the same browser version. Lifecycle reports should keep raw traces internal and publish curated snapshots only after repeated same-machine runs.
Implementation phases
| Phase | Work |
|---|---|
| 1 | Keep this roadmap updated, add guardrails, and mark the page CSS size benchmark as available. |
| 2 | Add shared fixture manifests, adapter names, normalized report schemas, ignored raw artifacts, and curated JSON/Markdown output. |
| 3 | Available: implement and publish curated CSS output and production build benchmarks for Master CSS static output versus Tailwind CSS CLI/Vite. |
| 4 | Available: publish CSS structure metrics from the curated static comparison snapshot. |
| 5 | Available: implement and publish browser load cost suites with Playwright/browser tracing, correctness checks, and stable fixture pages. |
| 6 | Available: implement and publish Master CSS static, runtime, and progressive delivery benchmarks with local Chromium payload/load/adoption measurements. |
| 7 | Available: implement and publish interaction cost suites with Playwright/browser tracing, correctness checks, and stable fixture pages. |
| 8 | Internal: diagnose runtime mutation cleanup hotspots before optimizing runtime/progressive interaction behavior. |
| 9 | Internal: reduce retained generated stylesheet volume after runtime mutation diagnostics. |
| 10 | Available: refresh the published interaction-cost snapshot after retained stylesheet optimization. |
| 11 | Build: replace stale core TypeScript project references with the @master/css facade project. |
| 12 | Internal: investigated queued runtime stylesheet invalidation and abandoned the runtime optimization path because diagnostics did not show meaningful improvement. |
| 13 | Internal: summarize build path diagnostics across CLI startup, Vite integration, compiler, and extraction substeps. |
| 14 | Planned: decide whether to optimize startup/build path costs or publish a curated public build-path result. |
| 15 | Internal: implement browser lifecycle and INP-style interaction benchmarks for initial load, large DOM, append, repeated toggles, theme switching, route navigation, and long-session behavior; segmented five-minute long-session runs and same-machine repeat review have passed internal gates, and public conclusions wait for final claim and narrative review. |
Future normalized reports should stay internal to the benchmark workspace unless they become a documented public data format. A report should include schemaVersion, suite, generatedAt, environment, packages, fixtures, variants, metrics, samples, summary, limits, and artifacts.
Methodology and limits
Use the raw numbers to inspect source size and the brotli numbers to approximate compressed transfer size. Browser cache state, CDN behavior, JavaScript-loaded styles, fonts, images, and application runtime work are outside the page CSS size snapshot.
Fixture-based benchmark results should be compared on the same machine, with the same package versions, the same browser version, and the same sample settings. Raw benchmark history should stay ignored; only curated snapshots should be committed and rendered publicly.
Real Web Vitals and Lighthouse scores are outside the current benchmark source. The core suites should prefer direct output, build, trace, and interaction measurements that can be tied back to a specific fixture and command.