# 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