@telepath-computer/television 0.1.205 → 0.1.208

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 (46) hide show
  1. package/dist/THIRD-PARTY-NOTICES.txt +46 -12
  2. package/dist/canonical/v1/components.js +1 -258
  3. package/dist/canonical/v1/styles.css +372 -312
  4. package/dist/cli.cjs +11311 -10219
  5. package/dist/onboarding/README.md +19 -14
  6. package/dist/onboarding/business-ops/about.html +4 -8
  7. package/dist/onboarding/business-ops/retention-vs-releases.html +0 -9
  8. package/dist/onboarding/business-ops/revenue-vs-goals.html +0 -11
  9. package/dist/onboarding/onboarding-channels.json +114 -0
  10. package/dist/onboarding/productivity/about.html +4 -8
  11. package/dist/onboarding/productivity/company-todos/index.html +0 -3
  12. package/dist/onboarding/productivity/company-todos/task.css +3 -3
  13. package/dist/onboarding/productivity/company-todos/task.js +1 -4
  14. package/dist/onboarding/productivity/meeting-prep.html +0 -7
  15. package/dist/onboarding/productivity/priorities-today.html +0 -7
  16. package/dist/onboarding/productivity/todays-calendar/calendar.js +327 -643
  17. package/dist/onboarding/productivity/todays-calendar/index.html +0 -4
  18. package/dist/onboarding/research/about.html +5 -9
  19. package/dist/onboarding/research/open-model-research.html +0 -9
  20. package/dist/onboarding/research/todays-news.html +3 -10
  21. package/dist/onboarding/tv-guide/welcome/index.html +5 -5
  22. package/dist/skills/television/SKILL.md +180 -136
  23. package/dist/skills/tv-calendar/calendar.js +327 -643
  24. package/dist/skills/tv-tasks/SKILL.md +10 -9
  25. package/dist/skills/tv-tasks/task.css +5 -6
  26. package/dist/skills/tv-tasks/task.js +2 -5
  27. package/dist/skills/tv-theme/SKILL.md +293 -193
  28. package/dist/views/artifact-missing/index.html +125 -60
  29. package/dist/views/markdown/THIRD-PARTY-NOTICES.txt +7 -7
  30. package/dist/views/markdown/index.html +23 -46
  31. package/dist/web/THIRD-PARTY-NOTICES.txt +4 -4
  32. package/dist/web/assets/artifact-bridge-BXDhGuL-.js +1 -0
  33. package/dist/web/assets/{artifactMissing-DY3nzD0p.js → artifactMissing-9rcTXhkH.js} +1 -1
  34. package/dist/web/assets/main-Blg8fuaV.css +1 -0
  35. package/dist/web/assets/main-C15ixkrL.js +593 -0
  36. package/dist/web/assets/{urlUnsupported-B2K6eB7H.js → urlUnsupported-kgq7Zh2V.js} +1 -1
  37. package/dist/web/index.html +4 -3
  38. package/dist/web/views/artifact-missing/index.html +125 -60
  39. package/dist/web/views/url-unsupported/index.html +127 -74
  40. package/package.json +4 -1
  41. package/dist/onboarding/onboarding-screens.json +0 -167
  42. package/dist/skills/tv-calendar/THIRD-PARTY-NOTICES.txt +0 -36
  43. package/dist/web/assets/artifact-bridge-BhiFDvPj.js +0 -1
  44. package/dist/web/assets/main-5017mprd.css +0 -1
  45. package/dist/web/assets/main-C6W2LLUt.js +0 -865
  46. /package/dist/canonical/v1/fonts/{Hind-Variable.woff2 → Hind-Variable.933e9900.woff2} +0 -0
@@ -1,15 +1,3 @@
1
- /*
2
- * Canonical artifact stylesheet — the curated subset of the design system
3
- * artifacts inherit at /canonical/v1/styles.css.
4
- *
5
- * Includes the design-system primitives artifacts should inherit by default:
6
- * reset, fonts, tokens, theme defaults, and conservative document typography for plain
7
- * semantic HTML. Artifact-specific structure and rhythm should still be
8
- * authored explicitly in the artifact HTML so agents can see and control the
9
- * result, but basic prose should not fall back to browser defaults.
10
- *
11
- * Source of truth for what's in v1. Edits here change what artifacts inherit.
12
- */
13
1
  *,
14
2
  *::before,
15
3
  *::after {
@@ -22,6 +10,14 @@ body {
22
10
  padding: 0;
23
11
  }
24
12
 
13
+ /* The document's base typography, stated once at the root: surfaces inherit
14
+ rather than restate, and the form controls below inherit it in turn. */
15
+ body {
16
+ font-family: var(--font-sans);
17
+ font-size: var(--text-md);
18
+ color: var(--color-text);
19
+ }
20
+
25
21
  h1,
26
22
  h2,
27
23
  h3,
@@ -39,109 +35,41 @@ hr {
39
35
 
40
36
  button,
41
37
  input,
42
- textarea,
43
- select {
38
+ select,
39
+ textarea {
44
40
  font: inherit;
45
41
  color: inherit;
46
42
  }
47
43
 
44
+ /* Hind — the committed variable cut, weights 300–700. */
48
45
  @font-face {
49
46
  font-family: "Hind";
50
- src: url(/canonical/v1/fonts/Hind-Variable.woff2) format("woff2-variations");
47
+ src: url(/canonical/v1/fonts/Hind-Variable.933e9900.woff2) format("woff2-variations");
51
48
  font-weight: 300 700;
52
- font-style: normal;
53
- font-display: swap;
49
+ font-display: block;
54
50
  }
55
51
 
56
-
57
52
  :root {
58
- /* Fonts */
59
- --font-sans:
60
- "Hind", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial,
61
- sans-serif;
62
- --font-brand: var(--font-sans);
63
- --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace;
64
- --font-weight-body: 500;
65
-
66
- /* Type scale */
67
- --text-base: 13.5px;
68
- --text-scale: 1.125;
69
- --text-sm: round(calc(var(--text-base) / var(--text-scale)), 1px);
70
- --text-lg: round(calc(var(--text-base) * var(--text-scale)), 1px);
71
- --text-xl: round(calc(var(--text-lg) * var(--text-scale)), 1px);
72
- --leading-base: 1.5;
73
-
74
- /* Control height — single source of truth for buttons, segmented-controls,
75
- inputs and any future control whose shape includes "horizontal pill".
76
- Suffix names a size (md = default); add `--control-height-sm`,
77
- `--control-height-lg` if/when those sizes appear. Setting the height
78
- directly (vs. computing from padding + line-height) is what lets a
79
- mixed row of text + icon-only chrome line up exactly. */
80
- /* xs is for affordances that live *inside* another control (close on a
81
- tab, dismiss on a chip, clear-input). Smaller than the floor a row of
82
- siblings would line up with. */
83
- --control-height-xs: 18px;
84
- --control-height-sm: 24px;
85
- --control-height-md: 28px;
86
- --control-height-lg: 32px;
87
-
88
- /* Spacing */
89
- --space-2: 2px;
90
- --space-4: 4px;
91
- --space-6: 6px;
92
- --space-8: 8px;
93
- --space-10: 10px;
94
- --space-12: 12px;
95
- --space-16: 16px;
96
- --space-20: 20px;
97
- --space-24: 24px;
98
- --space-32: 32px;
99
- --space-48: 48px;
100
- --space-64: 64px;
101
-
102
- /* Radius — pixel-named tokens. Token name = the rounded-rect value
103
- (what you'd intuitively dial in). Squircle-supporting browsers bump
104
- each step ~25% to keep corner roundness perceptually equivalent
105
- (squircles look "tighter" than rounded rects at the same numeric
106
- radius). The `corner-shape: squircle` flip lives in elements.css —
107
- applied via `*` so any element with a radius gets squircled corners
108
- automatically. The `--radius-4` and `--radius-full` ends don't bump:
109
- too small to perceive a difference, too large for it to matter. */
110
- --radius-4: 4px;
111
- --radius-8: 8px;
112
- --radius-12: 12px;
113
- --radius-16: 16px;
114
- --radius-24: 24px;
115
- --radius-full: 9999px;
116
-
117
- /* Z-index ladder — semantic tiers for stacking. Components set
118
- `z-index: var(--layer-*)` directly when they need a specific tier
119
- (the `level` attribute in materials.css only controls shadow). */
120
- --layer-chrome: 100;
121
- --layer-panel: 500;
122
- --layer-overlay: 2000;
123
-
124
- /* Shadows */
125
- --shadow-hairline: 0 0 0 0.5px var(--color-border);
126
- /* Soft 2-layer drop shadow shared by buttons, dropdown triggers, and
127
- other controls that aren't surfaces. Surface elevation lives on
128
- [level=...] in materials.css. */
129
- --shadow-control:
130
- 0 1px 1px rgb(0 0 0 / 0.04),
131
- 0 2px 6px rgb(0 0 0 / 0.06);
53
+ /* Colors */
54
+ --black: #000000;
55
+ --white: #ffffff;
132
56
 
133
- /* Alpha scale — raw percentage values, no base color baked in.
134
- Callers mix at the use site:
135
- color-mix(in srgb, <base> var(--alpha-700), transparent)
136
- One scale serves every base (black, white, currentColor, a brand
137
- color, a fixed neutral). Steps follow the Tailwind 50/100/.../950
138
- grid. */
139
- --alpha-50: 4%;
57
+ /* Neutral */
58
+ --neutral-50: oklch(98.5% 0 none);
59
+ --neutral-100: oklch(97% 0 none);
60
+ --neutral-200: oklch(92.2% 0 none);
61
+ --neutral-300: oklch(87% 0 none);
62
+ --neutral-400: oklch(70.8% 0 none);
63
+ --neutral-500: oklch(55.6% 0 none);
64
+ --neutral-600: oklch(43.9% 0 none);
65
+ --neutral-700: oklch(37.1% 0 none);
66
+ --neutral-800: oklch(26.9% 0 none);
67
+ --neutral-900: oklch(20.5% 0 none);
68
+ --neutral-950: oklch(14.5% 0 none);
69
+
70
+ /* Alpha */
71
+ --alpha-50: 4%;
140
72
  --alpha-100: 8%;
141
- /* Half-step between 100 and 200 — for surfaces that need a touch
142
- more presence than tint-100 without the heft of tint-200 (e.g.
143
- a footer button attached to a tint-100 panel). */
144
- --alpha-150: 11%;
145
73
  --alpha-200: 15%;
146
74
  --alpha-300: 22%;
147
75
  --alpha-400: 30%;
@@ -152,62 +80,58 @@ select {
152
80
  --alpha-900: 90%;
153
81
  --alpha-950: 95%;
154
82
 
155
- /* Tint scale on the inherited text color — auto-flips with context.
156
- Useful when you want a faded version of whatever the surrounding
157
- foreground color is (label text, separator alphas, recessed
158
- button/input bgs on a known surface). */
159
- --tint-50: color-mix(in srgb, currentColor var(--alpha-50), transparent);
160
- --tint-100: color-mix(in srgb, currentColor var(--alpha-100), transparent);
161
- --tint-150: color-mix(in srgb, currentColor var(--alpha-150), transparent);
162
- --tint-200: color-mix(in srgb, currentColor var(--alpha-200), transparent);
163
- --tint-300: color-mix(in srgb, currentColor var(--alpha-300), transparent);
164
- --tint-400: color-mix(in srgb, currentColor var(--alpha-400), transparent);
165
- --tint-500: color-mix(in srgb, currentColor var(--alpha-500), transparent);
166
- --tint-600: color-mix(in srgb, currentColor var(--alpha-600), transparent);
167
- --tint-700: color-mix(in srgb, currentColor var(--alpha-700), transparent);
168
- --tint-800: color-mix(in srgb, currentColor var(--alpha-800), transparent);
169
- --tint-900: color-mix(in srgb, currentColor var(--alpha-900), transparent);
170
- --tint-950: color-mix(in srgb, currentColor var(--alpha-950), transparent);
171
-
172
- /* Semantic overlay tokens — chromeless overlay hover/active fills
173
- (ghost button, dropdown item, screen pill). Defaults to a black-base
174
- mix for light surfaces; `[tone="dark"]` in materials.css repoints
175
- these to white-base mixes at one step deeper (8% black ≈ 15% white
176
- in perceived intensity). */
177
- --color-overlay-hover: color-mix(in srgb, var(--black) var(--alpha-100), transparent);
178
- --color-overlay-active: color-mix(in srgb, var(--black) var(--alpha-300), transparent);
179
-
180
- /* Frosted-glass backdrop filter, shared across translucent surfaces. */
181
- --backdrop-blur-glass: blur(20px) saturate(1.4);
83
+ /* Blue */
84
+ --blue-50: oklch(0.97 0.014 254.604);
85
+ --blue-100: oklch(0.932 0.032 255.585);
86
+ --blue-200: oklch(0.882 0.059 254.128);
87
+ --blue-300: oklch(0.809 0.105 251.813);
88
+ --blue-400: oklch(0.707 0.165 254.624);
89
+ --blue-500: oklch(0.623 0.214 259.815);
90
+ --blue-600: oklch(0.546 0.245 262.881);
91
+ --blue-700: oklch(0.488 0.243 264.376);
92
+ --blue-800: oklch(0.424 0.199 265.638);
93
+ --blue-900: oklch(0.379 0.146 265.522);
182
94
 
183
- /* Palette */
184
- --black: #000000;
185
- --white: #ffffff;
95
+ /* Red — the destructive and error hue: a press that destroys, a rejected
96
+ token, a failure line. Tailwind's red, like the blue. */
97
+ --red-50: oklch(0.971 0.013 17.38);
98
+ --red-100: oklch(0.936 0.032 17.717);
99
+ --red-200: oklch(0.885 0.062 18.334);
100
+ --red-300: oklch(0.808 0.114 19.571);
101
+ --red-400: oklch(0.704 0.191 22.216);
102
+ --red-500: oklch(0.637 0.237 25.331);
103
+ --red-600: oklch(0.577 0.245 27.325);
104
+ --red-700: oklch(0.505 0.213 27.518);
105
+ --red-800: oklch(0.444 0.177 26.899);
106
+ --red-900: oklch(0.396 0.141 25.723);
107
+
108
+ /* Yellow — the attention color: worn by things that need noticing exactly
109
+ while they apply (the update bell), never for emphasis, which is the key
110
+ color's job. */
111
+ --yellow-50: oklch(0.987 0.026 102.212);
112
+ --yellow-100: oklch(0.973 0.071 103.193);
113
+ --yellow-200: oklch(0.945 0.129 101.54);
114
+ --yellow-300: oklch(0.905 0.182 98.111);
115
+ --yellow-400: oklch(0.852 0.199 91.936);
116
+ --yellow-500: oklch(0.795 0.184 86.047);
117
+ --yellow-600: oklch(0.681 0.162 75.834);
118
+ --yellow-700: oklch(0.554 0.135 66.442);
119
+ --yellow-800: oklch(0.476 0.114 61.907);
120
+ --yellow-900: oklch(0.421 0.095 57.708);
121
+ --yellow-950: oklch(0.286 0.066 53.813);
186
122
 
187
- --neutral-50: oklch(0.985 0 0);
188
- --neutral-100: oklch(0.97 0 0);
189
- --neutral-200: oklch(0.923 0 0);
190
- --neutral-300: oklch(0.869 0 0);
191
- --neutral-350: oklch(0.79 0 0);
192
- --neutral-400: oklch(0.709 0 0);
193
- --neutral-500: oklch(0.553 0 0);
194
- --neutral-600: oklch(0.444 0 0);
195
- --neutral-700: oklch(0.374 0 0);
196
- --neutral-800: oklch(0.268 0 0);
197
- --neutral-900: oklch(0.216 0 0);
198
- --neutral-950: oklch(0.147 0 0);
199
-
200
- --red-50: oklch(0.969 0.015 12.422);
201
- --red-100: oklch(0.941 0.03 12.58);
202
- --red-200: oklch(0.892 0.058 10.001);
203
- --red-300: oklch(0.81 0.117 11.638);
204
- --red-400: oklch(0.712 0.194 13.428);
205
- --red-500: oklch(0.645 0.246 16.439);
206
- --red-600: oklch(0.586 0.253 17.585);
207
- --red-700: oklch(0.514 0.222 16.935);
208
- --red-800: oklch(0.455 0.188 13.697);
209
- --red-900: oklch(0.41 0.159 10.272);
210
- --red-950: oklch(0.271 0.105 12.094);
123
+ /* Green, orange, purple — accent ramps. Tailwind's values, like the
124
+ blue. */
125
+ --green-50: oklch(0.982 0.018 155.826);
126
+ --green-100: oklch(0.962 0.044 156.743);
127
+ --green-200: oklch(0.925 0.084 155.995);
128
+ --green-300: oklch(0.871 0.15 154.449);
129
+ --green-400: oklch(0.792 0.209 151.711);
130
+ --green-500: oklch(0.723 0.219 149.579);
131
+ --green-600: oklch(0.627 0.194 149.214);
132
+ --green-700: oklch(0.527 0.154 150.069);
133
+ --green-800: oklch(0.448 0.119 151.328);
134
+ --green-900: oklch(0.393 0.095 152.535);
211
135
 
212
136
  --orange-50: oklch(0.98 0.016 73.684);
213
137
  --orange-100: oklch(0.954 0.038 75.164);
@@ -219,238 +143,374 @@ select {
219
143
  --orange-700: oklch(0.553 0.195 38.402);
220
144
  --orange-800: oklch(0.47 0.157 37.304);
221
145
  --orange-900: oklch(0.408 0.123 38.172);
222
- --orange-950: oklch(0.266 0.079 36.259);
223
-
224
- --yellow-50: oklch(0.987 0.026 102.212);
225
- --yellow-100: oklch(0.973 0.071 103.193);
226
- --yellow-200: oklch(0.945 0.129 101.54);
227
- --yellow-300: oklch(0.905 0.182 98.111);
228
- --yellow-400: oklch(0.852 0.199 91.936);
229
- --yellow-500: oklch(0.795 0.184 86.047);
230
- --yellow-600: oklch(0.681 0.162 75.834);
231
- --yellow-700: oklch(0.554 0.135 66.442);
232
- --yellow-800: oklch(0.476 0.114 61.907);
233
- --yellow-900: oklch(0.421 0.095 57.708);
234
- --yellow-950: oklch(0.286 0.066 53.813);
235
146
 
236
- --green-50: oklch(0.979 0.021 166.113);
237
- --green-100: oklch(0.95 0.052 163.051);
238
- --green-200: oklch(0.905 0.093 164.15);
239
- --green-300: oklch(0.845 0.143 164.978);
240
- --green-400: oklch(0.765 0.177 163.223);
241
- --green-500: oklch(0.696 0.17 162.48);
242
- --green-600: oklch(0.596 0.145 163.225);
243
- --green-700: oklch(0.508 0.118 165.612);
244
- --green-800: oklch(0.432 0.095 166.913);
245
- --green-900: oklch(0.378 0.077 168.94);
246
- --green-950: oklch(0.262 0.051 172.552);
147
+ --purple-50: oklch(0.977 0.014 308.299);
148
+ --purple-100: oklch(0.946 0.033 307.174);
149
+ --purple-200: oklch(0.902 0.063 306.703);
150
+ --purple-300: oklch(0.827 0.119 306.383);
151
+ --purple-400: oklch(0.714 0.203 305.504);
152
+ --purple-500: oklch(0.627 0.265 303.9);
153
+ --purple-600: oklch(0.558 0.288 302.321);
154
+ --purple-700: oklch(0.496 0.265 301.924);
155
+ --purple-800: oklch(0.438 0.218 303.724);
156
+ --purple-900: oklch(0.381 0.176 304.987);
157
+
158
+ /* Tint */
159
+ --tint-50: color-mix(in srgb, currentColor var(--alpha-50), transparent);
160
+ --tint-100: color-mix(in srgb, currentColor var(--alpha-100), transparent);
161
+ --tint-200: color-mix(in srgb, currentColor var(--alpha-200), transparent);
162
+ --tint-300: color-mix(in srgb, currentColor var(--alpha-300), transparent);
163
+ --tint-400: color-mix(in srgb, currentColor var(--alpha-400), transparent);
164
+ --tint-500: color-mix(in srgb, currentColor var(--alpha-500), transparent);
165
+ --tint-600: color-mix(in srgb, currentColor var(--alpha-600), transparent);
166
+ --tint-700: color-mix(in srgb, currentColor var(--alpha-700), transparent);
167
+ --tint-800: color-mix(in srgb, currentColor var(--alpha-800), transparent);
168
+ --tint-900: color-mix(in srgb, currentColor var(--alpha-900), transparent);
169
+ --tint-950: color-mix(in srgb, currentColor var(--alpha-950), transparent);
247
170
 
248
- --blue-50: oklch(0.97 0.014 254.604);
249
- --blue-100: oklch(0.932 0.032 255.585);
250
- --blue-200: oklch(0.882 0.059 254.128);
251
- --blue-300: oklch(0.809 0.105 251.813);
252
- --blue-400: oklch(0.707 0.165 254.624);
253
- --blue-500: oklch(0.623 0.214 259.815);
254
- --blue-600: oklch(0.546 0.245 262.881);
255
- --blue-700: oklch(0.488 0.243 264.376);
256
- --blue-800: oklch(0.424 0.199 265.638);
257
- --blue-900: oklch(0.379 0.146 265.522);
258
- --blue-950: oklch(0.282 0.091 267.935);
171
+ /* Color roles — what a color is for, resolved onto the ramps above. */
172
+ --color-text: var(--neutral-900);
173
+ --color-text-muted: var(--neutral-500);
174
+ /* The interface's key color — what carries emphasis and marks the thing
175
+ you are on. Selection reads as this rather than as a heavier grey, so
176
+ "hovered" and "selected" differ in hue, not just in weight. */
177
+ --color-primary: var(--blue-600);
178
+ /* A fill and the text that survives on it are a pair. Naming the foreground
179
+ keeps the contrast a stated decision rather than something each use site
180
+ guesses at — white on blue-500 measures 3.76:1 and fails AA at body size. */
181
+ --color-on-primary: var(--white);
182
+ --color-selected: var(--color-primary);
183
+ /* What the app's own content sits on, behind the surfaces it holds. Darker
184
+ than those surfaces rather than lighter, so a white one reads as lifted
185
+ off it — a gap of background is how the app shows where its own chrome
186
+ ends and something it is holding begins. */
187
+ --color-background: var(--neutral-200);
188
+ /* The ground of a document or artifact the app holds. Surface vocabulary
189
+ belongs to that held content; the chrome's own ground stays
190
+ --color-background. */
191
+ --color-surface: var(--white);
192
+ /* A quiet region within a held surface: distinct without reading as a
193
+ second layer of app chrome. */
194
+ --color-surface-muted: var(--neutral-100);
195
+ /* The ordinary seam between surface regions. Ten percent is deliberate:
196
+ the alpha ramp's neighbouring steps are too faint and too strong. */
197
+ --color-border: rgb(0 0 0 / 10%);
198
+ /* A repeated or subordinate seam should organize without boxing things in;
199
+ six percent stays below the ordinary border without disappearing. */
200
+ --color-border-muted: rgb(0 0 0 / 6%);
201
+ /* A link follows its surrounding text unless a theme gives it an accent. */
202
+ --color-link: inherit;
203
+ /* The destructive and error role. */
204
+ --color-danger: var(--red-600);
205
+ /* The affirmative and completed-state role. */
206
+ --color-success: var(--green-600);
207
+ /* The caution and warning role. */
208
+ --color-warning: var(--orange-600);
259
209
 
260
- --purple-50: oklch(0.969 0.016 293.756);
261
- --purple-100: oklch(0.943 0.029 294.588);
262
- --purple-200: oklch(0.894 0.057 293.283);
263
- --purple-300: oklch(0.811 0.111 293.571);
264
- --purple-400: oklch(0.702 0.183 293.541);
265
- --purple-500: oklch(0.606 0.25 292.717);
266
- --purple-600: oklch(0.541 0.281 293.009);
267
- --purple-700: oklch(0.491 0.27 292.581);
268
- --purple-800: oklch(0.432 0.232 292.759);
269
- --purple-900: oklch(0.38 0.189 293.745);
270
- --purple-950: oklch(0.283 0.141 291.089);
210
+ color-scheme: light;
271
211
  }
272
212
 
273
- /* Squircle compensation — bump radii ~25% so corners read at the same
274
- perceived roundness as the rounded-rect equivalents on browsers that
275
- don't yet support `corner-shape: squircle`. The universal corner-shape
276
- flip lives in elements.css. */
277
- @supports (corner-shape: squircle) {
278
- :root {
279
- --radius-8: 10px;
280
- --radius-12: 15px;
281
- --radius-16: 20px;
282
- --radius-24: 30px;
283
- }
213
+ :root {
214
+ /* Type */
215
+ /* The base the steps below compute from. */
216
+ --text-base: 14px;
217
+ --text-sm: round(calc(var(--text-md) / var(--text-scale)), 1px);
218
+ --text-md: var(--text-base);
219
+ --text-lg: round(calc(var(--text-md) * var(--text-scale)), 1px);
220
+ --text-xl: round(calc(var(--text-lg) * var(--text-scale)), 1px);
221
+ --text-2xl: round(calc(var(--text-xl) * var(--text-scale)), 1px);
222
+ --text-3xl: 24px;
223
+ --text-4xl: 30px;
224
+ --text-scale: 1.125;
225
+ --leading-base: 1.5;
226
+
227
+ /* Fonts */
228
+ --font-sans: "Hind", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
229
+ --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, monospace;
230
+ --font-weight-normal: 400;
231
+ --font-weight-medium: 500;
232
+ --font-weight-body: var(--font-weight-medium);
233
+ --font-weight-semibold: 600;
284
234
  }
285
235
 
286
- /* Font switcher — set data-font on <html> to swap --font-sans. */
236
+ :root {
237
+ /* Spacing */
238
+ --space-2: 2px;
239
+ --space-4: 4px;
240
+ --space-6: 6px;
241
+ --space-8: 8px;
242
+ --space-10: 10px;
243
+ --space-12: 12px;
244
+ --space-16: 16px;
245
+ --space-20: 20px;
246
+ --space-24: 24px;
247
+ --space-32: 32px;
248
+ --space-48: 48px;
249
+ --space-64: 64px;
287
250
 
288
- :root[data-font="system"] {
289
- --font-sans:
290
- -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
251
+ /* Radius */
252
+ --radius-4: 4px;
253
+ --radius-6: 6px;
254
+ --radius-8: 8px;
255
+ --radius-12: 12px;
256
+ --radius-16: 16px;
257
+ --radius-24: 24px;
258
+ --radius-full: 9999px; /* pill — fully rounded ends at any element size */
291
259
  }
292
260
 
261
+ :root {
262
+ /* The elevation a floating panel lifts off the page with: a broad soft
263
+ throw and a tight contact shadow. A role, not a ramp — there is one
264
+ elevation in the system; a scale grows if more appear. */
265
+ --shadow-panel:
266
+ 0 8px 24px rgba(0, 0, 0, 0.12),
267
+ 0 2px 8px rgba(0, 0, 0, 0.06);
268
+ }
293
269
 
294
-
270
+ /* Canonical v1 compatibility ([[arch/canonical.md#compatibility]]): retired
271
+ names only, preserved at shipped values or same-meaning successors. */
295
272
  :root {
296
273
  --color-bg: var(--neutral-50);
297
- --color-bg-muted: var(--neutral-100);
298
- --color-surface: var(--white);
299
- --color-surface-muted: var(--neutral-100);
274
+ --color-bg-muted: var(--color-surface-muted);
300
275
  --color-interactive: var(--neutral-200);
301
276
  --color-interactive-hover: var(--neutral-300);
302
-
303
- /* Borders use alpha so the same hairline reads on light, dark, or
304
- image bgs without needing a tone-aware swap. */
305
- --color-border: rgba(0, 0, 0, 0.10);
306
- --color-border-muted: rgba(0, 0, 0, 0.06);
307
-
308
- --color-text: var(--neutral-900);
309
- --color-text-muted: var(--neutral-500);
310
- --color-link: inherit;
311
- --color-focus-ring: var(--neutral-500);
277
+ --color-focus-ring: var(--color-primary);
312
278
  --color-overlay-backdrop: rgb(0 0 0 / 0.5);
279
+ --color-overlay-hover: color-mix(in srgb, var(--black) var(--alpha-100), transparent);
280
+ --color-overlay-active: color-mix(in srgb, var(--black) var(--alpha-300), transparent);
313
281
  --color-highlight: rgb(255 255 255 / 0.5);
314
- --color-primary: var(--blue-500);
315
- --color-danger: var(--red-600);
316
282
 
317
- color-scheme: light;
318
- }
283
+ --font-brand: var(--font-sans);
319
284
 
285
+ --shadow-hairline: 0 0 0 0.5px var(--color-border);
286
+ --shadow-control:
287
+ 0 1px 1px rgb(0 0 0 / 0.04),
288
+ 0 2px 6px rgb(0 0 0 / 0.06);
320
289
 
290
+ --control-height-xs: 18px;
291
+ --control-height-sm: 24px;
292
+ --control-height-md: 28px;
293
+ --control-height-lg: 32px;
321
294
 
295
+ --layer-chrome: 100;
296
+ --layer-panel: 500;
297
+ --layer-overlay: 2000;
298
+
299
+ --backdrop-blur-glass: blur(20px) saturate(1.4);
300
+
301
+ --neutral-350: oklch(0.79 0 0);
302
+ --alpha-150: 11%;
303
+ --tint-150: color-mix(in srgb, currentColor var(--alpha-150), transparent);
304
+ --blue-950: oklch(0.282 0.091 267.935);
305
+ --orange-950: oklch(0.266 0.079 36.259);
306
+ --red-950: oklch(0.271 0.105 12.094);
307
+ --green-950: oklch(0.262 0.051 172.552);
308
+ --purple-950: oklch(0.283 0.141 291.089);
309
+ }
310
+
311
+ /* The prose treatment ([[ui/foundation/index.md]], Prose): document
312
+ typography for plain semantic HTML, written for a document that is the
313
+ sheet's own — an artifact's page. Selectors are bare elements at the
314
+ reset's own specificity, loading after it; a document's own styling,
315
+ arriving later still, outranks both. */
316
+
317
+ /* The document's base, set at the root so the scale's steps follow. */
318
+ :root {
319
+ --text-base: 14.5px;
320
+ }
322
321
 
323
322
  body {
324
- font-family: var(--font-sans);
325
- font-size: calc(var(--text-base) + 0.5px);
323
+ margin: 0;
324
+ font-size: var(--text-md);
326
325
  font-weight: var(--font-weight-body);
327
326
  line-height: var(--leading-base);
328
- letter-spacing: 0.015em;
329
- color: var(--color-text);
330
- /* The artifact page is the card surface — Television's artifact-view frames
331
- the whole document as a card, so the default page background is the
332
- surface color. A muted backdrop (--color-bg) is something an artifact
333
- opts into, not the default. */
327
+ /* The reset supplies the paired text colour. */
334
328
  background: var(--color-surface);
335
329
  -webkit-font-smoothing: antialiased;
336
- -moz-osx-font-smoothing: grayscale;
337
- }
338
-
339
- a {
340
- color: var(--color-link);
341
- text-underline-offset: 0.15em;
342
- text-decoration-thickness: 0.08em;
343
330
  }
344
331
 
345
- h1,
346
- h2,
347
- h3,
348
- h4,
349
- h5,
350
- h6 {
351
- font-weight: 600;
332
+ /* The heading scale. */
333
+ h1 {
334
+ font-size: var(--text-3xl);
335
+ font-weight: var(--font-weight-semibold);
352
336
  line-height: 1.25;
353
- color: inherit;
337
+ margin: 0 0 var(--space-12);
354
338
  }
355
339
 
356
- h1 {
357
- font-size: 1.3em;
340
+ h2 {
341
+ font-size: var(--text-xl);
342
+ font-weight: var(--font-weight-semibold);
343
+ line-height: 1.3;
344
+ margin: var(--space-24) 0 var(--space-8);
358
345
  }
359
346
 
360
- h2 {
361
- font-size: 1.1em;
347
+ h3, h4, h5, h6 {
348
+ font-size: var(--text-lg);
349
+ font-weight: var(--font-weight-semibold);
350
+ margin: var(--space-16) 0 var(--space-4);
362
351
  }
363
352
 
364
- h3,
365
- h4,
366
- h5,
367
- h6 {
368
- font-size: 1em;
353
+ /* Block rhythm. */
354
+ p, ul, ol, blockquote, pre, hr, table, figure {
355
+ margin: 0 0 var(--space-12);
369
356
  }
370
357
 
371
- p,
372
- ul,
373
- ol,
374
- blockquote,
375
- pre,
376
- hr,
377
- table {
378
- margin: var(--space-12) 0;
358
+ body > :last-child {
359
+ margin-bottom: 0;
379
360
  }
380
361
 
381
- :is(h1, h2, h3, h4, h5, h6) + :is(p, ul, ol, blockquote, pre, hr, table) {
382
- margin-top: var(--space-8);
362
+ a {
363
+ color: var(--color-link);
364
+ text-decoration: underline;
365
+ text-underline-offset: 2px;
383
366
  }
384
367
 
385
- /* Page-header idiom: a <header> holds a heading and optionally one <p>
386
- subtitle — a date line, a description. A paragraph inside any header is a
387
- subtitle: slightly smaller than body prose, at body weight, hugging its
388
- heading — proximity and the heading above do the differentiating. */
389
- header p {
390
- font-size: var(--text-base);
391
- font-weight: var(--font-weight-body);
368
+ ul, ol {
369
+ padding-left: var(--space-24);
392
370
  }
393
- header :is(h1, h2, h3, h4, h5, h6) + p {
394
- margin-top: var(--space-2);
371
+
372
+ li + li {
373
+ margin-top: var(--space-4);
395
374
  }
396
375
 
397
- ul,
398
- ol {
399
- padding-left: var(--space-24);
376
+ blockquote {
377
+ border-left: 2px solid var(--color-border);
378
+ padding-left: var(--space-12);
379
+ color: var(--color-text-muted);
400
380
  }
401
381
 
402
- code {
382
+ code, kbd, samp {
403
383
  font-family: var(--font-mono);
404
- font-size: 0.9em;
405
- background: var(--color-bg-muted);
406
- padding: var(--space-2) var(--space-4);
384
+ font-size: var(--text-sm);
385
+ background: var(--color-surface-muted);
407
386
  border-radius: var(--radius-4);
387
+ padding: 1px var(--space-4);
408
388
  }
409
389
 
410
390
  pre {
411
391
  font-family: var(--font-mono);
412
392
  font-size: var(--text-sm);
413
- background: var(--color-bg-muted);
414
- padding: var(--space-12);
393
+ background: var(--color-surface-muted);
415
394
  border: 1px solid var(--color-border-muted);
416
- border-radius: var(--radius-8);
395
+ border-radius: var(--radius-6);
396
+ padding: var(--space-12);
417
397
  overflow-x: auto;
418
398
  }
419
399
 
400
+ /* A block's code cell. */
420
401
  pre code {
421
402
  background: none;
403
+ border-radius: 0;
422
404
  padding: 0;
423
405
  }
424
406
 
425
- blockquote {
426
- padding-left: var(--space-16);
427
- border-left: 3px solid var(--color-border);
428
- color: var(--color-text-muted);
429
- }
430
-
431
407
  hr {
432
- border: none;
408
+ border: 0;
433
409
  border-top: 1px solid var(--color-border);
434
410
  }
435
411
 
436
412
  table {
437
- width: 100%;
438
413
  border-collapse: collapse;
414
+ width: 100%;
439
415
  }
440
416
 
441
- th,
442
- td {
443
- padding: var(--space-8) var(--space-12);
444
- border: 1px solid var(--color-border);
417
+ th {
445
418
  text-align: left;
419
+ font-weight: var(--font-weight-semibold);
420
+ background: var(--color-surface-muted);
446
421
  }
447
422
 
448
- th {
449
- background: var(--color-bg-muted);
450
- font-weight: 600;
423
+ th, td {
424
+ padding: var(--space-4) var(--space-12) var(--space-4) 0;
425
+ border-bottom: 1px solid var(--color-border);
451
426
  }
452
427
 
453
428
  img {
454
429
  max-width: 100%;
455
430
  height: auto;
456
431
  }
432
+
433
+ /* The header idiom. */
434
+ header p {
435
+ color: var(--color-text-muted);
436
+ }
437
+
438
+ /* The heading's own bottom margin would collapse with the subtitle's; the
439
+ pair states its gap once. */
440
+ header :is(h1, h2, h3, h4, h5, h6):has(+ p) {
441
+ margin-bottom: 0;
442
+ }
443
+
444
+ header :is(h1, h2, h3, h4, h5, h6) + p {
445
+ margin-top: var(--space-4);
446
+ }
447
+
448
+ tv-icon:not(:defined) {
449
+ display: inline-flex;
450
+ flex: none;
451
+ width: 1em;
452
+ height: 1em;
453
+ vertical-align: -0.125em;
454
+ }
455
+
456
+ tv-icon:not(:defined)[size="sm"] { font-size: 16px; }
457
+
458
+ tv-icon:not(:defined)[size="md"] { font-size: 20px; }
459
+
460
+ tv-icon:not(:defined)[size="lg"] { font-size: 24px; }
461
+
462
+ tv-icon:not(:defined)[size="xl"] { font-size: 32px; }
463
+
464
+ /* The checklist's looks ([[ui/elements/checkbox-list/index.md]]): the list's
465
+ stack, the row's marker-and-content grid, and the done treatment.
466
+ `--checkbox-color` is the styling API ([[arch/ui/elements.md]]). */
467
+ checkbox-list {
468
+ display: grid;
469
+ gap: var(--space-6);
470
+ margin: var(--space-12) 0;
471
+ }
472
+
473
+ checkbox-item {
474
+ position: relative;
475
+ display: grid;
476
+ grid-template-columns: 1em minmax(0, 1fr);
477
+ gap: var(--space-8);
478
+ align-items: baseline;
479
+ }
480
+
481
+ /* The marker box, seated on the first line's text. */
482
+ checkbox-item::before {
483
+ content: "";
484
+ width: 1em;
485
+ height: 1em;
486
+ align-self: start;
487
+ translate: 0 0.12em;
488
+ background: transparent;
489
+ border: 1px solid var(--tint-300);
490
+ border-radius: var(--radius-4);
491
+ box-sizing: border-box;
492
+ cursor: not-allowed;
493
+ }
494
+
495
+ checkbox-item[checked]::before {
496
+ background: var(--checkbox-color, var(--color-primary));
497
+ border-color: var(--checkbox-color, var(--color-primary));
498
+ }
499
+
500
+ /* The check, drawn as a mask over the marker's cell. */
501
+ checkbox-item[checked]::after {
502
+ content: "";
503
+ position: absolute;
504
+ left: 0;
505
+ top: 0.12em;
506
+ width: 1em;
507
+ height: 1em;
508
+ background: var(--color-surface);
509
+ mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12"><path d="M10.2 3.1 5.1 8.2 2.4 5.5" fill="none" stroke="black" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>') center / 80% no-repeat;
510
+ }
511
+
512
+ checkbox-item[checked] {
513
+ color: var(--color-text-muted);
514
+ text-decoration: line-through;
515
+ text-decoration-thickness: 0.08em;
516
+ }