Calendar

The calendar component is a web component that displays a calendar with the ability to select a date.

Overview

The calendar component provides a visual date picker interface with full keyboard navigation support. It's built using the dayjs library for date manipulation and offers comprehensive customization options including date ranges, localization, and custom disabled date functions.

Examples

The calendar component is using the dayjs library to handle dates. The best way to use the calendar component if you are using the dayjs library in your project. The component settings are properties, not attributes, so you have to set them in JavaScript.

Default

The calendar component can be used to select a date. By default, it displays the current month and no date is selected.

<dap-ds-calendar></dap-ds-calendar>
Value

The value property can be used to set the selected date. The calendar will automatically navigate to the month containing the selected date.

HTML

Js

const calendar = document.querySelector('dap-ds-calendar')
calendar.value = dayjs().add(1, 'day')
Current date

The currentDate property can be used to set the currently visible month and year. This is useful for displaying a specific month without selecting a date.

HTML

Js

const calendar = document.querySelector('dap-ds-calendar')
calendar.currentDate = new Date('2022-08-15T22:00:00.000Z')
calendar.value = dayjs('2022-08-13T22:00:00.000Z')
Min date, Max date

The minDate and maxDate properties can be used to restrict the selectable date range. Dates outside this range will be disabled and navigation will be limited to the allowed range.

In this example, the minDate is set to the previous month and the maxDate is set to the next month, so navigation is restricted to a 3-month window.

HTML

Js

const calendar = document.querySelector('dap-ds-calendar')
calendar.minDate = dayjs().add(-1, 'month')
calendar.maxDate = dayjs().add(1, 'month')
calendar.value = dayjs()
Disabled date

The disabledDate property accepts a function that determines if a specific date should be disabled. The function receives a Dayjs object and should return true if the date should be disabled.

In this example, the disabledDate function disables weekends (Saturday and Sunday).

HTML

JS

const calendar = document.querySelector('dap-ds-calendar')
calendar.disabledDate = (date) => date.day() === 0 || date.day() === 6
Localization

The locale property can be used to set the locale of the calendar, affecting month names, weekday names, and date formatting. The component automatically detects the browser's locale if not specified.

Supported locales are en (English) and hu (Hungarian).

HTML

Hungarian locale

English locale

Js

const calendar = document.querySelector('dap-ds-calendar')
calendar.locale = 'hu'
calendar.value = dayjs().add(1, 'day')

Accessibility Features
  • ARIA Labels: Navigation buttons and select controls have descriptive labels
  • Keyboard Navigation: Full keyboard support for date selection and navigation
  • Screen Reader Support: Proper ARIA attributes for grid navigation
  • Focus Management: Clear focus indicators and logical tab order
  • Disabled State: Proper ARIA attributes for disabled dates
Best Practices
  1. Use with dayjs: The component is designed to work with dayjs objects for optimal performance
  2. Set reasonable date ranges: Use minDate and maxDate to prevent users from navigating to irrelevant dates
  3. Provide clear labels: Use descriptive labels for better accessibility
  4. Handle events: Always listen for dds-change events to update your application state
  5. Consider locale: Set the appropriate locale for your users' region
Common Patterns Date Range Validation
const calendar = document.querySelector('dap-ds-calendar')
calendar.minDate = dayjs().subtract(1, 'year')
calendar.maxDate = dayjs().add(1, 'year')
Business Days Only
const calendar = document.querySelector('dap-ds-calendar')
calendar.disabledDate = (date) => {
  const day = date.day()
  return day === 0 || day === 6 // Disable weekends
}
Dynamic Locale Switching
const calendar = document.querySelector('dap-ds-calendar')
document.querySelector('#locale-selector').addEventListener('change', (e) => {
  calendar.locale = e.target.value
})
Importing
import { DapDSCalendar } from 'dap-design-system'
Importing React
import { DapDSCalendarReact } from 'dap-design-system/react'
Tree-Shakeable Imports

For optimal bundle sizes, use the tree-shakeable import syntax:

import { DapDSCalendar } from 'dap-design-system/components'
Attributes
PropertyTypeDefaultDescription
mode'single', 'range''single'The mode of the calendar - single date or range selection.
hideAdjacentMonthsbooleanfalseWhether to hide dates from adjacent months (previous/next) in the calendar grid. When not explicitly set, defaults to false for single mode and true for range mode.
valueDayjsThe value of the calendar.
rangeStartDayjsThe start date of the range selection (only used in range mode).
rangeEndDayjsThe end date of the range selection (only used in range mode).
currentDateDayjsdayjs()The current visible date of the calendar. Only the month and year are considered.
minDateDayjsdayjs().subtract(50, 'year')The minimum date of the calendar. Only the month and year are considered.
maxDateDayjsdayjs().add(50, 'year')The maximum date of the calendar. Only the month and year are considered.
disabledDateFunction() => falseThe function to determine if the date is disabled.
locale'hu', 'en' , 'de'dayjs.locale()The locale of the calendar.
Slots
NameDescription
(default)The content of the calendar.
Events
Event NameDescriptionType
dds-changeFired when the calendar value changes.{value: Dayjs }
CSS Parts
Part NameDescription
baseThe main calendar container.
calendar-headerThe header of the calendar.
bodyThe body of the calendar.
calendar-grid-headerThe header of the calendar grid.
calendar-grid-cellThe cell of the calendar grid.
calendar-header-button-prevThe previous month button of the calendar header.
calendar-header-button-nextThe next month button of the calendar header.
calendar-header-year-selectThe year select of the calendar header.
calendar-header-month-selectThe month select of the calendar header.
calendar-grid-header-cellThe header cell of the calendar grid.
calendar-grid-cellThe cell of the calendar grid.
How to Use CSS Parts

You can style CSS parts using the ::part() pseudo-element selector:

/* Target a specific part */
.my-custom-dap-ds-calendar::part(base) {
  /* Your custom styles */
}

/* Target multiple parts */
.my-custom-dap-ds-calendar::part(base),
.my-custom-dap-ds-calendar::part(calendar-header) {
  /* Shared styles */
}

Example usage:

<dap-ds-calendar class="my-custom-dap-ds-calendar">
  Calendar
</dap-ds-calendar>
.my-custom-dap-ds-calendar::part(base) {
  border-radius: 12px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

CSS parts allow you to style internal elements of the component while maintaining encapsulation. Learn more in our styling guide.

CSS Custom Properties
Property NameDescription
--dds-calendar-displayThe display property of the calendar container. Default is flex.
--dds-calendar-isolationThe isolation property of the calendar. Default is isolate.
--dds-calendar-block-displayThe display property of the calendar block. Default is block.
--dds-calendar-transitionThe transition property for the calendar. Default is 'all 0.2s ease-in-out'.
--dds-calendar-header-displayThe display property of the calendar header. Default is grid.
--dds-calendar-header-grid-flowThe grid-auto-flow property of the calendar header. Default is column.
--dds-calendar-header-widthThe width of the calendar header. Default is 100%.
--dds-calendar-header-gapThe gap between header items. Default is the design system's spacing-100.
--dds-calendar-select-min-heightThe minimum height of the select trigger. Default is auto.
--dds-calendar-select-max-heightThe maximum height of the select trigger. Default is 32px.
--dds-calendar-select-paddingThe padding of the select trigger. Default is the design system's spacing-200.
--dds-calendar-select-border-radiusThe border radius of the select trigger. Default is the design system's radius-rounded.
--dds-calendar-select-border-colorThe border color of the select trigger. Default is the design system's border-neutral-transparent-interactive.
--dds-calendar-select-backgroundThe background color of the select trigger. Default is the design system's button-subtle-background-enabled.
--dds-calendar-select-colorThe text color of the select trigger. Default is the design system's button-subtle-text-enabled.
--dds-calendar-select-font-sizeThe font size of the select trigger. Default is the design system's font-sm.
--dds-calendar-select-font-styleThe font style of the select trigger. Default is normal.
--dds-calendar-select-font-weightThe font weight of the select trigger. Default is the design system's font-weight-bold.
--dds-calendar-nav-button-marginThe margin of the navigation buttons. Default is the design system's spacing-200.
--dds-calendar-nav-button-colorThe color of the navigation button icons. Default is the design system's button-subtle-icon-enabled.
How to Use CSS Custom Properties

CSS custom properties (CSS variables) can be set directly on the component or in your stylesheet:

Method 1: Inline styles (Quick customization)

<dap-ds-calendar
  style="--dds-calendar-display: value; --dds-calendar-isolation: value;">
  Calendar
</dap-ds-calendar>

Method 2: CSS classes (Reusable styles)

.my-custom-dap-ds-calendar {
  --dds-calendar-display: value;
  --dds-calendar-isolation: value;
  --dds-calendar-block-display: value;
}
<dap-ds-calendar class="my-custom-dap-ds-calendar">
  Calendar
</dap-ds-calendar>

Method 3: Global theme customization

/* Apply to all instances */
dap-ds-calendar {
  --dds-calendar-display: value;
  --dds-calendar-isolation: value;
}

CSS custom properties inherit through the Shadow DOM, making them perfect for theming. Changes apply immediately without rebuilding.

Components Calendar cell <dap-ds-calendar-cell/> Attributes
PropertyTypeDefaultDescription
valueDayjsThe value of the calendar cell.
selectedbooleanfalseWhether the calendar cell is selected.
disabledDaybooleanfalseWhether the calendar cell is disabled.
todaybooleanfalseWhether the calendar cell is today.
outOfRangebooleanfalseWhether the calendar cell is out of range.
headerbooleanfalseWhether the calendar cell is a date header.
focusedbooleanfalseWhether the calendar cell is focused.
rangestartbooleanfalseWhether the calendar cell is the start of a range.
rangeendbooleanfalseWhether the calendar cell is the end of a range.
inrangebooleanfalseWhether the calendar cell is in the middle of a range.
Slots
NameDescription
(default)The content of the calendar cell.
Events

No custom events available.

CSS Parts
Part NameDescription
baseThe main calendar cell container.
today-markThe today mark of the calendar cell.
CSS Custom Properties
Property NameDescription
--dds-calendar-cell-displayThe display property of the calendar cell host. Default is flex.
--dds-calendar-cell-positionThe position property of the calendar cell host. Default is relative.
--dds-calendar-cell-border-radiusThe border radius of the calendar cell. Default is the design system's radius-rounded.
--dds-calendar-cell-min-widthThe minimum width of the calendar cell. Default is the design system's spacing-1000.
--dds-calendar-cell-heightThe height of the calendar cell. Default is the design system's spacing-1000.
--dds-calendar-cell-min-heightThe minimum height of the calendar cell. Default is the design system's spacing-1000.
--dds-calendar-cell-colorThe text color of the calendar cell. Default is the design system's button-subtle-text-neutral-enabled.
--dds-calendar-cell-font-sizeThe font size of the calendar cell. Default is the design system's font-sm.
--dds-calendar-cell-font-weightThe font weight of the calendar cell. Default is the design system's font-weight-medium.
--dds-calendar-cell-text-alignThe text alignment of the calendar cell. Default is center.
--dds-calendar-cell-cursorThe cursor style of the calendar cell. Default is pointer.
--dds-calendar-cell-background-hoverThe background color of the calendar cell on hover. Default is the design system's background-neutral-medium.
--dds-calendar-cell-background-activeThe background color of the calendar cell when active. Default is the design system's background-neutral-strong.
--dds-calendar-cell-selected-backgroundThe background color of the selected calendar cell. Default is the design system's button-primary-background-enabled.
--dds-calendar-cell-selected-colorThe text color of the selected calendar cell. Default is the design system's button-primary-text-enabled.
--dds-calendar-cell-selected-background-hoverThe background color of the selected calendar cell on hover. Default is the design system's button-primary-background-hover.
--dds-calendar-cell-selected-background-pressedThe background color of the selected calendar cell when pressed. Default is the design system's button-primary-background-pressed.
--dds-calendar-cell-selected-today-mark-backgroundThe background color of the today mark in selected calendar cell. Default is the design system's text-neutral-on-inverted.
--dds-calendar-cell-disabled-colorThe text color of the disabled calendar cell. Default is the design system's text-neutral-disabled.
--dds-calendar-cell-disabled-cursorThe cursor style of the disabled calendar cell. Default is not-allowed.
--dds-calendar-cell-out-of-range-colorThe text color of the out-of-range calendar cell. Default is the design system's text-neutral-placeholder.
--dds-calendar-cell-today-font-weightThe font weight of the today calendar cell. Default is the design system's font-weight-bold.
--dds-calendar-cell-header-backgroundThe background color of the header calendar cell. Default is transparent.
--dds-calendar-cell-header-colorThe text color of the header calendar cell. Default is the design system's text-neutral-base.
--dds-calendar-cell-header-text-transformThe text transform of the header calendar cell. Default is capitalize.
--dds-calendar-cell-header-cursorThe cursor style of the header calendar cell. Default is default.
--dds-calendar-cell-in-range-border-radiusThe border radius of the in-range calendar cell. Default is 0.
--dds-calendar-cell-in-range-backgroundThe background color of the in-range calendar cell. Default is the design system's button-primary-background-enabled.
--dds-calendar-cell-in-range-colorThe text color of the in-range calendar cell. Default is the design system's button-primary-text-enabled.
--dds-calendar-cell-in-range-background-hoverThe background color of the in-range calendar cell on hover. Default is the design system's button-primary-background-hover.
--dds-calendar-cell-in-range-background-pressedThe background color of the in-range calendar cell when pressed. Default is the design system's button-primary-background-pressed.
--dds-calendar-cell-range-backgroundThe background color of the range start/end calendar cell. Default is the design system's button-primary-background-enabled.
--dds-calendar-cell-range-colorThe text color of the range start/end calendar cell. Default is the design system's button-primary-text-enabled.
--dds-calendar-cell-range-today-mark-backgroundThe background color of the today mark in range start/end calendar cell. Default is the design system's text-neutral-on-inverted.
--dds-calendar-cell-today-mark-bottomThe bottom position of the today mark. Default is the design system's spacing-100.
--dds-calendar-cell-today-mark-widthThe width of the today mark. Default is 5px.
--dds-calendar-cell-today-mark-heightThe height of the today mark. Default is 5px.
--dds-calendar-cell-today-mark-strokeThe stroke color of the today mark. Default is the design system's border-neutral-transparent.
--dds-calendar-cell-today-mark-backgroundThe background color of the today mark. Default is the design system's background-neutral-medium-inverted.
--dds-calendar-cell-today-mark-fillThe fill color of the today mark. Default is the design system's background-neutral-medium-inverted.