TimePicker 
TimePicker компонент для введення часу
Звичний вибір часу 
Ви можете вибрати час за допомогою введеню даних в інпут або панелі вибору часу
<template>
  <AppTimePicker v-model="model" placeholder="Виберіть час" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const model = ref(null);
</script><template>
  <AppTimePicker v-model="model" placeholder="Виберіть час" />
</template>
<script>
export default {
  data() {
    return {
      model: null,
    };
  },
};
</script>Вибір часового діапазону 
За допомогою атрибута is-range пікер почне працювати в режимі вибору часового діапазону
ПІДКАЗКА
Зверніть увагу, що якщо ви не використовуєте атрибут selectable-range і якщо встановлено атрибут is-range="true", пікер автоматично визначить допустимий діапазон на основі вибраних даних.
<template>
  <AppTimePicker
    v-model="model"
    is-range
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const model = ref(null);
</script><template>
  <AppTimePicker
    v-model="model"
    is-range
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script>
export default {
  data() {
    return {
      model: null,
    };
  },
};
</script>Час за замовчуванням 
У пікері ви можете встановити час, який буде підставлятися за замовчуванням, коли користувач відкриває його вперше. Ви можете налаштувати як для одного пікера, так і для кожного пікера окремо.
<template>
  <AppTimePicker
    v-model="modelFirst"
    :default-time="defaultTime"
    placeholder="Виберіть час"
  />
  <AppTimePicker
    v-model="modelLast"
    is-range
    :default-time="defaultTimeRange"
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const modelFirst = ref(null);
const modelLast = ref(null);
const defaultTime = setTime(15, 30, 30);
const defaultTimeRange = [setTime(12, 0, 30), setTime(17, 28, 30)];
function setTime(hours: number, minutes: number, seconds: number): Date {
  const now = new Date();
  now.setHours(hours);
  now.setMinutes(minutes);
  now.setSeconds(seconds);
  return now;
}
</script><template>
  <AppTimePicker
    v-model="modelFirst"
    :default-time="defaultTime"
    placeholder="Виберіть час"
  />
  <AppTimePicker
    v-model="modelLast"
    is-range
    :default-time="defaultTimeRange"
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script>
export default {
  data() {
    return {
      modelFirst: null,
      modelLast: null,
    };
  },
  computed: {
    defaultTime() {
      return setTime(15, 30, 30);
    },
    defaultTimeRange() {
      return [setTime(12, 0, 30), setTime(17, 28, 30)];
    },
  },
  methods: {
    setTime(hours, minutes, seconds) {
      const now = new Date();
      now.setHours(hours);
      now.setMinutes(minutes);
      now.setSeconds(seconds);
      return now;
    },
  },
};
</script>Часовий пояс 
Атрибут timezone використовується для корекції часу в пікері
ПОПЕРЕДЖЕННЯ
Об'єкт Date завжди залишається в локальному часовому поясі
Коли вибрано дату, компонент атоматично обчислює різницю між локальним часовим поясом користувача і часовим поясом, зазначеним у timezone, і додає або віднімає її від часу вибраної дати для остаточного відображення.
Те ж саме відбувається, коли користувач вперше вибирає дату, тільки в цьому випадку дата повертається, приведена до місцевого часу користувача
ІНФОРМАЦІЯ
Обраний часовий пояс: America/New_York
Ваш місцевий час: Sat Apr 26 2025 16:22:41 GMT+0000 (Coordinated Universal Time)
<template>
  <AppTimePicker v-model="model" timezone="America/New_York" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const model = ref(null);
</script><template>
  <AppTimePicker v-model="model" timezone="America/New_York" />
</template>
<script>
export default {
  data() {
    return {
      model: new Date(),
    };
  },
};
</script>Формати 
Ви можете налаштувати формат, в якому буде відображатися дата в інпуті. Також, на відміну від DateTimePicker, формат впливає на відображення панелей у поповері.
ПІДКАЗКА
Щоб дізнатися більше про доступні формати, перейдіть за цим посиланням
Відображення тільки годин і хвилин:
Відображення часу з AM\PM:
<template>
  <AppTimePicker v-model="modelFirst" format="HH:mm" placeholder="HH:mm" />
  <AppTimePicker v-model="modelLast" format="hh:mm:ss a" placeholder="HH:mm" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const modelFirst = ref(null);
const modelLast = ref(null);
</script><template>
  <AppTimePicker v-model="modelFirst" format="HH:mm" placeholder="HH:mm" />
  <AppTimePicker v-model="modelLast" format="hh:mm:ss a" placeholder="HH:mm" />
</template>
<script>
export default {
  data() {
    return {
      modelFirst: null,
      modelLast: null,
    };
  },
};
</script>Обмеження часового діапазону 
За допомогою атрибута selectable-range ви можете обмежити вибір часу для користувача. Цей атрибут працює для пікера у звичайному режимі та при виборі діапазону.
ПОПЕРЕДЖЕННЯ
Атрибут має строгий формат, а саме 'HH:mm:ss - HH:mm:ss', а для режиму вибору діапазону [‘HH:mm:ss - HH:mm:ss’, ‘HH:mm:ss - HH:mm:ss’].
ІНФОРМАЦІЯ
Якщо пікер не має початкового значення і налаштовано атрибут selectable-range, то час, який буде вибрано за замовчуванням (поточний час або час, який було передано в атрибуті default-time), буде визначено відносно атрибуту selectable-range.
- Якщо поточний час менший за початковий, буде обрано початковий час
- Якщо поточний час більший за кінцевий час, буде обрано кінцевий час
- Якщо поточний час знаходиться в діапазоні, тоді буде обрано його
<template>
  <AppTimePicker
    v-model="modelFirst"
    selectable-range="12:30:30 - 16:00:00"
    placeholder="Виберіть час"
  />
  <AppTimePicker
    v-model="modelLast"
    is-range
    :selectable-range="['12:30:30 - 16:00:00', '12:00:30 - 14:30:00']"
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const modelFirst = ref(null);
const modelLast = ref(null);
</script><template>
  <AppTimePicker
    v-model="modelFirst"
    selectable-range="12:30:30 - 16:00:00"
    placeholder="Виберіть час"
  />
  <AppTimePicker
    v-model="modelLast"
    is-range
    :selectable-range="['12:30:30 - 16:00:00', '12:00:30 - 14:30:00']"
    start-placeholder="Початковий час"
    end-placeholder="Кінцевий час"
  />
</template>
<script>
export default {
  data() {
    return {
      modelFirst: null,
      modelLast: null,
    };
  },
};
</script>API 
Атрибути 
| Назва | Опис | Тип | За замовчуванням | 
|---|---|---|---|
| v-model / model-value | значення прив'язки, якщо це масив, то довжина повинна бути 2 | null/Date/object | null | 
| is-range | чи відображати пікер у режимі вибору часового діапазону | boolean | false | 
| time-format | формат, в якому буде відображатися час у пікері, а також відповідні панелі у поповері.більше | string | HH:mm:ss | 
| default-time | час, який буде встановлено за замовчуванням.більше | object | new Date() | 
| selectable-range | обмеження на вибір часу. Очікуваний формат більше "HH:mm:ss - HH:mm:ss"["HH:mm:ss - HH:mm:ss","HH:mm:ss - HH:mm:ss"]. | string/object | " | 
| auto-apply^0.2.0 | застосування змін без натискання кнопки "Застосувати" | boolean | false | 
| disabled | чи заблокований пікер | boolean | false | 
| readonly | чи пікер доступний тільки для читання | boolean | false | 
| input-readonly^0.0.2 | перевести інпут в режим read-only, але через поповер є можливість обирати дату | boolean | false | 
| clearable | відображення контролера для очищення входу даних, коли він переповнений | boolean | false | 
| timezone | який часовий пояс буде використовуватися для корекції дати.більше | string | " | 
| placeholder | заповнювач, який буде відображатися в інпуті, коли пікер працює в одиночному режимі | string | " | 
| start-placeholder | заповнювач, який буде відображено у першому інпуті, коли пікер працює у режимі діапазону | string | " | 
| end-placeholder | заповнювач, який буде відображено у останньому інпуті, коли пікер працює у режимі діапазону | string | " | 
| align | положення поповера | string | left | 
| start-id^0.2.0 | id для першого нативного інпута (також використовується для нативного інпута, якщо він лише один) | string | " | 
| end-id^0.2.0 | id для останнього нативного інпута | string | " | 
| start-name^0.2.0 | атрибут name для першого нативного інпута (також використовується для нативного інпута, якщо він лише один) | string | " | 
| end-name^0.2.0 | атрибут name для останнього нативного інпута | string | " | 
| apply-text | текст, що відображається в кнопці застосувати у поповері | string | "Apply" | 
| cancel-text | текст, що відображається в кнопці скасування у поповері | string | "Cancel" | 
| invalid | пікер має невірне значення | boolean | false | 
| z-index^0.3.0 | z-index для вмісту поповера | number | 1000 | 
| client-only-popover-content^0.3.0 | Відображати вміст поповеру всередині  | boolean | false | 
| open-delay | затримка в мілісекундах перед відкриттям поповера | number | 0 | 
| close-delay | затримка в мілісекундах перед закриттям поповера | number | 150 | 
| append-to-body |  визначає, чи слід додавати вміст спливаючого вікна до  bodyзамість того, щоб вкладати його в структуру DOM компонента. | boolean | true | 
| stay-opened | залишайте пікап відкритим після відкриття. Використовуйте його для налагодження або дослідження поповера | boolean | false | 
Події 
| Назва | Опис | Тип | 
|---|---|---|
| change | спрацьовує при зміні значення | Function | 
| focus | спрацьовує, коли пікер знаходиться в фокусі | Function | 
| blur | спрацьовує, коли пікер перестає бути в фокусі | Function | 
Слоти 
| Назва | Опис | 
|---|---|
| default | кастомне посилання для поповера | 
| separator | кастомний вміст роздільника діапазону | 
Слоти ^0.0.2
Цей слот замінює поле введення дати. Нижче наведено таблицю з доступними пропсами для цього слоту
| Назва | Опис | Тип | 
|---|---|---|
| value | Значення, яке передається в поле введення (без форматування) | null/Date/object | 
| popoverVisible | повертає, чи відкритий поповер в даний момент чи ні | boolean | 
| input | встановлення нового значення в пікері | Function | 
| blur | прибрати фокус з пікера | Function | 
| focus | виконати фокус на пікер | Function | 
<template>
  <AppTimePicker v-model="model">
    <template #default="{ value, popoverVisible, input, focus }">
      <input
        :value="dateToStringTime(value)"
        :class="{ 'custom-input--focus': popoverVisible }"
        class="custom-input"
        placeholder="Виберіть час"
        @focus="focus"
        @input="event => stringDateToDate(event, input)"
      />
    </template>
  </AppTimePicker>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { format, isDate, parse } from 'date-fns';
const model = ref(null);
const timeFormat = 'HH:ss:mm';
function dateToStringTime(value: Date | null) {
  if (!value || !isDate(value)) return '';
  return format(value, timeFormat);
}
function stringDateToDate(event: InputEvent, cb: (value: unknown) => void) {
  const value = (event.target as HTMLInputElement).value;
  const parsed = parse(value, timeFormat, new Date());
  if (!value) {
    cb(null);
  }
  if (value.length === timeFormat.length && isDate(parsed)) {
    cb(parsed);
  }
}
</script>
<style lang="scss" scoped>
.custom-input {
  width: 100%;
  border: 1px solid;
  &:focus,
  &--focus {
    border-color: blue;
  }
}
</style><template>
  <AppTimePicker v-model="model">
    <template #default="{ value, popoverVisible, input, focus }">
      <input
        :value="dateToStringTime(value)"
        :class="{ 'custom-input--focus': popoverVisible }"
        class="custom-input"
        placeholder="Виберіть час"
        @focus="focus"
        @input="event => stringDateToDate(event, input)"
      />
    </template>
  </AppTimePicker>
</template>
<script>
export default {
  data() {
    return {
      model: null,
      timeFormat: 'HH:ss:mm',
    };
  },
  methods: {
    dateToStringTime(value) {
      if (!value || !isDate(value)) return '';
      return format(value, this.timeFormat);
    },
    stringDateToDate(event, cb) {
      const value = event.target.value;
      const parsed = parse(value, this.timeFormat, new Date());
      if (!value) {
        cb(null);
      }
      if (value.length === this.timeFormat.length && isDate(parsed)) {
        cb(parsed);
      }
    },
  },
};
</script>
<style lang="scss" scoped>
.custom-input {
  width: 100%;
  border: 1px solid;
  &:focus,
  &--focus {
    border-color: blue;
  }
}
</style>Доступні властивості компонента 
| Назва | Опис | Тип | 
|---|---|---|
| popoverVisible | повертає, чи відкрито спливаюче вікно в даний момент чи ні | object | 
| focus | виконати фокус на пікер | Function | 
| blur | прибрати фокус з пікера | Function |