feature image

2024年12月7日 | ブログ記事

UnoCSSでやっつけカラーテーマ機能を作る

🎄
この記事はtraP Advent Calendar 2024 7日目の記事です。

前回のtraP Advent Calendarの記事東京を 散歩しよう ~気分転換のアイデアとして~もぜひご覧ください

こんにちは、@d_etteiu8383です。最近は@eyemono.moeとも名乗ってます。本記事では、UnoCSSでの簡易的なカラーテーマ実装についてご紹介します。

結論

実際に実装したコード例を紹介します。

まずuno.config.tsで以下のようなオブジェクトをtheme.colorsに指定します。

そのうえで、--theme-accent-color--theme-ui-colorのcss変数をアプリ側で設定します。
以下はSolidJSでの実装例で、createEffect(ReactにおけるuseEffect)を使って<style>タグの中身を直接書き換えています。

これで、bg-ui-5c-accent-5などのクラスを使って、テーマカラーを使用できるようになります。

解説

やっていること自体はシンプルで、UnoCSSのconfigのtheme.colorに力業で色を並べているだけです。

oklch関数

https://developer.mozilla.org/ja/docs/Web/CSS/color_value/oklch

自由に入力できるvar(--theme-accent-color)から"いい感じに"カラーパレットを生成するために、oklch関数を使っています。oklch関数はOklch色空間上での色相、彩度、明度、透明度を指定して色を生成する関数です。rgbhslと同じように使えます。単にhslを使っても似たことは可能ですが、Oklch色空間を使用すると、異なる色相においても明度と彩度(chroma)が均等に変化するため、より統一感のあるカラーパレットを生成できます。

この辺りの話はいい感じの色を作りたいならOklchを使うといい感じになる | なすびブログカラーパレットのコントラスト比を揃えるのにOKLCHカラースペースが便利だった|よつくらで紹介されていますのでぜひご覧ください。

いい感じの色を作りたいならOklchを使うといい感じになる | なすびブログ
制作過程における躓きや気付きのメモ
カラーパレットのコントラスト比を揃えるのにOKLCHカラースペースが便利だった|よつくら
株式会社アンドパッドでUIデザイナーをしている、よつくらです。 2024年の7月、おそらく3年ぶりにアンドパッドで運用しているデザインシステムの、網羅的なカラーパレットを作成しなおしました。今回、カラーパレットのコントラスト比を揃えるのにOKLCHカラースペースが便利だったので紹介します。 網羅的なカラーパレットのコントラスト比を揃える 前回カラーパレットを作成したとき、1段階目の網羅的なカラーパレットと、2段階目の意味を持ったカラーパレットを作成しました。そのときの学びは下記のnoteにまとまっています。 1段階目の網羅的なカラーパレットについて、色相の異なる色同士で同じコ

本記事で紹介している実装はNostrのクライアントをSolidJSで自作してみた | 東京科学大学デジタル創作同好会traPで紹介しているSNSクライアントでの実装なのですが、こちらではOklchのlとcをほとんどハードコードして、最低限のコントラスト比が保たれるようにしています。このlとcは、Tailwind CSSで使用されているカラーパレットでのl,cの平均値を使用しています。

<alpha-value>/%alpha

UnoCSSのテーマで指定するcolorでは<alpha-value>または%alphaを使用することでアルファ値を指定できます(@unocss/preset-miniを使用している場合)。

これは例えばtheme内のtheme.colors.testrgba(var(--custom), <alpha-value>)と指定すると、classでbg-test/25などと指定した場合にbackground-color: rgba(var(--custom), 0.25)に展開されます。
bg-test bg-op-25などopacityを分けて指定することも可能になります。

この部分の実装はhttps://github.com/unocss/unocss/blob/6cc5f51142f3fd24707c97f0b21b11a634e0871e/packages/rule-utils/src/colors.ts#L41にあります。

ショートハンドを使えるように

実際のコードではuno.config.tstheme.colorを設定する直前に、以下の処理を追加しています。

これにより、bg-ui-500bg-ui-5, bg-ui-4bg-uiのようにショートハンドで指定できるようになります。
なおこの処理は@unocss/preset-miniで行われている処理と同一です(https://github.com/unocss/unocss/blob/6cc5f51142f3fd24707c97f0b21b11a634e0871e/packages/preset-mini/src/_theme/colors.ts#L360-L370)。

感想

UnoCSSは非常に便利なのですが、こういう少しhackyなことをやるには少しドキュメントがまだ足りていないと感じました。UnoCSSで使える記法を調べる際に私はよくGitHubでrepo:unocss/unocss path:/^packages\// hogeを使って実際のコードとテストを見に行って確認しています。
ただ、その分自由度が高いのはとても魅力的だと思います。


最後までお読みいただきありがとうございました。
明日のtraP Advent Calendar 2024の担当者は@nemlos5さん,@MPさんです。

お楽しみに~

d_etteiu8383 icon
この記事を書いた人
d_etteiu8383

グラフィック班とゲーム班とSysAd班所属 いろいろ活動しています

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2023年12月11日
DIGI-CON HACKATHON 2023『Mikage』
toshi00 icon toshi00
2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2024年6月21日
ハッカソン参加記 4班"Slide Center"
Alt--er icon Alt--er
2022年9月26日
競プロしかシラン人間が web アプリ QK Judge を作った話
tqk icon tqk
2024年12月11日
Nixで実行環境のライセンス違反を予防する話
comavius icon comavius
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記