maverick-wave 4.27.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 (140) hide show
  1. package/.claude/settings.local.json +29 -1
  2. package/.claude/skills/mw-maverick-wave/SKILL.md +42 -25
  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 +90 -5
  6. package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
  7. package/.claude/skills/mw-maverick-wave/references/javascript.md +18 -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 +17 -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 +266 -75
  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/header-utilities-container.html +192 -5
  40. package/src/partials/home-container.html +10 -20
  41. package/src/partials/input-group-container.html +11 -2
  42. package/src/partials/kbd-container.html +1 -1
  43. package/src/partials/login-container.html +5 -1
  44. package/src/partials/media-container.html +2 -2
  45. package/src/partials/modals-container.html +22 -32
  46. package/src/partials/pricing-container.html +9 -9
  47. package/src/partials/skeleton-container.html +6 -6
  48. package/src/partials/stepper-container.html +2 -2
  49. package/src/partials/tables-container.html +12 -12
  50. package/src/partials/tabs-container.html +17 -27
  51. package/src/partials/tags-container.html +23 -17
  52. package/src/partials/techstack-bucket-container.html +13 -0
  53. package/src/partials/tiles-container.html +26 -9
  54. package/src/partials/typography-container.html +7 -6
  55. package/src/partials/utilities-container.html +35 -15
  56. package/src/scss/_layers.scss +10 -0
  57. package/src/scss/abstracts/_index.scss +6 -0
  58. package/src/scss/abstracts/_mixins.scss +61 -153
  59. package/src/scss/abstracts/_variables.scss +123 -319
  60. package/src/scss/base/_base.scss +170 -190
  61. package/src/scss/base/_reset.scss +106 -104
  62. package/src/scss/base/_typography.scss +153 -151
  63. package/src/scss/components/_accordions.scss +97 -97
  64. package/src/scss/components/_alerts.scss +71 -70
  65. package/src/scss/components/_announcement.scss +71 -70
  66. package/src/scss/components/_avatars.scss +130 -142
  67. package/src/scss/components/_badge.scss +131 -132
  68. package/src/scss/components/_blog-post.scss +223 -220
  69. package/src/scss/components/_breadcrumbs.scss +93 -92
  70. package/src/scss/components/_button-bar.scss +102 -110
  71. package/src/scss/components/_buttons.scss +319 -324
  72. package/src/scss/components/_calendar.scss +251 -252
  73. package/src/scss/components/_cards.scss +359 -386
  74. package/src/scss/components/_code.scss +190 -194
  75. package/src/scss/components/_coming-soon.scss +77 -75
  76. package/src/scss/components/_content-slider.scss +90 -89
  77. package/src/scss/components/_divider.scss +55 -53
  78. package/src/scss/components/_dropdown.scss +179 -185
  79. package/src/scss/components/_empty-state.scss +57 -57
  80. package/src/scss/components/_flag.scss +325 -0
  81. package/src/scss/components/_gallery.scss +131 -133
  82. package/src/scss/components/_index.scss +2 -0
  83. package/src/scss/components/_info.scss +151 -167
  84. package/src/scss/components/_kanban.scss +332 -341
  85. package/src/scss/components/_kbd.scss +40 -38
  86. package/src/scss/components/_lang-switch.scss +108 -0
  87. package/src/scss/components/_links.scss +21 -28
  88. package/src/scss/components/_lists.scss +510 -514
  89. package/src/scss/components/_localhost-indicator.scss +26 -24
  90. package/src/scss/components/_media.scss +22 -20
  91. package/src/scss/components/_meta-info.scss +35 -33
  92. package/src/scss/components/_modals.scss +277 -186
  93. package/src/scss/components/_pagination.scss +81 -87
  94. package/src/scss/components/_panels.scss +99 -97
  95. package/src/scss/components/_pricing.scss +183 -241
  96. package/src/scss/components/_progress.scss +112 -89
  97. package/src/scss/components/_prose.scss +35 -33
  98. package/src/scss/components/_ratings.scss +40 -38
  99. package/src/scss/components/_segmented.scss +82 -84
  100. package/src/scss/components/_skeleton.scss +66 -72
  101. package/src/scss/components/_spinners.scss +155 -159
  102. package/src/scss/components/_stepper.scss +116 -116
  103. package/src/scss/components/_tables.scss +155 -148
  104. package/src/scss/components/_tabs.scss +232 -141
  105. package/src/scss/components/_tags.scss +109 -107
  106. package/src/scss/components/_techstack-bucket.scss +123 -122
  107. package/src/scss/components/_testimonial.scss +72 -70
  108. package/src/scss/components/_theme-toggle.scss +53 -51
  109. package/src/scss/components/_tiles.scss +174 -174
  110. package/src/scss/components/_timelines.scss +282 -280
  111. package/src/scss/components/_toasts.scss +66 -72
  112. package/src/scss/form-elements/_checkbox.scss +117 -132
  113. package/src/scss/form-elements/_form.scss +149 -115
  114. package/src/scss/form-elements/_input-group.scss +99 -103
  115. package/src/scss/form-elements/_input.scss +74 -74
  116. package/src/scss/form-elements/_login.scss +48 -48
  117. package/src/scss/form-elements/_prefilled.scss +53 -51
  118. package/src/scss/form-elements/_radio.scss +95 -107
  119. package/src/scss/form-elements/_select.scss +42 -42
  120. package/src/scss/form-elements/_slider.scss +117 -132
  121. package/src/scss/form-elements/_textarea.scss +68 -54
  122. package/src/scss/form-elements/_toggle.scss +127 -140
  123. package/src/scss/layout/_footer.scss +172 -171
  124. package/src/scss/layout/_grid.scss +268 -302
  125. package/src/scss/layout/_header.scss +426 -427
  126. package/src/scss/layout/_home.scss +28 -27
  127. package/src/scss/layout/_main.scss +275 -238
  128. package/src/scss/layout/_page-header.scss +38 -36
  129. package/src/scss/layout/_section.scss +150 -124
  130. package/src/scss/main.scss +1 -1
  131. package/src/scss/utilities/_accessibility.scss +46 -45
  132. package/src/scss/utilities/_aspect.scss +22 -20
  133. package/src/scss/utilities/_corner.scss +23 -5
  134. package/src/scss/utilities/_display.scss +76 -70
  135. package/src/scss/utilities/_elevation.scss +13 -11
  136. package/src/scss/utilities/_flex.scss +83 -85
  137. package/src/scss/utilities/_reveal.scss +40 -63
  138. package/src/scss/utilities/_spacing.scss +63 -64
  139. package/src/scss/utilities/_text.scss +139 -141
  140. package/src/scss/utilities/_touch-targets.scss +130 -147
@@ -1,301 +1,300 @@
1
1
  @use '../abstracts' as *;
2
2
 
3
- // Pixel-precise shape values
4
- $_mw-calendar-dot-size: 5px;
5
- $_mw-calendar-dot-gap: 3px;
6
- $_mw-calendar-cell-height: 38px;
7
- $_mw-calendar-cell-height-compact: 29px;
8
- $_mw-calendar-grid-gap: 4px;
9
- $_mw-calendar-grid-gap-sm: 3px;
10
- $_mw-calendar-grid-gap-compact: 3px;
11
-
12
- $_mw-calendar-dot-tones: (
13
- 'primary': var(--mw-primary-text-color),
14
- 'secondary': var(--mw-secondary-text-color),
15
- 'success': var(--mw-success-text-color),
16
- 'warning': var(--mw-warning-text-color),
17
- 'danger': var(--mw-danger-text-color),
18
- 'info': var(--mw-info-text-color),
19
- );
20
-
21
- // Same silhouette as a card, but without the hover lift
22
- .mw-calendar {
23
- display: block;
24
- padding: spacing('5');
25
- background: var(--mw-card-background);
26
- border: 1px solid var(--mw-border);
27
- @include surface;
28
- box-shadow: var(--mw-elevation-2);
29
- }
30
-
31
- // Calendar without its own surface - for one that already sits on a card
32
- .mw-calendar-plain {
33
- padding: spacing('0');
34
- background: transparent;
35
- border: none;
36
- box-shadow: none;
37
- }
38
-
39
- .mw-calendar-header {
40
- display: flex;
41
- align-items: center;
42
- gap: spacing('3');
43
- margin-bottom: spacing('5');
44
- }
45
-
46
- // Takes the space between the two arrows so the label stays optically centred
47
- .mw-calendar-title {
48
- flex: 1;
49
- min-width: 0;
50
- text-align: center;
51
- font-size: font-size('md');
52
- font-weight: font-weight('medium');
53
- color: var(--mw-text-color);
54
- white-space: nowrap;
55
- overflow: hidden;
56
- text-overflow: ellipsis;
57
- }
58
-
59
- // Sits on .mw-btn - this only squares it off around the chevron
60
- .mw-calendar-nav {
61
- padding: spacing('2') spacing('4');
62
- line-height: 1;
63
- flex-shrink: 0;
64
- }
65
-
66
- // Grid
67
- .mw-calendar-grid {
68
- display: grid;
69
- grid-template-columns: repeat(7, minmax(0, 1fr));
70
- gap: $_mw-calendar-grid-gap;
71
- }
72
-
73
- .mw-calendar-weekday {
74
- padding-bottom: spacing('2');
75
- text-align: center;
76
- font-size: font-size('2xs');
77
- font-weight: font-weight('bold');
78
- color: var(--mw-text-muted-color);
79
- text-transform: uppercase;
80
- letter-spacing: 0.05em;
81
- overflow: hidden;
82
- text-overflow: ellipsis;
83
- white-space: nowrap;
84
- }
85
-
86
- // Saturday and Sunday read like a wall calendar - the label carries the
87
- // weekend, the cell below only gets a faint tint
88
- .mw-calendar-weekday.mw-calendar-weekend {
89
- color: var(--mw-danger-text-color);
90
- }
91
-
92
- // A fixed row height instead of an aspect ratio
93
- .mw-calendar-day {
94
- position: relative;
95
- display: flex;
96
- align-items: center;
97
- justify-content: center;
98
- min-height: $_mw-calendar-cell-height;
99
- padding: spacing('1');
100
- border: 1px solid transparent;
101
- border-radius: radius('sm');
102
- background: transparent;
103
- color: var(--mw-text-color);
104
- font: inherit;
105
- font-size: font-size('sm');
106
- font-variant-numeric: tabular-nums;
107
- line-height: 1;
108
- cursor: pointer;
109
- transition: var(--mw-transition);
110
- -webkit-tap-highlight-color: transparent;
111
- touch-action: manipulation;
112
- }
113
-
114
- .mw-calendar-day:active:not(:disabled) {
115
- transform: scale(0.92);
116
- transition-duration: var(--mw-duration-instant);
117
- }
118
-
119
- .mw-calendar-day.mw-calendar-weekend {
120
- background: var(--mw-gray-background);
121
- }
122
-
123
- // Days spilling in from the neighbouring month stay readable but clearly step
124
- // back - leaving them out would make the first and last row look broken
125
- .mw-calendar-day.mw-calendar-adjacent {
126
- color: var(--mw-text-muted-color);
127
- opacity: 0.5;
128
- }
129
-
130
- .mw-calendar-day:hover:not(:disabled):not(.mw-selected) {
131
- background: var(--mw-primary-background);
132
- border-color: var(--mw-border-accent);
133
- }
134
-
135
- .mw-calendar-day:focus-visible {
136
- outline: none;
137
- @include focus-halo;
138
- border-color: var(--mw-primary-text-color);
139
- }
140
-
141
- // Today gets the outline, the selection gets the fill - both at once would be
142
- // indistinguishable. Secondary, so it never reads as a selection.
143
- .mw-calendar-day.mw-calendar-today {
144
- border-color: var(--mw-secondary-text-color);
145
- font-weight: font-weight('bold');
146
- }
147
-
148
- .mw-calendar-day.mw-selected {
149
- background: var(--mw-primary-color);
150
- border-color: var(--mw-primary-text-color);
151
- color: var(--mw-primary-accent-text-color);
152
- opacity: 1;
153
- }
154
-
155
- // A day that cannot be picked stays legible
156
- .mw-calendar-day:disabled {
157
- cursor: not-allowed;
158
- color: var(--mw-text-muted-color);
159
- opacity: 0.4;
160
- }
161
-
162
- // Own element so the dots can be positioned against it
163
- .mw-calendar-date {
164
- line-height: 1;
165
- }
166
-
167
- // Status dots
168
- .mw-calendar-dots {
169
- position: absolute;
170
- bottom: 5px;
171
- left: 0;
172
- right: 0;
173
- display: flex;
174
- align-items: center;
175
- justify-content: center;
176
- gap: $_mw-calendar-dot-gap;
177
- pointer-events: none;
178
- }
179
-
180
- // What a dot means belongs to the caller: the same calendar reads "request
181
- // pending / booked / time offered" in one app and something else entirely on a
182
- // public booking page. So the colour is a property, settable per cell, and the
183
- // tone classes below are just named presets for it.
184
- .mw-calendar-dot {
185
- width: $_mw-calendar-dot-size;
186
- height: $_mw-calendar-dot-size;
187
- border-radius: radius('full');
188
- background: var(--mw-calendar-dot, var(--mw-text-muted-color));
189
- flex-shrink: 0;
190
- }
191
-
192
- @each $name, $color in $_mw-calendar-dot-tones {
193
- .mw-calendar-dot-#{$name} {
194
- --mw-calendar-dot: #{$color};
3
+ @layer mw.components {
4
+ // Pixel-precise shape values
5
+ $_mw-calendar-dot-size: 5px;
6
+ $_mw-calendar-dot-gap: 3px;
7
+ $_mw-calendar-cell-height: 38px;
8
+ $_mw-calendar-cell-height-compact: 29px;
9
+ $_mw-calendar-grid-gap: 4px;
10
+ $_mw-calendar-grid-gap-sm: 3px;
11
+ $_mw-calendar-grid-gap-compact: 3px;
12
+
13
+ $_mw-calendar-dot-tones: (
14
+ 'primary': var(--mw-primary-text-color),
15
+ 'secondary': var(--mw-secondary-text-color),
16
+ 'success': var(--mw-success-text-color),
17
+ 'warning': var(--mw-warning-text-color),
18
+ 'danger': var(--mw-danger-text-color),
19
+ 'info': var(--mw-info-text-color),
20
+ );
21
+
22
+ // Same silhouette as a card, but without the hover lift
23
+ .mw-calendar {
24
+ display: block;
25
+ padding: spacing('4') spacing('3');
26
+ background: var(--mw-card-background);
27
+ border: 1px solid var(--mw-border);
28
+ @include surface;
29
+ box-shadow: var(--mw-elevation-2);
195
30
  }
196
- }
197
31
 
198
- // Only the untoned dot would drown in the selected fill. An inline
199
- // --mw-calendar-dot on the dot itself still wins over this.
200
- .mw-calendar-day.mw-selected .mw-calendar-dot:not([class*='mw-calendar-dot-']) {
201
- --mw-calendar-dot: var(--mw-primary-accent-text-color);
202
- }
203
-
204
- // Compact month - date picker density
205
- .mw-calendar-compact {
206
- padding: spacing('4');
32
+ // Calendar without its own surface - for one that already sits on a card
33
+ .mw-calendar-plain {
34
+ padding: spacing('0');
35
+ background: transparent;
36
+ border: none;
37
+ box-shadow: none;
38
+ }
207
39
 
208
40
  .mw-calendar-header {
209
- margin-bottom: spacing('4');
41
+ display: flex;
42
+ align-items: center;
43
+ gap: spacing('3');
44
+ margin-bottom: spacing('5');
210
45
  }
211
46
 
47
+ // Takes the space between the two arrows so the label stays optically centred
212
48
  .mw-calendar-title {
49
+ flex: 1;
50
+ min-width: 0;
51
+ text-align: center;
213
52
  font-size: font-size('base');
53
+ font-weight: font-weight('medium');
54
+ color: var(--mw-text-color);
55
+ @include truncate;
214
56
  }
215
57
 
58
+ // Sits on .mw-btn - this only squares it off around the chevron
216
59
  .mw-calendar-nav {
217
- padding: spacing('1') spacing('3');
218
- // The nav button is a `.mw-btn` and takes the control scale's minimum
219
- // height with it, which is what stopped the compact calendar from being
220
- // compact. A date picker header is chrome, not a form control.
221
- min-height: var(--mw-control-height-sm);
60
+ padding: spacing('2') spacing('4');
61
+ line-height: 1;
62
+ flex-shrink: 0;
63
+ }
64
+
65
+ // Grid
66
+ .mw-calendar-grid {
67
+ display: grid;
68
+ grid-template-columns: repeat(7, minmax(0, 1fr));
69
+ gap: $_mw-calendar-grid-gap-sm;
222
70
  }
223
71
 
224
72
  .mw-calendar-weekday {
225
- padding-bottom: spacing('1');
73
+ padding-bottom: spacing('2');
74
+ text-align: center;
226
75
  font-size: font-size('3xs');
76
+ font-weight: font-weight('bold');
77
+ color: var(--mw-text-muted-color);
78
+ text-transform: uppercase;
79
+ letter-spacing: 0.05em;
80
+ @include truncate;
227
81
  }
228
82
 
229
- // The gap the cells give up here goes straight back into their width
230
- .mw-calendar-grid {
231
- gap: $_mw-calendar-grid-gap-compact;
83
+ // Saturday and Sunday read like a wall calendar - the label carries the
84
+ // weekend, the cell below only gets a faint tint
85
+ .mw-calendar-weekday.mw-calendar-weekend {
86
+ color: var(--mw-danger-text-color);
232
87
  }
233
88
 
89
+ // A fixed row height instead of an aspect ratio
234
90
  .mw-calendar-day {
235
- min-height: $_mw-calendar-cell-height-compact;
236
- font-size: font-size('xs');
91
+ position: relative;
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ min-height: $_mw-calendar-cell-height;
96
+ padding: spacing('1');
97
+ border: 1px solid transparent;
98
+ border-radius: radius('sm');
99
+ background: transparent;
100
+ color: var(--mw-text-color);
101
+ font: inherit;
102
+ font-size: font-size('sm');
103
+ font-variant-numeric: tabular-nums;
104
+ line-height: 1;
105
+ cursor: pointer;
106
+ transition: var(--mw-transition);
107
+ -webkit-tap-highlight-color: transparent;
108
+ touch-action: manipulation;
237
109
  }
238
110
 
239
- // Hidden rather than forbidden, so the same markup works in both densities
240
- .mw-calendar-dots {
241
- display: none;
111
+ .mw-calendar-day:active:not(:disabled) {
112
+ transform: scale(0.92);
113
+ transition-duration: var(--mw-duration-instant);
242
114
  }
243
115
 
244
- .mw-calendar-legend {
245
- margin-top: spacing('4');
246
- padding-top: spacing('3');
116
+ .mw-calendar-day.mw-calendar-weekend {
117
+ background: var(--mw-gray-background);
247
118
  }
248
- }
249
119
 
250
- // Legend - explains what the dots stand for
251
- .mw-calendar-legend {
252
- display: flex;
253
- align-items: center;
254
- flex-wrap: wrap;
255
- gap: spacing('3') spacing('5');
256
- margin-top: spacing('5');
257
- padding-top: spacing('4');
258
- border-top: 1px solid var(--mw-border);
259
- }
120
+ // Days spilling in from the neighbouring month stay readable but clearly step
121
+ // back - leaving them out would make the first and last row look broken
122
+ .mw-calendar-day.mw-calendar-adjacent {
123
+ color: var(--mw-text-muted-color);
124
+ opacity: 0.5;
125
+ }
260
126
 
261
- .mw-calendar-legend-item {
262
- display: inline-flex;
263
- align-items: center;
264
- gap: spacing('1');
265
- font-size: font-size('xs');
266
- color: var(--mw-text-muted-color);
267
- }
127
+ .mw-calendar-day:hover:not(:disabled):not(.mw-selected) {
128
+ background: var(--mw-primary-background);
129
+ border-color: var(--mw-border-accent);
130
+ }
268
131
 
269
- // The legend dot is a plain .mw-calendar-dot, only outside of a cell
270
- .mw-calendar-legend-item .mw-calendar-dot {
271
- position: static;
272
- }
132
+ .mw-calendar-day:focus-visible {
133
+ outline: none;
134
+ @include focus-halo;
135
+ border-color: var(--mw-primary-text-color);
136
+ }
273
137
 
274
- @include media-down('sm') {
275
- .mw-calendar {
276
- padding: spacing('4') spacing('3');
138
+ // Today gets the outline, the selection gets the fill - both at once would be
139
+ // indistinguishable. Secondary, so it never reads as a selection.
140
+ .mw-calendar-day.mw-calendar-today {
141
+ border-color: var(--mw-secondary-text-color);
142
+ font-weight: font-weight('bold');
277
143
  }
278
144
 
279
- .mw-calendar-grid {
280
- gap: $_mw-calendar-grid-gap-sm;
145
+ .mw-calendar-day.mw-selected {
146
+ background: var(--mw-primary-color);
147
+ border-color: var(--mw-primary-text-color);
148
+ color: var(--mw-primary-accent-text-color);
149
+ opacity: 1;
281
150
  }
282
151
 
283
- .mw-calendar-weekday {
284
- font-size: font-size('3xs');
152
+ // A day that cannot be picked stays legible
153
+ .mw-calendar-day:disabled {
154
+ cursor: not-allowed;
155
+ color: var(--mw-text-muted-color);
156
+ opacity: 0.4;
285
157
  }
286
158
 
287
- .mw-calendar-title {
288
- font-size: font-size('base');
159
+ // Own element so the dots can be positioned against it
160
+ .mw-calendar-date {
161
+ line-height: 1;
162
+ }
163
+
164
+ // Status dots
165
+ .mw-calendar-dots {
166
+ position: absolute;
167
+ bottom: 5px;
168
+ left: 0;
169
+ right: 0;
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ gap: $_mw-calendar-dot-gap;
174
+ pointer-events: none;
175
+ }
176
+
177
+ // What a dot means belongs to the caller: the same calendar reads "request
178
+ // pending / booked / time offered" in one app and something else entirely on a
179
+ // public booking page. So the colour is a property, settable per cell, and the
180
+ // tone classes below are just named presets for it.
181
+ .mw-calendar-dot {
182
+ width: $_mw-calendar-dot-size;
183
+ height: $_mw-calendar-dot-size;
184
+ border-radius: radius('full');
185
+ background: var(--mw-calendar-dot, var(--mw-text-muted-color));
186
+ flex-shrink: 0;
289
187
  }
290
188
 
291
- // Four legend entries wrap onto three lines at this width otherwise
189
+ @each $name, $color in $_mw-calendar-dot-tones {
190
+ .mw-calendar-dot-#{$name} {
191
+ --mw-calendar-dot: #{$color};
192
+ }
193
+ }
194
+
195
+ // Only the untoned dot would drown in the selected fill. An inline
196
+ // --mw-calendar-dot on the dot itself still wins over this.
197
+ .mw-calendar-day.mw-selected
198
+ .mw-calendar-dot:not([class*='mw-calendar-dot-']) {
199
+ --mw-calendar-dot: var(--mw-primary-accent-text-color);
200
+ }
201
+
202
+ // Compact month - date picker density
203
+ .mw-calendar-compact {
204
+ padding: spacing('4');
205
+
206
+ .mw-calendar-header {
207
+ margin-bottom: spacing('4');
208
+ }
209
+
210
+ .mw-calendar-title {
211
+ font-size: font-size('base');
212
+ }
213
+
214
+ .mw-calendar-nav {
215
+ padding: spacing('1') spacing('3');
216
+ // The nav button is a `.mw-btn` and takes the control scale's minimum
217
+ // height with it, which is what stopped the compact calendar from being
218
+ // compact. A date picker header is chrome, not a form control.
219
+ min-height: var(--mw-control-height-sm);
220
+ }
221
+
222
+ .mw-calendar-weekday {
223
+ padding-bottom: spacing('1');
224
+ font-size: font-size('3xs');
225
+ }
226
+
227
+ // The gap the cells give up here goes straight back into their width
228
+ .mw-calendar-grid {
229
+ gap: $_mw-calendar-grid-gap-compact;
230
+ }
231
+
232
+ .mw-calendar-day {
233
+ min-height: $_mw-calendar-cell-height-compact;
234
+ font-size: font-size('xs');
235
+ }
236
+
237
+ // Hidden rather than forbidden, so the same markup works in both densities
238
+ .mw-calendar-dots {
239
+ display: none;
240
+ }
241
+
242
+ .mw-calendar-legend {
243
+ margin-top: spacing('4');
244
+ padding-top: spacing('3');
245
+ }
246
+ }
247
+
248
+ // Legend - explains what the dots stand for
292
249
  .mw-calendar-legend {
250
+ display: flex;
251
+ align-items: center;
252
+ flex-wrap: wrap;
293
253
  gap: spacing('2') spacing('4');
294
254
  margin-top: spacing('4');
295
255
  padding-top: spacing('3');
256
+ border-top: 1px solid var(--mw-border);
296
257
  }
297
258
 
298
259
  .mw-calendar-legend-item {
260
+ display: inline-flex;
261
+ align-items: center;
262
+ gap: spacing('1');
299
263
  font-size: font-size('2xs');
264
+ color: var(--mw-text-muted-color);
265
+ }
266
+
267
+ // The legend dot is a plain .mw-calendar-dot, only outside of a cell
268
+ .mw-calendar-legend-item .mw-calendar-dot {
269
+ position: static;
270
+ }
271
+
272
+ @include media-up('sm') {
273
+ .mw-calendar {
274
+ padding: spacing('5');
275
+ }
276
+
277
+ .mw-calendar-grid {
278
+ gap: $_mw-calendar-grid-gap;
279
+ }
280
+
281
+ .mw-calendar-weekday {
282
+ font-size: font-size('2xs');
283
+ }
284
+
285
+ .mw-calendar-title {
286
+ font-size: font-size('md');
287
+ }
288
+
289
+ // Four legend entries wrap onto three lines at this width otherwise
290
+ .mw-calendar-legend {
291
+ gap: spacing('3') spacing('5');
292
+ margin-top: spacing('5');
293
+ padding-top: spacing('4');
294
+ }
295
+
296
+ .mw-calendar-legend-item {
297
+ font-size: font-size('xs');
298
+ }
300
299
  }
301
300
  }