savor-ui 0.13.1 → 0.14.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.
Files changed (30) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/es/components/src/collapse/collapse-item.vue_vue_type_script_setup_true_vapor_true_lang.mjs +21 -18
  3. package/dist/es/components/src/collapse/collapse.vue_vue_type_script_setup_true_vapor_true_lang.mjs +4 -1
  4. package/dist/es/components/src/form/form-item.d.ts +4 -0
  5. package/dist/es/components/src/form/form-item.vue_vue_type_script_setup_true_vapor_true_lang.mjs +32 -25
  6. package/dist/es/components/src/form/form.vue_vue_type_script_setup_true_vapor_true_lang.mjs +17 -13
  7. package/dist/es/components/src/form/index.d.ts +11 -0
  8. package/dist/es/components/src/form/types.d.ts +10 -0
  9. package/dist/es/components/src/radio/index.d.ts +1 -0
  10. package/dist/es/components/src/radio/radio-group.vue_vue_type_script_setup_true_vapor_true_lang.mjs +4 -2
  11. package/dist/es/components/src/radio/radio.vue_vue_type_script_setup_true_vapor_true_lang.mjs +5 -4
  12. package/dist/es/components/src/radio/types.d.ts +2 -0
  13. package/dist/es/components/src/tabs/index.d.ts +1 -0
  14. package/dist/es/components/src/tabs/tabs.vue_vue_type_script_setup_true_vapor_true_lang.mjs +16 -12
  15. package/dist/es/components/src/tabs/types.d.ts +2 -0
  16. package/dist/es/components/src/text/text.vue_vue_type_script_setup_true_vapor_true_lang.mjs +9 -1
  17. package/dist/es/theme/components/collapse.scss +12 -1
  18. package/dist/es/theme/components/date-picker.scss +4 -0
  19. package/dist/es/theme/components/datetime-picker.scss +4 -0
  20. package/dist/es/theme/components/form.scss +11 -19
  21. package/dist/es/theme/components/input-number.scss +4 -0
  22. package/dist/es/theme/components/input-tag.scss +4 -0
  23. package/dist/es/theme/components/radio.scss +26 -1
  24. package/dist/es/theme/components/tabs.scss +8 -3
  25. package/dist/es/theme/components/textarea.scss +4 -0
  26. package/dist/es/theme/mixins/mixins.scss +12 -0
  27. package/dist/json/vetur-attributes.json +18 -0
  28. package/dist/json/vetur-tags.json +9 -4
  29. package/dist/json/web-types.json +41 -1
  30. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
 
4
4
 
5
+ # [0.14.0](https://gitee.com/mach552/savor-ui/compare/v0.13.1...v0.14.0) (2026-07-26)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **collapse:** 修复border属性无效问题 ([244f173](https://gitee.com/mach552/savor-ui/commits/244f173944ee92dc1ce69efc4e0455f170f1d07a))
11
+ * **form:** 修复tooltip不居中问题 ([379a74e](https://gitee.com/mach552/savor-ui/commits/379a74e894ac04f5802e118c5dae74a701aca462))
12
+ * **tabs:** 修复单子组件时报错问题 ([14542d7](https://gitee.com/mach552/savor-ui/commits/14542d738b55dd79c148661e33fcc02e92937cac))
13
+ * **text:** 修复动态改变内容时tooltip显示时机问题 ([7a6779d](https://gitee.com/mach552/savor-ui/commits/7a6779d11762cee0c5b10069f728807d1a91b17e))
14
+
15
+
16
+ ### Features
17
+
18
+ * **form:** 新增`requiredAlign`属性 ([4ff93e8](https://gitee.com/mach552/savor-ui/commits/4ff93e80e3572e5a24ca6f96a9d18c982c6b0a86))
19
+ * **radio-group:** 新增`block`属性 ([3e6f902](https://gitee.com/mach552/savor-ui/commits/3e6f902269459be76aa8220ff38d1f8f5eb4fbe1))
20
+ * **tabs:** 新增`block`属性 ([37577cc](https://gitee.com/mach552/savor-ui/commits/37577cc9ded99124907615168f53f30084de9f45))
21
+
5
22
  ## [0.13.1](https://gitee.com/mach552/savor-ui/compare/v0.13.0...v0.13.1) (2026-07-22)
6
23
 
7
24
 
@@ -4,11 +4,11 @@ import t from "../../../icons/src/right.vue.mjs";
4
4
  import "../../../icons/index.mjs";
5
5
  import { STransition as n } from "../transition/index.mjs";
6
6
  import { collapseContextKey as r } from "./types.mjs";
7
- import { applyVShow as i, child as a, computed as o, createComponent as s, createInvoker as c, createSlot as l, defineVaporComponent as u, delegateEvents as d, inject as f, next as p, renderEffect as m, setClass as h, setInsertionState as g, setStyle as _, setText as v, template as y, toDisplayString as b, unref as x } from "vue";
7
+ import { applyVShow as i, child as a, computed as o, createComponent as s, createIf as c, createInvoker as l, createSlot as u, defineVaporComponent as d, delegateEvents as f, inject as p, next as m, renderEffect as h, setClass as g, setInsertionState as _, setStyle as v, setText as y, template as b, toDisplayString as x, unref as S } from "vue";
8
8
  //#region ../components/src/collapse/collapse-item.vue?vue&type=script&setup=true&vapor=true&lang.ts
9
- var S = y(" "), C = y("<div>"), w = y("<div><div><span></span><span></span><span>", 1);
10
- d("click");
11
- var T = /*@__PURE__*/ u({
9
+ var C = b(" "), w = b("<span>"), T = b("<div>"), E = b("<div><div><span></span><span></span>", 1);
10
+ f("click");
11
+ var D = /*@__PURE__*/ d({
12
12
  name: "SCollapseItem",
13
13
  __name: "collapse-item",
14
14
  props: {
@@ -16,21 +16,24 @@ var T = /*@__PURE__*/ u({
16
16
  name: {},
17
17
  disabled: { type: Boolean }
18
18
  },
19
- setup(u) {
20
- let d = u, y = e("collapse"), T = f(r), E = o(() => !!T?.modelValue?.value?.includes(d.name)), D = () => {
21
- d.disabled || T?.handleItemClick?.(d.name);
22
- }, O = w(), k = a(O), A = a(k), j = p(A, 1), M = p(j, 2);
23
- return m(() => {
24
- let e = x(y), t = E.value;
25
- h(O, [e.e("item"), e.is("disabled", u.disabled)]), h(k, [e.e("header"), e.is("active", t)]), h(A, e.e("header-arrow")), _(A, { transform: t ? "rotate(90deg)" : "" });
26
- }), g(A, null, 0), s(x(t)), m(() => h(j, x(y).e("header-title"))), g(j, null, 0), l("title", null, () => {
27
- let e = S();
28
- return m(() => v(e, b(u.title))), e;
29
- }), m(() => h(M, x(y).e("extra"))), g(M, null, 0), l("extra"), k.$evtclick = c(D), g(O, null, 1), s(x(n), { type: "height" }, () => {
19
+ setup(d, { slots: f }) {
20
+ let b = d, D = e("collapse"), O = p(r), k = o(() => !!O?.modelValue?.value?.includes(b.name)), A = () => {
21
+ b.disabled || O?.handleItemClick?.(b.name);
22
+ }, j = E(), M = a(j), N = a(M), P = m(N, 1);
23
+ return h(() => {
24
+ let e = S(D), t = k.value;
25
+ g(j, [e.e("item"), e.is("disabled", d.disabled)]), g(M, [e.e("header"), e.is("active", t)]), g(N, e.e("header-arrow")), v(N, { transform: t ? "rotate(90deg)" : "" });
26
+ }), _(N, null, 0), s(S(t)), h(() => g(P, S(D).e("header-title"))), _(P, null, 0), u("title", null, () => {
30
27
  let e = C();
31
- return m(() => h(e, x(y).e("content"))), g(e, null, 0), l(), i(e, () => E.value), e;
32
- }), O;
28
+ return h(() => y(e, x(d.title))), e;
29
+ }), _(M, null, 2), c(() => f.extra, () => {
30
+ let e = w();
31
+ return h(() => g(e, S(D).e("extra"))), _(e, null, 0), u("extra"), e;
32
+ }), M.$evtclick = l(A), _(j, null, 1), s(S(n), { type: "height" }, () => {
33
+ let e = T();
34
+ return h(() => g(e, S(D).e("content"))), _(e, null, 0), u(), i(e, () => k.value), e;
35
+ }), j;
33
36
  }
34
37
  });
35
38
  //#endregion
36
- export { T as default };
39
+ export { D as default };
@@ -31,7 +31,10 @@ var p = l("<div>", 1), m = /*@__PURE__*/ r({
31
31
  }
32
32
  });
33
33
  let _ = p();
34
- return o(() => s(_, u(h).b())), c(_, null, 0), n(), _;
34
+ return o(() => {
35
+ let e = u(h);
36
+ s(_, [e.b(), e.is("border", r.border)]);
37
+ }), c(_, null, 0), n(), _;
35
38
  }
36
39
  });
37
40
  //#endregion
@@ -10,6 +10,10 @@ declare const __VLS_export: (__VLS_props: NonNullable<Awaited<typeof __VLS_setup
10
10
  label?: (props: {
11
11
  label: string | undefined;
12
12
  }) => any;
13
+ } & {
14
+ label?: (props: {
15
+ label: string | undefined;
16
+ }) => any;
13
17
  } & {
14
18
  default?: (props: {
15
19
  validate: (trigger?: string) => Promise<true | void>;
@@ -23,7 +23,8 @@ var k = w("<span>"), A = w(" "), j = w("<div><label>"), M = w("<div> "), N = w("
23
23
  showRequired: {
24
24
  type: Boolean,
25
25
  default: !0
26
- }
26
+ },
27
+ requiredAlign: {}
27
28
  },
28
29
  setup(p, { expose: w }) {
29
30
  let P = p, F = t("form-item"), I = m(i), L = l(() => I?.labelPosition?.value === "top" ? "" : P.labelWidth || I?.labelWidth?.value), R = l(() => P.labelAlign ? P.labelAlign : I?.labelAlign?.value ? I?.labelAlign?.value : I?.labelPosition?.value === "top" ? "left" : "right"), z = null, B = l(() => {
@@ -36,7 +37,7 @@ var k = w("<span>"), A = w(" "), j = w("<div><label>"), M = w("<div> "), N = w("
36
37
  state: "init",
37
38
  errorMsg: "",
38
39
  loading: !1
39
- }), U = (e) => V.value ? V.value.filter((t) => !t.trigger || !e ? !0 : t.trigger && t.trigger === e) : [], W = l(() => V.value.some((e) => e.required) && P.showRequired), G = async (e) => {
40
+ }), U = (e) => V.value ? V.value.filter((t) => !t.trigger || !e ? !0 : t.trigger && t.trigger === e) : [], W = l(() => V.value.some((e) => e.required) && (P.showRequired || I?.showRequired?.value)), G = l(() => P.requiredAlign ? P.requiredAlign : I?.requiredAlign?.value ? I?.requiredAlign?.value : "left"), K = async (e) => {
40
41
  let t = P.field, n = U(e);
41
42
  if (n.length === 0) return !0;
42
43
  if (t) {
@@ -53,35 +54,35 @@ var k = w("<span>"), A = w(" "), j = w("<div><label>"), M = w("<div> "), N = w("
53
54
  H.value.loading = !1;
54
55
  });
55
56
  }
56
- }, K = () => {
57
- H.value.state = "init", H.value.errorMsg = "", H.value.loading = !1;
58
57
  }, q = () => {
59
- K();
58
+ H.value.state = "init", H.value.errorMsg = "", H.value.loading = !1;
59
+ }, J = () => {
60
+ q();
60
61
  let e = I?.model?.value;
61
62
  e && P.field && (e[P.field] = z);
62
- }, J = l(() => H.value.state === "error"), Y = {
63
- validate: G,
63
+ }, Y = l(() => H.value.state === "error"), X = {
64
+ validate: K,
64
65
  field: P.field,
65
- resetField: q,
66
- clearValidate: K
66
+ resetField: J,
67
+ clearValidate: q
67
68
  };
68
- _(a, Y), _(o, {
69
+ _(a, X), _(o, {
69
70
  size: I?.size,
70
- error: J
71
+ error: Y
71
72
  }), h(() => {
72
- P.field && (I?.addField(Y), z = I?.model?.value?.[P.field]);
73
+ P.field && (I?.addField(X), z = I?.model?.value?.[P.field]);
73
74
  }), g(() => {
74
- P.field && I?.removeField(Y);
75
+ P.field && I?.removeField(X);
75
76
  }), w({
76
- validate: G,
77
- resetField: q,
78
- clearValidate: K,
77
+ validate: K,
78
+ resetField: J,
79
+ clearValidate: q,
79
80
  validateStatus: H
80
81
  });
81
- let X = N(), Z = c(X, 1), Q = c(Z);
82
+ let Z = N(), Q = c(Z, 1), $ = c(Q);
82
83
  return y(() => {
83
84
  let e = D(F), t = H.value, n = D(I), r = t.state;
84
- b(X, [
85
+ b(Z, [
85
86
  e.b(),
86
87
  e.is("error", r === "error"),
87
88
  e.is("success", r === "success"),
@@ -89,18 +90,24 @@ var k = w("<span>"), A = w(" "), j = w("<div><label>"), M = w("<div> "), N = w("
89
90
  e.is("top", n?.labelPosition?.value === "top"),
90
91
  e.m(n?.size?.value)
91
92
  ]);
92
- }), x(X, 0, 0), d(() => W.value || p.label || p.tooltip, () => {
93
+ }), x(Z, 0, 0), d(() => W.value || p.label || p.tooltip, () => {
93
94
  let t = j(), i = c(t);
94
95
  return y(() => {
95
96
  let n = D(F);
96
97
  b(t, [n.e("label-wrapper")]), b(i, [n.e("label"), n.m("align-" + R.value)]), S(i, { width: D(e)(L.value) });
97
- }), x(i, null, 0), d(() => W.value, () => {
98
+ }), x(i, null, 0), d(() => G.value === "left", () => [d(() => W.value, () => {
98
99
  let e = k();
99
100
  return y(() => b(e, [D(F).e("required")])), x(e, null, 0), u(D(n)), e;
100
- }), x(i, null, 1), f("label", { label: () => p.label }, () => {
101
+ }), f("label", { label: () => p.label }, () => {
102
+ let e = A();
103
+ return y(() => C(e, T(p.label))), e;
104
+ })], () => d(() => G.value === "right", () => [f("label", { label: () => p.label }, () => {
101
105
  let e = A();
102
106
  return y(() => C(e, T(p.label))), e;
103
- }), x(i, null, 2), d(() => p.tooltip, () => u(D(s), {
107
+ }), d(() => W.value, () => {
108
+ let e = k();
109
+ return y(() => b(e, [D(F).e("required")])), x(e, null, 0), u(D(n)), e;
110
+ })], null, 2), 518), x(i, null, 1), d(() => p.tooltip, () => u(D(s), {
104
111
  content: () => p.tooltip,
105
112
  mini: ""
106
113
  }, () => {
@@ -109,13 +116,13 @@ var k = w("<span>"), A = w(" "), j = w("<div><label>"), M = w("<div> "), N = w("
109
116
  })), t;
110
117
  }), y(() => {
111
118
  let e = D(F);
112
- b(Z, [e.e("content-wrapper")]), b(Q, [e.e("content")]);
113
- }), x(Q, null, 0), f("default", { validate: () => G }), x(Z, null, 1), d(() => H.value.state === "error", () => {
119
+ b(Q, [e.e("content-wrapper")]), b($, [e.e("content")]);
120
+ }), x($, null, 0), f("default", { validate: () => K }), x(Q, null, 1), d(() => H.value.state === "error", () => {
114
121
  let e = M(), t = E(e);
115
122
  return y(() => {
116
123
  b(e, [D(F).e("error-msg")]), C(t, T(H.value.errorMsg));
117
124
  }), e;
118
- }), X;
125
+ }), Z;
119
126
  }
120
127
  });
121
128
  //#endregion
@@ -12,13 +12,15 @@ var g = f("<form>", 1), _ = /*@__PURE__*/ r({
12
12
  size: {},
13
13
  labelWidth: { default: "100px" },
14
14
  labelPosition: { default: "left" },
15
- labelAlign: {}
15
+ labelAlign: {},
16
+ showRequired: { type: Boolean },
17
+ requiredAlign: {}
16
18
  },
17
19
  emits: ["submit"],
18
20
  setup(r, { expose: f, emit: _ }) {
19
- let v = r, y = _, b = e("form"), { size: x, labelWidth: S, labelPosition: C, labelAlign: w, model: T, rules: E } = p(v), D = h("formRef"), O = (e) => {
21
+ let v = r, y = _, b = e("form"), { size: x, labelWidth: S, labelPosition: C, labelAlign: w, model: T, rules: E, showRequired: D, requiredAlign: O } = p(v), k = h("formRef"), A = (e) => {
20
22
  e.preventDefault(), y("submit", e);
21
- }, k = s([]);
23
+ }, j = s([]);
22
24
  o(t, {
23
25
  model: T,
24
26
  rules: E,
@@ -27,18 +29,20 @@ var g = f("<form>", 1), _ = /*@__PURE__*/ r({
27
29
  labelPosition: C,
28
30
  labelAlign: w,
29
31
  addField: (e) => {
30
- k.value.push(e);
32
+ j.value.push(e);
31
33
  },
32
34
  removeField: (e) => {
33
- e.field && k.value.splice(k.value.indexOf(e), 1);
34
- }
35
+ e.field && j.value.splice(j.value.indexOf(e), 1);
36
+ },
37
+ showRequired: D,
38
+ requiredAlign: O
35
39
  }), i(() => {
36
- D.value?.addEventListener("submit", O);
40
+ k.value?.addEventListener("submit", A);
37
41
  }), a(() => {
38
- D.value?.removeEventListener("submit", O);
42
+ k.value?.removeEventListener("submit", A);
39
43
  }), f({
40
44
  validate: async (e) => {
41
- let t = e && e.length > 0 ? k.value.filter((t) => e.includes(t.field || "")) : k.value, n = {};
45
+ let t = e && e.length > 0 ? j.value.filter((t) => e.includes(t.field || "")) : j.value, n = {};
42
46
  for (let e of t) try {
43
47
  await e.validate("");
44
48
  } catch (e) {
@@ -51,16 +55,16 @@ var g = f("<form>", 1), _ = /*@__PURE__*/ r({
51
55
  return Object.keys(n).length === 0 ? !0 : Promise.reject(n);
52
56
  },
53
57
  resetFields: (e) => {
54
- let t = e && e.length > 0 ? k.value.filter((t) => e.includes(t.field || "")) : k.value;
58
+ let t = e && e.length > 0 ? j.value.filter((t) => e.includes(t.field || "")) : j.value;
55
59
  for (let e of t) e.resetField();
56
60
  },
57
61
  clearValidate: (e) => {
58
- let t = e && e.length > 0 ? k.value.filter((t) => e.includes(t.field || "")) : k.value;
62
+ let t = e && e.length > 0 ? j.value.filter((t) => e.includes(t.field || "")) : j.value;
59
63
  for (let e of t) e.clearValidate();
60
64
  }
61
65
  });
62
- let A = g();
63
- return c(() => l(A, [m(b).b()])), u(A, null, 0), n(), d(A, D, null, "formRef"), A;
66
+ let M = g();
67
+ return c(() => l(M, [m(b).b()])), u(M, null, 0), n(), d(M, k, null, "formRef"), M;
64
68
  }
65
69
  });
66
70
  //#endregion
@@ -14,6 +14,8 @@ export declare const SForm: ((__VLS_props: NonNullable<Awaited<typeof __VLS_setu
14
14
  labelWidth?: string | number | undefined;
15
15
  labelPosition?: "left" | "top" | undefined;
16
16
  labelAlign?: "left" | "right" | undefined;
17
+ showRequired?: boolean | undefined;
18
+ requiredAlign?: "left" | "right" | undefined;
17
19
  onSubmit?: ((e: Event) => any) | undefined;
18
20
  } & (typeof globalThis extends {
19
21
  __VLS_PROPS_FALLBACK: infer P;
@@ -33,6 +35,10 @@ export declare const SFormItem: ((__VLS_props: NonNullable<Awaited<typeof __VLS_
33
35
  label?: (props: {
34
36
  label: string | undefined;
35
37
  }) => any;
38
+ } & {
39
+ label?: (props: {
40
+ label: string | undefined;
41
+ }) => any;
36
42
  } & {
37
43
  default?: (props: {
38
44
  validate: (trigger?: string) => Promise<true | void>;
@@ -48,6 +54,7 @@ export declare const SFormItem: ((__VLS_props: NonNullable<Awaited<typeof __VLS_
48
54
  tooltip?: string | undefined;
49
55
  labelAlign?: "left" | "right" | undefined;
50
56
  showRequired?: boolean | undefined;
57
+ requiredAlign?: "left" | "right" | undefined;
51
58
  } & (typeof globalThis extends {
52
59
  __VLS_PROPS_FALLBACK: infer P;
53
60
  } ? P : {});
@@ -57,6 +64,10 @@ export declare const SFormItem: ((__VLS_props: NonNullable<Awaited<typeof __VLS_
57
64
  label?: (props: {
58
65
  label: string | undefined;
59
66
  }) => any;
67
+ } & {
68
+ label?: (props: {
69
+ label: string | undefined;
70
+ }) => any;
60
71
  } & {
61
72
  default?: (props: {
62
73
  validate: (trigger?: string) => Promise<true | void>;
@@ -17,6 +17,10 @@ export interface FormProps {
17
17
  labelPosition?: "left" | "top";
18
18
  /** 表单项标签对齐方式 */
19
19
  labelAlign?: "left" | "right";
20
+ /** 是否显示必填标识 */
21
+ showRequired?: boolean;
22
+ /** 必填标识对齐方式 */
23
+ requiredAlign?: "left" | "right";
20
24
  }
21
25
  export interface FormEmits {
22
26
  /** 表单提交时触发 */
@@ -45,6 +49,8 @@ export interface FormItemProps {
45
49
  labelAlign?: "left" | "right";
46
50
  /** 是否显示必填标识 */
47
51
  showRequired?: boolean;
52
+ /** 必填标识对齐方式 */
53
+ requiredAlign?: "left" | "right";
48
54
  }
49
55
  export interface FormContext {
50
56
  /** 表单模型 */
@@ -63,6 +69,10 @@ export interface FormContext {
63
69
  labelPosition?: Ref<"left" | "top">;
64
70
  /** 表单项标签对齐方式 */
65
71
  labelAlign?: Ref<"left" | "right" | undefined>;
72
+ /** 是否显示必填标识 */
73
+ showRequired?: Ref<boolean>;
74
+ /** 必填标识对齐方式 */
75
+ requiredAlign?: Ref<"left" | "right" | undefined>;
66
76
  }
67
77
  export declare const formContextKey: InjectionKey<FormContext>;
68
78
  export interface FormItemValidateStatus {
@@ -33,6 +33,7 @@ export declare const SRadioGroup: ((__VLS_props: NonNullable<Awaited<typeof __VL
33
33
  props: PublicProps & {
34
34
  vertical?: boolean | undefined;
35
35
  button?: boolean | undefined;
36
+ block?: boolean | undefined;
36
37
  modelValue?: string | number | boolean | undefined;
37
38
  onChange?: ((value: string | number | boolean) => any) | undefined;
38
39
  "onUpdate:modelValue"?: ((value: string | number | boolean) => any) | undefined;
@@ -8,7 +8,8 @@ var p = l("<div>", 1), m = /*@__PURE__*/ r({
8
8
  __name: "radio-group",
9
9
  props: /*@__PURE__*/ i({
10
10
  vertical: { type: Boolean },
11
- button: { type: Boolean }
11
+ button: { type: Boolean },
12
+ block: { type: Boolean }
12
13
  }, {
13
14
  modelValue: {
14
15
  type: [
@@ -36,7 +37,8 @@ var p = l("<div>", 1), m = /*@__PURE__*/ r({
36
37
  s(y, [
37
38
  e.b(),
38
39
  e.is("vertical", r.vertical),
39
- e.is("button", d(v))
40
+ e.is("button", d(v)),
41
+ e.is("block", r.block)
40
42
  ]);
41
43
  }), c(y, null, 0), n(), y;
42
44
  }
@@ -32,16 +32,17 @@ var b = g("<span></span>"), x = g(" "), S = g("<span>"), C = g("<label><input ty
32
32
  e.target.checked && (k.value = w.value), D?.checked(k.value), T("change", k.value, e);
33
33
  }, M = C(), N = n(M);
34
34
  return l(N, "change", j), u(() => {
35
- let e = v(E), t = A.value;
35
+ let e = v(E), t = A.value, n = o.disabled;
36
36
  d(M, [
37
37
  e.b(),
38
38
  e.m(o.size),
39
39
  e.is("checked", t),
40
- e.is("button", O.value)
41
- ]), d(N, [e.e("input")]), h(N, o.value), p(N, "checked", t);
40
+ e.is("button", O.value),
41
+ e.is("disabled", n)
42
+ ]), d(N, [e.e("input")]), h(N, o.value), p(N, "checked", t), p(N, "disabled", n);
42
43
  }), f(M, null, 1), i(() => !g.check, () => {
43
44
  let e = b();
44
- return u(() => d(e, [v(E).e("inner")])), [e, i(() => o.label, () => {
45
+ return u(() => d(e, [v(E).e("inner")])), [e, i(() => o.label || g.default, () => {
45
46
  let e = S();
46
47
  return u(() => d(e, [v(E).e("label")])), f(e, null, 0), a("default", null, () => {
47
48
  let e = x();
@@ -26,6 +26,8 @@ export interface RadioGroupProps {
26
26
  vertical?: boolean;
27
27
  /** 是否按钮 */
28
28
  button?: boolean;
29
+ /** 是否块级元素,占满父元素宽度 */
30
+ block?: boolean;
29
31
  }
30
32
  export interface RadioGroupEmits {
31
33
  /** 选中状态变化时触发 */
@@ -15,6 +15,7 @@ export declare const STabs: ((__VLS_props: NonNullable<Awaited<typeof __VLS_setu
15
15
  bordered?: boolean | undefined;
16
16
  showArrow?: boolean | undefined;
17
17
  showHeader?: boolean | undefined;
18
+ block?: boolean | undefined;
18
19
  onChange?: ((value: string | number) => any) | undefined;
19
20
  onRemove?: ((value: string | number) => any) | undefined;
20
21
  "onUpdate:modelValue"?: ((value: string | number) => any) | undefined;
@@ -24,7 +24,8 @@ var pe = 200, me = 40, A = /*@__PURE__*/ d({
24
24
  showHeader: {
25
25
  type: Boolean,
26
26
  default: !0
27
- }
27
+ },
28
+ block: { type: Boolean }
28
29
  }, {
29
30
  modelValue: { default: "" },
30
31
  modelModifiers: {}
@@ -44,24 +45,26 @@ var pe = 200, me = 40, A = /*@__PURE__*/ d({
44
45
  let n = H.get(e);
45
46
  n && t.replaceChildren(n);
46
47
  }, W = o(() => {
47
- let e = he.default?.() || [], t = [], n = /* @__PURE__ */ new Set();
48
+ let e = [], t = he.default?.() || [];
49
+ e = Array.isArray(t) ? t : [t];
50
+ let n = [], r = /* @__PURE__ */ new Set();
48
51
  return ((e) => {
49
52
  e.forEach((e) => {
50
- if (ge(e)) {
51
- let r = e.rawProps || {}, i = r.name;
52
- if (i == null || n.has(i)) return;
53
- n.add(i);
54
- let a = r.label, o = _e(e) ? "tab-pane" : "tab";
55
- t.push({
53
+ if (e.vapor && ge(e)) {
54
+ let t = e.rawProps || {}, i = t.name;
55
+ if (i == null || r.has(i)) return;
56
+ r.add(i);
57
+ let a = t.label, o = _e(e) ? "tab-pane" : "tab";
58
+ n.push({
56
59
  name: i,
57
60
  label: a,
58
- disabled: !!r.disabled,
59
- closeable: r.closeable,
61
+ disabled: !!t.disabled,
62
+ closeable: t.closeable,
60
63
  type: o
61
64
  });
62
65
  }
63
66
  });
64
- })(e), t;
67
+ })(e), n;
65
68
  }), be = o(() => W.value.some((e) => e.type === "tab-pane")), xe = o(() => ({
66
69
  left: `${F.value}px`,
67
70
  width: `${I.value}px`
@@ -162,7 +165,8 @@ var pe = 200, me = 40, A = /*@__PURE__*/ d({
162
165
  b(n, [
163
166
  t.e("item"),
164
167
  t.is("active", M.value === r.name),
165
- t.is("disabled", r.disabled)
168
+ t.is("disabled", r.disabled),
169
+ t.is("block", d.block)
166
170
  ]);
167
171
  }), x(n, null, 0), c(() => e.value.label, () => {
168
172
  let t = ue(), n = oe(t);
@@ -18,6 +18,8 @@ export interface TabsProps {
18
18
  showArrow?: boolean;
19
19
  /** 是否隐藏标题栏 */
20
20
  showHeader?: boolean;
21
+ /** 是否块级元素,占满父元素宽度 */
22
+ block?: boolean;
21
23
  }
22
24
  export interface TabsEmits {
23
25
  /** 选中选项卡变化时触发 */
@@ -43,7 +43,15 @@ var I = /*@__PURE__*/ p({
43
43
  if (!t || typeof ResizeObserver > "u") return;
44
44
  z();
45
45
  let n = new ResizeObserver(z);
46
- n.observe(t), e(() => n.disconnect());
46
+ n.observe(t);
47
+ let r = typeof MutationObserver < "u" ? new MutationObserver(z) : void 0;
48
+ r?.observe(t, {
49
+ characterData: !0,
50
+ childList: !0,
51
+ subtree: !0
52
+ }), e(() => {
53
+ n.disconnect(), r?.disconnect();
54
+ });
47
55
  }), k(() => [
48
56
  m.label,
49
57
  m.ellipsis,
@@ -6,6 +6,17 @@
6
6
  display: flex;
7
7
  flex-direction: column;
8
8
  width: 100%;
9
+ border-radius: getCssVar("radius", "medium");
10
+ overflow: hidden;
11
+
12
+ @include when(border) {
13
+ border: 1px solid getCssVar("color", "fill-3");
14
+ @include be(collapse, item) {
15
+ &:last-child {
16
+ border-bottom: none;
17
+ }
18
+ }
19
+ }
9
20
 
10
21
  @include e(item) {
11
22
  border-bottom: 1px solid getCssVar("color", "fill-3");
@@ -30,7 +41,7 @@
30
41
  display: flex;
31
42
  align-items: center;
32
43
  justify-content: space-between;
33
- padding: 12px 20px;
44
+ padding: 12px 16px;
34
45
  cursor: pointer;
35
46
  font-size: 14px;
36
47
  color: getCssVar("color", "text-1");
@@ -32,6 +32,10 @@
32
32
  background-color: getCssVar("color", "fill-2");
33
33
  border-color: getCssVar("color", "fill-2");
34
34
  cursor: not-allowed;
35
+ &:hover {
36
+ background-color: getCssVar("color", "fill-2");
37
+ border-color: getCssVar("color", "fill-2");
38
+ }
35
39
  }
36
40
  @include when(error) {
37
41
  @include this-be(date-picker, wrapper) {
@@ -32,6 +32,10 @@
32
32
  background-color: getCssVar("color", "fill-2");
33
33
  border-color: getCssVar("color", "fill-2");
34
34
  cursor: not-allowed;
35
+ &:hover {
36
+ background-color: getCssVar("color", "fill-2");
37
+ border-color: getCssVar("color", "fill-2");
38
+ }
35
39
  }
36
40
  @include when(error) {
37
41
  @include this-be(datetime-picker, wrapper) {
@@ -1,5 +1,6 @@
1
1
  @use "../mixins/function.scss" as *;
2
2
  @use "../mixins/mixins.scss" as *;
3
+ @use "../common/var.scss" as *;
3
4
 
4
5
  @include b(form) {
5
6
  width: 100%;
@@ -20,30 +21,18 @@
20
21
  }
21
22
  }
22
23
 
23
- @include m(mini) {
24
- @include be(form-item, label-wrapper) {
25
- line-height: getCssVar("size", "mini");
26
- font-size: getCssVar("font-size", "mini");
27
- }
28
- }
29
- @include m(small) {
30
- @include be(form-item, label-wrapper) {
31
- line-height: getCssVar("size", "small");
32
- }
33
- }
34
- @include m(medium) {
35
- @include be(form-item, label-wrapper) {
36
- line-height: getCssVar("size", "medium");
37
- }
38
- }
39
- @include m(large) {
40
- @include be(form-item, label-wrapper) {
41
- line-height: getCssVar("size", "large");
24
+ @each $size in $size-list {
25
+ @include m(#{$size}) {
26
+ @include be(form-item, label-wrapper) {
27
+ line-height: getCssVar("size", "#{$size}");
28
+ font-size: getCssVar("font-size", "#{$size}");
29
+ }
42
30
  }
43
31
  }
44
32
  @include e(label-wrapper) {
45
33
  display: flex;
46
34
  align-items: flex-start;
35
+ line-height: getCssVar("size", "medium");
47
36
  }
48
37
  @include e(label) {
49
38
  display: flex;
@@ -70,6 +59,9 @@
70
59
  font-size: getCssVar("font-size", "medium");
71
60
  height: 14px;
72
61
  color: getCssVar("color", "text-3");
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
73
65
  }
74
66
 
75
67
  @include e(content-wrapper) {
@@ -22,6 +22,10 @@
22
22
  background-color: getCssVar("color", "fill-2");
23
23
  border-color: getCssVar("color", "fill-2");
24
24
  cursor: not-allowed;
25
+ &:hover {
26
+ background-color: getCssVar("color", "fill-2");
27
+ border-color: getCssVar("color", "fill-2");
28
+ }
25
29
  }
26
30
  @include when(error) {
27
31
  @include this-be(input-number, wrapper) {
@@ -25,6 +25,10 @@
25
25
  background-color: getCssVar("color", "fill-2");
26
26
  border-color: getCssVar("color", "fill-2");
27
27
  cursor: not-allowed;
28
+ &:hover {
29
+ background-color: getCssVar("color", "fill-2");
30
+ border-color: getCssVar("color", "fill-2");
31
+ }
28
32
  }
29
33
  @include when(error) {
30
34
  @include this-be(input-tag, wrapper) {
@@ -2,7 +2,6 @@
2
2
  @use "../mixins/mixins.scss" as *;
3
3
 
4
4
  @include b(radio) {
5
- color: getCssVar("color", "text-1");
6
5
  position: relative;
7
6
  cursor: pointer;
8
7
  display: inline-flex;
@@ -19,6 +18,19 @@
19
18
  border-color: getCssVar("color", "primary-6");
20
19
  }
21
20
  }
21
+ @include when(disabled) {
22
+ cursor: not-allowed;
23
+ @include be(radio, inner) {
24
+ cursor: not-allowed;
25
+ border-color: getCssVar("color", "fill-2");
26
+ &:hover {
27
+ border-color: getCssVar("color", "fill-2");
28
+ }
29
+ }
30
+ @include be(radio, label) {
31
+ color: getCssVar("color", "text-2");
32
+ }
33
+ }
22
34
  @include e(input) {
23
35
  opacity: 0;
24
36
  outline: none;
@@ -84,6 +96,7 @@
84
96
  padding: 0 12px;
85
97
  line-height: getCssVar("line-height", "medium");
86
98
  border-radius: calc(getCssVar("radius", "medium") - 1px);
99
+ color: getCssVar("color", "text-1");
87
100
  &:hover {
88
101
  background-color: getCssVar("color", "bg-3");
89
102
  }
@@ -113,4 +126,16 @@
113
126
  gap: 3px;
114
127
  border-radius: getCssVar("radius", "medium");
115
128
  }
129
+
130
+ @include when(block) {
131
+ width: 100%;
132
+
133
+ @include child-b(radio) {
134
+ flex: 1;
135
+ justify-content: center;
136
+ @include be(radio, label) {
137
+ width: 100%;
138
+ }
139
+ }
140
+ }
116
141
  }
@@ -9,17 +9,17 @@
9
9
  flex-direction: column;
10
10
  overflow: hidden;
11
11
  @include m(small) {
12
- @include be(tabs, item) {
12
+ @include be(tabs, header) {
13
13
  height: 32px;
14
14
  }
15
15
  }
16
16
  @include m(medium) {
17
- @include be(tabs, item) {
17
+ @include be(tabs, header) {
18
18
  height: 36px;
19
19
  }
20
20
  }
21
21
  @include m(large) {
22
- @include be(tabs, item) {
22
+ @include be(tabs, header) {
23
23
  height: 40px;
24
24
  }
25
25
  }
@@ -108,6 +108,7 @@
108
108
  }
109
109
 
110
110
  @include e(item) {
111
+ height: 100%;
111
112
  padding: 0 16px;
112
113
  display: flex;
113
114
  align-items: center;
@@ -136,6 +137,10 @@
136
137
  color: getCssVar("color", "text-3");
137
138
  }
138
139
  }
140
+
141
+ @include when(block) {
142
+ flex: 1;
143
+ }
139
144
  }
140
145
 
141
146
  @include e(close-btn) {
@@ -31,6 +31,10 @@
31
31
  background-color: getCssVar("color", "fill-2");
32
32
  border-color: getCssVar("color", "fill-2");
33
33
  cursor: not-allowed;
34
+ &:hover {
35
+ background-color: getCssVar("color", "fill-2");
36
+ border-color: getCssVar("color", "fill-2");
37
+ }
34
38
  }
35
39
  @include when(error) {
36
40
  border-color: getCssVar("color", "danger-6");
@@ -12,6 +12,18 @@
12
12
  }
13
13
  }
14
14
 
15
+ /**
16
+ * 当前元素的直接子级 b
17
+ * @usage @include child-b(button) {}
18
+ * @output > .ns-button {}
19
+ */
20
+ @mixin child-b($block) {
21
+ $sel: #{$namespace}#{$common-separator}#{$block};
22
+ > .#{$sel} {
23
+ @content;
24
+ }
25
+ }
26
+
15
27
  /**
16
28
  * BEM 元素
17
29
  * @param {String | List} $element 元素名称
@@ -788,6 +788,13 @@
788
788
  "s-form/labelAlign": {
789
789
  "description": "表单项标签对齐方式"
790
790
  },
791
+ "s-form/showRequired": {
792
+ "description": "是否显示必填标识",
793
+ "type": "boolean"
794
+ },
795
+ "s-form/requiredAlign": {
796
+ "description": "必填标识对齐方式"
797
+ },
791
798
  "s-form-item/label": {
792
799
  "description": "表单项标签",
793
800
  "type": "string"
@@ -814,6 +821,9 @@
814
821
  "description": "是否显示必填标识",
815
822
  "type": "boolean"
816
823
  },
824
+ "s-form-item/requiredAlign": {
825
+ "description": "必填标识对齐方式"
826
+ },
817
827
  "s-galleria/modelValue": {
818
828
  "description": "当前选中项索引(v-model)",
819
829
  "type": "number"
@@ -1749,6 +1759,10 @@
1749
1759
  "description": "是否按钮",
1750
1760
  "type": "boolean"
1751
1761
  },
1762
+ "s-radio-group/block": {
1763
+ "description": "是否块级元素,占满父元素宽度",
1764
+ "type": "boolean"
1765
+ },
1752
1766
  "s-scrollbar/scroll": {
1753
1767
  "description": "滚动事件"
1754
1768
  },
@@ -2299,6 +2313,10 @@
2299
2313
  "description": "是否隐藏标题栏",
2300
2314
  "type": "boolean"
2301
2315
  },
2316
+ "s-tabs/block": {
2317
+ "description": "是否块级元素,占满父元素宽度",
2318
+ "type": "boolean"
2319
+ },
2302
2320
  "s-tab-pane/name": {
2303
2321
  "description": "选项卡名称",
2304
2322
  "type": "string | number"
@@ -349,7 +349,9 @@
349
349
  "size",
350
350
  "labelWidth",
351
351
  "labelPosition",
352
- "labelAlign"
352
+ "labelAlign",
353
+ "showRequired",
354
+ "requiredAlign"
353
355
  ]
354
356
  },
355
357
  "s-form-item": {
@@ -360,7 +362,8 @@
360
362
  "labelWidth",
361
363
  "tooltip",
362
364
  "labelAlign",
363
- "showRequired"
365
+ "showRequired",
366
+ "requiredAlign"
364
367
  ]
365
368
  },
366
369
  "s-galleria": {
@@ -743,7 +746,8 @@
743
746
  "attributes": [
744
747
  "change",
745
748
  "vertical",
746
- "button"
749
+ "button",
750
+ "block"
747
751
  ]
748
752
  },
749
753
  "s-scrollbar": {
@@ -957,7 +961,8 @@
957
961
  "closeable",
958
962
  "bordered",
959
963
  "showArrow",
960
- "showHeader"
964
+ "showHeader",
965
+ "block"
961
966
  ]
962
967
  },
963
968
  "s-tab-pane": {
@@ -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.13.0",
5
+ "version": "0.13.1",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
@@ -2129,6 +2129,22 @@
2129
2129
  "type": "left | right",
2130
2130
  "kind": "expression"
2131
2131
  }
2132
+ },
2133
+ {
2134
+ "name": "showRequired",
2135
+ "description": "是否显示必填标识",
2136
+ "value": {
2137
+ "type": "boolean",
2138
+ "kind": "expression"
2139
+ }
2140
+ },
2141
+ {
2142
+ "name": "requiredAlign",
2143
+ "description": "必填标识对齐方式",
2144
+ "value": {
2145
+ "type": "left | right",
2146
+ "kind": "expression"
2147
+ }
2132
2148
  }
2133
2149
  ],
2134
2150
  "events": [
@@ -2197,6 +2213,14 @@
2197
2213
  "type": "boolean",
2198
2214
  "kind": "expression"
2199
2215
  }
2216
+ },
2217
+ {
2218
+ "name": "requiredAlign",
2219
+ "description": "必填标识对齐方式",
2220
+ "value": {
2221
+ "type": "left | right",
2222
+ "kind": "expression"
2223
+ }
2200
2224
  }
2201
2225
  ],
2202
2226
  "events": [],
@@ -4586,6 +4610,14 @@
4586
4610
  "type": "boolean",
4587
4611
  "kind": "expression"
4588
4612
  }
4613
+ },
4614
+ {
4615
+ "name": "block",
4616
+ "description": "是否块级元素,占满父元素宽度",
4617
+ "value": {
4618
+ "type": "boolean",
4619
+ "kind": "expression"
4620
+ }
4589
4621
  }
4590
4622
  ],
4591
4623
  "events": [
@@ -5907,6 +5939,14 @@
5907
5939
  "type": "boolean",
5908
5940
  "kind": "expression"
5909
5941
  }
5942
+ },
5943
+ {
5944
+ "name": "block",
5945
+ "description": "是否块级元素,占满父元素宽度",
5946
+ "value": {
5947
+ "type": "boolean",
5948
+ "kind": "expression"
5949
+ }
5910
5950
  }
5911
5951
  ],
5912
5952
  "events": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "savor-ui",
3
- "version": "0.13.1",
3
+ "version": "0.14.0",
4
4
  "description": "A Vue3 Components Library",
5
5
  "keywords": [
6
6
  "component library",