workdesktop-ai 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +190 -190
- package/dist/chunks/Path-pIP0JQ0c.mjs +245 -0
- package/dist/chunks/Path-pIP0JQ0c.mjs.map +1 -0
- package/dist/chunks/Station-BTP0SbBg.mjs +818 -0
- package/dist/chunks/Station-BTP0SbBg.mjs.map +1 -0
- package/dist/index.esm.js +2 -2
- package/dist/index.umd.js +19 -19
- package/dist/index.umd.js.map +1 -1
- package/dist/path/index.mjs +1 -1
- package/dist/path/style.css +1 -1
- package/dist/station/index.mjs +1 -1
- package/dist/station/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +134 -0
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +169 -0
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +167 -0
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +186 -0
- package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +180 -0
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +122 -0
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +66 -0
- package/dist/types/src/components/buttons/useApiAction.d.ts +20 -0
- package/dist/types/src/components/common/props.d.ts +122 -0
- package/dist/types/src/components/containers/Drawer.vue.d.ts +172 -0
- package/dist/types/src/components/containers/Iframe.vue.d.ts +81 -0
- package/dist/types/src/components/containers/containerContext.d.ts +15 -0
- package/dist/types/src/components/containers/useContainerController.d.ts +24 -0
- package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
- package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +542 -0
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +62 -0
- package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
- package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
- package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
- package/dist/types/src/components/form/SearchPanel.vue.d.ts +167 -0
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +311 -0
- package/dist/types/src/components/index.d.ts +32 -0
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/Select.vue.d.ts +176 -0
- package/dist/types/src/components/inputs/Switch.vue.d.ts +116 -0
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +32 -0
- package/dist/types/src/components/layout/Station.vue.d.ts +313 -0
- package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
- package/dist/types/src/components/layout/types.d.ts +67 -0
- package/dist/types/src/components/styles/Panel.vue.d.ts +94 -0
- package/dist/types/src/components/styles/Path.vue.d.ts +103 -0
- package/dist/types/src/components/styles/Tips.vue.d.ts +60 -0
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +176 -0
- package/dist/types/src/components/upload/Upload.vue.d.ts +235 -0
- package/dist/types/src/entries/api-button.d.ts +9 -0
- package/dist/types/src/entries/auto-complete.d.ts +9 -0
- package/dist/types/src/entries/checkbox-list.d.ts +9 -0
- package/dist/types/src/entries/components-map.d.ts +8 -0
- package/dist/types/src/entries/confirm-button.d.ts +9 -0
- package/dist/types/src/entries/data-form.d.ts +9 -0
- package/dist/types/src/entries/data-grid.d.ts +9 -0
- package/dist/types/src/entries/dialog-button.d.ts +9 -0
- package/dist/types/src/entries/drawer-button.d.ts +9 -0
- package/dist/types/src/entries/drawer.d.ts +9 -0
- package/dist/types/src/entries/editable-grid.d.ts +9 -0
- package/dist/types/src/entries/form-item.d.ts +9 -0
- package/dist/types/src/entries/iframe.d.ts +9 -0
- package/dist/types/src/entries/image-upload.d.ts +9 -0
- package/dist/types/src/entries/panel.d.ts +9 -0
- package/dist/types/src/entries/path.d.ts +9 -0
- package/dist/types/src/entries/prompt-button.d.ts +9 -0
- package/dist/types/src/entries/radio-list.d.ts +9 -0
- package/dist/types/src/entries/requester.d.ts +9 -0
- package/dist/types/src/entries/route-button.d.ts +9 -0
- package/dist/types/src/entries/search-item.d.ts +9 -0
- package/dist/types/src/entries/search-panel.d.ts +9 -0
- package/dist/types/src/entries/select.d.ts +9 -0
- package/dist/types/src/entries/station.d.ts +9 -0
- package/dist/types/src/entries/switch.d.ts +9 -0
- package/dist/types/src/entries/tips-button.d.ts +9 -0
- package/dist/types/src/entries/tips.d.ts +9 -0
- package/dist/types/src/entries/upload.d.ts +9 -0
- package/dist/types/src/entries/viewer.d.ts +9 -0
- package/dist/types/src/index.d.ts +24 -0
- package/dist/types/src/lib/composables/useConfig.d.ts +19 -0
- package/dist/types/src/lib/composables/useDataGrid.d.ts +69 -0
- package/dist/types/src/lib/composables/useEventBus.d.ts +16 -0
- package/dist/types/src/lib/composables/useGlobalState.d.ts +5 -0
- package/dist/types/src/lib/composables/useRequest.d.ts +42 -0
- package/dist/types/src/lib/configs/default-config.d.ts +6 -0
- package/dist/types/src/lib/core/config.d.ts +28 -0
- package/dist/types/src/lib/core/http.d.ts +100 -0
- package/dist/types/src/lib/core/linkage.d.ts +48 -0
- package/dist/types/src/lib/core/skins/apple.d.ts +3 -0
- package/dist/types/src/lib/core/skins/business.d.ts +3 -0
- package/dist/types/src/lib/core/skins/chinese.d.ts +3 -0
- package/dist/types/src/lib/core/skins/cool.d.ts +3 -0
- package/dist/types/src/lib/core/skins/cyberpunk.d.ts +3 -0
- package/dist/types/src/lib/core/skins/default.d.ts +3 -0
- package/dist/types/src/lib/core/skins/fashion.d.ts +3 -0
- package/dist/types/src/lib/core/skins/flat.d.ts +3 -0
- package/dist/types/src/lib/core/skins/governance.d.ts +3 -0
- package/dist/types/src/lib/core/skins/index.d.ts +15 -0
- package/dist/types/src/lib/core/skins/tech.d.ts +3 -0
- package/dist/types/src/lib/core/skins/types.d.ts +19 -0
- package/dist/types/src/lib/core/station-linkage.d.ts +72 -0
- package/dist/types/src/lib/core/theme.d.ts +11 -0
- package/dist/types/src/lib/core/utils.d.ts +28 -0
- package/dist/types/src/lib/install.d.ts +11 -0
- package/dist/types/src/types/config.d.ts +130 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/vite.config.d.ts +7 -0
- package/package.json +7 -2
- package/dist/chunks/Path-C_oyo6Dg.mjs +0 -200
- package/dist/chunks/Path-C_oyo6Dg.mjs.map +0 -1
- package/dist/chunks/Station-DLV19USa.mjs +0 -780
- package/dist/chunks/Station-DLV19USa.mjs.map +0 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { defineComponent as ce, getCurrentInstance as le, computed as g, ref as S, watch as y, onMounted as ue, onUnmounted as se, resolveComponent as E, openBlock as c, createElementBlock as P, createVNode as me, withCtx as h, createBlock as s, TransitionGroup as de, Fragment as z, renderList as G, normalizeClass as U, resolveDynamicComponent as Y, createCommentVNode as K, createTextVNode as Q, toDisplayString as X } from "vue";
|
|
2
|
+
import * as fe from "@element-plus/icons-vue";
|
|
3
|
+
import { f as pe } from "./props-DAytpx7D.mjs";
|
|
4
|
+
import { b as Z, g as he } from "./station-linkage-D54-_iyL.mjs";
|
|
5
|
+
import { _ as ve } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
|
|
6
|
+
const ge = ["data-animation"], ye = /* @__PURE__ */ ce({
|
|
7
|
+
name: "WdPath",
|
|
8
|
+
__name: "Path",
|
|
9
|
+
props: {
|
|
10
|
+
...pe,
|
|
11
|
+
/** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */
|
|
12
|
+
mode: { type: String, default: "manual" },
|
|
13
|
+
/** 手动模式路径节点(PathItem[],支持 JSON 字符串) */
|
|
14
|
+
items: { type: [Array, String], default: void 0 },
|
|
15
|
+
/** 自动模式:首页节点标题 */
|
|
16
|
+
home: { type: String, default: "首页" },
|
|
17
|
+
/** 自动模式:是否显示首页节点 */
|
|
18
|
+
showHome: { type: Boolean, default: !0 },
|
|
19
|
+
/** 分隔符 */
|
|
20
|
+
separator: { type: String, default: "/" },
|
|
21
|
+
/** 路径内容(路径段)变动时的动画:none=无 / fade=淡入淡出 / slide=横向滑移+淡入 */
|
|
22
|
+
animation: { type: String, default: "none" },
|
|
23
|
+
/** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */
|
|
24
|
+
container: { type: [String, Object], default: void 0 }
|
|
25
|
+
},
|
|
26
|
+
emits: ["change", "item-click"],
|
|
27
|
+
setup(m, { expose: ee, emit: te }) {
|
|
28
|
+
const n = m, A = te, l = le(), I = g(() => {
|
|
29
|
+
var t, a;
|
|
30
|
+
const e = (a = (t = l == null ? void 0 : l.appContext) == null ? void 0 : t.config) == null ? void 0 : a.globalProperties;
|
|
31
|
+
return !!(e != null && e.$router);
|
|
32
|
+
});
|
|
33
|
+
function ne() {
|
|
34
|
+
if (!n.items) return [];
|
|
35
|
+
if (typeof n.items == "string")
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(n.items);
|
|
38
|
+
} catch (e) {
|
|
39
|
+
return console.error("[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:", e), [];
|
|
40
|
+
}
|
|
41
|
+
return n.items;
|
|
42
|
+
}
|
|
43
|
+
const C = S(null), N = S([]), _ = S([]), v = S(-1);
|
|
44
|
+
function B() {
|
|
45
|
+
var a;
|
|
46
|
+
const e = (a = l == null ? void 0 : l.proxy) == null ? void 0 : a.$el;
|
|
47
|
+
if (n.container) {
|
|
48
|
+
if (typeof n.container == "string") {
|
|
49
|
+
const r = document.querySelector(n.container);
|
|
50
|
+
if (r) return r;
|
|
51
|
+
} else if (n.container.nodeType === 1)
|
|
52
|
+
return n.container;
|
|
53
|
+
}
|
|
54
|
+
return (e == null ? void 0 : e.closest(".wd-station__content")) || document.body;
|
|
55
|
+
}
|
|
56
|
+
function oe() {
|
|
57
|
+
const e = C.value || document.body, t = [];
|
|
58
|
+
return e.querySelectorAll("h1,h2,h3,h4").forEach((a) => {
|
|
59
|
+
const r = (a.textContent || "").trim();
|
|
60
|
+
r && t.push({ el: a, level: Number(a.tagName.charAt(1)), title: r });
|
|
61
|
+
}), t;
|
|
62
|
+
}
|
|
63
|
+
function R(e) {
|
|
64
|
+
return e.map((t) => `${t.level}:${t.title}`).join("|");
|
|
65
|
+
}
|
|
66
|
+
function ae(e, t) {
|
|
67
|
+
const a = [];
|
|
68
|
+
for (let r = 0; r <= t; r++) {
|
|
69
|
+
const i = e[r];
|
|
70
|
+
for (; a.length && a[a.length - 1].level >= i.level; ) a.pop();
|
|
71
|
+
a.push(i);
|
|
72
|
+
}
|
|
73
|
+
return a.map((r) => ({ title: r.title, source: "heading", level: r.level }));
|
|
74
|
+
}
|
|
75
|
+
function T(e) {
|
|
76
|
+
return e === document.body || e === document.documentElement;
|
|
77
|
+
}
|
|
78
|
+
function H() {
|
|
79
|
+
const e = _.value;
|
|
80
|
+
if (!e.length) return -1;
|
|
81
|
+
const t = C.value || document.body, a = t.getBoundingClientRect(), r = T(t) ? window.scrollY || document.documentElement.scrollTop : t.scrollTop;
|
|
82
|
+
let i = e.length - 1;
|
|
83
|
+
for (let o = 0; o < e.length; o++)
|
|
84
|
+
if (e[o].el.getBoundingClientRect().top - a.top + r >= r - 1) {
|
|
85
|
+
i = o;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
return i;
|
|
89
|
+
}
|
|
90
|
+
function b() {
|
|
91
|
+
N.value = he(!0, n.filter).map((e) => ({
|
|
92
|
+
...e,
|
|
93
|
+
source: "menu"
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
function M() {
|
|
97
|
+
const e = oe();
|
|
98
|
+
R(e) !== R(_.value) && (_.value = e);
|
|
99
|
+
const t = H();
|
|
100
|
+
t !== v.value && (v.value = t);
|
|
101
|
+
}
|
|
102
|
+
function d() {
|
|
103
|
+
if (n.mode !== "auto") {
|
|
104
|
+
x();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
b(), M(), x();
|
|
108
|
+
}
|
|
109
|
+
const re = g(() => {
|
|
110
|
+
const e = _.value;
|
|
111
|
+
return e.length ? v.value >= 0 ? ae(e, v.value) : [] : [];
|
|
112
|
+
}), k = g(() => n.mode === "auto" ? [...n.showHome ? [{ title: n.home, source: "home" }] : [], ...N.value, ...re.value] : ne().map((e) => ({ ...e, source: e.source || "manual" }))), O = g(
|
|
113
|
+
() => k.value.map((e, t) => ({ ...e, key: `${e.source || "seg"}:${t}:${e.title}` }))
|
|
114
|
+
);
|
|
115
|
+
let W = "";
|
|
116
|
+
function x() {
|
|
117
|
+
const e = k.value.map((t) => `${t.level ?? ""}:${t.title}`).join("|");
|
|
118
|
+
e !== W && (W = e, A("change", k.value));
|
|
119
|
+
}
|
|
120
|
+
y(k, () => x());
|
|
121
|
+
let $ = !1;
|
|
122
|
+
function L() {
|
|
123
|
+
n.mode !== "auto" || $ || ($ = !0, requestAnimationFrame(() => {
|
|
124
|
+
$ = !1, n.mode === "auto" && (v.value = H());
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
let f = null, p = null;
|
|
128
|
+
function V(e) {
|
|
129
|
+
j(), C.value = e, p = T(e) ? window : e, p.addEventListener("scroll", L, { passive: !0 }), typeof MutationObserver < "u" && (f = new MutationObserver((t) => {
|
|
130
|
+
if (n.mode !== "auto") return;
|
|
131
|
+
t.some((r) => {
|
|
132
|
+
const i = r.target;
|
|
133
|
+
return !(i && typeof i.closest == "function" && i.closest(".wd-path"));
|
|
134
|
+
}) && M();
|
|
135
|
+
}), f.observe(e, { childList: !0, subtree: !0 }));
|
|
136
|
+
}
|
|
137
|
+
function j() {
|
|
138
|
+
C.value = null, p == null || p.removeEventListener("scroll", L), p = null, f == null || f.disconnect(), f = null;
|
|
139
|
+
}
|
|
140
|
+
function q(e) {
|
|
141
|
+
A("item-click", e);
|
|
142
|
+
}
|
|
143
|
+
function w(e) {
|
|
144
|
+
return e ? typeof e == "string" ? fe[e] || null : e : null;
|
|
145
|
+
}
|
|
146
|
+
let u = null;
|
|
147
|
+
function D() {
|
|
148
|
+
n.mode === "auto" && (u = Z(n.filter, b), V(B()), d());
|
|
149
|
+
}
|
|
150
|
+
function F() {
|
|
151
|
+
j(), u == null || u(), u = null;
|
|
152
|
+
}
|
|
153
|
+
ue(() => {
|
|
154
|
+
D(), d();
|
|
155
|
+
}), y(
|
|
156
|
+
() => n.mode,
|
|
157
|
+
(e) => {
|
|
158
|
+
e === "auto" ? D() : (F(), d());
|
|
159
|
+
}
|
|
160
|
+
), y(
|
|
161
|
+
() => n.filter,
|
|
162
|
+
() => {
|
|
163
|
+
n.mode === "auto" && (u == null || u(), u = Z(n.filter, b), b());
|
|
164
|
+
}
|
|
165
|
+
), y(
|
|
166
|
+
() => n.container,
|
|
167
|
+
() => {
|
|
168
|
+
n.mode === "auto" && V(B()), d();
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
const ie = g(() => {
|
|
172
|
+
var e, t;
|
|
173
|
+
return (t = (e = l == null ? void 0 : l.proxy) == null ? void 0 : e.$route) == null ? void 0 : t.path;
|
|
174
|
+
});
|
|
175
|
+
return y(ie, () => {
|
|
176
|
+
n.mode === "auto" && d();
|
|
177
|
+
}), se(() => F()), ee({ refresh: d }), (e, t) => {
|
|
178
|
+
const a = E("el-icon"), r = E("el-breadcrumb-item"), i = E("el-breadcrumb");
|
|
179
|
+
return c(), P("div", {
|
|
180
|
+
class: "wd-path",
|
|
181
|
+
"data-animation": m.animation
|
|
182
|
+
}, [
|
|
183
|
+
me(i, { separator: m.separator }, {
|
|
184
|
+
default: h(() => [
|
|
185
|
+
m.animation !== "none" ? (c(), s(de, {
|
|
186
|
+
key: 0,
|
|
187
|
+
name: `wd-path-anim--${m.animation}`,
|
|
188
|
+
tag: "span",
|
|
189
|
+
class: "wd-path__anim",
|
|
190
|
+
"data-animation": m.animation
|
|
191
|
+
}, {
|
|
192
|
+
default: h(() => [
|
|
193
|
+
(c(!0), P(z, null, G(O.value, (o) => (c(), s(r, {
|
|
194
|
+
key: o.key,
|
|
195
|
+
class: U({ "is-heading": o.source === "heading", "is-active": o.source === "heading" || o.source === "home" }),
|
|
196
|
+
to: o.path && I.value ? { path: o.path } : void 0,
|
|
197
|
+
onClick: (J) => q(o)
|
|
198
|
+
}, {
|
|
199
|
+
default: h(() => [
|
|
200
|
+
w(o.icon) ? (c(), s(a, {
|
|
201
|
+
key: 0,
|
|
202
|
+
class: "wd-path__icon"
|
|
203
|
+
}, {
|
|
204
|
+
default: h(() => [
|
|
205
|
+
(c(), s(Y(w(o.icon))))
|
|
206
|
+
]),
|
|
207
|
+
_: 2
|
|
208
|
+
}, 1024)) : K("", !0),
|
|
209
|
+
Q(" " + X(o.title), 1)
|
|
210
|
+
]),
|
|
211
|
+
_: 2
|
|
212
|
+
}, 1032, ["class", "to", "onClick"]))), 128))
|
|
213
|
+
]),
|
|
214
|
+
_: 1
|
|
215
|
+
}, 8, ["name", "data-animation"])) : (c(!0), P(z, { key: 1 }, G(O.value, (o) => (c(), s(r, {
|
|
216
|
+
key: o.key,
|
|
217
|
+
class: U({ "is-heading": o.source === "heading", "is-active": o.source === "heading" || o.source === "home" }),
|
|
218
|
+
to: o.path && I.value ? { path: o.path } : void 0,
|
|
219
|
+
onClick: (J) => q(o)
|
|
220
|
+
}, {
|
|
221
|
+
default: h(() => [
|
|
222
|
+
w(o.icon) ? (c(), s(a, {
|
|
223
|
+
key: 0,
|
|
224
|
+
class: "wd-path__icon"
|
|
225
|
+
}, {
|
|
226
|
+
default: h(() => [
|
|
227
|
+
(c(), s(Y(w(o.icon))))
|
|
228
|
+
]),
|
|
229
|
+
_: 2
|
|
230
|
+
}, 1024)) : K("", !0),
|
|
231
|
+
Q(" " + X(o.title), 1)
|
|
232
|
+
]),
|
|
233
|
+
_: 2
|
|
234
|
+
}, 1032, ["class", "to", "onClick"]))), 128))
|
|
235
|
+
]),
|
|
236
|
+
_: 1
|
|
237
|
+
}, 8, ["separator"])
|
|
238
|
+
], 8, ge);
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}), Se = /* @__PURE__ */ ve(ye, [["__scopeId", "data-v-dd570e17"]]);
|
|
242
|
+
export {
|
|
243
|
+
Se as W
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=Path-pIP0JQ0c.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Path-pIP0JQ0c.mjs","sources":["../../src/components/styles/Path.vue"],"sourcesContent":["<template>\n <div class=\"wd-path\" :data-animation=\"animation\">\n <el-breadcrumb :separator=\"separator\">\n <!-- 内容变动动画:fade/slide 时以 TransitionGroup 包裹路径段,段增删替换播放过渡 -->\n <TransitionGroup\n v-if=\"animation !== 'none'\"\n :name=\"`wd-path-anim--${animation}`\"\n tag=\"span\"\n class=\"wd-path__anim\"\n :data-animation=\"animation\"\n >\n <el-breadcrumb-item\n v-for=\"seg in segmentViews\"\n :key=\"seg.key\"\n :class=\"{ 'is-heading': seg.source === 'heading', 'is-active': seg.source === 'heading' || seg.source === 'home' }\"\n :to=\"seg.path && hasRouter ? { path: seg.path } : undefined\"\n @click=\"onSegmentClick(seg)\"\n >\n <el-icon v-if=\"resolveIcon(seg.icon)\" class=\"wd-path__icon\">\n <component :is=\"resolveIcon(seg.icon)\" />\n </el-icon>\n {{ seg.title }}\n </el-breadcrumb-item>\n </TransitionGroup>\n <template v-else>\n <el-breadcrumb-item\n v-for=\"seg in segmentViews\"\n :key=\"seg.key\"\n :class=\"{ 'is-heading': seg.source === 'heading', 'is-active': seg.source === 'heading' || seg.source === 'home' }\"\n :to=\"seg.path && hasRouter ? { path: seg.path } : undefined\"\n @click=\"onSegmentClick(seg)\"\n >\n <el-icon v-if=\"resolveIcon(seg.icon)\" class=\"wd-path__icon\">\n <component :is=\"resolveIcon(seg.icon)\" />\n </el-icon>\n {{ seg.title }}\n </el-breadcrumb-item>\n </template>\n </el-breadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n onMounted,\n onUnmounted,\n ref,\n watch,\n type PropType\n} from 'vue'\nimport * as ElIcons from '@element-plus/icons-vue'\nimport { filterProp } from '../common/props'\nimport { getStationMenuChain, subscribeStationChange } from '../../lib/core/station-linkage'\nimport type { PathItem } from '../layout/types'\n\ndefineOptions({ name: 'WdPath' })\n\nconst props = defineProps({\n ...filterProp,\n /** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */\n mode: { type: String as PropType<'manual' | 'auto'>, default: 'manual' },\n /** 手动模式路径节点(PathItem[],支持 JSON 字符串) */\n items: { type: [Array, String] as PropType<PathItem[] | string>, default: undefined },\n /** 自动模式:首页节点标题 */\n home: { type: String, default: '首页' },\n /** 自动模式:是否显示首页节点 */\n showHome: { type: Boolean, default: true },\n /** 分隔符 */\n separator: { type: String, default: '/' },\n /** 路径内容(路径段)变动时的动画:none=无 / fade=淡入淡出 / slide=横向滑移+淡入 */\n animation: { type: String as PropType<'none' | 'fade' | 'slide'>, default: 'none' },\n /** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */\n container: { type: [String, Object] as PropType<string | HTMLElement>, default: undefined }\n})\n\nconst emit = defineEmits<{\n (e: 'change', segments: PathItem[]): void\n (e: 'item-click', item: PathItem): void\n}>()\n\nconst instance = getCurrentInstance()\nconst hasRouter = computed(() => {\n const root = instance?.appContext?.config?.globalProperties as any\n return !!(root?.$router)\n})\n\n/* ---------- 手动模式:路径解析 ---------- */\nfunction parseItems(): PathItem[] {\n if (!props.items) return []\n if (typeof props.items === 'string') {\n try {\n return JSON.parse(props.items)\n } catch (e) {\n console.error('[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:', e)\n return []\n }\n }\n return props.items\n}\n\n/* ---------- 自动模式:标题扫描 ---------- */\ninterface HeadingNode {\n el: HTMLElement\n level: number\n title: string\n}\n\nconst containerEl = ref<HTMLElement | null>(null)\nconst menuChain = ref<PathItem[]>([])\nconst headings = ref<HeadingNode[]>([])\nconst activeIndex = ref(-1)\n\nfunction resolveContainer(): HTMLElement {\n const root = instance?.proxy?.$el as HTMLElement | undefined\n if (props.container) {\n if (typeof props.container === 'string') {\n const el = document.querySelector(props.container)\n if (el) return el as HTMLElement\n } else if ((props.container as HTMLElement).nodeType === 1) {\n return props.container as HTMLElement\n }\n }\n // 默认:最近的 Station 内容区;无则整页\n const content = root?.closest('.wd-station__content') as HTMLElement | null\n return content || document.body\n}\n\nfunction collectHeadings(): HeadingNode[] {\n const container = containerEl.value || document.body\n const nodes: HeadingNode[] = []\n container.querySelectorAll('h1,h2,h3,h4').forEach((el) => {\n const title = (el.textContent || '').trim()\n if (!title) return\n nodes.push({ el: el as HTMLElement, level: Number(el.tagName.charAt(1)), title })\n })\n return nodes\n}\n\n/** 标题结构签名:层级+标题有序列表,用于判断容器变化是否真的影响标题集合 */\nfunction headingsSignature(list: HeadingNode[]): string {\n return list.map((h) => `${h.level}:${h.title}`).join('|')\n}\n\n/** 大纲链:以 end 位置的标题为终点,逐级收敛(h1→h2→h3→h4) */\nfunction buildChain(list: HeadingNode[], end: number): PathItem[] {\n const stack: HeadingNode[] = []\n for (let i = 0; i <= end; i++) {\n const h = list[i]\n while (stack.length && stack[stack.length - 1].level >= h.level) stack.pop()\n stack.push(h)\n }\n return stack.map((h) => ({ title: h.title, source: 'heading', level: h.level } as PathItem))\n}\n\nfunction isPageContainer(el: HTMLElement): boolean {\n return el === document.body || el === document.documentElement\n}\n\n/** 当前可视范围内的第一个标题:容器滚动位置处最先映入视口/容器顶部的 H1~H4(滚动跟随) */\nfunction computeActiveIndex(): number {\n const list = headings.value\n if (!list.length) return -1\n const container = containerEl.value || document.body\n const cRect = container.getBoundingClientRect()\n const scrollTop = isPageContainer(container)\n ? window.scrollY || document.documentElement.scrollTop\n : container.scrollTop\n // 默认取最后一个(全部标题均已滚出顶部时,锚定末尾章节)\n let active = list.length - 1\n for (let i = 0; i < list.length; i++) {\n const hRect = list[i].el.getBoundingClientRect()\n const top = hRect.top - cRect.top + scrollTop\n // 容器滚动内容中,位置位于可视区起点(scrollTop)之下的第一个标题即当前章节\n if (top >= scrollTop - 1) { active = i; break }\n }\n return active\n}\n\n/* ---------- 自动模式:数据刷新 ---------- */\nfunction refreshMenuChain() {\n menuChain.value = getStationMenuChain(true, props.filter).map((c) => ({\n ...c,\n source: 'menu'\n }) as PathItem)\n}\n\nfunction refreshHeadings() {\n const next = collectHeadings()\n // 标题结构未变(仅非标题节点变动)时不重建列表,避免无意义的全链重算\n if (headingsSignature(next) !== headingsSignature(headings.value)) {\n headings.value = next\n }\n const idx = computeActiveIndex()\n if (idx !== activeIndex.value) activeIndex.value = idx\n}\n\n/** 完整刷新(手动模式仅触发 change 事件;自动模式重读菜单链与标题) */\nfunction refresh() {\n if (props.mode !== 'auto') {\n emitChange()\n return\n }\n refreshMenuChain()\n refreshHeadings()\n emitChange()\n}\n\n/* ---------- 段组装 ---------- */\nconst displayHeadings = computed<PathItem[]>(() => {\n const list = headings.value\n if (!list.length) return []\n return activeIndex.value >= 0 ? buildChain(list, activeIndex.value) : []\n})\n\nconst segments = computed<PathItem[]>(() => {\n if (props.mode === 'auto') {\n const head: PathItem[] = props.showHome ? [{ title: props.home, source: 'home' }] : []\n return [...head, ...menuChain.value, ...displayHeadings.value]\n }\n return parseItems().map((it) => ({ ...it, source: it.source || 'manual' }))\n})\n\nconst segmentViews = computed(() =>\n segments.value.map((s, i) => ({ ...s, key: `${s.source || 'seg'}:${i}:${s.title}` }))\n)\n\nlet lastSig = ''\nfunction emitChange() {\n const sig = segments.value.map((s) => `${s.level ?? ''}:${s.title}`).join('|')\n if (sig === lastSig) return\n lastSig = sig\n emit('change', segments.value)\n}\n\nwatch(segments, () => emitChange())\n\n/* ---------- 容器事件绑定(标题扫描 + 滚动跟随当前可视范围内第一个标题) ---------- */\nlet scrollTicking = false\nfunction onScroll() {\n if (props.mode !== 'auto' || scrollTicking) return\n scrollTicking = true\n requestAnimationFrame(() => {\n scrollTicking = false\n if (props.mode === 'auto') {\n activeIndex.value = computeActiveIndex()\n }\n })\n}\n\nlet observer: MutationObserver | null = null\nlet scrollTarget: HTMLElement | Window | null = null\nfunction bindContainer(el: HTMLElement) {\n unbindContainer()\n containerEl.value = el\n // 页面级容器(body/documentElement)滚动事件挂在 window;元素级挂在自身\n scrollTarget = isPageContainer(el) ? window : el\n scrollTarget.addEventListener('scroll', onScroll, { passive: true })\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((records) => {\n if (props.mode !== 'auto') return\n // 路径自身(TransitionGroup 动画导致的段节点增删)位于观察容器内部,\n // 忽略全部落在 .wd-path 子树内的变动,避免「动画改 DOM → 触发重扫 → 重渲染 → 再触发动画」的自激循环\n const fromContent = records.some((r) => {\n const target = r.target as HTMLElement | null\n return !(target && typeof target.closest === 'function' && target.closest('.wd-path'))\n })\n if (fromContent) refreshHeadings()\n })\n observer.observe(el, { childList: true, subtree: true })\n }\n}\n\nfunction unbindContainer() {\n containerEl.value = null\n scrollTarget?.removeEventListener('scroll', onScroll)\n scrollTarget = null\n observer?.disconnect()\n observer = null\n}\n\n/* ---------- 事件 ---------- */\nfunction onSegmentClick(seg: PathItem) {\n emit('item-click', seg)\n}\n\nfunction resolveIcon(icon: any) {\n if (!icon) return null\n if (typeof icon === 'string') return (ElIcons as any)[icon] || null\n return icon\n}\n\n/* ---------- 生命周期:自动模式联动(Station 菜单链 + 路由 + 标题) ---------- */\nlet unsub: (() => void) | null = null\nfunction bindAuto() {\n if (props.mode !== 'auto') return\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n bindContainer(resolveContainer())\n refresh()\n}\n\nfunction unbindAuto() {\n unbindContainer()\n unsub?.()\n unsub = null\n}\n\nonMounted(() => {\n bindAuto()\n refresh()\n})\n\nwatch(\n () => props.mode,\n (mode) => {\n if (mode === 'auto') {\n bindAuto()\n } else {\n unbindAuto()\n refresh()\n }\n }\n)\n\nwatch(\n () => props.filter,\n () => {\n if (props.mode !== 'auto') return\n unsub?.()\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n refreshMenuChain()\n }\n)\n\n// 容器变化(如 :container=\"ref\" 延迟就绪)→ 重绑并重扫\nwatch(\n () => props.container,\n () => {\n if (props.mode === 'auto') bindContainer(resolveContainer())\n refresh()\n }\n)\n\n// router 模式:路由变化 → 重读菜单链与标题\nconst routePath = computed(() => (instance?.proxy as any)?.$route?.path)\nwatch(routePath, () => {\n if (props.mode === 'auto') refresh()\n})\n\nonUnmounted(() => unbindAuto())\n\ndefineExpose({ refresh })\n</script>\n\n<style scoped>\n.wd-path {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n}\n.wd-path :deep(.el-breadcrumb__item) {\n /* 不限制单个路径段宽度(长标题如“HTTP 请求(RequestAPI / request 单例 / useRequest)”\n 按内容自然撑开,不被截断);整体宽度由容器(如顶栏)约束 */\n overflow: hidden;\n white-space: nowrap;\n}\n.wd-path :deep(.el-breadcrumb__inner) {\n display: inline-flex;\n align-items: center;\n color: var(--wd-text-color-secondary, #909399);\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link) {\n color: var(--wd-color-primary, #409eff);\n font-weight: 400;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link:hover) {\n color: var(--wd-color-primary-light-3, #79bbff);\n}\n/* 首页与标题段:主色加粗,标识当前位置 */\n.wd-path :deep(.el-breadcrumb__item.is-active .el-breadcrumb__inner) {\n color: var(--wd-text-color-primary, #303133);\n font-weight: 600;\n}\n.wd-path__icon {\n margin-right: 4px;\n vertical-align: -2px;\n}\n\n/* —— 内容变动动画(TransitionGroup 过渡类作用于各路径段根节点) —— */\n.wd-path__anim {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n/* fade:纯淡入淡出 */\n.wd-path-anim--fade-enter-active,\n.wd-path-anim--fade-leave-active {\n transition: opacity 0.2s ease;\n}\n.wd-path-anim--fade-enter-from,\n.wd-path-anim--fade-leave-to {\n opacity: 0;\n}\n/* slide:新段自左滑入、旧段向右滑出,留存段 FLIP 位移 */\n.wd-path-anim--slide-enter-active,\n.wd-path-anim--slide-leave-active {\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.wd-path-anim--slide-enter-from {\n opacity: 0;\n transform: translateX(-8px);\n}\n.wd-path-anim--slide-leave-to {\n opacity: 0;\n transform: translateX(8px);\n}\n.wd-path-anim--slide-leave-active {\n position: absolute;\n}\n.wd-path-anim--slide-move {\n transition: transform 0.2s ease;\n}\n</style>\n"],"names":["props","__props","emit","__emit","instance","getCurrentInstance","hasRouter","computed","root","_b","_a","parseItems","containerEl","ref","menuChain","headings","activeIndex","resolveContainer","el","collectHeadings","container","nodes","title","headingsSignature","list","h","buildChain","end","stack","i","isPageContainer","computeActiveIndex","cRect","scrollTop","active","refreshMenuChain","getStationMenuChain","c","refreshHeadings","next","idx","refresh","emitChange","displayHeadings","segments","it","segmentViews","s","lastSig","sig","watch","scrollTicking","onScroll","observer","scrollTarget","bindContainer","unbindContainer","records","target","onSegmentClick","seg","resolveIcon","icon","ElIcons","unsub","bindAuto","subscribeStationChange","unbindAuto","onMounted","mode","routePath","onUnmounted","__expose","_createElementBlock","_createVNode","_component_el_breadcrumb","_createBlock","_TransitionGroup","_Fragment","_renderList","_component_el_breadcrumb_item","_normalizeClass","$event","_component_el_icon","_openBlock","_resolveDynamicComponent","_toDisplayString"],"mappings":"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"}
|