Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜコピペで使うコンポーネント集を利用するのか?

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for mottox2 mottox2
November 18, 2023

 なぜコピペで使うコンポーネント集を利用するのか?

フロントエンドカンファレンス沖縄2023で発表に使用したスライドです。

Avatar for mottox2

mottox2

November 18, 2023
Tweet

More Decks by mottox2

Other Decks in Technology

Transcript

  1. Bootstrap時代 € CSSフレームワークとも呼ばれていた、 SPA普及以前によ く使われていたもG € でかいCSSを読み込んで使う、 グローバ' € カスタマイズはできた!

    € CSS本体をいじってしまうと、 1万行ぐらいあったりする ので、 どこをいじったか分かりにくくなることがあった
  2. React/Vueコンポーネント時代 T MUI、 Chakra等コンポーネントライブラリと言ったら、 多く の人が思い浮かべるものF T npmで配布されるコンポーネントを読み込んで利用するF T テーマ的な概念はあるが、

    細かいカスタマイズは難しいF T 自作コンポーネントとのインタフェースを揃えにくいF T スタイリングライブラリを強制されがち。
  3. コンポーネントライブラリ固有の 知識が多すぎない? スタイルはブラックボックスの中 MUIのサンプル // スタイルはブラックボックスの中、原則props経由で見た目を変更する /* 何も考えずにコンポーネントを作ると、sxPropsが使えない */ import

    from import from import from const = => = = = = = Card ; CardContent ; ArticleCard () ( < > < {{ mt: }}> < > < {{ fontSize: }} >Okinawa</ > </ > </ > { } < /> </ > ); '@mui/material/Card' '@mui/material/CardContent' '@/components/ArticleCard' "text.secondary" "" "margin-top: 16px;" Page sx sx color article style div div Card 4 CardContent Typography 14 Typography CardContent Card ArticleCard
  4. Radix Primitivesのサンプルコード import from import as from import const =

    => = = = = = = = = React ; Tabs ; ; () ( < > < > < > Account </ > < > Password </ > </ > </ > ) 'react' '@radix-ui/react-tabs' './styles.css' "TabsRoot" "tab1" "TabsList" "Manage your account" "TabsTrigger" "tab1" "TabsTrigger" "tab2" * Tabs.Root Tabs.List Tabs.Trigger Tabs.Trigger Tabs.Trigger Tabs.Trigger Tabs.List Tabs.Root Demo className defaultValue className aria-label className value className value
  5. Radix Primitivesのサンプルコード .TabsRoot .TabsList .TabsTrigger { : ; : ;

    : ; : ( ); } { : ; : ; : ( ); } { : ; : ; : ; : ; display flex flex-direction column width 300 box-shadow 0 2 10 var flex-shrink 0 display flex border-bottom 1 solid var font-family inherit background-color white padding 0 20 height 45 px px px px px px --black-a4 --mauve-6 サンプルコードが提供されてるとはいえ このテンションでやるのは大変
  6. shadcn/ui r Radix Primitiveに対し てTailwindのスタ イ ルを当てたコ ンポーネン ト集x r

    イ ン ス トール用のCLIが用意されてい て、 以下のよ うなコ マン ド で依存関係も含めて導入でき るx r `npx shadcn-ui@latest add button r Tailwindのテーマを利用した実装にな っ ている。
  7. shadcn/ui export interface extends typeof ?: const = = ...

    => const = ? : return < = = ... /> . < >, < buttonVariants> { } React. < , >( ({ , , , , }, ) { asChild Slot ( className { ( ({ , , }))} ref {ref} { } ) ButtonProps React ButtonHTMLAttributes HTMLButtonElement VariantProps forwardRef HTMLButtonElement ButtonProps cn asChild className variant size asChild props ref Comp buttonVariants variant size className props boolean Button false Comp "button"
  8. À

  9. À Park UI À Ark UIをベースにスタイルを当てたコンポーネント集i À PandaCSS (React、 Vue、

    Solid) とTailwindを対象にし ているi À(おそらく、 自作コンポーネントライブラリを作るのに向い ている。 )
  10. À 余談: 雰囲気がニュートラルであること À 良い意味で 「らしさ」 がないスタイル、 UIデザインのスター ト地点にしやすv À

    ニュートラルな理6 À スタイルが自由にいじれるから好き勝手変更でき9 À ダークモードなどを考えると自ずとニュートラルにな りがち
  11. なぜ採用したのか? - そもそもの前提条件 ‡ 組織的にReact + TailwindCSSを使うことが多f ‡ ロックインすることは許容していE ‡

    人数は多くないのでUIだけにコストはかけずらf ‡ 対象となるアプリケーションはユーザー向けフロントエン ドと内部向けフロントエンドが存在するサービス
  12. 編集者向け ウェブアプリ寄り フロントエンド x 同じチームで触るとしたら MUIやChakraは避けたF x TailwindとCSS in JSの

    スイッチングコストは結構 でかい (主観) → スタイリングのライブラリ を統一したい
  13. このプロジェクトの行き来はしんどい const = => return = = = () {

    < > < > < >Hello Okinawa</ > < >Hello Okinawa</ > </ > </ > } ChakraPage fontSize mt color Card CardBody Text Text Text Text CardBody Card 'xl' "4" "gray.500" const = => return = = () { < > < > < >Hello Okinawa</ > < >Hello Okinawa</ > </ > </ > } TailwindPage className className Card Card.Body Card.Body Card p p p p "text- xl" "mt-4 text- gray-500"