Slide 1

Slide 1 text

Tailwind CSSを 本気でカスタマイズする方法 BARフロントえんどう #2 「CSS Library / Framework」@サイボウズ pixiv Inc. Chiaki KUDO / @f_subal 2024.04.19

Slide 2

Slide 2 text

2 自己紹介 ● 2016年4月 ピクシブ株式会社に新卒入社 ● 2018年から pixivFACTORY の開発 ● フロントエンドエンジニア → テックリード → エンジニアリングマネージャ → PdM ● 2020年〜2022年デザインシステムの開発を兼任 ○ 2022年に charcoal として OSS 化 ○ デザインシステムの初期メンバーで、OSS 化 プロジェクトをやった人 ● 2024年に『Tailwind CSS実践入門(#風車本)』 を出版 @f_subal ピクシブ株式会社

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

https://charcoal-web.pixiv.design 5

Slide 6

Slide 6 text

話すこと ● Tailwind CSS は積極的にカスタマイズする前提で使おうという話 ○ 「デフォルトテーマが足りないからしょうがなく」ではない!! ○ デザインシステムを作るフレームワークとして使おう ● デザインシステムを作るために theme.extend 以外にできることの話 ○ プラグインを書く、preset を配る、JavaScript APIを使うなど ○ いろいろできることはある ● 将来の Tailwind CSS のカスタマイズはどうなるかの話 ○ Oxide の話と、v4.0 で予告された config がどうなりそうか 6

Slide 7

Slide 7 text

みなさん tailwind.config.js を カスタマイズしてますか? 7

Slide 8

Slide 8 text

どのようにTailwindをカスタマイズしてるか ● @charcoal-ui/tailwind-config は社内共通の tailwind.config.js を配布している ● これを作るにあたって、Tailwind CSS の以下の機能を使っている ○ theme / theme.extend ○ plugins ○ corePlugins ○ presets ○ JavaScript API などなど… ● これらをそれぞれどのように使っているかを説明します 8

Slide 9

Slide 9 text

9 ● デザイナがFigmaで定義したトークン を一通りthemeに記述する ● そうすると色、スペーシング、角丸 などのクラスが全部できる ● Figma に出てくる色名を適当にタイ ピングすると補完でクラスが出る状 況になる!!! みなさんご存知 config.theme

Slide 10

Slide 10 text

10 1.デザイナーが  Figmaで色名を指定してるのを見る 2. 「VSCodeでsurface3って打ったら その通りのクラスあったわ!!」 超簡単!!!!!!!!

Slide 11

Slide 11 text

11 ● デザインシステムのルールが Tailwind の corePlugin の粒度と一致 しないことがある ● こういうものはプラグインで書く ● ピクシブの場合は leading-trim っ ぽい挙動を伴う typography クラス がそう ● Tailwind 標準の text-〇〇 に加えて 特殊な挙動がある pluginを書く (1)

Slide 12

Slide 12 text

12 ● base, components, utilities の層に 好きなクラスをJSで追加するしくみ ● Tailwind にないユーティリティを追 加する or ユーティリティと併用する 前提のクラスを作る ● charcoal だと utilities として実装し たがこれは addComponents でも良 かったような気はしている… Tailwindにおける プラグイン

Slide 13

Slide 13 text

13 ● charcoal のダークモードは Tailwind CSS のデフォルトのダークモードと 異なる ● dark: を使わず、CSS Variables を 使って表現している ● これもプラグインで表現すると良い ● この場合は addBase で表現する(詳 しくは風車本第7章!) pluginを書く (2)

Slide 14

Slide 14 text

何をプラグインにするかの考え方 ● CSSにない機能を定義するような気持ちで書く(あくまで気持ち) ○ React のコンポーネントよりも、Sass の mixin とかを書くときの気持ちが近い ○ 「ボタン(.btn)」とかよりは「いい感じの文字配置(14px)」みたいな粒度が あってることが多い ■ 「引数を持ったスタイルの抽象」をクラスで表現する感じ ■ addComponents() という名前にだまされるな 14

Slide 15

Slide 15 text

15 ● charcoal では基本的に text-〇〇 よ り前述の typography-〇〇 を推奨し ている ● ということは、line-height を単体で 変更することがあまり推奨されない ● ので lineHeight のクラスを切ってリ リースしたが… ● 正直これはやらなくても良かったな と思っている(ごめん) corePluginsを切る

Slide 16

Slide 16 text

16 ● tailwind.config.js を npm パッケー ジとして配った時に利用側で使える 機能 ● v1.9 以前はなかった(昔は lodash.merge とかで設定ファイルを マージしてた…) ● content など、利用側に固有の設定 を除いて deep merge してくれる presetsとして設定 を配る

Slide 17

Slide 17 text

17 ● charcoal では tailwind.config.js の スナップショットテストを書いてい る ● これは jest 内で PostCSS をビルド すると良い ● クラス一覧を返す API とかは特にな いので 設定ファイルのテス トを書く

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

19 ● Tailwind CSS 公式も Jest の中で PostCSS をビルドしている ● クラス一覧じゃなくて CSS の中身も 見てる ● こういうときは content の raw プ ロパティが非常に便利 ● 「もしこういう html だったら…」を テストするのに使える Tailwind公式はどう テストしてるか

Slide 20

Slide 20 text

これからのTailwind CSSの カスタマイズ 20

Slide 21

Slide 21 text

21 ● config を JS でなく CSS で書ける機 能が作られようとしている ● これを前提に、もともと tailwind.config.js にあった機能を再 実装している ● これを前提した時に presets の概念 がどうなるかはまだよくわからない ● デザイントークンをJSの定数で持っ てるのでどうすべきか様子見 v4.0で起こること x.com/adamwathan/status/1770979061721919598

Slide 22

Slide 22 text

まとめ ● Tailwind CSS は積極的にカスタマイズする前提で使おうという話 ○ 「デフォルトテーマが足りないからしょうがなく」ではない!! ● デザインシステムを作るために theme.extend 以外にできることの話 ○ プラグインを書く、preset を配る、JavaScript APIを使う ● 将来の Tailwind CSS のカスタマイズはどうなるかの話 ○ Oxide の話と、v4.0 で予告された config がどうなりそうか 22

Slide 23

Slide 23 text

Any Questions? 23