maverick-wave 4.28.0 → 5.0.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 (138) hide show
  1. package/.claude/settings.local.json +29 -1
  2. package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
  3. package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
  4. package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
  5. package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
  6. package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
  7. package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
  8. package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
  9. package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
  10. package/.impeccable/config.local.json +5 -0
  11. package/.impeccable/hook.cache.json +1 -0
  12. package/CHANGELOG.md +11 -0
  13. package/CLAUDE.md +5 -5
  14. package/README.md +48 -4
  15. package/index.html +19 -38
  16. package/maverick-wave.min.css +14 -12
  17. package/maverick-wave.min.js +1 -1
  18. package/package.json +2 -2
  19. package/scripts/verify.js +27 -2
  20. package/src/js/main.js +223 -83
  21. package/src/partials/accordions-container.html +6 -10
  22. package/src/partials/alerts-container.html +6 -6
  23. package/src/partials/announcement-container.html +5 -5
  24. package/src/partials/avatars-container.html +85 -17
  25. package/src/partials/badges-container.html +6 -6
  26. package/src/partials/blog-posts-container.html +11 -12
  27. package/src/partials/buttons-container.html +3 -3
  28. package/src/partials/cards-container.html +26 -9
  29. package/src/partials/code-container.html +5 -5
  30. package/src/partials/content-slider-container.html +5 -4
  31. package/src/partials/divider-container.html +7 -7
  32. package/src/partials/dropdown-container.html +2 -2
  33. package/src/partials/empty-state-container.html +5 -5
  34. package/src/partials/footer-container.html +21 -18
  35. package/src/partials/form-elements-container.html +14 -14
  36. package/src/partials/gallery-container.html +16 -8
  37. package/src/partials/get-started-container.html +4 -8
  38. package/src/partials/header-container.html +18 -7
  39. package/src/partials/home-container.html +10 -20
  40. package/src/partials/input-group-container.html +11 -2
  41. package/src/partials/kbd-container.html +1 -1
  42. package/src/partials/login-container.html +5 -1
  43. package/src/partials/media-container.html +2 -2
  44. package/src/partials/modals-container.html +22 -32
  45. package/src/partials/pricing-container.html +9 -9
  46. package/src/partials/skeleton-container.html +6 -6
  47. package/src/partials/stepper-container.html +2 -2
  48. package/src/partials/tables-container.html +12 -12
  49. package/src/partials/tabs-container.html +17 -27
  50. package/src/partials/tags-container.html +23 -17
  51. package/src/partials/techstack-bucket-container.html +13 -0
  52. package/src/partials/tiles-container.html +26 -9
  53. package/src/partials/typography-container.html +7 -6
  54. package/src/partials/utilities-container.html +35 -15
  55. package/src/scss/_layers.scss +10 -0
  56. package/src/scss/abstracts/_index.scss +6 -0
  57. package/src/scss/abstracts/_mixins.scss +61 -153
  58. package/src/scss/abstracts/_variables.scss +123 -319
  59. package/src/scss/base/_base.scss +170 -190
  60. package/src/scss/base/_reset.scss +106 -104
  61. package/src/scss/base/_typography.scss +153 -151
  62. package/src/scss/components/_accordions.scss +97 -97
  63. package/src/scss/components/_alerts.scss +71 -70
  64. package/src/scss/components/_announcement.scss +71 -70
  65. package/src/scss/components/_avatars.scss +130 -142
  66. package/src/scss/components/_badge.scss +131 -132
  67. package/src/scss/components/_blog-post.scss +223 -220
  68. package/src/scss/components/_breadcrumbs.scss +93 -92
  69. package/src/scss/components/_button-bar.scss +102 -110
  70. package/src/scss/components/_buttons.scss +319 -324
  71. package/src/scss/components/_calendar.scss +251 -252
  72. package/src/scss/components/_cards.scss +359 -386
  73. package/src/scss/components/_code.scss +190 -194
  74. package/src/scss/components/_coming-soon.scss +77 -75
  75. package/src/scss/components/_content-slider.scss +90 -89
  76. package/src/scss/components/_divider.scss +55 -53
  77. package/src/scss/components/_dropdown.scss +179 -185
  78. package/src/scss/components/_empty-state.scss +57 -57
  79. package/src/scss/components/_flag.scss +294 -278
  80. package/src/scss/components/_gallery.scss +131 -133
  81. package/src/scss/components/_info.scss +151 -167
  82. package/src/scss/components/_kanban.scss +332 -341
  83. package/src/scss/components/_kbd.scss +40 -38
  84. package/src/scss/components/_lang-switch.scss +89 -97
  85. package/src/scss/components/_links.scss +21 -28
  86. package/src/scss/components/_lists.scss +510 -514
  87. package/src/scss/components/_localhost-indicator.scss +26 -24
  88. package/src/scss/components/_media.scss +22 -20
  89. package/src/scss/components/_meta-info.scss +35 -33
  90. package/src/scss/components/_modals.scss +277 -186
  91. package/src/scss/components/_pagination.scss +81 -87
  92. package/src/scss/components/_panels.scss +99 -97
  93. package/src/scss/components/_pricing.scss +183 -241
  94. package/src/scss/components/_progress.scss +112 -89
  95. package/src/scss/components/_prose.scss +35 -33
  96. package/src/scss/components/_ratings.scss +40 -38
  97. package/src/scss/components/_segmented.scss +82 -84
  98. package/src/scss/components/_skeleton.scss +66 -72
  99. package/src/scss/components/_spinners.scss +155 -159
  100. package/src/scss/components/_stepper.scss +116 -116
  101. package/src/scss/components/_tables.scss +155 -148
  102. package/src/scss/components/_tabs.scss +232 -141
  103. package/src/scss/components/_tags.scss +109 -107
  104. package/src/scss/components/_techstack-bucket.scss +123 -122
  105. package/src/scss/components/_testimonial.scss +72 -70
  106. package/src/scss/components/_theme-toggle.scss +53 -51
  107. package/src/scss/components/_tiles.scss +174 -174
  108. package/src/scss/components/_timelines.scss +282 -280
  109. package/src/scss/components/_toasts.scss +66 -72
  110. package/src/scss/form-elements/_checkbox.scss +117 -132
  111. package/src/scss/form-elements/_form.scss +149 -115
  112. package/src/scss/form-elements/_input-group.scss +99 -103
  113. package/src/scss/form-elements/_input.scss +74 -74
  114. package/src/scss/form-elements/_login.scss +48 -48
  115. package/src/scss/form-elements/_prefilled.scss +53 -51
  116. package/src/scss/form-elements/_radio.scss +95 -107
  117. package/src/scss/form-elements/_select.scss +42 -42
  118. package/src/scss/form-elements/_slider.scss +117 -132
  119. package/src/scss/form-elements/_textarea.scss +68 -54
  120. package/src/scss/form-elements/_toggle.scss +127 -140
  121. package/src/scss/layout/_footer.scss +172 -171
  122. package/src/scss/layout/_grid.scss +268 -302
  123. package/src/scss/layout/_header.scss +426 -427
  124. package/src/scss/layout/_home.scss +28 -27
  125. package/src/scss/layout/_main.scss +275 -238
  126. package/src/scss/layout/_page-header.scss +38 -36
  127. package/src/scss/layout/_section.scss +150 -124
  128. package/src/scss/main.scss +1 -1
  129. package/src/scss/utilities/_accessibility.scss +46 -45
  130. package/src/scss/utilities/_aspect.scss +22 -20
  131. package/src/scss/utilities/_corner.scss +23 -5
  132. package/src/scss/utilities/_display.scss +76 -70
  133. package/src/scss/utilities/_elevation.scss +13 -11
  134. package/src/scss/utilities/_flex.scss +83 -85
  135. package/src/scss/utilities/_reveal.scss +40 -63
  136. package/src/scss/utilities/_spacing.scss +63 -64
  137. package/src/scss/utilities/_text.scss +139 -141
  138. package/src/scss/utilities/_touch-targets.scss +130 -147
@@ -1,180 +1,178 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // Text utilities
4
- .mw-text {
5
- &-center {
6
- text-align: center;
7
- }
3
+ @layer mw.utilities {
4
+ .mw-text {
5
+ &-center {
6
+ text-align: center;
7
+ }
8
8
 
9
- &-left {
10
- text-align: left;
11
- }
9
+ &-left {
10
+ text-align: left;
11
+ }
12
12
 
13
- &-right {
14
- text-align: right;
15
- }
13
+ &-right {
14
+ text-align: right;
15
+ }
16
16
 
17
- // Fixed-width digits, nothing else. For anything where figures have to line
18
- // up vertically or must not jitter while they count: a clock, a counter, a
19
- // key figure, an ID. `lining-nums` guards against fonts that default to
20
- // old-style figures.
21
- //
22
- // Deliberately without alignment: bundling `text-align: right` in here meant
23
- // that whoever only wanted the digits could not use the class and wrote the
24
- // declaration out by hand instead.
25
- &-numeric {
26
- font-variant-numeric: tabular-nums lining-nums;
27
- font-feature-settings: 'tnum', 'lnum';
28
- }
17
+ // Fixed-width digits, nothing else. For anything where figures have to line
18
+ // up vertically or must not jitter while they count: a clock, a counter, a
19
+ // key figure, an ID. `lining-nums` guards against fonts that default to
20
+ // old-style figures.
21
+ //
22
+ // Deliberately without alignment: bundling `text-align: right` in here meant
23
+ // that whoever only wanted the digits could not use the class and wrote the
24
+ // declaration out by hand instead.
25
+ &-numeric {
26
+ font-variant-numeric: tabular-nums lining-nums;
27
+ font-feature-settings: 'tnum', 'lnum';
28
+ }
29
29
 
30
- // For money and other figures in tables: the digits from above, plus
31
- // right-aligned and never wrapped mid-number. Locale-agnostic - it works for
32
- // 1,204.50 and 1.204,50 alike, because the alignment comes from the right
33
- // edge, not from the separator.
34
- &-currency {
35
- text-align: right;
36
- font-variant-numeric: tabular-nums lining-nums;
37
- font-feature-settings: 'tnum', 'lnum';
38
- white-space: nowrap;
39
- }
30
+ // For money and other figures in tables: the digits from above, plus
31
+ // right-aligned and never wrapped mid-number. Locale-agnostic - it works for
32
+ // 1,204.50 and 1.204,50 alike, because the alignment comes from the right
33
+ // edge, not from the separator.
34
+ &-currency {
35
+ text-align: right;
36
+ font-variant-numeric: tabular-nums lining-nums;
37
+ font-feature-settings: 'tnum', 'lnum';
38
+ white-space: nowrap;
39
+ }
40
40
 
41
- &-primary {
42
- color: var(--mw-primary-text-color);
43
- }
41
+ &-primary {
42
+ color: var(--mw-primary-text-color);
43
+ }
44
44
 
45
- &-secondary {
46
- color: var(--mw-secondary-text-color);
47
- }
45
+ &-secondary {
46
+ color: var(--mw-secondary-text-color);
47
+ }
48
48
 
49
- &-success {
50
- color: var(--mw-success-text-color);
51
- }
49
+ &-success {
50
+ color: var(--mw-success-text-color);
51
+ }
52
52
 
53
- &-warning {
54
- color: var(--mw-warning-text-color);
55
- }
53
+ &-warning {
54
+ color: var(--mw-warning-text-color);
55
+ }
56
56
 
57
- &-danger {
58
- color: var(--mw-danger-text-color);
59
- }
57
+ &-danger {
58
+ color: var(--mw-danger-text-color);
59
+ }
60
60
 
61
- &-info {
62
- color: var(--mw-info-text-color);
63
- }
61
+ &-info {
62
+ color: var(--mw-info-text-color);
63
+ }
64
64
 
65
- &-muted {
66
- color: var(--mw-text-muted-color);
67
- }
65
+ &-muted {
66
+ color: var(--mw-text-muted-color);
67
+ }
68
68
 
69
- &-bold {
70
- font-weight: font-weight('bold');
71
- }
69
+ &-bold {
70
+ font-weight: font-weight('bold');
71
+ }
72
72
 
73
- &-medium {
74
- font-weight: font-weight('medium');
75
- }
73
+ &-medium {
74
+ font-weight: font-weight('medium');
75
+ }
76
76
 
77
- &-normal {
78
- font-weight: font-weight('normal');
79
- }
77
+ &-normal {
78
+ font-weight: font-weight('normal');
79
+ }
80
80
 
81
- &-light {
82
- font-weight: font-weight('light');
83
- }
81
+ &-light {
82
+ font-weight: font-weight('light');
83
+ }
84
84
 
85
- &-italic {
86
- font-style: italic;
87
- }
85
+ &-italic {
86
+ font-style: italic;
87
+ }
88
88
 
89
- &-color-dark {
90
- color: var(--mw-dark-text-color);
91
- }
89
+ &-color-dark {
90
+ color: var(--mw-dark-text-color);
91
+ }
92
92
 
93
- &-color-light {
94
- color: var(--mw-light-text-color);
95
- }
93
+ &-color-light {
94
+ color: var(--mw-light-text-color);
95
+ }
96
96
 
97
- @each $name, $size in $font-sizes {
98
- &-#{$name} {
99
- font-size: $size;
97
+ @each $name, $size in $font-sizes {
98
+ &-#{$name} {
99
+ font-size: $size;
100
+ }
100
101
  }
101
102
  }
102
- }
103
103
 
104
- // Line height utilities
105
- .mw-leading {
106
- &-tight {
107
- line-height: 1.2;
108
- }
104
+ .mw-leading {
105
+ &-tight {
106
+ line-height: 1.2;
107
+ }
109
108
 
110
- &-normal {
111
- line-height: 1.5;
112
- }
109
+ &-normal {
110
+ line-height: 1.5;
111
+ }
113
112
 
114
- &-loose {
115
- line-height: 1.8;
113
+ &-loose {
114
+ line-height: 1.8;
115
+ }
116
116
  }
117
- }
118
117
 
119
- // Overflow
120
- .mw-text-truncate {
121
- overflow: hidden;
122
- text-overflow: ellipsis;
123
- white-space: nowrap;
124
- min-width: 0;
125
- }
126
-
127
- @each $lines in (2, 3, 4, 5) {
128
- .mw-text-clamp-#{$lines} {
129
- display: -webkit-box;
130
- -webkit-line-clamp: $lines;
131
- line-clamp: $lines;
132
- -webkit-box-orient: vertical;
118
+ .mw-text-truncate {
133
119
  overflow: hidden;
120
+ text-overflow: ellipsis;
121
+ white-space: nowrap;
122
+ min-width: 0;
134
123
  }
135
- }
136
124
 
137
- .mw-text-nowrap {
138
- white-space: nowrap;
139
- }
125
+ @each $lines in (2, 3, 4, 5) {
126
+ .mw-text-clamp-#{$lines} {
127
+ display: -webkit-box;
128
+ -webkit-line-clamp: $lines;
129
+ line-clamp: $lines;
130
+ -webkit-box-orient: vertical;
131
+ overflow: hidden;
132
+ }
133
+ }
140
134
 
141
- // For anything that has no spaces to break at - a URL, a hash, an API key -
142
- // and would otherwise push the page sideways on a phone
143
- .mw-text-break {
144
- overflow-wrap: anywhere;
145
- word-break: break-word;
146
- }
135
+ .mw-text-nowrap {
136
+ white-space: nowrap;
137
+ }
147
138
 
148
- // Wrapping
149
- .mw-text-balance {
150
- text-wrap: balance;
151
- }
139
+ // For anything that has no spaces to break at - a URL, a hash, an API key -
140
+ // and would otherwise push the page sideways on a phone
141
+ .mw-text-break {
142
+ overflow-wrap: anywhere;
143
+ word-break: break-word;
144
+ }
152
145
 
153
- .mw-text-pretty {
154
- text-wrap: pretty;
155
- }
146
+ .mw-text-balance {
147
+ text-wrap: balance;
148
+ }
156
149
 
157
- .mw-text-uppercase {
158
- text-transform: uppercase;
159
- letter-spacing: 0.05em;
160
- }
150
+ .mw-text-pretty {
151
+ text-wrap: pretty;
152
+ }
161
153
 
162
- .mw-text-capitalize {
163
- text-transform: capitalize;
164
- }
154
+ .mw-text-uppercase {
155
+ text-transform: uppercase;
156
+ letter-spacing: 0.05em;
157
+ }
165
158
 
166
- // A kicker or an eyebrow over a heading - the small, spaced, upper-case line
167
- // that says what section this is
168
- .mw-text-eyebrow {
169
- font-size: font-size('2xs');
170
- font-weight: font-weight('bold');
171
- letter-spacing: 0.12em;
172
- text-transform: uppercase;
173
- color: var(--mw-text-muted-color);
174
- }
159
+ .mw-text-capitalize {
160
+ text-transform: capitalize;
161
+ }
175
162
 
176
- // Sets the measure a column of text is comfortable at. Anything past roughly 75
177
- // characters and the eye loses the start of the next line on the way back.
178
- .mw-text-measure {
179
- max-width: 68ch;
163
+ // A kicker or an eyebrow over a heading - the small, spaced, upper-case line
164
+ // that says what section this is
165
+ .mw-text-eyebrow {
166
+ font-size: font-size('2xs');
167
+ font-weight: font-weight('bold');
168
+ letter-spacing: 0.12em;
169
+ text-transform: uppercase;
170
+ color: var(--mw-text-muted-color);
171
+ }
172
+
173
+ // Sets the measure a column of text is comfortable at. Anything past roughly 75
174
+ // characters and the eye loses the start of the next line on the way back.
175
+ .mw-text-measure {
176
+ max-width: 68ch;
177
+ }
180
178
  }
@@ -1,175 +1,158 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // ---------------------------------------------------------------------------
4
- // Touch targets
5
- //
6
- // WCAG 2.5.8 puts the floor at 24x24 CSS px, and that is a floor, not a goal.
7
- // The compact sizes are right on a pointing device and too small on a thumb,
8
- // so they only grow where the input actually is coarse.
9
- //
10
- // `pointer: coarse` *or* narrow, not just narrow: a tablet in landscape is
11
- // wide and still operated with a finger. Loaded last, so these win over the
12
- // component defaults without needing extra specificity.
13
- // ---------------------------------------------------------------------------
14
- @media (pointer: coarse), (max-width: #{breakpoint('md')}) {
15
- // The default button was the one that got missed. Its padding and line-height
16
- // add up to about 35px, which is under the 44px every platform guideline asks
17
- // for and the size a thumb actually is. Only the height grows - the padding
18
- // is what sets the label's relationship to the edges and is right as it is.
19
- .mw-btn {
20
- min-height: 2.75rem;
21
- }
3
+ @layer mw.utilities {
4
+ // WCAG 2.5.8 puts the floor at 24x24px, and a floor is not a goal - the compact
5
+ // sizes are right under a pointer and too small under a thumb. Coarse *or*
6
+ // narrow, because a tablet in landscape is wide and still finger-operated.
7
+ // Loaded last, so these win without extra specificity.
8
+ @media (pointer: coarse), (max-width: #{breakpoint('md')}) {
9
+ // Padding and line-height add up to ~35px, under the 44px a thumb needs. Only
10
+ // the height grows: the padding sets the label's relationship to the edges.
11
+ .mw-btn {
12
+ min-height: 2.75rem;
13
+ }
22
14
 
23
- .mw-btn-sm {
24
- min-height: 2.5rem;
25
- }
15
+ .mw-btn-sm {
16
+ min-height: 2.5rem;
17
+ }
26
18
 
27
- .mw-input-sm,
28
- .mw-select-sm,
29
- .mw-textarea-sm {
30
- min-height: 2.5rem;
31
- }
19
+ .mw-input-sm,
20
+ .mw-select-sm,
21
+ .mw-textarea-sm {
22
+ min-height: 2.5rem;
23
+ }
32
24
 
33
- // The base fields sit at 2.35rem from the control scale, which is right under
34
- // a pointer and short of a thumb. Same floor as the button beside them.
35
- .mw-input,
36
- .mw-select {
37
- min-height: 2.75rem;
38
- }
25
+ // The base fields sit at 2.35rem from the control scale, which is right under
26
+ // a pointer and short of a thumb. Same floor as the button beside them.
27
+ .mw-input,
28
+ .mw-select {
29
+ min-height: 2.75rem;
30
+ }
39
31
 
40
- .mw-input,
41
- .mw-input-sm,
42
- .mw-input-lg,
43
- .mw-select,
44
- .mw-select-sm,
45
- .mw-select-lg,
46
- .mw-textarea,
47
- .mw-textarea-sm,
48
- .mw-textarea-lg {
49
- font-size: 16px;
50
- }
32
+ .mw-input,
33
+ .mw-input-sm,
34
+ .mw-input-lg,
35
+ .mw-select,
36
+ .mw-select-sm,
37
+ .mw-select-lg,
38
+ .mw-textarea,
39
+ .mw-textarea-sm,
40
+ .mw-textarea-lg {
41
+ font-size: 16px;
42
+ }
51
43
 
52
- // A tab strip is the one navigation a phone has no fallback for
53
- .mw-tabs-nav-item {
54
- display: flex;
55
- align-items: center;
56
- min-height: 2.75rem;
57
- }
44
+ // A tab strip is the one navigation a phone has no fallback for
45
+ .mw-tabs-nav-item {
46
+ display: flex;
47
+ align-items: center;
48
+ min-height: 2.75rem;
49
+ }
58
50
 
59
- .mw-segmented-item {
60
- min-height: 2.5rem;
61
- }
51
+ .mw-segmented-item {
52
+ min-height: 2.5rem;
53
+ }
62
54
 
63
- // Rows of a list, items of a menu, links in a footer, pages of a pager - the
64
- // controls that are a line of text on a desktop and a target on a phone
65
- .mw-dropdown-item,
66
- .mw-accordion-header,
67
- .mw-modal-close,
68
- .mw-breadcrumbs-item a {
69
- min-height: 2.75rem;
70
- display: flex;
71
- align-items: center;
72
- }
55
+ // Rows of a list, items of a menu, links in a footer, pages of a pager - the
56
+ // controls that are a line of text on a desktop and a target on a phone
57
+ .mw-dropdown-item,
58
+ .mw-accordion-header,
59
+ .mw-modal-close,
60
+ .mw-breadcrumbs-item a {
61
+ min-height: 2.75rem;
62
+ display: flex;
63
+ align-items: center;
64
+ }
73
65
 
74
- // A checkbox or radio is tapped by its label as much as by the box, so the
75
- // whole row has to be the target - which it only is if the row is tall enough
76
- .mw-checkbox,
77
- .mw-radio,
78
- .mw-toggle {
79
- min-height: 2.5rem;
80
- }
66
+ // A checkbox or radio is tapped by its label as much as by the box, so the
67
+ // whole row has to be the target - which it only is if the row is tall enough
68
+ .mw-checkbox,
69
+ .mw-radio,
70
+ .mw-toggle {
71
+ min-height: 2.5rem;
72
+ }
81
73
 
82
- .mw-calendar-day {
83
- min-height: 44px;
84
- }
74
+ .mw-calendar-day {
75
+ min-height: 44px;
76
+ }
85
77
 
86
- // A gallery dot is 9px here - the target got *smaller* exactly where the
87
- // pointer got coarser. Same treatment as the mini button below: the dot keeps
88
- // its silhouette, only the hit area grows to the 24px floor. The gap has to
89
- // grow with it, or two neighbouring hit areas overlap and a tap aimed at one
90
- // slide brings up the next.
91
- .mw-gallery-dots {
92
- gap: spacing('6');
93
- }
78
+ // A gallery dot is 9px here - the target got *smaller* exactly where the
79
+ // pointer got coarser. Same treatment as the mini button below: the dot keeps
80
+ // its silhouette, only the hit area grows to the 24px floor. The gap has to
81
+ // grow with it, or two neighbouring hit areas overlap and a tap aimed at one
82
+ // slide brings up the next.
83
+ .mw-gallery-dots {
84
+ gap: spacing('6');
85
+ }
94
86
 
95
- .mw-gallery-dot {
96
- position: relative;
87
+ .mw-gallery-dot {
88
+ position: relative;
97
89
 
98
- &::after {
99
- content: '';
100
- position: absolute;
101
- inset: -7.5px;
90
+ &::after {
91
+ content: '';
92
+ position: absolute;
93
+ inset: -7.5px;
94
+ }
102
95
  }
103
- }
104
96
 
105
- // A range input is as tall as its track - 8px, and 6px in the small variant.
106
- // That is the whole hit area, thumb included: a slider you can only grab by
107
- // hitting an 8px band is a slider you drag the page with instead.
108
- //
109
- // `content-box` is what keeps the track out of it: the height stays the
110
- // track's, the padding is the hit area on top, and clipping the background
111
- // to the content box means the visible bar does not grow with it. No track
112
- // height is repeated from `_slider.scss` this way - each variant grows off
113
- // whatever it already has: 8px + 36 = 44, the small one 42, the large 52.
114
- .mw-slider {
115
- box-sizing: content-box;
116
- padding-block: 18px;
117
- background-clip: content-box;
118
- }
119
-
120
- // The 18px silhouette stays: mini buttons sit in tag rows and table cells,
121
- // where growing the circle would shift the layout around them. Only the hit
122
- // area grows, to 28px - clear of the 24px floor. The extra margin keeps two
123
- // neighbouring hit areas from overlapping.
124
- .mw-btn-mini {
125
- position: relative;
126
- margin-left: spacing('4');
97
+ // A range input is as tall as its track, so the whole hit area is 8px and you
98
+ // drag the page instead. `content-box` keeps the height the track's and makes
99
+ // the padding the hit area on top, so no track height has to be repeated from
100
+ // _slider.scss - each variant grows off its own: 8px + 36 = 44.
101
+ .mw-slider {
102
+ box-sizing: content-box;
103
+ padding-block: 18px;
104
+ background-clip: content-box;
105
+ }
127
106
 
128
- &::after {
129
- content: '';
130
- position: absolute;
131
- inset: -5px;
107
+ // The 18px silhouette stays: mini buttons sit in tag rows and table cells,
108
+ // where growing the circle would shift the layout around them. Only the hit
109
+ // area grows, to 28px - clear of the 24px floor. The extra margin keeps two
110
+ // neighbouring hit areas from overlapping.
111
+ .mw-btn-mini {
112
+ position: relative;
113
+ margin-left: spacing('4');
114
+
115
+ &::after {
116
+ content: '';
117
+ position: absolute;
118
+ inset: -5px;
119
+ }
132
120
  }
133
121
  }
134
- }
135
122
 
136
- // Sideways scroll
137
- .mw-table-responsive,
138
- .mw-tabs-nav {
139
- overscroll-behavior-x: contain;
140
- -webkit-overflow-scrolling: touch;
141
- }
142
-
143
- // Phone layout. The section rhythm steps down twice: a tablet keeps a middle
144
- // value, a phone drops further - every rem here is one the reader has to
145
- // scroll past on a screen that is already all scrolling.
146
- @include media-down('md') {
147
- :root {
148
- --mw-section-padding-block: #{spacing('9')};
123
+ .mw-table-responsive,
124
+ .mw-tabs-nav {
125
+ overscroll-behavior-x: contain;
126
+ -webkit-overflow-scrolling: touch;
149
127
  }
150
- }
151
128
 
152
- @include media-down('sm') {
153
- :root {
154
- --mw-section-padding-block: #{spacing('7')};
129
+ // Phone layout. The section rhythm steps down twice: a tablet keeps a middle
130
+ // value, a phone drops further - every rem here is one the reader has to
131
+ // scroll past on a screen that is already all scrolling.
132
+ @include media-down('md') {
133
+ :root {
134
+ --mw-section-padding-block: #{spacing('9')};
135
+ }
155
136
  }
156
- }
157
137
 
158
- @include media-down('sm') {
159
- // Cards sit edge to edge on a phone, so the padding inside them is all that
160
- // separates the text from the screen edge - it cannot be the desktop value
161
- .mw-card-simple {
162
- padding: spacing('4');
138
+ @include media-down('sm') {
139
+ :root {
140
+ --mw-section-padding-block: #{spacing('7')};
141
+ }
163
142
  }
164
143
 
165
- // A row of actions on a phone stacks, and stacked buttons that are each as
166
- // wide as their label look like a list of unrelated things.
167
- //
168
- // Not `mw-card-footer`: that one stacks on its *container*, not on the
169
- // window, so at 390px it is still a row - and a `flex-grow` handed to a row
170
- // is what turned a card's action into a full-bleed band. Stacked it needs no
171
- // help either, the footer's own `width: 100%` is what fills the column.
172
- .mw-form-actions .mw-btn {
173
- flex: 1 1 auto;
144
+ @include media-down('sm') {
145
+ // Cards sit edge to edge on a phone, so the padding inside them is all that
146
+ // separates the text from the screen edge - it cannot be the desktop value
147
+ .mw-card-simple {
148
+ padding: spacing('4');
149
+ }
150
+
151
+ // Stacked buttons at their label's width read as a list of unrelated things.
152
+ // Not mw-card-footer: that stacks on its *container*, so at 390px it is still
153
+ // a row, and flex-grow on a row makes a card's action a full-bleed band.
154
+ .mw-form-actions .mw-btn {
155
+ flex: 1 1 auto;
156
+ }
174
157
  }
175
158
  }