Calendar

Calendar view for date display and selection

Calendar

A calendar component for displaying and selecting dates.

Basic Usage

json
{
  "kind": "component",
  "name": "Calendar",
  "props": {
    "value": { "expr": "state", "name": "selectedDate" },
    "onSelect": { "event": "select", "action": "handleDateSelect" }
  }
}

Props

PropTypeDefaultDescription
valueExpression-Selected date(s)
onSelectEventHandler-Called when date is selected
monthExpressionCurrentDisplayed month (1-12)
yearExpressionCurrentDisplayed year
onMonthChangeEventHandler-Called when month changes
highlightedDatesExpression[]Dates to highlight
disabledDatesExpression[]Dates to disable
weekStartsOnExpression0Week start (0=Sun, 1=Mon)
localeExpression"en-US"Locale for formatting
modeExpression"single"Selection mode

Selection Modes

ModeDescription
singleSelect one date
multipleSelect multiple dates
rangeSelect a date range

Examples

Event Calendar

json
{
  "version": "1.0",
  "state": {
    "selectedDate": { "type": "string", "initial": "" },
    "events": {
      "type": "list",
      "initial": [
        { "date": "2024-01-15", "title": "Meeting" },
        { "date": "2024-01-20", "title": "Conference" }
      ]
    }
  },
  "actions": [
    {
      "name": "selectDate",
      "steps": [{ "do": "set", "target": "selectedDate", "value": { "expr": "var", "name": "payload" } }]
    }
  ],
  "view": {
    "kind": "component",
    "name": "Calendar",
    "props": {
      "value": { "expr": "state", "name": "selectedDate" },
      "onSelect": { "event": "select", "action": "selectDate" },
      "highlightedDates": {
        "expr": "call",
        "target": { "expr": "state", "name": "events" },
        "method": "map",
        "args": [{
          "expr": "lambda",
          "param": "e",
          "body": { "expr": "get", "base": { "expr": "var", "name": "e" }, "path": "date" }
        }]
      }
    }
  }
}

Date Range Selection

json
{
  "kind": "component",
  "name": "Calendar",
  "props": {
    "value": { "expr": "state", "name": "dateRange" },
    "onSelect": { "event": "select", "action": "setDateRange" },
    "mode": { "expr": "lit", "value": "range" }
  }
}

Monday Start

json
{
  "kind": "component",
  "name": "Calendar",
  "props": {
    "value": { "expr": "state", "name": "date" },
    "onSelect": { "event": "select", "action": "setDate" },
    "weekStartsOn": { "expr": "lit", "value": 1 },
    "locale": { "expr": "lit", "value": "de-DE" }
  }
}

With Disabled Dates

json
{
  "kind": "component",
  "name": "Calendar",
  "props": {
    "value": { "expr": "state", "name": "appointmentDate" },
    "onSelect": { "event": "select", "action": "setAppointment" },
    "disabledDates": { "expr": "state", "name": "unavailableDates" }
  }
}

Styling

CSS classes:

  • .calendar - Main container
  • .calendar-header - Month/year header
  • .calendar-nav - Navigation buttons
  • .calendar-weekdays - Weekday labels
  • .calendar-grid - Day grid
  • .calendar-day - Day cell
  • .calendar-day--today - Today
  • .calendar-day--selected - Selected
  • .calendar-day--highlighted - Highlighted (event)
  • .calendar-day--disabled - Disabled
  • .calendar-day--range-start - Range start
  • .calendar-day--range-end - Range end
  • .calendar-day--in-range - In range

Accessibility

  • Full keyboard navigation
  • ARIA grid role
  • Screen reader support for date announcements
  • Focus visible indicators