@me-framework/me-ui-antdv-next 0.0.24 → 0.0.26

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 (109) hide show
  1. package/README.md +41 -0
  2. package/dist/base/index.js +0 -0
  3. package/dist/base.css +1 -0
  4. package/dist/base.d.ts +1 -0
  5. package/dist/body/index.js +153 -0
  6. package/dist/{components/body → body}/index.vue.d.ts +3 -3
  7. package/dist/body.css +1 -0
  8. package/dist/box/index.js +170 -0
  9. package/dist/box.css +1 -0
  10. package/dist/breadcrumb/index.js +99 -0
  11. package/dist/breadcrumb.css +1 -0
  12. package/dist/card/index.js +154 -0
  13. package/dist/card.css +1 -0
  14. package/dist/chunks/icon-DdoH0MfT.js +156 -0
  15. package/dist/chunks/input-icon-selector-D5c45QL8.js +227 -0
  16. package/dist/chunks/message-CPHX2tAR.js +290 -0
  17. package/dist/chunks/modal-Dke8ng3P.js +178 -0
  18. package/dist/chunks/rolldown-runtime-DtPi1Y-2.js +13 -0
  19. package/dist/icon/index.js +27 -0
  20. package/dist/icon.css +1 -0
  21. package/dist/index.d.ts +34 -34
  22. package/dist/input-gps/index.js +451 -0
  23. package/dist/input-gps.css +1 -0
  24. package/dist/input-icon-selector/index.js +2 -0
  25. package/dist/input-icon-selector.css +1 -0
  26. package/dist/input-radio/index.js +96 -0
  27. package/dist/{components/input-radio → input-radio}/index.vue.d.ts +3 -3
  28. package/dist/input-radio.css +1 -0
  29. package/dist/load-json/index.js +24405 -0
  30. package/dist/load-json.css +1 -0
  31. package/dist/login-page/index.js +272 -0
  32. package/dist/login-page.css +1 -0
  33. package/dist/me-ui-antdv-next.js +2 -2
  34. package/dist/me-ui-antdv-next.umd.cjs +2 -2
  35. package/dist/menu/index.js +465 -0
  36. package/dist/menu.css +1 -0
  37. package/dist/message/index.js +2 -0
  38. package/dist/message.css +1 -0
  39. package/dist/modal/index.js +2 -0
  40. package/dist/modal.css +1 -0
  41. package/dist/nav/index.js +560 -0
  42. package/dist/nav.css +1 -0
  43. package/dist/resolver/index.d.ts +7 -0
  44. package/dist/resolver/index.js +36 -0
  45. package/dist/resolver/resolver-map.d.ts +6 -0
  46. package/dist/resolver/resolver-type.d.ts +19 -0
  47. package/dist/resolver.d.ts +2 -0
  48. package/dist/shims-vue.d.ts +3 -0
  49. package/dist/skeleton/index.js +141 -0
  50. package/dist/skeleton.css +1 -0
  51. package/dist/{me-ui-antdv-next.css → style.css} +1 -1
  52. package/dist/styles/base.d.ts +0 -0
  53. package/dist/tree-menu/index.js +890 -0
  54. package/dist/tree-menu.css +1 -0
  55. package/package.json +15 -6
  56. package/dist/{components/body → body}/index.d.ts +0 -0
  57. package/dist/{components/body → body}/types.d.ts +0 -0
  58. package/dist/{components/box → box}/index.d.ts +0 -0
  59. package/dist/{components/box → box}/index.vue.d.ts +2 -2
  60. package/dist/{components/box → box}/types.d.ts +0 -0
  61. package/dist/{components/breadcrumb → breadcrumb}/index.d.ts +0 -0
  62. package/dist/{components/breadcrumb → breadcrumb}/index.vue.d.ts +0 -0
  63. package/dist/{components/breadcrumb → breadcrumb}/types.d.ts +0 -0
  64. package/dist/{components/card → card}/index.d.ts +0 -0
  65. package/dist/{components/card → card}/index.vue.d.ts +4 -4
  66. package/dist/{components/card → card}/types.d.ts +0 -0
  67. package/dist/{components/icon → icon}/index.d.ts +0 -0
  68. package/dist/{components/icon → icon}/index.vue.d.ts +2 -2
  69. package/dist/{components/icon → icon}/types.d.ts +0 -0
  70. package/dist/{components/input-gps → input-gps}/index.d.ts +0 -0
  71. package/dist/{components/input-gps → input-gps}/index.vue.d.ts +0 -0
  72. package/dist/{components/input-gps → input-gps}/map.vue.d.ts +0 -0
  73. package/dist/{components/input-gps → input-gps}/types.d.ts +0 -0
  74. package/dist/{components/input-icon-selector → input-icon-selector}/index.d.ts +0 -0
  75. package/dist/{components/input-icon-selector → input-icon-selector}/index.vue.d.ts +5 -5
  76. package/dist/{components/input-icon-selector → input-icon-selector}/types.d.ts +0 -0
  77. package/dist/{components/input-radio → input-radio}/index.d.ts +0 -0
  78. package/dist/{components/input-radio → input-radio}/types.d.ts +0 -0
  79. package/dist/{components/load-json → load-json}/index.d.ts +0 -0
  80. package/dist/{components/load-json → load-json}/index.vue.d.ts +1 -1
  81. package/dist/{components/load-json → load-json}/types.d.ts +0 -0
  82. package/dist/{components/login-page → login-page}/index.d.ts +0 -0
  83. package/dist/{components/login-page → login-page}/index.vue.d.ts +0 -0
  84. package/dist/{components/login-page → login-page}/types.d.ts +0 -0
  85. package/dist/{components/menu → menu}/MenuTreeItem.vue.d.ts +0 -0
  86. package/dist/{components/menu → menu}/index.d.ts +0 -0
  87. package/dist/{components/menu → menu}/index.vue.d.ts +2 -2
  88. package/dist/{components/menu → menu}/types.d.ts +0 -0
  89. package/dist/{components/message → message}/index.d.ts +0 -0
  90. package/dist/{components/message → message}/index.vue.d.ts +4 -4
  91. package/dist/{components/message → message}/types.d.ts +0 -0
  92. package/dist/{components/modal → modal}/index.d.ts +0 -0
  93. package/dist/{components/modal → modal}/index.vue.d.ts +5 -5
  94. package/dist/{components/modal → modal}/types.d.ts +0 -0
  95. package/dist/{components/nav → nav}/composables/useNavDrag.d.ts +0 -0
  96. package/dist/{components/nav → nav}/composables/useNavScroll.d.ts +0 -0
  97. package/dist/{components/nav → nav}/index.d.ts +0 -0
  98. package/dist/{components/nav → nav}/index.vue.d.ts +5 -5
  99. package/dist/{components/nav → nav}/types.d.ts +0 -0
  100. package/dist/{components/skeleton → skeleton}/index.d.ts +0 -0
  101. package/dist/{components/skeleton → skeleton}/index.vue.d.ts +0 -0
  102. package/dist/{components/skeleton → skeleton}/types.d.ts +0 -0
  103. package/dist/{components/tree-menu → tree-menu}/TreeMenuActions.vue.d.ts +0 -0
  104. package/dist/{components/tree-menu → tree-menu}/TreeMenuCard.vue.d.ts +1 -1
  105. package/dist/{components/tree-menu → tree-menu}/TreeMenuEdit.vue.d.ts +2 -2
  106. package/dist/{components/tree-menu → tree-menu}/TreeMenuNode.vue.d.ts +0 -0
  107. package/dist/{components/tree-menu → tree-menu}/index.d.ts +0 -0
  108. package/dist/{components/tree-menu → tree-menu}/index.vue.d.ts +3 -3
  109. /package/dist/{components/tree-menu → tree-menu}/types.d.ts +0 -0
@@ -0,0 +1,560 @@
1
+ import { t as e } from "../chunks/icon-DdoH0MfT.js";
2
+ import { Fragment as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createVNode as s, defineComponent as c, h as l, nextTick as u, normalizeClass as d, normalizeStyle as f, onBeforeUnmount as p, onMounted as m, openBlock as h, ref as g, renderList as _, renderSlot as v, resolveComponent as y, resolveDynamicComponent as b, toDisplayString as x, unref as S, watch as C, withCtx as w, withModifiers as T } from "vue";
3
+ import * as E from "@lucide/vue";
4
+ //#region src/components/nav/composables/useNavScroll.ts
5
+ function ee(e, t) {
6
+ let n = g(0), r = g(!1), i = g(!1), a = g(!1), o = g(!1), s = /* @__PURE__ */ new Set(), c = (e) => {
7
+ o.value = !0, e();
8
+ let t = window.setTimeout(() => {
9
+ o.value = !1, s.delete(t);
10
+ }, 300);
11
+ s.add(t);
12
+ }, l = () => {
13
+ if (!e.value || !t.value) {
14
+ r.value = !1, i.value = !1;
15
+ return;
16
+ }
17
+ let o = e.value.clientWidth, s = t.value.scrollWidth;
18
+ if (s <= o) {
19
+ r.value = !1, i.value = !1, a.value = !1;
20
+ return;
21
+ }
22
+ a.value = !0, r.value = n.value < 0, i.value = s + n.value > o;
23
+ }, u = () => {
24
+ if (!e.value || !t.value) return;
25
+ let r = e.value.clientWidth, i = t.value.scrollWidth;
26
+ if (i <= r) {
27
+ n.value = 0;
28
+ return;
29
+ }
30
+ let a = r - i;
31
+ n.value < a && (n.value = a), n.value > 0 && (n.value = 0);
32
+ };
33
+ return p(() => {
34
+ s.forEach((e) => clearTimeout(e)), s.clear();
35
+ }), {
36
+ translateX: n,
37
+ showLeftArrow: r,
38
+ showRightArrow: i,
39
+ isSmooth: o,
40
+ isScrollable: a,
41
+ withSmooth: c,
42
+ updateArrowVisibility: l,
43
+ clampTranslateX: u,
44
+ scrollLeft: () => {
45
+ c(() => {
46
+ n.value += 200, u(), l();
47
+ });
48
+ },
49
+ scrollRight: () => {
50
+ c(() => {
51
+ n.value -= 200, u(), l();
52
+ });
53
+ },
54
+ canScroll: () => !e.value || !t.value ? !1 : t.value.scrollWidth > e.value.clientWidth
55
+ };
56
+ }
57
+ //#endregion
58
+ //#region src/components/nav/composables/useNavDrag.ts
59
+ function te(e) {
60
+ let { canScroll: t, translateX: n, clampTranslateX: r, updateArrowVisibility: i } = e, a = g(!1), o = 0, s = 0, c = !1, l = 0, u = 0, d = 0, f = null, m = .05, h = () => {
61
+ f !== null && (cancelAnimationFrame(f), f = null);
62
+ }, _ = (e, t) => {
63
+ if (h(), Math.abs(d) < m) return;
64
+ let a = () => {
65
+ if (d *= .95, Math.abs(d) < m) {
66
+ f = null;
67
+ return;
68
+ }
69
+ n.value += d * 16, r(), i();
70
+ let o = e?.clientWidth ?? 0, s = t?.scrollWidth ?? 0;
71
+ if (n.value >= 0 || n.value <= o - s) {
72
+ f = null;
73
+ return;
74
+ }
75
+ f = requestAnimationFrame(a);
76
+ };
77
+ f = requestAnimationFrame(a);
78
+ }, v = (e) => {
79
+ let t = Date.now(), n = t - u;
80
+ n > 0 && (d = (e - l) / n), l = e, u = t;
81
+ }, y = (e) => {
82
+ t() && e.button === 0 && (h(), a.value = !0, c = !1, o = e.clientX, s = n.value, l = e.clientX, u = Date.now(), d = 0, document.addEventListener("mousemove", b), document.addEventListener("mouseup", C));
83
+ }, b = (e) => {
84
+ if (!a.value) return;
85
+ let t = e.clientX - o;
86
+ !c && Math.abs(t) > 5 && (c = !0), v(e.clientX), n.value = s + t, r(), i();
87
+ }, x = null, S = null, C = () => {
88
+ a.value = !1, document.removeEventListener("mousemove", b), document.removeEventListener("mouseup", C), c && _(x, S);
89
+ }, w = (e) => {
90
+ if (!t() || e.touches.length !== 1) return;
91
+ let r = e.touches[0];
92
+ h(), a.value = !0, c = !1, o = r.clientX, s = n.value, l = r.clientX, u = Date.now(), d = 0, document.addEventListener("touchmove", T, { passive: !1 }), document.addEventListener("touchend", E);
93
+ }, T = (e) => {
94
+ if (!a.value || e.touches.length !== 1) return;
95
+ let t = e.touches[0], l = t.clientX - o;
96
+ !c && Math.abs(l) > 5 && (c = !0), c && e.preventDefault(), v(t.clientX), n.value = s + l, r(), i();
97
+ }, E = () => {
98
+ a.value = !1, document.removeEventListener("touchmove", T), document.removeEventListener("touchend", E), c && _(x, S);
99
+ };
100
+ return p(() => {
101
+ h(), document.removeEventListener("mousemove", b), document.removeEventListener("mouseup", C), document.removeEventListener("touchmove", T), document.removeEventListener("touchend", E);
102
+ }), {
103
+ isDragging: a,
104
+ handleDragStart: y,
105
+ handleTouchStart: w,
106
+ setDragRefs: (e, t) => {
107
+ x = e, S = t;
108
+ },
109
+ getHasDragged: () => c,
110
+ resetHasDragged: () => {
111
+ c = !1;
112
+ },
113
+ stopMomentum: h
114
+ };
115
+ }
116
+ //#endregion
117
+ //#region src/components/nav/index.vue?vue&type=script&setup=true&lang.ts
118
+ var ne = {
119
+ key: 0,
120
+ class: "me-nav__slot me-nav__slot--left"
121
+ }, re = {
122
+ key: 0,
123
+ class: "me-nav__fade me-nav__fade--left"
124
+ }, ie = {
125
+ key: 0,
126
+ class: "me-nav__empty"
127
+ }, ae = [
128
+ "aria-selected",
129
+ "tabindex",
130
+ "onClick"
131
+ ], oe = {
132
+ key: 1,
133
+ class: "me-nav__tab-label"
134
+ }, se = {
135
+ key: 1,
136
+ class: "me-nav__tab-title"
137
+ }, ce = ["onClick"], le = {
138
+ key: 1,
139
+ class: "me-nav__fade me-nav__fade--right"
140
+ }, ue = {
141
+ key: 1,
142
+ class: "me-nav__slot me-nav__slot--right"
143
+ }, D = /* @__PURE__ */ c({
144
+ name: "MeNav",
145
+ __name: "index",
146
+ props: {
147
+ tabList: { default: () => [] },
148
+ contextMenu: {
149
+ type: [Array, Function],
150
+ default: void 0
151
+ },
152
+ tabProps: { default: () => ({}) },
153
+ modelValue: { default: "" },
154
+ width: { default: "" },
155
+ scrollTargetOffset: { default: .1 },
156
+ showLockMenu: {
157
+ type: Boolean,
158
+ default: !1
159
+ },
160
+ titleMaxWidth: { default: void 0 },
161
+ keyboard: {
162
+ type: Boolean,
163
+ default: !0
164
+ },
165
+ closable: {
166
+ type: Boolean,
167
+ default: !0
168
+ },
169
+ activeAfterRemove: { default: "prev" },
170
+ builtinMenu: { default: () => [] },
171
+ beforeClose: {
172
+ type: Function,
173
+ default: void 0
174
+ },
175
+ edgeFade: {
176
+ type: Boolean,
177
+ default: !0
178
+ }
179
+ },
180
+ emits: [
181
+ "update:modelValue",
182
+ "tab-change",
183
+ "tab-remove",
184
+ "toggle-lock",
185
+ "scroll",
186
+ "contextmenu",
187
+ "refresh",
188
+ "close-current",
189
+ "close-others",
190
+ "close-left",
191
+ "close-right",
192
+ "close-all"
193
+ ],
194
+ setup(c, { expose: D, emit: O }) {
195
+ let k = c, A = O, j = n(() => k.tabProps.key ?? "path"), M = n(() => k.tabProps.label ?? "title"), N = n(() => k.tabProps.isHome ?? "isHome"), P = n(() => k.tabProps.lock ?? "lock"), F = n(() => k.tabProps.icon ?? "icon"), de = n(() => k.width ? typeof k.width == "number" ? `${k.width}px` : k.width : ""), fe = n(() => k.titleMaxWidth === void 0 ? {} : { maxWidth: typeof k.titleMaxWidth == "number" ? `${k.titleMaxWidth}px` : k.titleMaxWidth }), pe = n(() => k.titleMaxWidth !== void 0), I = (e) => e ? (typeof e == "object" || typeof e == "function") && typeof e != "string" : !1, me = g(null), L = g(null), R = g(null), z = g(k.modelValue), { translateX: B, showLeftArrow: V, showRightArrow: H, isSmooth: U, isScrollable: he, withSmooth: ge, updateArrowVisibility: W, clampTranslateX: G, scrollLeft: _e, scrollRight: ve, canScroll: ye } = ee(L, R), K = null;
196
+ C(B, (e) => {
197
+ K === null && (K = requestAnimationFrame(() => {
198
+ K = null, A("scroll", e);
199
+ }));
200
+ }), p(() => {
201
+ K !== null && cancelAnimationFrame(K);
202
+ });
203
+ let { isDragging: be, handleDragStart: xe, handleTouchStart: Se, setDragRefs: Ce, getHasDragged: we, resetHasDragged: Te } = te({
204
+ canScroll: ye,
205
+ translateX: B,
206
+ clampTranslateX: G,
207
+ updateArrowVisibility: W
208
+ }), q = 0, J = null, Ee = (e) => {
209
+ if (!ye()) return;
210
+ let t = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;
211
+ t !== 0 && (e.preventDefault(), q += t, J === null && (J = requestAnimationFrame(() => {
212
+ J = null, B.value -= q, q = 0, G(), W();
213
+ })));
214
+ };
215
+ p(() => {
216
+ J !== null && cancelAnimationFrame(J);
217
+ });
218
+ let Y = /* @__PURE__ */ new Map(), De = (e, t) => {
219
+ t && t instanceof HTMLElement && Y.set(e, t);
220
+ };
221
+ C(() => k.tabList, (e) => {
222
+ let t = new Set(e.map((e) => e[j.value]));
223
+ for (let e of Y.keys()) t.has(e) || Y.delete(e);
224
+ }, { flush: "post" });
225
+ let Oe = (e) => {
226
+ u(() => {
227
+ let t = Y.get(e);
228
+ if (!t || !L.value || !R.value) return;
229
+ let n = L.value.getBoundingClientRect(), r = t.getBoundingClientRect();
230
+ if (r.left >= n.left && r.right <= n.right) return;
231
+ let i = k.scrollTargetOffset, a = i <= 1 ? n.width * i : i, o;
232
+ o = r.left < n.left ? r.left - n.left - a : r.right - n.right + a, !(Math.abs(o) < 1) && (U.value = !0, requestAnimationFrame(() => {
233
+ requestAnimationFrame(() => {
234
+ B.value -= o, G(), W(), setTimeout(() => {
235
+ U.value = !1;
236
+ }, 300);
237
+ });
238
+ }));
239
+ });
240
+ }, X = (e) => {
241
+ let t = e ?? z.value;
242
+ t && Oe(t);
243
+ }, ke = () => {
244
+ ge(() => {
245
+ B.value = 0, G(), W();
246
+ });
247
+ }, Ae = () => {
248
+ ge(() => {
249
+ !L.value || !R.value || (B.value = L.value.clientWidth - R.value.scrollWidth, G(), W());
250
+ });
251
+ }, Z = (e) => k.closable ? !e[N.value] && !e[P.value] : !1, je = {
252
+ refresh: "RefreshCw",
253
+ "close-current": "X",
254
+ "close-others": "Layers",
255
+ "close-left": "PanelLeftClose",
256
+ "close-right": "PanelRightClose",
257
+ "close-all": "SquareX"
258
+ }, Me = {
259
+ refresh: "刷新当前",
260
+ "close-current": "关闭当前",
261
+ "close-others": "关闭其他",
262
+ "close-left": "关闭左侧",
263
+ "close-right": "关闭右侧",
264
+ "close-all": "关闭全部"
265
+ }, Ne = {
266
+ "toggle-lock": !0,
267
+ refresh: !1,
268
+ "close-current": !1,
269
+ "close-others": !0,
270
+ "close-left": !1,
271
+ "close-right": !0,
272
+ "close-all": !1
273
+ }, Pe = (e, t) => k.contextMenu === void 0 ? [] : typeof k.contextMenu == "function" ? k.contextMenu(e, t) ?? [] : k.contextMenu, Fe = (e, t) => {
274
+ if (e[N.value]) return { items: [] };
275
+ let n = [], r = e[j.value];
276
+ if (k.showLockMenu) {
277
+ let i = e[P.value];
278
+ n.push({
279
+ key: "toggle-lock",
280
+ label: i ? "解锁" : "锁定",
281
+ icon: () => l(E[i ? "LockKeyholeOpen" : "LockKeyhole"], { size: 14 }),
282
+ onClick: () => {
283
+ A("toggle-lock", {
284
+ name: r,
285
+ item: e,
286
+ index: t,
287
+ locked: !i
288
+ });
289
+ }
290
+ });
291
+ }
292
+ k.builtinMenu.length > 0 && (n.length > 0 && n.push({ type: "divider" }), n.length, k.builtinMenu.forEach((i, a) => {
293
+ if (i === "toggle-lock") {
294
+ let o = e[P.value];
295
+ n.push({
296
+ key: "toggle-lock",
297
+ label: o ? "解锁" : "锁定",
298
+ icon: () => l(E[o ? "LockKeyholeOpen" : "LockKeyhole"], { size: 14 }),
299
+ onClick: () => {
300
+ A("toggle-lock", {
301
+ name: r,
302
+ item: e,
303
+ index: t,
304
+ locked: !o
305
+ });
306
+ }
307
+ }), Ne[i] && a < k.builtinMenu.length - 1 && n.push({ type: "divider" });
308
+ return;
309
+ }
310
+ if (i === "close-current" && !Z(e)) return;
311
+ let o = !1;
312
+ i === "close-others" || i === "close-left" || i === "close-right" ? o = k.tabList.filter((e) => !e[N.value] && !e[P.value]).length <= 1 : i === "close-all" && (o = k.tabList.filter((e) => !e[N.value] && !e[P.value]).length === 0), n.push({
313
+ key: i,
314
+ label: Me[i],
315
+ icon: () => l(E[je[i]], { size: 14 }),
316
+ disabled: o,
317
+ onClick: () => {
318
+ A(i, {
319
+ name: r,
320
+ item: e,
321
+ index: t
322
+ });
323
+ }
324
+ }), Ne[i] && a < k.builtinMenu.length - 1 && n.push({ type: "divider" });
325
+ }));
326
+ let i = Pe(e, t);
327
+ return i.length > 0 && (n.length > 0 && n.push({ type: "divider" }), i.forEach((e, t) => {
328
+ e.divided && n.length > 0 && n[n.length - 1].type !== "divider" && n.push({ type: "divider" });
329
+ let r = {
330
+ key: `custom-${t}`,
331
+ label: e.label,
332
+ disabled: e.disabled,
333
+ onClick: () => e.onClick?.()
334
+ };
335
+ e.icon && (r.icon = I(e.icon) ? () => l(e.icon, { size: 14 }) : () => l(E[e.icon], { size: 14 })), n.push(r);
336
+ })), { items: n };
337
+ }, Ie = (e, t, n) => {
338
+ e && A("contextmenu", {
339
+ name: t[j.value],
340
+ item: t,
341
+ index: n,
342
+ event: {}
343
+ });
344
+ }, Le = (e, t) => {
345
+ if (we()) {
346
+ Te();
347
+ return;
348
+ }
349
+ let n = e[j.value];
350
+ if (z.value === n) {
351
+ X(n);
352
+ return;
353
+ }
354
+ z.value = n, A("update:modelValue", n), A("tab-change", {
355
+ name: n,
356
+ item: e,
357
+ index: t
358
+ }), X(n);
359
+ }, Q = async (e, t) => {
360
+ let n = t ?? k.tabList.findIndex((t) => t[j.value] === e), r = k.tabList[n];
361
+ if (r && Z(r)) {
362
+ if (k.beforeClose) try {
363
+ if (await k.beforeClose(r, n) === !1) return;
364
+ } catch {
365
+ return;
366
+ }
367
+ if (A("tab-remove", {
368
+ name: e,
369
+ item: r,
370
+ index: n
371
+ }), z.value === e && k.activeAfterRemove !== "none") {
372
+ let t = k.tabList.filter((t) => t[j.value] !== e);
373
+ if (t.length === 0) return;
374
+ let r;
375
+ if (r = k.activeAfterRemove === "next" ? t[n] ?? t[t.length - 1] : t[Math.max(0, n - 1)] ?? t[0], r) {
376
+ let e = r[j.value], t = k.tabList.findIndex((t) => t[j.value] === e);
377
+ z.value = e, A("update:modelValue", e), A("tab-change", {
378
+ name: e,
379
+ item: r,
380
+ index: t
381
+ });
382
+ }
383
+ }
384
+ }
385
+ }, Re = (e) => {
386
+ if (!k.keyboard || k.tabList.length === 0) return;
387
+ let t = k.tabList.findIndex((e) => e[j.value] === z.value);
388
+ if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
389
+ e.preventDefault();
390
+ let n = t + (e.key === "ArrowRight" ? 1 : -1);
391
+ n < 0 && (n = k.tabList.length - 1), n >= k.tabList.length && (n = 0);
392
+ let r = k.tabList[n];
393
+ if (r) {
394
+ let e = r[j.value];
395
+ z.value = e, A("update:modelValue", e), A("tab-change", {
396
+ name: e,
397
+ item: r,
398
+ index: n
399
+ }), X(e);
400
+ }
401
+ } else if ((e.key === "Delete" || e.key === "Backspace") && t > -1) {
402
+ let e = k.tabList[t];
403
+ e && Z(e) && Q(e[j.value], t);
404
+ }
405
+ };
406
+ C(() => k.modelValue, (e) => {
407
+ z.value = e, X(e);
408
+ }), C(() => k.tabList, () => {
409
+ u(() => {
410
+ X(z.value), W();
411
+ });
412
+ }, {
413
+ flush: "post",
414
+ deep: !0
415
+ }), C(() => k.width, () => {
416
+ u(() => {
417
+ G(), W(), X(z.value);
418
+ });
419
+ });
420
+ let $ = null, ze = () => {
421
+ G(), W(), X(z.value);
422
+ };
423
+ return m(() => {
424
+ Ce(L.value, R.value), u(() => {
425
+ W(), z.value && X(z.value);
426
+ }), typeof ResizeObserver < "u" && L.value && ($ = new ResizeObserver(() => {
427
+ ze();
428
+ }), $.observe(L.value));
429
+ }), p(() => {
430
+ $ &&= ($.disconnect(), null), Y.clear();
431
+ }), D({
432
+ scrollTo: X,
433
+ scrollToStart: ke,
434
+ scrollToEnd: Ae,
435
+ activeItem: n(() => k.tabList.find((e) => e[j.value] === z.value))
436
+ }), (n, l) => {
437
+ let u = y("a-tooltip"), p = y("a-dropdown");
438
+ return h(), a("div", {
439
+ class: "me-nav",
440
+ ref_key: "rootRef",
441
+ ref: me,
442
+ style: f({ width: de.value }),
443
+ role: "tablist",
444
+ onKeydown: Re,
445
+ onContextmenu: l[5] ||= T(() => {}, ["prevent"])
446
+ }, [
447
+ n.$slots.left ? (h(), a("div", ne, [v(n.$slots, "left")])) : i("", !0),
448
+ o("div", {
449
+ class: d(["me-nav__arrow me-nav__arrow--left", { "is-hidden": !S(V) }]),
450
+ role: "button",
451
+ "aria-label": "向左滚动",
452
+ onClick: l[0] ||= (...e) => S(_e) && S(_e)(...e)
453
+ }, [s(e, {
454
+ name: "ChevronLeft",
455
+ size: 14
456
+ })], 2),
457
+ o("div", {
458
+ class: d(["me-nav__scroll", {
459
+ "is-dragging": S(be),
460
+ "is-scrollable": S(he)
461
+ }]),
462
+ ref_key: "scrollRef",
463
+ ref: L,
464
+ onWheel: Ee,
465
+ onMousedown: l[1] ||= (...e) => S(xe) && S(xe)(...e),
466
+ onTouchstartPassive: l[2] ||= (...e) => S(Se) && S(Se)(...e),
467
+ onContextmenu: l[3] ||= T(() => {}, ["prevent"])
468
+ }, [
469
+ c.edgeFade && S(V) ? (h(), a("div", re)) : i("", !0),
470
+ o("div", {
471
+ class: d(["me-nav__list", { "is-smooth": S(U) }]),
472
+ ref_key: "listRef",
473
+ ref: R,
474
+ style: f({ transform: `translateX(${S(B)}px)` })
475
+ }, [c.tabList.length === 0 && n.$slots.empty ? (h(), a("div", ie, [v(n.$slots, "empty")])) : i("", !0), (h(!0), a(t, null, _(c.tabList, (t, c) => (h(), a("div", {
476
+ key: t[j.value],
477
+ class: "me-nav__tab-wrapper"
478
+ }, [s(p, {
479
+ trigger: ["contextmenu"],
480
+ menu: Fe(t, c),
481
+ "prefix-cls": "me-nav-dropdown",
482
+ onOpenChange: (e) => Ie(e, t, c)
483
+ }, {
484
+ default: w(() => [o("div", {
485
+ class: d(["me-nav__tab", { "is-active": z.value === t[j.value] }]),
486
+ ref_for: !0,
487
+ ref: (e) => De(t[j.value], e),
488
+ role: "tab",
489
+ "aria-selected": z.value === t[j.value],
490
+ tabindex: z.value === t[j.value] ? 0 : -1,
491
+ onClick: (e) => Le(t, c)
492
+ }, [n.$slots.tab ? v(n.$slots, "tab", {
493
+ item: t,
494
+ index: c,
495
+ active: z.value === t[j.value],
496
+ close: () => Q(t[j.value])
497
+ }, void 0, void 0, 0) : (h(), a("div", oe, [
498
+ v(n.$slots, "icon", { item: t }, () => [I(t[F.value]) ? (h(), r(b(t[F.value]), {
499
+ key: 0,
500
+ class: "me-nav__tab-icon"
501
+ })) : t[F.value] ? (h(), r(e, {
502
+ key: 1,
503
+ name: t[F.value],
504
+ size: 14,
505
+ class: "me-nav__tab-icon"
506
+ }, null, 8, ["name"])) : i("", !0)]),
507
+ pe.value ? (h(), r(u, {
508
+ key: 0,
509
+ title: t[M.value],
510
+ placement: "top"
511
+ }, {
512
+ default: w(() => [o("span", {
513
+ class: "me-nav__tab-title",
514
+ style: f(fe.value)
515
+ }, x(t[M.value]), 5)]),
516
+ _: 2
517
+ }, 1032, ["title"])) : (h(), a("span", se, x(t[M.value]), 1)),
518
+ t[P.value] ? (h(), r(e, {
519
+ key: 2,
520
+ name: "LockKeyhole",
521
+ size: 12,
522
+ class: "me-nav__tab-lock"
523
+ })) : i("", !0),
524
+ Z(t) ? (h(), a("span", {
525
+ key: 3,
526
+ class: "me-nav__tab-close",
527
+ role: "button",
528
+ "aria-label": "关闭标签",
529
+ onClick: T((e) => Q(t[j.value], c), ["stop"])
530
+ }, [v(n.$slots, "close-icon", { item: t }, () => [s(e, {
531
+ name: "X",
532
+ size: 12
533
+ })])], 8, ce)) : i("", !0)
534
+ ]))], 10, ae)]),
535
+ _: 2
536
+ }, 1032, ["menu", "onOpenChange"])]))), 128))], 6),
537
+ c.edgeFade && S(H) ? (h(), a("div", le)) : i("", !0)
538
+ ], 34),
539
+ o("div", {
540
+ class: d(["me-nav__arrow me-nav__arrow--right", { "is-hidden": !S(H) }]),
541
+ role: "button",
542
+ "aria-label": "向右滚动",
543
+ onClick: l[4] ||= (...e) => S(ve) && S(ve)(...e)
544
+ }, [s(e, {
545
+ name: "ChevronRight",
546
+ size: 14
547
+ })], 2),
548
+ n.$slots.right ? (h(), a("div", ue, [v(n.$slots, "right")])) : i("", !0)
549
+ ], 36);
550
+ };
551
+ }
552
+ });
553
+ //#endregion
554
+ //#region src/components/nav/index.ts
555
+ D.install = (e) => {
556
+ e.component("MeNav", D);
557
+ };
558
+ var O = D;
559
+ //#endregion
560
+ export { D as MeNav, O as default };
package/dist/nav.css ADDED
@@ -0,0 +1 @@
1
+ .me-nav{--me-nav-height:35px;--me-nav-arrow-width:24px;--me-nav-tab-mask:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkCAYAAADvhSSyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbUlEQVR4nO3d4U3CUBSG4beJA9QNcAJhAtnAOoGOwCaOoBvoCDgBOIHdQDbAH7cJMaHtxcJB6/skJ6Thptw/H+cSktOCn5kCc+AWKJtraaxqYA28A8/N9cktgE9ga1n/tBYcqDhw/QtQHfoh0gitgdkpbrzg/N8klvWbKruz5Xa0CbAi/R6TtDMjdbdOF5k3qzBk0j4VRwzazbC9SKN1nbMo9+j4QTo+SvpuA1z2LcoN2nbYXqRR681R7tFR0gAGTQpg0KQABk0KYNCkAAZNCmDQpAAGTQpg0KQABk0KYNCkAAZNCmDQpAAGTQpg0KQABk0KYNCkAAZNGq4kjTRolRM0x31L3Sb0TMLKCZqTiaVu9/QErW+oyAQHp0p9NqRBqnXbgq6glcATdjQpRw1ctb3ZFrQSeAQejr8fabRegbvcxXPScfHcDxCwrL9YK/Y0qILdgwSnpNHfHhWl4ZbAW/O6LEgplHRC/mEtBfgClkhxraFbr7gAAAAASUVORK5CYII=);--me-nav-bg-color:#fff;--me-nav-tab-bg-color:transparent;--me-nav-text-color:#303133;--me-nav-text-color-secondary:#909399;--me-nav-text-color-placeholder:#606266;--me-nav-border-color:#e4e7ed;--me-nav-hover-bg-color:#e4e4e4;--me-nav-hover-text-color:#000;--me-nav-active-text-color:var(--me-color-primary);--me-nav-active-bg-color:var(--me-color-primary-light-9);--me-nav-close-color:#909399;--me-nav-close-active-color:#909399;--me-nav-close-hover-bg:#0000001a;--me-nav-close-hover-color:#303133;height:var(--me-nav-height);background-color:var(--me-nav-bg-color);-webkit-user-select:none;user-select:none;align-items:center;display:flex;overflow:hidden}.me-nav__scroll{flex:1;min-width:0;height:100%;position:relative;overflow:hidden}.me-nav__scroll.is-dragging{-webkit-user-select:none;user-select:none}@media (hover:hover) and (pointer:fine){.me-nav__scroll.is-scrollable .me-nav__list{cursor:grab}.me-nav__scroll.is-dragging .me-nav__list{cursor:grabbing}}.me-nav__fade{pointer-events:none;z-index:2;width:30px;position:absolute;top:0;bottom:0}.me-nav__fade--left{background:linear-gradient(to right, var(--me-nav-bg-color), transparent);left:0}.me-nav__fade--right{background:linear-gradient(to left, var(--me-nav-bg-color), transparent);right:0}.me-nav__empty{width:100%;height:100%;color:var(--me-nav-text-color-secondary);justify-content:center;align-items:center;font-size:13px;display:flex}.me-nav__list{white-space:nowrap;will-change:transform;align-items:center;height:100%;padding-left:15px;display:flex}.me-nav__list.is-smooth{transition:transform .3s}.me-nav__tab-wrapper{flex-shrink:0;align-items:center;height:100%;display:flex}.me-nav__tab-wrapper:not(:first-child){margin-left:-15px}.me-nav__tab-wrapper .ant-dropdown-trigger{align-items:center;height:100%;display:flex}.me-nav__tab{height:var(--me-nav-height);cursor:pointer;isolation:isolate;background-color:var(--me-nav-tab-bg-color);color:var(--me-nav-text-color);flex-shrink:0;justify-content:center;align-items:center;padding:0 20px;font-weight:500;line-height:1;display:flex;position:relative;-webkit-mask:var(--me-nav-tab-mask) no-repeat 0 0/100% 100%!important;-webkit-mask:var(--me-nav-tab-mask) no-repeat 0 0/100% 100%!important;mask:var(--me-nav-tab-mask) no-repeat 0 0/100% 100%!important}.me-nav__tab:before{content:"";z-index:-1;background-color:var(--me-nav-active-bg-color);opacity:0;position:absolute;inset:0}.me-nav__tab:after{content:"";z-index:-1;background-color:var(--me-nav-hover-bg-color);opacity:0;transition:opacity .15s;position:absolute;inset:0}.me-nav__tab.is-active{color:var(--me-nav-active-text-color)}.me-nav__tab.is-active:before{opacity:1}.me-nav__tab.is-active .me-nav__tab-close{opacity:1;width:16px;color:var(--me-nav-close-active-color);margin-left:4px;transform:scale(1)}@media (hover:hover) and (pointer:fine){.me-nav__tab:hover{color:var(--me-nav-hover-text-color);transition:color .15s}.me-nav__tab:hover:after{opacity:1}.me-nav__tab:hover .me-nav__tab-close{opacity:1;width:16px;margin-left:4px;transform:scale(1)}.me-nav__tab.is-active:hover{color:var(--me-nav-active-text-color)}.me-nav__tab.is-active:hover:after{opacity:0}}.me-nav__tab-label{white-space:nowrap;justify-content:center;align-items:center;gap:4px;height:100%;line-height:1;display:flex}.me-nav__tab-icon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.me-nav__tab-title{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;line-height:1;display:inline-block;overflow:hidden}.me-nav__tab-lock{color:var(--me-nav-text-color-secondary);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.me-nav__tab-close{cursor:pointer;width:0;height:16px;color:var(--me-nav-close-color);opacity:0;transform-origin:50%;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-left:0;transition:opacity .15s,transform .15s,width .15s,margin-left .15s;display:inline-flex;overflow:hidden;transform:scale(0)}@media (hover:hover) and (pointer:fine){.me-nav__tab-close:hover{background-color:var(--me-nav-close-hover-bg);color:var(--me-nav-close-hover-color)}}.me-nav__arrow{width:var(--me-nav-arrow-width);cursor:pointer;background-color:var(--me-nav-bg-color);height:100%;color:var(--me-nav-text-color-placeholder);flex-shrink:0;justify-content:center;align-items:center;transition:color .2s,background-color .2s;display:flex}@media (hover:hover) and (pointer:fine){.me-nav__arrow:hover{color:var(--me-color-primary)}}.me-nav__arrow--left{border-right:1px solid var(--me-nav-border-color)}.me-nav__arrow--right{border-left:1px solid var(--me-nav-border-color)}.me-nav__arrow.is-hidden{display:none}.me-nav__slot{background-color:var(--me-nav-bg-color);flex-shrink:0;align-items:center;height:100%;padding:0 10px;display:flex}.me-nav__slot--left{border-right:1px solid var(--me-nav-border-color)}.me-nav__slot--right{border-left:1px solid var(--me-nav-border-color)}html.dark .me-nav{--me-nav-bg-color:#171717;--me-nav-tab-bg-color:transparent;--me-nav-text-color:#b2b2b2;--me-nav-text-color-secondary:#ffffff73;--me-nav-text-color-placeholder:#ffffffa6;--me-nav-border-color:#ffffff1f;--me-nav-hover-bg-color:#323335;--me-nav-hover-text-color:#fff;--me-nav-active-text-color:var(--me-color-primary);--me-nav-active-bg-color:#232935;--me-nav-close-color:#fff;--me-nav-close-active-color:var(--me-color-primary);--me-nav-close-hover-bg:#ffffff1f;--me-nav-close-hover-color:var(--me-color-primary)}html.dark .me-nav-dropdown .me-nav-dropdown-menu{background-color:#171717}html.dark .me-nav-dropdown .me-nav-dropdown-menu-item{color:#ffffffa6}html.dark .me-nav-dropdown .me-nav-dropdown-menu-item:hover,html.dark .me-nav-dropdown .me-nav-dropdown-menu-item.me-nav-dropdown-menu-item-active{color:var(--me-color-primary);background-color:#1a1e29}html.dark .me-nav-dropdown .me-nav-dropdown-menu-item.me-nav-dropdown-menu-item-disabled{color:#ffffff40}html.dark .me-nav-dropdown .me-nav-dropdown-menu-item.me-nav-dropdown-menu-item-disabled:hover,html.dark .me-nav-dropdown .me-nav-dropdown-menu-item.me-nav-dropdown-menu-item-disabled.me-nav-dropdown-menu-item-active{color:#ffffff40;background-color:#0000}html.dark .me-nav-dropdown .me-nav-dropdown-menu-item-divider{background-color:#ffffff1f}
@@ -0,0 +1,7 @@
1
+ import { MeUiAntdvResolverOptions, MeUiAntdvResolverReturn } from './resolver-type';
2
+ /**
3
+ * 生成 unplugin-vue-components 风格的 Resolver 对象。
4
+ * @param options 配置项(预留)
5
+ */
6
+ export declare function MeUiAntdvResolver(_options?: MeUiAntdvResolverOptions): MeUiAntdvResolverReturn;
7
+ export type { MeUiAntdvResolverOptions, MeUiAntdvResolverReturn } from './resolver-type';
@@ -0,0 +1,36 @@
1
+ //#region src/resolver/resolver-map.ts
2
+ var e = {
3
+ MeMessage: "message",
4
+ MeIcon: "icon",
5
+ MeBox: "box",
6
+ MeBreadcrumb: "breadcrumb",
7
+ MeBody: "body",
8
+ MeMenu: "menu",
9
+ MeNav: "nav",
10
+ MeModal: "modal",
11
+ MeTreeMenu: "tree-menu",
12
+ MeInputGps: "input-gps",
13
+ MeInputIconSelector: "input-icon-selector",
14
+ MeInputRadio: "input-radio",
15
+ MeLoadJson: "load-json",
16
+ MeLoginPage: "login-page",
17
+ MeCard: "card",
18
+ MeSkeleton: "skeleton"
19
+ };
20
+ //#endregion
21
+ //#region src/resolver/index.ts
22
+ function t(t = {}) {
23
+ return {
24
+ type: "component",
25
+ getResolve: () => (t) => {
26
+ let n = e[t];
27
+ if (n) return {
28
+ name: t.replace(/^Me/, ""),
29
+ from: `@me-framework/me-ui-antdv-next/${n}`,
30
+ sideEffects: ["@me-framework/me-ui-antdv-next/base.css", `@me-framework/me-ui-antdv-next/${n}/style.css`]
31
+ };
32
+ }
33
+ };
34
+ }
35
+ //#endregion
36
+ export { t as MeUiAntdvResolver };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 组件名(MeXxx)→ 组件目录(kebab)映射,供按需 Resolver 与子路径导入使用。
3
+ * 组件名到目录并非纯规则可推导(如 MeInputGps → input-gps),故维护显式映射。
4
+ * 新增组件时需同步在此登记。
5
+ */
6
+ export declare const componentDirMap: Record<string, string>;
@@ -0,0 +1,19 @@
1
+ /** MeUiAntdvResolver 配置项(当前预留,便于后续扩展) */
2
+ export interface MeUiAntdvResolverOptions {
3
+ /** 是否默认注入 base.css(设计 token 基线,按需必选)。默认 true */
4
+ importBase?: boolean;
5
+ }
6
+ /** Resolver.resolve 返回的单一解析结果 */
7
+ export interface MeUiAntdvResolvedComponent {
8
+ /** 组件注册名(去掉 Me 前缀后的驼峰名),例 MeInputGps → InputGps */
9
+ name: string;
10
+ /** 组件来源子路径(default export 即组件) */
11
+ from: string;
12
+ /** 需一并引入的样式副作用 */
13
+ sideEffects: string[];
14
+ }
15
+ /** unplugin-vue-components 兼容的 Resolver 对象形状 */
16
+ export interface MeUiAntdvResolverReturn {
17
+ type: 'component';
18
+ getResolve: () => (name: string) => MeUiAntdvResolvedComponent | undefined;
19
+ }
@@ -0,0 +1,2 @@
1
+ export * from './resolver/index.js'
2
+ export {}
@@ -1,3 +1,6 @@
1
+ // 由 vite.config.ts 的 define 注入(值为 package.json 的 version)
2
+ declare const __ME_UI_VERSION__: string
3
+
1
4
  declare module '*.vue' {
2
5
  import type { DefineComponent } from 'vue'
3
6
  const component: DefineComponent<{}, {}, any>