テーマのオーバーライド

Tailwind v3 パッケージは、すべてのスタイリングに具体的な Tailwind ユーティリティクラス(例: sky-500, slate-100)を使用します。パッケージからエクスポートされるテーマオブジェクトをオーバーライドすることで、外観をカスタマイズできます。

デフォルトテーマ

テーマは、エクスポートされたオブジェクトのセットとして定義されており、それぞれがコンポーネントパーツのクラス名文字列を含んでいます。以下は、デフォルトのカラーパレットの概要です:

役割ライトクラスダーククラス
プライマリsky-500sky-500
プライマリテキストsky-500sky-400
背景whiteslate-950
サーフェスホバーslate-100slate-800
テキストslate-900slate-50
ミュートテキストslate-500slate-400
ボーダーslate-200slate-800
範囲背景sky-50sky-950/50
危険red-500red-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 を使用してデフォルトとマージされるため、競合するユーティリティは正しく解決されます。

プライマリカラーの変更

選択された日と関連する状態の skyviolet に置き換えます:

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>

カスタムテーマオブジェクトの構築

アプリ全体のリブランディングを行うには、すべてのパーツにカスタムクラスを適用するラッパーコンポーネントを作成します:

components/MyDatePicker.tsx
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ベースの日のスタイルすべての日付セルのベースクラス
dayTodayClassNametext-sky-500今日のインジケーター
daySelectedClassNamebg-sky-500 text-white選択された日
dayDisabledClassNameopacity-50無効化された日
dayOutsideClassNametext-slate-500/50月外の日付
dayHighlightedClassNameafter:bg-amber-500ハイライトドット
dayInRangeClassNamebg-sky-50範囲内の日付
dayRangeStartClassNamebg-sky-500 rounded-r-none範囲の開始日
dayRangeEndClassNamebg-sky-500 rounded-l-none範囲の終了日
dayRangeSingleClassNamebg-sky-500単一日範囲
dayHoverRangeClassNamebg-sky-50/50ホバープレビュー範囲
dayHoverTargetClassNamebg-sky-100ホバーエンドポイント
dayFocusedClassNamering-sky-500キーボードフォーカスリング
dayEmptyClassNameinvisible空のセルプレースホルダー

Tailwind の Content パス

カスタムカラークラスでオーバーライドする場合、それらが Tailwind の content パスに含まれていることを確認してください。コンポーネントファイルで定義されたクラスはデフォルトでスキャンされますが、別の設定ファイルで定義した場合は、そのパスも追加してください:

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// テーマ設定が別ファイルにある場合は追加
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

具体的なカラークラスの代わりに、セマンティックトークンベースのテーマ設定(shadcn/ui のような)が必要な場合は、 CSS 変数ベースのセマンティックトークンを使用する Tailwind v4 パッケージ の利用を検討してください。