3 changed files with 107 additions and 172 deletions
@ -0,0 +1,43 @@ |
|||||
|
import { useMemo } from 'react'; |
||||
|
import { motion } from 'framer-motion'; |
||||
|
import { format, addDays, startOfWeek, isSameDay } from 'date-fns'; |
||||
|
|
||||
|
interface WeekHeaderProps { |
||||
|
currentDate: Date; |
||||
|
} |
||||
|
|
||||
|
const WeekHeader = ({ currentDate }: WeekHeaderProps) => { |
||||
|
const weekDays = useMemo(() => { |
||||
|
const start = startOfWeek(currentDate, { weekStartsOn: 0 }); |
||||
|
return Array.from({ length: 7 }, (_, i) => addDays(start, i)); |
||||
|
}, [currentDate]); |
||||
|
|
||||
|
return ( |
||||
|
<div className="flex justify-between px-2 py-3 bg-gradient-to-r from-blue-500 to-purple-500"> |
||||
|
{weekDays.map((day, index) => ( |
||||
|
<motion.div |
||||
|
key={day.toISOString()} |
||||
|
className="flex flex-col items-center flex-1" |
||||
|
initial={false} |
||||
|
animate={{ backgroundColor: 'transparent' }} |
||||
|
transition={{ duration: 0.3 }} |
||||
|
> |
||||
|
<div className={`w-full px-2 py-2 rounded-md flex flex-col items-center gap-1 ${ |
||||
|
isSameDay(day, currentDate) |
||||
|
? 'bg-gradient-to-br from-indigo-600 to-violet-600 text-white' |
||||
|
: 'text-purple-100' |
||||
|
}`}>
|
||||
|
<div className="text-sm font-medium"> |
||||
|
{format(day, 'EEE')} |
||||
|
</div> |
||||
|
<div className="w-8 h-8 rounded-full flex items-center justify-center"> |
||||
|
{format(day, 'd')} |
||||
|
</div> |
||||
|
</div> |
||||
|
</motion.div> |
||||
|
))} |
||||
|
</div> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
export default WeekHeader; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue