@use '@angular/cdk'; @use '../core/tokens/m2/mat/expansion' as tokens-mat-expansion; @use '../core/tokens/token-utils'; @use './expansion-variables'; .mat-expansion-panel-header { display: flex; flex-direction: row; align-items: center; padding: 0 24px; border-radius: inherit; .mat-expansion-panel-animations-enabled & { transition: height expansion-variables.$header-transition; } @include token-utils.use-tokens( tokens-mat-expansion.$prefix, tokens-mat-expansion.get-token-slots()) { @include token-utils.create-token-slot(height, header-collapsed-state-height); @include token-utils.create-token-slot(font-family, header-text-font); @include token-utils.create-token-slot(font-size, header-text-size); @include token-utils.create-token-slot(font-weight, header-text-weight); @include token-utils.create-token-slot(line-height, header-text-line-height); @include token-utils.create-token-slot(letter-spacing, header-text-tracking); &.mat-expanded { @include token-utils.create-token-slot(height, header-expanded-state-height); } &[aria-disabled='true'] { @include token-utils.create-token-slot(color, header-disabled-state-text-color); } &:not([aria-disabled='true']) { cursor: pointer; .mat-expansion-panel:not(.mat-expanded) &:hover { @include token-utils.create-token-slot(background, header-hover-state-layer-color); // Disable the hover on touch devices since it can appear like it is stuck. We can't use // `@media (hover)` above, because the desktop support browser support isn't great. @media (hover: none) { @include token-utils.create-token-slot(background, container-background-color); } } // The `.mat-expansion-panel` here is redundant, but we need the additional specificity. .mat-expansion-panel &.cdk-keyboard-focused, .mat-expansion-panel &.cdk-program-focused { @include token-utils.create-token-slot(background, header-focus-state-layer-color); } } } // If the `NoopAnimationsModule` is used, disable the height transition. &._mat-animation-noopable { transition: none; } &:focus, &:hover { outline: none; } &.mat-expanded:focus, &.mat-expanded:hover { background: inherit; } &.mat-expansion-toggle-indicator-before { flex-direction: row-reverse; .mat-expansion-indicator { margin: 0 16px 0 0; [dir='rtl'] & { margin: 0 0 0 16px; } } } } .mat-content { display: flex; flex: 1; flex-direction: row; overflow: hidden; // width of .mat-expansion-indicator::after element &.mat-content-hide-toggle { margin-right: 8px; [dir='rtl'] & { margin-right: 0; margin-left: 8px; } .mat-expansion-toggle-indicator-before & { margin-left: 24px; margin-right: 0; [dir='rtl'] & { margin-right: 24px; margin-left: 0; } } } } .mat-expansion-panel-header-title { @include token-utils.use-tokens( tokens-mat-expansion.$prefix, tokens-mat-expansion.get-token-slots()) { @include token-utils.create-token-slot(color, header-text-color); } } .mat-expansion-panel-header-title, .mat-expansion-panel-header-description { display: flex; flex-grow: 1; flex-basis: 0; margin-right: 16px; align-items: center; [dir='rtl'] & { margin-right: 0; margin-left: 16px; } .mat-expansion-panel-header[aria-disabled='true'] & { color: inherit; } } .mat-expansion-panel-header-description { flex-grow: 2; @include token-utils.use-tokens( tokens-mat-expansion.$prefix, tokens-mat-expansion.get-token-slots()) { @include token-utils.create-token-slot(color, header-description-color); } } // Creates the expansion indicator arrow. Done using ::after // rather than having additional nodes in the template. .mat-expansion-indicator { .mat-expansion-panel-animations-enabled & { transition: transform 225ms cubic-bezier(0.4, 0, 0.2, 1); } .mat-expansion-panel-header.mat-expanded & { transform: rotate(180deg); } &::after { border-style: solid; border-width: 0 2px 2px 0; content: ''; display: inline-block; padding: 3px; transform: rotate(45deg); vertical-align: middle; @include token-utils.use-tokens( tokens-mat-expansion.$prefix, tokens-mat-expansion.get-token-slots()) { @include token-utils.create-token-slot(color, header-indicator-color); @include token-utils.create-token-slot(display, legacy-header-indicator-display, inline-block); } } svg { width: 24px; height: 24px; // The SVG icon isn't edge-to-edge so we need to offset // it slightly so it's aligned correctly horizontally. margin: 0 -8px; // Since the container is `display: inline`, we need to set this to center the arrow. // Ideally we'd make the container `inline-flex`, but that affects M2. vertical-align: middle; @include token-utils.use-tokens( tokens-mat-expansion.$prefix, tokens-mat-expansion.get-token-slots()) { @include token-utils.create-token-slot(fill, header-indicator-color); @include token-utils.create-token-slot(display, header-indicator-display, none); } } } @include cdk.high-contrast { .mat-expansion-panel-content { border-top: 1px solid; border-top-left-radius: 0; border-top-right-radius: 0; } }