executable-stories-demo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,159 @@
1
+ /*
2
+ * corporate — institutional grotesk.
3
+ * Archivo single family. High density, sharp 1-px borders, steel-blue
4
+ * accent. Light-only: the dark-mode override matches so the site does
5
+ * not change character when the OS scheme flips.
6
+ */
7
+
8
+ @import "@fontsource/archivo/400.css";
9
+ @import "@fontsource/archivo/500.css";
10
+ @import "@fontsource/archivo/600.css";
11
+ @import "@fontsource/archivo/700.css";
12
+ @import "@fontsource/archivo/800.css";
13
+
14
+ :root,
15
+ :root[data-theme="dark"] {
16
+ --demo-font-display: "Archivo", system-ui, sans-serif;
17
+ --demo-font-body: "Archivo", system-ui, sans-serif;
18
+ --demo-font-mono: ui-monospace, "SF Mono", Consolas, monospace;
19
+
20
+ --demo-bg: oklch(0.99 0.005 245);
21
+ --demo-surface: oklch(0.975 0.008 245);
22
+ --demo-ink: oklch(0.20 0.025 260);
23
+ --demo-ink-muted: oklch(0.46 0.022 255);
24
+ --demo-border: oklch(0.84 0.012 250);
25
+ --demo-accent: oklch(0.38 0.14 255);
26
+ --demo-accent-ink: oklch(0.99 0.005 245);
27
+
28
+ --demo-pass: oklch(0.42 0.12 160);
29
+ --demo-fail: oklch(0.48 0.18 25);
30
+ --demo-skip: oklch(0.48 0.08 70);
31
+ --demo-pending: oklch(0.55 0.02 255);
32
+
33
+ --demo-radius-xs: 0;
34
+ --demo-radius-sm: 0;
35
+ --demo-radius-md: 2px;
36
+ --demo-radius-lg: 2px;
37
+
38
+ --sl-font: var(--demo-font-body);
39
+ --sl-font-mono: var(--demo-font-mono);
40
+ --sl-color-accent-low: oklch(0.94 0.04 255);
41
+ --sl-color-accent: var(--demo-accent);
42
+ --sl-color-accent-high: oklch(0.26 0.10 255);
43
+
44
+ --sl-color-bg: var(--demo-bg);
45
+ --sl-color-bg-nav: var(--demo-bg);
46
+ --sl-color-bg-sidebar: var(--demo-surface);
47
+ --sl-color-text: var(--demo-ink);
48
+ --sl-color-text-accent: var(--demo-accent);
49
+
50
+ color-scheme: light;
51
+ }
52
+
53
+ /* Compress hero — institutional UIs do not waste vertical space. */
54
+ .demo-hero__title {
55
+ font-weight: 800;
56
+ letter-spacing: -0.025em;
57
+ font-size: clamp(2rem, 4.2vw, 3.5rem);
58
+ line-height: 0.98;
59
+ }
60
+
61
+ .demo-hero__eyebrow {
62
+ border-left: 0;
63
+ padding-left: 0;
64
+ color: var(--demo-accent);
65
+ font-weight: 700;
66
+ }
67
+
68
+ .demo-hero__cta {
69
+ border-radius: 2px;
70
+ text-transform: uppercase;
71
+ letter-spacing: 0.08em;
72
+ font-size: 0.85rem;
73
+ padding: var(--demo-space-3) var(--demo-space-6);
74
+ }
75
+
76
+ /* Sharp, zero-radius stat cards with a thin top rule instead of a full box */
77
+ .demo-stat {
78
+ border: 0;
79
+ border-top: 2px solid var(--demo-ink);
80
+ border-radius: 0;
81
+ background: transparent;
82
+ padding: var(--demo-space-3) 0;
83
+ padding-right: var(--demo-space-6);
84
+ }
85
+
86
+ .demo-stat__value {
87
+ font-family: var(--demo-font-body);
88
+ font-weight: 800;
89
+ letter-spacing: -0.02em;
90
+ }
91
+
92
+ .demo-stat__label {
93
+ font-weight: 600;
94
+ letter-spacing: 0.16em;
95
+ }
96
+
97
+ /* Dense story table */
98
+ .demo-stories {
99
+ border-top-width: 2px;
100
+ border-top-color: var(--demo-ink);
101
+ }
102
+
103
+ .demo-story {
104
+ padding: var(--demo-space-3) 0;
105
+ grid-template-columns: 2.5rem 1fr auto;
106
+ font-size: 0.95rem;
107
+ }
108
+
109
+ .demo-story__title {
110
+ font-weight: 500;
111
+ font-size: 1rem;
112
+ }
113
+
114
+ .demo-story__index {
115
+ color: var(--demo-ink-muted);
116
+ font-weight: 500;
117
+ }
118
+
119
+ /* ---- Story pages: institutional step labels --------------------------- */
120
+
121
+ .sl-markdown-content p > strong:first-child {
122
+ font-family: var(--demo-font-body);
123
+ font-weight: 800;
124
+ text-transform: uppercase;
125
+ letter-spacing: 0.14em;
126
+ font-size: 0.72em;
127
+ color: var(--demo-accent);
128
+ padding: 0.2em 0;
129
+ border-bottom: 2px solid var(--demo-accent);
130
+ align-self: baseline;
131
+ margin-right: 0.4ch;
132
+ }
133
+
134
+ .sl-markdown-content h3 {
135
+ font-family: var(--demo-font-body);
136
+ font-weight: 800;
137
+ letter-spacing: -0.015em;
138
+ }
139
+
140
+ .sl-markdown-content > h2:first-of-type {
141
+ border-bottom-width: 2px;
142
+ border-bottom-color: var(--demo-ink);
143
+ }
144
+
145
+ /* Forced-mode theme: the theme toggle would do nothing visible. Hide it
146
+ rather than ship a control that lies to users. */
147
+ starlight-theme-select {
148
+ display: none;
149
+ }
150
+
151
+ /* Tone-coloured stat values + top accent rule, matching the institutional palette. */
152
+ .demo-stat[data-tone="pass"] { border-top-color: var(--demo-pass); }
153
+ .demo-stat[data-tone="fail"] { border-top-color: var(--demo-fail); }
154
+ .demo-stat[data-tone="skip"] { border-top-color: var(--demo-skip); }
155
+ .demo-stat[data-tone="pending"] { border-top-color: var(--demo-pending); }
156
+ .demo-stat[data-tone="pass"] .demo-stat__value { color: var(--demo-pass); }
157
+ .demo-stat[data-tone="fail"] .demo-stat__value { color: var(--demo-fail); }
158
+ .demo-stat[data-tone="skip"] .demo-stat__value { color: var(--demo-skip); }
159
+ .demo-stat[data-tone="pending"] .demo-stat__value { color: var(--demo-pending); }
@@ -0,0 +1,241 @@
1
+ /*
2
+ * dashboard — ops room.
3
+ * Funnel Sans for UI, JetBrains Mono for numbers. Dark slate-tinted
4
+ * surfaces, teal accent, distinct status colours. Forced dark.
5
+ */
6
+
7
+ @import "@fontsource/funnel-sans/400.css";
8
+ @import "@fontsource/funnel-sans/500.css";
9
+ @import "@fontsource/funnel-sans/600.css";
10
+ @import "@fontsource/funnel-sans/700.css";
11
+ @import "@fontsource/jetbrains-mono/400.css";
12
+ @import "@fontsource/jetbrains-mono/500.css";
13
+ @import "@fontsource/jetbrains-mono/600.css";
14
+
15
+ :root,
16
+ :root[data-theme="dark"] {
17
+ --demo-font-display: "Funnel Sans", system-ui, sans-serif;
18
+ --demo-font-body: "Funnel Sans", system-ui, sans-serif;
19
+ --demo-font-mono: "JetBrains Mono", ui-monospace, monospace;
20
+
21
+ --demo-bg: oklch(0.16 0.012 250);
22
+ --demo-surface: oklch(0.20 0.014 250);
23
+ --demo-surface-elevated: oklch(0.23 0.015 250);
24
+ --demo-ink: oklch(0.93 0.01 240);
25
+ --demo-ink-muted: oklch(0.66 0.014 240);
26
+ --demo-border: oklch(0.30 0.015 250);
27
+ --demo-accent: oklch(0.76 0.14 195);
28
+ --demo-accent-ink: oklch(0.15 0.015 250);
29
+
30
+ --demo-pass: oklch(0.76 0.17 145);
31
+ --demo-fail: oklch(0.70 0.20 25);
32
+ --demo-skip: oklch(0.78 0.15 80);
33
+ --demo-pending: oklch(0.68 0.04 250);
34
+
35
+ --sl-font: var(--demo-font-body);
36
+ --sl-font-mono: var(--demo-font-mono);
37
+
38
+ --sl-color-accent-low: oklch(0.28 0.08 195);
39
+ --sl-color-accent: var(--demo-accent);
40
+ --sl-color-accent-high: oklch(0.92 0.12 195);
41
+
42
+ --sl-color-bg: var(--demo-bg);
43
+ --sl-color-bg-nav: var(--demo-surface);
44
+ --sl-color-bg-sidebar: var(--demo-surface);
45
+ --sl-color-text: var(--demo-ink);
46
+ --sl-color-text-accent: var(--demo-accent);
47
+
48
+ color-scheme: dark;
49
+ }
50
+
51
+ /* Subtle grid backdrop — ops-room vibe without being loud */
52
+ body::before {
53
+ content: "";
54
+ position: fixed;
55
+ inset: 0;
56
+ pointer-events: none;
57
+ z-index: 0;
58
+ background-image:
59
+ linear-gradient(to right, color-mix(in oklch, var(--demo-border) 40%, transparent) 1px, transparent 1px),
60
+ linear-gradient(to bottom, color-mix(in oklch, var(--demo-border) 40%, transparent) 1px, transparent 1px);
61
+ background-size: 4rem 4rem;
62
+ mask-image: radial-gradient(ellipse at top, black 0%, transparent 70%);
63
+ opacity: 0.5;
64
+ }
65
+
66
+ /* Tight, data-forward hero */
67
+ .demo-hero__title {
68
+ font-family: var(--demo-font-display);
69
+ font-weight: 600;
70
+ letter-spacing: -0.03em;
71
+ font-size: clamp(2.25rem, 4.5vw, 3.75rem);
72
+ line-height: 1;
73
+ }
74
+
75
+ .demo-hero__eyebrow {
76
+ color: var(--demo-accent);
77
+ font-weight: 600;
78
+ letter-spacing: 0.22em;
79
+ }
80
+
81
+ .demo-hero__tagline {
82
+ color: var(--demo-ink-muted);
83
+ }
84
+
85
+ .demo-hero__cta {
86
+ background: var(--demo-accent);
87
+ color: var(--demo-accent-ink);
88
+ border-radius: var(--demo-radius-sm);
89
+ font-weight: 600;
90
+ }
91
+
92
+ /* Stat cards with coloured value by tone and mono numbers */
93
+ .demo-stats {
94
+ gap: var(--demo-space-2);
95
+ }
96
+
97
+ .demo-stat {
98
+ background: var(--demo-surface);
99
+ border: 1px solid var(--demo-border);
100
+ border-radius: var(--demo-radius-sm);
101
+ padding: var(--demo-space-4);
102
+ gap: var(--demo-space-2);
103
+ }
104
+
105
+ .demo-stat__value {
106
+ font-family: var(--demo-font-mono);
107
+ font-weight: 500;
108
+ font-variant-numeric: tabular-nums;
109
+ letter-spacing: -0.02em;
110
+ }
111
+
112
+ .demo-stat__label {
113
+ font-weight: 600;
114
+ color: var(--demo-ink-muted);
115
+ }
116
+
117
+ /* Status dot on each stat card (accent rule on top, not left) */
118
+ .demo-stat {
119
+ position: relative;
120
+ overflow: hidden;
121
+ }
122
+
123
+ .demo-stat[data-tone="total"] { --demo-tone: var(--demo-accent); }
124
+ .demo-stat[data-tone="pass"] { --demo-tone: var(--demo-pass); }
125
+ .demo-stat[data-tone="fail"] { --demo-tone: var(--demo-fail); }
126
+ .demo-stat[data-tone="skip"] { --demo-tone: var(--demo-skip); }
127
+
128
+ .demo-stat::before {
129
+ content: "";
130
+ position: absolute;
131
+ top: 0;
132
+ inset-inline: 0;
133
+ height: 2px;
134
+ background: var(--demo-tone, var(--demo-accent));
135
+ }
136
+
137
+ /* Section heading picks up a small mono prefix like a log label */
138
+ .demo-section-heading {
139
+ font-weight: 600;
140
+ letter-spacing: -0.01em;
141
+ display: flex;
142
+ align-items: baseline;
143
+ gap: var(--demo-space-3);
144
+ }
145
+
146
+ .demo-section-heading::before {
147
+ content: "//";
148
+ font-family: var(--demo-font-mono);
149
+ color: var(--demo-accent);
150
+ font-weight: 500;
151
+ font-size: 0.8em;
152
+ }
153
+
154
+ /* Story list: surface cards with status pill on the right */
155
+ .demo-stories {
156
+ border-top: 0;
157
+ gap: var(--demo-space-1);
158
+ }
159
+
160
+ .demo-story {
161
+ background: var(--demo-surface);
162
+ border: 1px solid var(--demo-border);
163
+ border-radius: var(--demo-radius-sm);
164
+ grid-template-columns: 3rem 1fr auto;
165
+ padding: var(--demo-space-3) var(--demo-space-4);
166
+ transition: border-color 120ms ease-out, background 120ms ease-out;
167
+ }
168
+
169
+ .demo-story:hover {
170
+ background: var(--demo-surface-elevated);
171
+ border-color: var(--demo-accent);
172
+ }
173
+
174
+ .demo-story__index {
175
+ color: var(--demo-ink-muted);
176
+ font-variant-numeric: tabular-nums;
177
+ }
178
+
179
+ .demo-story__title {
180
+ font-weight: 500;
181
+ }
182
+
183
+ .demo-story__status {
184
+ font-family: var(--demo-font-mono);
185
+ font-size: 0.7rem;
186
+ padding: 0.2rem 0.6rem;
187
+ border-radius: var(--demo-radius-pill);
188
+ letter-spacing: 0.12em;
189
+ background: color-mix(in oklch, var(--demo-surface-elevated) 100%, transparent);
190
+ border: 1px solid var(--demo-border);
191
+ }
192
+
193
+ .demo-story[data-status="passed"] .demo-story__status {
194
+ color: var(--demo-pass);
195
+ border-color: color-mix(in oklch, var(--demo-pass) 40%, transparent);
196
+ background: color-mix(in oklch, var(--demo-pass) 12%, var(--demo-surface));
197
+ }
198
+
199
+ .demo-story[data-status="failed"] .demo-story__status {
200
+ color: var(--demo-fail);
201
+ border-color: color-mix(in oklch, var(--demo-fail) 50%, transparent);
202
+ background: color-mix(in oklch, var(--demo-fail) 12%, var(--demo-surface));
203
+ }
204
+
205
+ .demo-story[data-status="skipped"] .demo-story__status {
206
+ color: var(--demo-skip);
207
+ border-color: color-mix(in oklch, var(--demo-skip) 40%, transparent);
208
+ background: color-mix(in oklch, var(--demo-skip) 10%, var(--demo-surface));
209
+ }
210
+
211
+ /* ---- Story pages: log-line steps ------------------------------------- */
212
+
213
+ .sl-markdown-content p > strong:first-child {
214
+ font-family: var(--demo-font-mono);
215
+ font-size: 0.72em;
216
+ font-weight: 500;
217
+ letter-spacing: 0.08em;
218
+ text-transform: uppercase;
219
+ color: var(--demo-accent);
220
+ padding: 0.2em 0.6em;
221
+ background: color-mix(in oklch, var(--demo-accent) 15%, var(--demo-surface));
222
+ border-radius: var(--demo-radius-pill);
223
+ border: 1px solid color-mix(in oklch, var(--demo-accent) 30%, transparent);
224
+ align-self: center;
225
+ }
226
+
227
+ .sl-markdown-content h3 {
228
+ font-family: var(--demo-font-display);
229
+ font-weight: 600;
230
+ letter-spacing: -0.02em;
231
+ }
232
+
233
+ .sl-markdown-content > h2:first-of-type {
234
+ color: var(--demo-accent);
235
+ border-bottom-color: color-mix(in oklch, var(--demo-accent) 40%, transparent);
236
+ }
237
+
238
+ /* Forced-mode theme: hide the (non-functional) theme toggle. */
239
+ starlight-theme-select {
240
+ display: none;
241
+ }
@@ -0,0 +1,106 @@
1
+ /*
2
+ * default — editorial warmth.
3
+ * Literata display + Work Sans body. Warm cream, bottle-green accent.
4
+ * Scheme-adaptive; light is the native mode.
5
+ */
6
+
7
+ @import "@fontsource-variable/literata";
8
+ @import "@fontsource/work-sans/400.css";
9
+ @import "@fontsource/work-sans/500.css";
10
+ @import "@fontsource/work-sans/600.css";
11
+ @import "@fontsource/work-sans/700.css";
12
+
13
+ :root {
14
+ --demo-font-display: "Literata", "Georgia", serif;
15
+ --demo-font-body: "Work Sans", system-ui, sans-serif;
16
+ --demo-font-mono: ui-monospace, "SF Mono", Menlo, monospace;
17
+
18
+ --demo-bg: oklch(0.985 0.012 85);
19
+ --demo-surface: oklch(0.965 0.018 85);
20
+ --demo-ink: oklch(0.18 0.015 60);
21
+ --demo-ink-muted: oklch(0.44 0.015 65);
22
+ --demo-border: oklch(0.88 0.018 85);
23
+ --demo-accent: oklch(0.42 0.12 150);
24
+ --demo-accent-ink: oklch(0.985 0.008 85);
25
+
26
+ --demo-pass: oklch(0.48 0.13 150);
27
+ --demo-fail: oklch(0.52 0.18 25);
28
+ --demo-skip: oklch(0.58 0.09 70);
29
+ --demo-pending: oklch(0.50 0.02 65);
30
+
31
+ --sl-font: var(--demo-font-body);
32
+ --sl-font-mono: var(--demo-font-mono);
33
+
34
+ --sl-color-accent-low: oklch(0.92 0.05 150);
35
+ --sl-color-accent: var(--demo-accent);
36
+ --sl-color-accent-high: oklch(0.28 0.10 150);
37
+
38
+ --sl-color-bg: var(--demo-bg);
39
+ --sl-color-bg-nav: var(--demo-bg);
40
+ --sl-color-bg-sidebar: var(--demo-surface);
41
+ --sl-color-text: var(--demo-ink);
42
+ --sl-color-text-accent: var(--demo-accent);
43
+ }
44
+
45
+ :root[data-theme="dark"] {
46
+ --demo-bg: oklch(0.19 0.012 65);
47
+ --demo-surface: oklch(0.23 0.014 65);
48
+ --demo-ink: oklch(0.94 0.01 85);
49
+ --demo-ink-muted: oklch(0.70 0.012 75);
50
+ --demo-border: oklch(0.30 0.018 70);
51
+ --demo-accent: oklch(0.72 0.14 150);
52
+ --demo-accent-ink: oklch(0.18 0.015 60);
53
+
54
+ --demo-pass: oklch(0.72 0.14 150);
55
+ --demo-fail: oklch(0.70 0.17 25);
56
+ --demo-skip: oklch(0.72 0.10 80);
57
+ --demo-pending: oklch(0.72 0.02 75);
58
+
59
+ --sl-color-accent-low: oklch(0.30 0.08 150);
60
+ --sl-color-accent: var(--demo-accent);
61
+ --sl-color-accent-high: oklch(0.88 0.10 150);
62
+ }
63
+
64
+ /* Display headings in the content area lean on Literata's serif voice. */
65
+ .sl-markdown-content h1,
66
+ .sl-markdown-content h2,
67
+ .sl-markdown-content h3,
68
+ .demo-hero__title,
69
+ .demo-section-heading {
70
+ font-family: var(--demo-font-display);
71
+ font-feature-settings: "onum" 1, "liga" 1, "dlig" 1;
72
+ }
73
+
74
+ .demo-hero__title {
75
+ letter-spacing: -0.015em;
76
+ }
77
+
78
+ /* Soften the stat card borders to match the paper-ish palette. */
79
+ .demo-stat {
80
+ border-color: color-mix(in oklch, var(--demo-border) 70%, transparent);
81
+ background: var(--demo-surface);
82
+ }
83
+
84
+ /* A discreet drop-rule under the hero, reinforcing the publication feel. */
85
+ .demo-hero {
86
+ padding-bottom: var(--demo-space-8);
87
+ border-bottom: 1px solid var(--demo-border);
88
+ }
89
+
90
+ /* ---- Story pages: publication-style steps ----------------------------- */
91
+
92
+ .sl-markdown-content p > strong:first-child {
93
+ font-family: var(--demo-font-display);
94
+ font-style: italic;
95
+ font-weight: 500;
96
+ font-size: 1.05em;
97
+ color: var(--demo-accent);
98
+ letter-spacing: 0;
99
+ font-feature-settings: "onum" 1, "dlig" 1;
100
+ }
101
+
102
+ .sl-markdown-content h3 {
103
+ font-family: var(--demo-font-display);
104
+ font-weight: 600;
105
+ font-feature-settings: "onum" 1, "liga" 1, "dlig" 1;
106
+ }
@@ -0,0 +1,212 @@
1
+ /*
2
+ * minimal — aggressive restraint.
3
+ * Albert Sans single family with extreme weight contrast (300 vs 700).
4
+ * Near-monochrome; a single oxidised-orange accent used sparingly.
5
+ * Forced light.
6
+ */
7
+
8
+ @import "@fontsource/albert-sans/300.css";
9
+ @import "@fontsource/albert-sans/400.css";
10
+ @import "@fontsource/albert-sans/500.css";
11
+ @import "@fontsource/albert-sans/700.css";
12
+
13
+ :root,
14
+ :root[data-theme="dark"] {
15
+ --demo-font-display: "Albert Sans", system-ui, sans-serif;
16
+ --demo-font-body: "Albert Sans", system-ui, sans-serif;
17
+ --demo-font-mono: ui-monospace, "SF Mono", Menlo, monospace;
18
+
19
+ --demo-bg: oklch(0.985 0 0);
20
+ --demo-surface: oklch(0.985 0 0);
21
+ --demo-ink: oklch(0.14 0 0);
22
+ --demo-ink-muted: oklch(0.55 0 0);
23
+ --demo-border: oklch(0.88 0 0);
24
+ --demo-accent: oklch(0.56 0.18 35);
25
+ --demo-accent-ink: oklch(0.985 0 0);
26
+
27
+ --demo-pass: oklch(0.14 0 0);
28
+ --demo-fail: oklch(0.56 0.18 35);
29
+ --demo-skip: oklch(0.55 0 0);
30
+ --demo-pending: oklch(0.55 0 0);
31
+
32
+ --sl-font: var(--demo-font-body);
33
+ --sl-font-mono: var(--demo-font-mono);
34
+
35
+ --sl-color-accent-low: oklch(0.94 0.04 35);
36
+ --sl-color-accent: var(--demo-accent);
37
+ --sl-color-accent-high: oklch(0.30 0.14 35);
38
+
39
+ --sl-color-bg: var(--demo-bg);
40
+ --sl-color-bg-nav: var(--demo-bg);
41
+ --sl-color-bg-sidebar: var(--demo-bg);
42
+ --sl-color-text: var(--demo-ink);
43
+ --sl-color-text-accent: var(--demo-ink);
44
+
45
+ color-scheme: light;
46
+ }
47
+
48
+ .demo-landing {
49
+ gap: clamp(4rem, 8vw, 8rem);
50
+ padding-block: clamp(2rem, 5vw, 5rem);
51
+ }
52
+
53
+ .demo-hero {
54
+ max-width: 40ch;
55
+ gap: var(--demo-space-8);
56
+ }
57
+
58
+ .demo-hero__title {
59
+ font-family: var(--demo-font-display);
60
+ font-weight: 300;
61
+ font-size: clamp(2.75rem, 6vw, 5.5rem);
62
+ letter-spacing: -0.035em;
63
+ line-height: 0.95;
64
+ }
65
+
66
+ /* One rare touch of colour: a small dot precedes the eyebrow, and nothing else */
67
+ .demo-hero__eyebrow {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 0.6rem;
71
+ color: var(--demo-ink-muted);
72
+ font-weight: 500;
73
+ }
74
+
75
+ .demo-hero__eyebrow::before {
76
+ content: "";
77
+ width: 0.4rem;
78
+ height: 0.4rem;
79
+ border-radius: 50%;
80
+ background: var(--demo-accent);
81
+ display: inline-block;
82
+ }
83
+
84
+ .demo-hero__tagline {
85
+ font-weight: 300;
86
+ font-size: clamp(1.1rem, 1.4vw, 1.25rem);
87
+ line-height: 1.5;
88
+ color: var(--demo-ink-muted);
89
+ }
90
+
91
+ .demo-hero__cta {
92
+ background: var(--demo-ink);
93
+ border-color: var(--demo-ink);
94
+ border-radius: 0;
95
+ padding: var(--demo-space-4) var(--demo-space-8);
96
+ font-weight: 500;
97
+ font-size: 0.9rem;
98
+ letter-spacing: 0.02em;
99
+ }
100
+
101
+ .demo-hero__cta::after { content: ""; }
102
+
103
+ /* Stats: no cards, just large numbers separated by whitespace */
104
+ .demo-stats {
105
+ grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
106
+ gap: var(--demo-space-8);
107
+ padding-block: var(--demo-space-8);
108
+ border-top: 1px solid var(--demo-border);
109
+ border-bottom: 1px solid var(--demo-border);
110
+ }
111
+
112
+ .demo-stat {
113
+ border: 0;
114
+ background: transparent;
115
+ border-radius: 0;
116
+ padding: 0;
117
+ gap: var(--demo-space-3);
118
+ }
119
+
120
+ .demo-stat__value {
121
+ font-family: var(--demo-font-display);
122
+ font-weight: 300;
123
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
124
+ letter-spacing: -0.04em;
125
+ color: var(--demo-ink);
126
+ }
127
+
128
+ .demo-stat[data-tone="fail"] .demo-stat__value { color: var(--demo-accent); }
129
+
130
+ .demo-stat__label {
131
+ letter-spacing: 0.08em;
132
+ text-transform: uppercase;
133
+ font-weight: 500;
134
+ font-size: 0.68rem;
135
+ }
136
+
137
+ /* Stories: hairline rules, generous padding, no hover colour */
138
+ .demo-section-heading {
139
+ font-weight: 300;
140
+ letter-spacing: -0.02em;
141
+ }
142
+
143
+ .demo-stories {
144
+ border-top: 1px solid var(--demo-border);
145
+ }
146
+
147
+ .demo-story {
148
+ grid-template-columns: 4rem 1fr auto;
149
+ padding: var(--demo-space-6) 0;
150
+ border-bottom: 1px solid var(--demo-border);
151
+ align-items: baseline;
152
+ }
153
+
154
+ .demo-story__index {
155
+ font-family: var(--demo-font-body);
156
+ font-weight: 400;
157
+ color: var(--demo-ink-muted);
158
+ letter-spacing: 0.02em;
159
+ }
160
+
161
+ .demo-story__title {
162
+ font-weight: 400;
163
+ font-size: 1.125rem;
164
+ letter-spacing: -0.005em;
165
+ }
166
+
167
+ .demo-story__status {
168
+ color: var(--demo-ink-muted);
169
+ font-weight: 500;
170
+ }
171
+
172
+ .demo-story:hover {
173
+ background: transparent;
174
+ }
175
+
176
+ .demo-story:hover .demo-story__title {
177
+ text-decoration: underline;
178
+ text-underline-offset: 0.2em;
179
+ text-decoration-thickness: 1px;
180
+ }
181
+
182
+ /* ---- Story pages: whispered steps ------------------------------------ */
183
+
184
+ .sl-markdown-content p:has(> strong:first-child) {
185
+ display: grid;
186
+ grid-template-columns: 6rem 1fr;
187
+ gap: var(--demo-space-4);
188
+ align-items: baseline;
189
+ max-width: var(--demo-max-prose);
190
+ }
191
+
192
+ .sl-markdown-content p > strong:first-child {
193
+ font-family: var(--demo-font-body);
194
+ font-weight: 500;
195
+ font-size: 0.68rem;
196
+ letter-spacing: 0.24em;
197
+ text-transform: uppercase;
198
+ color: var(--demo-ink-muted);
199
+ padding-top: 0.3em;
200
+ }
201
+
202
+ .sl-markdown-content h3 {
203
+ font-family: var(--demo-font-display);
204
+ font-weight: 300;
205
+ letter-spacing: -0.02em;
206
+ font-size: clamp(1.5rem, 2.4vw, 2rem);
207
+ }
208
+
209
+ /* Forced-mode theme: hide the (non-functional) theme toggle. */
210
+ starlight-theme-select {
211
+ display: none;
212
+ }