maverick-wave 6.2.0 → 6.4.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/README.md +2 -2
- package/maverick-wave.min.css +6 -6
- package/maverick-wave.min.js +1 -1
- package/package.json +2 -2
- package/src/js/main.js +11 -0
- package/src/scss/components/_alerts.scss +9 -0
- package/src/scss/components/_announcement.scss +18 -3
- package/src/scss/components/_dropdown.scss +7 -1
- package/src/scss/components/_info.scss +15 -0
- package/src/scss/components/_marquee.scss +1 -1
- package/src/scss/components/_modals.scss +21 -0
- package/src/scss/components/_mosaic.scss +8 -2
- package/src/scss/components/_panels.scss +65 -1
- package/src/scss/components/_tables.scss +9 -4
- package/src/scss/components/_tags.scss +5 -0
- package/src/scss/components/_theme-toggle.scss +19 -0
- package/src/scss/components/_toasts.scss +20 -4
- package/src/scss/form-elements/_input.scss +21 -0
- package/src/scss/layout/_app-shell.scss +6 -4
- package/src/scss/layout/_header.scss +36 -18
- package/src/scss/layout/_page-header.scss +74 -0
- package/src/scss/utilities/_display.scss +5 -0
- package/src/scss/utilities/_print.scss +2 -0
- package/src/scss/utilities/_touch-targets.scss +5 -0
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
transition-duration: var(--mw-duration-instant);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
// A theme pinned by the site leaves nothing to switch
|
|
28
|
+
&:disabled {
|
|
29
|
+
opacity: 0.6;
|
|
30
|
+
cursor: not-allowed;
|
|
31
|
+
transform: none;
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
&-slider {
|
|
28
35
|
position: absolute;
|
|
29
36
|
left: 3px;
|
|
@@ -54,5 +61,17 @@
|
|
|
54
61
|
font-size: font-size('base');
|
|
55
62
|
transform: rotate(16deg);
|
|
56
63
|
}
|
|
64
|
+
|
|
65
|
+
// Both icons in the markup, for an inline SVG the script cannot swap by class
|
|
66
|
+
&-sun,
|
|
67
|
+
&.mw-active &-moon,
|
|
68
|
+
&.active &-moon {
|
|
69
|
+
display: none;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&.mw-active &-sun,
|
|
73
|
+
&.active &-sun {
|
|
74
|
+
display: block;
|
|
75
|
+
}
|
|
57
76
|
}
|
|
58
77
|
}
|
|
@@ -38,11 +38,10 @@
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// The reserve only exists while an action bar holds the foot of the screen
|
|
41
|
-
&-bottom-right
|
|
41
|
+
&-bottom-right,
|
|
42
|
+
&-bottom-center {
|
|
42
43
|
bottom: calc(#{spacing('5')} + var(--mw-action-bar-reserve, 0px));
|
|
43
|
-
right: spacing('5');
|
|
44
44
|
top: auto;
|
|
45
|
-
left: auto;
|
|
46
45
|
max-height: calc(
|
|
47
46
|
100dvh - #{2 * spacing('5')} - var(--mw-action-bar-reserve, 0px)
|
|
48
47
|
);
|
|
@@ -53,6 +52,17 @@
|
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
54
|
|
|
55
|
+
&-bottom-right {
|
|
56
|
+
right: spacing('5');
|
|
57
|
+
left: auto;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&-bottom-center {
|
|
61
|
+
left: 50%;
|
|
62
|
+
right: auto;
|
|
63
|
+
transform: translateX(-50%);
|
|
64
|
+
}
|
|
65
|
+
|
|
56
66
|
// On phones the stack spans the full width at the top
|
|
57
67
|
@include media-down('sm') {
|
|
58
68
|
left: spacing('5');
|
|
@@ -60,12 +70,18 @@
|
|
|
60
70
|
width: auto;
|
|
61
71
|
transform: none;
|
|
62
72
|
|
|
63
|
-
&-bottom-right
|
|
73
|
+
&-bottom-right,
|
|
74
|
+
&-bottom-center {
|
|
64
75
|
top: auto;
|
|
65
76
|
}
|
|
66
77
|
}
|
|
67
78
|
}
|
|
68
79
|
|
|
80
|
+
// On the wash of its own tone the icon nearly vanishes - the ink does not
|
|
81
|
+
.mw-toast-stack > .mw-alert .mw-alert-icon {
|
|
82
|
+
color: var(--mw-text-color);
|
|
83
|
+
}
|
|
84
|
+
|
|
69
85
|
@keyframes mw-toast-in {
|
|
70
86
|
from {
|
|
71
87
|
opacity: 0;
|
|
@@ -46,6 +46,27 @@
|
|
|
46
46
|
min-height: var(--mw-control-height-lg);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
// A box that looks like the field and holds tags plus the bare input adding them
|
|
50
|
+
&-tags {
|
|
51
|
+
cursor: text;
|
|
52
|
+
@include field-focus('focus-within');
|
|
53
|
+
|
|
54
|
+
> .mw-tags {
|
|
55
|
+
align-items: center;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
input {
|
|
59
|
+
flex: 1 1 8rem;
|
|
60
|
+
min-width: 6rem;
|
|
61
|
+
padding: spacing('1');
|
|
62
|
+
border: 0;
|
|
63
|
+
outline: 0;
|
|
64
|
+
background: transparent;
|
|
65
|
+
color: inherit;
|
|
66
|
+
font: inherit;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
49
70
|
// Numeric input for money and other figures - the entry counterpart to the
|
|
50
71
|
// `mw-text-numeric` utility, so a value looks the same while being typed and
|
|
51
72
|
// once it is rendered into a table.
|
|
@@ -516,9 +516,11 @@
|
|
|
516
516
|
@include tappable;
|
|
517
517
|
@include focus-ring-inset;
|
|
518
518
|
|
|
519
|
-
// A pill by padding: an icon font's own display cannot push the glyph aside
|
|
519
|
+
// A pill by padding: an icon font's own display cannot push the glyph aside.
|
|
520
|
+
// `.mw-icon` for a wrapper around the SVG, such as a component's host.
|
|
520
521
|
> i,
|
|
521
|
-
> svg
|
|
522
|
+
> svg,
|
|
523
|
+
> .mw-icon {
|
|
522
524
|
padding: 0.35rem 1.1rem;
|
|
523
525
|
border-radius: radius-sharp() radius('lg') radius-sharp() radius('lg');
|
|
524
526
|
font-size: font-size('md');
|
|
@@ -556,7 +558,7 @@
|
|
|
556
558
|
&[aria-current='page'] {
|
|
557
559
|
color: var(--mw-primary-text-color);
|
|
558
560
|
|
|
559
|
-
> :is(i, svg) {
|
|
561
|
+
> :is(i, svg, .mw-icon) {
|
|
560
562
|
background: var(--mw-primary-background);
|
|
561
563
|
}
|
|
562
564
|
}
|
|
@@ -564,7 +566,7 @@
|
|
|
564
566
|
@include active {
|
|
565
567
|
color: var(--mw-primary-text-color);
|
|
566
568
|
|
|
567
|
-
> :is(i, svg) {
|
|
569
|
+
> :is(i, svg, .mw-icon) {
|
|
568
570
|
background: var(--mw-primary-background);
|
|
569
571
|
}
|
|
570
572
|
}
|
|
@@ -502,13 +502,12 @@ $_control-size: 40px;
|
|
|
502
502
|
}
|
|
503
503
|
}
|
|
504
504
|
|
|
505
|
-
//
|
|
506
|
-
|
|
507
|
-
.mw-
|
|
505
|
+
// The profile button and the round icon control beside it share one silhouette
|
|
506
|
+
.mw-profile-btn,
|
|
507
|
+
.mw-header-btn {
|
|
508
508
|
display: inline-flex;
|
|
509
509
|
align-items: center;
|
|
510
510
|
justify-content: center;
|
|
511
|
-
gap: spacing('3');
|
|
512
511
|
height: $_control-size;
|
|
513
512
|
width: $_control-size;
|
|
514
513
|
padding: spacing('0');
|
|
@@ -519,23 +518,12 @@ $_control-size: 40px;
|
|
|
519
518
|
cursor: pointer;
|
|
520
519
|
transition: var(--mw-transition);
|
|
521
520
|
flex-shrink: 0;
|
|
522
|
-
max-width: 220px;
|
|
523
521
|
|
|
524
522
|
@include tappable;
|
|
525
|
-
@include touch-floor;
|
|
526
523
|
|
|
527
|
-
//
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
box-shadow: none;
|
|
531
|
-
border-width: 0;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
&-name {
|
|
535
|
-
font-size: font-size('sm');
|
|
536
|
-
font-weight: font-weight('medium');
|
|
537
|
-
line-height: 1.2;
|
|
538
|
-
@include truncate;
|
|
524
|
+
// Round at the grown height too, not an upright oval
|
|
525
|
+
@include touch-floor {
|
|
526
|
+
min-width: 2.75rem;
|
|
539
527
|
}
|
|
540
528
|
|
|
541
529
|
&:hover:not(:disabled) {
|
|
@@ -549,6 +537,36 @@ $_control-size: 40px;
|
|
|
549
537
|
opacity: 0.6;
|
|
550
538
|
cursor: not-allowed;
|
|
551
539
|
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.mw-header-btn {
|
|
543
|
+
font-size: font-size('md');
|
|
544
|
+
|
|
545
|
+
> svg {
|
|
546
|
+
width: 1em;
|
|
547
|
+
height: 1em;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// Profile button - a round avatar until there is room for the signed-in name
|
|
552
|
+
// beside it
|
|
553
|
+
.mw-profile-btn {
|
|
554
|
+
gap: spacing('3');
|
|
555
|
+
max-width: 220px;
|
|
556
|
+
|
|
557
|
+
// The avatar brings spacing of its own that would break the pill shape
|
|
558
|
+
.mw-avatar {
|
|
559
|
+
margin: spacing('0');
|
|
560
|
+
box-shadow: none;
|
|
561
|
+
border-width: 0;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
&-name {
|
|
565
|
+
font-size: font-size('sm');
|
|
566
|
+
font-weight: font-weight('medium');
|
|
567
|
+
line-height: 1.2;
|
|
568
|
+
@include truncate;
|
|
569
|
+
}
|
|
552
570
|
|
|
553
571
|
> i,
|
|
554
572
|
> svg,
|
|
@@ -42,6 +42,80 @@
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
// Fields are built full width - here they share a row, under the title until there is room
|
|
46
|
+
&-filters {
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-wrap: wrap;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: spacing('3');
|
|
51
|
+
order: 1;
|
|
52
|
+
flex: 1 1 100%;
|
|
53
|
+
|
|
54
|
+
.mw-input {
|
|
55
|
+
flex: 1 1 7rem;
|
|
56
|
+
width: auto;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.mw-select {
|
|
60
|
+
flex: 0 1 auto;
|
|
61
|
+
width: auto;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.mw-segmented {
|
|
65
|
+
flex: 1 0 100%;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@include media-up('sm') {
|
|
69
|
+
.mw-segmented {
|
|
70
|
+
flex: 0 1 auto;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@include media-up('lg') {
|
|
75
|
+
order: 0;
|
|
76
|
+
flex: 0 1 auto;
|
|
77
|
+
margin-left: auto;
|
|
78
|
+
|
|
79
|
+
.mw-input {
|
|
80
|
+
flex: none;
|
|
81
|
+
width: 14rem;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// For an app screen, where every line of header costs list rows
|
|
87
|
+
&-compact {
|
|
88
|
+
margin-bottom: spacing('4');
|
|
89
|
+
padding-bottom: spacing('3');
|
|
90
|
+
|
|
91
|
+
h1,
|
|
92
|
+
h2,
|
|
93
|
+
h3 {
|
|
94
|
+
font-size: font-size('md');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@include media-up('sm') {
|
|
98
|
+
margin-bottom: spacing('6');
|
|
99
|
+
padding-bottom: spacing('4');
|
|
100
|
+
|
|
101
|
+
h1,
|
|
102
|
+
h2,
|
|
103
|
+
h3 {
|
|
104
|
+
font-size: font-size('lg');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Opaque, or rows shine through; not on a phone, where it would take a third of the screen
|
|
110
|
+
&-sticky {
|
|
111
|
+
@include media-up('sm') {
|
|
112
|
+
position: sticky;
|
|
113
|
+
top: var(--mw-header-height);
|
|
114
|
+
z-index: z-index('card');
|
|
115
|
+
background: var(--mw-page-background);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
45
119
|
&-plain {
|
|
46
120
|
padding-bottom: spacing('0');
|
|
47
121
|
border-bottom: none;
|
|
@@ -91,6 +91,11 @@
|
|
|
91
91
|
overflow: hidden;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
// A field sized by its content in a row of controls - fields fill their column
|
|
95
|
+
.mw-w-auto {
|
|
96
|
+
width: auto;
|
|
97
|
+
}
|
|
98
|
+
|
|
94
99
|
// Snap a horizontal strip so it comes to rest on an item instead of halfway
|
|
95
100
|
// between two - a row of cards swiped through on a phone
|
|
96
101
|
.mw-snap-x {
|
|
@@ -130,6 +130,11 @@
|
|
|
130
130
|
@include hit-area(5px);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
// Already positioned in its ribbon, which is all the hit area needs
|
|
134
|
+
.mw-announcement > .mw-announcement-close {
|
|
135
|
+
position: absolute;
|
|
136
|
+
}
|
|
137
|
+
|
|
133
138
|
// Edit and delete on a ticket. The 32px box stays - a 44px one would push
|
|
134
139
|
// the assignee off the card footer - and the row carries the gap the two
|
|
135
140
|
// grown hit areas need, or they overlap and a tap meant for edit deletes.
|