import { useState } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, Popover, PopoverContent, PopoverTrigger, } from "@godxjp/ui/data-display"; import { Calendar } from "@godxjp/ui/data-entry"; import { Button } from "@godxjp/ui/general"; import { Flex, PageContainer } from "@godxjp/ui/layout"; import { CalendarIcon } from "lucide-react"; import { ja } from "react-day-picker/locale"; import type { DateRange } from "react-day-picker"; /** * Calendar — styled react-day-picker grid for single, multiple, or range * selection. Embed inside a Popover for picker UX; use DatePicker / * `DatePicker range` for form-submittable inputs instead. Composed only from * real @godxjp/ui components. */ export default function Demo() { const [issueDate, setIssueDate] = useState(new Date(2026, 3, 15)); const [range, setRange] = useState({ from: new Date(2026, 3, 1), to: new Date(2026, 3, 30), }); const [ruledRange, setRuledRange] = useState({ from: new Date(2026, 3, 13), to: new Date(2026, 3, 22), }); const [shiftDays, setShiftDays] = useState([ new Date(2026, 3, 6), new Date(2026, 3, 13), new Date(2026, 3, 20), ]); return ( 単一日付選択 (インライン常時表示) mode="single" で日付を選択。フォームに送信が必要な場合は DatePicker を使用する。ja ロケールで曜日・月名を日本語表示。 罫線 (bordered) · 既定で表示 / bordered={"{false}"} で解除 日と日の間に罫線を引くのが既定。線色は --calendar-grid-border-color (既定 --border、 背景に対し約 1.15:1)。表の行やカードの枠と同じ段なので、罫線が枠より濃くなることは ない。選択日・今日・範囲の始点/中間/終点・無効日・前後月の日が 罫線の中でも判別できる。罫線なしの浮いたボタン表示にしたい場合のみ bordered= {"{false}"} を渡す。 範囲選択 · Popover 内 mode="range" でポップオーバー内に配置。DatePicker range はこのパターンにフォーム送信を加えた上位コンポーネント。 年月ドロップダウン (captionLayout="dropdown") 過去の会計期間に素早くジャンプする場合に便利。startMonth / endMonth でナビゲーション範囲を絞る。captionLayout は dropdown-months / dropdown-years で月のみ・年のみのドロップダウンにも切り替え可能。 複数日選択 (mode="multiple") mode="multiple" で個別の複数日を選択 (Date[])。max で選択上限を制限できる。ここでは出勤シフト日を最大 5 日まで選択。showOutsideDays= {"{false}"} で前後月のはみ出し日を非表示にしている。 0 ? `選択日数: ${shiftDays.length} 日` : "出勤日を選択してください" } aria-label="出勤シフトカレンダー" /> フッター操作 (showToday / showClose) showToday で「今日」へジャンプして選択、showClose で onClose を呼ぶ。両方とも既定は off。 setIssueDate(undefined)} aria-label="請求日カレンダー (フッター付き)" /> ); }