@fusion.dev/helix-templates 0.140.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 (35) hide show
  1. package/dist/index.js +6 -6
  2. package/package.json +1 -1
  3. package/templates/angular/src/app/landing.html +6 -6
  4. package/templates/angular/src/app/signup-form.html +4 -4
  5. package/templates/angular/src/app/site-footer.html +3 -6
  6. package/templates/angular/src/app/site-footer.ts +2 -2
  7. package/templates/angular/src/app/site-header.html +3 -6
  8. package/templates/angular/src/app.css +20 -19
  9. package/templates/react-nextjs/app/app.css +20 -19
  10. package/templates/react-nextjs/app/landing.tsx +4 -8
  11. package/templates/react-nextjs/app/signup-form.tsx +4 -5
  12. package/templates/react-nextjs/app/site-footer.tsx +5 -8
  13. package/templates/react-nextjs/app/site-header.tsx +3 -7
  14. package/templates/react-nextjs/tsconfig.json +4 -1
  15. package/templates/react-vite/src/app.css +20 -19
  16. package/templates/react-vite/src/landing.tsx +4 -8
  17. package/templates/react-vite/src/signup-form.tsx +4 -5
  18. package/templates/react-vite/src/site-footer.tsx +5 -8
  19. package/templates/react-vite/src/site-header.tsx +3 -7
  20. package/templates/solid-vite/src/app.css +20 -19
  21. package/templates/solid-vite/src/landing.tsx +4 -8
  22. package/templates/solid-vite/src/signup-form.tsx +4 -4
  23. package/templates/solid-vite/src/site-footer.tsx +5 -8
  24. package/templates/solid-vite/src/site-header.tsx +3 -6
  25. package/templates/svelte-vite/src/Landing.svelte +6 -6
  26. package/templates/svelte-vite/src/SignupForm.svelte +4 -4
  27. package/templates/svelte-vite/src/SiteFooter.svelte +5 -8
  28. package/templates/svelte-vite/src/SiteHeader.svelte +3 -5
  29. package/templates/svelte-vite/src/app.css +20 -19
  30. package/templates/vue-vite/src/LandingPage.vue +6 -6
  31. package/templates/vue-vite/src/SignupForm.vue +4 -4
  32. package/templates/vue-vite/src/SiteFooter.vue +5 -8
  33. package/templates/vue-vite/src/SiteHeader.vue +3 -6
  34. package/templates/vue-vite/src/app.css +20 -19
  35. package/templates.json +4 -10
package/dist/index.js CHANGED
@@ -2,37 +2,37 @@ export const templates = [
2
2
  {
3
3
  description: 'React and TypeScript on Vite. The shortest path to a running app.',
4
4
  id: 'react-vite',
5
- named: ['index.html', 'package.json', 'src/site-header.tsx'],
5
+ named: ['index.html', 'package.json'],
6
6
  title: 'React (Vite)',
7
7
  },
8
8
  {
9
9
  description: 'React and TypeScript on the Next.js App Router, with the three pages as real routes.',
10
10
  id: 'react-nextjs',
11
- named: ['app/layout.tsx', 'app/site-header.tsx', 'package.json'],
11
+ named: ['app/layout.tsx', 'package.json'],
12
12
  title: 'React (Next.js)',
13
13
  },
14
14
  {
15
15
  description: 'Vue and TypeScript on Vite.',
16
16
  id: 'vue-vite',
17
- named: ['index.html', 'package.json', 'src/SiteHeader.vue'],
17
+ named: ['index.html', 'package.json'],
18
18
  title: 'Vue (Vite)',
19
19
  },
20
20
  {
21
21
  description: 'Angular and TypeScript on the Angular CLI.',
22
22
  id: 'angular',
23
- named: ['angular.json', 'package.json', 'src/app/site-header.html', 'src/index.html'],
23
+ named: ['angular.json', 'package.json', 'src/index.html'],
24
24
  title: 'Angular',
25
25
  },
26
26
  {
27
27
  description: 'Svelte and TypeScript on Vite.',
28
28
  id: 'svelte-vite',
29
- named: ['index.html', 'package.json', 'src/SiteHeader.svelte'],
29
+ named: ['index.html', 'package.json'],
30
30
  title: 'Svelte (Vite)',
31
31
  },
32
32
  {
33
33
  description: 'Solid and TypeScript on Vite.',
34
34
  id: 'solid-vite',
35
- named: ['index.html', 'package.json', 'src/site-header.tsx'],
35
+ named: ['index.html', 'package.json'],
36
36
  title: 'Solid (Vite)',
37
37
  },
38
38
  ];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-templates",
3
3
  "description": "Starter templates for Helix, as data. Read by `helix new` and by `npm create @fusion.dev/helix-app`.",
4
- "version": "0.140.0",
4
+ "version": "0.141.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -16,12 +16,13 @@
16
16
  </div>
17
17
  </div>
18
18
 
19
- <!-- **The library at work, on the first screen.** The figures are the roster
20
- the data view draws, read from the same module, so the panel is the app
21
- itself, on glass over the light. -->
19
+ <!-- **The library at work, on the first screen.** The figures are the
20
+ roster the data view draws, read from the same module, so the panel
21
+ is the app itself, on glass over the light. It has no link of its own:
22
+ the button beside it goes to the same page. -->
22
23
  <helix-card class="specimen" material="glass" separation="outlined">
23
- <helix-text as="h2" slot="header" variant="title">The roster, in three figures</helix-text>
24
- <helix-stat-group divided>
24
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
25
+ <helix-stat-group>
25
26
  <helix-stat>
26
27
  {{ roster.people }}
27
28
  <span slot="label">People</span>
@@ -35,7 +36,6 @@
35
36
  <span slot="label">Reviews</span>
36
37
  </helix-stat>
37
38
  </helix-stat-group>
38
- <a data-link href="#/overview" slot="footer">Open the data view</a>
39
39
  </helix-card>
40
40
  </header>
41
41
 
@@ -49,10 +49,10 @@
49
49
 
50
50
  <aside class="notes">
51
51
  <!-- The one fact you need before typing your name into a page you have
52
- had for five minutes, so it is a callout. `tone` is the meaning,
53
- and the component draws it with a tint and a bar on the inline
54
- start, so it survives being read in grayscale. -->
55
- <helix-callout tone="info">
52
+ had for five minutes, so it is a callout. `neutral` is a note that
53
+ reports no status, drawn in the muted ink with a bar on the inline
54
+ start, so it stays in the palette, ink or brand. -->
55
+ <helix-callout tone="neutral">
56
56
  The form posts nothing. Submit it, and a message shows exactly what a server would receive.
57
57
  </helix-callout>
58
58
  <helix-text as="h2" variant="title">What the form shows</helix-text>
@@ -1,10 +1,7 @@
1
1
  <div class="footer-row">
2
- <helix-text as="p" emphasis="subtle" variant="caption">
3
- Every component here has a page, with its API, its parts, and its examples.
4
- </helix-text>
5
2
  <div class="footer-links">
6
- <a data-link="subtle" [href]="docs.gallery">Components</a>
7
- <a data-link="subtle" [href]="docs.elements">Documentation</a>
8
- <a data-link="subtle" [href]="docs.angular">Angular</a>
3
+ <a data-link="quiet" [href]="docs.gallery">Components</a>
4
+ <a data-link="quiet" [href]="docs.elements">Documentation</a>
5
+ <a data-link="quiet" [href]="docs.angular">Angular</a>
9
6
  </div>
10
7
  </div>
@@ -8,8 +8,8 @@ import { DOCS } from './docs'
8
8
  * and a caption, which on a tall window left the bottom third of the screen
9
9
  * empty. The footer is also where the links you want once belong.
10
10
  *
11
- * `data-link="subtle"` reads as body text until it is hovered, which suits a
12
- * row of links under a rule.
11
+ * `data-link="quiet"` sets a link in the muted ink with no underline, and it
12
+ * takes the foreground on hover, which suits a row of links under a rule.
13
13
  */
14
14
  @Component({
15
15
  host: { class: 'site-footer' },
@@ -1,12 +1,9 @@
1
1
  <helix-app-header material="glass" sticky>
2
2
  <!-- The wordmark is the way back to the first page, so there is no third
3
- destination in the bar saying the same thing. It is also the only name
4
- of the project on the screen. The mark is a placeholder for your own,
5
- drawn in `--helix-color-brand-mark`, the token for the brand as a
6
- graphic. -->
3
+ destination in the bar saying the same thing. It names the library the
4
+ starter is built on, and it is the place for your own name or logo. -->
7
5
  <a class="wordmark" data-link="quiet" href="#/" slot="start">
8
- <helix-icon name="cube"></helix-icon>
9
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
6
+ <helix-text variant="body-strong">Helix</helix-text>
10
7
  </a>
11
8
 
12
9
  <!-- The links are yours. Navigation owns the marker that travels between
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
@@ -53,12 +53,11 @@ export function Landing() {
53
53
 
54
54
  {/* **The library at work, on the first screen.** The figures are the
55
55
  roster the data view draws, read from the same module, so the panel
56
- is the app itself, on glass over the light. */}
56
+ is the app itself, on glass over the light. It has no link of its own:
57
+ the button beside it goes to the same page. */}
57
58
  <helix-card className="specimen" material="glass" separation="outlined">
58
- <helix-text as="h2" slot="header" variant="title">
59
- The roster, in three figures
60
- </helix-text>
61
- <helix-stat-group divided>
59
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
60
+ <helix-stat-group>
62
61
  <helix-stat>
63
62
  {roster.people}
64
63
  <span slot="label">People</span>
@@ -72,9 +71,6 @@ export function Landing() {
72
71
  <span slot="label">Reviews</span>
73
72
  </helix-stat>
74
73
  </helix-stat-group>
75
- <Link data-link href="/overview" slot="footer">
76
- Open the data view
77
- </Link>
78
74
  </helix-card>
79
75
  </header>
80
76
 
@@ -114,11 +114,10 @@ export function SignupForm() {
114
114
 
115
115
  <aside className="notes">
116
116
  {/* The one fact you need before typing your name into a page you have
117
- had for five minutes, so it is a callout. `tone` is the meaning,
118
- and the component draws it with a tint mixed from the status color
119
- and a bar on the inline start, so it survives being read in
120
- grayscale. */}
121
- <helix-callout tone="info">
117
+ had for five minutes, so it is a callout. `neutral` is a note that
118
+ reports no status, drawn in the muted ink with a bar on the inline
119
+ start, so it stays in the palette, ink or brand. */}
120
+ <helix-callout tone="neutral">
122
121
  The form posts nothing. Submit it, and a message shows exactly what a server would
123
122
  receive.
124
123
  </helix-callout>
@@ -8,24 +8,21 @@ import { DOCS } from './docs'
8
8
  * empty, as if the layout had run out. The footer is also where the links you
9
9
  * want once belong, so the landing page no longer carries them.
10
10
  *
11
- * `data-link="subtle"` reads as body text until it is hovered, which suits a
12
- * row of links under a rule.
11
+ * `data-link="quiet"` sets a link in the muted ink with no underline, and it
12
+ * takes the foreground on hover, which suits a row of links under a rule.
13
13
  */
14
14
  export function SiteFooter() {
15
15
  return (
16
16
  <footer className="site-footer">
17
17
  <div className="footer-row">
18
- <helix-text as="p" emphasis="subtle" variant="caption">
19
- Every component here has a page, with its API, its parts, and its examples.
20
- </helix-text>
21
18
  <div className="footer-links">
22
- <a data-link="subtle" href={DOCS.gallery}>
19
+ <a data-link="quiet" href={DOCS.gallery}>
23
20
  Components
24
21
  </a>
25
- <a data-link="subtle" href={DOCS.elements}>
22
+ <a data-link="quiet" href={DOCS.elements}>
26
23
  Documentation
27
24
  </a>
28
- <a data-link="subtle" href={DOCS.react}>
25
+ <a data-link="quiet" href={DOCS.react}>
29
26
  React
30
27
  </a>
31
28
  </div>
@@ -53,14 +53,10 @@ export function SiteHeader() {
53
53
  <helix-app-header material="glass" sticky>
54
54
  {/* The wordmark is the way back to the first page, as a wordmark usually
55
55
  is, so there is no third destination in the bar saying the same thing.
56
- It is also the only name of the project on the screen: the landing
57
- page leads with what the starter is.
58
-
59
- The mark is a placeholder for your own, and it is drawn in
60
- `--helix-color-brand-mark`, the token for the brand as a graphic. */}
56
+ It names the library the starter is built on, and it is the place for
57
+ your own name or logo. */}
61
58
  <Link className="wordmark" data-link="quiet" href="/" slot="start">
62
- <helix-icon name="cube" />
63
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
59
+ <helix-text variant="body-strong">Helix</helix-text>
64
60
  </Link>
65
61
 
66
62
  {/* The links are yours. Navigation owns the marker that travels between
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "jsx": "preserve",
3
+ "allowJs": true,
4
+ "esModuleInterop": true,
5
+ "jsx": "react-jsx",
4
6
  "lib": [
5
7
  "DOM",
6
8
  "DOM.Iterable",
@@ -27,6 +29,7 @@
27
29
  "**/*.ts",
28
30
  "**/*.tsx",
29
31
  ".next/types/**/*.ts",
32
+ ".next/dev/types/**/*.ts",
30
33
  "helix-jsx.d.ts"
31
34
  ],
32
35
  "exclude": [
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
@@ -53,12 +53,11 @@ export function Landing() {
53
53
 
54
54
  {/* **The library at work, on the first screen.** The figures are the
55
55
  roster the data view draws, read from the same module, so the panel
56
- is the app itself, on glass over the light. */}
56
+ is the app itself, on glass over the light. It has no link of its own:
57
+ the button beside it goes to the same page. */}
57
58
  <helix-card className="specimen" material="glass" separation="outlined">
58
- <helix-text as="h2" slot="header" variant="title">
59
- The roster, in three figures
60
- </helix-text>
61
- <helix-stat-group divided>
59
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
60
+ <helix-stat-group>
62
61
  <helix-stat>
63
62
  {roster.people}
64
63
  <span slot="label">People</span>
@@ -72,9 +71,6 @@ export function Landing() {
72
71
  <span slot="label">Reviews</span>
73
72
  </helix-stat>
74
73
  </helix-stat-group>
75
- <Link data-link href="/overview" slot="footer">
76
- Open the data view
77
- </Link>
78
74
  </helix-card>
79
75
  </header>
80
76
 
@@ -105,11 +105,10 @@ export function SignupForm() {
105
105
 
106
106
  <aside className="notes">
107
107
  {/* The one fact you need before typing your name into a page you have
108
- had for five minutes, so it is a callout. `tone` is the meaning,
109
- and the component draws it with a tint mixed from the status color
110
- and a bar on the inline start, so it survives being read in
111
- grayscale. */}
112
- <helix-callout tone="info">
108
+ had for five minutes, so it is a callout. `neutral` is a note that
109
+ reports no status, drawn in the muted ink with a bar on the inline
110
+ start, so it stays in the palette, ink or brand. */}
111
+ <helix-callout tone="neutral">
113
112
  The form posts nothing. Submit it, and a message shows exactly what a server would
114
113
  receive.
115
114
  </helix-callout>
@@ -8,24 +8,21 @@ import { DOCS } from './docs.js'
8
8
  * empty, as if the layout had run out. The footer is also where the links you
9
9
  * want once belong, so the landing page no longer carries them.
10
10
  *
11
- * `data-link="subtle"` reads as body text until it is hovered, which suits a
12
- * row of links under a rule.
11
+ * `data-link="quiet"` sets a link in the muted ink with no underline, and it
12
+ * takes the foreground on hover, which suits a row of links under a rule.
13
13
  */
14
14
  export function SiteFooter() {
15
15
  return (
16
16
  <footer className="site-footer">
17
17
  <div className="footer-row">
18
- <helix-text as="p" emphasis="subtle" variant="caption">
19
- Every component here has a page, with its API, its parts, and its examples.
20
- </helix-text>
21
18
  <div className="footer-links">
22
- <a data-link="subtle" href={DOCS.gallery}>
19
+ <a data-link="quiet" href={DOCS.gallery}>
23
20
  Components
24
21
  </a>
25
- <a data-link="subtle" href={DOCS.elements}>
22
+ <a data-link="quiet" href={DOCS.elements}>
26
23
  Documentation
27
24
  </a>
28
- <a data-link="subtle" href={DOCS.react}>
25
+ <a data-link="quiet" href={DOCS.react}>
29
26
  React
30
27
  </a>
31
28
  </div>
@@ -43,14 +43,10 @@ export function SiteHeader() {
43
43
  <helix-app-header material="glass" sticky>
44
44
  {/* The wordmark is the way back to the first page, as a wordmark usually
45
45
  is, so there is no third destination in the bar saying the same thing.
46
- It is also the only name of the project on the screen: the landing
47
- page leads with what the starter is.
48
-
49
- The mark is a placeholder for your own, and it is drawn in
50
- `--helix-color-brand-mark`, the token for the brand as a graphic. */}
46
+ It names the library the starter is built on, and it is the place for
47
+ your own name or logo. */}
51
48
  <Link className="wordmark" data-link="quiet" href="/" slot="start">
52
- <helix-icon name="cube" />
53
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
49
+ <helix-text variant="body-strong">Helix</helix-text>
54
50
  </Link>
55
51
 
56
52
  {/* The links are yours. Navigation owns the marker that travels between
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
@@ -50,12 +50,11 @@ export function Landing() {
50
50
 
51
51
  {/* **The library at work, on the first screen.** The figures are the
52
52
  roster the data view draws, read from the same module, so the panel
53
- is the app itself, on glass over the light. */}
53
+ is the app itself, on glass over the light. It has no link of its own:
54
+ the button beside it goes to the same page. */}
54
55
  <helix-card class="specimen" material="glass" separation="outlined">
55
- <helix-text as="h2" slot="header" variant="title">
56
- The roster, in three figures
57
- </helix-text>
58
- <helix-stat-group divided>
56
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
57
+ <helix-stat-group>
59
58
  <helix-stat>
60
59
  {roster.people}
61
60
  <span slot="label">People</span>
@@ -69,9 +68,6 @@ export function Landing() {
69
68
  <span slot="label">Reviews</span>
70
69
  </helix-stat>
71
70
  </helix-stat-group>
72
- <a data-link href="#/overview" slot="footer">
73
- Open the data view
74
- </a>
75
71
  </helix-card>
76
72
  </header>
77
73
 
@@ -98,10 +98,10 @@ export function SignupForm() {
98
98
 
99
99
  <aside class="notes">
100
100
  {/* The one fact you need before typing your name into a page you have
101
- had for five minutes, so it is a callout. `tone` is the meaning,
102
- and the component draws it with a tint and a bar on the inline
103
- start, so it survives being read in grayscale. */}
104
- <helix-callout tone="info">
101
+ had for five minutes, so it is a callout. `neutral` is a note that
102
+ reports no status, drawn in the muted ink with a bar on the inline
103
+ start, so it stays in the palette, ink or brand. */}
104
+ <helix-callout tone="neutral">
105
105
  The form posts nothing. Submit it, and a message shows exactly what a server would
106
106
  receive.
107
107
  </helix-callout>
@@ -7,24 +7,21 @@ import { DOCS } from './docs.ts'
7
7
  * and a caption, which on a tall window left the bottom third of the screen
8
8
  * empty. The footer is also where the links you want once belong.
9
9
  *
10
- * `data-link="subtle"` reads as body text until it is hovered, which suits a
11
- * row of links under a rule.
10
+ * `data-link="quiet"` sets a link in the muted ink with no underline, and it
11
+ * takes the foreground on hover, which suits a row of links under a rule.
12
12
  */
13
13
  export function SiteFooter() {
14
14
  return (
15
15
  <footer class="site-footer">
16
16
  <div class="footer-row">
17
- <helix-text as="p" emphasis="subtle" variant="caption">
18
- Every component here has a page, with its API, its parts, and its examples.
19
- </helix-text>
20
17
  <div class="footer-links">
21
- <a data-link="subtle" href={DOCS.gallery}>
18
+ <a data-link="quiet" href={DOCS.gallery}>
22
19
  Components
23
20
  </a>
24
- <a data-link="subtle" href={DOCS.elements}>
21
+ <a data-link="quiet" href={DOCS.elements}>
25
22
  Documentation
26
23
  </a>
27
- <a data-link="subtle" href={DOCS.solid}>
24
+ <a data-link="quiet" href={DOCS.solid}>
28
25
  Solid
29
26
  </a>
30
27
  </div>
@@ -40,13 +40,10 @@ export function SiteHeader() {
40
40
  return (
41
41
  <helix-app-header material="glass" sticky>
42
42
  {/* The wordmark is the way back to the first page, so there is no third
43
- destination in the bar saying the same thing. It is also the only name
44
- of the project on the screen. The mark is a placeholder for your own,
45
- drawn in `--helix-color-brand-mark`, the token for the brand as a
46
- graphic. */}
43
+ destination in the bar saying the same thing. It names the library the
44
+ starter is built on, and it is the place for your own name or logo. */}
47
45
  <a class="wordmark" data-link="quiet" href="#/" slot="start">
48
- <helix-icon name="cube" />
49
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
46
+ <helix-text variant="body-strong">Helix</helix-text>
50
47
  </a>
51
48
 
52
49
  {/* The links are yours. Navigation owns the marker that travels between
@@ -38,12 +38,13 @@
38
38
  </div>
39
39
  </div>
40
40
 
41
- <!-- **The library at work, on the first screen.** The figures are the roster
42
- the data view draws, read from the same module, so the panel is the app
43
- itself, on glass over the light. -->
41
+ <!-- **The library at work, on the first screen.** The figures are the
42
+ roster the data view draws, read from the same module, so the panel
43
+ is the app itself, on glass over the light. It has no link of its own:
44
+ the button beside it goes to the same page. -->
44
45
  <helix-card class="specimen" material="glass" separation="outlined">
45
- <helix-text as="h2" slot="header" variant="title">The roster, in three figures</helix-text>
46
- <helix-stat-group divided>
46
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
47
+ <helix-stat-group>
47
48
  <helix-stat>
48
49
  {roster.people}
49
50
  <span slot="label">People</span>
@@ -57,7 +58,6 @@
57
58
  <span slot="label">Reviews</span>
58
59
  </helix-stat>
59
60
  </helix-stat-group>
60
- <a data-link href="#/overview" slot="footer">Open the data view</a>
61
61
  </helix-card>
62
62
  </header>
63
63
 
@@ -105,10 +105,10 @@
105
105
 
106
106
  <aside class="notes">
107
107
  <!-- The one fact you need before typing your name into a page you have
108
- had for five minutes, so it is a callout. `tone` is the meaning,
109
- and the component draws it with a tint and a bar on the inline
110
- start, so it survives being read in grayscale. -->
111
- <helix-callout tone="info">
108
+ had for five minutes, so it is a callout. `neutral` is a note that
109
+ reports no status, drawn in the muted ink with a bar on the inline
110
+ start, so it stays in the palette, ink or brand. -->
111
+ <helix-callout tone="neutral">
112
112
  The form posts nothing. Submit it, and a message shows exactly what a server would receive.
113
113
  </helix-callout>
114
114
  <helix-text as="h2" variant="title">What the form shows</helix-text>
@@ -5,8 +5,8 @@
5
5
  and a caption, which on a tall window left the bottom third of the screen
6
6
  empty. The footer is also where the links you want once belong.
7
7
 
8
- `data-link="subtle"` reads as body text until it is hovered, which suits a
9
- row of links under a rule.
8
+ `data-link="quiet"` sets a link in the muted ink with no underline, and it
9
+ takes the foreground on hover, which suits a row of links under a rule.
10
10
  -->
11
11
  <script lang="ts">
12
12
  import { DOCS } from './docs.ts'
@@ -14,13 +14,10 @@
14
14
 
15
15
  <footer class="site-footer">
16
16
  <div class="footer-row">
17
- <helix-text as="p" emphasis="subtle" variant="caption">
18
- Every component here has a page, with its API, its parts, and its examples.
19
- </helix-text>
20
17
  <div class="footer-links">
21
- <a data-link="subtle" href={DOCS.gallery}>Components</a>
22
- <a data-link="subtle" href={DOCS.elements}>Documentation</a>
23
- <a data-link="subtle" href={DOCS.svelte}>Svelte</a>
18
+ <a data-link="quiet" href={DOCS.gallery}>Components</a>
19
+ <a data-link="quiet" href={DOCS.elements}>Documentation</a>
20
+ <a data-link="quiet" href={DOCS.svelte}>Svelte</a>
24
21
  </div>
25
22
  </div>
26
23
  </footer>
@@ -37,12 +37,10 @@
37
37
 
38
38
  <helix-app-header material="glass" sticky>
39
39
  <!-- The wordmark is the way back to the first page, so there is no third
40
- destination in the bar saying the same thing. It is also the only name of
41
- the project on the screen. The mark is a placeholder for your own, drawn
42
- in `--helix-color-brand-mark`, the token for the brand as a graphic. -->
40
+ destination in the bar saying the same thing. It names the library the
41
+ starter is built on, and it is the place for your own name or logo. -->
43
42
  <a class="wordmark" data-link="quiet" href="#/" slot="start">
44
- <helix-icon name="cube"></helix-icon>
45
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
43
+ <helix-text variant="body-strong">Helix</helix-text>
46
44
  </a>
47
45
 
48
46
  <!-- The links are yours. Navigation owns the marker that travels between them
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
@@ -39,12 +39,13 @@ const figure = new Intl.NumberFormat('en-US')
39
39
  </div>
40
40
  </div>
41
41
 
42
- <!-- **The library at work, on the first screen.** The figures are the roster
43
- the data view draws, read from the same module, so the panel is the app
44
- itself, on glass over the light. -->
42
+ <!-- **The library at work, on the first screen.** The figures are the
43
+ roster the data view draws, read from the same module, so the panel
44
+ is the app itself, on glass over the light. It has no link of its own:
45
+ the button beside it goes to the same page. -->
45
46
  <helix-card class="specimen" material="glass" separation="outlined">
46
- <helix-text as="h2" slot="header" variant="title">The roster, in three figures</helix-text>
47
- <helix-stat-group divided>
47
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
48
+ <helix-stat-group>
48
49
  <helix-stat>
49
50
  {{ roster.people }}
50
51
  <span slot="label">People</span>
@@ -58,7 +59,6 @@ const figure = new Intl.NumberFormat('en-US')
58
59
  <span slot="label">Reviews</span>
59
60
  </helix-stat>
60
61
  </helix-stat-group>
61
- <a data-link href="#/overview" slot="footer">Open the data view</a>
62
62
  </helix-card>
63
63
  </header>
64
64
 
@@ -105,10 +105,10 @@ const dismiss = (id: number) => {
105
105
 
106
106
  <aside class="notes">
107
107
  <!-- The one fact you need before typing your name into a page you have
108
- had for five minutes, so it is a callout. `tone` is the meaning,
109
- and the component draws it with a tint and a bar on the inline
110
- start, so it survives being read in grayscale. -->
111
- <helix-callout tone="info">
108
+ had for five minutes, so it is a callout. `neutral` is a note that
109
+ reports no status, drawn in the muted ink with a bar on the inline
110
+ start, so it stays in the palette, ink or brand. -->
111
+ <helix-callout tone="neutral">
112
112
  The form posts nothing. Submit it, and a message shows exactly what a server would
113
113
  receive.
114
114
  </helix-callout>
@@ -9,19 +9,16 @@ import { DOCS } from './docs.ts'
9
9
  and a caption, which on a tall window left the bottom third of the screen
10
10
  empty. The footer is also where the links you want once belong.
11
11
 
12
- `data-link="subtle"` reads as body text until it is hovered, which suits a
13
- row of links under a rule.
12
+ `data-link="quiet"` sets a link in the muted ink with no underline, and it
13
+ takes the foreground on hover, which suits a row of links under a rule.
14
14
  -->
15
15
  <template>
16
16
  <footer class="site-footer">
17
17
  <div class="footer-row">
18
- <helix-text as="p" emphasis="subtle" variant="caption">
19
- Every component here has a page, with its API, its parts, and its examples.
20
- </helix-text>
21
18
  <div class="footer-links">
22
- <a data-link="subtle" :href="DOCS.gallery">Components</a>
23
- <a data-link="subtle" :href="DOCS.elements">Documentation</a>
24
- <a data-link="subtle" :href="DOCS.vue">Vue</a>
19
+ <a data-link="quiet" :href="DOCS.gallery">Components</a>
20
+ <a data-link="quiet" :href="DOCS.elements">Documentation</a>
21
+ <a data-link="quiet" :href="DOCS.vue">Vue</a>
25
22
  </div>
26
23
  </div>
27
24
  </footer>
@@ -40,13 +40,10 @@ const cycle = () => {
40
40
  <template>
41
41
  <helix-app-header material="glass" sticky>
42
42
  <!-- The wordmark is the way back to the first page, so there is no third
43
- destination in the bar saying the same thing. It is also the only name
44
- of the project on the screen. The mark is a placeholder for your own,
45
- drawn in `--helix-color-brand-mark`, the token for the brand as a
46
- graphic. -->
43
+ destination in the bar saying the same thing. It names the library the
44
+ starter is built on, and it is the place for your own name or logo. -->
47
45
  <a class="wordmark" data-link="quiet" href="#/" slot="start">
48
- <helix-icon name="cube" />
49
- <helix-text variant="body-strong">__PROJECT_NAME__</helix-text>
46
+ <helix-text variant="body-strong">Helix</helix-text>
50
47
  </a>
51
48
 
52
49
  <!-- The links are yours. Navigation owns the marker that travels between
@@ -6,10 +6,14 @@
6
6
  * open. Everything below is a Helix token or a documented hook, so a theme
7
7
  * changes it, and both color modes follow from one copy.
8
8
  *
9
- * **Color appears in two places, and both are named.** The wordmark takes
10
- * `--helix-color-brand-mark`, the token for the brand as a graphic, and a
11
- * chosen row takes `--helix-color-primary-subtle` through the parts the table
12
- * publishes. Everywhere else the page is ink on the background, and the
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
13
17
  * components carry their own color.
14
18
  */
15
19
 
@@ -59,20 +63,18 @@ helix-app-header {
59
63
  --app-header-max-inline-size: 56rem;
60
64
  }
61
65
 
62
- /* The mark beside the project's name, the one graphic on the page and the
63
- reason `--helix-color-brand-mark` exists. WCAG asks 3:1 of a graphic and 4.5:1
64
- of text, so a mark can sit closer to a theme's brand color than any text
65
- color can. Swap the glyph, or 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. */
66
71
  .wordmark {
67
72
  align-items: center;
73
+ color: var(--helix-color-foreground);
68
74
  display: inline-flex;
69
75
  gap: var(--helix-space-xs);
70
76
  }
71
77
 
72
- .wordmark helix-icon {
73
- color: var(--helix-color-brand-mark);
74
- }
75
-
76
78
  /*
77
79
  * One rhythm between the blocks of a page, so no page sets its own.
78
80
  *
@@ -185,12 +187,11 @@ helix-app-header {
185
187
  * **The panel is the library at work**, so all it needs from here is room. Two
186
188
  * documented hooks: the figures come down a step from the display size, which
187
189
  * suits one figure on its own and is too loud for three in an 18rem column, and
188
- * the gap around the rule between them comes in from `2xl`, which `divided`
189
- * doubles, leaving no room for a number.
190
+ * the gap between them is wide enough to set them apart with no rule.
190
191
  */
191
192
  .specimen {
192
- --stat-group-gap: var(--helix-space-md);
193
- --stat-value-size: var(--helix-text-xl);
193
+ --stat-group-gap: var(--helix-space-xl);
194
+ --stat-value-size: var(--helix-text-2xl);
194
195
  }
195
196
 
196
197
  /* A section is its heading and its one block, closer together than two sections
@@ -341,9 +342,9 @@ helix-app-header {
341
342
  * left of every chosen row.
342
343
  *
343
344
  * The values are still the library's, so a theme carries them like everything
344
- * else. `primary-subtle`, because `primary-surface` is the solid accent a
345
- * button stands on, made for white text, so a row painted with it would put the
346
- * 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.
347
348
  */
348
349
  helix-data-table::part(cell-selected),
349
350
  helix-data-table::part(select-selected) {
package/templates.json CHANGED
@@ -6,8 +6,7 @@
6
6
  "id": "react-vite",
7
7
  "named": [
8
8
  "index.html",
9
- "package.json",
10
- "src/site-header.tsx"
9
+ "package.json"
11
10
  ],
12
11
  "title": "React (Vite)"
13
12
  },
@@ -16,7 +15,6 @@
16
15
  "id": "react-nextjs",
17
16
  "named": [
18
17
  "app/layout.tsx",
19
- "app/site-header.tsx",
20
18
  "package.json"
21
19
  ],
22
20
  "title": "React (Next.js)"
@@ -26,8 +24,7 @@
26
24
  "id": "vue-vite",
27
25
  "named": [
28
26
  "index.html",
29
- "package.json",
30
- "src/SiteHeader.vue"
27
+ "package.json"
31
28
  ],
32
29
  "title": "Vue (Vite)"
33
30
  },
@@ -37,7 +34,6 @@
37
34
  "named": [
38
35
  "angular.json",
39
36
  "package.json",
40
- "src/app/site-header.html",
41
37
  "src/index.html"
42
38
  ],
43
39
  "title": "Angular"
@@ -47,8 +43,7 @@
47
43
  "id": "svelte-vite",
48
44
  "named": [
49
45
  "index.html",
50
- "package.json",
51
- "src/SiteHeader.svelte"
46
+ "package.json"
52
47
  ],
53
48
  "title": "Svelte (Vite)"
54
49
  },
@@ -57,8 +52,7 @@
57
52
  "id": "solid-vite",
58
53
  "named": [
59
54
  "index.html",
60
- "package.json",
61
- "src/site-header.tsx"
55
+ "package.json"
62
56
  ],
63
57
  "title": "Solid (Vite)"
64
58
  }