import type { ChangeEvent, FocusEvent, InputHTMLAttributes, ReactNode } from 'react' import type { ITimepickerStrings } from 'shared-types/timepicker' /** * Props for {@link PktTimepicker}: a React time picker with `HH:MM`, aligned with Elements `pkt-timepicker`. * * The value is submitted via a hidden `input type="time"`; hour/minute fields are the editing UI. Use `value` * or `defaultValue` for controlled vs. uncontrolled mode. */ export interface IPktTimepicker extends Omit< InputHTMLAttributes, 'value' | 'onChange' | 'min' | 'max' | 'step' | 'onFocus' | 'onBlur' > { /** Unique id; used for hour, minute, popup, and hidden input ids. */ id: string /** Visible label (InputWrapper). */ label: string /** Controlled value (`HH:MM`). */ value?: string /** Initial value when the component is uncontrolled. */ defaultValue?: string /** * Earliest valid time (`HH:MM`). May be a number or string (HTML attribute / RHF). * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time} */ min?: string | number /** * Latest valid time (`HH:MM`). May be a number or string (HTML attribute / RHF). */ max?: string | number /** * Step in **seconds** (e.g. `60` = 1 min, `300` = 5 min). Must be a valid multiple (same rules as Elements). * @default 60 */ step?: number /** Hides the clock button and popup; shows a static clock icon. */ hidePicker?: boolean /** Shows previous/next step buttons instead of the popup. */ stepArrows?: boolean /** Full width (`pkt-timepicker--fullwidth`). */ fullwidth?: boolean /** Form field name on the hidden `input`; falls back to `id` if omitted. */ name?: string /** Help text above the field. */ helptext?: string | ReactNode /** Expandable help text (dropdown). */ helptextDropdown?: string | ReactNode /** Button label for expandable help text. */ helptextDropdownButton?: string /** Forces error state on the wrapper. */ hasError?: boolean /** Error message below the field. */ errorMessage?: string | ReactNode /** Shows an "optional" tag. */ optionalTag?: boolean /** Label text for the optional tag. */ optionalText?: string /** Shows a "required" tag. */ requiredTag?: boolean /** Label text for the required tag. */ requiredText?: string /** Extra tag next to the label. */ tagText?: string | null /** Inline layout in InputWrapper. */ inline?: boolean /** Show visible label and help text (`false` = screen-reader-only label). */ useWrapper?: boolean /** Passed through to InputWrapper as `aria-describedby`. */ ariaDescribedby?: string /** Copy for hours, minutes, buttons, and popup. */ strings?: ITimepickerStrings /** Change event from the hidden input (`e.target.value` is `HH:MM`). */ onChange?: (e: ChangeEvent) => void /** Input events while typing or using spinners. */ onInput?: (e: ChangeEvent) => void /** Callback with the committed `HH:MM` string. */ onValueChange?: (value: string) => void /** * Fires when focus enters this control from outside (not when moving only between hour and minute). * Implemented on the root wrapper; spinbuttons must allow focus to bubble so this runs. */ onFocus?: (e: FocusEvent) => void /** Focus leaves the whole component. */ onBlur?: (e: FocusEvent) => void /** Extra class names on the root (`pkt-timepicker`). */ className?: string }