You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

254 lines
6.5 KiB

// This contains all of the styles for the badge
// rather than just the color/theme because of
// no style sheet support for directives.
@use 'sass:color';
@use 'sass:map';
@use 'sass:meta';
@use '../core/theming/theming';
@use '../core/typography/typography';
@use '../core/typography/typography-utils';
@use '../core/style/private';
@use '../../cdk/a11y';
$font-size: 12px;
$font-weight: 600;
$default-size: 22px !default;
$small-size: $default-size - 6;
$large-size: $default-size + 6;
$_badge-structure-emitted: false !default;
// Mixin for building offset given different sizes
@mixin _badge-size($size) {
// This mixin isn't used in the context of a theme so we can disable the ampersand check.
// stylelint-disable material/no-ampersand-beyond-selector-start
.mat-badge-content {
width: $size;
height: $size;
line-height: $size;
}
&.mat-badge-above {
.mat-badge-content {
top: private.private-div(-$size, 2);
}
}
&.mat-badge-below {
.mat-badge-content {
bottom: private.private-div(-$size, 2);
}
}
&.mat-badge-before {
.mat-badge-content {
left: -$size;
}
}
[dir='rtl'] &.mat-badge-before {
.mat-badge-content {
left: auto;
right: -$size;
}
}
&.mat-badge-after {
.mat-badge-content {
right: -$size;
}
}
[dir='rtl'] &.mat-badge-after {
.mat-badge-content {
right: auto;
left: -$size;
}
}
&.mat-badge-overlap {
&.mat-badge-before {
.mat-badge-content {
left: private.private-div(-$size, 2);
}
}
[dir='rtl'] &.mat-badge-before {
.mat-badge-content {
left: auto;
right: private.private-div(-$size, 2);
}
}
&.mat-badge-after {
.mat-badge-content {
right: private.private-div(-$size, 2);
}
}
[dir='rtl'] &.mat-badge-after {
.mat-badge-content {
right: auto;
left: private.private-div(-$size, 2);
}
}
}
// stylelint-enable
}
// Structural styles for the badge. They have to be included as a part of the theme,
// because the badge is a directive and we have no other way of attaching styles to it.
@mixin _badge-structure {
.mat-badge {
position: relative;
}
.mat-badge-hidden {
.mat-badge-content {
display: none;
}
}
.mat-badge-content {
position: absolute;
text-align: center;
display: inline-block;
border-radius: 50%;
transition: transform 200ms ease-in-out;
transform: scale(0.6);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
pointer-events: none;
}
.ng-animate-disabled .mat-badge-content,
.mat-badge-content._mat-animation-noopable {
transition: none;
}
// The active class is added after the element is added
// so it can animate scale to default
.mat-badge-content.mat-badge-active {
// Scale to `none` instead of `1` to avoid blurry text in some browsers.
transform: none;
}
.mat-badge-small {
@include _badge-size($small-size);
}
.mat-badge-medium {
@include _badge-size($default-size);
}
.mat-badge-large {
@include _badge-size($large-size);
}
}
@mixin color($config-or-theme) {
$config: theming.get-color-config($config-or-theme);
$accent: map.get($config, accent);
$warn: map.get($config, warn);
$primary: map.get($config, primary);
$background: map.get($config, background);
$foreground: map.get($config, foreground);
.mat-badge-content {
color: theming.get-color-from-palette($primary, default-contrast);
background: theming.get-color-from-palette($primary);
@include a11y.high-contrast(active, off) {
outline: solid 1px;
border-radius: 0;
}
}
.mat-badge-accent {
.mat-badge-content {
background: theming.get-color-from-palette($accent);
color: theming.get-color-from-palette($accent, default-contrast);
}
}
.mat-badge-warn {
.mat-badge-content {
color: theming.get-color-from-palette($warn, default-contrast);
background: theming.get-color-from-palette($warn);
}
}
.mat-badge-disabled {
.mat-badge-content {
$app-background: theming.get-color-from-palette($background, 'background');
$badge-color: theming.get-color-from-palette($foreground, disabled-button);
// The disabled color usually has some kind of opacity, but because the badge is overlayed
// on top of something else, it won't look good if it's opaque. If it is a color *type*,
// we convert it into a solid color by taking the opacity from the rgba value and using
// the value to determine the percentage of the background to put into foreground when
// mixing the colors together.
@if (meta.type-of($badge-color) == color and meta.type-of($app-background) == color) {
$badge-opacity: opacity($badge-color);
background: color.mix($app-background, rgba($badge-color, 1), (1 - $badge-opacity) * 100%);
}
@else {
background: $badge-color;
}
color: theming.get-color-from-palette($foreground, disabled-text);
}
}
}
@mixin typography($config-or-theme) {
$config: typography.private-typography-to-2014-config(
theming.get-typography-config($config-or-theme));
.mat-badge-content {
font-weight: $font-weight;
font-size: $font-size;
font-family: typography-utils.font-family($config);
}
.mat-badge-small .mat-badge-content {
// Set the font size to 75% of the original.
font-size: $font-size * 0.75;
}
.mat-badge-large .mat-badge-content {
font-size: $font-size * 2;
}
}
@mixin _density($config-or-theme) {}
@mixin theme($theme-or-color-config) {
$theme: theming.private-legacy-get-theme($theme-or-color-config);
@include theming.private-check-duplicate-theme-styles($theme, 'mat-badge') {
$color: theming.get-color-config($theme);
$density: theming.get-density-config($theme);
$typography: theming.get-typography-config($theme);
// Try to reduce the number of times that the structural styles are emitted.
@if not $_badge-structure-emitted {
@include _badge-structure;
// Only flip the flag if the mixin is included at the top level. Otherwise the first
// inclusion might be inside of a theme class which will exclude the structural styles
// from all other themes.
@if not & {
$_badge-structure-emitted: true !global;
}
}
@if $color != null {
@include color($color);
}
@if $density != null {
@include _density($density);
}
@if $typography != null {
@include typography($typography);
}
}
}