Duration Field
Accessible, unstyled segmented duration input that reads and writes ISO 8601 durations.
|
|
| Package |
@vizejs/ui/duration-field |
| Maturity |
stable |
| Own the source |
vize lib pull duration-field |
| Requires |
controllable-state, date-field, id, locale |
| Aliases |
duration input, timespan, iso 8601 duration, estimate field |
| Covers |
ISO 8601 durations, Temporal.Duration, WAI-ARIA spinbutton |
Usage
import { DurationField } from "@vizejs/ui/duration-field";
Or copy the source into your project with vize lib pull duration-field (see Source Distribution).
API
DurationField
Source: src/families/date-time/duration-field/duration-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 |
Input name that submits the ISO 8601 duration (for example PT1H30M). |
modelValue |
DurationValue | null | undefined |
undefined |
Controlled duration; undefined selects uncontrolled mode and null clears. |
defaultValue |
DurationValue | null | undefined |
null |
Initial uncontrolled duration and native form-reset target. |
fields |
readonly DurationUnit[] | undefined |
["hours", "minutes"] |
Units rendered as segments, always shown largest first. |
unitDisplay |
DurationUnitDisplay | undefined |
"short" |
Unit label width next to each segment. |
maxValue |
number | undefined |
9999 |
Upper bound of units that do not roll into a larger edited unit. |
locale |
string | undefined |
undefined |
BCP 47 locale for unit labels; defaults to the nearest LocaleProvider. |
dir |
"ltr" | "rtl" | undefined |
undefined |
Text direction for arrow-key segment movement. |
disabled |
boolean | undefined |
false |
Disable every segment. |
readOnly |
boolean | undefined |
false |
Keep segments focusable while blocking edits. |
required |
boolean | undefined |
false |
Require a complete value; participates in native form validation. |
placeholder |
string | undefined |
"––" |
Placeholder shown in 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. |
Events
| Event |
Payload |
Description |
update:modelValue |
[value: DurationValue | null] |
Fired when segments request a new controlled duration or null while incomplete. |
change |
[value: DurationValue | null, previous: DurationValue | null, nativeEvent: Event | null] |
Fired after a distinct committed duration with the previous value and triggering event. |
Slots
| Slot |
Slot props |
Description |
default |
DurationFieldSlotState |
Extra content after the segments. Receives field state. |
segment |
DurationSegmentState |
Segment amount content. Receives the segment state; defaults to its text. |
Behavior
Normative state x input -> outcome table for duration-field.vue
(@vizejs/ui/duration-field): segmented spinbuttons for whole-unit durations
that read and write typed ISO 8601 durations (IsoDuration = `P${string}`).
Every row is proven by the named test.
| # |
State |
Input |
Outcome |
Proven by |
| DU1 |
any |
render |
fields render largest first as role="spinbutton" segments with localized unit affixes (Intl.NumberFormat units) and aria-valuetext like 2 hours; units that roll into an edited larger unit are bounded (hours 0–23 under days, minutes/seconds 0–59, months 0–11 under years, days 0–6 under weeks); name submits the ISO duration |
renders unit segments with localized affixes, bounds, and an ISO input |
| DU2 |
editing |
digits / arrows / Page / Backspace / Delete / Left / Right |
digits fill and auto-advance; arrows wrap; Page steps by 10; Backspace drops a digit; Delete clears; the value commits (zeros dropped) only when every unit is filled |
typing and stepping fill units and commit normalized durations |
| DU3 |
required / read-only |
form validation / keys |
required fields join native constraint validation; read-only fields ignore edits |
required durations join native validation and read-only blocks edits |
| DU4 |
imperative |
expose |
focus(unit?), setValue, clear |
exposes focus, setValue, and clear |
| DU5 |
model |
helpers |
formatIsoDuration/parseIsoDuration round-trip whole units (fractions and signs are rejected); durationToSeconds refuses calendar units |
ISO 8601 durations round-trip and convert to seconds |
| DU6 |
SSR |
isolated requests |
byte-identical markup and silent hydration |
renders byte-identical duration field markup across isolated SSR requests, hydrates duration field markup without mismatches |