Как создать материал angular, используя ТОЛЬКО шестнадцатеричные значения? - PullRequest
0 голосов
/ 04 февраля 2020

Абсолютно каждая демонстрация, которую я видел для создания темы материала angular, включает использование предопределенной цветовой палитры (например, $mat-blue). Я хочу создать тему, начиная исключительно с значений HEX. Как я могу это сделать? (Конечно, я не собираюсь начинать с моих значений HEX и каким-то образом работать в обратном направлении, чтобы найти соответствующий поддон в чрезвычайно ограниченной предопределенной вселенной материала?!)

Вот пример значений HEX, которые я хочу использовать: https://material.io/resources/color/#! /? View.left = 0 & view.right = 1 & primary.color = 2C3E50 & Secondary.color = 95a5a6 & primary.text.color = ffffff & primary.text.color = 000000

Редактировать: для уточнения Я знаю, как создавать собственные темы, используя предопределенные цвета, предоставляемые angular -материалом (например, на основе $primary от $mat-blue), но что я хочу иметь в основе $primary на основе, например, #2C3E50.

1 Ответ

0 голосов
/ 07 февраля 2020

Вот рабочий процесс, на котором я остановился, чтобы максимально приблизиться к тому, чего я хотел достичь.

Прежде всего, убедитесь, что вы знаете свои css основы при попытке их объединения. Если вы не знаете, что это за элементы и их синтаксис (то есть как они переводятся на css):

... затем необходимо сначала прочитать связанная документация. (Они не сложны и не займут много времени.) В конце концов, темы angular - это просто карты карт, поэтому их создание и доступ к их содержимому сводятся к некоторому ноу-хау css. .

В angular материале вы в основном начинаете с трех вариантов цвета, чтобы построить свою тему вокруг: primary, accent и warn. Предположим, вы выбрали три цвета #375a7f, #444444 и #eb0000 соответственно. Go до этого сайта и для каждого цвета назовите палитру (например, darkprimarymap) и введите HEX-цвет в меню следующим образом:

enter image description here

... затем нажмите View Code, выберите Angular 2, затем скопируйте и вставьте код, который вы видите, примерно так:

enter image description here

... в ваш файл тем. Тематический файл «из коробки» выглядит следующим образом:

$app-dark-primary: mat-palette($mat-grey, 700, 300, 900);
$app-dark-accent: mat-palette($mat-blue-grey, 400);
$app-dark-warn: mat-palette($mat-red, 500);

$app-dark-theme: mat-dark-theme($app-dark-primary, $app-dark-accent, $app-dark-warn);

... где mat-palette - это функция, которая принимает вложенные карты формы, которую мы только что скопировали. Поэтому вставьте скопированный код, чтобы создать альтернативные переменные палитры, например:

@import '~@angular/material/theming';

// Create nested scss map
$dark-primary-map: (
  50: #e7ebf0,
  100: #c3ced9,
  200: #9badbf,
  300: #738ca5,
  400: #557392,
  500: #375a7f, // original primary color you built this map around
  600: #315277,
  700: #2a486c,
  800: #233f62,
  900: #162e4f,
  A100: #8bb8ff,
  A200: #5898ff,
  A400: #2579ff,
  A700: #0c69ff,
  contrast: (
    50: #000000,
    100: #000000,
    200: #000000,
    300: #000000,
    400: #ffffff,
    500: #ffffff,
    600: #ffffff,
    700: #ffffff,
    800: #ffffff,
    900: #ffffff,
    A100: #000000,
    A200: #000000,
    A400: #ffffff,
    A700: #ffffff
  )
);

$dark-accent-map: (
  50: #e9e9e9,
  100: #c7c7c7,
  200: #a2a2a2,
  300: #7c7c7c,
  400: #606060,
  500: #444444, // original accent color you built this map around
  600: #3e3e3e,
  700: #353535,
  800: #2d2d2d,
  900: #1f1f1f,
  A100: #f07a7a,
  A200: #eb4c4c,
  A400: #ff0505,
  A700: #eb0000,
  contrast: (
    50: #000000,
    100: #000000,
    200: #000000,
    300: #ffffff,
    400: #ffffff,
    500: #ffffff,
    600: #ffffff,
    700: #ffffff,
    800: #ffffff,
    900: #ffffff,
    A100: #000000,
    A200: #ffffff,
    A400: #ffffff,
    A700: #ffffff
  )
);

$dark-warn-map: (
  50: #fde0e0,
  100: #f9b3b3,
  200: #f58080,
  300: #f14d4d,
  400: #ee2626,
  500: #eb0000,  // original warn color you built this map around
  600: #e90000,
  700: #e50000,
  800: #e20000,
  900: #dd0000,
  A100: #ffffff,
  A200: #ffd1d1,
  A400: #ff9e9e,
  A700: #ff8585,
  contrast: (
    50: #000000,
    100: #000000,
    200: #000000,
    300: #ffffff,
    400: #ffffff,
    500: #ffffff,
    600: #ffffff,
    700: #ffffff,
    800: #ffffff,
    900: #ffffff,
    A100: #000000,
    A200: #000000,
    A400: #000000,
    A700: #000000
  )
);

// Convert maps into 'palettes'
$dark-primary-palette: mat-palette($dark-primary-map);
$dark-accent-palette: mat-palette($dark-accent-map);
$dark-warn-palette: mat-palette($dark-warn-map);

// Create 'theme' from palettes
$app-dark-theme: mat-dark-theme($dark-primary-palette, $dark-accent-palette, $dark-warn-palette);

Вы, конечно, можете вручную создавать / редактировать эти карты (что может быть разумно, поскольку связанный сайт упрощает c экстраполяцию из вашего одноцветный ввод). Если этот код находится в файле с именем dark-theme.scss, вы затем включаете эту тему в ваше приложение angular с таким синтаксисом в своем основном / глобальном styles.scss файле:

@import '~@angular/material/theming';
@include mat-core();
@import 'themes/dark-theme.scss'; // imports $app-dark-theme

.dark-theme {
  @include angular-material-theme($app-dark-theme);
  @include custom-components-theme($app-dark-theme);
}

Теперь, когда Вы окрашиваете компонент материала с помощью директивы color="primary" на эту тему, он будет окрашен в #375a7f и так далее.

Чтобы извлечь другие цвета из этих палитр для использования в вашем приложении в пользовательских компонентах, вы используете синтаксис такого типа в файле app.component.scss-theme.scss:

@import '~@angular/material/theming';

// Define scss mixin that takes a $theme map and injects its content 
// into css styles; we'll inject our $app-dark-theme here later
@mixin app-component-theme($theme) {
  // Get the primary, secondary and warn palettes 
  // you created back from the active theme using the map-get() function
  $primary: map-get($theme, primary);
  $accent: map-get($theme, accent);
  $warn: map-get($theme, warn);

  // Extract colors from those palettes using the mat-color() function
  // E.g. use the 'darker' input to get the color keyed by '700'
  $color1: mat-color($primary, darker);

  // E.g. use 'A100' to get the color keyed by 'A100' (A = Additional I think)
  $color2: mat-color($primary, A100);

  // E.g. use 'A100-contrast' to get the color keyed by 'A100' within the contrast sub-map
  $color3: mat-color($primary, A100-contrast);

  // Then use these color-value variables as per normal scss. E.g.
  mat-sidenav-container {
      background: $color1;
    mat-toolbar {
      background-color: $color2;
      mat-list{
        background-color: $color3;
      }
    }
  }
}

... и затем включаете все такие темы пользовательских компонентов в ваш основной / глобальный styles.scss файл, например, так:

@import 'component.scss-theme';

// Define custom component themes
@mixin custom-components-theme($theme) {
  @include app-component-theme($theme);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...