Segmented `HH:MM:SS` duration input component where each time unit (hours, minutes, seconds) is an independently focusable field with keyboard navigation and auto-advance behavior.
## Key Components
- **`DurationInput`** — Main component export. Renders three linked `` fields separated by colon delimiters.
- **`DurationInputProps`** — Interface accepting `value` (`HH:MM:SS` string), `onChange` callback, optional `invalid` flag, and `className`.
- **`SEGMENT_META`** — Tuple defining per-segment constraints: label, placeholder, and max value (99 for hours, 59 for minutes/seconds).
- **`commit`** — Internal helper that syncs segment state, fires `onChange`, and optionally advances focus to the next segment.
- **`split` / `compose`** — Converts between the `HH:MM:SS` string format and the internal `[HH, MM, SS]` tuple.
## Usage Example
```typescript
import { useState } from "react";
import { DurationInput } from "@openframe/ui";
export function TimerForm() {
const [duration, setDuration] = useState("01:30:00");
return (
);
}
```
## Keyboard Behavior
| Key | Action |
|---|---|
| `0–9` | Fill current segment; auto-advance when 2 digits entered or unambiguous (e.g., `6–9` in MM/SS) |
| `ArrowUp` / `ArrowDown` | Increment/decrement current segment with wrap-around |
| `ArrowLeft` / `ArrowRight` | Move between segments at boundary |
| `Backspace` | Clear and move to previous segment when empty |
| `:` | Advance to next segment |
Values are clamped to segment maximums (MM/SS ≤ 59, HH ≤ 99), making it impossible to produce an invalid duration. External value changes (e.g., form resets) are adopted without interrupting in-progress edits.