The Basics
Nova's temporal components at their most basic can be implemented with a simple element declaration and will accept valid ISO-8601 strings.
-
Copy this valid ISO-8601 string and try pasting it into the component:
2026-05-15T14:30:00Z -
Copy this invalid ISO-8601 string and paste it into the component:
2026-13-45T99:99Z
<nova-datetime></nova-datetime>
Time: smallest-unit
Control the precision of the time portion with
smallest-unit. Time-based components only support
smallest-unit — the largest unit is fixed by the
component itself (date for nova-datetime, hour for
nova-time). Valid time units are hour,
minute, second, millisecond,
microsecond, and nanosecond.
<nova-datetime
smallest-unit="nanosecond"
value="2026-02-09T14:30:00Z"></nova-datetime>
Copy/Paste Behavior
Nova's temporal components deviate from the HTML spec for date-time
input elements and will copy a full ISO-8601 string to your
clipboard. Try it by focusing on the nova-datetime
component, copying the value, and pasting into the text input
below.
<nova-datetime value="2026-01-02T14:00Z"></nova-datetime>
<input type="text" />
Min and Max
Constrain the allowed range with min and
max attributes. Both accept ISO-8601 strings. Values
entered or pasted outside the range will be marked as invalid.
-
This value is in range — try pasting it:
2026-02-08T12:00Z -
This value is past
max— try pasting it:2026-03-01T00:00Z
<nova-datetime
value="2026-02-09T14:30Z"
min="2026-02-07T00:00Z"
max="2026-02-11T00:00Z"></nova-datetime>
Hotkeys
Add the hotkeys boolean attribute to enable extra
keyboard shortcuts. With hotkeys enabled, pressing
n while focused on the component sets its value to the
current UTC now.
- Focus the first component (no
hotkeys) and press n — nothing happens. - Focus the second component (
hotkeysenabled) and press n — it jumps to the current time.
<nova-datetime value="2026-02-09T14:30Z"></nova-datetime>
<nova-datetime value="2026-02-09T14:30Z" hotkeys></nova-datetime>
Overflow
By default, segment edits that create an invalid date clamp to the
nearest valid date (matching Temporal's own default). Set
overflow="reject" to keep the typed value visible and
mark the component as invalid instead.
- On both components below, change the month segment from 01 to 02.
- The first (default) clamps day 31 down to 28.
- The second (
overflow="reject") keeps day 31 visible and invalid.
<nova-datetime value="2026-01-31T12:00Z"></nova-datetime>
<nova-datetime
value="2026-01-31T12:00Z"
overflow="reject"></nova-datetime>
Duration
Duration is natively supported in Temporal. The
nova-duration component provides an input control to
handle ISO-8601 compliant duration strings.
-
Copy this valid duration string and paste it into the component (it should accept):
PT1H30M -
Copy this invalid duration string and paste it into the component (it should error):
1H30M
<nova-duration></nova-duration>
Duration: largest-unit and smallest-unit
Control which units the component exposes with
largest-unit and smallest-unit. Together
they define the visible range of segments — anything outside that
range is hidden. Valid units are year,
month, day, hour,
minute, second,
millisecond, microsecond, and
nanosecond.
-
Hours/minutes/seconds only — try pasting:
PT2H15M30S -
Sub-second precision — try pasting:
PT5M30.250S
<nova-duration
largest-unit="hour"
smallest-unit="second"
value="PT1H00M00S"></nova-duration>
<nova-duration
largest-unit="minute"
smallest-unit="millisecond"
value="PT5M00.000S"></nova-duration>
Duration: largest-unit-digits
Use largest-unit-digits to widen the digit count of the
largest visible unit. This is useful when values can exceed the
natural width — for example, a total-hours field that can reach four
digits.
-
Paste a large hour value to see all four digits:
PT1234H
<nova-duration
largest-unit="hour"
smallest-unit="second"
largest-unit-digits="4"
value="PT0H00M"></nova-duration>
Temporal Groups
nova-temporal-group coordinates two or more temporal
inputs and exposes a single computed output. Mode is inferred from
the slots you provide — no mode attribute to set.
-
Range mode — only
t0,t1, … slots. Output is the duration between the first and last temporal. -
Compute mode — a
t0anchor plus one or mored0,d1, … duration slots. Output is the anchor with each duration applied in DOM order.
<nova-temporal-group>
<label slot="t0-label" for="t0">Start</label>
<nova-datetime slot="t0" id="t0" value="2026-05-01T09:00Z"></nova-datetime>
<label slot="t1-label" for="t1">End</label>
<nova-datetime slot="t1" id="t1" value="2026-05-01T17:30Z"></nova-datetime>
<output slot="output">
<span class="output-label">Duration</span>
<span class="output-value"></span>
</output>
</nova-temporal-group>
Compute Mode
Add a d0 duration slot beside the t0
anchor and the group switches to compute mode automatically. The
output is re-formatted by t0's component, so it
mirrors the anchor's precision.
-
Edit the duration to
PT2H30Mand watch the output update. -
Try pasting onto the start datetime:
2026-06-15T08:00Z
<nova-temporal-group>
<label slot="t0-label" for="t0">Start</label>
<nova-datetime slot="t0" id="t0" value="2026-05-01T09:00Z"></nova-datetime>
<label slot="d0-label" for="d0">For</label>
<nova-duration slot="d0" id="d0" value="PT1H30M"></nova-duration>
<output slot="output">
<span class="output-label">End</span>
<span class="output-value"></span>
</output>
</nova-temporal-group>
Multi-Step Compute
Compute mode chains any number of duration slots. Each duration is
applied in DOM order, so the output is
t0 + d0 + d1 + d2 + …. Use it for burn/coast/burn-style
sequences or any flow with multiple stages.
<nova-temporal-group>
<nova-datetime slot="t0" value="2026-05-01T09:00Z"></nova-datetime>
<nova-duration slot="d0" value="PT15M"></nova-duration>
<nova-duration slot="d1" largest-unit="hour" value="PT2H"></nova-duration>
<nova-duration slot="d2" value="PT5M"></nova-duration>
<output slot="output">…</output>
</nova-temporal-group>
Range Mode: min & max
In range mode, the group's min and max
are durations — they constrain the gap between
t0 and the last temporal slot. The component goes
invalid if the computed range falls outside.
-
This duration is in range — try setting end to:
2026-05-01T12:00Z -
This pushes past
max="PT8H"— try setting end to:2026-05-01T20:00Z
<nova-temporal-group min="PT30M" max="PT8H">
<nova-datetime slot="t0" value="2026-05-01T09:00Z"></nova-datetime>
<nova-datetime slot="t1" value="2026-05-01T11:00Z"></nova-datetime>
<output slot="output">…</output>
</nova-temporal-group>
Compute Mode: min & max
In compute mode, min and max are
temporal values matching t0's type — they
constrain the computed result, not the inputs. Push the duration
until the computed end runs past max.
<nova-temporal-group
min="2026-05-01T09:00Z"
max="2026-05-01T12:00Z">
<nova-datetime slot="t0" value="2026-05-01T09:00Z"></nova-datetime>
<nova-duration slot="d0" value="PT1H"></nova-duration>
<output slot="output">…</output>
</nova-temporal-group>
Date-Only Range
The group works with any temporal type — not just
nova-datetime. Use nova-date for
day-grain ranges; the output reports days.
<nova-temporal-group>
<nova-date slot="t0" value="2026-05-01"></nova-date>
<nova-date slot="t1" value="2026-05-08"></nova-date>
<output slot="output">…</output>
</nova-temporal-group>
Time-Only Range
nova-time ranges stay clock-only — there's no
overnight inference, so the duration is computed directly from
t0.until(t1) with hours as the largest unit.
<nova-temporal-group>
<nova-time slot="t0" value="09:00"></nova-time>
<nova-time slot="t1" value="17:30"></nova-time>
<output slot="output">…</output>
</nova-temporal-group>
Output Format
By default, range mode outputs an ISO duration and compute mode
outputs the computed end. The output-format attribute
(or .outputFormat property) switches the output slot
to one of the ISO 8601 interval forms — interval,
start-duration, or duration-end — or the
single-value end / duration. Endpoint
FormData entries are unaffected.
<nova-temporal-group output-format="interval">
<nova-date slot="t0" value="2026-05-01"></nova-date>
<nova-date slot="t1" value="2026-05-08"></nova-date>
<output slot="output">…</output>
</nova-temporal-group>
State Propagation
disabled and readonly on the group
propagate to every child input automatically. Set them once on the
group instead of plumbing them through each slotted element.
<nova-temporal-group disabled>
<nova-datetime slot="t0" value="2026-05-01T09:00Z"></nova-datetime>
<nova-duration slot="d0" value="PT2H"></nova-duration>
<output slot="output">…</output>
</nova-temporal-group>
Form Integration
nova-temporal-group behaves like a
<fieldset>. With name="window", each
child slot ships under window[t0],
window[t1], … plus a window[output]
entry for the computed value. Set required to block
submission until every slot has a complete, valid value.
- Submit the form — every entry is listed below the button.
- Clear a segment in either input and try again — submission is blocked.
<form>
<nova-temporal-group name="window" required>
<nova-datetime slot="t0" value="2026-05-01T09:00Z"></nova-datetime>
<nova-datetime slot="t1" value="2026-05-01T17:00Z"></nova-datetime>
<output slot="output">…</output>
</nova-temporal-group>
<button type="submit">Submit</button>
</form>