主題覆寫

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 ...",
// ...
}

使用複合元件覆寫

自訂主題最直接的方法是透過複合元件 API。每個部分都接受一個 className 屬性,它會使用 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>

建立自訂主題物件

若要進行應用程式範圍的品牌重塑,請建立一個包裝元件,將您的自訂類別應用於所有部分:

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 類別屬性

Grid 元件會將與日期相關的 className 屬性向下傳遞到每個 Day 儲存格。以下是可用的覆寫選項:

屬性預設類別模式描述
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 內容路徑

當使用自訂顏色類別覆寫時,請確保它們包含在您的 Tailwind 內容路徑中。預設情況下,定義在您元件檔案中的類別會被掃描,但如果您將它們定義在一個獨立的設定檔中,也需要加入該路徑:

tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/react-date-range-picker-tailwind3/dist/**/*.{js,mjs}",
// Add your theme config if it's in a separate file
"./src/config/date-picker-theme.ts",
],
};
💡 Tip

如果您想要基於語義權杖的主題設定 (像 shadcn/ui),而不是具體的顏色類別,請考慮使用 Tailwind v4 套件,它使用基於 CSS 變數的語義權杖。