Vite + React + TypeScript + vanilla-extract κΈ°λ°μΌλ‘ μ μλ μ¬μ¬μ© κ°λ₯ν μΊλ¦°λ λΌμ΄λΈλ¬λ¦¬μ
λλ€.
λ μ§ λ¨μΌ μ ν(DatePicker)κ³Ό λ μ§ λ²μ μ ν(RangePicker)μ μ§μνλ©°, λ€μν 컀μ€ν°λ§μ΄μ§μ΄ κ°λ₯ν©λλ€.
DatePicker β λ¨μΌ λ μ§ μ νRangePicker β λ μ§ λ²μ μ ν (μμμΌ ~ μ’
λ£μΌ)threshold (μ’
λ£μΌ μ΅λ μ ν κ°λ₯μΌ μ ν)locale propμΌλ‘ μ 체 UI μΈμ΄ μ ν κ°λ₯YYYY.MM.DDprops.format μΌλ‘ μνλ ν¬λ§· μ§μ κ°λ₯react-icons/aiμ λ¬λ ₯ μμ΄μ½vanilla-extract κΈ°λ°theme prop μΌλ‘ μ ν μμ/λ°°κ²½/λΌμ΄λκ° μ»€μ€ν°λ§μ΄μ§ κ°λ₯# μ€μΉ
yarn add your-calendar-lib
# λλ
npm install your-calendar-lib
import { DatePicker } from "your-calendar-lib";
export default function App() {
return (
<DatePicker
onChange={(date) => console.log("μ νν λ μ§:", date)}
displayMode="dropdown" // λλ "modal"
monthFormat="ko" // "en" | "ko" | "number"
format="YYYY/MM/DD"
/>
);
}
import { RangePicker } from "your-calendar-lib";
export default function App() {
return (
<RangePicker
onChange={({ startDate, endDate }) =>
console.log("μ νν ꡬκ°:", startDate, endDate)
}
separator="~" // λλ "-"
displayMode="modal"
monthFormat="en"
threshold={30} // μμμΌ κΈ°μ€ μ΅λ 30μΌκΉμ§λ§ μ ν κ°λ₯
/>
);
}
<RangePicker
locale="ja" // μΌλ³Έμ΄
monthFormat="ja"
onChange={({ startDate, endDate }) => console.log(startDate, endDate)}
/>
<DatePicker
locale="zh" // μ€κ΅μ΄
monthFormat="zh"
onChange={(date) => console.log(date)}
/>
theme propμ ν΅ν΄ μ νλ λ μ§ λ° κ΅¬κ°μ μ€νμΌμ λ³κ²½ν μ μμ΅λλ€.
<DatePicker
theme={{
daySelectedBg: "#007bff",
daySelectedColor: "#fff",
daySelectedRadius: "50%",
rangeBg: "#cce5ff",
rangeColor: "#004085",
}}
/>
src/
βββ components/
β βββ Calendar/
β β βββ Calendar.css.ts
β β βββ Calendar.tsx
β β βββ CalendarBody.tsx
β β βββ CalendarHeader.tsx
β β βββ CalendarYearPanel.tsx
β βββ DatePicker/
β β βββ DatePicker.css.ts
β β βββ DatePicker.tsx
β βββ RangePicker/
β β βββ RangePicker.css.ts
β β βββ RangePicker.tsx
βββ hooks/
β βββ useCalendar.ts
β βββ useOutsideClick.ts
β βββ useRangeSelect.ts
βββ types/
β βββ calendar.type.ts
βββ utils/
β βββ date.ts
β βββ format.ts
β βββ helpers.ts
β βββ locale.ts
βββ index.ts # λΌμ΄λΈλ¬λ¦¬ μ§μ
μ
βββ main.tsx # κ°λ°/ν
μ€νΈμ©
βββ App.tsx # ν
μ€νΈ νμ΄μ§
# κ°λ° μλ² μ€ν
yarn dev
# λΉλ
yarn build
# λΉλ κ²°κ³Ό νμΈ (μ: dist/ ν΄λ)