Size: a a a

Angular - русскоговорящее сообщество

2020 April 03

AK

Andrey Koshak in Angular - русскоговорящее сообщество
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
Win Excelent
Всем привет, подскажите кто работает с angular material, как вы получаете цвет с установленной темы (если есть светлая и темная тема) в своих кастомных компонентах.

Появилась следующая задача - создал свой компонент, написал в нём стиль:
 .main {
   &-name {
     color: mat-color($primary);
   }
}

Хочу так использовать: <span class="main-name">My Super Text</span>

И ожидаю что когда я меняю тему со светлой на темную то и цвет текста будет меняться. Но вот в чем вопрос, как получить primary color? Нашел следюущее решение - https://github.com/angular/components/issues/9069#issuecomment-477547181 , но оно не подходит (SassError: This file is already being loaded.), ошибку получаю когда подключаю scss из своего компонента @import "src/app/app.component"; в themes.scss, собственно хочу понять как правильно реализовать данную логику, может кто подсказать?
Подскажите плиз кто знает, вопрос про темизацию в angular material
источник

ID

Igor D in Angular - русскоговорящее сообщество
Win Excelent
Подскажите плиз кто знает, вопрос про темизацию в angular material
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
Спасибо, но я читал это и вникал, и не только этот гайд, но я либо окончательно ослеп, либо я не нашел как получать цвета с темы для своего кастомного компонента если тем несколько, в примерах есть только с одной темой, что и так понятно
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
Win Excelent
Спасибо, но я читал это и вникал, и не только этот гайд, но я либо окончательно ослеп, либо я не нашел как получать цвета с темы для своего кастомного компонента если тем несколько, в примерах есть только с одной темой, что и так понятно
документация по темированию довольно поверхностна. Но вообще это всё построено на том, что есть некие миксины, в которые кидается тема с настройками primary, accent, warn, foreground, background цветов и конкретный компонент использует их.
Кастомизация касается только цветов. Отступы не меняются, но есть миксины на типографию.
Советую скачать проект material с гитхаба и смотреть исходники scss стилизации относительно компонента, который интересует. Они именуются theming
источник

IF

Igor Filippov in Angular - русскоговорящее сообщество
Жесть. Самое интересное что я в самом начале пошел по такому пути. Но оно не завелось, по другим причинам и начал другие варианты пробовать. А так даже сервисы импортировать не надо, круто
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
Win Excelent
Спасибо, но я читал это и вникал, и не только этот гайд, но я либо окончательно ослеп, либо я не нашел как получать цвета с темы для своего кастомного компонента если тем несколько, в примерах есть только с одной темой, что и так понятно
пример как получить цвета с темы и как использовать их для своих классов

@mixin theme-card($theme) {
   $foreground-theme: map-get($theme, foreground);
   $background-theme: map-get($theme, background);

   $card-bg: map-get($background-theme, dialog);
   $divider: map-get($foreground-theme, divider);
   $text: map-get($foreground-theme, elevation);

   .home-content {
       background-color: $card-bg;
   }

   .card {
       background-color: $card-bg;

       &__title {
           font-size: $font_size_xl;
           line-height: $font_line_height_xl;
           font-weight: $fw_bold;
           color: $text;
       }
   }
}
источник

PT

Pasha Tytov in Angular - русскоговорящее сообщество
Привет
Есть вопрос  насчет renderer
const div = this.renderer2.createElement('div');
       this.renderer2.appendChild(event.picker.container[0], div);

То так все норм и все работает, но есть ли способ что бы вместо 'div' создавался компонент, то бишь
const timeZone = this.renderer2.createElement('app-component-timezone');
       this.renderer2.appendChild(event.picker.container[0], timeZone);

Возможно ли так сделать?
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
JSON Jenny 💖
пример как получить цвета с темы и как использовать их для своих классов

@mixin theme-card($theme) {
   $foreground-theme: map-get($theme, foreground);
   $background-theme: map-get($theme, background);

   $card-bg: map-get($background-theme, dialog);
   $divider: map-get($foreground-theme, divider);
   $text: map-get($foreground-theme, elevation);

   .home-content {
       background-color: $card-bg;
   }

   .card {
       background-color: $card-bg;

       &__title {
           font-size: $font_size_xl;
           line-height: $font_line_height_xl;
           font-weight: $fw_bold;
           color: $text;
       }
   }
}
точно так же можно перебивать какие-то стили материала без всяких !important
источник

nt

nur tlek in Angular - русскоговорящее сообщество
Pasha Tytov
Привет
Есть вопрос  насчет renderer
const div = this.renderer2.createElement('div');
       this.renderer2.appendChild(event.picker.container[0], div);

То так все норм и все работает, но есть ли способ что бы вместо 'div' создавался компонент, то бишь
const timeZone = this.renderer2.createElement('app-component-timezone');
       this.renderer2.appendChild(event.picker.container[0], timeZone);

Возможно ли так сделать?
angular elements
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
Pasha Tytov
Привет
Есть вопрос  насчет renderer
const div = this.renderer2.createElement('div');
       this.renderer2.appendChild(event.picker.container[0], div);

То так все норм и все работает, но есть ли способ что бы вместо 'div' создавался компонент, то бишь
const timeZone = this.renderer2.createElement('app-component-timezone');
       this.renderer2.appendChild(event.picker.container[0], timeZone);

Возможно ли так сделать?
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
JSON Jenny 💖
пример как получить цвета с темы и как использовать их для своих классов

@mixin theme-card($theme) {
   $foreground-theme: map-get($theme, foreground);
   $background-theme: map-get($theme, background);

   $card-bg: map-get($background-theme, dialog);
   $divider: map-get($foreground-theme, divider);
   $text: map-get($foreground-theme, elevation);

   .home-content {
       background-color: $card-bg;
   }

   .card {
       background-color: $card-bg;

       &__title {
           font-size: $font_size_xl;
           line-height: $font_line_height_xl;
           font-weight: $fw_bold;
           color: $text;
       }
   }
}
Спасибо, мне вот единственное не понятно, получается я должен инклюдить данный миксин в файл со стилями (themes.scss), где я определяю светлую и темную тему, и так для каждого компонента выходит
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
И ещё у меня ошибка в таком случае вываливается, что данный scss уже загружен
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
Я сейчас просто в корневом div меняю класс у которого устанавливается глобально тема, меняю с помощью js естественно [ngClass], все кнопки материальные и прочие компоненты которые привязаны к теме через атрибут color успешно подхватывают цвета
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
Win Excelent
Спасибо, мне вот единственное не понятно, получается я должен инклюдить данный миксин в файл со стилями (themes.scss), где я определяю светлую и темную тему, и так для каждого компонента выходит
смотри как работают темы. ты инклюдишь эти миксины под каким-то глобальным классом. Ставишь его например на app-root или даже на body и меняешь потом.
Да, тебе его надо инклюдить в каждую тему(именно так работает
@include mat-theme($my-theme)


Любые переопределения стандартных материал миксинов должны идти после этого
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
Win Excelent
Спасибо, мне вот единственное не понятно, получается я должен инклюдить данный миксин в файл со стилями (themes.scss), где я определяю светлую и темную тему, и так для каждого компонента выходит
да, можно сделать миксин из миксинов, опять же вот этот mat-theme вроде делает это самое. Можно подглядеть в исходниках
источник

PT

Pasha Tytov in Angular - русскоговорящее сообщество
const timeZone = this.componentFactoryResolver.resolveComponentFactory(DefaultTimezoneComponent);
       event.picker.container[0].viewContainerRef.createComponent(timeZone);

Это так работает или вообще не так??
источник

J💖

JSON Jenny 💖 in Angular - русскоговорящее сообщество
Win Excelent
И ещё у меня ошибка в таком случае вываливается, что данный scss уже загружен
могут быть проблемы с пересборкой scss. Лучше перезапускать периодически, потому что не всегда он обновляет данные
источник

WE

Win Excelent in Angular - русскоговорящее сообщество
Pasha Tytov
const timeZone = this.componentFactoryResolver.resolveComponentFactory(DefaultTimezoneComponent);
       event.picker.container[0].viewContainerRef.createComponent(timeZone);

Это так работает или вообще не так??
Да
источник

AK

Andrey Koshak in Angular - русскоговорящее сообщество
спасите
источник