Как я могу заставить свой коврик-слайд-переключатель следовать новому стилю в Angular 18?

Я использую Angular 18 (18.1.2) для приложения с материалом (18.1.2). Я столкнулся со странной проблемой, когда мой mat-slide-toggle полностью не имеет стиля (не соответствует никаким цветам темы) и, кроме того, выглядит как слайд-переключатель до Angular 15. В своем приложении я использую сгенерированную тему Material 3 (я следовал этому руководству). Все остальные компоненты вроде работают нормально.

что-то.компонент.html

<mat-slide-toggle [(ngModel)] = "editMode"> Edit mode </mat-slide-toggle>

@if (editMode) {
<button mat-stroked-button> Button </button>
}

что-то.компонент.ц

import { Component } from '@angular/core';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { FormsModule } from '@angular/forms';

@Component({
  selector: 'app-something',
  standalone: true,
  imports: [MatSlideToggleModule, FormsModule],
  templateUrl: 'something.component.html',
})
export class SomethingComponent {
  editMode: boolean = false;
}

Я ожидаю увидеть переключатель слайдов, похожий на тот, что в документации:

Вместо этого я вижу это, которое не использует мой основной цвет (розовый, изображенный здесь на кнопке) и выглядит как слайд-переключатель компонента pre-MDC из Angular 14.

Что я делаю не так?

Обновлено:

стили.scss

// Import Angular Material theming
@use '@angular/material' as mat;
@use './theming/m3-theme' as m3;

// Import Tailwind CSS base, components, and utilities
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

// Apply the custom themes for Angular Material
html {
  @include mat.all-component-colors(m3.$light-theme);
  @include mat.core-theme(m3.$light-theme);
  @include mat.button-theme(m3.$light-theme);

  @media (prefers-color-scheme: dark) {
    @include mat.all-component-colors(m3.$dark-theme);
  }

}

m3-theme.scss

// This file was generated by running 'ng generate @angular/material:m3-theme'.
// Proceed with caution if making changes to this file.

@use 'sass:map';
@use '@angular/material' as mat;

// Note: Color palettes are generated from primary: #e64d87
$_palettes: (
  primary: (
    0: #000000,
    10: #3f001c,
    20: #650031,
    25: #79003c,
    30: #8e0047,
    35: #a01053,
    40: #b1215f,
    50: #d23d78,
    60: #f45891,
    70: #ff84ac,
    80: #ffb1c6,
    90: #ffd9e1,
    95: #ffecef,
    98: #fff8f8,
    99: #fffbff,
    100: #ffffff,
  ),
  secondary: (
    0: #000000,
    10: #2b151c,
    20: #422930,
    25: #4e343b,
    30: #5b3f47,
    35: #674b52,
    40: #74565e,
    50: #8f6f77,
    60: #aa8890,
    70: #c6a2aa,
    80: #e3bdc6,
    90: #ffd9e1,
    95: #ffecef,
    98: #fff8f8,
    99: #fffbff,
    100: #ffffff,
  ),
  tertiary: (
    0: #000000,
    10: #2d1600,
    20: #47290b,
    25: #543415,
    30: #613f1f,
    35: #6e4b29,
    40: #7c5634,
    50: #976f4a,
    60: #b48862,
    70: #d1a27a,
    80: #eebd93,
    90: #ffdcc0,
    95: #ffeee2,
    98: #fff8f5,
    99: #fffbff,
    100: #ffffff,
  ),
  neutral: (
    0: #000000,
    10: #201a1b,
    20: #352f30,
    25: #413a3b,
    30: #4c4546,
    35: #585052,
    40: #655c5e,
    50: #7e7576,
    60: #988e90,
    70: #b3a9aa,
    80: #cfc4c5,
    90: #ece0e1,
    95: #faeeef,
    98: #fff8f8,
    99: #fffbff,
    100: #ffffff,
    4: #120d0e,
    6: #171213,
    12: #241e1f,
    17: #2f282a,
    22: #3a3334,
    24: #3e3739,
    87: #e3d7d9,
    92: #f1e5e7,
    94: #f7ebec,
    96: #fdf1f2,
  ),
  neutral-variant: (
    0: #000000,
    10: #24191b,
    20: #3a2d30,
    25: #45383b,
    30: #514346,
    35: #5d4f52,
    40: #6a5a5e,
    50: #837376,
    60: #9e8c90,
    70: #b9a7aa,
    80: #d6c2c5,
    90: #f2dde1,
    95: #ffecef,
    98: #fff8f8,
    99: #fffbff,
    100: #ffffff,
  ),
  error: (
    0: #000000,
    10: #410002,
    20: #690005,
    25: #7e0007,
    30: #93000a,
    35: #a80710,
    40: #ba1a1a,
    50: #de3730,
    60: #ff5449,
    70: #ff897d,
    80: #ffb4ab,
    90: #ffdad6,
    95: #ffedea,
    98: #fff8f7,
    99: #fffbff,
    100: #ffffff,
  ),
);

$_rest: (
  secondary: map.get($_palettes, secondary),
  neutral: map.get($_palettes, neutral),
  neutral-variant: map.get($_palettes,  neutral-variant),
  error: map.get($_palettes, error),
);
$_primary: map.merge(map.get($_palettes, primary), $_rest);
$_tertiary: map.merge(map.get($_palettes, tertiary), $_rest);

$light-theme: mat.define-theme((
  color: (
    theme-type: light,
    primary: $_primary,
    tertiary: $_tertiary,
  ),
));
$dark-theme: mat.define-theme((
  color: (
    theme-type: dark,
    primary: $_primary,
    tertiary: $_tertiary,
  ),
));

РЕДАКТИРОВАТЬ № 2:

После предложения @NarenMurali и импорта тем компонентов он по-прежнему выглядит шатко, но ближе к тому, что указано в документации:

РЕДАКТИРОВАТЬ № 3:

Следуя совету @NarenMurali, обнаружил, что к флажку m3 каким-то образом применен класс mat-accent. Попробовал явно указать основной цвет через:

@mixin color($theme) {
  .primary-toggle {
    @include mat.slide-toggle-color($theme, $color-variant : primary);
    background-color: red;
  }
}

и миксин определенно работает, поскольку я вижу красный фон, но цвет переключателя все еще не является основным.

пожалуйста, поделитесь информацией о теме и файле SCSS для проверки

Naren Murali 29.07.2024 09:10

@NarenMurali добавил!

Sofya 29.07.2024 09:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте изменить SCSS, чтобы импортировать все темы компонентов из M3.

// Import Angular Material theming
@use '@angular/material' as mat;
@use './theming/m3-theme' as m3;

// Import Tailwind CSS base, components, and utilities
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';

// Apply the custom themes for Angular Material
html {
  @include mat.all-component-themes(m3.$light-theme); /* <-- changed here! */
  @include mat.all-component-colors(m3.$light-theme);

  @media (prefers-color-scheme: dark) {
    @include mat.all-component-colors(m3.$dark-theme);
  }

}

@include mat.core();
@include mat.color-variants-backwards-compatibility($theme);

Также проверьте свою базу кода, если у вас есть какой-либо импорт, например

@import "~@angular/material/prebuilt-themes/indigo-pink.css";  /* <-- remove this! */

Они больше не нужны, поскольку темизация выполняется с использованием нового метода.

Справочник Stackblitz

Спасибо! Это немного помогло (я добавил изображение в конце вопроса), но оно по-прежнему выглядит не так, и цвета неправильные. Я удалил "@angular/material/prebuilt-themes/pink-bluegrey.css", из стилей в файле angular.json, но это ничего не дало. Я также протестировал его без Tailwind, чтобы посмотреть, не мешает ли это ему.

Sofya 29.07.2024 09:32

@Sofya после удаления перезапустите сервер/редактор кода и проверьте, а также обновила мой ответ, добавив еще несколько строк и рабочий пример, чтобы вы могли сравнить его с вашим кодом и найти проблему.

Naren Murali 29.07.2024 09:35

@Sofya выполните проверку элемента и проверьте, не вызывает ли какой-либо CSS из приложения эту проблему.

Naren Murali 29.07.2024 09:44

При наличии @include mat.color-variants-backwards-compatibility($theme) кнопка приобретает странный оттенок желтого. Я проверил, заменив свой файл style.scss стилями из stackblitz, что привело к получению нужных цветов. Inspect дал интересный результат: слайд-переключатель использует класс mat-accent, который может объяснить желтый цвет. Не знаю почему, так как я перешёл с Материала 2 на Материал 3 согласно руководству Angular Material. Ничего из того, что я делаю в инструментах разработчика, не делает границу толще. Я думаю, это странный артефакт, оставшийся от миграции где-то в кодовой базе.

Sofya 29.07.2024 10:02

@Sofya попробуйте удалить кеш папки .angular и также проверить.

Naren Murali 29.07.2024 10:03

удаление .angular ничего не изменило :( Я попробую явно указать ему основной цвет, используя рекомендации по темам в документации.

Sofya 29.07.2024 10:08
Ответ принят как подходящий

После долгих возни я нашел способ это исправить.

Переключатель был исправлен для меня путем переустановки Angular Material. Сделайте npm uninstall @angular/material и, если необходимо, npm uninstall @angular/material-experimental (я установил его, чтобы починить переключатель, но он ничего не дал). На этом этапе я попытался запустить приложение, чтобы убедиться, что оно определенно не запускается из-за ошибок из-за отсутствия материала. После этого сделайте ng add @angular/material и проверьте, установлена ​​ли последняя версия материала. Я принял тему по умолчанию, но она все равно была перегружена моим существующим файлом style.scss. Когда вы перезапустите приложение, у вас должны появиться переключатели, которые выглядят точно так же, как в документации. С темой по умолчанию (т. е. с чистым стилем.scss) даже цвета должны быть в порядке.

Я продолжал возиться с исправлением цветов — я не уверен, важно ли сначала принять тему по умолчанию, чтобы исправить переключатель, но позже, чтобы оформить переключатель в соответствии с цветами вашей темы, я только что удалил импорт темы по умолчанию в angular.json → стили. Я также удалил @include mat.color-variants-backwards-compatibility($theme); линия. Теперь мои слайд-переключатели оформлены правильно.

Я также должен отметить, что все стили в моем приложении ломаются, если я создаю тему m3 с системными переменными, поэтому я понятия не имею, как ведут себя темы, использующие системные переменные.

Я не уверен, имеет ли это решающее значение для исправления, но я также использовал это руководство: https://angular.dev/tools/cli/build-system-migration для перехода на новую систему сборки. Сам по себе он ничего не сделал для переключателя, но я все равно упоминаю об этом, поскольку в последующих изменениях, которые я вносил, использовалась эта система сборки.

Другие вопросы по теме