Ignite UI for Angular のライト/ダークテーマの設定方法

- 2018/12/23(Sun) 時点の情報に基づいています
- igniteui-angular@7.1.1


Ignite UI for Angular には、非常に柔軟なテーマの仕組みがあります。Material Design になるべく準拠するようにしています。詳細は[こちら](https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/index.html)に載っているのですが、なかなかに読み応えがあり大変です。

ここでは、より簡単にテーマを設定する方法についてご紹介したいと思います。

## 前提条件
Ignite UI for Angular の テーマの仕組みを使うためには `Sass(SCSS)` が使えるようセットアップされている必要があります。

とても参考になる記事を見つけました。[Angular6 で scss を有効にする方法](https://qiita.com/MasanobuAkiba/items/6b825569a1dd090d4efc) を参考に SCSS を有効化してください。

## テーマとパレットの概要
Ignite UI for Angular　には **パレット** と **テーマ** という2大概念があり（本当はもう一つ **スキーマ** があるのですが割愛します）、これを理解しておくと、実装が楽になります。

- **パレット**: 絵の具のパレットのことだと考えてください。[こちら](https://jp.infragistics.com/products/ignite-ui-angular/angular/components/themes/palette.html#%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E8%89%B2)にあるように、基本カラー、サポートカラー、を含む色の `Sass(SCSS) の map` として提供されています。
- **テーマ**: 絵の具を塗るためのキャンバスだと考えてください。`Sass(SCSS) の mixin` として提供されています。

つまり、絵の具をいくつか(パレット)選んで、キャンバス(テーマ)にのせることで、絵を描く（コンポーネントをテーミング）することができる、というわけです。

## ビルトインのテーマとパレット

- パレット
    - [$default-palette](https://github.com/IgniteUI/igniteui-angular/blob/master/projects/igniteui-angular/src/lib/core/styles/themes/_palettes.scss#L48): アクセントカラーがピンクのパレット
    - [$green-palette](https://github.com/IgniteUI/igniteui-angular/blob/master/projects/igniteui-angular/src/lib/core/styles/themes/_palettes.scss#L75): アクセントカラーがグリーンのパレット(それ以外は $default-palette と変わりなし)

- テーマ
    - [igx-light-theme()](https://github.com/IgniteUI/igniteui-angular/blob/master/projects/igniteui-angular/src/lib/core/styles/themes/_index.scss#L269-L287): ライトテーマ（ホワイトボードのようなもの）
    - [igx-dark-theme()](https://github.com/IgniteUI/igniteui-angular/blob/master/projects/igniteui-angular/src/lib/core/styles/themes/_index.scss#L289-L307): ダークテーマ（黒板のようなもの）

上記 2パレット x 2テーマ を使って、4パターンのバリエーションを作ることができます。

#### light-pink
```scss:styles.scss
@import "~igniteui-angular/lib/core/styles/themes/index";

@include igx-core();
@include igx-light-theme($default-palette);
```
[demo](https://stackblitz.com/edit/igx-grid-light-pink-theme)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/ae628c7c-17ca-269d-55c6-b4bae0f391c3.png)


#### light-green
```scss:styles.scss
@import "~igniteui-angular/lib/core/styles/themes/index";

@include igx-core();
@include igx-light-theme($green-palette);
```
[demo](https://stackblitz.com/edit/igx-grid-light-green-theme)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/19960b50-775d-8a8b-1966-82d8b8c3b28f.png)

#### dark-pink
```scss:styles.scss
@import "~igniteui-angular/lib/core/styles/themes/index";

@include igx-core();
@include igx-dark-theme($default-palette);
```
[demo](https://stackblitz.com/edit/igx-grid-dark-pink-theme)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/32155378-70cd-15b9-6cfb-9a7818801f9e.png)

#### dark-green
```scss:styles.scss
@import "~igniteui-angular/lib/core/styles/themes/index";

@include igx-core();
@include igx-dark-theme($green-palette);
```
[demo](https://stackblitz.com/edit/igx-grid-dark-green-theme)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/4ac9b61a-24bd-3fc6-36d0-3d6a13fdac8d.png)

## カスタムパレット
[igx-palette](https://www.infragistics.com/products/ignite-ui-angular/docs/sass/#function-igx-palette) という Sass function を使って、独自のパレットを作ることができます。引数は以下の通りです。最低限 `$primary`、 `$secondary` の2つを指定する必要があります。逆に言えば、2つだけ色を決めれば、あとはよしなにやってくれます。

|変数|デフォルト値|
|---|---|
|$primary|なし。指定必須。|
|$secondary|なし。指定必須。|
|$info|#1377d5|
|$success|#4eb862|
|$warn|#fbb13c|
|$error|#ff134a|
|$grays|#000|

例えば Material Design のサイトにある [The color system](https://material.io/design/color/the-color-system.html#color-theme-creation) と同じ色合いにしたければ、以下のように実装します。

```scss:style.scss
@import "~igniteui-angular/lib/core/styles/themes/index";

$custom-palette: igx-palette(
  $primary: #6002ee,
  $secondary: #03dac6
  // $info: 
  // $success: 
  // $warn: 
  // $error: 
  // $grays: 
);

@include igx-core();
@include igx-light-theme($custom-palette);
```
[demo](https://stackblitz.com/edit/igx-grid-custom-theme)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/2b83afcf-711f-89e7-70fd-1dd18f44ea0b.png)

## まとめ
- ビルトインパレットが用意されているので、ひとまずはそちらを使ってもよいです。
- 自分の好きな色合いを指定したい場合は `igx-palette` を使ってカスタムパレットを作ることができます。
    - `$primary`、 `$secondary`を決めるだけでもそれっぽくなります。
- テーマは、ライトテーマ、ダークテーマから選ぶことができます。

少し前に、[macOS Mojave でダークモードが採用された](https://support.apple.com/en-us/HT208976)ことが話題になりました。また[有機EL時代には「ダークモード」を積極採用すべき──Googleが開発者に呼びかけ](https://japanese.engadget.com/2018/11/09/el-google/)という記事でなどでもダークモードが紹介され、ダークモードが脚光を浴びるようになってきたと思います。

macOS の Excel でもダークモードが実装されるなど、単なるトレンドだけでは終わらない可能性が高いのではないかと考えています。

Web アプリでも、ライトテーマ/ダークテーマの切り替え機能が、当たり前のように求められることになるかもしれません。

これまで見てきたように、Ignite UI for Angular のテーマの仕組みを使えば、とても簡単にライトテーマ/ダークテーマを作ることができるので、ぜひ活用してみてください！

今回はライトテーマ/ダークテーマのどちらか決まった状態でしか、アプリを実行することができませんでした。次回は動的にテーマを切り替える方法を紹介したいと思います。乞うご期待ください。

## Ignite UI for Angular が気になった方はこちら
デモサイトで様々なサンプルを試すことができますので色々試してみてください！
https://jp.infragistics.com/products/ignite-ui-angular/angular/components/grid_virtualization.html