calendar

Month and year selection

Month and year selection

Загрузка превью…

src/calendar/c-calendar-8.vue

<!--
  АДАПТАЦИЯ (docs/PORTING.md §4a/§5): оригинал подменяет внутренний
  `react-day-picker`-компонент `Dropdown` на `Select` через проп
  `components` (единый `Dropdown` перехватывает и месяц, и год при
  `captionLayout="dropdown"`). У `reka-ui` `CalendarRoot` нет аналога
  подмены внутренних частей caption — вместо этого используется
  именованный слот `#caption` `CCalendar` с теми же двумя `Select`
  (закрытое состояние; открытые попапы `Select` нигде в порте не
  сравниваются попиксельно, см. PORTING.md §5 `ui-select`). Месяц
  зафиксирован явно, реальной навигации через триггеры не выполняет —
  за пределами области визуального кейса.
-->
<script setup lang="ts">
import { ref } from "vue"
import { Card, CardContent } from "@/components/ui/card"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Calendar as CCalendar } from "@/components/ui/calendar"

const fixedMonth = new Date(2026, 0, 15)
const date = ref<Date | undefined>(fixedMonth)

const months = [
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December",
]
const years = [2024, 2025, 2026, 2027, 2028]
</script>

<template>
  <Card class="p-0">
    <CardContent class="p-0">
      <CCalendar mode="single" v-model="date" :month="fixedMonth" hide-navigation>
        <template #caption>
          <div class="mx-0">
            <div class="flex w-full items-center gap-2">
              <Select model-value="0">
                <SelectTrigger class="first:grow">
                  <SelectValue>{{ months[0] }}</SelectValue>
                </SelectTrigger>
                <SelectContent align="start">
                  <SelectItem v-for="(m, i) in months" :key="m" :value="String(i)">{{ m }}</SelectItem>
                </SelectContent>
              </Select>
              <Select model-value="2026">
                <SelectTrigger class="first:grow">
                  <SelectValue>{{ `2026` }}</SelectValue>
                </SelectTrigger>
                <SelectContent align="start">
                  <SelectItem v-for="y in years" :key="y" :value="String(y)">{{ y }}</SelectItem>
                </SelectContent>
              </Select>
            </div>
          </div>
        </template>
      </CCalendar>
    </CardContent>
  </Card>
</template>

Установка

npx shadcn-vue@latest add https://revueui.rootapi.dev/r/c-calendar-8.json

Зависимости реестра

Источник: порт из ReUI (Keenthemes, MIT)