Skip to content

Commit 202f058

Browse files
authored
refactor(material/tabs): simplify structural styles (angular#29314)
Simplifies the structural styles for the tabs to make them smaller and easier to maintain. I also had to rename the prefix for the `tab` tokens, because MDC was doing something weird where it was renaming the tokens to be `mdc-secondary-navigation-tab` instead of `tab`.
1 parent dc56ba6 commit 202f058

File tree

8 files changed

+134
-75
lines changed

8 files changed

+134
-75
lines changed

src/material/core/tokens/_density.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ $_density-tokens: (
6060
(mdc, slider): (),
6161
(mdc, snackbar): (),
6262
(mdc, switch): (),
63-
(mdc, tab): (
63+
(mdc, secondary-navigation-tab): (
6464
container-height: (48px, 44px, 40px, 36px, 32px)
6565
),
6666
(mdc, tab-indicator): (),

src/material/core/tokens/m2/_index.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
@use './mdc/slider' as tokens-mdc-slider;
6868
@use './mdc/snack-bar' as tokens-mdc-snack-bar;
6969
@use './mdc/switch' as tokens-mdc-switch;
70-
@use './mdc/tab' as tokens-mdc-tab;
70+
@use './mdc/secondary-navigation-tab' as tokens-mdc-secondary-navigation-tab;
7171
@use './mdc/tab-indicator' as tokens-mdc-tab-indicator;
7272
@use '../../theming/inspection';
7373

@@ -179,7 +179,7 @@
179179
_get-tokens-for-module($theme, tokens-mdc-snack-bar),
180180
_get-tokens-for-module($theme, tokens-mdc-switch),
181181
_get-tokens-for-module($theme, tokens-mdc-tab-indicator),
182-
_get-tokens-for-module($theme, tokens-mdc-tab),
182+
_get-tokens-for-module($theme, tokens-mdc-secondary-navigation-tab),
183183
_get-tokens-for-module($theme, tokens-mdc-text-button)
184184
);
185185
}

src/material/core/tokens/m2/mdc/_tab.scss renamed to src/material/core/tokens/m2/mdc/_secondary-navigation-tab.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@use '../../token-utils';
66

77
// The prefix used to generate the fully qualified name for tokens in this file.
8-
$prefix: (mdc, tab);
8+
$prefix: (mdc, secondary-navigation-tab);
99

1010
// Tokens that can't be configured through Angular Material's current theming API,
1111
// but may be in a future version of the theming API.

src/material/core/tokens/m3/_index.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
@use './mdc/slider' as tokens-mdc-slider;
6666
@use './mdc/snack-bar' as tokens-mdc-snack-bar;
6767
@use './mdc/switch' as tokens-mdc-switch;
68-
@use './mdc/tab' as tokens-mdc-tab;
68+
@use './mdc/secondary-navigation-tab' as tokens-mdc-secondary-navigation-tab;
6969
@use './mdc/tab-indicator' as tokens-mdc-tab-indicator;
7070

7171
$_module-names: (
@@ -137,7 +137,7 @@ $_module-names: (
137137
tokens-mdc-slider,
138138
tokens-mdc-snack-bar,
139139
tokens-mdc-switch,
140-
tokens-mdc-tab,
140+
tokens-mdc-secondary-navigation-tab,
141141
tokens-mdc-tab-indicator
142142
);
143143

src/material/core/tokens/m3/mdc/_tab.scss renamed to src/material/core/tokens/m3/mdc/_secondary-navigation-tab.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@use '../../token-utils';
22

33
// The prefix used to generate the fully qualified name for tokens in this file.
4-
$prefix: (mdc, tab);
4+
$prefix: (mdc, secondary-navigation-tab);
55

66
/// Generates the tokens for MDC tab
77
/// @param {Map} $systems The MDC system tokens

src/material/core/tokens/tests/test-validate-tokens.scss

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
@use '@material/radio/radio-theme' as mdc-radio-theme;
1919
@use '@material/switch/switch-theme' as mdc-switch-theme;
2020
@use '@material/tab-indicator/tab-indicator-theme' as mdc-tab-indicator-theme;
21-
@use '@material/tab/tab-theme' as mdc-tab-theme;
2221
@use '@material/snackbar/snackbar-theme' as mdc-snackbar-theme;
2322
@use '@material/slider/slider-theme' as mdc-slider-theme;
2423
@use '@material/chips/chip-theme' as mdc-chips-theme;
@@ -44,7 +43,6 @@
4443
@use '../m2/mdc/radio' as tokens-mdc-radio;
4544
@use '../m2/mdc/switch' as tokens-mdc-switch;
4645
@use '../m2/mdc/tab-indicator' as tokens-mdc-tab-indicator;
47-
@use '../m2/mdc/tab' as tokens-mdc-tab;
4846
@use '../m2/mdc/snack-bar' as tokens-mdc-snack-bar;
4947
@use '../m2/mdc/slider' as tokens-mdc-slider;
5048
@use '../m2/mdc/chip' as tokens-mdc-chip;
@@ -119,11 +117,6 @@
119117
$slots: tokens-mdc-tab-indicator.get-token-slots(),
120118
$reference: mdc-tab-indicator-theme.$light-theme
121119
);
122-
@include validate-slots(
123-
$component: 'm2.mdc.tab',
124-
$slots: tokens-mdc-tab.get-token-slots(),
125-
$reference: mdc-tab-theme.$secondary-light-theme
126-
);
127120
@include validate-slots(
128121
$component: 'm2.mdc.snackbar',
129122
$slots: tokens-mdc-snack-bar.get-token-slots(),

src/material/tabs/_tabs-common.scss

Lines changed: 94 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,86 @@
1-
@use '@material/ripple' as mdc-ripple;
2-
@use '@material/tab' as mdc-tab;
3-
@use '@material/tab-indicator' as mdc-tab-indicator;
4-
@use '@material/tab-indicator/tab-indicator-theme' as mdc-tab-indicator-theme;
5-
@use '@material/tab/tab-theme' as mdc-tab-theme;
6-
@use '@material/theme/custom-properties' as mdc-custom-properties;
7-
@use '../core/mdc-helpers/mdc-helpers';
81
@use '../core/style/vendor-prefixes';
92
@use '../core/tokens/m2/mdc/tab-indicator' as tokens-mdc-tab-indicator;
10-
@use '../core/tokens/m2/mdc/tab' as tokens-mdc-tab;
3+
@use '../core/tokens/m2/mdc/secondary-navigation-tab' as tokens-mdc-secondary-navigation-tab;
114
@use '../core/tokens/m2/mat/tab-header' as tokens-mat-tab-header;
125
@use '../core/tokens/m2/mat/tab-header-with-background' as tokens-mat-tab-header-with-background;
136
@use '../core/tokens/token-utils';
14-
@use 'sass:map';
157

168

179
$mat-tab-animation-duration: 500ms !default;
1810

1911
// Combines the various structural styles we need for the tab group and tab nav bar.
2012
@mixin structural-styles {
21-
@include mdc-custom-properties.configure(
22-
$emit-fallback-values: false,
23-
$emit-fallback-vars: false
24-
) {
25-
@include mdc-tab.static-styles($query: mdc-helpers.$mdc-base-styles-query);
26-
@include mdc-tab-indicator.static-styles($query: mdc-helpers.$mdc-base-styles-query);
13+
.mdc-tab {
14+
min-width: 90px;
15+
padding: 0 24px;
16+
display: flex;
17+
flex: 1 0 auto;
18+
justify-content: center;
19+
box-sizing: border-box;
20+
border: none;
21+
outline: none;
22+
text-align: center;
23+
white-space: nowrap;
24+
cursor: pointer;
25+
z-index: 1;
26+
}
27+
28+
.mdc-tab__content {
29+
display: flex;
30+
align-items: center;
31+
justify-content: center;
32+
height: inherit;
33+
pointer-events: none;
34+
}
35+
36+
.mdc-tab__text-label {
37+
transition: 150ms color linear;
38+
display: inline-block;
39+
line-height: 1;
40+
z-index: 2;
41+
}
42+
43+
.mdc-tab--active .mdc-tab__text-label {
44+
transition-delay: 100ms;
45+
}
46+
47+
._mat-animation-noopable .mdc-tab__text-label {
48+
transition: none;
49+
}
50+
51+
.mdc-tab-indicator {
52+
display: flex;
53+
position: absolute;
54+
top: 0;
55+
left: 0;
56+
justify-content: center;
57+
width: 100%;
58+
height: 100%;
59+
pointer-events: none;
60+
z-index: 1;
61+
}
62+
63+
.mdc-tab-indicator__content {
64+
transition: var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);
65+
transform-origin: left;
66+
opacity: 0;
67+
}
68+
69+
.mdc-tab-indicator__content--underline {
70+
align-self: flex-end;
71+
box-sizing: border-box;
72+
width: 100%;
73+
border-top-style: solid;
74+
}
75+
76+
.mdc-tab-indicator--active .mdc-tab-indicator__content {
77+
opacity: 1;
78+
}
79+
80+
._mat-animation-noopable, .mdc-tab-indicator--no-transition {
81+
.mdc-tab-indicator__content {
82+
transition: none;
83+
}
2784
}
2885

2986
.mat-mdc-tab-ripple {
@@ -37,14 +94,6 @@ $mat-tab-animation-duration: 500ms !default;
3794
}
3895

3996
@mixin tab {
40-
@include mdc-custom-properties.configure(
41-
$emit-fallback-values: false,
42-
$emit-fallback-vars: false
43-
) {
44-
@include mdc-tab-indicator-theme.theme-styles(tokens-mdc-tab-indicator.get-token-slots());
45-
@include mdc-tab-theme.secondary-navigation-tab-theme-styles(tokens-mdc-tab.get-token-slots());
46-
}
47-
4897
-webkit-tap-highlight-color: transparent;
4998
-webkit-font-smoothing: antialiased;
5099
-moz-osx-font-smoothing: grayscale;
@@ -53,13 +102,31 @@ $mat-tab-animation-duration: 500ms !default;
53102
// Tabs might be `button` elements so we have to reset the user agent styling.
54103
background: none;
55104

105+
@include token-utils.use-tokens(
106+
tokens-mdc-secondary-navigation-tab.$prefix,
107+
tokens-mdc-secondary-navigation-tab.get-token-slots()
108+
) {
109+
@include token-utils.create-token-slot(height, container-height);
110+
}
111+
56112
&.mdc-tab {
57113
// MDC's tabs stretch to fit the header by default, whereas stretching on our current ones
58114
// is an opt-in behavior. Also technically we don't need to combine the two classes, but
59115
// we need the extra specificity to avoid issues with CSS insertion order.
60116
flex-grow: 0;
61117
}
62118

119+
.mdc-tab-indicator__content--underline {
120+
@include token-utils.use-tokens(
121+
tokens-mdc-tab-indicator.$prefix,
122+
tokens-mdc-tab-indicator.get-token-slots()
123+
) {
124+
@include token-utils.create-token-slot(border-color, active-indicator-color);
125+
@include token-utils.create-token-slot(border-top-width, active-indicator-height);
126+
@include token-utils.create-token-slot(border-radius, active-indicator-shape);
127+
}
128+
}
129+
63130
@include token-utils.use-tokens(
64131
tokens-mat-tab-header.$prefix,
65132
tokens-mat-tab-header.get-token-slots()
@@ -185,18 +252,18 @@ $mat-tab-animation-duration: 500ms !default;
185252

186253
// We need to handle the hover and focus indication ourselves, because we don't use MDC's ripple.
187254
&:hover .mdc-tab__ripple::before {
188-
opacity: map.get(mdc-ripple.$dark-ink-opacities, hover);
255+
opacity: 0.04;
189256
}
190257

191258
&.cdk-program-focused,
192259
&.cdk-keyboard-focused {
193260
.mdc-tab__ripple::before {
194-
opacity: map.get(mdc-ripple.$dark-ink-opacities, focus);
261+
opacity: 0.12;
195262
}
196263
}
197264

198265
.mat-ripple-element {
199-
opacity: map.get(mdc-ripple.$dark-ink-opacities, press);
266+
opacity: 0.12;
200267

201268
@include token-utils.use-tokens(
202269
tokens-mat-tab-header.$prefix,
@@ -243,7 +310,7 @@ $mat-tab-animation-duration: 500ms !default;
243310
}
244311

245312
.mat-ripple-element {
246-
opacity: map.get(mdc-ripple.$dark-ink-opacities, press);
313+
opacity: 0.12;
247314

248315
@include token-utils.use-tokens(
249316
tokens-mat-tab-header.$prefix,
@@ -309,15 +376,6 @@ $mat-tab-animation-duration: 500ms !default;
309376
transition: none;
310377
}
311378
}
312-
313-
// The `span` is in the selector in order to increase the specificity, ensuring
314-
// that it's always higher than the selector that declares the transition.
315-
._mat-animation-noopable {
316-
span.mdc-tab-indicator__content,
317-
span.mdc-tab__text-label {
318-
transition: none;
319-
}
320-
}
321379
}
322380

323381
// Structural styles for the element that wraps the paginated header items.

src/material/tabs/_tabs-theme.scss

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
@use '@material/tab-indicator/tab-indicator-theme' as mdc-tab-indicator-theme;
2-
@use '@material/tab/tab-theme' as mdc-tab-theme;
31
@use '../core/style/sass-utils';
4-
@use '../core/tokens/m2/mdc/tab' as tokens-mdc-tab;
2+
@use '../core/tokens/m2/mdc/secondary-navigation-tab' as tokens-mdc-secondary-navigation-tab;
53
@use '../core/tokens/m2/mdc/tab-indicator' as tokens-mdc-tab-indicator;
64
@use '../core/tokens/m2/mat/tab-header' as tokens-mat-tab-header;
75
@use '../core/tokens/m2/mat/tab-header-with-background' as tokens-mat-tab-header-with-background;
@@ -20,14 +18,16 @@
2018
}
2119
@else {
2220
@include sass-utils.current-selector-or-root() {
23-
@include mdc-tab-indicator-theme.theme(tokens-mdc-tab-indicator.get-unthemable-tokens());
24-
@include mdc-tab-theme.secondary-navigation-tab-theme(tokens-mdc-tab.get-unthemable-tokens());
2521
@include token-utils.create-token-values(
26-
tokens-mat-tab-header.$prefix, tokens-mat-tab-header.get-unthemable-tokens());
22+
tokens-mdc-secondary-navigation-tab.$prefix,
23+
tokens-mdc-secondary-navigation-tab.get-unthemable-tokens());
2724
@include token-utils.create-token-values(
28-
tokens-mat-tab-header-with-background.$prefix,
29-
tokens-mat-tab-header-with-background.get-unthemable-tokens()
30-
);
25+
tokens-mdc-tab-indicator.$prefix, tokens-mdc-tab-indicator.get-unthemable-tokens());
26+
@include token-utils.create-token-values(
27+
tokens-mat-tab-header.$prefix, tokens-mat-tab-header.get-unthemable-tokens());
28+
@include token-utils.create-token-values(
29+
tokens-mat-tab-header-with-background.$prefix,
30+
tokens-mat-tab-header-with-background.get-unthemable-tokens());
3131
}
3232
}
3333
}
@@ -74,9 +74,12 @@
7474
}
7575

7676
@mixin _palette-styles($theme, $palette-name) {
77-
@include mdc-tab-theme.secondary-navigation-tab-theme(
78-
tokens-mdc-tab.get-color-tokens($theme, $palette-name));
79-
@include mdc-tab-indicator-theme.theme(
77+
@include token-utils.create-token-values(
78+
tokens-mdc-secondary-navigation-tab.$prefix,
79+
tokens-mdc-secondary-navigation-tab.get-color-tokens($theme, $palette-name)
80+
);
81+
@include token-utils.create-token-values(
82+
tokens-mdc-tab-indicator.$prefix,
8083
tokens-mdc-tab-indicator.get-color-tokens($theme, $palette-name));
8184
@include token-utils.create-token-values(tokens-mat-tab-header.$prefix,
8285
tokens-mat-tab-header.get-color-tokens($theme, $palette-name));
@@ -90,10 +93,11 @@
9093
}
9194
@else {
9295
.mat-mdc-tab-header {
93-
@include mdc-tab-theme.secondary-navigation-tab-theme(
94-
tokens-mdc-tab.get-typography-tokens($theme));
95-
@include mdc-tab-indicator-theme.theme(
96-
tokens-mdc-tab-indicator.get-typography-tokens($theme));
96+
@include token-utils.create-token-values(
97+
tokens-mdc-secondary-navigation-tab.$prefix,
98+
tokens-mdc-secondary-navigation-tab.get-typography-tokens($theme));
99+
@include token-utils.create-token-values(
100+
tokens-mdc-tab-indicator.$prefix, tokens-mdc-tab-indicator.get-typography-tokens($theme));
97101
@include token-utils.create-token-values(tokens-mat-tab-header.$prefix,
98102
tokens-mat-tab-header.get-typography-tokens($theme));
99103
@include token-utils.create-token-values(tokens-mat-tab-header-with-background.$prefix,
@@ -110,10 +114,11 @@
110114
}
111115
@else {
112116
.mat-mdc-tab-header {
113-
@include mdc-tab-theme.secondary-navigation-tab-theme(
114-
tokens-mdc-tab.get-density-tokens($theme));
115-
@include mdc-tab-indicator-theme.theme(
116-
tokens-mdc-tab-indicator.get-density-tokens($theme));
117+
@include token-utils.create-token-values(
118+
tokens-mdc-secondary-navigation-tab.$prefix,
119+
tokens-mdc-secondary-navigation-tab.get-density-tokens($theme));
120+
@include token-utils.create-token-values(
121+
tokens-mdc-tab-indicator.$prefix, tokens-mdc-tab-indicator.get-density-tokens($theme));
117122
@include token-utils.create-token-values(tokens-mat-tab-header.$prefix,
118123
tokens-mat-tab-header.get-density-tokens($theme));
119124
@include token-utils.create-token-values(tokens-mat-tab-header-with-background.$prefix,
@@ -125,14 +130,14 @@
125130
/// Outputs the CSS variable values for the given tokens.
126131
/// @param {Map} $tokens The token values to emit.
127132
@mixin overrides($tokens: ()) {
128-
$tab-tokens: tokens-mdc-tab.get-token-slots();
133+
$tab-tokens: tokens-mdc-secondary-navigation-tab.get-token-slots();
129134
$tab-indicator-tokens: tokens-mdc-tab-indicator.get-token-slots();
130135
$tab-header-tokens: tokens-mat-tab-header.get-token-slots();
131136
$tab-header-with-background-tokens: tokens-mat-tab-header-with-background.get-token-slots();
132137

133138
@include token-utils.batch-create-token-values(
134139
$tokens,
135-
(prefix: tokens-mdc-tab.$prefix, tokens: $tab-tokens),
140+
(prefix: tokens-mdc-secondary-navigation-tab.$prefix, tokens: $tab-tokens),
136141
(prefix: tokens-mdc-tab-indicator.$prefix, tokens: $tab-indicator-tokens),
137142
(prefix: tokens-mat-tab-header.$prefix, tokens: $tab-header-tokens),
138143
(
@@ -176,8 +181,11 @@
176181
$tokens, tokens-mat-tab-header.$prefix, $options...);
177182
// Don't pass $options here, because the mdc-tab doesn't have color variants,
178183
// only the mdc-tab-indicator and mat-tab-header do.
179-
$mdc-tab-tokens: token-utils.get-tokens-for($tokens, tokens-mdc-tab.$prefix);
180-
@include mdc-tab-theme.secondary-navigation-tab-theme($mdc-tab-tokens);
181-
@include mdc-tab-indicator-theme.theme($mdc-tab-indicator-tokens);
184+
$mdc-secondary-navigation-tab-tokens:
185+
token-utils.get-tokens-for($tokens, tokens-mdc-secondary-navigation-tab.$prefix);
186+
@include token-utils.create-token-values(tokens-mdc-secondary-navigation-tab.$prefix,
187+
$mdc-secondary-navigation-tab-tokens);
188+
@include token-utils.create-token-values(tokens-mdc-tab-indicator.$prefix,
189+
$mdc-tab-indicator-tokens);
182190
@include token-utils.create-token-values(tokens-mat-tab-header.$prefix, $mat-tab-header-tokens);
183191
}

0 commit comments

Comments
 (0)