@owocow/saber-ui 0.0.2 → 0.0.4

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 (131) hide show
  1. package/README.md +206 -11
  2. package/dist/BadgeStatus.types.d.ts +1 -1
  3. package/dist/BadgeStatus.vue.d.ts +1 -1
  4. package/dist/SaberConfirmModal.vue_vue_type_script_setup_true_lang-Cqp9krYl.js +86 -0
  5. package/dist/SaberConfirmProvider.vue_vue_type_script_setup_true_lang-DUJ6ftNJ.js +30 -0
  6. package/dist/SaberDictCheckbox.vue_vue_type_script_setup_true_lang-DUbzy_C6.js +34 -0
  7. package/dist/SaberDictRadio.vue_vue_type_script_setup_true_lang-DR6-jSID.js +50 -0
  8. package/dist/SaberDictSelect.vue_vue_type_script_setup_true_lang-B8PTKNKX.js +35 -0
  9. package/dist/SaberDistrictSelect.vue_vue_type_script_setup_true_lang-BX8nLC35.js +257 -0
  10. package/dist/SaberInfo.vue_vue_type_script_setup_true_lang-B3W5VsGR.js +58 -0
  11. package/dist/SaberInfoProvider.vue_vue_type_script_setup_true_lang-3rF6bSCn.js +28 -0
  12. package/dist/SaberModal.vue_vue_type_script_setup_true_lang-DJno3jA3.js +71 -0
  13. package/dist/SaberModalWithMobile.vue_vue_type_script_setup_true_lang-aQlToncY.js +87 -0
  14. package/dist/SaberNoData.types.d.ts +11 -0
  15. package/dist/SaberNoData.vue.d.ts +24 -0
  16. package/dist/SaberPopSelect.vue_vue_type_script_setup_true_lang-BcS27NXI.js +125 -0
  17. package/dist/SaberStatus.vue_vue_type_script_setup_true_lang-D9aRVCow.js +38 -0
  18. package/dist/SaberSwitchBar.vue_vue_type_script_setup_true_lang-CDx3Dcas.js +47 -0
  19. package/dist/SaberUploadImage.vue_vue_type_script_setup_true_lang-CAwci2Vr.js +224 -0
  20. package/dist/colors.d.ts +1 -1
  21. package/dist/components/SaberConfirmModal.mjs +4 -0
  22. package/dist/components/SaberConfirmModal.vue.d.ts +28 -0
  23. package/dist/components/SaberConfirmProvider.mjs +4 -0
  24. package/dist/components/SaberConfirmProvider.vue.d.ts +2 -0
  25. package/dist/components/SaberInfo.mjs +4 -0
  26. package/dist/components/SaberInfo.types.d.ts +14 -0
  27. package/dist/components/SaberInfo.vue.d.ts +21 -0
  28. package/dist/components/SaberInfoProvider.mjs +4 -0
  29. package/dist/components/SaberInfoProvider.vue.d.ts +20 -0
  30. package/dist/components/SaberModalWithMobile.mjs +4 -0
  31. package/dist/components/SaberModalWithMobile.vue.d.ts +36 -0
  32. package/dist/components/SaberStatus.mjs +4 -0
  33. package/dist/components/SaberStatus.types.d.ts +1 -0
  34. package/dist/components/SaberStatus.vue.d.ts +8 -0
  35. package/dist/components/SaberSwitchBar.mjs +4 -0
  36. package/dist/components/SaberSwitchBar.types.d.ts +13 -0
  37. package/dist/components/SaberSwitchBar.vue.d.ts +18 -0
  38. package/dist/components/info-context.d.ts +3 -0
  39. package/dist/composables/index.d.ts +12 -0
  40. package/dist/composables/use-address-parse.d.ts +15 -0
  41. package/dist/composables/use-address-parse.mjs +20 -0
  42. package/dist/composables/use-boolean.d.ts +8 -0
  43. package/dist/composables/use-boolean.mjs +20 -0
  44. package/dist/composables/use-confirm.d.ts +34 -0
  45. package/dist/composables/use-confirm.mjs +28 -0
  46. package/dist/composables/use-delay-unmount.d.ts +7 -0
  47. package/dist/composables/use-delay-unmount.mjs +26 -0
  48. package/dist/composables/use-delete.d.ts +13 -0
  49. package/dist/composables/use-delete.mjs +19 -0
  50. package/dist/composables/use-loading.d.ts +6 -0
  51. package/dist/composables/use-loading.mjs +8 -0
  52. package/dist/composables/use-skeleton.d.ts +5 -0
  53. package/dist/composables/use-skeleton.mjs +23 -0
  54. package/dist/composables/use-table.d.ts +57 -0
  55. package/dist/composables/use-table.mjs +87 -0
  56. package/dist/composables.mjs +21 -0
  57. package/dist/district-service-cOu1tbQG.js +147 -0
  58. package/dist/district.d.ts +3 -0
  59. package/dist/district.mjs +8 -0
  60. package/dist/forms/components/SaberFilterBar.vue.d.ts +41 -0
  61. package/dist/forms/components/SaberFormModal.vue.d.ts +31 -0
  62. package/dist/forms/components/SaberModal.vue.d.ts +34 -0
  63. package/dist/forms/components/fields/SaberDictCheckbox.vue.d.ts +24 -0
  64. package/dist/forms/components/fields/SaberDictRadio.vue.d.ts +24 -0
  65. package/dist/forms/components/fields/SaberDictSelect.vue.d.ts +28 -0
  66. package/dist/forms/components/fields/SaberDistrictSelect.vue.d.ts +31 -0
  67. package/dist/forms/components/fields/SaberInput.vue.d.ts +16 -0
  68. package/dist/forms/components/fields/SaberInputNumber.vue.d.ts +11 -0
  69. package/dist/forms/components/fields/SaberPopSelect.vue.d.ts +25 -0
  70. package/dist/forms/components/fields/SaberRadioGroup.vue.d.ts +11 -0
  71. package/dist/forms/components/fields/SaberSelect.vue.d.ts +11 -0
  72. package/dist/forms/components/fields/SaberTextarea.vue.d.ts +11 -0
  73. package/dist/forms/components/fields/SaberUploadImage.vue.d.ts +113 -0
  74. package/dist/forms/dict-checkbox.mjs +4 -0
  75. package/dist/forms/dict-radio.mjs +4 -0
  76. package/dist/forms/dict-select.mjs +4 -0
  77. package/dist/forms/dict-source.d.ts +3 -0
  78. package/dist/forms/district-select.mjs +4 -0
  79. package/dist/forms/district-service.d.ts +46 -0
  80. package/dist/forms/filter-state.d.ts +4 -0
  81. package/dist/forms/index.d.ts +24 -0
  82. package/dist/forms/plugin.d.ts +20 -0
  83. package/dist/forms/pop-select.mjs +4 -0
  84. package/dist/forms/presets/basic.d.ts +5 -0
  85. package/dist/forms/registry.d.ts +15 -0
  86. package/dist/forms/types.d.ts +102 -0
  87. package/dist/forms/upload-image-source.d.ts +3 -0
  88. package/dist/forms/upload-image.mjs +4 -0
  89. package/dist/forms/use-dict-options.d.ts +8 -0
  90. package/dist/forms.mjs +45 -0
  91. package/dist/index-BealGwXp.js +5020 -0
  92. package/dist/index.d.ts +62 -1
  93. package/dist/index.mjs +122 -33
  94. package/dist/info-context-MfOfJNDT.js +4 -0
  95. package/dist/plugin-Dr3z0YFg.js +396 -0
  96. package/dist/types/api.d.ts +30 -0
  97. package/dist/types/auth.d.ts +54 -0
  98. package/dist/types/common.d.ts +14 -0
  99. package/dist/types/index.d.ts +3 -0
  100. package/dist/types/index.mjs +1 -0
  101. package/dist/upload-image-source-On8NHgmx.js +4 -0
  102. package/dist/use-dict-options-DjtbYYIa.js +38 -0
  103. package/dist/utils/addressParse.d.ts +37 -0
  104. package/dist/utils/addressParse.mjs +623 -0
  105. package/dist/utils/crypto.d.ts +11 -0
  106. package/dist/utils/crypto.mjs +36 -0
  107. package/dist/utils/filter.d.ts +20 -0
  108. package/dist/utils/filter.mjs +11 -0
  109. package/dist/utils/format.d.ts +9 -0
  110. package/dist/utils/format.mjs +7 -0
  111. package/dist/utils/http.d.ts +45 -0
  112. package/dist/utils/http.mjs +147 -0
  113. package/dist/utils/index.d.ts +12 -0
  114. package/dist/utils/index.mjs +41 -0
  115. package/dist/utils/klona.d.ts +2 -0
  116. package/dist/utils/klona.mjs +4 -0
  117. package/dist/utils/nanoid.d.ts +2 -0
  118. package/dist/utils/nanoid.mjs +4 -0
  119. package/dist/utils/permission.d.ts +45 -0
  120. package/dist/utils/permission.mjs +38 -0
  121. package/dist/utils/rsa.d.ts +26 -0
  122. package/dist/utils/rsa.mjs +2073 -0
  123. package/dist/utils/storage.d.ts +29 -0
  124. package/dist/utils/storage.mjs +39 -0
  125. package/dist/utils/toast.d.ts +26 -0
  126. package/dist/utils/toast.mjs +17 -0
  127. package/dist/utils/tree.d.ts +20 -0
  128. package/dist/utils/tree.mjs +30 -0
  129. package/package.json +179 -9
  130. package/dist/index.cjs +0 -1
  131. package/dist/vite.cjs +0 -1
@@ -0,0 +1,257 @@
1
+ import te from "@nuxt/ui/components/Popover.vue";
2
+ import oe from "@nuxt/ui/runtime/vue/components/Icon.vue";
3
+ import le from "@nuxt/ui/components/Input.vue";
4
+ import ne from "@nuxt/ui/components/Button.vue";
5
+ import { defineComponent as ae, useModel as se, ref as x, inject as ie, computed as i, onMounted as ce, watch as K, nextTick as de, openBlock as l, createBlock as g, withCtx as j, createVNode as M, createSlots as re, createElementVNode as f, normalizeClass as k, toDisplayString as b, withModifiers as U, createElementBlock as s, Fragment as z, renderList as B, createCommentVNode as D, mergeModels as Q } from "vue";
6
+ import { D as ue } from "./district-service-cOu1tbQG.js";
7
+ const ve = { class: "w-120 p-2 flex flex-col gap-2" }, me = {
8
+ key: 0,
9
+ class: "max-h-64 overflow-y-auto flex flex-col gap-0.5"
10
+ }, fe = ["onClick"], pe = { class: "flex-1 truncate" }, he = {
11
+ key: 1,
12
+ class: "flex items-center justify-center h-10 text-sm text-muted"
13
+ }, _e = {
14
+ key: 1,
15
+ class: "flex divide-x divide-default border border-default rounded-sm overflow-hidden"
16
+ }, ye = { class: "flex-1 max-h-64 overflow-y-auto py-1 minimal-scrollbar" }, xe = ["onClick"], ge = { class: "truncate" }, ke = { class: "flex-1 max-h-64 overflow-y-auto py-1 minimal-scrollbar" }, be = ["onClick"], Ce = { class: "truncate" }, we = {
17
+ key: 1,
18
+ class: "flex items-center justify-center h-full text-sm text-muted/50 py-4"
19
+ }, Ve = { class: "flex-1 max-h-64 overflow-y-auto py-1 minimal-scrollbar" }, $e = ["onClick"], je = { class: "truncate" }, ze = {
20
+ key: 1,
21
+ class: "flex items-center justify-center h-full text-sm text-muted/50 py-4"
22
+ }, Pe = /* @__PURE__ */ ae({
23
+ name: "SaberDistrictSelect",
24
+ __name: "SaberDistrictSelect",
25
+ props: /* @__PURE__ */ Q({
26
+ districts: {},
27
+ placeholder: { default: "请选择省 / 市 / 区" },
28
+ clearable: { type: Boolean, default: !0 },
29
+ disabled: { type: Boolean, default: !1 },
30
+ loading: { type: Boolean, default: void 0 }
31
+ }, {
32
+ modelValue: { default: void 0 },
33
+ modelModifiers: {}
34
+ }),
35
+ emits: /* @__PURE__ */ Q(["change"], ["update:modelValue"]),
36
+ setup(C, { expose: T, emit: A }) {
37
+ const h = C, L = A, a = se(C, "modelValue"), w = x(!1), P = x(null), u = x(null), c = x(null), _ = x(""), n = ie(ue, void 0), S = i(() => h.districts === void 0), V = i(
38
+ () => h.districts ?? (n == null ? void 0 : n.districts.value) ?? []
39
+ ), $ = i(
40
+ () => h.loading ?? (S.value ? (n == null ? void 0 : n.loading.value) ?? !1 : !1)
41
+ ), G = i(() => $.value ? "行政区加载中..." : h.placeholder);
42
+ async function E() {
43
+ if (!(!S.value || !n || n.districts.value.length))
44
+ try {
45
+ await n.load();
46
+ } catch (t) {
47
+ console.error("[SaberUI] Failed to load district data.", t);
48
+ }
49
+ }
50
+ ce(() => void E()), K(() => h.districts, (t) => {
51
+ t === void 0 && E();
52
+ }), K(w, async (t) => {
53
+ var o, v, p;
54
+ if (!t) {
55
+ _.value = "";
56
+ return;
57
+ }
58
+ if (a.value) {
59
+ const m = V.value.find((y) => {
60
+ var e;
61
+ return y.adcode === ((e = a.value) == null ? void 0 : e.provinceCode);
62
+ }) ?? null;
63
+ u.value = m, c.value = ((o = m == null ? void 0 : m.districts) == null ? void 0 : o.find((y) => {
64
+ var e;
65
+ return y.adcode === ((e = a.value) == null ? void 0 : e.cityCode);
66
+ })) ?? null;
67
+ } else
68
+ u.value = null, c.value = null;
69
+ await de(), (p = (v = P.value) == null ? void 0 : v.input) == null || p.focus();
70
+ });
71
+ const N = i(() => {
72
+ var t;
73
+ return ((t = u.value) == null ? void 0 : t.districts) ?? [];
74
+ }), R = i(() => {
75
+ var t;
76
+ return ((t = c.value) == null ? void 0 : t.districts) ?? [];
77
+ });
78
+ function H(t) {
79
+ u.value = t, c.value = null;
80
+ }
81
+ function J(t) {
82
+ c.value = t;
83
+ }
84
+ function W(t) {
85
+ !u.value || !c.value || O({
86
+ province: u.value.name,
87
+ provinceCode: u.value.adcode,
88
+ city: c.value.name,
89
+ cityCode: c.value.adcode,
90
+ district: t.name,
91
+ districtCode: t.adcode
92
+ });
93
+ }
94
+ const X = i(() => {
95
+ const t = [];
96
+ for (const o of V.value)
97
+ for (const v of o.districts ?? [])
98
+ for (const p of v.districts ?? [])
99
+ t.push({
100
+ label: `${o.name} / ${v.name} / ${p.name}`,
101
+ province: o.name,
102
+ provinceCode: o.adcode,
103
+ city: v.name,
104
+ cityCode: v.adcode,
105
+ district: p.name,
106
+ districtCode: p.adcode
107
+ });
108
+ return t;
109
+ }), F = i(() => {
110
+ const t = _.value.trim();
111
+ return t ? X.value.filter((o) => o.province.includes(t) || o.city.includes(t) || o.district.includes(t)).slice(0, 50) : [];
112
+ });
113
+ function O(t) {
114
+ a.value = t, L("change", t), w.value = !1;
115
+ }
116
+ function Y() {
117
+ a.value = void 0, u.value = null, c.value = null, L("change", void 0);
118
+ }
119
+ const Z = i(() => a.value ? `${a.value.province} / ${a.value.city} / ${a.value.district}` : G.value), q = i(() => a.value != null), ee = i(() => _.value.trim().length > 0);
120
+ return T({
121
+ districts: V,
122
+ loading: $,
123
+ error: i(() => (n == null ? void 0 : n.error.value) ?? null),
124
+ reload: () => n == null ? void 0 : n.load(!0)
125
+ }), (t, o) => {
126
+ const v = ne, p = le, m = oe, y = te;
127
+ return l(), g(y, {
128
+ open: w.value,
129
+ "onUpdate:open": o[3] || (o[3] = (e) => w.value = e),
130
+ content: { align: "start", sideOffset: 4 }
131
+ }, {
132
+ content: j(() => [
133
+ f("div", ve, [
134
+ M(p, {
135
+ ref_key: "searchInputRef",
136
+ ref: P,
137
+ modelValue: _.value,
138
+ "onUpdate:modelValue": o[2] || (o[2] = (e) => _.value = e),
139
+ placeholder: "搜索省 / 市 / 区...",
140
+ ui: { base: "h-9", leadingIcon: "size-4" },
141
+ "leading-icon": "i-solar:minimalistic-magnifer-outline"
142
+ }, null, 8, ["modelValue"]),
143
+ ee.value ? (l(), s("div", me, [
144
+ F.value.length > 0 ? (l(!0), s(z, { key: 0 }, B(F.value, (e) => {
145
+ var d, r;
146
+ return l(), s("div", {
147
+ key: e.districtCode,
148
+ class: k(["flex items-center h-9 px-3 rounded-sm cursor-pointer select-none text-sm hover:bg-muted", ((d = a.value) == null ? void 0 : d.districtCode) === e.districtCode ? "bg-accented/70" : ""]),
149
+ onClick: (I) => O(e)
150
+ }, [
151
+ f("span", pe, b(e.label), 1),
152
+ ((r = a.value) == null ? void 0 : r.districtCode) === e.districtCode ? (l(), g(m, {
153
+ key: 0,
154
+ name: "i-lucide:check",
155
+ class: "size-4 shrink-0 ml-2 text-primary"
156
+ })) : D("", !0)
157
+ ], 10, fe);
158
+ }), 128)) : (l(), s("div", he, "无匹配结果"))
159
+ ])) : (l(), s("div", _e, [
160
+ f("div", ye, [
161
+ (l(!0), s(z, null, B(V.value, (e) => {
162
+ var d, r;
163
+ return l(), s("div", {
164
+ key: e.adcode,
165
+ class: k(["flex items-center justify-between h-9 px-3 cursor-pointer select-none text-sm", ((d = u.value) == null ? void 0 : d.adcode) === e.adcode ? "bg-accented/70" : "hover:bg-muted"]),
166
+ onClick: (I) => H(e)
167
+ }, [
168
+ f("span", ge, b(e.name), 1),
169
+ ((r = u.value) == null ? void 0 : r.adcode) === e.adcode ? (l(), g(m, {
170
+ key: 0,
171
+ name: "i-lucide:chevron-right",
172
+ class: "size-4 shrink-0 ml-1 text-muted"
173
+ })) : D("", !0)
174
+ ], 10, xe);
175
+ }), 128))
176
+ ]),
177
+ f("div", ke, [
178
+ N.value.length > 0 ? (l(!0), s(z, { key: 0 }, B(N.value, (e) => {
179
+ var d, r;
180
+ return l(), s("div", {
181
+ key: e.adcode,
182
+ class: k(["flex items-center justify-between h-9 px-3 cursor-pointer select-none text-sm", ((d = c.value) == null ? void 0 : d.adcode) === e.adcode ? "bg-accented/70" : "hover:bg-muted"]),
183
+ onClick: (I) => J(e)
184
+ }, [
185
+ f("span", Ce, b(e.name), 1),
186
+ ((r = c.value) == null ? void 0 : r.adcode) === e.adcode ? (l(), g(m, {
187
+ key: 0,
188
+ name: "i-lucide:chevron-right",
189
+ class: "size-4 shrink-0 ml-1 text-muted"
190
+ })) : D("", !0)
191
+ ], 10, be);
192
+ }), 128)) : (l(), s("div", we, "请选择省份"))
193
+ ]),
194
+ f("div", Ve, [
195
+ R.value.length > 0 ? (l(!0), s(z, { key: 0 }, B(R.value, (e) => {
196
+ var d, r;
197
+ return l(), s("div", {
198
+ key: e.adcode,
199
+ class: k(["flex items-center justify-between h-9 px-3 cursor-pointer select-none text-sm", ((d = a.value) == null ? void 0 : d.districtCode) === e.adcode ? "bg-accented/70" : "hover:bg-muted"]),
200
+ onClick: (I) => W(e)
201
+ }, [
202
+ f("span", je, b(e.name), 1),
203
+ ((r = a.value) == null ? void 0 : r.districtCode) === e.adcode ? (l(), g(m, {
204
+ key: 0,
205
+ name: "i-lucide:check",
206
+ class: "size-3.5 shrink-0 ml-1 text-primary"
207
+ })) : D("", !0)
208
+ ], 10, $e);
209
+ }), 128)) : (l(), s("div", ze, "请选择城市"))
210
+ ])
211
+ ]))
212
+ ])
213
+ ]),
214
+ default: j(() => [
215
+ M(v, {
216
+ color: "neutral",
217
+ variant: "outline",
218
+ disabled: C.disabled || $.value,
219
+ loading: $.value,
220
+ ui: { base: "rounded-sm justify-between h-10", trailingIcon: "size-4" },
221
+ "trailing-icon": "i-lucide:chevron-down",
222
+ class: "w-full saberButton"
223
+ }, re({
224
+ default: j(() => [
225
+ f("span", {
226
+ class: k(["truncate", q.value ? "" : "text-muted/60 font-normal"])
227
+ }, b(Z.value), 3)
228
+ ]),
229
+ _: 2
230
+ }, [
231
+ q.value && C.clearable ? {
232
+ name: "trailing",
233
+ fn: j(() => [
234
+ M(v, {
235
+ color: "neutral",
236
+ variant: "ghost",
237
+ icon: "i-solar:close-circle-outline",
238
+ ui: { base: "p-1 min-w-0 -mr-1.5", leadingIcon: "size-4" },
239
+ onPointerdown: o[0] || (o[0] = U(() => {
240
+ }, ["stop", "prevent"])),
241
+ onMousedown: o[1] || (o[1] = U(() => {
242
+ }, ["stop", "prevent"])),
243
+ onClick: U(Y, ["stop", "prevent"])
244
+ })
245
+ ]),
246
+ key: "0"
247
+ } : void 0
248
+ ]), 1032, ["disabled", "loading"])
249
+ ]),
250
+ _: 1
251
+ }, 8, ["open"]);
252
+ };
253
+ }
254
+ });
255
+ export {
256
+ Pe as _
257
+ };
@@ -0,0 +1,58 @@
1
+ import y from "@nuxt/ui/components/Tooltip.vue";
2
+ import S from "@nuxt/ui/runtime/vue/components/Icon.vue";
3
+ import { defineComponent as b, inject as k, computed as t, openBlock as r, createElementBlock as B, normalizeStyle as m, normalizeClass as o, createElementVNode as u, toDisplayString as I, createBlock as V, withCtx as w, createVNode as z, createCommentVNode as N, renderSlot as x } from "vue";
4
+ import { S as E } from "./info-context-MfOfJNDT.js";
5
+ const q = /* @__PURE__ */ b({
6
+ name: "SaberInfo",
7
+ __name: "SaberInfo",
8
+ props: {
9
+ label: { default: "" },
10
+ tips: { default: "" },
11
+ leading: {},
12
+ truncate: { type: Boolean },
13
+ lineheight: {},
14
+ mode: {},
15
+ variant: {},
16
+ gap: {}
17
+ },
18
+ setup(l) {
19
+ const a = l, e = k(E, void 0), s = t(() => a.leading ?? (e == null ? void 0 : e.value.leading)), d = t(() => a.truncate ?? (e == null ? void 0 : e.value.truncate) ?? !0), c = t(() => a.mode ?? (e == null ? void 0 : e.value.mode) ?? "default"), v = t(() => a.lineheight ?? (e == null ? void 0 : e.value.lineheight)), i = t(() => a.variant ?? (e == null ? void 0 : e.value.variant) ?? "horizontal"), n = t(() => a.gap ?? (e == null ? void 0 : e.value.gap)), f = t(() => c.value === "muted" ? "text-muted/75" : c.value === "light" ? "text-muted/55" : ""), g = t(() => {
20
+ if (!(i.value !== "vertical" || n.value === void 0))
21
+ return { gap: typeof n.value == "number" ? `${n.value}px` : n.value };
22
+ });
23
+ return (p, L) => {
24
+ const h = S, _ = y;
25
+ return r(), B("dl", {
26
+ class: o(["flex", i.value === "vertical" ? "flex-col" : ["items-start", s.value ? "gap-2" : "gap-3"]]),
27
+ style: m(g.value)
28
+ }, [
29
+ u("dt", {
30
+ class: o(["shrink-0 flex gap-1 items-center", [s.value, f.value]]),
31
+ style: m({ lineHeight: v.value })
32
+ }, [
33
+ u("span", null, I(l.label), 1),
34
+ l.tips ? (r(), V(_, {
35
+ key: 0,
36
+ text: l.tips,
37
+ content: { side: "top" },
38
+ arrow: "",
39
+ "delay-duration": 0
40
+ }, {
41
+ default: w(() => [
42
+ z(h, { name: "i-solar:question-circle-linear" })
43
+ ]),
44
+ _: 1
45
+ }, 8, ["text"])) : N("", !0)
46
+ ], 6),
47
+ u("dd", {
48
+ class: o(["flex-1 min-w-0 break-all", { truncate: d.value }])
49
+ }, [
50
+ x(p.$slots, "default")
51
+ ], 2)
52
+ ], 6);
53
+ };
54
+ }
55
+ });
56
+ export {
57
+ q as _
58
+ };
@@ -0,0 +1,28 @@
1
+ import { defineComponent as r, computed as a, provide as i, renderSlot as p } from "vue";
2
+ import { S as d } from "./info-context-MfOfJNDT.js";
3
+ const s = /* @__PURE__ */ r({
4
+ name: "SaberInfoProvider",
5
+ __name: "SaberInfoProvider",
6
+ props: {
7
+ leading: {},
8
+ truncate: { type: Boolean, default: !0 },
9
+ lineheight: {},
10
+ mode: {},
11
+ variant: {},
12
+ gap: {}
13
+ },
14
+ setup(t) {
15
+ const e = t, n = a(() => ({
16
+ leading: e.leading,
17
+ truncate: e.truncate,
18
+ lineheight: e.lineheight,
19
+ mode: e.mode,
20
+ gap: e.gap,
21
+ variant: e.variant
22
+ }));
23
+ return i(d, n), (o, m) => p(o.$slots, "default");
24
+ }
25
+ });
26
+ export {
27
+ s as _
28
+ };
@@ -0,0 +1,71 @@
1
+ import p from "@nuxt/ui/components/Modal.vue";
2
+ import f from "@nuxt/ui/components/Button.vue";
3
+ import { defineComponent as x, useModel as v, openBlock as t, createBlock as a, withCtx as w, createCommentVNode as o, createElementBlock as i, toDisplayString as r, createElementVNode as y, normalizeClass as h, renderSlot as u, mergeModels as b } from "vue";
4
+ const g = {
5
+ key: 1,
6
+ class: "pt-6 px-7 relative text-sm"
7
+ }, k = {
8
+ key: 0,
9
+ class: "text-xl font-bold mb-4"
10
+ }, C = {
11
+ key: 1,
12
+ class: "text-sm text-muted"
13
+ }, B = {
14
+ key: 2,
15
+ class: "flex items-center justify-between gap-2 py-5 px-7 border-t border-default bg-muted"
16
+ }, z = /* @__PURE__ */ x({
17
+ name: "SaberModal",
18
+ __name: "SaberModal",
19
+ props: /* @__PURE__ */ b({
20
+ title: {},
21
+ description: {},
22
+ width: { default: "w-140" },
23
+ showClose: { type: Boolean, default: !0 }
24
+ }, {
25
+ open: { type: Boolean, default: !0 },
26
+ openModifiers: {}
27
+ }),
28
+ emits: ["update:open"],
29
+ setup(e) {
30
+ const s = v(e, "open");
31
+ return (l, n) => {
32
+ const m = f, c = p;
33
+ return t(), a(c, {
34
+ open: s.value,
35
+ "onUpdate:open": n[1] || (n[1] = (d) => s.value = d),
36
+ close: !1,
37
+ ui: {
38
+ body: "p-0 text-sm sm:p-0 relative",
39
+ content: `rounded-lg overflow-hidden shadow-xs max-w-[95vw] sm:max-w-[90%] ${e.width}`
40
+ }
41
+ }, {
42
+ body: w(() => [
43
+ e.showClose ? (t(), a(m, {
44
+ key: 0,
45
+ variant: "ghost",
46
+ class: "fixed top-3.5 right-3.5 z-10",
47
+ icon: "i-lucide:x",
48
+ ui: { leadingIcon: "size-5" },
49
+ onClick: n[0] || (n[0] = (d) => s.value = !1)
50
+ })) : o("", !0),
51
+ e.title || e.description ? (t(), i("div", g, [
52
+ e.title ? (t(), i("h4", k, r(e.title), 1)) : o("", !0),
53
+ e.description ? (t(), i("p", C, r(e.description), 1)) : o("", !0)
54
+ ])) : o("", !0),
55
+ y("div", {
56
+ class: h(["p-7 pt-3", { "pt-7": e.description || !e.title && !e.description }])
57
+ }, [
58
+ u(l.$slots, "default")
59
+ ], 2),
60
+ l.$slots.footer ? (t(), i("div", B, [
61
+ u(l.$slots, "footer")
62
+ ])) : o("", !0)
63
+ ]),
64
+ _: 3
65
+ }, 8, ["open", "ui"]);
66
+ };
67
+ }
68
+ });
69
+ export {
70
+ z as _
71
+ };
@@ -0,0 +1,87 @@
1
+ import k from "@nuxt/ui/components/Slideover.vue";
2
+ import x from "@nuxt/ui/components/Button.vue";
3
+ import { defineComponent as y, useModel as M, ref as g, computed as C, onMounted as B, onUnmounted as $, openBlock as i, createBlock as r, withCtx as c, createCommentVNode as d, createElementBlock as u, toDisplayString as p, createElementVNode as S, normalizeClass as U, renderSlot as f, mergeModels as E } from "vue";
4
+ import { _ as z } from "./SaberModal.vue_vue_type_script_setup_true_lang-DJno3jA3.js";
5
+ const L = {
6
+ key: 1,
7
+ class: "p-4 text-sm border-0 pb-0"
8
+ }, N = {
9
+ key: 0,
10
+ class: "text-xl font-bold mb-3"
11
+ }, V = {
12
+ key: 1,
13
+ class: "text-sm text-muted"
14
+ }, j = /* @__PURE__ */ y({
15
+ name: "SaberModalWithMobile",
16
+ __name: "SaberModalWithMobile",
17
+ props: /* @__PURE__ */ E({
18
+ title: {},
19
+ description: {},
20
+ width: { default: "w-140" },
21
+ showClose: { type: Boolean, default: !0 },
22
+ mobileBreakpoint: { default: 768 }
23
+ }, {
24
+ open: { type: Boolean, default: !1 },
25
+ openModifiers: {}
26
+ }),
27
+ emits: ["update:open"],
28
+ setup(e) {
29
+ const v = e, o = M(e, "open"), m = g(!1), h = C(() => `(max-width: ${v.mobileBreakpoint - 1}px)`);
30
+ let n = null;
31
+ function a(s) {
32
+ m.value = s.matches;
33
+ }
34
+ return B(() => {
35
+ n = window.matchMedia(h.value), a(n), n.addEventListener("change", a);
36
+ }), $(() => {
37
+ n == null || n.removeEventListener("change", a);
38
+ }), (s, t) => {
39
+ const b = x, w = k;
40
+ return m.value ? (i(), r(w, {
41
+ key: 0,
42
+ open: o.value,
43
+ "onUpdate:open": t[1] || (t[1] = (l) => o.value = l),
44
+ side: "bottom",
45
+ ui: { content: "rounded-t-xl h-[93vh] overflow-y-auto border-t border-default" },
46
+ onClose: t[2] || (t[2] = (l) => o.value = !1)
47
+ }, {
48
+ content: c(() => [
49
+ e.showClose ? (i(), r(b, {
50
+ key: 0,
51
+ variant: "ghost",
52
+ class: "fixed top-[calc(100%-93vh+1rem)] right-3 z-10 border-0",
53
+ icon: "i-lucide:x",
54
+ ui: { leadingIcon: "size-5" },
55
+ onClick: t[0] || (t[0] = (l) => o.value = !1)
56
+ })) : d("", !0),
57
+ e.title || e.description ? (i(), u("div", L, [
58
+ e.title ? (i(), u("h4", N, p(e.title), 1)) : d("", !0),
59
+ e.description ? (i(), u("p", V, p(e.description), 1)) : d("", !0)
60
+ ])) : d("", !0),
61
+ S("div", {
62
+ class: U(["p-4", { "pt-1": e.description || e.title }])
63
+ }, [
64
+ f(s.$slots, "default")
65
+ ], 2)
66
+ ]),
67
+ _: 3
68
+ }, 8, ["open"])) : (i(), r(z, {
69
+ key: 1,
70
+ open: o.value,
71
+ "onUpdate:open": t[3] || (t[3] = (l) => o.value = l),
72
+ title: e.title,
73
+ description: e.description,
74
+ width: e.width,
75
+ "show-close": e.showClose
76
+ }, {
77
+ default: c(() => [
78
+ f(s.$slots, "default")
79
+ ]),
80
+ _: 3
81
+ }, 8, ["open", "title", "description", "width", "show-close"]));
82
+ };
83
+ }
84
+ });
85
+ export {
86
+ j as _
87
+ };
@@ -0,0 +1,11 @@
1
+ export interface SaberNoDataProps {
2
+ /** 是否显示边框,默认 true */
3
+ border?: boolean;
4
+ class?: any;
5
+ /** 图标名,默认 'i-lucide-inbox' */
6
+ icon?: string;
7
+ /** 标题,默认 '暂无数据' */
8
+ title?: string;
9
+ /** 描述文本,默认 '当前列表为空,还没有任何数据' */
10
+ description?: string;
11
+ }
@@ -0,0 +1,24 @@
1
+ import { SaberNoDataProps } from './SaberNoData.types';
2
+ declare function __VLS_template(): {
3
+ attrs: Partial<{}>;
4
+ slots: {
5
+ default?(_: {}): any;
6
+ extra?(_: {}): any;
7
+ };
8
+ refs: {};
9
+ rootEl: HTMLDivElement;
10
+ };
11
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
12
+ declare const __VLS_component: import('vue').DefineComponent<SaberNoDataProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<SaberNoDataProps> & Readonly<{}>, {
13
+ border: boolean;
14
+ icon: string;
15
+ title: string;
16
+ description: string;
17
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
18
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
19
+ export default _default;
20
+ type __VLS_WithTemplateSlots<T, S> = T & {
21
+ new (): {
22
+ $slots: S;
23
+ };
24
+ };
@@ -0,0 +1,125 @@
1
+ import z from "@nuxt/ui/components/Popover.vue";
2
+ import U from "@nuxt/ui/runtime/vue/components/Icon.vue";
3
+ import j from "@nuxt/ui/components/Button.vue";
4
+ import { defineComponent as I, useModel as L, ref as N, useAttrs as O, computed as u, openBlock as r, createBlock as b, withCtx as i, createVNode as _, mergeProps as E, unref as $, createSlots as D, createElementVNode as p, normalizeClass as x, toDisplayString as k, withModifiers as m, createElementBlock as v, Fragment as F, renderList as q, createCommentVNode as G, mergeModels as w } from "vue";
5
+ const H = {
6
+ style: { width: "var(--reka-popper-anchor-width)" },
7
+ class: "p-2 max-h-60 overflow-y-auto flex flex-col gap-0.5"
8
+ }, J = ["onClick"], K = { class: "flex-1 truncate" }, Q = {
9
+ key: 1,
10
+ class: "flex items-center justify-center h-10 text-sm text-muted px-3"
11
+ }, Z = /* @__PURE__ */ I({
12
+ name: "SaberPopSelect",
13
+ inheritAttrs: !1,
14
+ __name: "SaberPopSelect",
15
+ props: /* @__PURE__ */ w({
16
+ items: { default: () => [] },
17
+ placeholder: { default: "请选择" },
18
+ multiple: { type: Boolean, default: !1 },
19
+ clearable: { type: Boolean, default: !0 },
20
+ disabled: { type: Boolean, default: !1 }
21
+ }, {
22
+ modelValue: {},
23
+ modelModifiers: {}
24
+ }),
25
+ emits: /* @__PURE__ */ w(["change"], ["update:modelValue"]),
26
+ setup(s, { emit: A }) {
27
+ const o = s, c = A, t = L(s, "modelValue"), d = N(!1), f = O();
28
+ function h(l) {
29
+ return o.multiple ? Array.isArray(t.value) && t.value.includes(l.value) : t.value === l.value;
30
+ }
31
+ function S(l) {
32
+ if (!l.disabled) {
33
+ if (o.multiple) {
34
+ const e = Array.isArray(t.value) ? [...t.value] : [], n = e.indexOf(l.value);
35
+ n === -1 ? e.push(l.value) : e.splice(n, 1), t.value = e, c("change", e);
36
+ return;
37
+ }
38
+ t.value = l.value, d.value = !1, c("change", l.value);
39
+ }
40
+ }
41
+ function C() {
42
+ const l = o.multiple ? [] : void 0;
43
+ t.value = l, c("change", l);
44
+ }
45
+ const g = u(() => {
46
+ if (o.multiple) {
47
+ const e = Array.isArray(t.value) ? t.value : [];
48
+ return o.items.filter((n) => e.includes(n.value)).map((n) => n.label);
49
+ }
50
+ const l = o.items.find((e) => e.value === t.value);
51
+ return l ? [l.label] : [];
52
+ }), V = u(() => g.value.length > 0 ? g.value.join(", ") : o.placeholder), y = u(() => o.multiple ? Array.isArray(t.value) && t.value.length > 0 : t.value != null && t.value !== ""), B = u(() => {
53
+ const { class: l, ...e } = f;
54
+ return e;
55
+ });
56
+ return (l, e) => {
57
+ const n = j, M = U, P = z;
58
+ return r(), b(P, {
59
+ open: d.value,
60
+ "onUpdate:open": e[2] || (e[2] = (a) => d.value = a),
61
+ content: { align: "start", sideOffset: 4 }
62
+ }, {
63
+ content: i(() => [
64
+ p("div", H, [
65
+ s.items.length > 0 ? (r(!0), v(F, { key: 0 }, q(s.items, (a) => (r(), v("div", {
66
+ key: String(a.value),
67
+ class: x(["flex items-center h-10 px-3 rounded-sm select-none text-sm", [
68
+ a.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer",
69
+ h(a) ? "bg-accented/70" : a.disabled ? "" : "hover:bg-muted"
70
+ ]]),
71
+ onClick: (R) => S(a)
72
+ }, [
73
+ p("span", K, k(a.label), 1),
74
+ h(a) ? (r(), b(M, {
75
+ key: 0,
76
+ name: "i-lucide:check",
77
+ class: "size-4 shrink-0 ml-2"
78
+ })) : G("", !0)
79
+ ], 10, J))), 128)) : (r(), v("div", Q, "暂无数据"))
80
+ ])
81
+ ]),
82
+ default: i(() => [
83
+ _(n, E({
84
+ color: "neutral",
85
+ variant: "outline",
86
+ disabled: s.disabled,
87
+ ui: { base: "rounded-sm justify-between h-10", trailingIcon: "size-4" },
88
+ "trailing-icon": "i-lucide:chevron-down"
89
+ }, B.value, {
90
+ class: $(f).class || "w-full"
91
+ }), D({
92
+ default: i(() => [
93
+ p("span", {
94
+ class: x(["truncate", y.value ? "" : "text-muted/60 font-normal"])
95
+ }, k(V.value), 3)
96
+ ]),
97
+ _: 2
98
+ }, [
99
+ y.value && s.clearable ? {
100
+ name: "trailing",
101
+ fn: i(() => [
102
+ _(n, {
103
+ color: "neutral",
104
+ variant: "ghost",
105
+ icon: "i-solar:close-circle-outline",
106
+ ui: { base: "p-1 min-w-0 -mr-1.5", leadingIcon: "size-4" },
107
+ onPointerdown: e[0] || (e[0] = m(() => {
108
+ }, ["stop", "prevent"])),
109
+ onMousedown: e[1] || (e[1] = m(() => {
110
+ }, ["stop", "prevent"])),
111
+ onClick: m(C, ["stop", "prevent"])
112
+ })
113
+ ]),
114
+ key: "0"
115
+ } : void 0
116
+ ]), 1040, ["disabled", "class"])
117
+ ]),
118
+ _: 1
119
+ }, 8, ["open"]);
120
+ };
121
+ }
122
+ });
123
+ export {
124
+ Z as _
125
+ };