Featuring Design System
Legacy

CoreCalendar

캘린더 컴포넌트

Usage

기본 사용법 (단일 날짜 선택)

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';

const [date, setDate] = useState<Date | null>(null);

<CoreCalendar 
  selected={date} 
  onChange={(date) => setDate(date)} 
  locale="ko" 
/>

월 선택 모드

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';

const [date, setDate] = useState<Date | null>(null);

<CoreCalendar 
  selected={date} 
  onChange={(date) => setDate(date)} 
  locale="ko"
  showMonthYearPicker 
/>

날짜 범위 선택

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';

const [startDate, setStartDate] = useState<Date | null>(null);
const [endDate, setEndDate] = useState<Date | null>(null);

<CoreCalendar
  startDate={startDate}
  endDate={endDate}
  locale="ko"
  selectsRange
  onChange={(dates) => {
    if (dates !== null && Array.isArray(dates)) {
      setStartDate(dates[0]);
      setEndDate(dates[1]);
    }
  }}
/>

월 범위 선택

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';

const [startDate, setStartDate] = useState<Date | null>(null);
const [endDate, setEndDate] = useState<Date | null>(null);

<CoreCalendar
  startDate={startDate}
  endDate={endDate}
  locale="ko"
  selectsRange
  showMonthYearPicker
  monthsShown={2}
  onChange={(dates) => {
    if (dates !== null && Array.isArray(dates)) {
      setStartDate(dates[0]);
      setEndDate(dates[1]);
    }
  }}
/>

커스텀 Input과 함께 사용

import { useState, forwardRef } from 'react';
import { CoreCalendar } from '@featuring-corp/components';
import { CoreTextInput } from '@featuring-corp/components';
import { CoreButton } from '@featuring-corp/components';
import { IconCalendarFilled, IconChevronDownOutline } from '@featuring-corp/icons';

const [startDate, setStartDate] = useState<Date | null>(null);
const [endDate, setEndDate] = useState<Date | null>(null);
const [open, setOpen] = useState(false);

const CustomInput = forwardRef(({ value, onClick }: { value?: string; onClick?: any }, ref: any) => (
  <div
    ref={ref}
    onClick={() => {
      onClick();
      setOpen(!open);
    }}
    style={{ cursor: 'pointer' }}
  >
    <CoreTextInput
      leadingElement={<IconCalendarFilled />}
      trailingElement={<IconChevronDownOutline />}
      width="360px"
      defaultValue={value}
      style={{ cursor: 'pointer' }}
    />
  </div>
));

<CoreCalendar
  startDate={startDate}
  endDate={endDate}
  customInput={<CustomInput />}
  open={open}
  locale="ko"
  selectsRange
  inline={false}
  dateFormat="yyyy.MM.dd"
  monthsShown={2}
  elevation
  onClickOutside={() => {
    setOpen(false);
    setStartDate(null);
    setEndDate(null);
  }}
  onChange={(dates) => {
    if (dates !== null && Array.isArray(dates)) {
      setStartDate(dates[0]);
      setEndDate(dates[1]);
    }
  }}
  actionsChildren={[
    <CoreButton
      key="cancel"
      text="취소"
      buttonType="tertiary"
      onClick={() => {
        setStartDate(null);
        setEndDate(null);
        setOpen(false);
      }}
    />,
    <CoreButton
      key="apply"
      text="확인"
      buttonType="secondary"
      onClick={() => {
        setOpen(false);
        // 선택된 날짜 처리
      }}
    />,
  ]}
/>

제외할 날짜 설정

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';
import { addDays, addMonths } from 'date-fns';

const [date, setDate] = useState<Date | null>(null);
const today = new Date();

// 특정 날짜 제외
const excludeDates = [
  addDays(today, -3), 
  addDays(today, 3), 
  addDays(today, 4)
];

<CoreCalendar 
  selected={date} 
  onChange={(date) => setDate(date)} 
  locale="ko"
  excludeDates={excludeDates}
/>

// 월 선택 모드에서 특정 월 제외
const excludeMonths = [
  addMonths(today, -2), 
  addMonths(today, 2)
];

<CoreCalendar 
  selected={date} 
  onChange={(date) => setDate(date)} 
  locale="ko"
  showMonthYearPicker
  excludeDates={excludeMonths}
/>

여러 달 표시

import { useState } from 'react';
import { CoreCalendar } from '@featuring-corp/components';

const [startDate, setStartDate] = useState<Date | null>(null);
const [endDate, setEndDate] = useState<Date | null>(null);

<CoreCalendar
  startDate={startDate}
  endDate={endDate}
  locale="ko"
  selectsRange
  monthsShown={2}
  onChange={(dates) => {
    if (dates !== null && Array.isArray(dates)) {
      setStartDate(dates[0]);
      setEndDate(dates[1]);
    }
  }}
/>

Props

DatePickerProps 타입을 확장한 컴포넌트입니다.

Prop

Type

CoreDayType

Prop

Type

스타일

기본 스타일 속성

Calendar Header:

  • display: flex
  • justify-content: center
  • margin-bottom: spacing-300 (12px)
  • width: 100%
  • height: 32px

Navigation:

  • border-radius: radius-full
  • stroke-width: 0.5px
  • stroke: icon.primary
  • transition: 0.2s
  • Hover: background-color: background[2], stroke: icon.interactive

Calendar Container:

  • padding: spacing-400 (16px)
  • elevation: elevation-8
  • border-radius: radius-100
  • background-color: white

Actions Container:

  • display: flex
  • justify-content: flex-end
  • gap: spacing-200 (8px)
  • width: 100%

Calendar HR:

  • background-color: border-default
  • width: calc(100% + spacing-800) (calc(100% + 32px))
  • height: 1px

States (상태별 토큰)

Navigation:

  • Default: stroke: icon-primary
  • Hover: background-color: background[2], stroke: icon-interactive

Day Cell 스타일

기본:

  • width: 32px
  • height: 32px (line-height)
  • typography: body[2]
  • text-align: center
  • border-radius: 0 (기본)
  • margin-block: spacing-50
  • margin-inline: 0

Today (오늘):

  • color: primary[60]
  • typography: heading[2]
  • text-decoration-line: underline
  • text-decoration-color: primary[60]

Selected / Range Start / Range End:

  • background-color: primary[60]
  • color: text[6]

Range Start:

  • border-top-left-radius: spacing-100
  • border-bottom-left-radius: spacing-100

Range End:

  • border-top-right-radius: spacing-100
  • border-bottom-right-radius: spacing-100

In Range (선택 범위 내):

  • background-color: primary[10]
  • color: text[1]

Selected/In Range Hover:

  • background-color: primary[70]
  • color: text[6]

Outside Month:

  • color: text[4]

Disabled / Excluded:

  • background-color: toggle-disabled-bg
  • color: text[5]

Day Names 스타일

  • width: 32px
  • height: 32px (line-height)
  • typography: caption[2]
  • color: text[1]
  • margin: 0

Month Text 스타일 (월 선택 모드)

기본:

  • width: 100% (wrapper: 224px)
  • height: 36px
  • typography: body[2]
  • color: text[1]
  • border-radius: 0

Selected / Range Start / Range End:

  • background-color: primary[60]
  • color: text[6]

In Range:

  • background-color: primary[10]
  • color: text[1]

Disabled:

  • background-color: toggle-disabled-bg
  • color: text[4]

Calendar Grid

여러 달 표시 시:

  • display: grid
  • grid-auto-flow: column
  • gap: spacing-600

Current Month 스타일

  • color: text[1]
  • typography: heading[2]
  • line-height: 32px