@rotki/ui-library 2.9.1 → 2.10.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 (35) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +1 -1
  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/calendar/RuiCalendar.vue.js +12 -0
  7. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  8. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  9. package/dist/components/calendar/RuiCalendarMenu.vue2.js +2 -2
  10. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  11. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +5 -3
  12. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  13. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +5 -3
  14. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  15. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +13 -8
  16. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  17. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +12 -8
  18. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  19. package/dist/components/forms/select/RuiMenuSelect.vue2.js +4 -2
  20. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  21. package/dist/components/forms/slider/RuiSlider.vue2.js +14 -11
  22. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  23. package/dist/components/forms/switch/RuiSwitch.vue2.js +10 -7
  24. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  25. package/dist/components/forms/text-area/RuiTextArea.vue2.js +15 -12
  26. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  27. package/dist/components/forms/text-field/RuiTextField.vue2.js +13 -10
  28. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  29. package/dist/components/icons/IconBrowser.vue.d.ts +3 -0
  30. package/dist/components/icons/LazyIcon.vue.d.ts +10 -0
  31. package/dist/style.css +97 -60
  32. package/dist/web-types.json +45 -1
  33. package/package.json +1 -1
  34. package/dist/components/accordions/accordion/RuiAccordion.vue3.js +0 -18
  35. package/dist/components/accordions/accordion/RuiAccordion.vue3.js.map +0 -1
@@ -13,7 +13,7 @@ type __VLS_Slots = {} & {
13
13
  } & {
14
14
  default?: (props: typeof __VLS_7) => any;
15
15
  };
16
- declare const __VLS_base: import("vue").DefineComponent<AccordionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
16
+ declare const __VLS_base: import("vue").DefineComponent<AccordionProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
17
  click: () => any;
18
18
  }, string, import("vue").PublicProps, Readonly<AccordionProps> & Readonly<{
19
19
  onClick?: (() => any) | undefined;
@@ -1,11 +1,90 @@
1
- import _sfc_main from "./RuiAccordion.vue2.js";
2
- import style0 from "./RuiAccordion.vue3.js";
3
- import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const cssModules = {
5
- "$style": style0
6
- };
7
- const RuiAccordion = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
1
+ import { defineComponent, useId, ref, computed, createElementBlock, openBlock, mergeProps, createCommentVNode, unref, normalizeClass, createElementVNode, createVNode, renderSlot, normalizeStyle } from "vue";
2
+ import RuiIcon from "../../icons/RuiIcon.vue.js";
3
+ import { useElementSize } from "@vueuse/core";
4
+ import { get } from "@vueuse/shared";
5
+ const _hoisted_1 = ["data-state"];
6
+ const _hoisted_2 = ["id", "aria-expanded", "aria-controls"];
7
+ const _hoisted_3 = ["id", "aria-labelledby"];
8
+ const _sfc_main = /* @__PURE__ */ defineComponent({
9
+ ...{
10
+ name: "RuiAccordion",
11
+ inheritAttrs: false
12
+ },
13
+ __name: "RuiAccordion",
14
+ props: {
15
+ open: { type: Boolean, default: false },
16
+ eager: { type: Boolean, default: false },
17
+ headerGrow: { type: Boolean, default: false },
18
+ headerClass: { default: "" },
19
+ contentClass: { default: "" }
20
+ },
21
+ emits: ["click"],
22
+ setup(__props, { emit: __emit }) {
23
+ const props = __props;
24
+ const emit = __emit;
25
+ const triggerId = useId();
26
+ const contentId = useId();
27
+ const inner = ref();
28
+ const { height: innerHeight } = useElementSize(inner);
29
+ const contentHeight = computed(() => props.open ? `${get(innerHeight)}px` : "0px");
30
+ function toggle() {
31
+ emit("click");
32
+ }
33
+ function onKeydown(event) {
34
+ if (event.key === "Enter" || event.key === " ") {
35
+ event.preventDefault();
36
+ toggle();
37
+ }
38
+ }
39
+ return (_ctx, _cache) => {
40
+ return openBlock(), createElementBlock("div", mergeProps({
41
+ class: "flex flex-col items-start",
42
+ "data-state": __props.open ? "open" : "closed",
43
+ "data-accordion": ""
44
+ }, _ctx.$attrs), [
45
+ _ctx.$slots.header ? (openBlock(), createElementBlock("div", {
46
+ key: 0,
47
+ id: unref(triggerId),
48
+ class: normalizeClass(["flex gap-2 items-center cursor-pointer outline-none focus-visible:bg-rui-primary/10 rounded", [__props.headerClass, { "w-full": __props.headerGrow }]]),
49
+ role: "button",
50
+ tabindex: "0",
51
+ "aria-expanded": __props.open,
52
+ "aria-controls": unref(contentId),
53
+ "data-accordion-trigger": "",
54
+ onClick: _cache[0] || (_cache[0] = ($event) => toggle()),
55
+ onKeydown: _cache[1] || (_cache[1] = ($event) => onKeydown($event))
56
+ }, [
57
+ createElementVNode("div", {
58
+ class: normalizeClass({ grow: __props.headerGrow })
59
+ }, [
60
+ renderSlot(_ctx.$slots, "header", { open: __props.open })
61
+ ], 2),
62
+ createVNode(RuiIcon, {
63
+ class: normalizeClass(["text-rui-text-secondary transition-transform", { "-rotate-180": __props.open }]),
64
+ name: "lu-chevron-down"
65
+ }, null, 8, ["class"])
66
+ ], 42, _hoisted_2)) : createCommentVNode("", true),
67
+ __props.open || __props.eager ? (openBlock(), createElementBlock("div", {
68
+ key: 1,
69
+ id: unref(contentId),
70
+ class: normalizeClass(["grow transition-all overflow-hidden w-full", __props.contentClass]),
71
+ style: normalizeStyle({ height: unref(contentHeight) }),
72
+ role: "region",
73
+ "aria-labelledby": unref(triggerId),
74
+ "data-accordion-content": ""
75
+ }, [
76
+ createElementVNode("div", {
77
+ ref_key: "inner",
78
+ ref: inner
79
+ }, [
80
+ renderSlot(_ctx.$slots, "default")
81
+ ], 512)
82
+ ], 14, _hoisted_3)) : createCommentVNode("", true)
83
+ ], 16, _hoisted_1);
84
+ };
85
+ }
86
+ });
8
87
  export {
9
- RuiAccordion as default
88
+ _sfc_main as default
10
89
  };
11
90
  //# sourceMappingURL=RuiAccordion.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAccordion.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"RuiAccordion.vue.js","sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport Icon from '@/components/icons/RuiIcon.vue';\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n headerClass?: string;\n contentClass?: string;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<AccordionProps>(), {\n open: false,\n eager: false,\n headerGrow: false,\n headerClass: '',\n contentClass: '',\n});\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\nconst triggerId = useId();\nconst contentId = useId();\n\nconst inner = ref<HTMLDivElement>();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (props.open ? `${get(innerHeight)}px` : '0px'));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n</script>\n\n<template>\n <div\n class=\"flex flex-col items-start\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"$attrs\"\n >\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"flex gap-2 items-center cursor-pointer outline-none focus-visible:bg-rui-primary/10 rounded\"\n :class=\"[headerClass, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div\n :class=\"{ grow: headerGrow }\"\n >\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"text-rui-text-secondary transition-transform\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n class=\"grow transition-all overflow-hidden w-full\"\n :class=\"contentClass\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_mergeProps","$attrs","$slots","_unref","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgBA,UAAM,QAAQ;AAQd,UAAM,OAAO;AAIb,UAAM,YAAY,MAAA;AAClB,UAAM,YAAY,MAAA;AAElB,UAAM,QAAQ,IAAA;AACd,UAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;AAEpD,UAAM,gBAAgB,SAAiB,MAAO,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,KAAM;AAE3F,aAAS,SAAe;AACtB,WAAK,OAAO;AAAA,IACd;AAEA,aAAS,UAAU,OAA4B;AAC7C,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,cAAM,eAAA;AACN,eAAA;AAAA,MACF;AAAA,IACF;;AAIE,aAAAA,UAAA,GAAAC,mBA+CM,OA/CNC,WA+CM;AAAA,QA9CJ,OAAM;AAAA,QACL,cAAY,QAAA,OAAI,SAAA;AAAA,QACjB,kBAAA;AAAA,MAAA,GACQC,KAAAA,MAAM,GAAA;AAAA,QAGNC,KAAAA,OAAO,uBADfH,mBA0BM,OAAA;AAAA;UAxBH,IAAII,MAAA,SAAA;AAAA,UACL,OAAKC,eAAA,CAAC,+FAA6F,CAC1F,QAAA,yBAAyB,QAAA,WAAA,CAAU,CAAA,CAAA;AAAA,UAC5C,MAAK;AAAA,UACL,UAAS;AAAA,UACR,iBAAe,QAAA;AAAA,UACf,iBAAeD,MAAA,SAAA;AAAA,UAChB,0BAAA;AAAA,UACC,+CAAO;UACP,WAAO,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,UAAU,MAAM;AAAA,QAAA;UAE1BE,mBAOM,OAAA;AAAA,YANH,8BAAe,QAAA,YAAU;AAAA,UAAA;YAE1BC,WAGE,KAAA,QAAA,UAAA,EADC,MAAM,QAAA,MAAI;AAAA,UAAA;UAGfC,YAIEC,SAAA;AAAA,YAHA,OAAKJ,eAAA,CAAC,gDAA8C,EAAA,eAC3B,QAAA,KAAA,CAAI,CAAA;AAAA,YAC7B,MAAK;AAAA,UAAA;;QAID,QAAA,QAAQ,QAAA,sBADhBL,mBAaM,OAAA;AAAA;UAXH,IAAII,MAAA,SAAA;AAAA,UACL,OAAKC,eAAA,CAAC,8CACE,QAAA,YAAY,CAAA;AAAA,UACnB,gCAAiBD,MAAA,aAAA,GAAa;AAAA,UAC/B,MAAK;AAAA,UACJ,mBAAiBA,MAAA,SAAA;AAAA,UAClB,0BAAA;AAAA,QAAA;UAEAE,mBAEM,OAAA;AAAA,qBAFG;AAAA,YAAJ,KAAI;AAAA,UAAA;YACPC,WAAuB,KAAA,QAAA,SAAA;AAAA,UAAA;;;;;;"}
@@ -1,65 +1,4 @@
1
- import { defineComponent, useCssVars, unref, ref, createElementBlock, openBlock, mergeProps, createCommentVNode, normalizeClass, createElementVNode, createVNode, renderSlot } from "vue";
2
- import RuiIcon from "../../icons/RuiIcon.vue.js";
3
- import { useElementSize } from "@vueuse/core";
4
- const _sfc_main = /* @__PURE__ */ defineComponent({
5
- ...{
6
- name: "RuiAccordion",
7
- inheritAttrs: false
8
- },
9
- __name: "RuiAccordion",
10
- props: {
11
- open: { type: Boolean, default: false },
12
- eager: { type: Boolean, default: false },
13
- headerGrow: { type: Boolean, default: false },
14
- headerClass: { default: "" },
15
- contentClass: { default: "" }
16
- },
17
- emits: ["click"],
18
- setup(__props, { emit: __emit }) {
19
- useCssVars((_ctx) => ({
20
- "fcb53c98": unref(innerHeight)
21
- }));
22
- const emit = __emit;
23
- function click() {
24
- emit("click");
25
- }
26
- const inner = ref();
27
- const { height: innerHeight } = useElementSize(inner);
28
- return (_ctx, _cache) => {
29
- return openBlock(), createElementBlock("div", mergeProps({
30
- class: ["accordion", [_ctx.$style.accordion, { [_ctx.$style.open]: __props.open }]]
31
- }, _ctx.$attrs), [
32
- _ctx.$slots.header ? (openBlock(), createElementBlock("div", {
33
- key: 0,
34
- class: normalizeClass(["accordion__header flex gap-2 items-center", [__props.headerClass, { "w-full": __props.headerGrow }]]),
35
- role: "button",
36
- onClick: _cache[0] || (_cache[0] = ($event) => click())
37
- }, [
38
- createElementVNode("div", {
39
- class: normalizeClass({ grow: __props.headerGrow })
40
- }, [
41
- renderSlot(_ctx.$slots, "header", { open: __props.open })
42
- ], 2),
43
- createVNode(RuiIcon, {
44
- class: normalizeClass(["text-rui-text-secondary", _ctx.$style.icon]),
45
- name: "lu-chevron-down"
46
- }, null, 8, ["class"])
47
- ], 2)) : createCommentVNode("", true),
48
- __props.open || __props.eager ? (openBlock(), createElementBlock("div", {
49
- key: 1,
50
- class: normalizeClass([[__props.contentClass, _ctx.$style.accordion__content], "accordion__content"])
51
- }, [
52
- createElementVNode("div", {
53
- ref_key: "inner",
54
- ref: inner
55
- }, [
56
- renderSlot(_ctx.$slots, "default")
57
- ], 512)
58
- ], 2)) : createCommentVNode("", true)
59
- ], 16);
60
- };
61
- }
62
- });
1
+ import _sfc_main from "./RuiAccordion.vue.js";
63
2
  export {
64
3
  _sfc_main as default
65
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAccordion.vue2.js","sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport Icon from '@/components/icons/RuiIcon.vue';\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n headerClass?: string;\n contentClass?: string;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nwithDefaults(defineProps<AccordionProps>(), {\n open: false,\n eager: false,\n headerGrow: false,\n headerClass: '',\n contentClass: '',\n});\n\nconst emit = defineEmits<{\n (e: 'click'): void;\n}>();\n\nfunction click() {\n emit('click');\n}\n\nconst inner = ref<HTMLDivElement>();\n\nconst { height: innerHeight } = useElementSize(inner);\n</script>\n\n<template>\n <div\n class=\"accordion\"\n :class=\"[$style.accordion, { [$style.open]: open }]\"\n v-bind=\"$attrs\"\n >\n <div\n v-if=\"$slots.header\"\n class=\"accordion__header flex gap-2 items-center\"\n :class=\"[headerClass, { 'w-full': headerGrow }]\"\n role=\"button\"\n @click=\"click()\"\n >\n <div\n :class=\"{ grow: headerGrow }\"\n >\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"text-rui-text-secondary\"\n :class=\"$style.icon\"\n name=\"lu-chevron-down\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :class=\"[contentClass, $style.accordion__content]\"\n class=\"accordion__content\"\n >\n <div\n ref=\"inner\"\n >\n <slot\n name=\"default\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" module>\n.accordion {\n @apply flex flex-col items-start;\n\n &.open {\n .accordion {\n &__content {\n height: calc(v-bind(innerHeight) * 1px);\n }\n }\n\n .icon {\n @apply transform -rotate-180;\n }\n }\n\n &__content {\n @apply grow transition-all overflow-hidden h-0 w-full;\n }\n\n .icon {\n @apply transition-all;\n }\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_mergeProps","$style","$attrs","$slots","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,UAAM,OAAO;AAIb,aAAS,QAAQ;AACf,WAAK,OAAO;AAAA,IACd;AAEA,UAAM,QAAQ,IAAA;AAEd,UAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;;AAIlD,aAAAA,UAAA,GAAAC,mBAuCM,OAvCNC,WAuCM;AAAA,QAtCJ,OAAK,CAAC,aAAW,CACRC,KAAAA,OAAO,WAAS,EAAA,CAAKA,KAAAA,OAAO,IAAI,GAAG,QAAA,KAAA,CAAI,CAAA;AAAA,MAAA,GACxCC,KAAAA,MAAM,GAAA;AAAA,QAGNC,KAAAA,OAAO,uBADfJ,mBAoBM,OAAA;AAAA;UAlBJ,OAAKK,eAAA,CAAC,6CAA2C,CACxC,QAAA,yBAAyB,QAAA,WAAA,CAAU,CAAA,CAAA;AAAA,UAC5C,MAAK;AAAA,UACJ,+CAAO,MAAA;AAAA,QAAK;UAEbC,mBAOM,OAAA;AAAA,YANH,8BAAe,QAAA,YAAU;AAAA,UAAA;YAE1BC,WAGE,KAAA,QAAA,UAAA,EADC,MAAM,QAAA,MAAI;AAAA,UAAA;UAGfC,YAIEC,SAAA;AAAA,YAHA,OAAKJ,eAAA,CAAC,2BACEH,KAAAA,OAAO,IAAI,CAAA;AAAA,YACnB,MAAK;AAAA,UAAA;;QAID,QAAA,QAAQ,QAAA,sBADhBF,mBAYM,OAAA;AAAA;UAVH,wBAAQ,QAAA,cAAcE,YAAO,kBAAkB,GAC1C,oBAAoB,CAAA;AAAA,QAAA;UAE1BI,mBAMM,OAAA;AAAA,qBALA;AAAA,YAAJ,KAAI;AAAA,UAAA;YAEJC,WAEE,KAAA,QAAA,SAAA;AAAA,UAAA;;;;;;"}
1
+ {"version":3,"file":"RuiAccordion.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -67,6 +67,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
67
67
  function selectMonth(selection) {
68
68
  set(viewMonth, selection.month);
69
69
  set(viewYear, selection.year);
70
+ if (isDefined(selectedDate)) {
71
+ const current = get(selectedDate);
72
+ const currentDay = current.getDate();
73
+ const daysInNewMonth = new Date(selection.year, selection.month + 1, 0).getDate();
74
+ const adjustedDay = Math.min(currentDay, daysInNewMonth);
75
+ const newDate = new Date(current);
76
+ newDate.setFullYear(selection.year);
77
+ newDate.setDate(1);
78
+ newDate.setMonth(selection.month);
79
+ newDate.setDate(adjustedDay);
80
+ set(selectedDate, newDate);
81
+ }
70
82
  }
71
83
  watch([selectedDate], ([date]) => {
72
84
  if (!date && !props.allowEmpty)
@@ -1 +1 @@
1
- {"version":3,"file":"RuiCalendar.vue.js","sources":["../../../src/components/calendar/RuiCalendar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { get, isDefined, set } from '@vueuse/core';\nimport { computed, provide, ref, watch } from 'vue';\nimport {\n CalendarStateSymbol,\n type MonthYearSelection,\n type RuiCalendarState,\n} from '@/components/calendar/state';\nimport { useRotkiTheme } from '@/composables/theme';\nimport RuiCalendarGrid from './RuiCalendarGrid.vue';\nimport RuiCalendarHeader from './RuiCalendarHeader.vue';\n\nexport interface CalendarProps {\n maxDate?: Date | number;\n minDate?: Date | number;\n allowEmpty?: boolean;\n borderless?: boolean;\n}\n\ndefineOptions({\n name: 'RuiCalendar',\n inheritAttrs: false,\n});\n\nconst model = defineModel<Date | undefined>({ required: false });\nconst isMenuOpen = defineModel<boolean>('menu-open', { required: false, default: false });\n\nconst props = withDefaults(defineProps<CalendarProps>(), {\n maxDate: undefined,\n minDate: undefined,\n allowEmpty: false,\n borderless: false,\n});\n\nconst emit = defineEmits<{\n 'update:pages': [{ title: string }[]];\n}>();\n\nconst currentDate = ref(isDefined(model) ? new Date(get(model)) : new Date());\nconst selectedDate = ref(isDefined(model) ? new Date(get(model)) : undefined);\nconst viewMonth = ref(get(currentDate).getMonth());\nconst viewYear = ref(get(currentDate).getFullYear());\n\nconst { isDark } = useRotkiTheme();\n\nconst monthTitle = computed<string>(() => {\n const date = new Date(get(viewYear), get(viewMonth));\n return date.toLocaleString('default', { month: 'long', year: 'numeric' });\n});\n\nprovide(CalendarStateSymbol.valueOf(), {\n viewMonth,\n viewYear,\n selectedDate,\n maxDate: computed(() => props.maxDate ? new Date(props.maxDate) : undefined),\n minDate: computed(() => props.minDate ? new Date(props.minDate) : undefined),\n isDark,\n allowEmpty: props.allowEmpty,\n} satisfies RuiCalendarState);\n\nfunction moveMonth(delta: number) {\n let newMonth = get(viewMonth) + delta;\n let newYear = get(viewYear);\n\n if (newMonth > 11) {\n newMonth = 0;\n newYear++;\n }\n else if (newMonth < 0) {\n newMonth = 11;\n newYear--;\n }\n\n set(viewMonth, newMonth);\n set(viewYear, newYear);\n\n emit('update:pages', [{ title: get(monthTitle) }]);\n}\n\nfunction move(date: Date | number) {\n const newDate = new Date(date);\n set(viewMonth, newDate.getMonth());\n set(viewYear, newDate.getFullYear());\n}\n\nfunction selectMonth(selection: MonthYearSelection) {\n set(viewMonth, selection.month);\n set(viewYear, selection.year);\n}\n\nwatch([selectedDate], ([date]) => {\n if (!date && !props.allowEmpty)\n return;\n\n if (date) {\n set(model, new Date(date));\n\n if (get(viewMonth) !== date.getMonth()) {\n set(viewMonth, date.getMonth());\n }\n\n if (get(viewYear) !== date.getFullYear()) {\n set(viewYear, date.getFullYear());\n }\n }\n else {\n set(model, undefined);\n }\n});\n\nwatch(model, (newValue) => {\n if (newValue === undefined) {\n set(selectedDate, undefined);\n return;\n }\n\n const date = new Date(newValue);\n\n if (isDefined(selectedDate) && get(selectedDate).getTime() !== date.getTime()) {\n set(selectedDate, new Date(newValue));\n set(viewMonth, date.getMonth());\n set(viewYear, date.getFullYear());\n }\n});\n\ndefineExpose({\n move,\n});\n</script>\n\n<template>\n <div\n class=\"rui-calendar\"\n :class=\"{ dark: isDark, bordered: !borderless }\"\n >\n <RuiCalendarHeader\n v-model:menu-open=\"isMenuOpen\"\n :title=\"monthTitle\"\n :view-month=\"viewMonth\"\n :view-year=\"viewYear\"\n @prev-month=\"moveMonth(-1)\"\n @next-month=\"moveMonth(1)\"\n @select-month=\"selectMonth($event)\"\n />\n\n <RuiCalendarGrid\n v-model=\"selectedDate\"\n :view-month=\"viewMonth\"\n :view-year=\"viewYear\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n.rui-calendar {\n @apply w-[18.75rem] bg-white overflow-hidden;\n\n &.bordered {\n @apply rounded-md shadow-sm border border-rui-grey-200;\n }\n\n &.dark {\n @apply bg-rui-grey-900;\n\n &.bordered {\n @apply border-rui-grey-800;\n }\n }\n}\n</style>\n"],"names":["_useModel","_createElementBlock","_normalizeClass","_unref","_createVNode"],"mappings":"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"}
1
+ {"version":3,"file":"RuiCalendar.vue.js","sources":["../../../src/components/calendar/RuiCalendar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { get, isDefined, set } from '@vueuse/core';\nimport { computed, provide, ref, watch } from 'vue';\nimport {\n CalendarStateSymbol,\n type MonthYearSelection,\n type RuiCalendarState,\n} from '@/components/calendar/state';\nimport { useRotkiTheme } from '@/composables/theme';\nimport RuiCalendarGrid from './RuiCalendarGrid.vue';\nimport RuiCalendarHeader from './RuiCalendarHeader.vue';\n\nexport interface CalendarProps {\n maxDate?: Date | number;\n minDate?: Date | number;\n allowEmpty?: boolean;\n borderless?: boolean;\n}\n\ndefineOptions({\n name: 'RuiCalendar',\n inheritAttrs: false,\n});\n\nconst model = defineModel<Date | undefined>({ required: false });\nconst isMenuOpen = defineModel<boolean>('menu-open', { required: false, default: false });\n\nconst props = withDefaults(defineProps<CalendarProps>(), {\n maxDate: undefined,\n minDate: undefined,\n allowEmpty: false,\n borderless: false,\n});\n\nconst emit = defineEmits<{\n 'update:pages': [{ title: string }[]];\n}>();\n\nconst currentDate = ref(isDefined(model) ? new Date(get(model)) : new Date());\nconst selectedDate = ref(isDefined(model) ? new Date(get(model)) : undefined);\nconst viewMonth = ref(get(currentDate).getMonth());\nconst viewYear = ref(get(currentDate).getFullYear());\n\nconst { isDark } = useRotkiTheme();\n\nconst monthTitle = computed<string>(() => {\n const date = new Date(get(viewYear), get(viewMonth));\n return date.toLocaleString('default', { month: 'long', year: 'numeric' });\n});\n\nprovide(CalendarStateSymbol.valueOf(), {\n viewMonth,\n viewYear,\n selectedDate,\n maxDate: computed(() => props.maxDate ? new Date(props.maxDate) : undefined),\n minDate: computed(() => props.minDate ? new Date(props.minDate) : undefined),\n isDark,\n allowEmpty: props.allowEmpty,\n} satisfies RuiCalendarState);\n\nfunction moveMonth(delta: number) {\n let newMonth = get(viewMonth) + delta;\n let newYear = get(viewYear);\n\n if (newMonth > 11) {\n newMonth = 0;\n newYear++;\n }\n else if (newMonth < 0) {\n newMonth = 11;\n newYear--;\n }\n\n set(viewMonth, newMonth);\n set(viewYear, newYear);\n\n emit('update:pages', [{ title: get(monthTitle) }]);\n}\n\nfunction move(date: Date | number) {\n const newDate = new Date(date);\n set(viewMonth, newDate.getMonth());\n set(viewYear, newDate.getFullYear());\n}\n\nfunction selectMonth(selection: MonthYearSelection) {\n set(viewMonth, selection.month);\n set(viewYear, selection.year);\n\n // If there's a selected date, update it with the new year/month\n if (isDefined(selectedDate)) {\n const current = get(selectedDate);\n const currentDay = current.getDate();\n // Handle day overflow (e.g., Jan 31 -> Feb 28) by checking BEFORE setting month\n const daysInNewMonth = new Date(selection.year, selection.month + 1, 0).getDate();\n const adjustedDay = Math.min(currentDay, daysInNewMonth);\n\n const newDate = new Date(current);\n newDate.setFullYear(selection.year);\n newDate.setDate(1); // Set to 1st to avoid overflow when changing month\n newDate.setMonth(selection.month);\n newDate.setDate(adjustedDay);\n set(selectedDate, newDate);\n }\n}\n\nwatch([selectedDate], ([date]) => {\n if (!date && !props.allowEmpty)\n return;\n\n if (date) {\n set(model, new Date(date));\n\n if (get(viewMonth) !== date.getMonth()) {\n set(viewMonth, date.getMonth());\n }\n\n if (get(viewYear) !== date.getFullYear()) {\n set(viewYear, date.getFullYear());\n }\n }\n else {\n set(model, undefined);\n }\n});\n\nwatch(model, (newValue) => {\n if (newValue === undefined) {\n set(selectedDate, undefined);\n return;\n }\n\n const date = new Date(newValue);\n\n if (isDefined(selectedDate) && get(selectedDate).getTime() !== date.getTime()) {\n set(selectedDate, new Date(newValue));\n set(viewMonth, date.getMonth());\n set(viewYear, date.getFullYear());\n }\n});\n\ndefineExpose({\n move,\n});\n</script>\n\n<template>\n <div\n class=\"rui-calendar\"\n :class=\"{ dark: isDark, bordered: !borderless }\"\n >\n <RuiCalendarHeader\n v-model:menu-open=\"isMenuOpen\"\n :title=\"monthTitle\"\n :view-month=\"viewMonth\"\n :view-year=\"viewYear\"\n @prev-month=\"moveMonth(-1)\"\n @next-month=\"moveMonth(1)\"\n @select-month=\"selectMonth($event)\"\n />\n\n <RuiCalendarGrid\n v-model=\"selectedDate\"\n :view-month=\"viewMonth\"\n :view-year=\"viewYear\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n.rui-calendar {\n @apply w-[18.75rem] bg-white overflow-hidden;\n\n &.bordered {\n @apply rounded-md shadow-sm border border-rui-grey-200;\n }\n\n &.dark {\n @apply bg-rui-grey-900;\n\n &.bordered {\n @apply border-rui-grey-800;\n }\n }\n}\n</style>\n"],"names":["_useModel","_createElementBlock","_normalizeClass","_unref","_createVNode"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./RuiCalendarMenu.vue2.js";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.js";
4
- const RuiCalendarMenu = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-649d1d22"]]);
4
+ const RuiCalendarMenu = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-b1a30957"]]);
5
5
  export {
6
6
  RuiCalendarMenu as default
7
7
  };
@@ -151,7 +151,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
151
151
  function handleNext() {
152
152
  if (get(viewMode) === "months") {
153
153
  const nextYear = props.viewYear + 1;
154
- selectYear(nextYear);
154
+ emit("select", { month: props.viewMonth, year: nextYear });
155
155
  } else {
156
156
  const lastYearInRange = get(startYear) + 11;
157
157
  set(startYear, lastYearInRange + 1);
@@ -160,7 +160,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
160
160
  function handlePrev() {
161
161
  if (get(viewMode) === "months") {
162
162
  const previousYear = props.viewYear - 1;
163
- selectYear(previousYear);
163
+ emit("select", { month: props.viewMonth, year: previousYear });
164
164
  } else {
165
165
  const firstYearInRange = get(startYear);
166
166
  set(startYear, firstYearInRange - 12);
@@ -1 +1 @@
1
- {"version":3,"file":"RuiCalendarMenu.vue2.js","sources":["../../../src/components/calendar/RuiCalendarMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { get, isDefined, set } from '@vueuse/core';\nimport { ref, watch } from 'vue';\nimport {\n CalendarStateSymbol,\n getShortMonthNames,\n type MonthYearSelection,\n type RuiCalendarState,\n} from '@/components/calendar/state';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiButton from '../buttons/button/RuiButton.vue';\n\ndefineOptions({\n name: 'RuiCalendarMenu',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<boolean>();\n\nconst props = defineProps<{\n anchorEl: HTMLElement | undefined;\n viewMonth: number;\n viewYear: number;\n}>();\n\nconst emit = defineEmits<{\n select: [MonthYearSelection];\n}>();\n\n// Core reactive state - minimal\nconst viewMode = ref<'months' | 'years'>('months');\nconst startYear = ref<number>(props.viewYear - 6);\n\n// Pre-calculated constants\nconst months = getShortMonthNames();\nconst calendarState = inject<RuiCalendarState>(CalendarStateSymbol) as RuiCalendarState;\n\n// Pre-calculated arrays for performance - using refs for better control\nconst yearRange = ref<number[]>([]);\nconst monthsInRange = ref<boolean[]>([]);\nconst yearsInRange = ref<boolean[]>([]);\nconst title = ref<string>('');\nconst canGoToNext = ref<boolean>(true);\nconst canGoToPrev = ref<boolean>(true);\n\n// Pre-calculation functions using VueUse get/set\nfunction calculateYearRange() {\n const start = get(startYear);\n set(yearRange, Array.from({ length: 12 }, (_, i) => start + i));\n}\n\nfunction calculateTitle() {\n if (get(viewMode) === 'months') {\n set(title, props.viewYear.toString());\n }\n else {\n const range = get(yearRange);\n set(title, `${range[0]} - ${range.at(-1)}`);\n }\n}\n\nfunction calculateNavigation() {\n const { maxDate, minDate } = calendarState;\n const mode = get(viewMode);\n\n if (mode === 'months') {\n const nextYear = props.viewYear + 1;\n const previousYear = props.viewYear - 1;\n\n set(canGoToNext, !isDefined(maxDate) || nextYear <= get(maxDate).getFullYear());\n set(canGoToPrev, !isDefined(minDate) || previousYear >= get(minDate).getFullYear());\n }\n else {\n const lastYearInRange = get(startYear) + 11;\n const firstYearInRange = get(startYear);\n\n // Check if we can navigate to the next range of years\n const nextRangeStart = lastYearInRange + 1;\n set(canGoToNext, !isDefined(maxDate) || nextRangeStart <= get(maxDate).getFullYear());\n\n // Check if we can navigate to the previous range of years\n const prevRangeEnd = firstYearInRange - 1;\n set(canGoToPrev, !isDefined(minDate) || prevRangeEnd >= get(minDate).getFullYear());\n }\n}\n\nfunction calculateMonthsInRange() {\n const { minDate, maxDate } = calendarState;\n const currentYear = props.viewYear;\n const result = new Array(12).fill(true);\n\n if (isDefined(minDate) || isDefined(maxDate)) {\n for (let month = 0; month < 12; month++) {\n const date = new Date(currentYear, month);\n if (isDefined(maxDate) && date > get(maxDate)) {\n result[month] = false;\n }\n if (isDefined(minDate) && date < get(minDate)) {\n result[month] = false;\n }\n }\n }\n\n set(monthsInRange, result);\n}\n\nfunction calculateYearsInRange() {\n const { minDate, maxDate } = calendarState;\n const range = get(yearRange);\n const currentMonth = props.viewMonth;\n\n if (!isDefined(minDate) && !isDefined(maxDate)) {\n set(yearsInRange, new Array(range.length).fill(true));\n return;\n }\n\n const result = range.map((year) => {\n const date = new Date(year, currentMonth);\n if (isDefined(maxDate) && date > get(maxDate)) {\n return false;\n }\n return !isDefined(minDate) || date >= get(minDate);\n });\n\n set(yearsInRange, result);\n}\n\n// Initial calculations\ncalculateYearRange();\ncalculateTitle();\ncalculateNavigation();\ncalculateMonthsInRange();\ncalculateYearsInRange();\n\n// Watchers for recalculation only when needed\nwatch(startYear, () => {\n calculateYearRange();\n calculateTitle();\n calculateNavigation();\n calculateYearsInRange();\n});\n\nwatch(viewMode, () => {\n calculateTitle();\n calculateNavigation();\n});\n\nwatch(() => props.viewYear, () => {\n calculateTitle();\n calculateNavigation();\n calculateMonthsInRange();\n calculateYearsInRange();\n});\n\nwatch(() => props.viewMonth, () => {\n calculateYearsInRange();\n});\n\nfunction toggleSelection() {\n set(viewMode, get(viewMode) === 'months' ? 'years' : 'months');\n}\n\nfunction selectMonth(month: number) {\n if (!get(monthsInRange)[month])\n return;\n emit('select', { month, year: props.viewYear });\n set(modelValue, false);\n}\n\nfunction selectYear(year: number) {\n const yearIndex = get(yearRange).indexOf(year);\n if (yearIndex === -1 || !get(yearsInRange)[yearIndex])\n return;\n\n emit('select', { month: props.viewMonth, year });\n set(viewMode, 'months');\n}\n\nfunction handleNext() {\n if (get(viewMode) === 'months') {\n const nextYear = props.viewYear + 1;\n selectYear(nextYear);\n }\n else {\n const lastYearInRange = get(startYear) + 11;\n set(startYear, lastYearInRange + 1);\n }\n}\n\nfunction handlePrev() {\n if (get(viewMode) === 'months') {\n const previousYear = props.viewYear - 1;\n selectYear(previousYear);\n }\n else {\n const firstYearInRange = get(startYear);\n set(startYear, firstYearInRange - 12);\n }\n}\n</script>\n\n<template>\n <RuiMenu\n v-model=\"modelValue\"\n :anchor-el=\"anchorEl\"\n placement=\"bottom-start\"\n >\n <div class=\"menu-container\">\n <div class=\"menu-header\">\n <RuiButton\n type=\"button\"\n class=\"nav-button\"\n icon\n :disabled=\"!get(canGoToPrev)\"\n variant=\"text\"\n @click.stop=\"handlePrev()\"\n >\n <RuiIcon\n name=\"lu-chevron-left\"\n size=\"20\"\n />\n </RuiButton>\n\n <div\n class=\"flex-1 text-center cursor-pointer\"\n @click.stop=\"toggleSelection()\"\n >\n {{ get(title) }}\n </div>\n\n <RuiButton\n type=\"button\"\n class=\"nav-button\"\n icon\n :disabled=\"!get(canGoToNext)\"\n variant=\"text\"\n @click.stop=\"handleNext()\"\n >\n <RuiIcon\n name=\"lu-chevron-right\"\n size=\"20\"\n />\n </RuiButton>\n </div>\n\n <div\n v-if=\"viewMode === 'months'\"\n class=\"month-grid\"\n >\n <button\n v-for=\"(month, index) in months\"\n :key=\"index\"\n type=\"button\"\n class=\"h-9 w-full flex items-center justify-center text-sm font-medium rounded-md transition-colors duration-150 ease-in-out border-none outline-none cursor-pointer focus:ring-2 focus:ring-rui-primary focus:ring-opacity-50\"\n :class=\"[\n {\n 'bg-rui-primary text-white hover:bg-rui-primary-darker active:bg-rui-primary-darker dark:bg-rui-primary dark:text-white dark:hover:bg-rui-primary-darker': index === viewMonth && get(monthsInRange)[index],\n 'bg-gray-300 text-gray-500 dark:bg-gray-600 dark:text-gray-400': index === viewMonth && !get(monthsInRange)[index],\n 'text-gray-700 bg-transparent hover:bg-gray-100 active:bg-gray-200 dark:text-gray-300 dark:hover:bg-gray-700 dark:active:bg-gray-600': index !== viewMonth && get(monthsInRange)[index],\n 'opacity-50 cursor-not-allowed bg-transparent hover:bg-transparent active:bg-transparent dark:hover:bg-transparent dark:active:bg-transparent pointer-events-none text-gray-400 dark:text-gray-600': !get(monthsInRange)[index],\n },\n ]\"\n :disabled=\"!get(monthsInRange)[index]\"\n @click.stop=\"selectMonth(index)\"\n >\n {{ month.substring(0, 3) }}\n </button>\n </div>\n\n <div\n v-else-if=\"viewMode === 'years'\"\n class=\"year-grid\"\n >\n <button\n v-for=\"(year, index) in yearRange\"\n :key=\"year\"\n type=\"button\"\n class=\"h-9 w-full flex items-center justify-center text-sm font-medium rounded-md transition-colors duration-150 ease-in-out border-none outline-none cursor-pointer focus:ring-2 focus:ring-rui-primary focus:ring-opacity-50\"\n :class=\"[\n {\n 'bg-rui-primary text-white hover:bg-rui-primary-darker active:bg-rui-primary-darker dark:bg-rui-primary dark:text-white dark:hover:bg-rui-primary-darker': year === viewYear && get(yearsInRange)[index],\n 'bg-gray-300 text-gray-500 dark:bg-gray-600 dark:text-gray-400': year === viewYear && !get(yearsInRange)[index],\n 'text-gray-700 bg-transparent hover:bg-gray-100 active:bg-gray-200 dark:text-gray-300 dark:hover:bg-gray-700 dark:active:bg-gray-600': year !== viewYear && get(yearsInRange)[index],\n 'opacity-50 cursor-not-allowed bg-transparent hover:bg-transparent active:bg-transparent dark:hover:bg-transparent dark:active:bg-transparent pointer-events-none text-gray-400 dark:text-gray-600': !get(yearsInRange)[index],\n },\n ]\"\n :disabled=\"!get(yearsInRange)[index]\"\n @click.stop=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n </RuiMenu>\n</template>\n\n<style scoped>\n.menu-container {\n @apply w-64 shadow-lg overflow-hidden;\n}\n\n.menu-header {\n @apply flex items-center justify-center p-1 font-medium text-gray-800 dark:text-gray-200;\n @apply border-b border-rui-grey-200 dark:border-rui-grey-800 cursor-pointer hover:bg-rui-grey-100 dark:hover:bg-rui-grey-800;\n}\n\n.month-grid {\n @apply grid grid-cols-3 gap-1 p-2;\n}\n\n.year-grid {\n @apply grid grid-cols-3 gap-1 p-2;\n}\n</style>\n"],"names":["_useModel","_createBlock","_createElementVNode","_createVNode","_unref","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_renderList","_withModifiers"],"mappings":"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"}
1
+ {"version":3,"file":"RuiCalendarMenu.vue2.js","sources":["../../../src/components/calendar/RuiCalendarMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { get, isDefined, set } from '@vueuse/core';\nimport { ref, watch } from 'vue';\nimport {\n CalendarStateSymbol,\n getShortMonthNames,\n type MonthYearSelection,\n type RuiCalendarState,\n} from '@/components/calendar/state';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport RuiButton from '../buttons/button/RuiButton.vue';\n\ndefineOptions({\n name: 'RuiCalendarMenu',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<boolean>();\n\nconst props = defineProps<{\n anchorEl: HTMLElement | undefined;\n viewMonth: number;\n viewYear: number;\n}>();\n\nconst emit = defineEmits<{\n select: [MonthYearSelection];\n}>();\n\n// Core reactive state - minimal\nconst viewMode = ref<'months' | 'years'>('months');\nconst startYear = ref<number>(props.viewYear - 6);\n\n// Pre-calculated constants\nconst months = getShortMonthNames();\nconst calendarState = inject<RuiCalendarState>(CalendarStateSymbol) as RuiCalendarState;\n\n// Pre-calculated arrays for performance - using refs for better control\nconst yearRange = ref<number[]>([]);\nconst monthsInRange = ref<boolean[]>([]);\nconst yearsInRange = ref<boolean[]>([]);\nconst title = ref<string>('');\nconst canGoToNext = ref<boolean>(true);\nconst canGoToPrev = ref<boolean>(true);\n\n// Pre-calculation functions using VueUse get/set\nfunction calculateYearRange() {\n const start = get(startYear);\n set(yearRange, Array.from({ length: 12 }, (_, i) => start + i));\n}\n\nfunction calculateTitle() {\n if (get(viewMode) === 'months') {\n set(title, props.viewYear.toString());\n }\n else {\n const range = get(yearRange);\n set(title, `${range[0]} - ${range.at(-1)}`);\n }\n}\n\nfunction calculateNavigation() {\n const { maxDate, minDate } = calendarState;\n const mode = get(viewMode);\n\n if (mode === 'months') {\n const nextYear = props.viewYear + 1;\n const previousYear = props.viewYear - 1;\n\n set(canGoToNext, !isDefined(maxDate) || nextYear <= get(maxDate).getFullYear());\n set(canGoToPrev, !isDefined(minDate) || previousYear >= get(minDate).getFullYear());\n }\n else {\n const lastYearInRange = get(startYear) + 11;\n const firstYearInRange = get(startYear);\n\n // Check if we can navigate to the next range of years\n const nextRangeStart = lastYearInRange + 1;\n set(canGoToNext, !isDefined(maxDate) || nextRangeStart <= get(maxDate).getFullYear());\n\n // Check if we can navigate to the previous range of years\n const prevRangeEnd = firstYearInRange - 1;\n set(canGoToPrev, !isDefined(minDate) || prevRangeEnd >= get(minDate).getFullYear());\n }\n}\n\nfunction calculateMonthsInRange() {\n const { minDate, maxDate } = calendarState;\n const currentYear = props.viewYear;\n const result = new Array(12).fill(true);\n\n if (isDefined(minDate) || isDefined(maxDate)) {\n for (let month = 0; month < 12; month++) {\n const date = new Date(currentYear, month);\n if (isDefined(maxDate) && date > get(maxDate)) {\n result[month] = false;\n }\n if (isDefined(minDate) && date < get(minDate)) {\n result[month] = false;\n }\n }\n }\n\n set(monthsInRange, result);\n}\n\nfunction calculateYearsInRange() {\n const { minDate, maxDate } = calendarState;\n const range = get(yearRange);\n const currentMonth = props.viewMonth;\n\n if (!isDefined(minDate) && !isDefined(maxDate)) {\n set(yearsInRange, new Array(range.length).fill(true));\n return;\n }\n\n const result = range.map((year) => {\n const date = new Date(year, currentMonth);\n if (isDefined(maxDate) && date > get(maxDate)) {\n return false;\n }\n return !isDefined(minDate) || date >= get(minDate);\n });\n\n set(yearsInRange, result);\n}\n\n// Initial calculations\ncalculateYearRange();\ncalculateTitle();\ncalculateNavigation();\ncalculateMonthsInRange();\ncalculateYearsInRange();\n\n// Watchers for recalculation only when needed\nwatch(startYear, () => {\n calculateYearRange();\n calculateTitle();\n calculateNavigation();\n calculateYearsInRange();\n});\n\nwatch(viewMode, () => {\n calculateTitle();\n calculateNavigation();\n});\n\nwatch(() => props.viewYear, () => {\n calculateTitle();\n calculateNavigation();\n calculateMonthsInRange();\n calculateYearsInRange();\n});\n\nwatch(() => props.viewMonth, () => {\n calculateYearsInRange();\n});\n\nfunction toggleSelection() {\n set(viewMode, get(viewMode) === 'months' ? 'years' : 'months');\n}\n\nfunction selectMonth(month: number) {\n if (!get(monthsInRange)[month])\n return;\n emit('select', { month, year: props.viewYear });\n set(modelValue, false);\n}\n\nfunction selectYear(year: number) {\n const yearIndex = get(yearRange).indexOf(year);\n if (yearIndex === -1 || !get(yearsInRange)[yearIndex])\n return;\n\n emit('select', { month: props.viewMonth, year });\n set(viewMode, 'months');\n}\n\nfunction handleNext() {\n if (get(viewMode) === 'months') {\n const nextYear = props.viewYear + 1;\n // Emit directly - navigation is already constrained by canGoToNext\n emit('select', { month: props.viewMonth, year: nextYear });\n }\n else {\n const lastYearInRange = get(startYear) + 11;\n set(startYear, lastYearInRange + 1);\n }\n}\n\nfunction handlePrev() {\n if (get(viewMode) === 'months') {\n const previousYear = props.viewYear - 1;\n // Emit directly - navigation is already constrained by canGoToPrev\n emit('select', { month: props.viewMonth, year: previousYear });\n }\n else {\n const firstYearInRange = get(startYear);\n set(startYear, firstYearInRange - 12);\n }\n}\n</script>\n\n<template>\n <RuiMenu\n v-model=\"modelValue\"\n :anchor-el=\"anchorEl\"\n placement=\"bottom-start\"\n >\n <div class=\"menu-container\">\n <div class=\"menu-header\">\n <RuiButton\n type=\"button\"\n class=\"nav-button\"\n icon\n :disabled=\"!get(canGoToPrev)\"\n variant=\"text\"\n @click.stop=\"handlePrev()\"\n >\n <RuiIcon\n name=\"lu-chevron-left\"\n size=\"20\"\n />\n </RuiButton>\n\n <div\n class=\"flex-1 text-center cursor-pointer\"\n @click.stop=\"toggleSelection()\"\n >\n {{ get(title) }}\n </div>\n\n <RuiButton\n type=\"button\"\n class=\"nav-button\"\n icon\n :disabled=\"!get(canGoToNext)\"\n variant=\"text\"\n @click.stop=\"handleNext()\"\n >\n <RuiIcon\n name=\"lu-chevron-right\"\n size=\"20\"\n />\n </RuiButton>\n </div>\n\n <div\n v-if=\"viewMode === 'months'\"\n class=\"month-grid\"\n >\n <button\n v-for=\"(month, index) in months\"\n :key=\"index\"\n type=\"button\"\n class=\"h-9 w-full flex items-center justify-center text-sm font-medium rounded-md transition-colors duration-150 ease-in-out border-none outline-none cursor-pointer focus:ring-2 focus:ring-rui-primary focus:ring-opacity-50\"\n :class=\"[\n {\n 'bg-rui-primary text-white hover:bg-rui-primary-darker active:bg-rui-primary-darker dark:bg-rui-primary dark:text-white dark:hover:bg-rui-primary-darker': index === viewMonth && get(monthsInRange)[index],\n 'bg-gray-300 text-gray-500 dark:bg-gray-600 dark:text-gray-400': index === viewMonth && !get(monthsInRange)[index],\n 'text-gray-700 bg-transparent hover:bg-gray-100 active:bg-gray-200 dark:text-gray-300 dark:hover:bg-gray-700 dark:active:bg-gray-600': index !== viewMonth && get(monthsInRange)[index],\n 'opacity-50 cursor-not-allowed bg-transparent hover:bg-transparent active:bg-transparent dark:hover:bg-transparent dark:active:bg-transparent pointer-events-none text-gray-400 dark:text-gray-600': !get(monthsInRange)[index],\n },\n ]\"\n :disabled=\"!get(monthsInRange)[index]\"\n @click.stop=\"selectMonth(index)\"\n >\n {{ month.substring(0, 3) }}\n </button>\n </div>\n\n <div\n v-else-if=\"viewMode === 'years'\"\n class=\"year-grid\"\n >\n <button\n v-for=\"(year, index) in yearRange\"\n :key=\"year\"\n type=\"button\"\n class=\"h-9 w-full flex items-center justify-center text-sm font-medium rounded-md transition-colors duration-150 ease-in-out border-none outline-none cursor-pointer focus:ring-2 focus:ring-rui-primary focus:ring-opacity-50\"\n :class=\"[\n {\n 'bg-rui-primary text-white hover:bg-rui-primary-darker active:bg-rui-primary-darker dark:bg-rui-primary dark:text-white dark:hover:bg-rui-primary-darker': year === viewYear && get(yearsInRange)[index],\n 'bg-gray-300 text-gray-500 dark:bg-gray-600 dark:text-gray-400': year === viewYear && !get(yearsInRange)[index],\n 'text-gray-700 bg-transparent hover:bg-gray-100 active:bg-gray-200 dark:text-gray-300 dark:hover:bg-gray-700 dark:active:bg-gray-600': year !== viewYear && get(yearsInRange)[index],\n 'opacity-50 cursor-not-allowed bg-transparent hover:bg-transparent active:bg-transparent dark:hover:bg-transparent dark:active:bg-transparent pointer-events-none text-gray-400 dark:text-gray-600': !get(yearsInRange)[index],\n },\n ]\"\n :disabled=\"!get(yearsInRange)[index]\"\n @click.stop=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n </div>\n </RuiMenu>\n</template>\n\n<style scoped>\n.menu-container {\n @apply w-64 shadow-lg overflow-hidden;\n}\n\n.menu-header {\n @apply flex items-center justify-center p-1 font-medium text-gray-800 dark:text-gray-200;\n @apply border-b border-rui-grey-200 dark:border-rui-grey-800 cursor-pointer hover:bg-rui-grey-100 dark:hover:bg-rui-grey-800;\n}\n\n.month-grid {\n @apply grid grid-cols-3 gap-1 p-2;\n}\n\n.year-grid {\n @apply grid grid-cols-3 gap-1 p-2;\n}\n</style>\n"],"names":["_useModel","_createBlock","_createElementVNode","_createVNode","_unref","_toDisplayString","_openBlock","_createElementBlock","_Fragment","_renderList","_withModifiers"],"mappings":"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"}
@@ -13,12 +13,12 @@ import { useRuiI8n } from "../../composables/use-rui-i18n.js";
13
13
  import { RUI_I18N_KEYS } from "../../i18n/keys.js";
14
14
  import { useFocusWithin, useFocus, isDefined, watchIgnorable } from "@vueuse/core";
15
15
  import { get, set } from "@vueuse/shared";
16
- const _hoisted_1 = ["tabindex"];
16
+ const _hoisted_1 = ["data-error", "tabindex"];
17
17
  const _hoisted_2 = {
18
18
  key: 0,
19
19
  class: "text-rui-error"
20
20
  };
21
- const _hoisted_3 = ["disabled", "value", "placeholder", "readonly"];
21
+ const _hoisted_3 = ["disabled", "value", "placeholder", "readonly", "aria-invalid"];
22
22
  const MILLISECONDS = 1e3;
23
23
  const _sfc_main = /* @__PURE__ */ defineComponent({
24
24
  ...{
@@ -50,7 +50,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
50
  emits: ["update:modelValue"],
51
51
  setup(__props) {
52
52
  useCssVars((_ctx) => ({
53
- "v95e55b90": unref(labelWithQuote)
53
+ "a9f07354": unref(labelWithQuote)
54
54
  }));
55
55
  const modelValue = useModel(__props, "modelValue");
56
56
  const props = __props;
@@ -448,6 +448,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
448
448
  },
449
449
  {
450
450
  "data-id": "activator",
451
+ "data-error": hasError ? "" : void 0,
451
452
  tabindex: __props.disabled || props.readonly ? -1 : 0,
452
453
  onClick: _cache[8] || (_cache[8] = ($event) => setInputFocus())
453
454
  }
@@ -486,6 +487,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
486
487
  type: "text",
487
488
  placeholder: unref(dateFormat),
488
489
  readonly: __props.readonly,
490
+ "aria-invalid": hasError,
489
491
  onFocus: _cache[0] || (_cache[0] = ($event) => unref(handleFocus)()),
490
492
  onSelect: _cache[1] || (_cache[1] = ($event) => unref(handleInputSelection)($event)),
491
493
  onClick: _cache[2] || (_cache[2] = withModifiers(($event) => handleInputClick($event), ["stop"])),
@@ -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 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 :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 :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 :aria-invalid=\"hasError\"\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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"}