# Calendar 캘린더

캘린더 뷰입니다. 단일 선택 / 기간 선택 / 여러 선택 세 가지 선택 모드를 지원하며, range로 선택 가능한 날짜 경계를 제한합니다. panel 모드는 상시 표시되고, input 모드는 입력 상자로 접혔다가 클릭 시 펼쳐집니다 (패널은 body에 마운트).

캘린더
<template>
  <div class="demo-col" style="max-width: none">
    <div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap">
      <LhCalendar v-model="single" selection="single" />
      <LhCalendar v-model="span" selection="range" mode="input" placeholder="기간 선택" />
    </div>
    <p class="demo-note">단일 선택: {{ fmt(single) }} | 기간: {{ fmtArr(span) }}</p>
    <div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap; margin-top: 16px">
      <LhCalendar v-model="multi" selection="multiple" :panels="2" :close-on-select="false" />
      <LhCalendar v-model="strict" selection="range" mode="panel" />
    </div>
    <p class="demo-note">여러 선택 (panels=2 이중 패널, closeOnSelect=false로 자동 닫힘 없음): {{ fmtArr(multi) }}</p>
    <p class="demo-note">패널 모드 range (mode="panel"): {{ fmtArr(strict) }}</p>
    <div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap; margin-top: 16px">
      <LhCalendar v-model="clamped" selection="single" :range="bounds" />
    </div>
    <p class="demo-note">range로 선택 가능 구간 제한 (2026-10-01 ~ 2026-10-15만 선택 가능): {{ fmt(clamped) }}</p>
  </div>
</template>

<script>
export default {
  data: () => ({
    single: new Date(2026, 9, 3),
    span: [],
    multi: [],
    strict: [],
    clamped: new Date(2026, 9, 5),
    bounds: [new Date(2026, 9, 1), new Date(2026, 9, 15)],
  }),
  methods: {
    fmt(v) {
      return v instanceof Date ? v.toLocaleDateString('zh-CN') : '(선택 안 함)'
    },
    fmtArr(v) {
      if (!Array.isArray(v) || v.length === 0) return '(선택 안 함)'
      return v.map((d) => d.toLocaleDateString('zh-CN')).join(' ~ ')
    },
  },
}
</script>

# Props

프로퍼티 설명 타입 기본값
v-model 현재 선택값. 단일 선택은 Date, 기간 선택과 여러 선택은 Date[] Date \| Date[] —
selection 선택 모드 'single' \| 'range' \| 'multiple' 'single'
range 선택 가능 날짜 범위 [start, end]. 범위 밖은 비활성화 [Date, Date] —
mode 표시 형태: panel 상시 패널 / input 접힌 입력 상자 'panel' \| 'input' 'panel'
panels 동시에 표시할 월 패널 수 (flex 줄바꿈 배치) number 1
placeholder input 모드 자리표시 텍스트 string 언어 팩
closeOnSelect input 모드에서 선택 후 자동으로 닫을지 여부 boolean true
sx sx 레이아웃 단축 프로퍼티 — —

# Events

input(v-model), change (value), select (date)

# Slots

슬롯 설명
header 월 패널 헤더, 범위 매개변수 { year, month } (기본 "YYYY년 M월" 렌더링)
cell 날짜 셀, 범위 매개변수 { date } (기본 일자 렌더링)

# 접근성

패널은 role="grid", 요일 행은 role="row", 날짜 셀은 role="gridcell"이며, 비활성화된 날짜에 aria-disabled를 지정하고, input 모드 트리거는 키보드 펼치기와 방향키 이동을 지원합니다.

Copyright © 2024-2026 FengMo WenXue