Selection
Date pickers
Lets people select a date or a range of dates from a calendar, a year grid or a text field.
- COMPONENT_SPEC §27
- CSS · custom elements · React
- Open in the playground
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.
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.
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.
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.
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).