@katlux/toolkit 0.1.0-beta.45 → 0.1.0-beta.47

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 (40) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/KCombobox/KCombobox.global.d.vue.ts +9 -0
  3. package/dist/runtime/components/KCombobox/KCombobox.global.vue +2 -1
  4. package/dist/runtime/components/KCombobox/KCombobox.global.vue.d.ts +9 -0
  5. package/dist/runtime/components/KCombobox/KCombobox.logic.d.ts +5 -0
  6. package/dist/runtime/components/KCombobox/KCombobox.logic.js +4 -0
  7. package/dist/runtime/components/KDatePicker/KDatePicker.global.d.vue.ts +15 -6
  8. package/dist/runtime/components/KDatePicker/KDatePicker.global.vue +14 -3
  9. package/dist/runtime/components/KDatePicker/KDatePicker.global.vue.d.ts +15 -6
  10. package/dist/runtime/components/KDatePicker/KDatePicker.logic.d.ts +6 -1
  11. package/dist/runtime/components/KDatePicker/KDatePicker.logic.js +23 -6
  12. package/dist/runtime/components/KDateTimePicker/KDateTimePicker.global.d.vue.ts +15 -6
  13. package/dist/runtime/components/KDateTimePicker/KDateTimePicker.global.vue +20 -2
  14. package/dist/runtime/components/KDateTimePicker/KDateTimePicker.global.vue.d.ts +15 -6
  15. package/dist/runtime/components/KDateTimePicker/KDateTimePicker.logic.d.ts +6 -1
  16. package/dist/runtime/components/KDateTimePicker/KDateTimePicker.logic.js +29 -6
  17. package/dist/runtime/components/KDropdown/KDropdown.global.d.vue.ts +9 -0
  18. package/dist/runtime/components/KDropdown/KDropdown.global.vue +5 -3
  19. package/dist/runtime/components/KDropdown/KDropdown.global.vue.d.ts +9 -0
  20. package/dist/runtime/components/KDropdown/KDropdown.logic.d.ts +7 -0
  21. package/dist/runtime/components/KDropdown/KDropdown.logic.js +52 -15
  22. package/dist/runtime/components/KModal/KModal.global.vue +3 -1
  23. package/dist/runtime/components/KModal/KModal.logic.d.ts +3 -1
  24. package/dist/runtime/components/KModal/KModal.logic.js +6 -2
  25. package/dist/runtime/presets/default/components/KCombobox/KCombobox.d.vue.ts +1 -0
  26. package/dist/runtime/presets/default/components/KCombobox/KCombobox.vue +2 -1
  27. package/dist/runtime/presets/default/components/KCombobox/KCombobox.vue.d.ts +1 -0
  28. package/dist/runtime/presets/default/components/KDatePicker/KDatePicker.d.vue.ts +2 -1
  29. package/dist/runtime/presets/default/components/KDatePicker/KDatePicker.vue +3 -2
  30. package/dist/runtime/presets/default/components/KDatePicker/KDatePicker.vue.d.ts +2 -1
  31. package/dist/runtime/presets/default/components/KDateTimePicker/KDateTimePicker.d.vue.ts +2 -1
  32. package/dist/runtime/presets/default/components/KDateTimePicker/KDateTimePicker.vue +3 -2
  33. package/dist/runtime/presets/default/components/KDateTimePicker/KDateTimePicker.vue.d.ts +2 -1
  34. package/dist/runtime/presets/default/components/KDropdown/KDropdown.d.vue.ts +2 -0
  35. package/dist/runtime/presets/default/components/KDropdown/KDropdown.vue +19 -6
  36. package/dist/runtime/presets/default/components/KDropdown/KDropdown.vue.d.ts +2 -0
  37. package/dist/runtime/presets/default/components/KModal/KModal.d.vue.ts +1 -0
  38. package/dist/runtime/presets/default/components/KModal/KModal.vue +2 -0
  39. package/dist/runtime/presets/default/components/KModal/KModal.vue.d.ts +1 -0
  40. package/package.json +1 -1
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@katlux/toolkit",
3
3
  "configKey": "katluxToolkit",
4
- "version": "0.1.0-beta.45",
4
+ "version": "0.1.0-beta.47",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "3.6.1"
@@ -39,6 +39,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
39
39
  type: import("vue").PropType<import("./KCombobox.logic.js").ComboboxItem | import("./KCombobox.logic.js").ComboboxItem[] | null>;
40
40
  default: null;
41
41
  };
42
+ teleportTo: {
43
+ type: import("vue").PropType<string>;
44
+ default: undefined;
45
+ };
42
46
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
43
47
  "update:modelValue": (value: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null) => any;
44
48
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -82,6 +86,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
82
86
  type: import("vue").PropType<import("./KCombobox.logic.js").ComboboxItem | import("./KCombobox.logic.js").ComboboxItem[] | null>;
83
87
  default: null;
84
88
  };
89
+ teleportTo: {
90
+ type: import("vue").PropType<string>;
91
+ default: undefined;
92
+ };
85
93
  }>> & Readonly<{
86
94
  "onUpdate:modelValue"?: ((value: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null) => any) | undefined;
87
95
  }>, {
@@ -89,6 +97,7 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
89
97
  modelValue: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null;
90
98
  searchbox: boolean;
91
99
  placeholder: string;
100
+ teleportTo: string;
92
101
  closeOnSelect: boolean;
93
102
  multiSelect: boolean;
94
103
  maxSelectedDisplay: string | number | boolean;
@@ -31,7 +31,8 @@ const templateProps = computed(() => ({
31
31
  closeDropdown,
32
32
  selectItem,
33
33
  isSelected,
34
- loading: loading.value
34
+ loading: loading.value,
35
+ teleportTo: props.teleportTo
35
36
  }));
36
37
  function updateSearchText(val) {
37
38
  searchtext.value = val;
@@ -39,6 +39,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
39
39
  type: import("vue").PropType<import("./KCombobox.logic.js").ComboboxItem | import("./KCombobox.logic.js").ComboboxItem[] | null>;
40
40
  default: null;
41
41
  };
42
+ teleportTo: {
43
+ type: import("vue").PropType<string>;
44
+ default: undefined;
45
+ };
42
46
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
43
47
  "update:modelValue": (value: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null) => any;
44
48
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -82,6 +86,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
82
86
  type: import("vue").PropType<import("./KCombobox.logic.js").ComboboxItem | import("./KCombobox.logic.js").ComboboxItem[] | null>;
83
87
  default: null;
84
88
  };
89
+ teleportTo: {
90
+ type: import("vue").PropType<string>;
91
+ default: undefined;
92
+ };
85
93
  }>> & Readonly<{
86
94
  "onUpdate:modelValue"?: ((value: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null) => any) | undefined;
87
95
  }>, {
@@ -89,6 +97,7 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
89
97
  modelValue: import("@katlux/providers").TDataRow | import("@katlux/providers").TDataRow[] | null;
90
98
  searchbox: boolean;
91
99
  placeholder: string;
100
+ teleportTo: string;
92
101
  closeOnSelect: boolean;
93
102
  multiSelect: boolean;
94
103
  maxSelectedDisplay: string | number | boolean;
@@ -13,6 +13,7 @@ export interface KComboboxProps {
13
13
  visibleFields?: Array<String> | null;
14
14
  labelField: string;
15
15
  modelValue?: ComboboxItem | ComboboxItem[] | null;
16
+ teleportTo?: string;
16
17
  }
17
18
  export interface KComboboxEmits {
18
19
  (e: 'update:modelValue', value: ComboboxItem | ComboboxItem[] | null): void;
@@ -58,6 +59,10 @@ export declare const KComboboxDefaultProps: {
58
59
  type: PropType<ComboboxItem | ComboboxItem[] | null>;
59
60
  default: null;
60
61
  };
62
+ teleportTo: {
63
+ type: PropType<string>;
64
+ default: undefined;
65
+ };
61
66
  };
62
67
  export declare function useKComboboxLogic(props: KComboboxProps, emit: KComboboxEmits): {
63
68
  selectedItems: import("vue").Ref<TDataRow[] | null, TDataRow[] | null>;
@@ -42,6 +42,10 @@ export const KComboboxDefaultProps = {
42
42
  modelValue: {
43
43
  type: [Object, Array],
44
44
  default: null
45
+ },
46
+ teleportTo: {
47
+ type: String,
48
+ default: void 0
45
49
  }
46
50
  };
47
51
  export function useKComboboxLogic(props, emit) {
@@ -20,13 +20,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
20
20
  default: boolean;
21
21
  };
22
22
  calendarDefinedDays: {
23
- type: import("vue").PropType<IDefinedDay[]>;
23
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
24
24
  default: () => never[];
25
25
  };
26
26
  calendarMarkedDays: {
27
- type: import("vue").PropType<IMarkedDay[]>;
27
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
28
28
  default: () => never[];
29
29
  };
30
+ teleportTo: {
31
+ type: import("vue").PropType<string>;
32
+ default: undefined;
33
+ };
30
34
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
31
35
  "update:modelValue": (value: string | Date) => any;
32
36
  "update:maskedModel": (value: string) => any;
@@ -55,13 +59,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
55
59
  default: boolean;
56
60
  };
57
61
  calendarDefinedDays: {
58
- type: import("vue").PropType<IDefinedDay[]>;
62
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
59
63
  default: () => never[];
60
64
  };
61
65
  calendarMarkedDays: {
62
- type: import("vue").PropType<IMarkedDay[]>;
66
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
63
67
  default: () => never[];
64
68
  };
69
+ teleportTo: {
70
+ type: import("vue").PropType<string>;
71
+ default: undefined;
72
+ };
65
73
  }>> & Readonly<{
66
74
  "onUpdate:modelValue"?: ((value: string | Date) => any) | undefined;
67
75
  "onUpdate:maskedModel"?: ((value: string) => any) | undefined;
@@ -72,10 +80,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
72
80
  isOpen: boolean;
73
81
  day: string | Date;
74
82
  modelValue: string | Date;
83
+ teleportTo: string;
75
84
  format: string;
76
85
  showClear: boolean;
77
- calendarDefinedDays: IDefinedDay[];
78
- calendarMarkedDays: IMarkedDay[];
86
+ calendarDefinedDays: import("../KCalendar/types.js").IDefinedDay[];
87
+ calendarMarkedDays: import("../KCalendar/types.js").IMarkedDay[];
79
88
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
80
89
  declare const _default: typeof __VLS_export;
81
90
  export default _default;
@@ -24,8 +24,14 @@ const templateProps = computed(() => ({
24
24
  calendarDefinedDays: props.calendarDefinedDays,
25
25
  calendarMarkedDays: props.calendarMarkedDays,
26
26
  textboxClicked,
27
- dateSelected: handleDateSelected
27
+ onClear: handleClear,
28
+ dateSelected: handleDateSelected,
29
+ teleportTo: props.teleportTo
28
30
  }));
31
+ const handleClear = () => {
32
+ _date.value = "";
33
+ maskedModel.value = "";
34
+ };
29
35
  const updateMaskedModel = (val) => {
30
36
  maskedModel.value = val;
31
37
  };
@@ -36,8 +42,13 @@ const handleDateSelected = (date) => {
36
42
  dateSelected(date);
37
43
  };
38
44
  watch(_date, (newDate) => {
39
- emit("update:day", newDate);
40
- emit("update:modelValue", newDate);
45
+ const d1 = newDate instanceof Date ? newDate.getTime() : new Date(newDate).getTime();
46
+ const d2 = props.modelValue instanceof Date ? props.modelValue.getTime() : new Date(props.modelValue || "").getTime();
47
+ const d3 = props.day instanceof Date ? props.day.getTime() : new Date(props.day || "").getTime();
48
+ if (d1 !== d2 && d1 !== d3) {
49
+ emit("update:day", newDate);
50
+ emit("update:modelValue", newDate);
51
+ }
41
52
  });
42
53
  watch(calendarShow, (newVal) => {
43
54
  emit("update:isOpen", newVal);
@@ -20,13 +20,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
20
20
  default: boolean;
21
21
  };
22
22
  calendarDefinedDays: {
23
- type: import("vue").PropType<IDefinedDay[]>;
23
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
24
24
  default: () => never[];
25
25
  };
26
26
  calendarMarkedDays: {
27
- type: import("vue").PropType<IMarkedDay[]>;
27
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
28
28
  default: () => never[];
29
29
  };
30
+ teleportTo: {
31
+ type: import("vue").PropType<string>;
32
+ default: undefined;
33
+ };
30
34
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
31
35
  "update:modelValue": (value: string | Date) => any;
32
36
  "update:maskedModel": (value: string) => any;
@@ -55,13 +59,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
55
59
  default: boolean;
56
60
  };
57
61
  calendarDefinedDays: {
58
- type: import("vue").PropType<IDefinedDay[]>;
62
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
59
63
  default: () => never[];
60
64
  };
61
65
  calendarMarkedDays: {
62
- type: import("vue").PropType<IMarkedDay[]>;
66
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
63
67
  default: () => never[];
64
68
  };
69
+ teleportTo: {
70
+ type: import("vue").PropType<string>;
71
+ default: undefined;
72
+ };
65
73
  }>> & Readonly<{
66
74
  "onUpdate:modelValue"?: ((value: string | Date) => any) | undefined;
67
75
  "onUpdate:maskedModel"?: ((value: string) => any) | undefined;
@@ -72,10 +80,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
72
80
  isOpen: boolean;
73
81
  day: string | Date;
74
82
  modelValue: string | Date;
83
+ teleportTo: string;
75
84
  format: string;
76
85
  showClear: boolean;
77
- calendarDefinedDays: IDefinedDay[];
78
- calendarMarkedDays: IMarkedDay[];
86
+ calendarDefinedDays: import("../KCalendar/types.js").IDefinedDay[];
87
+ calendarMarkedDays: import("../KCalendar/types.js").IMarkedDay[];
79
88
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
80
89
  declare const _default: typeof __VLS_export;
81
90
  export default _default;
@@ -1,5 +1,5 @@
1
1
  import { type PropType } from 'vue';
2
- import type { IMarkedDay, IDefinedDay } from '@katlux/toolkit/components/KCalendar/types.ts';
2
+ import type { IMarkedDay, IDefinedDay } from '../KCalendar/types.js';
3
3
  export interface KDatePickerProps {
4
4
  format: string;
5
5
  day?: Date | string;
@@ -8,6 +8,7 @@ export interface KDatePickerProps {
8
8
  showClear?: boolean;
9
9
  calendarDefinedDays: IDefinedDay[];
10
10
  calendarMarkedDays: IMarkedDay[];
11
+ teleportTo?: string;
11
12
  }
12
13
  export declare const KDatePickerDefaultProps: {
13
14
  format: {
@@ -38,6 +39,10 @@ export declare const KDatePickerDefaultProps: {
38
39
  type: PropType<IMarkedDay[]>;
39
40
  default: () => never[];
40
41
  };
42
+ teleportTo: {
43
+ type: PropType<string>;
44
+ default: undefined;
45
+ };
41
46
  };
42
47
  export declare function useKDatePickerLogic(props: KDatePickerProps): {
43
48
  _date: import("vue").Ref<string | Date, string | Date>;
@@ -27,6 +27,10 @@ export const KDatePickerDefaultProps = {
27
27
  calendarMarkedDays: {
28
28
  type: Array,
29
29
  default: () => []
30
+ },
31
+ teleportTo: {
32
+ type: String,
33
+ default: void 0
30
34
  }
31
35
  };
32
36
  export function useKDatePickerLogic(props) {
@@ -35,7 +39,9 @@ export function useKDatePickerLogic(props) {
35
39
  const calendarShow = ref(false);
36
40
  watch(maskedModel, (newVal) => {
37
41
  if (newVal === "") {
38
- _date.value = "";
42
+ if (_date.value !== "") {
43
+ _date.value = "";
44
+ }
39
45
  return;
40
46
  }
41
47
  const format = props.format;
@@ -57,7 +63,10 @@ export function useKDatePickerLogic(props) {
57
63
  if (month.length === 2 && day.length === 2 && year.length === 4) {
58
64
  const d = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
59
65
  if (!isNaN(d.getTime())) {
60
- _date.value = d;
66
+ const oldTime = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
67
+ if (d.getTime() !== oldTime) {
68
+ _date.value = d;
69
+ }
61
70
  }
62
71
  }
63
72
  });
@@ -101,14 +110,22 @@ export function useKDatePickerLogic(props) {
101
110
  });
102
111
  watch(() => props.day, (newDay) => {
103
112
  if (newDay) {
104
- _date.value = newDay;
105
- syncMaskedModel(newDay);
113
+ const d1 = newDay instanceof Date ? newDay.getTime() : new Date(newDay).getTime();
114
+ const d2 = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
115
+ if (d1 !== d2) {
116
+ _date.value = newDay;
117
+ syncMaskedModel(newDay);
118
+ }
106
119
  }
107
120
  });
108
121
  watch(() => props.modelValue, (newVal) => {
109
122
  if (newVal) {
110
- _date.value = newVal;
111
- syncMaskedModel(newVal);
123
+ const d1 = newVal instanceof Date ? newVal.getTime() : new Date(newVal).getTime();
124
+ const d2 = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
125
+ if (d1 !== d2) {
126
+ _date.value = newVal;
127
+ syncMaskedModel(newVal);
128
+ }
112
129
  }
113
130
  });
114
131
  watch(() => props.isOpen, (newVal) => {
@@ -28,13 +28,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
28
28
  default: number;
29
29
  };
30
30
  calendarDefinedDays: {
31
- type: import("vue").PropType<IDefinedDay[]>;
31
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
32
32
  default: () => never[];
33
33
  };
34
34
  calendarMarkedDays: {
35
- type: import("vue").PropType<IMarkedDay[]>;
35
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
36
36
  default: () => never[];
37
37
  };
38
+ teleportTo: {
39
+ type: import("vue").PropType<string>;
40
+ default: undefined;
41
+ };
38
42
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
39
43
  "update:modelValue": (value: string | Date) => any;
40
44
  "update:maskedModel": (value: string) => any;
@@ -70,13 +74,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
70
74
  default: number;
71
75
  };
72
76
  calendarDefinedDays: {
73
- type: import("vue").PropType<IDefinedDay[]>;
77
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
74
78
  default: () => never[];
75
79
  };
76
80
  calendarMarkedDays: {
77
- type: import("vue").PropType<IMarkedDay[]>;
81
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
78
82
  default: () => never[];
79
83
  };
84
+ teleportTo: {
85
+ type: import("vue").PropType<string>;
86
+ default: undefined;
87
+ };
80
88
  }>> & Readonly<{
81
89
  "onUpdate:modelValue"?: ((value: string | Date) => any) | undefined;
82
90
  "onUpdate:maskedModel"?: ((value: string) => any) | undefined;
@@ -86,10 +94,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
86
94
  isOpen: boolean;
87
95
  day: string | Date;
88
96
  modelValue: string | Date;
97
+ teleportTo: string;
89
98
  format: string;
90
99
  showClear: boolean;
91
- calendarDefinedDays: IDefinedDay[];
92
- calendarMarkedDays: IMarkedDay[];
100
+ calendarDefinedDays: import("../KCalendar/types.js").IDefinedDay[];
101
+ calendarMarkedDays: import("../KCalendar/types.js").IMarkedDay[];
93
102
  timeFormat: string;
94
103
  timeStep: number;
95
104
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -29,9 +29,16 @@ const templateProps = computed(() => ({
29
29
  calendarMarkedDays: props.calendarMarkedDays,
30
30
  showClear: props.showClear,
31
31
  textboxClicked,
32
+ onClear: handleClear,
32
33
  dateSelected,
33
- timeSelected
34
+ timeSelected,
35
+ teleportTo: props.teleportTo
34
36
  }));
37
+ const handleClear = () => {
38
+ _date.value = "";
39
+ _time.value = "";
40
+ maskedModel.value = "";
41
+ };
35
42
  const updateMaskedModel = (val) => {
36
43
  maskedModel.value = val;
37
44
  };
@@ -39,7 +46,18 @@ const updateCalendarShow = (val) => {
39
46
  calendarShow.value = val;
40
47
  };
41
48
  watch(_date, (newDate) => {
42
- emit("update:modelValue", newDate);
49
+ if (!newDate) {
50
+ if (props.modelValue || props.day) {
51
+ emit("update:modelValue", "");
52
+ }
53
+ return;
54
+ }
55
+ const d1 = newDate instanceof Date ? newDate.getTime() : new Date(newDate).getTime();
56
+ const d2 = props.modelValue instanceof Date ? props.modelValue.getTime() : new Date(props.modelValue || "").getTime();
57
+ const d3 = props.day instanceof Date ? props.day.getTime() : new Date(props.day || "").getTime();
58
+ if (d1 !== d2 && d1 !== d3) {
59
+ emit("update:modelValue", newDate);
60
+ }
43
61
  });
44
62
  watch(calendarShow, (newVal) => {
45
63
  emit("update:isOpen", newVal);
@@ -28,13 +28,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
28
28
  default: number;
29
29
  };
30
30
  calendarDefinedDays: {
31
- type: import("vue").PropType<IDefinedDay[]>;
31
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
32
32
  default: () => never[];
33
33
  };
34
34
  calendarMarkedDays: {
35
- type: import("vue").PropType<IMarkedDay[]>;
35
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
36
36
  default: () => never[];
37
37
  };
38
+ teleportTo: {
39
+ type: import("vue").PropType<string>;
40
+ default: undefined;
41
+ };
38
42
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
39
43
  "update:modelValue": (value: string | Date) => any;
40
44
  "update:maskedModel": (value: string) => any;
@@ -70,13 +74,17 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
70
74
  default: number;
71
75
  };
72
76
  calendarDefinedDays: {
73
- type: import("vue").PropType<IDefinedDay[]>;
77
+ type: import("vue").PropType<import("../KCalendar/types.js").IDefinedDay[]>;
74
78
  default: () => never[];
75
79
  };
76
80
  calendarMarkedDays: {
77
- type: import("vue").PropType<IMarkedDay[]>;
81
+ type: import("vue").PropType<import("../KCalendar/types.js").IMarkedDay[]>;
78
82
  default: () => never[];
79
83
  };
84
+ teleportTo: {
85
+ type: import("vue").PropType<string>;
86
+ default: undefined;
87
+ };
80
88
  }>> & Readonly<{
81
89
  "onUpdate:modelValue"?: ((value: string | Date) => any) | undefined;
82
90
  "onUpdate:maskedModel"?: ((value: string) => any) | undefined;
@@ -86,10 +94,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
86
94
  isOpen: boolean;
87
95
  day: string | Date;
88
96
  modelValue: string | Date;
97
+ teleportTo: string;
89
98
  format: string;
90
99
  showClear: boolean;
91
- calendarDefinedDays: IDefinedDay[];
92
- calendarMarkedDays: IMarkedDay[];
100
+ calendarDefinedDays: import("../KCalendar/types.js").IDefinedDay[];
101
+ calendarMarkedDays: import("../KCalendar/types.js").IMarkedDay[];
93
102
  timeFormat: string;
94
103
  timeStep: number;
95
104
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1,5 +1,5 @@
1
1
  import { type PropType } from 'vue';
2
- import type { IMarkedDay, IDefinedDay } from '@katlux/toolkit/components/KCalendar/types.ts';
2
+ import type { IMarkedDay, IDefinedDay } from '../KCalendar/types.js';
3
3
  export interface KDateTimePickerProps {
4
4
  format?: string;
5
5
  timeFormat?: string;
@@ -10,6 +10,7 @@ export interface KDateTimePickerProps {
10
10
  timeStep?: number;
11
11
  calendarDefinedDays?: IDefinedDay[];
12
12
  calendarMarkedDays?: IMarkedDay[];
13
+ teleportTo?: string;
13
14
  }
14
15
  export declare const KDateTimePickerDefaultProps: {
15
16
  format: {
@@ -48,6 +49,10 @@ export declare const KDateTimePickerDefaultProps: {
48
49
  type: PropType<IMarkedDay[]>;
49
50
  default: () => never[];
50
51
  };
52
+ teleportTo: {
53
+ type: PropType<string>;
54
+ default: undefined;
55
+ };
51
56
  };
52
57
  export declare function useKDateTimePickerLogic(props: KDateTimePickerProps): {
53
58
  _date: import("vue").Ref<string | Date, string | Date>;
@@ -35,6 +35,10 @@ export const KDateTimePickerDefaultProps = {
35
35
  calendarMarkedDays: {
36
36
  type: Array,
37
37
  default: () => []
38
+ },
39
+ teleportTo: {
40
+ type: String,
41
+ default: void 0
38
42
  }
39
43
  };
40
44
  export function useKDateTimePickerLogic(props) {
@@ -44,8 +48,10 @@ export function useKDateTimePickerLogic(props) {
44
48
  const calendarShow = ref(false);
45
49
  watch(maskedModel, (newVal) => {
46
50
  if (newVal === "") {
47
- _date.value = "";
48
- _time.value = "";
51
+ if (_date.value !== "") {
52
+ _date.value = "";
53
+ _time.value = "";
54
+ }
49
55
  return;
50
56
  }
51
57
  const format = props.format || "MM-DD-YYYY HH:mm";
@@ -75,10 +81,15 @@ export function useKDateTimePickerLogic(props) {
75
81
  if (hours.length === 2 && minutes.length === 2) {
76
82
  d.setHours(parseInt(hours));
77
83
  d.setMinutes(parseInt(minutes));
78
- _time.value = `${hours}:${minutes}`;
79
84
  }
80
85
  if (!isNaN(d.getTime())) {
81
- _date.value = d;
86
+ const oldTime = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
87
+ if (d.getTime() !== oldTime) {
88
+ _date.value = d;
89
+ if (hours.length === 2 && minutes.length === 2) {
90
+ _time.value = `${hours}:${minutes}`;
91
+ }
92
+ }
82
93
  }
83
94
  }
84
95
  });
@@ -167,10 +178,22 @@ export function useKDateTimePickerLogic(props) {
167
178
  updateMaskedModel();
168
179
  };
169
180
  watch(() => props.modelValue, (newVal) => {
170
- syncValue(newVal);
181
+ if (newVal) {
182
+ const d1 = newVal instanceof Date ? newVal.getTime() : new Date(newVal).getTime();
183
+ const d2 = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
184
+ if (d1 !== d2) {
185
+ syncValue(newVal);
186
+ }
187
+ }
171
188
  });
172
189
  watch(() => props.day, (newDay) => {
173
- syncValue(newDay);
190
+ if (newDay) {
191
+ const d1 = newDay instanceof Date ? newDay.getTime() : new Date(newDay).getTime();
192
+ const d2 = _date.value instanceof Date ? _date.value.getTime() : new Date(_date.value).getTime();
193
+ if (d1 !== d2) {
194
+ syncValue(newDay);
195
+ }
196
+ }
174
197
  });
175
198
  watch(() => props.isOpen, (newVal) => {
176
199
  calendarShow.value = !!newVal;
@@ -11,6 +11,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
11
11
  type: import("vue").PropType<HTMLElement>;
12
12
  default: undefined;
13
13
  };
14
+ teleportTo: {
15
+ type: import("vue").PropType<string>;
16
+ default: undefined;
17
+ };
14
18
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
15
19
  "update:isOpen": (value: boolean) => any;
16
20
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -26,10 +30,15 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
30
  type: import("vue").PropType<HTMLElement>;
27
31
  default: undefined;
28
32
  };
33
+ teleportTo: {
34
+ type: import("vue").PropType<string>;
35
+ default: undefined;
36
+ };
29
37
  }>> & Readonly<{
30
38
  "onUpdate:isOpen"?: ((value: boolean) => any) | undefined;
31
39
  }>, {
32
40
  isOpen: boolean;
41
+ teleportTo: string;
33
42
  fullWidth: boolean;
34
43
  anchorEl: HTMLElement;
35
44
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -5,19 +5,21 @@ import { computed } from "vue";
5
5
  import KDropdownDefault from "../../presets/default/components/KDropdown/KDropdown.vue";
6
6
  const props = defineProps(KDropdownDefaultProps);
7
7
  const emit = defineEmits(["update:isOpen"]);
8
- const { open, dropdownRect, clickoutside } = useKDropdownLogic(props, emit);
8
+ const { open, dropdownRect, clickoutside, teleportTarget, isInModal } = useKDropdownLogic(props, emit);
9
9
  const presetComponent = usePresetComponent("KDropdown", KDropdownDefault);
10
10
  const templateProps = computed(() => ({
11
11
  open: open.value,
12
12
  fullWidth: props.fullWidth,
13
13
  anchorEl: props.anchorEl,
14
14
  dropdownRect: dropdownRect.value,
15
- clickoutside
15
+ clickoutside,
16
+ teleportTarget: teleportTarget.value,
17
+ isInModal: isInModal.value
16
18
  }));
17
19
  </script>
18
20
 
19
21
  <template lang="pug">
20
- component(:is="presetComponent" v-bind="{ ...templateProps, ...$attrs }")
22
+ component(:is="presetComponent" v-bind="{ ...templateProps, ...$attrs }" @update:isOpen="emit('update:isOpen', $event)")
21
23
  template(v-for="(_, slot) in $slots" #[slot]="scope")
22
24
  slot(:name="slot" v-bind="scope")
23
25
  </template>
@@ -11,6 +11,10 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
11
11
  type: import("vue").PropType<HTMLElement>;
12
12
  default: undefined;
13
13
  };
14
+ teleportTo: {
15
+ type: import("vue").PropType<string>;
16
+ default: undefined;
17
+ };
14
18
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
15
19
  "update:isOpen": (value: boolean) => any;
16
20
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -26,10 +30,15 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
30
  type: import("vue").PropType<HTMLElement>;
27
31
  default: undefined;
28
32
  };
33
+ teleportTo: {
34
+ type: import("vue").PropType<string>;
35
+ default: undefined;
36
+ };
29
37
  }>> & Readonly<{
30
38
  "onUpdate:isOpen"?: ((value: boolean) => any) | undefined;
31
39
  }>, {
32
40
  isOpen: boolean;
41
+ teleportTo: string;
33
42
  fullWidth: boolean;
34
43
  anchorEl: HTMLElement;
35
44
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -3,6 +3,7 @@ export interface KDropdownProps {
3
3
  isOpen: boolean;
4
4
  fullWidth: boolean;
5
5
  anchorEl?: HTMLElement;
6
+ teleportTo?: string;
6
7
  }
7
8
  export interface KDropdownEmits {
8
9
  (e: 'update:isOpen', value: boolean): void;
@@ -20,6 +21,10 @@ export declare const KDropdownDefaultProps: {
20
21
  type: PropType<HTMLElement>;
21
22
  default: undefined;
22
23
  };
24
+ teleportTo: {
25
+ type: PropType<string>;
26
+ default: undefined;
27
+ };
23
28
  };
24
29
  export declare function useKDropdownLogic(props: KDropdownProps, emit: KDropdownEmits): {
25
30
  open: import("vue").Ref<boolean, boolean>;
@@ -37,4 +42,6 @@ export declare function useKDropdownLogic(props: KDropdownProps, emit: KDropdown
37
42
  width: number;
38
43
  }>;
39
44
  clickoutside: () => void;
45
+ teleportTarget: import("vue").ComputedRef<string>;
46
+ isInModal: import("vue").ComputedRef<boolean>;
40
47
  };
@@ -1,4 +1,5 @@
1
- import { ref, watch, onMounted, onUnmounted, nextTick } from "vue";
1
+ import { ref, watch, onMounted, onUnmounted, nextTick, inject, computed } from "vue";
2
+ import { KMODAL_PORTAL_ID_KEY } from "../KModal/KModal.logic.js";
2
3
  export const KDropdownDefaultProps = {
3
4
  isOpen: {
4
5
  type: Boolean,
@@ -11,24 +12,51 @@ export const KDropdownDefaultProps = {
11
12
  anchorEl: {
12
13
  type: Object,
13
14
  default: void 0
15
+ },
16
+ teleportTo: {
17
+ type: String,
18
+ default: void 0
14
19
  }
15
20
  };
16
21
  export function useKDropdownLogic(props, emit) {
22
+ const modalPortalId = inject(KMODAL_PORTAL_ID_KEY, null);
23
+ const isInModal = computed(() => !!modalPortalId);
24
+ const teleportTarget = computed(() => {
25
+ if (props.teleportTo) return props.teleportTo;
26
+ if (isInModal.value) return `#${modalPortalId}`;
27
+ return "body";
28
+ });
17
29
  const open = ref(false);
18
30
  const dropdownRect = ref({ top: 0, left: 0, width: 0 });
19
31
  const clickoutside = () => {
20
32
  open.value = false;
21
33
  emit("update:isOpen", open.value);
22
34
  };
23
- const updatePosition = async () => {
24
- await nextTick();
25
- if (props.anchorEl) {
26
- const rect = props.anchorEl.getBoundingClientRect();
27
- dropdownRect.value = {
28
- top: rect.bottom + window.scrollY,
29
- left: rect.left + window.scrollX,
30
- width: rect.width
31
- };
35
+ const updatePosition = () => {
36
+ try {
37
+ if (props.anchorEl) {
38
+ const el = props.anchorEl.$el || props.anchorEl;
39
+ if (el && typeof el.getBoundingClientRect === "function") {
40
+ const rect = el.getBoundingClientRect();
41
+ if (teleportTarget.value === "body" || teleportTarget.value === void 0) {
42
+ dropdownRect.value = {
43
+ top: rect.bottom + window.scrollY,
44
+ left: rect.left + window.scrollX,
45
+ width: rect.width
46
+ };
47
+ } else {
48
+ const portalEl = document.querySelector(teleportTarget.value);
49
+ const portalRect = portalEl ? portalEl.getBoundingClientRect() : { top: 0, left: 0 };
50
+ dropdownRect.value = {
51
+ top: rect.bottom - portalRect.top,
52
+ left: rect.left - portalRect.left,
53
+ width: rect.width
54
+ };
55
+ }
56
+ }
57
+ }
58
+ } catch (e) {
59
+ console.error("[KDropdown] Failed to update position", e);
32
60
  }
33
61
  };
34
62
  const onScrollResize = () => {
@@ -39,11 +67,16 @@ export function useKDropdownLogic(props, emit) {
39
67
  watch(
40
68
  () => props.isOpen,
41
69
  (newValue) => {
42
- open.value = newValue;
43
70
  if (newValue) {
44
71
  updatePosition();
72
+ nextTick(() => {
73
+ open.value = true;
74
+ });
75
+ } else {
76
+ open.value = false;
45
77
  }
46
- }
78
+ },
79
+ { immediate: true }
47
80
  );
48
81
  watch(
49
82
  () => props.anchorEl,
@@ -54,9 +87,11 @@ export function useKDropdownLogic(props, emit) {
54
87
  }
55
88
  );
56
89
  onMounted(() => {
57
- open.value = props.isOpen;
58
- if (open.value) {
90
+ if (props.isOpen) {
59
91
  updatePosition();
92
+ nextTick(() => {
93
+ open.value = true;
94
+ });
60
95
  }
61
96
  window.addEventListener("scroll", onScrollResize, true);
62
97
  window.addEventListener("resize", onScrollResize);
@@ -68,6 +103,8 @@ export function useKDropdownLogic(props, emit) {
68
103
  return {
69
104
  open,
70
105
  dropdownRect,
71
- clickoutside
106
+ clickoutside,
107
+ teleportTarget,
108
+ isInModal
72
109
  };
73
110
  }
@@ -4,13 +4,15 @@ import { usePresetComponent } from "../../composables/usePresetComponent";
4
4
  import { computed } from "vue";
5
5
  import KModalDefault from "../../presets/default/components/KModal/KModal.vue";
6
6
  const props = defineProps(KModalDefaultProps);
7
- const { opened, openModal, closeModal } = useKModalLogic(props);
7
+ const stableId = globalThis.useId ? globalThis.useId() : `k-modal-${Math.random().toString(36).slice(2, 9)}`;
8
+ const { modalId, opened, openModal, closeModal } = useKModalLogic(props, stableId);
8
9
  defineExpose({
9
10
  openModal,
10
11
  closeModal
11
12
  });
12
13
  const presetComponent = usePresetComponent("KModal", KModalDefault);
13
14
  const templateProps = computed(() => ({
15
+ modalId,
14
16
  opened: opened.value,
15
17
  closeModal
16
18
  }));
@@ -1,7 +1,9 @@
1
+ export declare const KMODAL_PORTAL_ID_KEY = "KMODAL_PORTAL_ID";
1
2
  export interface KModalProps {
2
3
  }
3
4
  export declare const KModalDefaultProps: {};
4
- export declare function useKModalLogic(props: KModalProps): {
5
+ export declare function useKModalLogic(props: KModalProps, stableId: string): {
6
+ modalId: string;
5
7
  opened: import("vue").Ref<boolean, boolean>;
6
8
  openModal: () => void;
7
9
  closeModal: () => void;
@@ -1,6 +1,9 @@
1
- import { ref } from "vue";
1
+ import { ref, provide } from "vue";
2
+ export const KMODAL_PORTAL_ID_KEY = "KMODAL_PORTAL_ID";
2
3
  export const KModalDefaultProps = {};
3
- export function useKModalLogic(props) {
4
+ export function useKModalLogic(props, stableId) {
5
+ const modalId = stableId;
6
+ provide(KMODAL_PORTAL_ID_KEY, modalId);
4
7
  const opened = ref(false);
5
8
  function openModal() {
6
9
  opened.value = true;
@@ -9,6 +12,7 @@ export function useKModalLogic(props) {
9
12
  opened.value = false;
10
13
  }
11
14
  return {
15
+ modalId,
12
16
  opened,
13
17
  openModal,
14
18
  closeModal
@@ -13,6 +13,7 @@ type __VLS_Props = {
13
13
  selectItem: (option: ComboboxItem) => void;
14
14
  isSelected: (option: ComboboxItem) => boolean;
15
15
  loading: boolean;
16
+ teleportTo?: string;
16
17
  };
17
18
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
18
19
  "update:searchtext": (value: string) => any;
@@ -9,7 +9,7 @@
9
9
  ) {{ item[labelField] }}
10
10
  .KCombobox__selected-content-placeholder(v-else) {{placeholder}}
11
11
  KIcon(iconname="chevron" width="12" height="12").chevron
12
- KDropdown(:isOpen="isOptionsOpen" :anchorEl="activatorRef" fullWidth).KCombobox__options
12
+ KDropdown(:isOpen="isOptionsOpen" :anchorEl="activatorRef" fullWidth :teleportTo="teleportTo").KCombobox__options
13
13
  slot
14
14
  KComboboxList(
15
15
  :searchbox="searchbox"
@@ -42,6 +42,7 @@ const props = defineProps<{
42
42
  selectItem: (option: ComboboxItem) => void
43
43
  isSelected: (option: ComboboxItem) => boolean
44
44
  loading: boolean
45
+ teleportTo?: string
45
46
  }>()
46
47
 
47
48
  const emit = defineEmits<{
@@ -13,6 +13,7 @@ type __VLS_Props = {
13
13
  selectItem: (option: ComboboxItem) => void;
14
14
  isSelected: (option: ComboboxItem) => boolean;
15
15
  loading: boolean;
16
+ teleportTo?: string;
16
17
  };
17
18
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
18
19
  "update:searchtext": (value: string) => any;
@@ -9,8 +9,9 @@ type __VLS_Props = {
9
9
  calendarDefinedDays: IDefinedDay[];
10
10
  calendarMarkedDays: IMarkedDay[];
11
11
  textboxClicked: () => void;
12
- onClear: () => void;
12
+ onClear?: () => void;
13
13
  dateSelected: (date: Date) => void;
14
+ teleportTo?: string;
14
15
  };
15
16
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
16
17
  "update:maskedModel": (value: string) => any;
@@ -1,7 +1,7 @@
1
1
  <template lang="pug">
2
2
  .KDatePicker(ref="activatorRef")
3
3
  KMaskTextbox(v-model="maskedModel" :key="maskedModel" :mask="format" :placeholder="format" @click.stop="textboxClicked" :showClear="showClear" @clear="onClear")
4
- KDropdown(v-model:isOpen="calendarShow" :anchorEl="activatorRef")
4
+ KDropdown(v-model:isOpen="calendarShow" :anchorEl="activatorRef" :teleportTo="teleportTo")
5
5
  KCalendar(view="month" :viewCount="1" :day="calendarDay" :selectedDay="_date" @dayClicked="dateSelected" :definedDays="calendarDefinedDays" :markedDays="calendarMarkedDays")
6
6
  </template>
7
7
 
@@ -23,8 +23,9 @@ const props = defineProps<{
23
23
  calendarDefinedDays: IDefinedDay[]
24
24
  calendarMarkedDays: IMarkedDay[]
25
25
  textboxClicked: () => void
26
- onClear: () => void
26
+ onClear?: () => void
27
27
  dateSelected: (date: Date) => void
28
+ teleportTo?: string
28
29
  }>()
29
30
 
30
31
  const emit = defineEmits<{
@@ -9,8 +9,9 @@ type __VLS_Props = {
9
9
  calendarDefinedDays: IDefinedDay[];
10
10
  calendarMarkedDays: IMarkedDay[];
11
11
  textboxClicked: () => void;
12
- onClear: () => void;
12
+ onClear?: () => void;
13
13
  dateSelected: (date: Date) => void;
14
+ teleportTo?: string;
14
15
  };
15
16
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
16
17
  "update:maskedModel": (value: string) => any;
@@ -12,9 +12,10 @@ type __VLS_Props = {
12
12
  calendarMarkedDays: IMarkedDay[];
13
13
  showClear: boolean;
14
14
  textboxClicked: () => void;
15
- onClear: () => void;
15
+ onClear?: () => void;
16
16
  dateSelected: (date: Date) => void;
17
17
  timeSelected: (time: string) => void;
18
+ teleportTo?: string;
18
19
  };
19
20
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
20
21
  "update:maskedModel": (value: string) => any;
@@ -1,7 +1,7 @@
1
1
  <template lang="pug">
2
2
  .KDateTimePicker(ref="activatorRef" @click.stop="textboxClicked")
3
3
  KMaskTextbox(v-model="maskedModel" :key="maskedModel" :mask="format" :placeholder="format" :showClear="showClear" @clear="onClear")
4
- KDropdown(v-model:isOpen="calendarShow" :anchorEl="activatorRef")
4
+ KDropdown(v-model:isOpen="calendarShow" :anchorEl="activatorRef" :teleportTo="teleportTo")
5
5
  KGrid(direction="row" align="start" :noGap="false" wrap="nowrap").datetime-picker-grid
6
6
  .calendar-section
7
7
  KCalendar(view="month" :viewCount="1" :day="calendarDay" :selectedDay="_date" @dayClicked="dateSelected" :definedDays="calendarDefinedDays" :markedDays="calendarMarkedDays")
@@ -30,9 +30,10 @@ const props = defineProps<{
30
30
  calendarMarkedDays: IMarkedDay[]
31
31
  showClear: boolean
32
32
  textboxClicked: () => void
33
- onClear: () => void
33
+ onClear?: () => void
34
34
  dateSelected: (date: Date) => void
35
35
  timeSelected: (time: string) => void
36
+ teleportTo?: string
36
37
  }>()
37
38
 
38
39
  const emit = defineEmits<{
@@ -12,9 +12,10 @@ type __VLS_Props = {
12
12
  calendarMarkedDays: IMarkedDay[];
13
13
  showClear: boolean;
14
14
  textboxClicked: () => void;
15
- onClear: () => void;
15
+ onClear?: () => void;
16
16
  dateSelected: (date: Date) => void;
17
17
  timeSelected: (time: string) => void;
18
+ teleportTo?: string;
18
19
  };
19
20
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
20
21
  "update:maskedModel": (value: string) => any;
@@ -8,6 +8,8 @@ type __VLS_Props = {
8
8
  width: number;
9
9
  };
10
10
  clickoutside: () => void;
11
+ teleportTarget: string | null;
12
+ isInModal: boolean;
11
13
  };
12
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
15
  declare const _default: typeof __VLS_export;
@@ -1,12 +1,18 @@
1
1
  <template lang="pug">
2
- Teleport(to="body")
3
- .KDropdown(v-if="open" v-click-outside="clickoutside" :style="dialogStyle")
4
- KPanel.KDropdown-container(:class="{'fullWidth': fullWidth}")
5
- slot
2
+ .KDropdown-source
3
+ Teleport(v-if="isMounted && open && teleportTarget" :to="teleportTarget")
4
+ .KDropdown-teleported
5
+ .KDropdown(v-click-outside="clickoutside" :style="dialogStyle" v-bind="$attrs")
6
+ KPanel.KDropdown-container(:class="{'fullWidth': fullWidth}")
7
+ slot
6
8
  </template>
7
9
 
8
10
  <script lang="ts" setup>
9
- import { computed } from 'vue'
11
+ import { computed, ref, onMounted } from 'vue'
12
+
13
+ defineOptions({
14
+ inheritAttrs: false
15
+ })
10
16
 
11
17
  const props = defineProps<{
12
18
  open: boolean
@@ -14,14 +20,21 @@ const props = defineProps<{
14
20
  anchorEl?: HTMLElement
15
21
  dropdownRect: { top: number, left: number, width: number }
16
22
  clickoutside: () => void
23
+ teleportTarget: string | null
24
+ isInModal: boolean
17
25
  }>()
18
26
 
27
+ const isMounted = ref(false)
28
+ onMounted(() => {
29
+ isMounted.value = true
30
+ })
31
+
19
32
  const dialogStyle = computed(() => ({
20
33
  position: 'absolute',
21
34
  top: `${props.dropdownRect.top}px`,
22
35
  left: `${props.dropdownRect.left}px`,
23
36
  width: props.fullWidth ? `${props.dropdownRect.width}px` : 'fit-content',
24
- zIndex: 1000
37
+ zIndex: 2000
25
38
  }))
26
39
  </script>
27
40
 
@@ -8,6 +8,8 @@ type __VLS_Props = {
8
8
  width: number;
9
9
  };
10
10
  clickoutside: () => void;
11
+ teleportTarget: string | null;
12
+ isInModal: boolean;
11
13
  };
12
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
15
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,5 @@
1
1
  type __VLS_Props = {
2
+ modalId: string;
2
3
  opened: boolean;
3
4
  closeModal: () => void;
4
5
  };
@@ -1,5 +1,6 @@
1
1
  <template lang="pug">
2
2
  dialog.k-dialog(ref="dialogRef" @close="closeModal" @click="handleBackdropClick")
3
+ .modal-portal(:id="modalId" style="position: absolute; top: 0; left: 0;")
3
4
  KPanel(no-gap flex-content scrollable).modal-container
4
5
  template(#header)
5
6
  slot(name="header")
@@ -12,6 +13,7 @@ dialog.k-dialog(ref="dialogRef" @close="closeModal" @click="handleBackdropClick"
12
13
  import { ref, watch, onMounted } from 'vue'
13
14
 
14
15
  const props = defineProps<{
16
+ modalId: string
15
17
  opened: boolean
16
18
  closeModal: () => void
17
19
  }>()
@@ -1,4 +1,5 @@
1
1
  type __VLS_Props = {
2
+ modalId: string;
2
3
  opened: boolean;
3
4
  closeModal: () => void;
4
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@katlux/toolkit",
3
- "version": "0.1.0-beta.45",
3
+ "version": "0.1.0-beta.47",
4
4
  "description": "Core UI toolkit and utilities for the Katlux ecosystem",
5
5
  "author": "Katlux",
6
6
  "license": "MIT",