ボトムアクションバーBottomActionBarBeta

モバイル画面下部にサマリと主要CTAを固定するアクションバーです。

プレビュー

配車内容の確認

乗車地:渋谷駅前 / 行き先:六本木ヒルズ

車種:JPNタクシー・到着まで約4分

状態: 未確定
見積もり料金¥1,200〜 到着 4分

バーはプレビュー枠の下部に固定されています。

状態とバリエーション

横並び

サマリとCTAを左右に並べる標準形です。

配車内容の確認

乗車地:渋谷駅前 / 行き先:六本木ヒルズ

車種:JPNタクシー・到着まで約4分

状態: 未確定
見積もり料金¥1,200〜 到着 4分

バーはプレビュー枠の下部に固定されています。

CTAを下に積む

主要操作をより強く見せたい時は、料金サマリの下に全幅 CTA を置きます。

配車内容の確認

乗車地:渋谷駅前 / 行き先:六本木ヒルズ

車種:JPNタクシー・到着まで約4分

状態: 未確定
見積もり料金¥1,200〜 到着 4分

バーはプレビュー枠の下部に固定されています。

広い画面で幅を止める

maxWidth を渡すと、バーの背景は画面いっぱいのまま、中身だけが中央で止まります。タブレットや横向きで料金とCTAが左右に離れすぎるのを防ぎます。

見積もり料金¥1,200〜 到着 4分
maxWidth なし=画面いっぱい
見積もり料金¥1,200〜 到着 4分
maxWidth="md"=中央に寄せて幅を止める

プロパティ

表は横にスクロールできます
プロパティ初期値説明
childrenReactNode-左側のサマリです。料金、件数、到着予定など残り幅を取る情報を置きます。
actionsReactNode-右側または下側に置く主要CTAです。ボタン側に実際の onClick を渡します。
stackbooleanfalseCTA をサマリの下に全幅で積みます。
stickybooleantrueスクロールコンテナの下部に固定します。
maxWidth"sm" | "md" | "lg" | "xl"-広い画面で内側コンテンツを中央寄せし、幅上限を付けます。

使い方

import * as React from "react";
import { Badge, BottomActionBar, Button, Label, Switch } from "@gunjo/ui";

export function RideBottomActionBar() {
  const [stack, setStack] = React.useState(false);
  const [called, setCalled] = React.useState(false);

  return (
    <div className="flex w-full max-w-sm flex-col gap-3">
      <div className="flex items-center gap-2">
        <Switch id="ride-stack" checked={stack} onCheckedChange={setStack} />
        <Label htmlFor="ride-stack" className="text-xs">stack(料金の下にCTAを全幅で配置)</Label>
      </div>

      <div className="relative h-72 overflow-hidden rounded-xl border bg-muted/30">
        <div className={stack ? "h-full overflow-y-auto px-4 pb-36 pt-4 text-sm text-muted-foreground" : "h-full overflow-y-auto px-4 pb-28 pt-4 text-sm text-muted-foreground"}>
          <p className="font-medium text-foreground">配車内容の確認</p>
          <p className="mt-1">乗車地:渋谷駅前 / 行き先:六本木ヒルズ</p>
          <p className="mt-3">車種:JPNタクシー・到着まで約4分</p>
          <div className="mt-20 rounded-md border bg-background p-3 text-xs">
            状態: {called ? "配車依頼中" : "未確定"}
          </div>
        </div>

        <BottomActionBar
          className="absolute inset-x-0"
          stack={stack}
          actions={
            <Button size="lg" onClick={() => setCalled((current) => !current)}>
              {called ? "配車をキャンセル" : "この内容で呼ぶ"}
            </Button>
          }
        >
          <div className="flex flex-col">
            <span className="text-xs text-muted-foreground">見積もり料金</span>
            <span className="text-base font-semibold tabular-nums text-foreground">
              ¥1,200〜 <Badge variant="info" className="ml-1 align-middle">到着 4分</Badge>
            </span>
          </div>
        </BottomActionBar>
      </div>

      <p className="text-xs text-muted-foreground">バーはプレビュー枠の下部に固定されています。</p>
    </div>
  );
}

使用コンポーネント