@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
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.139.0",
4
+ "version": "0.141.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -2,39 +2,40 @@
2
2
  * The rows the overview draws.
3
3
  *
4
4
  * A local module and no network, so the starter runs with nothing behind it.
5
- * Point `rows` at whatever you fetch and the table does not change: it takes the
6
- * whole result and does the sorting, the filtering and the paging itself. Past
7
- * the size a browser can hold, `mode="server"` inverts that and the table asks
8
- * you for a page instead.
5
+ * Point `rows` at whatever you fetch and the table stays the same: it takes the
6
+ * whole result and does the sorting, the filtering, and the paging itself. Past
7
+ * the size a browser can hold, `mode="server"` hands the paging to you, one page
8
+ * at a time.
9
9
  */
10
10
 
11
11
  /**
12
12
  * One person on the roster.
13
13
  *
14
- * **A type alias and not an interface**, which TypeScript makes load-bearing
15
- * here: `rows` takes `Readonly<Record<string, unknown>>`, an interface has no
16
- * implicit index signature, and so an interface of exactly these fields is not
17
- * assignable to it. The error names the index signature and not the shape, so
18
- * it reads as though the data were wrong.
14
+ * **A type alias, which TypeScript makes load-bearing here.** `rows` takes
15
+ * `Readonly<Record<string, unknown>>`, and an interface has no implicit index
16
+ * signature, so an interface of exactly these fields is not assignable to it.
17
+ * The error names the index signature, so it reads as though the data were
18
+ * wrong.
19
19
  */
20
20
  export type Member = {
21
21
  /**
22
22
  * A stable identity, which is what `row-key` names.
23
23
  *
24
- * Sorting moves a row's element rather than rewriting every cell in it, so
25
- * without one a sort throws away focus and anything attached to a row.
24
+ * With one, a sort moves each row's element whole, so focus and anything
25
+ * attached to a row go with it. Without one, a sort rewrites the cells in
26
+ * place and loses both.
26
27
  */
27
28
  readonly id: string
28
29
  /**
29
- * What the reader is here to find.
30
+ * The name a row is found by.
30
31
  */
31
32
  readonly name: string
32
33
  /**
33
- * A number rather than a formatted string, so the column sorts by size.
34
+ * A number, so the column sorts by size.
34
35
  *
35
36
  * A cell showing `2.4k` sorts as text unless the column's `compare` says what
36
- * the value underneath is, which is the one thing here that is cheap to get
37
- * right now and expensive to add later.
37
+ * the value underneath is, which is cheap to get right now and expensive to
38
+ * add later.
38
39
  */
39
40
  readonly reviews: number
40
41
  /**
@@ -68,8 +69,7 @@ export const teams: readonly string[] = [...new Set(members.map((one) => one.tea
68
69
  /**
69
70
  * The same roster as three figures, for the panel on the first screen.
70
71
  *
71
- * Derived rather than written out, so the panel cannot claim a number the table
72
- * does not show.
72
+ * Derived from the rows, so the panel and the table always agree.
73
73
  */
74
74
  export const roster = {
75
75
  /** How many rows the data view has. */
@@ -1,13 +1,13 @@
1
1
  /**
2
- * The documentation this starter links to.
2
+ * The documentation the starter links to.
3
3
  *
4
- * **One module, because a link is the thing in a starter most likely to rot.**
5
- * A page that composes its own URLs ships a plausible-looking 404 to every
6
- * project scaffolded from it, and nobody finds out until a reader clicks one.
7
- * Here they are in a list somebody can open and check, and pointing the starter
8
- * at a mirror or an internal copy is one edit.
4
+ * **One module, because links are what rots first in a starter.** A page that
5
+ * composes its own URLs ships a plausible-looking 404 to every project
6
+ * scaffolded from it, and it shows only when the link is followed. Here they
7
+ * are in one list you can open and check, and pointing the starter at a mirror
8
+ * or an internal copy is one edit.
9
9
  *
10
- * Checked 16 Sep 2026: every entry answers 200.
10
+ * Checked October 4, 2026: every entry answers 200.
11
11
  */
12
12
  export const DOCS = {
13
13
  /** Angular specifically: the schema, property bindings, and events. */
@@ -16,9 +16,9 @@ export const DOCS = {
16
16
  elements: 'https://fusion.dev/helix/docs/using-the-elements',
17
17
  /** What a `<form>` does with these controls, and what it cannot do. */
18
18
  forms: 'https://fusion.dev/helix/docs/forms',
19
- /** Every component, with its API, its parts and its examples. */
19
+ /** Every component, with its API, its parts, and its examples. */
20
20
  gallery: 'https://fusion.dev/helix/components',
21
- /** The light and dark pair, and the attribute that chooses between them. */
21
+ /** The light and dark pair, and the attribute that sets which one shows. */
22
22
  modes: 'https://fusion.dev/helix/docs/color-modes',
23
23
  /** Reaching a component's parts from a page, which `app.css` does once. */
24
24
  parts: 'https://fusion.dev/helix/docs/overriding-a-component',
@@ -1,11 +1,14 @@
1
1
  <header class="first-screen">
2
+ <!-- **The light behind the first screen**: a helix, drawn by the library in
3
+ the theme's colors, so a new brand color relights it. It shows one still
4
+ frame where motion is reduced, and a gradient where the browser draws
5
+ without a GPU. -->
6
+ <helix-aura class="first-light" data-layer [speed]="0.4" [terminus]="0.8" variant="braid"></helix-aura>
2
7
  <div class="hero">
3
- <helix-text emphasis="muted" variant="label">Helix starter</helix-text>
4
- <helix-text as="h1">Every tag on this page is Helix</helix-text>
5
- <helix-text as="p" class="lede" emphasis="muted" variant="body">
6
- Nothing here is a wrapper: the tags are the library's own elements, and every color,
7
- size and space inside them comes from one set of tokens. Three routes are laid down, and
8
- all of them are yours.
8
+ <helix-tag emphasis="subtle" tone="primary">Starter</helix-tag>
9
+ <helix-text as="h1" variant="display">Helix design system</helix-text>
10
+ <helix-text as="p" class="lede" variant="body">
11
+ Web components in your brand's colors, drawn from one set of tokens.
9
12
  </helix-text>
10
13
  <div class="actions">
11
14
  <a data-button="solid" data-button-tone="primary" href="#/overview">See the data view</a>
@@ -13,12 +16,13 @@
13
16
  </div>
14
17
  </div>
15
18
 
16
- <!-- The figures are the roster the data view draws, read from the same
17
- module, so the panel is the app at work. `helix-stat` sets the number
18
- on the display face at a size the type scale does not reach. -->
19
- <helix-card class="specimen" separation="outlined">
20
- <helix-text as="h2" slot="header" variant="title">The roster, in three figures</helix-text>
21
- <helix-stat-group divided>
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. -->
23
+ <helix-card class="specimen" material="glass" separation="outlined">
24
+ <helix-text as="h2" slot="header" variant="title">Roster</helix-text>
25
+ <helix-stat-group>
22
26
  <helix-stat>
23
27
  {{ roster.people }}
24
28
  <span slot="label">People</span>
@@ -32,81 +36,42 @@
32
36
  <span slot="label">Reviews</span>
33
37
  </helix-stat>
34
38
  </helix-stat-group>
35
- <a data-link href="#/overview" slot="footer">Open the data view</a>
36
39
  </helix-card>
37
40
  </header>
38
41
 
39
42
  <section class="section">
40
43
  <helix-text as="h2" variant="subheading">What you have</helix-text>
41
- <!-- Three paragraphs about one installed thing, so they take a rule each
42
- and no box. `app.css` says why at more length. -->
43
- <div class="facts">
44
- <article class="fact">
45
- <helix-text as="h3" variant="title">Elements, not wrappers</helix-text>
46
- <helix-text as="p" emphasis="muted" variant="body">
47
- They are custom elements, so you write the tags and there is no per-component import
48
- to keep in step. One line in <helix-code>src/main.ts</helix-code> registers all of
49
- them, and a subpath like <helix-code>&#64;fusion.dev/helix/tabs</helix-code> registers
50
- one.
51
- </helix-text>
52
- <a data-link [href]="docs.elements">Using the elements</a>
53
- </article>
54
-
55
- <article class="fact">
56
- <helix-text as="h3" variant="title">One set of tokens</helix-text>
57
- <helix-text as="p" emphasis="muted" variant="body">
58
- Every color is written once as a light and dark pair, so the control in the bar moves
59
- the whole page by setting a single attribute on the root. Type, spacing, radii and
60
- control sizes come from the same place.
61
- </helix-text>
62
- <a data-link [href]="docs.tokens">Tokens</a>
63
- </article>
64
-
65
- <article class="fact">
66
- <helix-text as="h3" variant="title">A short stylesheet</helix-text>
67
- <helix-text as="p" emphasis="muted" variant="body">
68
- <helix-code>src/app.css</helix-code> holds this page's measure, the rhythm between its
69
- blocks, and nothing a component already draws. Where a component leaves a decision
70
- open it names a part: the data view reaches one to paint the row you tick.
71
- </helix-text>
72
- <a data-link [href]="docs.parts">Overriding a component</a>
73
- </article>
74
- </div>
75
- </section>
76
-
77
- <section class="section">
78
- <helix-text as="h2" variant="subheading">Where to go next</helix-text>
79
- <!-- **The whole card is the link, which is what `data-card` is for.** The
80
- base layer draws the ring, moves the card's border to the brand on
81
- hover, and leaves focus alone. Nothing inside may be interactive,
82
- since a link inside a link is neither valid nor reachable. -->
83
- <helix-grid [columns]="2" gap="md">
84
- <a data-card href="#/overview">
44
+ <!-- **Each tile is a link, which is what `data-card` is for.** The base layer
45
+ draws the ring, moves the card's border to the brand on hover, and leaves
46
+ focus alone. Nothing inside may be interactive, since a link inside a link
47
+ is neither valid nor reachable. -->
48
+ <div class="features">
49
+ <a class="feature" data-card [href]="docs.elements">
85
50
  <helix-card separation="outlined">
86
- <helix-flex align-items="baseline" gap="sm" justify-content="between" slot="header">
87
- <helix-text as="h3" variant="title">The data view</helix-text>
88
- <helix-text emphasis="subtle" variant="code">/overview</helix-text>
89
- </helix-flex>
51
+ <span class="feature-mark"><helix-icon name="cube"></helix-icon></span>
52
+ <helix-text as="h3" variant="title">Custom elements</helix-text>
90
53
  <helix-text as="p" emphasis="muted" variant="body">
91
- Twelve people from a local module, sorted, paged and selected with nothing wired up.
92
- The columns are markup you can read and the rows are one property, which is what
93
- keeps the same component working at ten thousand.
54
+ One import in <helix-code>src/main.ts</helix-code> registers every tag.
94
55
  </helix-text>
95
56
  </helix-card>
96
57
  </a>
97
-
98
- <a data-card href="#/join">
58
+ <a class="feature" data-card [href]="docs.tokens">
99
59
  <helix-card separation="outlined">
100
- <helix-flex align-items="baseline" gap="sm" justify-content="between" slot="header">
101
- <helix-text as="h3" variant="title">The form</helix-text>
102
- <helix-text emphasis="subtle" variant="code">/join</helix-text>
103
- </helix-flex>
60
+ <span class="feature-mark"><helix-icon name="palette"></helix-icon></span>
61
+ <helix-text as="h3" variant="title">One set of tokens</helix-text>
104
62
  <helix-text as="p" emphasis="muted" variant="body">
105
- Five controls a <helix-code>&lt;form&gt;</helix-code> reads with
106
- <helix-code>FormData</helix-code>, because every one of them is a real form
107
- participant. The email field's complaint is the browser's own.
63
+ Every color, size, and space, in light and dark.
108
64
  </helix-text>
109
65
  </helix-card>
110
66
  </a>
111
- </helix-grid>
67
+ <a class="feature" data-card [href]="docs.parts">
68
+ <helix-card separation="outlined">
69
+ <span class="feature-mark"><helix-icon name="sliders-horizontal"></helix-icon></span>
70
+ <helix-text as="h3" variant="title">Parts to style</helix-text>
71
+ <helix-text as="p" emphasis="muted" variant="body">
72
+ Reach inside a component with <helix-code>::part()</helix-code>.
73
+ </helix-text>
74
+ </helix-card>
75
+ </a>
76
+ </div>
112
77
  </section>
@@ -8,8 +8,6 @@ import { DOCS } from './docs'
8
8
  * Delete it once you know your way around: nothing else imports it, and the
9
9
  * route it answers becomes yours.
10
10
  *
11
- * **The heading says what this is, and the project's name stays in the bar.**
12
- *
13
11
  * **The calls to action are anchors.** A button that navigates is a link
14
12
  * dressed as a button, and the two are different things to a keyboard and to
15
13
  * a screen reader. The base stylesheet styles an anchor that asks with
@@ -42,8 +42,8 @@
42
42
 
43
43
  <!-- A footnote to the table, so it takes the section's gap. -->
44
44
  <helix-text as="p" emphasis="muted" variant="caption">
45
- Filtering, column reordering, resizing, virtualized rows and a server mode that asks you
46
- for a page are all on
45
+ Filtering, column reordering, resizing, virtualized rows, and a server mode for large results
46
+ are on
47
47
  <a data-link [href]="docs.table">the component's own page</a>.
48
48
  </helix-text>
49
49
  </section>
@@ -10,7 +10,7 @@ import { Injectable, signal } from '@angular/core'
10
10
  the same document, and wherever you deploy has to be told to. A hash asks
11
11
  nothing of it. Each link in the app is a plain anchor to `#/` and a path. */
12
12
 
13
- /** Where the reader is, as a path, so the first page is `/`. */
13
+ /** The current path, read from the hash, so the first page is `/`. */
14
14
  const read = (): string => window.location.hash.slice(1) || '/'
15
15
 
16
16
  /** The current path, kept current as the hash changes. */
@@ -14,8 +14,8 @@
14
14
  <helix-input autocomplete="name" label="Name" name="name" required></helix-input>
15
15
 
16
16
  <!-- Validation is the platform's: `type` and `required` are set on the
17
- real input inside, and its own message shows once the reader has
18
- touched the field. Set `feedback` to say it in your own words. -->
17
+ real input inside, and its own message shows once the field has been
18
+ touched. Set `feedback` to say it in your own words. -->
19
19
  <helix-input
20
20
  hint="Where we send the welcome note."
21
21
  label="Email"
@@ -49,22 +49,21 @@
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">
56
- Nothing is posted anywhere. Submit it and the message shows exactly what a server would
57
- have been handed.
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
+ The form posts nothing. Submit it, and a message shows exactly what a server would receive.
58
57
  </helix-callout>
59
- <helix-text as="h2" variant="title">What this is showing</helix-text>
58
+ <helix-text as="h2" variant="title">What the form shows</helix-text>
60
59
  <helix-text as="p" emphasis="muted" variant="body">
61
- Every control is a form-associated custom element, so the submit reads them with
62
- <helix-code>new FormData(form)</helix-code> and nothing gathers the answers by hand.
63
- Reset the form and they all go back, the way an <helix-code>input</helix-code> does.
60
+ Every control is a form-associated custom element, so the submit reads them all with
61
+ <helix-code>new FormData(form)</helix-code>. Reset the form and they all go back,
62
+ the way an <helix-code>input</helix-code> does.
64
63
  </helix-text>
65
64
  <helix-text as="p" emphasis="muted" variant="body">
66
- Leave the email wrong and the complaint is the browser's own, in the reader's language.
67
- Handle is the controlled one: it refuses the change and writes back what it will accept.
65
+ Leave the email wrong and the browser shows its own message, in your language. Handle is the
66
+ controlled field: the page refuses each change and writes back a cleaned value.
68
67
  </helix-text>
69
68
  <a data-link [href]="docs.forms">Forms</a>
70
69
  </aside>
@@ -1,10 +1,7 @@
1
1
  <div class="footer-row">
2
- <helix-text as="p" emphasis="subtle" variant="caption">
3
- Every component in here, with its API, its parts and its examples, has a page.
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
@@ -31,8 +31,7 @@ const MARKS: Record<Mode, string> = { dark: 'moon', light: 'sun', system: 'monit
31
31
  export class SiteHeader {
32
32
  protected readonly path = inject(Pathname).current
33
33
  protected readonly marks = MARKS
34
- /* `system` is the resting state, so the control draws the same glyph before
35
- and after the reader first touches it. */
34
+ /* `system` is the resting state, the mode the page follows until the control is pressed. */
36
35
  protected readonly mode = signal<Mode>('system')
37
36
 
38
37
  /**
@@ -44,7 +43,7 @@ export class SiteHeader {
44
43
  * on a panel for a light preview inside a dark page.
45
44
  *
46
45
  * `system` removes the attribute. Writing out whichever mode is current would
47
- * freeze the page there the moment the reader's machine changed.
46
+ * hold the page there when the system's own setting changed.
48
47
  */
49
48
  protected cycle(): void {
50
49
  const next = MODES[(MODES.indexOf(this.mode()) + 1) % MODES.length] ?? 'system'