savor-ui 0.15.4 → 0.15.6

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
 
4
4
 
5
+ ## [0.15.6](https://gitee.com/mach552/savor-ui/compare/v0.15.5...v0.15.6) (2026-08-04)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **dropdown:** 修复选择选项切换页面后无法关闭问题 ([1b835ab](https://gitee.com/mach552/savor-ui/commits/1b835ab8ce95e3571f7e7bea55f7c2396bb0486b))
11
+ * **popover:** 修复右键模式时再次右键不刷新位置的问题 ([86c0842](https://gitee.com/mach552/savor-ui/commits/86c08422edc51806ae1ecd3741c96c195da41281))
12
+
13
+ ## [0.15.5](https://gitee.com/mach552/savor-ui/compare/v0.15.4...v0.15.5) (2026-08-04)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **popover:** 修复切换页面无法关闭问题 ([8317b1f](https://gitee.com/mach552/savor-ui/commits/8317b1f28589c11219e9109339f259e055f5cb5e))
19
+
5
20
  ## [0.15.4](https://gitee.com/mach552/savor-ui/compare/v0.15.3...v0.15.4) (2026-08-04)
6
21
 
7
22
 
@@ -11,8 +11,8 @@ var y = /*@__PURE__*/ o({
11
11
  props: { title: {} },
12
12
  emits: ["click"],
13
13
  setup(o, { emit: s, slots: p }) {
14
- let y = s, b = e("droption"), x = c(t, void 0), S = () => {
15
- x?.itemClick?.(), y("click");
14
+ let y = s, b = e("droption"), x = c(t, void 0), S = async () => {
15
+ await x?.itemClick?.(), y("click");
16
16
  }, C = v(), w = n(C, 1);
17
17
  return l(() => u(C, [h(b).b()])), d(C, 0, 0), r(() => p.icon, () => {
18
18
  let e = g();
@@ -9,23 +9,25 @@ var m = d("<div>"), h = d("<div>", 1), g = /*@__PURE__*/ a({
9
9
  __name: "dropdown",
10
10
  props: { popoverProps: {} },
11
11
  setup(a) {
12
- let d = e("dropdown"), g = p("popoverRef");
13
- o(n, { itemClick: () => {
14
- g.value?.hide();
15
- } });
16
- let _ = h();
17
- return s(() => c(_, [f(d).b()])), l(_, null, 0), u(r(f(t), { $: [() => ({
12
+ let d = e("dropdown"), g = p("popoverRef"), _ = null, v = () => {
13
+ _ &&= (_(), null);
14
+ };
15
+ o(n, { itemClick: () => (g.value?.hide(), new Promise((e) => {
16
+ _ = e;
17
+ })) });
18
+ let y = h();
19
+ return s(() => c(y, [f(d).b()])), l(y, null, 0), u(r(f(t), { $: [() => ({
18
20
  trigger: "click",
19
21
  placement: a.popoverProps?.trigger === "contextmenu" ? "bottom-start" : "bottom",
20
22
  alignPoint: a.popoverProps?.trigger === "contextmenu",
21
23
  ...a.popoverProps
22
- })] }, {
24
+ }), { onAfterLeave: () => v }] }, {
23
25
  content: () => {
24
26
  let e = m();
25
27
  return s(() => c(e, f(d).e("list"))), l(e, null, 0), i("content"), e;
26
28
  },
27
29
  default: () => i("default", null, null, 4)
28
- }), g, null, "popoverRef"), _;
30
+ }), g, null, "popoverRef"), y;
29
31
  }
30
32
  });
31
33
  //#endregion
@@ -47,6 +47,6 @@ export interface DsubmenuEmits {
47
47
  click: [];
48
48
  }
49
49
  export interface DropdownContext {
50
- itemClick: () => void;
50
+ itemClick: () => Promise<void>;
51
51
  }
52
52
  export declare const dropdownContextKey: InjectionKey<DropdownContext>;
@@ -3,7 +3,7 @@ import { PublicProps, ShallowUnwrapRef, VNode, Plugin } from 'vue';
3
3
  export declare const SPopover: ((__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: {
4
4
  attrs: any;
5
5
  slots: PopoverSlots;
6
- emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void);
6
+ emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void) & ((evt: "after-leave") => void);
7
7
  }, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
8
8
  props: PublicProps & {
9
9
  content?: string | undefined;
@@ -22,13 +22,14 @@ export declare const SPopover: ((__VLS_props: NonNullable<Awaited<typeof __VLS_s
22
22
  teleport?: string | undefined;
23
23
  onChange?: ((visible: boolean) => any) | undefined;
24
24
  "onClick-outside"?: ((evt: Event) => any) | undefined;
25
+ "onAfter-leave"?: (() => any) | undefined;
25
26
  } & (typeof globalThis extends {
26
27
  __VLS_PROPS_FALLBACK: infer P;
27
28
  } ? P : {});
28
29
  expose: (exposed: ShallowUnwrapRef<PopoverExpose>) => void;
29
30
  attrs: any;
30
31
  slots: PopoverSlots;
31
- emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void);
32
+ emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void) & ((evt: "after-leave") => void);
32
33
  }>) => VNode & {
33
34
  __ctx?: Awaited<typeof __VLS_setup>;
34
35
  }) & Plugin;
@@ -4,13 +4,14 @@ declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup
4
4
  props: PublicProps & __VLS_PrettifyLocal<PopoverProps & {
5
5
  onChange?: ((visible: boolean) => any) | undefined;
6
6
  "onClick-outside"?: ((evt: Event) => any) | undefined;
7
+ "onAfter-leave"?: (() => any) | undefined;
7
8
  }> & (typeof globalThis extends {
8
9
  __VLS_PROPS_FALLBACK: infer P;
9
10
  } ? P : {});
10
11
  expose: (exposed: ShallowUnwrapRef<PopoverExpose>) => void;
11
12
  attrs: any;
12
13
  slots: PopoverSlots;
13
- emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void);
14
+ emit: ((evt: "change", visible: boolean) => void) & ((evt: "click-outside", evt: Event) => void) & ((evt: "after-leave") => void);
14
15
  }>) => VNode & {
15
16
  __ctx?: Awaited<typeof __VLS_setup>;
16
17
  };
@@ -4,10 +4,10 @@ import { useNamespace as t } from "../../../hooks/src/use-namespace.mjs";
4
4
  import { useOutsideClick as n } from "../../../hooks/src/use-outside-click.mjs";
5
5
  import { useZIndex as r } from "../../../hooks/src/use-zIndex.mjs";
6
6
  import "../../../hooks/index.mjs";
7
- import { VaporTeleport as i, VaporTransition as a, applyVShow as o, child as s, computed as c, createComponent as l, createDynamicComponent as ee, createIf as te, createSlot as ne, createTemplateRefSetter as re, defineVaporComponent as u, nextTick as d, onDeactivated as ie, onMounted as ae, onUnmounted as oe, ref as f, renderEffect as p, setClass as m, setDynamicEvents as h, setInsertionState as g, setStyle as _, setText as se, template as v, toDisplayString as ce, unref as y, useSlots as le, useTemplateRef as b, watch as x, watchEffect as ue } from "vue";
8
- import { arrow as de, autoUpdate as fe, computePosition as pe, flip as me, offset as he, shift as ge } from "@floating-ui/dom";
7
+ import { VaporTeleport as i, VaporTransition as a, applyVShow as o, child as s, computed as c, createComponent as l, createDynamicComponent as ee, createIf as u, createSlot as te, createTemplateRefSetter as ne, defineVaporComponent as d, nextTick as re, onMounted as ie, onUnmounted as ae, ref as f, renderEffect as p, setClass as m, setDynamicEvents as h, setInsertionState as g, setStyle as _, setText as oe, template as v, toDisplayString as se, unref as y, useSlots as ce, useTemplateRef as b, watch as x, watchEffect as le } from "vue";
8
+ import { arrow as ue, autoUpdate as de, computePosition as fe, flip as pe, offset as me, shift as he } from "@floating-ui/dom";
9
9
  //#region ../components/src/popover/popover.vue?vue&type=script&setup=true&vapor=true&lang.ts
10
- var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<div><div>"), S = /*@__PURE__*/ u({
10
+ var ge = v(" "), _e = v("<div data-popover-arrow>"), ve = v("<div>"), ye = v("<div><div>"), S = /*@__PURE__*/ d({
11
11
  name: "SPopover",
12
12
  __name: "popover",
13
13
  props: {
@@ -32,11 +32,15 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
32
32
  },
33
33
  teleport: { default: "body" }
34
34
  },
35
- emits: ["change", "click-outside"],
35
+ emits: [
36
+ "change",
37
+ "click-outside",
38
+ "after-leave"
39
+ ],
36
40
  __multiRoot: !0,
37
- setup(u, { expose: v, emit: S }) {
38
- let C = u, w = S, T = t("popover"), xe = le(), E = f(!1), D = f(!1), { nextZIndex: Se } = r(), O = f(), k = b("containerNode"), A = b("wrapperNode"), j = b("contentNode"), M = f(null), Ce = () => {
39
- let e = xe.default?.();
41
+ setup(d, { expose: v, emit: S }) {
42
+ let C = d, w = S, T = t("popover"), be = ce(), E = f(!1), D = f(!1), { nextZIndex: xe } = r(), O = f(), k = b("containerNode"), A = b("wrapperNode"), j = b("contentNode"), M = f(null), Se = () => {
43
+ let e = be.default?.();
40
44
  return M.value = e, e;
41
45
  }, N = f(null), P = f({}), F = f({}), I = f({}), L = f(null), R = () => {
42
46
  N.value && Object.entries(F.value).forEach(([e, t]) => {
@@ -66,25 +70,25 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
66
70
  if (!e || N.value) return;
67
71
  let t = null;
68
72
  t = e instanceof HTMLElement ? e : B(e), t && t !== N.value && (R(), N.value = t);
69
- }, { flush: "post" }), ae(() => {
73
+ }, { flush: "post" }), ie(() => {
70
74
  if (N.value) return;
71
75
  let e = M.value;
72
76
  if (!e) return;
73
77
  let t = e instanceof HTMLElement ? e : B(e);
74
78
  t && t !== N.value && (R(), N.value = t);
75
79
  }), x(N, (e) => {
76
- e && d().then(() => {
80
+ e && re().then(() => {
77
81
  Object.entries(F.value).forEach(([t, n]) => {
78
82
  e.addEventListener(t, n);
79
83
  });
80
84
  });
81
85
  }, { flush: "post" });
82
- let we = () => {
86
+ let Ce = () => {
83
87
  if (!j.value || !N.value) return;
84
88
  j.value.style.width = "";
85
89
  let e = "";
86
90
  typeof C.width == "number" ? (e = `${C.width}px`, j.value.style.width = e) : C.width === "sameWidth" ? (e = `${N.value.getBoundingClientRect().width}px`, j.value.style.width = e) : C.width === "auto" && (e = "", j.value.style.width = e);
87
- }, Te = c(() => C.offset ? C.offset : C.trigger === "contextmenu" && C.alignPoint ? [0, 0] : C.showArrow ? [0, 8] : [0, 0]), V = () => {
91
+ }, we = c(() => C.offset ? C.offset : C.trigger === "contextmenu" && C.alignPoint ? [0, 0] : C.showArrow ? [0, 8] : [0, 0]), V = () => {
88
92
  if (C.trigger === "contextmenu" && C.alignPoint && L.value) {
89
93
  let e = L.value;
90
94
  return { getBoundingClientRect() {
@@ -106,19 +110,19 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
106
110
  H &&= (H(), null);
107
111
  }, W = async () => {
108
112
  if (!A.value || !N.value) return;
109
- let e = V(), t = j.value?.querySelector("[data-popover-arrow]"), [n, r] = Te.value, i = [
110
- he({
113
+ let e = V(), t = j.value?.querySelector("[data-popover-arrow]"), [n, r] = we.value, i = [
114
+ me({
111
115
  mainAxis: r,
112
116
  crossAxis: n
113
117
  }),
114
- me(),
115
- ge()
118
+ pe(),
119
+ he()
116
120
  ];
117
- t && i.push(de({
121
+ t && i.push(ue({
118
122
  element: t,
119
123
  padding: 8
120
124
  }));
121
- let { x: a, y: o, placement: s, middlewareData: c } = await pe(e, A.value, {
125
+ let { x: a, y: o, placement: s, middlewareData: c } = await fe(e, A.value, {
122
126
  placement: C.placement,
123
127
  strategy: "fixed",
124
128
  middleware: i
@@ -140,18 +144,18 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
140
144
  } : {
141
145
  openDelay: typeof C.delay == "number" ? C.delay : C.delay[0],
142
146
  closeDelay: typeof C.delay == "number" ? 50 : C.delay[1]
143
- }), K = null, Ee = () => {
144
- C.disabled || (K &&= (clearTimeout(K), null), D.value = !0, d(() => {
147
+ }), K = null, Te = () => {
148
+ C.disabled || (K &&= (clearTimeout(K), null), D.value = !0, re(() => {
145
149
  E.value = !0, w("change", !0);
146
150
  }));
147
- }, De = () => {
151
+ }, Ee = () => {
148
152
  E.value = !1, L.value = null, w("change", !1), K && clearTimeout(K), K = setTimeout(() => {
149
153
  C.destroyOnClose && (D.value = !1), K = null;
150
154
  }, 300);
151
- }, q = f(null), J = f(null), Oe = () => {
152
- q.value?.cancel(), J.value?.cancel(), q.value = e(Ee, G.value.openDelay), J.value = e(De, G.value.closeDelay);
155
+ }, q = f(null), J = f(null), De = () => {
156
+ q.value?.cancel(), J.value?.cancel(), q.value = e(Te, G.value.openDelay), J.value = e(Ee, G.value.closeDelay);
153
157
  };
154
- Oe(), x(G, Oe);
158
+ De(), x(G, De);
155
159
  let Y = () => {
156
160
  J.value?.cancel(), q.value?.();
157
161
  }, X = () => {
@@ -160,31 +164,31 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
160
164
  n(k, (e) => {
161
165
  N.value && e.target && typeof N.value.contains == "function" && N.value.contains(e.target) || (E.value && w("click-outside", e), !C.manual && (C.trigger === "hover" || C.trigger === "contextmenu" || C.trigger === "click") && X());
162
166
  });
163
- let ke = () => {
164
- F.value = {}, P.value = {}, I.value = {}, Z();
165
- }, Z = () => {
167
+ let Z = () => {
168
+ F.value = {}, P.value = {}, I.value = {}, Q();
169
+ }, Q = () => {
166
170
  C.manual || (C.trigger === "hover" && (F.value.mouseenter = Y, F.value.mouseleave = X, P.value.mouseenter = Y, P.value.mouseleave = X), C.trigger === "click" && (F.value.click = () => {
167
171
  let e = E.value ? J.value : q.value;
168
172
  (E.value ? q.value : J.value)?.cancel(), e?.();
169
173
  }), C.trigger === "contextmenu" && (F.value.click = () => {
170
174
  X();
171
175
  }, F.value.contextmenu = (e) => {
172
- E.value && X(), e.preventDefault();
176
+ e.preventDefault();
173
177
  let t = e;
174
178
  L.value = {
175
179
  x: t.clientX,
176
180
  y: t.clientY
177
- }, Y();
181
+ }, E.value ? W() : Y();
178
182
  }));
179
183
  };
180
- ue(() => {
181
- C.manual || Z();
184
+ le(() => {
185
+ C.manual || Q();
182
186
  });
183
- let Ae = () => {
184
- E.value || U();
187
+ let Oe = () => {
188
+ E.value || (U(), w("after-leave"));
185
189
  };
186
190
  x(E, (e) => {
187
- e && (!A.value || !N.value || (O.value = Se(), we(), U(), H = fe(V(), A.value, W)));
191
+ e && (!A.value || !N.value || (O.value = xe(), Ce(), U(), H = de(V(), A.value, W)));
188
192
  }, { flush: "post" }), x([
189
193
  () => C.placement,
190
194
  () => C.offset,
@@ -192,45 +196,39 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
192
196
  ], () => {
193
197
  E.value && W();
194
198
  }), x(() => C.manual, (e) => {
195
- e ? ke() : Z();
199
+ e ? Z() : Q();
196
200
  }), x(() => C.trigger, (e, t) => {
197
- e !== t && (q.value?.cancel(), E.value = !1, w("change", !1), ke());
198
- });
199
- let Q = () => {
200
- q.value?.cancel(), J.value?.cancel(), K &&= (clearTimeout(K), null), E.value = !1, D.value = !1, U();
201
- };
202
- ie(() => {
203
- Q();
204
- }), oe(() => {
205
- Q(), R();
201
+ e !== t && (q.value?.cancel(), E.value = !1, w("change", !1), Z());
202
+ }), ae(() => {
203
+ K &&= (clearTimeout(K), null), U(), R();
206
204
  }), v({
207
205
  show: Y,
208
206
  hide: X
209
207
  });
210
- let $ = re();
211
- return [ee(() => Ce()), l(i, {
212
- disabled: () => !u.teleportBody,
213
- to: () => u.teleport
214
- }, () => te(() => D.value, () => {
215
- let e = be(), t = s(e);
208
+ let $ = ne();
209
+ return [ee(() => Se()), l(i, {
210
+ disabled: () => !d.teleportBody,
211
+ to: () => d.teleport
212
+ }, () => u(() => D.value, () => {
213
+ let e = ye(), t = s(e);
216
214
  return p(() => {
217
215
  let n = y(T);
218
216
  h(e, P.value), m(e, [n.b()]), m(t, [n.e("wrapper")]), _(t, { zIndex: O.value });
219
217
  }), g(t, null, 0), l(a, {
220
218
  name: "popover-fade",
221
- onAfterLeave: () => Ae,
219
+ onAfterLeave: () => Oe,
222
220
  persisted: ""
223
221
  }, () => {
224
- let e = ye();
222
+ let e = ve();
225
223
  return p(() => {
226
224
  h(e, I.value), m(e, [y(T).e("content")]);
227
- }), g(e, null, 0), ne("content", null, () => {
225
+ }), g(e, null, 0), te("content", null, () => {
226
+ let e = ge();
227
+ return p(() => oe(e, se(d.content))), e;
228
+ }), g(e, null, 1), u(() => d.showArrow, () => {
228
229
  let e = _e();
229
- return p(() => se(e, ce(u.content))), e;
230
- }), g(e, null, 1), te(() => u.showArrow, () => {
231
- let e = ve();
232
230
  return p(() => {
233
- m(e, [y(T).e("arrow")]), _(e, u.arrowStyle);
231
+ m(e, [y(T).e("arrow")]), _(e, d.arrowStyle);
234
232
  }), e;
235
233
  }), o(e, () => E.value), $(e, j, null, "contentNode"), e;
236
234
  }), $(t, A, null, "wrapperNode"), $(e, k, null, "containerNode"), e;
@@ -63,6 +63,8 @@ export interface PopoverEmits {
63
63
  change: [visible: boolean];
64
64
  /** 隐藏时触发 */
65
65
  "click-outside": [evt: Event];
66
+ /** 离开动画结束时触发 */
67
+ "after-leave": [];
66
68
  }
67
69
  export interface PopoverExpose {
68
70
  /** 显示 */
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "framework": "vue",
4
4
  "name": "savor-ui",
5
- "version": "0.15.3",
5
+ "version": "0.15.5",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "savor-ui",
3
- "version": "0.15.4",
3
+ "version": "0.15.6",
4
4
  "description": "A Vue3 Components Library",
5
5
  "keywords": [
6
6
  "component library",