Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Panda CSS と Ark UI ではじめる個人開発
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ikuma-t
May 24, 2024
Programming
3k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Panda CSS と Ark UI ではじめる個人開発
https://aegis.connpass.com/event/317419/
の登壇資料です!
ikuma-t
May 24, 2024
More Decks by ikuma-t
See All by ikuma-t
Querying Design System デザインシステムの意思決定を支える構造検索
ikumatadokoro
1
1.5k
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
1.1k
いまさらのStorybook
ikumatadokoro
0
1k
これで最後にしたい! Astroと立ち向かう 6度目の個人ブログ再開発
ikumatadokoro
6
2.6k
見た目から始める生産性向上
ikumatadokoro
12
6.1k
ぼくが 美容師さんに伝えたかった バンドの話
ikumatadokoro
0
330
Railsアプリをコスパよく読むための環境整備
ikumatadokoro
2
1.4k
HTTPを手で書いて学ぶ ファイルアップロードの仕組み
ikumatadokoro
82
33k
たどころくん1号を支える技術
ikumatadokoro
1
370
Other Decks in Programming
See All in Programming
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
500
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
500
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
270
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.5k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
Flow は今どうなっているか
mizdra
PRO
0
580
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
390
yield再入門 #phpcon
o0h
PRO
0
1.1k
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
Foundation Models frameworkで画像分析
ryodeveloper
1
620
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Building an army of robots
kneath
306
46k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
Making the Leap to Tech Lead
cromwellryan
135
10k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
710
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Everyday Curiosity
cassininazir
0
280
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Color Theory Basics | Prateek | Gurzu
gurzu
0
420
It's Worth the Effort
3n
188
29k
Transcript
Panda CSS と Ark UI で始める個人開発 ikuma-t AegisエンジニアLT交流会
ikuma-t 2 株式会社エンペイで働くエンジニア。 普段のお仕事ではVue.jsやRailsを書いています。 プライベートでは SVG と格闘しています。 もうそろそろエンジニア3年目に入ります。 千葉のどこかに住んでいます。 ikuma-t
ikumatdkr ikuma-t.com
Panda CSS と Ark UI の とりあえずのはじめ方 お話しすること
チーム開発における運用を意識した 両ライブラリの使い方 話さないこと お!言い訳だ!
• 「ドキュメント見るのめんどいから、今回もTailwind CSSでいいか」と思っている人 • Panda CSS / Ark UI を使おうと思っている方
想定する聴者
Panda CSS の概要を掴む
Panda CSS Chakra UI が開発している ゼロランタイム CSS in JS ライブラリ
https://panda-css.com/ 本物のパンダは和歌山でみるのがおすすめ
とりあえずスタイリングしたい 個人開発なので、そこまで考えず
None
None
None
Panda CSS は選択肢が多い😮 これまでの CSS フレームワークのいいとこ取りだから
Panda CSS の 2 つの側面 Styling engine Token generator sea.80
text-button-normal
Panda CSS の 2 つの側面 Styling engine Token generator sea.80
text-button-normal 個人で使う分には まずスタイリング(左側)できればOK
Panda CSS のスタイリング記法 1. Object Literal(Atomic Styles / Shorthand Properties)
2. Template Literals(`css` / `styled`) 3. Patterns 4. Recipes 5. Slot Recipes Panda CSSでスタイリングを行うための記法は以下のとおり。
Object Literal (Atomic Style) • オブジェクトで CSS プロパティを記載する • class
に適用する • 型補完が効く
• オブジェクトで CSS プロパティを記載する • Panda が提供する独自 短縮記法プロパティ (Utilities)を利用する Object
Literal (Shorthand Properties)
Template Literals • テンプレートリテラルで定 義する記法。 • token に対する補完が効 かない、pattern と
recipe が生成されないな どの不足がある。
Patterns • よく使用するレイアウトを 簡単に再利用するための 機能。 • Flex、Divider、...etc • JSXの形式でも使用でき る。
Recipes • 複数のプロパティのセット をひとまとめにしたもの。 • 例えばボタンの形式・サイ ズを定義する • ラフに使うのは Atomic
Recipe(cva)
Slot Recipes • 複数の要素から構成され るコンポーネントの Recipeを定義するため のもの • Compound Pattern
の スタイリングに有効
どれで書くのか?💭
基本は Object Literal(Atomic Style)を使う • Object Literal は Panda CSS
の推奨。過不足なく使える。 ◦ Utilitiesは短縮してかけるが、CSS-in-JS自体が補完を行えるのでそこまで恩恵を感じ ない。通常のCSSプロパティを使った方が移行容易性・保守性は良さそう。 ◦ Template Literal は一部生成されない内容がある。 • ある程度利用パターンが見えている場合(共通のコンポーネント)には、適 宜 Recipes / Slot Recipes も使える。 • Patterns は無秩序にならなそうなら便利に使える。
ラフに規約を設定する 資料のみです
規約を設定する • チーム開発ではないので、すべてをガチガチに固める必要はない • 一方で開発時の迷いやミスを削減するために、選択肢を絞るような規約を 設けることは、個人開発においても効果的。
• panda.config.ts のオプションを指定すると、不要なプロパティや値を生成 しないことができる(補完にも出なくなる)。 • shorthands: ショートハンドプロパティの生成を制限 ◦ 例)backgroundColor は使えるが、bg
が使えなくなる。 • strictPropertyValues:一部のCSSプロパティについて、無効な値の設定 をできないようにする ◦ 例)display: “hoge” はエラー。display: “grid”や”flex”はOK。 使わないプロパティや値 / 無効な値に対する規約
やりすぎな気もするけど、patterns も消せる • panda css には Preset と呼ばれる設定集がある。 • デフォルトでは次の
2 種類の Preset が適用されている。 ◦ @pandacss/preset-base:pattern や 擬似要素を定義している。 ◦ @pandacss/preset-panda: デフォルトのカラーパレットなどを定義している。 • Preset は npm として提供されており、またインターフェースとして Config のオブジェクトを返すだけなので、patterns を省いたオブジェクトで Config を再構成すると、patterns が生成されなくなる。 ◦ https://panda-css.com/docs/customization/presets#which-panda-presets-will -be-included-
デザイントークンを段階的に定義する 意味的なレイヤー 参照レイヤー sea.80 text-button-normal 原始的な値 #0017C1 Primitive / Semantic
な値をそれぞれ指定可能
デザイントークン定義の ためのヘルパー関数 • 色やボーダー、余白など 部分的にトークンを定義 できる。 • defineToken と defineSemanticToken
という二種類のAPIが用 意されている。
作成済みのデザイントークンを参照する(panda studio) Astro製のカタログ。npmで別途 @pandacss/studio を追加する必要がある
Ark UI のコンポーネントを使う
Ark UI Headless UI コンポーネント ライブラリ https://ark-ui.com/
Ark UI は Zag.js で構築されている
Zag.js UIの状態・属性を管理 Ark UI 状態や属性をDOMに注入 Panda CSS スタイル層
Zag.js 有限ステートマシンによる コンポーネントフレームワーク https://zagjs.com/
余談)Zag 用語 • Zag:方向を急激に変えること。Zag.js のアプローチの革新性を示してい る。 • zag it!:「Zag.jsでコンポーネント作ろうぜ!」 •
zagger:Zag.js を使っている人 • zagadat:Zag.js を使ったときの感覚 • zag nation:Zag.js のコミュニティ
Zag.jsをざっくり掴む - State Machine - コンポーネントの状態を State Machine で管理するライブラリ Dialogの場合(簡略版)
closed open open close 薄暗い背景を表示 薄暗い背景を非表示 data-state=”open” data-state=”closed” (共通)適切な aria 属性を付与 状態に応じたdata属性の付与 アクセシビリティの考慮 状態に応じたDOMの変更
Zag.jsをざっくり掴む - Components Anatomy - コンポーネントの構成要素。この単位で属性の付与が行われる。 画像引用元:https://zagjs.com/components/react/dialog
Zag.jsをざっくり掴む - machine と connect - 状態遷移を定義する「machine」とそれを UI に繋ぎこむ「connect」で構成
Zag.jsからArk UIへ zag.jsと同じ粒度でコンポーネントを構成 https://ark-ui.com/docs/react/components/dialog
Zag.js からArk UI へ State Machine Connect Custom Hook HTML
Dialog.Title Dialog.Content Dialog.Description Dialog.Trigger Dialog.CloseTrigger Dialog.Backdrop Dialog
Panda CSS の Slot Recipes を使ってスタイリングする Ark UIのコンポーネントはCompound Patternで構成されている。
Slot Recipes • 複数の要素から構成され るコンポーネントの Recipeを定義するため のもの • Compound Pattern
の スタイリングに有効
補足:slotには @ark-ui/anatomy が便利 • @ark-ui/anatomy には 各コンポーネントの Anatomy が格納されて いる。
• このkeyをとることで、 slotsが簡単に指定でき る。
補足:Atomic Slot Recipes と Config Slot Recipes • slot recipesを構成する方法には、sva(Atomic
Slot Recipes)と、 defineSlotRecipes(Config Slot Recipes)がある。 • 前者のCSSはJust in timeで生成されるため、パフォーマンス的には後者 のほうが優れている。 • デザインシステムなどの共通化が多くある場合は後者を利用する。このと き、Storybookですべてのパターンが生成されないので注意が必要 (staticCSSというオプションで回避できる。)
状態によって変わる部分にスタイリングを当てる • Zag.js経由で各要素に状態に応じたdata属性が付与されているので、こ れをターゲットにスタイルをつける。 • Panda CSSでは、「_」から始まるプロパティがdata属性に変換される (Utilityとして定義のあるもののみ)。 • 例えば「_open」と指定した場合、「&:is([open],
[data-open], [data-state="open"])」に対してスタイリングされる。
Factory を使って共通 コンポーネントを作る • Ark UI には Button や Input
といったコンポーネ ントはない。 • factory を使うと、 asChild が付与されたコ ンポーネントを作れる
おわりに
Panda CSS と Ark UI で始める個人開発 ikuma-t AegisエンジニアLT交流会
Panda CSS と Ark UI で始める個人開発 ikuma-t AegisエンジニアLT交流会
結局 ikuma-t は何を個人開発しているのか? 自動補完で単語帳作成 集めた単語を並べて ... スワイプで理解度チェック
実際に機能としてもだいたい 実装できていたのですが...
なんか飽きてしまった!😉
個人開発は技術を使うよりも モチベーションが大事!(唐突)
ありがとうございました!