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.
- package/.claude/settings.local.json +29 -1
- package/.claude/skills/mw-maverick-wave/SKILL.md +39 -24
- package/.claude/skills/mw-maverick-wave/examples/angular-services.md +16 -4
- package/.claude/skills/mw-maverick-wave/examples/static-landing-page.md +13 -4
- package/.claude/skills/mw-maverick-wave/references/components.md +42 -5
- package/.claude/skills/mw-maverick-wave/references/forms.md +14 -2
- package/.claude/skills/mw-maverick-wave/references/javascript.md +17 -4
- package/.claude/skills/mw-maverick-wave/references/layout.md +53 -19
- package/.claude/skills/mw-maverick-wave/references/theming.md +38 -1
- package/.impeccable/config.local.json +5 -0
- package/.impeccable/hook.cache.json +1 -0
- package/CHANGELOG.md +11 -0
- package/CLAUDE.md +5 -5
- package/README.md +48 -4
- package/index.html +19 -38
- package/maverick-wave.min.css +14 -12
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/scripts/verify.js +27 -2
- package/src/js/main.js +223 -83
- package/src/partials/accordions-container.html +6 -10
- package/src/partials/alerts-container.html +6 -6
- package/src/partials/announcement-container.html +5 -5
- package/src/partials/avatars-container.html +85 -17
- package/src/partials/badges-container.html +6 -6
- package/src/partials/blog-posts-container.html +11 -12
- package/src/partials/buttons-container.html +3 -3
- package/src/partials/cards-container.html +26 -9
- package/src/partials/code-container.html +5 -5
- package/src/partials/content-slider-container.html +5 -4
- package/src/partials/divider-container.html +7 -7
- package/src/partials/dropdown-container.html +2 -2
- package/src/partials/empty-state-container.html +5 -5
- package/src/partials/footer-container.html +21 -18
- package/src/partials/form-elements-container.html +14 -14
- package/src/partials/gallery-container.html +16 -8
- package/src/partials/get-started-container.html +4 -8
- package/src/partials/header-container.html +18 -7
- package/src/partials/home-container.html +10 -20
- package/src/partials/input-group-container.html +11 -2
- package/src/partials/kbd-container.html +1 -1
- package/src/partials/login-container.html +5 -1
- package/src/partials/media-container.html +2 -2
- package/src/partials/modals-container.html +22 -32
- package/src/partials/pricing-container.html +9 -9
- package/src/partials/skeleton-container.html +6 -6
- package/src/partials/stepper-container.html +2 -2
- package/src/partials/tables-container.html +12 -12
- package/src/partials/tabs-container.html +17 -27
- package/src/partials/tags-container.html +23 -17
- package/src/partials/techstack-bucket-container.html +13 -0
- package/src/partials/tiles-container.html +26 -9
- package/src/partials/typography-container.html +7 -6
- package/src/partials/utilities-container.html +35 -15
- package/src/scss/_layers.scss +10 -0
- package/src/scss/abstracts/_index.scss +6 -0
- package/src/scss/abstracts/_mixins.scss +61 -153
- package/src/scss/abstracts/_variables.scss +123 -319
- package/src/scss/base/_base.scss +170 -190
- package/src/scss/base/_reset.scss +106 -104
- package/src/scss/base/_typography.scss +153 -151
- package/src/scss/components/_accordions.scss +97 -97
- package/src/scss/components/_alerts.scss +71 -70
- package/src/scss/components/_announcement.scss +71 -70
- package/src/scss/components/_avatars.scss +130 -142
- package/src/scss/components/_badge.scss +131 -132
- package/src/scss/components/_blog-post.scss +223 -220
- package/src/scss/components/_breadcrumbs.scss +93 -92
- package/src/scss/components/_button-bar.scss +102 -110
- package/src/scss/components/_buttons.scss +319 -324
- package/src/scss/components/_calendar.scss +251 -252
- package/src/scss/components/_cards.scss +359 -386
- package/src/scss/components/_code.scss +190 -194
- package/src/scss/components/_coming-soon.scss +77 -75
- package/src/scss/components/_content-slider.scss +90 -89
- package/src/scss/components/_divider.scss +55 -53
- package/src/scss/components/_dropdown.scss +179 -185
- package/src/scss/components/_empty-state.scss +57 -57
- package/src/scss/components/_flag.scss +294 -278
- package/src/scss/components/_gallery.scss +131 -133
- package/src/scss/components/_info.scss +151 -167
- package/src/scss/components/_kanban.scss +332 -341
- package/src/scss/components/_kbd.scss +40 -38
- package/src/scss/components/_lang-switch.scss +89 -97
- package/src/scss/components/_links.scss +21 -28
- package/src/scss/components/_lists.scss +510 -514
- package/src/scss/components/_localhost-indicator.scss +26 -24
- package/src/scss/components/_media.scss +22 -20
- package/src/scss/components/_meta-info.scss +35 -33
- package/src/scss/components/_modals.scss +277 -186
- package/src/scss/components/_pagination.scss +81 -87
- package/src/scss/components/_panels.scss +99 -97
- package/src/scss/components/_pricing.scss +183 -241
- package/src/scss/components/_progress.scss +112 -89
- package/src/scss/components/_prose.scss +35 -33
- package/src/scss/components/_ratings.scss +40 -38
- package/src/scss/components/_segmented.scss +82 -84
- package/src/scss/components/_skeleton.scss +66 -72
- package/src/scss/components/_spinners.scss +155 -159
- package/src/scss/components/_stepper.scss +116 -116
- package/src/scss/components/_tables.scss +155 -148
- package/src/scss/components/_tabs.scss +232 -141
- package/src/scss/components/_tags.scss +109 -107
- package/src/scss/components/_techstack-bucket.scss +123 -122
- package/src/scss/components/_testimonial.scss +72 -70
- package/src/scss/components/_theme-toggle.scss +53 -51
- package/src/scss/components/_tiles.scss +174 -174
- package/src/scss/components/_timelines.scss +282 -280
- package/src/scss/components/_toasts.scss +66 -72
- package/src/scss/form-elements/_checkbox.scss +117 -132
- package/src/scss/form-elements/_form.scss +149 -115
- package/src/scss/form-elements/_input-group.scss +99 -103
- package/src/scss/form-elements/_input.scss +74 -74
- package/src/scss/form-elements/_login.scss +48 -48
- package/src/scss/form-elements/_prefilled.scss +53 -51
- package/src/scss/form-elements/_radio.scss +95 -107
- package/src/scss/form-elements/_select.scss +42 -42
- package/src/scss/form-elements/_slider.scss +117 -132
- package/src/scss/form-elements/_textarea.scss +68 -54
- package/src/scss/form-elements/_toggle.scss +127 -140
- package/src/scss/layout/_footer.scss +172 -171
- package/src/scss/layout/_grid.scss +268 -302
- package/src/scss/layout/_header.scss +426 -427
- package/src/scss/layout/_home.scss +28 -27
- package/src/scss/layout/_main.scss +275 -238
- package/src/scss/layout/_page-header.scss +38 -36
- package/src/scss/layout/_section.scss +150 -124
- package/src/scss/main.scss +1 -1
- package/src/scss/utilities/_accessibility.scss +46 -45
- package/src/scss/utilities/_aspect.scss +22 -20
- package/src/scss/utilities/_corner.scss +23 -5
- package/src/scss/utilities/_display.scss +76 -70
- package/src/scss/utilities/_elevation.scss +13 -11
- package/src/scss/utilities/_flex.scss +83 -85
- package/src/scss/utilities/_reveal.scss +40 -63
- package/src/scss/utilities/_spacing.scss +63 -64
- package/src/scss/utilities/_text.scss +139 -141
- package/src/scss/utilities/_touch-targets.scss +130 -147
|
@@ -1,301 +1,300 @@
|
|
|
1
1
|
@use '../abstracts' as *;
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
$_mw-calendar-dot-
|
|
6
|
-
$_mw-calendar-
|
|
7
|
-
$_mw-calendar-cell-height
|
|
8
|
-
$_mw-calendar-
|
|
9
|
-
$_mw-calendar-grid-gap
|
|
10
|
-
$_mw-calendar-grid-gap-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
//
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
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('
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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('
|
|
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
|
-
//
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
|
|
236
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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-
|
|
245
|
-
|
|
246
|
-
padding-top: spacing('3');
|
|
116
|
+
.mw-calendar-day.mw-calendar-weekend {
|
|
117
|
+
background: var(--mw-gray-background);
|
|
247
118
|
}
|
|
248
|
-
}
|
|
249
119
|
|
|
250
|
-
//
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
275
|
-
.
|
|
276
|
-
|
|
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-
|
|
280
|
-
|
|
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
|
-
|
|
284
|
-
|
|
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
|
-
|
|
288
|
-
|
|
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
|
-
|
|
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
|
}
|