@fusion.dev/helix 0.16.3 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -945,8 +945,8 @@
945
945
  "slug": "preview"
946
946
  },
947
947
  {
948
- "description": "The mark at the end of the row, for a list read as a table of contents.",
949
- "slug": "chevron-at-the-end"
948
+ "description": "The mark before the row, so a nested list reads as a tree.",
949
+ "slug": "chevron-at-the-start"
950
950
  },
951
951
  {
952
952
  "description": "Each section announces for itself, and a listener on the set hears nothing.",
@@ -49613,8 +49613,13 @@
49613
49613
  "slug": "full"
49614
49614
  },
49615
49615
  {
49616
- "description": "Opening on hover, and spanning the whole width under the bar rather than its trigger.",
49617
- "slug": "on-hover"
49616
+ "description": "Opening only on a press, for a trigger that is also a link.",
49617
+ "slug": "on-press"
49618
+ },
49619
+ {
49620
+ "description": "Three in one bar, so moving between them is a change of panel rather than a close and an open.",
49621
+ "min": 480,
49622
+ "slug": "several"
49618
49623
  }
49619
49624
  ],
49620
49625
  "source": "helix/styled/src/megamenu"
@@ -52865,6 +52870,10 @@
52865
52870
  "description": "Ink in an item that has been read.",
52866
52871
  "name": "--notifications-color"
52867
52872
  },
52873
+ {
52874
+ "description": "Ink on the control that removes an item, which is `danger` because removing one is the end of it.",
52875
+ "name": "--notifications-dismiss-color"
52876
+ },
52868
52877
  {
52869
52878
  "description": "Space above and below an item.",
52870
52879
  "name": "--notifications-padding-block"
@@ -53176,7 +53185,7 @@
53176
53185
  "text": "TemplateResult | typeof nothing"
53177
53186
  }
53178
53187
  },
53179
- "description": "The control that removes the item, with the mark a consumer can replace.\n\n**A method rather than markup inside `render`, and the slot moves with\nit.** A fallback answers a consumer and a seam answers the tier above, which\nare different people: the styled tier wants an icon here, and with the slot\nwritten inline the only way to change it is to reimplement the whole\ntemplate. Moving only the fallback out is not enough: the slot is the thing\na tier redraws.\n\n**The mark is drawn rather than typed, which is what lets it align.** A\ncharacter such as `&times;` is placed by its font rather than by its box:\nmeasured against the ghost button beside it at 8x, the cross carried 6\npixels of ink to the label's 9.5 and sat 1.5 pixels below its center, in two\nboxes whose own centers agreed to a tenth of a pixel. No stylesheet can\ncorrect that, because the offset is inside the glyph. An `<svg>` is centered\non its own viewBox, so it lands where the box says and takes the icon step\nthe row is already set in. It is the `x` the Tag's dismiss draws, so two\ncontrols that mean \"take this away\" are one mark.",
53188
+ "description": "The control that removes the item, with the mark a consumer can replace.\n\n**A method rather than markup inside `render`, and the slot moves with\nit.** A fallback answers a consumer and a seam answers the tier above, which\nare different people: the styled tier wants an icon here, and with the slot\nwritten inline the only way to change it is to reimplement the whole\ntemplate. Moving only the fallback out is not enough: the slot is the thing\na tier redraws.\n\n**The mark is drawn rather than typed, which is what lets it align.** A\ncharacter such as `&times;` is placed by its font rather than by its box:\nmeasured against the ghost button beside it at 8x, the cross carried 6\npixels of ink to the label's 9.5 and sat 1.5 pixels below its center, in two\nboxes whose own centers agreed to a tenth of a pixel. No stylesheet can\ncorrect that, because the offset is inside the glyph. An `<svg>` is centered\non its own viewBox, so it lands where the box says and takes the icon step\nthe row is already set in.\n\n**A trash and not the `x` the Tag draws, because the two do not mean the\nsame thing.** A tag's cross takes a token off a field the reader is still\nfilling in, and putting it back is retyping a word. A notification is the\nonly copy of something that happened, and this removes it from the feed for\ngood, so the mark is the one every other interface uses for that and the\nink is `danger`. It is only ever on screen while the row is hovered or\nfocused, so a feed of twenty is not a column of red.",
53180
53189
  "inheritedFrom": {
53181
53190
  "name": "HelixHeadlessNotification",
53182
53191
  "module": "src/notifications/notification/notification.ts"
@@ -54181,6 +54190,11 @@
54181
54190
  "description": "Read and dismissed are two different things a feed is told.",
54182
54191
  "slug": "events"
54183
54192
  },
54193
+ {
54194
+ "description": "A bell in the header, a count on it, and the feed in a drawer behind it.",
54195
+ "min": 420,
54196
+ "slug": "in-a-drawer"
54197
+ },
54184
54198
  {
54185
54199
  "description": "Read state the page owns, so marking read can be the round trip it usually is.",
54186
54200
  "slug": "read-on-the-server"
@@ -100175,7 +100189,7 @@
100175
100189
  "text": "string"
100176
100190
  },
100177
100191
  "default": "''",
100178
- "description": "Controls beyond the ones every player has, named in the order they appear.\n\nA list rather than a property apiece. A bar is a row with a budget, and a\nboolean per feature invites a consumer to switch all of them on: naming\nthem makes the row a decision, and makes the order theirs. Anything\nunrecognized is skipped rather than throwing, since the list is markup and\na typo should cost a control, not a page.\n\n`pip` is offered only where the platform has it, checked rather than\nassumed: it is absent on iPhone and behind a flag in Firefox, and a button\nthat cannot work is worse than one that is not there.\n\nThe names are `speed`, `pip`, `remote` and `download`.\n\n**`download` is named and never assumed.** Offering the file is a decision\nabout the content rather than about the player, and plenty of consumers\ndecline it deliberately. It is also the one control whose success is not\nours to promise: the attribute is ignored cross-origin, so a file served\nfrom somewhere else opens rather than saves, which is the browser's rule\nand not something a player can work around.",
100192
+ "description": "Controls beyond the ones every player has, named in the order they appear.\n\nA list rather than a property apiece. A bar is a row with a budget, and a\nboolean per feature invites a consumer to switch all of them on: naming\nthem makes the row a decision, and makes the order theirs. Anything\nunrecognized is skipped rather than throwing, since the list is markup and\na typo should cost a control, not a page.\n\n`pip` is offered only where the platform has it, checked rather than\nassumed: it is absent on iPhone and behind a flag in Firefox, and a button\nthat cannot work is worse than one that is not there.\n\nThe names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,\n`previous` and `next`.\n\n**`previous` and `next` do nothing to the video, and are offered anyway.**\nThey announce `helix-previous` and `helix-next` and stop there, so what\nthey move is whatever holds the set, which is what `VideoPlaylist` listens\nfor. A player standing alone therefore draws a pair of controls that change\nnothing, and that is deliberate: a player cannot know whether it is inside\na set, and one that hid them until it could prove there was one would be a\nplayer that never offers them. Name them where something is listening.\n\n**`download` is named and never assumed.** Offering the file is a decision\nabout the content rather than about the player, and plenty of consumers\ndecline it deliberately. It is also the one control whose success is not\nours to promise: the attribute is ignored cross-origin, so a file served\nfrom somewhere else opens rather than saves, which is the browser's rule\nand not something a player can work around.",
100179
100193
  "attribute": "extra-controls",
100180
100194
  "inheritedFrom": {
100181
100195
  "name": "HelixHeadlessVideo",
@@ -101655,7 +101669,7 @@
101655
101669
  "text": "string"
101656
101670
  },
101657
101671
  "default": "''",
101658
- "description": "Controls beyond the ones every player has, named in the order they appear.\n\nA list rather than a property apiece. A bar is a row with a budget, and a\nboolean per feature invites a consumer to switch all of them on: naming\nthem makes the row a decision, and makes the order theirs. Anything\nunrecognized is skipped rather than throwing, since the list is markup and\na typo should cost a control, not a page.\n\n`pip` is offered only where the platform has it, checked rather than\nassumed: it is absent on iPhone and behind a flag in Firefox, and a button\nthat cannot work is worse than one that is not there.\n\nThe names are `speed`, `pip`, `remote` and `download`.\n\n**`download` is named and never assumed.** Offering the file is a decision\nabout the content rather than about the player, and plenty of consumers\ndecline it deliberately. It is also the one control whose success is not\nours to promise: the attribute is ignored cross-origin, so a file served\nfrom somewhere else opens rather than saves, which is the browser's rule\nand not something a player can work around.",
101672
+ "description": "Controls beyond the ones every player has, named in the order they appear.\n\nA list rather than a property apiece. A bar is a row with a budget, and a\nboolean per feature invites a consumer to switch all of them on: naming\nthem makes the row a decision, and makes the order theirs. Anything\nunrecognized is skipped rather than throwing, since the list is markup and\na typo should cost a control, not a page.\n\n`pip` is offered only where the platform has it, checked rather than\nassumed: it is absent on iPhone and behind a flag in Firefox, and a button\nthat cannot work is worse than one that is not there.\n\nThe names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,\n`previous` and `next`.\n\n**`previous` and `next` do nothing to the video, and are offered anyway.**\nThey announce `helix-previous` and `helix-next` and stop there, so what\nthey move is whatever holds the set, which is what `VideoPlaylist` listens\nfor. A player standing alone therefore draws a pair of controls that change\nnothing, and that is deliberate: a player cannot know whether it is inside\na set, and one that hid them until it could prove there was one would be a\nplayer that never offers them. Name them where something is listening.\n\n**`download` is named and never assumed.** Offering the file is a decision\nabout the content rather than about the player, and plenty of consumers\ndecline it deliberately. It is also the one control whose success is not\nours to promise: the attribute is ignored cross-origin, so a file served\nfrom somewhere else opens rather than saves, which is the browser's rule\nand not something a player can work around.",
101659
101673
  "fieldName": "extraControls",
101660
101674
  "inheritedFrom": {
101661
101675
  "name": "HelixHeadlessVideo",
@@ -12,6 +12,8 @@ display: block;
12
12
  align-items: start;
13
13
  border-block-end: var(--helix-border-thin) solid
14
14
  var(--notifications-rule, var(--helix-color-border));
15
+
16
+ cursor: default;
15
17
  display: grid;
16
18
  grid-template-columns: minmax(var(--notifications-media-column, 0px), auto) minmax(0, 1fr) auto;
17
19
  padding-block: var(--notifications-padding-block, var(--helix-space-sm));
@@ -75,7 +77,9 @@ margin-inline-start: var(--helix-space-sm);
75
77
 
76
78
  [part="trailing"] > * {
77
79
  grid-area: swap;
78
- transition: opacity var(--helix-duration-fast) var(--helix-easing-standard);
80
+ transition:
81
+ opacity var(--helix-duration-normal) var(--helix-easing-standard),
82
+ translate var(--helix-duration-normal) var(--helix-easing-decelerate);
79
83
  }
80
84
 
81
85
  :host {
@@ -87,12 +91,15 @@ color: var(--helix-color-foreground-subtle);
87
91
  font-family: var(--helix-font-sans);
88
92
  font-size: var(--helix-text-xs);
89
93
  opacity: calc(1 - var(--_notifications-swap));
94
+
95
+ translate: calc(var(--helix-space-2xs) * var(--_notifications-swap)) 0;
90
96
  }
91
97
 
92
98
  [part="controls"] {
93
99
  align-items: center;
94
100
  display: flex;
95
101
  opacity: var(--_notifications-swap);
102
+ translate: calc(var(--helix-space-2xs) * (1 - var(--_notifications-swap))) 0;
96
103
  }
97
104
 
98
105
  :host(:hover:state(controls)),
@@ -119,6 +126,7 @@ grid-template-areas: none;
119
126
  [part="trailing"] > * {
120
127
  grid-area: auto;
121
128
  opacity: 1;
129
+ translate: none;
122
130
  }
123
131
 
124
132
  [part="controls"] {
@@ -126,6 +134,13 @@ pointer-events: auto;
126
134
  }
127
135
  }
128
136
 
137
+ @media (prefers-reduced-motion: reduce) {
138
+ [part="trailing"] > * {
139
+ transition: opacity var(--helix-duration-fast) var(--helix-easing-standard);
140
+ translate: none;
141
+ }
142
+ }
143
+
129
144
  [part="actions"] {
130
145
  align-items: center;
131
146
  display: flex;
@@ -137,7 +152,7 @@ background: none;
137
152
  border: 0;
138
153
  border-radius: var(--helix-radii-sm);
139
154
  block-size: var(--helix-size-control);
140
- color: var(--helix-color-foreground-muted);
155
+ color: var(--notifications-dismiss-color, var(--helix-color-danger));
141
156
  cursor: pointer;
142
157
  display: grid;
143
158
  inline-size: var(--helix-size-control);
@@ -152,8 +167,7 @@ inline-size: var(--icon-size, var(--helix-size-icon));
152
167
  }
153
168
 
154
169
  [part="dismiss"]:hover {
155
- background-color: color-mix(in oklab, var(--helix-color-foreground) 8%, transparent);
156
- color: var(--helix-color-foreground);
170
+ background-color: color-mix(in oklab, currentcolor 12%, transparent);
157
171
  }
158
172
 
159
173
  [part="dismiss"]:focus-visible {
@@ -43,6 +43,7 @@ import type { CSSResultGroup } from 'lit';
43
43
  * @csspart trailing - The column holding the time and the controls.
44
44
  *
45
45
  * @cssproperty --notifications-color - Ink in an item that has been read.
46
+ * @cssproperty --notifications-dismiss-color - Ink on the control that removes an item, which is `danger` because removing one is the end of it.
46
47
  * @cssproperty --notifications-padding-block - Space above and below an item.
47
48
  * @cssproperty --notifications-padding-inline - Space either side of an item.
48
49
  * @cssproperty --notifications-rule - The hairline between items.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.16.3",
4
+ "version": "0.16.4",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
48
48
  "dependencies": {
49
- "@fusion.dev/helix-core": "0.16.3",
50
- "@fusion.dev/helix-headless": "0.16.3",
51
- "@fusion.dev/helix-styles": "0.16.3"
49
+ "@fusion.dev/helix-core": "0.16.4",
50
+ "@fusion.dev/helix-headless": "0.16.4",
51
+ "@fusion.dev/helix-styles": "0.16.4"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
55
- "@fusion.dev/helix-cem": "0.16.3",
56
- "@fusion.dev/helix-testing": "0.16.3",
55
+ "@fusion.dev/helix-cem": "0.16.4",
56
+ "@fusion.dev/helix-testing": "0.16.4",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^3.3.0",
package/types/jsx.d.ts CHANGED
@@ -17805,7 +17805,16 @@ a typo should cost a control, not a page.
17805
17805
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
17806
17806
  that cannot work is worse than one that is not there.
17807
17807
 
17808
- The names are `speed`, `pip`, `remote` and `download`.
17808
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
17809
+ `previous` and `next`.
17810
+
17811
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
17812
+ They announce `helix-previous` and `helix-next` and stop there, so what
17813
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
17814
+ for. A player standing alone therefore draws a pair of controls that change
17815
+ nothing, and that is deliberate: a player cannot know whether it is inside
17816
+ a set, and one that hid them until it could prove there was one would be a
17817
+ player that never offers them. Name them where something is listening.
17809
17818
 
17810
17819
  **`download` is named and never assumed.** Offering the file is a decision
17811
17820
  about the content rather than about the player, and plenty of consumers
@@ -17826,7 +17835,16 @@ a typo should cost a control, not a page.
17826
17835
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
17827
17836
  that cannot work is worse than one that is not there.
17828
17837
 
17829
- The names are `speed`, `pip`, `remote` and `download`.
17838
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
17839
+ `previous` and `next`.
17840
+
17841
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
17842
+ They announce `helix-previous` and `helix-next` and stop there, so what
17843
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
17844
+ for. A player standing alone therefore draws a pair of controls that change
17845
+ nothing, and that is deliberate: a player cannot know whether it is inside
17846
+ a set, and one that hid them until it could prove there was one would be a
17847
+ player that never offers them. Name them where something is listening.
17830
17848
 
17831
17849
  **`download` is named and never assumed.** Offering the file is a decision
17832
17850
  about the content rather than about the player, and plenty of consumers
@@ -18036,7 +18054,16 @@ a typo should cost a control, not a page.
18036
18054
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
18037
18055
  that cannot work is worse than one that is not there.
18038
18056
 
18039
- The names are `speed`, `pip`, `remote` and `download`.
18057
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
18058
+ `previous` and `next`.
18059
+
18060
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
18061
+ They announce `helix-previous` and `helix-next` and stop there, so what
18062
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
18063
+ for. A player standing alone therefore draws a pair of controls that change
18064
+ nothing, and that is deliberate: a player cannot know whether it is inside
18065
+ a set, and one that hid them until it could prove there was one would be a
18066
+ player that never offers them. Name them where something is listening.
18040
18067
 
18041
18068
  **`download` is named and never assumed.** Offering the file is a decision
18042
18069
  about the content rather than about the player, and plenty of consumers
@@ -18057,7 +18084,16 @@ a typo should cost a control, not a page.
18057
18084
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
18058
18085
  that cannot work is worse than one that is not there.
18059
18086
 
18060
- The names are `speed`, `pip`, `remote` and `download`.
18087
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
18088
+ `previous` and `next`.
18089
+
18090
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
18091
+ They announce `helix-previous` and `helix-next` and stop there, so what
18092
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
18093
+ for. A player standing alone therefore draws a pair of controls that change
18094
+ nothing, and that is deliberate: a player cannot know whether it is inside
18095
+ a set, and one that hid them until it could prove there was one would be a
18096
+ player that never offers them. Name them where something is listening.
18061
18097
 
18062
18098
  **`download` is named and never assumed.** Offering the file is a decision
18063
18099
  about the content rather than about the player, and plenty of consumers
@@ -26661,6 +26697,7 @@ export type CustomElements = {
26661
26697
  * CSS variables available for styling the component.
26662
26698
  *
26663
26699
  * - `--notifications-color`: Ink in an item that has been read. (default: `undefined`)
26700
+ * - `--notifications-dismiss-color`: Ink on the control that removes an item, which is `danger` because removing one is the end of it. (default: `undefined`)
26664
26701
  * - `--notifications-padding-block`: Space above and below an item. (default: `undefined`)
26665
26702
  * - `--notifications-padding-inline`: Space either side of an item. (default: `undefined`)
26666
26703
  * - `--notifications-rule`: The hairline between items. (default: `undefined`)
@@ -33911,7 +33948,16 @@ export type CustomElements = {
33911
33948
  * assumed: it is absent on iPhone and behind a flag in Firefox, and a button
33912
33949
  * that cannot work is worse than one that is not there.
33913
33950
  *
33914
- * The names are `speed`, `pip`, `remote` and `download`.
33951
+ * The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
33952
+ * `previous` and `next`.
33953
+ *
33954
+ * **`previous` and `next` do nothing to the video, and are offered anyway.**
33955
+ * They announce `helix-previous` and `helix-next` and stop there, so what
33956
+ * they move is whatever holds the set, which is what `VideoPlaylist` listens
33957
+ * for. A player standing alone therefore draws a pair of controls that change
33958
+ * nothing, and that is deliberate: a player cannot know whether it is inside
33959
+ * a set, and one that hid them until it could prove there was one would be a
33960
+ * player that never offers them. Name them where something is listening.
33915
33961
  *
33916
33962
  * **`download` is named and never assumed.** Offering the file is a decision
33917
33963
  * about the content rather than about the player, and plenty of consumers
@@ -42779,6 +42825,7 @@ export type CustomElementsSolidJs = {
42779
42825
  * CSS variables available for styling the component.
42780
42826
  *
42781
42827
  * - `--notifications-color`: Ink in an item that has been read. (default: `undefined`)
42828
+ * - `--notifications-dismiss-color`: Ink on the control that removes an item, which is `danger` because removing one is the end of it. (default: `undefined`)
42782
42829
  * - `--notifications-padding-block`: Space above and below an item. (default: `undefined`)
42783
42830
  * - `--notifications-padding-inline`: Space either side of an item. (default: `undefined`)
42784
42831
  * - `--notifications-rule`: The hairline between items. (default: `undefined`)
@@ -50227,7 +50274,16 @@ export type CustomElementsSolidJs = {
50227
50274
  * assumed: it is absent on iPhone and behind a flag in Firefox, and a button
50228
50275
  * that cannot work is worse than one that is not there.
50229
50276
  *
50230
- * The names are `speed`, `pip`, `remote` and `download`.
50277
+ * The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
50278
+ * `previous` and `next`.
50279
+ *
50280
+ * **`previous` and `next` do nothing to the video, and are offered anyway.**
50281
+ * They announce `helix-previous` and `helix-next` and stop there, so what
50282
+ * they move is whatever holds the set, which is what `VideoPlaylist` listens
50283
+ * for. A player standing alone therefore draws a pair of controls that change
50284
+ * nothing, and that is deliberate: a player cannot know whether it is inside
50285
+ * a set, and one that hid them until it could prove there was one would be a
50286
+ * player that never offers them. Name them where something is listening.
50231
50287
  *
50232
50288
  * **`download` is named and never assumed.** Offering the file is a decision
50233
50289
  * about the content rather than about the player, and plenty of consumers
@@ -51051,6 +51107,8 @@ export type CustomCssProperties = {
51051
51107
  "--navigation-indicator-color"?: (string) | undefined;
51052
51108
  /** Ink in an item that has been read. */
51053
51109
  "--notifications-color"?: (string) | undefined;
51110
+ /** Ink on the control that removes an item, which is `danger` because removing one is the end of it. */
51111
+ "--notifications-dismiss-color"?: (string) | undefined;
51054
51112
  /** Space above and below an item. */
51055
51113
  "--notifications-padding-block"?: (string) | undefined;
51056
51114
  /** Space either side of an item. */
package/types/vue.d.ts CHANGED
@@ -9145,7 +9145,16 @@ a typo should cost a control, not a page.
9145
9145
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
9146
9146
  that cannot work is worse than one that is not there.
9147
9147
 
9148
- The names are `speed`, `pip`, `remote` and `download`.
9148
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
9149
+ `previous` and `next`.
9150
+
9151
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
9152
+ They announce `helix-previous` and `helix-next` and stop there, so what
9153
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
9154
+ for. A player standing alone therefore draws a pair of controls that change
9155
+ nothing, and that is deliberate: a player cannot know whether it is inside
9156
+ a set, and one that hid them until it could prove there was one would be a
9157
+ player that never offers them. Name them where something is listening.
9149
9158
 
9150
9159
  **`download` is named and never assumed.** Offering the file is a decision
9151
9160
  about the content rather than about the player, and plenty of consumers
@@ -9166,7 +9175,16 @@ a typo should cost a control, not a page.
9166
9175
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
9167
9176
  that cannot work is worse than one that is not there.
9168
9177
 
9169
- The names are `speed`, `pip`, `remote` and `download`.
9178
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
9179
+ `previous` and `next`.
9180
+
9181
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
9182
+ They announce `helix-previous` and `helix-next` and stop there, so what
9183
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
9184
+ for. A player standing alone therefore draws a pair of controls that change
9185
+ nothing, and that is deliberate: a player cannot know whether it is inside
9186
+ a set, and one that hid them until it could prove there was one would be a
9187
+ player that never offers them. Name them where something is listening.
9170
9188
 
9171
9189
  **`download` is named and never assumed.** Offering the file is a decision
9172
9190
  about the content rather than about the player, and plenty of consumers
@@ -9876,6 +9894,8 @@ export type CustomCssProperties = {
9876
9894
  "--navigation-indicator-color"?: (string) | undefined;
9877
9895
  /** Ink in an item that has been read. */
9878
9896
  "--notifications-color"?: (string) | undefined;
9897
+ /** Ink on the control that removes an item, which is `danger` because removing one is the end of it. */
9898
+ "--notifications-dismiss-color"?: (string) | undefined;
9879
9899
  /** Space above and below an item. */
9880
9900
  "--notifications-padding-block"?: (string) | undefined;
9881
9901
  /** Space either side of an item. */