Technical names are kept, and each one is explained the first time it appears.
Author: Prakash Upadhyay
Discussion: w3c/csswg-drafts#14616
Published: 18 Oct 2026. Feedback welcome: open an issue.
Versions: this page (balanced) · technical · plain language · live demo
HDR screens can show parts of an image much brighter than normal page white. Developers can cap that brightness with the CSS property dynamic-range-limit, but almost nobody does, and users have no way to ask for it. This proposal adds a user preference, in the same family as prefers-reduced-motion, so people can say “no sudden brightness spikes” once and have browsers, websites and apps respect it.
HDR (high dynamic range) screens, such as MacBook Pro XDR displays, recent iPhones and iPads, many OLED phones and HDR monitors, keep extra brightness in reserve above normal white. That reserve is called HDR headroom (Apple calls it EDR, Extended Dynamic Range). Ordinary SDR (standard dynamic range) content never uses it. An HDR image or video can, and the browser lets it.
A 100 x 100 company logo in a LinkedIn job alert, opened in Yahoo Mail in Chrome on a MacBook XDR display, glowed far brighter than the rest of the email.
The JPEG file explains why. It embeds an Apple color profile labelled “Rec. ITU-R BT.2100 PQ”. PQ (Perceptual Quantizer) is an HDR encoding where each pixel value means an absolute brightness, up to 10,000 nits (the unit of screen brightness). The logo’s white pixels sit at the very top of that scale: 10,000 nits. The broadcast guideline ITU-R BT.2408 puts white graphics at 203 nits, so the file asks for about 49 times that. The screen clips it at its own maximum, which is still several times brighter than the page around it.

Phone photos of the live demo on a MacBook Pro XDR display, same exposure. A screenshot can’t show this, a camera can. The animation switches every 1.5 seconds. If you have reduced motion turned on, you see the two photos side by side instead.
Nobody meant it to glow. It was most likely exported from an Apple tool with an HDR color space selected. As phones save HDR photos by default, anything users upload (avatars, logos, product photos) can bring HDR onto pages whose developers never chose it.
Screenshots are saved in SDR, so anything above normal white is clipped and the page looks normal. The glow never shows up in design reviews, bug reports or Slack threads. You only see it live, on an HDR screen.
The problem is not overall brightness but the sudden relative jump: one element far brighter than its surroundings, often while scrolling a dim page at night. It is the visual version of a TV advert much louder than the programme. For people with migraine, photophobia (light sensitivity) or some eye conditions, it can be painful, not just annoying.
| Tool | Type | Who controls it | Why it falls short |
|---|---|---|---|
dynamic-range-limit: standard \| constrained \| no-limit |
CSS property (CSS Color HDR 1) | Developer | Caps HDR per element, but only if the developer knows about HDR and adds it. Default is no-limit. Chrome and Edge 136+, Safari 26+, not Firefox. |
@media (dynamic-range: high) |
Media query (Media Queries 5) | Hardware | Tells the page the screen can show HDR, not whether the person wants it. |
| Reduce White Point | iOS / iPadOS accessibility setting | User | Dims the whole screen, including text. The HDR element stays several times brighter than its surroundings. |
| “Enhanced HDR brightness” | Android setting | User | Seen only in beta builds so far, and not exposed to apps. |
| HDR on/off per display | Windows setting | User | All or nothing. |
UIImageView.preferredImageDynamicRange, SwiftUI .allowedDynamicRange(_:), CALayer.DynamicRange, Android Window.setDesiredHdrHeadroom() |
Native app APIs | App developer | Same as CSS: apps can cap HDR, but nothing tells them what the user prefers. |
A quick note on two terms used above and below:
img { dynamic-range-limit: standard; } (“cap all images at normal white”).@media (prefers-reduced-motion: reduce) { ... } (“if the user asked for less motion, do this”).So today a developer can cap HDR for everyone on an HDR screen, or for no one. They cannot do it just for the people who need it.
The CSS Color HDR 1 spec, Accessibility Considerations (W3C Working Draft, 8 October 2026) says:
“Some individuals may have a sensitivity to very bright colors, so user agents should provide a mechanism to limit the maximum luminance at user option.”
(“User agent” is the spec term for a browser.) It is a “should”, not a “must”, and the spec does not define the mechanism. Its only concrete suggestion is a user stylesheet (CSS the user adds themselves) setting dynamic-range-limit to standard or constrained. But in CSS, the website’s own rules beat a user stylesheet unless the user’s rule is marked !important, which most people would never know to do. I found no browser that offers such a setting today.
From Chrome Platform Status, which publishes the share of Chrome page loads using each feature (16 Oct 2026):
| Feature | What it does | Share of page loads |
|---|---|---|
prefers-reduced-motion |
Respects the user’s “reduce motion” setting | 58.3% |
prefers-contrast |
Respects the user’s contrast setting | 27.2% |
dynamic-range |
Checks whether the screen can show HDR | 6.6% |
prefers-reduced-transparency |
Respects the user’s “reduce transparency” setting | 5.5% |
dynamic-range-limit |
Caps HDR brightness | 0.66% |
Pages check whether the screen can show HDR ten times more often than they cap it, and the cap appears on about 1/90th as many page loads as prefers-reduced-motion. User preferences clearly work when they exist: the gap is that this one doesn’t.
Call for use cases. The CSS Working Group asks for concrete, real-world use cases before it adds a media feature (#6757). If sudden HDR brightness affects you, or people you support, please share your experience in an issue. Groups this is likely to matter for:
Goals:
dynamic-range-limit rather than invent a new model.Non-goals:
Two parts, strongest together.
A setting that forces dynamic-range-limit to standard (or constrained) for all content, at a priority website CSS cannot undo. It protects users everywhere with no developer work. The spec editor suggested this direction in #11790: “always treat no-limit as constrained-high”.
The same setting exposed as a media query, so developers can redesign for people who asked, for example by showing an SDR poster image instead of an autoplaying HDR video, using an SDR logo, or skipping HDR autoplay.
This mirrors prefers-reduced-motion. iOS and macOS already had a system Reduce Motion setting, and the media feature was still added, because the system can slow animations down but only the developer can redesign them.
Option A: levels
/* The user wants no HDR brightness above normal white */
@media (prefers-dynamic-range: standard) {
img, video { dynamic-range-limit: standard; }
.hero-video { display: none; } /* show the SDR poster instead */
}
Values: standard | constrained | no-preference.
dynamic-range-limit values and Apple’s three rendering styles (standard, constrained HDR, full HDR).constrained and standard look clearly different in Chrome, so the middle level is real.dynamic-range: standard (the screen can’t do HDR) and prefers-dynamic-range: standard (the person doesn’t want HDR) differ by one word, and using the wrong one fails silently.prefers-contrast: more | less | custom | no-preference.Option B: on/off
/* The user asked for reduced peak brightness */
@media (prefers-reduced-peak-brightness: reduce) {
img, video { dynamic-range-limit: standard; }
}
Values: reduce | no-preference. Alternative name: prefers-reduced-highlights.
prefers-reduced-motion, prefers-reduced-transparency, prefers-reduced-data.Audio had the same problem (one segment much louder than the rest) and solved it.
| Audio | HDR screens | |
|---|---|---|
| Measure | LUFS, a loudness unit based on how loud something sounds relative to the programme (ITU-R BS.1770) | Nits and HDR headroom. No agreed measure of how big a brightness jump feels. |
| Content standard | EBU R128 (Europe), ATSC A/85 (US) | ITU-R BT.2408 (white graphics at 203 nits), rarely followed outside broadcast |
| Law | US CALM Act (2010): adverts may not be louder than the programme | None |
| Playback normalization | Spotify, Apple Music and YouTube adjust every track | None. Browsers render HDR as the file asks. |
| User preference | Spotify: Loud, Normal, Quiet, or off | None |
Lessons:
standard / constrained / no-limit.“OS-level dimming is enough.” (Raised by a WebKit engineer in #11790.) For rendering alone, a browser or OS cap is indeed the best protection, which is why Part 1 exists. But dimming alone falls short:
“We already have dynamic-range.” That query describes the hardware. It matches on an HDR laptop whether the owner loves HDR or gets headaches from it. Motion works the same way: the hardware decides if animation is possible, and prefers-reduced-motion says whether the person wants it.
Fingerprinting (sites using small device details to tell users apart). Every prefers-* feature adds a little of this. prefers-reduced-motion, prefers-contrast and prefers-reduced-transparency shipped anyway. If the feature only matches on HDR screens (open question 4), it adds nothing on SDR screens.
The live demo recreates the inbox with the real logo. A toolbar switches between “Today (no limit)”, “Constrained” and “If my preference were respected”, and three side-by-side tiles show the same pixels as normal white, full HDR and capped. Needs an HDR screen and Chrome, Edge 136+ or Safari 26+. Screen recordings won’t capture the difference.
prefers-reduced-strobing, a stalled photosensitivity preference.standard or constrained?See the sources in the technical version.