savor-ui 0.15.5 → 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,14 @@
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
+
5
13
  ## [0.15.5](https://gitee.com/mach552/savor-ui/compare/v0.15.4...v0.15.5) (2026-08-04)
6
14
 
7
15
 
@@ -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?.hideImmediate?.();
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() {
@@ -104,21 +108,21 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
104
108
  return N.value;
105
109
  }, H = null, U = () => {
106
110
  H &&= (H(), null);
107
- }, Ee = async () => {
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
@@ -134,106 +138,97 @@ var _e = v(" "), ve = v("<div data-popover-arrow>"), ye = v("<div>"), be = v("<d
134
138
  top: n == null ? "" : `${n}px`
135
139
  });
136
140
  }
137
- }, W = c(() => C.manual ? {
141
+ }, G = c(() => C.manual ? {
138
142
  openDelay: 0,
139
143
  closeDelay: 0
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
- }), G = null, De = () => {
144
- C.disabled || (G &&= (clearTimeout(G), 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
- }, K = () => {
148
- E.value = !1, L.value = null, w("change", !1), G && clearTimeout(G), G = setTimeout(() => {
149
- C.destroyOnClose && (D.value = !1), G = null;
151
+ }, Ee = () => {
152
+ E.value = !1, L.value = null, w("change", !1), K && clearTimeout(K), K = setTimeout(() => {
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(De, W.value.openDelay), J.value = e(K, W.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(W, Oe);
158
+ De(), x(G, De);
155
159
  let Y = () => {
156
160
  J.value?.cancel(), q.value?.();
157
161
  }, X = () => {
158
162
  q.value?.cancel(), J.value?.();
159
- }, ke = () => {
160
- q.value?.cancel(), J.value?.cancel(), K();
161
163
  };
162
164
  n(k, (e) => {
163
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());
164
166
  });
165
- let Ae = () => {
166
- F.value = {}, P.value = {}, I.value = {}, Z();
167
- }, Z = () => {
167
+ let Z = () => {
168
+ F.value = {}, P.value = {}, I.value = {}, Q();
169
+ }, Q = () => {
168
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 = () => {
169
171
  let e = E.value ? J.value : q.value;
170
172
  (E.value ? q.value : J.value)?.cancel(), e?.();
171
173
  }), C.trigger === "contextmenu" && (F.value.click = () => {
172
174
  X();
173
175
  }, F.value.contextmenu = (e) => {
174
- E.value && X(), e.preventDefault();
176
+ e.preventDefault();
175
177
  let t = e;
176
178
  L.value = {
177
179
  x: t.clientX,
178
180
  y: t.clientY
179
- }, Y();
181
+ }, E.value ? W() : Y();
180
182
  }));
181
183
  };
182
- ue(() => {
183
- C.manual || Z();
184
+ le(() => {
185
+ C.manual || Q();
184
186
  });
185
- let je = () => {
186
- E.value || U();
187
+ let Oe = () => {
188
+ E.value || (U(), w("after-leave"));
187
189
  };
188
190
  x(E, (e) => {
189
- e && (!A.value || !N.value || (O.value = Se(), we(), U(), H = fe(V(), A.value, Ee)));
191
+ e && (!A.value || !N.value || (O.value = xe(), Ce(), U(), H = de(V(), A.value, W)));
190
192
  }, { flush: "post" }), x([
191
193
  () => C.placement,
192
194
  () => C.offset,
193
195
  () => C.showArrow
194
196
  ], () => {
195
- E.value && Ee();
197
+ E.value && W();
196
198
  }), x(() => C.manual, (e) => {
197
- e ? Ae() : Z();
199
+ e ? Z() : Q();
198
200
  }), x(() => C.trigger, (e, t) => {
199
- e !== t && (q.value?.cancel(), E.value = !1, w("change", !1), Ae());
200
- });
201
- let Q = () => {
202
- q.value?.cancel(), J.value?.cancel(), G &&= (clearTimeout(G), null), E.value = !1, D.value = !1, U();
203
- };
204
- ie(() => {
205
- Q();
206
- }), oe(() => {
207
- Q(), R();
201
+ e !== t && (q.value?.cancel(), E.value = !1, w("change", !1), Z());
202
+ }), ae(() => {
203
+ K &&= (clearTimeout(K), null), U(), R();
208
204
  }), v({
209
205
  show: Y,
210
- hide: X,
211
- hideImmediate: ke
206
+ hide: X
212
207
  });
213
- let $ = re();
214
- return [ee(() => Ce()), l(i, {
215
- disabled: () => !u.teleportBody,
216
- to: () => u.teleport
217
- }, () => te(() => D.value, () => {
218
- 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);
219
214
  return p(() => {
220
215
  let n = y(T);
221
216
  h(e, P.value), m(e, [n.b()]), m(t, [n.e("wrapper")]), _(t, { zIndex: O.value });
222
217
  }), g(t, null, 0), l(a, {
223
218
  name: "popover-fade",
224
- onAfterLeave: () => je,
219
+ onAfterLeave: () => Oe,
225
220
  persisted: ""
226
221
  }, () => {
227
- let e = ye();
222
+ let e = ve();
228
223
  return p(() => {
229
224
  h(e, I.value), m(e, [y(T).e("content")]);
230
- }), 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, () => {
231
229
  let e = _e();
232
- return p(() => se(e, ce(u.content))), e;
233
- }), g(e, null, 1), te(() => u.showArrow, () => {
234
- let e = ve();
235
230
  return p(() => {
236
- m(e, [y(T).e("arrow")]), _(e, u.arrowStyle);
231
+ m(e, [y(T).e("arrow")]), _(e, d.arrowStyle);
237
232
  }), e;
238
233
  }), o(e, () => E.value), $(e, j, null, "contentNode"), e;
239
234
  }), $(t, A, null, "wrapperNode"), $(e, k, null, "containerNode"), e;
@@ -63,12 +63,12 @@ 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
  /** 显示 */
69
71
  show: () => void;
70
72
  /** 隐藏 */
71
73
  hide: () => void;
72
- /** 立即隐藏(同步,跳过关闭延时,用于点击后立即切换路由等场景) */
73
- hideImmediate: () => void;
74
74
  }
@@ -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.4",
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.5",
3
+ "version": "0.15.6",
4
4
  "description": "A Vue3 Components Library",
5
5
  "keywords": [
6
6
  "component library",