Guide Porchlight CSS

Browser Support

The feature matrix - what Porchlight requires, what degrades, and what is experimental.

52 components 51 stable 1 experimental

Command

Search Porchlight

Browser Support

Porchlight is a modern CSS-first framework. It does not polyfill old browsers. Instead, it uses a tiered strategy: required features for the core, progressive enhancement for newer capabilities, and @supports gating for experimental ones.

Support matrix

TierMeaningStrategy
RequiredThe framework assumes this works.No fallback. Breaks gracefully if unsupported (styles won’t apply).
Baseline-modernSafe in all current-generation browsers (Baseline 2025).Used directly. Part of the framework’s baseline.
Progressive enhancementWorks without it, improves with it.@supports-gated. Component degrades to a simpler but fully functional state.
ExperimentalDemo-quality, not production-ready everywhere.@supports-gated with obvious fallback (static layout).

Required features

These are foundational CSS capabilities that are in the CSS Snapshot 2026 Official Definition. Any browser from 2024+ supports all of them:

FeatureBaselineCSS-2026Used for
Cascade layers (@layer)2024css-cascade-5The entire framework architecture
Custom properties (--var)2023css-variables-1All tokens
:has(), :is(), :where()2024selectors-4Selectors throughout
oklch() color2023css-color-4All color tokens
Logical properties (inline-size, block-start, etc.)2023css-logical-1RTL-aware layout
CSS nesting2024css-nesting-1Source authoring

Baseline-modern features

These are safe to use in production as of mid-2026. All major browsers (Chrome, Edge, Firefox, Safari) support them:

FeatureBaselineCSS-2026Used for
@scope2025⚠️ css-cascade-6 (pre-snapshot)All components (scoped styles without BEM)
light-dark()2024css-color-adjust-1Automatic light/dark color pairs
color-mix()2024css-color-5Derived tints (alert backgrounds, hover states)
Popover API (popover attribute)2024HTML specc-menu (popover-menu) component
@starting-style2024css-transitions-1Dialog and popover enter animations
transition-behavior: allow-discrete2024css-transitions-1Exit animations on display: none elements
:user-invalid / :user-valid2024selectors-4c-field validation states
text-wrap: balance / pretty2024css-text-4Heading and paragraph typography
Container queries (@container)2023css-contain-2Card, data-table responsive behavior
prefers-contrast2022mediaqueries-5Stronger boundaries and focus affordances
@property (Houdini)2024⚠️ pre-snapshotToken type registration (--pl-motion-scale, etc.)

Progressive enhancement features

These features are gated behind @supports. The framework works perfectly without them; they add polish where supported:

FeatureBaselineCSS-2026EnhancementFallback
Anchor Positioning (anchor-name, position-anchor)2025⚠️ pre-snapshotc-menu popover is tethered to its triggerPopover appears centered (UA default)
CSS Gap Decorations (rule, rule-visibility-items)2026⚠️ pre-snapshotGrid dividers via data-dividersNormal grid gap (no divider line)
text-box: trim-both2025css-inline-3Optically-centered button/badge labelsStandard half-leading (1px visual offset)
Typed attr() (attr(data-x type(<color>))2026⚠️ pre-snapshotc-swatch reads color from data-colorInline style attribute
View Transitions2025css-view-transitions-1Smooth cross-page fades on docs siteHard page reload

Experimental features

These are not yet Baseline across all browsers. They are @supports-gated and degrade to a static but functional state. Note that several are in the CSS-2026 Official Definition (their specification is stable) even though implementation is still rolling out:

FeatureChromeCSS-2026EnhancementFallback
interpolate-size: allow-keywords149css-sizing-4Smooth height: auto animationsgrid-template-rows: 0fr -> 1fr technique
Scroll-driven animations (animation-timeline: scroll())149⚠️ pre-snapshotScroll-progress bar fills as you scrollBar hidden (no false progress)
Scroll-driven animations (animation-timeline: view())149⚠️ pre-snapshotElements fade in on scrollElements always visible
field-sizing: content123css-ui-4 / css-sizing-4Textarea grows to fit contentFixed height

Note on @property-registered contrast-color(): While contrast-color() became Baseline in April 2026, MDN warns that mid-tone backgrounds can produce unexpected results. Porchlight keeps explicit paired tokens (--pl-color-accent / --pl-color-accent-text) with WCAG-AA verified contrast, and validates them in the deterministic contrast test suite.

CSS Snapshot 2026 status

The CSS Snapshot 2026 defines what the CSS Working Group considers the “Official Definition” of CSS. Features marked ✅ above are in the snapshot; those marked ⚠️ are beyond it (pre-snapshot or in an earlier stability tier). This does not mean the ⚠️ features are unstable — @scope and @property have shipped in all major browsers — just that their specifications haven’t reached the W3C Candidate Recommendation stage required for inclusion in the snapshot.

Porchlight targets Chrome 149+ and is tested with Playwright, so it can use features that are stable in browsers even if their specs are still maturing through the W3C process.

How degradation works

Every @supports gate follows the same pattern:

/* Base: always applies */
.c-thing {
  /* functional styles */
}

/* Enhancement: only where supported */
@supports (feature: value) {
  .c-thing {
    /* progressive polish */
  }
}

The base styles are always sufficient. The @supports block adds a capability that improves the experience but is not required for functionality.

Testing

Porchlight’s test suite includes:

  • 213 Playwright tests across 17 spec files
  • Contrast tests that compute WCAG ratios from OKLCH values (not axe-core, which cannot parse OKLCH computed colors as of v4.12)
  • Accessibility-mode tests for RTL, forced-colors, prefers-contrast, reduced-motion, and 200% zoom
  • Smoke tests for every preview and docs page