@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.
- package/CHANGELOG.md +275 -257
- package/LICENSE +21 -21
- package/README.md +128 -150
- package/dist/backdrop.html +1 -1
- package/dist/chroma.css +36 -36
- package/dist/codex.css +1145 -1145
- package/dist/codex.js +126 -126
- package/dist/contrast.md +101 -101
- package/dist/fonts.css +3 -3
- package/dist/icons.svg +18 -18
- package/dist/plate.html +1 -1
- package/dist/plate.js +292 -292
- package/dist/theme-init.js +1 -1
- package/dist/tokens.css +466 -466
- package/dist/tokens.js +3330 -3330
- package/dist/tokens.json +3330 -3330
- package/docs/components/_template.md +37 -37
- package/docs/components/accession-label.md +106 -106
- package/docs/components/backdrop.md +83 -83
- package/docs/components/button-and-link.md +87 -87
- package/docs/components/callout.md +75 -75
- package/docs/components/code-block.md +109 -109
- package/docs/components/data-table.md +73 -73
- package/docs/components/figure.md +68 -68
- package/docs/components/heading-anchor.md +76 -76
- package/docs/components/icon.md +63 -63
- package/docs/components/ornament.md +77 -77
- package/docs/components/pagination.md +78 -78
- package/docs/components/post-list-item.md +91 -91
- package/docs/components/project-card.md +82 -82
- package/docs/components/prose.md +122 -122
- package/docs/components/site-footer.md +99 -99
- package/docs/components/site-header.md +133 -133
- package/docs/components/specimen-plate.md +92 -92
- package/docs/components/table-of-contents.md +83 -83
- package/docs/components/tag.md +70 -70
- package/docs/components/tooltip.md +67 -67
- package/docs/hugo.md +132 -120
- package/docs/syntax-highlighting.md +55 -55
- package/docs/templates.md +21 -30
- package/fonts/OFL-jetbrains-mono.txt +93 -93
- package/fonts/OFL-national-park.txt +93 -93
- package/fonts/OFL-yarndings-12.txt +93 -93
- package/icons/LICENSE +202 -202
- package/icons/manifest.json +75 -75
- package/layouts/_markup/render-blockquote.html +30 -30
- package/layouts/_markup/render-codeblock.html +18 -18
- package/layouts/_markup/render-heading.html +2 -2
- package/layouts/_markup/render-image.html +14 -14
- package/layouts/_markup/render-link.html +14 -14
- package/layouts/_markup/render-table.html +31 -31
- package/layouts/_partials/motifspec/accession/id.html +2 -2
- package/layouts/_partials/motifspec/accession/label.html +18 -18
- package/layouts/_partials/motifspec/accession/status.html +2 -2
- package/layouts/_partials/motifspec/article.html +24 -24
- package/layouts/_partials/motifspec/back-link.html +2 -2
- package/layouts/_partials/motifspec/body-end.html +5 -5
- package/layouts/_partials/motifspec/body-start.html +5 -5
- package/layouts/_partials/motifspec/figure.html +14 -14
- package/layouts/_partials/motifspec/filed-under.html +5 -5
- package/layouts/_partials/motifspec/h2s.html +7 -7
- package/layouts/_partials/motifspec/head.html +15 -15
- package/layouts/_partials/motifspec/pagination-entries.html +34 -34
- package/layouts/_partials/motifspec/pagination-pages.html +30 -30
- package/layouts/_partials/motifspec/post-list-item.html +15 -15
- package/layouts/_partials/motifspec/project-card.html +23 -23
- package/layouts/_partials/motifspec/section-heading.html +3 -3
- package/layouts/_partials/motifspec/site-header.html +27 -27
- package/layouts/_partials/motifspec/table-of-contents.html +21 -21
- package/layouts/_partials/motifspec/tag-filter.html +22 -22
- package/layouts/_partials/motifspec/tags.html +8 -8
- package/layouts/_partials/motifspec/tokens.html +9 -9
- package/package.json +68 -68
- package/scripts/check.mjs +153 -153
- package/scripts/lib.mjs +176 -176
- package/tokens/README.md +3 -3
- package/tokens/border.json +63 -63
- package/tokens/color.json +1902 -1902
- package/tokens/motion.json +207 -207
- package/tokens/radius.json +53 -53
- package/tokens/size.json +378 -378
- package/tokens/space.json +289 -289
- 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.
|
|
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); }
|