maverick-wave 5.24.0 → 5.26.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.
Files changed (90) hide show
  1. package/.claude/skills/mw-maverick-wave/SKILL.md +32 -5
  2. package/.claude/skills/mw-maverick-wave/references/components.md +4 -0
  3. package/.claude/skills/mw-maverick-wave/references/javascript.md +44 -8
  4. package/.claude/skills/mw-maverick-wave/references/layout.md +39 -11
  5. package/.claude/skills/mw-maverick-wave/references/theming.md +34 -10
  6. package/CHANGELOG.md +20 -0
  7. package/CLAUDE.md +4 -0
  8. package/README.md +4 -2
  9. package/index.html +13 -0
  10. package/maverick-wave.min.css +7 -5
  11. package/maverick-wave.min.js +1 -1
  12. package/package.json +2 -2
  13. package/src/js/main.js +149 -57
  14. package/src/partials/accordions-container.html +1 -1
  15. package/src/partials/alerts-container.html +1 -1
  16. package/src/partials/announcement-container.html +1 -1
  17. package/src/partials/avatars-container.html +1 -1
  18. package/src/partials/badges-container.html +1 -1
  19. package/src/partials/blog-posts-container.html +2 -2
  20. package/src/partials/breadcrumbs-container.html +1 -1
  21. package/src/partials/button-bar-container.html +1 -1
  22. package/src/partials/buttons-container.html +1 -1
  23. package/src/partials/calendar-container.html +1 -1
  24. package/src/partials/cards-container.html +1 -1
  25. package/src/partials/code-container.html +1 -1
  26. package/src/partials/colors-container.html +3 -3
  27. package/src/partials/coming-soon-container.html +1 -1
  28. package/src/partials/contact-container.html +1 -1
  29. package/src/partials/divider-container.html +1 -1
  30. package/src/partials/dropdown-container.html +1 -1
  31. package/src/partials/empty-state-container.html +1 -1
  32. package/src/partials/form-container.html +1 -1
  33. package/src/partials/form-elements-container.html +1 -1
  34. package/src/partials/form-field-container.html +1 -1
  35. package/src/partials/gallery-container.html +1 -1
  36. package/src/partials/get-started-container.html +5 -10
  37. package/src/partials/grid-container.html +1 -1
  38. package/src/partials/header-utilities-container.html +2 -2
  39. package/src/partials/html-lists-container.html +1 -1
  40. package/src/partials/info-container.html +1 -1
  41. package/src/partials/input-group-container.html +2 -4
  42. package/src/partials/item-lists-container.html +1 -1
  43. package/src/partials/kanban-container.html +2 -2
  44. package/src/partials/kbd-container.html +1 -1
  45. package/src/partials/leader-row-container.html +2 -2
  46. package/src/partials/login-container.html +2 -2
  47. package/src/partials/lunch-menu-container.html +2 -2
  48. package/src/partials/media-container.html +1 -1
  49. package/src/partials/meta-info-container.html +1 -1
  50. package/src/partials/modals-container.html +1 -1
  51. package/src/partials/page-header-container.html +1 -1
  52. package/src/partials/pagination-container.html +2 -2
  53. package/src/partials/palette-container.html +2 -2
  54. package/src/partials/panels-container.html +2 -2
  55. package/src/partials/parallax-container.html +1 -1
  56. package/src/partials/pricing-container.html +2 -2
  57. package/src/partials/progress-container.html +1 -1
  58. package/src/partials/prose-container.html +1 -1
  59. package/src/partials/ratings-container.html +1 -1
  60. package/src/partials/section-head-container.html +6 -3
  61. package/src/partials/segmented-container.html +1 -1
  62. package/src/partials/skeleton-container.html +1 -1
  63. package/src/partials/spinners-container.html +1 -1
  64. package/src/partials/stepper-container.html +1 -1
  65. package/src/partials/tables-container.html +1 -1
  66. package/src/partials/tabs-container.html +1 -1
  67. package/src/partials/tags-container.html +1 -7
  68. package/src/partials/testimonials-container.html +1 -1
  69. package/src/partials/tiles-container.html +1 -1
  70. package/src/partials/typography-container.html +1 -1
  71. package/src/partials/utilities-container.html +1 -1
  72. package/src/scss/base/_base.scss +21 -5
  73. package/src/scss/components/_blog-post.scss +15 -10
  74. package/src/scss/components/_button-bar.scss +10 -6
  75. package/src/scss/components/_code.scss +23 -34
  76. package/src/scss/components/_info.scss +8 -1
  77. package/src/scss/components/_kanban.scss +6 -6
  78. package/src/scss/components/_meta-info.scss +7 -6
  79. package/src/scss/components/_tables.scss +6 -4
  80. package/src/scss/components/_tiles.scss +20 -30
  81. package/src/scss/layout/_grid.scss +28 -0
  82. package/src/scss/layout/_header.scss +16 -9
  83. package/src/scss/layout/_home.scss +21 -2
  84. package/src/scss/layout/_main.scss +7 -7
  85. package/src/scss/layout/_page-header.scss +4 -4
  86. package/src/scss/layout/_section.scss +33 -10
  87. package/src/scss/main-lean.scss +16 -0
  88. package/src/scss/utilities/_index.scss +1 -0
  89. package/src/scss/utilities/_print.scss +107 -0
  90. package/src/scss/utilities/_touch-targets.scss +4 -0
@@ -3,7 +3,8 @@
3
3
  @layer mw.components {
4
4
  .mw-button-bar {
5
5
  display: flex;
6
- gap: spacing('3');
6
+ flex-direction: column;
7
+ gap: spacing('2');
7
8
  align-items: center;
8
9
  justify-content: center;
9
10
  flex-wrap: wrap;
@@ -11,17 +12,20 @@
11
12
  border-radius: radius('md');
12
13
  padding: spacing('2');
13
14
 
15
+ .mw-btn {
16
+ width: 100%;
17
+ }
18
+
14
19
  &:hover {
15
20
  border-color: var(--mw-border-accent);
16
21
  }
17
22
 
18
- @include media-down('sm') {
19
- flex-direction: column;
20
- gap: spacing('2');
23
+ @include media-up('sm') {
24
+ flex-direction: row;
25
+ gap: spacing('3');
21
26
 
22
27
  .mw-btn {
23
- width: 100%;
24
- min-width: 0;
28
+ width: auto;
25
29
  }
26
30
  }
27
31
  }
@@ -42,15 +42,15 @@
42
42
  white-space: pre-wrap;
43
43
  display: block;
44
44
  line-height: 1.5;
45
+ font-size: font-size('3xs');
45
46
 
46
- @include media-down('sm') {
47
+ @include media-up('xs') {
47
48
  font-size: font-size('2xs');
48
- white-space: pre-wrap;
49
- word-break: break-word;
50
49
  }
51
50
 
52
- @include media-down('xs') {
53
- font-size: font-size('3xs');
51
+ // Back to the shared `code, pre` size
52
+ @include media-up('sm') {
53
+ font-size: font-size('xs');
54
54
  }
55
55
  }
56
56
  }
@@ -80,10 +80,13 @@
80
80
  &-filename {
81
81
  font-weight: font-weight('medium');
82
82
  margin-right: spacing('2');
83
+ font-size: font-size('2xs');
84
+ // The header wraps at this width, so the language chip needs its own line
85
+ margin-bottom: spacing('1');
83
86
 
84
- @include media-down('sm') {
85
- font-size: font-size('2xs');
86
- margin-bottom: spacing('1');
87
+ @include media-up('sm') {
88
+ font-size: font-size('xs');
89
+ margin-bottom: spacing('0');
87
90
  }
88
91
  }
89
92
 
@@ -102,19 +105,16 @@
102
105
  border: none;
103
106
  max-width: 100%;
104
107
  overflow-x: auto;
108
+ font-size: font-size('3xs');
109
+ padding: spacing('1');
105
110
 
106
- @include media-down('sm') {
111
+ @include media-up('xs') {
107
112
  font-size: font-size('2xs');
108
- padding: spacing('1');
109
-
110
- code {
111
- white-space: pre-wrap;
112
- word-break: break-word;
113
- }
114
113
  }
115
114
 
116
- @include media-down('xs') {
117
- font-size: font-size('3xs');
115
+ @include media-up('sm') {
116
+ font-size: font-size('xs');
117
+ padding: spacing('4');
118
118
  }
119
119
  }
120
120
  }
@@ -213,18 +213,6 @@
213
213
  overflow-x: auto;
214
214
  position: relative;
215
215
 
216
- // Add horizontal scrolling indicator for small screens
217
- @include media-down('sm') {
218
- background-position:
219
- left center,
220
- right center;
221
- background-repeat: no-repeat;
222
- background-size:
223
- 20px 100%,
224
- 20px 100%;
225
- background-attachment: local, local;
226
- }
227
-
228
216
  & > * {
229
217
  max-width: 100%;
230
218
  }
@@ -234,14 +222,15 @@
234
222
  width: 100%;
235
223
 
236
224
  pre {
237
- white-space: pre;
225
+ white-space: pre-wrap;
226
+ word-break: break-word;
238
227
  width: 100%;
239
228
  overflow-x: auto;
240
229
 
241
- // For very small screens, allow wrapping
242
- @include media-down('xs') {
243
- white-space: pre-wrap;
244
- word-break: break-word;
230
+ // From here the box can scroll a long line instead of splitting it
231
+ @include media-up('xs') {
232
+ white-space: pre;
233
+ word-break: normal;
245
234
  }
246
235
  }
247
236
 
@@ -63,7 +63,9 @@
63
63
  align-items: flex-start;
64
64
  width: 100%;
65
65
  max-width: 68ch;
66
- margin-inline: auto;
66
+ // Left, like everything else that carries running text. It used to centre
67
+ // itself, which only ever matched a page whose headings were centred too.
68
+ margin-inline: 0;
67
69
  padding: spacing('6') spacing('7');
68
70
  font-weight: font-weight('normal');
69
71
  line-height: 1.7;
@@ -78,6 +80,11 @@
78
80
  transform: none;
79
81
  }
80
82
 
83
+ // For the page that does centre its blocks
84
+ &-center {
85
+ margin-inline: auto;
86
+ }
87
+
81
88
  strong {
82
89
  margin-bottom: spacing('2');
83
90
  }
@@ -67,15 +67,15 @@
67
67
  auto-fit,
68
68
  minmax(min(#{$_mw-kanban-lane-min}, 100%), 1fr)
69
69
  );
70
- gap: spacing('4');
71
- padding: spacing('4');
70
+ // Frame only - how tight the board sits on a phone is a viewport call
71
+ gap: spacing('3');
72
+ padding: spacing('3');
72
73
  background: var(--mw-kanban-background);
73
74
  border-radius: radius('md');
74
75
 
75
- // Frame only - how tight the board sits on a phone is a viewport call
76
- @include media-down('sm') {
77
- gap: spacing('3');
78
- padding: spacing('3');
76
+ @include media-up('sm') {
77
+ gap: spacing('4');
78
+ padding: spacing('4');
79
79
  }
80
80
  }
81
81
 
@@ -9,13 +9,14 @@
9
9
  display: flex;
10
10
  flex-wrap: wrap;
11
11
  align-items: center;
12
- justify-content: flex-end;
13
- row-gap: spacing('1');
12
+ justify-content: flex-start;
13
+ column-gap: spacing('6');
14
+ row-gap: spacing('2');
14
15
 
15
- @include media-down('sm') {
16
- justify-content: flex-start;
17
- column-gap: spacing('6');
18
- row-gap: spacing('2');
16
+ @include media-up('sm') {
17
+ justify-content: flex-end;
18
+ column-gap: normal;
19
+ row-gap: spacing('1');
19
20
  }
20
21
  }
21
22
 
@@ -10,7 +10,8 @@
10
10
 
11
11
  th,
12
12
  td {
13
- padding: spacing('3') spacing('4');
13
+ padding: spacing('2') spacing('3');
14
+ font-size: font-size('xs');
14
15
  text-align: left;
15
16
  border: 1px solid var(--mw-border);
16
17
  color: var(--mw-text-muted-color);
@@ -40,11 +41,12 @@
40
41
  }
41
42
  }
42
43
 
43
- @include media-down('sm') {
44
+ @include media-up('sm') {
44
45
  th,
45
46
  td {
46
- padding: spacing('2') spacing('3');
47
- font-size: font-size('xs');
47
+ padding: spacing('3') spacing('4');
48
+ // Back to whatever the table is set in - the base size is the phone step
49
+ font-size: inherit;
48
50
  }
49
51
  }
50
52
  }
@@ -20,9 +20,12 @@
20
20
  grid-template-columns: repeat(3, 1fr);
21
21
  }
22
22
 
23
+ // The page gutter is the container's job, a second inset only narrows the tile
23
24
  &-4col {
24
- width: 85%;
25
- grid-template-columns: repeat(2, 1fr);
25
+ @include media-up('sm') {
26
+ width: 85%;
27
+ grid-template-columns: repeat(2, 1fr);
28
+ }
26
29
 
27
30
  @include media-up('md') {
28
31
  grid-template-columns: repeat(3, 1fr);
@@ -31,28 +34,12 @@
31
34
  @include media-up('lg') {
32
35
  grid-template-columns: repeat(4, 1fr);
33
36
  }
34
-
35
- @include media-down('sm') {
36
- grid-template-columns: 1fr;
37
- // Full width from here on - the page gutter is the container's job,
38
- // a second inset only narrows the tile
39
- width: 100%;
40
- padding: spacing('0');
41
- gap: spacing('4');
42
- }
43
37
  }
44
38
 
45
39
  &-2col {
46
- width: 75%;
47
- grid-template-columns: repeat(2, 1fr);
48
-
49
- @include media-down('sm') {
50
- grid-template-columns: 1fr;
51
- // Full width from here on - the page gutter is the container's job,
52
- // a second inset only narrows the tile
53
- width: 100%;
54
- padding: spacing('0');
55
- gap: spacing('4');
40
+ @include media-up('sm') {
41
+ width: 75%;
42
+ grid-template-columns: repeat(2, 1fr);
56
43
  }
57
44
  }
58
45
  }
@@ -75,7 +62,7 @@
75
62
  container: mw-tile / inline-size;
76
63
  background: var(--mw-card-background);
77
64
  @include surface;
78
- padding: spacing('5');
65
+ padding: spacing('4');
79
66
  box-shadow: var(--mw-elevation-2);
80
67
  transition: var(--mw-transition);
81
68
  border: 1px solid var(--mw-border);
@@ -84,6 +71,11 @@
84
71
  flex-direction: column;
85
72
  cursor: pointer;
86
73
 
74
+ // Ahead of the size modifiers below, which take over from 'sm'
75
+ @include media-up('sm') {
76
+ padding: spacing('5');
77
+ }
78
+
87
79
  // Same hover as a card, arc included - a tile is the larger clickable
88
80
  // relative of one, and a pair that looks alike has to react alike.
89
81
  &::after {
@@ -169,7 +161,9 @@
169
161
  }
170
162
 
171
163
  &-sm {
172
- padding: spacing('4');
164
+ @include media-up('sm') {
165
+ padding: spacing('4');
166
+ }
173
167
 
174
168
  .mw-tile-img {
175
169
  width: 80px;
@@ -197,7 +191,9 @@
197
191
  }
198
192
 
199
193
  &-lg {
200
- padding: spacing('6');
194
+ @include media-up('sm') {
195
+ padding: spacing('6');
196
+ }
201
197
 
202
198
  .mw-tile-img {
203
199
  width: 120px;
@@ -249,10 +245,4 @@
249
245
  margin: spacing('0') auto spacing('2');
250
246
  }
251
247
  }
252
-
253
- @include media-down('sm') {
254
- .mw-tile {
255
- padding: spacing('4');
256
- }
257
- }
258
248
  }
@@ -51,6 +51,10 @@ $_column-steps-lg: (
51
51
  ),
52
52
  );
53
53
 
54
+ // The breakpoints a grid can be pushed to. Outside the layer blocks for the
55
+ // same reason as the steps above: both read it.
56
+ $_grid-from: ('sm', 'md', 'lg', 'xl');
57
+
54
58
  @layer mw.layout {
55
59
  %grid-base {
56
60
  display: grid;
@@ -290,6 +294,19 @@ $_column-steps-lg: (
290
294
  }
291
295
  }
292
296
 
297
+ // Every ramp above turns two-column at `sm`, and 576px is generous for a
298
+ // column of running text next to a picture. This pushes the whole ramp up:
299
+ // single column until the breakpoint named, the grid's own steps from there.
300
+ // A modifier, so it works on all of them - and it has to come after them,
301
+ // because it carries the same specificity and wins on order alone.
302
+ @each $breakpoint in $_grid-from {
303
+ .mw-grid-from-#{$breakpoint} {
304
+ @include media-down($breakpoint) {
305
+ @include _single-column;
306
+ }
307
+ }
308
+ }
309
+
293
310
  // A feature card grows outwards - its frame and its label bar reach into the
294
311
  // gap, and two rows of them would touch. The card asks for the room, but the
295
312
  // grid has to hand it over: written next to the card it would sit in
@@ -350,4 +367,15 @@ $_column-steps-lg: (
350
367
  @include _reveal-ramp($steps);
351
368
  }
352
369
  }
370
+
371
+ // Below its breakpoint the grid is one column, so the stagger has to count in
372
+ // one too - otherwise two cards standing above each other rise on different
373
+ // beats. Last, so it beats the ramp it corrects at equal specificity.
374
+ @each $breakpoint in $_grid-from {
375
+ .mw-grid-from-#{$breakpoint} {
376
+ @include media-down($breakpoint) {
377
+ @include _reveal-stagger(1);
378
+ }
379
+ }
380
+ }
353
381
  }
@@ -529,16 +529,19 @@
529
529
  }
530
530
  }
531
531
 
532
- // Profile button - avatar plus the signed-in name
532
+ // Profile button - a round avatar until there is room for the signed-in name
533
+ // beside it
533
534
  .mw-profile-btn {
534
535
  display: inline-flex;
535
536
  align-items: center;
537
+ justify-content: center;
536
538
  gap: spacing('3');
537
539
  height: 40px;
538
- padding: spacing('0') spacing('4') spacing('0') spacing('1');
540
+ width: 40px;
541
+ padding: spacing('0');
539
542
  background: transparent;
540
543
  border: 1px solid var(--mw-header-border);
541
- border-radius: radius('2xl');
544
+ border-radius: radius('full');
542
545
  color: var(--mw-header-text-color);
543
546
  cursor: pointer;
544
547
  transition: var(--mw-transition);
@@ -583,14 +586,18 @@
583
586
  font-size: font-size('xl');
584
587
  }
585
588
 
586
- @include media-down('md') {
587
- padding: spacing('0');
588
- width: 40px;
589
- justify-content: center;
590
- border-radius: radius('full');
589
+ .mw-profile-btn-name {
590
+ display: none;
591
+ }
592
+
593
+ @include media-up('md') {
594
+ width: auto;
595
+ justify-content: normal;
596
+ padding: spacing('0') spacing('4') spacing('0') spacing('1');
597
+ border-radius: radius('2xl');
591
598
 
592
599
  .mw-profile-btn-name {
593
- display: none;
600
+ display: inline;
594
601
  }
595
602
  }
596
603
  }
@@ -5,11 +5,17 @@
5
5
  justify-items: center;
6
6
  align-items: center;
7
7
  text-align: center;
8
+ // The hero container runs the full width of the screen (see _main.scss), so
9
+ // the content has to produce the container width itself - otherwise it
10
+ // starts at a different edge than the header and every section below it.
11
+ // The gutter is already inside the token, hence no inline padding here.
12
+ width: var(--mw-container-width);
13
+ margin-inline: auto;
8
14
 
9
15
  &-content {
10
- padding: spacing('9') spacing('4');
16
+ padding: spacing('9') spacing('0');
11
17
  @include media-up('sm') {
12
- padding: spacing('6');
18
+ padding-block: spacing('6');
13
19
  }
14
20
 
15
21
  &-fade {
@@ -28,6 +34,19 @@
28
34
  }
29
35
  }
30
36
 
37
+ // A hero that points somewhere instead of sitting in the middle: the signet,
38
+ // the headline and the buttons all start at the edge the rest of the page
39
+ // starts at. Centred is still the default - a hero is short enough for it,
40
+ // which is exactly what a section head is not.
41
+ .mw-home-start {
42
+ justify-items: start;
43
+ text-align: left;
44
+
45
+ .mw-home-text {
46
+ margin-inline: 0;
47
+ }
48
+ }
49
+
31
50
  @keyframes fadeIn {
32
51
  from {
33
52
  opacity: 0;
@@ -13,19 +13,19 @@
13
13
  counter-reset: mw-section-head;
14
14
  }
15
15
 
16
- // Set in from the container it sits in, and giving that back a step at a time
17
- // as the screen shrinks. For a column of full-width cards, which at 1200px
18
- // leaves more empty card than content.
16
+ // Takes the full container on a phone and steps inwards as the screen grows.
17
+ // For a column of full-width cards, which at 1200px leaves more empty card
18
+ // than content.
19
19
  .mw-container-narrow {
20
- width: 80%;
20
+ width: 100%;
21
21
  margin-inline: auto;
22
22
 
23
- @include media-down('lg') {
23
+ @include media-up('md') {
24
24
  width: 90%;
25
25
  }
26
26
 
27
- @include media-down('md') {
28
- width: 100%;
27
+ @include media-up('lg') {
28
+ width: 80%;
29
29
  }
30
30
  }
31
31
 
@@ -34,11 +34,11 @@
34
34
  flex-wrap: wrap;
35
35
  align-items: center;
36
36
  gap: spacing('3');
37
- margin-left: auto;
37
+ width: 100%;
38
38
 
39
- @include media-down('sm') {
40
- width: 100%;
41
- margin-left: spacing('0');
39
+ @include media-up('sm') {
40
+ width: auto;
41
+ margin-left: auto;
42
42
  }
43
43
  }
44
44
 
@@ -17,6 +17,12 @@
17
17
  // every background the framework paints.
18
18
  border-top: 2px solid var(--mw-border);
19
19
 
20
+ // A head without a lead is a rule and one line of type, and the gap sized
21
+ // to follow a paragraph reads as a hole under it
22
+ &:not(:has(.mw-section-head-intro)) {
23
+ --mw-section-head-gap: calc(var(--mw-section-head-step) * 1.3);
24
+ }
25
+
20
26
  // The rule stays quiet so it reads as a boundary and not as a border, and
21
27
  // quiet is still hard to see on a patterned band. Hence the mark:
22
28
  // a short, thicker piece of the accent colour sitting on the line at the
@@ -49,7 +55,7 @@
49
55
  // is left - four fifths of a phone is a column nothing fits in.
50
56
  .mw-section-head-intro {
51
57
  max-width: 75ch;
52
- margin: spacing('4') spacing('0') spacing('0');
58
+ margin: calc(var(--mw-section-head-step) * 0.56) spacing('0') spacing('0');
53
59
  font-size: font-size('md');
54
60
  line-height: 1.6;
55
61
  color: var(--mw-text-muted-color);
@@ -113,11 +119,11 @@
113
119
  // levels read as a hierarchy rather than as two of the same thing.
114
120
  .mw-section-subtitle {
115
121
  font-size: fluid('xl', '2xl', $to: 'sm');
116
- // One step above the demo gap of spacing('6'), and that step is the whole
117
- // margin the boundary between two components has over the one between two
118
- // demos - the heading leans toward what it names, not toward what came
119
- // before it.
120
- margin: spacing('8') spacing('0') spacing('4') spacing('0');
122
+ // The section boundary steps down on a phone, so the component boundary
123
+ // sits with it or the two stop being distinguishable
124
+ margin-block: var(--mw-section-head-step)
125
+ calc(var(--mw-section-head-step) * 0.56);
126
+ margin-inline: spacing('0');
121
127
  position: relative;
122
128
 
123
129
  &::after {
@@ -132,6 +138,21 @@
132
138
  }
133
139
  }
134
140
 
141
+ // The lead under a subtitle is a plain paragraph, so nothing but this gives it
142
+ // the gap to the content - every page would otherwise spell it out per instance.
143
+ // Two selectors because a lead sometimes runs to a second paragraph, and the
144
+ // gap has to sit under the last one.
145
+ .mw-section-subtitle + p,
146
+ .mw-section-subtitle + p + p {
147
+ margin-bottom: var(--mw-section-head-step);
148
+ }
149
+
150
+ // Nothing between the heading and the content: the heading carries the gap the
151
+ // lead would have carried
152
+ .mw-section-subtitle:not(:has(+ p)) {
153
+ margin-bottom: var(--mw-section-head-step);
154
+ }
155
+
135
156
  // Sticky, because the strip is the only way back: inside a long section the
136
157
  // nav at the entrance can be twenty thousand pixels behind the reader
137
158
  .mw-section-nav {
@@ -201,11 +222,13 @@
201
222
  }
202
223
  }
203
224
 
204
- @include media-down('sm') {
205
- // The section boundary steps down to 56px on a phone, so the component
206
- // boundary steps with it or the two stop being distinguishable
225
+ @include media-up('sm') {
226
+ // Half a step more than the gap it leaves below itself, and that difference
227
+ // is the whole margin the boundary between two components has over the one
228
+ // between two demos - the heading leans toward what it names, not toward
229
+ // what came before it.
207
230
  .mw-section-subtitle {
208
- margin-top: spacing('6');
231
+ margin-top: calc(var(--mw-section-head-step) * 1.49);
209
232
  }
210
233
  }
211
234
 
@@ -0,0 +1,16 @@
1
+ // The same framework without the 48 components: tokens, reset, typography,
2
+ // grid, container, section, header, footer and every utility. Add the
3
+ // components the page actually uses next to it, each one its own file:
4
+ //
5
+ // @use 'maverick-wave/src/scss/main-lean' with ($primary-color: #1b1b1d);
6
+ // @use 'maverick-wave/src/scss/components/buttons';
7
+ // @use 'maverick-wave/src/scss/components/cards';
8
+ //
9
+ // The configuration goes on this file, not on the component imports - they
10
+ // read the tokens it forwards. A landing page that uses eight components lands
11
+ // around a third of the full build; the components carry the rest.
12
+ @forward 'abstracts/variables';
13
+
14
+ @use 'base';
15
+ @use 'layout';
16
+ @use 'utilities';
@@ -4,6 +4,7 @@
4
4
  @forward 'display';
5
5
  @forward 'elevation';
6
6
  @forward 'flex';
7
+ @forward 'print';
7
8
  @forward 'reveal';
8
9
  @forward 'spacing';
9
10
  @forward 'text';