テーマのオーバーライド
Tailwind v3 パッケージは、すべてのスタイリングに具体的な Tailwind ユーティリティクラス(例: sky-500, slate-100)を使用します。パッケージからエクスポートされるテーマオブジェクトをオーバーライドすることで、外観をカスタマイズできます。
デフォルトテーマ
テーマは、エクスポートされたオブジェクトのセットとして定義されており、それぞれがコンポーネントパーツのクラス名文字列を含んでいます。以下は、デフォルトのカラーパレットの概要です:
| 役割 | ライトクラス | ダーククラス |
|---|---|---|
| プライマリ | sky-500 | sky-500 |
| プライマリテキスト | sky-500 | sky-400 |
| 背景 | white | slate-950 |
| サーフェスホバー | slate-100 | slate-800 |
| テキスト | slate-900 | slate-50 |
| ミュートテキスト | slate-500 | slate-400 |
| ボーダー | slate-200 | slate-800 |
| 範囲背景 | sky-50 | sky-950/50 |
| 危険 | red-500 | red-600 |
テーマオブジェクトの構造
テーマは複数の名前付きエクスポートに分かれています:
import { rootClassNames, triggerClassNames, headerClassNames, gridClassNames, dayClassNames, footerClassNames, contentClassNames, rangeClassNames, dateTimeClassNames, timePanelClassNames,} from "react-date-range-picker-tailwind3";各オブジェクトには、完全な Tailwind クラス文字列にマッピングされるキーが含まれています。例:
// dayClassNames{ day: "flex items-center justify-center w-9 h-9 mx-[1px] rounded-md transition-colors cursor-pointer hover:bg-slate-100 dark:hover:bg-slate-800 ...", today: "font-bold text-sky-500 dark:text-sky-400", selected: "bg-sky-500 dark:bg-sky-500 text-white font-semibold ...", inRange: "bg-sky-50 dark:bg-sky-950/50 text-slate-900 dark:text-slate-50 rounded-none mx-0 ...", rangeStart: "bg-sky-500 dark:bg-sky-500 text-white rounded-r-none mx-0 ...", rangeEnd: "bg-sky-500 dark:bg-sky-500 text-white rounded-l-none mx-0 ...", // ...}Compound Components を使ったオーバーライド
テーマをカスタマイズする最も簡単な方法は、Compound Component API を使用することです。各パーツは className prop を受け入れ、twMerge を使用してデフォルトとマージされるため、競合するユーティリティは正しく解決されます。
プライマリカラーの変更
選択された日と関連する状態の sky を violet に置き換えます:
import { DatePicker } from "react-date-range-picker-tailwind3";
function VioletPicker() { const [value, setValue] = useState<Date | null>(null);
return ( <DatePicker.Root value={value} onChange={setValue}> <DatePicker.Trigger className="hover:border-violet-500/50 focus-visible:ring-violet-500 focus-visible:border-violet-500" /> <DatePicker.Content> <DatePicker.Header> <DatePicker.PrevButton className="focus-visible:ring-violet-500" /> <DatePicker.Title /> <DatePicker.NextButton className="focus-visible:ring-violet-500" /> </DatePicker.Header> <DatePicker.Grid dayClassName="hover:bg-violet-50 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500" dayTodayClassName="text-violet-500 dark:text-violet-400" daySelectedClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90" dayInRangeClassName="bg-violet-50 dark:bg-violet-950/50 hover:bg-violet-100" dayRangeStartClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90" dayRangeEndClassName="bg-violet-500 dark:bg-violet-500 hover:bg-violet-500/90" dayFocusedClassName="ring-violet-500" /> <DatePicker.Footer> <DatePicker.ClearButton /> <DatePicker.CancelButton /> <DatePicker.ConfirmButton className="bg-violet-500 hover:bg-violet-500/90 focus-visible:ring-violet-500" /> </DatePicker.Footer> </DatePicker.Content> </DatePicker.Root> );}カスタム背景
<DatePicker.Root value={value} onChange={setValue}> <DatePicker.Trigger className="bg-slate-50 dark:bg-slate-900" /> <DatePicker.Content className="bg-slate-50 dark:bg-slate-900">{/* ... */}</DatePicker.Content></DatePicker.Root>カスタムテーマオブジェクトの構築
アプリ全体のリブランディングを行うには、すべてのパーツにカスタムクラスを適用するラッパーコンポーネントを作成します:
import { DatePicker } from "react-date-range-picker-tailwind3";
const myTheme = { trigger: "hover:border-emerald-500/50 focus-visible:ring-emerald-500", dayToday: "text-emerald-500 dark:text-emerald-400", daySelected: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90", dayInRange: "bg-emerald-50 dark:bg-emerald-950/50 hover:bg-emerald-100", dayRangeStart: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90", dayRangeEnd: "bg-emerald-500 dark:bg-emerald-500 hover:bg-emerald-500/90", confirmButton: "bg-emerald-500 hover:bg-emerald-500/90 focus-visible:ring-emerald-500", focusRing: "focus-visible:ring-emerald-500",};
export function MyDatePicker(props) { return ( <DatePicker.Root {...props}> <DatePicker.Trigger className={myTheme.trigger} /> <DatePicker.Content> <DatePicker.Header> <DatePicker.PrevButton className={myTheme.focusRing} /> <DatePicker.Title /> <DatePicker.NextButton className={myTheme.focusRing} /> </DatePicker.Header> <DatePicker.Grid dayTodayClassName={myTheme.dayToday} daySelectedClassName={myTheme.daySelected} dayInRangeClassName={myTheme.dayInRange} dayRangeStartClassName={myTheme.dayRangeStart} dayRangeEndClassName={myTheme.dayRangeEnd} dayFocusedClassName={myTheme.focusRing} /> <DatePicker.Footer> <DatePicker.ClearButton /> <DatePicker.CancelButton /> <DatePicker.ConfirmButton className={myTheme.confirmButton} /> </DatePicker.Footer> </DatePicker.Content> </DatePicker.Root> );}アプリ全体で使用します:
<MyDatePicker value={date} onChange={setDate} />Grid Day クラスの Props
Grid コンポーネントは、日に関連する className props を各 Day セルに渡します。利用可能なオーバーライドは次のとおりです:
| Prop | デフォルトクラスのパターン | 説明 |
|---|---|---|
dayClassName | ベースの日のスタイル | すべての日付セルのベースクラス |
dayTodayClassName | text-sky-500 | 今日のインジケーター |
daySelectedClassName | bg-sky-500 text-white | 選択された日 |
dayDisabledClassName | opacity-50 | 無効化された日 |
dayOutsideClassName | text-slate-500/50 | 月外の日付 |
dayHighlightedClassName | after:bg-amber-500 | ハイライトドット |
dayInRangeClassName | bg-sky-50 | 範囲内の日付 |
dayRangeStartClassName | bg-sky-500 rounded-r-none | 範囲の開始日 |
dayRangeEndClassName | bg-sky-500 rounded-l-none | 範囲の終了日 |
dayRangeSingleClassName | bg-sky-500 | 単一日範囲 |
dayHoverRangeClassName | bg-sky-50/50 | ホバープレビュー範囲 |
dayHoverTargetClassName | bg-sky-100 | ホバーエンドポイント |
dayFocusedClassName | ring-sky-500 | キーボードフォーカスリング |
dayEmptyClassName | invisible | 空のセルプレースホルダー |
Tailwind の Content パス
カスタムカラークラスでオーバーライドする場合、それらが Tailwind の content パスに含まれていることを確認してください。コンポーネントファイルで定義されたクラスはデフォルトでスキャンされますが、別の設定ファイルで定義した場合は、そのパスも追加してください:
module.exports = { content: [ "./src/**/*.{js,ts,jsx,tsx}", "./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}", // テーマ設定が別ファイルにある場合は追加 "./src/config/date-picker-theme.ts", ],};具体的なカラークラスの代わりに、セマンティックトークンベースのテーマ設定(shadcn/ui のような)が必要な場合は、 CSS 変数ベースのセマンティックトークンを使用する Tailwind v4 パッケージ の利用を検討してください。