Skip to content

Commit 21222c5

Browse files
committed
refactor(material/menu): simplify structural styles (#29267)
Simplifies the menu structural styles to make them more maintainable. (cherry picked from commit a62a7ce)
1 parent 7f896f9 commit 21222c5

File tree

1 file changed

+44
-35
lines changed

1 file changed

+44
-35
lines changed

src/material/menu/menu.scss

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
1-
@use 'sass:map';
21
@use '@angular/cdk';
3-
@use '@material/list/evolution-mixins' as mdc-list-mixins;
4-
@use '@material/list/evolution-variables' as mdc-list-variables;
5-
@use '@material/typography/typography' as mdc-typography;
62
@use '../core/tokens/m2/mat/menu' as tokens-mat-menu;
73
@use '../core/tokens/token-utils';
8-
@use '../core/mdc-helpers/mdc-helpers';
94
@use '../core/style/menu-common';
105
@use '../core/style/button-common';
6+
@use '../core/style/vendor-prefixes';
117

128
// Prevent rendering mat-menu as it can affect the flex layout.
139
mat-menu {
1410
display: none;
1511
}
1612

1713
.mat-mdc-menu-content {
18-
@include mdc-list-mixins.list-base($query: structure);
14+
margin: 0;
15+
padding: 8px 0;
16+
outline: 0;
1917

2018
&,
2119
.mat-mdc-menu-item .mat-mdc-menu-item-text {
22-
@include mdc-typography.smooth-font();
20+
@include vendor-prefixes.smooth-font();
2321
flex: 1;
2422
white-space: normal;
2523

@@ -78,23 +76,38 @@ mat-menu {
7876
}
7977

8078
.mat-mdc-menu-item {
81-
@include mdc-helpers.disable-mdc-fallback-declarations {
82-
@include mdc-list-mixins.item-base;
83-
@include token-utils.use-tokens(tokens-mat-menu.$prefix, tokens-mat-menu.get-token-slots()) {
84-
@include mdc-list-mixins.item-spacing(
85-
var(#{token-utils.get-token-variable(item-leading-spacing)}),
86-
var(#{token-utils.get-token-variable(item-trailing-spacing)}),
87-
$query: mdc-helpers.$mdc-base-styles-query
88-
);
89-
90-
// stylelint-disable-next-line selector-class-pattern
91-
&:has(.material-icons, mat-icon, [matButtonIcon]) {
92-
@include mdc-list-mixins.item-spacing(
93-
var(#{token-utils.get-token-variable(item-with-icon-leading-spacing)}),
94-
var(#{token-utils.get-token-variable(item-with-icon-trailing-spacing)}),
95-
$query: mdc-helpers.$mdc-base-styles-query
96-
);
97-
}
79+
display: flex;
80+
position: relative;
81+
align-items: center;
82+
justify-content: flex-start;
83+
overflow: hidden;
84+
padding: 0;
85+
86+
@include token-utils.use-tokens(tokens-mat-menu.$prefix, tokens-mat-menu.get-token-slots()) {
87+
$icons-selector: '.material-icons, mat-icon, [matButtonIcon]';
88+
$leading-padding: var(#{token-utils.get-token-variable(item-leading-spacing)});
89+
$trailing-padding: var(#{token-utils.get-token-variable(item-trailing-spacing)});
90+
$with-icon-leading-padding:
91+
var(#{token-utils.get-token-variable(item-with-icon-leading-spacing)});
92+
$with-icon-trailing-padding:
93+
var(#{token-utils.get-token-variable(item-with-icon-trailing-spacing)});
94+
95+
padding-left: $leading-padding;
96+
padding-right: $trailing-padding;
97+
98+
[dir='rtl'] & {
99+
padding-right: $leading-padding;
100+
padding-left: $trailing-padding;
101+
}
102+
103+
&:has(#{$icons-selector}) {
104+
padding-left: $with-icon-leading-padding;
105+
padding-right: $with-icon-trailing-padding;
106+
}
107+
108+
[dir='rtl'] &:has(#{$icons-selector}) {
109+
padding-right: $with-icon-leading-padding;
110+
padding-left: $with-icon-trailing-padding;
98111
}
99112
}
100113

@@ -110,13 +123,7 @@ mat-menu {
110123
background: none;
111124
text-decoration: none;
112125
margin: 0; // Resolves an issue where buttons have an extra 2px margin on Safari.
113-
align-items: center;
114-
115-
// Set the `min-height` here ourselves, instead of going through
116-
// the `mdc-list-one-line-item-density` mixin, because it sets a `height`
117-
// which doesn't work well with multi-line items.
118-
$height-config: map.get(mdc-list-variables.$one-line-item-density-config, height);
119-
min-height: map.get($height-config, default);
126+
min-height: 48px;
120127

121128
@include token-utils.use-tokens(tokens-mat-menu.$prefix, tokens-mat-menu.get-token-slots()) {
122129
// The class selector isn't specific enough to overide the link pseudo selectors so we need
@@ -134,10 +141,7 @@ mat-menu {
134141

135142
&[disabled] {
136143
cursor: default;
137-
138-
// This is the same as `mdc-list-mixins.list-disabled-opacity` which
139-
// we can't use directly, because it comes with some selectors.
140-
opacity: mdc-list-variables.$content-disabled-opacity;
144+
opacity: 0.38;
141145

142146
// The browser prevents clicks on disabled buttons from propagating which prevents the menu
143147
// from closing, but clicks on child nodes still propagate which is inconsistent (see #16694).
@@ -154,6 +158,11 @@ mat-menu {
154158
}
155159
}
156160

161+
// Inherited from MDC and necessary for some internal tests.
162+
&:focus {
163+
outline: 0;
164+
}
165+
157166
.mat-icon {
158167
flex-shrink: 0;
159168
@include token-utils.use-tokens(tokens-mat-menu.$prefix, tokens-mat-menu.get-token-slots()) {

0 commit comments

Comments
 (0)