테마 재정의

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

테마 객체 구조

테마는 여러 개의 기명 내보내기(named exports)로 나뉩니다:

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를 사용하는 것입니다. 각 파트는 twMerge를 사용해 기본값과 병합되는 className prop을 허용하므로, 충돌하는 유틸리티가 올바르게 해결됩니다.

주 색상 변경

선택된 날짜 및 관련 상태에 대해 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>

커스텀 테마 객체 만들기

앱 전체의 리브랜딩을 위해, 모든 파트에 커스텀 클래스를 적용하는 래퍼(wrapper) 컴포넌트를 만드세요:

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 날짜 클래스 Props

Grid 컴포넌트는 날짜 관련 className prop들을 각각의 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 콘텐츠 경로

커스텀 색상 클래스로 재정의할 때, 해당 클래스들이 Tailwind 콘텐츠 경로에 포함되어 있는지 확인하세요. 컴포넌트 파일에 정의된 클래스들은 기본적으로 스캔되지만, 별도의 설정 파일에 정의한 경우 해당 경로도 추가해야 합니다:

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 패키지 사용을 고려해 보세요.