Foundation
PackagesUIComponentsLayouts

Stack / HStack

垂直・水平方向のレイアウトコンポーネント。gapトークンで近接の原則を体系化する。

いつ使うか

  • 要素を垂直または水平に並べるとき
  • コンポーネント間のスペーシングを一貫させたいとき
  • gap トークンで近接の原則(関連する要素は近づける)を表現するとき

いつ使わないか

  • CSS Grid が必要な2次元レイアウトには使わない
  • 1つの要素しかない場合は不要である

Usage

import { HStack, Stack } from '@bi-shop-it/ui/stack';

<Stack>
  <Heading>タイトル</Heading>
  <Paragraph>本文テキスト</Paragraph>
</Stack>

<HStack>
  <ActionButton label="キャンセル" variant="secondary" />
  <ActionButton label="保存" />
</HStack>

Props

Stack

Propデフォルト説明
gap'xs' | 'sm' | 'md' | 'lg' | 'xl''md'子要素間の間隔
align'start' | 'center' | 'end' | 'stretch' | 'baseline''stretch'交差軸方向の配置
wrapbooleanfalse子要素の折り返しを有効にする
asChildbooleanfalse子要素をルート要素として使用する

HStack

Propデフォルト説明
gap'xs' | 'sm' | 'md' | 'lg' | 'xl''md'子要素間の間隔
align'start' | 'center' | 'end' | 'stretch' | 'baseline''center'交差軸方向の配置
wrapbooleanfalse子要素の折り返しを有効にする
asChildbooleanfalse子要素をルート要素として使用する

gap の使い分け

近接の原則(Gestalt の法則)に基づき、関連度に応じた gap を選択する。

gap用途
xs4px密接な要素ラベルと値、アイコンとテキスト
sm8px同一グループ内の項目フォーム内のチェックボックス群
md16pxコンポーネント間の基本間隔フォームフィールド間、カード内要素
lg24pxセクション内の余白セクション内のブロック間
xl32pxセクション間の区切りページ内の大きなセクション間

状態

基本(Stack)

Item 1
Item 2
Item 3
<Stack>
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</Stack>

Gap 比較

xs (4px)

A
B

sm (8px)

A
B

md (16px)

A
B

lg (24px)

A
B

xl (32px)

A
B
<Stack gap="xs">...</Stack>
<Stack gap="sm">...</Stack>
<Stack gap="md">...</Stack>
<Stack gap="lg">...</Stack>
<Stack gap="xl">...</Stack>

基本(HStack)

Item 1
Item 2
Item 3
<HStack>
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</HStack>

Wrap(折り返し)

タグ1タグ2タグ3タグ4タグ5
<HStack gap="sm" wrap>
  <Tag color="teal" label="タグ1" />
  <Tag color="pink" label="タグ2" />
  <Tag color="lime" label="タグ3" />
  <Tag color="teal" label="タグ4" />
  <Tag color="pink" label="タグ5" />
</HStack>

Align バリエーション

start

A
B

center(デフォルト)

A
B

end

A
B

stretch

A
B

baseline

A
B
<HStack align="start">...</HStack>
<HStack align="center">...</HStack>
<HStack align="end">...</HStack>
<HStack align="stretch">...</HStack>
<HStack align="baseline">...</HStack>

Spacer

Stack / HStack 内で残りのスペースを埋めて要素を押し出すユーティリティコンポーネント。flex-grow: 1 のみを持つ。

いつ使うか

  • HStack 内でタイトルとアクションを左右に分離するとき
  • Stack / HStack 内で要素を端に寄せたいとき

Usage

import { HStack, Spacer } from '@bi-shop-it/ui/stack';

<HStack>
  <p>タイトル</p>
  <Spacer />
  <ActionButton label="アクション" />
</HStack>;

Props

Props は受け付けない。装飾要素であるため aria-hidden="true" が内部で付与される。

デモ

Spacer なしでは要素が左に詰まるが、Spacer ありではボタンが右端に押し出される。

Spacer なし

タイトル

Spacer あり

タイトル

{
  /* Spacer なし — 要素が左に詰まる */
}
<HStack>
  <p>タイトル</p>
  <ActionButton label="アクション" size="sm" />
</HStack>;

{
  /* Spacer あり — ボタンが右端に押し出される */
}
<HStack>
  <p>タイトル</p>
  <Spacer />
  <ActionButton label="アクション" size="sm" />
</HStack>;

アクセシビリティ

コンポーネントが内部で処理すること

  • レイアウト専用のコンポーネントであり、セマンティクスは付与しない(div を使用する)
  • asChild で任意のセマンティック要素(nav, section 等)に差し替え可能である

利用者が対応すること

  • ナビゲーション等のセマンティクスが必要な場合は asChild で適切な要素を指定すること

関連コンポーネント

  • スペーシングトークン — gap の値はスペーシングトークンの推奨値に基づく

On this page