@oslokommune/punkt-react
Version:
React komponentbibliotek til Punkt, et designsystem laget av Oslo Origo
85 lines (84 loc) • 3.74 kB
TypeScript
import { ChangeEvent, FocusEvent, InputHTMLAttributes, ReactNode } from 'react';
import { TPktInputSize } from '../../shared-types/size';
import { 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<HTMLInputElement>, 'value' | 'onChange' | 'onInput' | '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`). In React, `onChange` already fires on input. */
onChange?: (e: ChangeEvent<HTMLInputElement>) => 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<Element>) => void;
/** Focus leaves the whole component. */
onBlur?: (e: FocusEvent<Element>) => void;
/** Extra class names on the root (`pkt-timepicker`). */
className?: string;
/** Size of the Timepicker component. */
inputSize?: TPktInputSize;
}