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,263 @@
1
+ /*
2
+ * playful — risograph poster.
3
+ * Bricolage Grotesque display (variable optical size) + Figtree body.
4
+ * Soft butter bg, persimmon + inky-blue spot colours, hard-edged strokes.
5
+ * Forced light.
6
+ */
7
+
8
+ @import "@fontsource-variable/bricolage-grotesque";
9
+ @import "@fontsource/figtree/400.css";
10
+ @import "@fontsource/figtree/500.css";
11
+ @import "@fontsource/figtree/600.css";
12
+ @import "@fontsource/figtree/700.css";
13
+
14
+ :root,
15
+ :root[data-theme="dark"] {
16
+ --demo-font-display: "Bricolage Grotesque", system-ui, sans-serif;
17
+ --demo-font-body: "Figtree", system-ui, sans-serif;
18
+ --demo-font-mono: ui-monospace, "SF Mono", Menlo, monospace;
19
+
20
+ --demo-bg: oklch(0.96 0.045 88);
21
+ --demo-surface: oklch(0.93 0.055 88);
22
+ --demo-ink: oklch(0.22 0.04 20);
23
+ --demo-ink-muted: oklch(0.46 0.05 25);
24
+ --demo-border: oklch(0.22 0.04 20);
25
+ --demo-accent: oklch(0.64 0.22 30);
26
+ --demo-accent-ink: oklch(0.98 0.02 88);
27
+ --demo-accent-2: oklch(0.40 0.18 265);
28
+ --demo-spot: oklch(0.82 0.18 90);
29
+
30
+ --demo-pass: oklch(0.58 0.17 150);
31
+ --demo-fail: oklch(0.58 0.22 25);
32
+ --demo-skip: oklch(0.60 0.15 85);
33
+ --demo-pending: oklch(0.55 0.06 30);
34
+
35
+ --demo-radius-sm: 6px;
36
+ --demo-radius-md: 14px;
37
+ --demo-radius-lg: 22px;
38
+
39
+ --sl-font: var(--demo-font-body);
40
+ --sl-font-mono: var(--demo-font-mono);
41
+
42
+ --sl-color-accent-low: oklch(0.92 0.08 30);
43
+ --sl-color-accent: var(--demo-accent);
44
+ --sl-color-accent-high: oklch(0.32 0.14 30);
45
+
46
+ --sl-color-bg: var(--demo-bg);
47
+ --sl-color-bg-nav: var(--demo-bg);
48
+ --sl-color-bg-sidebar: var(--demo-surface);
49
+ --sl-color-text: var(--demo-ink);
50
+ --sl-color-text-accent: var(--demo-accent);
51
+
52
+ color-scheme: light;
53
+ }
54
+
55
+ .demo-hero {
56
+ position: relative;
57
+ max-width: 56ch;
58
+ }
59
+
60
+ /* A decorative inky-blue blob behind the hero title */
61
+ .demo-hero::before {
62
+ content: "";
63
+ position: absolute;
64
+ top: -0.5rem;
65
+ left: -1.5rem;
66
+ width: 8rem;
67
+ height: 8rem;
68
+ background: var(--demo-accent-2);
69
+ border-radius: 50%;
70
+ z-index: -1;
71
+ transform: rotate(-5deg);
72
+ opacity: 0.9;
73
+ mix-blend-mode: multiply;
74
+ }
75
+
76
+ .demo-hero__eyebrow {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ gap: 0.5rem;
80
+ font-family: var(--demo-font-body);
81
+ font-weight: 700;
82
+ color: var(--demo-accent);
83
+ letter-spacing: 0.12em;
84
+ }
85
+
86
+ .demo-hero__eyebrow::before {
87
+ content: "★";
88
+ color: var(--demo-spot);
89
+ font-size: 1.2em;
90
+ -webkit-text-stroke: 1px var(--demo-ink);
91
+ }
92
+
93
+ .demo-hero__title {
94
+ font-family: var(--demo-font-display);
95
+ font-variation-settings: "opsz" 96, "wght" 800;
96
+ font-size: clamp(3rem, 7vw, 6rem);
97
+ letter-spacing: -0.03em;
98
+ line-height: 0.9;
99
+ color: var(--demo-ink);
100
+ }
101
+
102
+ .demo-hero__tagline {
103
+ font-family: var(--demo-font-body);
104
+ font-weight: 500;
105
+ font-size: clamp(1.15rem, 1.6vw, 1.35rem);
106
+ line-height: 1.45;
107
+ color: var(--demo-ink);
108
+ }
109
+
110
+ /* Chunky CTA with a hard shadow — poster button */
111
+ .demo-hero__cta {
112
+ background: var(--demo-accent);
113
+ color: var(--demo-accent-ink);
114
+ border: 2px solid var(--demo-ink);
115
+ border-radius: var(--demo-radius-lg);
116
+ font-family: var(--demo-font-display);
117
+ font-variation-settings: "opsz" 24, "wght" 700;
118
+ font-size: 1rem;
119
+ padding: var(--demo-space-4) var(--demo-space-8);
120
+ box-shadow: 4px 4px 0 var(--demo-ink);
121
+ transform: rotate(-1deg);
122
+ transition: transform 120ms ease-out, box-shadow 120ms ease-out;
123
+ }
124
+
125
+ .demo-hero__cta:hover {
126
+ transform: rotate(-1deg) translate(-2px, -2px);
127
+ box-shadow: 6px 6px 0 var(--demo-ink);
128
+ }
129
+
130
+ /* Stat cards — chunky bordered blocks in alternating colours */
131
+ .demo-stat {
132
+ background: var(--demo-surface);
133
+ border: 2px solid var(--demo-ink);
134
+ border-radius: var(--demo-radius-md);
135
+ padding: var(--demo-space-4) var(--demo-space-6);
136
+ box-shadow: 3px 3px 0 var(--demo-ink);
137
+ }
138
+
139
+ .demo-stat__value {
140
+ font-family: var(--demo-font-display);
141
+ font-variation-settings: "opsz" 48, "wght" 700;
142
+ font-size: clamp(2.25rem, 4vw, 3rem);
143
+ color: var(--demo-ink);
144
+ letter-spacing: -0.03em;
145
+ }
146
+
147
+ .demo-stat__label {
148
+ font-family: var(--demo-font-body);
149
+ font-weight: 700;
150
+ color: var(--demo-ink-muted);
151
+ }
152
+
153
+ .demo-stat[data-tone="pass"] { background: color-mix(in oklch, var(--demo-pass) 24%, var(--demo-surface)); }
154
+ .demo-stat[data-tone="fail"] { background: color-mix(in oklch, var(--demo-accent) 26%, var(--demo-surface)); }
155
+ .demo-stat[data-tone="skip"] { background: color-mix(in oklch, var(--demo-spot) 35%, var(--demo-surface)); }
156
+
157
+ /* Section heading gets a playful marker */
158
+ .demo-section-heading {
159
+ font-family: var(--demo-font-display);
160
+ font-variation-settings: "opsz" 48, "wght" 700;
161
+ position: relative;
162
+ display: inline-block;
163
+ padding-right: var(--demo-space-4);
164
+ }
165
+
166
+ .demo-section-heading::after {
167
+ content: "";
168
+ display: block;
169
+ width: 3rem;
170
+ height: 0.5rem;
171
+ background: var(--demo-spot);
172
+ border-radius: var(--demo-radius-pill);
173
+ margin-top: 0.5rem;
174
+ }
175
+
176
+ /* Story rows as cards with coloured numbers */
177
+ .demo-stories {
178
+ border-top: 0;
179
+ gap: var(--demo-space-3);
180
+ }
181
+
182
+ .demo-story {
183
+ background: var(--demo-surface);
184
+ border: 2px solid var(--demo-ink);
185
+ border-radius: var(--demo-radius-md);
186
+ grid-template-columns: 3rem 1fr auto;
187
+ padding: var(--demo-space-4) var(--demo-space-6);
188
+ box-shadow: 3px 3px 0 var(--demo-ink);
189
+ transition: transform 120ms ease-out, box-shadow 120ms ease-out;
190
+ }
191
+
192
+ .demo-story:hover {
193
+ transform: translate(-2px, -2px);
194
+ box-shadow: 5px 5px 0 var(--demo-ink);
195
+ background: var(--demo-surface);
196
+ }
197
+
198
+ .demo-story__index {
199
+ font-family: var(--demo-font-display);
200
+ font-variation-settings: "opsz" 24, "wght" 700;
201
+ font-size: 1.15rem;
202
+ color: var(--demo-accent);
203
+ }
204
+
205
+ .demo-story__title {
206
+ font-family: var(--demo-font-body);
207
+ font-weight: 600;
208
+ color: var(--demo-ink);
209
+ }
210
+
211
+ .demo-story__status {
212
+ font-family: var(--demo-font-body);
213
+ font-weight: 700;
214
+ }
215
+
216
+ .demo-story[data-status="passed"] .demo-story__status { color: var(--demo-pass); }
217
+ .demo-story[data-status="failed"] .demo-story__status { color: var(--demo-accent); }
218
+ .demo-story[data-status="skipped"] .demo-story__status { color: var(--demo-ink-muted); }
219
+
220
+ .demo-empty {
221
+ background: var(--demo-surface);
222
+ border: 2px dashed var(--demo-ink);
223
+ border-radius: var(--demo-radius-lg);
224
+ box-shadow: 4px 4px 0 var(--demo-ink);
225
+ }
226
+
227
+ /* ---- Story pages: poster-style steps --------------------------------- */
228
+
229
+ .sl-markdown-content p > strong:first-child {
230
+ font-family: var(--demo-font-display);
231
+ font-variation-settings: "opsz" 72, "wght" 700;
232
+ font-size: 1.4em;
233
+ color: var(--demo-accent);
234
+ letter-spacing: -0.02em;
235
+ transform: rotate(-1deg);
236
+ display: inline-block;
237
+ transform-origin: left center;
238
+ margin-right: 0.3ch;
239
+ }
240
+
241
+ /* Subtler colour rotation across consecutive steps; geometric rotation kept
242
+ tight so it doesn't break baseline alignment at narrow viewports. */
243
+ .sl-markdown-content p:has(> strong:first-child):nth-of-type(3n+2) > strong:first-child {
244
+ color: var(--demo-accent-2);
245
+ transform: rotate(0deg);
246
+ }
247
+
248
+ .sl-markdown-content p:has(> strong:first-child):nth-of-type(3n+3) > strong:first-child {
249
+ color: var(--demo-ink);
250
+ transform: rotate(0.5deg);
251
+ }
252
+
253
+ .sl-markdown-content h3 {
254
+ font-family: var(--demo-font-display);
255
+ font-variation-settings: "opsz" 96, "wght" 700;
256
+ letter-spacing: -0.025em;
257
+ color: var(--demo-ink);
258
+ }
259
+
260
+ /* Forced-mode theme: hide the (non-functional) theme toggle. */
261
+ starlight-theme-select {
262
+ display: none;
263
+ }
@@ -0,0 +1,218 @@
1
+ /*
2
+ * terminal — phosphor CRT.
3
+ * VT323 display, JetBrains Mono body. Near-black bg with green tint,
4
+ * phosphor-green ink, amber highlights. Forced dark.
5
+ */
6
+
7
+ @import "@fontsource/vt323/400.css";
8
+ @import "@fontsource/jetbrains-mono/400.css";
9
+ @import "@fontsource/jetbrains-mono/500.css";
10
+ @import "@fontsource/jetbrains-mono/700.css";
11
+
12
+ :root,
13
+ :root[data-theme="dark"] {
14
+ --demo-font-display: "VT323", "JetBrains Mono", monospace;
15
+ --demo-font-body: "JetBrains Mono", ui-monospace, monospace;
16
+ --demo-font-mono: "JetBrains Mono", ui-monospace, monospace;
17
+
18
+ --demo-bg: oklch(0.15 0.02 150);
19
+ --demo-surface: oklch(0.19 0.025 150);
20
+ --demo-ink: oklch(0.84 0.17 140);
21
+ /* Bumped from 0.56 to 0.66 — original tone failed WCAG AA (~3.8:1) on the
22
+ phosphor-tinted background; 0.66 measures ~4.7:1 while keeping the
23
+ muted-vs-primary distinction visible. */
24
+ --demo-ink-muted: oklch(0.66 0.13 140);
25
+ --demo-border: oklch(0.32 0.06 150);
26
+ --demo-accent: oklch(0.82 0.18 90);
27
+ --demo-accent-ink: oklch(0.15 0.02 150);
28
+
29
+ --demo-pass: oklch(0.84 0.17 140);
30
+ --demo-fail: oklch(0.70 0.21 25);
31
+ --demo-skip: oklch(0.78 0.15 90);
32
+ --demo-pending: oklch(0.62 0.05 150);
33
+
34
+ --sl-font: var(--demo-font-body);
35
+ --sl-font-mono: var(--demo-font-mono);
36
+
37
+ --sl-color-accent-low: oklch(0.28 0.09 140);
38
+ --sl-color-accent: var(--demo-accent);
39
+ --sl-color-accent-high: oklch(0.92 0.16 95);
40
+
41
+ --sl-color-bg: var(--demo-bg);
42
+ --sl-color-bg-nav: var(--demo-bg);
43
+ --sl-color-bg-sidebar: var(--demo-surface);
44
+ --sl-color-text: var(--demo-ink);
45
+ --sl-color-text-accent: var(--demo-accent);
46
+
47
+ color-scheme: dark;
48
+ }
49
+
50
+ body {
51
+ background:
52
+ radial-gradient(ellipse at top, oklch(0.20 0.03 150) 0%, var(--demo-bg) 70%),
53
+ var(--demo-bg);
54
+ background-attachment: fixed;
55
+ }
56
+
57
+ /* Big, soft phosphor headings — VT323 reads large */
58
+ .demo-hero__title,
59
+ .demo-section-heading,
60
+ .sl-markdown-content h1,
61
+ .sl-markdown-content h2 {
62
+ font-family: var(--demo-font-display);
63
+ font-weight: 400;
64
+ letter-spacing: 0.01em;
65
+ text-shadow: 0 0 12px color-mix(in oklch, var(--demo-ink) 40%, transparent);
66
+ }
67
+
68
+ .demo-hero__title {
69
+ font-size: clamp(3rem, 7vw, 6rem);
70
+ line-height: 1;
71
+ }
72
+
73
+ /* A blinking cursor cap on the hero title */
74
+ .demo-hero__title::after {
75
+ content: "_";
76
+ display: inline-block;
77
+ margin-left: 0.25ch;
78
+ color: var(--demo-accent);
79
+ animation: demo-blink 1s steps(1) infinite;
80
+ }
81
+
82
+ @keyframes demo-blink {
83
+ 50% { opacity: 0; }
84
+ }
85
+
86
+ .demo-hero__eyebrow::before {
87
+ content: "> ";
88
+ color: var(--demo-accent);
89
+ }
90
+
91
+ .demo-hero__eyebrow {
92
+ font-family: var(--demo-font-mono);
93
+ color: var(--demo-ink-muted);
94
+ letter-spacing: 0.1em;
95
+ text-transform: none;
96
+ }
97
+
98
+ /* CTA as a terminal button: bracketed, no rounding */
99
+ .demo-hero__cta {
100
+ border-radius: 0;
101
+ background: transparent;
102
+ color: var(--demo-accent);
103
+ border: 1px solid var(--demo-accent);
104
+ text-transform: uppercase;
105
+ letter-spacing: 0.12em;
106
+ font-family: var(--demo-font-mono);
107
+ }
108
+
109
+ .demo-hero__cta::before { content: "["; }
110
+ .demo-hero__cta::after { content: "]"; }
111
+
112
+ .demo-hero__cta:hover {
113
+ background: var(--demo-accent);
114
+ color: var(--demo-accent-ink);
115
+ transform: none;
116
+ }
117
+
118
+ /* Stats look like a system report */
119
+ .demo-stat {
120
+ background: transparent;
121
+ border: 1px dashed var(--demo-border);
122
+ border-radius: 0;
123
+ }
124
+
125
+ .demo-stat__value {
126
+ font-family: var(--demo-font-display);
127
+ font-weight: 400;
128
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
129
+ line-height: 1;
130
+ }
131
+
132
+ .demo-stat__label::before {
133
+ content: "// ";
134
+ color: var(--demo-accent);
135
+ }
136
+
137
+ /* Story list feels like ls -la output */
138
+ .demo-stories {
139
+ border-top: 1px dashed var(--demo-border);
140
+ }
141
+
142
+ .demo-story {
143
+ border-bottom: 1px dashed var(--demo-border);
144
+ grid-template-columns: 3.5rem 1fr auto;
145
+ font-family: var(--demo-font-mono);
146
+ }
147
+
148
+ .demo-story__title {
149
+ font-weight: 400;
150
+ font-size: 1rem;
151
+ }
152
+
153
+ .demo-story__title::before {
154
+ content: "./";
155
+ color: var(--demo-ink-muted);
156
+ margin-right: 0.25ch;
157
+ }
158
+
159
+ .demo-story:hover {
160
+ background: var(--demo-surface);
161
+ color: var(--demo-accent);
162
+ }
163
+
164
+ .demo-story:hover .demo-story__title {
165
+ color: var(--demo-accent);
166
+ }
167
+
168
+ .demo-empty {
169
+ border-style: dashed;
170
+ font-family: var(--demo-font-mono);
171
+ }
172
+
173
+ .demo-empty code::before { content: "$ "; color: var(--demo-accent); }
174
+
175
+ /* ---- Story pages: command-line steps --------------------------------- */
176
+
177
+ .sl-markdown-content p:has(> strong:first-child)::before {
178
+ content: ">";
179
+ color: var(--demo-accent);
180
+ font-family: var(--demo-font-mono);
181
+ font-weight: 700;
182
+ flex: 0 0 auto;
183
+ margin-right: 0.2ch;
184
+ }
185
+
186
+ .sl-markdown-content p > strong:first-child {
187
+ font-family: var(--demo-font-mono);
188
+ font-weight: 700;
189
+ text-transform: uppercase;
190
+ color: var(--demo-accent);
191
+ letter-spacing: 0.08em;
192
+ }
193
+
194
+ .sl-markdown-content h3 {
195
+ font-family: var(--demo-font-display);
196
+ font-weight: 400;
197
+ letter-spacing: 0.01em;
198
+ text-shadow: 0 0 10px color-mix(in oklch, var(--demo-ink) 35%, transparent);
199
+ }
200
+
201
+ .sl-markdown-content > h2:first-of-type::before {
202
+ content: "// ";
203
+ color: var(--demo-accent);
204
+ }
205
+
206
+ /* Forced-mode theme: hide the (non-functional) theme toggle. */
207
+ starlight-theme-select {
208
+ display: none;
209
+ }
210
+
211
+ /* Tone-coloured stat values — phosphor green for pass, amber for skip, red for fail. */
212
+ .demo-stat[data-tone="pass"] .demo-stat__value { color: var(--demo-pass); }
213
+ .demo-stat[data-tone="fail"] .demo-stat__value { color: var(--demo-fail); }
214
+ .demo-stat[data-tone="skip"] .demo-stat__value { color: var(--demo-skip); }
215
+ .demo-stat[data-tone="pending"] .demo-stat__value { color: var(--demo-pending); }
216
+ .demo-stat[data-tone="pass"] { border-color: color-mix(in oklch, var(--demo-pass) 50%, var(--demo-border)); }
217
+ .demo-stat[data-tone="fail"] { border-color: color-mix(in oklch, var(--demo-fail) 50%, var(--demo-border)); }
218
+ .demo-stat[data-tone="skip"] { border-color: color-mix(in oklch, var(--demo-skip) 50%, var(--demo-border)); }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "astro/tsconfigs/strict",
3
+ "include": [".astro/types.d.ts", "**/*"],
4
+ "exclude": ["dist"]
5
+ }