All notable changes to mCSS. The framework follows the copy-it-you-own-it model: there is no package to update, so version numbers mark states of the repository you can copy from (each release is also a git tag).
The default theme: the framework now ships as structure plus one swappable file holding every design value, a new external layer makes third-party CSS easy to override, and the docs got a full restructure (#65).
- The
settings.*design files become the default theme.settings.tokens.cssandsettings.ui.cssare nowtheme.default.tokens.cssandtheme.default.ui.css, imported by the newtheme.default.cssentry.mcss.cssno longer carries any design values: your entry must activate the default theme right after it (@import url(./framework/theme.default.css);), and nothing paints without it. - The
themelayer splits intotheme.defaultandtheme.user. The default theme's parts land intheme.default; your own theme self-layers intotheme.user, so your overrides beat the default no matter the import order. The full layer statement is nowbase, elements, global, components, theme.default, theme.user, external, helpers. theme.wireframe.cssis a composed entry: it imports the default theme itself and holds only its deviations. Activate it INSTEAD oftheme.default.css.- The feedback alias tier is gone. The
--success-*/--danger-*/--warning-*aliases are removed; components and themes use the--yes-*/--no-*/--maybe-*palettes directly. dist/mcss.cssbakes the default theme in, so the single-file drop-in keeps painting on its own.dist/css/mcss.css(the per-file@importindex) ships with the default theme import active and is now ordered by cascade layer.- Docs URLs restructured: tokens + themes →
/docs/default-theme, reset + elements →/docs/default-html, global + media queries →/docs/layout, Installation and Browser Support split out of Getting Started, and the marketing template lives on the new/docs/components. Every old URL (including the.mdtwins) 301s.
externalcascade layer, empty by default, betweentheme.userandhelpers: import third-party CSS with@import url(…) layer(external);and it beats the framework but loses to all your unlayered CSS, at any specificity. Companion convention:patch.*.cssfiles (like this site'spatch.astro.css) hold your fixes to vendor styles.theme.starter.css: the starting point for writing your own theme.check-layers.mjs(npm run check:layers, wired into pre-commit and CI): the layer statement is deliberately duplicated (theme pins, docs code blocks, dist), so the build now derives it frommcss.cssand the check fails when any copy drifts.--fixrewrites stale copies.- Docs: dedicated Installation, Browser Support (with a version floor table), and Components pages; anchor scrolling clears the sticky header on mcss.dev.
- The marketing template imports
mcss.components.cssandtheme.default.css(it rendered unstyled after the restructure). - All redirects are real Netlify 301s in
public/_redirects. Astro's config redirects emit meta-refresh HTML stubs, which broke.mdtwin fetchers (a 200 with HTML where agents expect markdown) and shadowed the edge rules.
The compile floor now matches the docs: mCSS targets Baseline 2024, and the build stops polyfilling the features the framework was always meant to use natively (#56).
- Browser support floor raised to Baseline 2024 (
.browserslistrcis nowbaseline 2024: Chrome/Edge 130, Firefox 132, Safari 18.2 or newer). The old floor (defaults and supports css-cascade-layers, ~2022) admitted browsers withoutlight-dark(), so postcss-preset-env was polyfilling it, against the docs' "no polyfills" promise, and the polyfill's@supports not (…) { :root * }rules could beat component token overrides across cascade layers. Browsers from the 2022 to 2024 window are no longer supported; in them,light-dark()tokens now compute to unset colors, not the light palette (the old fallback claim in the docs was wrong for tokens either way, and has been corrected).
dist/is now genuinely polyfill-free.dist/mcss.cssdrops 403--csstools-*scratch declarations and shipslight-dark(), nesting, and relative color syntax as written: 130 kB raw (was 159), 94 kB minified (was 121), 15.9 kB min+gzip (was 17.8). Nesting was previously being silently flattened by the same too-broad floor.- The PostCSS setup post documents the new floor, the browserslist 4.25 requirement for the
baselinequery, agrep -c "csstools"output check, and a troubleshooting entry for thelight-dark()polyfill firing.
Core and components split: the drop-in framework file no longer bundles the component library, so sites that build their own components stop paying for it.
mcss.components.css: the component library now has its own entry file. All 25component.*.cssfiles import there (wrapped in@layer components), anddist/gains the matching drop-insmcss.components.css/mcss.components.min.css(~5 KB min+gzip). Import it alongsidemcss.css, in either order: the layer statement inmcss.cssdecides priority, exactly like the existingthemeslot.
dist/mcss.css/dist/mcss.min.cssare now the framework core only (~17 KB min+gzip): settings, base, elements, global, and helpers, plus the emptycomponentsandthemelayer slots. If you use the component library, adddist/mcss.components.min.cssnext to it. Source consumers:framework/mcss.cssno longer importscomponent.*.css; importframework/mcss.components.cssfrom your entry too (see_global.css).
Tiles: one container-responsive list component replacing CardList and FeatureGrid.
- Tiles (
component.tiles.css,Tiles.astro): CardList and FeatureGrid consolidated into one container-responsive list component, built on container queries. Columns appear as the nearest size container crosses the size's thresholds, so the count answers the width of the column the list sits in, not the viewport: the same markup is 2-up in a docs column and 4-up in a wide one at the same window size. Sizes name the tile, and each is its own threshold set: bare.tiles/.tiles-mdfits card-sized tiles (2 columns from a36remcontainer, then every20rem),.tiles-smfits icon + blurb items (2 from28rem, then every16rem). No column cap: the column's width is the cap, and columns keep coming (up to 6 enumerated) as the container allows. To pin a count, set--tiles-columnson a hook class of your own. - Every
.layoutscaffold declares its main column as a named size container (container: main / inline-size); that is what Tiles responds to inside the scaffolds, and your own rules can use it too (@container main (width >= …)). Outside a scaffold, wrap a tiles list in.tiles_container(required: without a container ancestor the queries never match and the list stays single-column). - The mcss.dev blog index goes 4-up on a laptop purely through a page-scoped
--layout-content-widthoverride (.blog-indexinpage.blog.css): the pattern to copy for wide listing pages.
- mcss.dev page classes (
.blog,.docs) moved from<main>to the<body>, next to the scaffold classes, so a page class can override layout tokens (they are consumed by.layout_content, which sits between the two).
.cardListand.featureGridare gone, replaced by Tiles:<ul class="cardList grid" col="1" col-md="2" col-lg="3">is now<ul class="tiles">, and<ul class="featureGrid grid" …>is<ul class="tiles tiles-sm">(.featureItemmarkup is unchanged). The lists no longer ride on the.gridattribute system (which is unchanged for your own grids); instead of picking column counts per viewport breakpoint, you pick the tile size and the container's width decides.CardList.astro/FeatureGrid.astroare replaced byTiles.astro(size="sm"for the former FeatureGrid), and thecolsprop is gone.
getInitials(the Avatar byline helper insrc/scripts/utilities.js) doubled the first letter of a single-word name, so "Yann" rendered as "YY". Single-word names now yield one initial; pre-computed initials like "SR" still pass through untouched.- The wireframe theme's per-element sketch tilt is live again: postcss-preset-env's
random-functionpolyfill is now disabled (alongside the existingcascade-layers), so nativerandom()passes through instead of being frozen into a single source-length-seeded value that also churneddist/on every edit.
The official launch. Everything from the 0.9 beta reviewed, restructured, and built out into a full component framework for websites.
- Component library: 26 documented components, from atoms (button, badge, toggle) through content patterns (card, hero, FAQ, testimonial, pricing, pagination) to full page chrome (header with mobile menu, footer, banner). Every one is dogfooded on mcss.dev itself.
- Theme system: themes are swappable skins, one CSS file that reskins the whole site. New
themecascade layer,theme.default.cssas a copyable starting point, andtheme.wireframe.css, a hand-drawn wireframe skin, as the worked example. See the themes docs. - Layout library:
global.layout.cssrebuilt from mcss.dev-specific styles into six page-level scaffolds: the.layoutapp shell (sticky footer) plus.layout-centered,.layout-sidebar(with a.layout-sidebar-endcomposition),.layout-docs(nav + main + TOC),.layout-split, and.layout-cover. Column widths come from the new--layout-content-widthand--layout-toc-widthtokens alongside--layout-aside-width. Every page on mcss.dev runs on them, with full-page demos under/demos/layout/and thumbnail diagrams in the layouts docs. - Marketing template: a complete one-pager built only from the framework and library components, with a runtime theme switcher. Live demo.
dist/build: the whole framework pre-processed as a drop-inmcss.css/mcss.min.css, plus per-file copies indist/css/. Committed to the repo and kept fresh by CI.- MIT license.
- Logical spacing helpers (
mis-*,mie-*,pis-*,pie-*) and.text-start/.text-end: reading-direction-relative twins of the physicalml/mr/pl/prand.text-left/righthelpers, which stay for purely visual offsets. - Machine-readable docs for AI agents, fluid heading scale, responsive grid gaps, themeable text selection color.
--highlight-500token: the text marker color, consumed by the--marker-colorinterface token (what<mark>uses), so themes can restyle highlights from the palette.
- The framework now uses native CSS cascade layers:
settings, base, elements, global, components, theme, helpers. Layer order, not import order or specificity, decides priority, and your own unlayered CSS beats the framework by default. - Framework and docs-site CSS fully split (
src/styles/framework/vssrc/styles/site/). - Removed the
--layout-aside-background-colorinterface token: no rule in the framework or the docs site ever consumed it. Style.layout_content_asidedirectly if you want an aside background. - Removed the
--meter-colortoken for the same reason: themeterelement paints with--meter-color-track/low/med/high, and nothing ever consumed--meter-color. - Docs site upgraded to Astro 7.
- Helper class short forms removed; use the full names.
- Component
extraClassprops renamed toclass. - The
atomslayer collapsed intocomponents;atom.*files are gone. - The 0.9
global.layout.cssinternals (documented back then as mcss.dev examples, not templates) are gone: no more hidden mobile aside in.layout-sidebar, TOCnth-of-typeslot, or hardcoded column widths. Docs-style pages use.layout-docswith an explicitlayout_content_aside-tocclass on the TOC aside. - The unused
pageslayer removed from the layer order. settings.theme.default.cssrenamed tosettings.ui.css; "theme tokens" are now "interface tokens", and themes live intheme.*.cssfiles instead.--theme-border-colorand--theme-shadow-colorrenamed to--ui-border-colorand--ui-shadow-color.- Docs URLs lowercased on mcss.dev.
The last pre-1.0 state of the old file tree is preserved under the v0.9.0 tag.
Initial public beta: the framework (tokens, reset, elements, global styles, helpers) plus the first few components. Announced in mCSS v.0.9.