@rotki/ui-library 2.9.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +3 -3
  2. package/dist/components/accordions/accordion/RuiAccordion.vue.js +87 -8
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
  4. package/dist/components/accordions/accordion/RuiAccordion.vue2.js +1 -62
  5. package/dist/components/accordions/accordion/RuiAccordion.vue2.js.map +1 -1
  6. package/dist/components/alerts/RuiAlert.vue.d.ts +3 -3
  7. package/dist/components/buttons/button/RuiButton.vue.d.ts +9 -5
  8. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +9 -5
  9. package/dist/components/calendar/RuiCalendar.vue.js +12 -0
  10. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  11. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  12. package/dist/components/calendar/RuiCalendarMenu.vue2.js +2 -2
  13. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  14. package/dist/components/calendar/state.js +1 -1
  15. package/dist/components/calendar/state.js.map +1 -1
  16. package/dist/components/cards/RuiCard.vue.d.ts +6 -6
  17. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +3 -4
  18. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +70 -251
  19. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  20. package/dist/components/date-time-picker/use-date-time-selection.d.ts +38 -0
  21. package/dist/components/date-time-picker/use-date-time-selection.js +286 -0
  22. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -0
  23. package/dist/components/date-time-picker/use-keyboard-handler.d.ts +2 -0
  24. package/dist/components/date-time-picker/use-keyboard-handler.js +71 -60
  25. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  26. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +29 -25
  27. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +5 -3
  28. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  29. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +2 -2
  30. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +13 -8
  31. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  32. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +9 -5
  33. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +12 -8
  34. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  35. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +9 -5
  36. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +4 -4
  37. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +29 -25
  38. package/dist/components/forms/select/RuiMenuSelect.vue2.js +4 -2
  39. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  40. package/dist/components/forms/slider/RuiSlider.vue2.js +14 -11
  41. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  42. package/dist/components/forms/switch/RuiSwitch.vue2.js +10 -7
  43. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  44. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +3 -3
  45. package/dist/components/forms/text-area/RuiTextArea.vue2.js +15 -12
  46. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  47. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +3 -3
  48. package/dist/components/forms/text-field/RuiTextField.vue2.js +13 -10
  49. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  50. package/dist/components/icons/IconBrowser.vue.d.ts +3 -0
  51. package/dist/components/icons/LazyIcon.vue.d.ts +10 -0
  52. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +3 -3
  53. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +2 -2
  54. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +2 -2
  55. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +2 -2
  56. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +2 -2
  57. package/dist/components/overlays/notification/RuiNotification.vue.d.ts +2 -2
  58. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +2 -2
  59. package/dist/components/tables/RuiDataTable.vue.d.ts +9 -5
  60. package/dist/components/tables/RuiExpandButton.vue.d.ts +2 -2
  61. package/dist/components/tables/RuiTableHead.vue.d.ts +9 -5
  62. package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
  63. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -3
  64. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +9 -5
  65. package/dist/components/time-picker/RuiTimePicker.vue2.js +0 -1
  66. package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
  67. package/dist/composables/defaults/table.js +1 -1
  68. package/dist/composables/defaults/table.js.map +1 -1
  69. package/dist/composables/icons.js +1 -1
  70. package/dist/composables/icons.js.map +1 -1
  71. package/dist/composables/use-rui-i18n.js +1 -1
  72. package/dist/composables/use-rui-i18n.js.map +1 -1
  73. package/dist/style.css +98 -61
  74. package/dist/web-types.json +116 -72
  75. package/package.json +31 -40
  76. package/dist/components/accordions/accordion/RuiAccordion.vue3.js +0 -18
  77. package/dist/components/accordions/accordion/RuiAccordion.vue3.js.map +0 -1
@@ -1,25 +1,22 @@
1
1
  import { getRootAttrs, getNonRootAttrs } from "../../utils/helpers.js";
2
- import { defineComponent, mergeModels, useCssVars, unref, computed, useModel, ref, watch, onMounted, createBlock, openBlock, mergeProps, isRef, withCtx, createVNode, renderSlot, createElementVNode, createElementBlock, createCommentVNode, normalizeClass, createTextVNode, toDisplayString, withModifiers, nextTick } from "vue";
2
+ import { defineComponent, mergeModels, useCssVars, unref, computed, useModel, ref, createBlock, openBlock, mergeProps, isRef, withCtx, createVNode, renderSlot, createElementVNode, createElementBlock, createCommentVNode, normalizeClass, createTextVNode, toDisplayString, withModifiers, nextTick } from "vue";
3
3
  import { logicOr, logicAnd } from "@vueuse/math";
4
- import dayjs from "dayjs";
5
4
  import RuiButton from "../buttons/button/RuiButton.vue.js";
6
5
  import _sfc_main$1 from "./RuiDateTimePickerMenu.vue.js";
6
+ import { useDateTimeSelection } from "./use-date-time-selection.js";
7
7
  import { useInputHandler } from "./use-input-handler.js";
8
8
  import { useKeyboardHandler } from "./use-keyboard-handler.js";
9
- import { guessTimezone, includeSeconds, includeMilliseconds } from "./utils.js";
10
9
  import RuiIcon from "../icons/RuiIcon.vue.js";
11
10
  import RuiMenu from "../overlays/menu/RuiMenu.vue.js";
12
- import { useRuiI8n } from "../../composables/use-rui-i18n.js";
13
- import { RUI_I18N_KEYS } from "../../i18n/keys.js";
14
- import { useFocusWithin, useFocus, isDefined, watchIgnorable } from "@vueuse/core";
11
+ import { useFocusWithin, useFocus, isDefined } from "@vueuse/core";
15
12
  import { get, set } from "@vueuse/shared";
16
- const _hoisted_1 = ["tabindex"];
13
+ const _hoisted_1 = ["data-error", "tabindex"];
17
14
  const _hoisted_2 = {
18
15
  key: 0,
16
+ "data-id": "required-indicator",
19
17
  class: "text-rui-error"
20
18
  };
21
- const _hoisted_3 = ["disabled", "value", "placeholder", "readonly"];
22
- const MILLISECONDS = 1e3;
19
+ const _hoisted_3 = ["disabled", "value", "placeholder", "readonly", "aria-invalid"];
23
20
  const _sfc_main = /* @__PURE__ */ defineComponent({
24
21
  ...{
25
22
  name: "RuiDateTimePicker",
@@ -50,7 +47,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
47
  emits: ["update:modelValue"],
51
48
  setup(__props) {
52
49
  useCssVars((_ctx) => ({
53
- "v95e55b90": unref(labelWithQuote)
50
+ "a01b5b3e": unref(labelWithQuote)
54
51
  }));
55
52
  const modelValue = useModel(__props, "modelValue");
56
53
  const props = __props;
@@ -61,17 +58,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
61
58
  };
62
59
  const isOpen = ref(false);
63
60
  const cursorPosition = ref(0);
64
- const internalErrorMessages = ref([]);
65
- const selectedYear = ref();
66
- const selectedMonth = ref();
67
- const selectedDay = ref();
68
- const selectedHour = ref();
69
- const selectedMinute = ref();
70
- const selectedSecond = ref();
71
- const selectedMillisecond = ref();
72
- const selectedTimezone = ref(guessTimezone());
73
61
  const currentValue = ref();
74
- const now = ref(dayjs.tz(void 0, guessTimezone()));
75
62
  const textInput = ref();
76
63
  const activator = ref();
77
64
  const menuWrapperRef = ref();
@@ -79,36 +66,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
79
66
  const { focused: activatorFocusedWithin } = useFocusWithin(activator);
80
67
  const { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);
81
68
  const { focused: searchInputFocused } = useFocus(textInput);
82
- const { setValue, update, getCurrent } = useInputHandler({
83
- DD: selectedDay,
84
- MM: selectedMonth,
85
- YYYY: selectedYear,
86
- HH: selectedHour,
87
- mm: selectedMinute,
88
- ss: selectedSecond,
89
- SSS: selectedMillisecond
90
- }, currentValue);
91
- const minAllowedDate = computed(() => {
92
- if (props.minDate === void 0) {
93
- return new Date(1970, 0, 1);
94
- }
95
- if (props.type === "epoch" && typeof props.minDate === "number") {
96
- return new Date(props.minDate * MILLISECONDS);
97
- }
98
- return new Date(props.minDate);
99
- });
100
- const maxAllowedDate = computed(() => {
101
- if (props.maxDate === void 0) {
102
- return void 0;
103
- }
104
- if (props.maxDate === "now") {
105
- return get(now).toDate();
106
- }
107
- if (props.type === "epoch" && typeof props.maxDate === "number") {
108
- return new Date(props.maxDate * MILLISECONDS);
109
- }
110
- return new Date(props.maxDate);
69
+ const {
70
+ clear: clearSelection,
71
+ getDateTime,
72
+ internalErrorMessages,
73
+ maxAllowedDate,
74
+ minAllowedDate,
75
+ segmentData,
76
+ selectedDate,
77
+ selectedDay,
78
+ selectedHour,
79
+ selectedMillisecond,
80
+ selectedMinute,
81
+ selectedMonth,
82
+ selectedSecond,
83
+ selectedTime,
84
+ selectedTimezone,
85
+ selectedYear,
86
+ setNow,
87
+ valueSet
88
+ } = useDateTimeSelection({
89
+ accuracy: props.accuracy,
90
+ allowEmpty: props.allowEmpty,
91
+ maxDate: props.maxDate,
92
+ minDate: props.minDate,
93
+ modelValue,
94
+ type: props.type
111
95
  });
96
+ const { setValue, getCurrent } = useInputHandler(segmentData, currentValue);
112
97
  const dateFormat = computed(() => {
113
98
  const dateFormat2 = props.format;
114
99
  const format = baseFormats[dateFormat2];
@@ -121,72 +106,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
121
106
  });
122
107
  const {
123
108
  getCurrentSegment,
109
+ handleBlur,
124
110
  handleClick,
125
111
  handleFocus,
126
112
  handleInput,
127
113
  handleInputSelection,
128
114
  handleKeyDown,
115
+ handleMouseDown,
129
116
  handlePaste,
130
117
  setSegment
131
118
  } = useKeyboardHandler({
119
+ accuracy: props.accuracy,
132
120
  currentValue,
133
121
  cursorPosition,
122
+ dateFormat,
134
123
  disabled: props.disabled,
135
- getDateTime,
136
124
  getCurrent,
125
+ getDateTime,
137
126
  readonly: props.readonly,
138
- dateFormat,
139
127
  setValue,
140
- textInput,
141
- accuracy: props.accuracy
128
+ textInput
142
129
  });
143
- const { t } = useRuiI8n();
144
130
  function handleInputClick(event) {
131
+ handleClick(event);
145
132
  if (!get(isOpen)) {
146
133
  set(isOpen, true);
147
134
  }
148
- handleClick(event);
149
135
  }
150
136
  const anyFocused = logicOr(activatorFocusedWithin, menuWrapperFocusedWithin);
151
- const selectedDate = computed({
152
- set(value) {
153
- set(selectedYear, value?.getFullYear());
154
- set(selectedMonth, value ? value.getMonth() + 1 : void 0);
155
- set(selectedDay, value?.getDate());
156
- },
157
- get() {
158
- if (!(isDefined(selectedYear) && isDefined(selectedMonth) && isDefined(selectedDay))) {
159
- return void 0;
160
- }
161
- const date = /* @__PURE__ */ new Date();
162
- date.setFullYear(get(selectedYear));
163
- date.setMonth(get(selectedMonth) - 1);
164
- date.setDate(get(selectedDay));
165
- return date;
166
- }
167
- });
168
- const selectedTime = computed({
169
- set(value) {
170
- set(selectedHour, value?.getHours());
171
- set(selectedMinute, value?.getMinutes());
172
- set(selectedSecond, value?.getSeconds());
173
- set(selectedMillisecond, value?.getMilliseconds());
174
- },
175
- get() {
176
- if (!(isDefined(selectedHour) && isDefined(selectedMinute))) {
177
- return void 0;
178
- }
179
- const date = /* @__PURE__ */ new Date();
180
- date.setHours(
181
- get(selectedHour),
182
- get(selectedMinute),
183
- get(selectedSecond) ?? 0,
184
- get(selectedMillisecond) ?? 0
185
- );
186
- return date;
187
- }
188
- });
189
- const valueSet = computed(() => isDefined(selectedDate) && isDefined(selectedTime));
190
137
  const labelWithQuote = computed(() => {
191
138
  if (!props.label)
192
139
  return '"\\200B"';
@@ -255,17 +202,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
255
202
  });
256
203
  }
257
204
  function clear(segmentType) {
258
- set(internalErrorMessages, []);
259
205
  {
260
- set(selectedYear, void 0);
261
- set(selectedMonth, void 0);
262
- set(selectedDay, void 0);
263
- set(selectedHour, void 0);
264
- set(selectedMinute, void 0);
265
- set(selectedSecond, void 0);
266
- set(selectedMillisecond, void 0);
206
+ clearSelection();
267
207
  set(currentValue, void 0);
268
- set(modelValue, void 0);
269
208
  return;
270
209
  }
271
210
  }
@@ -275,137 +214,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
275
214
  event.stopPropagation();
276
215
  }
277
216
  }
278
- function getDateTime() {
279
- let dateTime = dayjs();
280
- if (isDefined(selectedYear)) {
281
- dateTime = dateTime.year(get(selectedYear));
282
- }
283
- if (isDefined(selectedMonth)) {
284
- dateTime = dateTime.month(get(selectedMonth) - 1);
285
- }
286
- if (isDefined(selectedDay)) {
287
- const daysInMonth = dateTime.daysInMonth();
288
- const day = Math.min(get(selectedDay), daysInMonth);
289
- dateTime = dateTime.date(day);
290
- }
291
- if (isDefined(selectedHour)) {
292
- dateTime = dateTime.hour(get(selectedHour));
293
- }
294
- if (isDefined(selectedMinute)) {
295
- dateTime = dateTime.minute(get(selectedMinute));
296
- }
297
- if (isDefined(selectedSecond)) {
298
- dateTime = dateTime.second(get(selectedSecond));
299
- }
300
- if (isDefined(selectedMillisecond)) {
301
- dateTime = dateTime.millisecond(get(selectedMillisecond));
302
- }
303
- return dateTime;
304
- }
305
- function setNow() {
306
- set(internalErrorMessages, []);
307
- const date = dayjs();
308
- set(now, date);
309
- set(selectedYear, date.year());
310
- set(selectedMonth, date.month() + 1);
311
- set(selectedDay, date.date());
312
- set(selectedHour, date.hour());
313
- set(selectedMinute, date.minute());
314
- set(selectedSecond, includeSeconds(props.accuracy) ? date.second() : 0);
315
- set(selectedMillisecond, includeMilliseconds(props.accuracy) ? date.millisecond() : 0);
316
- nextTick(() => {
317
- updateModelValue();
318
- });
319
- }
320
- function isDateValid(date) {
321
- const min = get(minAllowedDate);
322
- const max = get(maxAllowedDate);
323
- set(internalErrorMessages, []);
324
- if (min && date.isBefore(min)) {
325
- const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, {
326
- date: min.toLocaleDateString()
327
- }, `Date cannot be before ${min.toLocaleDateString()}`);
328
- set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);
329
- return false;
330
- }
331
- if (max && date.isAfter(max)) {
332
- const nowError = t(RUI_I18N_KEYS.dateTimePicker.dateInFuture, "The selected date cannot be in the future");
333
- const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: max.toLocaleDateString() }, `Date cannot be after ${max.toLocaleDateString()}`);
334
- const errorMessage = props.maxDate === "now" ? nowError : maxError;
335
- set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);
336
- return false;
337
- }
338
- return true;
339
- }
340
- function emitUpdate(updatedModel) {
341
- const typeMap = {
342
- "date": () => updatedModel.toDate(),
343
- "epoch-ms": () => updatedModel.valueOf(),
344
- "epoch": () => updatedModel.valueOf() / MILLISECONDS
345
- };
346
- set(modelValue, typeMap[props.type]());
347
- }
348
- function updateModelValue() {
349
- if (!isDefined(selectedDate) || !isDefined(selectedTime)) {
350
- return;
351
- }
352
- if (!(isDefined(selectedDate) && isDefined(selectedTime))) {
353
- set(modelValue, void 0);
354
- } else {
355
- const date = get(selectedDate);
356
- const time = get(selectedTime);
357
- const updatedModel = dayjs.tz(isDefined(modelValue) ? get(modelValue) : void 0, get(selectedTimezone)).year(date.getFullYear()).month(date.getMonth()).date(date.getDate()).hour(time.getHours()).minute(time.getMinutes()).second(includeSeconds(props.accuracy) ? time.getSeconds() : 0).millisecond(includeMilliseconds(props.accuracy) ? time.getMilliseconds() : 0);
358
- if (!isDateValid(updatedModel)) {
359
- return;
360
- }
361
- emitUpdate(updatedModel);
362
- }
363
- }
364
- const { ignoreUpdates } = watchIgnorable([selectedDate, selectedTime], ([selectedDate2, selectedTime2], [prevSelectedDate, prevSelectedTime]) => {
365
- const currentTimezone = get(selectedTimezone);
366
- const newSelectedDate = dayjs.tz(selectedDate2, currentTimezone);
367
- const oldSelectedDate = dayjs.tz(prevSelectedDate, currentTimezone);
368
- const newSelectedTime = dayjs.tz(selectedTime2, currentTimezone);
369
- const oldSelectedTime = dayjs.tz(prevSelectedTime, currentTimezone);
370
- if (newSelectedDate.isSame(oldSelectedDate) && newSelectedTime.isSame(oldSelectedTime)) {
371
- return;
372
- }
373
- set(now, dayjs());
374
- updateModelValue();
375
- });
376
- function updateInternalModel(value) {
377
- ignoreUpdates(() => {
378
- const updatedValue = props.type === "epoch" && typeof value === "number" ? value * MILLISECONDS : value;
379
- const date = dayjs.tz(updatedValue, get(selectedTimezone));
380
- isDateValid(date);
381
- update(date, props.accuracy);
382
- });
383
- }
384
- watch(selectedTimezone, (newTimezone) => {
385
- if (newTimezone && isDefined(selectedDate) && isDefined(selectedTime)) {
386
- set(now, dayjs());
387
- updateModelValue();
388
- }
389
- });
390
- watch(modelValue, (value) => {
391
- set(now, dayjs());
392
- if (value === void 0) {
393
- clear();
394
- } else {
395
- updateInternalModel(value);
396
- }
397
- });
398
- onMounted(() => {
399
- if (isDefined(modelValue)) {
400
- updateInternalModel(get(modelValue));
401
- } else if (!props.allowEmpty) {
402
- setNow();
403
- }
404
- });
405
217
  return (_ctx, _cache) => {
406
218
  return openBlock(), createBlock(RuiMenu, mergeProps({
407
219
  modelValue: unref(isOpen),
408
- "onUpdate:modelValue": _cache[19] || (_cache[19] = ($event) => isRef(isOpen) ? isOpen.value = $event : null),
220
+ "onUpdate:modelValue": _cache[21] || (_cache[21] = ($event) => isRef(isOpen) ? isOpen.value = $event : null),
409
221
  class: _ctx.$style.wrapper,
410
222
  dense: __props.dense,
411
223
  hint: __props.hint,
@@ -418,7 +230,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
418
230
  popper: {
419
231
  placement: "bottom-start"
420
232
  },
421
- "full-width": ""
233
+ "full-width": "",
234
+ "disable-auto-focus": ""
422
235
  }, {
423
236
  ...("getRootAttrs" in _ctx ? _ctx.getRootAttrs : unref(getRootAttrs))(_ctx.$attrs)
424
237
  }), {
@@ -448,12 +261,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
448
261
  },
449
262
  {
450
263
  "data-id": "activator",
264
+ "data-error": hasError ? "" : void 0,
451
265
  tabindex: __props.disabled || props.readonly ? -1 : 0,
452
- onClick: _cache[8] || (_cache[8] = ($event) => setInputFocus())
266
+ onClick: _cache[10] || (_cache[10] = ($event) => setInputFocus())
453
267
  }
454
268
  ), [
455
269
  unref(isOutlined) && (unref(searchInputFocused) || open || unref(valueSet)) ? (openBlock(), createElementBlock("span", {
456
270
  key: 0,
271
+ "data-id": "label",
457
272
  class: normalizeClass([
458
273
  _ctx.$style.label,
459
274
  {
@@ -486,12 +301,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
486
301
  type: "text",
487
302
  placeholder: unref(dateFormat),
488
303
  readonly: __props.readonly,
489
- onFocus: _cache[0] || (_cache[0] = ($event) => unref(handleFocus)()),
490
- onSelect: _cache[1] || (_cache[1] = ($event) => unref(handleInputSelection)($event)),
491
- onClick: _cache[2] || (_cache[2] = withModifiers(($event) => handleInputClick($event), ["stop"])),
492
- onKeydown: _cache[3] || (_cache[3] = ($event) => unref(handleKeyDown)($event)),
493
- onPaste: _cache[4] || (_cache[4] = ($event) => unref(handlePaste)($event)),
494
- onInput: _cache[5] || (_cache[5] = ($event) => unref(handleInput)($event))
304
+ "aria-invalid": hasError,
305
+ onMousedown: _cache[0] || (_cache[0] = ($event) => unref(handleMouseDown)($event)),
306
+ onFocus: _cache[1] || (_cache[1] = ($event) => unref(handleFocus)()),
307
+ onBlur: _cache[2] || (_cache[2] = ($event) => unref(handleBlur)()),
308
+ onSelect: _cache[3] || (_cache[3] = ($event) => unref(handleInputSelection)($event)),
309
+ onClick: _cache[4] || (_cache[4] = withModifiers(($event) => handleInputClick($event), ["stop"])),
310
+ onKeydown: _cache[5] || (_cache[5] = ($event) => unref(handleKeyDown)($event)),
311
+ onPaste: _cache[6] || (_cache[6] = ($event) => unref(handlePaste)($event)),
312
+ onInput: _cache[7] || (_cache[7] = ($event) => unref(handleInput)($event))
495
313
  }, null, 40, _hoisted_3)
496
314
  ], 2),
497
315
  __props.allowEmpty && unref(valueSet) && !__props.disabled ? (openBlock(), createBlock(RuiButton, {
@@ -505,7 +323,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
505
323
  class: normalizeClass(["group-hover:!visible", [_ctx.$style.clear, unref(anyFocused) && "!visible", {
506
324
  "mr-2": !__props.dense
507
325
  }]]),
508
- onClick: _cache[6] || (_cache[6] = withModifiers(($event) => clear(), ["stop", "prevent"]))
326
+ onClick: _cache[8] || (_cache[8] = withModifiers(($event) => clear(), ["stop", "prevent"]))
509
327
  }, {
510
328
  default: withCtx(() => [
511
329
  createVNode(RuiIcon, {
@@ -517,7 +335,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
517
335
  }, 8, ["class"])) : createCommentVNode("", true),
518
336
  createElementVNode("span", {
519
337
  class: normalizeClass([_ctx.$style.icon__wrapper, _ctx.$style.icon__append]),
520
- onClick: _cache[7] || (_cache[7] = ($event) => arrowClicked($event))
338
+ "data-id": "append",
339
+ onClick: _cache[9] || (_cache[9] = ($event) => arrowClicked($event))
521
340
  }, [
522
341
  createVNode(RuiIcon, {
523
342
  class: normalizeClass([_ctx.$style.icon, { "rotate-180": open }]),
@@ -540,27 +359,27 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
540
359
  ref_key: "menuWrapperRef",
541
360
  ref: menuWrapperRef,
542
361
  "selected-date": unref(selectedDate),
543
- "onUpdate:selectedDate": _cache[9] || (_cache[9] = ($event) => isRef(selectedDate) ? selectedDate.value = $event : null),
362
+ "onUpdate:selectedDate": _cache[11] || (_cache[11] = ($event) => isRef(selectedDate) ? selectedDate.value = $event : null),
544
363
  "selected-time": unref(selectedTime),
545
- "onUpdate:selectedTime": _cache[10] || (_cache[10] = ($event) => isRef(selectedTime) ? selectedTime.value = $event : null),
364
+ "onUpdate:selectedTime": _cache[12] || (_cache[12] = ($event) => isRef(selectedTime) ? selectedTime.value = $event : null),
546
365
  "selected-hour": unref(selectedHour),
547
- "onUpdate:selectedHour": _cache[11] || (_cache[11] = ($event) => isRef(selectedHour) ? selectedHour.value = $event : null),
366
+ "onUpdate:selectedHour": _cache[13] || (_cache[13] = ($event) => isRef(selectedHour) ? selectedHour.value = $event : null),
548
367
  "selected-minute": unref(selectedMinute),
549
- "onUpdate:selectedMinute": _cache[12] || (_cache[12] = ($event) => isRef(selectedMinute) ? selectedMinute.value = $event : null),
368
+ "onUpdate:selectedMinute": _cache[14] || (_cache[14] = ($event) => isRef(selectedMinute) ? selectedMinute.value = $event : null),
550
369
  "selected-second": unref(selectedSecond),
551
- "onUpdate:selectedSecond": _cache[13] || (_cache[13] = ($event) => isRef(selectedSecond) ? selectedSecond.value = $event : null),
370
+ "onUpdate:selectedSecond": _cache[15] || (_cache[15] = ($event) => isRef(selectedSecond) ? selectedSecond.value = $event : null),
552
371
  "selected-millisecond": unref(selectedMillisecond),
553
- "onUpdate:selectedMillisecond": _cache[14] || (_cache[14] = ($event) => isRef(selectedMillisecond) ? selectedMillisecond.value = $event : null),
372
+ "onUpdate:selectedMillisecond": _cache[16] || (_cache[16] = ($event) => isRef(selectedMillisecond) ? selectedMillisecond.value = $event : null),
554
373
  "time-selection": unref(timeSelection),
555
- "onUpdate:timeSelection": _cache[15] || (_cache[15] = ($event) => isRef(timeSelection) ? timeSelection.value = $event : null),
374
+ "onUpdate:timeSelection": _cache[17] || (_cache[17] = ($event) => isRef(timeSelection) ? timeSelection.value = $event : null),
556
375
  "selected-timezone": unref(selectedTimezone),
557
- "onUpdate:selectedTimezone": _cache[16] || (_cache[16] = ($event) => isRef(selectedTimezone) ? selectedTimezone.value = $event : null),
376
+ "onUpdate:selectedTimezone": _cache[18] || (_cache[18] = ($event) => isRef(selectedTimezone) ? selectedTimezone.value = $event : null),
558
377
  "calendar-menu-open": unref(calendarMenuOpen),
559
- "onUpdate:calendarMenuOpen": _cache[17] || (_cache[17] = ($event) => isRef(calendarMenuOpen) ? calendarMenuOpen.value = $event : null),
378
+ "onUpdate:calendarMenuOpen": _cache[19] || (_cache[19] = ($event) => isRef(calendarMenuOpen) ? calendarMenuOpen.value = $event : null),
560
379
  accuracy: __props.accuracy,
561
380
  "max-date": unref(maxAllowedDate),
562
381
  "min-date": unref(minAllowedDate),
563
- onSetNow: _cache[18] || (_cache[18] = ($event) => setNow())
382
+ onSetNow: _cache[20] || (_cache[20] = ($event) => unref(setNow)())
564
383
  }, {
565
384
  default: withCtx(() => [
566
385
  renderSlot(_ctx.$slots, "menu-content")
@@ -1 +1 @@
1
- {"version":3,"file":"RuiDateTimePicker.vue2.js","sources":["../../../src/components/date-time-picker/RuiDateTimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DateTimeSegmentType } from '@/components/date-time-picker/types';\nimport type { TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport { logicAnd, logicOr } from '@vueuse/math';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiDateTimePickerMenu from '@/components/date-time-picker/RuiDateTimePickerMenu.vue';\nimport { useInputHandler } from '@/components/date-time-picker/use-input-handler';\nimport { useKeyboardHandler } from '@/components/date-time-picker/use-keyboard-handler';\nimport { guessTimezone, includeMilliseconds, includeSeconds } from '@/components/date-time-picker/utils';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\n\ntype DateFormat = 'year-first' | 'month-first' | 'day-first';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> =\n T extends 'date' ? Date | undefined :\n T extends 'epoch-ms' ? number | undefined :\n T extends 'epoch' ? number | undefined :\n Date | number | undefined;\n\nexport interface RuiDateTimePickerProps {\n minDate?: Date | number;\n maxDate?: Date | number | 'now';\n format?: DateFormat;\n type?: DateTimeModelType;\n accuracy?: TimeAccuracy;\n disabled?: boolean;\n allowEmpty?: boolean;\n readonly?: boolean;\n dense?: boolean;\n label?: string;\n variant?: 'default' | 'filled' | 'outlined';\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiDateTimePicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<ModelValueType<typeof props.type>>({ required: true });\n\nconst props = withDefaults(defineProps<RuiDateTimePickerProps>(), {\n disabled: false,\n readonly: false,\n allowEmpty: false,\n dense: false,\n type: 'epoch-ms',\n hideDetails: false,\n label: 'Pick a date',\n variant: 'default',\n hint: undefined,\n maxDate: undefined,\n minDate: undefined,\n format: 'day-first',\n accuracy: 'minute',\n errorMessages: () => [],\n successMessages: () => [],\n required: false,\n});\n\ndefineSlots<{\n 'menu-content': () => any;\n}>();\n\nconst baseFormats: Record<DateFormat, string> = {\n 'day-first': 'DD/MM/YYYY HH:mm',\n 'month-first': 'MM/DD/YYYY HH:mm',\n 'year-first': 'YYYY/MM/DD HH:mm',\n};\n\nconst MILLISECONDS = 1000;\n\nconst isOpen = ref<boolean>(false);\nconst cursorPosition = ref<number>(0);\nconst internalErrorMessages = ref<string[]>([]);\n\nconst selectedYear = ref<number>();\nconst selectedMonth = ref<number>();\nconst selectedDay = ref<number>();\n\nconst selectedHour = ref<number>();\nconst selectedMinute = ref<number>();\nconst selectedSecond = ref<number>();\nconst selectedMillisecond = ref<number>();\nconst selectedTimezone = ref<string | undefined>(guessTimezone());\n\nconst currentValue = ref<number>();\nconst now = ref(dayjs.tz(undefined, guessTimezone()));\n\nconst textInput = ref<HTMLInputElement>();\nconst activator = ref();\nconst menuWrapperRef = ref();\nconst calendarMenuOpen = ref<boolean>(false);\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\n\nconst { setValue, update, getCurrent } = useInputHandler({\n DD: selectedDay,\n MM: selectedMonth,\n YYYY: selectedYear,\n HH: selectedHour,\n mm: selectedMinute,\n ss: selectedSecond,\n SSS: selectedMillisecond,\n}, currentValue);\n\nconst minAllowedDate = computed<Date>(() => {\n if (props.minDate === undefined) {\n return new Date(1970, 0, 1);\n }\n\n if (props.type === 'epoch' && typeof props.minDate === 'number') {\n return new Date(props.minDate * MILLISECONDS);\n }\n\n return new Date(props.minDate);\n});\n\nconst maxAllowedDate = computed<Date | undefined>(() => {\n if (props.maxDate === undefined) {\n return undefined;\n }\n if (props.maxDate === 'now') {\n return get(now).toDate();\n }\n if (props.type === 'epoch' && typeof props.maxDate === 'number') {\n return new Date(props.maxDate * MILLISECONDS);\n }\n return new Date(props.maxDate);\n});\n\nconst dateFormat = computed<string>(() => {\n const dateFormat = props.format;\n const format = baseFormats[dateFormat];\n if (props.accuracy === 'second') {\n return format.replace('HH:mm', 'HH:mm:ss');\n }\n else if (props.accuracy === 'millisecond') {\n return format.replace('HH:mm', 'HH:mm:ss.SSS');\n }\n return format;\n});\n\nconst {\n clear: clearSegment,\n getCurrentSegment,\n handleClick,\n handleFocus,\n handleInput,\n handleInputSelection,\n handleKeyDown,\n handlePaste,\n setSegment,\n} = useKeyboardHandler({\n currentValue,\n cursorPosition,\n disabled: props.disabled,\n getDateTime,\n getCurrent,\n readonly: props.readonly,\n dateFormat,\n setValue,\n textInput,\n accuracy: props.accuracy,\n});\n\nconst { t } = useRuiI8n();\n\nfunction handleInputClick(event: MouseEvent): void {\n // Open menu if not already open\n if (!get(isOpen)) {\n set(isOpen, true);\n }\n // Handle segment selection\n handleClick(event);\n}\n\nconst anyFocused = logicOr(activatorFocusedWithin, menuWrapperFocusedWithin);\n\nconst selectedDate = computed<Date | undefined>({\n set(value?: Date) {\n set(selectedYear, value?.getFullYear());\n set(selectedMonth, value ? value.getMonth() + 1 : undefined);\n set(selectedDay, value?.getDate());\n },\n get() {\n if (!(isDefined(selectedYear) && isDefined(selectedMonth) && isDefined(selectedDay))) {\n return undefined;\n }\n const date = new Date();\n date.setFullYear(get(selectedYear));\n date.setMonth(get(selectedMonth) - 1);\n date.setDate(get(selectedDay));\n return date;\n },\n});\n\nconst selectedTime = computed<Date | undefined>({\n set(value?: Date) {\n set(selectedHour, value?.getHours());\n set(selectedMinute, value?.getMinutes());\n set(selectedSecond, value?.getSeconds());\n set(selectedMillisecond, value?.getMilliseconds());\n },\n get() {\n if (!(isDefined(selectedHour) && isDefined(selectedMinute))) {\n return undefined;\n }\n const date = new Date();\n date.setHours(\n get(selectedHour),\n get(selectedMinute),\n get(selectedSecond) ?? 0,\n get(selectedMillisecond) ?? 0,\n );\n return date;\n },\n});\n\nconst valueSet = computed<boolean>(() => isDefined(selectedDate) && isDefined(selectedTime));\n\nconst labelWithQuote = computed<string>(() => {\n if (!props.label)\n return '\"\\\\200B\"';\n\n const asterisk = props.required ? '﹡' : '';\n return `' ${props.label}${asterisk} '`;\n});\n\nconst isOutlined = computed<boolean>(() => props.variant === 'outlined');\n\nconst formattedDisplay = computed<string>(() => {\n let result = get(dateFormat);\n\n const replacements = [\n { pattern: 'YYYY', value: getDisplayValue(selectedYear, 4) },\n { pattern: 'MM', value: getDisplayValue(selectedMonth, 2) },\n { pattern: 'DD', value: getDisplayValue(selectedDay, 2) },\n { pattern: 'HH', value: getDisplayValue(selectedHour, 2) },\n { pattern: 'mm', value: getDisplayValue(selectedMinute, 2) },\n { pattern: 'ss', value: getDisplayValue(selectedSecond, 2) },\n { pattern: 'SSS', value: getDisplayValue(selectedMillisecond, 3) },\n ];\n\n for (const { pattern, value } of replacements) {\n if (value !== undefined) {\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n});\n\nconst timeSelection = computed<TimePickerSelection>({\n get() {\n const type = getCurrentSegment()?.type;\n\n if (type === 'mm') {\n return 'minute';\n }\n else if (type === 'ss') {\n return 'second';\n }\n else if (type === 'SSS') {\n return 'millisecond';\n }\n return 'hour';\n },\n set(value: TimePickerSelection) {\n let segmentType: DateTimeSegmentType = 'HH';\n if (value === 'minute') {\n segmentType = 'mm';\n }\n else if (value === 'second') {\n segmentType = 'ss';\n }\n else if (value === 'millisecond') {\n segmentType = 'SSS';\n }\n\n setSegment(segmentType);\n },\n});\n\nconst float = logicAnd(logicOr(isOpen, valueSet, searchInputFocused), isOutlined);\n\nconst combinedErrorMessages = computed<string[]>(() => {\n let propErrors: string[];\n if (props.errorMessages) {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [props.errorMessages];\n }\n else {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [];\n }\n return [...propErrors, ...get(internalErrorMessages)];\n});\n\nfunction getDisplayValue(digit: Ref<number | undefined>, padding: number): string | undefined {\n return isDefined(digit)\n ? get(digit).toString().padStart(padding, '0')\n : undefined;\n}\n\nasync function setInputFocus(): Promise<void> {\n await nextTick(() => {\n set(searchInputFocused, true);\n });\n}\n\nfunction clear(segmentType?: string): void {\n set(internalErrorMessages, []);\n\n if (!segmentType) {\n set(selectedYear, undefined);\n set(selectedMonth, undefined);\n set(selectedDay, undefined);\n set(selectedHour, undefined);\n set(selectedMinute, undefined);\n set(selectedSecond, undefined);\n set(selectedMillisecond, undefined);\n set(currentValue, undefined);\n set(modelValue, undefined);\n return;\n }\n\n clearSegment(segmentType);\n}\n\nfunction arrowClicked(event: any): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n\nfunction getDateTime(): Dayjs {\n let dateTime = dayjs();\n if (isDefined(selectedYear)) {\n dateTime = dateTime.year(get(selectedYear));\n }\n\n if (isDefined(selectedMonth)) {\n dateTime = dateTime.month(get(selectedMonth) - 1);\n }\n\n if (isDefined(selectedDay)) {\n const daysInMonth = dateTime.daysInMonth();\n const day = Math.min(get(selectedDay), daysInMonth);\n dateTime = dateTime.date(day);\n }\n\n if (isDefined(selectedHour)) {\n dateTime = dateTime.hour(get(selectedHour));\n }\n\n if (isDefined(selectedMinute)) {\n dateTime = dateTime.minute(get(selectedMinute));\n }\n\n if (isDefined(selectedSecond)) {\n dateTime = dateTime.second(get(selectedSecond));\n }\n\n if (isDefined(selectedMillisecond)) {\n dateTime = dateTime.millisecond(get(selectedMillisecond));\n }\n\n return dateTime;\n}\n\nfunction setNow(): void {\n set(internalErrorMessages, []);\n\n const date = dayjs();\n set(now, date);\n set(selectedYear, date.year());\n set(selectedMonth, date.month() + 1);\n set(selectedDay, date.date());\n set(selectedHour, date.hour());\n set(selectedMinute, date.minute());\n set(selectedSecond, includeSeconds(props.accuracy) ? date.second() : 0);\n set(selectedMillisecond, includeMilliseconds(props.accuracy) ? date.millisecond() : 0);\n\n nextTick(() => {\n updateModelValue();\n });\n}\n\nfunction isDateValid(date: Dayjs): boolean {\n const min = get(minAllowedDate);\n const max = get(maxAllowedDate);\n\n set(internalErrorMessages, []);\n\n if (min && date.isBefore(min)) {\n const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, {\n date: min.toLocaleDateString(),\n }, `Date cannot be before ${min.toLocaleDateString()}`);\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n if (max && date.isAfter(max)) {\n const nowError = t(RUI_I18N_KEYS.dateTimePicker.dateInFuture, 'The selected date cannot be in the future');\n const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: max.toLocaleDateString() }, `Date cannot be after ${max.toLocaleDateString()}`);\n const errorMessage = props.maxDate === 'now' ? nowError : maxError;\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n return true;\n}\n\nfunction emitUpdate(updatedModel: Dayjs) {\n const typeMap = {\n 'date': () => updatedModel.toDate(),\n 'epoch-ms': () => updatedModel.valueOf(),\n 'epoch': () => updatedModel.valueOf() / MILLISECONDS,\n } as const;\n\n set(modelValue, typeMap[props.type]());\n}\n\nfunction updateModelValue(): void {\n if (!isDefined(selectedDate) || !isDefined(selectedTime)) {\n return;\n }\n\n if (!(isDefined(selectedDate) && isDefined(selectedTime))) {\n set(modelValue, undefined);\n }\n else {\n const date = get(selectedDate);\n const time = get(selectedTime);\n\n const updatedModel = dayjs.tz(isDefined(modelValue) ? get(modelValue) : undefined, get(selectedTimezone))\n .year(date.getFullYear())\n .month(date.getMonth())\n .date(date.getDate())\n .hour(time.getHours())\n .minute(time.getMinutes())\n .second(includeSeconds(props.accuracy) ? time.getSeconds() : 0)\n .millisecond(includeMilliseconds(props.accuracy) ? time.getMilliseconds() : 0);\n\n if (!isDateValid(updatedModel)) {\n return;\n }\n\n emitUpdate(updatedModel);\n }\n}\n\nconst { ignoreUpdates } = watchIgnorable([selectedDate, selectedTime], ([selectedDate, selectedTime], [prevSelectedDate, prevSelectedTime]) => {\n const currentTimezone = get(selectedTimezone);\n const newSelectedDate = dayjs.tz(selectedDate, currentTimezone);\n const oldSelectedDate = dayjs.tz(prevSelectedDate, currentTimezone);\n const newSelectedTime = dayjs.tz(selectedTime, currentTimezone);\n const oldSelectedTime = dayjs.tz(prevSelectedTime, currentTimezone);\n\n if (newSelectedDate.isSame(oldSelectedDate) && newSelectedTime.isSame(oldSelectedTime)) {\n return;\n }\n\n set(now, dayjs());\n updateModelValue();\n});\n\nfunction updateInternalModel(value: ModelValueType<typeof props.type>) {\n ignoreUpdates(() => {\n const updatedValue = props.type === 'epoch' && typeof value === 'number'\n ? value * MILLISECONDS\n : value;\n const date = dayjs.tz(updatedValue, get(selectedTimezone));\n isDateValid(date);\n update(date, props.accuracy);\n });\n}\n\nwatch(selectedTimezone, (newTimezone: string | undefined) => {\n if (newTimezone && isDefined(selectedDate) && isDefined(selectedTime)) {\n set(now, dayjs());\n updateModelValue();\n }\n});\n\nwatch(modelValue, (value) => {\n set(now, dayjs());\n if (value === undefined) {\n clear();\n }\n else {\n updateInternalModel(value);\n }\n});\n\nonMounted(() => {\n if (isDefined(modelValue)) {\n updateInternalModel(get(modelValue));\n }\n else if (!props.allowEmpty) {\n setNow();\n }\n});\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n :class=\"$style.wrapper\"\n :dense=\"dense\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :success-messages=\"successMessages\"\n :error-messages=\"combinedErrorMessages\"\n :close-on-content-click=\"false\"\n :show-details=\"!hideDetails\"\n :persistent=\"calendarMenuOpen\"\n :popper=\"{\n placement: 'bottom-start',\n }\"\n full-width\n v-bind=\"{\n ...getRootAttrs($attrs),\n }\"\n >\n <template #activator=\"{ attrs, open, hasError, hasSuccess }\">\n <div\n ref=\"activator\"\n class=\"group\"\n :class=\"[\n $style.activator,\n {\n [$style.disabled]: disabled,\n [$style.readonly]: readonly,\n [$style.outlined]: isOutlined,\n [$style.dense]: dense,\n [$style.float]: float,\n [$style.opened]: open,\n [$style['with-value']]: valueSet,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(props.readonly ? {} : attrs) }\n \"\n data-id=\"activator\"\n :tabindex=\"disabled || props.readonly ? -1 : 0\"\n @click=\"setInputFocus()\"\n >\n <span\n v-if=\"isOutlined && (searchInputFocused || open || valueSet)\"\n :class=\"[\n $style.label,\n {\n 'absolute': isOutlined,\n 'pr-2': !valueSet && !open && isOutlined,\n },\n ]\"\n >\n {{ label }}\n <span\n v-if=\"props.required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </span>\n\n <span :class=\"[$style.icon__wrapper, $style.icon__prepend]\">\n <RuiIcon\n :class=\"[$style.icon]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-calendar-days\"\n />\n </span>\n\n <div :class=\"$style.value\">\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"formattedDisplay\"\n class=\"bg-transparent outline-none flex-1 min-w-0\"\n type=\"text\"\n :placeholder=\"dateFormat\"\n :readonly=\"readonly\"\n @focus=\"handleFocus()\"\n @select=\"handleInputSelection($event)\"\n @click.stop=\"handleInputClick($event)\"\n @keydown=\"handleKeyDown($event)\"\n @paste=\"handlePaste($event)\"\n @input=\"handleInput($event)\"\n />\n </div>\n\n <RuiButton\n v-if=\"allowEmpty && valueSet && !disabled\"\n variant=\"text\"\n icon\n data-id=\"clear-button\"\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n class=\"group-hover:!visible\"\n :class=\"[$style.clear, anyFocused && '!visible', {\n 'mr-2': !dense,\n }]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"[$style.icon__wrapper, $style.icon__append]\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"[$style.icon, { 'rotate-180': open }]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n </div>\n <fieldset\n v-if=\"isOutlined\"\n :class=\"$style.fieldset\"\n >\n <legend :class=\"{ 'px-2': float }\" />\n </fieldset>\n </template>\n <template #default>\n <RuiDateTimePickerMenu\n ref=\"menuWrapperRef\"\n v-model:selected-date=\"selectedDate\"\n v-model:selected-time=\"selectedTime\"\n v-model:selected-hour=\"selectedHour\"\n v-model:selected-minute=\"selectedMinute\"\n v-model:selected-second=\"selectedSecond\"\n v-model:selected-millisecond=\"selectedMillisecond\"\n v-model:time-selection=\"timeSelection\"\n v-model:selected-timezone=\"selectedTimezone\"\n v-model:calendar-menu-open=\"calendarMenuOpen\"\n :accuracy=\"accuracy\"\n :max-date=\"maxAllowedDate\"\n :min-date=\"minAllowedDate\"\n @set-now=\"setNow()\"\n >\n <slot name=\"menu-content\" />\n </RuiDateTimePickerMenu>\n </template>\n </RuiMenu>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n @apply w-full inline-flex flex-col;\n\n .activator {\n @apply relative inline-flex items-center w-full;\n @apply outline-none focus-within:outline-none cursor-pointer min-h-14 pl-3 py-2 pr-8 rounded;\n @apply m-0 bg-white transition-all text-body-1 text-left hover:border-black;\n\n &:not(.outlined) {\n @apply hover:bg-gray-100 focus-within:bg-gray-100;\n }\n\n &.dense {\n @apply py-1.5 min-h-10;\n\n ~ .fieldset {\n @apply px-2;\n }\n }\n\n &.disabled {\n @apply opacity-65 text-rui-text-disabled active:text-rui-text-disabled cursor-default pointer-events-none;\n }\n\n &.readonly {\n @apply opacity-80 pointer-events-none cursor-default bg-gray-50;\n }\n\n &.outlined {\n @apply border-none hover:border-none;\n\n &.opened,\n &:focus,\n &:focus-within {\n @apply border-rui-primary;\n\n ~ .fieldset {\n @apply border-rui-primary #{!important};\n @apply border-2 #{!important};\n }\n }\n\n ~ .fieldset {\n @apply border border-black/[0.23];\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-black;\n }\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-dotted;\n @apply border border-black/[0.23] #{!important};\n }\n }\n\n &.with-success {\n .label {\n @apply text-rui-success #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-success #{!important};\n }\n }\n\n &.with-error {\n .label {\n @apply text-rui-error #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-error #{!important};\n }\n }\n }\n\n .label {\n @apply text-rui-text-secondary;\n max-width: calc(100% - 2.5rem);\n }\n\n .label,\n .value {\n @apply block truncate transition-all duration-75;\n }\n\n .value {\n @apply flex gap-1 flex-wrap flex-1 ps-8;\n }\n\n .clear {\n @apply ml-auto shrink-0 invisible;\n }\n\n .icon {\n @apply text-rui-text-secondary transition;\n\n &__wrapper {\n @apply flex items-center justify-end;\n @apply absolute top-px bottom-0;\n }\n\n &__append {\n @apply right-3;\n }\n\n &__prepend {\n @apply left-3;\n }\n }\n\n &.float {\n .label {\n @apply -translate-y-2 top-0 text-xs px-1;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n\n &.opened,\n &.opened.with-value,\n &:focus,\n &:focus.with-value,\n &:focus-within,\n &:focus-within.with-value {\n .label {\n @apply text-rui-primary;\n }\n\n ~ .fieldset {\n @apply border-rui-primary;\n @apply border-2 #{!important};\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full min-w-0 h-[calc(100%+0.5rem)] top-0 left-0 rounded pointer-events-none px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs truncate;\n max-width: calc(100% - 1rem);\n\n &:before {\n content: ' ';\n }\n\n &:after {\n @apply truncate max-w-full leading-[0];\n content: '\\200B';\n }\n }\n }\n}\n\n.menu {\n @apply overflow-y-auto max-h-60 min-w-[2.5rem];\n}\n\n.highlighted {\n @apply bg-rui-grey-200 #{!important};\n\n &.active {\n @apply bg-rui-grey-300 #{!important};\n }\n}\n\n:global(.dark) {\n .wrapper {\n .activator {\n @apply bg-transparent text-rui-text;\n\n &:not(.outlined) {\n @apply hover:bg-white/10 focus-within:bg-white/10;\n\n &.disabled {\n @apply bg-white/10;\n }\n }\n\n &.readonly {\n @apply bg-white/10;\n }\n\n &.outlined {\n ~ .fieldset {\n @apply border-white/[0.23];\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-white/[0.23] #{!important};\n }\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n\n .highlighted {\n @apply bg-rui-grey-800 #{!important};\n\n &.active {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n}\n</style>\n"],"names":["_useModel","dateFormat","selectedDate","selectedTime","_openBlock","_createBlock","_mergeProps","_unref","$style","getRootAttrs","$attrs","_withCtx","_createElementVNode","getNonRootAttrs","_createElementBlock","_normalizeClass","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","RuiDateTimePickerMenu","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"RuiDateTimePicker.vue2.js","sources":["../../../src/components/date-time-picker/RuiDateTimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DateTimeSegmentType } from '@/components/date-time-picker/types';\nimport type { TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\nimport { logicAnd, logicOr } from '@vueuse/math';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiDateTimePickerMenu from '@/components/date-time-picker/RuiDateTimePickerMenu.vue';\nimport { useDateTimeSelection } from '@/components/date-time-picker/use-date-time-selection';\nimport { useInputHandler } from '@/components/date-time-picker/use-input-handler';\nimport { useKeyboardHandler } from '@/components/date-time-picker/use-keyboard-handler';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\n\ntype DateFormat = 'year-first' | 'month-first' | 'day-first';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> =\n T extends 'date' ? Date | undefined :\n T extends 'epoch-ms' ? number | undefined :\n T extends 'epoch' ? number | undefined :\n Date | number | undefined;\n\nexport interface RuiDateTimePickerProps {\n minDate?: Date | number;\n maxDate?: Date | number | 'now';\n format?: DateFormat;\n type?: DateTimeModelType;\n accuracy?: 'minute' | 'second' | 'millisecond';\n disabled?: boolean;\n allowEmpty?: boolean;\n readonly?: boolean;\n dense?: boolean;\n label?: string;\n variant?: 'default' | 'filled' | 'outlined';\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiDateTimePicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<ModelValueType<typeof props.type>>({ required: true });\n\nconst props = withDefaults(defineProps<RuiDateTimePickerProps>(), {\n disabled: false,\n readonly: false,\n allowEmpty: false,\n dense: false,\n type: 'epoch-ms',\n hideDetails: false,\n label: 'Pick a date',\n variant: 'default',\n hint: undefined,\n maxDate: undefined,\n minDate: undefined,\n format: 'day-first',\n accuracy: 'minute',\n errorMessages: () => [],\n successMessages: () => [],\n required: false,\n});\n\ndefineSlots<{\n 'menu-content': () => any;\n}>();\n\nconst baseFormats: Record<DateFormat, string> = {\n 'day-first': 'DD/MM/YYYY HH:mm',\n 'month-first': 'MM/DD/YYYY HH:mm',\n 'year-first': 'YYYY/MM/DD HH:mm',\n};\n\nconst isOpen = ref<boolean>(false);\nconst cursorPosition = ref<number>(0);\nconst currentValue = ref<number>();\n\nconst textInput = ref<HTMLInputElement>();\nconst activator = ref();\nconst menuWrapperRef = ref();\nconst calendarMenuOpen = ref<boolean>(false);\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\n\nconst {\n clear: clearSelection,\n getDateTime,\n internalErrorMessages,\n maxAllowedDate,\n minAllowedDate,\n segmentData,\n selectedDate,\n selectedDay,\n selectedHour,\n selectedMillisecond,\n selectedMinute,\n selectedMonth,\n selectedSecond,\n selectedTime,\n selectedTimezone,\n selectedYear,\n setNow,\n valueSet,\n} = useDateTimeSelection({\n accuracy: props.accuracy,\n allowEmpty: props.allowEmpty,\n maxDate: props.maxDate,\n minDate: props.minDate,\n modelValue,\n type: props.type,\n});\n\nconst { setValue, getCurrent } = useInputHandler(segmentData, currentValue);\n\nconst dateFormat = computed<string>(() => {\n const dateFormat = props.format;\n const format = baseFormats[dateFormat];\n if (props.accuracy === 'second') {\n return format.replace('HH:mm', 'HH:mm:ss');\n }\n else if (props.accuracy === 'millisecond') {\n return format.replace('HH:mm', 'HH:mm:ss.SSS');\n }\n return format;\n});\n\nconst {\n clear: clearSegment,\n getCurrentSegment,\n handleBlur,\n handleClick,\n handleFocus,\n handleInput,\n handleInputSelection,\n handleKeyDown,\n handleMouseDown,\n handlePaste,\n setSegment,\n} = useKeyboardHandler({\n accuracy: props.accuracy,\n currentValue,\n cursorPosition,\n dateFormat,\n disabled: props.disabled,\n getCurrent,\n getDateTime,\n readonly: props.readonly,\n setValue,\n textInput,\n});\n\nfunction handleInputClick(event: MouseEvent): void {\n // Handle segment selection first, before any DOM changes from menu opening\n handleClick(event);\n // Open menu if not already open\n if (!get(isOpen)) {\n set(isOpen, true);\n }\n}\n\nconst anyFocused = logicOr(activatorFocusedWithin, menuWrapperFocusedWithin);\n\nconst labelWithQuote = computed<string>(() => {\n if (!props.label)\n return '\"\\\\200B\"';\n\n const asterisk = props.required ? '﹡' : '';\n return `' ${props.label}${asterisk} '`;\n});\n\nconst isOutlined = computed<boolean>(() => props.variant === 'outlined');\n\nconst formattedDisplay = computed<string>(() => {\n let result = get(dateFormat);\n\n const replacements = [\n { pattern: 'YYYY', value: getDisplayValue(selectedYear, 4) },\n { pattern: 'MM', value: getDisplayValue(selectedMonth, 2) },\n { pattern: 'DD', value: getDisplayValue(selectedDay, 2) },\n { pattern: 'HH', value: getDisplayValue(selectedHour, 2) },\n { pattern: 'mm', value: getDisplayValue(selectedMinute, 2) },\n { pattern: 'ss', value: getDisplayValue(selectedSecond, 2) },\n { pattern: 'SSS', value: getDisplayValue(selectedMillisecond, 3) },\n ];\n\n for (const { pattern, value } of replacements) {\n if (value !== undefined) {\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n});\n\nconst timeSelection = computed<TimePickerSelection>({\n get() {\n const type = getCurrentSegment()?.type;\n\n if (type === 'mm') {\n return 'minute';\n }\n else if (type === 'ss') {\n return 'second';\n }\n else if (type === 'SSS') {\n return 'millisecond';\n }\n return 'hour';\n },\n set(value: TimePickerSelection) {\n let segmentType: DateTimeSegmentType = 'HH';\n if (value === 'minute') {\n segmentType = 'mm';\n }\n else if (value === 'second') {\n segmentType = 'ss';\n }\n else if (value === 'millisecond') {\n segmentType = 'SSS';\n }\n\n setSegment(segmentType);\n },\n});\n\nconst float = logicAnd(logicOr(isOpen, valueSet, searchInputFocused), isOutlined);\n\nconst combinedErrorMessages = computed<string[]>(() => {\n let propErrors: string[];\n if (props.errorMessages) {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [props.errorMessages];\n }\n else {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [];\n }\n return [...propErrors, ...get(internalErrorMessages)];\n});\n\nfunction getDisplayValue(digit: Ref<number | undefined>, padding: number): string | undefined {\n return isDefined(digit)\n ? get(digit).toString().padStart(padding, '0')\n : undefined;\n}\n\nasync function setInputFocus(): Promise<void> {\n await nextTick(() => {\n set(searchInputFocused, true);\n });\n}\n\nfunction clear(segmentType?: string): void {\n if (!segmentType) {\n clearSelection();\n set(currentValue, undefined);\n return;\n }\n\n clearSegment(segmentType);\n}\n\nfunction arrowClicked(event: any): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n :class=\"$style.wrapper\"\n :dense=\"dense\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :success-messages=\"successMessages\"\n :error-messages=\"combinedErrorMessages\"\n :close-on-content-click=\"false\"\n :show-details=\"!hideDetails\"\n :persistent=\"calendarMenuOpen\"\n :popper=\"{\n placement: 'bottom-start',\n }\"\n full-width\n disable-auto-focus\n v-bind=\"{\n ...getRootAttrs($attrs),\n }\"\n >\n <template #activator=\"{ attrs, open, hasError, hasSuccess }\">\n <div\n ref=\"activator\"\n class=\"group\"\n :class=\"[\n $style.activator,\n {\n [$style.disabled]: disabled,\n [$style.readonly]: readonly,\n [$style.outlined]: isOutlined,\n [$style.dense]: dense,\n [$style.float]: float,\n [$style.opened]: open,\n [$style['with-value']]: valueSet,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(props.readonly ? {} : attrs) }\n \"\n data-id=\"activator\"\n :data-error=\"hasError ? '' : undefined\"\n :tabindex=\"disabled || props.readonly ? -1 : 0\"\n @click=\"setInputFocus()\"\n >\n <span\n v-if=\"isOutlined && (searchInputFocused || open || valueSet)\"\n data-id=\"label\"\n :class=\"[\n $style.label,\n {\n 'absolute': isOutlined,\n 'pr-2': !valueSet && !open && isOutlined,\n },\n ]\"\n >\n {{ label }}\n <span\n v-if=\"props.required\"\n data-id=\"required-indicator\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </span>\n\n <span :class=\"[$style.icon__wrapper, $style.icon__prepend]\">\n <RuiIcon\n :class=\"[$style.icon]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-calendar-days\"\n />\n </span>\n\n <div :class=\"$style.value\">\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"formattedDisplay\"\n class=\"bg-transparent outline-none flex-1 min-w-0\"\n type=\"text\"\n :placeholder=\"dateFormat\"\n :readonly=\"readonly\"\n :aria-invalid=\"hasError\"\n @mousedown=\"handleMouseDown($event)\"\n @focus=\"handleFocus()\"\n @blur=\"handleBlur()\"\n @select=\"handleInputSelection($event)\"\n @click.stop=\"handleInputClick($event)\"\n @keydown=\"handleKeyDown($event)\"\n @paste=\"handlePaste($event)\"\n @input=\"handleInput($event)\"\n />\n </div>\n\n <RuiButton\n v-if=\"allowEmpty && valueSet && !disabled\"\n variant=\"text\"\n icon\n data-id=\"clear-button\"\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n class=\"group-hover:!visible\"\n :class=\"[$style.clear, anyFocused && '!visible', {\n 'mr-2': !dense,\n }]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"[$style.icon__wrapper, $style.icon__append]\"\n data-id=\"append\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"[$style.icon, { 'rotate-180': open }]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n </div>\n <fieldset\n v-if=\"isOutlined\"\n :class=\"$style.fieldset\"\n >\n <legend :class=\"{ 'px-2': float }\" />\n </fieldset>\n </template>\n <template #default>\n <RuiDateTimePickerMenu\n ref=\"menuWrapperRef\"\n v-model:selected-date=\"selectedDate\"\n v-model:selected-time=\"selectedTime\"\n v-model:selected-hour=\"selectedHour\"\n v-model:selected-minute=\"selectedMinute\"\n v-model:selected-second=\"selectedSecond\"\n v-model:selected-millisecond=\"selectedMillisecond\"\n v-model:time-selection=\"timeSelection\"\n v-model:selected-timezone=\"selectedTimezone\"\n v-model:calendar-menu-open=\"calendarMenuOpen\"\n :accuracy=\"accuracy\"\n :max-date=\"maxAllowedDate\"\n :min-date=\"minAllowedDate\"\n @set-now=\"setNow()\"\n >\n <slot name=\"menu-content\" />\n </RuiDateTimePickerMenu>\n </template>\n </RuiMenu>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n @apply w-full inline-flex flex-col;\n\n .activator {\n @apply relative inline-flex items-center w-full;\n @apply outline-none focus-within:outline-none cursor-pointer min-h-14 pl-3 py-2 pr-8 rounded;\n @apply m-0 bg-white transition-all text-body-1 text-left hover:border-black;\n\n &:not(.outlined) {\n @apply hover:bg-gray-100 focus-within:bg-gray-100;\n }\n\n &.dense {\n @apply py-1.5 min-h-10;\n\n ~ .fieldset {\n @apply px-2;\n }\n }\n\n &.disabled {\n @apply opacity-65 text-rui-text-disabled active:text-rui-text-disabled cursor-default pointer-events-none;\n }\n\n &.readonly {\n @apply opacity-80 pointer-events-none cursor-default bg-gray-50;\n }\n\n &.outlined {\n @apply border-none hover:border-none;\n\n &.opened,\n &:focus,\n &:focus-within {\n @apply border-rui-primary;\n\n ~ .fieldset {\n @apply border-rui-primary #{!important};\n @apply border-2 #{!important};\n }\n }\n\n ~ .fieldset {\n @apply border border-black/[0.23];\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-black;\n }\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-dotted;\n @apply border border-black/[0.23] #{!important};\n }\n }\n\n &.with-success {\n .label {\n @apply text-rui-success #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-success #{!important};\n }\n }\n\n &.with-error {\n .label {\n @apply text-rui-error #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-error #{!important};\n }\n }\n }\n\n .label {\n @apply text-rui-text-secondary;\n max-width: calc(100% - 2.5rem);\n }\n\n .label,\n .value {\n @apply block truncate transition-all duration-75;\n }\n\n .value {\n @apply flex gap-1 flex-wrap flex-1 ps-8;\n }\n\n .clear {\n @apply ml-auto shrink-0 invisible;\n }\n\n .icon {\n @apply text-rui-text-secondary transition;\n\n &__wrapper {\n @apply flex items-center justify-end;\n @apply absolute top-px bottom-0;\n }\n\n &__append {\n @apply right-3;\n }\n\n &__prepend {\n @apply left-3;\n }\n }\n\n &.float {\n .label {\n @apply -translate-y-2 top-0 text-xs px-1;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n\n &.opened,\n &.opened.with-value,\n &:focus,\n &:focus.with-value,\n &:focus-within,\n &:focus-within.with-value {\n .label {\n @apply text-rui-primary;\n }\n\n ~ .fieldset {\n @apply border-rui-primary;\n @apply border-2 #{!important};\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full min-w-0 h-[calc(100%+0.5rem)] top-0 left-0 rounded pointer-events-none px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs truncate;\n max-width: calc(100% - 1rem);\n\n &:before {\n content: ' ';\n }\n\n &:after {\n @apply truncate max-w-full leading-[0];\n content: '\\200B';\n }\n }\n }\n}\n\n.menu {\n @apply overflow-y-auto max-h-60 min-w-[2.5rem];\n}\n\n.highlighted {\n @apply bg-rui-grey-200 #{!important};\n\n &.active {\n @apply bg-rui-grey-300 #{!important};\n }\n}\n\n:global(.dark) {\n .wrapper {\n .activator {\n @apply bg-transparent text-rui-text;\n\n &:not(.outlined) {\n @apply hover:bg-white/10 focus-within:bg-white/10;\n\n &.disabled {\n @apply bg-white/10;\n }\n }\n\n &.readonly {\n @apply bg-white/10;\n }\n\n &.outlined {\n ~ .fieldset {\n @apply border-white/[0.23];\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-white/[0.23] #{!important};\n }\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n\n .highlighted {\n @apply bg-rui-grey-800 #{!important};\n\n &.active {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n}\n</style>\n"],"names":["_useModel","dateFormat","_openBlock","_createBlock","_mergeProps","_unref","$style","getRootAttrs","$attrs","_withCtx","_createElementVNode","getNonRootAttrs","_createElementBlock","_normalizeClass","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","RuiDateTimePickerMenu","_renderSlot"],"mappings":"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"}