@fusion.dev/helix-templates 0.139.0 → 0.141.0

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.
Files changed (62) hide show
  1. package/dist/index.js +6 -6
  2. package/package.json +1 -1
  3. package/templates/angular/src/app/data.ts +17 -17
  4. package/templates/angular/src/app/docs.ts +9 -9
  5. package/templates/angular/src/app/landing.html +39 -74
  6. package/templates/angular/src/app/landing.ts +0 -2
  7. package/templates/angular/src/app/overview.html +2 -2
  8. package/templates/angular/src/app/pathname.ts +1 -1
  9. package/templates/angular/src/app/signup-form.html +13 -14
  10. package/templates/angular/src/app/site-footer.html +3 -6
  11. package/templates/angular/src/app/site-footer.ts +2 -2
  12. package/templates/angular/src/app/site-header.html +3 -6
  13. package/templates/angular/src/app/site-header.ts +2 -3
  14. package/templates/angular/src/app.css +151 -158
  15. package/templates/react-nextjs/app/app.css +151 -158
  16. package/templates/react-nextjs/app/data.ts +17 -17
  17. package/templates/react-nextjs/app/docs.ts +9 -9
  18. package/templates/react-nextjs/app/landing.tsx +66 -128
  19. package/templates/react-nextjs/app/overview.tsx +24 -26
  20. package/templates/react-nextjs/app/signup-form.tsx +36 -40
  21. package/templates/react-nextjs/app/site-footer.tsx +9 -15
  22. package/templates/react-nextjs/app/site-header.tsx +18 -26
  23. package/templates/react-nextjs/helix-jsx.d.ts +5 -7
  24. package/templates/react-nextjs/tsconfig.json +4 -1
  25. package/templates/react-vite/helix-jsx.d.ts +5 -7
  26. package/templates/react-vite/src/app.css +151 -158
  27. package/templates/react-vite/src/data.ts +17 -17
  28. package/templates/react-vite/src/docs.ts +9 -9
  29. package/templates/react-vite/src/landing.tsx +66 -128
  30. package/templates/react-vite/src/overview.tsx +24 -26
  31. package/templates/react-vite/src/routes.tsx +11 -13
  32. package/templates/react-vite/src/signup-form.tsx +36 -40
  33. package/templates/react-vite/src/site-footer.tsx +9 -15
  34. package/templates/react-vite/src/site-header.tsx +16 -24
  35. package/templates/solid-vite/src/app.css +151 -158
  36. package/templates/solid-vite/src/data.ts +17 -17
  37. package/templates/solid-vite/src/docs.ts +9 -9
  38. package/templates/solid-vite/src/landing.tsx +54 -105
  39. package/templates/solid-vite/src/overview.tsx +2 -2
  40. package/templates/solid-vite/src/routes.ts +6 -6
  41. package/templates/solid-vite/src/signup-form.tsx +14 -14
  42. package/templates/solid-vite/src/site-footer.tsx +5 -8
  43. package/templates/solid-vite/src/site-header.tsx +5 -9
  44. package/templates/svelte-vite/src/Landing.svelte +39 -76
  45. package/templates/svelte-vite/src/Overview.svelte +2 -2
  46. package/templates/svelte-vite/src/SignupForm.svelte +13 -14
  47. package/templates/svelte-vite/src/SiteFooter.svelte +5 -8
  48. package/templates/svelte-vite/src/SiteHeader.svelte +5 -8
  49. package/templates/svelte-vite/src/app.css +151 -158
  50. package/templates/svelte-vite/src/data.ts +17 -17
  51. package/templates/svelte-vite/src/docs.ts +9 -9
  52. package/templates/svelte-vite/src/routes.svelte.ts +5 -5
  53. package/templates/vue-vite/src/LandingPage.vue +39 -76
  54. package/templates/vue-vite/src/OverviewPage.vue +2 -2
  55. package/templates/vue-vite/src/SignupForm.vue +14 -14
  56. package/templates/vue-vite/src/SiteFooter.vue +5 -8
  57. package/templates/vue-vite/src/SiteHeader.vue +5 -9
  58. package/templates/vue-vite/src/app.css +151 -158
  59. package/templates/vue-vite/src/data.ts +17 -17
  60. package/templates/vue-vite/src/docs.ts +9 -9
  61. package/templates/vue-vite/src/routes.ts +6 -6
  62. package/templates.json +4 -10
@@ -1,30 +1,32 @@
1
1
  /*
2
2
  * The page around the components.
3
3
  *
4
- * Helix draws its own insides, so what is left to an app stylesheet is the
5
- * measure, the rhythm between blocks, and the few things a component
6
- * deliberately leaves open. Everything below is a Helix token or a documented
7
- * hook, so a theme moves it and both color modes follow without a second copy
8
- * of anything.
4
+ * Helix draws the inside of each component, so an app stylesheet holds the
5
+ * measure, the rhythm between blocks, and the few decisions a component leaves
6
+ * open. Everything below is a Helix token or a documented hook, so a theme
7
+ * changes it, and both color modes follow from one copy.
9
8
  *
10
- * **Color appears twice and both places are named.** The wordmark takes
11
- * `--helix-color-brand-mark`, which is the token for the brand as a graphic
12
- * rather than as a word, and a chosen row takes `--helix-color-primary-subtle`
13
- * through the parts the table publishes. Everywhere else this page is ink on the
14
- * background and the components carry their own.
9
+ * **Your brand color is one line.** With no brand set, Helix draws in ink,
10
+ * near-black in light mode and near-white in dark. Set `--helix-seed-brand` on
11
+ * `:root`, and every token follows it.
12
+ *
13
+ * **Color appears in two places, and both are named.** Each tile's icon takes
14
+ * `--helix-color-primary` on `--helix-color-primary-subtle`, and a chosen row
15
+ * takes `--helix-color-primary-subtle` through the parts the table publishes.
16
+ * Everywhere else the page is the foreground on the background, and the
17
+ * components carry their own color.
15
18
  */
16
19
 
17
20
  /*
18
- * **The shell, and what stops a short route ending in a void.** The overview is
19
- * a header, a table and a caption, which on a 1280 by 900 window left something
20
- * like four hundred pixels of nothing under it: a page that stopped rather than
21
- * a page that finished. A column the height of the window with the footer at the
22
- * end of it puts a floor under every route.
21
+ * **The shell: a column the height of the window, with the footer at its end.**
22
+ * The overview is a header, a table, and a caption, which on a 1280 by 900
23
+ * window left about four hundred empty pixels under it. The column puts a floor
24
+ * under every route.
23
25
  *
24
- * **Flex and not grid, because the bar is sticky.** A grid item's containing
25
- * block is its own grid area, which is one row as tall as the bar, so a sticky
26
- * header in a grid row sticks for nothing. A flex item's containing block is the
27
- * flex container, which is the whole document.
26
+ * **A flex column, because the bar is sticky.** A grid item's containing block
27
+ * is its own grid area, one row as tall as the bar, so a sticky header in a
28
+ * grid row has nowhere to stick. A flex item's containing block is the flex
29
+ * container, which here is the whole document.
28
30
  */
29
31
  .shell {
30
32
  display: flex;
@@ -33,14 +35,13 @@
33
35
  }
34
36
 
35
37
  /*
36
- * **56rem, which is a measure rather than a maximum.** A page is as wide as its
37
- * widest block can be read at, and the widest block here is a four-column table:
38
- * given the whole of a 1280 window its first column came out 448 pixels across
39
- * to hold a name, which reads as a table that has been stretched rather than
40
- * laid out. The bar and the footer are centered in the same width, so the
41
- * wordmark sits over the first column of the page rather than near it.
38
+ * **56rem, the width the widest block reads well at.** The widest block here is
39
+ * a four-column table: given the whole of a 1280 window, its first column came
40
+ * out 448 pixels across to hold a name, which reads as a stretched table. The
41
+ * bar and the footer are centered in the same width, so the wordmark sits over
42
+ * the first column of the page.
42
43
  *
43
- * `flex-grow` is what hands the slack to the page rather than to the footer.
44
+ * `flex-grow` gives the spare height to the page, and the footer keeps its own.
44
45
  */
45
46
  .page {
46
47
  flex-grow: 1;
@@ -51,100 +52,126 @@
51
52
  }
52
53
 
53
54
  /*
54
- * Two documented hooks, and both are about agreeing with the page. The bar
55
- * centers its row in the page's measure, so the wordmark sits over the first
56
- * column rather than near it. And it draws no line under itself by default,
57
- * because a header over a page that already has a surface does not need one:
58
- * this page has no such surface, so it asks for one. A token rather than a
59
- * color, so it follows the theme.
55
+ * Two documented hooks, both to match the page. The bar centers its row in the
56
+ * page's measure, so the wordmark sits over the first column. And the bar draws
57
+ * no line under itself by default, since a header over a page with its own
58
+ * surface needs none: this page has no such surface, so it sets one. The line
59
+ * is a token, so it follows the theme.
60
60
  */
61
61
  helix-app-header {
62
62
  --app-header-border-color: var(--helix-color-border);
63
63
  --app-header-max-inline-size: 56rem;
64
64
  }
65
65
 
66
- /* The mark beside the project's name, which is the one graphic on the page and
67
- the reason `--helix-color-brand-mark` exists: a mark answers to the 3:1 WCAG
68
- asks of a graphic rather than to the 4.5 a word does, so it may sit closer to
69
- the brand a theme was seeded with than any text color can. Swap the glyph, or
70
- replace the whole element with your own logo. */
66
+ /* The wordmark, a word for now, in the foreground: a quiet link is muted until
67
+ it is pointed at, and the name is the strongest thing in the bar. Give it your
68
+ own name, or put your logo beside it in `--helix-color-brand-mark`, the token
69
+ for the brand as a graphic: WCAG asks 3:1 of a graphic and 4.5:1 of text, so a
70
+ mark can sit closer to a theme's brand color than any text color can. */
71
71
  .wordmark {
72
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
73
74
  display: inline-flex;
74
75
  gap: var(--helix-space-xs);
75
76
  }
76
77
 
77
- .wordmark helix-icon {
78
- color: var(--helix-color-brand-mark);
79
- }
80
-
81
78
  /*
82
- * One rhythm between the blocks of a page, so no page states its own.
79
+ * One rhythm between the blocks of a page, so no page sets its own.
83
80
  *
84
- * **`minmax(0, 1fr)` and never a bare column, which is the trap in every grid
85
- * here.** An implicit track is `auto`, and an `auto` track's minimum is its
86
- * content's min-content size, so a child that would rather scroll itself widens
87
- * the track instead and takes the page with it. Measured at 320: the table's
88
- * columns floor at 344, the column it sits in should have been 288, and
89
- * `documentElement.scrollWidth` came back 360 against a 320 viewport. The whole
90
- * page scrolled sideways so that a table with its own scrollport would not have
91
- * to. Zero as the minimum hands the overflow back to whoever is equipped for it.
81
+ * **`minmax(0, 1fr)` for every column, the guard every grid here needs.** An
82
+ * implicit track is `auto`, and an `auto` track's minimum is its content's
83
+ * min-content size, so a child that scrolls itself widens the track and takes
84
+ * the page with it. Measured at 320: the table's columns floor at 344, the
85
+ * column it sits in should have been 288, and `documentElement.scrollWidth`
86
+ * came back 360 against a 320 viewport, so the whole page scrolled sideways. A
87
+ * minimum of zero leaves the overflow to the table, which scrolls its own box.
92
88
  */
93
89
  .stack,
94
90
  .section,
95
91
  .hero,
96
92
  .first-screen,
97
- .fact,
98
- .facts,
93
+ .features,
99
94
  .notes,
100
95
  .split {
101
96
  grid-template-columns: minmax(0, 1fr);
102
97
  }
103
98
 
104
99
  /* One step between the blocks of a page and a smaller one inside them, which is
105
- the whole of the rhythm: `3xl` here against the `md` a section puts between
106
- its heading and its block, so a reader sees three groups rather than six
107
- evenly spaced things. */
100
+ the whole of the rhythm: `3xl` here, and the `md` a section puts between its
101
+ heading and its block. */
108
102
  .stack {
109
103
  display: grid;
110
104
  gap: var(--helix-space-3xl);
111
105
  }
112
106
 
113
107
  /*
114
- * **The first screen is two things at once**, which is what makes it a screen
115
- * rather than a stack: what this is, on the left, and the library doing it, on
116
- * the right. Below 60rem there is no room for two columns that are both worth
117
- * reading, so they become one and the panel reads as the thing the words were
118
- * about.
108
+ * **The first screen: one lit panel, with what the starter is on the left and
109
+ * the library at work on the right.** Below 60rem two readable columns do not
110
+ * fit, so they become one, and the glass card follows the words.
119
111
  *
120
- * `start`, because a grid column stretches to its tallest sibling: the panel
121
- * beside a taller block of words would otherwise grow to match it and spread its
122
- * own regions out to fill the difference.
112
+ * `isolation` makes the panel its own stacking context, so the light behind it
113
+ * sits under the content and above the page, and `overflow: clip` keeps the
114
+ * light inside the rounded corners.
123
115
  */
124
116
  .first-screen {
125
- align-items: start;
117
+ align-items: center;
118
+ border: var(--helix-border-thin) solid var(--helix-color-border);
119
+ border-radius: var(--helix-radii-lg);
126
120
  display: grid;
127
- gap: var(--helix-space-xl);
121
+ gap: var(--helix-space-2xl);
122
+ isolation: isolate;
123
+ overflow: clip;
124
+ padding: var(--helix-space-3xl) var(--helix-space-2xl);
125
+ position: relative;
128
126
  }
129
127
 
130
128
  @media (width >= 60rem) {
131
129
  .first-screen {
132
- grid-template-columns: minmax(0, 1fr) minmax(0, 20rem);
130
+ grid-template-columns: minmax(0, 1fr) minmax(0, 18rem);
131
+ }
132
+ }
133
+
134
+ /* The light, under everything in the panel and out of the way of the pointer,
135
+ and faded out behind the words so they keep their contrast: it is at full
136
+ strength only behind the card, which is below the words in one column and
137
+ beside them in two. */
138
+ .first-light {
139
+ block-size: auto;
140
+ inset: 0;
141
+ mask-image: linear-gradient(to bottom, transparent 40%, black 80%);
142
+ pointer-events: none;
143
+ position: absolute;
144
+ z-index: var(--helix-layer-beneath);
145
+ }
146
+
147
+ @media (width >= 60rem) {
148
+ .first-light {
149
+ mask-image: linear-gradient(to right, transparent 35%, black 70%);
133
150
  }
134
151
  }
135
152
 
136
- /* A heading and the lines around it are one block, and the gap between them is
137
- not the gap between blocks. Every route opens with one. */
153
+ /* A heading and the lines around it are one block, with a smaller gap than the
154
+ one between blocks. Every route opens with one. */
138
155
  .hero {
139
156
  display: grid;
140
157
  gap: var(--helix-space-xs);
141
158
  justify-items: start;
142
159
  }
143
160
 
144
- /* **A measure for the lede, which the page's own is too wide to be.** A line of
145
- prose across 56rem is around 110 characters, and the readable range tops out
146
- near 75. The heading above it is exempt: a heading is scanned rather than
147
- read along. */
161
+ /* The first screen's heading takes more room around it than a route's, and
162
+ its lede a step more size, wrapped to even lines. */
163
+ .first-screen .hero {
164
+ gap: var(--helix-space-md);
165
+ }
166
+
167
+ .first-screen .lede {
168
+ font-size: var(--helix-text-lg);
169
+ text-wrap: balance;
170
+ }
171
+
172
+ /* **A measure for the lede, narrower than the page's.** A line of prose across
173
+ 56rem is around 110 characters, and the readable range tops out near 75. The
174
+ heading above it keeps the page's measure, since a heading is scanned. */
148
175
  .lede {
149
176
  max-inline-size: 42rem;
150
177
  }
@@ -157,16 +184,14 @@ helix-app-header {
157
184
  }
158
185
 
159
186
  /*
160
- * **The panel is the library rather than a picture of it**, so the only thing it
161
- * needs from here is room. Two documented hooks: the figures come down a step
162
- * from the display size, which is set for a figure on its own and is too loud
163
- * for three of them in a 20rem column, and the rule between them comes in from
164
- * `2xl`, which `divided` doubles and which would leave no column to put a
165
- * number in.
187
+ * **The panel is the library at work**, so all it needs from here is room. Two
188
+ * documented hooks: the figures come down a step from the display size, which
189
+ * suits one figure on its own and is too loud for three in an 18rem column, and
190
+ * the gap between them is wide enough to set them apart with no rule.
166
191
  */
167
192
  .specimen {
168
- --stat-group-gap: var(--helix-space-md);
169
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
170
195
  }
171
196
 
172
197
  /* A section is its heading and its one block, closer together than two sections
@@ -176,71 +201,37 @@ helix-app-header {
176
201
  gap: var(--helix-space-md);
177
202
  }
178
203
 
179
- /*
180
- * **Three facts about the library, and deliberately not three cards.** A row of
181
- * identical outlined boxes is the shape a generated page takes, and it is also a
182
- * claim: a box says each of these is its own object, when they are three
183
- * paragraphs about the same installed thing. A rule over each column groups them
184
- * at a fraction of the weight, and leaves the cards below to mean something,
185
- * which is that they go somewhere.
186
- *
187
- * `border-thick` in the foreground rather than a hairline in the border color:
188
- * this is a heading device rather than a container edge, and it is the one place
189
- * the page draws in ink.
190
- */
191
- .facts {
204
+ /* Three tiles, side by side where there is room for three. */
205
+ .features {
192
206
  display: grid;
193
207
  gap: var(--helix-space-lg);
194
208
  }
195
209
 
196
210
  @media (width >= 48rem) {
197
- .facts {
211
+ .features {
198
212
  grid-template-columns: repeat(3, minmax(0, 1fr));
199
213
  }
200
214
  }
201
215
 
202
- .fact {
203
- align-content: start;
204
- border-block-start: var(--helix-border-thick) solid var(--helix-color-foreground);
205
- display: grid;
206
- gap: var(--helix-space-xs);
207
- justify-items: start;
208
- padding-block-start: var(--helix-space-sm);
209
- }
210
-
211
- /*
212
- * **The one departure the grids state.** `helix-grid` takes a fixed count as
213
- * plain CSS, which is what keeps a server-rendered row of cards correct before
214
- * any JavaScript arrives. Below this width there is only ever room for one
215
- * column, and `--grid-columns` is the documented way to say so from outside the
216
- * shadow root.
217
- */
218
- @media (width < 48rem) {
219
- helix-grid {
220
- --grid-columns: minmax(0, 1fr);
221
- }
222
- }
223
-
224
- /*
225
- * **The cards keep `start`, which is `--card-align`'s resting value, and the
226
- * alternative is worth naming because it looks right and is not.**
227
- * `space-between` puts the last line of each card on its bottom edge, so a row
228
- * of cards ends in a straight line. It gets there by sharing the slack out
229
- * between every region, and the first thing that moves is the body: three cards
230
- * of six, five and seven lines had their opening lines 50 pixels apart under
231
- * headings that were level. A reader scans the first line of each, so that is
232
- * the alignment worth keeping.
233
- */
234
-
235
- /* The card fills the link that wraps it, so a row of destinations ends level:
236
- the anchor is the grid item and stretches, and the card inside it does not.
237
- The regions stay packed at the top, per `--card-align` above. */
216
+ /* The card fills the link that wraps it, so the row of tiles ends level: the
217
+ anchor is the grid item, which stretches, and the card takes its full height. */
238
218
  [data-card] > helix-card {
239
219
  block-size: 100%;
240
220
  }
241
221
 
242
- /* A form is read straight down, and a field wider than about this stops being
243
- scannable however much room the window has. */
222
+ /* Each tile's icon, on a tint of the brand. */
223
+ .feature-mark {
224
+ --icon-size: 1.25rem;
225
+ background-color: var(--helix-color-primary-subtle);
226
+ border-radius: var(--helix-radii-md);
227
+ color: var(--helix-color-primary);
228
+ display: inline-flex;
229
+ inline-size: fit-content;
230
+ padding: var(--helix-space-xs);
231
+ }
232
+
233
+ /* A form is read straight down, and a field wider than about 28rem is hard to
234
+ scan, however much room the window has. */
244
235
  .form {
245
236
  align-content: start;
246
237
  display: grid;
@@ -255,11 +246,10 @@ helix-app-header {
255
246
  }
256
247
 
257
248
  /*
258
- * **The form takes a column and the notes take the rest.** A 28rem form on a
259
- * 1280 window is a third of a page and two thirds of nothing, which is what the
260
- * measure above cannot fix on its own: the form has a right width and the page
261
- * does not shrink to it. Narrow, the two stack and the notes read as a
262
- * postscript, which is the order they are written in.
249
+ * **The form takes a column and the notes take the rest.** A 28rem form alone
250
+ * on a 1280 window fills a third of the page and leaves two thirds empty: the
251
+ * form has a right width, and the page keeps its own. Narrow, the two stack,
252
+ * and the notes read as a postscript, the order they are written in.
263
253
  */
264
254
  .split {
265
255
  display: grid;
@@ -291,10 +281,10 @@ helix-app-header {
291
281
  }
292
282
 
293
283
  /*
294
- * **The counterpart to the bar, and the reason every route now ends rather than
295
- * stops.** The rule runs the window while its contents keep the page's measure,
296
- * which is what a footer under a centered page looks like; the shell above is
297
- * what holds it to the bottom of a window a route does not fill.
284
+ * **The counterpart to the bar, which gives every route an end.** The rule runs
285
+ * the width of the window while its contents keep the page's measure, as a
286
+ * footer under a centered page does. The shell above holds it to the bottom of a
287
+ * window a route does not fill.
298
288
  */
299
289
  .site-footer {
300
290
  border-block-start: var(--helix-border-thin) solid var(--helix-color-border);
@@ -318,12 +308,16 @@ helix-app-header {
318
308
  }
319
309
 
320
310
  /*
321
- * **Narrow, the gutter gives before the content does.** 24 pixels either side of
322
- * a 390 window is 48 of 390 spent on margin, and the table needs 355 of what is
323
- * left. At `md` it has 358 and fits; at `lg` it was 13 pixels short and the last
324
- * column sat outside the box until the reader scrolled the table sideways.
311
+ * **Narrow, the gutter gives first.** 24 pixels either side of a 390 window
312
+ * spend 48 of 390 on margin, and the table needs 355 of what is left. At `md` it
313
+ * has 358 and fits; at `lg` it was 13 pixels short, and the last column sat
314
+ * outside the box until you scrolled the table sideways.
325
315
  */
326
316
  @media (width < 40rem) {
317
+ .first-screen {
318
+ padding: var(--helix-space-2xl) var(--helix-space-lg);
319
+ }
320
+
327
321
  .page {
328
322
  padding-block: var(--helix-space-xl) var(--helix-space-2xl);
329
323
  padding-inline: var(--helix-space-md);
@@ -336,22 +330,21 @@ helix-app-header {
336
330
 
337
331
  /*
338
332
  * **The escape hatch, and the reason a component names its parts.** The table
339
- * washes a chosen row at the strength `Tag` rests at; this page wants a row
340
- * somebody has ticked to be findable from across the screen, and there is no
341
- * token for "more than that". `::part` reaches the boxes the component drew
342
- * without forking it, and a rule written out here beats the component's own
343
- * however specific that one is.
333
+ * tints a chosen row at the strength `Tag` rests at, and this page wants a
334
+ * ticked row easy to find from across the screen, a step past any token.
335
+ * `::part` reaches the boxes the component drew, with no fork, and a rule
336
+ * written out here beats the component's own, however specific that one is.
344
337
  *
345
- * **Two parts and not one, because a row has no box.** The row is
346
- * `display: contents` so that one grid can align every column across every row,
347
- * which leaves the cells as the only thing a selection can be painted on. The
348
- * table names both: the data cells and the cell holding the checkbox. Naming
349
- * only the first leaves a pale stripe down the left of every chosen row.
338
+ * **Two parts, because a row has no box.** The row is `display: contents`, so
339
+ * one grid can align every column across every row, and the cells are what a
340
+ * selection is painted on. The table names both: the data cells and the cell
341
+ * holding the checkbox. Naming only the first leaves a pale stripe down the
342
+ * left of every chosen row.
350
343
  *
351
344
  * The values are still the library's, so a theme carries them like everything
352
- * else. `primary-subtle` and not `primary-surface`: the second is the solid
353
- * accent a button stands on and expects white on top of it, so a row painted
354
- * with it puts the table's own ink on a saturated fill.
345
+ * else. `primary-subtle`, because `primary-surface` is the solid fill a
346
+ * button stands on, made for its own label, so a row painted with it would put
347
+ * the table's own ink on a solid fill.
355
348
  */
356
349
  helix-data-table::part(cell-selected),
357
350
  helix-data-table::part(select-selected) {