ReactのUIライブラリ RadixUIを試してみた

2022.06.13

こんにちは。データアナリティクス事業本部 サービスソリューション部の北川です。

RadixUIについて

Radix Primitivesは、アクセシビリティ、カスタマイズ、および開発者エクスペリエンスに重点を置いた低レベルのUIコンポーネントライブラリです。これらのコンポーネントは、設計システムのベースレイヤーとして使用することも、段階的に採用することもできます。

RadixUIはReactのUIライブラリになります。スタイルの設定がされていないのが特徴で、柔軟性が高く、さまざまなスタイリング方法が使えます。

試してみた

使用方法

RadixUIをインストールします。使用するコンポーネントごとにインストールするのが特徴です。

$ yarn add @radix-ui/"使いたいコンポーネント"@latest -E

使用する際は、コンポーネントをインポートして、それぞれのパーツを組み立てていきます。

import * as Accordion from '@radix-ui/react-accordion';

() => (
  <Accordion.Root>
    <Accordion.Item>
      <Accordion.Header>
        <Accordion.Trigger />
      </Accordion.Header>
      <Accordion.Content />
    </Accordion.Item>
  </Accordion.Root>
);

スタイリング

また、コンポーネントはclassNameをpropsとして受け取ることができるので、そのままcssを当てることができます。

data-state属性を使用すると、コンポーネントの状態によってスタイルを設定することができます。

.accordion-item {
  border-bottom: 1px solid #ccc;
}

.accordion-item[data-state='open'] {
  border-bottom-width: 2px;
}

stitches

stitchesを使用したスタイリング方法。公式のコンポーネントデザイン例では、stitchesが採用されています。

import React from "react";
import { styled } from "@stitches/react";
import { violet, blackA } from "@radix-ui/colors";
import { CheckIcon } from "@radix-ui/react-icons";
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";

const StyledCheckbox = styled(CheckboxPrimitive.Root, {
  all: "unset",
  backgroundColor: "white",
  width: 25,
  height: 25,
  borderRadius: 4,
  display: "flex",
  alignItems: "center",
  justifyContent: "center",
  boxShadow: `0 2px 10px ${blackA.blackA7}`,
  "&:hover": { backgroundColor: violet.violet3 },
  "&:focus": { boxShadow: `0 0 0 2px black` },
});

const StyledIndicator = styled(CheckboxPrimitive.Indicator, {
  color: violet.violet11,
});

export const Checkbox = StyledCheckbox;
export const CheckboxIndicator = StyledIndicator;

const Flex = styled("div", {
  display: "flex",
  justifyContent: "center",
  height: "100vh",
});
const Label = styled("label", {
  fontSize: 15,
  lineHeight: 1,
  userSelect: "none",
});

export const CheckboxDemo = () => (
  <form>
    <Flex css={{ alignItems: "center" }}>
      <Checkbox defaultChecked id="c1">
        <CheckboxIndicator>
          <CheckIcon />
        </CheckboxIndicator>
      </Checkbox>
      <Label css={{ paddingLeft: 15 }} htmlFor="c1">
        Accept terms and conditions.
      </Label>
    </Flex>
  </form>
);

export default CheckboxDemo;

変数に格納したものとexportすることで、デザインが当たったコンポーネントを作成できます。

tailwind.css

tailwind.cssのUIライブラリとしては、headlessUIの採用率が高いイメージがあります。headlessUIでは少し物足りないなというプロジェクトでは、選択肢の一つになると思います。

import React from "react";
import { CheckIcon } from "@radix-ui/react-icons";
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";

export const CheckboxDemo = () => (
  <div className="flex h-screen justify-center items-center">
    <CheckboxPrimitive.Root
      className="border border-blue-500"
      defaultChecked
      id="c1"
    >
      <CheckboxPrimitive.Indicator>
        <CheckIcon />
      </CheckboxPrimitive.Indicator>
    </CheckboxPrimitive.Root>
    <label style={{ paddingLeft: 15 }} htmlFor="c1">
      Accept terms and conditions.
    </label>
  </div>
);

export default CheckboxDemo;

もちろん、特定のライブラリに依存していないため、他にもさまざまなライブラリを使用できます。

まとめ

今回は、RadixUIを使ってみました。自分でスタイリングする分、作業量は増えますが自由度は高いです。独自のデザインでコンポーネントを作成する場面では、選択肢が広く0からスタイリングできるRadixUIは、柔軟性が高くおすすめだと思います。

ではまた。