maverick-wave 3.10.0 → 4.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 (60) hide show
  1. package/.claude/skills/maverick-wave/SKILL.md +62 -30
  2. package/.claude/skills/maverick-wave/examples/angular-form.md +1 -1
  3. package/.claude/skills/maverick-wave/examples/angular-services.md +15 -8
  4. package/.claude/skills/maverick-wave/examples/static-landing-page.md +4 -4
  5. package/.claude/skills/maverick-wave/references/components.md +416 -27
  6. package/.claude/skills/maverick-wave/references/forms.md +8 -4
  7. package/.claude/skills/maverick-wave/references/javascript.md +32 -18
  8. package/.claude/skills/maverick-wave/references/layout.md +48 -3
  9. package/.claude/skills/maverick-wave/references/theming.md +34 -24
  10. package/CHANGELOG.md +56 -0
  11. package/index.html +25 -0
  12. package/maverick-wave.min.css +2 -2
  13. package/maverick-wave.min.js +1 -1
  14. package/package.json +2 -2
  15. package/src/js/main.js +314 -20
  16. package/src/partials/accordions-container.html +2 -2
  17. package/src/partials/button-bar-container.html +4 -2
  18. package/src/partials/buttons-container.html +35 -0
  19. package/src/partials/calendar-container.html +205 -0
  20. package/src/partials/cards-container.html +43 -0
  21. package/src/partials/documentation-container.html +3 -0
  22. package/src/partials/form-container.html +1 -1
  23. package/src/partials/get-started-container.html +2 -2
  24. package/src/partials/kanban-container.html +680 -715
  25. package/src/partials/modals-container.html +5 -5
  26. package/src/partials/pagination-container.html +50 -13
  27. package/src/partials/segmented-container.html +66 -0
  28. package/src/partials/tables-container.html +96 -24
  29. package/src/partials/tabs-container.html +16 -6
  30. package/src/partials/tags-container.html +15 -0
  31. package/src/partials/timelines-container.html +2 -2
  32. package/src/partials/utilities-container.html +81 -0
  33. package/src/scss/abstracts/_mixins.scss +34 -0
  34. package/src/scss/abstracts/_variables.scss +6 -2
  35. package/src/scss/base/_base.scss +21 -0
  36. package/src/scss/components/_accordions.scss +2 -0
  37. package/src/scss/components/_alerts.scss +5 -19
  38. package/src/scss/components/_button-bar.scss +6 -0
  39. package/src/scss/components/_buttons.scss +67 -0
  40. package/src/scss/components/_calendar.scss +290 -0
  41. package/src/scss/components/_content-slider.scss +1 -0
  42. package/src/scss/components/_index.scss +2 -0
  43. package/src/scss/components/_kanban.scss +2 -6
  44. package/src/scss/components/_modals.scss +15 -4
  45. package/src/scss/components/_pagination.scss +68 -64
  46. package/src/scss/components/_segmented.scss +85 -0
  47. package/src/scss/components/_tables.scss +16 -0
  48. package/src/scss/components/_tabs.scss +15 -0
  49. package/src/scss/components/_tags.scss +16 -0
  50. package/src/scss/components/_theme-toggle.scss +2 -0
  51. package/src/scss/components/_timelines.scss +3 -0
  52. package/src/scss/form-elements/_form.scss +13 -7
  53. package/src/scss/layout/_header.scss +3 -0
  54. package/src/scss/layout/_main.scss +5 -1
  55. package/src/scss/layout/_section.scss +1 -1
  56. package/src/scss/utilities/_accessibility.scss +14 -0
  57. package/src/scss/utilities/_flex.scss +17 -0
  58. package/src/scss/utilities/_index.scss +2 -0
  59. package/src/scss/utilities/_text.scss +17 -5
  60. package/src/scss/utilities/_touch-targets.scss +54 -0
@@ -95,6 +95,10 @@ $base-colors: (
95
95
  'gray-color': $gray-color,
96
96
  // Subtle neutral surface: zebra rows, disabled fields, tracks, skeletons
97
97
  'gray-background': fade('gray-color', 20%),
98
+ // Same surface under the name people reach for when they want a slightly
99
+ // set-off area *inside* a card - hint block, framed paragraph, form summary.
100
+ // An alias on purpose: one tone, two names, so nobody invents a third.
101
+ 'surface-muted': token('gray-background'),
98
102
  // Heavy scrim behind modals and blocking spinners
99
103
  'overlay-background': fade('gray-color', 60%),
100
104
  'section-alternate-pattern': fade('gray-color', 45%),
@@ -128,7 +132,7 @@ $dark-theme-colors: (
128
132
  'page-background': $dark-background,
129
133
  'hero-overlay-background': fade('dark-page-background', 30%),
130
134
  'card-background': tint('dark-page-background', 5%),
131
- 'footer-background': tint('dark-page-background', 3%),
135
+ 'footer-background': shade('dark-page-background', 30%),
132
136
  'border': tint('dark-page-background', 16%),
133
137
  'shadow': fade('dark-text-color', 30%),
134
138
  'text-color': $dark-text-color,
@@ -140,7 +144,7 @@ $light-theme-colors: (
140
144
  'page-background': $light-background,
141
145
  'hero-overlay-background': fade('light-page-background', 30%),
142
146
  'card-background': tint('light-page-background', 40%),
143
- 'footer-background': shade('light-page-background', 2%),
147
+ 'footer-background': shade('light-page-background', 8%),
144
148
  'border': shade('light-page-background', 15%),
145
149
  'shadow': fade('light-text-color', 30%),
146
150
  'text-color': $light-text-color,
@@ -48,6 +48,16 @@ $_active-prefix: 'dark';
48
48
  // header height
49
49
  --mw-header-height: #{$header-height};
50
50
 
51
+ // Layout knobs. A good default is not enough here: what reads as generous on
52
+ // a landing page costs visible content in an application with a sticky
53
+ // header. Same framework, two different right answers.
54
+ --mw-container-width: min(1200px, 89%);
55
+ // Below 'sm' the percentage turns into wasted margin - 89% of a 375px screen
56
+ // leaves 41px of nothing on a card that has to fit amount, status and two
57
+ // labels into one row. A fixed gutter uses the width instead.
58
+ --mw-container-width-sm: calc(100% - #{spacing('5')} * 2);
59
+ --mw-section-padding-block: #{spacing('7')};
60
+
51
61
  // Active theme — aliases onto the dark or light set above
52
62
  @each $name, $value in $_active-theme {
53
63
  --mw-#{$name}: var(--mw-#{$_active-prefix}-#{$name});
@@ -62,3 +72,14 @@ $_active-prefix: 'dark';
62
72
  }
63
73
  }
64
74
  }
75
+
76
+ // Anything that draws its own surface re-points the cover colour of a scroll
77
+ // hint, so a tab bar or a wide table inside a card fades into the card and not
78
+ // into the page behind it. Inherited, so nesting keeps working.
79
+ .mw-card,
80
+ .mw-panel,
81
+ .mw-modal,
82
+ .mw-tile,
83
+ .mw-calendar:not(.mw-calendar-plain) {
84
+ --mw-scroll-hint-cover: var(--mw-card-background);
85
+ }
@@ -42,6 +42,7 @@
42
42
  transform: rotate(0deg);
43
43
  }
44
44
 
45
+ &.mw-active,
45
46
  &.active {
46
47
  background: var(--mw-primary-color);
47
48
  color: var(--mw-accent-text-color);
@@ -67,6 +68,7 @@
67
68
  }
68
69
  }
69
70
 
71
+ &.mw-active,
70
72
  &.active {
71
73
  height: auto;
72
74
  max-height: 500px;
@@ -2,7 +2,6 @@
2
2
 
3
3
  .mw-alert {
4
4
  position: relative;
5
- overflow: hidden;
6
5
  display: flex;
7
6
  align-items: flex-start;
8
7
  padding: spacing('4') spacing('5');
@@ -13,13 +12,6 @@
13
12
  border: 1px solid var(--mw-border);
14
13
  box-shadow: 0 2px 5px var(--mw-shadow);
15
14
 
16
- &-icon,
17
- &-content,
18
- .mw-alert-close {
19
- position: relative;
20
- z-index: z-index('alert') + 5;
21
- }
22
-
23
15
  &-icon {
24
16
  flex-shrink: 0;
25
17
  margin-right: spacing('4');
@@ -83,19 +75,13 @@ $_mw-alert-colors: (
83
75
  // Color variants
84
76
  @each $name, $col in $_mw-alert-colors {
85
77
  .mw-alert-#{$name} {
86
- border: 1px solid rgba($col, 0.2);
78
+ background-image: linear-gradient(
79
+ var(--mw-#{$name}-info-background),
80
+ var(--mw-#{$name}-info-background)
81
+ );
82
+ border: 1px solid color-mix(in srgb, #{$col} 20%, transparent);
87
83
  border-left: 4px solid #{$col};
88
84
 
89
- // Color layer
90
- &::before {
91
- content: '';
92
- position: absolute;
93
- inset: 0;
94
- background: var(--mw-#{$name}-info-background);
95
- z-index: z-index('alert');
96
- pointer-events: none;
97
- }
98
-
99
85
  .mw-alert-icon {
100
86
  color: #{$col};
101
87
  }
@@ -35,6 +35,12 @@
35
35
  justify-content: flex-end;
36
36
  }
37
37
 
38
+ // Explicit counterpart to the three above - it matches the default, but nobody
39
+ // should have to look that up to find out
40
+ .mw-button-bar-center {
41
+ justify-content: center;
42
+ }
43
+
38
44
  .mw-button-bar-between {
39
45
  justify-content: space-between;
40
46
 
@@ -36,6 +36,7 @@
36
36
  &:hover:not(:disabled) {
37
37
  background: var(--mw-primary-color-hover);
38
38
  }
39
+ &.mw-active:not(:disabled),
39
40
  &.active:not(:disabled) {
40
41
  background: var(--mw-primary-color-hover);
41
42
  border: 1px solid var(--mw-primary-color);
@@ -47,6 +48,7 @@
47
48
  &:hover:not(:disabled) {
48
49
  background: var(--mw-secondary-color-hover);
49
50
  }
51
+ &.mw-active:not(:disabled),
50
52
  &.active:not(:disabled) {
51
53
  background: var(--mw-secondary-color-hover);
52
54
  border: 1px solid var(--mw-secondary-color);
@@ -59,6 +61,7 @@
59
61
  &:hover:not(:disabled) {
60
62
  background: var(--mw-danger-color-hover);
61
63
  }
64
+ &.mw-active:not(:disabled),
62
65
  &.active:not(:disabled) {
63
66
  background: var(--mw-danger-color-hover);
64
67
  border: 1px solid var(--mw-danger-color);
@@ -70,6 +73,7 @@
70
73
  &:hover:not(:disabled) {
71
74
  background: var(--mw-success-color-hover);
72
75
  }
76
+ &.mw-active:not(:disabled),
73
77
  &.active:not(:disabled) {
74
78
  background: var(--mw-success-color-hover);
75
79
  border: 1px solid var(--mw-success-color);
@@ -83,6 +87,7 @@
83
87
  background: var(--mw-primary-color);
84
88
  color: var(--mw-accent-text-color);
85
89
  }
90
+ &.mw-active:not(:disabled),
86
91
  &.active:not(:disabled) {
87
92
  background: var(--mw-primary-color);
88
93
  color: var(--mw-accent-text-color);
@@ -108,6 +113,36 @@
108
113
  }
109
114
  }
110
115
 
116
+ // A button that brings nothing but its operability - settings tabs, calendar
117
+ // days, the time in a request row, a modal backdrop. Everywhere a <button> is
118
+ // the right element and a button is the wrong look.
119
+ //
120
+ // Not the same as `mw-btn-link`: that one is a button dressed as a link, with
121
+ // its own colour and a min-width. This one has no look at all.
122
+ .mw-btn-plain {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ appearance: none;
126
+ background: none;
127
+ border: 0;
128
+ padding: 0;
129
+ margin: 0;
130
+ font: inherit;
131
+ color: inherit;
132
+ text-align: inherit;
133
+ cursor: pointer;
134
+
135
+ &:focus-visible {
136
+ outline: 2px solid var(--mw-primary-color);
137
+ outline-offset: 2px;
138
+ }
139
+
140
+ &:disabled {
141
+ cursor: not-allowed;
142
+ opacity: 0.6;
143
+ }
144
+ }
145
+
111
146
  // Size modifiers
112
147
  .mw-btn-sm {
113
148
  padding: spacing('1') spacing('3');
@@ -130,6 +165,38 @@
130
165
  }
131
166
  }
132
167
 
168
+ // A line of text above a row of actions - "This action cannot be undone", what
169
+ // a save applies to, why a button is disabled.
170
+ //
171
+ // It goes *inside* the action row, so no extra wrapper is needed: a full-width
172
+ // flex line pushes the buttons onto the row below. Only rows that actually
173
+ // carry a note start wrapping, so nothing existing changes its behaviour.
174
+ //
175
+ // `mw-form-actions-hint` was the form-only version of this and stays as an
176
+ // alias - the name is wrong the moment the same line sits in a modal.
177
+ .mw-modal-footer,
178
+ .mw-form-actions,
179
+ .mw-panel-footer,
180
+ .mw-card-footer {
181
+ &:has(.mw-actions-note),
182
+ &:has(.mw-form-actions-hint) {
183
+ flex-wrap: wrap;
184
+ // The column gap between buttons is too tight to double as the gap to the
185
+ // line above them
186
+ row-gap: spacing('3');
187
+ }
188
+ }
189
+
190
+ .mw-actions-note,
191
+ .mw-form-actions-hint {
192
+ flex: 1 0 100%;
193
+ margin: spacing('0');
194
+ text-align: right;
195
+ font-size: font-size('sm');
196
+ color: var(--mw-text-muted-color);
197
+ text-wrap: pretty;
198
+ }
199
+
133
200
  .mw-btn-mini {
134
201
  display: inline-flex;
135
202
  align-items: center;
@@ -0,0 +1,290 @@
1
+ @use '../abstracts' as *;
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-color),
14
+ 'secondary': var(--mw-secondary-color),
15
+ 'success': var(--mw-success-color),
16
+ 'warning': var(--mw-warning-color),
17
+ 'danger': var(--mw-danger-color),
18
+ 'info': var(--mw-info-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
+ border-radius: radius('sm') radius('xl') radius('sm') radius('xl');
28
+ box-shadow: 0 5px 10px var(--mw-shadow);
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-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
+ }
111
+
112
+ .mw-calendar-day.mw-calendar-weekend {
113
+ background: var(--mw-gray-background);
114
+ }
115
+
116
+ // Days spilling in from the neighbouring month stay readable but clearly step
117
+ // back - leaving them out would make the first and last row look broken
118
+ .mw-calendar-day.mw-calendar-adjacent {
119
+ color: var(--mw-text-muted-color);
120
+ opacity: 0.5;
121
+ }
122
+
123
+ .mw-calendar-day:hover:not(:disabled):not(.mw-selected) {
124
+ background: var(--mw-primary-background);
125
+ border-color: var(--mw-border-accent);
126
+ }
127
+
128
+ .mw-calendar-day:focus-visible {
129
+ outline: none;
130
+ box-shadow: 0 0 0 2px var(--mw-primary-background);
131
+ border-color: var(--mw-primary-color);
132
+ }
133
+
134
+ // Today gets the outline, the selection gets the fill - both at once would be
135
+ // indistinguishable. Secondary, so it never reads as a selection.
136
+ .mw-calendar-day.mw-calendar-today {
137
+ border-color: var(--mw-secondary-color);
138
+ font-weight: font-weight('bold');
139
+ }
140
+
141
+ .mw-calendar-day.mw-selected {
142
+ background: var(--mw-primary-color);
143
+ border-color: var(--mw-primary-color);
144
+ color: var(--mw-accent-text-color);
145
+ opacity: 1;
146
+ }
147
+
148
+ // A day that cannot be picked stays legible
149
+ .mw-calendar-day:disabled {
150
+ cursor: not-allowed;
151
+ color: var(--mw-text-muted-color);
152
+ opacity: 0.4;
153
+ }
154
+
155
+ // Own element so the dots can be positioned against it
156
+ .mw-calendar-date {
157
+ line-height: 1;
158
+ }
159
+
160
+ // Status dots
161
+ .mw-calendar-dots {
162
+ position: absolute;
163
+ bottom: 5px;
164
+ left: 0;
165
+ right: 0;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ gap: $_mw-calendar-dot-gap;
170
+ pointer-events: none;
171
+ }
172
+
173
+ // What a dot means belongs to the caller: the same calendar reads "request
174
+ // pending / booked / time offered" in one app and something else entirely on a
175
+ // public booking page. So the colour is a property, settable per cell, and the
176
+ // tone classes below are just named presets for it.
177
+ .mw-calendar-dot {
178
+ width: $_mw-calendar-dot-size;
179
+ height: $_mw-calendar-dot-size;
180
+ border-radius: radius('full');
181
+ background: var(--mw-calendar-dot, var(--mw-text-muted-color));
182
+ flex-shrink: 0;
183
+ }
184
+
185
+ @each $name, $color in $_mw-calendar-dot-tones {
186
+ .mw-calendar-dot-#{$name} {
187
+ --mw-calendar-dot: #{$color};
188
+ }
189
+ }
190
+
191
+ // Only the untoned dot would drown in the selected fill. An inline
192
+ // --mw-calendar-dot on the dot itself still wins over this.
193
+ .mw-calendar-day.mw-selected .mw-calendar-dot:not([class*='mw-calendar-dot-']) {
194
+ --mw-calendar-dot: var(--mw-accent-text-color);
195
+ }
196
+
197
+ // Compact month - date picker density
198
+ .mw-calendar-compact {
199
+ padding: spacing('4');
200
+
201
+ .mw-calendar-header {
202
+ margin-bottom: spacing('4');
203
+ }
204
+
205
+ .mw-calendar-title {
206
+ font-size: font-size('base');
207
+ }
208
+
209
+ .mw-calendar-nav {
210
+ padding: spacing('1') spacing('3');
211
+ }
212
+
213
+ .mw-calendar-weekday {
214
+ padding-bottom: spacing('1');
215
+ font-size: font-size('3xs');
216
+ }
217
+
218
+ // The gap the cells give up here goes straight back into their width
219
+ .mw-calendar-grid {
220
+ gap: $_mw-calendar-grid-gap-compact;
221
+ }
222
+
223
+ .mw-calendar-day {
224
+ min-height: $_mw-calendar-cell-height-compact;
225
+ font-size: font-size('xs');
226
+ }
227
+
228
+ // Hidden rather than forbidden, so the same markup works in both densities
229
+ .mw-calendar-dots {
230
+ display: none;
231
+ }
232
+
233
+ .mw-calendar-legend {
234
+ margin-top: spacing('4');
235
+ padding-top: spacing('3');
236
+ }
237
+ }
238
+
239
+ // Legend - explains what the dots stand for
240
+ .mw-calendar-legend {
241
+ display: flex;
242
+ align-items: center;
243
+ flex-wrap: wrap;
244
+ gap: spacing('3') spacing('5');
245
+ margin-top: spacing('5');
246
+ padding-top: spacing('4');
247
+ border-top: 1px solid var(--mw-border);
248
+ }
249
+
250
+ .mw-calendar-legend-item {
251
+ display: inline-flex;
252
+ align-items: center;
253
+ gap: spacing('1');
254
+ font-size: font-size('xs');
255
+ color: var(--mw-text-muted-color);
256
+ }
257
+
258
+ // The legend dot is a plain .mw-calendar-dot, only outside of a cell
259
+ .mw-calendar-legend-item .mw-calendar-dot {
260
+ position: static;
261
+ }
262
+
263
+ @include media-down('sm') {
264
+ .mw-calendar {
265
+ padding: spacing('4') spacing('3');
266
+ }
267
+
268
+ .mw-calendar-grid {
269
+ gap: $_mw-calendar-grid-gap-sm;
270
+ }
271
+
272
+ .mw-calendar-weekday {
273
+ font-size: font-size('3xs');
274
+ }
275
+
276
+ .mw-calendar-title {
277
+ font-size: font-size('base');
278
+ }
279
+
280
+ // Four legend entries wrap onto three lines at this width otherwise
281
+ .mw-calendar-legend {
282
+ gap: spacing('2') spacing('4');
283
+ margin-top: spacing('4');
284
+ padding-top: spacing('3');
285
+ }
286
+
287
+ .mw-calendar-legend-item {
288
+ font-size: font-size('2xs');
289
+ }
290
+ }
@@ -69,6 +69,7 @@
69
69
  display: block;
70
70
  }
71
71
 
72
+ &.mw-active,
72
73
  &.active {
73
74
  transform: translateX(0);
74
75
  }
@@ -5,6 +5,7 @@
5
5
  @forward 'buttons';
6
6
  @forward 'button-bar';
7
7
  @forward 'breadcrumbs';
8
+ @forward 'calendar';
8
9
  @forward 'cards';
9
10
  @forward 'code';
10
11
  @forward 'coming-soon';
@@ -22,6 +23,7 @@
22
23
  @forward 'panels';
23
24
  @forward 'progress';
24
25
  @forward 'ratings';
26
+ @forward 'segmented';
25
27
  @forward 'skeleton';
26
28
  @forward 'spinners';
27
29
  @forward 'stepper';
@@ -357,12 +357,8 @@ $_mw-kanban-ribbon-clearance-compact: 58px;
357
357
  }
358
358
 
359
359
  @media (prefers-reduced-motion: reduce) {
360
- .mw-kanban-card,
361
- .mw-kanban-move {
362
- transition: none;
363
- }
364
-
365
- .mw-kanban-card.mw-kanban-card-in {
360
+ .mw-kanban-card.mw-kanban-card-in,
361
+ .mw-kanban-composer.mw-active {
366
362
  animation: none;
367
363
  }
368
364
  }
@@ -29,7 +29,7 @@
29
29
  background: var(--mw-card-background);
30
30
  border-radius: radius('sm') radius('xl') radius('sm') radius('xl');
31
31
  box-shadow: 0 25px 50px var(--mw-shadow);
32
- max-width: 550px;
32
+ max-width: 520px;
33
33
  width: 100%;
34
34
  max-height: 85dvh;
35
35
  display: flex;
@@ -40,16 +40,20 @@
40
40
  transform: scale(1) translateY(0);
41
41
  }
42
42
 
43
+ // The four widths grow by a roughly even step (150 / 200 / 240px) so each
44
+ // size is recognisably a size. Before, default and lg sat 130px apart - the
45
+ // smallest gap of the four, right in the middle of the scale, which made the
46
+ // two read as the same modal rendered twice.
43
47
  &.mw-modal-sm {
44
48
  max-width: 370px;
45
49
  max-height: 80dvh;
46
50
  }
47
51
  &.mw-modal-lg {
48
- max-width: 680px;
52
+ max-width: 720px;
49
53
  max-height: 90dvh;
50
54
  }
51
55
  &.mw-modal-xl {
52
- max-width: 900px;
56
+ max-width: 960px;
53
57
  max-height: 92dvh;
54
58
  }
55
59
  }
@@ -111,7 +115,10 @@
111
115
  }
112
116
  }
113
117
 
114
- // Backdrop for click-outside-to-close
118
+ // Backdrop for click-outside-to-close.
119
+ // The cursor says it is clickable, so it should also be reachable by keyboard -
120
+ // which means it wants to be a <button>. These four lines clear the browser
121
+ // defaults that come with one; on a <div> they change nothing.
115
122
  .mw-modal-backdrop {
116
123
  position: absolute;
117
124
  top: 0;
@@ -120,4 +127,8 @@
120
127
  bottom: 0;
121
128
  z-index: z-index('modal')-5;
122
129
  cursor: pointer;
130
+ appearance: none;
131
+ padding: 0;
132
+ background: none;
133
+ border: 0;
123
134
  }