eco-vue-js 0.22.0 → 0.22.1

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 (28) hide show
  1. package/dist/components/BottomSheet/WBottomSheet.vue_vue_type_script_setup_true_lang.js +1 -1
  2. package/dist/components/Button/WButtonDropdown.vue.d.ts +2 -2
  3. package/dist/components/Button/WButtonDropdown.vue.d.ts.map +1 -1
  4. package/dist/components/Button/WButtonDropdown.vue_vue_type_script_setup_true_lang.js +65 -50
  5. package/dist/components/Button/WButtonMore.vue_vue_type_script_setup_true_lang.js +1 -1
  6. package/dist/components/Chart/WChartLinear.vue.d.ts +1 -1
  7. package/dist/components/Chart/WChartLinear.vue.d.ts.map +1 -1
  8. package/dist/components/ClickOutside/WClickOutside.vue.d.ts.map +1 -1
  9. package/dist/components/ClickOutside/WClickOutside.vue_vue_type_script_setup_true_lang.js +10 -1
  10. package/dist/components/Input/WInputSuggest.vue_vue_type_script_setup_true_lang.js +1 -1
  11. package/dist/components/Input/components/InputSuggestEmbedded.vue.d.ts.map +1 -1
  12. package/dist/components/Input/components/InputSuggestEmbedded.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/components/Modal/components/OverlayDropdown.vue.d.ts.map +1 -1
  14. package/dist/components/Modal/components/OverlayDropdown.vue_vue_type_script_setup_true_lang.js +3 -3
  15. package/dist/components/Modal/models/overlayRegistry.d.ts +7 -4
  16. package/dist/components/Modal/models/overlayRegistry.d.ts.map +1 -1
  17. package/dist/components/Modal/models/overlayRegistry.js +66 -14
  18. package/dist/components/Nav/WNavItemExpand.vue_vue_type_script_setup_true_lang.js +1 -1
  19. package/dist/components/Notify/WNotifyCenter.vue.d.ts.map +1 -1
  20. package/dist/components/Notify/WNotifyCenter.vue_vue_type_script_setup_true_lang.js +11 -8
  21. package/dist/components/Uniform/use/useUniformField.d.ts.map +1 -1
  22. package/dist/components/Uniform/use/useUniformField.js +3 -5
  23. package/dist/main.js +6 -6
  24. package/dist/utils/Overlay.d.ts +3 -1
  25. package/dist/utils/Overlay.d.ts.map +1 -1
  26. package/dist/utils/Overlay.js +4 -4
  27. package/docs/llms.txt +1 -1
  28. package/package.json +1 -1
@@ -29,7 +29,7 @@ hide: () => dismissableRef.value?.hide() ?? Promise.resolve() });
29
29
  return openBlock(), createElementBlock(Fragment, null, [renderSlot(_ctx.$slots, "toggle", { unclickable: true }), (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(WDismissable_default, {
30
30
  ref: "dismissable",
31
31
  "is-open": __props.isOpen,
32
- class: normalizeClass(["fixed inset-0", __props.noOverlay ? "pointer-events-none" : "bg-backdrop backdrop-blur"]),
32
+ class: normalizeClass(["fixed inset-0", __props.noOverlay ? "" : "bg-backdrop backdrop-blur"]),
33
33
  "content-class": contentClass.value,
34
34
  style: normalizeStyle({ zIndex: unref(baseZIndex) + unref(100) }),
35
35
  onClose: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("close"))
@@ -1,15 +1,15 @@
1
1
  import { ButtonDropdownProps } from './types';
2
2
  import { VNode } from 'vue';
3
3
  import { HorizontalAlign } from '../../utils/HorizontalAlign';
4
- declare const close: () => void;
5
4
  type __VLS_Slots = {
6
5
  /** Buttons joined to the arrow button. They keep their own click handlers. */
7
6
  button?: () => VNode[];
8
- /** Menu content, usually WButtonMoreItem. A click inside closes the menu, and so does `close`. */
7
+ /** Menu content, usually WButtonMoreItem. A click inside closes the menu, and so does `close`. On phones it is a bottom sheet. */
9
8
  content?: (props: {
10
9
  close: typeof close;
11
10
  }) => VNode[];
12
11
  };
12
+ declare const close: () => void;
13
13
  declare const __VLS_base: import('vue').DefineComponent<ButtonDropdownProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<ButtonDropdownProps> & Readonly<{}>, {
14
14
  horizontalAlign: HorizontalAlign;
15
15
  disabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"WButtonDropdown.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Button/WButtonDropdown.vue"],"names":[],"mappings":"AAmEA;AAyGA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAEhD,OAAO,EAAC,KAAK,KAAK,EAAM,MAAM,KAAK,CAAA;AAQnC,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAA;AAevD,QAAA,MAAM,KAAK,YAEV,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,KAAK,EAAE,CAAA;IACtB,kGAAkG;IAClG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAC,KAAK,EAAE,OAAO,KAAK,CAAA;KAAC,KAAK,KAAK,EAAE,CAAA;CACpD,CAAC;AAsPF,QAAA,MAAM,UAAU;;;6EAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"WButtonDropdown.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Button/WButtonDropdown.vue"],"names":[],"mappings":"AA4CA;AAyHA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,SAAS,CAAA;AAEhD,OAAO,EAAC,KAAK,KAAK,EAAyC,MAAM,KAAK,CAAA;AAMtE,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAA;AAcvD,KAAK,WAAW,GAAG;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,KAAK,EAAE,CAAA;IACtB,kIAAkI;IAClI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAC,KAAK,EAAE,OAAO,KAAK,CAAA;KAAC,KAAK,KAAK,EAAE,CAAA;CACpD,CAAC;AAaF,QAAA,MAAM,KAAK,YAEV,CAAA;AAiLD,QAAA,MAAM,UAAU;;;6EAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import WTooltip_default from "../Tooltip/WTooltip.vue.js";
2
- import WClickOutside_default from "../ClickOutside/WClickOutside.vue.js";
3
2
  import WButton_default from "./WButton.vue.js";
4
- import { HorizontalAlign } from "../../utils/HorizontalAlign.js";
5
- import WDropdownMenu_default from "../DropdownMenu/WDropdownMenu.vue.js";
6
3
  import IconArrow_default from "../../assets/icons/IconArrow.js";
7
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, unref, withCtx } from "vue";
4
+ import { HorizontalAlign } from "../../utils/HorizontalAlign.js";
5
+ import { useOverlay } from "../../utils/Overlay.js";
6
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, markRaw, normalizeClass, openBlock, ref, renderList, resolveDynamicComponent, unref, useSlots, useTemplateRef, withCtx } from "vue";
8
7
  //#region src/components/Button/WButtonDropdown.vue?vue&type=script&setup=true&lang.ts
9
- var _hoisted_1 = { class: "flex" };
8
+ var _hoisted_1 = { ref: "toggle" };
9
+ var _hoisted_2 = { class: "flex" };
10
10
  var WButtonDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
11
11
  __name: "WButtonDropdown",
12
12
  props: {
@@ -20,57 +20,72 @@ var WButtonDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
20
20
  horizontalAlign: { default: HorizontalAlign.LEFT_INNER }
21
21
  },
22
22
  setup(__props) {
23
+ const props = __props;
24
+ const slots = useSlots();
25
+ const toggleRef = useTemplateRef("toggle");
26
+ const overlay = useOverlay();
23
27
  const isOpen = ref(false);
28
+ let closeMenu = null;
24
29
  const close = () => {
25
- isOpen.value = false;
30
+ closeMenu?.();
31
+ };
32
+ const renderContent = markRaw(() => slots.content?.({ close }));
33
+ const open = () => {
34
+ if (!toggleRef.value) return;
35
+ const value = overlay.open({
36
+ present: "dropdown",
37
+ anchor: toggleRef.value,
38
+ content: renderContent,
39
+ dropdown: {
40
+ align: props.horizontalAlign,
41
+ closeOnClick: true
42
+ },
43
+ onClose: () => {
44
+ if (closeMenu !== value) return;
45
+ closeMenu = null;
46
+ isOpen.value = false;
47
+ }
48
+ });
49
+ closeMenu = value;
50
+ isOpen.value = value !== null;
51
+ };
52
+ const toggle = () => {
53
+ if (isOpen.value) close();
54
+ else open();
26
55
  };
27
56
  return (_ctx, _cache) => {
28
- return openBlock(), createBlock(WDropdownMenu_default, {
29
- "is-open": isOpen.value,
30
- "horizontal-align": __props.horizontalAlign,
31
- "update-align": ""
32
- }, {
33
- toggle: withCtx(() => [createElementVNode("div", null, [createElementVNode("div", _hoisted_1, [
34
- __props.leftToggle ? (openBlock(), createBlock(WButton_default, {
35
- key: 0,
36
- "semantic-type": __props.semanticType,
37
- disabled: __props.disabled,
38
- join: "",
39
- onClick: _cache[0] || (_cache[0] = ($event) => isOpen.value = !isOpen.value)
40
- }, {
41
- default: withCtx(() => [createVNode(unref(IconArrow_default), { class: normalizeClass(["square-4 transition-transform", { "rotate-180": isOpen.value }]) }, null, 8, ["class"])]),
42
- _: 1
43
- }, 8, ["semantic-type", "disabled"])) : createCommentVNode("", true),
44
- (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.$slots.button?.(), (item, index) => {
45
- return openBlock(), createBlock(resolveDynamicComponent(item), {
46
- key: index,
47
- join: "",
48
- class: "flex-1"
49
- });
50
- }), 128)),
51
- !__props.leftToggle ? (openBlock(), createBlock(WButton_default, {
52
- key: 1,
53
- "semantic-type": __props.semanticType,
54
- disabled: __props.disabled,
55
- join: "",
56
- onClick: _cache[1] || (_cache[1] = ($event) => isOpen.value = !isOpen.value)
57
- }, {
58
- default: withCtx(() => [createVNode(unref(IconArrow_default), { class: normalizeClass(["square-[1em] transition-transform", { "rotate-180": isOpen.value }]) }, null, 8, ["class"])]),
59
- _: 1
60
- }, 8, ["semantic-type", "disabled"])) : createCommentVNode("", true)
61
- ]), __props.tooltipText ? (openBlock(), createBlock(WTooltip_default, {
57
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
58
+ __props.leftToggle ? (openBlock(), createBlock(WButton_default, {
62
59
  key: 0,
63
- text: __props.tooltipText
64
- }, null, 8, ["text"])) : createCommentVNode("", true)])]),
65
- content: withCtx(() => [createVNode(WClickOutside_default, {
66
- class: "surface-raised my-1 max-h-[inherit] w-full overflow-y-auto overflow-x-hidden overscroll-contain rounded-xl shadow-md border border-solid border-line-raised",
67
- onClick: close
60
+ "semantic-type": __props.semanticType,
61
+ disabled: __props.disabled,
62
+ join: "",
63
+ onClick: toggle
64
+ }, {
65
+ default: withCtx(() => [createVNode(unref(IconArrow_default), { class: normalizeClass(["square-4 transition-transform", { "rotate-180": isOpen.value }]) }, null, 8, ["class"])]),
66
+ _: 1
67
+ }, 8, ["semantic-type", "disabled"])) : createCommentVNode("", true),
68
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.$slots.button?.(), (item, index) => {
69
+ return openBlock(), createBlock(resolveDynamicComponent(item), {
70
+ key: index,
71
+ join: "",
72
+ class: "flex-1"
73
+ });
74
+ }), 128)),
75
+ !__props.leftToggle ? (openBlock(), createBlock(WButton_default, {
76
+ key: 1,
77
+ "semantic-type": __props.semanticType,
78
+ disabled: __props.disabled,
79
+ join: "",
80
+ onClick: toggle
68
81
  }, {
69
- default: withCtx(() => [renderSlot(_ctx.$slots, "content", { close })]),
70
- _: 3
71
- })]),
72
- _: 3
73
- }, 8, ["is-open", "horizontal-align"]);
82
+ default: withCtx(() => [createVNode(unref(IconArrow_default), { class: normalizeClass(["square-[1em] transition-transform", { "rotate-180": isOpen.value }]) }, null, 8, ["class"])]),
83
+ _: 1
84
+ }, 8, ["semantic-type", "disabled"])) : createCommentVNode("", true)
85
+ ]), __props.tooltipText ? (openBlock(), createBlock(WTooltip_default, {
86
+ key: 0,
87
+ text: __props.tooltipText
88
+ }, null, 8, ["text"])) : createCommentVNode("", true)], 512);
74
89
  };
75
90
  }
76
91
  });
@@ -1,6 +1,6 @@
1
- import IconMore_default from "../../assets/icons/IconMore.js";
2
1
  import { hasAnchorLayer } from "../Modal/models/overlayRegistry.js";
3
2
  import { useOverlay } from "../../utils/Overlay.js";
3
+ import IconMore_default from "../../assets/icons/IconMore.js";
4
4
  import { computed, createBlock, createElementBlock, createElementVNode, defineComponent, markRaw, mergeProps, normalizeClass, openBlock, ref, resolveDynamicComponent, shallowRef, unref, useSlots, useTemplateRef } from "vue";
5
5
  //#region src/components/Button/WButtonMore.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = [
@@ -38,8 +38,8 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
38
38
  skeleton: boolean;
39
39
  left: number;
40
40
  right: number;
41
- height: number;
42
41
  yDomainGetter: (extent: [number, number]) => [number, number];
42
+ height: number;
43
43
  yFormat: (value: number) => string;
44
44
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
45
45
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1 +1 @@
1
- {"version":3,"file":"WChartLinear.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/WChartLinear.vue"],"names":[],"mappings":"AAsDA;AA8LA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,SAAS,CAAA;AAEzC,OAAO,EAAC,KAAK,KAAK,EAAmE,MAAM,KAAK,CAAA;AAShG,KAAK,WAAW,GAAG;IACf,0GAA0G;IAC1G,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB,8IAA8I;IAC9I,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9D,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8GAA8G;IAC9G,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA8FJ,KAAK,WAAW,GAAG;IACjB,6IAA6I;IAC7I,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,KAAK,EAAE,CAAA;CAC1C,CAAC;AAgIF,QAAA,MAAM,UAAU;;;SA1ON,MAAM;YAEH,MAAM;cAMJ,OAAO;UAJX,MAAM;WAEL,MAAM;YAhBL,MAAM;mBAFC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;aAUpD,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;6EAgPrC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"WChartLinear.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Chart/WChartLinear.vue"],"names":[],"mappings":"AAsDA;AA8LA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,SAAS,CAAA;AAEzC,OAAO,EAAC,KAAK,KAAK,EAAmE,MAAM,KAAK,CAAA;AAShG,KAAK,WAAW,GAAG;IACf,0GAA0G;IAC1G,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB,8IAA8I;IAC9I,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9D,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8GAA8G;IAC9G,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA8FJ,KAAK,WAAW,GAAG;IACjB,6IAA6I;IAC7I,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,KAAK,EAAE,CAAA;CAC1C,CAAC;AAgIF,QAAA,MAAM,UAAU;;;SA1ON,MAAM;YAEH,MAAM;cAMJ,OAAO;UAJX,MAAM;WAEL,MAAM;mBAlBE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;YAErD,MAAM;aAQL,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;6EAgPrC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"WClickOutside.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/ClickOutside/WClickOutside.vue"],"names":[],"mappings":"AAUA;AAkFA,KAAK,WAAW,GAAG;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AAeF,KAAK,WAAW,GAAG;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAC;AAoFF,QAAA,MAAM,UAAU;;;;;;;;;;kFAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"WClickOutside.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/ClickOutside/WClickOutside.vue"],"names":[],"mappings":"AAUA;AAiGA,KAAK,WAAW,GAAG;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AAeF,KAAK,WAAW,GAAG;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAC;AAmGF,QAAA,MAAM,UAAU;;;;;;;;;;kFAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -15,9 +15,16 @@ var WClickOutside_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
15
15
  const emit = __emit;
16
16
  const elementRef = useTemplateRef("element");
17
17
  const isOnDisabled = (event) => event.target instanceof Element && event.target.closest(":disabled") !== null;
18
+ const isInside = (event) => !!elementRef.value && event.composedPath().includes(elementRef.value);
19
+ let isPressedInside = false;
20
+ const pointerdownListener = (event) => {
21
+ isPressedInside = isInside(event);
22
+ };
18
23
  const emitOutside = (event) => {
24
+ const wasPressedInside = isPressedInside;
25
+ if (event.type !== "pointerup") isPressedInside = false;
19
26
  if (!props.noFilter) {
20
- if (!elementRef.value || event.composedPath().includes(elementRef.value)) return;
27
+ if (!elementRef.value || wasPressedInside || isInside(event)) return;
21
28
  }
22
29
  emit("click", event);
23
30
  };
@@ -30,6 +37,7 @@ var WClickOutside_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
30
37
  onMounted(() => {
31
38
  if (!getIsClientSide()) return;
32
39
  setTimeout(() => {
40
+ document.addEventListener("pointerdown", pointerdownListener, true);
33
41
  document.addEventListener("click", clickListener);
34
42
  document.addEventListener("contextmenu", clickListener);
35
43
  document.addEventListener("pointerup", pointerListener);
@@ -37,6 +45,7 @@ var WClickOutside_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
37
45
  });
38
46
  onBeforeUnmount(() => {
39
47
  if (!getIsClientSide()) return;
48
+ document.removeEventListener("pointerdown", pointerdownListener, true);
40
49
  document.removeEventListener("click", clickListener);
41
50
  document.removeEventListener("contextmenu", clickListener);
42
51
  document.removeEventListener("pointerup", pointerListener);
@@ -1,7 +1,7 @@
1
1
  import { useIsMobile } from "../../utils/mobile.js";
2
2
  import { useComponentStates } from "../../utils/useComponentStates.js";
3
- import { HorizontalAlign } from "../../utils/HorizontalAlign.js";
4
3
  import IconArrow_default from "../../assets/icons/IconArrow.js";
4
+ import { HorizontalAlign } from "../../utils/HorizontalAlign.js";
5
5
  import WDropdownAdaptive_default from "../DropdownMenu/WDropdownAdaptive.vue.js";
6
6
  import InputActionsButton_default from "./components/InputActionsButton.vue.js";
7
7
  import WInput_default from "./WInput.vue.js";
@@ -1 +1 @@
1
- {"version":3,"file":"InputSuggestEmbedded.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/Input/components/InputSuggestEmbedded.vue"],"names":[],"mappings":"AAaA;AAiDA,QAAA,IAAI,OAAO;;;CAAU,EAAE,OAAO,IAAW,CAAE;AAC3C,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,GAC3C;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAC/C,QAAA,MAAM,UAAU,+QACd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"InputSuggestEmbedded.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/Input/components/InputSuggestEmbedded.vue"],"names":[],"mappings":"AAaA;AAkDA,QAAA,IAAI,OAAO;;;CAAU,EAAE,OAAO,IAAW,CAAE;AAC3C,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,GAC3C;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAC/C,QAAA,MAAM,UAAU,+QACd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import OverlayRegionPart_default from "../../Modal/components/OverlayRegionPart.vue.js";
2
2
  import { Fragment, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, normalizeProps, openBlock, renderSlot, withCtx } from "vue";
3
3
  //#region src/components/Input/components/InputSuggestEmbedded.vue?vue&type=script&setup=true&lang.ts
4
- var _hoisted_1 = { class: "w-frame-bleed" };
4
+ var _hoisted_1 = { class: "w-frame-bleed [&_.w-select-option]:px-(--w-frame-padding)" };
5
5
  var InputSuggestEmbedded_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  __name: "InputSuggestEmbedded",
7
7
  setup(__props) {
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayDropdown.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/components/OverlayDropdown.vue"],"names":[],"mappings":"AAoKA;AAAA,OA0QO,KAAK,EAAC,aAAa,EAAE,sBAAsB,EAAC,MAAM,iBAAiB,CAAA;AAU1E,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAA;AAUvD,KAAK,WAAW,GAAG,sBAAsB,GAAG;IACxC,MAAM,EAAE,aAAa,CAAA;IACrB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kGAAkG;IAClG,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAC;AAsdJ,QAAA,IAAuB,QAAQ,IAAW,EAAuB,QAAQ,IAAY,CAAE;AACvF,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GAC7C;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAShD,QAAA,MAAM,UAAU;;;;;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"OverlayDropdown.vue.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/components/OverlayDropdown.vue"],"names":[],"mappings":"AAoKA;AAAA,OA0QO,KAAK,EAAC,aAAa,EAAE,sBAAsB,EAAC,MAAM,iBAAiB,CAAA;AAU1E,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAA;AAUvD,KAAK,WAAW,GAAG,sBAAsB,GAAG;IACxC,MAAM,EAAE,aAAa,CAAA;IACrB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kGAAkG;IAClG,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAC;AAwdJ,QAAA,IAAuB,QAAQ,IAAW,EAAuB,QAAQ,IAAY,CAAE;AACvF,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,GAC7C;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAShD,QAAA,MAAM,UAAU;;;;;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -3,8 +3,8 @@ import { getIsMobile } from "../../../utils/mobile.js";
3
3
  import WClickOutside_default from "../../ClickOutside/WClickOutside.vue.js";
4
4
  import WBottomSheet_default from "../../BottomSheet/WBottomSheet.vue.js";
5
5
  import { HorizontalAlign } from "../../../utils/HorizontalAlign.js";
6
- import WDropdown_default from "../../Dropdown/WDropdown.vue.js";
7
6
  import { LAYER_ATTRIBUTE, isInLayerWithin, wOverlayFrame, wOverlayLayer } from "../models/overlayRegistry.js";
7
+ import WDropdown_default from "../../Dropdown/WDropdown.vue.js";
8
8
  import WDropdownTip_default from "../../Dropdown/WDropdownTip.vue.js";
9
9
  import WInfiniteListScrollingElement_default from "../../InfiniteList/WInfiniteListScrollingElement.vue.js";
10
10
  import OverlayRegion_default from "./OverlayRegion.vue.js";
@@ -143,7 +143,7 @@ var OverlayDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
143
143
  "no-filter": __props.closeOnClick,
144
144
  class: normalizeClass([[
145
145
  __props.frameClass ?? "w-dropdown-frame",
146
- unref(regions).title.length ? [unref(options)?.fitContent ? "w-max min-w-48 max-w-[min(24rem,calc(100vw-2rem))]" : "w-[min(24rem,calc(100vw-2rem))]", "max-h-112"] : void 0,
146
+ unref(regions).title.length ? [unref(options)?.fitContent ? "w-max min-w-[min(18rem,calc(100vw-2rem))] max-w-[min(24rem,calc(100vw-2rem))]" : "w-[min(24rem,calc(100vw-2rem))]", "max-h-112"] : void 0,
147
147
  hasTip.value ? isBeside.value ? "w-tooltip-center-y" : "w-tooltip-center-x" : void 0,
148
148
  __props.cornered && __props.frameClass === void 0 && {
149
149
  "rounded-bl-none": isRight && isTop,
@@ -167,7 +167,7 @@ var OverlayDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
167
167
  key: 2,
168
168
  class: normalizeClass(["px-(--w-frame-padding) pb-4", { "pt-(--w-frame-padding)": !unref(regions).title.length && !unref(regions).subtitle.length }])
169
169
  }, [createVNode(OverlayRegion_default, { parts: unref(regions).header }, null, 8, ["parts"])], 2)) : createCommentVNode("", true),
170
- createVNode(WInfiniteListScrollingElement_default, { class: normalizeClass(["min-h-0 flex-1 overflow-auto overscroll-contain", unref(options)?.padded ? ["px-(--w-frame-padding)", {
170
+ createVNode(WInfiniteListScrollingElement_default, { class: normalizeClass(["flex min-h-0 flex-1 flex-col overflow-auto overscroll-contain", unref(options)?.padded ? ["px-(--w-frame-padding)", {
171
171
  "pt-(--w-frame-padding)": !hasTop.value,
172
172
  "pb-(--w-frame-padding)": !unref(regions).actions.length
173
173
  }] : "[--w-frame-padding:0px]"]) }, {
@@ -59,7 +59,7 @@ export type OverlayFrameOptions = {
59
59
  maximized?: boolean;
60
60
  /** Stacks the buttons vertically on every screen size. */
61
61
  actionsCol?: boolean;
62
- /** A dropdown with a title sizes to the content, up to the width it keeps otherwise, such as a filter's list of options. */
62
+ /** A dropdown with a title sizes to the content, from 18rem up to the width it keeps otherwise (24rem), such as a filter's list of options. */
63
63
  fitContent?: boolean;
64
64
  };
65
65
  /**
@@ -88,14 +88,17 @@ export declare const isLayerWithin: (id: number, ancestor: number) => boolean;
88
88
  export declare const LAYER_ATTRIBUTE = "data-w-layer";
89
89
  /** Whether an event's path goes through a layer opened from `ancestor`, such as a click in a select's menu inside a filter. */
90
90
  export declare const isInLayerWithin: (path: EventTarget[], ancestor: number) => boolean;
91
- /** Whether opening from `parent` hands off, taking the place of the menu it is opened from. */
92
- export declare const isHandoff: (parent: number | null) => boolean;
91
+ /** Whether opening from `parent` hands off, taking the place of the menu it is opened from, or of any dropdown with `replace`. */
92
+ export declare const isHandoff: (parent: number | null, replace?: boolean) => boolean;
93
93
  /** The anchor a layer opened from `parent` takes over, so a layer opened from a menu sticks to the menu's anchor. */
94
94
  export declare const getHandoffAnchor: (parent: number | null) => OverlayAnchor | undefined;
95
95
  /**
96
- * Opens a layer. Opened from a menu — a dropdown with `closeOnClick` — it takes the menu's place: the menu closes,
96
+ * Opens a layer. Opened from a menu — a dropdown with `closeOnClick` — or from any dropdown with `replace`, it takes its place: the menu closes,
97
97
  * and the new layer belongs to the menu's parent. A dropdown also inherits the menu's anchor, so it stays where the menu was,
98
98
  * and the menu's opener still sees it with `hasAnchorLayer`. Opened from any other dropdown, such as a filter, it stays over it.
99
+ * With `replace`, it also carries on the `onClose` of the dropdown it replaces, so that dropdown's opener sees one overlay until the last of them closes.
100
+ *
101
+ * Async content shows once it has loaded, and what it takes the place of stays until then, so the frame never shows empty.
99
102
  *
100
103
  * Returns `null` when nothing opened: without the host, or when `toggle` closed a layer instead.
101
104
  */
@@ -1 +1 @@
1
- {"version":3,"file":"overlayRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/models/overlayRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlayRegistry.d.ts","sourceRoot":"","sources":["../../../../../src/components/Modal/models/overlayRegistry.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@ var setOverlayHost = (value) => {
23
23
  isHosted = value;
24
24
  };
25
25
  var layers = shallowRef([]);
26
+ /** Layers with async content that is still loading, shown once it has. */
27
+ var pendingLayers = shallowReactive(/* @__PURE__ */ new Map());
26
28
  /** Open layers, bottom to top, for the host to render. */
27
29
  var useOverlayLayers = () => layers;
28
30
  var nextId = 0;
@@ -33,6 +35,12 @@ var findLayer = (id) => {
33
35
  * Closes the layer and everything opened from it, the top-most first.
34
36
  */
35
37
  var closeLayer = (id) => {
38
+ const pending = pendingLayers.get(id);
39
+ if (pending) {
40
+ pendingLayers.delete(id);
41
+ pending.onClose?.();
42
+ return;
43
+ }
36
44
  const entry = findLayer(id);
37
45
  if (!entry) return;
38
46
  layers.value.filter((item) => item.parent === id).reverse().forEach((item) => closeLayer(item.id));
@@ -55,19 +63,30 @@ var isInLayerWithin = (path, ancestor) => {
55
63
  return id !== null && isLayerWithin(Number(id), ancestor);
56
64
  });
57
65
  };
58
- /** The menu opening from `parent` hands off from: a dropdown with `closeOnClick` closes on the click that opens something from it, taking the clicked item with it. */
59
- var findHandoff = (parent) => {
66
+ /**
67
+ * The menu opening from `parent` hands off from: a dropdown with `closeOnClick` closes on the click that opens something from it, taking the clicked item with it.
68
+ * With `replace`, any dropdown hands off the same way.
69
+ */
70
+ var findHandoff = (parent, replace) => {
60
71
  const entry = findLayer(parent);
61
- return entry?.present === "dropdown" && entry.dropdown.closeOnClick ? entry : void 0;
72
+ return entry?.present === "dropdown" && (replace || entry.dropdown.closeOnClick) ? entry : void 0;
62
73
  };
63
- /** Whether opening from `parent` hands off, taking the place of the menu it is opened from. */
64
- var isHandoff = (parent) => findHandoff(parent) !== void 0;
74
+ /** Whether opening from `parent` hands off, taking the place of the menu it is opened from, or of any dropdown with `replace`. */
75
+ var isHandoff = (parent, replace) => findHandoff(parent, replace) !== void 0;
65
76
  /** The anchor a layer opened from `parent` takes over, so a layer opened from a menu sticks to the menu's anchor. */
66
77
  var getHandoffAnchor = (parent) => findHandoff(parent)?.anchor;
78
+ /** The loader of an async component that has not loaded yet, such as one made with `defineAsyncComponent` in `<script setup>`, which is made anew for each instance. Internal to Vue, but stable. */
79
+ var getAsyncLoader = (content) => {
80
+ const value = content;
81
+ return value.__asyncLoader && !value.__asyncResolved ? value.__asyncLoader : void 0;
82
+ };
67
83
  /**
68
- * Opens a layer. Opened from a menu — a dropdown with `closeOnClick` — it takes the menu's place: the menu closes,
84
+ * Opens a layer. Opened from a menu — a dropdown with `closeOnClick` — or from any dropdown with `replace`, it takes its place: the menu closes,
69
85
  * and the new layer belongs to the menu's parent. A dropdown also inherits the menu's anchor, so it stays where the menu was,
70
86
  * and the menu's opener still sees it with `hasAnchorLayer`. Opened from any other dropdown, such as a filter, it stays over it.
87
+ * With `replace`, it also carries on the `onClose` of the dropdown it replaces, so that dropdown's opener sees one overlay until the last of them closes.
88
+ *
89
+ * Async content shows once it has loaded, and what it takes the place of stays until then, so the frame never shows empty.
71
90
  *
72
91
  * Returns `null` when nothing opened: without the host, or when `toggle` closed a layer instead.
73
92
  */
@@ -76,16 +95,16 @@ var openLayer = (options) => {
76
95
  const isDropdown = options.present === "dropdown";
77
96
  let parent = findLayer(options.parent ?? null) ? options.parent ?? null : null;
78
97
  let anchor = options.anchor;
79
- const handoff = findHandoff(parent);
98
+ const handoff = findHandoff(parent, options.replace);
80
99
  if (handoff) {
81
100
  parent = handoff.parent;
82
101
  if (isDropdown) anchor = handoff.anchor ?? anchor;
83
- closeLayer(handoff.id);
84
102
  }
85
- if (isDropdown) {
86
- const siblings = layers.value.filter((item) => item.present === "dropdown" && item.parent === parent);
87
- siblings.reverse().forEach((item) => closeLayer(item.id));
88
- if (options.toggle && anchor && siblings.some((item) => item.anchor === anchor)) return null;
103
+ const getSiblings = () => isDropdown ? layers.value.filter((item) => item.present === "dropdown" && item.parent === parent && item !== handoff) : [];
104
+ if (options.toggle && anchor && getSiblings().some((item) => item.anchor === anchor)) {
105
+ if (handoff) closeLayer(handoff.id);
106
+ getSiblings().reverse().forEach((item) => closeLayer(item.id));
107
+ return null;
89
108
  }
90
109
  const entry = {
91
110
  id: nextId++,
@@ -99,7 +118,40 @@ var openLayer = (options) => {
99
118
  autoclose: options.autoclose ?? false,
100
119
  onClose: options.onClose
101
120
  };
102
- layers.value = [...layers.value, entry];
121
+ const cancel = () => {
122
+ pendingLayers.delete(entry.id);
123
+ entry.onClose?.();
124
+ };
125
+ const show = () => {
126
+ if (parent !== null && !findLayer(parent)) return cancel();
127
+ if (handoff && !handoff.dropdown.closeOnClick && !findLayer(handoff.id)) return cancel();
128
+ if (handoff && findLayer(handoff.id)) {
129
+ if (!handoff.dropdown.closeOnClick) {
130
+ const onClose = entry.onClose;
131
+ const onCloseReplaced = handoff.onClose;
132
+ handoff.onClose = void 0;
133
+ entry.onClose = () => {
134
+ onClose?.();
135
+ onCloseReplaced?.();
136
+ };
137
+ }
138
+ closeLayer(handoff.id);
139
+ }
140
+ getSiblings().reverse().forEach((item) => closeLayer(item.id));
141
+ pendingLayers.delete(entry.id);
142
+ layers.value = [...layers.value, entry];
143
+ };
144
+ const loader = getAsyncLoader(options.content);
145
+ if (!loader) {
146
+ show();
147
+ return entry;
148
+ }
149
+ pendingLayers.set(entry.id, entry);
150
+ loader().then(() => {
151
+ if (pendingLayers.has(entry.id)) show();
152
+ }, () => {
153
+ if (pendingLayers.has(entry.id)) cancel();
154
+ });
103
155
  return entry;
104
156
  };
105
157
  /** Closes the layers opened from the given one. Returns whether there were any. */
@@ -109,7 +161,7 @@ var closeChildLayers = (id) => {
109
161
  return children.length > 0;
110
162
  };
111
163
  /** Whether a layer is open at the anchor — a menu, or a confirm it handed off to. */
112
- var hasAnchorLayer = (anchor) => layers.value.some((item) => item.anchor === anchor);
164
+ var hasAnchorLayer = (anchor) => layers.value.some((item) => item.anchor === anchor) || [...pendingLayers.values()].some((item) => item.anchor === anchor);
113
165
  /** A flag of a layer that several components inside set on their own, such as two forms: it is on while any of them sets it. */
114
166
  var createLayerFlag = () => {
115
167
  const sources = shallowReactive(/* @__PURE__ */ new Map());
@@ -1,9 +1,9 @@
1
1
  import { unwrapSlots } from "../../utils/utils.js";
2
2
  import { useIsMobile } from "../../utils/mobile.js";
3
3
  import WClickOutside_default from "../ClickOutside/WClickOutside.vue.js";
4
+ import IconArrow_default from "../../assets/icons/IconArrow.js";
4
5
  import { HorizontalAlign } from "../../utils/HorizontalAlign.js";
5
6
  import WDropdownMenu_default from "../DropdownMenu/WDropdownMenu.vue.js";
6
- import IconArrow_default from "../../assets/icons/IconArrow.js";
7
7
  import WExpansion_default from "../Expansion/WExpansion.vue.js";
8
8
  import WNavItem_default from "./WNavItem.vue.js";
9
9
  import WNavItemTransition_default from "./WNavItemTransition.vue.js";
@@ -1 +1 @@
1
- {"version":3,"file":"WNotifyCenter.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Notify/WNotifyCenter.vue"],"names":[],"mappings":"AA6GA;AAiJA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAA;AAuB9C,KAAK,WAAW,GAAG;IACjB,wHAAwH;IACxH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,CAAC;AAkSF,QAAA,MAAM,UAAU,8SAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"WNotifyCenter.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/Notify/WNotifyCenter.vue"],"names":[],"mappings":"AAoHA;AAwJA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAA;AAuB9C,KAAK,WAAW,GAAG;IACjB,wHAAwH;IACxH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,CAAC;AA+SF,QAAA,MAAM,UAAU,8SAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -22,10 +22,6 @@ var _hoisted_6 = {
22
22
  class: "text-description pt-2 pb-1 text-xs font-semibold uppercase"
23
23
  };
24
24
  var _hoisted_7 = { class: "min-h-0" };
25
- var _hoisted_8 = {
26
- key: 2,
27
- class: "border-line-subtle border-t border-solid sticky bottom-0 bg-surface"
28
- };
29
25
  var WNotifyCenter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
30
26
  __name: "WNotifyCenter",
31
27
  props: {
@@ -41,9 +37,10 @@ var WNotifyCenter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
41
37
  return (_ctx, _cache) => {
42
38
  return openBlock(), createElementBlock("div", {
43
39
  class: normalizeClass([{
44
- "bg-surface border-line-subtle grid max-h-[min(40rem,calc(100vh-2rem))] w-[min(28rem,calc(100vw-var(--inner-margin,1fr)*2))] grid-rows-[auto_1fr_auto] overflow-hidden rounded-2xl border border-solid": unref(frame) === null,
40
+ "bg-surface border-line-subtle max-h-[min(40rem,calc(100vh-2rem))] w-[min(28rem,calc(100vw-var(--inner-margin,1fr)*2))] grid-rows-[auto_1fr_auto] overflow-hidden rounded-2xl border border-solid": unref(frame) === null,
41
+ "flex-1": unref(frame) === "dropdown",
45
42
  "pb-[50vh]": unref(frame) === "sheet"
46
- }, "grid grid-rows-[1fr_auto] h-full"]),
43
+ }, "grid"]),
47
44
  role: "region",
48
45
  "aria-label": __props.title ?? "Notifications"
49
46
  }, [
@@ -61,7 +58,7 @@ var WNotifyCenter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
61
58
  }),
62
59
  !unref(notifyCenterItems).length ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(__props.emptyText ?? "No notifications yet"), 1)) : (openBlock(), createElementBlock("div", {
63
60
  key: 1,
64
- class: normalizeClass(["grid content-start", unref(frame) === null ? "overflow-y-auto overscroll-contain px-4 py-3" : "pb-2"])
61
+ class: normalizeClass(["grid content-start", unref(frame) === null ? "overflow-y-auto overscroll-contain px-4 py-3" : "pt-1"])
65
62
  }, [
66
63
  unref(notifyCenterActionItems).length ? (openBlock(), createElementBlock("div", _hoisted_4, toDisplayString(__props.actionText ?? "Action required"), 1)) : createCommentVNode("", true),
67
64
  createVNode(TransitionGroup, {
@@ -104,7 +101,13 @@ var WNotifyCenter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
104
101
  _: 1
105
102
  })
106
103
  ], 2)),
107
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_8, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
104
+ _ctx.$slots.footer ? (openBlock(), createBlock(OverlayRegionPart_default, {
105
+ key: 2,
106
+ region: "actions"
107
+ }, {
108
+ default: withCtx(() => [createElementVNode("div", { class: normalizeClass(["min-w-0 flex-1", { "border-line-subtle border-t border-solid px-4 py-3": unref(frame) === null }]) }, [renderSlot(_ctx.$slots, "footer")], 2)]),
109
+ _: 3
110
+ })) : createCommentVNode("", true)
108
111
  ], 10, _hoisted_1);
109
112
  };
110
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useUniformField.d.ts","sourceRoot":"","sources":["../../../../../src/components/Uniform/use/useUniformField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,eAAe,EAAC,MAAM,UAAU,CAAA;AAEhE,OAAO,EAAC,KAAK,GAAG,EAA0B,MAAM,KAAK,CAAA;AAQrD,KAAK,cAAc,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAA;AAEjE,eAAO,MAAM,eAAe,GAAI,KAAK,EACnC,YAAY,GAAG,CAAC,KAAK,CAAC,EACtB,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAC1B,aAAa,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EACvD,aAAa,MAAM,MAAM,GAAG,SAAS,EACrC,UAAU,GAAG,CAAC,OAAO,CAAC,EACtB,WAAW,GAAG,CAAC,OAAO,CAAC,EACvB,cAAc,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,EACzE,WAAW,OAAO;yBAQU,iBAAiB,CAAC,OAAO,CAAC;;;;;;sCA6Db,KAAK,KAAG,IAAI;;2BA6BvB,iBAAiB,KAAG,IAAI;gCAYrB,iBAAiB,GAAG,SAAS;2BAK3B,MAAM,gBAAgB,OAAO;6BAIhC,MAAM,KAAG,OAAO;CAmBjD,CAAA"}
1
+ {"version":3,"file":"useUniformField.d.ts","sourceRoot":"","sources":["../../../../../src/components/Uniform/use/useUniformField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,eAAe,EAAC,MAAM,UAAU,CAAA;AAEhE,OAAO,EAAC,KAAK,GAAG,EAA0B,MAAM,KAAK,CAAA;AAQrD,KAAK,cAAc,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAA;AAEjE,eAAO,MAAM,eAAe,GAAI,KAAK,EACnC,YAAY,GAAG,CAAC,KAAK,CAAC,EACtB,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAC1B,aAAa,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EACvD,aAAa,MAAM,MAAM,GAAG,SAAS,EACrC,UAAU,GAAG,CAAC,OAAO,CAAC,EACtB,WAAW,GAAG,CAAC,OAAO,CAAC,EACvB,cAAc,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,EACzE,WAAW,OAAO;yBAQU,iBAAiB,CAAC,OAAO,CAAC;;;;;;sCA2Db,KAAK,KAAG,IAAI;;2BA6BvB,iBAAiB,KAAG,IAAI;gCAYrB,iBAAiB,GAAG,SAAS;2BAK3B,MAAM,gBAAgB,OAAO;6BAIhC,MAAM,KAAG,OAAO;CAmBjD,CAAA"}
@@ -1,4 +1,4 @@
1
- import { isEqualArrObj } from "../../../utils/utils.js";
1
+ import { isEqualArrObj, isEqualObj } from "../../../utils/utils.js";
2
2
  import { useFieldMessage } from "../../FieldWrapper/use/useFieldSaved.js";
3
3
  import { validateRequired } from "../../../utils/validate.js";
4
4
  import { scrollToValidator } from "../utils/utils.js";
@@ -28,10 +28,8 @@ var useUniformField = (modelValue, modelValueInit, fieldGetter, titleGetter, req
28
28
  const newValue = modelValue.value;
29
29
  if (newValue instanceof Date && oldValue instanceof Date) return newValue.getTime() !== oldValue.getTime();
30
30
  else if (Array.isArray(newValue) && Array.isArray(oldValue)) return newValue.length !== oldValue.length || !isEqualArrObj(newValue, oldValue);
31
- else if (newValue instanceof Object && oldValue instanceof Object) {
32
- const keys = Object.keys(newValue);
33
- return keys.length !== Object.keys(oldValue).length || keys.some((key) => newValue[key] !== oldValue[key]);
34
- } else return modelValue.value !== modelValueInit.value;
31
+ else if (newValue instanceof Object && oldValue instanceof Object) return !isEqualObj(newValue, oldValue);
32
+ else return modelValue.value !== modelValueInit.value;
35
33
  });
36
34
  const isValid = computed(() => errorMessage.value.length === 0);
37
35
  const scrollTo = () => {
package/dist/main.js CHANGED
@@ -31,19 +31,15 @@ import { addNotify, closeNotifyCenter, isNotifyCenterOpen, isNotifyPending, noti
31
31
  import { Notify, initNotify } from "./utils/Notify.js";
32
32
  import { checkPermissionPaste, doCopy, useCopy } from "./utils/useCopy.js";
33
33
  import WButtonCopy_default from "./components/Button/WButtonCopy.vue.js";
34
- import { supportsPassive } from "./utils/supportsPassive.js";
35
- import { DOMListenerContainer } from "./utils/DOMListenerContainer.js";
36
- import { HorizontalAlign } from "./utils/HorizontalAlign.js";
37
- import WDropdown_default from "./components/Dropdown/WDropdown.vue.js";
38
- import WDropdownMenu_default from "./components/DropdownMenu/WDropdownMenu.vue.js";
39
34
  import IconArrow_default from "./assets/icons/IconArrow.js";
35
+ import { HorizontalAlign } from "./utils/HorizontalAlign.js";
36
+ import { createPointAnchor, useLayerBusy, useLayerChanges, useOverlay, useOverlayClose, useOverlayFrame, useOverlayFrameOptions } from "./utils/Overlay.js";
40
37
  import WButtonDropdown_default from "./components/Button/WButtonDropdown.vue.js";
41
38
  import { ApiError, ApiErrorCancel, createUseQueryParams, encodeQueryParam, encodeQueryParams, encodeRouteParams, handleApiError, isRequestResponse } from "./utils/api.js";
42
39
  import WFieldWrapper_default from "./components/FieldWrapper/WFieldWrapper.vue.js";
43
40
  import WButtonGroup_default from "./components/Button/WButtonGroup.vue.js";
44
41
  import WButtonInput_default from "./components/Button/WButtonInput.vue.js";
45
42
  import IconMore_default from "./assets/icons/IconMore.js";
46
- import { createPointAnchor, useLayerBusy, useLayerChanges, useOverlay, useOverlayClose, useOverlayFrame, useOverlayFrameOptions } from "./utils/Overlay.js";
47
43
  import WButtonMore_default from "./components/Button/WButtonMore.vue.js";
48
44
  import IconCheck_default from "./assets/icons/IconCheck.js";
49
45
  import WMenuItem_default from "./components/MenuItem/WMenuItem.vue.js";
@@ -73,7 +69,11 @@ import WChip_default from "./components/Chip/WChip.vue.js";
73
69
  import WDatePicker_default from "./components/DatePicker/WDatePicker.vue.js";
74
70
  import WDatePickerSingle_default from "./components/DatePicker/WDatePickerSingle.vue.js";
75
71
  import WDragContainer_default from "./components/DragContainer/WDragContainer.vue.js";
72
+ import { supportsPassive } from "./utils/supportsPassive.js";
73
+ import { DOMListenerContainer } from "./utils/DOMListenerContainer.js";
74
+ import WDropdown_default from "./components/Dropdown/WDropdown.vue.js";
76
75
  import WDropdownTip_default from "./components/Dropdown/WDropdownTip.vue.js";
76
+ import WDropdownMenu_default from "./components/DropdownMenu/WDropdownMenu.vue.js";
77
77
  import WExpansion_default from "./components/Expansion/WExpansion.vue.js";
78
78
  import WExpansionItem_default from "./components/Expansion/WExpansionItem.vue.js";
79
79
  import { isDragging, preventDragFile } from "./utils/preventDragFile.js";
@@ -40,6 +40,8 @@ type OverlayContentOptions = {
40
40
  props?: object;
41
41
  /** Runs once the layer is closed — by its close function, its content, the user, a sibling taking its place, or the layer it was opened from closing. */
42
42
  onClose?: () => void;
43
+ /** Takes the place of the dropdown it is opened from, as from a menu, such as the next step of a small form. A dropdown sticks to that dropdown's anchor, and that dropdown's `onClose` runs once this one closes, so its opener stays marked. */
44
+ replace?: boolean;
43
45
  };
44
46
  export type OverlayOpenOptions = OverlayContentOptions & ({
45
47
  present: 'modal';
@@ -61,7 +63,7 @@ export type OverlayOpenOptions = OverlayContentOptions & ({
61
63
  * - From a modal, it closes together with the modal.
62
64
  * - From a menu — a dropdown with `closeOnClick`, such as WButtonMore — it takes the menu's place, since the menu closes on the click.
63
65
  * A dropdown, such as a confirm, sticks to the menu's anchor and keeps the menu's row marked.
64
- * - From any other dropdown, such as a filter, it stays over it, like the menu of a select inside.
66
+ * - From any other dropdown, such as a filter, it stays over it, like the menu of a select inside — or takes its place the same way with `replace`.
65
67
  *
66
68
  * A dropdown closes when the component unmounts, unless it took a menu's place. A modal stays.
67
69
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Overlay.d.ts","sourceRoot":"","sources":["../../../src/utils/Overlay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Overlay.d.ts","sourceRoot":"","sources":["../../../src/utils/Overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AAC3C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAC,KAAK,SAAS,EAAoD,MAAM,KAAK,CAAA;AAErF,OAAO,EAEL,KAAK,mBAAmB,EAczB,MAAM,2CAA2C,CAAA;AAElD,YAAY,EAAC,mBAAmB,EAAC,CAAA;AAEjC,2GAA2G;AAC3G,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,eAAe,CAAC,CAAA;AAE1D;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAA;AAEtD,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAA;AAEzD,wCAAwC;AACxC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qKAAqK;IACrK,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,+GAA+G;IAC/G,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACjC,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,6FAA6F;IAC7F,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yJAAyJ;IACzJ,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,kPAAkP;IAClP,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,CACrD;IACA,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,GACC;IAAC,OAAO,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAC,CACzG,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU;IA4BnB,2HAA2H;kBAC7G,kBAAkB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;IAItD,gDAAgD;QAC5C,KAAK,aAAa,cAAc,CAAC,KAAK,CAAC,UAAU,KAAK,OAAO,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;IAIjG,uGAAuG;oBACvF,KAAK,aAAa,cAAc,CAAC,KAAK,CAAC,UAAU,KAAK,OAAO,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;IAI7G,mJAAmJ;sBACjI,iBAAiB,OAAO,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;CAO7E,CAAA;AAED,iLAAiL;AACjL,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,OAAO,KAAG,IAEpD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,OAAO,KAAG,IAEvD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,YAAY,MAAM,mBAAmB,KAAG,IAU9E,CAAA;AAmBD;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,CAAC,MAAM,IAAI,CAAC,GAAG,IAIjD,CAAA;AAED,iFAAiF;AACjF,eAAO,MAAM,eAAe,QAAO,YAAY,GAAG,IAAmC,CAAA;AAErF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,aAatF,CAAA"}
@@ -9,7 +9,7 @@ import { getCurrentInstance, inject, onScopeDispose, watch } from "vue";
9
9
  * - From a modal, it closes together with the modal.
10
10
  * - From a menu — a dropdown with `closeOnClick`, such as WButtonMore — it takes the menu's place, since the menu closes on the click.
11
11
  * A dropdown, such as a confirm, sticks to the menu's anchor and keeps the menu's row marked.
12
- * - From any other dropdown, such as a filter, it stays over it, like the menu of a select inside.
12
+ * - From any other dropdown, such as a filter, it stays over it, like the menu of a select inside — or takes its place the same way with `replace`.
13
13
  *
14
14
  * A dropdown closes when the component unmounts, unless it took a menu's place. A modal stays.
15
15
  */
@@ -24,9 +24,9 @@ var useOverlay = () => {
24
24
  parent: getParent(),
25
25
  provides: getInstanceProvides(instance)
26
26
  });
27
- const track = (open) => {
27
+ const track = (open, replace) => {
28
28
  const context = getContext();
29
- const handoff = isHandoff(context.parent);
29
+ const handoff = isHandoff(context.parent, replace);
30
30
  const layer = open(context, () => {
31
31
  if (layer) dropdowns.delete(layer.id);
32
32
  });
@@ -36,7 +36,7 @@ var useOverlay = () => {
36
36
  return {
37
37
  /** Opens `content` the way `present` says. WModal picks the frame, such as a dropdown that is a bottom sheet on phones. */
38
38
  open(options) {
39
- return track((context, untrack) => openWithCallback(options, untrack, context));
39
+ return track((context, untrack) => openWithCallback(options, untrack, context), options.replace);
40
40
  },
41
41
  /** Opens a modal. `cb` runs after it closes. */
42
42
  add(component, props, cb) {
package/docs/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # eco-vue-js
2
2
 
3
- > Vue 3 UI kit with Tailwind v4 — components, utilities, icons and recipes. These are the docs of version 0.22.0, the one installed next to them. Start with Getting started and Conventions; each component page lists its props, events and slots with examples.
3
+ > Vue 3 UI kit with Tailwind v4 — components, utilities, icons and recipes. These are the docs of version 0.22.1, the one installed next to them. Start with Getting started and Conventions; each component page lists its props, events and slots with examples.
4
4
 
5
5
  Release notes, for what changed between versions: https://github.com/rsmple/eco-vue-js/releases. The docs site, with live demos: https://rsmple.github.io/eco-vue-js/
6
6
 
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "git",
5
5
  "url": "https://github.com/rsmple/eco-vue-js.git"
6
6
  },
7
- "version": "0.22.0",
7
+ "version": "0.22.1",
8
8
  "homepage": "https://rsmple.github.io/eco-vue-js/",
9
9
  "dependencies": {
10
10
  "@stylistic/eslint-plugin": "5.10.0",