Calendars

Calendar UI components

Calendar UI to view schedule

App.tsx
Calendar.tsx
CalendarDay.tsx
CalendarDayLabel.tsx
CalendarHeader.tsx
CalendarHeaderItem.tsx
CalendarWeek.tsx
types.ts
useCalendar.ts
useCore.ts
import { Box, Button, Flex, Text } from '@chakra-ui/react'
import dayjs from 'dayjs'
import { Calendar } from './Calendar'
import { CalendarDay } from './CalendarDay'
import { CalendarDayLabel } from './CalendarDayLabel'
import { CalendarHeader } from './CalendarHeader'
import { CalendarHeaderItem } from './CalendarHeaderItem'
import { CalendarWeek } from './CalendarWeek'
import { useCalendar } from './useCalendar'

export function App() {
  const { items, headerItems, goToNextMonth, goToPrevMonth, currentDate } =
    useCalendar()

  return (
    <Flex flex={1} flexDirection="column">
      <Flex
        alignItems="center"
        justifyContent="center"
        w={{ base: '100%', md: '50%' }}
        mx="auto"
        h="72px"
        py={4}
      >
        <Button onClick={goToPrevMonth}>Prev</Button>
        <Text
          mx={10}
          flex={{ base: 1, lg: 'none' }}
          w={{ base: 'auto', lg: '140px' }}
          fontWeight="semibold"
          textAlign="center"
        >
          {dayjs(currentDate).format('MMMM YYYY')}
        </Text>
        <Button onClick={goToNextMonth}>Next</Button>
      </Flex>
      <Calendar>
        <CalendarHeader>
          {headerItems.map((h, i) => (
            <CalendarHeaderItem
              key={i}
              isSaturday={h.isSaturday}
              isSunday={h.isSunday}
            >
              {h.weekday}
            </CalendarHeaderItem>
          ))}
        </CalendarHeader>
        <Box>
          {items.map((week, i) => (
            <CalendarWeek key={i}>
              {week.map((day) => (
                <CalendarDay
                  key={day.date}
                  isSunday={day.isSunday}
                  isSaturday={day.isSaturday}
                  isHoliday={day.isHoliday}
                  isDisabled={!day.isThisMonth}
                  isToday={day.isToday}
                >
                  <CalendarDayLabel
                    isSunday={day.isSunday}
                    isSaturday={day.isSaturday}
                    isHoliday={day.isHoliday}
                    isDisabled={!day.isThisMonth}
                  >
                    {day.calendarDate}
                  </CalendarDayLabel>
                </CalendarDay>
              ))}
            </CalendarWeek>
          ))}
        </Box>
      </Calendar>
    </Flex>
  )
}

Calendar UI with infinite scroll

CalendarListItem
CalendarListRow
CalendarMonthPicker
App.tsx
Calendar.tsx
CalendarContent.tsx
CalendarHeader.tsx
CalendarList.tsx
CalendarListHeader.tsx
createProvider.tsx
getCalendarMatrix.ts
isHTMLElement.ts
Provider.tsx
TodayButton.tsx
useCalendarId.ts
import { Flex, Stack } from '@chakra-ui/react'
import { Calendar } from './Calendar'
import { CalendarContent } from './CalendarContent'
import { CalendarHeader } from './CalendarHeader'
import { CalendarList } from './CalendarList'
import { CalendarListHeader } from './CalendarListHeader'
import { CalendarMonthPicker } from './CalendarMonthPicker'
import { TodayButton } from './TodayButton'

export function App() {
  return (
    <Flex flex={1} maxH={{ base: '400px', md: '764px' }}>
      <Calendar>
        <CalendarHeader>
          <Flex flex={1}>
            <CalendarMonthPicker />
          </Flex>
          <Flex ml="auto">
            <Stack spacing={2} direction="row">
              <TodayButton />
            </Stack>
          </Flex>
        </CalendarHeader>
        <CalendarListHeader />
        <CalendarContent>
          <CalendarList />
        </CalendarContent>
      </Calendar>
    </Flex>
  )
}