マイグレーション

v1.xからv2.xの新しい機能と改善点。

新しい機能

セットアップ

CLIを使用すると、プロジェクトでYamada UIのセットアップを簡単に行うことができるようになりました。

pnpm 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

名前空間インポート

名前空間を使用してコンポーネントをインポートすることができるようになりました。

<Accordion.Root>
  <Accordion.Item>
    <Accordion.Button />
    <Accordion.Panel />
  </Accordion.Item>
</Accordion.Root>

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をご覧ください。

テーマ

  • テーマのトークンに新しくkeyframesaspectRatioseasingsdurationsを追加しました。
  • カラースキーム"mono"を追加しました。
  • レイヤースタイルに新しいトークンを追加しました。
  • テキストスタイルに新しいトークンを追加しました。
  • カラーに新しいトークンを追加しました。
  • コンポーネントのスタイルオブジェクトでclassNameを設定できるようになりました。

改善点

styled

uiからstyledに名前を変更しました。また、これまではコンポーネントのベーススタイルしか設定することができませんでしたが、これからはvariantssizesなど条件に応じたスタイルも設定することができるようになりました。

以前

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として設定されていました。colorSchemeStyle Propsに統合させたことにより、コンポーネント以外でも使用できるようになりました。

<Box colorScheme="blue" bg="colorScheme.solid" color="colorScheme.contrast" />

また、colorSchemeCSSカスタムプロパティを使用してコンテキストを生成するため、配下の要素にも適用されるようになりました。

<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ですべての真偽型(isOpenisDisabledなど)のプロパティの命名規則を変更しました。例えば、isOpenopenに変更されています。

Style Props

  • color-mixがサポートされていないブラウザの場合、フォールバック値が適用されるようになりました。
  • blurbrightnessなど、filter="auto"を設定しなくても適用されるようになりました。
  • backdropBlurbackdropBrightnessなど、backdropFilter="auto"を設定しなくても適用されるようになりました。
  • translateXskewXなど、transform="auto"またはtransform="auto-3d"を設定しなくても適用されるようになりました。

テーマ

  • トークンにCSS値関数を使用することができるようになりました。
  • トークンにインターポレーションを使用することができるようになりました。
  • テーマを定義する場合は、defineThemeを使用してください。
  • 各トークンを定義する場合は、defineTokensを使用してください。
  • 各セマンティックトークンを定義する場合は、defineSemanticTokensを使用してください。
  • 各スタイルを定義する場合は、defineStylesを使用してください。
  • コンフィグを定義する場合は、defineConfigを使用してください。
  • コンポーネントのスロット名を調整・変更しました。
  • グローバルスタイルを調整しました。
  • リセットスタイルを調整しました。
  • 各トークンの値を調整しました。

削除された機能

パッケージ

ツリーシェイキングの兼ね合いで各パッケージに分けるアプローチが不要になったこと、今後のYamada UIのプロジェクトでReact以外の選択肢が広がる可能性があることから、これらのパッケージは非推奨になりました。

Style Props

  • fallbackを削除しました。
  • keyframesを削除しました。代わりに、_keyframesを使用してください。
  • isTruncatedを削除しました。代わりにtruncatedを使用してください。

テーマ

  • transitionsを削除しました。代わりに、easingsdurationsを使用してください。
  • semanticsを削除しました。代わりにsemanticTokensを使用してください。
  • componentsを削除しました。コンポーネントをスタイリングする場合は、CLIを使用してください。
  • extendBaseThemeを削除しました。代わりに、extendThemeを使用してください。
  • extendStyleを削除しました。代わりに、extendThemeを使用してください。
  • extendTokenを削除しました。代わりに、extendThemeを使用してください。
  • extendComponentを削除しました。
  • extendComponentSizeを削除しました。
  • extendComponentVariantを削除しました。
  • extendComponentDefaultPropsを削除しました。
  • withDefaultSizeを削除しました。
  • withDefaultVariantを削除しました。
  • withDefaultColorSchemeを削除しました。
  • withDefaultPropsを削除しました。
  • generateを削除しました。

その他

  • forwardRefを削除しました。代わりに、ReactforwardRefを使用してください。
  • memoを削除しました。代わりに、Reactmemoを使用してください。
  • 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を削除しました。代わりに、Autocompletemultipleを使用してください。

MultiDatePicker

MultiDatePickerを削除しました。代わりに、DatePickermultipleを使用してください。

RangeDatePicker

RangeDatePickerを削除しました。代わりに、DatePickerrangeを使用してください。

MultiSelect

MultiSelectを削除しました。代わりに、Selectmultipleを使用してください。

YearPicker

YearPickerを削除しました。

MonthPicker

MonthPickerを削除しました。

RangeSlider

RangeSliderを削除しました。代わりに、SlidervalueまたはdefaultValueに配列を設定してください。

Markdown

Markdownを削除しました。

Stepper

Stepperを削除しました。代わりに、Stepsを使用してください。

Divider

Dividerを削除しました。代わりに、Separatorを使用してください。

PagingTable

PagingTableを削除しました。代わりに、TableenablePaginationを使用してください。

移行が完了していないコンポーネント

v2.0では、以下のコンポーネントの移行が完了していません。これらの移行は、v2.0.xで行われる予定です。

追加されたフック

useCounter

useCounterを追加しました。

useDescendants

useDescendantsを追加しました。

useEyeDropper

useEyeDropperを追加しました。

useFocusOnShow

useFocusOnShowを追加しました。

useFormatDateTime

useFormatDateTimeを追加しました。

useOnline

useOnlineを追加しました。

削除されたフック

useToken

useTokenを削除しました。