@aitrien/motifspec 1.13.0 → 1.13.3

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 (83) hide show
  1. package/CHANGELOG.md +275 -257
  2. package/LICENSE +21 -21
  3. package/README.md +128 -150
  4. package/dist/backdrop.html +1 -1
  5. package/dist/chroma.css +36 -36
  6. package/dist/codex.css +1145 -1145
  7. package/dist/codex.js +126 -126
  8. package/dist/contrast.md +101 -101
  9. package/dist/fonts.css +3 -3
  10. package/dist/icons.svg +18 -18
  11. package/dist/plate.html +1 -1
  12. package/dist/plate.js +292 -292
  13. package/dist/theme-init.js +1 -1
  14. package/dist/tokens.css +466 -466
  15. package/dist/tokens.js +3330 -3330
  16. package/dist/tokens.json +3330 -3330
  17. package/docs/components/_template.md +37 -37
  18. package/docs/components/accession-label.md +106 -106
  19. package/docs/components/backdrop.md +83 -83
  20. package/docs/components/button-and-link.md +87 -87
  21. package/docs/components/callout.md +75 -75
  22. package/docs/components/code-block.md +109 -109
  23. package/docs/components/data-table.md +73 -73
  24. package/docs/components/figure.md +68 -68
  25. package/docs/components/heading-anchor.md +76 -76
  26. package/docs/components/icon.md +63 -63
  27. package/docs/components/ornament.md +77 -77
  28. package/docs/components/pagination.md +78 -78
  29. package/docs/components/post-list-item.md +91 -91
  30. package/docs/components/project-card.md +82 -82
  31. package/docs/components/prose.md +122 -122
  32. package/docs/components/site-footer.md +99 -99
  33. package/docs/components/site-header.md +133 -133
  34. package/docs/components/specimen-plate.md +92 -92
  35. package/docs/components/table-of-contents.md +83 -83
  36. package/docs/components/tag.md +70 -70
  37. package/docs/components/tooltip.md +67 -67
  38. package/docs/hugo.md +132 -120
  39. package/docs/syntax-highlighting.md +55 -55
  40. package/docs/templates.md +21 -30
  41. package/fonts/OFL-jetbrains-mono.txt +93 -93
  42. package/fonts/OFL-national-park.txt +93 -93
  43. package/fonts/OFL-yarndings-12.txt +93 -93
  44. package/icons/LICENSE +202 -202
  45. package/icons/manifest.json +75 -75
  46. package/layouts/_markup/render-blockquote.html +30 -30
  47. package/layouts/_markup/render-codeblock.html +18 -18
  48. package/layouts/_markup/render-heading.html +2 -2
  49. package/layouts/_markup/render-image.html +14 -14
  50. package/layouts/_markup/render-link.html +14 -14
  51. package/layouts/_markup/render-table.html +31 -31
  52. package/layouts/_partials/motifspec/accession/id.html +2 -2
  53. package/layouts/_partials/motifspec/accession/label.html +18 -18
  54. package/layouts/_partials/motifspec/accession/status.html +2 -2
  55. package/layouts/_partials/motifspec/article.html +24 -24
  56. package/layouts/_partials/motifspec/back-link.html +2 -2
  57. package/layouts/_partials/motifspec/body-end.html +5 -5
  58. package/layouts/_partials/motifspec/body-start.html +5 -5
  59. package/layouts/_partials/motifspec/figure.html +14 -14
  60. package/layouts/_partials/motifspec/filed-under.html +5 -5
  61. package/layouts/_partials/motifspec/h2s.html +7 -7
  62. package/layouts/_partials/motifspec/head.html +15 -15
  63. package/layouts/_partials/motifspec/pagination-entries.html +34 -34
  64. package/layouts/_partials/motifspec/pagination-pages.html +30 -30
  65. package/layouts/_partials/motifspec/post-list-item.html +15 -15
  66. package/layouts/_partials/motifspec/project-card.html +23 -23
  67. package/layouts/_partials/motifspec/section-heading.html +3 -3
  68. package/layouts/_partials/motifspec/site-header.html +27 -27
  69. package/layouts/_partials/motifspec/table-of-contents.html +21 -21
  70. package/layouts/_partials/motifspec/tag-filter.html +22 -22
  71. package/layouts/_partials/motifspec/tags.html +8 -8
  72. package/layouts/_partials/motifspec/tokens.html +9 -9
  73. package/package.json +68 -68
  74. package/scripts/check.mjs +153 -153
  75. package/scripts/lib.mjs +176 -176
  76. package/tokens/README.md +3 -3
  77. package/tokens/border.json +63 -63
  78. package/tokens/color.json +1902 -1902
  79. package/tokens/motion.json +207 -207
  80. package/tokens/radius.json +53 -53
  81. package/tokens/size.json +378 -378
  82. package/tokens/space.json +289 -289
  83. package/tokens/typography.json +859 -859
package/dist/codex.css CHANGED
@@ -1,1145 +1,1145 @@
1
- @font-face { font-family: "National Park"; src: url("../fonts/national-park-latin-wght.woff2") format("woff2"); font-weight: 200 800; font-style: normal; font-display: swap; }
2
- @font-face { font-family: "JetBrains Mono"; src: url("../fonts/jetbrains-mono-latin-wght.woff2") format("woff2"); font-weight: 100 800; font-style: normal; font-display: swap; }
3
- @font-face { font-family: "Yarndings 12"; src: url("../fonts/yarndings-12-latin.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: block; }
4
-
5
- /* MotifSpec 1.13.0 — generated from tokens/*.json. Do not edit.
6
- Themes: semantic colours use light-dark(); color-scheme follows the system unless
7
- <html data-theme="light|dark"> pins it. --cx-primitive-* are for this file only. */
8
- :root {
9
- color-scheme: light dark;
10
- /* primitive.border.width */
11
- --cx-primitive-border-width-1: 1px;
12
- --cx-primitive-border-width-2: 2px;
13
- --cx-primitive-border-width-3: 3px;
14
-
15
- /* border.width */
16
- --cx-border-width-hairline: var(--cx-primitive-border-width-1);
17
- --cx-border-width-emphasis: var(--cx-primitive-border-width-2);
18
- --cx-border-width-contour: var(--cx-primitive-border-width-3);
19
-
20
- /* border.focus */
21
- --cx-border-focus-width: var(--cx-primitive-border-width-2);
22
- --cx-border-focus-offset: var(--cx-primitive-border-width-2);
23
-
24
- /* primitive.color.ash */
25
- --cx-primitive-color-ash-0: #fbfefd;
26
- --cx-primitive-color-ash-50: #f4f8f6;
27
- --cx-primitive-color-ash-100: #eaf1ee;
28
- --cx-primitive-color-ash-200: #dae4df;
29
- --cx-primitive-color-ash-300: #c4cdc8;
30
- --cx-primitive-color-ash-400: #a4ada9;
31
- --cx-primitive-color-ash-500: #838c87;
32
- --cx-primitive-color-ash-600: #69716d;
33
- --cx-primitive-color-ash-700: #515955;
34
- --cx-primitive-color-ash-800: #323a36;
35
- --cx-primitive-color-ash-850: #2d3330;
36
- --cx-primitive-color-ash-900: #252a28;
37
- --cx-primitive-color-ash-950: #171a19;
38
- --cx-primitive-color-ash-1000: #0e100f;
39
-
40
- /* primitive.color.sap */
41
- --cx-primitive-color-sap-50: #e9fdee;
42
- --cx-primitive-color-sap-100: #d8f9df;
43
- --cx-primitive-color-sap-200: #bbf1c8;
44
- --cx-primitive-color-sap-300: #a7d9b3;
45
- --cx-primitive-color-sap-400: #7dbc8e;
46
- --cx-primitive-color-sap-500: #4d9d66;
47
- --cx-primitive-color-sap-600: #208347;
48
- --cx-primitive-color-sap-700: #126836;
49
- --cx-primitive-color-sap-800: #01441f;
50
- --cx-primitive-color-sap-900: #003315;
51
- --cx-primitive-color-sap-950: #00200b;
52
-
53
- /* primitive.color.woad */
54
- --cx-primitive-color-woad-50: #f2f7fe;
55
- --cx-primitive-color-woad-100: #e5f0fe;
56
- --cx-primitive-color-woad-200: #cde4fe;
57
- --cx-primitive-color-woad-300: #abcef6;
58
- --cx-primitive-color-woad-400: #83afe0;
59
- --cx-primitive-color-woad-500: #578dc7;
60
- --cx-primitive-color-woad-600: #3571b1;
61
- --cx-primitive-color-woad-700: #26598e;
62
- --cx-primitive-color-woad-800: #123961;
63
- --cx-primitive-color-woad-900: #092a4b;
64
- --cx-primitive-color-woad-950: #021a34;
65
-
66
- /* primitive.color.weld */
67
- --cx-primitive-color-weld-50: #fff6e1;
68
- --cx-primitive-color-weld-100: #feeec7;
69
- --cx-primitive-color-weld-200: #f9dfa1;
70
- --cx-primitive-color-weld-300: #e0c88f;
71
- --cx-primitive-color-weld-400: #c5a75d;
72
- --cx-primitive-color-weld-500: #a88416;
73
- --cx-primitive-color-weld-600: #896a02;
74
- --cx-primitive-color-weld-700: #6c5302;
75
- --cx-primitive-color-weld-800: #473502;
76
- --cx-primitive-color-weld-900: #352700;
77
- --cx-primitive-color-weld-950: #221800;
78
-
79
- /* primitive.color.madder */
80
- --cx-primitive-color-madder-50: #fef4f3;
81
- --cx-primitive-color-madder-100: #feeae7;
82
- --cx-primitive-color-madder-200: #ffd6d1;
83
- --cx-primitive-color-madder-300: #feb5ac;
84
- --cx-primitive-color-madder-400: #ea8e83;
85
- --cx-primitive-color-madder-500: #d16359;
86
- --cx-primitive-color-madder-600: #b94039;
87
- --cx-primitive-color-madder-700: #942f29;
88
- --cx-primitive-color-madder-800: #651916;
89
- --cx-primitive-color-madder-900: #4e0d0c;
90
- --cx-primitive-color-madder-950: #360404;
91
-
92
- /* primitive.color.amount */
93
- --cx-primitive-color-amount-1: 10%;
94
- --cx-primitive-color-amount-2: 14%;
95
- --cx-primitive-color-amount-3: 40%;
96
- --cx-primitive-color-amount-4: 140%;
97
-
98
- /* color.surface */
99
- --cx-color-surface-base: light-dark(var(--cx-primitive-color-ash-50), var(--cx-primitive-color-ash-900));
100
- --cx-color-surface-raised: light-dark(var(--cx-primitive-color-ash-0), var(--cx-primitive-color-ash-850));
101
- --cx-color-surface-sunken: light-dark(var(--cx-primitive-color-ash-100), var(--cx-primitive-color-ash-950));
102
- --cx-color-surface-hover: light-dark(var(--cx-primitive-color-ash-100), var(--cx-primitive-color-ash-800));
103
- --cx-color-surface-inverse: light-dark(var(--cx-primitive-color-ash-900), var(--cx-primitive-color-ash-100));
104
- --cx-color-surface-highlight: light-dark(var(--cx-primitive-color-sap-100), var(--cx-primitive-color-sap-800));
105
-
106
- /* color.text */
107
- --cx-color-text-primary: light-dark(var(--cx-primitive-color-ash-950), var(--cx-primitive-color-ash-100));
108
- --cx-color-text-secondary: light-dark(var(--cx-primitive-color-ash-800), var(--cx-primitive-color-ash-300));
109
- --cx-color-text-muted: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
110
- --cx-color-text-accent: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
111
- --cx-color-text-inverse: light-dark(var(--cx-primitive-color-ash-50), var(--cx-primitive-color-ash-900));
112
- --cx-color-text-on-accent: light-dark(var(--cx-primitive-color-ash-0), var(--cx-primitive-color-ash-1000));
113
-
114
- /* color.link */
115
- --cx-color-link-rest: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-300));
116
- --cx-color-link-hover: light-dark(var(--cx-primitive-color-sap-900), var(--cx-primitive-color-sap-200));
117
-
118
- /* color.border */
119
- --cx-color-border-subtle: light-dark(var(--cx-primitive-color-ash-200), var(--cx-primitive-color-ash-800));
120
- --cx-color-border-default: light-dark(var(--cx-primitive-color-ash-300), var(--cx-primitive-color-ash-700));
121
- --cx-color-border-strong: light-dark(var(--cx-primitive-color-ash-500), var(--cx-primitive-color-ash-500));
122
-
123
- /* color.accent */
124
- --cx-color-accent-fill-rest: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
125
- --cx-color-accent-fill-hover: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
126
- --cx-color-accent-border: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
127
-
128
- /* color.focus */
129
- --cx-color-focus-ring: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
130
-
131
- /* color.ornament */
132
- --cx-color-ornament-rest: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
133
- --cx-color-ornament-strong: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
134
- --cx-color-ornament-muted: light-dark(var(--cx-primitive-color-ash-400), var(--cx-primitive-color-ash-700));
135
-
136
- /* color.status */
137
- --cx-color-status-success-text: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
138
- --cx-color-status-success-surface: light-dark(var(--cx-primitive-color-sap-50), var(--cx-primitive-color-sap-950));
139
- --cx-color-status-success-border: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
140
- --cx-color-status-warning-text: light-dark(var(--cx-primitive-color-weld-700), var(--cx-primitive-color-weld-300));
141
- --cx-color-status-warning-surface: light-dark(var(--cx-primitive-color-weld-50), var(--cx-primitive-color-weld-950));
142
- --cx-color-status-warning-border: light-dark(var(--cx-primitive-color-weld-600), var(--cx-primitive-color-weld-400));
143
- --cx-color-status-danger-text: light-dark(var(--cx-primitive-color-madder-700), var(--cx-primitive-color-madder-300));
144
- --cx-color-status-danger-surface: light-dark(var(--cx-primitive-color-madder-50), var(--cx-primitive-color-madder-950));
145
- --cx-color-status-danger-border: light-dark(var(--cx-primitive-color-madder-600), var(--cx-primitive-color-madder-400));
146
- --cx-color-status-info-text: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
147
- --cx-color-status-info-surface: light-dark(var(--cx-primitive-color-woad-50), var(--cx-primitive-color-woad-950));
148
- --cx-color-status-info-border: light-dark(var(--cx-primitive-color-woad-600), var(--cx-primitive-color-woad-400));
149
-
150
- /* color.syntax */
151
- --cx-color-syntax-comment: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
152
- --cx-color-syntax-keyword: light-dark(var(--cx-primitive-color-madder-700), var(--cx-primitive-color-madder-300));
153
- --cx-color-syntax-string: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
154
- --cx-color-syntax-number: light-dark(var(--cx-primitive-color-weld-700), var(--cx-primitive-color-weld-300));
155
- --cx-color-syntax-function: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
156
- --cx-color-syntax-type: light-dark(var(--cx-primitive-color-woad-800), var(--cx-primitive-color-woad-200));
157
- --cx-color-syntax-tag: light-dark(var(--cx-primitive-color-madder-800), var(--cx-primitive-color-madder-200));
158
- --cx-color-syntax-attribute: light-dark(var(--cx-primitive-color-weld-800), var(--cx-primitive-color-weld-200));
159
- --cx-color-syntax-variable: light-dark(var(--cx-primitive-color-ash-950), var(--cx-primitive-color-ash-100));
160
- --cx-color-syntax-operator: light-dark(var(--cx-primitive-color-ash-800), var(--cx-primitive-color-ash-300));
161
- --cx-color-syntax-meta: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
162
- --cx-color-syntax-inserted: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
163
- --cx-color-syntax-deleted: light-dark(var(--cx-primitive-color-madder-800), var(--cx-primitive-color-madder-200));
164
- --cx-color-syntax-heading: light-dark(var(--cx-primitive-color-woad-800), var(--cx-primitive-color-woad-200));
165
- --cx-color-syntax-line-number: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
166
- --cx-color-syntax-line-highlight: light-dark(var(--cx-primitive-color-ash-200), var(--cx-primitive-color-ash-900));
167
-
168
- /* color.data */
169
- --cx-color-data-1: light-dark(var(--cx-primitive-color-woad-600), var(--cx-primitive-color-woad-400));
170
- --cx-color-data-2: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
171
- --cx-color-data-3: light-dark(var(--cx-primitive-color-madder-600), var(--cx-primitive-color-madder-400));
172
- --cx-color-data-4: light-dark(var(--cx-primitive-color-weld-600), var(--cx-primitive-color-weld-400));
173
- --cx-color-data-5: light-dark(var(--cx-primitive-color-ash-600), var(--cx-primitive-color-ash-400));
174
-
175
- /* color.backdrop */
176
- --cx-color-backdrop-tint: var(--cx-primitive-color-amount-3);
177
- --cx-color-backdrop-grain: var(--cx-primitive-color-amount-2);
178
- --cx-color-backdrop-saturation: var(--cx-primitive-color-amount-4);
179
-
180
- /* color.wash */
181
- --cx-color-wash-hover: var(--cx-primitive-color-amount-1);
182
-
183
- /* primitive.motion.duration */
184
- --cx-primitive-motion-duration-0: 0ms;
185
- --cx-primitive-motion-duration-1: 120ms;
186
- --cx-primitive-motion-duration-2: 200ms;
187
- --cx-primitive-motion-duration-3: 320ms;
188
- --cx-primitive-motion-duration-4: 1600ms;
189
- --cx-primitive-motion-duration-5: 3200ms;
190
- --cx-primitive-motion-duration-6: 60000ms;
191
-
192
- /* primitive.motion.easing */
193
- --cx-primitive-motion-easing-out-strong: cubic-bezier(0.2, 0, 0, 1);
194
- --cx-primitive-motion-easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
195
- --cx-primitive-motion-easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
196
- --cx-primitive-motion-easing-linear: cubic-bezier(0, 0, 1, 1);
197
- --cx-primitive-motion-easing-in-out: cubic-bezier(0.45, 0, 0.55, 1);
198
-
199
- /* primitive.motion.distance */
200
- --cx-primitive-motion-distance-1: 0.125rem;
201
-
202
- /* motion.duration */
203
- --cx-motion-duration-instant: var(--cx-primitive-motion-duration-0);
204
- --cx-motion-duration-fast: var(--cx-primitive-motion-duration-1);
205
- --cx-motion-duration-base: var(--cx-primitive-motion-duration-2);
206
- --cx-motion-duration-slow: var(--cx-primitive-motion-duration-3);
207
- --cx-motion-duration-plate: var(--cx-primitive-motion-duration-4);
208
- --cx-motion-duration-drift: var(--cx-primitive-motion-duration-6);
209
- --cx-motion-duration-pulse: var(--cx-primitive-motion-duration-5); /* Deprecated: Unused since the contour plate; removed in 2.0.0. */
210
-
211
- /* motion.easing */
212
- --cx-motion-easing-standard: var(--cx-primitive-motion-easing-out-strong);
213
- --cx-motion-easing-enter: var(--cx-primitive-motion-easing-decelerate);
214
- --cx-motion-easing-exit: var(--cx-primitive-motion-easing-accelerate);
215
- --cx-motion-easing-linear: var(--cx-primitive-motion-easing-linear);
216
- --cx-motion-easing-pulse: var(--cx-primitive-motion-easing-in-out); /* Deprecated: Unused since the contour plate; removed in 2.0.0. */
217
-
218
- /* motion.distance */
219
- --cx-motion-distance-nudge: var(--cx-primitive-motion-distance-1);
220
-
221
- /* primitive.radius.0 */
222
- --cx-primitive-radius-0: 0;
223
-
224
- /* primitive.radius.1 */
225
- --cx-primitive-radius-1: 2px;
226
-
227
- /* primitive.radius.full */
228
- --cx-primitive-radius-full: 9999px;
229
-
230
- /* radius.none */
231
- --cx-radius-none: var(--cx-primitive-radius-0);
232
-
233
- /* radius.control */
234
- --cx-radius-control: var(--cx-primitive-radius-0);
235
-
236
- /* radius.pill */
237
- --cx-radius-pill: var(--cx-primitive-radius-full);
238
-
239
- /* radius.round */
240
- --cx-radius-round: var(--cx-primitive-radius-full);
241
-
242
- /* primitive.size.width */
243
- --cx-primitive-size-width-xs: 15rem;
244
- --cx-primitive-size-width-sm: 20rem;
245
- --cx-primitive-size-width-md: 40rem;
246
- --cx-primitive-size-width-lg: 60rem;
247
- --cx-primitive-size-width-xl: 69rem;
248
-
249
- /* primitive.size.measure */
250
- --cx-primitive-size-measure-narrow: 52ch;
251
- --cx-primitive-size-measure-base: 66ch;
252
- --cx-primitive-size-measure-wide: 80ch;
253
-
254
- /* primitive.size.control */
255
- --cx-primitive-size-control-1: 1.5rem;
256
- --cx-primitive-size-control-2: 2.5rem;
257
- --cx-primitive-size-control-3: 2.75rem;
258
-
259
- /* primitive.size.icon */
260
- --cx-primitive-size-icon-1: 1rem;
261
- --cx-primitive-size-icon-2: 1.25rem;
262
- --cx-primitive-size-icon-3: 1.5rem;
263
-
264
- /* primitive.size.glyph */
265
- --cx-primitive-size-glyph-1: 0.75rem;
266
- --cx-primitive-size-glyph-2: 1.5rem;
267
- --cx-primitive-size-glyph-3: 2.25rem;
268
- --cx-primitive-size-glyph-4: 3rem;
269
-
270
- /* primitive.size.breakpoint */
271
- --cx-primitive-size-breakpoint-sm: 30rem;
272
- --cx-primitive-size-breakpoint-md: 48rem;
273
- --cx-primitive-size-breakpoint-lg: 64rem;
274
- --cx-primitive-size-breakpoint-xl: 80rem;
275
-
276
- /* primitive.size.effect */
277
- --cx-primitive-size-effect-1: 0.5rem;
278
- --cx-primitive-size-effect-2: 30rem;
279
-
280
- /* primitive.size.viewport */
281
- --cx-primitive-size-viewport-1: 100lvh;
282
-
283
- /* size.container */
284
- --cx-size-container-page: var(--cx-primitive-size-width-xl);
285
- --cx-size-container-breakout: var(--cx-primitive-size-width-lg);
286
-
287
- /* size.measure */
288
- --cx-size-measure-prose: var(--cx-primitive-size-measure-base);
289
- --cx-size-measure-caption: var(--cx-primitive-size-measure-narrow);
290
- --cx-size-measure-code: var(--cx-primitive-size-measure-wide);
291
-
292
- /* size.column */
293
- --cx-size-column-sidebar: var(--cx-primitive-size-width-xs);
294
- --cx-size-column-card: var(--cx-primitive-size-width-sm);
295
-
296
- /* size.target */
297
- --cx-size-target-min: var(--cx-primitive-size-control-1);
298
- --cx-size-target-control: var(--cx-primitive-size-control-2);
299
- --cx-size-target-touch: var(--cx-primitive-size-control-3);
300
-
301
- /* size.icon */
302
- --cx-size-icon-sm: var(--cx-primitive-size-icon-1);
303
- --cx-size-icon-md: var(--cx-primitive-size-icon-2);
304
- --cx-size-icon-lg: var(--cx-primitive-size-icon-3);
305
-
306
- /* size.ornament */
307
- --cx-size-ornament-sm: var(--cx-primitive-size-glyph-1);
308
- --cx-size-ornament-md: var(--cx-primitive-size-glyph-2);
309
- --cx-size-ornament-lg: var(--cx-primitive-size-glyph-4);
310
-
311
- /* size.mark */
312
- --cx-size-mark-tick: var(--cx-primitive-space-2);
313
-
314
- /* size.breakpoint */
315
- --cx-size-breakpoint-md: var(--cx-primitive-size-breakpoint-md);
316
- --cx-size-breakpoint-lg: var(--cx-primitive-size-breakpoint-lg);
317
-
318
- /* size.backdrop */
319
- --cx-size-backdrop-blur: var(--cx-primitive-size-effect-1);
320
- --cx-size-backdrop-fade: var(--cx-primitive-size-effect-2);
321
- --cx-size-backdrop-height: var(--cx-primitive-size-viewport-1);
322
-
323
- /* primitive.space.0 */
324
- --cx-primitive-space-0: 0;
325
-
326
- /* primitive.space.1 */
327
- --cx-primitive-space-1: 0.25rem;
328
-
329
- /* primitive.space.2 */
330
- --cx-primitive-space-2: 0.5rem;
331
-
332
- /* primitive.space.3 */
333
- --cx-primitive-space-3: 0.75rem;
334
-
335
- /* primitive.space.4 */
336
- --cx-primitive-space-4: 1rem;
337
-
338
- /* primitive.space.5 */
339
- --cx-primitive-space-5: 1.25rem;
340
-
341
- /* primitive.space.6 */
342
- --cx-primitive-space-6: 1.5rem;
343
-
344
- /* primitive.space.8 */
345
- --cx-primitive-space-8: 2rem;
346
-
347
- /* primitive.space.10 */
348
- --cx-primitive-space-10: 2.5rem;
349
-
350
- /* primitive.space.12 */
351
- --cx-primitive-space-12: 3rem;
352
-
353
- /* primitive.space.16 */
354
- --cx-primitive-space-16: 4rem;
355
-
356
- /* primitive.space.20 */
357
- --cx-primitive-space-20: 5rem;
358
-
359
- /* primitive.space.24 */
360
- --cx-primitive-space-24: 6rem;
361
-
362
- /* space.inset */
363
- --cx-space-inset-xs: var(--cx-primitive-space-1);
364
- --cx-space-inset-sm: var(--cx-primitive-space-2);
365
- --cx-space-inset-md: var(--cx-primitive-space-4);
366
- --cx-space-inset-lg: var(--cx-primitive-space-6);
367
- --cx-space-inset-xl: var(--cx-primitive-space-8);
368
-
369
- /* space.stack */
370
- --cx-space-stack-xs: var(--cx-primitive-space-1);
371
- --cx-space-stack-sm: var(--cx-primitive-space-2);
372
- --cx-space-stack-md: var(--cx-primitive-space-4);
373
- --cx-space-stack-lg: var(--cx-primitive-space-6);
374
- --cx-space-stack-xl: var(--cx-primitive-space-10);
375
-
376
- /* space.inline */
377
- --cx-space-inline-xs: var(--cx-primitive-space-1);
378
- --cx-space-inline-sm: var(--cx-primitive-space-2);
379
- --cx-space-inline-md: var(--cx-primitive-space-3);
380
- --cx-space-inline-lg: var(--cx-primitive-space-4);
381
-
382
- /* space.section */
383
- --cx-space-section-sm: clamp(2rem, 1.6667rem + 1.4815vw, 3rem);
384
- --cx-space-section-md: clamp(3rem, 2.6667rem + 1.4815vw, 4rem);
385
- --cx-space-section-lg: clamp(4rem, 3.3333rem + 2.963vw, 6rem);
386
-
387
- /* space.gutter */
388
- --cx-space-gutter-page: clamp(1rem, 0.5rem + 2.2222vw, 2.5rem);
389
- --cx-space-gutter-grid: clamp(1rem, 0.8333rem + 0.7407vw, 1.5rem);
390
-
391
- /* primitive.font.family */
392
- --cx-primitive-font-family-national-park: "National Park", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Roboto", sans-serif;
393
- --cx-primitive-font-family-jetbrains-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", "Menlo", "Consolas", monospace;
394
- --cx-primitive-font-family-yarndings-12: "Yarndings 12";
395
-
396
- /* primitive.font.size */
397
- --cx-primitive-font-size-1: 0.75rem;
398
- --cx-primitive-font-size-2: clamp(0.875rem, 0.8667rem + 0.037vw, 0.9rem);
399
- --cx-primitive-font-size-3: clamp(1.0625rem, 1.0417rem + 0.0926vw, 1.125rem);
400
- --cx-primitive-font-size-4: clamp(1.275rem, 1.2313rem + 0.1941vw, 1.406rem);
401
- --cx-primitive-font-size-5: clamp(1.53rem, 1.454rem + 0.3378vw, 1.758rem);
402
- --cx-primitive-font-size-6: clamp(1.836rem, 1.7157rem + 0.5348vw, 2.197rem);
403
- --cx-primitive-font-size-7: clamp(2.203rem, 2.0217rem + 0.8059vw, 2.747rem);
404
- --cx-primitive-font-size-8: clamp(2.644rem, 2.381rem + 1.1689vw, 3.433rem);
405
-
406
- /* primitive.font.weight */
407
- --cx-primitive-font-weight-light: 300;
408
- --cx-primitive-font-weight-regular: 400;
409
- --cx-primitive-font-weight-medium: 500;
410
- --cx-primitive-font-weight-semibold: 600;
411
- --cx-primitive-font-weight-bold: 700;
412
- --cx-primitive-font-weight-extrabold: 800;
413
-
414
- /* primitive.font.line-height */
415
- --cx-primitive-font-line-height-tight: 1.1;
416
- --cx-primitive-font-line-height-snug: 1.25;
417
- --cx-primitive-font-line-height-normal: 1.4;
418
- --cx-primitive-font-line-height-relaxed: 1.6;
419
-
420
- /* primitive.font.relative */
421
- --cx-primitive-font-relative-code: 0.875em;
422
-
423
- /* primitive.font.tracking */
424
- --cx-primitive-font-tracking-tighter: -0.025em;
425
- --cx-primitive-font-tracking-tight: -0.015em;
426
- --cx-primitive-font-tracking-none: 0em;
427
- --cx-primitive-font-tracking-wide: 0.04em;
428
- --cx-primitive-font-tracking-wider: 0.08em;
429
-
430
- /* font.family */
431
- --cx-font-family-display: var(--cx-primitive-font-family-national-park);
432
- --cx-font-family-body: var(--cx-primitive-font-family-national-park);
433
- --cx-font-family-mono: var(--cx-primitive-font-family-jetbrains-mono);
434
- --cx-font-family-ornament: var(--cx-primitive-font-family-yarndings-12);
435
-
436
- /* font.size */
437
- --cx-font-size-display: var(--cx-primitive-font-size-8);
438
- --cx-font-size-heading-1: var(--cx-primitive-font-size-7);
439
- --cx-font-size-heading-2: var(--cx-primitive-font-size-6);
440
- --cx-font-size-heading-3: var(--cx-primitive-font-size-5);
441
- --cx-font-size-heading-4: var(--cx-primitive-font-size-4);
442
- --cx-font-size-lede: var(--cx-primitive-font-size-4);
443
- --cx-font-size-body: var(--cx-primitive-font-size-3);
444
- --cx-font-size-small: var(--cx-primitive-font-size-2);
445
- --cx-font-size-label: var(--cx-primitive-font-size-1);
446
- --cx-font-size-code-inline: var(--cx-primitive-font-relative-code);
447
-
448
- /* font.weight */
449
- --cx-font-weight-body: var(--cx-primitive-font-weight-regular);
450
- --cx-font-weight-ui: var(--cx-primitive-font-weight-medium);
451
- --cx-font-weight-strong: var(--cx-primitive-font-weight-semibold);
452
- --cx-font-weight-heading: var(--cx-primitive-font-weight-semibold);
453
- --cx-font-weight-display: var(--cx-primitive-font-weight-bold);
454
-
455
- /* font.line-height */
456
- --cx-font-line-height-display: var(--cx-primitive-font-line-height-tight);
457
- --cx-font-line-height-heading: var(--cx-primitive-font-line-height-snug);
458
- --cx-font-line-height-ui: var(--cx-primitive-font-line-height-normal);
459
- --cx-font-line-height-body: var(--cx-primitive-font-line-height-relaxed);
460
- --cx-font-line-height-code: var(--cx-primitive-font-line-height-relaxed);
461
-
462
- /* font.tracking */
463
- --cx-font-tracking-display: var(--cx-primitive-font-tracking-tighter);
464
- --cx-font-tracking-heading: var(--cx-primitive-font-tracking-tight);
465
- --cx-font-tracking-body: var(--cx-primitive-font-tracking-none);
466
- --cx-font-tracking-label: var(--cx-primitive-font-tracking-wider);
467
- --cx-font-tracking-ui: var(--cx-primitive-font-tracking-wide);
468
- }
469
- :root[data-theme="light"] { color-scheme: light; }
470
- :root[data-theme="dark"] { color-scheme: dark; }
471
-
472
- /* MotifSpec components. Every value is a --cx-* token; no raw colours, sizes or durations.
473
- Class prefix: cx-. Layouts are intrinsic (flex-wrap, auto-fill grids), so no width media queries. */
474
-
475
- /* ------------------------------------------------------------ base */
476
- *, *::before, *::after { box-sizing: border-box; }
477
- html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-padding-top: calc(var(--_header-height, var(--cx-size-target-touch)) + var(--cx-space-stack-xl)); }
478
- /* --_header-height is the sticky header's measured height, set on <html> by dist/codex.js, so a heading reached by a
479
- link clears the header even when it wraps to two rows. Without the script, one row is assumed. */
480
- body {
481
- margin: 0;
482
- background: var(--cx-color-surface-base);
483
- color: var(--cx-color-text-primary);
484
- font-family: var(--cx-font-family-body);
485
- font-size: var(--cx-font-size-body);
486
- font-weight: var(--cx-font-weight-body);
487
- line-height: var(--cx-font-line-height-body);
488
- letter-spacing: var(--cx-font-tracking-body);
489
- text-rendering: optimizeLegibility;
490
- }
491
- ::selection { background: var(--cx-color-surface-highlight); color: var(--cx-color-text-primary); }
492
- :focus-visible { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
493
- img, svg, video { max-width: 100%; height: auto; }
494
- /* Controls that need script ship `hidden`; component display rules must never reveal them. */
495
- [hidden]:not([hidden="until-found"]) { display: none !important; }
496
- h1, h2, h3, h4 { text-wrap: balance; }
497
- p, li, dd, figcaption { text-wrap: pretty; }
498
- .cx-visually-hidden {
499
- position: absolute; width: var(--cx-border-width-hairline); height: var(--cx-border-width-hairline);
500
- margin: calc(var(--cx-border-width-hairline) * -1); padding: 0; overflow: hidden;
501
- clip-path: inset(50%); white-space: nowrap; border: 0;
502
- }
503
- .cx-skip-link {
504
- position: absolute; z-index: 100; left: var(--cx-space-gutter-page); top: var(--cx-space-inset-sm);
505
- padding: var(--cx-space-inset-sm) var(--cx-space-inset-md);
506
- background: var(--cx-color-accent-fill-rest); color: var(--cx-color-text-on-accent);
507
- font-weight: var(--cx-font-weight-strong); transform: translateY(-200%);
508
- }
509
- .cx-skip-link:focus { transform: none; }
510
-
511
- /* Shared label voice: mono, uppercase, tracked. */
512
- .cx-eyebrow, .cx-label dt, .cx-table thead th, .cx-toc summary, .cx-code__bar, .cx-callout__title, .cx-footer h2, .cx-figure__plate {
513
- font-family: var(--cx-font-family-mono);
514
- font-size: var(--cx-font-size-label);
515
- font-weight: var(--cx-font-weight-ui);
516
- line-height: var(--cx-font-line-height-ui);
517
- letter-spacing: var(--cx-font-tracking-label);
518
- text-transform: uppercase;
519
- }
520
- .cx-eyebrow { margin: 0; color: var(--cx-color-text-accent); }
521
-
522
- /* ------------------------------------------------------------ icons (Material Symbols sprite) and separators */
523
- .cx-icon { display: inline-block; flex: none; width: var(--cx-size-icon-md); height: var(--cx-size-icon-md); fill: currentColor; vertical-align: middle; overflow: visible; pointer-events: none; }
524
- .cx-icon--sm { width: var(--cx-size-icon-sm); height: var(--cx-size-icon-sm); }
525
- .cx-icon--lg { width: var(--cx-size-icon-lg); height: var(--cx-size-icon-lg); }
526
- .cx-sep { margin-inline: var(--cx-space-inline-xs); color: var(--cx-color-text-muted); font-weight: var(--cx-font-weight-body); }
527
-
528
- /* ------------------------------------------------------------ layout */
529
- .cx-container {
530
- width: 100%;
531
- max-width: calc(var(--cx-size-container-page) + 2 * var(--cx-space-gutter-page));
532
- margin-inline: auto;
533
- padding-left: max(var(--cx-space-gutter-page), env(safe-area-inset-left, 0px));
534
- padding-right: max(var(--cx-space-gutter-page), env(safe-area-inset-right, 0px));
535
- }
536
- .cx-stack { display: flex; flex-direction: column; gap: var(--cx-space-stack-lg); }
537
- .cx-section { padding-block: var(--cx-space-section-sm); }
538
- .cx-section + .cx-section { border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
539
- .cx-section__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--cx-space-stack-sm) var(--cx-space-inline-lg); margin-bottom: var(--cx-space-stack-lg); }
540
- .cx-section__head h2 { margin: 0; font-size: var(--cx-font-size-heading-2); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
541
- /* Article: TOC column and main column; wraps to one column with the TOC first. */
542
- .cx-article { display: flex; flex-wrap: wrap; flex-direction: row-reverse; align-items: flex-start; gap: var(--cx-space-stack-xl) var(--cx-space-section-sm); }
543
- .cx-article > .cx-article__main { flex: 999 1 0; min-width: min(100%, 60%); }
544
- .cx-article > .cx-toc { flex: 1 1 var(--cx-size-column-sidebar); }
545
-
546
- /* ------------------------------------------------------------ site header and nav */
547
- .cx-header {
548
- position: sticky; top: env(safe-area-inset-top, 0px); z-index: 10;
549
- background: var(--cx-color-surface-base);
550
- border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
551
- /* One hover for every header control: a wash of the text colour, which shows on the plain surface and on the frost. */
552
- --_wash: color-mix(in srgb, var(--cx-color-text-primary) var(--cx-color-wash-hover), transparent);
553
- --_nav-pad: calc((var(--cx-space-inset-sm) + var(--cx-space-inset-md)) / 2);
554
- }
555
- .cx-header__inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 var(--cx-space-inline-lg); }
556
- .cx-wordmark {
557
- display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--cx-space-inline-sm);
558
- min-height: var(--cx-size-target-touch); padding-block: var(--cx-space-inset-sm);
559
- color: var(--cx-color-text-primary); text-decoration: none;
560
- font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-heading-4);
561
- font-weight: var(--cx-font-weight-display); letter-spacing: var(--cx-font-tracking-heading); line-height: var(--cx-font-line-height-ui);
562
- }
563
- .cx-wordmark__role {
564
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui);
565
- letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted);
566
- }
567
- .cx-header__end { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; justify-content: flex-end; gap: var(--cx-space-inline-sm); }
568
- .cx-nav { min-width: 0; }
569
- /* Wrapped onto its own row (dist/codex.js sets data-wrapped), the nav starts at the left and is pulled out by its
570
- pills' padding, so the link text lines up with the wordmark and the page text; the controls stay at the right. The
571
- row keeps inset-xs below it, so the current page's pill doesn't sit on the header's bottom border. */
572
- .cx-header[data-wrapped] .cx-header__end { justify-content: space-between; padding-block-end: var(--cx-space-inset-xs); }
573
- /* A relative offset, not a margin: it moves the links without changing the row's width, so it can't change whether
574
- the header wraps. */
575
- .cx-header[data-wrapped] .cx-nav { position: relative; inset-inline-start: calc(var(--_nav-pad) * -1); }
576
- .cx-nav ul { display: flex; gap: 0 var(--cx-space-inline-xs); margin: 0; padding: 0; list-style: none; overflow-x: auto; scrollbar-width: thin; }
577
- .cx-nav li { flex: none; }
578
- .cx-nav a {
579
- /* Halfway between inset-sm and inset-md, so Work, Writing, About, the pause control and the toggle fit one row on a
580
- 360px phone; narrower than that, the list scrolls inside its row. */
581
- display: inline-flex; align-items: center; min-height: var(--cx-size-target-touch); padding-inline: var(--_nav-pad);
582
- border-radius: var(--cx-radius-pill); color: var(--cx-color-text-secondary); text-decoration: none; font-weight: var(--cx-font-weight-ui);
583
- transition: color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
584
- }
585
- /* Hover only where there is a pointer that hovers: on touch screens :hover sticks after a tap. */
586
- @media (hover: hover) { .cx-nav a:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
587
- /* The current section is highlighted, not underlined: a highlight fill with an accent outline, which is what stands out
588
- from the surface (3:1), as the fill alone is close to it in both themes. Inset, so the pill keeps its size. */
589
- .cx-nav a[aria-current="page"] {
590
- color: var(--cx-color-text-primary); background: var(--cx-color-surface-highlight);
591
- box-shadow: inset 0 0 0 var(--cx-border-width-hairline) var(--cx-color-accent-border);
592
- }
593
- /* Theme toggle: an icon-only pill (a circle) that shows the action, with a tooltip. */
594
- .cx-theme-toggle {
595
- position: relative; flex: none; display: inline-grid; place-items: center;
596
- width: var(--cx-size-target-touch); height: var(--cx-size-target-touch); padding: 0;
597
- border: 0; border-radius: var(--cx-radius-pill); background: transparent; color: var(--cx-color-text-secondary); cursor: pointer;
598
- transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
599
- }
600
- @media (hover: hover) { .cx-theme-toggle:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
601
- /* Backdrop pause: the same icon-only pill as the theme toggle. A native checkbox (checked = paused), so it works
602
- without a click handler; it ships hidden and dist/plate.js reveals it when the backdrop starts to drift. */
603
- .cx-backdrop__pause {
604
- position: relative; flex: none; display: inline-grid; place-items: center;
605
- width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
606
- border-radius: var(--cx-radius-pill); color: var(--cx-color-text-secondary); cursor: pointer;
607
- transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
608
- }
609
- @media (hover: hover) { .cx-backdrop__pause:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
610
- .cx-backdrop__pause:has(:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
611
- .cx-backdrop__pause :is(.cx-icon, .cx-tooltip [data-when]) { display: none; }
612
- .cx-backdrop__pause:not(:has(:checked)) [data-when="running"],
613
- .cx-backdrop__pause:has(:checked) [data-when="paused"] { display: inline-block; }
614
- .cx-theme-toggle .cx-icon { display: none; }
615
- .cx-theme-toggle [data-icon="to-dark"] { display: inline-block; }
616
- :root[data-theme="dark"] .cx-theme-toggle [data-icon="to-dark"] { display: none; }
617
- :root[data-theme="dark"] .cx-theme-toggle [data-icon="to-light"] { display: inline-block; }
618
- @media (prefers-color-scheme: dark) {
619
- :root:not([data-theme="light"]) .cx-theme-toggle [data-icon="to-dark"] { display: none; }
620
- :root:not([data-theme="light"]) .cx-theme-toggle [data-icon="to-light"] { display: inline-block; }
621
- }
622
-
623
- /* Tooltip: a short label for an icon-only control, shown on hover and keyboard focus. */
624
- .cx-tooltip {
625
- position: absolute; z-index: 30; top: 100%; right: 0; width: max-content; max-width: var(--cx-size-column-card);
626
- border-top: var(--cx-space-inset-xs) solid transparent; background-clip: padding-box;
627
- padding: var(--cx-space-inset-xs) var(--cx-space-inset-sm);
628
- background-color: var(--cx-color-surface-inverse); color: var(--cx-color-text-inverse);
629
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui);
630
- letter-spacing: var(--cx-font-tracking-ui); line-height: var(--cx-font-line-height-ui); text-align: left; text-transform: none; white-space: nowrap;
631
- opacity: 0; visibility: hidden; pointer-events: none;
632
- transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), visibility var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
633
- }
634
- .cx-tooltip--start { right: auto; left: 0; }
635
- .cx-tooltip--above { top: auto; bottom: 100%; border-top: 0; border-bottom: var(--cx-space-inset-xs) solid transparent; }
636
-
637
- /* Version link: a version number that opens the changelog. */
638
- .cx-version {
639
- position: relative; display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs);
640
- color: inherit; text-decoration: none; font-variant-numeric: tabular-nums;
641
- }
642
- .cx-version:hover { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
643
- /* Escape adds .is-tooltip-dismissed to the control until the pointer leaves or focus moves. */
644
- :is(button, a, [tabindex]):is(:hover, :focus-visible):not(.is-tooltip-dismissed) > .cx-tooltip,
645
- label:is(:hover, :has(:focus-visible)):not(.is-tooltip-dismissed) > .cx-tooltip { opacity: 1; visibility: visible; }
646
-
647
- /* ------------------------------------------------------------ footer and ornament band */
648
- .cx-band {
649
- display: block; overflow: hidden; white-space: nowrap; user-select: none;
650
- font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display);
651
- color: var(--cx-color-ornament-rest);
652
- }
653
- .cx-band::before { content: "kWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkW"; } /* 1,024 glyphs: wider than an 8K screen at 12px */
654
- .cx-footer { margin-top: var(--cx-space-section-lg); border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); background: var(--cx-color-surface-raised); }
655
- .cx-footer .cx-band { padding-block: var(--cx-space-inset-md); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
656
- /* Columns of equal width that wrap: a link list needs half a sidebar column, prose (the colophon) a whole one. On a
657
- phone the link lists sit side by side and the colophon takes the row below. */
658
- .cx-footer__grid {
659
- display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-lg) var(--cx-space-gutter-grid);
660
- padding-block: var(--cx-space-inset-xl);
661
- }
662
- .cx-footer__grid > * { flex: 1 1 0; min-width: min(100%, var(--cx-size-column-sidebar)); }
663
- .cx-footer__grid > :has(> ul) { min-width: calc(var(--cx-size-column-sidebar) / 2); }
664
- .cx-footer h2 { margin: 0 0 var(--cx-space-stack-sm); color: var(--cx-color-text-muted); }
665
- .cx-footer ul { margin: 0; padding: 0; list-style: none; }
666
- .cx-footer li a {
667
- display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min);
668
- color: var(--cx-color-text-secondary); text-decoration: none; font-size: var(--cx-font-size-small);
669
- }
670
- .cx-footer li a:hover { color: var(--cx-color-link-hover); text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
671
- .cx-footer p { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-caption); }
672
- .cx-footer__base {
673
- display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--cx-space-stack-sm) var(--cx-space-inline-lg);
674
- padding-block: var(--cx-space-inset-md); border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
675
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); color: var(--cx-color-text-muted);
676
- }
677
- .cx-footer__base a { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); color: inherit; }
678
-
679
- /* ------------------------------------------------------------ accession label (signature) */
680
- .cx-label {
681
- position: relative; display: flex; flex-wrap: wrap; margin: var(--cx-size-mark-tick);
682
- padding: 0; background: var(--cx-color-surface-raised);
683
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-default);
684
- /* The same line again as an outline over the border: outlines paint above children, so the cells' rules that run
685
- out to the edge disappear under it and the frame stays one colour. */
686
- outline: var(--cx-border-width-hairline) solid var(--cx-color-border-default); outline-offset: calc(var(--cx-border-width-hairline) * -1);
687
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); line-height: var(--cx-font-line-height-ui);
688
- }
689
- /* Registration ticks: eight hairlines extending each edge past the corners. */
690
- .cx-label::before, .cx-plate-frame::before {
691
- content: ""; position: absolute; pointer-events: none;
692
- inset: calc(var(--cx-size-mark-tick) * -1 - var(--cx-border-width-hairline));
693
- --_t: var(--cx-size-mark-tick); --_h: var(--cx-border-width-hairline); --_c: var(--cx-color-ornament-muted);
694
- background:
695
- linear-gradient(var(--_c), var(--_c)) left 0 top var(--_t) / var(--_t) var(--_h) no-repeat,
696
- linear-gradient(var(--_c), var(--_c)) left var(--_t) top 0 / var(--_h) var(--_t) no-repeat,
697
- linear-gradient(var(--_c), var(--_c)) right 0 top var(--_t) / var(--_t) var(--_h) no-repeat,
698
- linear-gradient(var(--_c), var(--_c)) right var(--_t) top 0 / var(--_h) var(--_t) no-repeat,
699
- linear-gradient(var(--_c), var(--_c)) left 0 bottom var(--_t) / var(--_t) var(--_h) no-repeat,
700
- linear-gradient(var(--_c), var(--_c)) left var(--_t) bottom 0 / var(--_h) var(--_t) no-repeat,
701
- linear-gradient(var(--_c), var(--_c)) right 0 bottom var(--_t) / var(--_t) var(--_h) no-repeat,
702
- linear-gradient(var(--_c), var(--_c)) right var(--_t) bottom 0 / var(--_h) var(--_t) no-repeat;
703
- }
704
- /* Cells: a rule on the right and below each one. They grow to fill their row, so when the fields wrap onto several
705
- rows each row is closed by a full-width rule; the negative margins push the rules on the outer edges under the frame. */
706
- .cx-label > div {
707
- flex: 1 1 auto; display: flex; flex-direction: column; gap: var(--cx-space-stack-xs); padding: var(--cx-space-inset-sm) var(--cx-space-inset-md);
708
- margin: 0 calc(var(--cx-border-width-hairline) * -1) calc(var(--cx-border-width-hairline) * -1) 0;
709
- border-right: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
710
- border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
711
- }
712
- .cx-label dt { color: var(--cx-color-text-muted); }
713
- .cx-label dd { margin: 0; color: var(--cx-color-text-primary); font-weight: var(--cx-font-weight-ui); font-variant-numeric: tabular-nums; }
714
- .cx-label dd a { color: var(--cx-color-link-rest); }
715
- .cx-label .cx-label__id dd { color: var(--cx-color-text-accent); }
716
- /* A case study shows its label twice in the markup. Below the md breakpoint the lead label above the title keeps
717
- only the number, date and status (role and stack are __detail fields), so the title stays near the top of a
718
- phone screen; the full label follows the article as a card. From md up the lead label is complete and the card
719
- is not shown. */
720
- @media (width < 48rem) { .cx-label--lead .cx-label__detail { display: none; } }
721
- @media (width >= 48rem) { .cx-label--card { display: none; } }
722
- /* Compact inline form for cards and list rows. */
723
- .cx-id {
724
- display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0 var(--cx-space-inline-sm); margin: 0;
725
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui);
726
- font-variant-numeric: tabular-nums; color: var(--cx-color-text-muted); line-height: var(--cx-font-line-height-ui);
727
- }
728
- .cx-id__no { color: var(--cx-color-text-accent); font-weight: var(--cx-font-weight-ui); }
729
- .cx-id > * + *::before { content: "|" / ""; order: -2; margin-right: var(--cx-space-inline-sm); color: var(--cx-color-text-muted); }
730
- .cx-status { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); text-transform: uppercase; letter-spacing: var(--cx-font-tracking-label); }
731
- .cx-status::after { content: ""; order: -1; width: var(--cx-space-inset-sm); height: var(--cx-space-inset-sm); border-radius: var(--cx-radius-round); background: currentColor; }
732
- .cx-status--live { color: var(--cx-color-status-success-text); }
733
- .cx-status--building { color: var(--cx-color-status-warning-text); }
734
- .cx-status--archived { color: var(--cx-color-text-muted); }
735
-
736
- /* ------------------------------------------------------------ tag */
737
- .cx-tags { display: flex; flex-wrap: wrap; gap: var(--cx-space-inline-sm); margin: 0; padding: 0; list-style: none; }
738
- .cx-tag {
739
- display: inline-flex; align-items: center; min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-sm);
740
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); border-radius: var(--cx-radius-none);
741
- background: var(--cx-color-surface-sunken); color: var(--cx-color-text-secondary);
742
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui);
743
- line-height: var(--cx-font-line-height-ui); text-transform: lowercase; text-decoration: none; white-space: nowrap;
744
- }
745
- a.cx-tag { position: relative; z-index: 2; transition: border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard); }
746
- a.cx-tag:hover { border-color: var(--cx-color-accent-border); color: var(--cx-color-text-primary); }
747
- .cx-tag[aria-current="page"] { border-color: var(--cx-color-accent-border); color: var(--cx-color-text-primary); }
748
- .cx-tag__count { margin-left: var(--cx-space-inline-xs); color: var(--cx-color-text-muted); }
749
-
750
- /* ------------------------------------------------------------ button and link */
751
- .cx-actions { display: flex; flex-wrap: wrap; gap: var(--cx-space-inline-md); }
752
- .cx-button {
753
- display: inline-flex; align-items: center; justify-content: center; gap: var(--cx-space-inline-sm);
754
- min-height: var(--cx-size-target-control); padding-inline: var(--cx-space-inset-lg);
755
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
756
- background: var(--cx-color-surface-raised); color: var(--cx-color-text-primary); cursor: pointer;
757
- font-family: var(--cx-font-family-body); font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-strong);
758
- line-height: var(--cx-font-line-height-ui); text-decoration: none;
759
- transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
760
- }
761
- .cx-button:hover { background: var(--cx-color-surface-hover); }
762
- .cx-button--primary { border-color: var(--cx-color-accent-fill-rest); background: var(--cx-color-accent-fill-rest); color: var(--cx-color-text-on-accent); }
763
- .cx-button--primary:hover { border-color: var(--cx-color-accent-fill-hover); background: var(--cx-color-accent-fill-hover); }
764
- .cx-button[disabled], .cx-button[aria-disabled="true"] { cursor: not-allowed; border-style: dashed; background: transparent; color: var(--cx-color-text-muted); }
765
- .cx-button__arrow { display: inline-block; transition: transform var(--cx-motion-duration-fast) var(--cx-motion-easing-standard); }
766
- .cx-button:hover .cx-button__arrow, .cx-link:hover .cx-button__arrow, .cx-pagination__link[rel="next"]:hover .cx-button__arrow { transform: translateX(var(--cx-motion-distance-nudge)); }
767
- .cx-back:hover .cx-button__arrow, .cx-pagination__link[rel="prev"]:hover .cx-button__arrow { transform: translateX(calc(var(--cx-motion-distance-nudge) * -1)); }
768
- .cx-link, .cx-back {
769
- display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min);
770
- color: var(--cx-color-link-rest); font-weight: var(--cx-font-weight-strong); text-decoration: underline;
771
- text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs);
772
- }
773
- .cx-link:hover, .cx-back:hover { color: var(--cx-color-link-hover); text-decoration-thickness: var(--cx-border-width-emphasis); }
774
- .cx-back { font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; text-decoration: none; }
775
-
776
- /* ------------------------------------------------------------ prose */
777
- .cx-prose { min-width: 0; }
778
- .cx-prose > * { margin-block: 0; }
779
- .cx-prose > * + * { margin-block-start: var(--cx-space-stack-md); }
780
- .cx-prose > :where(p, ul, ol, dl, blockquote, h2, h3, h4) { max-width: var(--cx-size-measure-prose); }
781
- .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout) { max-width: var(--cx-size-measure-prose); }
782
- .cx-prose > :where(.cx-figure--breakout, .cx-code--breakout, .cx-table--breakout) { max-width: var(--cx-size-container-breakout); }
783
- .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout, hr) { margin-block-start: var(--cx-space-stack-lg); }
784
- .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout) + * { margin-block-start: var(--cx-space-stack-lg); }
785
- /* Code blocks and figures are <figure> elements: drop the browser's margins with no specificity, so the prose rhythm above still applies. */
786
- :where(.cx-code, .cx-figure) { margin: 0; }
787
- .cx-prose h2 {
788
- margin-block-start: var(--cx-space-stack-xl); padding-block-start: var(--cx-space-stack-md);
789
- border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
790
- font-size: var(--cx-font-size-heading-2); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading);
791
- }
792
- .cx-prose h3 { margin-block-start: var(--cx-space-stack-lg); font-size: var(--cx-font-size-heading-3); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
793
- .cx-prose h4 { margin-block-start: var(--cx-space-stack-lg); font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); }
794
- .cx-prose :is(h2, h3, h4) + * { margin-block-start: var(--cx-space-stack-sm); }
795
- /* Heading anchor: a "#" after any section heading that has an id (prose, page sections, docs). */
796
- /* A 44px round target, like the theme toggle; negative block margins keep it from stretching the line. */
797
- .cx-anchor {
798
- display: inline-grid; place-items: center; width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
799
- margin-left: var(--cx-space-inline-xs); margin-block: calc((var(--cx-size-target-touch) - var(--cx-size-icon-lg)) / -2);
800
- border-radius: var(--cx-radius-pill); color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono);
801
- font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-ui); letter-spacing: var(--cx-font-tracking-body);
802
- line-height: var(--cx-font-line-height-ui); text-decoration: none; vertical-align: middle; opacity: 0;
803
- transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
804
- }
805
- :is(h2, h3, h4):hover > .cx-anchor, .cx-anchor:focus-visible, :target > .cx-anchor { opacity: 1; }
806
- .cx-anchor:hover { color: var(--cx-color-text-primary); background: var(--cx-color-surface-hover); }
807
- @media (hover: none) { .cx-anchor { opacity: 1; } }
808
- .cx-prose a:not([class]) { color: var(--cx-color-link-rest); text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
809
- .cx-prose a:not([class]):hover { color: var(--cx-color-link-hover); text-decoration-thickness: var(--cx-border-width-emphasis); }
810
- .cx-prose strong { font-weight: var(--cx-font-weight-strong); }
811
- .cx-prose :where(ul, ol) { padding-inline-start: var(--cx-space-inset-lg); }
812
- .cx-prose li + li { margin-block-start: var(--cx-space-stack-sm); }
813
- .cx-prose ul { list-style: square; }
814
- .cx-prose ul > li::marker { color: var(--cx-color-ornament-rest); }
815
- .cx-prose ol { list-style: decimal-leading-zero; }
816
- .cx-prose ol > li::marker { color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); }
817
- .cx-prose blockquote {
818
- margin-inline: 0; padding-inline-start: var(--cx-space-inset-md);
819
- border-left: var(--cx-border-width-emphasis) solid var(--cx-color-accent-border);
820
- color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-lede); line-height: var(--cx-font-line-height-heading);
821
- }
822
- .cx-prose blockquote > * { margin: 0; }
823
- .cx-prose blockquote cite { font-style: normal; }
824
- .cx-prose blockquote footer { margin-top: var(--cx-space-stack-sm); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted); }
825
- .cx-prose :not(pre) > code, .cx-code-inline {
826
- padding-inline: var(--cx-space-inset-xs); border: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
827
- background: var(--cx-color-surface-sunken); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-code-inline);
828
- overflow-wrap: anywhere;
829
- }
830
- .cx-prose kbd {
831
- padding-inline: var(--cx-space-inset-xs); border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong);
832
- border-bottom-width: var(--cx-border-width-emphasis); border-radius: var(--cx-radius-control);
833
- background: var(--cx-color-surface-sunken); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-code-inline);
834
- }
835
- .cx-prose mark { background: var(--cx-color-surface-highlight); color: var(--cx-color-text-primary); }
836
- .cx-prose hr, .cx-divider {
837
- display: block; width: 100%; height: auto; border: 0; text-align: center; overflow: visible;
838
- font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest);
839
- }
840
- .cx-prose hr::after, .cx-divider::after { content: "k W k"; letter-spacing: var(--cx-font-tracking-label); }
841
- .cx-end-mark { display: inline-block; margin-left: var(--cx-space-inline-sm); font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest); }
842
- .cx-lede { margin: 0; max-width: var(--cx-size-measure-prose); color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-lede); line-height: var(--cx-font-line-height-heading); }
843
-
844
- /* ------------------------------------------------------------ page heading */
845
- .cx-page-head { display: flex; flex-direction: column; gap: var(--cx-space-stack-md); padding-block: var(--cx-space-section-sm) var(--cx-space-stack-lg); }
846
- .cx-page-head h1, .cx-h1 {
847
- margin: 0; max-width: var(--cx-size-measure-code);
848
- font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-heading-1); font-weight: var(--cx-font-weight-display);
849
- line-height: var(--cx-font-line-height-display); letter-spacing: var(--cx-font-tracking-display);
850
- }
851
- .cx-display {
852
- margin: 0; max-width: var(--cx-size-measure-caption);
853
- font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-display); font-weight: var(--cx-font-weight-display);
854
- line-height: var(--cx-font-line-height-display); letter-spacing: var(--cx-font-tracking-display);
855
- }
856
- .cx-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cx-space-stack-xs) var(--cx-space-inline-md); margin: 0; font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; }
857
-
858
- /* ------------------------------------------------------------ code block */
859
- .cx-code { min-width: 0; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-sunken); }
860
- .cx-code__bar {
861
- display: flex; flex-wrap: wrap; align-items: center; gap: var(--cx-space-inline-md); min-height: var(--cx-size-target-control);
862
- padding-block: var(--cx-space-inset-sm); padding-inline: var(--cx-space-inset-md) var(--cx-space-inset-sm); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
863
- color: var(--cx-color-text-muted);
864
- }
865
- .cx-code__file { color: var(--cx-color-text-secondary); text-transform: none; letter-spacing: var(--cx-font-tracking-ui); }
866
- .cx-code__copy {
867
- margin-left: auto; display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-sm) var(--cx-space-inset-md);
868
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
869
- background: var(--cx-color-surface-raised); color: var(--cx-color-text-secondary); cursor: pointer;
870
- font: inherit; letter-spacing: inherit; text-transform: inherit;
871
- }
872
- .cx-code__copy:hover { color: var(--cx-color-text-primary); }
873
- .cx-code__copy[data-state="copied"] { color: var(--cx-color-status-success-text); border-color: var(--cx-color-status-success-border); }
874
- .cx-code pre {
875
- margin: 0; padding: var(--cx-space-inset-md) var(--cx-space-inset-lg); overflow-x: auto;
876
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-code);
877
- tab-size: 2; font-variant-ligatures: none;
878
- }
879
- .cx-code pre code { font: inherit; }
880
- .cx-code .line { display: block; }
881
- .cx-code .ln, .cx-code .lnt { display: inline-block; margin-right: var(--cx-space-inline-lg); text-align: right; user-select: none; }
882
- .cx-code .hl { display: block; margin-inline: calc(var(--cx-space-inset-lg) * -1); padding-inline: var(--cx-space-inset-lg); box-shadow: inset var(--cx-border-width-emphasis) 0 0 var(--cx-color-accent-border); }
883
-
884
- /* ------------------------------------------------------------ figure and caption */
885
- .cx-figure { display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); min-width: 0; }
886
- .cx-figure__frame { overflow: auto; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
887
- .cx-figure__frame > :where(img, svg) { display: block; width: 100%; height: auto; }
888
- /* Diagrams keep a legible text size and scroll inside the frame on narrow screens. */
889
- .cx-figure--diagram .cx-figure__frame > svg { min-width: calc(var(--cx-size-column-card) * 2); }
890
- .cx-figure figcaption { display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-xs) var(--cx-space-inline-md); max-width: var(--cx-size-measure-caption); color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-ui); }
891
- .cx-figure__plate { color: var(--cx-color-text-accent); }
892
-
893
- /* ------------------------------------------------------------ callout */
894
- .cx-callout {
895
- --_border: var(--cx-color-status-info-border); --_bg: var(--cx-color-status-info-surface); --_title: var(--cx-color-status-info-text);
896
- display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); padding: var(--cx-space-inset-md);
897
- border: var(--cx-border-width-hairline) solid var(--_border); border-left-width: var(--cx-border-width-emphasis);
898
- background: var(--_bg); color: var(--cx-color-text-primary);
899
- }
900
- .cx-callout > * { margin: 0; }
901
- .cx-callout__title { display: flex; align-items: center; gap: var(--cx-space-inline-sm); color: var(--_title); }
902
- .cx-callout--tip { --_border: var(--cx-color-status-success-border); --_bg: var(--cx-color-status-success-surface); --_title: var(--cx-color-status-success-text); }
903
- .cx-callout--warning { --_border: var(--cx-color-status-warning-border); --_bg: var(--cx-color-status-warning-surface); --_title: var(--cx-color-status-warning-text); }
904
- .cx-callout--danger { --_border: var(--cx-color-status-danger-border); --_bg: var(--cx-color-status-danger-surface); --_title: var(--cx-color-status-danger-text); }
905
-
906
- /* ------------------------------------------------------------ data table */
907
- .cx-table { min-width: 0; overflow-x: auto; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
908
- .cx-table table { width: 100%; border-collapse: collapse; font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-ui); }
909
- .cx-table caption { padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); text-align: left; caption-side: top; color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
910
- .cx-table th, .cx-table td { padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); text-align: left; vertical-align: top; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
911
- .cx-table thead th { background: var(--cx-color-surface-sunken); color: var(--cx-color-text-secondary); white-space: nowrap; }
912
- .cx-table tbody th { font-weight: var(--cx-font-weight-strong); }
913
- .cx-table tbody tr:last-child > * { border-bottom: 0; }
914
- .cx-table tbody tr:hover > * { background: var(--cx-color-surface-hover); }
915
- .cx-table .is-num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--cx-font-family-mono); }
916
- .cx-table code { font-family: var(--cx-font-family-mono); }
917
-
918
- /* ------------------------------------------------------------ project card */
919
- .cx-cards { display: grid; gap: var(--cx-space-gutter-grid); grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--cx-size-column-card)), 1fr)); margin: 0; padding: 0; list-style: none; }
920
- .cx-card {
921
- position: relative; display: flex; flex-direction: column; height: 100%;
922
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised);
923
- transition: border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
924
- }
925
- .cx-card:hover { border-color: var(--cx-color-border-strong); }
926
- .cx-card:focus-within { border-color: var(--cx-color-border-strong); }
927
- .cx-card__media { aspect-ratio: 16 / 10; max-width: 100%; overflow: hidden; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); background: var(--cx-color-surface-sunken); }
928
- .cx-card__media > :where(img, svg) { display: block; width: 100%; height: 100%; object-fit: cover; }
929
- .cx-card__body { display: flex; flex: 1; flex-direction: column; gap: var(--cx-space-stack-sm); padding: var(--cx-space-inset-md); }
930
- .cx-card__title { margin: 0; font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
931
- .cx-card__link { color: var(--cx-color-text-primary); text-decoration: none; }
932
- .cx-card__link::after { content: ""; position: absolute; inset: 0; z-index: 1; }
933
- .cx-card__link:hover, .cx-card__link:focus-visible { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
934
- .cx-card__link:focus-visible { outline: none; }
935
- .cx-card:has(.cx-card__link:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
936
- .cx-card__summary { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-caption); }
937
- .cx-card .cx-tags { margin-top: auto; padding-top: var(--cx-space-stack-sm); }
938
-
939
- /* ------------------------------------------------------------ post list item (ledger row) */
940
- .cx-posts { margin: 0; padding: 0; list-style: none; border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
941
- .cx-post {
942
- position: relative; display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-xs) var(--cx-space-inline-lg);
943
- padding: var(--cx-space-inset-md) var(--cx-space-inset-sm); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
944
- transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
945
- }
946
- .cx-post:hover { background: var(--cx-color-surface-hover); }
947
- .cx-post__meta { flex: 0 0 calc(var(--cx-size-column-sidebar) / 2); display: flex; flex-direction: column; gap: var(--cx-space-stack-xs); margin: 0; font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; line-height: var(--cx-font-line-height-ui); }
948
- .cx-post__meta .cx-id__no { color: var(--cx-color-text-accent); }
949
- .cx-post__main { flex: 1 1 var(--cx-size-column-card); min-width: 0; display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); }
950
- .cx-post__title { margin: 0; font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
951
- .cx-post__title a { color: var(--cx-color-text-primary); text-decoration: none; }
952
- .cx-post__title a::after { content: ""; position: absolute; inset: 0; z-index: 1; }
953
- .cx-post__title a:hover { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
954
- .cx-post__title a:focus-visible { outline: none; }
955
- .cx-post:has(.cx-post__title a:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: calc(var(--cx-border-focus-offset) * -1); }
956
- .cx-post__summary { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-prose); }
957
- .cx-posts__year { margin: var(--cx-space-stack-lg) 0 0; padding: var(--cx-space-inset-sm); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-ui); color: var(--cx-color-text-secondary); font-variant-numeric: tabular-nums; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
958
-
959
- /* ------------------------------------------------------------ pagination */
960
- .cx-pagination { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
961
- .cx-pagination__link {
962
- display: flex; flex-direction: column; justify-content: center; gap: var(--cx-space-stack-xs); min-width: 0; min-height: var(--cx-size-target-touch);
963
- padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); color: var(--cx-color-text-primary); text-decoration: none;
964
- transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
965
- }
966
- .cx-pagination__link:hover { background: var(--cx-color-surface-hover); }
967
- .cx-pagination__link[rel="next"] { align-items: flex-end; text-align: right; }
968
- .cx-pagination__dir { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted); }
969
- .cx-pagination__link:hover .cx-pagination__dir { color: var(--cx-color-text-accent); }
970
- .cx-pagination__title { font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-strong); line-height: var(--cx-font-line-height-heading); }
971
- .cx-pagination__status {
972
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--cx-space-stack-xs);
973
- padding-inline: var(--cx-space-inset-md); border-inline: var(--cx-border-width-hairline) solid var(--cx-color-border-default);
974
- font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; text-align: center;
975
- }
976
- .cx-pagination__status strong { color: var(--cx-color-text-primary); font-weight: var(--cx-font-weight-ui); }
977
- .cx-pagination [aria-disabled="true"] { color: var(--cx-color-text-muted); pointer-events: none; }
978
-
979
- /* ------------------------------------------------------------ table of contents */
980
- .cx-toc { min-width: 0; font-size: var(--cx-font-size-small); }
981
- .cx-toc.is-docked { position: sticky; top: calc(var(--_header-height, var(--cx-size-target-touch)) + var(--cx-space-stack-xl)); }
982
- .cx-toc details { border-left: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
983
- .cx-toc summary { display: flex; align-items: center; min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-md); color: var(--cx-color-text-muted); cursor: pointer; list-style: none; }
984
- .cx-toc summary::-webkit-details-marker { display: none; }
985
- .cx-toc__chevron { margin-left: auto; transition: transform var(--cx-motion-duration-base) var(--cx-motion-easing-standard); }
986
- .cx-toc details[open] .cx-toc__chevron { transform: rotate(180deg); }
987
- .cx-toc ol { margin: 0; padding: 0; list-style: none; }
988
- .cx-toc ol ol { padding-left: var(--cx-space-inset-md); }
989
- .cx-toc a {
990
- display: flex; gap: var(--cx-space-inline-sm); min-height: var(--cx-size-target-min); align-items: center;
991
- margin-left: calc(var(--cx-border-width-hairline) * -1); padding: var(--cx-space-inset-xs) var(--cx-space-inset-md);
992
- border-left: var(--cx-border-width-emphasis) solid transparent; color: var(--cx-color-text-secondary); text-decoration: none; line-height: var(--cx-font-line-height-ui);
993
- transition: color var(--cx-motion-duration-base) var(--cx-motion-easing-standard), border-color var(--cx-motion-duration-base) var(--cx-motion-easing-standard);
994
- }
995
- .cx-toc a:hover { color: var(--cx-color-text-primary); border-left-color: var(--cx-color-border-strong); }
996
- .cx-toc a[aria-current="true"] { color: var(--cx-color-text-primary); border-left-color: var(--cx-color-accent-border); }
997
- .cx-toc__no { color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-variant-numeric: tabular-nums; }
998
-
999
- /* ------------------------------------------------------------ specimen plate (contour survey of simplex-noise terrain) */
1000
- .cx-plate-frame { position: relative; display: inline-flex; flex-direction: column; gap: var(--cx-space-stack-sm); margin: var(--cx-size-mark-tick); padding: var(--cx-space-inset-md); border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); max-width: 100%; }
1001
- .cx-plate {
1002
- position: relative; width: var(--cx-size-column-card); max-width: 100%; aspect-ratio: 1; overflow: hidden;
1003
- /* Read by js/plate.js: how long the terrain takes to drift one noise unit, and how long to wait for the draw-in. */
1004
- --cx-plate-drift: var(--cx-motion-duration-drift); --cx-plate-draw: var(--cx-motion-duration-plate);
1005
- }
1006
- .cx-plate__map { display: block; width: 100%; height: 100%; }
1007
- .cx-plate__map path { fill: none; vector-effect: non-scaling-stroke; stroke-linecap: round; stroke-linejoin: round; }
1008
- .cx-plate__grid { stroke: var(--cx-color-ornament-muted); stroke-width: var(--cx-border-width-hairline); }
1009
- /* Each contour carries pathLength="1", so the dash maths is the same for every line: it draws in once on load,
1010
- lowest contour first. */
1011
- .cx-plate__line {
1012
- stroke: var(--cx-color-ornament-rest); stroke-width: var(--cx-border-width-hairline);
1013
- stroke-dasharray: 1; stroke-dashoffset: 1;
1014
- animation: cx-contour var(--cx-motion-duration-plate) var(--cx-motion-easing-enter) forwards;
1015
- animation-delay: calc(var(--i) * var(--cx-motion-duration-fast) / 3);
1016
- }
1017
- .cx-plate__line--index { stroke: var(--cx-color-ornament-strong); stroke-width: var(--cx-border-width-emphasis); }
1018
- /* The dash only exists for the draw-in. The last keyframe drops it, so lines reshaped later never show gaps. */
1019
- @keyframes cx-contour { 99% { stroke-dasharray: 1; stroke-dashoffset: 0; } 100% { stroke-dasharray: none; stroke-dashoffset: 0; } }
1020
-
1021
- /* Pause control: a native checkbox styled as an icon-only pill. It ships hidden; the script reveals it when it
1022
- starts the drift, so it never appears on a plate that isn't moving. */
1023
- .cx-plate__pause {
1024
- position: absolute; z-index: 2; top: var(--cx-space-inset-sm); right: var(--cx-space-inset-sm);
1025
- display: inline-grid; place-items: center; width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
1026
- border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
1027
- background: var(--cx-color-surface-raised); color: var(--cx-color-text-secondary); cursor: pointer; opacity: 0;
1028
- transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
1029
- }
1030
- .cx-plate-frame:is(:hover, :focus-within) .cx-plate__pause { opacity: 1; }
1031
- @media (hover: hover) { .cx-plate__pause:hover { color: var(--cx-color-text-primary); background: var(--cx-color-surface-hover); } }
1032
- .cx-plate__pause:has(:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
1033
- .cx-plate__pause :is(.cx-icon, .cx-tooltip [data-when]) { display: none; }
1034
- .cx-plate__pause:not(:has(:checked)) [data-when="running"],
1035
- .cx-plate__pause:has(:checked) [data-when="paused"] { display: inline-block; }
1036
- @media (hover: none) { .cx-plate__pause { opacity: 1; } }
1037
- .cx-plate-frame figcaption { font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); max-width: var(--cx-size-column-card); }
1038
-
1039
- /* ------------------------------------------------------------ ornaments */
1040
- .cx-ornament { font-family: var(--cx-font-family-ornament); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest); font-size: var(--cx-size-ornament-md); }
1041
- .cx-ornament--lg { font-size: var(--cx-size-ornament-lg); }
1042
-
1043
- /* ------------------------------------------------------------ backdrop (the contour survey behind every page, under a grainy frost) */
1044
- /* Layers, bottom to top: the canvas (color.surface.base), the contours, the frost (tint + blur), the grain, then the
1045
- page. The page's own surface fades out over its first and last size.backdrop.fade, so the frost shows behind the
1046
- header and footer and reading happens on the plain surface. The backdrop is the first child of <body>. */
1047
- :root:has(.cx-backdrop-page) { background: var(--cx-color-surface-base); }
1048
- /* When the page class sits on a wrapper (a fragment such as the showcase), body's own surface would cover the backdrop. */
1049
- body:not(.cx-backdrop-page):has(.cx-backdrop-page) { background: transparent; }
1050
- .cx-backdrop-page {
1051
- background: linear-gradient(to top, transparent, var(--cx-color-surface-base) var(--cx-size-backdrop-fade),
1052
- var(--cx-color-surface-base) calc(100% - var(--cx-size-backdrop-fade)), transparent);
1053
- }
1054
- /* At the top of the page the header sits on the frost with no surface of its own. dist/codex.js marks it with
1055
- data-scrolled: from then on it sticks, and once the page leaves the top its surface fades in, so it never sits
1056
- see-through on the text below; back at the top the surface fades out again. Without the script it scrolls away. */
1057
- .cx-backdrop-page .cx-header { position: relative; background: transparent; }
1058
- .cx-backdrop-page .cx-header[data-scrolled] {
1059
- position: sticky;
1060
- transition: background-color var(--cx-motion-duration-slow) var(--cx-motion-easing-standard);
1061
- }
1062
- .cx-backdrop-page .cx-header[data-scrolled="true"] { background-color: var(--cx-color-surface-base); }
1063
- .cx-backdrop-page .cx-footer { background: transparent; }
1064
- .cx-backdrop {
1065
- /* Larger than the viewport by three blur radii on every side, so the blurred contours are whole at the screen edge.
1066
- Its height is the large viewport, not the bottom edge: on a phone the address bar slides away as you scroll, and
1067
- a layer pinned to the bottom would resize with it, re-fit the contours and make them jump. */
1068
- position: fixed; inset: calc(var(--cx-size-backdrop-blur) * -3); bottom: auto;
1069
- height: calc(var(--cx-size-backdrop-height) + var(--cx-size-backdrop-blur) * 6);
1070
- z-index: -1; overflow: hidden; pointer-events: none;
1071
- /* Read by js/plate.js, as on the plate. */
1072
- --cx-plate-drift: var(--cx-motion-duration-drift); --cx-plate-draw: var(--cx-motion-duration-plate);
1073
- }
1074
- .cx-backdrop .cx-plate__map {
1075
- position: relative; z-index: 0;
1076
- /* The frost's blur is applied to the contours themselves. The layer reaches three blur radii past the viewport, so
1077
- the blur never runs out of picture at the screen edge (backdrop-filter does, and leaves sharp lines there). */
1078
- filter: blur(var(--cx-size-backdrop-blur)) saturate(var(--cx-color-backdrop-saturation));
1079
- }
1080
- /* No draw-in: the backdrop is already there when a page opens. */
1081
- .cx-backdrop .cx-plate__line { stroke-width: var(--cx-border-width-contour); stroke-dasharray: none; stroke-dashoffset: 0; animation: none; }
1082
- .cx-backdrop .cx-plate__line--index { stroke-width: calc(var(--cx-border-width-contour) * 2); }
1083
- .cx-backdrop::before {
1084
- content: ""; position: absolute; inset: 0; z-index: 1;
1085
- background: color-mix(in srgb, var(--cx-color-surface-base) var(--cx-color-backdrop-tint), transparent);
1086
- }
1087
- /* Grain: monochrome fractal noise over the frost. No blend mode: in Chromium, blending this layer brought sharp,
1088
- unblurred lines back. */
1089
- .cx-backdrop::after {
1090
- content: ""; position: absolute; inset: 0; z-index: 2; opacity: var(--cx-color-backdrop-grain);
1091
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 0 1'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
1092
- }
1093
-
1094
-
1095
- /* ------------------------------------------------------------ motion preferences */
1096
- @media (prefers-reduced-motion: reduce) {
1097
- html { scroll-behavior: auto; }
1098
- *, *::before, *::after {
1099
- transition-duration: var(--cx-motion-duration-instant) !important;
1100
- animation-duration: var(--cx-motion-duration-instant) !important;
1101
- animation-delay: var(--cx-motion-duration-instant) !important;
1102
- }
1103
- /* The plate is drawn complete and stays still; its pause control disappears because there is nothing to pause. */
1104
- .cx-plate__line { animation: none !important; stroke-dasharray: none; }
1105
- .cx-plate__pause { display: none; }
1106
- /* The backdrop stays still too, so its header control goes. */
1107
- .cx-backdrop__pause { display: none; }
1108
- }
1109
-
1110
- /* Hugo Chroma classes -> MotifSpec tokens (generated from syntax/chroma.json). Both themes via tokens. */
1111
- .chroma { color: var(--cx-color-syntax-variable); background: var(--cx-color-surface-sunken); }
1112
- /* Keywords */
1113
- .chroma .k, .chroma .kd, .chroma .kn, .chroma .kp, .chroma .kr, .chroma .ow, .chroma .bp { color: var(--cx-color-syntax-keyword); font-weight: var(--cx-font-weight-strong); }
1114
- /* Type keywords, classes, built-ins, namespaces, exceptions */
1115
- .chroma .kt, .chroma .nb, .chroma .nc, .chroma .nn, .chroma .ne { color: var(--cx-color-syntax-type); }
1116
- /* Constants: numbers, booleans, null, dates, symbols, entities, escapes */
1117
- .chroma .kc, .chroma .no, .chroma .m, .chroma .mb, .chroma .mf, .chroma .mh, .chroma .mi, .chroma .il, .chroma .mo, .chroma .ld, .chroma .ss, .chroma .ni, .chroma .se { color: var(--cx-color-syntax-number); }
1118
- /* Strings and regex */
1119
- .chroma .s, .chroma .sa, .chroma .sb, .chroma .sc, .chroma .dl, .chroma .s2, .chroma .sh, .chroma .sx, .chroma .sr, .chroma .s1, .chroma .cpf { color: var(--cx-color-syntax-string); }
1120
- /* Functions */
1121
- .chroma .nf, .chroma .fm { color: var(--cx-color-syntax-function); }
1122
- /* Markup tags */
1123
- .chroma .nt { color: var(--cx-color-syntax-tag); }
1124
- /* Attributes, properties, object keys */
1125
- .chroma .na, .chroma .py { color: var(--cx-color-syntax-attribute); }
1126
- /* Names and variables */
1127
- .chroma .n, .chroma .nx, .chroma .nv, .chroma .vc, .chroma .vg, .chroma .vi, .chroma .vm, .chroma .l { color: var(--cx-color-syntax-variable); }
1128
- /* Operators and punctuation */
1129
- .chroma .o, .chroma .p { color: var(--cx-color-syntax-operator); }
1130
- /* Comments and doc strings */
1131
- .chroma .c, .chroma .ch, .chroma .cm, .chroma .c1, .chroma .cs, .chroma .sd, .chroma .go { color: var(--cx-color-syntax-comment); }
1132
- /* Meta: decorators, preprocessor, labels, interpolation, prompts */
1133
- .chroma .nd, .chroma .cp, .chroma .nl, .chroma .si, .chroma .gp { color: var(--cx-color-syntax-meta); }
1134
- /* Diff: inserted */
1135
- .chroma .gi { color: var(--cx-color-syntax-inserted); }
1136
- /* Diff: deleted, errors, tracebacks */
1137
- .chroma .gd, .chroma .gr, .chroma .gt, .chroma .err { color: var(--cx-color-syntax-deleted); }
1138
- /* Headings and diff hunks */
1139
- .chroma .gh, .chroma .gu { color: var(--cx-color-syntax-heading); font-weight: var(--cx-font-weight-strong); }
1140
- /* Generic strong and emphasis (no italic available) */
1141
- .chroma .gs, .chroma .ge { font-weight: var(--cx-font-weight-strong); }
1142
- /* Line numbers */
1143
- .chroma .ln, .chroma .lnt { color: var(--cx-color-syntax-line-number); }
1144
- /* Highlighted lines (hl_lines) */
1145
- .chroma .hl { background: var(--cx-color-syntax-line-highlight); }
1
+ @font-face { font-family: "National Park"; src: url("../fonts/national-park-latin-wght.woff2") format("woff2"); font-weight: 200 800; font-style: normal; font-display: swap; }
2
+ @font-face { font-family: "JetBrains Mono"; src: url("../fonts/jetbrains-mono-latin-wght.woff2") format("woff2"); font-weight: 100 800; font-style: normal; font-display: swap; }
3
+ @font-face { font-family: "Yarndings 12"; src: url("../fonts/yarndings-12-latin.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: block; }
4
+
5
+ /* MotifSpec 1.13.3 — generated from tokens/*.json. Do not edit.
6
+ Themes: semantic colours use light-dark(); color-scheme follows the system unless
7
+ <html data-theme="light|dark"> pins it. --cx-primitive-* are for this file only. */
8
+ :root {
9
+ color-scheme: light dark;
10
+ /* primitive.border.width */
11
+ --cx-primitive-border-width-1: 1px;
12
+ --cx-primitive-border-width-2: 2px;
13
+ --cx-primitive-border-width-3: 3px;
14
+
15
+ /* border.width */
16
+ --cx-border-width-hairline: var(--cx-primitive-border-width-1);
17
+ --cx-border-width-emphasis: var(--cx-primitive-border-width-2);
18
+ --cx-border-width-contour: var(--cx-primitive-border-width-3);
19
+
20
+ /* border.focus */
21
+ --cx-border-focus-width: var(--cx-primitive-border-width-2);
22
+ --cx-border-focus-offset: var(--cx-primitive-border-width-2);
23
+
24
+ /* primitive.color.ash */
25
+ --cx-primitive-color-ash-0: #fbfefd;
26
+ --cx-primitive-color-ash-50: #f4f8f6;
27
+ --cx-primitive-color-ash-100: #eaf1ee;
28
+ --cx-primitive-color-ash-200: #dae4df;
29
+ --cx-primitive-color-ash-300: #c4cdc8;
30
+ --cx-primitive-color-ash-400: #a4ada9;
31
+ --cx-primitive-color-ash-500: #838c87;
32
+ --cx-primitive-color-ash-600: #69716d;
33
+ --cx-primitive-color-ash-700: #515955;
34
+ --cx-primitive-color-ash-800: #323a36;
35
+ --cx-primitive-color-ash-850: #2d3330;
36
+ --cx-primitive-color-ash-900: #252a28;
37
+ --cx-primitive-color-ash-950: #171a19;
38
+ --cx-primitive-color-ash-1000: #0e100f;
39
+
40
+ /* primitive.color.sap */
41
+ --cx-primitive-color-sap-50: #e9fdee;
42
+ --cx-primitive-color-sap-100: #d8f9df;
43
+ --cx-primitive-color-sap-200: #bbf1c8;
44
+ --cx-primitive-color-sap-300: #a7d9b3;
45
+ --cx-primitive-color-sap-400: #7dbc8e;
46
+ --cx-primitive-color-sap-500: #4d9d66;
47
+ --cx-primitive-color-sap-600: #208347;
48
+ --cx-primitive-color-sap-700: #126836;
49
+ --cx-primitive-color-sap-800: #01441f;
50
+ --cx-primitive-color-sap-900: #003315;
51
+ --cx-primitive-color-sap-950: #00200b;
52
+
53
+ /* primitive.color.woad */
54
+ --cx-primitive-color-woad-50: #f2f7fe;
55
+ --cx-primitive-color-woad-100: #e5f0fe;
56
+ --cx-primitive-color-woad-200: #cde4fe;
57
+ --cx-primitive-color-woad-300: #abcef6;
58
+ --cx-primitive-color-woad-400: #83afe0;
59
+ --cx-primitive-color-woad-500: #578dc7;
60
+ --cx-primitive-color-woad-600: #3571b1;
61
+ --cx-primitive-color-woad-700: #26598e;
62
+ --cx-primitive-color-woad-800: #123961;
63
+ --cx-primitive-color-woad-900: #092a4b;
64
+ --cx-primitive-color-woad-950: #021a34;
65
+
66
+ /* primitive.color.weld */
67
+ --cx-primitive-color-weld-50: #fff6e1;
68
+ --cx-primitive-color-weld-100: #feeec7;
69
+ --cx-primitive-color-weld-200: #f9dfa1;
70
+ --cx-primitive-color-weld-300: #e0c88f;
71
+ --cx-primitive-color-weld-400: #c5a75d;
72
+ --cx-primitive-color-weld-500: #a88416;
73
+ --cx-primitive-color-weld-600: #896a02;
74
+ --cx-primitive-color-weld-700: #6c5302;
75
+ --cx-primitive-color-weld-800: #473502;
76
+ --cx-primitive-color-weld-900: #352700;
77
+ --cx-primitive-color-weld-950: #221800;
78
+
79
+ /* primitive.color.madder */
80
+ --cx-primitive-color-madder-50: #fef4f3;
81
+ --cx-primitive-color-madder-100: #feeae7;
82
+ --cx-primitive-color-madder-200: #ffd6d1;
83
+ --cx-primitive-color-madder-300: #feb5ac;
84
+ --cx-primitive-color-madder-400: #ea8e83;
85
+ --cx-primitive-color-madder-500: #d16359;
86
+ --cx-primitive-color-madder-600: #b94039;
87
+ --cx-primitive-color-madder-700: #942f29;
88
+ --cx-primitive-color-madder-800: #651916;
89
+ --cx-primitive-color-madder-900: #4e0d0c;
90
+ --cx-primitive-color-madder-950: #360404;
91
+
92
+ /* primitive.color.amount */
93
+ --cx-primitive-color-amount-1: 10%;
94
+ --cx-primitive-color-amount-2: 14%;
95
+ --cx-primitive-color-amount-3: 40%;
96
+ --cx-primitive-color-amount-4: 140%;
97
+
98
+ /* color.surface */
99
+ --cx-color-surface-base: light-dark(var(--cx-primitive-color-ash-50), var(--cx-primitive-color-ash-900));
100
+ --cx-color-surface-raised: light-dark(var(--cx-primitive-color-ash-0), var(--cx-primitive-color-ash-850));
101
+ --cx-color-surface-sunken: light-dark(var(--cx-primitive-color-ash-100), var(--cx-primitive-color-ash-950));
102
+ --cx-color-surface-hover: light-dark(var(--cx-primitive-color-ash-100), var(--cx-primitive-color-ash-800));
103
+ --cx-color-surface-inverse: light-dark(var(--cx-primitive-color-ash-900), var(--cx-primitive-color-ash-100));
104
+ --cx-color-surface-highlight: light-dark(var(--cx-primitive-color-sap-100), var(--cx-primitive-color-sap-800));
105
+
106
+ /* color.text */
107
+ --cx-color-text-primary: light-dark(var(--cx-primitive-color-ash-950), var(--cx-primitive-color-ash-100));
108
+ --cx-color-text-secondary: light-dark(var(--cx-primitive-color-ash-800), var(--cx-primitive-color-ash-300));
109
+ --cx-color-text-muted: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
110
+ --cx-color-text-accent: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
111
+ --cx-color-text-inverse: light-dark(var(--cx-primitive-color-ash-50), var(--cx-primitive-color-ash-900));
112
+ --cx-color-text-on-accent: light-dark(var(--cx-primitive-color-ash-0), var(--cx-primitive-color-ash-1000));
113
+
114
+ /* color.link */
115
+ --cx-color-link-rest: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-300));
116
+ --cx-color-link-hover: light-dark(var(--cx-primitive-color-sap-900), var(--cx-primitive-color-sap-200));
117
+
118
+ /* color.border */
119
+ --cx-color-border-subtle: light-dark(var(--cx-primitive-color-ash-200), var(--cx-primitive-color-ash-800));
120
+ --cx-color-border-default: light-dark(var(--cx-primitive-color-ash-300), var(--cx-primitive-color-ash-700));
121
+ --cx-color-border-strong: light-dark(var(--cx-primitive-color-ash-500), var(--cx-primitive-color-ash-500));
122
+
123
+ /* color.accent */
124
+ --cx-color-accent-fill-rest: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
125
+ --cx-color-accent-fill-hover: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
126
+ --cx-color-accent-border: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
127
+
128
+ /* color.focus */
129
+ --cx-color-focus-ring: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
130
+
131
+ /* color.ornament */
132
+ --cx-color-ornament-rest: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
133
+ --cx-color-ornament-strong: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
134
+ --cx-color-ornament-muted: light-dark(var(--cx-primitive-color-ash-400), var(--cx-primitive-color-ash-700));
135
+
136
+ /* color.status */
137
+ --cx-color-status-success-text: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
138
+ --cx-color-status-success-surface: light-dark(var(--cx-primitive-color-sap-50), var(--cx-primitive-color-sap-950));
139
+ --cx-color-status-success-border: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
140
+ --cx-color-status-warning-text: light-dark(var(--cx-primitive-color-weld-700), var(--cx-primitive-color-weld-300));
141
+ --cx-color-status-warning-surface: light-dark(var(--cx-primitive-color-weld-50), var(--cx-primitive-color-weld-950));
142
+ --cx-color-status-warning-border: light-dark(var(--cx-primitive-color-weld-600), var(--cx-primitive-color-weld-400));
143
+ --cx-color-status-danger-text: light-dark(var(--cx-primitive-color-madder-700), var(--cx-primitive-color-madder-300));
144
+ --cx-color-status-danger-surface: light-dark(var(--cx-primitive-color-madder-50), var(--cx-primitive-color-madder-950));
145
+ --cx-color-status-danger-border: light-dark(var(--cx-primitive-color-madder-600), var(--cx-primitive-color-madder-400));
146
+ --cx-color-status-info-text: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
147
+ --cx-color-status-info-surface: light-dark(var(--cx-primitive-color-woad-50), var(--cx-primitive-color-woad-950));
148
+ --cx-color-status-info-border: light-dark(var(--cx-primitive-color-woad-600), var(--cx-primitive-color-woad-400));
149
+
150
+ /* color.syntax */
151
+ --cx-color-syntax-comment: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
152
+ --cx-color-syntax-keyword: light-dark(var(--cx-primitive-color-madder-700), var(--cx-primitive-color-madder-300));
153
+ --cx-color-syntax-string: light-dark(var(--cx-primitive-color-sap-700), var(--cx-primitive-color-sap-300));
154
+ --cx-color-syntax-number: light-dark(var(--cx-primitive-color-weld-700), var(--cx-primitive-color-weld-300));
155
+ --cx-color-syntax-function: light-dark(var(--cx-primitive-color-woad-700), var(--cx-primitive-color-woad-300));
156
+ --cx-color-syntax-type: light-dark(var(--cx-primitive-color-woad-800), var(--cx-primitive-color-woad-200));
157
+ --cx-color-syntax-tag: light-dark(var(--cx-primitive-color-madder-800), var(--cx-primitive-color-madder-200));
158
+ --cx-color-syntax-attribute: light-dark(var(--cx-primitive-color-weld-800), var(--cx-primitive-color-weld-200));
159
+ --cx-color-syntax-variable: light-dark(var(--cx-primitive-color-ash-950), var(--cx-primitive-color-ash-100));
160
+ --cx-color-syntax-operator: light-dark(var(--cx-primitive-color-ash-800), var(--cx-primitive-color-ash-300));
161
+ --cx-color-syntax-meta: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
162
+ --cx-color-syntax-inserted: light-dark(var(--cx-primitive-color-sap-800), var(--cx-primitive-color-sap-200));
163
+ --cx-color-syntax-deleted: light-dark(var(--cx-primitive-color-madder-800), var(--cx-primitive-color-madder-200));
164
+ --cx-color-syntax-heading: light-dark(var(--cx-primitive-color-woad-800), var(--cx-primitive-color-woad-200));
165
+ --cx-color-syntax-line-number: light-dark(var(--cx-primitive-color-ash-700), var(--cx-primitive-color-ash-400));
166
+ --cx-color-syntax-line-highlight: light-dark(var(--cx-primitive-color-ash-200), var(--cx-primitive-color-ash-900));
167
+
168
+ /* color.data */
169
+ --cx-color-data-1: light-dark(var(--cx-primitive-color-woad-600), var(--cx-primitive-color-woad-400));
170
+ --cx-color-data-2: light-dark(var(--cx-primitive-color-sap-600), var(--cx-primitive-color-sap-400));
171
+ --cx-color-data-3: light-dark(var(--cx-primitive-color-madder-600), var(--cx-primitive-color-madder-400));
172
+ --cx-color-data-4: light-dark(var(--cx-primitive-color-weld-600), var(--cx-primitive-color-weld-400));
173
+ --cx-color-data-5: light-dark(var(--cx-primitive-color-ash-600), var(--cx-primitive-color-ash-400));
174
+
175
+ /* color.backdrop */
176
+ --cx-color-backdrop-tint: var(--cx-primitive-color-amount-3);
177
+ --cx-color-backdrop-grain: var(--cx-primitive-color-amount-2);
178
+ --cx-color-backdrop-saturation: var(--cx-primitive-color-amount-4);
179
+
180
+ /* color.wash */
181
+ --cx-color-wash-hover: var(--cx-primitive-color-amount-1);
182
+
183
+ /* primitive.motion.duration */
184
+ --cx-primitive-motion-duration-0: 0ms;
185
+ --cx-primitive-motion-duration-1: 120ms;
186
+ --cx-primitive-motion-duration-2: 200ms;
187
+ --cx-primitive-motion-duration-3: 320ms;
188
+ --cx-primitive-motion-duration-4: 1600ms;
189
+ --cx-primitive-motion-duration-5: 3200ms;
190
+ --cx-primitive-motion-duration-6: 60000ms;
191
+
192
+ /* primitive.motion.easing */
193
+ --cx-primitive-motion-easing-out-strong: cubic-bezier(0.2, 0, 0, 1);
194
+ --cx-primitive-motion-easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
195
+ --cx-primitive-motion-easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
196
+ --cx-primitive-motion-easing-linear: cubic-bezier(0, 0, 1, 1);
197
+ --cx-primitive-motion-easing-in-out: cubic-bezier(0.45, 0, 0.55, 1);
198
+
199
+ /* primitive.motion.distance */
200
+ --cx-primitive-motion-distance-1: 0.125rem;
201
+
202
+ /* motion.duration */
203
+ --cx-motion-duration-instant: var(--cx-primitive-motion-duration-0);
204
+ --cx-motion-duration-fast: var(--cx-primitive-motion-duration-1);
205
+ --cx-motion-duration-base: var(--cx-primitive-motion-duration-2);
206
+ --cx-motion-duration-slow: var(--cx-primitive-motion-duration-3);
207
+ --cx-motion-duration-plate: var(--cx-primitive-motion-duration-4);
208
+ --cx-motion-duration-drift: var(--cx-primitive-motion-duration-6);
209
+ --cx-motion-duration-pulse: var(--cx-primitive-motion-duration-5); /* Deprecated: Unused since the contour plate; removed in 2.0.0. */
210
+
211
+ /* motion.easing */
212
+ --cx-motion-easing-standard: var(--cx-primitive-motion-easing-out-strong);
213
+ --cx-motion-easing-enter: var(--cx-primitive-motion-easing-decelerate);
214
+ --cx-motion-easing-exit: var(--cx-primitive-motion-easing-accelerate);
215
+ --cx-motion-easing-linear: var(--cx-primitive-motion-easing-linear);
216
+ --cx-motion-easing-pulse: var(--cx-primitive-motion-easing-in-out); /* Deprecated: Unused since the contour plate; removed in 2.0.0. */
217
+
218
+ /* motion.distance */
219
+ --cx-motion-distance-nudge: var(--cx-primitive-motion-distance-1);
220
+
221
+ /* primitive.radius.0 */
222
+ --cx-primitive-radius-0: 0;
223
+
224
+ /* primitive.radius.1 */
225
+ --cx-primitive-radius-1: 2px;
226
+
227
+ /* primitive.radius.full */
228
+ --cx-primitive-radius-full: 9999px;
229
+
230
+ /* radius.none */
231
+ --cx-radius-none: var(--cx-primitive-radius-0);
232
+
233
+ /* radius.control */
234
+ --cx-radius-control: var(--cx-primitive-radius-0);
235
+
236
+ /* radius.pill */
237
+ --cx-radius-pill: var(--cx-primitive-radius-full);
238
+
239
+ /* radius.round */
240
+ --cx-radius-round: var(--cx-primitive-radius-full);
241
+
242
+ /* primitive.size.width */
243
+ --cx-primitive-size-width-xs: 15rem;
244
+ --cx-primitive-size-width-sm: 20rem;
245
+ --cx-primitive-size-width-md: 40rem;
246
+ --cx-primitive-size-width-lg: 60rem;
247
+ --cx-primitive-size-width-xl: 69rem;
248
+
249
+ /* primitive.size.measure */
250
+ --cx-primitive-size-measure-narrow: 52ch;
251
+ --cx-primitive-size-measure-base: 66ch;
252
+ --cx-primitive-size-measure-wide: 80ch;
253
+
254
+ /* primitive.size.control */
255
+ --cx-primitive-size-control-1: 1.5rem;
256
+ --cx-primitive-size-control-2: 2.5rem;
257
+ --cx-primitive-size-control-3: 2.75rem;
258
+
259
+ /* primitive.size.icon */
260
+ --cx-primitive-size-icon-1: 1rem;
261
+ --cx-primitive-size-icon-2: 1.25rem;
262
+ --cx-primitive-size-icon-3: 1.5rem;
263
+
264
+ /* primitive.size.glyph */
265
+ --cx-primitive-size-glyph-1: 0.75rem;
266
+ --cx-primitive-size-glyph-2: 1.5rem;
267
+ --cx-primitive-size-glyph-3: 2.25rem;
268
+ --cx-primitive-size-glyph-4: 3rem;
269
+
270
+ /* primitive.size.breakpoint */
271
+ --cx-primitive-size-breakpoint-sm: 30rem;
272
+ --cx-primitive-size-breakpoint-md: 48rem;
273
+ --cx-primitive-size-breakpoint-lg: 64rem;
274
+ --cx-primitive-size-breakpoint-xl: 80rem;
275
+
276
+ /* primitive.size.effect */
277
+ --cx-primitive-size-effect-1: 0.5rem;
278
+ --cx-primitive-size-effect-2: 30rem;
279
+
280
+ /* primitive.size.viewport */
281
+ --cx-primitive-size-viewport-1: 100lvh;
282
+
283
+ /* size.container */
284
+ --cx-size-container-page: var(--cx-primitive-size-width-xl);
285
+ --cx-size-container-breakout: var(--cx-primitive-size-width-lg);
286
+
287
+ /* size.measure */
288
+ --cx-size-measure-prose: var(--cx-primitive-size-measure-base);
289
+ --cx-size-measure-caption: var(--cx-primitive-size-measure-narrow);
290
+ --cx-size-measure-code: var(--cx-primitive-size-measure-wide);
291
+
292
+ /* size.column */
293
+ --cx-size-column-sidebar: var(--cx-primitive-size-width-xs);
294
+ --cx-size-column-card: var(--cx-primitive-size-width-sm);
295
+
296
+ /* size.target */
297
+ --cx-size-target-min: var(--cx-primitive-size-control-1);
298
+ --cx-size-target-control: var(--cx-primitive-size-control-2);
299
+ --cx-size-target-touch: var(--cx-primitive-size-control-3);
300
+
301
+ /* size.icon */
302
+ --cx-size-icon-sm: var(--cx-primitive-size-icon-1);
303
+ --cx-size-icon-md: var(--cx-primitive-size-icon-2);
304
+ --cx-size-icon-lg: var(--cx-primitive-size-icon-3);
305
+
306
+ /* size.ornament */
307
+ --cx-size-ornament-sm: var(--cx-primitive-size-glyph-1);
308
+ --cx-size-ornament-md: var(--cx-primitive-size-glyph-2);
309
+ --cx-size-ornament-lg: var(--cx-primitive-size-glyph-4);
310
+
311
+ /* size.mark */
312
+ --cx-size-mark-tick: var(--cx-primitive-space-2);
313
+
314
+ /* size.breakpoint */
315
+ --cx-size-breakpoint-md: var(--cx-primitive-size-breakpoint-md);
316
+ --cx-size-breakpoint-lg: var(--cx-primitive-size-breakpoint-lg);
317
+
318
+ /* size.backdrop */
319
+ --cx-size-backdrop-blur: var(--cx-primitive-size-effect-1);
320
+ --cx-size-backdrop-fade: var(--cx-primitive-size-effect-2);
321
+ --cx-size-backdrop-height: var(--cx-primitive-size-viewport-1);
322
+
323
+ /* primitive.space.0 */
324
+ --cx-primitive-space-0: 0;
325
+
326
+ /* primitive.space.1 */
327
+ --cx-primitive-space-1: 0.25rem;
328
+
329
+ /* primitive.space.2 */
330
+ --cx-primitive-space-2: 0.5rem;
331
+
332
+ /* primitive.space.3 */
333
+ --cx-primitive-space-3: 0.75rem;
334
+
335
+ /* primitive.space.4 */
336
+ --cx-primitive-space-4: 1rem;
337
+
338
+ /* primitive.space.5 */
339
+ --cx-primitive-space-5: 1.25rem;
340
+
341
+ /* primitive.space.6 */
342
+ --cx-primitive-space-6: 1.5rem;
343
+
344
+ /* primitive.space.8 */
345
+ --cx-primitive-space-8: 2rem;
346
+
347
+ /* primitive.space.10 */
348
+ --cx-primitive-space-10: 2.5rem;
349
+
350
+ /* primitive.space.12 */
351
+ --cx-primitive-space-12: 3rem;
352
+
353
+ /* primitive.space.16 */
354
+ --cx-primitive-space-16: 4rem;
355
+
356
+ /* primitive.space.20 */
357
+ --cx-primitive-space-20: 5rem;
358
+
359
+ /* primitive.space.24 */
360
+ --cx-primitive-space-24: 6rem;
361
+
362
+ /* space.inset */
363
+ --cx-space-inset-xs: var(--cx-primitive-space-1);
364
+ --cx-space-inset-sm: var(--cx-primitive-space-2);
365
+ --cx-space-inset-md: var(--cx-primitive-space-4);
366
+ --cx-space-inset-lg: var(--cx-primitive-space-6);
367
+ --cx-space-inset-xl: var(--cx-primitive-space-8);
368
+
369
+ /* space.stack */
370
+ --cx-space-stack-xs: var(--cx-primitive-space-1);
371
+ --cx-space-stack-sm: var(--cx-primitive-space-2);
372
+ --cx-space-stack-md: var(--cx-primitive-space-4);
373
+ --cx-space-stack-lg: var(--cx-primitive-space-6);
374
+ --cx-space-stack-xl: var(--cx-primitive-space-10);
375
+
376
+ /* space.inline */
377
+ --cx-space-inline-xs: var(--cx-primitive-space-1);
378
+ --cx-space-inline-sm: var(--cx-primitive-space-2);
379
+ --cx-space-inline-md: var(--cx-primitive-space-3);
380
+ --cx-space-inline-lg: var(--cx-primitive-space-4);
381
+
382
+ /* space.section */
383
+ --cx-space-section-sm: clamp(2rem, 1.6667rem + 1.4815vw, 3rem);
384
+ --cx-space-section-md: clamp(3rem, 2.6667rem + 1.4815vw, 4rem);
385
+ --cx-space-section-lg: clamp(4rem, 3.3333rem + 2.963vw, 6rem);
386
+
387
+ /* space.gutter */
388
+ --cx-space-gutter-page: clamp(1rem, 0.5rem + 2.2222vw, 2.5rem);
389
+ --cx-space-gutter-grid: clamp(1rem, 0.8333rem + 0.7407vw, 1.5rem);
390
+
391
+ /* primitive.font.family */
392
+ --cx-primitive-font-family-national-park: "National Park", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Roboto", sans-serif;
393
+ --cx-primitive-font-family-jetbrains-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", "Menlo", "Consolas", monospace;
394
+ --cx-primitive-font-family-yarndings-12: "Yarndings 12";
395
+
396
+ /* primitive.font.size */
397
+ --cx-primitive-font-size-1: 0.75rem;
398
+ --cx-primitive-font-size-2: clamp(0.875rem, 0.8667rem + 0.037vw, 0.9rem);
399
+ --cx-primitive-font-size-3: clamp(1.0625rem, 1.0417rem + 0.0926vw, 1.125rem);
400
+ --cx-primitive-font-size-4: clamp(1.275rem, 1.2313rem + 0.1941vw, 1.406rem);
401
+ --cx-primitive-font-size-5: clamp(1.53rem, 1.454rem + 0.3378vw, 1.758rem);
402
+ --cx-primitive-font-size-6: clamp(1.836rem, 1.7157rem + 0.5348vw, 2.197rem);
403
+ --cx-primitive-font-size-7: clamp(2.203rem, 2.0217rem + 0.8059vw, 2.747rem);
404
+ --cx-primitive-font-size-8: clamp(2.644rem, 2.381rem + 1.1689vw, 3.433rem);
405
+
406
+ /* primitive.font.weight */
407
+ --cx-primitive-font-weight-light: 300;
408
+ --cx-primitive-font-weight-regular: 400;
409
+ --cx-primitive-font-weight-medium: 500;
410
+ --cx-primitive-font-weight-semibold: 600;
411
+ --cx-primitive-font-weight-bold: 700;
412
+ --cx-primitive-font-weight-extrabold: 800;
413
+
414
+ /* primitive.font.line-height */
415
+ --cx-primitive-font-line-height-tight: 1.1;
416
+ --cx-primitive-font-line-height-snug: 1.25;
417
+ --cx-primitive-font-line-height-normal: 1.4;
418
+ --cx-primitive-font-line-height-relaxed: 1.6;
419
+
420
+ /* primitive.font.relative */
421
+ --cx-primitive-font-relative-code: 0.875em;
422
+
423
+ /* primitive.font.tracking */
424
+ --cx-primitive-font-tracking-tighter: -0.025em;
425
+ --cx-primitive-font-tracking-tight: -0.015em;
426
+ --cx-primitive-font-tracking-none: 0em;
427
+ --cx-primitive-font-tracking-wide: 0.04em;
428
+ --cx-primitive-font-tracking-wider: 0.08em;
429
+
430
+ /* font.family */
431
+ --cx-font-family-display: var(--cx-primitive-font-family-national-park);
432
+ --cx-font-family-body: var(--cx-primitive-font-family-national-park);
433
+ --cx-font-family-mono: var(--cx-primitive-font-family-jetbrains-mono);
434
+ --cx-font-family-ornament: var(--cx-primitive-font-family-yarndings-12);
435
+
436
+ /* font.size */
437
+ --cx-font-size-display: var(--cx-primitive-font-size-8);
438
+ --cx-font-size-heading-1: var(--cx-primitive-font-size-7);
439
+ --cx-font-size-heading-2: var(--cx-primitive-font-size-6);
440
+ --cx-font-size-heading-3: var(--cx-primitive-font-size-5);
441
+ --cx-font-size-heading-4: var(--cx-primitive-font-size-4);
442
+ --cx-font-size-lede: var(--cx-primitive-font-size-4);
443
+ --cx-font-size-body: var(--cx-primitive-font-size-3);
444
+ --cx-font-size-small: var(--cx-primitive-font-size-2);
445
+ --cx-font-size-label: var(--cx-primitive-font-size-1);
446
+ --cx-font-size-code-inline: var(--cx-primitive-font-relative-code);
447
+
448
+ /* font.weight */
449
+ --cx-font-weight-body: var(--cx-primitive-font-weight-regular);
450
+ --cx-font-weight-ui: var(--cx-primitive-font-weight-medium);
451
+ --cx-font-weight-strong: var(--cx-primitive-font-weight-semibold);
452
+ --cx-font-weight-heading: var(--cx-primitive-font-weight-semibold);
453
+ --cx-font-weight-display: var(--cx-primitive-font-weight-bold);
454
+
455
+ /* font.line-height */
456
+ --cx-font-line-height-display: var(--cx-primitive-font-line-height-tight);
457
+ --cx-font-line-height-heading: var(--cx-primitive-font-line-height-snug);
458
+ --cx-font-line-height-ui: var(--cx-primitive-font-line-height-normal);
459
+ --cx-font-line-height-body: var(--cx-primitive-font-line-height-relaxed);
460
+ --cx-font-line-height-code: var(--cx-primitive-font-line-height-relaxed);
461
+
462
+ /* font.tracking */
463
+ --cx-font-tracking-display: var(--cx-primitive-font-tracking-tighter);
464
+ --cx-font-tracking-heading: var(--cx-primitive-font-tracking-tight);
465
+ --cx-font-tracking-body: var(--cx-primitive-font-tracking-none);
466
+ --cx-font-tracking-label: var(--cx-primitive-font-tracking-wider);
467
+ --cx-font-tracking-ui: var(--cx-primitive-font-tracking-wide);
468
+ }
469
+ :root[data-theme="light"] { color-scheme: light; }
470
+ :root[data-theme="dark"] { color-scheme: dark; }
471
+
472
+ /* MotifSpec components. Every value is a --cx-* token; no raw colours, sizes or durations.
473
+ Class prefix: cx-. Layouts are intrinsic (flex-wrap, auto-fill grids), so no width media queries. */
474
+
475
+ /* ------------------------------------------------------------ base */
476
+ *, *::before, *::after { box-sizing: border-box; }
477
+ html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-padding-top: calc(var(--_header-height, var(--cx-size-target-touch)) + var(--cx-space-stack-xl)); }
478
+ /* --_header-height is the sticky header's measured height, set on <html> by dist/codex.js, so a heading reached by a
479
+ link clears the header even when it wraps to two rows. Without the script, one row is assumed. */
480
+ body {
481
+ margin: 0;
482
+ background: var(--cx-color-surface-base);
483
+ color: var(--cx-color-text-primary);
484
+ font-family: var(--cx-font-family-body);
485
+ font-size: var(--cx-font-size-body);
486
+ font-weight: var(--cx-font-weight-body);
487
+ line-height: var(--cx-font-line-height-body);
488
+ letter-spacing: var(--cx-font-tracking-body);
489
+ text-rendering: optimizeLegibility;
490
+ }
491
+ ::selection { background: var(--cx-color-surface-highlight); color: var(--cx-color-text-primary); }
492
+ :focus-visible { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
493
+ img, svg, video { max-width: 100%; height: auto; }
494
+ /* Controls that need script ship `hidden`; component display rules must never reveal them. */
495
+ [hidden]:not([hidden="until-found"]) { display: none !important; }
496
+ h1, h2, h3, h4 { text-wrap: balance; }
497
+ p, li, dd, figcaption { text-wrap: pretty; }
498
+ .cx-visually-hidden {
499
+ position: absolute; width: var(--cx-border-width-hairline); height: var(--cx-border-width-hairline);
500
+ margin: calc(var(--cx-border-width-hairline) * -1); padding: 0; overflow: hidden;
501
+ clip-path: inset(50%); white-space: nowrap; border: 0;
502
+ }
503
+ .cx-skip-link {
504
+ position: absolute; z-index: 100; left: var(--cx-space-gutter-page); top: var(--cx-space-inset-sm);
505
+ padding: var(--cx-space-inset-sm) var(--cx-space-inset-md);
506
+ background: var(--cx-color-accent-fill-rest); color: var(--cx-color-text-on-accent);
507
+ font-weight: var(--cx-font-weight-strong); transform: translateY(-200%);
508
+ }
509
+ .cx-skip-link:focus { transform: none; }
510
+
511
+ /* Shared label voice: mono, uppercase, tracked. */
512
+ .cx-eyebrow, .cx-label dt, .cx-table thead th, .cx-toc summary, .cx-code__bar, .cx-callout__title, .cx-footer h2, .cx-figure__plate {
513
+ font-family: var(--cx-font-family-mono);
514
+ font-size: var(--cx-font-size-label);
515
+ font-weight: var(--cx-font-weight-ui);
516
+ line-height: var(--cx-font-line-height-ui);
517
+ letter-spacing: var(--cx-font-tracking-label);
518
+ text-transform: uppercase;
519
+ }
520
+ .cx-eyebrow { margin: 0; color: var(--cx-color-text-accent); }
521
+
522
+ /* ------------------------------------------------------------ icons (Material Symbols sprite) and separators */
523
+ .cx-icon { display: inline-block; flex: none; width: var(--cx-size-icon-md); height: var(--cx-size-icon-md); fill: currentColor; vertical-align: middle; overflow: visible; pointer-events: none; }
524
+ .cx-icon--sm { width: var(--cx-size-icon-sm); height: var(--cx-size-icon-sm); }
525
+ .cx-icon--lg { width: var(--cx-size-icon-lg); height: var(--cx-size-icon-lg); }
526
+ .cx-sep { margin-inline: var(--cx-space-inline-xs); color: var(--cx-color-text-muted); font-weight: var(--cx-font-weight-body); }
527
+
528
+ /* ------------------------------------------------------------ layout */
529
+ .cx-container {
530
+ width: 100%;
531
+ max-width: calc(var(--cx-size-container-page) + 2 * var(--cx-space-gutter-page));
532
+ margin-inline: auto;
533
+ padding-left: max(var(--cx-space-gutter-page), env(safe-area-inset-left, 0px));
534
+ padding-right: max(var(--cx-space-gutter-page), env(safe-area-inset-right, 0px));
535
+ }
536
+ .cx-stack { display: flex; flex-direction: column; gap: var(--cx-space-stack-lg); }
537
+ .cx-section { padding-block: var(--cx-space-section-sm); }
538
+ .cx-section + .cx-section { border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
539
+ .cx-section__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--cx-space-stack-sm) var(--cx-space-inline-lg); margin-bottom: var(--cx-space-stack-lg); }
540
+ .cx-section__head h2 { margin: 0; font-size: var(--cx-font-size-heading-2); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
541
+ /* Article: TOC column and main column; wraps to one column with the TOC first. */
542
+ .cx-article { display: flex; flex-wrap: wrap; flex-direction: row-reverse; align-items: flex-start; gap: var(--cx-space-stack-xl) var(--cx-space-section-sm); }
543
+ .cx-article > .cx-article__main { flex: 999 1 0; min-width: min(100%, 60%); }
544
+ .cx-article > .cx-toc { flex: 1 1 var(--cx-size-column-sidebar); }
545
+
546
+ /* ------------------------------------------------------------ site header and nav */
547
+ .cx-header {
548
+ position: sticky; top: env(safe-area-inset-top, 0px); z-index: 10;
549
+ background: var(--cx-color-surface-base);
550
+ border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
551
+ /* One hover for every header control: a wash of the text colour, which shows on the plain surface and on the frost. */
552
+ --_wash: color-mix(in srgb, var(--cx-color-text-primary) var(--cx-color-wash-hover), transparent);
553
+ --_nav-pad: calc((var(--cx-space-inset-sm) + var(--cx-space-inset-md)) / 2);
554
+ }
555
+ .cx-header__inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 var(--cx-space-inline-lg); }
556
+ .cx-wordmark {
557
+ display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--cx-space-inline-sm);
558
+ min-height: var(--cx-size-target-touch); padding-block: var(--cx-space-inset-sm);
559
+ color: var(--cx-color-text-primary); text-decoration: none;
560
+ font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-heading-4);
561
+ font-weight: var(--cx-font-weight-display); letter-spacing: var(--cx-font-tracking-heading); line-height: var(--cx-font-line-height-ui);
562
+ }
563
+ .cx-wordmark__role {
564
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui);
565
+ letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted);
566
+ }
567
+ .cx-header__end { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; justify-content: flex-end; gap: var(--cx-space-inline-sm); }
568
+ .cx-nav { min-width: 0; }
569
+ /* Wrapped onto its own row (dist/codex.js sets data-wrapped), the nav starts at the left and is pulled out by its
570
+ pills' padding, so the link text lines up with the wordmark and the page text; the controls stay at the right. The
571
+ row keeps inset-xs below it, so the current page's pill doesn't sit on the header's bottom border. */
572
+ .cx-header[data-wrapped] .cx-header__end { justify-content: space-between; padding-block-end: var(--cx-space-inset-xs); }
573
+ /* A relative offset, not a margin: it moves the links without changing the row's width, so it can't change whether
574
+ the header wraps. */
575
+ .cx-header[data-wrapped] .cx-nav { position: relative; inset-inline-start: calc(var(--_nav-pad) * -1); }
576
+ .cx-nav ul { display: flex; gap: 0 var(--cx-space-inline-xs); margin: 0; padding: 0; list-style: none; overflow-x: auto; scrollbar-width: thin; }
577
+ .cx-nav li { flex: none; }
578
+ .cx-nav a {
579
+ /* Halfway between inset-sm and inset-md, so Work, Writing, About, the pause control and the toggle fit one row on a
580
+ 360px phone; narrower than that, the list scrolls inside its row. */
581
+ display: inline-flex; align-items: center; min-height: var(--cx-size-target-touch); padding-inline: var(--_nav-pad);
582
+ border-radius: var(--cx-radius-pill); color: var(--cx-color-text-secondary); text-decoration: none; font-weight: var(--cx-font-weight-ui);
583
+ transition: color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
584
+ }
585
+ /* Hover only where there is a pointer that hovers: on touch screens :hover sticks after a tap. */
586
+ @media (hover: hover) { .cx-nav a:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
587
+ /* The current section is highlighted, not underlined: a highlight fill with an accent outline, which is what stands out
588
+ from the surface (3:1), as the fill alone is close to it in both themes. Inset, so the pill keeps its size. */
589
+ .cx-nav a[aria-current="page"] {
590
+ color: var(--cx-color-text-primary); background: var(--cx-color-surface-highlight);
591
+ box-shadow: inset 0 0 0 var(--cx-border-width-hairline) var(--cx-color-accent-border);
592
+ }
593
+ /* Theme toggle: an icon-only pill (a circle) that shows the action, with a tooltip. */
594
+ .cx-theme-toggle {
595
+ position: relative; flex: none; display: inline-grid; place-items: center;
596
+ width: var(--cx-size-target-touch); height: var(--cx-size-target-touch); padding: 0;
597
+ border: 0; border-radius: var(--cx-radius-pill); background: transparent; color: var(--cx-color-text-secondary); cursor: pointer;
598
+ transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
599
+ }
600
+ @media (hover: hover) { .cx-theme-toggle:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
601
+ /* Backdrop pause: the same icon-only pill as the theme toggle. A native checkbox (checked = paused), so it works
602
+ without a click handler; it ships hidden and dist/plate.js reveals it when the backdrop starts to drift. */
603
+ .cx-backdrop__pause {
604
+ position: relative; flex: none; display: inline-grid; place-items: center;
605
+ width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
606
+ border-radius: var(--cx-radius-pill); color: var(--cx-color-text-secondary); cursor: pointer;
607
+ transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
608
+ }
609
+ @media (hover: hover) { .cx-backdrop__pause:hover { color: var(--cx-color-text-primary); background: var(--_wash); } }
610
+ .cx-backdrop__pause:has(:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
611
+ .cx-backdrop__pause :is(.cx-icon, .cx-tooltip [data-when]) { display: none; }
612
+ .cx-backdrop__pause:not(:has(:checked)) [data-when="running"],
613
+ .cx-backdrop__pause:has(:checked) [data-when="paused"] { display: inline-block; }
614
+ .cx-theme-toggle .cx-icon { display: none; }
615
+ .cx-theme-toggle [data-icon="to-dark"] { display: inline-block; }
616
+ :root[data-theme="dark"] .cx-theme-toggle [data-icon="to-dark"] { display: none; }
617
+ :root[data-theme="dark"] .cx-theme-toggle [data-icon="to-light"] { display: inline-block; }
618
+ @media (prefers-color-scheme: dark) {
619
+ :root:not([data-theme="light"]) .cx-theme-toggle [data-icon="to-dark"] { display: none; }
620
+ :root:not([data-theme="light"]) .cx-theme-toggle [data-icon="to-light"] { display: inline-block; }
621
+ }
622
+
623
+ /* Tooltip: a short label for an icon-only control, shown on hover and keyboard focus. */
624
+ .cx-tooltip {
625
+ position: absolute; z-index: 30; top: 100%; right: 0; width: max-content; max-width: var(--cx-size-column-card);
626
+ border-top: var(--cx-space-inset-xs) solid transparent; background-clip: padding-box;
627
+ padding: var(--cx-space-inset-xs) var(--cx-space-inset-sm);
628
+ background-color: var(--cx-color-surface-inverse); color: var(--cx-color-text-inverse);
629
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui);
630
+ letter-spacing: var(--cx-font-tracking-ui); line-height: var(--cx-font-line-height-ui); text-align: left; text-transform: none; white-space: nowrap;
631
+ opacity: 0; visibility: hidden; pointer-events: none;
632
+ transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), visibility var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
633
+ }
634
+ .cx-tooltip--start { right: auto; left: 0; }
635
+ .cx-tooltip--above { top: auto; bottom: 100%; border-top: 0; border-bottom: var(--cx-space-inset-xs) solid transparent; }
636
+
637
+ /* Version link: a version number that opens the changelog. */
638
+ .cx-version {
639
+ position: relative; display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs);
640
+ color: inherit; text-decoration: none; font-variant-numeric: tabular-nums;
641
+ }
642
+ .cx-version:hover { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
643
+ /* Escape adds .is-tooltip-dismissed to the control until the pointer leaves or focus moves. */
644
+ :is(button, a, [tabindex]):is(:hover, :focus-visible):not(.is-tooltip-dismissed) > .cx-tooltip,
645
+ label:is(:hover, :has(:focus-visible)):not(.is-tooltip-dismissed) > .cx-tooltip { opacity: 1; visibility: visible; }
646
+
647
+ /* ------------------------------------------------------------ footer and ornament band */
648
+ .cx-band {
649
+ display: block; overflow: hidden; white-space: nowrap; user-select: none;
650
+ font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display);
651
+ color: var(--cx-color-ornament-rest);
652
+ }
653
+ .cx-band::before { content: "kWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkWkW"; } /* 1,024 glyphs: wider than an 8K screen at 12px */
654
+ .cx-footer { margin-top: var(--cx-space-section-lg); border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); background: var(--cx-color-surface-raised); }
655
+ .cx-footer .cx-band { padding-block: var(--cx-space-inset-md); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
656
+ /* Columns of equal width that wrap: a link list needs half a sidebar column, prose (the colophon) a whole one. On a
657
+ phone the link lists sit side by side and the colophon takes the row below. */
658
+ .cx-footer__grid {
659
+ display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-lg) var(--cx-space-gutter-grid);
660
+ padding-block: var(--cx-space-inset-xl);
661
+ }
662
+ .cx-footer__grid > * { flex: 1 1 0; min-width: min(100%, var(--cx-size-column-sidebar)); }
663
+ .cx-footer__grid > :has(> ul) { min-width: calc(var(--cx-size-column-sidebar) / 2); }
664
+ .cx-footer h2 { margin: 0 0 var(--cx-space-stack-sm); color: var(--cx-color-text-muted); }
665
+ .cx-footer ul { margin: 0; padding: 0; list-style: none; }
666
+ .cx-footer li a {
667
+ display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min);
668
+ color: var(--cx-color-text-secondary); text-decoration: none; font-size: var(--cx-font-size-small);
669
+ }
670
+ .cx-footer li a:hover { color: var(--cx-color-link-hover); text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
671
+ .cx-footer p { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-caption); }
672
+ .cx-footer__base {
673
+ display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--cx-space-stack-sm) var(--cx-space-inline-lg);
674
+ padding-block: var(--cx-space-inset-md); border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
675
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); color: var(--cx-color-text-muted);
676
+ }
677
+ .cx-footer__base a { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); color: inherit; }
678
+
679
+ /* ------------------------------------------------------------ accession label (signature) */
680
+ .cx-label {
681
+ position: relative; display: flex; flex-wrap: wrap; margin: var(--cx-size-mark-tick);
682
+ padding: 0; background: var(--cx-color-surface-raised);
683
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-default);
684
+ /* The same line again as an outline over the border: outlines paint above children, so the cells' rules that run
685
+ out to the edge disappear under it and the frame stays one colour. */
686
+ outline: var(--cx-border-width-hairline) solid var(--cx-color-border-default); outline-offset: calc(var(--cx-border-width-hairline) * -1);
687
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); line-height: var(--cx-font-line-height-ui);
688
+ }
689
+ /* Registration ticks: eight hairlines extending each edge past the corners. */
690
+ .cx-label::before, .cx-plate-frame::before {
691
+ content: ""; position: absolute; pointer-events: none;
692
+ inset: calc(var(--cx-size-mark-tick) * -1 - var(--cx-border-width-hairline));
693
+ --_t: var(--cx-size-mark-tick); --_h: var(--cx-border-width-hairline); --_c: var(--cx-color-ornament-muted);
694
+ background:
695
+ linear-gradient(var(--_c), var(--_c)) left 0 top var(--_t) / var(--_t) var(--_h) no-repeat,
696
+ linear-gradient(var(--_c), var(--_c)) left var(--_t) top 0 / var(--_h) var(--_t) no-repeat,
697
+ linear-gradient(var(--_c), var(--_c)) right 0 top var(--_t) / var(--_t) var(--_h) no-repeat,
698
+ linear-gradient(var(--_c), var(--_c)) right var(--_t) top 0 / var(--_h) var(--_t) no-repeat,
699
+ linear-gradient(var(--_c), var(--_c)) left 0 bottom var(--_t) / var(--_t) var(--_h) no-repeat,
700
+ linear-gradient(var(--_c), var(--_c)) left var(--_t) bottom 0 / var(--_h) var(--_t) no-repeat,
701
+ linear-gradient(var(--_c), var(--_c)) right 0 bottom var(--_t) / var(--_t) var(--_h) no-repeat,
702
+ linear-gradient(var(--_c), var(--_c)) right var(--_t) bottom 0 / var(--_h) var(--_t) no-repeat;
703
+ }
704
+ /* Cells: a rule on the right and below each one. They grow to fill their row, so when the fields wrap onto several
705
+ rows each row is closed by a full-width rule; the negative margins push the rules on the outer edges under the frame. */
706
+ .cx-label > div {
707
+ flex: 1 1 auto; display: flex; flex-direction: column; gap: var(--cx-space-stack-xs); padding: var(--cx-space-inset-sm) var(--cx-space-inset-md);
708
+ margin: 0 calc(var(--cx-border-width-hairline) * -1) calc(var(--cx-border-width-hairline) * -1) 0;
709
+ border-right: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
710
+ border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
711
+ }
712
+ .cx-label dt { color: var(--cx-color-text-muted); }
713
+ .cx-label dd { margin: 0; color: var(--cx-color-text-primary); font-weight: var(--cx-font-weight-ui); font-variant-numeric: tabular-nums; }
714
+ .cx-label dd a { color: var(--cx-color-link-rest); }
715
+ .cx-label .cx-label__id dd { color: var(--cx-color-text-accent); }
716
+ /* A case study shows its label twice in the markup. Below the md breakpoint the lead label above the title keeps
717
+ only the number, date and status (role and stack are __detail fields), so the title stays near the top of a
718
+ phone screen; the full label follows the article as a card. From md up the lead label is complete and the card
719
+ is not shown. */
720
+ @media (width < 48rem) { .cx-label--lead .cx-label__detail { display: none; } }
721
+ @media (width >= 48rem) { .cx-label--card { display: none; } }
722
+ /* Compact inline form for cards and list rows. */
723
+ .cx-id {
724
+ display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0 var(--cx-space-inline-sm); margin: 0;
725
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui);
726
+ font-variant-numeric: tabular-nums; color: var(--cx-color-text-muted); line-height: var(--cx-font-line-height-ui);
727
+ }
728
+ .cx-id__no { color: var(--cx-color-text-accent); font-weight: var(--cx-font-weight-ui); }
729
+ .cx-id > * + *::before { content: "|" / ""; order: -2; margin-right: var(--cx-space-inline-sm); color: var(--cx-color-text-muted); }
730
+ .cx-status { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); text-transform: uppercase; letter-spacing: var(--cx-font-tracking-label); }
731
+ .cx-status::after { content: ""; order: -1; width: var(--cx-space-inset-sm); height: var(--cx-space-inset-sm); border-radius: var(--cx-radius-round); background: currentColor; }
732
+ .cx-status--live { color: var(--cx-color-status-success-text); }
733
+ .cx-status--building { color: var(--cx-color-status-warning-text); }
734
+ .cx-status--archived { color: var(--cx-color-text-muted); }
735
+
736
+ /* ------------------------------------------------------------ tag */
737
+ .cx-tags { display: flex; flex-wrap: wrap; gap: var(--cx-space-inline-sm); margin: 0; padding: 0; list-style: none; }
738
+ .cx-tag {
739
+ display: inline-flex; align-items: center; min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-sm);
740
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); border-radius: var(--cx-radius-none);
741
+ background: var(--cx-color-surface-sunken); color: var(--cx-color-text-secondary);
742
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui);
743
+ line-height: var(--cx-font-line-height-ui); text-transform: lowercase; text-decoration: none; white-space: nowrap;
744
+ }
745
+ a.cx-tag { position: relative; z-index: 2; transition: border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard); }
746
+ a.cx-tag:hover { border-color: var(--cx-color-accent-border); color: var(--cx-color-text-primary); }
747
+ .cx-tag[aria-current="page"] { border-color: var(--cx-color-accent-border); color: var(--cx-color-text-primary); }
748
+ .cx-tag__count { margin-left: var(--cx-space-inline-xs); color: var(--cx-color-text-muted); }
749
+
750
+ /* ------------------------------------------------------------ button and link */
751
+ .cx-actions { display: flex; flex-wrap: wrap; gap: var(--cx-space-inline-md); }
752
+ .cx-button {
753
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--cx-space-inline-sm);
754
+ min-height: var(--cx-size-target-control); padding-inline: var(--cx-space-inset-lg);
755
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
756
+ background: var(--cx-color-surface-raised); color: var(--cx-color-text-primary); cursor: pointer;
757
+ font-family: var(--cx-font-family-body); font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-strong);
758
+ line-height: var(--cx-font-line-height-ui); text-decoration: none;
759
+ transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
760
+ }
761
+ .cx-button:hover { background: var(--cx-color-surface-hover); }
762
+ .cx-button--primary { border-color: var(--cx-color-accent-fill-rest); background: var(--cx-color-accent-fill-rest); color: var(--cx-color-text-on-accent); }
763
+ .cx-button--primary:hover { border-color: var(--cx-color-accent-fill-hover); background: var(--cx-color-accent-fill-hover); }
764
+ .cx-button[disabled], .cx-button[aria-disabled="true"] { cursor: not-allowed; border-style: dashed; background: transparent; color: var(--cx-color-text-muted); }
765
+ .cx-button__arrow { display: inline-block; transition: transform var(--cx-motion-duration-fast) var(--cx-motion-easing-standard); }
766
+ .cx-button:hover .cx-button__arrow, .cx-link:hover .cx-button__arrow, .cx-pagination__link[rel="next"]:hover .cx-button__arrow { transform: translateX(var(--cx-motion-distance-nudge)); }
767
+ .cx-back:hover .cx-button__arrow, .cx-pagination__link[rel="prev"]:hover .cx-button__arrow { transform: translateX(calc(var(--cx-motion-distance-nudge) * -1)); }
768
+ .cx-link, .cx-back {
769
+ display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min);
770
+ color: var(--cx-color-link-rest); font-weight: var(--cx-font-weight-strong); text-decoration: underline;
771
+ text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs);
772
+ }
773
+ .cx-link:hover, .cx-back:hover { color: var(--cx-color-link-hover); text-decoration-thickness: var(--cx-border-width-emphasis); }
774
+ .cx-back { font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-weight: var(--cx-font-weight-ui); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; text-decoration: none; }
775
+
776
+ /* ------------------------------------------------------------ prose */
777
+ .cx-prose { min-width: 0; }
778
+ .cx-prose > * { margin-block: 0; }
779
+ .cx-prose > * + * { margin-block-start: var(--cx-space-stack-md); }
780
+ .cx-prose > :where(p, ul, ol, dl, blockquote, h2, h3, h4) { max-width: var(--cx-size-measure-prose); }
781
+ .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout) { max-width: var(--cx-size-measure-prose); }
782
+ .cx-prose > :where(.cx-figure--breakout, .cx-code--breakout, .cx-table--breakout) { max-width: var(--cx-size-container-breakout); }
783
+ .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout, hr) { margin-block-start: var(--cx-space-stack-lg); }
784
+ .cx-prose > :where(.cx-code, .cx-figure, .cx-table, .cx-callout) + * { margin-block-start: var(--cx-space-stack-lg); }
785
+ /* Code blocks and figures are <figure> elements: drop the browser's margins with no specificity, so the prose rhythm above still applies. */
786
+ :where(.cx-code, .cx-figure) { margin: 0; }
787
+ .cx-prose h2 {
788
+ margin-block-start: var(--cx-space-stack-xl); padding-block-start: var(--cx-space-stack-md);
789
+ border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
790
+ font-size: var(--cx-font-size-heading-2); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading);
791
+ }
792
+ .cx-prose h3 { margin-block-start: var(--cx-space-stack-lg); font-size: var(--cx-font-size-heading-3); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
793
+ .cx-prose h4 { margin-block-start: var(--cx-space-stack-lg); font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); }
794
+ .cx-prose :is(h2, h3, h4) + * { margin-block-start: var(--cx-space-stack-sm); }
795
+ /* Heading anchor: a "#" after any section heading that has an id (prose, page sections, docs). */
796
+ /* A 44px round target, like the theme toggle; negative block margins keep it from stretching the line. */
797
+ .cx-anchor {
798
+ display: inline-grid; place-items: center; width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
799
+ margin-left: var(--cx-space-inline-xs); margin-block: calc((var(--cx-size-target-touch) - var(--cx-size-icon-lg)) / -2);
800
+ border-radius: var(--cx-radius-pill); color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono);
801
+ font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-ui); letter-spacing: var(--cx-font-tracking-body);
802
+ line-height: var(--cx-font-line-height-ui); text-decoration: none; vertical-align: middle; opacity: 0;
803
+ transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
804
+ }
805
+ :is(h2, h3, h4):hover > .cx-anchor, .cx-anchor:focus-visible, :target > .cx-anchor { opacity: 1; }
806
+ .cx-anchor:hover { color: var(--cx-color-text-primary); background: var(--cx-color-surface-hover); }
807
+ @media (hover: none) { .cx-anchor { opacity: 1; } }
808
+ .cx-prose a:not([class]) { color: var(--cx-color-link-rest); text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
809
+ .cx-prose a:not([class]):hover { color: var(--cx-color-link-hover); text-decoration-thickness: var(--cx-border-width-emphasis); }
810
+ .cx-prose strong { font-weight: var(--cx-font-weight-strong); }
811
+ .cx-prose :where(ul, ol) { padding-inline-start: var(--cx-space-inset-lg); }
812
+ .cx-prose li + li { margin-block-start: var(--cx-space-stack-sm); }
813
+ .cx-prose ul { list-style: square; }
814
+ .cx-prose ul > li::marker { color: var(--cx-color-ornament-rest); }
815
+ .cx-prose ol { list-style: decimal-leading-zero; }
816
+ .cx-prose ol > li::marker { color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); }
817
+ .cx-prose blockquote {
818
+ margin-inline: 0; padding-inline-start: var(--cx-space-inset-md);
819
+ border-left: var(--cx-border-width-emphasis) solid var(--cx-color-accent-border);
820
+ color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-lede); line-height: var(--cx-font-line-height-heading);
821
+ }
822
+ .cx-prose blockquote > * { margin: 0; }
823
+ .cx-prose blockquote cite { font-style: normal; }
824
+ .cx-prose blockquote footer { margin-top: var(--cx-space-stack-sm); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted); }
825
+ .cx-prose :not(pre) > code, .cx-code-inline {
826
+ padding-inline: var(--cx-space-inset-xs); border: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
827
+ background: var(--cx-color-surface-sunken); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-code-inline);
828
+ overflow-wrap: anywhere;
829
+ }
830
+ .cx-prose kbd {
831
+ padding-inline: var(--cx-space-inset-xs); border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong);
832
+ border-bottom-width: var(--cx-border-width-emphasis); border-radius: var(--cx-radius-control);
833
+ background: var(--cx-color-surface-sunken); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-code-inline);
834
+ }
835
+ .cx-prose mark { background: var(--cx-color-surface-highlight); color: var(--cx-color-text-primary); }
836
+ .cx-prose hr, .cx-divider {
837
+ display: block; width: 100%; height: auto; border: 0; text-align: center; overflow: visible;
838
+ font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest);
839
+ }
840
+ .cx-prose hr::after, .cx-divider::after { content: "k W k"; letter-spacing: var(--cx-font-tracking-label); }
841
+ .cx-end-mark { display: inline-block; margin-left: var(--cx-space-inline-sm); font-family: var(--cx-font-family-ornament); font-size: var(--cx-size-ornament-sm); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest); }
842
+ .cx-lede { margin: 0; max-width: var(--cx-size-measure-prose); color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-lede); line-height: var(--cx-font-line-height-heading); }
843
+
844
+ /* ------------------------------------------------------------ page heading */
845
+ .cx-page-head { display: flex; flex-direction: column; gap: var(--cx-space-stack-md); padding-block: var(--cx-space-section-sm) var(--cx-space-stack-lg); }
846
+ .cx-page-head h1, .cx-h1 {
847
+ margin: 0; max-width: var(--cx-size-measure-code);
848
+ font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-heading-1); font-weight: var(--cx-font-weight-display);
849
+ line-height: var(--cx-font-line-height-display); letter-spacing: var(--cx-font-tracking-display);
850
+ }
851
+ .cx-display {
852
+ margin: 0; max-width: var(--cx-size-measure-caption);
853
+ font-family: var(--cx-font-family-display); font-size: var(--cx-font-size-display); font-weight: var(--cx-font-weight-display);
854
+ line-height: var(--cx-font-line-height-display); letter-spacing: var(--cx-font-tracking-display);
855
+ }
856
+ .cx-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--cx-space-stack-xs) var(--cx-space-inline-md); margin: 0; font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; }
857
+
858
+ /* ------------------------------------------------------------ code block */
859
+ .cx-code { min-width: 0; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-sunken); }
860
+ .cx-code__bar {
861
+ display: flex; flex-wrap: wrap; align-items: center; gap: var(--cx-space-inline-md); min-height: var(--cx-size-target-control);
862
+ padding-block: var(--cx-space-inset-sm); padding-inline: var(--cx-space-inset-md) var(--cx-space-inset-sm); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
863
+ color: var(--cx-color-text-muted);
864
+ }
865
+ .cx-code__file { color: var(--cx-color-text-secondary); text-transform: none; letter-spacing: var(--cx-font-tracking-ui); }
866
+ .cx-code__copy {
867
+ margin-left: auto; display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-sm) var(--cx-space-inset-md);
868
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
869
+ background: var(--cx-color-surface-raised); color: var(--cx-color-text-secondary); cursor: pointer;
870
+ font: inherit; letter-spacing: inherit; text-transform: inherit;
871
+ }
872
+ .cx-code__copy:hover { color: var(--cx-color-text-primary); }
873
+ .cx-code__copy[data-state="copied"] { color: var(--cx-color-status-success-text); border-color: var(--cx-color-status-success-border); }
874
+ .cx-code pre {
875
+ margin: 0; padding: var(--cx-space-inset-md) var(--cx-space-inset-lg); overflow-x: auto;
876
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-code);
877
+ tab-size: 2; font-variant-ligatures: none;
878
+ }
879
+ .cx-code pre code { font: inherit; }
880
+ .cx-code .line { display: block; }
881
+ .cx-code .ln, .cx-code .lnt { display: inline-block; margin-right: var(--cx-space-inline-lg); text-align: right; user-select: none; }
882
+ .cx-code .hl { display: block; margin-inline: calc(var(--cx-space-inset-lg) * -1); padding-inline: var(--cx-space-inset-lg); box-shadow: inset var(--cx-border-width-emphasis) 0 0 var(--cx-color-accent-border); }
883
+
884
+ /* ------------------------------------------------------------ figure and caption */
885
+ .cx-figure { display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); min-width: 0; }
886
+ .cx-figure__frame { overflow: auto; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
887
+ .cx-figure__frame > :where(img, svg) { display: block; width: 100%; height: auto; }
888
+ /* Diagrams keep a legible text size and scroll inside the frame on narrow screens. */
889
+ .cx-figure--diagram .cx-figure__frame > svg { min-width: calc(var(--cx-size-column-card) * 2); }
890
+ .cx-figure figcaption { display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-xs) var(--cx-space-inline-md); max-width: var(--cx-size-measure-caption); color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-ui); }
891
+ .cx-figure__plate { color: var(--cx-color-text-accent); }
892
+
893
+ /* ------------------------------------------------------------ callout */
894
+ .cx-callout {
895
+ --_border: var(--cx-color-status-info-border); --_bg: var(--cx-color-status-info-surface); --_title: var(--cx-color-status-info-text);
896
+ display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); padding: var(--cx-space-inset-md);
897
+ border: var(--cx-border-width-hairline) solid var(--_border); border-left-width: var(--cx-border-width-emphasis);
898
+ background: var(--_bg); color: var(--cx-color-text-primary);
899
+ }
900
+ .cx-callout > * { margin: 0; }
901
+ .cx-callout__title { display: flex; align-items: center; gap: var(--cx-space-inline-sm); color: var(--_title); }
902
+ .cx-callout--tip { --_border: var(--cx-color-status-success-border); --_bg: var(--cx-color-status-success-surface); --_title: var(--cx-color-status-success-text); }
903
+ .cx-callout--warning { --_border: var(--cx-color-status-warning-border); --_bg: var(--cx-color-status-warning-surface); --_title: var(--cx-color-status-warning-text); }
904
+ .cx-callout--danger { --_border: var(--cx-color-status-danger-border); --_bg: var(--cx-color-status-danger-surface); --_title: var(--cx-color-status-danger-text); }
905
+
906
+ /* ------------------------------------------------------------ data table */
907
+ .cx-table { min-width: 0; overflow-x: auto; border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
908
+ .cx-table table { width: 100%; border-collapse: collapse; font-size: var(--cx-font-size-small); line-height: var(--cx-font-line-height-ui); }
909
+ .cx-table caption { padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); text-align: left; caption-side: top; color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
910
+ .cx-table th, .cx-table td { padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); text-align: left; vertical-align: top; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); }
911
+ .cx-table thead th { background: var(--cx-color-surface-sunken); color: var(--cx-color-text-secondary); white-space: nowrap; }
912
+ .cx-table tbody th { font-weight: var(--cx-font-weight-strong); }
913
+ .cx-table tbody tr:last-child > * { border-bottom: 0; }
914
+ .cx-table tbody tr:hover > * { background: var(--cx-color-surface-hover); }
915
+ .cx-table .is-num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--cx-font-family-mono); }
916
+ .cx-table code { font-family: var(--cx-font-family-mono); }
917
+
918
+ /* ------------------------------------------------------------ project card */
919
+ .cx-cards { display: grid; gap: var(--cx-space-gutter-grid); grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--cx-size-column-card)), 1fr)); margin: 0; padding: 0; list-style: none; }
920
+ .cx-card {
921
+ position: relative; display: flex; flex-direction: column; height: 100%;
922
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised);
923
+ transition: border-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
924
+ }
925
+ .cx-card:hover { border-color: var(--cx-color-border-strong); }
926
+ .cx-card:focus-within { border-color: var(--cx-color-border-strong); }
927
+ .cx-card__media { aspect-ratio: 16 / 10; max-width: 100%; overflow: hidden; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle); background: var(--cx-color-surface-sunken); }
928
+ .cx-card__media > :where(img, svg) { display: block; width: 100%; height: 100%; object-fit: cover; }
929
+ .cx-card__body { display: flex; flex: 1; flex-direction: column; gap: var(--cx-space-stack-sm); padding: var(--cx-space-inset-md); }
930
+ .cx-card__title { margin: 0; font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
931
+ .cx-card__link { color: var(--cx-color-text-primary); text-decoration: none; }
932
+ .cx-card__link::after { content: ""; position: absolute; inset: 0; z-index: 1; }
933
+ .cx-card__link:hover, .cx-card__link:focus-visible { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
934
+ .cx-card__link:focus-visible { outline: none; }
935
+ .cx-card:has(.cx-card__link:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
936
+ .cx-card__summary { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-caption); }
937
+ .cx-card .cx-tags { margin-top: auto; padding-top: var(--cx-space-stack-sm); }
938
+
939
+ /* ------------------------------------------------------------ post list item (ledger row) */
940
+ .cx-posts { margin: 0; padding: 0; list-style: none; border-top: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
941
+ .cx-post {
942
+ position: relative; display: flex; flex-wrap: wrap; gap: var(--cx-space-stack-xs) var(--cx-space-inline-lg);
943
+ padding: var(--cx-space-inset-md) var(--cx-space-inset-sm); border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-subtle);
944
+ transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
945
+ }
946
+ .cx-post:hover { background: var(--cx-color-surface-hover); }
947
+ .cx-post__meta { flex: 0 0 calc(var(--cx-size-column-sidebar) / 2); display: flex; flex-direction: column; gap: var(--cx-space-stack-xs); margin: 0; font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; line-height: var(--cx-font-line-height-ui); }
948
+ .cx-post__meta .cx-id__no { color: var(--cx-color-text-accent); }
949
+ .cx-post__main { flex: 1 1 var(--cx-size-column-card); min-width: 0; display: flex; flex-direction: column; gap: var(--cx-space-stack-sm); }
950
+ .cx-post__title { margin: 0; font-size: var(--cx-font-size-heading-4); font-weight: var(--cx-font-weight-heading); line-height: var(--cx-font-line-height-heading); letter-spacing: var(--cx-font-tracking-heading); }
951
+ .cx-post__title a { color: var(--cx-color-text-primary); text-decoration: none; }
952
+ .cx-post__title a::after { content: ""; position: absolute; inset: 0; z-index: 1; }
953
+ .cx-post__title a:hover { text-decoration: underline; text-decoration-thickness: var(--cx-border-width-hairline); text-underline-offset: var(--cx-space-inline-xs); }
954
+ .cx-post__title a:focus-visible { outline: none; }
955
+ .cx-post:has(.cx-post__title a:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: calc(var(--cx-border-focus-offset) * -1); }
956
+ .cx-post__summary { margin: 0; color: var(--cx-color-text-secondary); font-size: var(--cx-font-size-small); max-width: var(--cx-size-measure-prose); }
957
+ .cx-posts__year { margin: var(--cx-space-stack-lg) 0 0; padding: var(--cx-space-inset-sm); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-ui); color: var(--cx-color-text-secondary); font-variant-numeric: tabular-nums; border-bottom: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
958
+
959
+ /* ------------------------------------------------------------ pagination */
960
+ .cx-pagination { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); }
961
+ .cx-pagination__link {
962
+ display: flex; flex-direction: column; justify-content: center; gap: var(--cx-space-stack-xs); min-width: 0; min-height: var(--cx-size-target-touch);
963
+ padding: var(--cx-space-inset-sm) var(--cx-space-inset-md); color: var(--cx-color-text-primary); text-decoration: none;
964
+ transition: background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
965
+ }
966
+ .cx-pagination__link:hover { background: var(--cx-color-surface-hover); }
967
+ .cx-pagination__link[rel="next"] { align-items: flex-end; text-align: right; }
968
+ .cx-pagination__dir { display: inline-flex; align-items: center; gap: var(--cx-space-inline-xs); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-label); text-transform: uppercase; color: var(--cx-color-text-muted); }
969
+ .cx-pagination__link:hover .cx-pagination__dir { color: var(--cx-color-text-accent); }
970
+ .cx-pagination__title { font-size: var(--cx-font-size-small); font-weight: var(--cx-font-weight-strong); line-height: var(--cx-font-line-height-heading); }
971
+ .cx-pagination__status {
972
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--cx-space-stack-xs);
973
+ padding-inline: var(--cx-space-inset-md); border-inline: var(--cx-border-width-hairline) solid var(--cx-color-border-default);
974
+ font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); color: var(--cx-color-text-muted); font-variant-numeric: tabular-nums; text-align: center;
975
+ }
976
+ .cx-pagination__status strong { color: var(--cx-color-text-primary); font-weight: var(--cx-font-weight-ui); }
977
+ .cx-pagination [aria-disabled="true"] { color: var(--cx-color-text-muted); pointer-events: none; }
978
+
979
+ /* ------------------------------------------------------------ table of contents */
980
+ .cx-toc { min-width: 0; font-size: var(--cx-font-size-small); }
981
+ .cx-toc.is-docked { position: sticky; top: calc(var(--_header-height, var(--cx-size-target-touch)) + var(--cx-space-stack-xl)); }
982
+ .cx-toc details { border-left: var(--cx-border-width-hairline) solid var(--cx-color-border-default); }
983
+ .cx-toc summary { display: flex; align-items: center; min-height: var(--cx-size-target-min); padding-inline: var(--cx-space-inset-md); color: var(--cx-color-text-muted); cursor: pointer; list-style: none; }
984
+ .cx-toc summary::-webkit-details-marker { display: none; }
985
+ .cx-toc__chevron { margin-left: auto; transition: transform var(--cx-motion-duration-base) var(--cx-motion-easing-standard); }
986
+ .cx-toc details[open] .cx-toc__chevron { transform: rotate(180deg); }
987
+ .cx-toc ol { margin: 0; padding: 0; list-style: none; }
988
+ .cx-toc ol ol { padding-left: var(--cx-space-inset-md); }
989
+ .cx-toc a {
990
+ display: flex; gap: var(--cx-space-inline-sm); min-height: var(--cx-size-target-min); align-items: center;
991
+ margin-left: calc(var(--cx-border-width-hairline) * -1); padding: var(--cx-space-inset-xs) var(--cx-space-inset-md);
992
+ border-left: var(--cx-border-width-emphasis) solid transparent; color: var(--cx-color-text-secondary); text-decoration: none; line-height: var(--cx-font-line-height-ui);
993
+ transition: color var(--cx-motion-duration-base) var(--cx-motion-easing-standard), border-color var(--cx-motion-duration-base) var(--cx-motion-easing-standard);
994
+ }
995
+ .cx-toc a:hover { color: var(--cx-color-text-primary); border-left-color: var(--cx-color-border-strong); }
996
+ .cx-toc a[aria-current="true"] { color: var(--cx-color-text-primary); border-left-color: var(--cx-color-accent-border); }
997
+ .cx-toc__no { color: var(--cx-color-text-muted); font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); font-variant-numeric: tabular-nums; }
998
+
999
+ /* ------------------------------------------------------------ specimen plate (contour survey of simplex-noise terrain) */
1000
+ .cx-plate-frame { position: relative; display: inline-flex; flex-direction: column; gap: var(--cx-space-stack-sm); margin: var(--cx-size-mark-tick); padding: var(--cx-space-inset-md); border: var(--cx-border-width-hairline) solid var(--cx-color-border-default); background: var(--cx-color-surface-raised); max-width: 100%; }
1001
+ .cx-plate {
1002
+ position: relative; width: var(--cx-size-column-card); max-width: 100%; aspect-ratio: 1; overflow: hidden;
1003
+ /* Read by js/plate.js: how long the terrain takes to drift one noise unit, and how long to wait for the draw-in. */
1004
+ --cx-plate-drift: var(--cx-motion-duration-drift); --cx-plate-draw: var(--cx-motion-duration-plate);
1005
+ }
1006
+ .cx-plate__map { display: block; width: 100%; height: 100%; }
1007
+ .cx-plate__map path { fill: none; vector-effect: non-scaling-stroke; stroke-linecap: round; stroke-linejoin: round; }
1008
+ .cx-plate__grid { stroke: var(--cx-color-ornament-muted); stroke-width: var(--cx-border-width-hairline); }
1009
+ /* Each contour carries pathLength="1", so the dash maths is the same for every line: it draws in once on load,
1010
+ lowest contour first. */
1011
+ .cx-plate__line {
1012
+ stroke: var(--cx-color-ornament-rest); stroke-width: var(--cx-border-width-hairline);
1013
+ stroke-dasharray: 1; stroke-dashoffset: 1;
1014
+ animation: cx-contour var(--cx-motion-duration-plate) var(--cx-motion-easing-enter) forwards;
1015
+ animation-delay: calc(var(--i) * var(--cx-motion-duration-fast) / 3);
1016
+ }
1017
+ .cx-plate__line--index { stroke: var(--cx-color-ornament-strong); stroke-width: var(--cx-border-width-emphasis); }
1018
+ /* The dash only exists for the draw-in. The last keyframe drops it, so lines reshaped later never show gaps. */
1019
+ @keyframes cx-contour { 99% { stroke-dasharray: 1; stroke-dashoffset: 0; } 100% { stroke-dasharray: none; stroke-dashoffset: 0; } }
1020
+
1021
+ /* Pause control: a native checkbox styled as an icon-only pill. It ships hidden; the script reveals it when it
1022
+ starts the drift, so it never appears on a plate that isn't moving. */
1023
+ .cx-plate__pause {
1024
+ position: absolute; z-index: 2; top: var(--cx-space-inset-sm); right: var(--cx-space-inset-sm);
1025
+ display: inline-grid; place-items: center; width: var(--cx-size-target-touch); height: var(--cx-size-target-touch);
1026
+ border: var(--cx-border-width-hairline) solid var(--cx-color-border-strong); border-radius: var(--cx-radius-pill);
1027
+ background: var(--cx-color-surface-raised); color: var(--cx-color-text-secondary); cursor: pointer; opacity: 0;
1028
+ transition: opacity var(--cx-motion-duration-fast) var(--cx-motion-easing-standard), background-color var(--cx-motion-duration-fast) var(--cx-motion-easing-standard);
1029
+ }
1030
+ .cx-plate-frame:is(:hover, :focus-within) .cx-plate__pause { opacity: 1; }
1031
+ @media (hover: hover) { .cx-plate__pause:hover { color: var(--cx-color-text-primary); background: var(--cx-color-surface-hover); } }
1032
+ .cx-plate__pause:has(:focus-visible) { outline: var(--cx-border-focus-width) solid var(--cx-color-focus-ring); outline-offset: var(--cx-border-focus-offset); }
1033
+ .cx-plate__pause :is(.cx-icon, .cx-tooltip [data-when]) { display: none; }
1034
+ .cx-plate__pause:not(:has(:checked)) [data-when="running"],
1035
+ .cx-plate__pause:has(:checked) [data-when="paused"] { display: inline-block; }
1036
+ @media (hover: none) { .cx-plate__pause { opacity: 1; } }
1037
+ .cx-plate-frame figcaption { font-family: var(--cx-font-family-mono); font-size: var(--cx-font-size-label); letter-spacing: var(--cx-font-tracking-ui); color: var(--cx-color-text-muted); max-width: var(--cx-size-column-card); }
1038
+
1039
+ /* ------------------------------------------------------------ ornaments */
1040
+ .cx-ornament { font-family: var(--cx-font-family-ornament); line-height: var(--cx-font-line-height-display); color: var(--cx-color-ornament-rest); font-size: var(--cx-size-ornament-md); }
1041
+ .cx-ornament--lg { font-size: var(--cx-size-ornament-lg); }
1042
+
1043
+ /* ------------------------------------------------------------ backdrop (the contour survey behind every page, under a grainy frost) */
1044
+ /* Layers, bottom to top: the canvas (color.surface.base), the contours, the frost (tint + blur), the grain, then the
1045
+ page. The page's own surface fades out over its first and last size.backdrop.fade, so the frost shows behind the
1046
+ header and footer and reading happens on the plain surface. The backdrop is the first child of <body>. */
1047
+ :root:has(.cx-backdrop-page) { background: var(--cx-color-surface-base); }
1048
+ /* When the page class sits on a wrapper (a fragment such as the showcase), body's own surface would cover the backdrop. */
1049
+ body:not(.cx-backdrop-page):has(.cx-backdrop-page) { background: transparent; }
1050
+ .cx-backdrop-page {
1051
+ background: linear-gradient(to top, transparent, var(--cx-color-surface-base) var(--cx-size-backdrop-fade),
1052
+ var(--cx-color-surface-base) calc(100% - var(--cx-size-backdrop-fade)), transparent);
1053
+ }
1054
+ /* At the top of the page the header sits on the frost with no surface of its own. dist/codex.js marks it with
1055
+ data-scrolled: from then on it sticks, and once the page leaves the top its surface fades in, so it never sits
1056
+ see-through on the text below; back at the top the surface fades out again. Without the script it scrolls away. */
1057
+ .cx-backdrop-page .cx-header { position: relative; background: transparent; }
1058
+ .cx-backdrop-page .cx-header[data-scrolled] {
1059
+ position: sticky;
1060
+ transition: background-color var(--cx-motion-duration-slow) var(--cx-motion-easing-standard);
1061
+ }
1062
+ .cx-backdrop-page .cx-header[data-scrolled="true"] { background-color: var(--cx-color-surface-base); }
1063
+ .cx-backdrop-page .cx-footer { background: transparent; }
1064
+ .cx-backdrop {
1065
+ /* Larger than the viewport by three blur radii on every side, so the blurred contours are whole at the screen edge.
1066
+ Its height is the large viewport, not the bottom edge: on a phone the address bar slides away as you scroll, and
1067
+ a layer pinned to the bottom would resize with it, re-fit the contours and make them jump. */
1068
+ position: fixed; inset: calc(var(--cx-size-backdrop-blur) * -3); bottom: auto;
1069
+ height: calc(var(--cx-size-backdrop-height) + var(--cx-size-backdrop-blur) * 6);
1070
+ z-index: -1; overflow: hidden; pointer-events: none;
1071
+ /* Read by js/plate.js, as on the plate. */
1072
+ --cx-plate-drift: var(--cx-motion-duration-drift); --cx-plate-draw: var(--cx-motion-duration-plate);
1073
+ }
1074
+ .cx-backdrop .cx-plate__map {
1075
+ position: relative; z-index: 0;
1076
+ /* The frost's blur is applied to the contours themselves. The layer reaches three blur radii past the viewport, so
1077
+ the blur never runs out of picture at the screen edge (backdrop-filter does, and leaves sharp lines there). */
1078
+ filter: blur(var(--cx-size-backdrop-blur)) saturate(var(--cx-color-backdrop-saturation));
1079
+ }
1080
+ /* No draw-in: the backdrop is already there when a page opens. */
1081
+ .cx-backdrop .cx-plate__line { stroke-width: var(--cx-border-width-contour); stroke-dasharray: none; stroke-dashoffset: 0; animation: none; }
1082
+ .cx-backdrop .cx-plate__line--index { stroke-width: calc(var(--cx-border-width-contour) * 2); }
1083
+ .cx-backdrop::before {
1084
+ content: ""; position: absolute; inset: 0; z-index: 1;
1085
+ background: color-mix(in srgb, var(--cx-color-surface-base) var(--cx-color-backdrop-tint), transparent);
1086
+ }
1087
+ /* Grain: monochrome fractal noise over the frost. No blend mode: in Chromium, blending this layer brought sharp,
1088
+ unblurred lines back. */
1089
+ .cx-backdrop::after {
1090
+ content: ""; position: absolute; inset: 0; z-index: 2; opacity: var(--cx-color-backdrop-grain);
1091
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0.33 0.33 0.33 0 0 0 0 0 0 1'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
1092
+ }
1093
+
1094
+
1095
+ /* ------------------------------------------------------------ motion preferences */
1096
+ @media (prefers-reduced-motion: reduce) {
1097
+ html { scroll-behavior: auto; }
1098
+ *, *::before, *::after {
1099
+ transition-duration: var(--cx-motion-duration-instant) !important;
1100
+ animation-duration: var(--cx-motion-duration-instant) !important;
1101
+ animation-delay: var(--cx-motion-duration-instant) !important;
1102
+ }
1103
+ /* The plate is drawn complete and stays still; its pause control disappears because there is nothing to pause. */
1104
+ .cx-plate__line { animation: none !important; stroke-dasharray: none; }
1105
+ .cx-plate__pause { display: none; }
1106
+ /* The backdrop stays still too, so its header control goes. */
1107
+ .cx-backdrop__pause { display: none; }
1108
+ }
1109
+
1110
+ /* Hugo Chroma classes -> MotifSpec tokens (generated from syntax/chroma.json). Both themes via tokens. */
1111
+ .chroma { color: var(--cx-color-syntax-variable); background: var(--cx-color-surface-sunken); }
1112
+ /* Keywords */
1113
+ .chroma .k, .chroma .kd, .chroma .kn, .chroma .kp, .chroma .kr, .chroma .ow, .chroma .bp { color: var(--cx-color-syntax-keyword); font-weight: var(--cx-font-weight-strong); }
1114
+ /* Type keywords, classes, built-ins, namespaces, exceptions */
1115
+ .chroma .kt, .chroma .nb, .chroma .nc, .chroma .nn, .chroma .ne { color: var(--cx-color-syntax-type); }
1116
+ /* Constants: numbers, booleans, null, dates, symbols, entities, escapes */
1117
+ .chroma .kc, .chroma .no, .chroma .m, .chroma .mb, .chroma .mf, .chroma .mh, .chroma .mi, .chroma .il, .chroma .mo, .chroma .ld, .chroma .ss, .chroma .ni, .chroma .se { color: var(--cx-color-syntax-number); }
1118
+ /* Strings and regex */
1119
+ .chroma .s, .chroma .sa, .chroma .sb, .chroma .sc, .chroma .dl, .chroma .s2, .chroma .sh, .chroma .sx, .chroma .sr, .chroma .s1, .chroma .cpf { color: var(--cx-color-syntax-string); }
1120
+ /* Functions */
1121
+ .chroma .nf, .chroma .fm { color: var(--cx-color-syntax-function); }
1122
+ /* Markup tags */
1123
+ .chroma .nt { color: var(--cx-color-syntax-tag); }
1124
+ /* Attributes, properties, object keys */
1125
+ .chroma .na, .chroma .py { color: var(--cx-color-syntax-attribute); }
1126
+ /* Names and variables */
1127
+ .chroma .n, .chroma .nx, .chroma .nv, .chroma .vc, .chroma .vg, .chroma .vi, .chroma .vm, .chroma .l { color: var(--cx-color-syntax-variable); }
1128
+ /* Operators and punctuation */
1129
+ .chroma .o, .chroma .p { color: var(--cx-color-syntax-operator); }
1130
+ /* Comments and doc strings */
1131
+ .chroma .c, .chroma .ch, .chroma .cm, .chroma .c1, .chroma .cs, .chroma .sd, .chroma .go { color: var(--cx-color-syntax-comment); }
1132
+ /* Meta: decorators, preprocessor, labels, interpolation, prompts */
1133
+ .chroma .nd, .chroma .cp, .chroma .nl, .chroma .si, .chroma .gp { color: var(--cx-color-syntax-meta); }
1134
+ /* Diff: inserted */
1135
+ .chroma .gi { color: var(--cx-color-syntax-inserted); }
1136
+ /* Diff: deleted, errors, tracebacks */
1137
+ .chroma .gd, .chroma .gr, .chroma .gt, .chroma .err { color: var(--cx-color-syntax-deleted); }
1138
+ /* Headings and diff hunks */
1139
+ .chroma .gh, .chroma .gu { color: var(--cx-color-syntax-heading); font-weight: var(--cx-font-weight-strong); }
1140
+ /* Generic strong and emphasis (no italic available) */
1141
+ .chroma .gs, .chroma .ge { font-weight: var(--cx-font-weight-strong); }
1142
+ /* Line numbers */
1143
+ .chroma .ln, .chroma .lnt { color: var(--cx-color-syntax-line-number); }
1144
+ /* Highlighted lines (hl_lines) */
1145
+ .chroma .hl { background: var(--cx-color-syntax-line-highlight); }