ð§© shadcn/ui ã Base UI ãããã©ã«ãã«å€æŽ â Radix ãšã®éãã»migration(ç§»è¡)æé ã»æ¢åãããžã§ã¯ããžã®åœ±é¿
2026幎7æãshadcn/ui ã® npx init ãããã©ã«ãã§ Base UI ãéžæããããã«ãªã£ããRadix ã¯å»æ¢ããã -b radix ã§ç¶ç¶å©çšã§ãããRadixããBase UIãžã®migration(ç§»è¡)æé ã5ã¹ãããã§æŽç: AIã¹ãã«å°å ¥ããrefã»åã»data-testidã®ç¢ºèªãŸã§ã
npx shadcn init ãå©ããããç¥ããªãéã« Base UI ãå
¥ã£ãŠããããããã€ããïŒââãšæã£ãŠãã°ã远ã£ããã2026幎7æã«ããã©ã«ããå€ãã£ãŠããã
ããŸãäŸåã©ã€ãã©ãªãå€ãã£ãâŠâŠããšæãæ°æã¡ã¯ããããã§ãä»åã¯ãç§»è¡ãæ¥ãå¿ èŠã¯ãªãã
ãªãããã©ã«ããå€ãã£ãã®ã
shadcn/ui ããŒã ã¯æšå¹Žãã npx shadcn create ã§äž¡ã©ã€ãã©ãªãéžã¹ãããã«ããŠããããŠãŒã¶ãŒã«éžã°ããŠãã©ã£ã¡ãéžã°ãããããŒã¿ãåã£ãŠããã
çµæã¯æå¿«ã ã£ããæ°èŠãããžã§ã¯ãã®çŽ 2/3 ã Base UI ãéžæãããBase UI v1.6.0 ã¯é±é 600 äžããŠã³ããŒãã«éããshadcn/ui ããŒã èªèº«ãæ°èŠãããžã§ã¯ãã§ Base UI ã䜿ãå§ãããããŒã¿ãçããåºããã®ã§ãããã©ã«ããå€ãããããã ãã®è©±ãªãã§ãããã
Radix ãš Base UIãäœãéãïŒ
Base UI 㯠Radix ã®éçºããŒã ããæ¬¡ã«äœã£ãã©ã€ãã©ãªãã ãåã人ãã¡ãäœã£ãã®ã§ææ³ã¯è¿ãããèšèšãæŽçãããŠããã
äžçªããããããéãã¯ããã±ãŒãžæ§æãRadix ã¯ã³ã³ããŒãã³ãããšã«ããã±ãŒãžãåãããŠããŠã@radix-ui/react-dialogã@radix-ui/react-dropdown-menu âŠâŠãšäœ¿ããã³ã« package.json ãèšããã§ãããBase UI 㯠@base-ui-components/react ã® 1 ããã±ãŒãžã«å
šéšå
¥ã£ãŠããã
API ãå€ãã£ããRadix ã® asChild ãã¿ãŒã³ã Base UI ã§ã¯ render prop ã«ãªã£ãã
// Radix
<Dialog.Trigger asChild>
<Button>éã</Button>
</Dialog.Trigger>
// Base UI
<Dialog.Trigger render={<Button />}>
éã
</Dialog.Trigger>
æžãæ¹ã¯å€ãããããã£ãŠããããšã¯åããäžèŠå€§ããªå€æŽã«èŠãããã©ãçµæ§ã·ã³ãã«ãªè©±ã ãã¢ã¯ã»ã·ããªãã£å¯Ÿå¿ã®å質ãäž¡è ãšãé«ãã
æ¢åãããžã§ã¯ããã©ãããã°ïŒ
äœãããªããŠããã Radix ã¯å»æ¢ãããªãã
shadcn/ui ããŒã ã¯ãRadix ã¯ä»æ¥ãæ¬çªã§äœ¿ã£ãŠãããç§»è¡ããŠããªãããšæèšããŠãããæ¢åã® Radix ããŒã¹ã®ãããžã§ã¯ãã¯ãã®ãŸãŸåãç¶ããã
ãã ããCI ãã¹ã¯ãªããã§ shadcn init ãèªåå®è¡ããŠããå Žåã¯èŠæ³šæãäœãæå®ããªããšããã©ã«ããå€ãã£ãŠãããRadix ã䜿ãç¶ããããªãæç€ºãå¿
èŠã«ãªã£ãã
# Base UI(æ°ããããã©ã«ã)
npx shadcn init
# ä»ãŸã§éã Radix ã䜿ãããå Žå
npx shadcn init -b radix
CI ã¹ã¯ãªããã« -b radix ã远å ããã ãã1 è¡ã§æžãã
ç§»è¡ãããªã AI ã«ä»»ããŠãã
Base UI ã«åãæ¿ãããå Žåãshadcn/ui ã¯ã³ãŒãã¢ããã§ã¯ãªã AI ã¹ãã«ã§å¯Ÿå¿ããŠããã
pnpm dlx skills add shadcn/ui
ã€ã³ã¹ããŒã«åŸããšãŒãžã§ã³ãã« migrate accordion to base-ui ãšæç€ºããã ããã«ã¹ã¿ãã€ãºããã¯ã©ã¹ãããªã¢ã³ããåŒãç¶ããªããã³ã³ããŒãã³ãåäœã§ç§»è¡ããŠãããã60 以äžã®ã³ã³ããŒãã³ããçŽ 25 åã§ç§»è¡ã§ãããšããå ±åãããã
ã³ãŒãã¢ãããšéã£ãŠåãã§ãã¯ãéããgit å±¥æŽããããã«ä¿ããããæ¥ãã§å šéšç§»è¡ããå¿ èŠã¯ãªããæ°ã«ãªãã³ã³ããŒãã³ããã 1 æ¬ãã€ãã£ãŠã¿ãã®ãçŸå®çã ãšæãã
ä»å远å ãããã³ã³ããŒãã³ã
ãã£ãã UI åããå å®ããã
| ã³ã³ããŒãã³ã | çšé |
|---|---|
MessageScroller | ã¹ã¯ããŒã«åäœãšã¡ãã»ãŒãžç®¡ç |
Message / Bubble | äŒè©± UI ã®åºæ¬èŠçŽ |
Attachment / Marker | ãã¡ã€ã«æ·»ä»ã»æ¢èªããŒã«ãŒ |
CSS ãŠãŒãã£ãªãã£ãšã㊠scroll-fade(ã¹ã¯ããŒã«ç«¯ã®ãã§ãŒã)ãš shimmer(ã¹ããªãŒãã³ã°è¡šç€º)ã远å ãAI ãã£ãã UI ãäœã£ãŠãããªãæŒãããŠããããã
GitHub Registry ã«ã察å¿ãããä»»æã® GitHub ãªããžããªã registry.json ã§ shadcn/ui äºæã³ã³ããŒãã³ããšããŠé
åžã§ããã瀟å
ãã¶ã€ã³ã·ã¹ãã ã npm ã«äžããã«é
åžã§ããââå°å³ã«ãããªã䟿å©ã ãšæãã
render prop ã«åãæ¿ãããšããããšãã
asChild ãã render ã«æ©æ¢°çã«çœ®ãæããã ãã§ã¯ãããŸã«å£ããã
äžçªå€ãã®ã ref ã®åãæž¡ããRadix ã® asChild ã¯åã³ã³ããŒãã³ãã« forwardRef ãããã°èªåã§ã€ãªãã£ãŠããããBase UI ã® render ã¯æž¡ãèŠçŽ èªäœã ref ãåãåããæ§é ã«ãªã£ãŠããå¿
èŠããããèªäœã³ã³ããŒãã³ãã render={<MyButton />} ã®ããã«æž¡ããšãã¯ãªãã¯ã¯éãã®ã«ãã©ãŒã«ã¹ç®¡çã ãåããªãââã¿ãããªå°å³ãªãã°ãèžã¿ãããã
ããäžã€ã¯åãBase UI ã¯ãåå®å
šæ§åªå
掟ããšèšãããã ããã£ãŠãrender ã®åãæž¡ãèŠçŽ ã®propsãšå³å¯ã«åã¿åã£ãŠããå¿
èŠããããRadix ã§ã¯çŽ éãããŠãã埮åŠãªåäžäžèŽããBase UI ã§ã¯ã³ã³ãã€ã«ãšã©ãŒãšããŠè¡šé¢åããããšããããç§»è¡æã«ãšã©ãŒãå¢ããããã©ã€ãã©ãªã®ããã§ã¯ãªãå
ã
ãã£ããºã¬ãèŠããããã«ãªã£ããšæããã»ããããã
ã³ã³ããŒãã³ãåäœã§ç§»è¡ãããšãã¯ããŸã ref ã䜿ã£ãŠããç®æ(ãã©ãŒã«ã¹å¶åŸ¡ã»ã¢ãã¡ãŒã·ã§ã³é£æº)ããæãã€ãããšãåŸåã§æ¥œã«ãªãã
ããã©ã«ããå€ãã£ãã ãã§ãRadix ã¯æ¶ããªããCI ã¹ã¯ãªããã« 1 è¡è¶³ãã°äœãå€ãããªããã
æ°èŠããå§ãããªã Base UI ãçŽ çŽã«éžãã§ãããšæããããã±ãŒãžã 1 ã€ã«ãŸãšãŸã£ãŠããŠãAPI ãæŽçãããŠãããç§»è¡ã AI ã«ä»»ããã°ããããRadix ã Base UI ããã§è¿·ãæéãããèŠããªãããããªãããªã
ããã±ãŒãžã1ã€ã§ãã軜ããªããšã¯éããªã
ããã¯æå€ã ã£ããã@base-ui-components/react ã«å
šéšå
¥ãããšèããšãäŸåããŸãšãŸã£ãŠè»œããªãæ°ãããŠããŸããã§ãå®éã¯éã§ãBase UI å
¬åŒãªããžããªã® Issue #3688 ã§ã¯ãRadix ãšæ¯ã¹ãŠ minified ã§ 20ã30KBãgzipæç®ã§ã+10KBååŸå€§ãããšå ±åãããŠããã
çç±ã¯åçŽã ã1ããã±ãŒãžã«ãŸãšããåãã³ã³ããŒãã³ãåäœã§ã®ããªãŒã·ã§ã€ãã³ã°ã Radix ã»ã©åããªããRadix 㯠@radix-ui/react-dialog ã ãå
¥ããã°ä»ã®ã³ã³ããŒãã³ãã¯äžåãã³ãã«ãããªãããBase UI ã¯ä»ã®ãšãããããŸã§å²ãåããŠããªãã
ãã³ãã«ãµã€ãºã«ã·ãã¢ãªãããžã§ã¯ããªããç§»è¡åã«äžåºŠãã«ãåŸã®ãµã€ãºãèšæž¬ããŠãããã»ãããããã1ããã±ãŒãž=ã·ã³ãã«ãã¯éçºäœéšã®è©±ã§ãã£ãŠãé ä¿¡ãµã€ãºã軜ããªã話ã§ã¯ãªããã ããã
Radixã«ãªãæ©èœã§éžã¶ãšããéžæè¢
ãã³ãã«ãµã€ãºãCIèšå®ã®è©±ã°ããããŠãããã©ãå®ã¯ãBase UIãããªããšç¡çããªã±ãŒã¹ãããã
ComboboxãAutocompleteãNumber Fieldããã®3ã€ã¯Base UIã«ãã£ãŠRadixã«ã¯ãŸã ãªããæ€çŽ¢åè£ä»ãã®å ¥åæ¬ãæ°å€ã¹ãããŒãèªåã§äœã£ãçµéšããã人ãªãããããšæããã©ãããŒããŒãæäœãšARIA屿§ã1ããå®è£ ããã®ã¯å°å³ã«ããã©ãã
æ°èŠãããžã§ã¯ãã§ãã®æã®ã³ã³ããŒãã³ããèŠä»¶ã«å ¥ã£ãŠãããªããããã±ãŒãžæ§æããã³ãã«ãµã€ãºãæ°ã«ãã以åã«Base UIäžæã«ãªããéã«æ¢åRadixãããžã§ã¯ãã§å¿ èŠã«ãªã£ããšãã¯ãããã ãBase UIãéšåå°å ¥ããæãããããå šéšç§»è¡ or äœãããªããã®äºæãããªããŠããã
RadixããBase UIãžã® migration(ç§»è¡)æé ãŸãšã
ãããŸã§ã®è©±ããå®éã«ç§»è¡ãããšãã®é çªã«äžŠã¹çŽããŠãã(2026-07-23远èš)ã
- ãã«ããµã€ãºã®åºæºå€ãåããç§»è¡åã«äžåºŠ
next buildãªãvite buildãªãã§ãã³ãã«ãµã€ãºãèšé²ããŠãããåè¿°ã®éãBase UIã¯gzipã§+10KBååŸå€§ãããªãå ±åãããã®ã§ãã·ãã¢ãªãããžã§ã¯ãã¯å ã«å€æææãæã€ - AIã¹ãã«ãå
¥ããã
pnpm dlx skills add shadcn/uiãã³ãŒãã¢ããã§ã¯ãªããšãŒãžã§ã³ãç§»è¡ãå ¬åŒã«ãŒãã - ã³ã³ããŒãã³ãåäœã§ç§»è¡ãæç€ºããã
migrate accordion to base-uiã®ããã«1æ¬ãã€ãæåã¯refã䜿ã£ãŠããç®æ(ãã©ãŒã«ã¹å¶åŸ¡ã»ã¢ãã¡ãŒã·ã§ã³é£æº)ããçæãããšåŸåãæ¥œã«ãªã - åãšã©ãŒã朰ãã
renderpropã¯æž¡ãèŠçŽ ã®propsãšå³å¯ã«åã¿åãå¿ èŠãããããšã©ãŒãå¢ããããå ã ãã£ããºã¬ãèŠããããã«ãªã£ããšèãã data-testidãæããçŽããæ¬¡ã®ã»ã¯ã·ã§ã³ã®éããasChildãèªåã§åŒãç¶ãã§ãã屿§ã¯render={<Button data-testid="submit" />}ãšæç€ºãèŠã
å šéšäžæ°ã«ãããªãã1ã³ã³ããŒãã³ãã1ã€ç§»ããŠãã¹ããéãã³ãããããããšããå°ãããµã€ã¯ã«ã§åãã®ãã60è¶ ã®ã³ã³ããŒãã³ããçŽ25åã§ç§»è¡ã§ãããšããå ±åã®å®æ ã§ãããã
ãã¹ãã³ãŒãã¯ç¡å·ã§ã¯æžãŸãªã
ç§»è¡äœæ¥ãã³ãŒãåŽã ãã§å®çµãããããšãããšãTesting LibraryãPlaywrightã®ãã¹ããéãã«å£ããã
Radixã®asChildã¯forwardRefãéããŠdata-testidãARIA屿§ãåèŠçŽ ã«ãã®ãŸãŸåŒãç¶ãã§ãããBase UIã®renderã¯æž¡ããèŠçŽ èªäœãpropsãåãåãæ§é ãªã®ã§ãrender={<Button />}ãšæžããã ãã§ã¯data-testidãæ¶ããŠããããšããããrender={<Button data-testid="submit" />}ã®ããã«ããã¹ãçšã®å±æ§ãæç€ºçã«æããçŽãå¿
èŠãããã
getByRoleããŒã¹ã®ã¯ãšãªã¯ARIA屿§ããã®ãŸãŸä¿ãããã®ã§åœ±é¿ãåãã«ããããgetByTestIdã«äŸåããŠãããã¹ãã¹ã€ãŒãã¯ãã³ã³ããŒãã³ãç§»è¡ã®ãã³ã«1ä»¶ãã€èœã¡ããç§»è¡ãé²ããåã«ã察象ã³ã³ããŒãã³ãé
äžã®ãã¹ãã§data-testidã䜿ã£ãŠããç®æãå
ã«æŽãåºããŠãããšãåŸããæ
ãŠãã«æžãã