RFR: 8364149: Conditional stylesheet imports [v5]
Andy Goryachev
angorya at openjdk.org
Thu Feb 26 18:22:21 UTC 2026
On Thu, 26 Feb 2026 17:00:56 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:
>> The [`@import`](https://www.w3.org/TR/css-cascade-5/#at-import) rule is extended to support conditional stylesheet imports:
>>
>>
>> @import [ <url> | <string> ] <media-query-list>? ;
>>
>>
>> Conceptually, a conditional import takes all rules of the referenced stylesheet, literally includes them at the location of the `@import` rule, and surrounds them with a `@media` rule with the specified `<media-query-list>`.
>>
>> The implementation of this feature extends media queries with a context-free evaluation function:
>>
>> interface MediaQuery {
>> TriState evaluate(); // returns TRUE / FALSE / UNKNOWN
>> }
>>
>>
>> This mode of evaluation uses Kleene's strong trivalent logic to determine whether the media query will always match (it's a tautology), will never match (it's a contradiction), or whether it depends on the context or we simply don't know.
>>
>> Using this mechanism, a conditional stylesheet import that can never match will be skipped at runtime. Similarly, a conditional stylesheet import that will always match doesn't need the `<media-query-list>` at all; its rules will be pasted verbatim into the main stylesheet.
>>
>> Note that this mechanism is _not_ meant to be a full-blown theorem solver. It won't detect that, for example, the following import conditions will always match:
>>
>> @import url("stylesheet.css") (width > 1000) or (width <= 1000);
>>
>>
>> Its purpose is an optimization for "obvious" cases. For example, at the moment the built-in themes use hard-coded conditions to include user-agent stylesheets at runtime:
>>
>> // in PlatformImpl.java:
>> if (isSupported(ConditionalFeature.INPUT_TOUCH)) {
>> uaStylesheets.add("com/sun/javafx/scene/control/skin/modena/touch.css");
>> }
>>
>> In the future, we might have a way to test for `ConditionalFeature` flags that achieves the same thing, but with a public API available to all theme authors:
>>
>> @import url("com/sun/javafx/scene/control/skin/modena/touch.css")
>> (-fx-supports-conditional-feature: input-touch);
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
>
> javadoc change
Looks good!
Works even with inline conditionals:
scene.getStylesheets().add("data:text/css," +
"""
@import url("data:text/css, .root { -fx-base: #ff0000; }") (height < 200) and (not (width <= 200));
""");
modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaQueryList.java line 45:
> 43: * Attempts to determine the result of this media query list without a {@link MediaQueryContext}, and
> 44: * returns {@link TriState#TRUE} if at least one media query is {@code TRUE}, {@link TriState#FALSE}
> 45: * if all media queries are {@code FALSE}, or {@link TriState#UNKNOWN} otherwise.
excellent, now it's perfectly clear, thank you!
-------------
Marked as reviewed by angorya (Reviewer).
PR Review: https://git.openjdk.org/jfx/pull/2031#pullrequestreview-3862741688
PR Review Comment: https://git.openjdk.org/jfx/pull/2031#discussion_r2860567043
More information about the openjfx-dev
mailing list