From 225cc38da645d50e972f47d36ae26a94f5d6a6f8 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Fri, 10 Apr 2026 09:49:05 -0400
Subject: [PATCH 001/221] [selectors 4][editoril] Explainer
---
selectors-4/Selectors_4_Explainer.md | 123 +++++++++++++++++++++++++++
1 file changed, 123 insertions(+)
create mode 100644 selectors-4/Selectors_4_Explainer.md
diff --git a/selectors-4/Selectors_4_Explainer.md b/selectors-4/Selectors_4_Explainer.md
new file mode 100644
index 000000000000..819ade365f69
--- /dev/null
+++ b/selectors-4/Selectors_4_Explainer.md
@@ -0,0 +1,123 @@
+# Selectors 4 Explainer
+
+## Author
+
+ - Chris Lilley (W3C)
+
+## Participate
+
+- [Issue tracker](https://github.com/w3c/csswg-drafts/issues?q=state%3Aopen%20label%3A%22selectors-4%22)
+
+## What are Selectors
+
+Introduced with [CSS1](https://www.w3.org/TR/CSS1/#basic-concepts) in 1996,
+Selectors are a mature and widely deployed way to
+select **individual parts** of a (typically HTML) document,
+so that they may be **styled** or **manipulated with script**.
+
+They were further developed in [CSS2.1](https://www.w3.org/TR/CSS2/selector.html#q5.0)
+(W3C Recommendation, from 2011)
+and in [Selectors 3](https://www.w3.org/TR/selectors-3/)
+(W3C Recommendation, 2018).
+
+[Selectors 4](https://www.w3.org/TR/selectors-4/)
+is an incremental improvement to previous Selectors specifications,
+responding to common user needs.
+
+It is now widely deployed, stable,
+and is being prepared for W3C Recommendation,
+while less-mature Selectors have been moved to
+[Selectors 5](https://www.w3.org/TR/selectors-5/).
+
+However, the Selectors 4 specification
+is a _complete specification_ of Selectors,
+(including material from levels 1 through 3)
+not a delta. This aids readability.
+
+In view of this widespread use,
+this explainer does not address early-review questions
+such as general user need or alternatives considered;
+instead it motivates the particular changes found in Selectors 4.
+
+## Why `Selectors` not `CSS Selectors`?
+
+Selectors have expanded beyond their initial use in CSS;
+they are also widely used in the Document Object Model,
+to select parts of a document for manipulation by JavaScript.
+These are both majority uses, hence the naming of the specification.
+
+## What is new in Selectors 4
+
+(Expanded from [Changes Since Level 3](https://drafts.csswg.org/selectors-4/#changes-level-3))
+
+### Conditional Logic
+
+- The matches-any [`:is`](https://www.w3.org/TR/selectors-4/#matches) pseudo-class,
+ formerly called `:matches()`,
+ has been added to allow stylesheet authors to group functionally related elements,
+ such as any element that is either hovered or focussed.
+- The specificity-adjusting [`:where()`](https://www.w3.org/TR/selectors-4/#zero-matches) pseudo-class
+ has been added to construct zero-specificity filters,
+ which are easy to override,
+ replacing the many ugly hacks previously required to simulate this
+- The relational [`:has()`]() pseudo-class
+
+### Interactivity and Forms
+
+- Added the [`:modal`](https://www.w3.org/TR/selectors-4/#modal-state) pseudo-class,
+ to select elements which exclude interaction with all other elements until dismissed
+- Added [`:open`](https://www.w3.org/TR/selectors-4/#open-state)
+ and [`:popover-open`](https://www.w3.org/TR/selectors-4/#popover-open-state) pseudo-classes,
+ primarily but not exclusively to use with HTML forms
+
+### Hyperlinking Support
+
+- Added [`:any-link`](https://www.w3.org/TR/selectors-4/#the-any-link-pseudo) to match
+ any element that acts as the source anchor of a hyperlink
+
+### Clearer Expression of Authorial Intent
+
+- Expanded the sibling-counting [`:nth-child()`](https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo)
+ and negation [`:not()`](https://www.w3.org/TR/selectors-4/#negation) pseudo-classes
+ to accept a **selector list**.
+
+### Media State
+
+- Added the `:playing`, `:paused` and `:seeking` [media playback state](https://www.w3.org/TR/selectors-4/#video-state) pseudo classes,
+ to enable selecting on the dynamic state of video elements,
+ functionality which previously required JavaScript
+- Added the `:buffered` and `:stalled`
+ [media loading state](https://www.w3.org/TR/selectors-4/#media-loading-state) pseudo-classes,
+ again providing functionality that previously needed JavaScript
+- Added the [`:fullscreen`](https://www.w3.org/TR/selectors-4/#fullscreen-state)
+ and [`:picture-in-picture`](https://www.w3.org/TR/selectors-4/#pip-state) pseudo-classes
+- Added the `:muted` and `volume-locked` pseudo-classes
+ for sound-producing elements
+
+### Internationalization Improvements
+
+- Expanded the content language
+ [`:lang()`](https://www.w3.org/TR/selectors-4/#the-lang-pseudo) pseudo-class
+ to accept **wildcard matching** and **lists of language codes**
+ for greater flexibility styling related languages
+- Added the content language writing direction
+ [`dir()`](https://www.w3.org/TR/selectors-4/#the-dir-pseudo) pseudo-class
+ for convenient styling of left-to-right and righ-to-left content
+- Clarified case-insensitive string matching
+
+### Consolidation
+
+Selectors first introduced in
+[CSS Basic UI 3](https://www.w3.org/TR/css-ui-3/),
+have been moved to the main Selectors 4 specification.
+
+## Further reading
+
+For further information on the use of Selectors in CSS
+(covering all levels, but with a focus on level 4), see
+[CSS Selectors](https://css-tricks.com/css-selectors/) on CSS-Tricks.
+
+For selectors in the DOM, see
+[NodeList](https://developer.mozilla.org/en-US/docs/Web/API/NodeList) on MDN.
+
+The [Horizontal Review of Selectors 4](https://github.com/w3c/csswg-drafts/issues/13469).
\ No newline at end of file
From d2ec86072d29858d23b65a032bed1e0217ae4812 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Fri, 10 Apr 2026 09:50:51 -0400
Subject: [PATCH 002/221] whoops, filename
---
selectors-4/Selectors _4_Explainer.md | 123 --------------------------
1 file changed, 123 deletions(-)
delete mode 100644 selectors-4/Selectors _4_Explainer.md
diff --git a/selectors-4/Selectors _4_Explainer.md b/selectors-4/Selectors _4_Explainer.md
deleted file mode 100644
index 819ade365f69..000000000000
--- a/selectors-4/Selectors _4_Explainer.md
+++ /dev/null
@@ -1,123 +0,0 @@
-# Selectors 4 Explainer
-
-## Author
-
- - Chris Lilley (W3C)
-
-## Participate
-
-- [Issue tracker](https://github.com/w3c/csswg-drafts/issues?q=state%3Aopen%20label%3A%22selectors-4%22)
-
-## What are Selectors
-
-Introduced with [CSS1](https://www.w3.org/TR/CSS1/#basic-concepts) in 1996,
-Selectors are a mature and widely deployed way to
-select **individual parts** of a (typically HTML) document,
-so that they may be **styled** or **manipulated with script**.
-
-They were further developed in [CSS2.1](https://www.w3.org/TR/CSS2/selector.html#q5.0)
-(W3C Recommendation, from 2011)
-and in [Selectors 3](https://www.w3.org/TR/selectors-3/)
-(W3C Recommendation, 2018).
-
-[Selectors 4](https://www.w3.org/TR/selectors-4/)
-is an incremental improvement to previous Selectors specifications,
-responding to common user needs.
-
-It is now widely deployed, stable,
-and is being prepared for W3C Recommendation,
-while less-mature Selectors have been moved to
-[Selectors 5](https://www.w3.org/TR/selectors-5/).
-
-However, the Selectors 4 specification
-is a _complete specification_ of Selectors,
-(including material from levels 1 through 3)
-not a delta. This aids readability.
-
-In view of this widespread use,
-this explainer does not address early-review questions
-such as general user need or alternatives considered;
-instead it motivates the particular changes found in Selectors 4.
-
-## Why `Selectors` not `CSS Selectors`?
-
-Selectors have expanded beyond their initial use in CSS;
-they are also widely used in the Document Object Model,
-to select parts of a document for manipulation by JavaScript.
-These are both majority uses, hence the naming of the specification.
-
-## What is new in Selectors 4
-
-(Expanded from [Changes Since Level 3](https://drafts.csswg.org/selectors-4/#changes-level-3))
-
-### Conditional Logic
-
-- The matches-any [`:is`](https://www.w3.org/TR/selectors-4/#matches) pseudo-class,
- formerly called `:matches()`,
- has been added to allow stylesheet authors to group functionally related elements,
- such as any element that is either hovered or focussed.
-- The specificity-adjusting [`:where()`](https://www.w3.org/TR/selectors-4/#zero-matches) pseudo-class
- has been added to construct zero-specificity filters,
- which are easy to override,
- replacing the many ugly hacks previously required to simulate this
-- The relational [`:has()`]() pseudo-class
-
-### Interactivity and Forms
-
-- Added the [`:modal`](https://www.w3.org/TR/selectors-4/#modal-state) pseudo-class,
- to select elements which exclude interaction with all other elements until dismissed
-- Added [`:open`](https://www.w3.org/TR/selectors-4/#open-state)
- and [`:popover-open`](https://www.w3.org/TR/selectors-4/#popover-open-state) pseudo-classes,
- primarily but not exclusively to use with HTML forms
-
-### Hyperlinking Support
-
-- Added [`:any-link`](https://www.w3.org/TR/selectors-4/#the-any-link-pseudo) to match
- any element that acts as the source anchor of a hyperlink
-
-### Clearer Expression of Authorial Intent
-
-- Expanded the sibling-counting [`:nth-child()`](https://www.w3.org/TR/selectors-4/#the-nth-child-pseudo)
- and negation [`:not()`](https://www.w3.org/TR/selectors-4/#negation) pseudo-classes
- to accept a **selector list**.
-
-### Media State
-
-- Added the `:playing`, `:paused` and `:seeking` [media playback state](https://www.w3.org/TR/selectors-4/#video-state) pseudo classes,
- to enable selecting on the dynamic state of video elements,
- functionality which previously required JavaScript
-- Added the `:buffered` and `:stalled`
- [media loading state](https://www.w3.org/TR/selectors-4/#media-loading-state) pseudo-classes,
- again providing functionality that previously needed JavaScript
-- Added the [`:fullscreen`](https://www.w3.org/TR/selectors-4/#fullscreen-state)
- and [`:picture-in-picture`](https://www.w3.org/TR/selectors-4/#pip-state) pseudo-classes
-- Added the `:muted` and `volume-locked` pseudo-classes
- for sound-producing elements
-
-### Internationalization Improvements
-
-- Expanded the content language
- [`:lang()`](https://www.w3.org/TR/selectors-4/#the-lang-pseudo) pseudo-class
- to accept **wildcard matching** and **lists of language codes**
- for greater flexibility styling related languages
-- Added the content language writing direction
- [`dir()`](https://www.w3.org/TR/selectors-4/#the-dir-pseudo) pseudo-class
- for convenient styling of left-to-right and righ-to-left content
-- Clarified case-insensitive string matching
-
-### Consolidation
-
-Selectors first introduced in
-[CSS Basic UI 3](https://www.w3.org/TR/css-ui-3/),
-have been moved to the main Selectors 4 specification.
-
-## Further reading
-
-For further information on the use of Selectors in CSS
-(covering all levels, but with a focus on level 4), see
-[CSS Selectors](https://css-tricks.com/css-selectors/) on CSS-Tricks.
-
-For selectors in the DOM, see
-[NodeList](https://developer.mozilla.org/en-US/docs/Web/API/NodeList) on MDN.
-
-The [Horizontal Review of Selectors 4](https://github.com/w3c/csswg-drafts/issues/13469).
\ No newline at end of file
From af08cb63372273c8a967b28ecdce4c57a1805f0c Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Fri, 10 Apr 2026 09:56:43 -0400
Subject: [PATCH 003/221] [css-color-4][editorial] Move changes comment to the
right place
---
css-color-4/Overview.bs | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/css-color-4/Overview.bs b/css-color-4/Overview.bs
index dc69a3896226..b3a6c4f1c5be 100644
--- a/css-color-4/Overview.bs
+++ b/css-color-4/Overview.bs
@@ -7896,7 +7896,10 @@ Changes
Candidate Recommendation Draft of 24 April 2025
-
+
+ - Expanded the concept of analogous components to analogous sets of components, to minimize ''none'' → ''0'' conversions
+ (Issue 10210)
+
- Split color conversion into two stages
(Issue 10211)
@@ -7949,10 +7952,6 @@ Changes
- - Expanded the concept of analogous components to analogous sets of components, to minimize ''none'' → ''0'' conversions
- (Issue 10210)
-
-
- Clarified that inside the color property, it is the resolved inherited value (not the raw inherited value) that is used
- Listed categories of colors, such as those that resolve to sRGB or support legacy color syntax
- Added hue normalization examples
From 510e87eb13a66732a61934150dd016758a8ec18e Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Mon, 13 Apr 2026 11:53:37 -0400
Subject: [PATCH 004/221] [css-color] Improve visibility of the constraint that
shorter is the default he interpolation method
---
css-color-4/Overview.bs | 9 ++++++++-
css-color-5/Overview.bs | 8 +++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/css-color-4/Overview.bs b/css-color-4/Overview.bs
index b3a6c4f1c5be..d68a1f830d01 100644
--- a/css-color-4/Overview.bs
+++ b/css-color-4/Overview.bs
@@ -4933,6 +4933,10 @@ Color Space for Interpolation
interpolation should take place in,
it defaults to Oklab.
+ For a <>
+ if the [=hue-interpolation-method=] is not specified,
+ it defaults to [=shorter=].
+
However, user agents must handle interpolation
between legacy sRGB color formats
(hex colors, named colors,
@@ -7896,7 +7900,10 @@ Changes
Candidate Recommendation Draft of 24 April 2025
-
+
+ - Clarified in the main Color interpolation section that, if the hue interpolaton method is not specified, shorter is the default. (This was already specified in the Hue Interpolation section).
+ (Issue 13788)
+
- Expanded the concept of analogous components to analogous sets of components, to minimize ''none'' → ''0'' conversions
(Issue 10210)
diff --git a/css-color-5/Overview.bs b/css-color-5/Overview.bs
index d1f651d1fa7f..59318cf78845 100644
--- a/css-color-5/Overview.bs
+++ b/css-color-5/Overview.bs
@@ -2939,7 +2939,9 @@ or any other color or monochrome output device which has been characterized.
Color Space for Interpolation
- The <> is extended to allow use of the
+ The <>,
+ as defined in [[css-color-4#interpolation-space]],
+ is extended to allow use of the
custom color spaces:
@@ -3859,6 +3861,10 @@ This specification adds a way to ensure adequate contrast for text whose backgro
+ - Added a backlink from Color Interpolation in this specification,
+ to the same section in CSS Color 4 where most of this is defined
+ (Issue 13788)
+
- Added a second form of the light-dark() function,
which takes a pair of images rather than a pair of colors
(Issue 12513)
From 70c78d3437f1e431caf55528b24c853b512e7c57 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Mon, 13 Apr 2026 11:58:07 -0400
Subject: [PATCH 005/221] [css-color-4][editorial] correct autolinking syntax
---
css-color-4/Overview.bs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/css-color-4/Overview.bs b/css-color-4/Overview.bs
index d68a1f830d01..c90ff5dde648 100644
--- a/css-color-4/Overview.bs
+++ b/css-color-4/Overview.bs
@@ -42,6 +42,13 @@ spec: css-backgrounds-3; type: property; text: border-bottom-color
spec: css-backgrounds-3; type: property; text: border-right-color
spec: css-ui-4; type: dfn; text: accent color
spec: css-ui-4; type: property; text: accent-color
+spec:css-color-5; type:value; for:oklab();
+ text:a
+ text:b
+ text:l
+spec:css-color-5; type:value; for:oklch();
+ text:c
+ text:h
@@ -4934,7 +4941,7 @@ Color Space for Interpolation
it defaults to Oklab.
For a <>
- if the [=hue-interpolation-method=] is not specified,
+ if the <> is not specified,
it defaults to [=shorter=].
However, user agents must handle interpolation
From a3a9e4ef5b6414e1cebbe6b4938ef5c44d30d320 Mon Sep 17 00:00:00 2001
From: Kevin Babbitt
Date: Mon, 13 Apr 2026 10:47:09 -0700
Subject: [PATCH 006/221] [css-gaps-1] Clarify application of writing-mode and
direction to gap decorations. #13648, #13649 (#13732)
---
css-gaps-1/Overview.bs | 41 +++++++++++++++---
css-gaps-1/images/example-inset-direction.png | Bin 0 -> 9537 bytes
2 files changed, 36 insertions(+), 5 deletions(-)
create mode 100644 css-gaps-1/images/example-inset-direction.png
diff --git a/css-gaps-1/Overview.bs b/css-gaps-1/Overview.bs
index e930ba8f3773..e03b56a3b80f 100644
--- a/css-gaps-1/Overview.bs
+++ b/css-gaps-1/Overview.bs
@@ -169,6 +169,17 @@ Gap decorations
note that while the border and background of the container aren't scrolled,
the decorations need to scroll along with items in the container.
+ [=Gap decorations=] follow the definitions of "column" and "row" laid out by the container to which the properties are applied.
+ They depend on the container type taking writing mode and text direction into account when determining the meanings of these terms.
+ For examples, see:
+ [[CSS-MULTICOL-2#the-multi-column-model]],
+ [[CSS-FLEXBOX-1#flex-direction-property]],
+ and
+ [[CSS-GRID-1#grid-concepts]].
+
+ Properties in this specification whose names begin with "column" apply to [=column gaps=],
+ and properties in this specification whose names begin with "row" apply to [=row gaps=].
+
+
- Moved the animation-trigger property to a new spec, animation-triggers-1
+ (PR 13571)
+
+ - Define trigger scope. Flattened tree; removed anchor-scope reference
+ (PR 13241)
+
+ - Added play-once animation-action
+ (Issue 12611)
+
+ - Defined that event triggers can be defined to have enter/exit pairs, like timelines.
+ - Separated trigger concept from trigger instance
+ - Changed initial value of the exit ranges to 'auto', to match the start ranges
+
+ - Changed "animation-trigger-behavior" to "animation-trigger" and largely rewrote the definition
+ (PR 13009)
+
+ - Changed animation-trigger-type to animation-trigger-behavior
+ (PR 12223)
+
+ - Clarified that setting "effect" should not prevent the timeline to set "set" via animation-timeline
+ (PR 11812)
+
+ - Defined animation-trigger-* as reset-only sub-properties of animation
+ (PR 11653)
+
+ - Added note to Animation Frames about running the updating animation trigger state procedure
+ - Added algorithm for Setting a Trigger of an Animation
+ - Added the AnimationTrigger interface
+ - Moved all new definitions from web-animations-1 to web-animations-2
+ - Specified the animation-trigger property
+ (Issue 8942)
+
+ - Defined order for sorting animationcancel events
+ (Issue 11064)
+
+ - Made animation-duration:auto resolve to 0s, for legacy compat
+ (Issue 6530)
+
+ - Switched timeline names from <> to <>
+ (Issue 8746)
+
+
+
+Changes since the 2 March 2023 Working Draft:
- Added ''animation-duration/auto'' as the [=initial value=] of 'animation-duration'.
From a8df6533793a262666a80213bc7cb4ef2aa2fb99 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Tue, 14 Apr 2026 13:09:37 -0400
Subject: [PATCH 010/221] [css-color-4] Define color value comparison algorithm
#13157
Add a new "Comparing <> Values" section immediately before
"Color Interpolation", defining when two <> values are
"equivalent colors". The algorithm covers three cases: same color
space (component-by-component with epsilon, none only equals none),
different color spaces with a missing component (not equal), and
different color spaces with no missing components (convert to oklab,
compare with epsilon). Legacy sRGB syntaxes (rgb(), hsl(), hwb(),
hex, named, system colors) are normatively declared to share the
srgb color space. Used by style() container queries and CSS
Transitions to detect color changes.
Co-authored-by: Claude Sonnet 4.6
---
.claude/settings.local.json | 9 ++++
css-color-4/Overview.bs | 82 ++++++++++++++++++++++++++++++++++++-
2 files changed, 90 insertions(+), 1 deletion(-)
create mode 100644 .claude/settings.local.json
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
new file mode 100644
index 000000000000..a92f5c48ec8e
--- /dev/null
+++ b/.claude/settings.local.json
@@ -0,0 +1,9 @@
+{
+ "permissions": {
+ "allow": [
+ "WebFetch(domain:github.com)",
+ "WebFetch(domain:api.github.com)",
+ "Bash(xargs grep:*)"
+ ]
+ }
+}
diff --git a/css-color-4/Overview.bs b/css-color-4/Overview.bs
index c90ff5dde648..3f51ff434b94 100644
--- a/css-color-4/Overview.bs
+++ b/css-color-4/Overview.bs
@@ -4777,6 +4777,81 @@ where |src| and |dest| are different:
+
+
+
+Comparing <> Values
+
+ Two <> values are equivalent colors
+ when they compare as equal using the algorithm below.
+ This comparison is used,
+ for example,
+ by ''style()'' container queries [[CSS-CONDITIONAL-5]]
+ and by CSS Transitions [[CSS-TRANSITIONS-1]]
+ to determine whether a color value has changed.
+
+ Given two <> values C1 and C2,
+ they are [=equivalent colors=] if and only if
+ the following algorithm returns true:
+
+
+ -
+ For each of C1 and C2,
+ convert any [=powerless component=]s to [=missing component=]s.
+
+ -
+ If C1 and C2 share the same <>:
+
+ -
+ Compare their components one by one,
+ including the alpha channel.
+ A [=missing component=] is only equal to
+ another [=missing component=].
+ Two numeric components are considered equal
+ if they differ by no more than a small
+ implementation-defined ε.
+
+ -
+ Return true if and only if
+ all components compare as equal.
+
+
+
+ -
+ Otherwise, C1 and C2 are in different <>s.
+ If either color has at least one [=missing component=],
+ return false.
+
+ -
+ Otherwise, neither color has any [=missing component=].
+ Convert both C1 and C2 to ''oklab'',
+ then return true if and only if
+ all components (including alpha) of the converted colors
+ compare as equal,
+ using an implementation-defined ε as in step 2.
+
+
+
+ Note: Two colors that are expressed in different <>s
+ but are colorimetrically identical—for example,
+ ''red'' and ''color(srgb 1 0 0)''—are [=equivalent colors=]
+ by step 4 of this algorithm,
+ since they convert to the same ''oklab'' value.
+
+ For the purposes of this comparison,
+ ''rgb()'', ''rgba()'', ''hsl()'', ''hsla()'', ''hwb()'',
+ [=hex colors=], [=named colors=], and [=system colors=]
+ are all considered to be in the ''srgb'' <>.
+
+
+
+ - Added a new section defining when two <> values are [=equivalent colors=],
+ covering same-color-space component comparison, the treatment of [=missing component=]s,
+ and cross-color-space comparison via ''oklab''.
+ (Issue 13157)
+
- Clarified in the main Color interpolation section that, if the hue interpolaton method is not specified, shorter is the default. (This was already specified in the Hue Interpolation section).
(Issue 13788)
From debfff8dfbb357059c467461f73ce76bcd78e342 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Tue, 14 Apr 2026 13:42:00 -0400
Subject: [PATCH 011/221] [css-color-4][editorial] Add wpt, see #13157
---
css-color-4/Overview.bs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/css-color-4/Overview.bs b/css-color-4/Overview.bs
index 3f51ff434b94..01cbebcb3095 100644
--- a/css-color-4/Overview.bs
+++ b/css-color-4/Overview.bs
@@ -4851,6 +4851,10 @@ Comparing <> Values
[=hex colors=], [=named colors=], and [=system colors=]
are all considered to be in the ''srgb'' <>.
+
+ query-style-color.html
+
+
url: https://html.spec.whatwg.org/multipage/nav-history-apis.html#concept-navigationtransition-from
- type: dfn; spec: html; text: from entry;
+ type: dfn; spec: html; text: from entry;
url: https://html.spec.whatwg.org/multipage/nav-history-apis.html#window-navigation-api
- type: dfn; spec: html; text: navigation API;
+ type: dfn; spec: html; text: navigation API;
url: https://html.spec.whatwg.org/multipage/nav-history-apis.html#ongoing-navigate-event
- type: dfn; spec: html; text: ongoing navigate event;
+ type: dfn; spec: html; text: ongoing navigate event;
url: https://html.spec.whatwg.org/multipage/nav-history-apis.html#concept-navigation-transition
- type: dfn; spec: html; text: transition;
+ type: dfn; spec: html; text: transition;
url: https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigation-activation
- type: dfn; spec: html; text: activation;
+ type: dfn; spec: html; text: activation;
url: https://html.spec.whatwg.org/multipage/browsing-the-web.html#has-been-revealed
- type: dfn; spec: html; text: has been revealed;
+ type: dfn; spec: html; text: has been revealed;
url: https://drafts.csswg.org/css-view-transitions-1/#capture-the-image
- type: dfn; spec: css-view-transitions-1; text: capture the image;
+ type: dfn; spec: css-view-transitions-1; text: capture the image;
Declaring named URL patterns: the ''@route'' rule
@@ -69,19 +69,19 @@ The ''@route'' rule can be defined in one of two ways:
: with the pattern descriptor
:: in this case the URL pattern represented is
- the one represented by the <> function
- given as the descriptor's value.
+ the one represented by the <> function
+ given as the descriptor's value.
: with the other descriptors named by <>
:: In this case the URL pattern represented is the result of invoking
- [=URL pattern/create|create a URL pattern=] given
- input as {{URLPatternInit}}
- constructed from the descriptors and their values.
- Each dictionary member is given the value of
- the descriptor with the same name,
- except the baseURL member is given the value of
- the base-url descriptor.
- If a base-url descriptor is not given then one is created from
- the [=style resource base URL=] of the rule.
+ [=URL pattern/create|create a URL pattern=] given
+ input as {{URLPatternInit}}
+ constructed from the descriptors and their values.
+ Each dictionary member is given the value of
+ the descriptor with the same name,
+ except the baseURL member is given the value of
+ the base-url descriptor.
+ If a base-url descriptor is not given then one is created from
+ the [=style resource base URL=] of the rule.
ISSUE: Should this use <>, <>, or <>
for the route names?
@@ -140,14 +140,14 @@ These queries are called navigation queries.
Authors can use it to:
* write style sheets that apply to multiple pages
- but behave somewhat differently between those pages,
+ but behave somewhat differently between those pages,
* write style sheets that apply to
- single page applications
- that change their URL over time,
- so that style changes when the URL changes, and
+ single page applications
+ that change their URL over time,
+ so that style changes when the URL changes, and
* write style sheets that declaratively start view transitions
- (or make other appropriate style changes)
- in response to navigations.
+ (or make other appropriate style changes)
+ in response to navigations.
The syntax of the condition in the ''@navigation'' rule
is similar to that defined for
@@ -238,75 +238,75 @@ Many of these grammar terms are associated with a boolean result,
as follows:
: <>
-:: : not <>
- :: The result is the negation of the <> term.
+:: : not <>
+ :: The result is the negation of the <> term.
- : <> [ and <> ]*
- ::
- The result is true if all of the <> child terms are true,
- and false otherwise.
+ : <> [ and <> ]*
+ ::
+ The result is true if all of the <> child terms are true,
+ and false otherwise.
- : <> [ or <> ]*
- ::
- The result is false if all of the <> child terms are false,
- and true otherwise.
+ : <> [ or <> ]*
+ ::
+ The result is false if all of the <> child terms are false,
+ and true otherwise.
: <>
:: The result is the result of the child subexpression.
: <>
-:: : at: <>
- :: The result is whether the result of
- [=URL pattern/match|match a URL pattern=] is non-null
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as the document's [=Document/URL=].
-
- : from: <>
- :: The result is true if
- the [=current from URL=] from of the document is non-null and
- [=URL pattern/match|match a URL pattern=] is non-null when
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as from.
-
- : to: <>
- :: The result is true if
- the [=current to URL=] to of the document is non-null and
- [=URL pattern/match|match a URL pattern=] is non-null when
- given urlPattern as
- the [=navigation location URL pattern=] of <>
- and input as to.
+:: : at: <>
+ :: The result is whether the result of
+ [=URL pattern/match|match a URL pattern=] is non-null
+ given urlPattern as
+ the [=navigation location URL pattern=] of <>
+ and input as the document's [=Document/URL=].
+
+ : from: <>
+ :: The result is true if
+ the [=current from URL=] from of the document is non-null and
+ [=URL pattern/match|match a URL pattern=] is non-null when
+ given urlPattern as
+ the [=navigation location URL pattern=] of <>
+ and input as from.
+
+ : to: <>
+ :: The result is true if
+ the [=current to URL=] to of the document is non-null and
+ [=URL pattern/match|match a URL pattern=] is non-null when
+ given urlPattern as
+ the [=navigation location URL pattern=] of <>
+ and input as to.
: <>
-:: : history: traverse
- :: True if the [=current navigation type=] is {{NavigationType/traverse}}.
- : history: back
- :: True if the [=current navigation type=] is {{NavigationType/traverse}} and
- the [=current navigation delta=] is less than 0.
- : history: forward
- :: True if the [=current navigation type=] is {{NavigationType/traverse}} and
- the [=current navigation delta=] is greater than 0.
- : history: reload
- :: True if the [=current navigation type=] is {{NavigationType/reload}}.
+:: : history: traverse
+ :: True if the [=current navigation type=] is {{NavigationType/traverse}}.
+ : history: back
+ :: True if the [=current navigation type=] is {{NavigationType/traverse}} and
+ the [=current navigation delta=] is less than 0.
+ : history: forward
+ :: True if the [=current navigation type=] is {{NavigationType/traverse}} and
+ the [=current navigation delta=] is greater than 0.
+ : history: reload
+ :: True if the [=current navigation type=] is {{NavigationType/reload}}.
: <>
::
- The result is false.
+ The result is false.
- Authors must not use <> in their stylesheets.
- It exists only for future-compatibility,
- so that new syntax additions do not invalidate too much of a <> in older user agents.
+ Authors must not use <> in their stylesheets.
+ It exists only for future-compatibility,
+ so that new syntax additions do not invalidate too much of a <> in older user agents.
The navigation location URL pattern of a <>
depends on the type of <>:
: <>
-:: the URL pattern represented by the ''@route'' rule referenced by the name.
+:: the URL pattern represented by the ''@route'' rule referenced by the name.
: <>
-:: The [=URL pattern=] represented by the function; see
- [=create a URL pattern for url-pattern()=].
+:: The [=URL pattern=] represented by the function; see
+ [=create a URL pattern for url-pattern()=].
ISSUE: Should it also be possible to reference
a name defined in a routemap?
@@ -457,7 +457,7 @@ and the pseudo-class matches any element where:
A <> matches the target of the link when both:
* the <> matches the target of the link, and
* the <> matches the target of the link,
- with the [=URL pattern=] represented by the <> as context
+ with the [=URL pattern=] represented by the <> as context
A <> represents a [=URL pattern=].
If the <> is a <>,
@@ -482,43 +482,43 @@ and based on whether each <> matches the URL
A <> matches the URL input (with a URL Pattern urlPattern as context)
if the following steps return true:
1. Let matchResult be the result of
- [=URL pattern/match|match a URL pattern=]
- given urlPattern and input.
- the [=URL pattern=]
- represented by the <> function in the <>
- (see [=create a URL pattern for url-pattern()=])
+ [=URL pattern/match|match a URL pattern=]
+ given urlPattern and input.
+ the [=URL pattern=]
+ represented by the <> function in the <>
+ (see [=create a URL pattern for url-pattern()=])
1. If matchResult is null, return false.
- NOTE: This doesn't really matter because
- in this case the <> also doesn't match.
+ NOTE: This doesn't really matter because
+ in this case the <> also doesn't match.
1. For each property prop of matchResult (a {{URLPatternResult}})
- that is a {{URLPatternComponentResult}}:
- 1. For each [=map/entry=] entry in its {{URLPatternComponentResult/groups}},
- then:
- 1. If <> is a <>,
- return true if
- entry's [=map/key=] is the <>
- and entry's [=map/value=] is the <>.
- 1. If <> is a <>,
- and entry's [=map/key=] is the function's <>,
- then for each navigationUrl of the
- [=current to URL=]
- and [=current from URL=]:
- 1. Let navigationMatchResult be the result of
- [=URL pattern/match|match a URL pattern=]
- given urlPattern and navigationUrl.
- 1. If navigationMatchResult is null, [=continue=].
- 1. Return true if navigationMatchResult's
- property prop
- has an [=map/entry=]
- whose [=map/key=] is the same as entry's key
- and whose [=map/value=] is the same as entry's value.
-
- NOTE: This step makes the ''navigation-param()'' function
- perform what is essentially a three-way match,
- between the target of the link,
- the provided URL pattern,
- and the from or to URL of the current navigation.
+ that is a {{URLPatternComponentResult}}:
+ 1. For each [=map/entry=] entry in its {{URLPatternComponentResult/groups}},
+ then:
+ 1. If <> is a <>,
+ return true if
+ entry's [=map/key=] is the <>
+ and entry's [=map/value=] is the <>.
+ 1. If <> is a <>,
+ and entry's [=map/key=] is the function's <>,
+ then for each navigationUrl of the
+ [=current to URL=]
+ and [=current from URL=]:
+ 1. Let navigationMatchResult be the result of
+ [=URL pattern/match|match a URL pattern=]
+ given urlPattern and navigationUrl.
+ 1. If navigationMatchResult is null, [=continue=].
+ 1. Return true if navigationMatchResult's
+ property prop
+ has an [=map/entry=]
+ whose [=map/key=] is the same as entry's key
+ and whose [=map/value=] is the same as entry's value.
+
+ NOTE: This step makes the ''navigation-param()'' function
+ perform what is essentially a three-way match,
+ between the target of the link,
+ the provided URL pattern,
+ and the from or to URL of the current navigation.
NOTE: Some of the design discussion for this feature has been in
w3c/csswg-drafts#13163.
@@ -533,86 +533,86 @@ The current from URL of a [=/document=] is a URL or null.
It is defined as follows:
1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
- its [=from entry=]'s {{NavigationHistoryEntry/url}}.
+ its [=transition=] is non-null,
+ its [=from entry=]'s {{NavigationHistoryEntry/url}}.
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ NOTE: This part is for when the old document in the navigation
+ is still the current document.
1. If the [=document's navigation API=] of the document is non-null,
- its [=activation=] is non-null,
- the activation's {{NavigationActivation/from}} is non-null, and
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- the activation's {{NavigationActivation/from}}'s
- {{NavigationHistoryEntry/url}}.
+ its [=activation=] is non-null,
+ the activation's {{NavigationActivation/from}} is non-null, and
+ the document's [=has been revealed=] is false or
+ was false at the start of the current [=task=],
+ the activation's {{NavigationActivation/from}}'s
+ {{NavigationHistoryEntry/url}}.
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+ NOTE: This part is for when the new document in the navigation
+ has become the current document.
1. Otherwise, null.
- NOTE: The previous two branches can also produce null results.
+ NOTE: The previous two branches can also produce null results.
The current to URL of a [=/document=] is a URL or null.
It is defined as follows:
1. If the [=document's navigation API=] of the document is non-null and
- its [=ongoing navigate event=] is non-null:
+ its [=ongoing navigate event=] is non-null:
- 1. if the {{pageswap}} event has fired since that navigation began,
- and its {{PageSwapEvent/activation}} was non-null,
- and that {{PageSwapEvent/activation}}'s
- {{NavigationActivation/entry}}'s
- {{NavigationHistoryEntry/url}} is non-null,
- then that
- {{NavigationHistoryEntry/url}}.
+ 1. if the {{pageswap}} event has fired since that navigation began,
+ and its {{PageSwapEvent/activation}} was non-null,
+ and that {{PageSwapEvent/activation}}'s
+ {{NavigationActivation/entry}}'s
+ {{NavigationHistoryEntry/url}} is non-null,
+ then that
+ {{NavigationHistoryEntry/url}}.
- NOTE: This part does expose the result of redirects.
+ NOTE: This part does expose the result of redirects.
- NOTE: This part is not relevant to normal page rendering.
- However, it can be relevant to what is rendered
- when [=capturing the image=]
- for a [[css-view-transitions-2#cross-document-view-transitions|cross-document view transition]].
+ NOTE: This part is not relevant to normal page rendering.
+ However, it can be relevant to what is rendered
+ when [=capturing the image=]
+ for a [[css-view-transitions-2#cross-document-view-transitions|cross-document view transition]].
- ISSUE: Is the final "non-null" check needed?
+ ISSUE: Is the final "non-null" check needed?
- 1. otherwise, the [=ongoing navigate event=]'s
- {{NavigateEvent/destination}}'s
- {{NavigationDestination/url}}
+ 1. otherwise, the [=ongoing navigate event=]'s
+ {{NavigateEvent/destination}}'s
+ {{NavigationDestination/url}}
- NOTE: This part does not expose the result of redirects.
+ NOTE: This part does not expose the result of redirects.
- ISSUE: This assumes that the [=ongoing navigate event=]
- and the [=transition=] have the same lifetime,
- but this isn't really
- true if the event is intercepted.
- After
- whatwg/html#11690 /
- whatwg/html#11692.
- we could probably define this more like "from" above.
- But which lifetime is the one we want?
+ ISSUE: This assumes that the [=ongoing navigate event=]
+ and the [=transition=] have the same lifetime,
+ but this isn't really
+ true if the event is intercepted.
+ After
+ whatwg/html#11690 /
+ whatwg/html#11692.
+ we could probably define this more like "from" above.
+ But which lifetime is the one we want?
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ NOTE: This part is for when the old document in the navigation
+ is still the current document.
1. If the [=document's navigation API=] of the document is non-null and
- its [=activation=] is non-null,
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- and the activation's {{NavigationActivation/entry}}'s
- {{NavigationHistoryEntry/url}}.
+ its [=activation=] is non-null,
+ the document's [=has been revealed=] is false or
+ was false at the start of the current [=task=],
+ and the activation's {{NavigationActivation/entry}}'s
+ {{NavigationHistoryEntry/url}}.
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+ NOTE: This part is for when the new document in the navigation
+ has become the current document.
- ISSUE: Does it make sense to expose this when
- the activation's {{NavigationActivation/from}} is null,
- and thus there is no [=current from URL=]?
+ ISSUE: Does it make sense to expose this when
+ the activation's {{NavigationActivation/from}} is null,
+ and thus there is no [=current from URL=]?
1. Otherwise, null.
- NOTE: The previous two branches can also produce null results.
+ NOTE: The previous two branches can also produce null results.
ISSUE: The above definitions of from and to apparently don't work right
if you start a same-document navigation (e.g., with {{History/pushState}})
@@ -622,20 +622,20 @@ The current navigation type of a [=/document=] is a {{NavigationType}
It is defined as follows:
1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
- the transition's {{NavigationTransition/navigationType}}.
+ its [=transition=] is non-null,
+ the transition's {{NavigationTransition/navigationType}}.
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ NOTE: This part is for when the old document in the navigation
+ is still the current document.
1. If the [=document's navigation API=] of the document is non-null and
- its [=activation=] is non-null,
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
- the activation's {{NavigationActivation/navigationType}}.
+ its [=activation=] is non-null,
+ the document's [=has been revealed=] is false or
+ was false at the start of the current [=task=],
+ the activation's {{NavigationActivation/navigationType}}.
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+ NOTE: This part is for when the new document in the navigation
+ has become the current document.
1. Otherwise, null.
@@ -643,33 +643,33 @@ The current navigation delta of a [=/document=] is a {{NavigationType
It is defined as follows:
1. If the [=document's navigation API=] of the document is non-null and
- its [=transition=] is non-null,
+ its [=transition=] is non-null,
- 1. If the transition's {{NavigationTransition/navigationType}} is not {{NavigationType/traverse}}, null.
+ 1. If the transition's {{NavigationTransition/navigationType}} is not {{NavigationType/traverse}}, null.
- 1. Otherwise,
- the transition's {{NavigationTransition/to}}'s {{NavigationDestination/index}}
- minus
- the transition's {{NavigationTransition/from}}'s {{NavigationHistoryEntry/index}}.
+ 1. Otherwise,
+ the transition's {{NavigationTransition/to}}'s {{NavigationDestination/index}}
+ minus
+ the transition's {{NavigationTransition/from}}'s {{NavigationHistoryEntry/index}}.
- NOTE: This part is for when the old document in the navigation
- is still the current document.
+ NOTE: This part is for when the old document in the navigation
+ is still the current document.
1. If the [=document's navigation API=] of the document is non-null,
- its [=activation=] is non-null,
- the activation's {{NavigationActivation/from}} is non-null, and
- the document's [=has been revealed=] is false or
- was false at the start of the current [=task=],
+ its [=activation=] is non-null,
+ the activation's {{NavigationActivation/from}} is non-null, and
+ the document's [=has been revealed=] is false or
+ was false at the start of the current [=task=],
- 1. If the activation's {{NavigationActivation/navigationType}} is not {{NavigationType/traverse}}, null.
+ 1. If the activation's {{NavigationActivation/navigationType}} is not {{NavigationType/traverse}}, null.
- 1. Otherwise,
- the activation's {{NavigationActivation/entry}}'s {{NavigationHistoryEntry/index}}
- minus
- the activation's {{NavigationActivation/from}}'s {{NavigationHistoryEntry/index}}.
+ 1. Otherwise,
+ the activation's {{NavigationActivation/entry}}'s {{NavigationHistoryEntry/index}}
+ minus
+ the activation's {{NavigationActivation/from}}'s {{NavigationHistoryEntry/index}}.
- NOTE: This part is for when the new document in the navigation
- has become the current document.
+ NOTE: This part is for when the new document in the navigation
+ has become the current document.
1. Otherwise, null.
@@ -706,30 +706,30 @@ using the steps of the create a URL pattern for url-pattern() algorit
1. Let arg be the <> argument to the ''url-pattern()'' function.
1. Let baseURL be the [=style resource base URL=] of
- the rule or declaration block containing the ''url-pattern()'' function.
-
-
- Do we want this to be the base URL all the time?
- For use of ''url-pattern()'' in ''@navigation'',
- it's likely more useful for the base URL
- to be the document URL rather than the style sheet URL.
- However, it would be very awkward for ''url-pattern()''
- to be inconsistent with ''url()''.
-
- Should we allow the base URL of ''url-pattern()''
- to be defined by the consumer?
- Should we introduce document-url-pattern()?
- Should we do something similar to
- [[css-images-3#ambiguous-urls]]
- (see )?
-
- Also see other proposed uses of {{URLPattern}} in CSS
- in ,
- for '':local-link''.
-
+ the rule or declaration block containing the ''url-pattern()'' function.
+
+
+ Do we want this to be the base URL all the time?
+ For use of ''url-pattern()'' in ''@navigation'',
+ it's likely more useful for the base URL
+ to be the document URL rather than the style sheet URL.
+ However, it would be very awkward for ''url-pattern()''
+ to be inconsistent with ''url()''.
+
+ Should we allow the base URL of ''url-pattern()''
+ to be defined by the consumer?
+ Should we introduce document-url-pattern()?
+ Should we do something similar to
+ [[css-images-3#ambiguous-urls]]
+ (see )?
+
+ Also see other proposed uses of {{URLPattern}} in CSS
+ in ,
+ for '':local-link''.
+
1. Return the result of [=URL pattern/create|create a URL pattern=] given
- arg, baseURL, and an empty [=map=].
+ arg, baseURL, and an empty [=map=].
NOTE: This function requires that its argument is quoted.
This differs from the ''url()'' function,
From 860489eab94b8f540c50a9c066064dd0a9f58be6 Mon Sep 17 00:00:00 2001
From: "L. David Baron"
Date: Thu, 16 Apr 2026 14:49:34 -0400
Subject: [PATCH 036/221] Update make REMOTE=1 commands to show bikeshed
messages too.
---
css-navigation-1/Makefile | 17 +++++++++++++++++
css-transforms-1/Makefile | 4 +++-
css-transforms-2/Makefile | 4 +++-
css-viewport-1/Makefile | 4 +++-
cssom-1/Makefile | 4 +++-
cssom-view-1/Makefile | 4 +++-
filter-effects-2/Makefile | 4 +++-
web-animations-css-integration/Makefile | 4 +++-
8 files changed, 38 insertions(+), 7 deletions(-)
create mode 100644 css-navigation-1/Makefile
diff --git a/css-navigation-1/Makefile b/css-navigation-1/Makefile
new file mode 100644
index 000000000000..dd2cc9dcffe4
--- /dev/null
+++ b/css-navigation-1/Makefile
@@ -0,0 +1,17 @@
+# Use "make REMOTE=1" to use remote bikeshed
+
+SOURCEFILE=Overview.bs
+OUTPUTFILE=Overview.html
+PREPROCESSOR=bikeshed.py
+REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
+
+all: $(OUTPUTFILE)
+
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
+ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
+else
+ $(PREPROCESSOR) -f spec "$<" "$@"
+endif
diff --git a/css-transforms-1/Makefile b/css-transforms-1/Makefile
index 7daaf1c1937f..08b56216e0d6 100755
--- a/css-transforms-1/Makefile
+++ b/css-transforms-1/Makefile
@@ -9,8 +9,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/css-transforms-2/Makefile b/css-transforms-2/Makefile
index 243dd97e8ff8..f6c64a785beb 100755
--- a/css-transforms-2/Makefile
+++ b/css-transforms-2/Makefile
@@ -11,8 +11,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/css-viewport-1/Makefile b/css-viewport-1/Makefile
index 5f8c05558b09..d043b18e4103 100644
--- a/css-viewport-1/Makefile
+++ b/css-viewport-1/Makefile
@@ -11,8 +11,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/cssom-1/Makefile b/cssom-1/Makefile
index 243dd97e8ff8..f6c64a785beb 100755
--- a/cssom-1/Makefile
+++ b/cssom-1/Makefile
@@ -11,8 +11,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/cssom-view-1/Makefile b/cssom-view-1/Makefile
index 243dd97e8ff8..f6c64a785beb 100755
--- a/cssom-view-1/Makefile
+++ b/cssom-view-1/Makefile
@@ -11,8 +11,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/filter-effects-2/Makefile b/filter-effects-2/Makefile
index db38b5e399b9..b18d2a0cb4aa 100755
--- a/filter-effects-2/Makefile
+++ b/filter-effects-2/Makefile
@@ -8,8 +8,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
diff --git a/web-animations-css-integration/Makefile b/web-animations-css-integration/Makefile
index 26c6ded17f4c..e53060dd609a 100755
--- a/web-animations-css-integration/Makefile
+++ b/web-animations-css-integration/Makefile
@@ -11,8 +11,10 @@ REMOTE_PREPROCESSOR_URL=https://www.w3.org/publications/spec-generator/
all: $(OUTPUTFILE)
-$(OUTPUTFILE): $(SOURCEFILE)
+$(OUTPUTFILE): $(SOURCEFILE) Makefile
ifneq (,$(REMOTE))
+ curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F output=messages -F type=bikeshed-spec
+ @echo
curl $(REMOTE_PREPROCESSOR_URL) -F file=@$(SOURCEFILE) -F type=bikeshed-spec > "$@"
else
$(PREPROCESSOR) -f spec "$<" "$@"
From 02095d62459437a3f2431a94b0c1c011447e8c15 Mon Sep 17 00:00:00 2001
From: Guillaume
Date: Thu, 16 Apr 2026 23:44:23 +0200
Subject: [PATCH 037/221] [css-fonts][css-prints][css-values][editorial] Add
font- prefix to production names (#13272)
Co-authored-by: Chris Lilley
---
css-fonts-4/Overview.bs | 193 ++++++++++++++++++++++++++++-----------
css-fonts-5/Overview.bs | 4 +-
css-print/Overview.bs | 4 +-
css-values-3/Overview.bs | 2 +-
css-values-4/Overview.bs | 2 +-
cssom-1/Overview.bs | 4 +-
6 files changed, 147 insertions(+), 62 deletions(-)
diff --git a/css-fonts-4/Overview.bs b/css-fonts-4/Overview.bs
index f15a64cded0d..4e3b78307082 100644
--- a/css-fonts-4/Overview.bs
+++ b/css-fonts-4/Overview.bs
@@ -120,12 +120,12 @@ Font family: the 'font-family!!property' property
Name: font-family
- Value: [ <> | <> ]#
+ Value: [ <> | <> ]#
Initial: depends on user agent
Applies to: all elements and text
Inherited: yes
Percentages: n/a
- Computed value: list, each item a string and/or <> keywords
+ Computed value: list, each item a string and/or <> keywords
Animation type: discrete
@@ -214,20 +214,20 @@ Font family: the 'font-family!!property' property
There are three types of font family names, two of which may be used with this property:
- - <>
-
-
- The name of a font family, such as Helvetica or Verdana in the previous example.
+
- <>
+
-
+ The name of a font family, such as Helvetica or Verdana in the previous example.
This might be a locally-instaled font, or might be a web font.
-
- <>
-
-
- Each <> keyword represents
- a generic font choice,
- and behaves as a potential alias for one or more locally-installed fonts
- belonging to the specified generic font category.
- A <> can thus be used as a fallback
- for when an author's more specific font choices are not available.
+
- <>
+
-
+ Each <> keyword represents
+ a generic font choice,
+ and behaves as a potential alias for one or more locally-installed fonts
+ belonging to the specified generic font category.
+ A <> can thus be used as a fallback
+ for when an author's more specific font choices are not available.
There are three types of generic family:
@@ -251,12 +251,12 @@ Font family: the 'font-family!!property' property
and to use a more specific generic font family, if applicable,
to prefer a specific style even if the individual named font family is not available.
- Note that <> keywords cannot be quoted
- (otherwise they are interpreted as a <>).
+ Note that <> keywords cannot be quoted
+ (otherwise they are interpreted as a <>).
The set of generic family keywords is defined in [[#generic-font-families]].
-
- <>
+
- <>
-
A locally installed system font, whose use is subject to certain constraints.
In particular, it may not be used with the ''font-family'' property,
@@ -286,11 +286,11 @@ Font family: the 'font-family!!property' property
-
-Syntax of <>
+
+Syntax of <>
- <> = <> | <>+
+ <> = <> | <>+
Font family names other than generic families or system font families
must either be given quoted as <>s,
@@ -320,7 +320,7 @@ Syntax of <>
Note: this means that if you really have a font
whose name
- is the same as one of the <> names,
+ is the same as one of the <> names,
or the system font names,
or the [=CSS-wide keywords=],
it must be quoted.
@@ -338,7 +338,7 @@ Syntax of <>
- If a sequence of identifiers is given as a <>,
+ If a sequence of identifiers is given as a <>,
the computed value is the name
converted to a string
by joining all the identifiers in the sequence by single spaces.
@@ -361,28 +361,28 @@ Syntax of <>
Font family names that happen to be the same as
a 'font-family!!property' keyword value
(e.g. CSS-wide keywords such as ''inherit'', or
- <> keywords such as ''serif'')
+ <> keywords such as ''serif'')
must be quoted to prevent confusion
with the keywords of the same names.
- UAs must not consider these keywords as matching the <> type.
+ UAs must not consider these keywords as matching the <> type.
-Syntax of <>
+Syntax of <>
-
-
- <> = <>| <> | <>
- <> = ''font-family/generic(fangsong)'' | ''font-family/generic(kai)'' | ''font-family/generic(khmer-mul)'' | ''font-family/generic(nastaliq)''
- <> = ''font-family/serif'' | ''font-family/sans-serif'' | ''font-family/system-ui'' | ''font-family/cursive'' | ''font-family/fantasy'' | ''font-family/math'' | ''font-family/monospace''
- <> = ''font-family/ui-serif'' | ''font-family/ui-sans-serif'' | ''font-family/ui-monospace'' | ''font-family/ui-rounded''
-
+ <> = generic(<>) | <> | <>
+ <> = kai | fangsong | nastaliq
+ <> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
+ <> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
+ -->
+
+
+ <> = <>| <> | <>
+ <> = ''generic(fangsong)'' | ''generic(kai)'' | ''generic(khmer-mul)'' | ''generic(nastaliq)''
+ <> = ''serif'' | ''sans-serif'' | ''system-ui'' | ''cursive'' | ''fantasy'' | ''math'' | ''monospace''
+ <> = ''ui-serif'' | ''ui-sans-serif'' | ''ui-monospace'' | ''ui-rounded''
+
To make the syntax less succeptible to clashes, more recently defined generic font families are identified using a functional syntax.
@@ -400,11 +400,11 @@ Syntax of <>
-Syntax of <>
+Syntax of <>
- <> = ''caption'' | ''icon'' | ''menu'' | ''message-box'' | ''small-caption'' | ''status-bar''
+ <> = ''caption'' | ''icon'' | ''menu'' | ''message-box'' | ''small-caption'' | ''status-bar''
@@ -464,23 +464,23 @@ Generic font families
generic-family-keywords-002.html
- Note: Generic font families are intended to be widely implemented on many platforms, unlike arbitrary <>s which are usually platform-specific names. They are expected to map to different fonts on different platforms. Authors may specify these generic family names if they desire their text to follow a particular design on many platforms, and are not particular about which specific font is chosen on those platforms.
+ Note: Generic font families are intended to be widely implemented on many platforms, unlike arbitrary <>s which are usually platform-specific names. They are expected to map to different fonts on different platforms. Authors may specify these generic family names if they desire their text to follow a particular design on many platforms, and are not particular about which specific font is chosen on those platforms.
User agents should provide reasonable default choices for the generic font families,
that express the characteristics of each family as well as possible,
within the limits allowed by the underlying technology.
User agents are encouraged to allow users to select alternative faces for the generic font families.
-
- - serif
-
-
- Serif fonts represent
- glyphs that have finishing strokes,
- flared or tapering ends,
- or have actual serifed endings (including slab serifs).
- Serif fonts are typically proportionately-spaced.
- They often display a greater variation between thick and thin strokes
- than fonts from the ''sans-serif'' generic font family.
+
+ - serif
+
-
+ Serif fonts represent
+ glyphs that have finishing strokes,
+ flared or tapering ends,
+ or have actual serifed endings (including slab serifs).
+ Serif fonts are typically proportionately-spaced.
+ They often display a greater variation between thick and thin strokes
+ than fonts from the ''sans-serif'' generic font family.
Note: ''serif'' and ''sans-serif''
only apply to a small handful of writing scripts.
@@ -1785,7 +1785,7 @@ Shorthand font property: the 'font' property
<<'font-weight'>> ||
<> ]? <<'font-size'>> [ / <<'line-height'>> ]?
<<'font-family'>># ] |
- <>
+ <>
Initial: see individual properties
Applies to: all elements and text
Inherited: yes
@@ -2695,7 +2695,7 @@ The ''@font-face'' rule
Name: font-family
- Value: <>
+ Value: <>
For: @font-face
Initial: N/A
@@ -2757,6 +2757,13 @@ The ''@font-face'' rule
Parsing the 'src!!descriptor' descriptor
+To parse a <> production, [=parse a list=] of <>s.
+
+<font-src> = <> [ format(<>)]? [ tech( <>#)]? | local(<>)
+
+<font-format>
+ = [<> | collection | embedded-opentype | opentype
+ | svg | truetype | woff | woff2 ]
To parse a <> production, [=parse a list=] of <>s.
@@ -2949,7 +2956,7 @@ The ''@font-face'' rule
a locally available copy of a given font
and download it if it's not,
local() can be used.
- The locally-installed <> argument to local()
+ The locally-installed <> argument to local()
is a format-specific string
that uniquely identifies a single font face
within a larger family.
@@ -2964,7 +2971,7 @@ The ''@font-face'' rule
separated by a single space;
and thus,
CSS-wide keywords such as ''inherit'', and
- <> keywords such as ''serif''
+ <> keywords such as ''serif''
are not allowed inside local().
@@ -6047,6 +6054,32 @@ Defining font specific alternates: the @font-feature-values rule
Basic syntax
+An ''@font-feature-values'' rule's prelude
+contains a list of font family names,
+followed by a block containing multiple ''feature-value-block''s,
+a special type of subsidiary at-rule.
+Each ''feature-value-block''' contains declarations
+mapping author-chosen human-friendly names
+(such as "flowing")
+to feature indexes for the associated feature.
+
+Each <> has the same meaning
+as the corresponding value of the 'font-variant-alternates' property.
+
+
+@font-feature-values = @font-feature-values <># { <> }
+
+font-feature-value-type = <<@stylistic>> | <<@historical-forms>> | <<@styleset>> | <<@character-variant>>
+ | <<@swash>> | <<@ornaments>> | <<@annotation>>
+
+@stylistic = @stylistic { <> }
+@historical-forms = @historical-forms { <> }
+@styleset = @styleset { <> }
+@character-variant = @character-variant { <> }
+@swash = @swash { <> }
+@ornaments = @ornaments { <> }
+@annotation = @annotation { <> }
+
An ''@font-feature-values'' rule's prelude
contains a list of font family names,
followed by a block containing multiple feature value blocks,
@@ -6079,6 +6112,58 @@ Defining font specific alternates: the @font-feature-values rule
test_font_feature_values_parsing.html
+The ''@font-feature-values'' prelude
+is a comma-delimited list of font family names that match the definition of <>
+for the 'font-family!!property' property.
+This means that only named font families are allowed;
+rules that include generic or system fonts in the list of font families are syntax errors.
+However, if a user agent defines a generic font to be a specific named font (e.g. Helvetica),
+the settings associated with that family name will be used.
+If syntax errors occur within the <> list,
+the entire rule ''@font-feature-values'' rule is invalid
+and must be ignored.
+
+The ''@font-feature-values'' block accepts <> as its contents;
+these list items are either:
+
+- [=at-rules=] named by one of the <> at-keyword tokens
+
+or
+
+- the '@font-feature-values/font-display' descriptor.
+
+
+
+Specifying the same <> more than once is valid;
+their contents are cascaded together.
+Each <> accepts a list of [=declarations=],
+the font feature value declarations,
+where the declaration's name can be any [=identifier=],
+and the value must be a list of one or more non-negative <>s.
+
+The <>s accept any declaration name;
+these names must be identifiers,
+per standard CSS syntax rules,
+and are [=case-sensitive=]
+(so ''foo: 1;'' and ''FOO: 2'' define two different features).
+Each declaration's value must match the grammar ''<>+'',
+or else the declaration is invalid and must be ignored.
+
+Note: Each feature name is unique only within a single <>.
+Between different <>s,
+or the same type of <>s in separate ''@font-feature-values'' rules,
+names can be reused without colliding.
+
+For each <> in the ''@font-feature-values'' prelude,
+each [=font feature value declaration=] defines a mapping between a
+(family name, feature block name, declaration name) [=tuple=]
+and the list of one or more integers from the declaration's value.
+If the same tuple appears more than once in a document
+(such as if a single block),
+the last-defined one is used.
+
+
+ For example, the following all define the exact same set of font feature values:
The ''@font-feature-values'' prelude
is a comma-delimited list of font family names that match the definition of <
>
for the 'font-family!!property' property.
@@ -7881,7 +7966,7 @@ Font family: the '@font-palette-values/font-family' descriptor
Name: font-family
- Value: <>#
+ Value: <>#
For: @font-palette-values
Initial: N/A
diff --git a/css-fonts-5/Overview.bs b/css-fonts-5/Overview.bs
index 75b76e7503f1..dc672f4ecf35 100644
--- a/css-fonts-5/Overview.bs
+++ b/css-fonts-5/Overview.bs
@@ -212,7 +212,7 @@ in CSS Fonts Level 4, the following new generic font families are also defined.
Issue(4910):
-
+
- xxx
-
Placeholder text for the xxx generic font family.
@@ -509,7 +509,7 @@ according to section [[css-syntax#parse-comma-separated-list-of-component-values
Then each component value is parsed according to this grammar:
-
<> [ format(<>)]? [ tech( <>#)]? | local(<>)
+<> [ format(<>)]? [ tech( <>#)]? | local(<>)
<font-format>
= [<> | collection | embedded-opentype | opentype
diff --git a/css-print/Overview.bs b/css-print/Overview.bs
index 32f8c5253068..5cecb324cabe 100644
--- a/css-print/Overview.bs
+++ b/css-print/Overview.bs
@@ -574,8 +574,8 @@ small-caption | status-bar | inherit
| 'font-family' |
MUST* |
MUST* |
-[[ <family-name> | <generic-family> ],]* [
-<family-name> | <generic-family> ] | inherit |
+[[ <font-family-name> | <generic-font-family> ],]* [
+<font-family-name> | <generic-font-family> ] | inherit |
depends on user agent |
| 'font-size' |
diff --git a/css-values-3/Overview.bs b/css-values-3/Overview.bs
index 12dd0cb8475c..c0587823e447 100644
--- a/css-values-3/Overview.bs
+++ b/css-values-3/Overview.bs
@@ -418,7 +418,7 @@ Property Value Examples
''overline underline''
|
| font-family
- | [ <family-name> | <generic-family> ]#
+ | [ <font-family-name> | <generic-font-family> ]#
| ''"Gill Sans", Futura, sans-serif''
|
| 'border-width'
diff --git a/css-values-4/Overview.bs b/css-values-4/Overview.bs
index a200cd66c655..8c122f39528c 100644
--- a/css-values-4/Overview.bs
+++ b/css-values-4/Overview.bs
@@ -490,7 +490,7 @@ Property Value Examples
| ''overline underline''
|
| font-family
- | [ <family-name> | <generic-family> ]#
+ | [ <font-family-name> | <generic-font-family> ]#
| ''"Gill Sans", Futura, sans-serif''
|
'border-width'
diff --git a/cssom-1/Overview.bs b/cssom-1/Overview.bs
index f573b05291bf..63b58abcb706 100644
--- a/cssom-1/Overview.bs
+++ b/cssom-1/Overview.bs
@@ -3215,7 +3215,7 @@ For other color functions, see
- <>
-
- <>
+
- <>
- The string
serialized as a string.
@@ -3235,7 +3235,7 @@ For other color functions, see
<border-width>,
<border-style>,
<bottom>,
- <generic-family>,
+ <generic-font-family>,
<generic-voice>,
<left>,
<margin-width>,
From 3f528437709bf44d6e864b1c00c7816745b5c5fb Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Thu, 16 Apr 2026 17:58:34 -0400
Subject: [PATCH 038/221] [css-fonts-4][editorial] wpt
---
css-fonts-4/Overview.bs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/css-fonts-4/Overview.bs b/css-fonts-4/Overview.bs
index 4e3b78307082..dac8e49277a1 100644
--- a/css-fonts-4/Overview.bs
+++ b/css-fonts-4/Overview.bs
@@ -33,6 +33,7 @@ spec:html; type:element; text:font
spec:fetch; type:dfn; for:/;
text:fetch
text:request
+spec:css-env-1; type:function; text:env()
@@ -1202,6 +1203,9 @@ Font style: the 'font-style!!property' property
variations/font-style-parsing.html
variations/slnt-backslant-variable.html
variations/slnt-variable.html
+ variations/variable-avar2-rvrn.html
+ variations/variable-avar2-warp.html
+ variations/variable-gpos-avar2.html
The 'font-style!!property' property allows italic or oblique faces to be selected.
@@ -1358,6 +1362,7 @@ Font size: the 'font-size' property
font-size-zero-1.html
font-size-zero-2.html
font-size-zero-3.html
+ font-size-zero-ligatures.html
font-size-xxx-large.html
rem-in-monospace.html
animations/font-size-composition.html
From 6e1e2c251375b0445ee26d639716f5b4289eb34e Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Thu, 16 Apr 2026 18:23:45 -0400
Subject: [PATCH 039/221] [css-fonts-4][editorial] Clear up bad merge commit
---
css-fonts-4/Overview.bs | 94 +----------------------------------------
1 file changed, 1 insertion(+), 93 deletions(-)
diff --git a/css-fonts-4/Overview.bs b/css-fonts-4/Overview.bs
index dac8e49277a1..906732348108 100644
--- a/css-fonts-4/Overview.bs
+++ b/css-fonts-4/Overview.bs
@@ -371,13 +371,6 @@ Syntax of <>
Syntax of <>
-
-
<> = <>| <> | <>
<> = ''generic(fangsong)'' | ''generic(kai)'' | ''generic(khmer-mul)'' | ''generic(nastaliq)''
@@ -2764,13 +2757,6 @@ The ''@font-face'' rule
To parse a <> production, [=parse a list=] of <>s.
-<font-src> = <> [ format(<>)]? [ tech( <>#)]? | local(<>)
-
-<font-format>
- = [<> | collection | embedded-opentype | opentype
- | svg | truetype | woff | woff2 ]
- To parse a <> production, [=parse a list=] of <>s.
-
<font-src> = <> [ format( <> ) ]? [ tech( <># ) ]?
| local( <> )
@@ -2967,7 +2953,7 @@ To parse a <> production, [=parse a list=] of <unquoted font family name processing conventions apply;
+ the unquoted font family name processing conventions apply;
in other words,
the name must be a sequence of identifiers
separated by whitespace
@@ -6059,32 +6045,6 @@ Defining font specific alternates: the @font-feature-values rule
Basic syntax
-An ''@font-feature-values'' rule's prelude
-contains a list of font family names,
-followed by a block containing multiple ''feature-value-block''s,
-a special type of subsidiary at-rule.
-Each ''feature-value-block''' contains declarations
-mapping author-chosen human-friendly names
-(such as "flowing")
-to feature indexes for the associated feature.
-
-Each <> has the same meaning
-as the corresponding value of the 'font-variant-alternates' property.
-
-
-@font-feature-values = @font-feature-values <># { <> }
-
-font-feature-value-type = <<@stylistic>> | <<@historical-forms>> | <<@styleset>> | <<@character-variant>>
- | <<@swash>> | <<@ornaments>> | <<@annotation>>
-
-@stylistic = @stylistic { <> }
-@historical-forms = @historical-forms { <> }
-@styleset = @styleset { <> }
-@character-variant = @character-variant { <> }
-@swash = @swash { <> }
-@ornaments = @ornaments { <> }
-@annotation = @annotation { <> }
-
An ''@font-feature-values'' rule's prelude
contains a list of font family names,
followed by a block containing multiple feature value blocks,
@@ -6117,58 +6077,6 @@ as the corresponding value of the 'font-variant-alternates' property.
test_font_feature_values_parsing.html
-The ''@font-feature-values'' prelude
-is a comma-delimited list of font family names that match the definition of <>
-for the 'font-family!!property' property.
-This means that only named font families are allowed;
-rules that include generic or system fonts in the list of font families are syntax errors.
-However, if a user agent defines a generic font to be a specific named font (e.g. Helvetica),
-the settings associated with that family name will be used.
-If syntax errors occur within the <> list,
-the entire rule ''@font-feature-values'' rule is invalid
-and must be ignored.
-
-The ''@font-feature-values'' block accepts <> as its contents;
-these list items are either:
-
-- [=at-rules=] named by one of the <> at-keyword tokens
-
-or
-
-- the '@font-feature-values/font-display' descriptor.
-
-
-
-Specifying the same <> more than once is valid;
-their contents are cascaded together.
-Each <> accepts a list of [=declarations=],
-the font feature value declarations,
-where the declaration's name can be any [=identifier=],
-and the value must be a list of one or more non-negative <>s.
-
-The <>s accept any declaration name;
-these names must be identifiers,
-per standard CSS syntax rules,
-and are [=case-sensitive=]
-(so ''foo: 1;'' and ''FOO: 2'' define two different features).
-Each declaration's value must match the grammar ''<>+'',
-or else the declaration is invalid and must be ignored.
-
-Note: Each feature name is unique only within a single <>.
-Between different <>s,
-or the same type of <>s in separate ''@font-feature-values'' rules,
-names can be reused without colliding.
-
-For each <> in the ''@font-feature-values'' prelude,
-each [=font feature value declaration=] defines a mapping between a
-(family name, feature block name, declaration name) [=tuple=]
-and the list of one or more integers from the declaration's value.
-If the same tuple appears more than once in a document
-(such as if a single block),
-the last-defined one is used.
-
-
- For example, the following all define the exact same set of font feature values:
The ''@font-feature-values'' prelude
is a comma-delimited list of font family names that match the definition of < >
for the 'font-family!!property' property.
From 9e5464340590c61a61eda655e1211bb310e19279 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Thu, 16 Apr 2026 18:27:46 -0400
Subject: [PATCH 040/221] [css-fonts-5][editorial] wpt
---
css-fonts-5/Overview.bs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/css-fonts-5/Overview.bs b/css-fonts-5/Overview.bs
index dc672f4ecf35..fde5666ac934 100644
--- a/css-fonts-5/Overview.bs
+++ b/css-fonts-5/Overview.bs
@@ -1516,6 +1516,10 @@ Changes
font_feature_values_map_iteration.html
synthetic-bold-out-of-capabilities-range.html
synthetic-oblique-out-of-capabilities-range.html
+ font-size-zero-ligatures.html
+ variations/variable-avar2-rvrn.html
+ variations/variable-avar2-warp.html
+ variations/variable-gpos-avar2.html
font-size-zero-1-ref.html
-
\ No newline at end of file
+
From b23bac6647795740d14c5f7afa42c35133dc2efe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?=
Date: Fri, 17 Apr 2026 18:36:45 +0200
Subject: [PATCH 042/221] [cssom-view] Uplift some of the document-pip changes.
(#13763)
Closes #13707
---
cssom-view-1/Overview.bs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/cssom-view-1/Overview.bs b/cssom-view-1/Overview.bs
index 683c8ce9eb26..16f47f1a6a96 100644
--- a/cssom-view-1/Overview.bs
+++ b/cssom-view-1/Overview.bs
@@ -663,6 +663,7 @@ The moveTo(x, y) method must
1. Optionally, return.
1. Let target be [=this=]'s [=relevant global object=]'s [=Window/browsing context=].
1. If |target| is not an [=auxiliary browsing context=] that was created by a script (as opposed to by an action of the user), then return.
+1. If |target|'s [=top-level traversable=]'s [=Is Document Picture-in-Picture=] boolean is true, then return.
1. Optionally, clamp x and y in a user-agent-defined manner so that the window does not move outside the available space.
1. Move target’s window such that the window’s top left corner is at coordinates (x, y) relative to the top left corner of the output device, measured in CSS pixels of target. The positive axes are rightward and downward.
@@ -671,6 +672,7 @@ The moveBy(x, y) method must
1. Optionally, return.
1. Let target be [=this=]'s [=relevant global object=]'s [=Window/browsing context=].
1. If |target| is not an [=auxiliary browsing context=] that was created by a script (as opposed to by an action of the user), then return.
+1. If |target|'s [=top-level traversable=]'s [=Is Document Picture-in-Picture=] boolean is true, then return.
1. Optionally, clamp x and y in a user-agent-defined manner so that the window does not move outside the available space.
1. Move target's window x CSS pixels of target rightward and y CSS pixels of target downward.
@@ -680,6 +682,9 @@ The resizeTo(width, height) m
1. Optionally, return.
1. Let target be [=this=]'s [=relevant global object=]'s [=Window/browsing context=].
1. If |target| is not an [=auxiliary browsing context=] that was created by a script (as opposed to by an action of the user), then return.
+1. If |target|'s [=top-level traversable=]'s [=Is Document Picture-in-Picture=] boolean is true, then:
+ 1. If [=this=]'s [=relevant global object=] does not have [=transient activation=], throw a "{{NotAllowedError}}" {{DOMException}}.
+ 1. [=Consume user activation=] given [=this=]'s [=relevant global object=].
1. Optionally, clamp width and height in a user-agent-defined manner so that the window does not get too small or bigger than the available space.
1. Resize target's window by moving its right and bottom edges such that the distance between the left and right edges of the viewport are width CSS pixels of target and the distance between the top and bottom edges of the viewport are height CSS pixels of target.
1. Optionally, move target's window in a user-agent-defined manner so that it does not grow outside the available space.
@@ -693,6 +698,9 @@ The resizeBy(x, y) method mus
1. Optionally, return.
1. Let target be [=this=]'s [=relevant global object=]'s [=Window/browsing context=].
1. If |target| is not an [=auxiliary browsing context=] that was created by a script (as opposed to by an action of the user), then return.
+1. If |target|'s [=top-level traversable=]'s [=Is Document Picture-in-Picture=] boolean is true, then:
+ 1. If [=this=]'s [=relevant global object=] does not have [=transient activation=], throw a "{{NotAllowedError}}" {{DOMException}}.
+ 1. [=Consume user activation=] given [=this=]'s [=relevant global object=].
1. Optionally, clamp x and y in a user-agent-defined manner so that the window does not get too small or bigger than the available space.
1. Resize target's window by moving its right edge x CSS pixels of target rightward and its bottom edge y CSS pixels of target downward.
1. Optionally, move target's window in a user-agent-defined manner so that it does not grow outside the available space.
From 4c2a00ea1e840d3af298e0517470733902430d5c Mon Sep 17 00:00:00 2001
From: Guillaume
Date: Fri, 17 Apr 2026 18:38:02 +0200
Subject: [PATCH 043/221] [css-fonts-4] Clarify range constraints on descriptor
values in `` (#13324)
* [css-fonts-4] Rename to
* [css-fonts-4] Clarify range constraints on descriptor values in
---
css-fonts-4/Overview.bs | 64 ++++++++++++++++++++++++-----------------
1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/css-fonts-4/Overview.bs b/css-fonts-4/Overview.bs
index 920c443be6a2..af1d21e79f9d 100644
--- a/css-fonts-4/Overview.bs
+++ b/css-fonts-4/Overview.bs
@@ -5814,13 +5814,13 @@ Alternates and swashes: the 'font-variant-alternates' property
Name: font-variant-alternates
- Value: normal | [ stylistic(<>) ||
+ Value: normal | [ stylistic(<>) ||
historical-forms ||
- styleset(<>#) ||
- character-variant(<>#) ||
- swash(<>) ||
- ornaments(<>) ||
- annotation(<>) ]
+ styleset(<>#) ||
+ character-variant(<>#) ||
+ swash(<>) ||
+ ornaments(<>) ||
+ annotation(<>) ]
Initial: normal
Applies to: all elements and text
Inherited: yes
@@ -5856,8 +5856,8 @@ Alternates and swashes: the 'font-variant-alternates' property
parsing/font-variant-alternates-valid.html
- <feature-index> = <>
- <feature-value-name> = <>
+ <font-feature-index> = <>
+ <font-feature-value-name> = <>
For any given character, fonts can provide a variety of alternate
glyphs in addition to the default glyph for that character. This
@@ -5871,8 +5871,8 @@ Alternates and swashes: the 'font-variant-alternates' property
of these alternates is font-specific, the
''@font-feature-values'' rule is used to define values for a
specific font family or set of families that associate a font-specific
- numeric <> with a custom
- <>, which is then used in this
+ numeric <> with a custom
+ <>, which is then used in this
property to select specific alternates:
@@ -5884,10 +5884,10 @@ Alternates and swashes: the 'font-variant-alternates' property
}
- When a particular <> has not
+ When a particular <> has not
been defined for a given family or for a particular feature type, the
computed value must be the same as if it had been defined. However,
- property values that contain these undefined <>
+ property values that contain these undefined <>
identifiers must be ignored when choosing glyphs.
@@ -5917,16 +5917,16 @@ Alternates and swashes: the 'font-variant-alternates' property
- - stylistic(<>)
-
- Enables display of stylistic alternates ([=font specific=], OpenType feature: salt <>).
+
- stylistic(<>)
+
- Enables display of stylistic alternates ([=font specific=], OpenType feature: salt <>).
- - styleset(<>#)
-
- Enables display with stylistic sets ([=font specific=], OpenType feature: ss<>
+
- styleset(<>#)
+
- Enables display with stylistic sets ([=font specific=], OpenType feature: ss<>
OpenType currently defines ss01 through ss20).
@@ -5934,20 +5934,20 @@ Alternates and swashes: the 'font-variant-alternates' property
- - character-variant(<>#)
-
- Enables display of specific character variants ([=font specific=], OpenType feature: cv<>
+
- character-variant(<>#)
+
- Enables display of specific character variants ([=font specific=], OpenType feature: cv<>
OpenType currently defines cv01 through cv99).
- - swash(<>)
-
- Enables display of swash glyphs ([=font specific=], OpenType feature: swsh <>, cswh <>).
+
- swash(<>)
+
- Enables display of swash glyphs ([=font specific=], OpenType feature: swsh <>, cswh <>).
- - ornaments(<>)
-
- Enables replacement of default glyphs with ornaments, if provided in the font ([=font specific=], OpenType feature: ornm <>).
+
- ornaments(<>)
+
- Enables replacement of default glyphs with ornaments, if provided in the font ([=font specific=], OpenType feature: ornm <>).
Some fonts may offer ornament glyphs as alternates for a wide collection of characters; however, displaying arbitrary
characters (e.g., alphanumerics) as ornaments is poor practice as it distorts the semantics of the data. Font designers
are encouraged to encode all ornaments (except those explicitly encoded in the Unicode Dingbats blocks, etc.) as
@@ -5958,8 +5958,8 @@ Alternates and swashes: the 'font-variant-alternates' property
- - annotation(<>)
-
- Enables display of alternate annotation forms ([=font specific=], OpenType feature: nalt <>).
+
- annotation(<>)
+
- Enables display of alternate annotation forms ([=font specific=], OpenType feature: nalt <>).

@@ -6107,11 +6107,21 @@ Defining font specific alternates: the @font-feature-values rule
and the value must be a list of one or more non-negative < >s.
The [=feature value blocks=] accept any declaration name;
- these names must be identifiers,
+ these names must be <>,
per standard CSS syntax rules,
and are [=case-sensitive=]
(so foo: 1; and FOO: 2 define two different features).
- Each declaration's value must match the grammar ''<>+'',
+
+ Each declaration's value in ''@annotation'', ''@ornaments'', ''@stylistic'', ''@swash'',
+ must match the grammar <>,
+ or else the declaration is invalid and must be ignored.
+
+ Each declaration’s value in ''@character-variant''
+ must match the grammar <> <>,
+ or else the declaration is invalid and must be ignored.
+
+ Each declaration’s value in ''@styleset''
+ must match the grammar <>+,
or else the declaration is invalid and must be ignored.
Note: Each feature name is unique only within a single [=feature value block=].
@@ -6520,7 +6530,7 @@ Overall shorthand for font rendering: the 'font-variant!!property' property
Name: font-variant
- Value: normal | none | [ [ <> || <> || <> || <> ] || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<>) || historical-forms || styleset(<>#) || character-variant(<>#) || swash(<>) || ornaments(<>) || annotation(<>) ] || [ <> || <> || <> || ordinal || slashed-zero ] || [ <> || <> || ruby ] || [ sub | super ] || [ text | emoji | unicode ] ]
+ Value: normal | none | [ [ <> || <> || <> || <> ] || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<>) || historical-forms || styleset(<>#) || character-variant(<>#) || swash(<>) || ornaments(<>) || annotation(<>) ] || [ <> || <> || <> || ordinal || slashed-zero ] || [ <> || <> || ruby ] || [ sub | super ] || [ text | emoji | unicode ] ]
Initial: normal
Applies to: all elements and text
Inherited: yes
From 8bb92cb0bfc74f5e1dee45d7957b6758528ac87e Mon Sep 17 00:00:00 2001
From: Guillaume
Date: Fri, 17 Apr 2026 11:31:52 +0200
Subject: [PATCH 044/221] [css-values-5][editorial] Oversights in 5ef76ec
---
css-values-5/Overview.bs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/css-values-5/Overview.bs b/css-values-5/Overview.bs
index c910f86450ce..46d6ccf9ee34 100644
--- a/css-values-5/Overview.bs
+++ b/css-values-5/Overview.bs
@@ -2767,13 +2767,13 @@ Sharing (Or Not) Random Values: the <> value
If you want the values to be completely uncorrelated,
give them distinct names (''--foo'' vs ''--bar'')
or mix in additional information that will uniquify their [=random cache names=]
- (specifying ''--foo property'', or omitting the <> argument entirely)
+ (specifying ''--foo property-scoped'', or omitting the <> argument entirely)
Details about how ''random()/auto'' works
- The ''random()/auto'' value is identical to specifying ''--foo element property index'',
+ The ''random()/auto'' value is identical to specifying ''--foo element-scoped property-index-scoped'',
just with an unobservable name that you can't manually match with a <>.
Usually, this ensures that every instance of a [=random function=],
From bd884c2557d72819be58019066517c43b44f9e99 Mon Sep 17 00:00:00 2001
From: Chris Lilley
Date: Fri, 17 Apr 2026 13:11:59 -0400
Subject: [PATCH 045/221] [css-fonts-4][editorial] bikeshed autolink syntax
---
css-fonts-4/Overview.bs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/css-fonts-4/Overview.bs b/css-fonts-4/Overview.bs
index af1d21e79f9d..84db6575bb34 100644
--- a/css-fonts-4/Overview.bs
+++ b/css-fonts-4/Overview.bs
@@ -624,7 +624,7 @@ Generic font families
unlike UAs that generally allow users to customise the generic ''sans-serif'' or ''serif'' font family.
As the name implies, ''system-ui'' is intended for use with UI elements in web application, and not for large paragraphs of text or articles.
- - math
+
- math
-
This font family is intended for use with mathematical expressions.
@@ -1433,7 +1433,7 @@ Font size: the 'font-size' property
Note: Use of percentage values or font-relative lengths
such as ''em''s and ''rem''s
leads to more robust and cascadable style sheets.
-
- math
+ - math
-
Special
mathematical scaling rules must be applied
From 432b4420ef111b73749c6c3ddb11f0cfa8b91e9f Mon Sep 17 00:00:00 2001
From: "L. David Baron"
Date: Fri, 17 Apr 2026 15:00:50 -0400
Subject: [PATCH 046/221] [css-navigation-1] Initial draft of a simpler
alternative to navigation-param().
This is a first draft of attempting to replace navigation-param() with a
simpler syntax that allows just a 3x4 space of alternatives: 3 matching
types (that replace navigation-param()) and 4 match targets (which are
actually a new feature relative to navigation-param()).
This is a start to addressing the feedback in #13163 (but I expect
further changes before the draft is ready for another round of review).
---
css-navigation-1/Overview.bs | 156 ++++++++++++++++++++---------------
1 file changed, 88 insertions(+), 68 deletions(-)
diff --git a/css-navigation-1/Overview.bs b/css-navigation-1/Overview.bs
index 206244738e32..d81f64589741 100644
--- a/css-navigation-1/Overview.bs
+++ b/css-navigation-1/Overview.bs
@@ -393,10 +393,14 @@ by matching the relevant parts of the navigation URL to the link URL.
navigation: auto;
}
-@route --movie-details {
+@route --movie-details-with-id {
/* match URLs like /en/movie/123 which is the English page
- about a movie with ID 123 */
- pattern: url-pattern("/:lang/movie/:id");
+ about a movie with ID 123. Be careful to specify the
+ language part with a "*" but the ID part with a named
+ :id parameter so that matching using the 'match-params'
+ keyword (the default) will require equal IDs but allow
+ differences of language. */
+ pattern: url-pattern("/*/movie/:id");
}
/* capture the overall area representing the movie, and a
@@ -407,19 +411,20 @@ by matching the relevant parts of the navigation URL to the link URL.
movie we are currently navigating to or from. (lang can
be different, though.)
- Just :link-to(--movie-details) requires that the target
- of the link match the URL pattern defined by the "@route
- --movie-details" rule.
+ This depends on the --movie-details-with-id route
+ declaring the ID but not the language with a named
+ parameter, and the use of match-params(navigation-other).
- The navigation-param(id) further requires that either the
- from or the to URL of the current navigation also match
- the URL pattern represented by the "@route
- --movie-details" rule, and that that the 'id' named group
- from that match be the same as the 'id' named group from
- the match with the link's target.
+ This means that both the of the link and the other URL of
+ the current navigation match the URL pattern defined by
+ the "@route --movie-details-with-id" rule, and that the
+ id named group from both matches be the same. (However,
+ the URLs can be different because the * part of the
+ match, containing the language, can be different.)
*/
-.movie-container:has(> .movie-title:link-to(
- --movie-details with navigation-param(id))) {
+.movie-container:has(
+ > .movie-title:link-to(--movie-details-with-id
+ with match-params(navigation-other))) {
view-transition-name: movie-container;
@@ -440,24 +445,22 @@ and the pseudo-class matches any element where:
* the target of link matches the <>, as defined below.
-<> = <> [ with <> ]?
+<> = <> [ with <> ]?
<> = <>
-<> = ( <> ) |
- ( <> ) |
- <>
-<> = <>
- [ "and" <> ]*
-<> = <>
- [ "or" <> ]*
-<> = <> | <>
-<> = ( <> : <> )
-<> = navigation-param( <> )
+ // Note: <> is defining three functions
+ // with identical syntax.
+<> = <>( <> )
+<> = match-pattern | match-params | match-url
+<> = navigation-other | navigation-current |
+ navigation-from | navigation-to
A <> matches the target of the link when both:
* the <> matches the target of the link, and
-* the <> matches the target of the link,
- with the [=URL pattern=] represented by the <> as context
+* either:
+ * a <> is not present, or
+ * the <> matches the target of the link,
+ with the [=URL pattern=] represented by the <> as context
A <> represents a [=URL pattern=].
If the <> is a <>,
@@ -473,52 +476,59 @@ given urlPattern as
the [=URL pattern=] that it represents and
input as the given URL.
-A <> matches a URL
-(with a [=URL Pattern=] as context)
-based on standard boolean logic for and and or,
-and based on whether each <> matches the URL
-(with the URL Pattern as context).
-
-A <> matches the URL input (with a URL Pattern urlPattern as context)
+A <> matches the URL linkTarget
+(with a URL Pattern urlPattern as context)
if the following steps return true:
-1. Let matchResult be the result of
+1. Let targetMatchResult be the result of
[=URL pattern/match|match a URL pattern=]
- given urlPattern and input.
- the [=URL pattern=]
- represented by the <> function in the <>
- (see [=create a URL pattern for url-pattern()=])
-1. If matchResult is null, return false.
+ given urlPattern and linkTarget.
+1. If targetMatchResult is null, return false.
NOTE: This doesn't really matter because
in this case the <> also doesn't match.
-1. For each property prop of matchResult (a {{URLPatternResult}})
- that is a {{URLPatternComponentResult}}:
- 1. For each [=map/entry=] entry in its {{URLPatternComponentResult/groups}},
- then:
- 1. If <> is a <>,
- return true if
- entry's [=map/key=] is the <>
- and entry's [=map/value=] is the <>.
- 1. If <> is a <>,
- and entry's [=map/key=] is the function's <>,
- then for each navigationUrl of the
- [=current to URL=]
- and [=current from URL=]:
- 1. Let navigationMatchResult be the result of
- [=URL pattern/match|match a URL pattern=]
- given urlPattern and navigationUrl.
- 1. If navigationMatchResult is null, [=continue=].
- 1. Return true if navigationMatchResult's
- property prop
- has an [=map/entry=]
- whose [=map/key=] is the same as entry's key
- and whose [=map/value=] is the same as entry's value.
-
- NOTE: This step makes the ''navigation-param()'' function
- perform what is essentially a three-way match,
- between the target of the link,
- the provided URL pattern,
- and the from or to URL of the current navigation.
+1. Let matchType be the <> of the
+ <>.
+1. Let matchTarget be the <> argument
+ of the <>.
+1. Let navigationURL be:
+ : If matchTarget is ''navigation-other'',
+ :: the current other URL of the document.
+ : Otherwise, if matchTarget is ''navigation-current'',
+ :: the current URL of the document.
+ : Otherwise, if matchTarget is ''navigation-from'',
+ :: the current from URL of the document.
+ : Otherwise (Assert: matchTarget is ''navigation-to''),
+ :: the current to URL of the document.
+1. If navigationURL is null, return false.
+1. : If matchType is ''match-pattern''
+ :: Return true if
+ the result of [=URL pattern/match|match a URL pattern=] given
+ urlPattern and navigationURL is not null;
+ otherwise return false.
+
+ : If matchType is ''match-params''
+ :: 1. Let navigationMatchResult be the result of
+ [=URL pattern/match|match a URL pattern=] given
+ navigationURL and urlPattern.
+
+ 1. If either navigationMatchResult is null, return false.
+
+ 1. For each property prop of {{URLPatternResult}} that is a
+ {{URLPatternComponentResult}}:
+
+ 1. If {{URLPatternComponentResult/groups}} of prop of
+ targetMatchResult is not equal to
+ {{URLPatternComponentResult/groups}} of prop of
+ navigationMatchResult,
+ then return false.
+
+ ISSUE: Need to formally define equality of ordered maps.
+
+ 1. Return true.
+
+ : If matchType is ''match-url''
+ :: Return true if linkTarget equals navigationURL;
+ otherwise return false.
NOTE: Some of the design discussion for this feature has been in
w3c/csswg-drafts#13163.
@@ -618,6 +628,16 @@ ISSUE: The above definitions of from and to apparently don't work right
if you start a same-document navigation (e.g., with {{History/pushState}})
in the middle of a cross-document navigation.
+The current URL of a [=/document=] is a URL.
+It is defined as follows:
+
+1. ISSUE: Write this!
+
+The current other URL of a [=/document=] is a URL or null.
+It is defined as follows:
+
+1. ISSUE: Write this!
+
The current navigation type of a [=/document=] is a {{NavigationType}} or null.
It is defined as follows:
From 71918862c5e4fa48ea44c1f2b472bffaa0848bc1 Mon Sep 17 00:00:00 2001
From: fantasai
Date: Fri, 17 Apr 2026 15:35:28 -0400
Subject: [PATCH 047/221] [css-values-5][editorial] Clean up some random()
prose.
---
css-values-5/Overview.bs | 90 ++++++++++++++++++++--------------------
1 file changed, 46 insertions(+), 44 deletions(-)
diff --git a/css-values-5/Overview.bs b/css-values-5/Overview.bs
index 46d6ccf9ee34..481a81f7c838 100644
--- a/css-values-5/Overview.bs
+++ b/css-values-5/Overview.bs
@@ -2287,11 +2287,6 @@ Generating a Random Numeric Value: the ''random()'' function
<random()> = random( <>? , <>, <>, <>? )
-
- <> = auto | <> | fixed <>
- <> = <> || element-scoped
- || [ property-scoped | property-index-scoped | <> ]
- <> = <>
See [[#random-evaluation]] and [[#random-caching]]
@@ -2580,50 +2575,53 @@ Evaluating Random Values
Sharing (Or Not) Random Values: the <> value
CSS is a declarative language,
- so functions don't have a specific "time" when they're "evaluated";
- the user agent is free to "execute" functions in any order,
+ so functions don't have a specific “time” when they're evaluated;
+ the user agent is free to “execute” functions in any order,
as many times as they want,
as every execution will return the same value.
- This is difficult to square with "random" functions,
+ This is difficult to square with random-value functions,
which are inherently stateful and care about
when, how often, and in what order they're executed.
- To fix this, the [=random functions=] are associated with a [=random cache name=],
+ To solve this, the [=random functions=] are associated with a [=random cache name=],
ensuring that any time the random function is evaluated with the same cache key,
it will return the same [=random base value=];
and also that [=random functions=] with different caching keys
will return different [=random base value=] from each other
(unless they are, randomly, the same).
- The <> value controls this behavior:
+ The <> value controls this behavior,
+ and defaults to ''random()/auto'' when omitted.
+ It's syntax is as follows, and interpreted as described below:
+
+
+ <> = auto | <> | fixed <>
+ <> = <> || element-scoped
+ || [ property-scoped | property-index-scoped | <> ]
+ <> = <>
+
: auto
- :: The [=random function=] is roughly "as random as possible":
- every usage in a property,
- between different properties,
- and between different elements
- will get a different [=random cache name=].
+ :: The [=random function=] is roughly “as random as possible”:
+ the [=random cache name=], and thus the result,
+ varies across every ''random()'' instance in a multi-component value,
+ across different properties,
+ and across different elements.
+
This is equivalent to specifying ''element-scoped property-index-scoped'',
and simplifies in exactly the same way.
- If the <> is omitted,
- it behaves as ''random()/auto''.
-
: <>
- :: The <> specifies the [=random cache name=] directly,
- naming the random value and allowing it to be explicitly shared (or not)
+ :: The <> specifies the [=random cache name=],
+ allowing it to be explicitly shared (or not)
with other uses of [=random functions=].
Every [=random function=] using the same [=random cache name=]
will get the same random value;
every one using a different [=random cache name=]
will get unrelated random values.
- The [=random cache name=] is made of several possible parts,
- which are all optional
- and can be specified in any order:
-
- * The <>, giving the value an explicit name.
+ * The <> gives the value an explicit name.
If omitted, this part of the name is null.
* element-scoped adds an element-specific identifier
to the [=random cache name=],
@@ -2631,19 +2629,22 @@ Sharing (Or Not) Random Values: the <> value
* property-scoped adds the property name the [=random function=] is being used on
to the [=random cache name=],
so different properties will get different random values.
+ Note that shorthand declarations will apply the [=shorthand property=]'s name.
* property-index-scoped
adds the property name and the index of the random function
among all the random functions used in the same property value
to the [=random cache name=],
- so multiple uses of a [=random function=] in the same property
- will get different random values.
+ so multiple instances of a [=random function=] in the same declaration
+ will each get different [=random cache names=].
+ Note this index is assigned before [=shorthand=] expansion.
- ''property-scoped'' and ''property-index-scoped''
- are mutually exclusive with each other,
- and also with the <> value.
- This value, like ''fixed'' below, isn't intended to be specified by authors,
+ See [[#random-simplify]] for how these values resolve.
+
+ The <> value,
+ like ''fixed'' below, isn't intended to be specified by authors,
but can show up in [=computed values=].
- It is a <> that must start with the prefix ua-.
+ It is a <> that must start with the prefix ua-,
+ or else it is invalid.
When generated automatically by the user agent,
it will always be ua-PROPERTY or ua-PROPERTY-INDEX,
with the PROPERTY and INDEX parts
@@ -2797,7 +2798,8 @@ Sharing (Or Not) Random Values: the <> value
(both are the first [=random function=] used in 'animation'),
so they'll share [=random base values=] on a single element
and generate related random values,
- even tho the author likely considers them to be "different uses".
+ even though the author likely considers them to be
+ different instances of ''random()''.
This unexpected sharing is, unfortunately, unavoidable.
CSS generally doesn't care how you organize styles for your elements;
@@ -2858,14 +2860,15 @@ Sharing (Or Not) Random Values: the <> value
2. A nullable [=string=] property/index value:
the value of the <>, if specified/calculated;
otherwise null.
- 4. A nullable "element identifier"
+ 4. A nullable /element identifier/
uniquely identifying the {{Element}} or [=pseudo-element=]
the style is being applied to,
if ''random()/element-scoped'' is specified;
otherwise null.
- 5. A document ID identifying the {{Document}} the styles are from.
+ 5. A /document identifier/ identifying the {{Document}} the styles are from.
- The "element ID" and "document ID" must have the same lifetimes and equivalence semantics
+ The /element identifier/ and /document identifier/
+ must have the same lifetimes and equivalence semantics
as a JavaScript reference to the {{Element}} or {{Document}}.
Issue: The behavior for pseudo-elements needs to be clarified.
@@ -2873,13 +2876,12 @@ Sharing (Or Not) Random Values: the <> value
* The [=random cache name=] and [=random base value=]
must be determined by [=computed value=] time,
before [=inheritance=],
- so that a random function which is unresolved by inheritance time
+ so that a random function that is unresolved by inheritance time
(due to containing, for example, a layout-sensitive percentage)
does not have a different behavior on children
- from one that resolves immediately.
+ than one that resolves immediately.
-
Shorthands are recorded as part of the [=random cache name=],
rather than the longhand the value gets expanded to.
For example:
@@ -2941,8 +2943,8 @@ Sharing (Or Not) Random Values: the <> value
Similarly, ''random()/element-scoped'' in the <>
won't cause the function to determine its "element identifier"
- until substitution actually happens,
- which might be after '--size' has inherited through multiple elements,
+ until substitution actually happens--
+ which might be after '--size' has inherited through multiple elements--
so again multiple elements using ''var(--size)''
would end up with distinct random values
rather than sharing one value defined on their ancestor.
@@ -2955,14 +2957,14 @@ Sharing (Or Not) Random Values: the <> value
Both issues can be resolved
by instead using a [=registered custom property=]
with a non-universal grammar,
- so the ''random()'' function will be parsed and evaluated in the [=custom property=]
+ so the ''random()'' function will be parsed and evaluated by the [=custom property=]
(gaining a <> of "ua---size-1"),
and then the resolved random value will be substituted into each property.
-Simplification
+Random Simplification
At parse time,
certain transformations are performed on the <> of a [=random function=]:
@@ -2975,7 +2977,7 @@ Simplification
either ua-PROPERTY with PROPERTY being the property the value was parsed as,
or ua-PROPERTY-INDEX with PROPERTY as the previous
and INDEX being the 1-indexed integer index of this [=random function=]
- among all [=random functions=] being used in the property.
+ among all [=random functions=] being used in the declaration.
The INDEX value is based on the ordering in the parsed value,
before any canonicalization/reordering might occur
From 1aa8ccc47a32b647385bb0199f71e97abddbd3a1 Mon Sep 17 00:00:00 2001
From: "L. David Baron"
Date: Fri, 17 Apr 2026 16:10:53 -0400
Subject: [PATCH 048/221] [css-navigation-1] Add other: and between: to
@navigation.
---
css-navigation-1/Overview.bs | 57 ++++++++++++++++++++++++++++--------
1 file changed, 44 insertions(+), 13 deletions(-)
diff --git a/css-navigation-1/Overview.bs b/css-navigation-1/Overview.bs
index d81f64589741..a99ad4cf6d34 100644
--- a/css-navigation-1/Overview.bs
+++ b/css-navigation-1/Overview.bs
@@ -185,10 +185,15 @@ styles that cause [=view transitions=].
pattern: url-pattern("/product/:id");
}
-@navigation ((from: --search-results-page) and
- (to: --product-page)) or
- ((from: --product-page) and
- (to: --search-results-page)) {
+@navigation (from: --search-results-page) and
+ (to: --product-page) {
+ /* These styles apply when a navigation is in progress
+ from a search results page to a product page (as
+ defined by the @route rules above), but not in the
+ reverse direction. */
+}
+
+@navigation (between: --search-results-page and --product-page) {
/* These styles apply when a navigation is in progress
between a search results page and a product page (as
defined by the @route rules above), in either
@@ -213,17 +218,24 @@ with <> defined as:
| <> [ and <> ]*
| <> [ or <> ]*
<> = ( <> ) | ( <> ) | <>
-<> = <> | <>
+<> = <> |
+ <> |
+ <>
<> = <> : <>
-<> = at | from | to
+<> = at | other | from | to
<> = <> | <>
<> = <>
+<> =
+ between : <> and <>
+
<> = history : <>
<> = traverse | back | forward | reload
+ISSUE: Should we use ''at'' or ''current''?
+
The above grammar is purposely very loose for forwards-compatibility reasons,
since the <> production
allows for substantial future extensibility.
@@ -262,6 +274,14 @@ as follows:
the [=navigation location URL pattern=] of <>
and input as the document's [=Document/URL=].
+ : other: <>
+ :: The result is true if
+ the [=current other URL=] other of the document is non-null and
+ [=URL pattern/match|match a URL pattern=] is non-null when
+ given urlPattern as
+ the [=navigation location URL pattern=] of <>
+ and input as other.
+
: from: <>
:: The result is true if
the [=current from URL=] from of the document is non-null and
@@ -278,6 +298,20 @@ as follows:
the [=navigation location URL pattern=] of <>
and input as to.
+: <>
+:: : between: <> and <>
+ :: The result is true if
+ the [=current from URL=] from of the document is non-null,
+ the [=current to URL=] to of the document is non-null,
+ [=URL pattern/match|match a URL pattern=] is non-null
+ given urlPattern as
+ the [=navigation location URL pattern=] of one of the two <>s
+ and input as from, and
+ [=URL pattern/match|match a URL pattern=] is non-null
+ given urlPattern as
+ the [=navigation location URL pattern=] of the other of the two <>s
+ and input as to.
+
: <>
:: : history: traverse
:: True if the [=current navigation type=] is {{NavigationType/traverse}}.
@@ -455,6 +489,8 @@ and the pseudo-class matches any element where:
navigation-from | navigation-to
+ISSUE: Should we use ''navigation-at'' or ''navigation-current''?
+
A < |