1
+ // This contains all of the styles for the badge
2
+ // rather than just the color/theme because of
3
+ // no style sheet support for directives.
1
4
@use ' sass:color' ;
2
5
@use ' sass:map' ;
6
+ @use ' sass:meta' ;
3
7
@use ' sass:math' ;
4
8
@use ' @angular/cdk' ;
5
9
6
10
@use ' ../core/theming/theming' ;
7
11
@use ' ../core/typography/typography' ;
8
- @use ' ../core/tokens/m2/mat/badge' as tokens-mat-badge ;
9
- @use ' ../core/tokens/token-utils' ;
10
- @use ' ../core/style/sass-utils' ;
12
+ @use ' ../core/typography/typography-utils' ;
11
13
12
- // TODO(crisbeto): some of these variables aren't used anymore and should be deleted.
13
14
$font-size : 12px ;
14
15
$font-weight : 600 ;
15
16
$default-size : 22px !default ;
16
17
$small-size : $default-size - 6 ;
17
18
$large-size : $default-size + 6 ;
18
19
$_badge-structure-emitted : false !default ;
19
20
20
- // Internally there are some builds that throw an error if they can't figure out the values
21
- // of CSS variables during compliation. This flag temporarily enables fallbacks for these builds.
22
- // Eventually we should clean them up.
23
- $_emit-fallback-vars : true;
24
-
25
21
// Mixin for building offset given different sizes
26
- @mixin _badge-size ($size , $font-size-token ) {
22
+ @mixin _badge-size ($size ) {
27
23
// This mixin isn't used in the context of a theme so we can disable the ampersand check.
28
24
// stylelint-disable material/no-ampersand-beyond-selector-start
29
25
.mat-badge-content {
30
26
width : $size ;
31
27
height : $size ;
32
28
line-height : $size ;
33
-
34
- @if ($font-size-token ) {
35
- @include token-utils .use-tokens (tokens-mat-badge .$prefix ,
36
- tokens-mat-badge .get-token-slots ()) {
37
- @include token-utils .create-token-slot (font-size , $font-size-token , $_emit-fallback-vars );
38
- }
39
- }
40
29
}
41
30
42
- & .mat-badge-above .mat-badge-content {
43
- top : math .div (- $size , 2 );
31
+ & .mat-badge-above {
32
+ .mat-badge-content {
33
+ top : math .div (- $size , 2 );
34
+ }
44
35
}
45
36
46
- & .mat-badge-below .mat-badge-content {
47
- bottom : math .div (- $size , 2 );
37
+ & .mat-badge-below {
38
+ .mat-badge-content {
39
+ bottom : math .div (- $size , 2 );
40
+ }
48
41
}
49
42
50
- & .mat-badge-before .mat-badge-content {
51
- left : - $size ;
43
+ & .mat-badge-before {
44
+ .mat-badge-content {
45
+ left : - $size ;
46
+ }
52
47
}
53
48
54
- [dir = ' rtl' ] & .mat-badge-before .mat-badge-content {
55
- left : auto ;
56
- right : - $size ;
49
+ [dir = ' rtl' ] & .mat-badge-before {
50
+ .mat-badge-content {
51
+ left : auto ;
52
+ right : - $size ;
53
+ }
57
54
}
58
55
59
- & .mat-badge-after .mat-badge-content {
60
- right : - $size ;
56
+ & .mat-badge-after {
57
+ .mat-badge-content {
58
+ right : - $size ;
59
+ }
61
60
}
62
61
63
- [dir = ' rtl' ] & .mat-badge-after .mat-badge-content {
64
- right : auto ;
65
- left : - $size ;
62
+ [dir = ' rtl' ] & .mat-badge-after {
63
+ .mat-badge-content {
64
+ right : auto ;
65
+ left : - $size ;
66
+ }
66
67
}
67
68
68
69
& .mat-badge-overlap {
69
- & .mat-badge-before .mat-badge-content {
70
- left : math .div (- $size , 2 );
70
+ & .mat-badge-before {
71
+ .mat-badge-content {
72
+ left : math .div (- $size , 2 );
73
+ }
71
74
}
72
75
73
- [dir = ' rtl' ] & .mat-badge-before .mat-badge-content {
74
- left : auto ;
75
- right : math .div (- $size , 2 );
76
+ [dir = ' rtl' ] & .mat-badge-before {
77
+ .mat-badge-content {
78
+ left : auto ;
79
+ right : math .div (- $size , 2 );
80
+ }
76
81
}
77
82
78
- & .mat-badge-after .mat-badge-content {
79
- right : math .div (- $size , 2 );
83
+ & .mat-badge-after {
84
+ .mat-badge-content {
85
+ right : math .div (- $size , 2 );
86
+ }
80
87
}
81
88
82
- [dir = ' rtl' ] & .mat-badge-after .mat-badge-content {
83
- right : auto ;
84
- left : math .div (- $size , 2 );
89
+ [dir = ' rtl' ] & .mat-badge-after {
90
+ .mat-badge-content {
91
+ right : auto ;
92
+ left : math .div (- $size , 2 );
93
+ }
85
94
}
86
95
}
87
96
// stylelint-enable
@@ -92,13 +101,19 @@ $_emit-fallback-vars: true;
92
101
@mixin _badge-structure {
93
102
.mat-badge {
94
103
position : relative ;
104
+ }
95
105
96
- // The badge should make sure its host is overflow visible so that the badge content
97
- // can be rendered outside of the element. Some components such as <mat-icon> explicitly
98
- // style `overflow: hidden` so this requires extra specificity so that it does not
99
- // depend on style load order.
100
- & .mat-badge {
101
- overflow : visible ;
106
+ // The badge should make sure its host is overflow visible so that the badge content
107
+ // can be rendered outside of the element. Some components such as <mat-icon> explicitly
108
+ // style `overflow: hidden` so this requires extra specificity so that it does not
109
+ // depend on style load order.
110
+ .mat-badge.mat-badge {
111
+ overflow : visible ;
112
+ }
113
+
114
+ .mat-badge-hidden {
115
+ .mat-badge-content {
116
+ display : none ;
102
117
}
103
118
}
104
119
@@ -113,30 +128,6 @@ $_emit-fallback-vars: true;
113
128
white-space : nowrap ;
114
129
text-overflow : ellipsis ;
115
130
pointer-events : none ;
116
-
117
- @include token-utils .use-tokens (tokens-mat-badge .$prefix , tokens-mat-badge .get-token-slots ()) {
118
- @include token-utils .create-token-slot (background-color , background-color );
119
- @include token-utils .create-token-slot (color , text- color);
120
- @include token-utils .create-token-slot (font-family , text- font, $_emit-fallback-vars );
121
- @include token-utils .create-token-slot (font-size , text- size, $_emit-fallback-vars );
122
- @include token-utils .create-token-slot (font-weight , text- weight, $_emit-fallback-vars );
123
- }
124
-
125
- @include cdk .high-contrast (active , off) {
126
- outline : solid 1px ;
127
- border-radius : 0 ;
128
- }
129
- }
130
-
131
- .mat-badge-disabled .mat-badge-content {
132
- @include token-utils .use-tokens (tokens-mat-badge .$prefix , tokens-mat-badge .get-token-slots ()) {
133
- @include token-utils .create-token-slot (background-color , disabled- state- background- color);
134
- @include token-utils .create-token-slot (color , disabled- state- text- color);
135
- }
136
- }
137
-
138
- .mat-badge-hidden .mat-badge-content {
139
- display : none ;
140
131
}
141
132
142
133
.ng-animate-disabled .mat-badge-content ,
@@ -152,46 +143,89 @@ $_emit-fallback-vars: true;
152
143
}
153
144
154
145
.mat-badge-small {
155
- @include _badge-size ($small-size , small - size - text - size );
146
+ @include _badge-size ($small-size );
156
147
}
157
148
158
149
.mat-badge-medium {
159
- @include _badge-size ($default-size , null );
150
+ @include _badge-size ($default-size );
160
151
}
161
152
162
153
.mat-badge-large {
163
- @include _badge-size ($large-size , large - size - text - size );
154
+ @include _badge-size ($large-size );
164
155
}
165
156
}
166
157
167
158
@mixin color ($config-or-theme ) {
168
159
$config : theming .get-color-config ($config-or-theme );
169
160
$accent : map .get ($config , accent );
170
161
$warn : map .get ($config , warn );
162
+ $primary : map .get ($config , primary );
163
+ $background : map .get ($config , background );
164
+ $foreground : map .get ($config , foreground );
171
165
172
- @include sass-utils .current-selector-or-root () {
173
- @include token-utils .create-token-values (tokens-mat-badge .$prefix ,
174
- tokens-mat-badge .get-color-tokens ($config ));
166
+ .mat-badge-content {
167
+ color : theming .get-color-from-palette ($primary , default-contrast );
168
+ background : theming .get-color-from-palette ($primary );
169
+
170
+ @include cdk .high-contrast (active , off) {
171
+ outline : solid 1px ;
172
+ border-radius : 0 ;
173
+ }
175
174
}
176
175
177
176
.mat-badge-accent {
178
- @include token-utils .create-token-values (tokens-mat-badge .$prefix ,
179
- tokens-mat-badge .private-get-color-palette-color-tokens ($accent ));
177
+ .mat-badge-content {
178
+ background : theming .get-color-from-palette ($accent );
179
+ color : theming .get-color-from-palette ($accent , default-contrast );
180
+ }
180
181
}
181
182
182
183
.mat-badge-warn {
183
- @include token-utils .create-token-values (tokens-mat-badge .$prefix ,
184
- tokens-mat-badge .private-get-color-palette-color-tokens ($warn ));
184
+ .mat-badge-content {
185
+ color : theming .get-color-from-palette ($warn , default-contrast );
186
+ background : theming .get-color-from-palette ($warn );
187
+ }
188
+ }
189
+
190
+ .mat-badge-disabled {
191
+ .mat-badge-content {
192
+ $app-background : theming .get-color-from-palette ($background , ' background' );
193
+ $badge-color : theming .get-color-from-palette ($foreground , disabled-button );
194
+
195
+ // The disabled color usually has some kind of opacity, but because the badge is overlayed
196
+ // on top of something else, it won't look good if it's opaque. If it is a color *type*,
197
+ // we convert it into a solid color by taking the opacity from the rgba value and using
198
+ // the value to determine the percentage of the background to put into foreground when
199
+ // mixing the colors together.
200
+ @if (meta .type-of ($badge-color ) == color and meta .type-of ($app-background ) == color ) {
201
+ $badge-opacity : opacity ($badge-color );
202
+ background : color .mix ($app-background , rgba ($badge-color , 1 ), (1 - $badge-opacity ) * 100% );
203
+ }
204
+ @else {
205
+ background : $badge-color ;
206
+ }
207
+
208
+ color : theming .get-color-from-palette ($foreground , disabled-text );
209
+ }
185
210
}
186
211
}
187
212
188
213
@mixin typography ($config-or-theme ) {
189
214
$config : typography .private-typography-to-2014-config (
190
215
theming .get-typography-config ($config-or-theme ));
216
+ .mat-badge-content {
217
+ font-weight : $font-weight ;
218
+ font-size : $font-size ;
219
+ font-family : typography-utils .font-family ($config );
220
+ }
221
+
222
+ .mat-badge-small .mat-badge-content {
223
+ // Set the font size to 75% of the original.
224
+ font-size : $font-size * 0.75 ;
225
+ }
191
226
192
- @include sass-utils .current-selector-or-root () {
193
- @include token-utils .create-token-values (tokens-mat-badge .$prefix ,
194
- tokens-mat-badge .get-typography-tokens ($config ));
227
+ .mat-badge-large .mat-badge-content {
228
+ font-size : $font-size * 2 ;
195
229
}
196
230
}
197
231
0 commit comments