@stnd/styles 0.10.3 → 0.10.5

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.
@@ -329,7 +329,7 @@
329
329
  --color-light-border: oklch(from var(--color-light-foreground) l c h / 0.1);
330
330
  --color-light-surface: color-mix(
331
331
  in srgb,
332
- var(--color-light-foreground) 3%,
332
+ white 4%,
333
333
  var(--color-light-background)
334
334
  );
335
335
  --color-light-on-accent: var(--color-light-background);
@@ -343,7 +343,7 @@
343
343
  );
344
344
  --color-dark-surface: color-mix(
345
345
  in srgb,
346
- var(--color-dark-foreground) 3%,
346
+ white 4%,
347
347
  var(--color-dark-background)
348
348
  );
349
349
 
@@ -456,59 +456,46 @@
456
456
  *
457
457
  * @property --color-shadow Active base shadow color.
458
458
  * @property --color-highlight Active specular highlight color.
459
- * @property --color-surface-lowest Deepest recessed surface step.
460
- * @property --color-surface-lower Sub-surface step mixed with transparency.
461
- * @property --color-surface-low Low elevation surface step.
462
- * @property --color-surface Base surface color.
463
- * @property --color-surface-high Elevated surface step.
464
- * @property --color-surface-highest Highest surface elevation step.
459
+ * @property --color-surface Base surface color (defaults to surface-light-1).
460
+ * @property --color-surface-light-1 Subtle elevated surface step (cards, containers).
461
+ * @property --color-surface-light-2 Elevated surface step (popovers, menus, dialogs).
462
+ * @property --color-surface-light-3 High elevated surface step (active highlights, modals).
463
+ * @property --color-surface-dark-1 Recessed surface step (inputs, wells, code blocks).
464
+ * @property --color-surface-dark-2 Deep recessed surface step (switch tracks, sunken wells).
465
+ * @property --color-surface-dark-3 Deepest recessed surface step.
465
466
  */
466
467
 
467
468
  /* Semantic Shadow Seeds */
468
469
  --color-shadow: var(--color-light-shadow-base);
469
470
  --color-highlight: var(--color-light-highlight);
470
471
 
471
- /* Surface elevation scale */
472
- --color-surface-low: color-mix(
473
- in srgb,
474
- var(--color-foreground) 3%,
475
- var(--color-surface)
476
- );
477
- --color-surface-lowest: color-mix(
478
- in srgb,
479
- var(--color-foreground) 3%,
480
- var(--color-surface-low)
481
- );
482
- --color-surface-lower: color-mix(
483
- in srgb,
484
- var(--color-foreground) 3%,
485
- transparent
486
- );
472
+ /* Directional surface scale (lighter & darker than background) */
473
+ --color-surface-light-1: color-mix(in srgb, white 4%, var(--color-background));
474
+ --color-surface-light-2: color-mix(in srgb, white 9%, var(--color-background));
475
+ --color-surface-light-3: color-mix(in srgb, white 16%, var(--color-background));
476
+
477
+ --color-surface-dark-1: color-mix(in srgb, black 4%, var(--color-background));
478
+ --color-surface-dark-2: color-mix(in srgb, black 9%, var(--color-background));
479
+ --color-surface-dark-3: color-mix(in srgb, black 16%, var(--color-background));
480
+
481
+ /* Canonical base surface */
482
+ --color-surface: var(--color-surface-light-1);
487
483
 
488
- --color-surface-high: color-mix(in srgb, white 50%, var(--color-surface));
489
- --color-surface-highest: color-mix(
490
- in srgb,
491
- white 50%,
492
- var(--color-surface-high)
493
- );
494
- --color-surface-higher: color-mix(in srgb, white 50%, transparent);
495
484
  /**
496
485
  * @component Border Shorthands
497
486
  * @category Foundation
498
487
  * @description Pre-composed border shorthand tokens for clean layout boundaries.
499
488
  *
500
489
  * @property --border Standard border shorthand (`var(--stroke-width) solid var(--color-border)`).
490
+ * @property --border-hover Hover border shorthand (`var(--stroke-width) solid var(--color-foreground)`).
501
491
  * @property --border-accent Tinted accent border shorthand (`var(--stroke-width) solid oklch(...)`).
502
492
  * @property --border-transparent Transparent layout placeholder border.
503
493
  */
504
494
  --border-transparent: var(--stroke-width) solid transparent;
505
495
  --border-accent: var(--stroke-width) solid
506
496
  oklch(from var(--color-accent) l c h / 0.07);
507
- /* Regressed to `0 solid transparent` at some point, then a prior audit
508
- correctly flagged it as dead code but "fixed" it to `none` instead of
509
- restoring the real value. Git history confirms the intended value —
510
- unchanged across many commits before the regression — was this. */
511
497
  --border: var(--stroke-width) solid var(--color-border);
498
+ --border-hover: var(--stroke-width) solid var(--color-foreground);
512
499
  }
513
500
 
514
501
  /* =====================================================================
@@ -550,40 +537,23 @@
550
537
 
551
538
  /* Adjusted opacity for dark backgrounds */
552
539
  --color-subtle: var(--color-dark-subtle);
553
- --color-muted: var(--color-dark-muted);
554
540
  --color-border: var(--color-dark-border);
555
- --color-surface: var(--color-dark-surface);
556
541
 
557
542
  --color-shadow: var(--color-dark-shadow-base);
558
543
  --color-highlight: var(--color-dark-highlight);
559
544
 
560
545
  --shadow-xl: var(--shadow-glow);
561
546
 
562
- /* Surface elevation scale */
563
-
564
- --color-surface-low: color-mix(in srgb, black 3%, var(--color-surface));
565
- --color-surface-lowest: color-mix(
566
- in srgb,
567
- black 7%,
568
- var(--color-surface-low)
569
- );
570
- --color-surface-lower: color-mix(in srgb, black 7%, transparent);
571
-
572
- --color-surface-high: color-mix(
573
- in srgb,
574
- var(--color-dark-foreground) 3%,
575
- var(--color-surface)
576
- );
577
- --color-surface-highest: color-mix(
578
- in srgb,
579
- var(--color-dark-foreground) 3%,
580
- var(--color-surface-high)
581
- );
582
- --color-surface-higher: color-mix(
583
- in srgb,
584
- var(--color-dark-foreground) 3%,
585
- transparent
586
- );
547
+ /* Directional surface scale in dark mode */
548
+ --color-surface-light-1: color-mix(in srgb, white 4%, var(--color-background));
549
+ --color-surface-light-2: color-mix(in srgb, white 9%, var(--color-background));
550
+ --color-surface-light-3: color-mix(in srgb, white 16%, var(--color-background));
551
+
552
+ --color-surface-dark-1: color-mix(in srgb, black 4%, var(--color-background));
553
+ --color-surface-dark-2: color-mix(in srgb, black 9%, var(--color-background));
554
+ --color-surface-dark-3: color-mix(in srgb, black 16%, var(--color-background));
555
+
556
+ --color-surface: var(--color-surface-light-1);
587
557
  }
588
558
  }
589
559
 
@@ -608,7 +578,7 @@
608
578
  --color-muted: var(--color-light-muted);
609
579
  --color-subtle: var(--color-light-subtle);
610
580
  --color-border: var(--color-light-border);
611
- --color-surface: var(--color-light-surface);
581
+ --color-surface: var(--color-surface-light-1);
612
582
  --color-shadow: var(--color-light-shadow-base);
613
583
  --color-highlight: var(--color-light-highlight);
614
584
  --color-light: var(--color-light-background);
@@ -623,7 +593,7 @@
623
593
  --color-muted: var(--color-dark-muted);
624
594
  --color-subtle: var(--color-dark-subtle);
625
595
  --color-border: var(--color-dark-border);
626
- --color-surface: var(--color-dark-surface);
596
+ --color-surface: var(--color-surface-light-1);
627
597
  --color-shadow: var(--color-dark-shadow-base);
628
598
  --color-highlight: var(--color-dark-highlight);
629
599
  --color-light: var(--color-dark-foreground);
@@ -137,37 +137,37 @@ h6 {
137
137
  controls heading line-height now. */
138
138
  h1 {
139
139
  font-weight: var(--font-weight-h1);
140
- font-size: clamp(var(--size-xl), 5.5vw, var(--size-2xl));
140
+ font-size: clamp(var(--scale-3), 5.5vw, var(--scale-4));
141
141
  line-height: var(--font-header-line-height, 1);
142
142
  }
143
143
 
144
144
  h2 {
145
145
  font-weight: var(--font-weight-h2);
146
- font-size: clamp(var(--size-lg), 4vw, var(--size-xl));
146
+ font-size: clamp(var(--scale-2), 4vw, var(--scale-3));
147
147
  line-height: var(--font-header-line-height, 1);
148
148
  }
149
149
 
150
150
  h3 {
151
151
  font-weight: var(--font-weight-h3);
152
- font-size: clamp(var(--size-base), 3vw, var(--size-lg));
152
+ font-size: clamp(var(--scale), 3vw, var(--scale-2));
153
153
  line-height: var(--font-header-line-height, 1);
154
154
  }
155
155
 
156
156
  h4 {
157
157
  font-weight: var(--font-weight);
158
- font-size: var(--size-base);
158
+ font-size: var(--scale);
159
159
  line-height: var(--line-height);
160
160
  }
161
161
 
162
162
  h5 {
163
163
  font-weight: var(--font-weight);
164
- font-size: var(--size-sm);
164
+ font-size: var(--scale-d2);
165
165
  line-height: var(--line-height);
166
166
  }
167
167
 
168
168
  h6 {
169
169
  font-weight: var(--font-weight);
170
- font-size: var(--size-xs);
170
+ font-size: var(--scale-d3);
171
171
  line-height: var(--line-height);
172
172
  }
173
173
 
@@ -191,7 +191,7 @@ h6 {
191
191
  .overline {
192
192
  font-variant-caps: small-caps;
193
193
  letter-spacing: 0.04em;
194
- font-size: var(--size-sm);
194
+ font-size: var(--scale-d2);
195
195
  border-top: var(--stroke-width) solid var(--color-border);
196
196
  padding-block-start: var(--space-d2);
197
197
  margin-block-end: var(--space);
@@ -202,7 +202,7 @@ a {
202
202
  color: var(--color-link);
203
203
  text-decoration: none;
204
204
  text-decoration-thickness: var(--stroke-width);
205
- text-underline-offset: calc(var(--stroke-width) * 2);
205
+ text-underline-offset: var(--trim);
206
206
  text-decoration-color: transparent;
207
207
  box-shadow: none;
208
208
  transition:
@@ -221,7 +221,7 @@ a:hover {
221
221
  a[target="_blank"]:not(.internal-link)::after {
222
222
  content: "↗";
223
223
  display: inline-block;
224
- font-size: var(--size-xs);
224
+ font-size: var(--scale-d3);
225
225
  color: var(--color-subtle);
226
226
  margin-inline-start: 0.2em;
227
227
  transition: all var(--transition-fast);
@@ -236,7 +236,7 @@ a[target="_blank"]:not(.internal-link):hover::after {
236
236
  transition: all var(--transition-fast);
237
237
  &::after {
238
238
  content: "⊗";
239
- font-size: var(--size-xs);
239
+ font-size: var(--scale-d3);
240
240
  color: var(--color-error);
241
241
  margin-inline-start: 0.2em;
242
242
  }
@@ -261,7 +261,7 @@ a[target="_blank"]:not(.internal-link):hover::after {
261
261
  font-variation-settings: var(--font-interface-variation);
262
262
  font-feature-settings: var(--font-interface-feature);
263
263
  font-weight: var(--font-interface-weight, var(--font-weight));
264
- font-size: var(--size-xs);
264
+ font-size: var(--scale-d3);
265
265
  }
266
266
 
267
267
  code,
@@ -287,12 +287,12 @@ blockquote {
287
287
 
288
288
  /* Utilities & Inline Elements */
289
289
  small {
290
- font-size: var(--size-sm);
290
+ font-size: var(--scale-d2);
291
291
  }
292
292
 
293
293
  sub,
294
294
  sup {
295
- font-size: var(--size-xs);
295
+ font-size: var(--scale-d3);
296
296
  line-height: 0;
297
297
  }
298
298
 
@@ -321,14 +321,14 @@ mark {
321
321
 
322
322
  /* Keycaps */
323
323
  kbd {
324
- background-color: var(--color-surface);
324
+ background-color: var(--color-surface-light-2);
325
325
  background-image: var(--effect-grain);
326
326
  border: none;
327
- border-radius: var(--radius);
327
+ border-radius: var(--radius-sm);
328
328
  box-shadow: var(--shadow);
329
- padding: var(--space-d6) var(--space-d3);
329
+ padding: calc(var(--trim) / 2) var(--trim);
330
330
  font-family: var(--font-monospace);
331
- font-size: var(--size-xs);
331
+ font-size: var(--scale-d3);
332
332
  pointer-events: none;
333
333
  }
334
334
 
@@ -102,7 +102,7 @@ $grid-selectors: ".grid, .grid-row";
102
102
  /* Gap variants aligned to rhythm — this is the LIVE definition (sets --gap,
103
103
  the property actually consumed by column-gap/row-gap above). */
104
104
  :is(.grid, [class^="grid-"]).compact {
105
- --gap: var(--trim);
105
+ --gap: var(--gap-compact);
106
106
  }
107
107
 
108
108
  :is(.grid, [class^="grid-"]).relaxed {
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * @property .rhythm The container class. Sets `display: flow-root` so child margins cannot collapse out of it.
14
14
  * @property .no-rhythm Zeroes `margin-block-start` on every descendant — a subtree-wide rhythm opt-out.
15
- * @property --gap-multiplicator Rhythm multiplier factor for block-level spacing and heading exceptions.
15
+ * @property --rhythm-block-scale Rhythm multiplier factor for block-level spacing and heading exceptions.
16
16
  * @property .flex > * Zeroes `margin-block-start` for flex children so margins do not stack with flex gap.
17
17
  *
18
18
  * @example html - Turn any container into a rhythm block
@@ -50,38 +50,38 @@
50
50
  top-level document flow only) — flagging since the asymmetry itself
51
51
  isn't declared anywhere, just falls out of one missing `>`. */
52
52
  :where(:is(#{$rhythm-tags})) + :where(:is(#{$rhythm-tags})) {
53
- margin-block-start: calc(var(--gap) * 1);
53
+ margin-block-start: var(--space);
54
54
  }
55
55
 
56
56
  > :where(:is(#{$rhythm-double-tags})) + :where(:is(#{$rhythm-simple-tags})),
57
57
  > :where(:is(#{$rhythm-simple-tags})) + :where(:is(#{$rhythm-double-tags})) {
58
- margin-block-start: calc(var(--gap) * var(--gap-multiplicator, 2));
58
+ margin-block-start: calc(var(--space) * var(--rhythm-block-scale, 2));
59
59
  }
60
60
 
61
61
  // EXCEPTIONS
62
62
  //*
63
63
  > :where(:is(#{$rhythm-tags})) ~ :where(:is(h1, h2)) {
64
64
  margin-block-start: calc(
65
- var(--gap) * calc(var(--gap-multiplicator, 2) + 2)
65
+ var(--space) * calc(var(--rhythm-block-scale, 2) + 2)
66
66
  );
67
67
  }
68
68
 
69
69
  > :where(:is(#{$rhythm-tags})) ~ :where(:is(h3, h4, h5, h6)) {
70
70
  margin-block-start: calc(
71
- var(--gap) * calc(var(--gap-multiplicator, 2) + 1)
71
+ var(--space) * calc(var(--rhythm-block-scale, 2) + 1)
72
72
  );
73
73
  }
74
74
 
75
75
  > :where(:is(h1, h2, h3, h4)) + :where(:is(h2, h3, h4, h5, h6)) {
76
- margin-block-start: calc(var(--gap) * var(--gap-multiplicator, 2));
76
+ margin-block-start: calc(var(--space) * var(--rhythm-block-scale, 2));
77
77
  }
78
78
 
79
79
  > :where(:is(h1, h2, h3)) + * {
80
- margin-block-start: calc(var(--gap) * var(--gap-multiplicator, 2));
80
+ margin-block-start: calc(var(--space) * var(--rhythm-block-scale, 2));
81
81
  }
82
82
 
83
83
  > :where(:is(h4, h5, h6)) + * {
84
- margin-block-start: calc(var(--gap) * 1);
84
+ margin-block-start: var(--space);
85
85
  }
86
86
 
87
87
  //*/
@@ -10,18 +10,12 @@
10
10
  *
11
11
  * @property .prose Main article/content grid container for readable prose with named tracks.
12
12
  * @property .prose.left Left-aligned prose variant hugging the left edge.
13
- * @property .small Narrow sidebar breakout column track.
14
- * @property .editorial Editorial column breakout track (`minmax(0, var(--space-2))`).
15
- * @property .feature Feature callout breakout track (`minmax(0, var(--space-4))`).
16
- * @property .hero Full-bleed viewport width hero track (`minmax(0, 1fr)`).
17
- * @property .full Full viewport width breakout track.
18
- * @property --line-width Active reading column measure.
19
- * @property --line-width-xs Extra small reading measure (24rem / 384px).
20
- * @property --line-width-sm Small reading measure (32rem / 512px).
21
- * @property --line-width-md Medium reading measure (42rem / 672px) - default.
22
- * @property --line-width-lg Large reading measure (50rem / 800px).
23
- * @property --line-width-xl Extra large reading measure (60rem / 960px).
24
- * @property --body-max-width Overall page max-width constraint (900px).
13
+ * @property .narrow Inset element narrower than prose reading column (`var(--prose-inset)`).
14
+ * @property .wide Breakout column extending past prose reading column (`var(--prose-breakout)`).
15
+ * @property .full Full container width breakout track spanning to `--page-max-width`.
16
+ * @property .full-bleed Full viewport width breakout track (`100vw`).
17
+ * @property --prose-width Active reading column measure.
18
+ * @property --page-max-width Overall page max-width constraint (1400px).
25
19
  *
26
20
  * @example
27
21
  * // Standard article with proper reading width
@@ -57,35 +51,26 @@
57
51
  &.left {
58
52
  margin-inline: 0;
59
53
  grid-template-columns:
60
- [hero-start feature-start editorial-start content-start] var(
61
- --content-width
62
- )
63
- [content-end editorial-end feature-end] 1fr [hero-end];
54
+ [full-start wide-start content-start] min(100%, var(--prose-width))
55
+ [content-end wide-end] 1fr [full-end];
64
56
  }
65
57
 
66
58
  grid-template-columns:
67
- [hero-start] var(--content-width-hero)
68
- [feature-start] var(--content-width-feature) [editorial-start] var(
69
- --content-width-editorial
70
- )
71
- [content-start] var(--content-width) [content-end] var(
72
- --content-width-editorial
73
- )
74
- [editorial-end] var(--content-width-feature) [feature-end] var(
75
- --content-width-hero
76
- )
77
- [hero-end];
59
+ [full-start] var(--prose-track-full, minmax(0, 1fr))
60
+ [wide-start] var(--prose-breakout, minmax(0, var(--space)))
61
+ [content-start] min(100%, var(--prose-width)) [content-end]
62
+ var(--prose-breakout, minmax(0, var(--space))) [wide-end]
63
+ var(--prose-track-full, minmax(0, 1fr)) [full-end];
78
64
 
79
65
  transition: grid-template-columns var(--transition);
80
66
 
81
67
  position: relative;
82
68
  width: 100%;
83
- max-width: var(--body-max-width);
69
+ max-width: var(--page-max-width);
84
70
  margin-inline: auto;
85
- padding-inline: var(--gap-body);
86
- /*z-index: var(--z-base);*/
87
- /* Default content positioning */
71
+ padding-inline: var(--page-padding);
88
72
 
73
+ /* Default content positioning */
89
74
  > * {
90
75
  grid-column: content;
91
76
  min-width: 0;
@@ -102,52 +87,40 @@
102
87
  min-width: 0;
103
88
  }
104
89
 
105
- > .small,
106
- > .container-small,
90
+ /* Narrow: inset elements (callouts, blockquotes, code blocks, or .narrow) */
91
+ > .narrow,
92
+ > .container-narrow,
107
93
  > .callout,
108
94
  > blockquote,
109
95
  > pre,
110
- > figure:not(.full-bleed):not(.breakout),
111
- > p:has(img:not(.full-bleed):not(.breakout):not(.hero):not(.full)),
96
+ > figure:not(.full-bleed):not(.wide):not(.full),
97
+ > p:has(img:not(.full-bleed):not(.wide):not(.full)),
112
98
  > .stnd-code-block {
113
99
  grid-column: content;
114
- margin-inline: var(--content-width-sm);
100
+ margin-inline: var(--prose-inset);
115
101
  }
116
102
 
103
+ /* Wide: breakout elements (tables, or .wide / .container-wide) */
117
104
  table,
118
105
  .scroll:has(table),
119
- .editorial {
120
- grid-column: editorial;
121
- margin-inline: 0;
122
- max-width: none;
123
- }
124
-
125
- .feature {
126
- grid-column: feature;
106
+ .wide,
107
+ .container-wide,
108
+ p:has(> img.wide),
109
+ p:has(> video.wide) {
110
+ grid-column: wide;
127
111
  margin-inline: 0;
128
112
  max-width: none;
129
113
  }
130
114
 
131
- .breakout,
132
- p:has(> img.breakout),
133
- p:has(> video.breakout),
134
- figure.breakout {
135
- grid-column: 1 / -1;
136
- width: min(100%, 72rem);
137
- max-width: 72rem;
138
- margin-inline: auto !important;
139
- }
140
-
115
+ /* Full: spans to page shell (--page-max-width) */
141
116
  .full,
142
- .hero,
143
- p:has(> img.hero),
117
+ .container-full,
144
118
  p:has(> img.full),
145
- p:has(> video.hero),
146
119
  p:has(> video.full) {
147
- grid-column: 1 / -1;
148
- width: calc(100% + var(--gap-body) * 2);
149
- max-width: calc(100% + var(--gap-body) * 2);
150
- margin-inline: calc(var(--gap-body) * -1);
120
+ grid-column: full;
121
+ width: calc(100% + var(--page-padding) * 2);
122
+ max-width: calc(100% + var(--page-padding) * 2);
123
+ margin-inline: calc(var(--page-padding) * -1);
151
124
  border-radius: 0 !important;
152
125
 
153
126
  > * {
@@ -185,7 +158,7 @@
185
158
  margin-inline: auto;
186
159
  width: min(100%, 18rem);
187
160
  position: relative;
188
- scroll-margin-top: calc(var(--gap-header, 3.5rem) + 1.5rem);
161
+ scroll-margin-top: var(--space-6);
189
162
 
190
163
  &.screen-full {
191
164
  width: 100%;
@@ -209,7 +182,7 @@
209
182
  grid-column: 1 / -1;
210
183
  width: 100%;
211
184
  margin-block: var(--gap-section, 4rem);
212
- scroll-margin-top: calc(var(--gap-header, 3.5rem) + 1.5rem);
185
+ scroll-margin-top: var(--space-6);
213
186
 
214
187
  &.screen-full {
215
188
  min-height: 85vh;
@@ -290,7 +263,8 @@
290
263
  }
291
264
 
292
265
  @media (max-width: #{$mobile}) {
293
- .container-small,
266
+ .narrow,
267
+ .container-narrow,
294
268
  .callout,
295
269
  blockquote,
296
270
  pre,
@@ -303,8 +277,7 @@
303
277
 
304
278
  @media (max-width: #{$small}) {
305
279
  .card.accent,
306
- .card.feature,
307
- .card.editorial,
280
+ .card.wide,
308
281
  .card.full {
309
282
  margin-inline: calc(var(--space) * -1);
310
283
  border-radius: 0;
@@ -327,7 +300,7 @@
327
300
  }
328
301
 
329
302
  /* Fixed 2026-07-14 — swapped undefined tokens for their real equivalents
330
- (--color-muted, --color-accent, --color-surface-high). */
303
+ (--color-muted, --color-accent, --color-surface-light-2). */
331
304
  .mycelial-link,
332
305
  .mycelial-graft {
333
306
  text-decoration: none;
@@ -339,7 +312,7 @@
339
312
  &:hover {
340
313
  color: var(--color-accent);
341
314
  border-bottom: 1px solid var(--color-accent);
342
- background-color: var(--color-surface-high);
315
+ background-color: var(--color-surface-light-2);
343
316
  }
344
317
  }
345
318
  }
@@ -9,7 +9,7 @@
9
9
  * inside `.prose`), theme-transition rules, and selection/mark highlights.
10
10
  *
11
11
  * @property html Root element establishing background color, foreground text color, font smoothing, and smooth scrolling.
12
- * @property body Document container centered at `--body-max-width` with responsive padding and scroll margins.
12
+ * @property body Document container centered at `--page-max-width` with responsive padding and scroll margins.
13
13
  * @property .no-body-margin Full-bleed helper applied to `<header>` or `<footer>` to extend edge-to-edge past body padding.
14
14
  * @property .container-hero Hero section container with vertical padding and hairline borders.
15
15
  * @property ::selection Custom highlight selection using subtle yellow background tint and accent text color.
@@ -33,7 +33,7 @@ html {
33
33
  -webkit-overflow-scrolling: touch;
34
34
 
35
35
  font-family: var(--font-text), system-ui, sans-serif;
36
- font-size: var(--size-base);
36
+ font-size: var(--scale);
37
37
  font-weight: var(--font-weight);
38
38
  letter-spacing: var(--font-letter-spacing);
39
39
 
@@ -85,8 +85,6 @@ body {
85
85
  body {
86
86
  margin: 0;
87
87
  padding: 0;
88
- padding-top: var(--gap-header);
89
- padding-bottom: var(--gap-footer);
90
88
  width: 100%;
91
89
  min-height: 100vh;
92
90
 
@@ -99,15 +97,15 @@ body {
99
97
 
100
98
  [id] {
101
99
  /* Keeps anchor-linked headings from landing under the sticky header. */
102
- scroll-margin-top: calc(var(--space-2) + var(--gap-header));
100
+ scroll-margin-top: calc(var(--space-2) + 4rem);
103
101
  }
104
102
  }
105
103
 
106
104
  .container {
107
105
  width: 100%;
108
- max-width: var(--body-max-width);
106
+ max-width: var(--page-max-width);
109
107
  margin-inline: auto;
110
- padding-inline: var(--gap-body);
108
+ padding-inline: var(--page-padding);
111
109
  }
112
110
 
113
111
  main {
@@ -142,7 +140,7 @@ h6,
142
140
  li,
143
141
  div.callout,
144
142
  summary {
145
- max-width: var(--line-width);
143
+ max-width: var(--prose-width);
146
144
  }
147
145
  p:has(img),
148
146
  blockquote p {
@@ -168,7 +166,7 @@ section.container-hero {
168
166
  box-shadow: var(--shadow);
169
167
 
170
168
  p {
171
- max-width: var(--line-width);
169
+ max-width: var(--prose-width);
172
170
  margin-inline: auto !important;
173
171
  }
174
172
  }
@@ -202,37 +200,13 @@ dt {
202
200
  valid enough HTML that it would have rendered live on the docs page,
203
201
  not shown as a code sample. */
204
202
 
205
- /* Negate horizontal body padding (left/right) — allows full-width
206
- backgrounds while keeping vertical padding. */
207
-
208
- body > footer.no-body-margin:last-of-type,
209
- body > header.no-body-margin:first-of-type {
210
- margin-inline: calc(var(--gap-body) * -1);
211
- padding-inline: calc(var(--gap-body) * 1);
212
-
213
- @media (max-width: #{$small}) {
214
- margin-inline: calc(var(--gap-body-mobile) * -1);
215
- }
216
- }
217
-
218
- /* Negate bottom body padding (extra 1.5× multiplier) — removes the
219
- generous bottom padding applied to body elements, for a footer that
220
- should sit flush at the bottom. */
221
- body > footer.no-body-margin:last-of-type {
222
- margin-block-end: calc(var(--gap-body) * -1.5);
223
-
224
- @media (max-width: #{$small}) {
225
- margin-block-end: calc(var(--gap-body-mobile) * -1.5);
226
- }
227
- }
228
-
229
- /* Fixed 2026-07-14 — was margin-block-end (wrong property, copy-paste
230
- typo), now correctly overrides margin-block-start to match the footer's
231
- symmetric pattern. */
232
- body > header.no-body-margin:first-of-type {
233
- margin-block-start: calc(var(--gap-body) * -1);
234
-
235
- @media (max-width: #{$small}) {
236
- margin-block-start: calc(var(--gap-body-mobile) * -1);
237
- }
203
+ /* Safe default containment for direct body children:
204
+ every element placed directly in body is centered and padded
205
+ unless explicitly marked full-bleed, a header, or a footer. */
206
+ body > :not(.full-bleed, .stnd-header, .stnd-footer, [data-full-bleed], script, style, template, astro-island) {
207
+ width: 100%;
208
+ max-width: var(--page-max-width);
209
+ margin-inline: auto;
210
+ padding-inline: var(--page-padding);
211
+ box-sizing: border-box;
238
212
  }
@@ -78,7 +78,7 @@ figure {
78
78
  }
79
79
 
80
80
  figcaption {
81
- font-size: var(--size-sm);
81
+ font-size: var(--scale-d2);
82
82
  font-style: italic;
83
83
  text-align: center;
84
84
  }