import type { TemplateResult } from 'lit-html'; import '../../components/popup/popup.js'; import type WaPopup from '../../components/popup/popup.js'; import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-form-associated-element.js'; export type WaTimeInputSize = 'xs' | 's' | 'm' | 'l' | 'xl'; export type WaTimeInputPlacement = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end'; export type WaTimeInputHourFormat = 'auto' | '12' | '24'; /** * @summary Time pickers let users enter a time through a segmented field or select one visually from a popup column * picker. They support 12- and 24-hour formats, optional seconds, and locale-aware segment order. * @documentation https://webawesome.com/docs/components/time-input * @status experimental * @since 3.8 * * @dependency wa-icon * @dependency wa-popup * * @slot label - The time picker's label. Alternatively, use the `label` attribute. * @slot hint - Text that describes how to use the time picker. Alternatively, use the `hint` attribute. * @slot start - An element placed at the start of the input. * @slot end - An element placed at the end of the input. * @slot clear-icon - An icon to use in lieu of the default clear icon. * @slot expand-icon - The icon to show on the popup toggle button. Defaults to a clock icon. * @slot footer - Content shown below the column picker in the popup. Replaces the default Now button when present. * * @event change - Emitted when the committed value changes. * @event input - Emitted as the user types into a segment or interacts with the popup columns. * @event focus - Emitted when the control receives focus. * @event blur - Emitted when the control loses focus. * @event wa-clear - Emitted when the clear button is activated. * @event wa-show - Emitted when the popup is about to open. Cancelable. * @event wa-after-show - Emitted after the popup opens and animations complete. * @event wa-hide - Emitted when the popup is about to close. Cancelable. * @event wa-after-hide - Emitted after the popup closes and animations complete. * @event wa-invalid - Emitted when the form control has been checked for validity and its constraints aren't satisfied. * * @csspart form-control - The form control that wraps the label, input, and hint. * @csspart form-control-label - The label's wrapper. * @csspart form-control-input - The input's wrapper. * @csspart hint - The hint's wrapper. * @csspart base - The component's base wrapper. * @csspart input-wrapper - The container around the start slot, segmented input, clear button, and expand button. * @csspart start - The container that wraps the `start` slot. * @csspart end - The container that wraps the `end` slot. * @csspart input - The segmented input group. * @csspart segment - Each editable segment (hour/minute/second/AM-PM spinbutton). Use `[part~="segment"]` to style all. * @csspart segment-literal - Inert literal text between segments (separators). * @csspart clear-button - The clear button. * @csspart expand-button - The popup toggle button. * @csspart expand-icon - The expand icon wrapper. * @csspart popup - The popup container. * @csspart columns - The row of column listboxes inside the popup. * @csspart column - Each column listbox. * @csspart column-item - Each option inside a column. * @csspart column-item-selected - The currently selected option inside a column. * @csspart now-button - The default "Now" button rendered in the popup footer when `with-now` is set. * * @cssproperty [--show-duration=100ms] - The duration of the show animation. * @cssproperty [--hide-duration=100ms] - The duration of the hide animation. * @cssproperty [--column-item-height=2.25em] - Height of each option inside a popup column. * @cssproperty [--column-width=3em] - Width of each popup column. * * @cssstate blank - The time picker has no committed value. * @cssstate open - The popup is open. * @cssstate disabled - The time picker is disabled. */ export default class WaTimeInput extends WebAwesomeFormAssociatedElement { static css: import("lit").CSSResult[]; static shadowRootOptions: { delegatesFocus: boolean; clonable?: boolean; customElementRegistry?: CustomElementRegistry; mode: ShadowRootMode; serializable?: boolean; slotAssignment?: SlotAssignmentMode; }; static get validators(): import("../../internal/webawesome-form-associated-element.js").Validator[]; /** Every segment edit dispatches `input`, so a single observed `input` event marks the field as interacted with. */ assumeInteractionOn: string[]; private readonly hasSlotController; private readonly localize; private readonly popupId; private readonly keyboardHelpId; private pendingValue; /** When true, the next `show()` will move focus into the first popup column (set by Alt+ArrowDown). */ private moveFocusToColumnOnShow; /** Debounces duplicate `change` events when the value hasn't transitioned. */ private lastEmittedValue; popup: WaPopup; valueInput: HTMLInputElement; /** The segments displayed in the input and popup. The wire value is derived from these. */ private segments; /** * Generic segmented-input plumbing. Owns per-segment digit buffers, roving tabindex, navigation keys * (arrows / Home / End / Tab flush / Backspace / Delete), and separator advance. Time-specific rules * (per-field digit semantics, wraparound stepping, layout derivation) are plugged in below. */ private readonly segmentsController; /** Localized term lookup. Falls back to the English string if a locale hasn't translated the key yet. */ private term; get validationTarget(): HTMLInputElement; /** The time picker's name, submitted as a name/value pair with form data. */ name: string; private _value; /** * The time picker's value as a wire-format string matching HTML ``: `HH:mm`, `HH:mm:ss`, or * `HH:mm:ss.sss` (always 24-hour). The setter also accepts a `Date` (extracts local h/m/s) or `null`. */ get value(): string; set value(val: string | Date | null); /** The default value of the form control. Used for form reset. */ defaultValue: string; /** Disables the time picker. */ disabled: boolean; /** Makes the time picker required for form submission. */ required: boolean; /** Makes the input non-editable. The popup still opens for browsing. */ readonly: boolean; /** The time picker's size. */ size: WaTimeInputSize | 'small' | 'medium' | 'large'; handleSizeChange(): void; /** The time picker's visual appearance. */ appearance: 'filled' | 'outlined' | 'filled-outlined'; /** Draws a pill-style time picker with rounded edges. */ pill: boolean; /** The time picker's label. If you need to display HTML, use the `label` slot instead. */ label: string; /** The time picker's hint. If you need to display HTML, use the `hint` slot instead. */ hint: string; /** Forwarded to the hidden form input to enable browser autofill (`on`/`off`/custom tokens). */ autocomplete: string; /** Shows a clear button when the time picker has a value. */ withClear: boolean; /** Renders a "Now" button in the popup footer. */ withNow: boolean; /** Only required for SSR. Set to `true` if you're slotting in a `label` element. */ withLabel: boolean; /** Only required for SSR. Set to `true` if you're slotting in a `hint` element. */ withHint: boolean; /** * The earliest selectable time in wire format. May be later than `max` to represent an overnight range. The picker * delegates reversed-range semantics to the mirrored native ``. */ min: string; /** The latest selectable time in wire format. */ max: string; /** * The granularity, in seconds, matching HTML ``. Default `60` hides the seconds segment. * Values below 60 reveal the seconds segment. `'any'` disables `stepMismatch` enforcement. */ step: number | 'any'; /** Whether the UI uses a 12-hour or 24-hour clock. `auto` follows the resolved locale. */ hourFormat: WaTimeInputHourFormat; /** Whether the popup is open. */ open: boolean; /** Preferred popup placement. */ placement: WaTimeInputPlacement; /** Distance in pixels between the popup and the input. */ distance: number; disconnectedCallback(): void; firstUpdated(): void; protected updated(changed: Map): void; handleDisabledChange(): void; handleOpenChange(): Promise; /** Sets focus on the first empty (else first) segment. */ focus(options?: FocusOptions): void; /** Removes focus from the time picker. */ blur(): void; /** Opens the popup. */ show(): Promise; /** Closes the popup. */ hide(): Promise; /** The time as a `Date` (today + wire value), or `null` when empty. */ get valueAsDate(): Date | null; /** Milliseconds since midnight, or `NaN` when empty. */ get valueAsNumber(): number; formResetCallback(): void; formStateRestoreCallback(state: string | File | FormData | null): void; private get resolvedLocale(); private get isRtl(); /** Final hour12 decision: `auto` defers to the locale; explicit `'12'` / `'24'` overrides. */ private get resolvedHour12(); /** Whether the seconds segment is shown given the current `step` value. */ private get resolvedWithSeconds(); private getLayout; private normalizeIncomingValue; /** Recompute the segment state from the canonical `_value`. Discards any in-progress digit buffers. */ private syncSegmentsFromCanonical; private updateHiddenInput; /** * Recompute the canonical value from the current segments. Fires `input` always, and `change` when the value * transitions, matching `` semantics. */ private recomputeValue; private addOpenListeners; private removeOpenListeners; private handleDocumentFocusIn; private handleDocumentKeyDown; private handleDocumentMouseDown; private focusActiveSegment; private handleSegmentFocus; private handleSegmentBlur; private handleInputWrapperPointerDown; private handleSegmentKeyDown; private handleExpandButtonClick; private handleClearClick; private handleClearMouseDown; private handleNowClick; /** Field list for the visible columns, based on the resolved layout. */ private get columnFields(); private columnItemsFor; private focusFirstColumn; private scrollColumnsToCurrent; /** * Scroll `column` only as far as needed to keep `item` in view. Equivalent to `scrollIntoView({ block: 'nearest' })` * but scoped to the column so it can't scroll ancestors (the page, popup, etc.). Measured with * `getBoundingClientRect` because the items' `offsetParent` isn't the column. */ private keepItemInView; private handleColumnItemClick; private handleColumnKeyDown; /** Visual placeholder rendered in an empty segment. Matches the native `` UI. */ private placeholderFor; /** Localized readable name of the field, used for the spinbutton's aria-label. */ private fieldLabelFor; private segmentAriaValueText; render(): TemplateResult<1>; private renderSegmentGroup; private renderSegment; private renderColumn; } declare global { interface HTMLElementTagNameMap { 'wa-time-input': WaTimeInput; } }