Getting started
Browser support
Monsoon targets the current versions of Chrome, Edge, Firefox and Safari. The full seed theme needs OKLCH relative color syntax, available in Chrome and Edge 119, Firefox 128 and Safari 18 or newer. Older browsers still get a readable page.
The short version
- Current browsers: everything works, including seed theming, dark mode, container queries and the components.
- Browsers without relative color syntax: a static theme computed from the default seed, with
primaryandringset to your seed. Light and dark mode still switch. - Browsers without container queries: the
@xs:to@xl:classes are ignored and the unprefixed layout is used. - No JavaScript, no polyfills: Monsoon is plain CSS, so there is nothing to load or patch at runtime.
Features the utilities rely on
These are the modern CSS features found in the utility and theme rules, with the first browser versions that support them:
| Feature | Used for | Chrome / Edge | Firefox | Safari |
|---|---|---|---|---|
Relative colors, oklch(from ...) | deriving every token from --seed | 119 | 128 | 18 |
oklch() colors | the palette and the tokens | 111 | 113 | 15.4 |
color-mix() | opacity modifiers such as bg-primary/90 | 111 | 113 | 16.2 |
| Container queries | @container and @xs: to @xl: | 105 | 110 | 16 |
Cascade layers, @layer | the reset, so your CSS wins without tricks | 99 | 97 | 15.4 |
:is() and :where() | the dark: variant, space-*, divide-*, section paint | 88 | 78 | 14 |
| Logical properties | px-*, py-*, mx-auto, space-y-* | 87 | 66 | 14.1 |
| Individual transforms | scale-*, rotate-*, translate-* as separate properties | 104 | 72 | 14.1 |
dvh and svh units | h-dvh, min-h-dvh and friends | 108 | 101 | 15.4 |
text-wrap: balance | text-balance | 114 | 121 | 17.5 |
Utilities that use a newer property, such as text-balance, simply have no effect in a browser that does not know it. The rest of the rule set is unaffected.
Progressive enhancements
Some rules improve the result where a browser supports them and fall back to a plain but correct result elsewhere:
| Feature | Used for | Without it |
|---|---|---|
@scope | an exact dark: variant at any nesting depth (Chrome and Edge 118, Safari 17.4, recent Firefox) | dark: uses selectors only. Exact except for dark inside light inside dark. |
:has() | component states such as rating stars, checkbox cards and field validation (Chrome 105, Firefox 121, Safari 15.4) | Those components lose the state styling that depends on it. |
The popover attribute | popovers and dropdowns that open with popover (Chrome 114, Firefox 125, Safari 17) | Use the dropdown built on details or focus instead, which works everywhere. |
@starting-style | entry animations of popovers, modals, drawers and sheets | They open without the animation. |
| Anchor positioning | placing popovers next to their trigger, inside @supports | Popovers are centered in the viewport. |
| Scroll driven animations | revealing the back to top button, inside @supports | The button is always visible. |
field-sizing: content | textarea-autosize | A regular resizable textarea. |
::details-content and interpolate-size | animated collapse and accordion panels | Panels open instantly. |
Check the page of each component for its own notes.
Without relative color syntax
Seed theming computes colors in the browser, which needs relative color syntax. For browsers without it, the stylesheet ships a static theme inside @supports not (color: oklch(from red l c h)):
- every token gets a fixed value computed from the default seed,
primaryandringuse your--seeddirectly, so your brand color still shows,- tokens whose lightness only depends on the scheme (background, foreground, surfaces, muted, border, secondary and the status colors) still switch between light and dark,
- foregrounds are fixed for the default seed, so
primary-foregroundstays white.
With a dark or saturated seed that is fine. With a very light seed, such as yellow, white text on the primary color would be hard to read, so set a foreground for those browsers yourself:
@supports not (color: oklch(from red l c h)) {
:root {
--primary-foreground: #1c1917;
}
}How to check
Paste this into the console of any browser to see which features it has:
console.table({
'relative colors': CSS.supports('color', 'oklch(from red l c h)'),
'oklch': CSS.supports('color', 'oklch(0.5 0.1 200)'),
'color-mix': CSS.supports('color', 'color-mix(in oklab, red, blue)'),
'container queries': CSS.supports('container-type', 'inline-size'),
':has()': CSS.supports('selector(:has(a))'),
'@layer': typeof CSSLayerBlockRule !== 'undefined',
'@scope': typeof CSSScopeRule !== 'undefined',
});- Open the page in the oldest browser you support and confirm that text, buttons and forms are readable.
- In the developer tools, emulate
prefers-color-scheme: darkandprefers-reduced-motion: reduceto test the scheme and the motion variants without changing system settings. - Inspect an element and look at the computed value of
--primaryto see what the browser derived from your seed. - Open the playground in each browser you support and paste a representative piece of your markup to compare the results.
Frequently asked questions
Does Monsoon work in Internet Explorer?
No. It relies on custom properties, modern color functions and cascade layers that Internet Explorer never supported.
What is the minimum for the full seed theme?
Relative color syntax: Chrome and Edge 119, Firefox 128 and Safari 18 or newer.
Is there a JavaScript polyfill?
No, and none is needed for a readable page. Older browsers get the static fallback theme.