Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Bulletproof Design System with TypeScript
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
takanorip
May 23, 2025
Design
5.4k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Bulletproof Design System with TypeScript
takanorip
May 23, 2025
More Decks by takanorip
See All by takanorip
今さら理解するウェブフォントver.2026
takanorip
3
690
AI-Slopなデザインを生まないためのデザインプロセス戦略
takanorip
10
6.2k
「見せる」登壇資料デザインの極意
takanorip
7
1.8k
Design System Documentation Tooling 2025
takanorip
3
3.1k
デザインエンジニアの延長にデザインマネージャーとしての可能性を探る
takanorip
1
1.4k
Tools for Design Engineers other than LLM in the LLM era
takanorip
1
910
Eleventy3.0 で始める爆速個人ブログ開発!
takanorip
0
320
Webフォント選定の極意!フォントの基本から最新トレンドまで徹底解説
takanorip
6
1.2k
効果的な管理画面を デザインをするために 避けるべき5つの罠
takanorip
15
8k
Other Decks in Design
See All in Design
デザインワークフローの最前線。 ログラスでのAI活用の現在地
ukaoli
1
3.4k
分散するデザイン組織をつなぐ デザインミートアップの取り組み/nikkei-tech-talk49
nikkei_engineer_recruiting
1
340
Starfall (2025)
rezaline
0
160
【Designship2026】「社内受託中心部署」から、事業とカルチャーを動かすデザイン組織へ
sugiyama_sukedachi
0
130
[Unity] VAT×VFX Graphがいま個人的にアツイという話
sakiyama
0
120
デザイナーの判断をAIにつなぐ ── 審美眼をハーネスする試み
kotasaito_cnt
0
1.2k
ポートフォリオ_あやの
ngyenmazt1412
0
1.9k
ISO 9241-171:2025っていうのがあってな
shosira
1
320
凡庸を落とすハーネス
hiromimaeo
2
970
「惜しいデザイン」 を生み出さないための AIレビューループ
0b1tk
3
4.6k
デザインハーネスをつくるハーネス|誰でも自社らしいデザインをつくれるようにする仕組み
katakai
0
1.3k
2026/8/20 Polaris15周年イベント 『共創の場をつくる』 〜 誰もが『心地よく暮らし、心地よくはたらく』ことを選択できる社会へ 〜 関係性から地域をつくりなおす共創の土壌づくり〜リビングラボの事例を通じて〜
a2k
0
100
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Git: the NoSQL Database
bkeepers
PRO
433
67k
Chasing Engaging Ingredients in Design
codingconduct
0
360
GitHub's CSS Performance
jonrohan
1033
470k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Technical Leadership for Architectural Decision Making
baasie
3
600
Navigating Weather and Climate Data
rabernat
0
550
Being A Developer After 40
akosma
92
590k
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
Bulletproof Design System with TypeScript Bulletproof Design System with TypeScript
takanorip / 2025.05.23
大木尊紀 / takanorip 株式会社カンム - エンジニア・デザイナー UIをエンジニアリングするのが好き。 デジタルを脱出したい。 01
None
None
None
0 デザインシステム概観 1 デザインシステムのルール守られない問題 2 TypeScriptとデザインシステム 3 コンポーネントのProps設計 4 デザイントークンの型定義活用
5 LLMによるドキュメントの自動生成
堅牢なデザインシステム
デザインシステムの定義 ちいデザシス本によると… “「デザインシステム」は一般的に、「デザインの再現性を高め、一貫した 製品体験を効率よく表現すること」を目的に導入される「ドキュメントや リソース群のこと」と説明されます。” 大塚 亜周,稲葉 志奈,金森 悠,samemaru,圓山 伊吹,植田
将基,関口 裕,8chari,後藤 拓也,小木曽 槙一,桝田 草一. ち いさくはじめるデザインシステム (p.5). Kindle 版.
デザインシステム = ルールセット+ドキュメント+実装
デザインシステムが達成したいこと 制約を整えて デザインを再現可能にすること ルールをつくるだけでは再現可能にならない。 ルールが適用されたデザインがルールどおりに実装されることが必要不可欠。
デザインシステムとUIライブラリの違い 「らしさの再現」が 組み込まれているかどうか プロダクトらしいデザインを再現できるようになっているかどうか。 ただコンポーネントを寄せ集めただけでは「らしく」ならない。 ボトムアップとトップダウン、両方の視点が必要
TOP(意思決定が必要) デザイン原則(らしさを定義したもの) ボイス&トーン スタイルガイド コンポーネント デザイントークン BOTTOM(現状の整理)
90%くらいのエンジニアは デザインシステムのルールを守らない (デザイナーも守らないことある)
B デザインシステムのことをよく理解してな3 B ドキュメントを読んでな3 B 面倒だし適当でいいだろと思ってÂ B etc...
堅牢なデザインシステムを 構築したいなら、
人間の善意に頼るのではなく 仕組みでルールを強制する
ルールは守られない前提で 逸脱している箇所を見つけやすくする
ドキュメントを更新し続ける
TypeScriptと デザインシステム
デザインシステム = デザインに制約を加える装置 TypeScript = 実装に制約を加える装置
TypeScript(型定義)で デザインシステムの制約を強制する
TypeScriptがもたらす4つの効果 6 コンポーネントの自由度を適切にコントロールす@ 6 補完やサジェストを活用す@ 6 コンパイルエラーでルール違反を見つけ@ 6 LLMの出力をサポートする
要素ごとに 具体例を紹介していきます
デザイントークンの 型定義活用
Style Dictionaryを活用 typescript/es6-declarations で型定義を出力する export const : export const :
; ; ColorBackgroundGray string ColorBackgroundBlue string これを利用してコンポーネントのPropsなどを自動生成できる
Branded Typesの活用 SpacingとRadiusなど構造が同一だが混同したくないものを区別できる type extends = & in : type
= type extends = extends ? | : export type = export const : < , > { [ ] }; ; < > < , > ; < >; ; Branded T U T key U TokenType DesignToken T T TokenType Branded T DesignTokenSpacing DesignToken DesignTokenSpacing string never string string never SizeSpacingXs 'spacing' 'designToken' 'spacing'
Branded Typesの生成 Style Dictionaryの を利用する registerTransform import from => =>
StyleDictionary ; StyleDictionary. ({ type: , transitive: , name: , : ( , ) {}, : ( ) { }, }); 'style-dictionary' `value` `myTransitiveTransform` registerTransform filter transform true token options token // token.value will be resolved and transformed at this point
VSCode拡張をつくる Style Dictionaryで生成した型を活用してVS Code拡張などのツールを 開発すると一石二鳥 参考W V V デザイントークンを自動補完するVS Code拡張機能を開発しまし
CSS Variables 形式のデザイントークンを補完する VS Code Extension を作 成し生産性を上げる
コンポーネントの Props設計
基本方針 Styleの上書きを許容しない CSSを書かせない 中途半端に上書きさせない。 どうしても変更したい場合は別コンポーネントを作る。 className や styles は受け取らない。 Propsでスタイルをコントロールする。
ubie-ui/Button
StyleをPropsで管理する Chakra UI V2のStyle Propsの考え方を採用。 すべてのCSSに対応する必要はなく、必要があるものだけ対応すれば良い。 // mx = margin
x < = > </ > Box mx Test Box "xxs"
export const : | = ... => return < =
? : ? : ... > </ > < > ({ mx, props }) { ( style {{ : rightKey (rightKey) , : leftKey (leftKey) , }} { } { } BoxComponent ); }; Box FC PropsWithoutText PropsWithTextBody createSpacingVariableFromKey createSpacingVariableFromKey BoxComponent props children '--padding-right' '0' '--padding-left' '0'
CSS VariablesをTemplate Literalで管理する const = : => return export const
= ?: => return ? : as ( ) { DesignTokens radius key path ; }; ( ) { { : radius (radius) , } ; }; createRadiusVariableFromKey Radius join radiusVariables Radius createRadiusVariableFromKey CSSProperties key radius `var(--${ . [ ]. . ('-')})` '--radius' '0'
as Propの活用 type extends = ?: : & export default
function extends = ... : const = as || return ... </ > < . > { ; . ; } . ; < . >({ , , } < >) { ; < { }> : {children} Component ; } BoxProps C React ElementType C React ReactNode React ComponentPropsWithoutRef Box C React ElementType BoxProps C Component rest as children as children rest 'div' 'div' Component BOX
JSDocのDocumentation機能を活用 エディタの機能を活用して アップデートを知らせる
StyleをPropsで管理する Chakra UI V2のStyle Propsの考え方を採用。 すべてのCSSに対応する必要はなく、必要があるものだけ対応すれば良い。 // mx = margin
x < = > </ > Box mx Test Box "xxs"
Figmaとの連携
Figmaをデザイントークンの Single Source of Truthとして扱う デザイントークンは ビジュアルとセットで管理する コード(JSONなど)をSSoTとして扱う風潮もあるが私は懐疑的。 カラーコードを見て色がわかる人がいないと扱えないのでは? Figma(デザインツール)からJSONを生成するほうが認知不可低いと考える。
None
GitHub Actions経由でデザイントークンを書き出す できる限り自動化しておくことでデザイナーでも更新できるようにする Figma REST API の Open API Spec
が公開されているので、 TypeScriptを活用して処理を実装できる https://github.com/figma/rest-api-spec import type from const = await { GetFileResponse } axios. < >(url); result.data '@figma/rest-api-spec' result get GetFileResponse // This has type GetFileResponse
Figma JSON (Design Tokens Format Module) GitHub Actions TypeScript, CSS
Style Dictionary
Figma Variablesは一工夫 Figma VariablesはエンタープライズプランでないとREST API経由での 値取得ができない。 そのためコンポーネントを経由して取得するなどの工夫が必要になる。
Variables Variablesの値を適用したオブジェクトをコンポーネント化 コンポーネントのスタイルからトークンの値を取得
余談:Figma Code Connectには懐疑的 便利な機能であることは間違いないが、Figmaでデザインする段階から Code Connectほど強く実装を意識する必要があるのか、わからない。 Figmaで普通にデザインをつくりLLMを活用して開発する、くらいが ちょうどよいと思っている。
LLMによる ドキュメントの 自動生成
ドキュメントの死 = デザインシステムの死 ドキュメントが更新されなくなると 誰もデザインシステムを使わなくなる どれだけコンポーネントや便利な仕組みが追加されても ドキュメントが更新されなくなったら終わる。
なんでドキュメントが更新されないのか デザインシステムのドキュメントは デザイナーパートとエンジニアパートが 混在しているので運用が難しいから 理想的にはデザインシステム専門の編集者がほしい。 しかし大抵の場合そんな余裕はない。 デザインエンジニアが全部書くことになる。
そうだ!LLMだ! LLMなら 両方の視点から いい感じに ドキュメントを 書くことができそう
コメントやJSDocがLLMの役に立つ デフォルト値や用途を記述しておくといい感じにまとめてくれる。 /** * サイズ * */ @default large size?:
| | ; 'large' 'medium' 'small'
記述するべき内容とWritingStyleを指示する ドキュメントの構成、各セクションに書く内容、だれの視点で書くのか、 などを指示するためのドキュメントを書く contents.md ## Features コンポーネントの概要を記述。 ## Props 各Propsについての解説を記述。
… 参考:個人的 AI Writing のやりかた
コンポーネントと指示書をLLMにわたす ドキュメントを書く対象と指示書を渡す。 普通に間違ったこと書いたりするのでレビューは必須。 @src/components/Button.tsx のドキュメントを書いてください。 FigmaのデザインはこのURL @https://www.figma.com/design/... 執筆スタイルは @rules/writing-rule.md に従ってください。
デザインシステムは monorepo 化したほうが良い? ドキュメント作成における LLM支援を最大化したいなら 1つのリポジトリに集約するべき しかし全てをLLMに学習させることは難しいので 与える情報をコントロールする必要がある。MCP?わからん。
まとめ
まとめ # デザイントークンの型定義を活G # コンポーネントは自由度を下げつつ必要な オプションを用意すh # TypeScriptでType SafeなFigma連È #
ドキュメントをメンテナンスし続ける
Special thank to 腹筋ローラーの力を信じろ @8845musign
ありがとう ございました ありがとう ございました