A lightweight date + time picker component built on Vuetify 4 and Vue 3. Provides a combined date & time selection experience in a single, clean input — filling the gap where Vuetify doesn't ship an official datetime picker.
- Date picker — uses Vuetify's
v-date-picker - Time picker — hour & minute
v-selectdropdowns, 12h or 24h, with configurableminuteStep - v-model support — binds to a
Date | null - Vuetify-native — respects your Vuetify theme, density, and variant props
- Min / max date constraints, including full datetime bounds
- minTime / maxTime — restrict selectable times of day (e.g. business hours) on every date
- Clearable — one-click reset
- Simple layout — date picker on top, hour:minute below, Cancel/OK actions
- Accessible — error messages, hints,
$attrsforwarding
npm install vuetify-simple-datetime-inputPeer dependencies:
vue ^3.3,vuetify ^4.0,@mdi/font ^7.0
import { createApp } from 'vue';
import { createVuetify } from 'vuetify';
import VuetifySimpleDateTimeInputPlugin from 'vuetify-simple-datetime-input';
import 'vuetify/styles';
import 'vuetify-simple-datetime-input/dist/style.css';
const app = createApp(App);
app.use(createVuetify());
app.use(VuetifySimpleDateTimeInputPlugin);
app.mount('#app');Then in any template:
<VuetifySimpleDateTimeInput v-model="myDate" />import { VuetifySimpleDateTimeInput } from 'vuetify-simple-datetime-input';| Prop | Type | Default | Description |
|---|---|---|---|
modelValue |
Date | string | null |
null |
Bound value (v-model) |
label |
string |
"Date & Time" |
Text field label |
variant |
"outlined" | "filled" | "underlined" | "solo" | "plain" |
"outlined" |
Vuetify field variant |
density |
"default" | "comfortable" | "compact" |
"default" |
Field density |
clearable |
boolean |
true |
Show clear (×) button |
disabled |
boolean |
false |
Disable the field |
use24h |
boolean |
false |
Use 24-hour format instead of AM/PM |
min |
string | Date | null |
undefined |
Earliest selectable date. Pass a full ISO datetime (e.g. 2026-07-05T09:00) to also bound the time-of-day on that day |
max |
string | Date | null |
undefined |
Latest selectable date. Pass a full ISO datetime to also bound the time-of-day on that day |
minTime |
string ("HH:mm") |
undefined |
Earliest selectable time of day, applied every day — e.g. "09:00" for business hours |
maxTime |
string ("HH:mm") |
undefined |
Latest selectable time of day, applied every day — e.g. "17:30" for business hours |
firstDayOfWeek |
number |
0 |
First day of week (0 = Sunday, 1 = Monday) |
minuteStep |
number |
1 |
Restricts minute selection to multiples of this step, e.g. 5 or 10, for quick slot picking |
hint |
string |
undefined |
Hint text below the field |
errorMessages |
string | string[] |
undefined |
Error messages to display |
| Event | Payload | Description |
|---|---|---|
update:modelValue |
Date | null |
Emitted when value changes |
The v-text-field uses v-bind="{ ...activatorProps, ...$attrs }", so any extra attributes you pass (e.g. prepend-icon, append-inner-icon, class, style) are forwarded directly to the underlying text field.
# Install dependencies
npm install
# Start dev playground
npm run dev
# Build library
npm run buildMIT