Files
metabuilder/fakemui/scss/m3-scss/material/select/select.scss
johndoe6345789 89f83a7476 Organize fakemui folder: email components complete, docs consolidated
- Email components (Phase 2 COMPLETE):
  * Fixed 18 broken imports: @metabuilder/fakemui/hooks → ../../../src/utils/useAccessible
  * Renamed email-wip/ → email/ (production-ready)
  * Enabled exports in react/components/index.ts
  * All 22 email components now production-ready (1244 lines)

- Cleanup:
  * Removed wip/ directory (duplicate of src/utils/accessibility)
  * Preserved 15 Python/PyQt6 implementation files (full implementations, not stubs)
  * Moved 7 markdown files to fakemui/docs/ (better organization)

- Documentation:
  * Updated CLAUDE.md: Phase 2 email complete, added deletion safety gotcha
  * Created plan: txt/FAKEMUI_REORGANIZATION_PLAN_2026-02-01.txt

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 20:18:49 +00:00

268 lines
7.4 KiB
SCSS

@use 'sass:math';
@use 'cdk';
@use '../core/style/vendor-prefixes';
@use '../core/style/variables';
@use '../core/tokens/token-utils';
@use './m3-select';
$mat-select-arrow-size: 5px !default;
$mat-select-arrow-margin: 4px !default;
$mat-select-panel-max-height: 275px !default;
$mat-select-placeholder-arrow-space: 2 *
($mat-select-arrow-size + $mat-select-arrow-margin);
$leading-width: 12px !default;
$scale: 0.75 !default;
$fallbacks: m3-select.get-tokens();
@keyframes _mat-select-enter {
from {
opacity: 0;
transform: scaleY(0.8);
}
to {
opacity: 1;
transform: none;
}
}
@keyframes _mat-select-exit {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.mat-mdc-select {
display: inline-block;
width: 100%;
outline: none;
@include vendor-prefixes.smooth-font();
color: token-utils.slot(select-enabled-trigger-text-color, $fallbacks);
font-family: token-utils.slot(select-trigger-text-font, $fallbacks);
line-height: token-utils.slot(select-trigger-text-line-height, $fallbacks);
font-size: token-utils.slot(select-trigger-text-size, $fallbacks);
font-weight: token-utils.slot(select-trigger-text-weight, $fallbacks);
letter-spacing: token-utils.slot(select-trigger-text-tracking, $fallbacks);
}
div.mat-mdc-select-panel {
box-shadow: token-utils.slot(select-container-elevation-shadow, $fallbacks);
}
.mat-mdc-select-disabled {
color: token-utils.slot(select-disabled-trigger-text-color, $fallbacks);
.mat-mdc-select-placeholder {
color: token-utils.slot(select-disabled-trigger-text-color, $fallbacks);
}
}
.mat-mdc-select-trigger {
display: inline-flex;
align-items: center;
cursor: pointer;
position: relative;
box-sizing: border-box;
width: 100%;
.mat-mdc-select-disabled & {
@include vendor-prefixes.user-select(none);
cursor: default;
}
}
.mat-mdc-select-value {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mat-mdc-select-value-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mat-mdc-select-arrow-wrapper {
height: 24px;
flex-shrink: 0;
display: inline-flex;
align-items: center;
.mat-form-field-appearance-fill .mdc-text-field--no-label & {
transform: none;
}
}
.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,
.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after {
color: token-utils.slot(select-invalid-arrow-color, $fallbacks);
}
.mat-mdc-select-arrow {
width: $mat-select-arrow-size * 2;
height: $mat-select-arrow-size;
position: relative;
color: token-utils.slot(select-enabled-arrow-color, $fallbacks);
.mat-mdc-form-field.mat-focused & {
color: token-utils.slot(select-focused-arrow-color, $fallbacks);
}
.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled & {
color: token-utils.slot(select-disabled-arrow-color, $fallbacks);
}
.mat-select-open & {
transform: rotate(180deg);
}
.mat-form-field-animations-enabled & {
transition: transform variables.$swift-linear-duration variables.$swift-linear-timing-function;
}
svg {
fill: currentColor;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
@include cdk.high-contrast {
// On Chromium browsers the `currentColor` blends in with the
// background for SVGs so we have to fall back to `CanvasText`.
fill: CanvasText;
.mat-mdc-select-disabled & {
fill: GrayText;
}
}
}
}
// Even though we don't use the MDC styles, we need to keep the classes in the
// DOM for the Gmat versions to work. We need to bump up the specificity here
// so that it's higher than MDC's styles.
div.mat-mdc-select-panel {
width: 100%; // Ensures that the panel matches the overlay width.
max-height: $mat-select-panel-max-height;
outline: 0;
overflow: auto;
padding: 8px 0;
border-radius: 4px;
box-sizing: border-box;
// Necessary so the `offsetParent` of the nested `mat-option` is the
// panel which is required for scroll calculations (see #30974).
position: relative;
background-color: token-utils.slot(select-panel-background-color, $fallbacks);
@include cdk.high-contrast {
outline: solid 1px;
}
.cdk-overlay-pane:not(.mat-mdc-select-panel-above) & {
border-top-left-radius: 0;
border-top-right-radius: 0;
transform-origin: top center;
}
.mat-mdc-select-panel-above & {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
transform-origin: bottom center;
}
}
.mat-select-panel-animations-enabled {
animation: _mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1);
&.mat-select-panel-exit {
animation: _mat-select-exit 100ms linear;
}
}
.mat-mdc-select-placeholder {
// Delay the transition until the label has animated about a third of the way through, in
// order to prevent the placeholder from overlapping for a split second.
transition: color variables.$swift-ease-out-duration
math.div(variables.$swift-ease-out-duration, 3)
variables.$swift-ease-out-timing-function;
color: token-utils.slot(select-placeholder-text-color, $fallbacks);
.mat-mdc-form-field:not(.mat-form-field-animations-enabled) &,
._mat-animation-noopable & {
transition: none;
}
.mat-form-field-hide-placeholder & {
color: transparent;
// Overwrite browser specific CSS properties that can overwrite the `color` property.
// Some developers seem to use this approach to easily overwrite the placeholder / label color.
-webkit-text-fill-color: transparent;
// Remove the transition to prevent the placeholder
// from overlapping when the label comes back down.
transition: none;
// Prevents the '...' from showing on the parent element.
display: block;
}
}
// Our MDC form field implementation is based on the MDC text field which doesn't include styles
// for select. The select specific styles are not present as they don't use their text field as a
// container. Below are the styles to account for the select arrow icon at the end.
.mat-mdc-form-field-type-mat-select {
&:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper {
cursor: pointer;
}
&.mat-form-field-appearance-fill {
.mat-mdc-floating-label {
max-width: calc(100% - #{$mat-select-placeholder-arrow-space});
}
.mdc-floating-label--float-above {
$arrow-scale: math.div($mat-select-placeholder-arrow-space, $scale);
max-width: calc(100% / #{$scale} - #{$arrow-scale});
}
}
&.mat-form-field-appearance-outline {
.mdc-notched-outline__notch {
max-width: calc(100% - #{2 * ($mat-select-placeholder-arrow-space + $leading-width)});
}
.mdc-text-field--label-floating .mdc-notched-outline__notch {
max-width: calc(100% - #{$leading-width * 2});
}
}
}
// Used to prevent inline elements from collapsing if their text bindings
// become empty. This is preferrable to inserting a blank space, because the
// space can be read out by screen readers (see #21725).
.mat-mdc-select-min-line:empty::before {
content: ' ';
white-space: pre;
width: 1px;
display: inline-block;
// Prevents some browsers from rendering the element in high contrast mode. Use `visibility`
// instead of `opacity` since VoiceOver + Chrome still reads out the space with the latter.
visibility: hidden;
}
.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper {
transform: token-utils.slot(select-arrow-transform, $fallbacks);
}