native controls follow the theme
Nothing set `color-scheme`, so the browser drew every control it renders itself as if the page were light. On a dark theme a <select>'s dropdown opened as a white sheet with the page's own pale text on it — unreadable, and unreachable by any utility class, because that list is painted by the browser and is not in the document. `color-scheme` is the only thing that reaches it. It also fixes, for free, the other controls with no styleable interior: date and colour pickers, the spinner on a number input, and default scrollbars where a theme has not replaced them. The `dark` class decides it, because that is the signal that exists — 203 of the 231 themes set applyDarkClass, and the provider puts it on <html> beside data-theme, so the two always agree about the same element. Both are specificity 0-1-0 and themes import after this file, so a theme that disagrees can say so. This is a default, not a decision taken away. Explicit colours on select/option/optgroup underneath, because color-scheme gives the browser's generic dark rather than the theme's. Where a browser honours them — Firefox, Chrome on Linux and Windows — the list becomes the theme's own popover surface. Where it does not, Safari and Chrome on macOS use a genuinely native menu and the scheme carries it, which is a great deal better than white on white. Base-layer rules, so a utility still wins and `bg-transparent` on a select behaves as it did. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -204,6 +204,51 @@
|
|||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
NATIVE CONTROLS FOLLOW THE THEME.
|
||||||
|
------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Nothing here set `color-scheme`, so the browser drew every control it renders itself as if the page
|
||||||
|
were light — on a dark theme, a `<select>`'s dropdown opened as a white sheet with the page's own
|
||||||
|
pale text on it. Unreadable, and unreachable by any utility class, because that list is painted by
|
||||||
|
the browser and is not in the document.
|
||||||
|
|
||||||
|
`color-scheme` is the only thing that reaches it. It also fixes, for free, the other controls with
|
||||||
|
no styleable interior: date and colour pickers, the spinner on a number input, and default
|
||||||
|
scrollbars where a theme has not replaced them.
|
||||||
|
|
||||||
|
── Why the `dark` class decides it ──
|
||||||
|
|
||||||
|
It is the signal that exists. 203 of the 231 themes set `applyDarkClass`, and the provider puts the
|
||||||
|
class on <html> beside `data-theme`, so the two are always in agreement about the same element.
|
||||||
|
Both are specificity 0-1-0 and themes are imported after this file, so a theme that disagrees can
|
||||||
|
simply say so — this is a default, not a decision taken away.
|
||||||
|
|
||||||
|
── And the explicit colours underneath ──
|
||||||
|
|
||||||
|
`color-scheme` gives the browser's generic dark, not the theme's. Where a browser honours colours on
|
||||||
|
`<option>` — Firefox, and Chrome on Linux and Windows — these make the list the theme's own popover
|
||||||
|
surface instead. Where it does not (Safari, Chrome on macOS, which use a genuinely native menu), the
|
||||||
|
scheme above is what carries it, and generic dark is a great deal better than white-on-white.
|
||||||
|
|
||||||
|
A utility still wins: these are base-layer rules, so `bg-transparent` on a select behaves exactly as
|
||||||
|
it did.
|
||||||
|
*/
|
||||||
|
:root {
|
||||||
|
color-scheme: light;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
select,
|
||||||
|
option,
|
||||||
|
optgroup {
|
||||||
|
background-color: var(--popover);
|
||||||
|
color: var(--popover-foreground);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user