@fusion.dev/helix 0.16.3 → 0.16.5

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.",
@@ -4138,16 +4138,30 @@
4138
4138
  "kind": "field",
4139
4139
  "name": "value",
4140
4140
  "type": {
4141
- "text": "string"
4141
+ "text": "number | string"
4142
4142
  },
4143
4143
  "default": "''",
4144
- "description": "The count or short text to show.\n\nAbsent shows a dot, zero shows nothing.",
4144
+ "description": "The count or short text to show.\n\nAbsent shows a dot, zero shows nothing.\n\n**A string, and a number is taken anyway.** What this shows is usually a\ncount, so `value={unread}` is the first thing a React consumer writes, and\na property assignment does not go through the attribute converter that\nwould have made it a string. Read raw it went straight into\n`this.value.trim()`, which threw inside `render` and left the mark showing\nwhatever it had last: measured, a badge set to the number 2 stayed an 8px\ndot with no digit in it, and the console carried\n`TypeError: this.value.trim is not a function`. A component whose whole job\nis showing a count must not lose the count for being handed one.",
4145
4145
  "attribute": "value",
4146
4146
  "inheritedFrom": {
4147
4147
  "name": "HelixHeadlessBadge",
4148
4148
  "module": "src/badge/root/badge-root.ts"
4149
4149
  }
4150
4150
  },
4151
+ {
4152
+ "kind": "field",
4153
+ "name": "given",
4154
+ "type": {
4155
+ "text": "string"
4156
+ },
4157
+ "privacy": "private",
4158
+ "description": "The value as text, whatever it was set to.",
4159
+ "readonly": true,
4160
+ "inheritedFrom": {
4161
+ "name": "HelixHeadlessBadge",
4162
+ "module": "src/badge/root/badge-root.ts"
4163
+ }
4164
+ },
4151
4165
  {
4152
4166
  "kind": "field",
4153
4167
  "name": "blank",
@@ -4387,10 +4401,10 @@
4387
4401
  {
4388
4402
  "name": "value",
4389
4403
  "type": {
4390
- "text": "string"
4404
+ "text": "number | string"
4391
4405
  },
4392
4406
  "default": "''",
4393
- "description": "The count or short text to show.\n\nAbsent shows a dot, zero shows nothing.",
4407
+ "description": "The count or short text to show.\n\nAbsent shows a dot, zero shows nothing.\n\n**A string, and a number is taken anyway.** What this shows is usually a\ncount, so `value={unread}` is the first thing a React consumer writes, and\na property assignment does not go through the attribute converter that\nwould have made it a string. Read raw it went straight into\n`this.value.trim()`, which threw inside `render` and left the mark showing\nwhatever it had last: measured, a badge set to the number 2 stayed an 8px\ndot with no digit in it, and the console carried\n`TypeError: this.value.trim is not a function`. A component whose whole job\nis showing a count must not lose the count for being handed one.",
4394
4408
  "fieldName": "value",
4395
4409
  "inheritedFrom": {
4396
4410
  "name": "HelixHeadlessBadge",
@@ -24637,6 +24651,11 @@
24637
24651
  "description": "One query across every column, from a search field the page owns.",
24638
24652
  "slug": "searching"
24639
24653
  },
24654
+ {
24655
+ "description": "A reading of the range and a choice of page size, either side of the pagination the table draws.",
24656
+ "min": 520,
24657
+ "slug": "summary-and-size"
24658
+ },
24640
24659
  {
24641
24660
  "description": "Pages of five hundred, each drawn a window at a time.",
24642
24661
  "slug": "windowed-paging"
@@ -49613,8 +49632,13 @@
49613
49632
  "slug": "full"
49614
49633
  },
49615
49634
  {
49616
- "description": "Opening on hover, and spanning the whole width under the bar rather than its trigger.",
49617
- "slug": "on-hover"
49635
+ "description": "Opening only on a press, for a trigger that is also a link.",
49636
+ "slug": "on-press"
49637
+ },
49638
+ {
49639
+ "description": "Three in one bar, so moving between them is a change of panel rather than a close and an open.",
49640
+ "min": 480,
49641
+ "slug": "several"
49618
49642
  }
49619
49643
  ],
49620
49644
  "source": "helix/styled/src/megamenu"
@@ -52865,6 +52889,10 @@
52865
52889
  "description": "Ink in an item that has been read.",
52866
52890
  "name": "--notifications-color"
52867
52891
  },
52892
+ {
52893
+ "description": "Ink on the control that removes an item, which is `danger` because removing one is the end of it.",
52894
+ "name": "--notifications-dismiss-color"
52895
+ },
52868
52896
  {
52869
52897
  "description": "Space above and below an item.",
52870
52898
  "name": "--notifications-padding-block"
@@ -53176,7 +53204,7 @@
53176
53204
  "text": "TemplateResult | typeof nothing"
53177
53205
  }
53178
53206
  },
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.",
53207
+ "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
53208
  "inheritedFrom": {
53181
53209
  "name": "HelixHeadlessNotification",
53182
53210
  "module": "src/notifications/notification/notification.ts"
@@ -54181,6 +54209,11 @@
54181
54209
  "description": "Read and dismissed are two different things a feed is told.",
54182
54210
  "slug": "events"
54183
54211
  },
54212
+ {
54213
+ "description": "A bell in the header, a count on it, and the feed in a drawer behind it.",
54214
+ "min": 420,
54215
+ "slug": "in-a-drawer"
54216
+ },
54184
54217
  {
54185
54218
  "description": "Read state the page owns, so marking read can be the round trip it usually is.",
54186
54219
  "slug": "read-on-the-server"
@@ -100175,7 +100208,7 @@
100175
100208
  "text": "string"
100176
100209
  },
100177
100210
  "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.",
100211
+ "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
100212
  "attribute": "extra-controls",
100180
100213
  "inheritedFrom": {
100181
100214
  "name": "HelixHeadlessVideo",
@@ -101655,7 +101688,7 @@
101655
101688
  "text": "string"
101656
101689
  },
101657
101690
  "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.",
101691
+ "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
101692
  "fieldName": "extraControls",
101660
101693
  "inheritedFrom": {
101661
101694
  "name": "HelixHeadlessVideo",
@@ -61,9 +61,17 @@ padding-block-end: var(--helix-space-sm);
61
61
  }
62
62
 
63
63
  [part="footer"] {
64
+ align-items: center;
65
+ display: flex;
66
+ flex-wrap: wrap;
67
+ gap: var(--helix-space-md);
64
68
  padding-block-start: var(--helix-space-sm);
65
69
  }
66
70
 
71
+ [part="pagination"] {
72
+ margin-inline-start: auto;
73
+ }
74
+
67
75
  [part="empty"],
68
76
  [part="loading"] {
69
77
  color: var(--helix-color-foreground-subtle);
@@ -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.5",
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.5",
50
+ "@fusion.dev/helix-headless": "0.16.5",
51
+ "@fusion.dev/helix-styles": "0.16.5"
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.5",
56
+ "@fusion.dev/helix-testing": "0.16.5",
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
@@ -1151,7 +1151,17 @@ Past it the indicator reads `{max}+`. */
1151
1151
  max?: (HelixBadge["max"]) | undefined;
1152
1152
  /** The count or short text to show.
1153
1153
 
1154
- Absent shows a dot, zero shows nothing. */
1154
+ Absent shows a dot, zero shows nothing.
1155
+
1156
+ **A string, and a number is taken anyway.** What this shows is usually a
1157
+ count, so `value={unread}` is the first thing a React consumer writes, and
1158
+ a property assignment does not go through the attribute converter that
1159
+ would have made it a string. Read raw it went straight into
1160
+ `this.value.trim()`, which threw inside `render` and left the mark showing
1161
+ whatever it had last: measured, a badge set to the number 2 stayed an 8px
1162
+ dot with no digit in it, and the console carried
1163
+ `TypeError: this.value.trim is not a function`. A component whose whole job
1164
+ is showing a count must not lose the count for being handed one. */
1155
1165
  value?: (HelixBadge["value"]) | undefined;
1156
1166
  };
1157
1167
 
@@ -1169,7 +1179,17 @@ Past it the indicator reads `{max}+`. */
1169
1179
  "prop:max"?: (HelixBadge["max"]) | undefined;
1170
1180
  /** The count or short text to show.
1171
1181
 
1172
- Absent shows a dot, zero shows nothing. */
1182
+ Absent shows a dot, zero shows nothing.
1183
+
1184
+ **A string, and a number is taken anyway.** What this shows is usually a
1185
+ count, so `value={unread}` is the first thing a React consumer writes, and
1186
+ a property assignment does not go through the attribute converter that
1187
+ would have made it a string. Read raw it went straight into
1188
+ `this.value.trim()`, which threw inside `render` and left the mark showing
1189
+ whatever it had last: measured, a badge set to the number 2 stayed an 8px
1190
+ dot with no digit in it, and the console carried
1191
+ `TypeError: this.value.trim is not a function`. A component whose whole job
1192
+ is showing a count must not lose the count for being handed one. */
1173
1193
  "prop:value"?: (HelixBadge["value"]) | undefined;
1174
1194
 
1175
1195
  /** Set the innerHTML of the element */
@@ -17805,7 +17825,16 @@ a typo should cost a control, not a page.
17805
17825
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
17806
17826
  that cannot work is worse than one that is not there.
17807
17827
 
17808
- The names are `speed`, `pip`, `remote` and `download`.
17828
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
17829
+ `previous` and `next`.
17830
+
17831
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
17832
+ They announce `helix-previous` and `helix-next` and stop there, so what
17833
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
17834
+ for. A player standing alone therefore draws a pair of controls that change
17835
+ nothing, and that is deliberate: a player cannot know whether it is inside
17836
+ a set, and one that hid them until it could prove there was one would be a
17837
+ player that never offers them. Name them where something is listening.
17809
17838
 
17810
17839
  **`download` is named and never assumed.** Offering the file is a decision
17811
17840
  about the content rather than about the player, and plenty of consumers
@@ -17826,7 +17855,16 @@ a typo should cost a control, not a page.
17826
17855
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
17827
17856
  that cannot work is worse than one that is not there.
17828
17857
 
17829
- The names are `speed`, `pip`, `remote` and `download`.
17858
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
17859
+ `previous` and `next`.
17860
+
17861
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
17862
+ They announce `helix-previous` and `helix-next` and stop there, so what
17863
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
17864
+ for. A player standing alone therefore draws a pair of controls that change
17865
+ nothing, and that is deliberate: a player cannot know whether it is inside
17866
+ a set, and one that hid them until it could prove there was one would be a
17867
+ player that never offers them. Name them where something is listening.
17830
17868
 
17831
17869
  **`download` is named and never assumed.** Offering the file is a decision
17832
17870
  about the content rather than about the player, and plenty of consumers
@@ -18036,7 +18074,16 @@ a typo should cost a control, not a page.
18036
18074
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
18037
18075
  that cannot work is worse than one that is not there.
18038
18076
 
18039
- The names are `speed`, `pip`, `remote` and `download`.
18077
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
18078
+ `previous` and `next`.
18079
+
18080
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
18081
+ They announce `helix-previous` and `helix-next` and stop there, so what
18082
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
18083
+ for. A player standing alone therefore draws a pair of controls that change
18084
+ nothing, and that is deliberate: a player cannot know whether it is inside
18085
+ a set, and one that hid them until it could prove there was one would be a
18086
+ player that never offers them. Name them where something is listening.
18040
18087
 
18041
18088
  **`download` is named and never assumed.** Offering the file is a decision
18042
18089
  about the content rather than about the player, and plenty of consumers
@@ -18057,7 +18104,16 @@ a typo should cost a control, not a page.
18057
18104
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
18058
18105
  that cannot work is worse than one that is not there.
18059
18106
 
18060
- The names are `speed`, `pip`, `remote` and `download`.
18107
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
18108
+ `previous` and `next`.
18109
+
18110
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
18111
+ They announce `helix-previous` and `helix-next` and stop there, so what
18112
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
18113
+ for. A player standing alone therefore draws a pair of controls that change
18114
+ nothing, and that is deliberate: a player cannot know whether it is inside
18115
+ a set, and one that hid them until it could prove there was one would be a
18116
+ player that never offers them. Name them where something is listening.
18061
18117
 
18062
18118
  **`download` is named and never assumed.** Offering the file is a decision
18063
18119
  about the content rather than about the player, and plenty of consumers
@@ -18970,6 +19026,16 @@ export type CustomElements = {
18970
19026
  * - `value`: The count or short text to show.
18971
19027
  *
18972
19028
  * Absent shows a dot, zero shows nothing.
19029
+ *
19030
+ * **A string, and a number is taken anyway.** What this shows is usually a
19031
+ * count, so `value={unread}` is the first thing a React consumer writes, and
19032
+ * a property assignment does not go through the attribute converter that
19033
+ * would have made it a string. Read raw it went straight into
19034
+ * `this.value.trim()`, which threw inside `render` and left the mark showing
19035
+ * whatever it had last: measured, a badge set to the number 2 stayed an 8px
19036
+ * dot with no digit in it, and the console carried
19037
+ * `TypeError: this.value.trim is not a function`. A component whose whole job
19038
+ * is showing a count must not lose the count for being handed one.
18973
19039
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
18974
19040
  *
18975
19041
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -26661,6 +26727,7 @@ export type CustomElements = {
26661
26727
  * CSS variables available for styling the component.
26662
26728
  *
26663
26729
  * - `--notifications-color`: Ink in an item that has been read. (default: `undefined`)
26730
+ * - `--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
26731
  * - `--notifications-padding-block`: Space above and below an item. (default: `undefined`)
26665
26732
  * - `--notifications-padding-inline`: Space either side of an item. (default: `undefined`)
26666
26733
  * - `--notifications-rule`: The hairline between items. (default: `undefined`)
@@ -33911,7 +33978,16 @@ export type CustomElements = {
33911
33978
  * assumed: it is absent on iPhone and behind a flag in Firefox, and a button
33912
33979
  * that cannot work is worse than one that is not there.
33913
33980
  *
33914
- * The names are `speed`, `pip`, `remote` and `download`.
33981
+ * The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
33982
+ * `previous` and `next`.
33983
+ *
33984
+ * **`previous` and `next` do nothing to the video, and are offered anyway.**
33985
+ * They announce `helix-previous` and `helix-next` and stop there, so what
33986
+ * they move is whatever holds the set, which is what `VideoPlaylist` listens
33987
+ * for. A player standing alone therefore draws a pair of controls that change
33988
+ * nothing, and that is deliberate: a player cannot know whether it is inside
33989
+ * a set, and one that hid them until it could prove there was one would be a
33990
+ * player that never offers them. Name them where something is listening.
33915
33991
  *
33916
33992
  * **`download` is named and never assumed.** Offering the file is a decision
33917
33993
  * about the content rather than about the player, and plenty of consumers
@@ -34925,6 +35001,16 @@ export type CustomElementsSolidJs = {
34925
35001
  * - `value`: The count or short text to show.
34926
35002
  *
34927
35003
  * Absent shows a dot, zero shows nothing.
35004
+ *
35005
+ * **A string, and a number is taken anyway.** What this shows is usually a
35006
+ * count, so `value={unread}` is the first thing a React consumer writes, and
35007
+ * a property assignment does not go through the attribute converter that
35008
+ * would have made it a string. Read raw it went straight into
35009
+ * `this.value.trim()`, which threw inside `render` and left the mark showing
35010
+ * whatever it had last: measured, a badge set to the number 2 stayed an 8px
35011
+ * dot with no digit in it, and the console carried
35012
+ * `TypeError: this.value.trim is not a function`. A component whose whole job
35013
+ * is showing a count must not lose the count for being handed one.
34928
35014
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
34929
35015
  *
34930
35016
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -42779,6 +42865,7 @@ export type CustomElementsSolidJs = {
42779
42865
  * CSS variables available for styling the component.
42780
42866
  *
42781
42867
  * - `--notifications-color`: Ink in an item that has been read. (default: `undefined`)
42868
+ * - `--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
42869
  * - `--notifications-padding-block`: Space above and below an item. (default: `undefined`)
42783
42870
  * - `--notifications-padding-inline`: Space either side of an item. (default: `undefined`)
42784
42871
  * - `--notifications-rule`: The hairline between items. (default: `undefined`)
@@ -50227,7 +50314,16 @@ export type CustomElementsSolidJs = {
50227
50314
  * assumed: it is absent on iPhone and behind a flag in Firefox, and a button
50228
50315
  * that cannot work is worse than one that is not there.
50229
50316
  *
50230
- * The names are `speed`, `pip`, `remote` and `download`.
50317
+ * The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
50318
+ * `previous` and `next`.
50319
+ *
50320
+ * **`previous` and `next` do nothing to the video, and are offered anyway.**
50321
+ * They announce `helix-previous` and `helix-next` and stop there, so what
50322
+ * they move is whatever holds the set, which is what `VideoPlaylist` listens
50323
+ * for. A player standing alone therefore draws a pair of controls that change
50324
+ * nothing, and that is deliberate: a player cannot know whether it is inside
50325
+ * a set, and one that hid them until it could prove there was one would be a
50326
+ * player that never offers them. Name them where something is listening.
50231
50327
  *
50232
50328
  * **`download` is named and never assumed.** Offering the file is a decision
50233
50329
  * about the content rather than about the player, and plenty of consumers
@@ -51051,6 +51147,8 @@ export type CustomCssProperties = {
51051
51147
  "--navigation-indicator-color"?: (string) | undefined;
51052
51148
  /** Ink in an item that has been read. */
51053
51149
  "--notifications-color"?: (string) | undefined;
51150
+ /** Ink on the control that removes an item, which is `danger` because removing one is the end of it. */
51151
+ "--notifications-dismiss-color"?: (string) | undefined;
51054
51152
  /** Space above and below an item. */
51055
51153
  "--notifications-padding-block"?: (string) | undefined;
51056
51154
  /** Space either side of an item. */
package/types/vue.d.ts CHANGED
@@ -608,7 +608,17 @@ Past it the indicator reads `{max}+`. */
608
608
  max?: (HelixBadge["max"]) | undefined;
609
609
  /** The count or short text to show.
610
610
 
611
- Absent shows a dot, zero shows nothing. */
611
+ Absent shows a dot, zero shows nothing.
612
+
613
+ **A string, and a number is taken anyway.** What this shows is usually a
614
+ count, so `value={unread}` is the first thing a React consumer writes, and
615
+ a property assignment does not go through the attribute converter that
616
+ would have made it a string. Read raw it went straight into
617
+ `this.value.trim()`, which threw inside `render` and left the mark showing
618
+ whatever it had last: measured, a badge set to the number 2 stayed an 8px
619
+ dot with no digit in it, and the console carried
620
+ `TypeError: this.value.trim is not a function`. A component whose whole job
621
+ is showing a count must not lose the count for being handed one. */
612
622
  value?: (HelixBadge["value"]) | undefined;
613
623
  };
614
624
 
@@ -9145,7 +9155,16 @@ a typo should cost a control, not a page.
9145
9155
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
9146
9156
  that cannot work is worse than one that is not there.
9147
9157
 
9148
- The names are `speed`, `pip`, `remote` and `download`.
9158
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
9159
+ `previous` and `next`.
9160
+
9161
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
9162
+ They announce `helix-previous` and `helix-next` and stop there, so what
9163
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
9164
+ for. A player standing alone therefore draws a pair of controls that change
9165
+ nothing, and that is deliberate: a player cannot know whether it is inside
9166
+ a set, and one that hid them until it could prove there was one would be a
9167
+ player that never offers them. Name them where something is listening.
9149
9168
 
9150
9169
  **`download` is named and never assumed.** Offering the file is a decision
9151
9170
  about the content rather than about the player, and plenty of consumers
@@ -9166,7 +9185,16 @@ a typo should cost a control, not a page.
9166
9185
  assumed: it is absent on iPhone and behind a flag in Firefox, and a button
9167
9186
  that cannot work is worse than one that is not there.
9168
9187
 
9169
- The names are `speed`, `pip`, `remote` and `download`.
9188
+ The names are `speed`, `pip`, `remote`, `download`, `rewind`, `forward`,
9189
+ `previous` and `next`.
9190
+
9191
+ **`previous` and `next` do nothing to the video, and are offered anyway.**
9192
+ They announce `helix-previous` and `helix-next` and stop there, so what
9193
+ they move is whatever holds the set, which is what `VideoPlaylist` listens
9194
+ for. A player standing alone therefore draws a pair of controls that change
9195
+ nothing, and that is deliberate: a player cannot know whether it is inside
9196
+ a set, and one that hid them until it could prove there was one would be a
9197
+ player that never offers them. Name them where something is listening.
9170
9198
 
9171
9199
  **`download` is named and never assumed.** Offering the file is a decision
9172
9200
  about the content rather than about the player, and plenty of consumers
@@ -9876,6 +9904,8 @@ export type CustomCssProperties = {
9876
9904
  "--navigation-indicator-color"?: (string) | undefined;
9877
9905
  /** Ink in an item that has been read. */
9878
9906
  "--notifications-color"?: (string) | undefined;
9907
+ /** Ink on the control that removes an item, which is `danger` because removing one is the end of it. */
9908
+ "--notifications-dismiss-color"?: (string) | undefined;
9879
9909
  /** Space above and below an item. */
9880
9910
  "--notifications-padding-block"?: (string) | undefined;
9881
9911
  /** Space either side of an item. */