Skip to content
This repository was archived by the owner on Jan 13, 2025. It is now read-only.

Commit 8639c26

Browse files
asyncLizcopybara-github
authored andcommitted
fix(textfield): clean up input padding
BREAKING CHANGE: removed the following variables: `$input-padding`, `$input-padding-top`, `$input-padding-bottom`, `$outlined-input-padding-top`, `$outlined-input-padding-bottom`, `$input-border-bottom` PiperOrigin-RevId: 300259065
1 parent 1ae8130 commit 8639c26

File tree

4 files changed

+102
-92
lines changed

4 files changed

+102
-92
lines changed

packages/mdc-notched-outline/_mixins.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@
259259
@include feature-targeting-mixins.targets($feat-structure) {
260260
display: flex;
261261
position: absolute;
262+
top: 0;
262263
right: 0;
263264
left: 0;
264265
box-sizing: border-box;

packages/mdc-textfield/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,34 @@ Un-styled Content (**FOUC**).
267267
</label>
268268
```
269269

270+
## Baseline Alignment
271+
272+
By default, text fields will be aligned with other elements relative to their
273+
baseline. The input text's baseline is used to determine where a text field
274+
should be aligned to and is different between variants. To force alignment to
275+
the text field's container instead of its baseline, align the element using
276+
flexbox.
277+
278+
```html
279+
<div>
280+
<label class="mdc-text-field mdc-text-field--outlined">
281+
<input type="text" class="mdc-text-field__input" value="Baseline">
282+
<span class="mdc-notched-outline__leading"></span>
283+
<span class="mdc-notched-outline__trailing"></span>
284+
</label>
285+
<span>Text that is aligned with the text field's value</span>
286+
</div>
287+
288+
<div style="display: flex; flex-direction: row; align-items: flex-end;">
289+
<label class="mdc-text-field mdc-text-field--outlined">
290+
<input type="text" class="mdc-text-field__input" value="Baseline">
291+
<span class="mdc-notched-outline__leading"></span>
292+
<span class="mdc-notched-outline__trailing"></span>
293+
</label>
294+
<span>Text that is aligned to the bottom of the text field's outline</span>
295+
</div>
296+
```
297+
270298
## Style Customization
271299

272300
### CSS Classes

packages/mdc-textfield/_mixins.scss

Lines changed: 67 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
@include ripple-mixins.states-hover-opacity(ripple-functions.states-opacity(variables.$ink-color, hover), $query: $query, $ripple-target: variables.$ripple-target);
6060
@include ripple-mixins.states-focus-opacity(ripple-functions.states-opacity(variables.$ink-color, focus), $query: $query, $ripple-target: variables.$ripple-target);
6161

62-
// Height
62+
// Height and baseline
6363
@include height(variables.$height, $query: $query);
6464

6565
// Shape
@@ -84,6 +84,7 @@
8484

8585
@include feature-targeting-mixins.targets($feat-structure) {
8686
display: inline-flex;
87+
padding: 0 variables.$padding-horizontal;
8788
position: relative;
8889
box-sizing: border-box;
8990
overflow: hidden;
@@ -95,17 +96,15 @@
9596
.mdc-text-field__input {
9697
// Exclude setting line-height to keep caret (text cursor) same height as the input text in iOS browser.
9798
@include typography-mixins.typography(subtitle1, $exclude-props: (line-height), $query: $query);
98-
@include input-padding_($query: $query);
9999

100100
@include feature-targeting-mixins.targets($feat-structure) {
101-
align-self: flex-end;
102-
box-sizing: border-box;
103101
width: 100%;
104-
height: 100%;
102+
height: variables.$input-height;
105103
border: none;
106104
border-radius: 0;
107105
background: none;
108106
appearance: none;
107+
padding: 0;
109108
}
110109

111110
@include feature-targeting-mixins.targets($feat-animation) {
@@ -158,11 +157,6 @@
158157
z-index: auto !important;
159158
}
160159
}
161-
162-
// Vertically center aligns the text input placeholder and value for only filled variant.
163-
.mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) & {
164-
@include input-no-label-padding_($query: $query);
165-
}
166160
}
167161

168162
// stylelint-disable-next-line plugin/selector-bem-pattern
@@ -440,29 +434,43 @@
440434
/// @param {Number} $height
441435
/// @param {Number} $minimum-height-for-filled-label Sets the minimum height for
442436
/// filled textfields at which to allow floating labels.
437+
/// @param {Number} $filled-baseline-top The baseline from the top of the field
438+
///. that the input should be aligned to for a filled variant with a label
443439
/// @access public
444440
///
445-
@mixin height($height, $minimum-height-for-filled-label: variables.$minimum-height-for-filled-label, $query: feature-targeting-functions.all()) {
441+
@mixin height(
442+
$height,
443+
$minimum-height-for-filled-label: variables.$minimum-height-for-filled-label,
444+
$filled-baseline-top: variables.$filled-baseline-top,
445+
$query: feature-targeting-functions.all()
446+
) {
446447
$feat-structure: feature-targeting-functions.create-target($query, structure);
447-
448448
@include feature-targeting-mixins.targets($feat-structure) {
449449
height: $height;
450450
}
451451

452+
// Filled variant is aligned to baseline...
453+
@include typography-mixins.baseline($top: $filled-baseline-top, $display: inline-flex, $query: $query);
454+
// ...unless it is too small to display a label
452455
@if $height < $minimum-height-for-filled-label {
453-
// Filled text fields must be tall enough to display a label
454-
&:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) {
455-
@include feature-targeting-mixins.targets($feat-structure) {
456+
@include center-aligned_($query: $query);
457+
458+
@include feature-targeting-mixins.targets($feat-structure) {
459+
&:not(.mdc-text-field--outlined) {
456460
.mdc-floating-label {
457461
display: none;
458462
}
459463
}
460-
461-
.mdc-text-field__input {
462-
@include input-no-label-padding_($query: $query);
463-
}
464464
}
465465
}
466+
467+
// Outlined and no-label variants are always centered
468+
&.mdc-text-field--outlined,
469+
&.mdc-text-field--fullwidth,
470+
&.mdc-text-field--textarea,
471+
&.mdc-text-field--no-label {
472+
@include center-aligned_($query: $query);
473+
}
466474
}
467475

468476
///
@@ -482,7 +490,8 @@
482490
}
483491

484492
@include floating-label-mixins.shake-animation($keyframe-suffix, $query: $query);
485-
@include height($height, $query: $query);
493+
// Avoid unnecessary rules for filled variant since this is outlined
494+
@include height($height, $minimum-height-for-filled-label: 0, $query: $query);
486495
}
487496

488497
///
@@ -525,8 +534,8 @@
525534
@include rtl-mixins.rtl {
526535
@include floating-label-mixins.shake-animation($keyframe-suffix, $query: $query);
527536
}
528-
529-
@include height($height, $query: $query);
537+
// Avoid unnecessary rules for filled variant since this is outlined
538+
@include height($height, $minimum-height-for-filled-label: 0, $query: $query);
530539
}
531540

532541
///
@@ -743,23 +752,17 @@
743752

744753
// Baseline
745754

746-
@mixin input-padding_($query: feature-targeting-functions.all()) {
755+
// Removes filled baseline alignment
756+
@mixin center-aligned_($query: feature-targeting-functions.all()) {
747757
$feat-structure: feature-targeting-functions.create-target($query, structure);
748758

749759
@include feature-targeting-mixins.targets($feat-structure) {
750-
padding:
751-
variables.$input-padding-top
752-
variables.$input-padding
753-
variables.$input-padding-bottom + variables.$input-border-bottom;
754-
}
755-
}
760+
align-items: center;
756761

757-
@mixin input-no-label-padding_($query: feature-targeting-functions.all()) {
758-
$feat-structure: feature-targeting-functions.create-target($query, structure);
759-
760-
@include feature-targeting-mixins.targets($feat-structure) {
761-
padding-top: 0;
762-
padding-bottom: variables.$input-border-bottom;
762+
// Remove baseline-top pseudo element
763+
&::before {
764+
display: none;
765+
}
763766
}
764767
}
765768

@@ -900,10 +903,8 @@
900903
}
901904

902905
@if ($resolved-radius > notched-outline-variables.$leading-width) {
903-
.mdc-text-field__input {
904-
@include feature-targeting-mixins.targets($feat-structure) {
905-
@include rtl-mixins.reflexive-property(padding, $resolved-radius + notched-outline-variables.$padding, 0);
906-
}
906+
@include feature-targeting-mixins.targets($feat-structure) {
907+
@include rtl-mixins.reflexive-property(padding, $resolved-radius + notched-outline-variables.$padding, 0);
907908
}
908909

909910
+ .mdc-text-field-helper-line {
@@ -1038,7 +1039,6 @@
10381039
}
10391040

10401041
.mdc-text-field__input {
1041-
@include outlined-input-padding_($query: $query);
10421042
@include feature-targeting-mixins.targets($feat-structure) {
10431043
display: flex;
10441044
border: none !important; // FF adds unwanted border in HC mode on windows.
@@ -1058,15 +1058,6 @@
10581058
}
10591059
}
10601060

1061-
@mixin outlined-input-padding_($query: feature-targeting-functions.all()) {
1062-
$feat-structure: feature-targeting-functions.create-target($query, structure);
1063-
1064-
@include feature-targeting-mixins.targets($feat-structure) {
1065-
padding-top: variables.$outlined-input-padding-top;
1066-
padding-bottom: variables.$outlined-input-padding-bottom;
1067-
}
1068-
}
1069-
10701061
@mixin hover-outline-color_($color, $query: feature-targeting-functions.all()) {
10711062
&:not(.mdc-text-field--focused):hover {
10721063
.mdc-notched-outline {
@@ -1088,10 +1079,8 @@
10881079

10891080
@include icon-mixins.leading-icon-horizontal-position_(icon-variables.$icon-position, $query: $query);
10901081

1091-
.mdc-text-field__input {
1092-
@include feature-targeting-mixins.targets($feat-structure) {
1093-
@include rtl-mixins.reflexive-property(padding, icon-variables.$icon-padding, variables.$input-padding);
1094-
}
1082+
@include feature-targeting-mixins.targets($feat-structure) {
1083+
@include rtl-mixins.reflexive-property(padding, icon-variables.$icon-padding, variables.$padding-horizontal);
10951084
}
10961085

10971086
.mdc-floating-label {
@@ -1106,10 +1095,8 @@
11061095

11071096
@include icon-mixins.leading-icon-horizontal-position_(icon-variables.$dense-icon-position, $query: $query);
11081097

1109-
.mdc-text-field__input {
1110-
@include feature-targeting-mixins.targets($feat-structure) {
1111-
@include rtl-mixins.reflexive-property(padding, icon-variables.$dense-icon-padding, variables.$input-padding);
1112-
}
1098+
@include feature-targeting-mixins.targets($feat-structure) {
1099+
@include rtl-mixins.reflexive-property(padding, icon-variables.$dense-icon-padding, variables.$padding-horizontal);
11131100
}
11141101

11151102
.mdc-floating-label {
@@ -1168,10 +1155,8 @@
11681155

11691156
@include icon-mixins.trailing-icon-horizontal-position_(icon-variables.$trailing-icon-position, $query: $query);
11701157

1171-
.mdc-text-field__input {
1172-
@include feature-targeting-mixins.targets($feat-structure) {
1173-
@include rtl-mixins.reflexive-property(padding, variables.$input-padding, icon-variables.$icon-padding);
1174-
}
1158+
@include feature-targeting-mixins.targets($feat-structure) {
1159+
@include rtl-mixins.reflexive-property(padding, variables.$padding-horizontal, icon-variables.$icon-padding);
11751160
}
11761161
}
11771162

@@ -1180,10 +1165,8 @@
11801165

11811166
@include icon-mixins.trailing-icon-horizontal-position_(icon-variables.$dense-icon-position, $query: $query);
11821167

1183-
.mdc-text-field__input {
1184-
@include feature-targeting-mixins.targets($feat-structure) {
1185-
@include rtl-mixins.reflexive-property(padding, variables.$input-padding, icon-variables.$dense-icon-padding);
1186-
}
1168+
@include feature-targeting-mixins.targets($feat-structure) {
1169+
@include rtl-mixins.reflexive-property(padding, variables.$padding-horizontal, icon-variables.$dense-icon-padding);
11871170
}
11881171
}
11891172

@@ -1196,11 +1179,9 @@
11961179
$query: $query
11971180
);
11981181

1199-
.mdc-text-field__input {
1200-
@include feature-targeting-mixins.targets($feat-structure) {
1201-
padding-right: icon-variables.$icon-padding;
1202-
padding-left: icon-variables.$icon-padding;
1203-
}
1182+
@include feature-targeting-mixins.targets($feat-structure) {
1183+
padding-right: icon-variables.$icon-padding;
1184+
padding-left: icon-variables.$icon-padding;
12041185
}
12051186
}
12061187

@@ -1213,11 +1194,9 @@
12131194
$query: $query
12141195
);
12151196

1216-
.mdc-text-field__input {
1217-
@include feature-targeting-mixins.targets($feat-structure) {
1218-
padding-right: icon-variables.$dense-icon-padding;
1219-
padding-left: icon-variables.$dense-icon-padding;
1220-
}
1197+
@include feature-targeting-mixins.targets($feat-structure) {
1198+
padding-right: icon-variables.$dense-icon-padding;
1199+
padding-left: icon-variables.$dense-icon-padding;
12211200
}
12221201
}
12231202

@@ -1229,6 +1208,7 @@
12291208
@include disabled-bottom-line-color(variables.$bottom-line-idle, $query: $query);
12301209

12311210
@include feature-targeting-mixins.targets($feat-structure) {
1211+
padding: 0;
12321212
width: 100%;
12331213
}
12341214

@@ -1237,13 +1217,7 @@
12371217
@include fill-color(transparent, $query: $query);
12381218

12391219
@include feature-targeting-mixins.targets($feat-structure) {
1240-
display: block;
1241-
}
1242-
1243-
.mdc-text-field__input {
1244-
@include feature-targeting-mixins.targets($feat-structure) {
1245-
padding: 0 0 variables.$input-border-bottom;
1246-
}
1220+
display: flex;
12471221
}
12481222
}
12491223

@@ -1283,7 +1257,6 @@
12831257
@include notched-outline-mixins.floating-label-float-position(variables.$textarea-label-position-y, $query: $query);
12841258
@include character-counter-mixins.character-counter-position(16px, 13px, $query: $query);
12851259

1286-
$padding-inset: 16px;
12871260
$feat-structure: feature-targeting-functions.create-target($query, structure);
12881261
$feat-animation: feature-targeting-functions.create-target($query, animation);
12891262
$feat-typography: feature-targeting-functions.create-target($query, typography);
@@ -1292,6 +1265,7 @@
12921265
display: inline-flex;
12931266
width: auto;
12941267
height: auto;
1268+
padding: 0; // see below for explanation
12951269
overflow: visible;
12961270
}
12971271

@@ -1301,11 +1275,18 @@
13011275

13021276
.mdc-text-field__input {
13031277
@include feature-targeting-mixins.targets($feat-structure) {
1304-
align-self: auto;
1278+
align-self: stretch;
13051279
box-sizing: border-box;
13061280
height: auto;
1307-
margin: $padding-inset / 2 1px 1px 0;
1308-
padding: 0 $padding-inset $padding-inset;
1281+
// Top margin is used to keep the text from overlapping the floating label
1282+
// when scrolling
1283+
margin-top: variables.$textarea-input-margin-top;
1284+
// Bottom and left/right margins are used to add space for the resize handle
1285+
margin-bottom: variables.$textarea-input-handle-margin;
1286+
@include rtl-mixins.reflexive-box(margin, right, variables.$textarea-input-handle-margin);
1287+
// Textarea has horizontal padding instead of the container. This allows the
1288+
// resize handle to extend to the edge of the container.
1289+
padding: 0 variables.$padding-horizontal variables.$textarea-input-padding-bottom;
13091290
}
13101291

13111292
@include feature-targeting-mixins.targets($feat-typography) {

0 commit comments

Comments
 (0)