Skip to content

Selection

Date pickers

Lets people select a date or a range of dates from a calendar, a year grid or a text field.

Examples

Date picker

The calendar, the year grid (from the month and year button) and the date input (from the pencil), in one. The arrow keys move through the days; Page Up / Down change the month.

The live demo runs with JavaScript. Its code is below.

React HTML
import { useState } from 'react';
import { DatePicker } from '@kyralabs/m3exp-web/react';

const AUG_17_2025 = Date.UTC(2025, 7, 17);

export default function Calendar() {
  const [date, setDate] = useState<number | null>(AUG_17_2025);
  return (
    <div>
      <DatePicker
        selectedDateMillis={date}
        onSelectedDateChange={setDate}
        defaultDisplayMode="picker"
      />
      <p>Selected: {date === null ? 'none' : new Date(date).toISOString().slice(0, 10)}</p>
    </div>
  );
}
<m3e-date-picker id="calendar" value="2025-08-17" displayed-month="2025-08"></m3e-date-picker>
<p>Selected: <output id="calendar-value">2025-08-17</output></p>
<script>
  document.getElementById('calendar').addEventListener('change', (event) => {
    document.getElementById('calendar-value').textContent = event.detail.value ?? 'none';
  });
</script>

Run the HTML version (custom elements, no framework).

In a dialog

Compose's DatePickerDialog: the picker with Cancel and OK. The value changes only on OK.

The live demo runs with JavaScript. Its code is below.

React HTML
import { useState } from 'react';
import { Button, DatePicker, DatePickerDialog } from '@kyralabs/m3exp-web/react';

const AUG_17_2025 = Date.UTC(2025, 7, 17);
const iso = (millis: number | null) =>
  millis === null ? 'none' : new Date(millis).toISOString().slice(0, 10);

export default function Dialog() {
  const [open, setOpen] = useState(false);
  const [date, setDate] = useState<number | null>(AUG_17_2025);
  const [draft, setDraft] = useState<number | null>(date);
  return (
    <>
      <Button
        variant="tonal"
        onPress={() => {
          setDraft(date);
          setOpen(true);
        }}
      >
        Pick a date
      </Button>
      <p>Date: {iso(date)}</p>
      <DatePickerDialog
        aria-label="Select date"
        isOpen={open}
        onOpenChange={setOpen}
        dismissButton={
          <Button
            variant="text"
            onPress={() => {
              setOpen(false);
            }}
          >
            Cancel
          </Button>
        }
        confirmButton={
          <Button
            variant="text"
            isDisabled={draft === null}
            onPress={() => {
              setDate(draft);
              setOpen(false);
            }}
          >
            OK
          </Button>
        }
      >
        <DatePicker
          selectedDateMillis={draft}
          onSelectedDateChange={setDraft}
          displayedMonthMillis={draft ?? AUG_17_2025}
        />
      </DatePickerDialog>
    </>
  );
}
<button type="button" id="open-date" class="m3e-button m3e-button--tonal">Pick a date</button>
<p>Date: <output id="date-value">2025-08-17</output></p>
<m3e-dialog id="date-dialog" variant="custom" label="Select date">
  <div class="m3e-date-picker-dialog">
    <div class="m3e-date-picker-dialog__content">
      <m3e-date-picker value="2025-08-17" displayed-month="2025-08"></m3e-date-picker>
    </div>
    <div class="m3e-date-picker-dialog__actions">
      <button type="button" class="m3e-button m3e-button--text" data-action="cancel">Cancel</button>
      <button type="button" class="m3e-button m3e-button--text" data-action="ok">OK</button>
    </div>
  </div>
</m3e-dialog>
<script>
  const dialog = document.getElementById('date-dialog');
  const picker = dialog.querySelector('m3e-date-picker');
  const output = document.getElementById('date-value');
  document.getElementById('open-date').addEventListener('click', () => {
    picker.value = output.textContent;
    dialog.show();
  });
  dialog.addEventListener('click', (event) => {
    const action = event.target.closest('[data-action]')?.dataset.action;
    if (action === 'ok') output.textContent = picker.value ?? 'none';
    if (action) dialog.close();
  });
</script>

Run the HTML version (custom elements, no framework).

Date range

A scrolling list of months with the range band, shown full screen as Compose does, with Save.

The live demo runs with JavaScript. Its code is below.

React HTML
import { useState } from 'react';
import { Button, DateRangePicker, FullScreenDialog } from '@kyralabs/m3exp-web/react';

const AUG_2025 = Date.UTC(2025, 7, 1);
const iso = (millis: number | null) =>
  millis === null ? '…' : new Date(millis).toISOString().slice(0, 10);

export default function Range() {
  const [open, setOpen] = useState(false);
  const [range, setRange] = useState<[number | null, number | null]>([null, null]);
  const [draft, setDraft] = useState(range);
  return (
    <>
      <Button
        variant="tonal"
        onPress={() => {
          setDraft(range);
          setOpen(true);
        }}
      >
        Pick dates
      </Button>
      <p>
        Trip: {iso(range[0])} – {iso(range[1])}
      </p>
      <FullScreenDialog
        aria-label="Select dates"
        isOpen={open}
        onOpenChange={setOpen}
        action={
          <Button
            variant="text"
            isDisabled={draft[1] === null}
            onPress={() => {
              setRange(draft);
              setOpen(false);
            }}
          >
            Save
          </Button>
        }
      >
        <DateRangePicker
          selectedStartDateMillis={draft[0]}
          selectedEndDateMillis={draft[1]}
          onSelectedRangeChange={(start, end) => {
            setDraft([start, end]);
          }}
          displayedMonthMillis={AUG_2025}
        />
      </FullScreenDialog>
    </>
  );
}
<button type="button" id="open-range" class="m3e-button m3e-button--tonal">Pick dates</button>
<p>Trip: <output id="range-value">… – …</output></p>
<m3e-dialog id="range-dialog" variant="full-screen" label="Select dates">
  <m3e-date-range-picker displayed-month="2025-08"></m3e-date-range-picker>
  <button type="button" class="m3e-button m3e-button--text" slot="actions">Save</button>
</m3e-dialog>
<script>
  const dialog = document.getElementById('range-dialog');
  const picker = dialog.querySelector('m3e-date-range-picker');
  document.getElementById('open-range').addEventListener('click', () => dialog.show());
  dialog.querySelector('[slot="actions"]').addEventListener('click', () => {
    document.getElementById('range-value').textContent =
      `${picker.start ?? '…'} – ${picker.end ?? '…'}`;
    dialog.close();
  });
</script>

Run the HTML version (custom elements, no framework).

Docked

A date field whose calendar drops down below it (m3.material.io's docked picker; Compose has none).

The live demo runs with JavaScript. Its code is below.

React HTML
import { DockedDatePicker } from '@kyralabs/m3exp-web/react';

export default function Docked() {
  return <DockedDatePicker label="Departure" defaultSelectedDateMillis={Date.UTC(2025, 7, 17)} />;
}
<m3e-docked-date-picker label="Departure" value="2025-08-17"></m3e-docked-date-picker>

Run the HTML version (custom elements, no framework).

API

React

<DatePicker>

Date picker (COMPONENT_SPEC §27; Compose DatePicker): the header, the calendar with its year grid, and the date input, built and run by m3e-elements' DatePickerLayout (the code <m3e-date-picker> runs, so both layers render one DOM contract). Dates are UTC milliseconds, as Compose's DatePickerState. Put it in a <DatePickerDialog> for Compose's DatePickerDialog.

Prop Type Default Description
selectedDateMillis number | null The selected date, UTC milliseconds of its midnight, or null (controlled).
defaultSelectedDateMillis number | null The initial selection (uncontrolled; default none).
displayedMonthMillis number The month shown first (UTC milliseconds of any day in it); default: the selection's or today's.
displayMode "picker" | "input" The display mode (controlled).
defaultDisplayMode "picker" | "input" The initial display mode (uncontrolled; default picker).
showModeToggle boolean The header's mode toggle (default true).
title string | null The header title; null: none. Default: Compose's ("Select date", "Enter dates", …).
showHeadline boolean The header headline (default true).
yearRange YearRange The years shown (DatePickerDefaults.YearRange: 1900–2100).
selectableDates SelectableDates Which dates and years can be picked (Compose's SelectableDates; UTC milliseconds).
locale string BCP 47 locale for the calendar, names and digits; default: the closest lang.
labels Partial<DatePickerStrings> String overrides (Compose's strings by default).
onSelectedDateChange (dateMillis: number | null) => void The user picked or entered a date (UTC midnight), or cleared the input (null).
onDisplayedMonthChange (monthMillis: number) => void
onDisplayModeChange (mode: DatePickerDisplayMode) => void
headline boolean Deprecated: Since 1.8: use showHeadline. Removed in 2.0. The header headline (default true).

Also accepts HTML attributes not listed here.

<DateRangePicker>

Date range picker (COMPONENT_SPEC §27; Compose DateRangePicker): the header, a scrolling list of months with the range band, and the start / end inputs, built and run by m3e-elements' DateRangePickerLayout (shared with <m3e-date-range-picker>). It fills its container: show it in a <FullScreenDialog> (owner decision M10 D16), as Compose's samples do.

Prop Type Default Description
selectedStartDateMillis number | null The range's start, UTC milliseconds of its midnight, or null (controlled with the end).
selectedEndDateMillis number | null The range's end, on or after the start; null while only a start is picked.
displayedMonthMillis number The month shown first (UTC milliseconds of any day in it); default: the selection's or today's.
displayMode "picker" | "input" The display mode (controlled).
defaultDisplayMode "picker" | "input" The initial display mode (uncontrolled; default picker).
showModeToggle boolean The header's mode toggle (default true).
title string | null The header title; null: none. Default: Compose's ("Select date", "Enter dates", …).
showHeadline boolean The header headline (default true).
yearRange YearRange The years shown (DatePickerDefaults.YearRange: 1900–2100).
selectableDates SelectableDates Which dates and years can be picked (Compose's SelectableDates; UTC milliseconds).
locale string BCP 47 locale for the calendar, names and digits; default: the closest lang.
labels Partial<DatePickerStrings> String overrides (Compose's strings by default).
defaultSelectedStartDateMillis number | null
defaultSelectedEndDateMillis number | null
onSelectedRangeChange (startMillis: number | null, endMillis: number | null) => void The user changed the range (UTC midnights; the end is null while only a start is set).
onDisplayedMonthChange (monthMillis: number) => void
onDisplayModeChange (mode: DatePickerDisplayMode) => void
headline boolean Deprecated: Since 1.8: use showHeadline. Removed in 2.0. The header headline (default true).

Also accepts HTML attributes not listed here.

<DockedDatePicker>

Docked date picker (COMPONENT_SPEC §27; m3.material.io's docked date picker, owner decision M10 D1, Compose has none): a date field whose calendar drops down below it, built and run by m3e-elements' DockedDatePickerLayout (shared with <m3e-docked-date-picker>).

Prop Type Default Description
selectedDateMillis number | null The selected date, UTC milliseconds of its midnight, or null (controlled).
label string The field's label (default: Compose's "Date").
yearRange YearRange The years shown (DatePickerDefaults.YearRange: 1900–2100).
selectableDates SelectableDates Which dates and years can be picked (Compose's SelectableDates; UTC milliseconds).
locale string BCP 47 locale for the calendar, names and digits; default: the closest lang.
labels Partial<DatePickerStrings> String overrides (Compose's strings by default).
defaultSelectedDateMillis number | null
onSelectedDateChange (dateMillis: number | null) => void

Also accepts HTML attributes not listed here.

<DatePickerDialog>

Date picker dialog (Compose DatePickerDialog): the picker and the actions (dismiss, confirm) on the date picker's dialog surface, in m3e-react's <BasicAlertDialog> (M9 dialog motion, focus and dismissal), named "Dialog" unless aria-label / aria-labelledby says otherwise.

Prop Type Default Description
confirmButton required ReactNode The confirm button (a text button).
children required ReactNode The picker (<DatePicker>).
aria-label string The dialog's name (default "Dialog", Compose's pane title).
isOpen boolean Open (controlled).
defaultOpen boolean The initial open state (uncontrolled).
dismissButton ReactNode
onOpenChange (isOpen: boolean) => void Called when the dialog asks to close (Escape, a press on the scrim, the full-screen close button, a browser close request: Compose's onDismissRequest) with false. Controlled dialogs close when isOpen becomes false; leave it true to keep the dialog open.

Also accepts HTML attributes not listed here.

Custom elements

<m3e-date-picker>

import '@kyralabs/m3e-elements/date-picker.js';

<m3e-date-picker value="2025-08-17"> (COMPONENT_SPEC §27; Compose DatePicker): the calendar, the year grid and the date input in one, without a dialog (put it in <m3e-dialog variant="custom"> with a .m3e-date-picker-dialog surface for Compose's DatePickerDialog). Attributes value (ISO date) and those of M3eDatePickerElement. Event change (detail: { value }). The DOM is m3e-css's .m3e-date-picker contract, built and run by DatePickerLayout (shared with m3e-react).

Attribute Property Type Notes
displayed-month displayedMonth string
year-range yearRange string
display-mode displayMode string Reflected.
hide-mode-toggle hideModeToggle boolean
no-title noTitle boolean
no-headline noHeadline boolean
value value string
Event Detail Description
change DatePickerChangeDetail The user picked or entered a date, or cleared the input.

<m3e-date-range-picker>

import '@kyralabs/m3e-elements/date-range-picker.js';

<m3e-date-range-picker start="2025-08-10" end="2025-08-17"> (COMPONENT_SPEC §27; Compose DateRangePicker): a scrolling list of months and the range input. Compose shows it full screen (owner decision M10 D16: inside <m3e-dialog variant="full-screen">). Attributes start, end (ISO dates) and those of M3eDatePickerElement. Event change (detail: { start, end }). The DOM is m3e-css's .m3e-date-picker--range contract, built and run by DateRangePickerLayout (shared with m3e-react).

Attribute Property Type Notes
displayed-month displayedMonth string
year-range yearRange string
display-mode displayMode string Reflected.
hide-mode-toggle hideModeToggle boolean
no-title noTitle boolean
no-headline noHeadline boolean
start start string
end end string
Event Detail Description
change DateRangePickerChangeDetail The user changed the range.

<m3e-docked-date-picker>

import '@kyralabs/m3e-elements/docked-date-picker.js';

<m3e-docked-date-picker value="2025-08-17" label="Date"> (COMPONENT_SPEC §27; m3.material.io's docked date picker, owner decision M10 D1): a date field whose calendar drops down below it. Attributes value (ISO date), label, year-range; properties labels, selectableDates. Methods show() / close(). Event change (detail: { value }). The DOM is m3e-css's .m3e-docked-date-picker contract, built and run by DockedDatePickerLayout (shared with m3e-react).

Attribute Property Type Notes
value value string
label label string
year-range yearRange string
Event Detail Description
change DatePickerChangeDetail The user picked or entered a date, or cleared the field.

CSS

date-picker.css

@import '@kyralabs/m3e-css/date-picker.css';

Date pickers (COMPONENT_SPEC §27): Compose's DatePicker (calendar and input modes, the year grid), DateRangePicker (a scrolling list of months, the range input) and the DatePickerDialog surface, and the docked date picker from m3.material.io (owner decision M10 D1; Compose has none). The calendars need m3e-elements' date picker layouts (shared with m3e-react), which build this DOM and write its state; the CSS draws it.

<div class="m3e-date-picker [m3e-date-picker--range] [m3e-date-picker--docked]"
     data-mode="picker | input">
  <div class="m3e-date-picker__header">                     (DatePickerHeader; optional)
    <div class="m3e-date-picker__title">Select date</div>
    <div class="m3e-date-picker__headline-row">
      <div class="m3e-date-picker__headline">Aug 17, 2025</div>   (range: three spans)
      <button class="m3e-icon-button m3e-date-picker__mode-toggle">…</button>
    </div>
  </div>                                                    (the divider is its border)
  <div class="m3e-date-picker__content">
    <div class="m3e-date-picker__pane" data-pane="picker">
      <div class="m3e-date-picker__nav">                    (MonthsNavigation)
        <button class="m3e-button m3e-button--text m3e-date-picker__year-button"
                aria-expanded="false">August 2025<span class="m3e-icon">arrow_drop_down</span>
        </button>
        <span class="m3e-date-picker__arrows"><button class="m3e-icon-button">…</button>…</span>
      </div>
      <div class="m3e-date-picker__body">
        <div class="m3e-date-picker__calendar" role="grid">
          <div class="m3e-date-picker__weekdays" role="row">
            <span class="m3e-date-picker__weekday" role="columnheader">S</span> …</div>
          <div class="m3e-date-picker__viewport">           (the month pages slide here)
            <div class="m3e-date-picker__month" role="rowgroup">
              <div class="m3e-date-picker__week" role="row">
                <span class="m3e-date-picker__day" role="gridcell" tabindex="-1"
                      [aria-selected] [aria-current="date"] [aria-disabled]
                      [data-in-range] [data-start] [data-end] [data-outside]>17</span> …
              </div> …
            </div>
          </div>
        </div>
        <div class="m3e-date-picker__years" role="listbox" [data-state="open | closing"]>
          <span class="m3e-date-picker__year" role="option" aria-selected>2025</span> …
        </div>
      </div>
    </div>
    <div class="m3e-date-picker__pane" data-pane="input">
      <div class="m3e-date-picker__input"><div class="m3e-text-field m3e-text-field--outlined">
        …</div></div>                                       (range: two fields)
    </div>
  </div>
</div>

The range picker's picker pane is a weekday row over __scroller > __spacer with absolutely placed __range-months (a __subhead and a __month grid with __band rectangles behind the days: drawRangeBackground, computed by the layout). The docked picker's navigation is __docked-nav (two groups of previous / __menu-button / next), and its month and year menus are a __menu listbox of __menu-items that replaces the calendar; it drops down under a date field in .m3e-docked-date-picker (the field's end has a calendar icon button).

  • DatePicker.kt (DateEntryContainer L1368–1439, DatePickerHeader L1774–1802, MonthsNavigation
L2453–2526, WeekDays L1890–1939, Month L1941–2084, Day L2241–2307, YearPicker / Year
L2309–2447): 48dp cells, the 40dp day containers, six rows always, the 72 × 36dp years in
three columns 16dp apart, colors (selected > in range > today > enabled; disabled at
DisabledAlpha) on the default effects spring, the today outline when not selected.
  • The mode switch and the year grid's motion are the layouts' (the springs' tokens); reduced
motion jumps.
  • DateRangePicker.kt: the range header (64dp in, title large), the month subheads, the range
band (secondary container, 40dp tall).
  • DateInput.kt / DateRangeInput.kt: an outlined text field (m3e-css text-field.css) 24dp in,
10dp below the divider, 16dp above the bottom (none while an error shows).
  • DatePickerDialog.android.kt: the dialog surface (360dp wide, at most 568dp tall, no shadow,
owner decision M10 D13), the button row 8dp from the bottom and 6dp from the end.
  • Docked (m3.material.io token DB, owner decision M10 D1): 360 × 456dp, large corners, the
64dp navigation row, dimmed days outside the month, the month / year menus.
  • State layers (owner decision M10 D17), touch targets ≥ 48dp, :focus-visible rings, forced
colors.
150 custom properties it reads
Custom property Default
--m3e-comp-date-picker-calendar-rows 6
--m3e-comp-date-picker-cell-size 48px
--m3e-comp-date-picker-current-year-color var(--m3e-sys-color-primary)
--m3e-comp-date-picker-date-in-range-state-layer-color var(--m3e-sys-color-on-primary-container)
--m3e-comp-date-picker-date-selected-state-layer-color var(--m3e-sys-color-on-primary)
--m3e-comp-date-picker-date-state-layer-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-date-today-state-layer-color var(--m3e-sys-color-primary)
--m3e-comp-date-picker-day-color-duration var(--m3e-sys-motion-spring-default-effects-duration)
--m3e-comp-date-picker-day-color-easing var(--m3e-sys-motion-spring-default-effects-easing)
--m3e-comp-date-picker-dialog-actions-gap 8px
--m3e-comp-date-picker-dialog-actions-padding-bottom 8px
--m3e-comp-date-picker-dialog-actions-padding-end 6px
--m3e-comp-date-picker-dialog-container-shadow var(--m3e-sys-elevation-level0-shadow)
--m3e-comp-date-picker-divider-color var(--m3e-sys-color-outline-variant)
--m3e-comp-date-picker-docked-container-color var(--m3e-sys-color-surface-container-high)
--m3e-comp-date-picker-docked-container-shadow var(--m3e-sys-elevation-level3-shadow)
--m3e-comp-date-picker-docked-container-shape var(--m3e-sys-shape-corner-large)
--m3e-comp-date-picker-docked-container-width 360px
--m3e-comp-date-picker-docked-date-container-size 48px
--m3e-comp-date-picker-docked-header-height 64px
--m3e-comp-date-picker-docked-menu-button-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-docked-menu-button-height 40px
--m3e-comp-date-picker-docked-menu-button-icon-size 18px
--m3e-comp-date-picker-docked-menu-button-label-font var(--m3e-sys-typescale-label-large-font)
--m3e-comp-date-picker-docked-menu-button-label-line-height var(--m3e-sys-typescale-label-large-line-height)
--m3e-comp-date-picker-docked-menu-button-label-size var(--m3e-sys-typescale-label-large-size)
--m3e-comp-date-picker-docked-menu-button-label-tracking var(--m3e-sys-typescale-label-large-tracking)
--m3e-comp-date-picker-docked-menu-button-label-weight var(--m3e-sys-typescale-label-large-weight)
--m3e-comp-date-picker-docked-menu-button-shape var(--m3e-sys-shape-corner-full)
--m3e-comp-date-picker-docked-menu-item-color var(--m3e-sys-color-on-surface)
--m3e-comp-date-picker-docked-menu-item-height 48px
--m3e-comp-date-picker-docked-menu-item-label-font var(--m3e-sys-typescale-body-large-font)
--m3e-comp-date-picker-docked-menu-item-label-line-height var(--m3e-sys-typescale-body-large-line-height)
--m3e-comp-date-picker-docked-menu-item-label-size var(--m3e-sys-typescale-body-large-size)
--m3e-comp-date-picker-docked-menu-item-label-tracking var(--m3e-sys-typescale-body-large-tracking)
--m3e-comp-date-picker-docked-menu-item-label-weight var(--m3e-sys-typescale-body-large-weight)
--m3e-comp-date-picker-docked-menu-item-selected-container-color var(--m3e-sys-color-surface-variant)
--m3e-comp-date-picker-docked-menu-item-selected-icon-color var(--m3e-sys-color-on-surface)
--m3e-comp-date-picker-docked-menu-item-selected-icon-size 24px
--m3e-comp-date-picker-docked-outside-month-color var(--m3e-sys-color-on-surface)
--m3e-comp-date-picker-docked-outside-month-opacity 0.38
--m3e-comp-date-picker-headline-padding-bottom 12px
--m3e-comp-date-picker-headline-padding-end 12px
--m3e-comp-date-picker-headline-padding-start 24px
--m3e-comp-date-picker-horizontal-padding 12px
--m3e-comp-date-picker-input-padding-bottom 16px
--m3e-comp-date-picker-input-padding-end 24px
--m3e-comp-date-picker-input-padding-start 24px
--m3e-comp-date-picker-input-padding-top 10px
--m3e-comp-date-picker-modal-container-color var(--m3e-sys-color-surface-container-high)
--m3e-comp-date-picker-modal-container-height 568px
--m3e-comp-date-picker-modal-container-shape var(--m3e-sys-shape-corner-extra-large)
--m3e-comp-date-picker-modal-container-width 360px
--m3e-comp-date-picker-modal-date-container-height 40px
--m3e-comp-date-picker-modal-date-container-shape var(--m3e-sys-shape-corner-full)
--m3e-comp-date-picker-modal-date-container-width 40px
--m3e-comp-date-picker-modal-date-label-text-color-selected var(--m3e-sys-color-on-primary)
--m3e-comp-date-picker-modal-date-label-text-color-unselected var(--m3e-sys-color-on-surface)
--m3e-comp-date-picker-modal-date-label-text-font var(--m3e-sys-typescale-body-large-font)
--m3e-comp-date-picker-modal-date-label-text-line-height var(--m3e-sys-typescale-body-large-line-height)
--m3e-comp-date-picker-modal-date-label-text-size var(--m3e-sys-typescale-body-large-size)
--m3e-comp-date-picker-modal-date-label-text-tracking var(--m3e-sys-typescale-body-large-tracking)
--m3e-comp-date-picker-modal-date-label-text-weight var(--m3e-sys-typescale-body-large-weight)
--m3e-comp-date-picker-modal-date-today-container-outline-color var(--m3e-sys-color-primary)
--m3e-comp-date-picker-modal-date-today-container-outline-width 1px
--m3e-comp-date-picker-modal-date-today-label-text-color var(--m3e-sys-color-primary)
--m3e-comp-date-picker-modal-header-container-height 120px
--m3e-comp-date-picker-modal-header-headline-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-modal-header-headline-font var(--m3e-sys-typescale-headline-large-font)
--m3e-comp-date-picker-modal-header-headline-line-height var(--m3e-sys-typescale-headline-large-line-height)
--m3e-comp-date-picker-modal-header-headline-size var(--m3e-sys-typescale-headline-large-size)
--m3e-comp-date-picker-modal-header-headline-tracking var(--m3e-sys-typescale-headline-large-tracking)
--m3e-comp-date-picker-modal-header-headline-weight var(--m3e-sys-typescale-headline-large-weight)
--m3e-comp-date-picker-modal-header-supporting-text-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-modal-header-supporting-text-font var(--m3e-sys-typescale-label-large-font)
--m3e-comp-date-picker-modal-header-supporting-text-line-height var(--m3e-sys-typescale-label-large-line-height)
--m3e-comp-date-picker-modal-header-supporting-text-size var(--m3e-sys-typescale-label-large-size)
--m3e-comp-date-picker-modal-header-supporting-text-tracking var(--m3e-sys-typescale-label-large-tracking)
--m3e-comp-date-picker-modal-header-supporting-text-weight var(--m3e-sys-typescale-label-large-weight)
--m3e-comp-date-picker-modal-range-selection-active-indicator-container-height 40px
--m3e-comp-date-picker-modal-range-selection-header-container-height 128px
--m3e-comp-date-picker-modal-range-selection-header-headline-font var(--m3e-sys-typescale-title-large-font)
--m3e-comp-date-picker-modal-range-selection-header-headline-line-height var(--m3e-sys-typescale-title-large-line-height)
--m3e-comp-date-picker-modal-range-selection-header-headline-size var(--m3e-sys-typescale-title-large-size)
--m3e-comp-date-picker-modal-range-selection-header-headline-tracking var(--m3e-sys-typescale-title-large-tracking)
--m3e-comp-date-picker-modal-range-selection-header-headline-weight var(--m3e-sys-typescale-title-large-weight)
--m3e-comp-date-picker-modal-range-selection-month-subhead-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-modal-range-selection-month-subhead-font var(--m3e-sys-typescale-title-small-font)
--m3e-comp-date-picker-modal-range-selection-month-subhead-line-height var(--m3e-sys-typescale-title-small-line-height)
--m3e-comp-date-picker-modal-range-selection-month-subhead-size var(--m3e-sys-typescale-title-small-size)
--m3e-comp-date-picker-modal-range-selection-month-subhead-tracking var(--m3e-sys-typescale-title-small-tracking)
--m3e-comp-date-picker-modal-range-selection-month-subhead-weight var(--m3e-sys-typescale-title-small-weight)
--m3e-comp-date-picker-modal-selection-year-container-height 36px
--m3e-comp-date-picker-modal-selection-year-container-width 72px
--m3e-comp-date-picker-modal-selection-year-label-text-font var(--m3e-sys-typescale-body-large-font)
--m3e-comp-date-picker-modal-selection-year-label-text-line-height var(--m3e-sys-typescale-body-large-line-height)
--m3e-comp-date-picker-modal-selection-year-label-text-size var(--m3e-sys-typescale-body-large-size)
--m3e-comp-date-picker-modal-selection-year-label-text-tracking var(--m3e-sys-typescale-body-large-tracking)
--m3e-comp-date-picker-modal-selection-year-label-text-weight var(--m3e-sys-typescale-body-large-weight)
--m3e-comp-date-picker-modal-selection-year-state-layer-shape var(--m3e-sys-shape-corner-full)
--m3e-comp-date-picker-modal-weekdays-label-text-color var(--m3e-sys-color-on-surface)
--m3e-comp-date-picker-modal-weekdays-label-text-font var(--m3e-sys-typescale-body-large-font)
--m3e-comp-date-picker-modal-weekdays-label-text-line-height var(--m3e-sys-typescale-body-large-line-height)
--m3e-comp-date-picker-modal-weekdays-label-text-size var(--m3e-sys-typescale-body-large-size)
--m3e-comp-date-picker-modal-weekdays-label-text-tracking var(--m3e-sys-typescale-body-large-tracking)
--m3e-comp-date-picker-modal-weekdays-label-text-weight var(--m3e-sys-typescale-body-large-weight)
--m3e-comp-date-picker-mode-fade-in-duration var(--m3e-sys-motion-spring-default-effects-duration)
--m3e-comp-date-picker-mode-fade-in-easing var(--m3e-sys-motion-spring-default-effects-easing)
--m3e-comp-date-picker-mode-fade-out-duration var(--m3e-sys-motion-spring-fast-effects-duration)
--m3e-comp-date-picker-mode-fade-out-easing var(--m3e-sys-motion-spring-fast-effects-easing)
--m3e-comp-date-picker-mode-parallax 48px
--m3e-comp-date-picker-mode-spatial-duration var(--m3e-sys-motion-spring-default-spatial-duration)
--m3e-comp-date-picker-mode-spatial-easing var(--m3e-sys-motion-spring-default-spatial-easing)
--m3e-comp-date-picker-mode-toggle-padding-bottom 12px
--m3e-comp-date-picker-mode-toggle-padding-end 12px
--m3e-comp-date-picker-month-subhead-padding-bottom 8px
--m3e-comp-date-picker-month-subhead-padding-start 24px
--m3e-comp-date-picker-month-subhead-padding-top 20px
--m3e-comp-date-picker-month-year-height 56px
--m3e-comp-date-picker-navigation-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-range-header-height-offset 60px
--m3e-comp-date-picker-range-headline-gap 4px
--m3e-comp-date-picker-range-headline-padding-bottom 12px
--m3e-comp-date-picker-range-headline-padding-end 12px
--m3e-comp-date-picker-range-headline-padding-start 64px
--m3e-comp-date-picker-range-input-gap 8px
--m3e-comp-date-picker-range-mode-duration var(--m3e-sys-motion-spring-fast-effects-duration)
--m3e-comp-date-picker-range-mode-easing var(--m3e-sys-motion-spring-fast-effects-easing)
--m3e-comp-date-picker-range-title-padding-end 12px
--m3e-comp-date-picker-range-title-padding-start 64px
--m3e-comp-date-picker-title-padding-end 12px
--m3e-comp-date-picker-title-padding-start 24px
--m3e-comp-date-picker-title-padding-top 16px
--m3e-comp-date-picker-year-button-height 40px
--m3e-comp-date-picker-year-button-icon-gap 8px
--m3e-comp-date-picker-year-button-padding-block 8px
--m3e-comp-date-picker-year-button-padding-inline 12px
--m3e-comp-date-picker-year-grid-duration var(--m3e-sys-motion-spring-default-effects-duration)
--m3e-comp-date-picker-year-grid-easing var(--m3e-sys-motion-spring-default-effects-easing)
--m3e-comp-date-picker-year-grid-fade-out-duration var(--m3e-sys-motion-spring-fast-effects-duration)
--m3e-comp-date-picker-year-grid-fade-out-easing var(--m3e-sys-motion-spring-fast-effects-easing)
--m3e-comp-date-picker-year-grid-initial-alpha 0.6
--m3e-comp-date-picker-year-selected-state-layer-color var(--m3e-sys-color-on-primary)
--m3e-comp-date-picker-year-state-layer-color var(--m3e-sys-color-on-surface-variant)
--m3e-comp-date-picker-years-in-row 3
--m3e-comp-date-picker-years-vertical-padding 16px
--m3e-comp-dialog-action-label-text-color var(--m3e-sys-color-primary)
--m3e-comp-divider-thickness 1px
--m3e-comp-minimum-interactive-component-size 48px
--m3e-comp-text-field-supporting-top-padding 4px

Sources

Values come from androidx Compose Material3 1.5.0-beta01 at 19991f2c and from m3.material.io, as cited below from COMPONENT_SPEC §27 and the m3e-css sources.

DatePickerModalTokens.kt / DateInputModalTokens.kt@19991f2c (date-picker-modal.css / date-input-modal.css) plus components/date-picker-defaults.css (date-picker-defaults.ts, PARITY.md lines): 360dp container, 40dp days in 48dp cells (RecommendedSizeForAccessibility), six rows, the 56dp month / year row, the 3-column year grid (72 × 36dp years), header / title / headline / input paddings (range: 64dp start), the dialog's actions (8 / 6dp) and its level-0 shadow (owner decisions M10 D12, D13: Compose's 568dp maximum height and no shadow over the DB's). Today is outlined, the selection filled in primary, the range band secondary-container (drawRangeBackground). State layers from the token DB (owner decision M10 D17, kept by D19 (25), register #88). Docked: 360 × 456dp, level 3, the neighbouring months' days dimmed (owner decision M10 D15).