Skip to content

BbTimePickerInput

Segmented time field with hour/minute columns; 24-hour string model.

import { BbTimePickerInput } from 'bitboss-ui';

On this page

Props

NameDescription
adaptive Type: booleanDefaultconfig.adaptive (true)

On mobile the time columns open inside a bottom off-canvas sheet instead of a floating popover. When unset, falls back to the global config.adaptive.

Set it per instance only to disagree with the app-wide config.adaptive, or to false for viewport-independent tests.

See example
ampm Type: booleanDefaultfalse

12-hour display with an AM/PM segment. Purely a field-composition concern: the model stays 24-hour. Type A/P (or ArrowUp/Down) to set the meridiem.

Display only: the model still holds 24-hour text, so a form submits the same value whichever way the field shows it.

See example
append:icon Type: string

Name of the icon to be added at the end of the input.

autocomplete Type: stringDefault"off"

Guides the browser as to the type of information expected in the field.

autofocus Type: Booleanish

Focuses the field when it mounts (a dialog already open included), unless the user is typing in another field.

clearable Type: booleanDefaultfalse

Displays a clear button when the input has a value and is being interacted with.

compact Type: booleanDefaultfalse

Compact density: the field uses the -compact twins of --bb-input-h, --bb-input-py and --bb-label-spacing-y, so a --bb-input-h set on the component is ignored while it is on. Size a compact field with --bb-input-h-compact (and --bb-input-py-compact).

description Type: string

Descriptive text displayed below the label and above the input. Always visible and linked to the input via aria-describedby (after any errors / warnings, before the hint).

disabled Type: booleanDefaultfalse

Disables the component.

disableWriting Type: boolean | "mobile" | "desktop"Defaultfalse

Disables typing into the input. Use 'mobile' / 'desktop' to disable typing on one platform only.

Reach for "mobile" when touch users should pick from the columns while desktop users keep typing.

See example
errors Type: string | string[]

Error messages under the field, a string or string array. They render in an aria-live="polite" region and are referenced first from the segment inputs' aria-describedby, so they are re-read when a segment regains focus.

formless Type: booleanDefaultfalse

Keep this control out of the enclosing BbForm entirely: not submitted, not dirty, not reset, not validated. For a control that is not form data (a filter, a "show advanced" switch).

hasErrors Type: booleanDefaultfalse

Define if the component should be in an error state. It usually attaches a CSS class for styling purposes.

hasWarnings Type: booleanDefaultfalse

Define if the component should be in a warning state. Same chrome as errors with --bb-warn; errors take priority.

hideLabel Type: booleanDefaultfalse

Visually hides the label of the input while maintaining accessibility.

hint Type: string

Text box to be displayed near the input, usually to indicate instructions.

id Type: string

The id of the native control; the label's for and the description and message ids derive from it. Generated when omitted.

inputAlign Type: FieldCrossAlign

Vertical position of the control in a side-by-side row; not inputPosition, the horizontal one. Omitted, the control's first line meets the label's.

label requiredType: string

Text content of the label of the element.

labelAlign Type: FieldCrossAlign

Vertical position of the label block in a side-by-side row; not labelPosition, the horizontal one. Omitted, the label's first line meets the control's.

labelMode Type: "outside" | "floating" | "inside"

Label rendering mode.

labelPosition Type: "left" | "center" | "right"

Sets the text alignment of the label.

layout Type: Responsive<FieldLayout>

How label and input sit together: 'vertical', 'horizontal' (50/50), 'auto', 'label-fill', 'input-fill', a ratio like 'xx xxxxx', or a per-breakpoint map ({ default: 'vertical', md: 'xx xxxxx' }).

loading Type: booleanDefaultfalse

Sets the component in a loading state, usually triggering some visual styles.

max Type: string

Maximum selectable time, HH:mm (other shapes throw at setup). The columns disable the entries no in-range time can use; a typed value (or an hour beside an out-of-range minute) is clamped with a disabled_time error.

Later times are disabled in the columns. A typed value past the bound is clamped on commit and reported through error, so turn that payload into a message of your own.

See example
min Type: string

Minimum selectable time, HH:mm (other shapes throw at setup). The columns disable the entries no in-range time can use; a typed value (or an hour beside an out-of-range minute) is clamped with a disabled_time error.

Earlier times are disabled in the columns. A typed value before the bound is clamped on commit and reported through error, so turn that payload into a message of your own.

See example
modelValue Type: string | string[] | null

v-model value: null for empty, a 24-hour HH:mm (or HH:mm:ss with seconds) string, or a two-element array when range is true.

name Type: string

Defines the name of the input.

label does not supply the native name. Set it whenever the value is submitted with a plain form; inside a BbForm it is the field key.

See example
offCanvasProps Type: Partial<BbOffCanvasProps>

Props for the phone sheet (the BbOffCanvas that adaptive renders on mobile), spread over its defaults. A pt inside it styles only the sheet (passthrough guide § Inside the sheet). The sheet hides its ✕; { hideClose: false } brings it back.

See example
persistentHint Type: booleanDefaultfalse

Keeps the hint displayed.

placeholder Type: string

Text shown while the field is empty.

prepend:icon Type: string

Name of the icon to be added at the start of the input.

pt Type: (PtMap<BbTimePickerInputPtPart, BbTimePickerInputPtState> & { "root:outline"?: PtValue | undefined; "icon:outline"?: PtValue | undefined; "root:secondary"?: PtValue | undefined; "icon:secondary"?: PtValue | undefined; "spinner:outline"?: PtValue | undefined; "spinner:secondary"?: PtValue | undefined; "clear:outline"?: PtValue | undefined; "clear:secondary"?: PtValue | undefined; "root:ghost"?: PtValue | undefined; "icon:ghost"?: PtValue | undefined; "spinner:ghost"?: PtValue | undefined; "clear:ghost"?: PtValue | undefined; "label:outline"?: PtValue | undefined; "label:secondary"?: PtValue | undefined; "label:ghost"?: PtValue | undefined; "description:outline"?: PtValue | undefined; "description:secondary"?: PtValue | undefined; "description:ghost"?: PtValue | undefined; "message:outline"?: PtValue | undefined; "message:secondary"?: PtValue | undefined; "message:ghost"?: PtValue | undefined; "hint:outline"?: PtValue | undefined; "hint:secondary"?: PtValue | undefined; "hint:ghost"?: PtValue | undefined; "input:outline"?: PtValue | undefined; "input:secondary"?: PtValue | undefined; "input:ghost"?: PtValue | undefined; "box:outline"?: PtValue | undefined; "box:secondary"?: PtValue | undefined; "box:ghost"?: PtValue | undefined; "prefix:outline"?: PtValue | undefined; "prefix:secondary"?: PtValue | undefined; "prefix:ghost"?: PtValue | undefined; "suffix:outline"?: PtValue | undefined; "suffix:secondary"?: PtValue | undefined; "suffix:ghost"?: PtValue | undefined; "activator:outline"?: PtValue | undefined; "activator:secondary"?: PtValue | undefined; "activator:ghost"?: PtValue | undefined; })

Passthrough, object form: the same keys as the pt:* attributes without the prefix. See the pt:<part> row.

pt:<part> Type: PtValue

Passthrough, attribute form: one attribute per part, pt:<part>, and per part and state, pt:<part>:<state>. Parts: activator, box, cellColumnHeader, clear, description, header, hint, icon, input, item, label, message, panel, prefix, root, sheet, spinner, suffix. States: disabled, errors, ghost, hasValue, loading, open, outline, readonly, secondary, selected, warnings.

See example
range Type: booleanDefaultfalse

Range selection: v-model expects a two-element array [start, end]. An inverted pair swaps on finalize with an end_before_start error.

Keep the model an array: seed and clear it with []. A reversed pair is swapped, so the field cannot hold a window across midnight: use BbTimePicker for a night shift.

See example
readonly Type: booleanDefaultfalse

Sets the input in a readonly state.

required Type: booleanDefaultfalse

Sets the input as required.

reverse Type: booleanDefaultfalse

Reverses the layout: the order of the label and the input is swapped.

rules Type: RuleExpression<string | string[] | null>

vee-validate rules for this field. Only inside a BbForm.

seconds Type: booleanDefaultfalse

Adds the seconds segment. Without it an incoming value carrying seconds displays truncated and zeroes out on the next user commit.

See example
step Type: numberDefault1

Minute granularity for the popover minute column. Constrains what the columns produce, never what typing accepts; ArrowUp/Down on a segment always step by 1.

See example
transitionDuration Type: number

Transition duration, in milliseconds, for the popover appearance.

validationLabel Type: string

The field's name in validation messages ({field}): "Email is not valid". Defaults to the label (or legend), then "This field"; never the name. Set it when the label is hidden or reads badly in a sentence (icon-only, a question). BbForm only.

validationMode Type: ValidationMode

When the field validates: aggressive (each change), balanced (on leave, then live while in error), lazy (on leave), submit-only, submit-live. Unset: the BbForm's validation-mode, then formControls.validationMode ('balanced'). BbForm only.

variant Type: InputVariantTypeDefault'outline'

The field box's look, with BbButton's names and tokens. Colours only, so a form never reflows; 'ghost' has no border in any state, 'none' no look at all (you own hover, focus and the states). Register more with the plugin's inputVariants.

warnings Type: string | string[]

Warning messages under the field, a string or array: amber, in their own aria-live region and in the control's aria-describedby after the errors. Non-empty turns on the warning state; errors win when both are set.

v-model

Values kept in sync through v-model.

NameDescription
modelValue Type: string | string[] | null

A wall-clock string with no date or timezone. Never parse it with new Date('09:00'); attach the relevant date first.

See example

Events

NameDescription
active Type: (): void

Emitted when the composite control receives focus.

error Type: (error: TimePickerInputError): void

Emitted on every normalization (clamped time, swapped range).

Fires when a commit was corrected: code is disabled_time (a typed time clamped to a bound) or end_before_start (range swapped), with the original and normalized values. Map it to errors and clear them on active.

See example
focus Type: (event: FocusEvent): void

Emitted when a native text field inside the control gains focus.

hidden Type: (): void

Emitted once the time panel has finished closing.

hide Type: (): void

Emitted as soon as the time panel starts to close.

inactive Type: (): void

Emitted when focus/click moves outside the composite control.

show Type: (): void

Emitted as soon as the time panel (the popover, or the sheet on a phone) starts to open.

shown Type: (): void

Emitted once the time panel is open and its open transition has finished.

update:modelValue Type: (value: string | string[] | null): void

Emitted whenever the selected time changes. null for cleared values, a HH:mm(:ss) string, or an array in range mode.

Slots

The listed properties are the ones exposed to the slot scope.

NameDescription
append Type: object

Content rendered after the time fields (before the clock button).

append:outer Type: object

Content rendered after the entire control, outside the input chrome.

description Type: BbTimePickerInputDescriptionSlotProps

Replaces the description text. Provided alone (no description prop) it still renders the description region and wires it into aria-describedby.

label Type: BbTimePickerInputLabelSlotProps

Replaces the default label text rendered above the input.

prefix Type: object

Inline content at the start of the field area.

prepend Type: object

Content rendered before the time fields, at the start of the field box.

prepend:outer Type: object

Content rendered before the entire control, outside the input chrome.

suffix Type: object

Inline content at the end of the field area.

Renamed and removed

Names from v2 and from earlier 3.0 betas that no longer work, and what to write instead.

  • slotappend-outerappend:outerfails silently
  • directionlayoutfails silently
  • hasWarninghasWarningsfails silently
  • slotprepend-outerprepend:outerfails silently
  • validateOnvalidationModefails silently

    An array of events became one mode (aggressive | balanced | lazy | submit-only | submit-live). The old defaults (['blur'], ['inactive'], a toggle's ['update:modelValue', 'change', 'blur']) are balanced, the new default: delete the prop. A text field on ['update:modelValue'] is validation-mode="aggressive". Set it once on <BbForm validation-mode> instead of per field.

  • vidremovedfails silently

    A display name (v2: vid="Email address") is now validation-label; a field path (3.0 betas: vid="address.city") is now name (brackets for a native post: address[city]). check --fix picks by the value.