12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- @use 'sass:math';
- @use '../core/tokens/m2/mat/form-field' as tokens-mat-form-field;
- @use '../core/tokens/token-utils';
- // Width of the Material Design form-field select arrow.
- $mat-form-field-select-arrow-width: 10px;
- // Height of the Material Design form-field select arrow.
- $mat-form-field-select-arrow-height: 5px;
- // Horizontal padding that needs to be applied to the native select in a form-field so
- // that the absolute positioned arrow does not overlap the select content.
- $mat-form-field-select-horizontal-end-padding: $mat-form-field-select-arrow-width + 5px;
- $_tokens: tokens-mat-form-field.$prefix, tokens-mat-form-field.get-token-slots();
- // Mixin that creates styles for native select controls in a form-field.
- @mixin private-form-field-native-select() {
- // Remove the native select down arrow and ensure that the native appearance
- // does not conflict with the form-field. e.g. Focus indication of the native
- // select is undesired since we handle focus as part of the form-field.
- select.mat-mdc-form-field-input-control {
- -moz-appearance: none;
- -webkit-appearance: none;
- background-color: transparent;
- display: inline-flex;
- box-sizing: border-box;
- // By default the cursor does not change when hovering over a select. We want to
- // change this for non-disabled select elements so that it's more obvious that the
- // control can be clicked.
- &:not(:disabled) {
- cursor: pointer;
- }
- &:not(.mat-mdc-native-select-inline) {
- @include token-utils.use-tokens($_tokens...) {
- option {
- @include token-utils.create-token-slot(color, select-option-text-color);
- }
- option:disabled {
- @include token-utils.create-token-slot(color, select-disabled-option-text-color);
- }
- }
- }
- }
- // Native select elements with the `matInput` directive should have Material Design
- // styling. This means that we add an arrow to the form-field that is based on the
- // Material Design specification. We achieve this by adding a pseudo element to the
- // form-field infix.
- .mat-mdc-form-field-type-mat-native-select {
- .mat-mdc-form-field-infix::after {
- content: '';
- width: 0;
- height: 0;
- border-left: math.div($mat-form-field-select-arrow-width, 2) solid transparent;
- border-right: math.div($mat-form-field-select-arrow-width, 2) solid transparent;
- border-top: $mat-form-field-select-arrow-height solid;
- position: absolute;
- right: 0;
- top: 50%;
- margin-top: -#{math.div($mat-form-field-select-arrow-height, 2)};
- // Make the arrow non-clickable so the user can click on the form control under it.
- pointer-events: none;
- @include token-utils.use-tokens($_tokens...) {
- @include token-utils.create-token-slot(color, enabled-select-arrow-color);
- }
- [dir='rtl'] & {
- right: auto;
- left: 0;
- }
- }
- @include token-utils.use-tokens($_tokens...) {
- &.mat-focused .mat-mdc-form-field-infix::after {
- @include token-utils.create-token-slot(color, focus-select-arrow-color);
- }
- &.mat-form-field-disabled .mat-mdc-form-field-infix::after {
- @include token-utils.create-token-slot(color, disabled-select-arrow-color);
- }
- }
- // Add padding on the end of the native select so that the content does not
- // overlap with the Material Design arrow.
- .mat-mdc-form-field-input-control {
- padding-right: $mat-form-field-select-horizontal-end-padding;
- [dir='rtl'] & {
- padding-right: 0;
- padding-left: $mat-form-field-select-horizontal-end-padding;
- }
- }
- }
- }
|