Date Field
Accessible, unstyled segmented date input whose segment order follows the locale.
| Package | @vizejs/ui/date-field |
| Maturity | stable |
| Own the source | vize lib pull date-field |
| Requires | controllable-state, id, locale |
| Aliases | date input, segmented date, date segments, masked date |
| Covers | WAI-ARIA spinbutton, React Aria DateField, Reka UI DateField, HTML input type=date |
Usage
import { DateField } from "@vizejs/ui/date-field";
Or copy the source into your project with vize lib pull date-field (see Source Distribution).
API
DateField
Source: src/families/date-time/date-field/date-field.vue
Props
| Prop | Type | Default | Description |
|---|---|---|---|
id |
string | null | undefined |
undefined |
Consumer-owned group id; nullish values use a deterministic fallback. |
name |
string | undefined |
undefined |
Hidden input name that submits the ISO date (YYYY-MM-DD) with forms. |
modelValue |
PlainDate | null | undefined |
undefined |
Controlled date; undefined selects uncontrolled mode and null clears. |
defaultValue |
PlainDate | null | undefined |
null |
Initial uncontrolled date and native form-reset target. |
min |
PlainDate | null | undefined |
undefined |
Earliest valid date; later values mark the field invalid. |
max |
PlainDate | null | undefined |
undefined |
Latest valid date; earlier values mark the field invalid. |
isDateUnavailable |
DateMatcher | undefined |
undefined |
Predicate for dates that are entered but invalid. |
placeholderValue |
PlainDate | null | undefined |
undefined |
Date whose segments seed arrow-key stepping from empty; defaults to the host date at key time. |
timeZone |
string | undefined |
undefined |
IANA time zone for the key-time host date fallback. |
locale |
string | undefined |
undefined |
BCP 47 locale deciding segment order and separators; defaults to the nearest LocaleProvider. |
dir |
"ltr" | "rtl" | undefined |
undefined |
Text direction for arrow-key segment movement; defaults to the nearest LocaleProvider. |
disabled |
boolean | undefined |
false |
Remove every segment from focus and editing. |
readOnly |
boolean | undefined |
false |
Keep segments focusable while blocking edits. |
required |
boolean | undefined |
false |
Require a complete value; participates in native form validation. |
invalidMessage |
string | undefined |
"Invalid value" |
Custom validity message reported while the value is out of range or unavailable. |
placeholders |
FieldSegmentPlaceholders | undefined |
{ year: "yyyy", month: "mm", day: "dd" } |
Placeholder text for empty segments. |
emptyText |
string | undefined |
"Empty" |
Text announced for empty segments. |
ariaLabel |
string | undefined |
undefined |
Accessible name for the segment group. |
ariaLabelledby |
string | undefined |
undefined |
Ids that label the segment group. |
ariaDescribedby |
string | undefined |
undefined |
Ids that describe the group and every segment. |
ariaErrormessage |
string | undefined |
undefined |
Id of the validation message used while invalid. |
ariaInvalid |
boolean | undefined |
false |
Force the invalid state in addition to built-in min/max/availability validation. |
Events
| Event | Payload | Description |
|---|---|---|
update:modelValue |
[value: PlainDate | null] |
Fired when segments request a new controlled date or null while incomplete. |
change |
[value: PlainDate | null, previous: PlainDate | null, nativeEvent: Event | null] |
Fired after a distinct committed date with the previous date and triggering event. |
Slots
| Slot | Slot props | Description |
|---|---|---|
default |
DateFieldSlotState |
Extra content after the segments, such as a picker trigger. Receives field state. |
segment |
FieldSegmentState |
Segment content. Receives the segment state; defaults to its text. |
Behavior
Normative state x input -> outcome table for date-field.vue
(@vizejs/ui/date-field), a segmented spinbutton date input. The segment
engine (field-segments.ts, field-segment-runtime.ts) is shared with
TimeField. Every row is proven by the named test.
| # | State | Input | Outcome | Proven by |
|---|---|---|---|---|
| F1 | any | render | a role="group" holds role="spinbutton" segments in the locale's order with aria-hidden literals; segments expose value, bounds, aria-valuetext, localized Intl.DisplayNames labels, and contenteditable + inputmode for virtual keyboards; name adds a named ISO input (see F15) |
renders locale-ordered spinbutton segments with literals and a hidden ISO input |
| F2 | empty | digits | digits fill the focused segment and advance when no further digit fits; a complete set commits and emits update:modelValue then change |
typing digits fills segments, auto-advances, and commits a complete date |
| F3 | typing | leading zero / overflow | a lone 0 waits for a second digit; a digit that would overflow restarts the buffer |
a leading zero waits for a second digit and out-of-range digits restart the buffer |
| F4 | filled | Arrow / Page / Home / End | steps wrap within bounds (Page steps: year 10, month 3, day 7); day clamps to the month length when month or year changes | arrow, page, home, and end keys step segments with wrapping and day clamping |
| F5 | empty | Arrow | stepping an empty segment starts from placeholderValue (else the host date read at key time, never during render) |
stepping an empty segment starts from placeholderValue |
| F6 | filled | Backspace / Delete | Backspace drops the last digit, then moves to the previous segment when empty; Delete clears; any cleared segment commits null |
Backspace removes digits then moves back, Delete clears, and clearing commits null |
| F7 | focused | ArrowLeft / ArrowRight / other keys | horizontal arrows move between segments and flip in RTL; unhandled printable keys are prevented so the DOM stays controlled | horizontal arrows move between segments and honor RTL |
| F8 | virtual keyboard | beforeinput |
insertText and deleteContentBackward are handled and always prevented |
beforeinput supports virtual keyboards without mutating the DOM |
| F9 | min / max / predicate | commit | values outside the window or rejected by isDateUnavailable, or ariaInvalid, set data-state="invalid", aria-invalid, and aria-errormessage |
min, max, unavailable dates, and ariaInvalid mark the field invalid |
| F10 | disabled / read-only | render / keys | disabled segments stay focusable with aria-disabled, lose contenteditable, and the hidden input is disabled; read-only allows segment navigation but no edits |
disabled and read-only fields keep availability and form semantics |
| F11 | controlled / form | edit / prop change / form reset | controlled edits revert until accepted; external values replace every segment; native form reset restores defaultValue |
controlled values win, external values replace segments, and form reset restores defaults |
| F12 | imperative | expose | focus(segment?), setValue, clear, reset, and normalized state |
exposes focus, setValue, clear, reset, and normalized state |
| F13 | pure helpers | call | bounds, stepping, typing, and locale layouts are deterministic functions | segment helpers expose pure bounds, stepping, typing, and layouts |
| F15 | required / name |
form validation | a visually hidden, aria-hidden, tabindex="-1" text input carries name, the ISO value, and required; empty required fields fail checkValidity() with valueMissing and move focus to the first empty segment; out-of-range values report invalidMessage through setCustomValidity |
required fields participate in native constraint validation |
| F14 | SSR/hydration | isolated requests | byte-identical segments and deterministic segment ids hydrate silently | renders byte-identical locale-ordered date segments across SSR requests, hydrates date segments with generated ids and no mismatches |
Extension hooks
| Hook | Values |
|---|---|
| parts | root, segment, literal |
| root data | data-vize-ui="date-field", data-state (empty/partial/complete/invalid), data-value, data-dir, data-invalid, data-disabled, data-readonly, data-required |
| segment data | data-segment, data-placeholder, data-invalid |
| slots | segment (segment content), default (content after the segments, such as a picker trigger) |