savor-ui 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
 
4
4
 
5
+ # [0.20.0](https://gitee.com/mach552/savor-ui/compare/v0.19.0...v0.20.0) (2026-08-10)
6
+
7
+
8
+ ### Features
9
+
10
+ * **drawer:** 新增`desc`属性 ([28ac722](https://gitee.com/mach552/savor-ui/commits/28ac722dfb797062d01512f79092df889e66a4b8))
11
+ * **dropdown:** 新增延迟关闭属性 ([8a563e1](https://gitee.com/mach552/savor-ui/commits/8a563e1731542bf3297ffa595bd8c7953d48234d))
12
+
5
13
  # [0.19.0](https://gitee.com/mach552/savor-ui/compare/v0.18.0...v0.19.0) (2026-08-09)
6
14
 
7
15
 
@@ -13,8 +13,8 @@ var m = u("<div>"), h = u("<div> "), g = u("<div>", 1), _ = /*@__PURE__*/ i({
13
13
  },
14
14
  setup(i, { slots: u }) {
15
15
  let _ = i, v = e("badge"), y = t(() => ({
16
- height: "10px",
17
- width: "10px",
16
+ height: "6px",
17
+ width: "6px",
18
18
  ..._.dotStyle
19
19
  })), b = t(() => _.max && _.count > _.max ? `${_.max}+` : _.count), x = g();
20
20
  return a(() => {
@@ -7,16 +7,16 @@ import "../../../hooks/index.mjs";
7
7
  import i from "../../../icons/src/close.vue.mjs";
8
8
  import "../../../icons/index.mjs";
9
9
  import a from "../button/button.vue.mjs";
10
- import ee from "../scrollbar/scrollbar.vue.mjs";
11
- import { STransition as o } from "../transition/index.mjs";
12
- import { VaporTeleport as te, applyVShow as s, child as c, computed as l, createComponent as u, createIf as d, createInvoker as f, createSlot as p, createTemplateRefSetter as m, defineVaporComponent as h, delegateEvents as g, mergeModels as _, nextTick as v, onMounted as ne, onUnmounted as re, ref as y, renderEffect as b, setClass as x, setInsertionState as S, setStyle as C, setText as w, template as T, toDisplayString as E, txt as D, unref as O, useModel as ie, watch as k, watchEffect as ae } from "vue";
10
+ import o from "../scrollbar/scrollbar.vue.mjs";
11
+ import { STransition as s } from "../transition/index.mjs";
12
+ import { VaporTeleport as c, applyVShow as l, child as u, computed as d, createComponent as f, createIf as p, createInvoker as m, createSlot as h, createTemplateRefSetter as ee, defineVaporComponent as g, delegateEvents as _, mergeModels as v, nextTick as y, onMounted as te, onUnmounted as b, ref as x, renderEffect as S, setClass as C, setInsertionState as w, setStyle as T, setText as E, template as D, toDisplayString as O, txt as k, unref as A, useModel as ne, watch as j, watchEffect as re } from "vue";
13
13
  //#region ../components/src/drawer/drawer.vue?vue&type=script&setup=true&vapor=true&lang.ts
14
- var A = T("<div>"), j = T("<div> "), M = T("<div><div><div></div>");
15
- g("click", "mousedown");
16
- var N = /*@__PURE__*/ h({
14
+ var M = D("<div>"), ie = D("<div> "), ae = D("<div><div> </div>"), oe = D("<div><div><div></div>");
15
+ _("click", "mousedown");
16
+ var N = /*@__PURE__*/ g({
17
17
  name: "SDrawer",
18
18
  __name: "drawer",
19
- props: /*@__PURE__*/ _({
19
+ props: /*@__PURE__*/ v({
20
20
  modelValue: { type: Boolean },
21
21
  closeOnEsc: {
22
22
  type: Boolean,
@@ -40,6 +40,7 @@ var N = /*@__PURE__*/ h({
40
40
  resizable: { type: Boolean },
41
41
  to: { default: "body" },
42
42
  title: {},
43
+ desc: {},
43
44
  header: {
44
45
  type: Boolean,
45
46
  default: !0
@@ -65,7 +66,7 @@ var N = /*@__PURE__*/ h({
65
66
  },
66
67
  modelModifiers: {}
67
68
  }),
68
- emits: /*@__PURE__*/ _([
69
+ emits: /*@__PURE__*/ v([
69
70
  "esc",
70
71
  "maskClick",
71
72
  "open",
@@ -73,45 +74,45 @@ var N = /*@__PURE__*/ h({
73
74
  "close",
74
75
  "closed"
75
76
  ], ["update:modelValue"]),
76
- setup(h, { emit: g }) {
77
- let _ = h, T = g, N = t("drawer"), { nextZIndex: P } = r(), F = y(0), { lockScroll: I, unlockScroll: L } = n(), R = ie(h, "modelValue"), z = y(!1), B = y(!1), V = y(!1), H = y(""), U = y("");
78
- ae(() => {
79
- H.value = e(_.width), U.value = e(_.height);
77
+ setup(g, { emit: _ }) {
78
+ let v = g, D = _, N = t("drawer"), { nextZIndex: P } = r(), F = x(0), { lockScroll: se, unlockScroll: ce } = n(), I = ne(g, "modelValue"), L = x(!1), R = x(!1), z = x(!1), B = x(""), V = x("");
79
+ re(() => {
80
+ B.value = e(v.width), V.value = e(v.height);
80
81
  });
81
- let oe = l(() => ({
82
+ let H = d(() => ({
82
83
  zIndex: F.value,
83
- position: _.to === "body" ? "fixed" : "absolute"
84
- })), W = l(() => {
85
- let e = { ..._.drawerStyle };
86
- return (_.placement === "left" || _.placement === "right") && (e.width = H.value), (_.placement === "top" || _.placement === "bottom") && (e.height = U.value), e;
87
- }), se = () => {
88
- T("opened");
89
- }, ce = () => {
90
- B.value = !1, T("closed"), v(() => {
91
- Z.value && (Z.value.style.transition = "", Z.value.style.transform = ""), L();
84
+ position: v.to === "body" ? "fixed" : "absolute"
85
+ })), U = d(() => {
86
+ let e = { ...v.drawerStyle };
87
+ return (v.placement === "left" || v.placement === "right") && (e.width = B.value), (v.placement === "top" || v.placement === "bottom") && (e.height = V.value), e;
88
+ }), W = () => {
89
+ D("opened");
90
+ }, le = () => {
91
+ R.value = !1, D("closed"), y(() => {
92
+ Z.value && (Z.value.style.transition = "", Z.value.style.transform = ""), ce();
92
93
  });
93
94
  }, G = () => {
94
- R.value = !1, T("close");
95
- }, le = () => {
96
- _.closeOnMask && (G(), T("maskClick"));
97
- }, ue = (e) => {
98
- e.preventDefault(), V.value = !0;
95
+ I.value = !1, D("close");
96
+ }, ue = () => {
97
+ v.closeOnMask && (G(), D("maskClick"));
98
+ }, de = (e) => {
99
+ e.preventDefault(), z.value = !0;
99
100
  }, K = (e) => {
100
- if (V.value) {
101
- if (_.placement === "right" && (H.value = X(window.innerWidth - e.clientX, _.minWidth, _.maxWidth, !0), $(H.value, !0)), _.placement === "left") {
101
+ if (z.value) {
102
+ if (v.placement === "right" && (B.value = X(window.innerWidth - e.clientX, v.minWidth, v.maxWidth, !0), $(B.value, !0)), v.placement === "left") {
102
103
  let t = e.clientX;
103
- H.value = X(t, _.minWidth, _.maxWidth, !0), $(H.value, !0);
104
+ B.value = X(t, v.minWidth, v.maxWidth, !0), $(B.value, !0);
104
105
  }
105
- if (_.placement === "bottom" && (U.value = X(window.innerHeight - e.clientY, _.minHeight, _.maxHeight, !1), $(U.value, !0)), _.placement === "top") {
106
+ if (v.placement === "bottom" && (V.value = X(window.innerHeight - e.clientY, v.minHeight, v.maxHeight, !1), $(V.value, !0)), v.placement === "top") {
106
107
  let t = e.clientY;
107
- U.value = X(t, _.minHeight, _.maxHeight, !1), $(U.value, !0);
108
+ V.value = X(t, v.minHeight, v.maxHeight, !1), $(V.value, !0);
108
109
  }
109
110
  }
110
111
  }, q = () => {
111
- V.value &&= !1;
112
+ z.value &&= !1;
112
113
  }, J = (e) => {
113
- e.key === "Escape" && _.closeOnEsc && R.value && (G(), T("esc"));
114
- }, de = (e) => {
114
+ e.key === "Escape" && v.closeOnEsc && I.value && (G(), D("esc"));
115
+ }, fe = (e) => {
115
116
  let t = String(e).trim().match(/^(\d*\.?\d+)(.*)$/);
116
117
  return t ? {
117
118
  num: parseFloat(t[1]),
@@ -121,7 +122,7 @@ var N = /*@__PURE__*/ h({
121
122
  unit: "px"
122
123
  };
123
124
  }, Y = (e, t) => {
124
- let { num: n, unit: r } = de(e), i = t ? window.innerWidth : window.innerHeight;
125
+ let { num: n, unit: r } = fe(e), i = t ? window.innerWidth : window.innerHeight;
125
126
  switch (r) {
126
127
  case "%":
127
128
  case "vw":
@@ -132,74 +133,80 @@ var N = /*@__PURE__*/ h({
132
133
  }, X = (e, t, n, r) => {
133
134
  let i = Y(t, r), a = Y(n, r);
134
135
  return Math.max(i, Math.min(e, a)) + "px";
135
- }, Z = y(null), Q = () => {
136
- _.to === "body" ? Z.value = document.querySelector("#app") : _.to instanceof HTMLElement ? Z.value = _.to : typeof _.to == "string" && (Z.value = document.querySelector(_.to));
136
+ }, Z = x(null), Q = () => {
137
+ v.to === "body" ? Z.value = document.querySelector("#app") : v.to instanceof HTMLElement ? Z.value = v.to : typeof v.to == "string" && (Z.value = document.querySelector(v.to));
137
138
  }, $ = (e, t) => {
138
- _.push && Z.value && (t ? (Z.value.style.transition = "transform 0.3s var(--s-bezier-out)", _.placement === "left" ? Z.value.style.transform = `translateX(${e})` : _.placement === "right" ? Z.value.style.transform = `translateX(-${e})` : _.placement === "top" ? Z.value.style.transform = `translateY(${e})` : _.placement === "bottom" && (Z.value.style.transform = `translateY(-${e})`)) : (Z.value.style.transition = "transform 0.3s var(--s-bezier-in)", Z.value.style.transform = "translate(0,0)"));
139
+ v.push && Z.value && (t ? (Z.value.style.transition = "transform 0.3s var(--s-bezier-out)", v.placement === "left" ? Z.value.style.transform = `translateX(${e})` : v.placement === "right" ? Z.value.style.transform = `translateX(-${e})` : v.placement === "top" ? Z.value.style.transform = `translateY(${e})` : v.placement === "bottom" && (Z.value.style.transform = `translateY(-${e})`)) : (Z.value.style.transition = "transform 0.3s var(--s-bezier-in)", Z.value.style.transform = "translate(0,0)"));
139
140
  };
140
- k(() => _.to, Q), k(() => R.value, (e) => {
141
- e ? (F.value = P(), I(), B.value = !0, v(() => {
142
- z.value = !0, _.placement === "left" || _.placement === "right" ? $(W.value.width, !0) : (_.placement === "top" || _.placement === "bottom") && $(W.value.height, !0), _.closeOnEsc && (document.removeEventListener("keydown", J), document.addEventListener("keydown", J)), T("open");
143
- })) : (z.value = !1, document.removeEventListener("keydown", J), $("0", !1));
144
- }, { immediate: !0 }), k(() => _.resizable, (e) => {
141
+ j(() => v.to, Q), j(() => I.value, (e) => {
142
+ e ? (F.value = P(), se(), R.value = !0, y(() => {
143
+ L.value = !0, v.placement === "left" || v.placement === "right" ? $(U.value.width, !0) : (v.placement === "top" || v.placement === "bottom") && $(U.value.height, !0), v.closeOnEsc && (document.removeEventListener("keydown", J), document.addEventListener("keydown", J)), D("open");
144
+ })) : (L.value = !1, document.removeEventListener("keydown", J), $("0", !1));
145
+ }, { immediate: !0 }), j(() => v.resizable, (e) => {
145
146
  e ? (window.addEventListener("mousemove", K), window.addEventListener("mouseup", q)) : (window.removeEventListener("mousemove", K), window.removeEventListener("mouseup", q));
146
- }, { immediate: !0 }), ne(() => {
147
+ }, { immediate: !0 }), te(() => {
147
148
  Q();
148
- }), re(() => {
149
+ }), b(() => {
149
150
  document.removeEventListener("keydown", J), window.removeEventListener("mousemove", K), window.removeEventListener("mouseup", q);
150
151
  });
151
- let fe = m();
152
- return u(te, {
153
- to: () => h.to,
152
+ let pe = ee();
153
+ return f(c, {
154
+ to: () => g.to,
154
155
  defer: ""
155
156
  }, () => {
156
- let e = A();
157
- return b(() => {
158
- x(e, [O(N).e("container")]), C(e, oe.value);
159
- }), S(e, null, 0), u(O(o), { type: "opacity" }, () => d(() => h.mask, () => {
160
- let e = A();
161
- return s(e, () => z.value), e.$evtclick = f(le), b(() => {
162
- x(e, [O(N).e("mask")]), C(e, h.maskStyle);
157
+ let e = M();
158
+ return S(() => {
159
+ C(e, [A(N).e("container")]), T(e, H.value);
160
+ }), w(e, null, 0), f(A(s), { type: "opacity" }, () => p(() => g.mask, () => {
161
+ let e = M();
162
+ return l(e, () => L.value), e.$evtclick = m(ue), S(() => {
163
+ C(e, [A(N).e("mask")]), T(e, g.maskStyle);
163
164
  }), e;
164
- }, null, 129)), S(e, null, 1), u(O(o), {
165
+ }, null, 129)), w(e, null, 1), f(A(s), {
165
166
  type: "side",
166
- placement: () => h.placement,
167
- onAfterLeave: () => ce,
168
- onAfterEnter: () => se
167
+ placement: () => g.placement,
168
+ onAfterLeave: () => le,
169
+ onAfterEnter: () => W
169
170
  }, () => {
170
- let e = M(), t = c(e, 1), n = c(t, 1);
171
- return b(() => {
172
- let t = O(N);
173
- x(e, [t.b(), t.m(h.placement)]), C(e, W.value);
174
- }), S(e, 0, 0), d(() => h.resizable, () => {
175
- let e = A();
176
- return e.$evtmousedown = f(ue), b(() => {
177
- let t = O(N);
178
- x(e, [t.e("trigger"), t.is("dragging", V.value)]);
171
+ let e = oe(), t = u(e, 1), n = u(t, 1);
172
+ return S(() => {
173
+ let t = A(N);
174
+ C(e, [t.b(), t.m(g.placement)]), T(e, U.value);
175
+ }), w(e, 0, 0), p(() => g.resizable, () => {
176
+ let e = M();
177
+ return e.$evtmousedown = m(de), S(() => {
178
+ let t = A(N);
179
+ C(e, [t.e("trigger"), t.is("dragging", z.value)]);
179
180
  }), e;
180
- }), b(() => x(t, [O(N).e("wrapper")])), S(t, 0, 0), d(() => h.header, () => {
181
- let e = A();
182
- return b(() => x(e, [O(N).e("header")])), S(e, null, 0), p("header", null, () => {
183
- let e = j(), t = D(e);
184
- return b(() => {
185
- x(e, [O(N).e("title")]), w(t, E(h.title));
181
+ }), S(() => C(t, [A(N).e("wrapper")])), w(t, 0, 0), p(() => g.header, () => {
182
+ let e = M();
183
+ return S(() => C(e, [A(N).e("header")])), w(e, null, 0), h("header", null, () => {
184
+ let e = ae(), t = u(e), n = k(t);
185
+ return S(() => {
186
+ let r = A(N);
187
+ C(e, [r.e("title")]), C(t, r.e("title-text")), E(n, O(g.title));
188
+ }), w(e, null, 1), p(() => g.desc, () => {
189
+ let e = ie(), t = k(e);
190
+ return S(() => {
191
+ C(e, A(N).e("title-desc")), E(t, O(g.desc));
192
+ }), e;
186
193
  }), e;
187
- }), S(e, null, 1), d(() => h.closable, () => u(a, {
194
+ }), w(e, null, 1), p(() => g.closable, () => f(a, {
188
195
  circle: "",
189
196
  text: "",
190
197
  size: "small",
191
198
  onClick: () => G
192
- }, { icon: () => u(O(i)) })), e;
193
- }), b(() => x(n, [O(N).e("body")])), S(n, null, 0), d(() => h.scrollContent, () => u(ee, { $: [() => ({ ...h.scrollbarProps })] }, () => p("default", null, null, 4)), () => {
194
- let e = A();
195
- return b(() => {
196
- x(e, [O(N).e("content")]), C(e, h.bodyStyle);
197
- }), S(e, null, 0), p(), e;
198
- }, 1285), S(t, null, 2), d(() => h.footer, () => {
199
- let e = A();
200
- return b(() => x(e, [O(N).e("footer")])), S(e, null, 0), p("footer"), e;
201
- }), s(e, () => z.value), e;
202
- }), s(e, () => B.value), fe(e, "drawerContainerRef"), e;
199
+ }, { icon: () => f(A(i)) })), e;
200
+ }), S(() => C(n, [A(N).e("body")])), w(n, null, 0), p(() => g.scrollContent, () => f(o, { $: [() => ({ ...g.scrollbarProps })] }, () => h("default", null, null, 4)), () => {
201
+ let e = M();
202
+ return S(() => {
203
+ C(e, [A(N).e("content")]), T(e, g.bodyStyle);
204
+ }), w(e, null, 0), h(), e;
205
+ }, 1541), w(t, null, 2), p(() => g.footer, () => {
206
+ let e = M();
207
+ return S(() => C(e, [A(N).e("footer")])), w(e, null, 0), h("footer"), e;
208
+ }), l(e, () => L.value), e;
209
+ }), l(e, () => R.value), pe(e, "drawerContainerRef"), e;
203
210
  }, !0);
204
211
  }
205
212
  });
@@ -21,6 +21,7 @@ export declare const SDrawer: ((__VLS_props: NonNullable<Awaited<typeof __VLS_se
21
21
  resizable?: boolean | undefined;
22
22
  to?: (string | HTMLElement) | undefined;
23
23
  title?: string | undefined;
24
+ desc?: string | undefined;
24
25
  header?: boolean | undefined;
25
26
  footer?: boolean | undefined;
26
27
  closable?: boolean | undefined;
@@ -28,6 +28,8 @@ export interface DrawerProps {
28
28
  to?: string | HTMLElement;
29
29
  /** 标题 */
30
30
  title?: string;
31
+ /** 标题描述 */
32
+ desc?: string;
31
33
  /** 头部 */
32
34
  header?: boolean;
33
35
  /** 底部 */
@@ -7,27 +7,30 @@ import { createComponent as r, createSlot as i, defineVaporComponent as a, provi
7
7
  var m = d("<div>"), h = d("<div>", 1), g = /*@__PURE__*/ a({
8
8
  name: "SDropdown",
9
9
  __name: "dropdown",
10
- props: { popoverProps: {} },
10
+ props: {
11
+ delayClose: { type: Boolean },
12
+ popoverProps: {}
13
+ },
11
14
  setup(a) {
12
- let d = e("dropdown"), g = p("popoverRef"), _ = null, v = () => {
13
- _ &&= (_(), null);
15
+ let d = a, g = e("dropdown"), _ = p("popoverRef"), v = null, y = () => {
16
+ v &&= (v(), null);
14
17
  };
15
- o(n, { itemClick: () => (g.value?.hide(), new Promise((e) => {
16
- _ = e;
18
+ o(n, { itemClick: () => (_.value?.hide(), new Promise((e) => {
19
+ d.delayClose ? v = e : e();
17
20
  })) });
18
- let y = h();
19
- return s(() => c(y, [f(d).b()])), l(y, null, 0), u(r(f(t), { $: [() => ({
21
+ let b = h();
22
+ return s(() => c(b, [f(g).b()])), l(b, null, 0), u(r(f(t), { $: [() => ({
20
23
  trigger: "click",
21
24
  placement: a.popoverProps?.trigger === "contextmenu" ? "bottom-start" : "bottom",
22
25
  alignPoint: a.popoverProps?.trigger === "contextmenu",
23
26
  ...a.popoverProps
24
- }), { onAfterLeave: () => v }] }, {
27
+ }), { onAfterLeave: () => y }] }, {
25
28
  content: () => {
26
29
  let e = m();
27
- return s(() => c(e, f(d).e("list"))), l(e, null, 0), i("content"), e;
30
+ return s(() => c(e, f(g).e("list"))), l(e, null, 0), i("content"), e;
28
31
  },
29
32
  default: () => i("default", null, null, 4)
30
- }), g, null, "popoverRef"), y;
33
+ }), _, null, "popoverRef"), b;
31
34
  }
32
35
  });
33
36
  //#endregion
@@ -7,6 +7,7 @@ export declare const SDropdown: ((__VLS_props: NonNullable<Awaited<typeof __VLS_
7
7
  emit: {};
8
8
  }, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
9
9
  props: PublicProps & {
10
+ delayClose?: boolean | undefined;
10
11
  popoverProps?: PopoverProps | undefined;
11
12
  } & (typeof globalThis extends {
12
13
  __VLS_PROPS_FALLBACK: infer P;
@@ -1,6 +1,8 @@
1
1
  import { InjectionKey } from 'vue';
2
2
  import { PopoverProps } from '../popover';
3
3
  export interface DropdownProps {
4
+ /** 延迟关闭(用于卸载组件时延迟关闭) */
5
+ delayClose?: boolean;
4
6
  /** 弹出层属性 [PopoverProps](/components/other/popover#popover-props)*/
5
7
  popoverProps?: PopoverProps;
6
8
  }
@@ -139,6 +139,19 @@
139
139
  }
140
140
  @include e(title) {
141
141
  flex: 1;
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: 4px;
145
+ }
146
+ @include e(title-text) {
147
+ font-size: getCssVar("font-size", "large");
148
+ font-weight: 500;
149
+ color: getCssVar("color", "text-1");
150
+ }
151
+ @include e(title-desc) {
152
+ font-size: getCssVar("font-size", "medium");
153
+ font-weight: 400;
154
+ color: getCssVar("color", "text-2");
142
155
  }
143
156
  @include e(body) {
144
157
  flex: 1;
@@ -701,6 +701,10 @@
701
701
  "description": "标题",
702
702
  "type": "string"
703
703
  },
704
+ "s-drawer/desc": {
705
+ "description": "标题描述",
706
+ "type": "string"
707
+ },
704
708
  "s-drawer/header": {
705
709
  "description": "头部",
706
710
  "type": "boolean"
@@ -733,6 +737,10 @@
733
737
  "s-drawer/maskStyle": {
734
738
  "description": "抽屉遮罩自定义样式"
735
739
  },
740
+ "s-dropdown/delayClose": {
741
+ "description": "延迟关闭(用于卸载组件时延迟关闭)",
742
+ "type": "boolean"
743
+ },
736
744
  "s-dropdown/popoverProps": {
737
745
  "description": "弹出层属性 [PopoverProps](/components/other/popover#popover-props)"
738
746
  },
@@ -301,6 +301,7 @@
301
301
  "resizable",
302
302
  "to",
303
303
  "title",
304
+ "desc",
304
305
  "header",
305
306
  "footer",
306
307
  "closable",
@@ -314,6 +315,7 @@
314
315
  },
315
316
  "s-dropdown": {
316
317
  "attributes": [
318
+ "delayClose",
317
319
  "popoverProps"
318
320
  ]
319
321
  },
@@ -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.18.0",
5
+ "version": "0.19.0",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
@@ -1826,6 +1826,14 @@
1826
1826
  "kind": "expression"
1827
1827
  }
1828
1828
  },
1829
+ {
1830
+ "name": "desc",
1831
+ "description": "标题描述",
1832
+ "value": {
1833
+ "type": "string",
1834
+ "kind": "expression"
1835
+ }
1836
+ },
1829
1837
  {
1830
1838
  "name": "header",
1831
1839
  "description": "头部",
@@ -1918,6 +1926,14 @@
1918
1926
  {
1919
1927
  "name": "s-dropdown",
1920
1928
  "attributes": [
1929
+ {
1930
+ "name": "delayClose",
1931
+ "description": "延迟关闭(用于卸载组件时延迟关闭)",
1932
+ "value": {
1933
+ "type": "boolean",
1934
+ "kind": "expression"
1935
+ }
1936
+ },
1921
1937
  {
1922
1938
  "name": "popoverProps",
1923
1939
  "description": "弹出层属性 [PopoverProps](/components/other/popover#popover-props)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "savor-ui",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "description": "A Vue3 Components Library",
5
5
  "keywords": [
6
6
  "component library",