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.
- package/.claude/skills/maverick-wave/SKILL.md +62 -30
- package/.claude/skills/maverick-wave/examples/angular-form.md +1 -1
- package/.claude/skills/maverick-wave/examples/angular-services.md +15 -8
- package/.claude/skills/maverick-wave/examples/static-landing-page.md +4 -4
- package/.claude/skills/maverick-wave/references/components.md +416 -27
- package/.claude/skills/maverick-wave/references/forms.md +8 -4
- package/.claude/skills/maverick-wave/references/javascript.md +32 -18
- package/.claude/skills/maverick-wave/references/layout.md +48 -3
- package/.claude/skills/maverick-wave/references/theming.md +34 -24
- package/CHANGELOG.md +56 -0
- package/index.html +25 -0
- package/maverick-wave.min.css +2 -2
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/src/js/main.js +314 -20
- package/src/partials/accordions-container.html +2 -2
- package/src/partials/button-bar-container.html +4 -2
- package/src/partials/buttons-container.html +35 -0
- package/src/partials/calendar-container.html +205 -0
- package/src/partials/cards-container.html +43 -0
- package/src/partials/documentation-container.html +3 -0
- package/src/partials/form-container.html +1 -1
- package/src/partials/get-started-container.html +2 -2
- package/src/partials/kanban-container.html +680 -715
- package/src/partials/modals-container.html +5 -5
- package/src/partials/pagination-container.html +50 -13
- package/src/partials/segmented-container.html +66 -0
- package/src/partials/tables-container.html +96 -24
- package/src/partials/tabs-container.html +16 -6
- package/src/partials/tags-container.html +15 -0
- package/src/partials/timelines-container.html +2 -2
- package/src/partials/utilities-container.html +81 -0
- package/src/scss/abstracts/_mixins.scss +34 -0
- package/src/scss/abstracts/_variables.scss +6 -2
- package/src/scss/base/_base.scss +21 -0
- package/src/scss/components/_accordions.scss +2 -0
- package/src/scss/components/_alerts.scss +5 -19
- package/src/scss/components/_button-bar.scss +6 -0
- package/src/scss/components/_buttons.scss +67 -0
- package/src/scss/components/_calendar.scss +290 -0
- package/src/scss/components/_content-slider.scss +1 -0
- package/src/scss/components/_index.scss +2 -0
- package/src/scss/components/_kanban.scss +2 -6
- package/src/scss/components/_modals.scss +15 -4
- package/src/scss/components/_pagination.scss +68 -64
- package/src/scss/components/_segmented.scss +85 -0
- package/src/scss/components/_tables.scss +16 -0
- package/src/scss/components/_tabs.scss +15 -0
- package/src/scss/components/_tags.scss +16 -0
- package/src/scss/components/_theme-toggle.scss +2 -0
- package/src/scss/components/_timelines.scss +3 -0
- package/src/scss/form-elements/_form.scss +13 -7
- package/src/scss/layout/_header.scss +3 -0
- package/src/scss/layout/_main.scss +5 -1
- package/src/scss/layout/_section.scss +1 -1
- package/src/scss/utilities/_accessibility.scss +14 -0
- package/src/scss/utilities/_flex.scss +17 -0
- package/src/scss/utilities/_index.scss +2 -0
- package/src/scss/utilities/_text.scss +17 -5
- 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':
|
|
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',
|
|
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,
|
package/src/scss/base/_base.scss
CHANGED
|
@@ -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
|
-
|
|
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
|
+
}
|
|
@@ -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-
|
|
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:
|
|
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:
|
|
52
|
+
max-width: 720px;
|
|
49
53
|
max-height: 90dvh;
|
|
50
54
|
}
|
|
51
55
|
&.mw-modal-xl {
|
|
52
|
-
max-width:
|
|
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
|
}
|