UIPackage
Menu

Framework

Change language

Boilerplate repo

Range Calendar

range-calendarui

Inline from→to calendar grid. Click two dates; the range fills between. For a form field with a trigger, use Date Picker type="range" instead. Same min/max and disabled-date support as Calendar.

Also available for React ->

When to use which

Decision Guide

Calendar is the always-visible month grid. Date Picker is the form field with popover. Range Calendar manages multi-month spans, and Event Calendar is the multi-view scheduling engine.

ComponentRole
Calendar

Embedded dashboard views or scheduling pages where the month grid stays continuously visible.

Grid Primitive
RangeCalendarcurrent

Contiguous multi-month booking ranges, check-in / check-out spans, and date windows.

Range Primitive
DatePicker

Forms, filter bars, and dialogs where space is tight and the calendar opens inside a popover.

Form Control
EventCalendar

Full calendar interfaces with month/week/day views, timed hourly intervals, and overlap collision lanes.

Scheduling Engine
  • Form / filter / booking field → Date Picker (view)
  • Always-visible month grid → Calendar (view)
  • Date range / check-in selection → Range Calendar
  • Multi-view schedule & timed events → Event Calendar (view)

Installation

$npx shadcn-vue@latest add https://uipkge.dev/r/vue/range-calendar.json
Named registry:npx shadcn-vue@latest add @uipkge/range-calendarInstalls to:app/components/ui/range-calendar/

Examples

Loading interactive previews…

Props

NameType / ValuesDefaultRequired
classHTMLAttributes['class']optional

Used by

Files installed (13)

  • app/components/ui/range-calendar/RangeCalendar.vue2.1 kB
    <script lang="ts" setup>
    import type { RangeCalendarRootEmits, RangeCalendarRootProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { RangeCalendarRoot, useForwardPropsEmits } from 'reka-ui'
    import { cn } from '@/lib/utils'
    import {
      RangeCalendarCell,
      RangeCalendarCellTrigger,
      RangeCalendarGrid,
      RangeCalendarGridBody,
      RangeCalendarGridHead,
      RangeCalendarGridRow,
      RangeCalendarHeadCell,
      RangeCalendarHeader,
      RangeCalendarHeading,
      RangeCalendarNextButton,
      RangeCalendarPrevButton,
    } from '.'
    
    const props = defineProps<RangeCalendarRootProps & { class?: HTMLAttributes['class'] }>()
    
    const emits = defineEmits<RangeCalendarRootEmits>()
    
    const delegatedProps = reactiveOmit(props, 'class')
    
    const forwarded = useForwardPropsEmits(delegatedProps, emits)
    </script>
    
    <template>
      <RangeCalendarRoot
        v-slot="{ grid, weekDays }"
        data-uipkge
        data-slot="range-calendar"
        :class="cn('p-3', props.class)"
        v-bind="forwarded"
      >
        <RangeCalendarHeader>
          <RangeCalendarHeading />
    
          <div class="flex items-center gap-1">
            <RangeCalendarPrevButton />
            <RangeCalendarNextButton />
          </div>
        </RangeCalendarHeader>
    
        <div class="mt-4 flex flex-col gap-y-4 sm:flex-row sm:gap-x-4 sm:gap-y-0">
          <RangeCalendarGrid v-for="month in grid" :key="month.value.toString()">
            <RangeCalendarGridHead>
              <RangeCalendarGridRow>
                <RangeCalendarHeadCell v-for="day in weekDays" :key="day">
                  {{ day }}
                </RangeCalendarHeadCell>
              </RangeCalendarGridRow>
            </RangeCalendarGridHead>
            <RangeCalendarGridBody>
              <RangeCalendarGridRow v-for="(weekDates, index) in month.rows" :key="`weekDate-${index}`" class="mt-2 w-full">
                <RangeCalendarCell v-for="weekDate in weekDates" :key="weekDate.toString()" :date="weekDate">
                  <RangeCalendarCellTrigger :day="weekDate" :month="month.value" />
                </RangeCalendarCell>
              </RangeCalendarGridRow>
            </RangeCalendarGridBody>
          </RangeCalendarGrid>
        </div>
      </RangeCalendarRoot>
    </template>
    
  • app/components/ui/range-calendar/RangeCalendarCell.vue1 kB
  • app/components/ui/range-calendar/RangeCalendarCellTrigger.vue2.5 kB
  • app/components/ui/range-calendar/RangeCalendarGrid.vue0.7 kB
  • app/components/ui/range-calendar/RangeCalendarGridBody.vue0.3 kB
  • app/components/ui/range-calendar/RangeCalendarGridHead.vue0.3 kB
  • app/components/ui/range-calendar/RangeCalendarGridRow.vue0.7 kB
  • app/components/ui/range-calendar/RangeCalendarHeadCell.vue0.7 kB
  • app/components/ui/range-calendar/RangeCalendarHeader.vue0.7 kB
  • app/components/ui/range-calendar/RangeCalendarHeading.vue0.8 kB
  • app/components/ui/range-calendar/RangeCalendarNextButton.vue1 kB
  • app/components/ui/range-calendar/RangeCalendarPrevButton.vue1 kB
  • app/components/ui/range-calendar/index.ts0.9 kB

Raw manifest:https://uipkge.dev/r/vue/range-calendar.json