How to Build a Calendar Component: Claude Code 활용 가이드
build a calendar component: Claude Code 활용. 실용적인 코드 예시와 단계별 가이드를 포함합니다.
カレンダー컴포넌트の需要
予約システム、スケジュール관리、날짜선택など、カレンダーUIは多くの애플리케이션で필요합니다。外部라이브러리に頼ることも할 수 있습니다が、デザインや機能の自由度を求めるなら自作が最適です。Claude Code를 활용하면 柔軟なカレンダー컴포넌트を빠르게구축할 수 있습니다。
月표시カレンダーの基本구현
> date-fns를 사용한月표시カレンダー컴포넌트を作って。
> 月の전환と날짜선택に대응して。
import { useState } from 'react';
import {
startOfMonth, endOfMonth, startOfWeek, endOfWeek,
eachDayOfInterval, format, addMonths, subMonths, isSameMonth, isSameDay, isToday,
} from 'date-fns';
import { ja } from 'date-fns/locale';
interface CalendarProps {
selected?: Date;
onSelect: (date: Date) => void;
events?: { date: Date; title: string }[];
}
function Calendar({ selected, onSelect, events = [] }: CalendarProps) {
const [currentMonth, setCurrentMonth] = useState(new Date());
const monthStart = startOfMonth(currentMonth);
const monthEnd = endOfMonth(currentMonth);
const calendarStart = startOfWeek(monthStart, { locale: ja });
const calendarEnd = endOfWeek(monthEnd, { locale: ja });
const days = eachDayOfInterval({ start: calendarStart, end: calendarEnd });
const weekDays = ['日', '月', '火', '水', '木', '金', '土'];
const getEventsForDay = (day: Date) =>
events.filter((e) => isSameDay(e.date, day));
return (
<div className="w-full max-w-md mx-auto" role="application" aria-label="calendar">
<div className="flex items-center justify-between mb-4">
<button onClick={() => setCurrentMonth(subMonths(currentMonth, 1))} aria-label="前月">
←
</button>
<h2 className="text-lg font-bold" aria-live="polite">
{format(currentMonth, 'yyyy年M月', { locale: ja })}
</h2>
<button onClick={() => setCurrentMonth(addMonths(currentMonth, 1))} aria-label="翌月">
→
</button>
</div>
<div className="grid grid-cols-7 gap-px" role="grid">
{weekDays.map((day) => (
<div key={day} className="text-center text-sm font-medium text-gray-500 py-2" role="columnheader">
{day}
</div>
))}
{days.map((day) => {
const dayEvents = getEventsForDay(day);
const isSelected = selected && isSameDay(day, selected);
const inMonth = isSameMonth(day, currentMonth);
return (
<button
key={day.toISOString()}
onClick={() => onSelect(day)}
role="gridcell"
aria-selected={isSelected}
aria-label={`${format(day, 'M月d日', { locale: ja })}${dayEvents.length > 0 ? ` ${dayEvents.length}件の予定` : ''}`}
className={`p-2 text-center rounded-lg relative ${
!inMonth ? 'text-gray-300' :
isSelected ? 'bg-blue-600 text-white' :
isToday(day) ? 'bg-blue-100 font-bold' :
'hover:bg-gray-100'
}`}
>
{format(day, 'd')}
{dayEvents.length > 0 && (
<span className="absolute bottom-1 left-1/2 -translate-x-1/2 w-1 h-1 rounded-full bg-blue-500" />
)}
</button>
);
})}
</div>
</div>
);
}
날짜範囲선택
> チェックイン・チェックアウト와 같은날짜範囲선택に대응して。
function useDateRange() {
const [range, setRange] = useState<{ start: Date | null; end: Date | null }>({
start: null,
end: null,
});
const handleSelect = (date: Date) => {
if (!range.start || (range.start && range.end)) {
setRange({ start: date, end: null });
} else if (date < range.start) {
setRange({ start: date, end: range.start });
} else {
setRange({ start: range.start, end: date });
}
};
const isInRange = (date: Date) => {
if (!range.start || !range.end) return false;
return date >= range.start && date <= range.end;
};
return { range, handleSelect, isInRange };
}
이벤트표시付きカレンダー
function EventCalendar({ events }: { events: CalendarEvent[] }) {
const [selectedDate, setSelectedDate] = useState<Date>(new Date());
const dayEvents = events.filter((e) => isSameDay(e.date, selectedDate));
return (
<div className="flex gap-4">
<Calendar selected={selectedDate} onSelect={setSelectedDate} events={events} />
<div className="flex-1">
<h3 className="font-bold mb-2">
{format(selectedDate, 'M月d日(E)', { locale: ja })}の予定
</h3>
{dayEvents.length === 0 ? (
<p className="text-gray-500">予定はありません</p>
) : (
<ul className="space-y-2">
{dayEvents.map((event) => (
<li key={event.id} className="p-3 rounded-lg border">
<span className="font-medium">{event.title}</span>
<span className="text-sm text-gray-500 ml-2">
{format(event.date, 'HH:mm')}
</span>
</li>
))}
</ul>
)}
</div>
</div>
);
}
정리
Claude Code를 활용하면 月표시・날짜範囲선택・이벤트표시など、用途に合ったカレンダー컴포넌트を柔軟に구축할 수 있습니다。테이블표시との組み合わせは테이블컴포넌트を、반응형대응は반응형デザイン를 참고하세요.
date-fns의 상세 정보는date-fns공식 사이트를 확인하세요.
#Claude Code
#calendar
#React
#UI
#date-fns
Related Posts
Tips & Tricks
Tips & Tricks
Claude Code 생산성을 3배로 높이는 10가지 팁
Claude Code를 더 효과적으로 활용하는 10가지 실전 팁을 공개합니다. 프롬프트 전략부터 워크플로 단축키까지, 오늘부터 바로 적용해 보세요.
Tips & Tricks
Tips & Tricks
Canvas/WebGL Optimization: Claude Code 활용 가이드
canvas/webgl optimization: Claude Code 활용. 실용적인 팁과 코드 예시를 포함합니다.
Tips & Tricks
Tips & Tricks
Markdown Implementation: Claude Code 활용 가이드
markdown implementation: Claude Code 활용. 실용적인 팁과 코드 예시를 포함합니다.