Releases: Effeilo/browserux.css
v4.0.0
[4.0.0] – 2026-04-20
Why This Is A Major Release
browserux.css started as a single-file CSS foundation. With 4.0.0, it becomes a more structured product: modular public bundles, an explicit build pipeline, stronger contribution guidance, and the start of an automated multi-browser validation workflow.
The historical root entry is still preserved for compatibility, but the package surface, release workflow, and maintenance model are now materially broader than in 3.x. This version signals that architectural shift clearly and marks the transition from "one CSS file" to "a maintained CSS foundation with modular distribution and validation tooling".
Foundation And Behavior Changes
-
Focus fallback strategy
Replaced the global:focus { outline: none; }reset with a safer progressive-enhancement pattern::focusnow provides a visible fallback outline,:focus:not(:focus-visible)removes it after mouse interaction in supporting browsers, and:focus-visiblekeeps the branded keyboard focus ring. This preserves visible focus in browsers that do not support:focus-visiblewhile keeping the intended UX in modern browsers. -
[hidden]compatibility withhidden="until-found"
Refined the defensive hidden rule from a blanket[hidden] { display: none !important; }to[hidden]:where(:not([hidden="until-found"])) { display: none !important; }. This keeps the classic hidden state protected against accidental overrides while preserving the browser's native "hidden until found" behavior for in-page search and fragment navigation. -
Removed global
overscroll-behavior: containfromhtml
overscroll-behaviorremains a useful technique for preventing scroll chaining, but applying it at the page level also changes native browser behaviors such as pull-to-refresh and gesture navigation in some environments. The rule has been removed from the global foundation and is now better understood as a targeted component-level technique.
Distribution And Tooling
-
Modular distribution architecture
Introduced internalsrc/modules/andsrc/entries/layers plus new public bundles indist/(core.css,a11y.css,browser-ui.css,browserux.layer.css). The historical rootbrowserux.cssfile remains the primary public entry point so existing users can keep importing the package exactly as before while advanced users gain finer control. -
Build pipeline for modular releases
Addednpm run buildto regenerate the public bundles indist/fromsrc/entries/and keep the rootbrowserux.cssfile synchronized with the generated full bundle. -
Playwright validation skeleton
Added a Playwright foundation with Chromium, Firefox, and WebKit projects, demo helpers, smoke tests, and npm scripts for future automated browser validation. -
First real automated scenario
Added the first high-priority Playwright scenario forfocus-visible, validating pointer vs keyboard focus behavior on the demo across Chromium, Firefox, and WebKit. -
Additional real automated scenarios
Added four more high-priority Playwright scenarios for:user-valid/:user-invalid,@starting-styleondialog,scrollbar-gutter: stable, andcolor-scheme: light dark. These tests now validate the corresponding demo contracts across Chromium, Firefox, and WebKit using DOM and computed-style assertions that match each engine's observable behavior.
Experimentation And Research
- CSS lab workspace (
lab/browserux.lab.css)
Introduced an internal lab sheet to track promising CSS features that align with the BrowserUX philosophy but are not yet mature enough to ship in the foundation. Each entry documents what the feature does, its current status (watching,trial,ready-soon,migrated,rejected), why it matters for BrowserUX, and the conditions under which it can migrate intobrowserux.css. The lab file is never distributed via npm or the CDN and stays a working document, with a dedicatedlab/README.mddescribing the workflow.
Documentation And Developer Experience
- Updated the focus documentation to explain the new fallback strategy and why it is safer for a published CSS foundation.
- Expanded the
[hidden]reference to explain whyhidden="until-found"must be excluded from the defensive reset, in line with the project's learning-oriented role. - Updated the default styles reference to explain why
overscroll-behavioris no longer applied globally and when it should be used intentionally instead. - Added documentation for the new modular bundle architecture, public import paths, and bundle responsibilities.
- Added a dedicated guide for integrating
browserux.layer.csswith CSS Cascade Layers. - Reworked the browser support guide to separate baseline support, progressive enhancements, and limited-support features for a clearer compatibility story.
- Replaced floating GitHub CDN examples with version-pinned npm CDN URLs in the documentation to make installs more reproducible.
- Expanded the comparison guide to include
sanitize.css, classless frameworks such as Pico CSS and Water.css, and complementary tools such as Open Props. - Added a short decision guide to help users choose between
browserux.css, other CSS foundations, and the BrowserUX public bundles. - Added stack-specific integration recipes for plain HTML, Vite, React, Vue, Astro, and Next.js.
- Clarified the distinction between the neutral foundation layers and the more opinionated BrowserUX layer across the modular bundle documentation.
- Structured contribution guidance with a root
CONTRIBUTING.md, a clearer contribution workflow, and GitHub issue and pull request templates. - Added a demo validation matrix to map BrowserUX features to stable demo targets, verification styles, and automation priorities.
- Added a Playwright setup guide covering dependency installation, browser installation, base URL usage, and the initial local validation workflow.
- Reworked the inline comments across
browserux.cssand the modular sources using thefront-commentsClaude Code skill (Effeilo/claude-code-frontend-skills) for consistent structure, clearer intent, and uniform formatting.
v3.0.0
[3.0.0] – 2026-03-26
✨ Added
Browser adaptation
-
color-scheme: light darkon:root
Instructs the browser to apply its native light/dark defaults for UI elements (scrollbars, form controls, etc.), even before any CSS is parsed. -
interpolate-size: allow-keywordson:root
Enables CSS transitions to and from intrinsic size keywords (auto,min-content,max-content,fit-content) across the entire document. Unlocks native height animations without JavaScript. -
scrollbar-gutter: stableonhtml
Reserves space for the scrollbar gutter even when no scrollbar is shown, preventing layout shifts between pages with and without overflow. Works alongsideoverflow-y: scrollas a fallback. -
overscroll-behavior: containonhtml
Prevents scroll chaining: when a scrollable area reaches its boundary, the viewport no longer scrolls.containpreserves the native elastic/bounce effect on the element itself.
New media query support
-
@media (prefers-reduced-transparency: reduce)
Reduces transparency for users who prefer it. Thedialog::backdropbecomes near-opaque (rgba(0,0,0,0.9)) and the scrollbar background aligns with the page color. -
@media (forced-colors: active)
Windows High Contrast Mode support. Restores the focus ring using the systemHighlightcolor, adds a visible border on form elements whose border was removed by the reset, and appliesopacity: 0.5on disabled elements.
Element normalization
-
Headings (
h1–h6)
Addedtext-wrap: balancefor improved typographic readability, especially on narrow viewports. -
Horizontal rule (
hr)
Replaces the browser-default 3D border with a clean, theme-consistent separator usingborder-top: 1px solid currentColor. -
Fieldset & Legend (
fieldset,legend)
Removes the default browser border and padding onfieldset, and the internal padding onlegend, providing a clean form grouping container. -
Dialog (
dialog,dialog::backdrop)
Normalizesdialogwith theme variables and adds a native entry animation using@starting-style(fade + slide) wrapped in@media (prefers-reduced-motion: no-preference). Theallow-discretetransition ondisplayandoverlayensures the animation completes before the element is hidden. -
[hidden]semantic fix
Addsdisplay: none !importantto[hidden]so elements marked as hidden are never accidentally revealed by other CSS rules. -
Print styles (
@media print)
Added a dedicated print section that removes backgrounds, box shadows, and decorative colors, and shows full URLs after links.
Form UX
-
field-sizing: contentontextarea
The textarea automatically resizes to fit its content, eliminating the need for JavaScript auto-resize solutions.resize: verticalis kept as a fallback for unsupported browsers. -
caret-color: var(--bux-color-primary)oninput,textarea,[contenteditable]
Applies the theme's primary color to the text insertion cursor for consistent visual theming.
Typography
text-underline-offset: 0.2emona
Moves the underline slightly below the text baseline, reducing collisions with descenders and improving legibility.
Dark mode
- Three missing variable overrides added to
@media (prefers-color-scheme: dark):--bux-valid-bg-color: #0d2e18--bux-invalid-bg-color: #2e0d0d--bux-scrollbar-track: #1a2535
🔧 Changed
-
Smooth theme transition moved into
@media (prefers-reduced-motion: no-preference)
Thebody { transition }rule now only applies when the user has not opted for reduced motion, correctly respecting their preference. -
Field validation states now use
:user-valid/:user-invalidinstead of:valid/:invalid
These pseudo-classes only activate after the user has interacted with the field, preventing premature error styling on page load. -
Disabled elements (
[disabled],[aria-disabled="true"])
Addedcursor: not-allowedto clearly communicate that an element is non-interactive. -
Body now includes
overflow-wrap: break-word
Prevents long words or URLs from overflowing their container, particularly useful on narrow viewports. -
overflow-y: scrollandscrollbar-gutter: stableonhtml
Comments updated to explicitly document their complementary roles:scrollbar-gutter: stableis the modern solution;overflow-y: scrollis kept as a fallback for browsers that do not yet support it. Both are required for full cross-browser coverage. -
::-moz-progress-barnow correctly usesvar(--bux-progress-value-bg)instead ofvar(--bux-progress-bar-bg).
In Firefox,::-moz-progress-bartargets the filled portion of the progress bar (the value), not the track. The wrong variable was applied since v1.0.1. -
Inconsistent indentation fixed throughout
browserux.css.
Several rules were using tabs instead of 2-space indentation, inconsistent with the rest of the file. All properties are now uniformly indented with 2 spaces.
➖ Removed
-
details, summary { accent-color }
accent-colorhas no effect on<details>and<summary>elements in any browser. The rule was a no-op and has been removed. For customsummarymarker styling, usesummary::markeror a::beforepseudo-element. -
ol, ul { list-style: none }
Removing list markers globally is too opinionated for a base stylesheet and can degrade accessibility (VoiceOver removes list semantics whenlist-style: noneis applied withoutrole="list"). Apply this reset selectively in your own stylesheet where needed.
✅ Fixed
@media (prefers-contrast: more)in dark mode
Added a combined@media (prefers-contrast: more) and (prefers-color-scheme: dark)block. The near-black placeholder and disabled-element colors defined in the base contrast block were invisible against the dark background. They are now overridden with near-white values (rgba(239, 239, 239, 0.9)) when both preferences are active simultaneously.
v2.0.0
[2.0.0] – 06-06-2025
💥 Breaking change
CSS variable prefix update:
To improve project scalability and avoid naming collisions with other libraries or design systems, all CSS variables previously prefixed with --ui- have been renamed to --bux-.
This change clarifies the scope of the BrowserUX design system (Bux) and prepares for better integration into multi-source projects.
Example:
- --ui-color-primary
+ --bux-color-primaryRequired action for users:
- If you override CSS variables in your own stylesheets, rename them using the
--bux-prefix - If you use a theme or token system based on
--ui-, consider migrating it to--bux-
Tip : You can temporarily add manual aliases to ensure a smooth transition:
:root {
--ui-color-primary: var(--bux-color-primary);
--ui-spacing-small: var(--bux-spacing-small);
}🔧 v1.0.2 – Minor fixes and cleanup
This release includes small but important maintenance updates to improve the quality and clarity of the codebase.
✨ Changes
✅ Removed hardcoded color values from the dark mode section
→ Now all dark mode styles rely on CSS variables only
✅ Fixed inconsistent indentation in browserux.css
→ For better readability and consistency
✅ Corrected inaccurate or misleading comments in the CSS file