マイグレーション
v1.xからv2.xの新しい機能と改善点。
新しい機能
セットアップ
CLIを使用すると、プロジェクトでYamada UIのセットアップを簡単に行うことができるようになりました。
pnpm yamada-cli init
npm yamada-cli init
yarn yamada-cli init
bun yamada-cli init
initコマンドを実行すると、次のプロンプトが表示されます。
Would you like to use monorepo? (recommended) … No / Yes
What is the path to the monorepo? … ./workspaces/ui
What is the package name? … @workspaces/ui
Would you like your code inside a `src/` directory? … No / Yes
Would you like to use Prettier? … No / Yes
Would you like to use ESLint? … No / Yes
ダウンロード
v2.x以降からは、2つの方法でコンポーネントとフックを提供しています。1つは、CLIからコンポーネントとフックをローカルにダウンロードする新しい方法。もう1つは、モジュールからコンポーネントとフックをインポートする従来通りの方法です。
ソースコードをダウンロードすることにより、コンポーネントやフックの初期値やロジックをカスタマイズすることができ、ロジックなどで不具合があった場合は、直接修正することができます。
pnpm yamada-cli add button
npm yamada-cli add button
yarn yamada-cli add button
bun yamada-cli add button
名前空間インポート
名前空間を使用してコンポーネントをインポートすることができるようになりました。
<Accordion.Root>
<Accordion.Item>
<Accordion.Button />
<Accordion.Panel />
</Accordion.Item>
</Accordion.Root>
Accordionの場合は、AccordionRootに変更されています。createComponent
createComponentを使用すると、バリアントなど条件付きスタイルをサポートするコンポーネントを作成することができます。
const componentStyle = defineComponentStyle({
base: {
/* base style */
},
variants: {
/* variant style */
},
sizes: {
/* size style */
},
props: {
/* props style */
},
compounds: {
/* compound style */
},
defaultProps: {
/* default props */
},
})
type ComponentStyle = typeof componentStyle
export interface ComponentProps
extends HTMLStyledProps<"div">,
ThemeProps<ComponentStyle> {}
const {
component,
ComponentContext,
PropsContext: ComponentPropsContext,
useComponentContext,
usePropsContext: useComponentPropsContext,
withContext,
useComponentProps,
} = createComponent<ComponentProps, ComponentStyle>("component", componentStyle)
export { ComponentPropsContext, useComponentPropsContext }
export const Component = withContext("div")()
mergeProps
mergePropsを使用すると、propsの消失を防ぎながらマージを簡単に行うことができます。従来は、提供されるpropsを配慮しながらコンポーネントを作成する必要がありました。mergePropsを使用すると、提供されるpropsを配慮することなく、コンポーネントの作成に集中することができます。
以前
export const Component: FC<ComponentProps> = ({
ref: forwardedRef,
className,
onClick: onClickProp,
...rest
}) => {
const ref = useRef<HTMLDivElement>(null)
const onClick = useCallback(() => {}, [])
return (
<Component
ref={mergeRefs(forwardedRef, ref)}
onClick={handlerAll(onClickProp, onClick)}
className={[className, "component"].join(" ")}
{...rest}
/>
)
}
以後
export const Component: FC<ComponentProps> = (props) => {
const ref = useRef<HTMLDivElement>(null)
const onClick = useCallback(() => {}, [])
return <Component {...mergeProps(props, { ref, onClick })()} />
}
PropsContext
各コンポーネントが提供しているPropsContextを使用すると、子要素にあるコンポーネントのpropsを一括で設定することができます。
const value = useMemo<BadgeProps>(() => ({ variant: "outline" }), [])
return (
<BadgePropsContext value={value}>
<Badge />
<Badge />
<Badge />
</BadgePropsContext>
)
上記の例では、BadgePropsContextの子要素にあるBadgeは、すべてvariantが"outline"になります。
ポリモーフィズム
従来のasに加えて、asChildを追加しました。asは、コンポーネント自体の要素を変更するに対して、asChildは、コンポーネントの機能やスタイルを子要素に組み込むために使用します。
as
<Box as="button" />
asChild
<Button asChild>
<CustomComponent />
</Button>
カスケードレイヤー
CSSのカスケードレイヤーを使用して、テーマとStyle Propsに優先順位が設定されるようになりました。詳しくは、カスケードレイヤーをご覧ください。
フォーカスリング
Style Propsにフォーカスリングを追加しました。フォーカスリングは、フォーカスされている要素を識別するために使用されるスタイルです。詳しくは、フォーカスリングをご覧ください。
<Box focusRing="outline" />
<Box focusVisibleRing="outline" />
インターポレーション
Style Propsの値で簡単にCSSカスタムプロパティを参照することができるようになりました。詳しくは、インターポレーションをご覧ください。
<Box {...{ "--custom-bg-color": "#1ba14c" }} bg="{custom-bg-color}" />
CSSカスタムプロパティ
Style Propsで簡単にCSSカスタムプロパティを設定できるようになりました。詳しくは、CSSカスタムプロパティをご覧ください。
<Box css={{ "--bg": "#d4d4d4" }} {...{ "--fg": "black" }} />
また、テーマのトークンを参照することができます。
<Box
css={{ "--bg": "colors.bg.contrast" }}
{...{ "--fg": "colors.fg.contrast" }}
/>
CSS値関数
Style Propsの値でCSS値関数を使用する場合に、各関数が対応するテーマのトークンを参照することができるようになりました。詳しくは、CSS値関数をご覧ください。
<Box w="calc(lg / 2)" />
<Box bg="color-mix(red.500, blue.500)" />
アットルール
Style Propsにアットルールが追加されました。詳しくは、アットルールをご覧ください。
<Box _media={[{ type: "print", css: { color: "success" } }]} />
コンテナクエリもサポートしています。
<Box containerType="inline-size" resize="horizontal">
<Box
_container={[{ minW: "320px", maxW: "560px", css: { color: "success" } }]}
/>
</Box>
国際化
アクセシビリティを向上させるため、すべてのコンポーネントで組み込まれている文字列から日付・数値のフォーマットまで、30以上の言語をサポートしました。詳しくは、国際化をご覧ください。
アイコン
新しいアイコンを追加しました。詳しくは、アイコンをご覧ください。
Style Props
新しいCSSプロパティを追加しました。詳しくは、Style Propsをご覧ください。
テーマ
- テーマのトークンに新しくkeyframes・aspectRatios・easings・durationsを追加しました。
- カラースキームに
"mono"を追加しました。 - レイヤースタイルに新しいトークンを追加しました。
- テキストスタイルに新しいトークンを追加しました。
- カラーに新しいトークンを追加しました。
- コンポーネントのスタイルオブジェクトで
classNameを設定できるようになりました。
改善点
styled
uiからstyledに名前を変更しました。また、これまではコンポーネントのベーススタイルしか設定することができませんでしたが、これからはvariantsやsizesなど条件に応じたスタイルも設定することができるようになりました。
以前
const Button = styled("button", {
base: {
alignItems: "center",
appearance: "none",
cursor: "pointer",
display: "inline-flex",
fontWeight: "medium",
justifyContent: "center",
overflow: "hidden",
position: "relative",
rounded: "l2",
transitionDuration: "moderate",
transitionProperty: "common",
userSelect: "none",
verticalAlign: "middle",
whiteSpace: "nowrap",
_readOnly: { layerStyle: "readOnly" },
_disabled: { layerStyle: "disabled" },
},
})
以後
const Button = styled("button", {
base: {
alignItems: "center",
appearance: "none",
cursor: "pointer",
display: "inline-flex",
fontWeight: "medium",
justifyContent: "center",
overflow: "hidden",
position: "relative",
rounded: "l2",
transitionDuration: "moderate",
transitionProperty: "common",
userSelect: "none",
verticalAlign: "middle",
whiteSpace: "nowrap",
_readOnly: { layerStyle: "readOnly" },
_disabled: { layerStyle: "disabled" },
},
variants: {
outline: {
layerStyle: "outline",
_hover: { layerStyle: "outline.hover" },
},
solid: {
layerStyle: "solid",
_hover: { layerStyle: "solid.hover" },
},
subtle: {
layerStyle: "subtle",
_hover: { layerStyle: "subtle.hover" },
},
},
})
条件付きスタイル
条件付きスタイルの設定がより簡素化されました。従来の設定は、引き続き使用できます。
以前
<Box bg="bg.contrast" _hover={{ bg: "success" }} />
以後
<Box bg={{ base: "bg.contrast", _hover: "success" }} />
カラースキーム
以前のカラースキームは、各コンポーネントのpropsとして設定されていました。colorSchemeをStyle Propsに統合させたことにより、コンポーネント以外でも使用できるようになりました。
<Box colorScheme="blue" bg="colorScheme.solid" color="colorScheme.contrast" />
また、colorSchemeはCSSカスタムプロパティを使用してコンテキストを生成するため、配下の要素にも適用されるようになりました。
<Box colorScheme="blue">
<Box bg="colorScheme.solid" color="colorScheme.contrast" />
<Box colorScheme="green" bg="colorScheme.subtle" color="colorScheme.fg" />
</Box>
アニメーション
以前のアニメーションは、useAnimationフックを使用していました。これからは、Style Propsから直接設定することができるようになりました。
以前
const animation = useAnimation({
_keyframes: {
from: { translate: "0 0" },
to: { translate: "100% 0" },
},
duration: "1s",
iterationCount: "infinite",
timingFunction: "linear",
})
return <Box animation={animation} />
以後
<Box
animationDirection="alternate"
animationDuration="1s"
animationIterationCount="infinite"
animationTimingFunction="linear"
_keyframes={{
from: { translate: "0 0" },
to: { translate: "100% 0" },
}}
/>
コンポーネント
- 各コンポーネントのスタイルを調整しました。
- 各コンポーネントのスロット名を調整しました。
- 各コンポーネントのクラス名を調整しました。
- 各コンポーネントのpropsですべての真偽型(
isOpen・isDisabledなど)のプロパティの命名規則を変更しました。例えば、isOpenはopenに変更されています。
Style Props
color-mixがサポートされていないブラウザの場合、フォールバック値が適用されるようになりました。blurやbrightnessなど、filter="auto"を設定しなくても適用されるようになりました。backdropBlurやbackdropBrightnessなど、backdropFilter="auto"を設定しなくても適用されるようになりました。translateXやskewXなど、transform="auto"またはtransform="auto-3d"を設定しなくても適用されるようになりました。
テーマ
- トークンにCSS値関数を使用することができるようになりました。
- トークンにインターポレーションを使用することができるようになりました。
- テーマを定義する場合は、
defineThemeを使用してください。 - 各トークンを定義する場合は、
defineTokensを使用してください。 - 各セマンティックトークンを定義する場合は、
defineSemanticTokensを使用してください。 - 各スタイルを定義する場合は、
defineStylesを使用してください。 - コンフィグを定義する場合は、
defineConfigを使用してください。 - コンポーネントのスロット名を調整・変更しました。
- グローバルスタイルを調整しました。
- リセットスタイルを調整しました。
- 各トークンの値を調整しました。
削除された機能
パッケージ
ツリーシェイキングの兼ね合いで各パッケージに分けるアプローチが不要になったこと、今後のYamada UIのプロジェクトでReact以外の選択肢が広がる可能性があることから、これらのパッケージは非推奨になりました。
- @yamada-ui/inputなど、各コンポーネントのパッケージは非推奨になりました。代わりに、@yamada-ui/reactを使用してください。
- @yamada-ui/use-disclosureなど、各フックのパッケージは非推奨になりました。代わりに、@yamada-ui/reactを使用してください。
- @yamada-ui/providersは非推奨になりました。代わりに、@yamada-ui/reactを使用してください。
- @yamada-ui/themeは非推奨になりました。代わりに、@yamada-ui/reactを使用してください。
- @yamada-ui/theme-toolsは非推奨になりました。代わりに、@yamada-ui/reactを使用してください。
- @yamada-ui/nextは非推奨になりました。
Style Props
fallbackを削除しました。keyframesを削除しました。代わりに、_keyframesを使用してください。isTruncatedを削除しました。代わりにtruncatedを使用してください。
テーマ
transitionsを削除しました。代わりに、easingsとdurationsを使用してください。semanticsを削除しました。代わりにsemanticTokensを使用してください。componentsを削除しました。コンポーネントをスタイリングする場合は、CLIを使用してください。extendBaseThemeを削除しました。代わりに、extendThemeを使用してください。extendStyleを削除しました。代わりに、extendThemeを使用してください。extendTokenを削除しました。代わりに、extendThemeを使用してください。extendComponentを削除しました。extendComponentSizeを削除しました。extendComponentVariantを削除しました。extendComponentDefaultPropsを削除しました。withDefaultSizeを削除しました。withDefaultVariantを削除しました。withDefaultColorSchemeを削除しました。withDefaultPropsを削除しました。generateを削除しました。
その他
forwardRefを削除しました。代わりに、ReactのforwardRefを使用してください。memoを削除しました。代わりに、Reactのmemoを使用してください。uiを削除しました。代わりに、styledを使用してください。sxと__cssを削除しました。代わりに、cssを使用してください。
追加されたコンポーネント
Mark
Markを追加しました。
ClientOnly
ClientOnlyを追加しました。
Format.Datetime
Format.Datetimeを追加しました。
Show
Showを追加しました。
Slot
Slotを追加しました。
Steps
Stepsを追加しました。
Group
Groupを追加しました。
Timeline
Timelineを追加しました。
削除されたコンポーネント
FontAwesomeIcon
FontAwesomeIconを削除しました。
NativeImage
NativeImageを削除しました。代わりに、Imageを使用してください。
Dialog
Dialogを削除しました。代わりに、Modalを使用してください。
ContextMenu
ContextMenuを削除しました。代わりに、Menu.ContextTriggerを使用してください。
FormControl
FormControlを削除しました。代わりに、Fieldを使用してください。
MultiAutocomplete
MultiAutocompleteを削除しました。代わりに、Autocompleteのmultipleを使用してください。
MultiDatePicker
MultiDatePickerを削除しました。代わりに、DatePickerのmultipleを使用してください。
RangeDatePicker
RangeDatePickerを削除しました。代わりに、DatePickerのrangeを使用してください。
MultiSelect
MultiSelectを削除しました。代わりに、Selectのmultipleを使用してください。
YearPicker
YearPickerを削除しました。
MonthPicker
MonthPickerを削除しました。
RangeSlider
RangeSliderを削除しました。代わりに、SliderのvalueまたはdefaultValueに配列を設定してください。
Markdown
Markdownを削除しました。
Stepper
Stepperを削除しました。代わりに、Stepsを使用してください。
Divider
Dividerを削除しました。代わりに、Separatorを使用してください。
PagingTable
PagingTableを削除しました。代わりに、TableのenablePaginationを使用してください。
移行が完了していないコンポーネント
v2.0では、以下のコンポーネントの移行が完了していません。これらの移行は、v2.0.xで行われる予定です。
追加されたフック
useCounter
useCounterを追加しました。
useDescendants
useDescendantsを追加しました。
useEyeDropper
useEyeDropperを追加しました。
useFocusOnShow
useFocusOnShowを追加しました。
useFormatDateTime
useFormatDateTimeを追加しました。
useOnline
useOnlineを追加しました。
削除されたフック
useToken
useTokenを削除しました。