labull-framework 0.1.25 → 0.1.27

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.
@@ -1,8 +1,8 @@
1
- import { defineComponent as Re, ref as w, computed as O, watch as Ot, nextTick as Ze, onMounted as ln, onBeforeUnmount as un, openBlock as c, createElementBlock as d, normalizeStyle as rn, normalizeClass as H, unref as _t, createElementVNode as s, toDisplayString as p, createCommentVNode as k, Fragment as T, renderList as I, withModifiers as Ce, createBlock as ls, createTextVNode as y, withDirectives as ft, vModelCheckbox as is, vModelText as Yt, withKeys as us, vShow as Zt } from "vue";
2
- import { useRouter as cn, useRoute as rs } from "vue-router";
3
- import { A as cs, b as at, c as te, u as dn } from "./chunk-index-BWpDbB19.js";
4
- import { u as ds, o as Ee, b as pn, _ as bn, d as ps } from "./chunk-ProductShell.vue_vue_type_style_index_0_scoped_06035587_lang-BpRKKThg.js";
5
- const dt = "__mb", mn = "call", Se = "reply", fn = "host-ready", vn = "height", bs = "html, body { overflow: hidden !important; }", ms = `
1
+ import { defineComponent as Pe, ref as x, computed as j, watch as Pt, nextTick as Qe, onMounted as rn, onBeforeUnmount as dn, openBlock as d, createElementBlock as p, normalizeStyle as pn, normalizeClass as K, unref as it, createElementVNode as l, toDisplayString as b, createCommentVNode as k, Fragment as M, renderList as N, withModifiers as Ee, createBlock as cs, createTextVNode as $, withDirectives as vt, vModelCheckbox as rs, vModelText as Xt, withKeys as ds, vShow as Qt } from "vue";
2
+ import { useRouter as bn, useRoute as ps } from "vue-router";
3
+ import { A as bs, b as at, c as ne, u as fn } from "./chunk-index-BWpDbB19.js";
4
+ import { u as fs, o as Te, b as mn, _ as vn, d as ms } from "./chunk-ProductShell.vue_vue_type_style_index_0_scoped_06035587_lang-BpRKKThg.js";
5
+ const bt = "__mb", hn = "call", Be = "reply", _n = "host-ready", gn = "height", vs = "html, body { overflow: hidden !important; }", hs = `
6
6
  (function () {
7
7
  var seq = 0, waiting = {}, queue = [], ready = false, last = -1;
8
8
  function call(method, args) {
@@ -10,16 +10,16 @@ const dt = "__mb", mn = "call", Se = "reply", fn = "host-ready", vn = "height",
10
10
  function run() {
11
11
  var id = ++seq;
12
12
  waiting[id] = { resolve: resolve, reject: reject };
13
- parent.postMessage({ '${dt}': '${mn}', id: id, method: method, args: args }, '*');
13
+ parent.postMessage({ '${bt}': '${hn}', id: id, method: method, args: args }, '*');
14
14
  }
15
15
  if (ready) run(); else queue.push(run);
16
16
  });
17
17
  }
18
18
  window.addEventListener('message', function (event) {
19
19
  var data = event.data, pending;
20
- if (!data || data['${dt}'] === undefined) return;
21
- if (data['${dt}'] === '${fn}') { ready = true; queue.splice(0).forEach(function (run) { run(); }); return; }
22
- if (data['${dt}'] !== '${Se}') return;
20
+ if (!data || data['${bt}'] === undefined) return;
21
+ if (data['${bt}'] === '${_n}') { ready = true; queue.splice(0).forEach(function (run) { run(); }); return; }
22
+ if (data['${bt}'] !== '${Be}') return;
23
23
  if (!(pending = waiting[data.id])) return;
24
24
  delete waiting[data.id];
25
25
  if (data.ok) pending.resolve(data.value); else pending.reject(new Error(data.error || '调用失败'));
@@ -60,7 +60,7 @@ const dt = "__mb", mn = "call", Se = "reply", fn = "host-ready", vn = "height",
60
60
  if (height > 0) height += 1;
61
61
  if (height === last) return; /* 一样高就不再发:否则「宿主改高度 → 触发观察 → 又发一次」会转个不停 */
62
62
  last = height;
63
- parent.postMessage({ '${dt}': '${vn}', height: height }, '*');
63
+ parent.postMessage({ '${bt}': '${gn}', height: height }, '*');
64
64
  }
65
65
  function start() {
66
66
  report();
@@ -69,368 +69,406 @@ const dt = "__mb", mn = "call", Se = "reply", fn = "host-ready", vn = "height",
69
69
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); else start();
70
70
  setInterval(report, 500);
71
71
  })();
72
- `, fs = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/;
73
- function hn(a) {
74
- const o = typeof window > "u" ? "http://localhost" : window.location.href;
75
- return new URL(`${cs}${a}`, o);
72
+ `, _s = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/;
73
+ function yn(o) {
74
+ const s = typeof window > "u" ? "http://localhost" : window.location.href;
75
+ return new URL(`${bs}${o}`, s);
76
76
  }
77
- const Xe = (() => {
77
+ const tn = (() => {
78
78
  try {
79
- return hn("").origin;
79
+ return yn("").origin;
80
80
  } catch {
81
81
  return typeof window > "u" ? "" : window.location.origin;
82
82
  }
83
83
  })();
84
- async function vs(a, o, l) {
85
- if (!fs.test(o)) throw new Error(`路由名不合法:${o}(要写成 类名.方法名,例如 Customer.create)`);
86
- const i = hn(`/bx/${a}/${o}`);
87
- if (i.origin !== Xe) throw new Error(`后端地址必须是本应用的(${Xe}):${i.origin}`);
88
- const r = l instanceof Blob ? l : null, m = await fetch(i.toString(), {
84
+ async function gs(o, s, a) {
85
+ if (!_s.test(s)) throw new Error(`路由名不合法:${s}(要写成 类名.方法名,例如 Customer.create)`);
86
+ const i = yn(`/bx/${o}/${s}`);
87
+ if (i.origin !== tn) throw new Error(`后端地址必须是本应用的(${tn}):${i.origin}`);
88
+ const u = a instanceof Blob ? a : null, m = await fetch(i.toString(), {
89
89
  method: "POST",
90
90
  credentials: "include",
91
91
  // 带上 HttpOnly 会话 cookie;authHeaders('POST') 给 CSRF 头(缺了 403)
92
- headers: r ? { "Content-Type": r.type || "application/octet-stream", ...te("POST") } : { "Content-Type": "application/json", ...te("POST") },
93
- body: r ?? JSON.stringify(l ?? {})
94
- }), v = await m.text().catch(() => "");
92
+ headers: u ? { "Content-Type": u.type || "application/octet-stream", ...ne("POST") } : { "Content-Type": "application/json", ...ne("POST") },
93
+ body: u ?? JSON.stringify(a ?? {})
94
+ }), f = await m.text().catch(() => "");
95
95
  if (m.ok) {
96
- if (!v) return null;
96
+ if (!f) return null;
97
97
  try {
98
- return JSON.parse(v);
98
+ return JSON.parse(f);
99
99
  } catch {
100
- return v;
100
+ return f;
101
101
  }
102
102
  }
103
- let b = v;
103
+ let c = f;
104
104
  try {
105
- const h = JSON.parse(v);
106
- typeof h?.message == "string" && (b = h.message);
105
+ const h = JSON.parse(f);
106
+ typeof h?.message == "string" && (c = h.message);
107
107
  } catch {
108
- b = v;
108
+ c = f;
109
109
  }
110
- throw new Error(b ? `${o} 调用失败:${b.slice(0, 300)}` : `${o} 调用失败(${m.status})`);
110
+ throw new Error(c ? `${s} 调用失败:${c.slice(0, 300)}` : `${s} 调用失败(${m.status})`);
111
111
  }
112
- function hs(a, o) {
113
- const l = (v) => {
112
+ function ys(o, s) {
113
+ const a = (f) => {
114
114
  try {
115
- a.contentWindow?.postMessage(v, "*");
116
- } catch (b) {
117
- console.warn("[magic-block] 有一条宿主消息没能发给块(协议继续走):", b);
115
+ o.contentWindow?.postMessage(f, "*");
116
+ } catch (c) {
117
+ console.warn("[magic-block] 有一条宿主消息没能发给块(协议继续走):", c);
118
118
  }
119
119
  };
120
- async function i(v, b) {
121
- if (v === "getMe") return await at("/auth/me");
122
- if (v === "navigateTab") {
123
- const h = typeof b[0] == "string" ? b[0].trim() : "";
124
- if (!h || !o.onNavigateTab) throw new Error(`跳不了 ${h || "(空地址)"}:这个页面没有把宿主接到路由上`);
125
- return await o.onNavigateTab(h);
126
- }
127
- if (v === "context") return o.context ? o.context() : {};
128
- if (v === "setTabTitle") {
129
- const h = typeof b[0] == "string" ? b[0].trim() : "", f = typeof b[1] == "string" ? b[1].trim() : "";
120
+ async function i(f, c) {
121
+ if (f === "getMe") return await at("/auth/me");
122
+ if (f === "navigateTab") {
123
+ const h = typeof c[0] == "string" ? c[0].trim() : "";
124
+ if (!h || !s.onNavigateTab) throw new Error(`跳不了 ${h || "(空地址)"}:这个页面没有把宿主接到路由上`);
125
+ return await s.onNavigateTab(h);
126
+ }
127
+ if (f === "context") return s.context ? s.context() : {};
128
+ if (f === "setTabTitle") {
129
+ const h = typeof c[0] == "string" ? c[0].trim() : "", v = typeof c[1] == "string" ? c[1].trim() : "";
130
130
  if (!h) throw new Error("setTabTitle 要给一个非空的名字");
131
- return o.onTabTitle?.(h, f || void 0), !0;
131
+ return s.onTabTitle?.(h, v || void 0), !0;
132
132
  }
133
- if (v === "backend") {
134
- const h = typeof b[0] == "string" ? b[0].trim() : "", f = b[1];
133
+ if (f === "backend") {
134
+ const h = typeof c[0] == "string" ? c[0].trim() : "", v = c[1];
135
135
  if (!h) throw new Error("后端调用的路由名是空的:要写成 magicBackendApi.类名.方法名(参数)");
136
- if (!f || typeof f != "object" || Array.isArray(f)) throw new Error(`magicBackendApi.${h}(params) 的参数要么是一个对象,要么是一个文件(File / Blob)`);
137
- return await vs(o.uuid, h, f);
136
+ if (!v || typeof v != "object" || Array.isArray(v)) throw new Error(`magicBackendApi.${h}(params) 的参数要么是一个对象,要么是一个文件(File / Blob)`);
137
+ return await gs(s.uuid, h, v);
138
138
  }
139
- throw new Error(`不认识的方法:${String(v)}(这块桥只有 getMe / navigateTab / context / setTabTitle / backend 五个)`);
139
+ throw new Error(`不认识的方法:${String(f)}(这块桥只有 getMe / navigateTab / context / setTabTitle / backend 五个)`);
140
140
  }
141
- const r = (v) => {
142
- if (v.source !== a.contentWindow) return;
143
- const b = v.data;
144
- if (!b) return;
145
- if (b[dt] === vn) {
146
- const f = typeof b.height == "number" ? b.height : NaN;
147
- Number.isFinite(f) && f > 0 && o.onHeight?.(f);
141
+ const u = (f) => {
142
+ if (f.source !== o.contentWindow) return;
143
+ const c = f.data;
144
+ if (!c) return;
145
+ if (c[bt] === gn) {
146
+ const v = typeof c.height == "number" ? c.height : NaN;
147
+ Number.isFinite(v) && v > 0 && s.onHeight?.(v);
148
148
  return;
149
149
  }
150
- if (b[dt] !== mn) return;
151
- const h = b.id;
150
+ if (c[bt] !== hn) return;
151
+ const h = c.id;
152
152
  (async () => {
153
153
  try {
154
- l({ [dt]: Se, id: h, ok: !0, value: await i(String(b.method), b.args ?? []) });
155
- } catch (f) {
156
- l({ [dt]: Se, id: h, ok: !1, error: f instanceof Error ? f.message : String(f) });
154
+ a({ [bt]: Be, id: h, ok: !0, value: await i(String(c.method), c.args ?? []) });
155
+ } catch (v) {
156
+ a({ [bt]: Be, id: h, ok: !1, error: v instanceof Error ? v.message : String(v) });
157
157
  }
158
158
  })();
159
159
  };
160
- window.addEventListener("message", r);
161
- const m = () => l({ [dt]: fn });
162
- return m(), a.addEventListener("load", m), () => {
163
- window.removeEventListener("message", r), a.removeEventListener("load", m);
160
+ window.addEventListener("message", u);
161
+ const m = () => a({ [bt]: _n });
162
+ return m(), o.addEventListener("load", m), () => {
163
+ window.removeEventListener("message", u), o.removeEventListener("load", m);
164
164
  };
165
165
  }
166
- const Ut = "index.open.html", _e = "magic-block.open.yaml", ge = ["id", "module", "name", "brief", "detail"], Qe = ["id", "module", "name", "brief"], Oe = 40, _s = /^(?![A-Za-z]:)(?!\/)[A-Za-z0-9._\-/]+$/, gs = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, ys = /^[a-z][a-z0-9]*$/, ks = /^[A-Za-z_][A-Za-z0-9_]*$/, $s = "_";
167
- function tn(a) {
168
- return String(a ?? "").split("/").some((o) => o.startsWith($s));
166
+ const Ht = "index.open.html", ye = "magic-block.open.yaml", ke = ["id", "module", "name", "brief", "detail"], en = ["id", "module", "name", "brief"], je = 40, ks = /^(?![A-Za-z]:)(?!\/)[A-Za-z0-9._\-/]+$/, $s = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, ws = /^[a-z][a-z0-9]*$/, xs = /^[A-Za-z_][A-Za-z0-9_]*$/, Cs = /^([|>])([-+]?)$/, Ss = "_";
167
+ function nn(o) {
168
+ return String(o ?? "").split("/").some((s) => s.startsWith(Ss));
169
169
  }
170
- function ws(a) {
171
- return a.length > 0 && a.length <= Oe && !/[\u0000-\u001f\u007f]/.test(a);
170
+ function Es(o) {
171
+ return o.length > 0 && o.length <= je && !/[\u0000-\u001f\u007f]/.test(o);
172
172
  }
173
- const xs = {
173
+ const Ts = {
174
174
  id: "块的 uuid,必须与页面里挂载它时写死的那个 uuid 逐字一致",
175
175
  module: "模块名(小写字母与数字,必须以字母开头),例如 home",
176
- name: `可读名:可以用中文,不超过 ${Oe} 个字符`,
176
+ name: `可读名:可以用中文,不超过 ${je} 个字符`,
177
177
  brief: "一句话说明这个块解决什么问题",
178
178
  // 可选键:这一句不会出现在"缺少 xxx"的报文里(它不在 MANIFEST_REQUIRED 里),
179
179
  // 留着是为了让这份 Map 与 MANIFEST_KEYS 一一对上(少一个键 `tsc` 就会报)。
180
- detail: "详情介绍(可选):一段给人读的说明,比 brief 那一句长;一行写完,控制台会显示它"
180
+ detail: "业务功能说明(可选,建议都写):这个块在业务上解决什么、谁怎么用、输入输出是什么业务含义、有什么前提与边界;**用 Markdown 写**(多行用 `detail: |` 块标量),**别写**路由 / 字段 / 实现方式"
181
181
  };
182
- function en(a) {
183
- const o = Object.keys(a);
184
- return o.length > 0 ? `现在包里有:${o.join(" / ")}` : "现在这个包是空的";
185
- }
186
- function Cs(a) {
187
- let o = "";
188
- for (let l = 0; l < a.length; l += 1) {
189
- const i = a[l];
190
- if (o)
191
- i === o && (o = "");
192
- else if (i === '"' || i === "'") o = i;
193
- else if (i === "#") return a.slice(0, l);
182
+ function sn(o) {
183
+ const s = Object.keys(o);
184
+ return s.length > 0 ? `现在包里有:${s.join(" / ")}` : "现在这个包是空的";
185
+ }
186
+ function Bs(o) {
187
+ let s = "";
188
+ for (let a = 0; a < o.length; a += 1) {
189
+ const i = o[a];
190
+ if (s)
191
+ i === s && (s = "");
192
+ else if (i === '"' || i === "'") s = i;
193
+ else if (i === "#") return o.slice(0, a);
194
194
  }
195
- return a;
195
+ return o;
196
196
  }
197
- function Es(a) {
198
- let o = "";
199
- for (let l = 0; l < a.length; l += 1) {
200
- const i = a[l];
201
- if (o)
202
- i === o && (o = "");
203
- else if (i === '"' || i === "'") o = i;
204
- else if (i === ":") return l;
197
+ function Ms(o) {
198
+ let s = "";
199
+ for (let a = 0; a < o.length; a += 1) {
200
+ const i = o[a];
201
+ if (s)
202
+ i === s && (s = "");
203
+ else if (i === '"' || i === "'") s = i;
204
+ else if (i === ":") return a;
205
205
  }
206
206
  return -1;
207
207
  }
208
- function Ss(a) {
209
- return !a || a[0] !== '"' && a[0] !== "'" ? a : a.length >= 2 && a[a.length - 1] === a[0] ? a.slice(1, -1).trim() : a;
208
+ function As(o) {
209
+ return !o || o[0] !== '"' && o[0] !== "'" ? o : o.length >= 2 && o[o.length - 1] === o[0] ? o.slice(1, -1).trim() : o;
210
210
  }
211
- function Ts(a) {
212
- const o = [], l = {}, i = {};
213
- a.split(/\r?\n/).forEach((r, m) => {
214
- const v = m + 1, b = Cs(r).trim();
215
- if (!b) return;
216
- if (b.startsWith("-")) {
217
- o.push(`第 ${v} 行是列表写法(${b}):清单只认「键: 值」,每个键各占一行 —— 例如 name: 客户档案`);
218
- return;
211
+ function Rs(o) {
212
+ const s = [...o];
213
+ for (; s.length > 0 && !s[0].trim(); ) s.shift();
214
+ for (; s.length > 0 && !s[s.length - 1].trim(); ) s.pop();
215
+ const a = s.filter((u) => u.trim()).map((u) => u.length - u.trimStart().length), i = a.length > 0 ? Math.min(...a) : 0;
216
+ return s.map((u) => u.trim() ? u.slice(i) : "").join(`
217
+ `);
218
+ }
219
+ function Os(o) {
220
+ const s = [], a = {}, i = {}, u = o.split(/\r?\n/);
221
+ let m = 0;
222
+ for (; m < u.length; ) {
223
+ const f = u[m], c = m + 1;
224
+ m += 1;
225
+ const h = Bs(f).trim();
226
+ if (!h) continue;
227
+ if (h.startsWith("-")) {
228
+ s.push(`第 ${c} 行是列表写法(${h}):清单只认「键: 值」,每个键各占一行 —— 例如 name: 客户档案(长文本用 detail: | 起一个块,块里想写几行就写几行)`);
229
+ continue;
219
230
  }
220
- const h = Es(b);
221
- if (h < 0) {
222
- o.push(`第 ${v} 行不是「键: 值」(${b}):清单只认「键: 值」与 # 注释 —— 要么删掉这一行,要么照 name: 客户档案 写`);
223
- return;
231
+ const v = Ms(h);
232
+ if (v < 0) {
233
+ s.push(`第 ${c} 行不是「键: 值」(${h}):清单只认「键: 值」与 # 注释 —— 要么删掉这一行,要么照 name: 客户档案 写(长文本用 detail: | 起一个块,块的正文是**缩进**的几行)`);
234
+ continue;
224
235
  }
225
- const f = b.slice(0, h).trim();
226
- if (!ks.test(f)) {
227
- o.push(`第 ${v} 行的键名不合法(${f}):键名只许字母或下划线开头,认得的键只有 ${ge.join(" / ")}`);
228
- return;
236
+ const g = h.slice(0, v).trim();
237
+ if (!xs.test(g)) {
238
+ s.push(`第 ${c} 行的键名不合法(${g}):键名只许字母或下划线开头,认得的键只有 ${ke.join(" / ")}`);
239
+ continue;
229
240
  }
230
- if (!ge.includes(f)) {
231
- o.push(
232
- `第 ${v} 行的键不认识(${f}):清单只有 ${ge.join(" / ")} 这几个键(其中 ${Qe.join(" / ")} 必填,detail 可以不写)`
241
+ if (!ke.includes(g)) {
242
+ s.push(
243
+ `第 ${c} 行的键不认识(${g}):清单只有 ${ke.join(" / ")} 这几个键(其中 ${en.join(" / ")} 必填,detail 可以不写)`
233
244
  );
234
- return;
245
+ continue;
235
246
  }
236
- if (f in i) {
237
- o.push(`第 ${v} 行重复写了 ${f}(第 ${i[f]} 行已经写过):一个键只许出现一次`);
238
- return;
247
+ if (g in i) {
248
+ s.push(`第 ${c} 行重复写了 ${g}(第 ${i[g]} 行已经写过):一个键只许出现一次`);
249
+ continue;
239
250
  }
240
- i[f] = v, l[f] = Ss(b.slice(h + 1).trim());
241
- });
242
- for (const r of Qe) {
243
- const m = l[r] ?? "";
244
- if (m === "") {
245
- o.push(`清单里缺少 ${r}(或者是空的):${xs[r]}`);
251
+ i[g] = c;
252
+ const _ = h.slice(v + 1).trim(), y = Cs.exec(_);
253
+ if (y) {
254
+ const E = [];
255
+ for (; m < u.length; ) {
256
+ const C = u[m];
257
+ if (C.trim() && !/^\s/.test(C)) break;
258
+ E.push(C), m += 1;
259
+ }
260
+ let A = Rs(E);
261
+ y[1] === ">" && (A = A.split(`
262
+ `).map((C) => C.trim()).filter(Boolean).join(" ")), a[g] = A;
246
263
  continue;
247
264
  }
248
- r === "id" && !gs.test(m) ? o.push(`清单里的 id 不是 uuid:${m} —— 要 8-4-4-4-12 那种十六进制`) : r === "module" && !ys.test(m) ? o.push(
249
- `清单里的 module 不合法:${m} —— 它同时是 Django 的 app label,所以只许小写字母与数字、必须以字母开头(不能有横线与下划线),例如 home / orders`
250
- ) : r === "name" && !ws(m) && o.push(`清单里的 name 不合法:${m} —— 不能超过 ${Oe} 个字符、不能含控制字符(中文可以)`);
265
+ a[g] = As(_);
251
266
  }
252
- return [l, o];
267
+ for (const f of en) {
268
+ const c = a[f] ?? "";
269
+ if (c === "") {
270
+ s.push(`清单里缺少 ${f}(或者是空的):${Ts[f]}`);
271
+ continue;
272
+ }
273
+ f === "id" && !$s.test(c) ? s.push(`清单里的 id 不是 uuid:${c} —— 要 8-4-4-4-12 那种十六进制`) : f === "module" && !ws.test(c) ? s.push(
274
+ `清单里的 module 不合法:${c} —— 它同时是 Django 的 app label,所以只许小写字母与数字、必须以字母开头(不能有横线与下划线),例如 home / orders`
275
+ ) : f === "name" && !Es(c) && s.push(`清单里的 name 不合法:${c} —— 不能超过 ${je} 个字符、不能含控制字符(中文可以)`);
276
+ }
277
+ return [a, s];
253
278
  }
254
- function Bs(a) {
255
- return _s.test(a) && !a.split("/").includes("..");
279
+ function Ps(o) {
280
+ return ks.test(o) && !o.split("/").includes("..");
256
281
  }
257
- function Ms(a) {
258
- const o = [], l = a[Ut];
259
- l === void 0 ? o.push(`包里缺入口:必须有 ${Ut}(${en(a)})`) : l.trim() || o.push(`${Ut} 不能是空文件`);
260
- const i = a[_e];
261
- let r = {};
282
+ function js(o) {
283
+ const s = [], a = o[Ht];
284
+ a === void 0 ? s.push(`包里缺入口:必须有 ${Ht}(${sn(o)})`) : a.trim() || s.push(`${Ht} 不能是空文件`);
285
+ const i = o[ye];
286
+ let u = {};
262
287
  if (i === void 0)
263
- o.push(`包里缺清单:必须有 ${_e}(${en(a)})`);
288
+ s.push(`包里缺清单:必须有 ${ye}(${sn(o)})`);
264
289
  else if (!i.trim())
265
- o.push(`${_e} 不能是空文件`);
290
+ s.push(`${ye} 不能是空文件`);
266
291
  else {
267
- const [m, v] = Ts(i);
268
- r = m, o.push(...v);
292
+ const [m, f] = Os(i);
293
+ u = m, s.push(...f);
269
294
  }
270
- for (const m of Object.keys(a))
271
- Bs(m) || o.push(`文件名不合法:${m}(只许字母数字与 . _ - /,且不许 .. 与绝对路径)`);
272
- return { manifest: r, issues: o };
273
- }
274
- function As(a) {
275
- const o = [];
276
- if (a.length === 0)
277
- return o.push("一个块都没勾:请在「读回改动」的结果里勾上要保存的块"), { selected: 0, issues: o };
278
- for (const l of a) {
279
- const i = l.name?.trim() || "(没有名字的块)";
280
- for (const r of Ms(l.files ?? {}).issues) o.push(`${i}:${r}`);
295
+ for (const m of Object.keys(o))
296
+ Ps(m) || s.push(`文件名不合法:${m}(只许字母数字与 . _ - /,且不许 .. 与绝对路径)`);
297
+ return { manifest: u, issues: s };
298
+ }
299
+ function Ls(o) {
300
+ const s = [];
301
+ if (o.length === 0)
302
+ return s.push("一个块都没勾:请在「读回改动」的结果里勾上要保存的块"), { selected: 0, issues: s };
303
+ for (const a of o) {
304
+ const i = a.name?.trim() || "(没有名字的块)";
305
+ for (const u of js(a.files ?? {}).issues) s.push(`${i}:${u}`);
281
306
  }
282
- return { selected: a.length, issues: o };
283
- }
284
- const Rs = "backend_open.py", Os = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
285
- function nn(a, o) {
286
- if (Os.test(a)) return;
287
- const l = (a.split(/[?#]/)[0] ?? "").replace(/^\.\//, "").replace(/^\/+/, "");
288
- if (l in o) return tn(l) ? void 0 : l;
289
- const i = l.split("/").pop() ?? "";
290
- return i ? Object.keys(o).find((r) => !tn(r) && (r.split("/").pop() ?? "") === i) : void 0;
291
- }
292
- const _n = "\0mb:";
293
- function Ps(a) {
294
- return `${_n}${a}\0`;
295
- }
296
- const Ls = /<script\b([^>]*?)\bsrc\s*=\s*(["'])(.*?)\2([^>]*)>\s*<\/script\s*>/gi, js = /<link\b([^>]*?)\bhref\s*=\s*(["'])(.*?)\2([^>]*?)\/?>/gi;
297
- function Ds(a, o) {
298
- const l = [], i = (v) => (l.push(v), Ps(l.length - 1));
299
- return { html: a.replace(Ls, (v, b, h, f, x) => {
300
- const _ = nn(f, o);
301
- return _ === void 0 ? v : i(`<script${b}${x}>
302
- ${gn(o[_] ?? "")}
307
+ return { selected: o.length, issues: s };
308
+ }
309
+ const Ds = "backend_open.py", Is = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
310
+ function on(o, s) {
311
+ if (Is.test(o)) return;
312
+ const a = (o.split(/[?#]/)[0] ?? "").replace(/^\.\//, "").replace(/^\/+/, "");
313
+ if (a in s) return nn(a) ? void 0 : a;
314
+ const i = a.split("/").pop() ?? "";
315
+ return i ? Object.keys(s).find((u) => !nn(u) && (u.split("/").pop() ?? "") === i) : void 0;
316
+ }
317
+ const kn = "\0mb:";
318
+ function Ns(o) {
319
+ return `${kn}${o}\0`;
320
+ }
321
+ const Fs = /<script\b([^>]*?)\bsrc\s*=\s*(["'])(.*?)\2([^>]*)>\s*<\/script\s*>/gi, zs = /<link\b([^>]*?)\bhref\s*=\s*(["'])(.*?)\2([^>]*?)\/?>/gi;
322
+ function Us(o, s) {
323
+ const a = [], i = (f) => (a.push(f), Ns(a.length - 1));
324
+ return { html: o.replace(Fs, (f, c, h, v, g) => {
325
+ const _ = on(v, s);
326
+ return _ === void 0 ? f : i(`<script${c}${g}>
327
+ ${$n(s[_] ?? "")}
303
328
  <\/script>`);
304
- }).replace(js, (v, b, h, f, x) => {
305
- if (!/\brel\s*=\s*(?:"|')?stylesheet/i.test(`${b}${x}`)) return v;
306
- const _ = nn(f, o);
307
- return _ === void 0 ? v : i(`<style>
308
- ${o[_]}
329
+ }).replace(zs, (f, c, h, v, g) => {
330
+ if (!/\brel\s*=\s*(?:"|')?stylesheet/i.test(`${c}${g}`)) return f;
331
+ const _ = on(v, s);
332
+ return _ === void 0 ? f : i(`<style>
333
+ ${s[_]}
309
334
  </style>`);
310
- }), slots: l };
335
+ }), slots: a };
311
336
  }
312
- function gn(a) {
313
- return a.replace(/<\/(script)/gi, "<\\/$1");
337
+ function $n(o) {
338
+ return o.replace(/<\/(script)/gi, "<\\/$1");
314
339
  }
315
- function yn(a, o) {
316
- const l = /<\/head\s*>/i.exec(a);
317
- return l ? `${a.slice(0, l.index)}${o}${a.slice(l.index)}` : `${o}${a}`;
340
+ function wn(o, s) {
341
+ const a = /<\/head\s*>/i.exec(o);
342
+ return a ? `${o.slice(0, a.index)}${s}${o.slice(a.index)}` : `${s}${o}`;
318
343
  }
319
- function Is(a, o) {
320
- return o ? yn(a, `<script>
321
- ${gn(o)}
344
+ function Hs(o, s) {
345
+ return s ? wn(o, `<script>
346
+ ${$n(s)}
322
347
  <\/script>
323
- `) : a;
348
+ `) : o;
324
349
  }
325
- function sn(a, o) {
326
- return o ? yn(a, `<style data-magic-block="host">
327
- ${o}
350
+ function ln(o, s) {
351
+ return s ? wn(o, `<style data-magic-block="host">
352
+ ${s}
328
353
  </style>
329
- `) : a;
354
+ `) : o;
330
355
  }
331
- function Ns(a, o = {}) {
332
- const l = o.bootstrap ?? "", i = o.css ?? "", r = o.themeCss ?? "", m = a[Ut];
356
+ function Ks(o, s = {}) {
357
+ const a = s.bootstrap ?? "", i = s.css ?? "", u = s.themeCss ?? "", m = o[Ht];
333
358
  if (m === void 0) return "";
334
- const { html: v, slots: b } = Ds(m, a), h = Is(sn(sn(v, r), i), l), f = h.split(_n);
335
- if (f.length === 1) return h;
336
- let x = f[0] ?? "";
337
- for (let _ = 1; _ < f.length; _ += 1) {
338
- const g = f[_] ?? "", M = g.indexOf("\0"), F = Number(g.slice(0, M));
339
- x += (b[F] ?? "") + g.slice(M + 1);
359
+ const { html: f, slots: c } = Us(m, o), h = Hs(ln(ln(f, u), i), a), v = h.split(kn);
360
+ if (v.length === 1) return h;
361
+ let g = v[0] ?? "";
362
+ for (let _ = 1; _ < v.length; _ += 1) {
363
+ const y = v[_] ?? "", E = y.indexOf("\0"), A = Number(y.slice(0, E));
364
+ g += (c[A] ?? "") + y.slice(E + 1);
340
365
  }
341
- return x;
342
- }
343
- const Ft = /* @__PURE__ */ new Map();
344
- let Pt = null;
345
- const Te = /* @__PURE__ */ new Set();
346
- function Fs(a) {
347
- return Te.add(a), () => {
348
- Te.delete(a);
366
+ return g;
367
+ }
368
+ const Ut = /* @__PURE__ */ new Map();
369
+ let jt = null;
370
+ const Me = /* @__PURE__ */ new Set();
371
+ function qs(o) {
372
+ return Me.add(o), () => {
373
+ Me.delete(o);
349
374
  };
350
375
  }
351
- function Us() {
352
- Ft.clear(), Pt = null;
353
- for (const a of Te) a();
376
+ function Vs() {
377
+ Ut.clear(), jt = null;
378
+ for (const o of Me) o();
354
379
  }
355
- async function zs(a) {
356
- const o = [...new Set(a)].filter(Boolean);
357
- if (o.some((l) => !Ft.has(l))) {
358
- Pt && await Pt.catch(() => {
380
+ async function Js(o) {
381
+ const s = [...new Set(o)].filter(Boolean);
382
+ if (s.some((a) => !Ut.has(a))) {
383
+ jt && await jt.catch(() => {
359
384
  });
360
- const l = o.filter((i) => !Ft.has(i));
361
- l.length > 0 && (Pt = at(`/magic-blocks/render?ids=${l.map(encodeURIComponent).join(",")}`).then((i) => {
362
- for (const r of i) r?.id && Ft.set(r.id, r);
385
+ const a = s.filter((i) => !Ut.has(i));
386
+ a.length > 0 && (jt = at(`/magic-blocks/render?ids=${a.map(encodeURIComponent).join(",")}`).then((i) => {
387
+ for (const u of i) u?.id && Ut.set(u.id, u);
363
388
  return i;
364
389
  }).catch(() => []).finally(() => {
365
- Pt = null;
366
- }), await Pt.catch(() => {
390
+ jt = null;
391
+ }), await jt.catch(() => {
367
392
  }));
368
393
  }
369
- return o.map((l) => Ft.get(l)).filter((l) => !!l);
370
- }
371
- const Tt = "labull.css", Qt = "CONTROLS.lock.html";
372
- function Hs(a, o) {
373
- const l = String(o || "");
374
- if (/@font-face|@keyframes/i.test(l)) return !0;
375
- const i = String(a || "");
376
- return /(^|[\s,>+~])(\.p-|\.pi(?![a-z])|\.pi-|\.labull-|:root|html(?![a-z-])|body(?![a-z-])|\*|:where\()/.test(i) ? !0 : /--(?:sp|surface|primary|text-color|content|highlight|focus-ring|p-)/.test(l);
377
- }
378
- function kn(a, o, l) {
379
- for (let i = 0; i < a.length; i += 1) {
380
- const r = a[i], m = String(r.cssText || ""), v = String(r.selectorText || "");
381
- if (r.cssRules && r.cssRules.length > 0) {
382
- const b = [];
383
- if (kn(r.cssRules, b, l), b.length === 0) continue;
394
+ return s.map((a) => Ut.get(a)).filter((a) => !!a);
395
+ }
396
+ const Bt = "labull.css", ee = "CONTROLS.lock.html";
397
+ function Gs(o, s) {
398
+ const a = String(s || "");
399
+ if (/@font-face|@keyframes/i.test(a)) return !0;
400
+ const i = String(o || "");
401
+ return /(^|[\s,>+~])(\.p-|\.pi(?![a-z])|\.pi-|\.labull-|:root|html(?![a-z-])|body(?![a-z-])|\*|:where\()/.test(i) ? !0 : /--(?:sp|surface|primary|text-color|content|highlight|focus-ring|p-)/.test(a);
402
+ }
403
+ function xn(o, s, a) {
404
+ for (let i = 0; i < o.length; i += 1) {
405
+ const u = o[i], m = String(u.cssText || ""), f = String(u.selectorText || "");
406
+ if (u.cssRules && u.cssRules.length > 0) {
407
+ const c = [];
408
+ if (xn(u.cssRules, c, a), c.length === 0) continue;
384
409
  const h = m.slice(0, m.indexOf("{")).trim();
385
- o.push(`${h} {
386
- ${b.map((f) => " " + f).join(`
410
+ s.push(`${h} {
411
+ ${c.map((v) => " " + v).join(`
387
412
  `)}
388
413
  }`);
389
414
  continue;
390
415
  }
391
- Hs(v, m) && (o.push(m), l.n += 1);
416
+ Gs(f, m) && (s.push(m), a.n += 1);
392
417
  }
393
418
  }
394
- function $n() {
395
- const a = [], o = [], l = { n: 0 };
419
+ function Cn() {
420
+ const o = [], s = [], a = { n: 0 };
396
421
  let i = 0;
397
- const r = typeof document > "u" ? [] : Array.from(document.styleSheets);
398
- for (const v of r) {
399
- const b = v.href || "(内联 <style>)";
422
+ const u = typeof document > "u" ? [] : Array.from(document.styleSheets);
423
+ for (const f of u) {
424
+ const c = f.href || "(内联 <style>)";
400
425
  let h = null;
401
426
  try {
402
- h = v.cssRules;
427
+ h = f.cssRules;
403
428
  } catch {
404
- o.push(b);
429
+ s.push(c);
405
430
  continue;
406
431
  }
407
432
  if (!h || h.length === 0) continue;
408
- const f = [];
409
- kn(h, f, l), f.length !== 0 && (i += 1, a.push(`/* ── ${b} ── */`, ...f));
433
+ const v = [];
434
+ xn(h, v, a), v.length !== 0 && (i += 1, o.push(`/* ── ${c} ── */`, ...v));
410
435
  }
411
436
  return { css: [
412
437
  "/* 生成物:每次导出都会重写,别手改。",
413
438
  " *",
414
439
  " * 这是这个应用此刻真正在用的 **labull 主题 + 控件样式**(token / PrimeVue 控件 / 结构类 / 图标)。",
415
- ` * 收自 ${i} 张样式表、${l.n} 条规则。`,
416
- o.length > 0 ? ` * ⚠️ 有 ${o.length} 张样式表读不到规则(跨源,浏览器不让读):${o.join(" / ")} —— 需要的话手动补一份。` : " * (没有读不到的样式表:收全了。)",
440
+ ` * 收自 ${i} 张样式表、${a.n} 条规则。`,
441
+ s.length > 0 ? ` * ⚠️ 有 ${s.length} 张样式表读不到规则(跨源,浏览器不让读):${s.join(" / ")} —— 需要的话手动补一份。` : " * (没有读不到的样式表:收全了。)",
417
442
  " *",
418
443
  " * 怎么用(块里):**什么都不用加** —— 宿主会把这一份注入每个块的 iframe(`MagicBlockHost` 的 `theme` prop),",
419
444
  ' * 所以直接写类名就行:`<button class="p-button">` / `<input class="p-inputtext">` / `<span class="p-tag">`。',
420
- " * 这一份放在开发包里是给你**查 / 对照 / 抄**用的(`" + Qt + "` 里的每一块 markup 都能直接用)。",
445
+ " * 这一份放在开发包里是给你**查 / 对照 / 抄**用的(`" + ee + "` 里的每一块 markup 都能直接用)。",
421
446
  " * ⚠️ 别把它当块包文件塞进块里:它 500 KB 上下,而且宿主已经注入了一份(重复只会更慢)。",
422
447
  " * ⚠️ 块里**只有 CSS,没有 JS 组件**:下拉 / 日期 / 弹窗那些要装了 PrimeVue 才有行为,",
423
448
  " * 这里能用的是类名(按钮、输入框、标签、面板、表格、图标)。",
424
449
  " */",
425
450
  ""
426
451
  ].join(`
427
- `) + a.join(`
452
+ `) + o.join(`
428
453
  `) + `
429
- `, sheets: i, skipped: o, rules: l.n };
430
- }
431
- function Ks() {
432
- const l = [
433
- ["按钮", '<button class="p-button" type="button">主要按钮</button>'],
454
+ `, sheets: i, skipped: s, rules: a.n };
455
+ }
456
+ function Ws() {
457
+ const o = '<button class="p-button" type="button">主要按钮</button>', s = (f, c, h) => ` <li class="labull-step${f ? ` ${f}` : ""}">
458
+ <span class="labull-step-node"></span>
459
+ <span class="labull-step-label">${c}</span>
460
+ <span class="labull-step-desc">${h}</span>
461
+ </li>`, a = (f, c = "") => `<ol class="labull-steps${c ? ` ${c}` : ""}">
462
+ ` + f.map(([h, v, g]) => s(h, v, g)).join(`
463
+ `) + `
464
+ </ol>`, i = a([
465
+ ["is-done", "草稿", "需求已创建"],
466
+ ["is-current", "待审批", "等管理员审批"],
467
+ ["", "审批通过", "待处理"],
468
+ ["", "开发完成", "待处理"],
469
+ ["", "验收完成", "待处理"]
470
+ ]), m = [
471
+ ["按钮", o],
434
472
  ["次要按钮", '<button class="p-button p-button-outlined" type="button">次要按钮</button>'],
435
473
  ["纯文字按钮", '<button class="p-button p-button-text" type="button">纯文字</button>'],
436
474
  ["小按钮 + 图标", '<button class="p-button p-button-sm" type="button"><i class="pi pi-refresh"></i> 刷新</button>'],
@@ -444,12 +482,33 @@ function Ks() {
444
482
  ["弹窗(原生 <code>&lt;dialog&gt;</code> + <code>showModal()</code>)", `<button class="p-button p-button-sm" type="button" onclick="document.getElementById('demoDialog').showModal()">打开弹窗</button><dialog id="demoDialog"><h3 style="margin:0 0 .5rem">弹窗标题</h3><p style="margin:0 0 .75rem">弹窗正文。遮罩与长相来自主题,块里不必自己画一层浮层。</p><form method="dialog"><button class="p-button p-button-sm">关闭</button></form></dialog>`],
445
483
  ['"选择文件"另一种写法(文案更干净)', '<label class="p-button p-button-sm p-button-outlined" for="demo-file"><i class="pi pi-folder-open"></i> 选择照片</label><input id="demo-file" class="visually-hidden" type="file" />'],
446
484
  ["面板 + 标题", '<div class="labull-panel"><h2 class="labull-subject-title"><i class="pi pi-list"></i> 面板标题</h2><p>面板正文。</p></div>'],
485
+ /* 🔴 流程链条:**纯 CSS**(没有 JS),状态加在 `<li>` 上;桌面横向、手机自动转纵向。
486
+ * 三行分别是:默认那条链 / 强制纵向那个参数 / 四个状态各长什么样。 */
487
+ ["流程链条(工作流步骤条):桌面横向、手机自动纵向;节点空着会自动编号,已完成自动显示 ✓", i],
488
+ ["流程链条 · 参数 <code>labull-steps--vertical</code>(强制纵向:手机那一套,侧栏那种窄容器也用它)", a([
489
+ ["is-done", "草稿", "需求已创建"],
490
+ ["is-current", "待审批", "等管理员审批"],
491
+ ["", "审批通过", "待处理"],
492
+ ["", "开发完成", "待处理"],
493
+ ["", "验收完成", "待处理"]
494
+ ], "labull-steps--vertical")],
495
+ ["流程链条 · 参数 <code>labull-steps--horizontal</code>(强制横向:在手机上也横着排)", a([
496
+ ["is-done", "提交", "10-05"],
497
+ ["is-current", "审批", "进行中"],
498
+ ["", "完成", "待处理"]
499
+ ], "labull-steps--horizontal")],
500
+ ["流程链条 · 状态:<code>is-done</code> / <code>is-current</code> / 不写(待处理)/ <code>is-danger</code>(退回 · 终止)", a([
501
+ ["is-done", "已修复", "张三 10-05"],
502
+ ["is-current", "待验收", "等提出人确认"],
503
+ ["is-danger", "被退回", "原因:信息不全"],
504
+ ["", "已关闭", "待处理"]
505
+ ])],
447
506
  ["表格", "<table><thead><tr><th>列 A</th><th>列 B</th></tr></thead><tbody><tr><td>值</td><td>值</td></tr></tbody></table>"]
448
507
  ].map(
449
- ([i, r]) => ` <section>
450
- <h3>${i}</h3>
451
- <div class="demo">${r}</div>
452
- <pre>${r.replace(/&/g, "&amp;").replace(/</g, "&lt;")}</pre>
508
+ ([f, c]) => ` <section>
509
+ <h3>${f}</h3>
510
+ <div class="demo">${c}</div>
511
+ <pre>${c.replace(/&/g, "&amp;").replace(/</g, "&lt;")}</pre>
453
512
  </section>`
454
513
  ).join(`
455
514
  `);
@@ -461,7 +520,7 @@ function Ks() {
461
520
  <head>
462
521
  <meta charset="utf-8">
463
522
  <title>labull 控件清单</title>
464
- <link rel="stylesheet" href="${Tt}">
523
+ <link rel="stylesheet" href="${Bt}">
465
524
  <style>
466
525
  body { margin: 0; padding: 16px; }
467
526
  h1 { margin: 0 0 4px; font-size: 18px; }
@@ -477,72 +536,72 @@ function Ks() {
477
536
  <body>
478
537
  <h1>labull 控件清单</h1>
479
538
  <p class="lead">
480
- 这些类名来自 <code>${Tt}</code>(与应用同源同版本)。块里别自己写一套配色 / 按钮:
539
+ 这些类名来自 <code>${Bt}</code>(与应用同源同版本)。块里别自己写一套配色 / 按钮:
481
540
  把这一行加进 <code>index.open.html</code> 的 <code>&lt;head&gt;</code>,
482
541
  下面每一块 markup 都能直接用:
483
- <code>&lt;link rel="stylesheet" href="${Tt}"&gt;</code>
542
+ <code>&lt;link rel="stylesheet" href="${Bt}"&gt;</code>
484
543
  <br />
485
544
  ⚠️ 这里**只有 CSS,没有 JS 组件**:下拉 / 日期 / 弹窗那些要装了 PrimeVue 才有行为(块里没有构建步骤)。
486
545
  </p>
487
- ${l}
546
+ ${m}
488
547
  </body>
489
548
  </html>
490
549
  `;
491
550
  }
492
- const Bt = /* @__PURE__ */ new Map(), Be = /* @__PURE__ */ new Set(), Vs = 4e3;
493
- let Me = "", Xt = null;
494
- function on() {
495
- for (const a of Be) a();
551
+ const Mt = /* @__PURE__ */ new Map(), Ae = /* @__PURE__ */ new Set(), Ys = 4e3;
552
+ let Re = "", te = null;
553
+ function an() {
554
+ for (const o of Ae) o();
496
555
  }
497
- function qs(a) {
498
- return Be.add(a), () => {
499
- Be.delete(a);
556
+ function Zs(o) {
557
+ return Ae.add(o), () => {
558
+ Ae.delete(o);
500
559
  };
501
560
  }
502
- function ye() {
503
- return Me;
561
+ function $e() {
562
+ return Re;
504
563
  }
505
- function Js(a, o) {
506
- const l = String(a || "").trim(), i = String(o || "").trim();
507
- if (!l || !i) return () => {
564
+ function Xs(o, s) {
565
+ const a = String(o || "").trim(), i = String(s || "").trim();
566
+ if (!a || !i) return () => {
508
567
  };
509
- let r = Bt.get(l);
510
- return r || (r = /* @__PURE__ */ new Set(), Bt.set(l, r)), r.add(i), () => {
511
- const m = Bt.get(l);
512
- m && (m.delete(i), m.size === 0 && Bt.delete(l));
568
+ let u = Mt.get(a);
569
+ return u || (u = /* @__PURE__ */ new Set(), Mt.set(a, u)), u.add(i), () => {
570
+ const m = Mt.get(a);
571
+ m && (m.delete(i), m.size === 0 && Mt.delete(a));
513
572
  };
514
573
  }
515
- function Ae(a, o, l) {
516
- const i = Bt.get(String(a || ""));
574
+ function Oe(o, s, a) {
575
+ const i = Mt.get(String(o || ""));
517
576
  if (!i) return null;
518
- for (const r of i)
519
- if (r !== o && !(l && !l(r)))
520
- return r;
577
+ for (const u of i)
578
+ if (u !== s && !(a && !a(u)))
579
+ return u;
521
580
  return null;
522
581
  }
523
- function Gs(a) {
524
- return [...Bt.get(String(a || "")) ?? []];
582
+ function Qs(o) {
583
+ return [...Mt.get(String(o || "")) ?? []];
525
584
  }
526
- function Ws(a, o, l) {
527
- const i = Bt.get(String(a || ""));
528
- return !i || i.size === 0 || i.has(o) ? null : Ae(a, o, l);
585
+ function to(o, s, a) {
586
+ const i = Mt.get(String(o || ""));
587
+ return !i || i.size === 0 || i.has(s) ? null : Oe(o, s, a);
529
588
  }
530
- function wn(a, o = Vs) {
531
- Me = String(a || ""), Xt !== null && clearTimeout(Xt), Xt = setTimeout(() => {
532
- Xt = null, Me = "", on();
533
- }, Math.max(1, o)), on();
589
+ function Sn(o, s = Ys) {
590
+ Re = String(o || ""), te !== null && clearTimeout(te), te = setTimeout(() => {
591
+ te = null, Re = "", an();
592
+ }, Math.max(1, s)), an();
534
593
  }
535
- const Ys = ["data-magic-block", "data-magic-module"], Zs = ["srcdoc", "title"], Xs = { class: "mb__state" }, Qs = { class: "mb__brief" }, to = {
594
+ const eo = ["data-magic-block", "data-magic-module"], no = ["srcdoc", "title"], so = { class: "mb__state" }, oo = { class: "mb__brief" }, lo = {
536
595
  key: 0,
537
596
  class: "mb__reason"
538
- }, eo = {
597
+ }, ao = {
539
598
  key: 1,
540
599
  class: "mb__issues"
541
- }, no = {
600
+ }, io = {
542
601
  key: 2,
543
602
  class: "mb__ring",
544
603
  "aria-hidden": "true"
545
- }, so = ["title", "aria-label"], oo = ["title", "aria-label"], ao = ["title", "aria-label"], lo = ["title", "aria-label"], io = /* @__PURE__ */ Re({
604
+ }, uo = ["title", "aria-label"], co = ["title", "aria-label"], ro = ["title", "aria-label"], po = ["title", "aria-label"], bo = /* @__PURE__ */ Pe({
546
605
  __name: "MagicBlockHost",
547
606
  props: {
548
607
  uuid: {},
@@ -550,189 +609,189 @@ const Ys = ["data-magic-block", "data-magic-module"], Zs = ["srcdoc", "title"],
550
609
  module: { default: "" },
551
610
  theme: { type: Boolean, default: !0 }
552
611
  },
553
- setup(a) {
554
- const o = a, l = ds(), i = cn(), { isStaff: r } = dn(), m = w(null), v = w(null), b = w(null), h = w(!1), f = w(0), x = w(0);
555
- let _ = null, g = null, M = null, F = null, B = null, R = null;
556
- const L = O(() => o.name.trim() || o.uuid), G = O(() => b.value?.state ?? ""), pt = O(() => G.value === "invalid" ? "校验不通过" : G.value === "draft" ? "未开发" : L.value), Z = O(() => (b.value?.brief ?? "").trim() || (b.value?.name ?? "").trim() || L.value), gt = O(() => (b.value?.reason ?? "").trim()), yt = O(() => b.value?.issues ?? []), C = O(() => Math.max(x.value, f.value, 1)), Lt = O(() => ({ height: `${C.value}px` })), lt = O(() => {
557
- const $ = {};
558
- for (const [E, j] of Object.entries(b.value?.files ?? {})) E !== Rs && ($[E] = j);
559
- return $;
560
- }), kt = O(() => G.value === "ok" && typeof lt.value[Ut] == "string");
561
- let nt = null;
562
- function K() {
563
- if (!o.theme) return "";
564
- if (nt !== null || (nt = "", typeof document > "u")) return nt;
612
+ setup(o) {
613
+ const s = o, a = fs(), i = bn(), { isStaff: u } = fn(), m = x(null), f = x(null), c = x(null), h = x(!1), v = x(0), g = x(0);
614
+ let _ = null, y = null, E = null, A = null, C = null, R = null;
615
+ const P = j(() => s.name.trim() || s.uuid), z = j(() => c.value?.state ?? ""), Z = j(() => z.value === "invalid" ? "校验不通过" : z.value === "draft" ? "未开发" : P.value), X = j(() => (c.value?.brief ?? "").trim() || (c.value?.name ?? "").trim() || P.value), yt = j(() => (c.value?.reason ?? "").trim()), kt = j(() => c.value?.issues ?? []), S = j(() => Math.max(g.value, v.value, 1)), Dt = j(() => ({ height: `${S.value}px` })), ut = j(() => {
616
+ const w = {};
617
+ for (const [T, D] of Object.entries(c.value?.files ?? {})) T !== Ds && (w[T] = D);
618
+ return w;
619
+ }), $t = j(() => z.value === "ok" && typeof ut.value[Ht] == "string");
620
+ let st = null;
621
+ function q() {
622
+ if (!s.theme) return "";
623
+ if (st !== null || (st = "", typeof document > "u")) return st;
565
624
  try {
566
- nt = $n().css;
625
+ st = Cn().css;
567
626
  } catch {
568
- nt = "";
627
+ st = "";
569
628
  }
570
- return nt;
629
+ return st;
571
630
  }
572
- const U = O(() => {
573
- if (!kt.value) return "";
574
- const $ = { bootstrap: ms, css: bs }, E = K();
575
- return E && ($.themeCss = E), Ns(lt.value, $);
631
+ const U = j(() => {
632
+ if (!$t.value) return "";
633
+ const w = { bootstrap: hs, css: vs }, T = q();
634
+ return T && (w.themeCss = T), Ks(ut.value, w);
576
635
  });
577
- function X() {
578
- return { key: l.key, path: l.path, params: l.params, query: l.query };
579
- }
580
- async function $t($) {
581
- const E = i.resolve($);
582
- if (E.matched.length === 0) {
583
- const j = i.getRoutes().map((ut) => ut.path);
584
- throw new Error(`这个应用里没有页面 ${$}。能跳的页面只有:${j.length > 0 ? j.join(" / ") : "(还没有配路由)"}`);
636
+ function Q() {
637
+ return { key: a.key, path: a.path, params: a.params, query: a.query };
638
+ }
639
+ async function wt(w) {
640
+ const T = i.resolve(w);
641
+ if (T.matched.length === 0) {
642
+ const D = i.getRoutes().map((rt) => rt.path);
643
+ throw new Error(`这个应用里没有页面 ${w}。能跳的页面只有:${D.length > 0 ? D.join(" / ") : "(还没有配路由)"}`);
585
644
  }
586
- return Ee($) || E.fullPath;
587
- }
588
- function bt() {
589
- M?.(), M = null;
590
- const $ = v.value;
591
- $ && (M = hs($, {
592
- uuid: o.uuid,
593
- onHeight: (E) => {
594
- f.value = E;
645
+ return Te(w) || T.fullPath;
646
+ }
647
+ function ft() {
648
+ E?.(), E = null;
649
+ const w = f.value;
650
+ w && (E = ys(w, {
651
+ uuid: s.uuid,
652
+ onHeight: (T) => {
653
+ v.value = T;
595
654
  },
596
- onNavigateTab: $t,
597
- context: X,
655
+ onNavigateTab: wt,
656
+ context: Q,
598
657
  /* 🔴 块给**自己所属那条标签**起名:整页就是一个块时(`MagicBlockPage`),标签栏上那条
599
658
  * 默认只有路由的 `meta.title`("订单详情"),而"订单 SO-42"只有块自己知道。 */
600
- onTabTitle: (E, j) => l.setTitle(E, j)
659
+ onTabTitle: (T, D) => a.setTitle(T, D)
601
660
  }));
602
661
  }
603
- async function wt() {
604
- const $ = o.uuid, E = await zs([$]);
605
- $ === o.uuid && (b.value = E.find((j) => j.id === $) ?? null);
662
+ async function xt() {
663
+ const w = s.uuid, T = await Js([w]);
664
+ w === s.uuid && (c.value = T.find((D) => D.id === w) ?? null);
606
665
  }
607
- function zt() {
608
- window.dispatchEvent(new CustomEvent("magic-block:open-console", { detail: { uuid: o.uuid } }));
666
+ function Kt() {
667
+ window.dispatchEvent(new CustomEvent("magic-block:open-console", { detail: { uuid: s.uuid } }));
609
668
  }
610
- function Ht($ = !1) {
611
- $ && B?.(), B = Js(o.uuid, l.key);
669
+ function qt(w = !1) {
670
+ w && C?.(), C = Xs(s.uuid, a.key);
612
671
  }
613
- const Q = ($) => !pn($, i), V = O(() => {
614
- if (!r.value) return "";
615
- const $ = Ae(o.uuid, l.key, Q);
616
- return $ ? `管理员:切到还挂着这个块的标签 ${$}(点一下这一块会亮红框)` : "管理员:这个块只在这一条标签里挂着 —— 点一下会亮几秒红框";
672
+ const tt = (w) => !mn(w, i), V = j(() => {
673
+ if (!u.value) return "";
674
+ const w = Oe(s.uuid, a.key, tt);
675
+ return w ? `管理员:切到还挂着这个块的标签 ${w}(点一下这一块会亮红框)` : "管理员:这个块只在这一条标签里挂着 —— 点一下会亮几秒红框";
617
676
  });
618
- function A() {
619
- if (!r.value) return;
620
- const $ = Ae(o.uuid, l.key, Q);
621
- wn(o.uuid), $ && Ee($);
622
- }
623
- function it($) {
624
- let E = $.parentElement;
625
- for (; E; ) {
626
- if (getComputedStyle(E).overflowY !== "visible" && E.clientHeight > 0) return E;
627
- E = E.parentElement;
677
+ function O() {
678
+ if (!u.value) return;
679
+ const w = Oe(s.uuid, a.key, tt);
680
+ Sn(s.uuid), w && Te(w);
681
+ }
682
+ function ct(w) {
683
+ let T = w.parentElement;
684
+ for (; T; ) {
685
+ if (getComputedStyle(T).overflowY !== "visible" && T.clientHeight > 0) return T;
686
+ T = T.parentElement;
628
687
  }
629
688
  return document.documentElement;
630
689
  }
631
690
  function W() {
632
- const $ = m.value;
633
- if (!$) return 0;
634
- const E = it($), j = getComputedStyle(E), ut = parseFloat(j.paddingTop) || 0, jt = parseFloat(j.paddingBottom) || 0, z = parseFloat(j.borderTopWidth) || 0, Dt = E === document.documentElement, ne = Dt ? Math.max(0, window.innerHeight - ut - jt) : Math.max(0, E.clientHeight - ut - jt), se = Dt ? ut : E.getBoundingClientRect().top + z + ut, oe = Dt ? window.scrollY || 0 : E.scrollTop, q = $.getBoundingClientRect().top - se + oe;
635
- return Math.max(0, Math.floor(ne - q));
691
+ const w = m.value;
692
+ if (!w) return 0;
693
+ const T = ct(w), D = getComputedStyle(T), rt = parseFloat(D.paddingTop) || 0, It = parseFloat(D.paddingBottom) || 0, H = parseFloat(D.borderTopWidth) || 0, Nt = T === document.documentElement, oe = Nt ? Math.max(0, window.innerHeight - rt - It) : Math.max(0, T.clientHeight - rt - It), le = Nt ? rt : T.getBoundingClientRect().top + H + rt, ae = Nt ? window.scrollY || 0 : T.scrollTop, J = w.getBoundingClientRect().top - le + ae;
694
+ return Math.max(0, Math.floor(oe - J));
636
695
  }
637
696
  function Y() {
638
- if (!l.active.value || !m.value) return;
639
- const $ = W();
640
- $ > 0 && Math.abs($ - x.value) > 1 && (x.value = $);
697
+ if (!a.active.value || !m.value) return;
698
+ const w = W();
699
+ w > 0 && Math.abs(w - g.value) > 1 && (g.value = w);
641
700
  }
642
- function st() {
701
+ function ot() {
643
702
  if (!m.value) return;
644
- const $ = it(m.value);
645
- _ !== $ && (_ = $, g?.disconnect(), g = null), Y(), !(g || typeof ResizeObserver > "u") && (g = new ResizeObserver(() => Y()), g.observe($));
646
- }
647
- return Ot(v, () => bt()), Ot(U, () => {
648
- f.value = 0, x.value = 0, st();
649
- }, { flush: "post" }), Ot(() => o.uuid, () => {
650
- Ze().then(() => st());
651
- }), Ot(() => l.active.value, ($) => {
652
- $ && Ze().then(() => {
653
- st();
654
- const E = m.value;
655
- !E || !E.isConnected || E.offsetParent === null || h.value && E.scrollIntoView({ behavior: "smooth", block: "center" });
703
+ const w = ct(m.value);
704
+ _ !== w && (_ = w, y?.disconnect(), y = null), Y(), !(y || typeof ResizeObserver > "u") && (y = new ResizeObserver(() => Y()), y.observe(w));
705
+ }
706
+ return Pt(f, () => ft()), Pt(U, () => {
707
+ v.value = 0, g.value = 0, ot();
708
+ }, { flush: "post" }), Pt(() => s.uuid, () => {
709
+ Qe().then(() => ot());
710
+ }), Pt(() => a.active.value, (w) => {
711
+ w && Qe().then(() => {
712
+ ot();
713
+ const T = m.value;
714
+ !T || !T.isConnected || T.offsetParent === null || h.value && T.scrollIntoView({ behavior: "smooth", block: "center" });
656
715
  });
657
- }), Ot(() => o.uuid, () => {
658
- f.value = 0, b.value = null, Ht(!0), h.value = ye() === o.uuid, wt();
659
- }), ln(() => {
660
- F = Fs(() => void wt()), R = qs(() => {
661
- h.value = ye() === o.uuid;
662
- }), h.value = ye() === o.uuid, Ht(), st(), wt();
663
- }), un(() => {
664
- g?.disconnect(), g = null, F?.(), F = null, R?.(), R = null, B?.(), B = null, M?.(), M = null;
665
- }), ($, E) => (c(), d("div", {
716
+ }), Pt(() => s.uuid, () => {
717
+ v.value = 0, c.value = null, qt(!0), h.value = $e() === s.uuid, xt();
718
+ }), rn(() => {
719
+ A = qs(() => void xt()), R = Zs(() => {
720
+ h.value = $e() === s.uuid;
721
+ }), h.value = $e() === s.uuid, qt(), ot(), xt();
722
+ }), dn(() => {
723
+ y?.disconnect(), y = null, A?.(), A = null, R?.(), R = null, C?.(), C = null, E?.(), E = null;
724
+ }), (w, T) => (d(), p("div", {
666
725
  ref_key: "el",
667
726
  ref: m,
668
- class: H(["mb", { "mb--admin": _t(r), "mb--lit": _t(r) && h.value }]),
669
- style: rn(Lt.value),
670
- "data-magic-block": a.uuid,
671
- "data-magic-module": a.module
727
+ class: K(["mb", { "mb--admin": it(u), "mb--lit": it(u) && h.value }]),
728
+ style: pn(Dt.value),
729
+ "data-magic-block": o.uuid,
730
+ "data-magic-module": o.module
672
731
  }, [
673
- kt.value ? (c(), d("iframe", {
732
+ $t.value ? (d(), p("iframe", {
674
733
  key: 0,
675
734
  ref_key: "frame",
676
- ref: v,
735
+ ref: f,
677
736
  class: "mb__frame",
678
737
  srcdoc: U.value,
679
- title: L.value,
738
+ title: P.value,
680
739
  scrolling: "no",
681
740
  sandbox: "allow-scripts allow-forms allow-modals allow-popups allow-downloads"
682
- }, null, 8, Zs)) : (c(), d("div", {
741
+ }, null, 8, no)) : (d(), p("div", {
683
742
  key: 1,
684
- class: H(["mb__empty", { "mb__empty--off": G.value === "invalid", "mb__empty--draft": G.value === "draft" }]),
685
- onClick: A
743
+ class: K(["mb__empty", { "mb__empty--off": z.value === "invalid", "mb__empty--draft": z.value === "draft" }]),
744
+ onClick: O
686
745
  }, [
687
- s("p", Xs, p(pt.value), 1),
688
- s("p", Qs, p(Z.value), 1),
689
- G.value === "invalid" && gt.value ? (c(), d("p", to, p(gt.value), 1)) : k("", !0),
690
- G.value === "invalid" && yt.value.length > 0 ? (c(), d("ul", eo, [
691
- (c(!0), d(T, null, I(yt.value, (j, ut) => (c(), d("li", {
692
- key: ut,
746
+ l("p", so, b(Z.value), 1),
747
+ l("p", oo, b(X.value), 1),
748
+ z.value === "invalid" && yt.value ? (d(), p("p", lo, b(yt.value), 1)) : k("", !0),
749
+ z.value === "invalid" && kt.value.length > 0 ? (d(), p("ul", ao, [
750
+ (d(!0), p(M, null, N(kt.value, (D, rt) => (d(), p("li", {
751
+ key: rt,
693
752
  class: "mb__issue"
694
- }, p(j.message), 1))), 128))
753
+ }, b(D.message), 1))), 128))
695
754
  ])) : k("", !0),
696
- s("button", {
755
+ l("button", {
697
756
  class: "mb__go",
698
757
  type: "button",
699
- onClick: Ce(zt, ["stop"])
758
+ onClick: Ee(Kt, ["stop"])
700
759
  }, "去控制台")
701
760
  ], 2)),
702
- _t(r) ? (c(), d("span", no)) : k("", !0),
703
- _t(r) && kt.value ? (c(), d(T, { key: 3 }, [
704
- s("button", {
761
+ it(u) ? (d(), p("span", io)) : k("", !0),
762
+ it(u) && $t.value ? (d(), p(M, { key: 3 }, [
763
+ l("button", {
705
764
  class: "mb__grab mb__grab--top",
706
765
  type: "button",
707
766
  title: V.value,
708
767
  "aria-label": V.value,
709
- onClick: A
710
- }, null, 8, so),
711
- s("button", {
768
+ onClick: O
769
+ }, null, 8, uo),
770
+ l("button", {
712
771
  class: "mb__grab mb__grab--right",
713
772
  type: "button",
714
773
  title: V.value,
715
774
  "aria-label": V.value,
716
- onClick: A
717
- }, null, 8, oo),
718
- s("button", {
775
+ onClick: O
776
+ }, null, 8, co),
777
+ l("button", {
719
778
  class: "mb__grab mb__grab--bottom",
720
779
  type: "button",
721
780
  title: V.value,
722
781
  "aria-label": V.value,
723
- onClick: A
724
- }, null, 8, ao),
725
- s("button", {
782
+ onClick: O
783
+ }, null, 8, ro),
784
+ l("button", {
726
785
  class: "mb__grab mb__grab--left",
727
786
  type: "button",
728
787
  title: V.value,
729
788
  "aria-label": V.value,
730
- onClick: A
731
- }, null, 8, lo)
789
+ onClick: O
790
+ }, null, 8, po)
732
791
  ], 64)) : k("", !0)
733
- ], 14, Ys));
792
+ ], 14, eo));
734
793
  }
735
- }), uo = /* @__PURE__ */ bn(io, [["__scopeId", "data-v-8e1e849f"]]), ro = /* @__PURE__ */ Re({
794
+ }), fo = /* @__PURE__ */ vn(bo, [["__scopeId", "data-v-8e1e849f"]]), mo = /* @__PURE__ */ Pe({
736
795
  __name: "MagicBlockPage",
737
796
  props: {
738
797
  uuid: { default: "" },
@@ -740,70 +799,177 @@ const Ys = ["data-magic-block", "data-magic-module"], Zs = ["srcdoc", "title"],
740
799
  module: { default: "" },
741
800
  theme: { type: Boolean, default: !0 }
742
801
  },
743
- setup(a) {
744
- const o = a, l = rs(), i = O(() => {
745
- const r = l.meta?.blockUuid;
746
- return typeof r == "string" && r.trim() ? r.trim() : o.uuid;
802
+ setup(o) {
803
+ const s = o, a = ps(), i = j(() => {
804
+ const u = a.meta?.blockUuid;
805
+ return typeof u == "string" && u.trim() ? u.trim() : s.uuid;
747
806
  });
748
- return (r, m) => (c(), ls(uo, {
807
+ return (u, m) => (d(), cs(fo, {
749
808
  uuid: i.value,
750
- name: a.name,
751
- module: a.module,
752
- theme: a.theme
809
+ name: o.name,
810
+ module: o.module,
811
+ theme: o.theme
753
812
  }, null, 8, ["uuid", "name", "module", "theme"]));
754
813
  }
755
814
  });
756
- function ht(a) {
757
- return typeof a == "string" ? a.trim() : "";
758
- }
759
- function co(a) {
760
- const o = ht(a?.meta?.blockUuid);
761
- if (o) return o;
762
- const l = a?.props;
763
- if (!l || typeof l != "object" || Array.isArray(l)) return "";
764
- const i = l.default;
765
- return !i || typeof i != "object" || Array.isArray(i) ? "" : ht(i.uuid);
766
- }
767
- function po(a, o) {
768
- const l = [], i = /* @__PURE__ */ new Set();
769
- for (const r of a ?? []) {
770
- if (!r || r.redirect || r.components?.default !== o) continue;
771
- const m = co(r);
815
+ function _t(o) {
816
+ return String(o ?? "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
817
+ }
818
+ function vo(o) {
819
+ return /^(https?:\/\/|mailto:|\/(?!\/))/i.test(String(o ?? "").trim());
820
+ }
821
+ function Lt(o) {
822
+ const s = String(o ?? "");
823
+ let a = "", i = 0;
824
+ for (; i < s.length; ) {
825
+ const u = s.slice(i), m = /^`([^`]+)`/.exec(u);
826
+ if (m) {
827
+ a += `<code>${_t(m[1])}</code>`, i += m[0].length;
828
+ continue;
829
+ }
830
+ const f = /^!\[[^\]]*\]\([^)\s]*\)/.exec(u);
831
+ if (f) {
832
+ a += _t(f[0]), i += f[0].length;
833
+ continue;
834
+ }
835
+ const c = /^\[([^\]]*)\]\(([^)\s]*)\)/.exec(u);
836
+ if (c && vo(c[2])) {
837
+ a += `<a href="${_t(c[2])}" target="_blank" rel="noopener noreferrer">${Lt(c[1])}</a>`, i += c[0].length;
838
+ continue;
839
+ }
840
+ const h = /^\*\*([^*]+)\*\*/.exec(u);
841
+ if (h) {
842
+ a += `<strong>${_t(h[1])}</strong>`, i += h[0].length;
843
+ continue;
844
+ }
845
+ const v = /^\*([^*\n]+)\*/.exec(u) ?? /^_([^_\n]+)_/.exec(u);
846
+ if (v) {
847
+ a += `<em>${_t(v[1])}</em>`, i += v[0].length;
848
+ continue;
849
+ }
850
+ a += _t(s[i]), i += 1;
851
+ }
852
+ return a;
853
+ }
854
+ function ho(o) {
855
+ const s = String(o ?? "").replace(/\r\n?/g, `
856
+ `).split(`
857
+ `), a = [];
858
+ let i = "", u = [], m = [], f = !1, c = [];
859
+ const h = () => {
860
+ u.length > 0 && (a.push(`<p>${u.map((E) => Lt(E)).join("<br>")}</p>`), u = []);
861
+ }, v = () => {
862
+ m.length > 0 && (a.push(`<blockquote>${m.map((E) => Lt(E)).join("<br>")}</blockquote>`), m = []);
863
+ }, g = () => {
864
+ i && (a.push(`</${i}>`), i = "");
865
+ }, _ = () => {
866
+ h(), v(), g();
867
+ }, y = (E) => {
868
+ i !== E && (g(), a.push(`<${E}>`), i = E);
869
+ };
870
+ for (const E of s) {
871
+ const A = E.replace(/\s+$/, "");
872
+ if (/^\s*```/.test(A)) {
873
+ f ? (a.push(`<pre><code>${_t(c.join(`
874
+ `))}</code></pre>`), c = [], f = !1) : (_(), f = !0);
875
+ continue;
876
+ }
877
+ if (f) {
878
+ c.push(E);
879
+ continue;
880
+ }
881
+ if (!A.trim()) {
882
+ _();
883
+ continue;
884
+ }
885
+ const C = /^(#{1,6})\s+(.*)$/.exec(A);
886
+ if (C) {
887
+ _();
888
+ const Z = C[1].length;
889
+ a.push(`<h${Z}>${Lt(C[2])}</h${Z}>`);
890
+ continue;
891
+ }
892
+ if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(A)) {
893
+ _(), a.push("<hr>");
894
+ continue;
895
+ }
896
+ const R = /^\s*[-*+]\s+(.*)$/.exec(A);
897
+ if (R) {
898
+ h(), v(), y("ul"), a.push(`<li>${Lt(R[1])}</li>`);
899
+ continue;
900
+ }
901
+ const P = /^\s*\d+[.)]\s+(.*)$/.exec(A);
902
+ if (P) {
903
+ h(), v(), y("ol"), a.push(`<li>${Lt(P[1])}</li>`);
904
+ continue;
905
+ }
906
+ const z = /^\s*>\s?(.*)$/.exec(A);
907
+ if (z) {
908
+ h(), g(), m.push(z[1]);
909
+ continue;
910
+ }
911
+ v(), g(), u.push(A);
912
+ }
913
+ return f && a.push(`<pre><code>${_t(c.join(`
914
+ `))}</code></pre>`), _(), a.join("");
915
+ }
916
+ function un(o, s = 120) {
917
+ const i = (String(o ?? "").replace(/\r\n?/g, `
918
+ `).split(`
919
+ `).map((u) => u.trim()).find((u) => u.length > 0) ?? "").replace(/^#{1,6}\s+/, "").replace(/^\s*[-*+]\s+/, "").replace(/^\s*\d+[.)]\s+/, "").replace(/^>\s?/, "").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\*\*([^*]+)\*\*/g, "$1").replace(/\*([^*]+)\*/g, "$1").replace(/_([^_]+)_/g, "$1").replace(/\s+/g, " ").trim();
920
+ return i.length > s ? `${i.slice(0, s)}…` : i;
921
+ }
922
+ function gt(o) {
923
+ return typeof o == "string" ? o.trim() : "";
924
+ }
925
+ function _o(o) {
926
+ const s = gt(o?.meta?.blockUuid);
927
+ if (s) return s;
928
+ const a = o?.props;
929
+ if (!a || typeof a != "object" || Array.isArray(a)) return "";
930
+ const i = a.default;
931
+ return !i || typeof i != "object" || Array.isArray(i) ? "" : gt(i.uuid);
932
+ }
933
+ function go(o, s) {
934
+ const a = [], i = /* @__PURE__ */ new Set();
935
+ for (const u of o ?? []) {
936
+ if (!u || u.redirect || u.components?.default !== s) continue;
937
+ const m = _o(u);
772
938
  if (!m || i.has(m)) continue;
773
939
  i.add(m);
774
- const v = ht(r.path), b = ht(r.meta?.title) || ht(r.meta?.sub) || v;
775
- l.push({ uuid: m, path: v, title: b, module: ht(r.meta?.module), brief: ht(r.meta?.brief) });
940
+ const f = gt(u.path), c = gt(u.meta?.title) || gt(u.meta?.sub) || f;
941
+ a.push({ uuid: m, path: f, title: c, module: gt(u.meta?.module), brief: gt(u.meta?.brief) });
776
942
  }
777
- return l;
943
+ return a;
778
944
  }
779
- function bo(a, o, l) {
945
+ function yo(o, s, a) {
780
946
  const i = /* @__PURE__ */ new Set();
781
- for (const r of l ?? []) i.add(ht(r));
782
- return po(a, o).filter((r) => !i.has(r.uuid));
783
- }
784
- const ke = "pages.lock.ts";
785
- function mo(a, o) {
786
- const l = String(a || "").split(/[^A-Za-z0-9]+/).filter(Boolean);
787
- if (l.length === 0) return `Page${o + 1}`;
788
- const i = l.map((r) => r[0].toUpperCase() + r.slice(1)).join("");
947
+ for (const u of a ?? []) i.add(gt(u));
948
+ return go(o, s).filter((u) => !i.has(u.uuid));
949
+ }
950
+ const we = "pages.lock.ts";
951
+ function ko(o, s) {
952
+ const a = String(o || "").split(/[^A-Za-z0-9]+/).filter(Boolean);
953
+ if (a.length === 0) return `Page${s + 1}`;
954
+ const i = a.map((u) => u[0].toUpperCase() + u.slice(1)).join("");
789
955
  return /^[0-9]/.test(i) ? `P${i}` : i;
790
956
  }
791
- function fo(a, o) {
792
- if (!o.has(a))
793
- return o.add(a), a;
794
- let l = 2;
795
- for (; o.has(`${a}${l}`); ) l += 1;
796
- const i = `${a}${l}`;
797
- return o.add(i), i;
798
- }
799
- function vo(a) {
800
- const o = (a ?? []).filter((m) => m && typeof m.path == "string" && m.path.trim() !== ""), l = /* @__PURE__ */ new Set(), i = [];
801
- o.forEach((m, v) => {
802
- const b = m.group?.trim() || "(没写 meta.group)";
803
- let h = i.find((f) => f.title === b);
804
- h || (h = { title: b, rows: [] }, i.push(h)), h.rows.push({ key: fo(mo(m.path, v), l), row: m });
957
+ function $o(o, s) {
958
+ if (!s.has(o))
959
+ return s.add(o), o;
960
+ let a = 2;
961
+ for (; s.has(`${o}${a}`); ) a += 1;
962
+ const i = `${o}${a}`;
963
+ return s.add(i), i;
964
+ }
965
+ function wo(o) {
966
+ const s = (o ?? []).filter((m) => m && typeof m.path == "string" && m.path.trim() !== ""), a = /* @__PURE__ */ new Set(), i = [];
967
+ s.forEach((m, f) => {
968
+ const c = m.group?.trim() || "(没写 meta.group)";
969
+ let h = i.find((v) => v.title === c);
970
+ h || (h = { title: c, rows: [] }, i.push(h)), h.rows.push({ key: $o(ko(m.path, f), a), row: m });
805
971
  });
806
- const r = [
972
+ const u = [
807
973
  "/* 生成物:**每次导出都会重写**,别手改 —— 改了下次导出就没了。",
808
974
  " *",
809
975
  " * 这个文件回答「块的前端(index.open.html 那一侧)里我能跳哪些页面、能调什么」。",
@@ -829,17 +995,17 @@ function vo(a) {
829
995
  ""
830
996
  ];
831
997
  if (i.length === 0)
832
- r.push("/* ⚠️ 这次导出没拿到路由表(这个应用没装 vue-router,或者一条页面路由都没有)。 */", "export const Page = {} as const", "");
998
+ u.push("/* ⚠️ 这次导出没拿到路由表(这个应用没装 vue-router,或者一条页面路由都没有)。 */", "export const Page = {} as const", "");
833
999
  else {
834
- r.push("export const Page = {");
1000
+ u.push("export const Page = {");
835
1001
  for (const m of i) {
836
- r.push(` // ── ${m.title} ──`);
837
- for (const v of m.rows)
838
- r.push(` /** ${v.row.title?.trim() || v.row.path}(${v.row.path}) */`), r.push(` ${v.key}: '${v.row.path}',`);
1002
+ u.push(` // ── ${m.title} ──`);
1003
+ for (const f of m.rows)
1004
+ u.push(` /** ${f.row.title?.trim() || f.row.path}(${f.row.path}) */`), u.push(` ${f.key}: '${f.row.path}',`);
839
1005
  }
840
- r.push("} as const", "");
1006
+ u.push("} as const", "");
841
1007
  }
842
- return r.push(
1008
+ return u.push(
843
1009
  "/** `Page` 里那些路径的联合类型(只想收页面路径的参数可以写它)。 */",
844
1010
  "export type PagePath = (typeof Page)[keyof typeof Page]",
845
1011
  "",
@@ -891,422 +1057,419 @@ function vo(a) {
891
1057
  "",
892
1058
  "export {}",
893
1059
  ""
894
- ), r.join(`
1060
+ ), u.join(`
895
1061
  `);
896
1062
  }
897
- function xn() {
1063
+ function En() {
898
1064
  return typeof window < "u" && typeof window.showDirectoryPicker == "function";
899
1065
  }
900
- const ho = "这个浏览器没法直接写你本机的文件夹(少了 File System Access API):请用 Chrome / Edge,并且从 https 或 http://localhost 打开这个页面(内网 http 会更少 API)。";
901
- async function $e() {
902
- if (!xn()) throw new Error(ho);
1066
+ const xo = "这个浏览器没法直接写你本机的文件夹(少了 File System Access API):请用 Chrome / Edge,并且从 https 或 http://localhost 打开这个页面(内网 http 会更少 API)。";
1067
+ async function xe() {
1068
+ if (!En()) throw new Error(xo);
903
1069
  try {
904
- const a = await window.showDirectoryPicker({ mode: "readwrite", id: "labull-magic-block" });
905
- return { name: a.name, handle: a };
906
- } catch (a) {
907
- const o = a instanceof Error ? a.name : "";
908
- throw o === "AbortError" ? new Error("取消选目录了:想导出就再点一次「选择文件夹」") : o === "SecurityError" ? new Error(`选不了这个目录:浏览器不让(${ee(a)})—— 换一个目录,或确认页面是 https / localhost`) : new Error(`选目录失败:${ee(a)}`);
1070
+ const o = await window.showDirectoryPicker({ mode: "readwrite", id: "labull-magic-block" });
1071
+ return { name: o.name, handle: o };
1072
+ } catch (o) {
1073
+ const s = o instanceof Error ? o.name : "";
1074
+ throw s === "AbortError" ? new Error("取消选目录了:想导出就再点一次「选择文件夹」") : s === "SecurityError" ? new Error(`选不了这个目录:浏览器不让(${se(o)})—— 换一个目录,或确认页面是 https / localhost`) : new Error(`选目录失败:${se(o)}`);
909
1075
  }
910
1076
  }
911
- function ee(a) {
912
- return (a instanceof Error ? a.message.trim() : String(a)) || "没有说原因";
913
- }
914
- function Pe(a) {
915
- const o = String(a ?? "").split("/");
916
- for (const l of o)
917
- if (!l || l === "." || l === ".." || l.includes("\\") || /^[A-Za-z]:/.test(l))
918
- throw new Error(`路径不合法:${a}(要相对路径,不许 .. / 盘符 / 反斜杠)`);
919
- return o;
920
- }
921
- function _o(a) {
922
- const o = String(a ?? "");
923
- let l = 3735928559, i = 1103547991;
924
- for (let r = 0; r < o.length; r += 1) {
925
- const m = o.charCodeAt(r);
926
- l = Math.imul(l ^ m, 2654435761), i = Math.imul(i ^ m, 1597334677);
1077
+ function se(o) {
1078
+ return (o instanceof Error ? o.message.trim() : String(o)) || "没有说原因";
1079
+ }
1080
+ function Le(o) {
1081
+ const s = String(o ?? "").split("/");
1082
+ for (const a of s)
1083
+ if (!a || a === "." || a === ".." || a.includes("\\") || /^[A-Za-z]:/.test(a))
1084
+ throw new Error(`路径不合法:${o}(要相对路径,不许 .. / 盘符 / 反斜杠)`);
1085
+ return s;
1086
+ }
1087
+ function Co(o) {
1088
+ const s = String(o ?? "");
1089
+ let a = 3735928559, i = 1103547991;
1090
+ for (let u = 0; u < s.length; u += 1) {
1091
+ const m = s.charCodeAt(u);
1092
+ a = Math.imul(a ^ m, 2654435761), i = Math.imul(i ^ m, 1597334677);
927
1093
  }
928
- return l = Math.imul(l ^ l >>> 16, 2246822507) ^ Math.imul(i ^ i >>> 13, 3266489909), i = Math.imul(i ^ i >>> 16, 2246822507) ^ Math.imul(l ^ l >>> 13, 3266489909), `${(4294967296 * (2097151 & i) + (l >>> 0)).toString(36)}:${o.length}`;
1094
+ return a = Math.imul(a ^ a >>> 16, 2246822507) ^ Math.imul(i ^ i >>> 13, 3266489909), i = Math.imul(i ^ i >>> 16, 2246822507) ^ Math.imul(a ^ a >>> 13, 3266489909), `${(4294967296 * (2097151 & i) + (a >>> 0)).toString(36)}:${s.length}`;
929
1095
  }
930
- const go = 8;
931
- async function vt(a, o) {
932
- let l = 0;
1096
+ const So = 8;
1097
+ async function ht(o, s) {
1098
+ let a = 0;
933
1099
  const i = async () => {
934
1100
  for (; ; ) {
935
- const r = l;
936
- if (l += 1, r >= a.length) return;
937
- await o(a[r], r);
1101
+ const u = a;
1102
+ if (a += 1, u >= o.length) return;
1103
+ await s(o[u], u);
938
1104
  }
939
1105
  };
940
- await Promise.all(Array.from({ length: Math.max(1, Math.min(go, a.length)) }, () => i()));
941
- }
942
- function yo(a) {
943
- const o = /* @__PURE__ */ new Map();
944
- return (l) => {
945
- const i = l.join("\0"), r = o.get(i);
946
- if (r) return r;
947
- let m = Promise.resolve(a);
948
- for (let v = 0; v < l.length; v += 1) {
949
- const b = l[v], h = l.slice(0, v + 1).join("\0"), f = o.get(h);
950
- m = f ?? m.then((x) => x.getDirectoryHandle(b, { create: !0 })), f || o.set(h, m);
1106
+ await Promise.all(Array.from({ length: Math.max(1, Math.min(So, o.length)) }, () => i()));
1107
+ }
1108
+ function Eo(o) {
1109
+ const s = /* @__PURE__ */ new Map();
1110
+ return (a) => {
1111
+ const i = a.join("\0"), u = s.get(i);
1112
+ if (u) return u;
1113
+ let m = Promise.resolve(o);
1114
+ for (let f = 0; f < a.length; f += 1) {
1115
+ const c = a[f], h = a.slice(0, f + 1).join("\0"), v = s.get(h);
1116
+ m = v ?? m.then((g) => g.getDirectoryHandle(c, { create: !0 })), v || s.set(h, m);
951
1117
  }
952
1118
  return m;
953
1119
  };
954
1120
  }
955
- async function ko(a, o, l) {
1121
+ async function To(o, s, a) {
956
1122
  try {
957
- return await (await (await a.getFileHandle(o)).getFile()).text() === l;
1123
+ return await (await (await o.getFileHandle(s)).getFile()).text() === a;
958
1124
  } catch {
959
1125
  return !1;
960
1126
  }
961
1127
  }
962
- async function $o(a, o, l, i = {}) {
963
- const r = Object.entries(o ?? {}).map(([B, R]) => {
964
- const L = String(R ?? "");
965
- return { path: B, parts: Pe(B), body: L, digest: _o(L) };
966
- }), m = r.length, v = [], b = yo(a.handle), h = i.verify === !0, f = i.trust, x = i.existing, _ = /* @__PURE__ */ new Map();
967
- let g = 0, M = 0, F = 0;
968
- return l?.(0, m), await vt(r, async (B) => {
1128
+ async function Bo(o, s, a, i = {}) {
1129
+ const u = Object.entries(s ?? {}).map(([C, R]) => {
1130
+ const P = String(R ?? "");
1131
+ return { path: C, parts: Le(C), body: P, digest: Co(P) };
1132
+ }), m = u.length, f = [], c = Eo(o.handle), h = i.verify === !0, v = i.trust, g = i.existing, _ = /* @__PURE__ */ new Map();
1133
+ let y = 0, E = 0, A = 0;
1134
+ return a?.(0, m), await ht(u, async (C) => {
969
1135
  try {
970
- if (f?.get(B.path) === B.digest && (x?.has(B.path) ?? !1))
971
- F += 1, _.set(B.path, B.digest);
1136
+ if (v?.get(C.path) === C.digest && (g?.has(C.path) ?? !1))
1137
+ A += 1, _.set(C.path, C.digest);
972
1138
  else {
973
- const R = await b(B.parts.slice(0, -1)), L = B.parts[B.parts.length - 1];
974
- if (h && await ko(R, L, B.body))
975
- M += 1, _.set(B.path, B.digest);
1139
+ const R = await c(C.parts.slice(0, -1)), P = C.parts[C.parts.length - 1];
1140
+ if (h && await To(R, P, C.body))
1141
+ E += 1, _.set(C.path, C.digest);
976
1142
  else {
977
- const pt = await (await R.getFileHandle(L, { create: !0 })).createWritable();
1143
+ const Z = await (await R.getFileHandle(P, { create: !0 })).createWritable();
978
1144
  try {
979
- await pt.write(B.body);
1145
+ await Z.write(C.body);
980
1146
  } finally {
981
- await pt.close();
1147
+ await Z.close();
982
1148
  }
983
- g += 1, _.set(B.path, B.digest);
1149
+ y += 1, _.set(C.path, C.digest);
984
1150
  }
985
1151
  }
986
1152
  } catch (R) {
987
- v.push({ path: B.path, message: ee(R) });
1153
+ f.push({ path: C.path, message: se(R) });
988
1154
  }
989
- l?.(g + M + F + v.length, m);
990
- }), v.sort((B, R) => B.path < R.path ? -1 : B.path > R.path ? 1 : 0), { written: g, failed: v, total: m, skipped: M, trusted: F, fingerprints: _ };
1155
+ a?.(y + E + A + f.length, m);
1156
+ }), f.sort((C, R) => C.path < R.path ? -1 : C.path > R.path ? 1 : 0), { written: y, failed: f, total: m, skipped: E, trusted: A, fingerprints: _ };
991
1157
  }
992
- async function we(a, o) {
993
- const l = { items: [], topCount: 0, files: 0, dirs: 0 }, i = async (v, b) => {
1158
+ async function Ce(o, s) {
1159
+ const a = { items: [], topCount: 0, files: 0, dirs: 0 }, i = async (f, c) => {
994
1160
  const h = [];
995
- for (const f of await Mt(v)) {
996
- if (f.kind === "file") {
997
- l.files += 1;
1161
+ for (const v of await At(f)) {
1162
+ if (v.kind === "file") {
1163
+ a.files += 1;
998
1164
  continue;
999
1165
  }
1000
- l.dirs += 1, !(b >= o.maxDepth) && (o.skipDirs.includes(f.name) || h.push(f));
1166
+ a.dirs += 1, !(c >= s.maxDepth) && (s.skipDirs.includes(v.name) || h.push(v));
1001
1167
  }
1002
- await vt(h, (f) => i(f, b + 1));
1003
- }, r = await Mt(a.handle), m = [];
1004
- for (const v of r)
1005
- if (l.items.push({ name: v.name, dir: v.kind === "directory" }), v.kind === "file") l.files += 1;
1168
+ await ht(h, (v) => i(v, c + 1));
1169
+ }, u = await At(o.handle), m = [];
1170
+ for (const f of u)
1171
+ if (a.items.push({ name: f.name, dir: f.kind === "directory" }), f.kind === "file") a.files += 1;
1006
1172
  else {
1007
- if (l.dirs += 1, o.skipDirs.includes(v.name) || o.maxDepth <= 0) continue;
1008
- m.push(v);
1173
+ if (a.dirs += 1, s.skipDirs.includes(f.name) || s.maxDepth <= 0) continue;
1174
+ m.push(f);
1009
1175
  }
1010
- return await vt(m, (v) => i(v, 1)), l.topCount = l.items.length, l;
1176
+ return await ht(m, (f) => i(f, 1)), a.topCount = a.items.length, a;
1011
1177
  }
1012
- async function wo(a) {
1013
- const o = [];
1014
- for (const i of await Mt(a.handle)) o.push(i.name);
1015
- let l = 0;
1016
- return await vt(o, async (i) => {
1017
- await a.handle.removeEntry(i, { recursive: !0 }), l += 1;
1018
- }), l;
1178
+ async function Mo(o) {
1179
+ const s = [];
1180
+ for (const i of await At(o.handle)) s.push(i.name);
1181
+ let a = 0;
1182
+ return await ht(s, async (i) => {
1183
+ await o.handle.removeEntry(i, { recursive: !0 }), a += 1;
1184
+ }), a;
1019
1185
  }
1020
- async function xo(a, o) {
1021
- const { wantedFiles: l, wantedDirs: i } = Cn(o), r = /* @__PURE__ */ new Set();
1186
+ async function Ao(o, s) {
1187
+ const { wantedFiles: a, wantedDirs: i } = Tn(s), u = /* @__PURE__ */ new Set();
1022
1188
  let m = 0;
1023
- const v = async (b, h) => {
1024
- const f = [], x = [];
1025
- for (const _ of await Mt(b)) {
1026
- const g = h ? `${h}/${_.name}` : _.name;
1189
+ const f = async (c, h) => {
1190
+ const v = [], g = [];
1191
+ for (const _ of await At(c)) {
1192
+ const y = h ? `${h}/${_.name}` : _.name;
1027
1193
  if (_.kind === "file") {
1028
- l.has(g) ? r.add(g) : f.push(_.name);
1194
+ a.has(y) ? u.add(y) : v.push(_.name);
1029
1195
  continue;
1030
1196
  }
1031
- i.has(g) ? x.push([g, _]) : f.push(_.name);
1197
+ i.has(y) ? g.push([y, _]) : v.push(_.name);
1032
1198
  }
1033
- await vt(f, async (_) => {
1034
- await b.removeEntry(_, { recursive: !0 }), m += 1;
1035
- }), await vt(x, ([_, g]) => v(g, _));
1199
+ await ht(v, async (_) => {
1200
+ await c.removeEntry(_, { recursive: !0 }), m += 1;
1201
+ }), await ht(g, ([_, y]) => f(y, _));
1036
1202
  };
1037
- return await v(a.handle, ""), { removed: m, existing: r };
1038
- }
1039
- function Cn(a) {
1040
- const o = /* @__PURE__ */ new Set(), l = /* @__PURE__ */ new Set();
1041
- for (const i of Object.keys(a ?? {})) {
1042
- const r = Pe(i);
1043
- o.add(r.join("/"));
1044
- for (let m = 1; m < r.length; m += 1) l.add(r.slice(0, m).join("/"));
1203
+ return await f(o.handle, ""), { removed: m, existing: u };
1204
+ }
1205
+ function Tn(o) {
1206
+ const s = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set();
1207
+ for (const i of Object.keys(o ?? {})) {
1208
+ const u = Le(i);
1209
+ s.add(u.join("/"));
1210
+ for (let m = 1; m < u.length; m += 1) a.add(u.slice(0, m).join("/"));
1045
1211
  }
1046
- return { wantedFiles: o, wantedDirs: l };
1212
+ return { wantedFiles: s, wantedDirs: a };
1047
1213
  }
1048
- async function Co(a, o) {
1049
- const { wantedFiles: l, wantedDirs: i } = Cn(o), r = /* @__PURE__ */ new Set(), m = async (v, b) => {
1214
+ async function Ro(o, s) {
1215
+ const { wantedFiles: a, wantedDirs: i } = Tn(s), u = /* @__PURE__ */ new Set(), m = async (f, c) => {
1050
1216
  const h = [];
1051
- for (const f of await Mt(v)) {
1052
- const x = b ? `${b}/${f.name}` : f.name;
1053
- if (f.kind === "file") {
1054
- l.has(x) && r.add(x);
1217
+ for (const v of await At(f)) {
1218
+ const g = c ? `${c}/${v.name}` : v.name;
1219
+ if (v.kind === "file") {
1220
+ a.has(g) && u.add(g);
1055
1221
  continue;
1056
1222
  }
1057
- i.has(x) && h.push([x, f]);
1223
+ i.has(g) && h.push([g, v]);
1058
1224
  }
1059
- await vt(h, ([f, x]) => m(x, f));
1225
+ await ht(h, ([v, g]) => m(g, v));
1060
1226
  };
1061
- return await m(a.handle, ""), r;
1227
+ return await m(o.handle, ""), u;
1062
1228
  }
1063
- function Eo(a, o) {
1064
- if (a.name === o.blocksDir)
1229
+ function Oo(o, s) {
1230
+ if (o.name === s.blocksDir)
1065
1231
  throw new Error(
1066
- `你选中的是「${o.blocksDir}」这一层(它就是放代码的那一层):导出会铺成 ${o.blocksDir}/${o.blocksDir}/…。请选它**上面**那一层 —— 也就是开发目录本身。`
1232
+ `你选中的是「${s.blocksDir}」这一层(它就是放代码的那一层):导出会铺成 ${s.blocksDir}/${s.blocksDir}/…。请选它**上面**那一层 —— 也就是开发目录本身。`
1067
1233
  );
1068
1234
  }
1069
- async function Mt(a) {
1070
- const o = [];
1071
- for await (const l of a.values()) o.push(l);
1072
- return o.sort((l, i) => l.name < i.name ? -1 : l.name > i.name ? 1 : 0), o;
1073
- }
1074
- function So(a) {
1075
- return a.charCodeAt(0) === 65279 ? a.slice(1) : a;
1076
- }
1077
- function To(a) {
1078
- const o = a.lastIndexOf(".");
1079
- return o <= 0 ? "" : a.slice(o).toLowerCase();
1080
- }
1081
- const Bo = { folders: [], failures: [], truncated: !1 };
1082
- async function En(a, o, l) {
1083
- const i = await Mt(a), r = new Array(i.length);
1084
- await vt(i, async (b, h) => {
1085
- const f = o ? `${o}/${b.name}` : b.name, x = { files: {}, failures: [] };
1086
- if (r[h] = x, b.kind === "directory") {
1087
- if (l.skipDirs.includes(b.name)) return;
1088
- const g = await En(b, f, l);
1089
- for (const [M, F] of Object.entries(g.files))
1090
- x.files[`${b.name}/${M}`] = F;
1091
- x.failures.push(...g.failures);
1235
+ async function At(o) {
1236
+ const s = [];
1237
+ for await (const a of o.values()) s.push(a);
1238
+ return s.sort((a, i) => a.name < i.name ? -1 : a.name > i.name ? 1 : 0), s;
1239
+ }
1240
+ function Po(o) {
1241
+ return o.charCodeAt(0) === 65279 ? o.slice(1) : o;
1242
+ }
1243
+ function jo(o) {
1244
+ const s = o.lastIndexOf(".");
1245
+ return s <= 0 ? "" : o.slice(s).toLowerCase();
1246
+ }
1247
+ const Lo = { folders: [], failures: [], truncated: !1 };
1248
+ async function Bn(o, s, a) {
1249
+ const i = await At(o), u = new Array(i.length);
1250
+ await ht(i, async (c, h) => {
1251
+ const v = s ? `${s}/${c.name}` : c.name, g = { files: {}, failures: [] };
1252
+ if (u[h] = g, c.kind === "directory") {
1253
+ if (a.skipDirs.includes(c.name)) return;
1254
+ const y = await Bn(c, v, a);
1255
+ for (const [E, A] of Object.entries(y.files))
1256
+ g.files[`${c.name}/${E}`] = A;
1257
+ g.failures.push(...y.failures);
1092
1258
  return;
1093
1259
  }
1094
- if (!l.platformFiles.includes(b.name)) {
1095
- if (!l.textExt.includes(To(b.name))) {
1096
- x.failures.push({
1260
+ if (!a.platformFiles.includes(c.name)) {
1261
+ if (!a.textExt.includes(jo(c.name))) {
1262
+ g.failures.push({
1097
1263
  kind: "file",
1098
- where: f,
1099
- message: `不是文本文件(认得的扩展名:${l.textExt.join(" ")}),已跳过`
1264
+ where: v,
1265
+ message: `不是文本文件(认得的扩展名:${a.textExt.join(" ")}),已跳过`
1100
1266
  });
1101
1267
  return;
1102
1268
  }
1103
1269
  try {
1104
- const _ = await b.getFile();
1105
- if (_.size > l.maxFileBytes) {
1106
- x.failures.push({
1270
+ const _ = await c.getFile();
1271
+ if (_.size > a.maxFileBytes) {
1272
+ g.failures.push({
1107
1273
  kind: "file",
1108
- where: f,
1109
- message: `文件 ${Math.round(_.size / 1024)} KB 超过上限 ${Math.floor(l.maxFileBytes / 1024)} KB,已跳过`
1274
+ where: v,
1275
+ message: `文件 ${Math.round(_.size / 1024)} KB 超过上限 ${Math.floor(a.maxFileBytes / 1024)} KB,已跳过`
1110
1276
  });
1111
1277
  return;
1112
1278
  }
1113
- x.files[b.name] = So(await _.text());
1279
+ g.files[c.name] = Po(await _.text());
1114
1280
  } catch (_) {
1115
- x.failures.push({ kind: "file", where: f, message: `读不了这个文件:${ee(_)}` });
1281
+ g.failures.push({ kind: "file", where: v, message: `读不了这个文件:${se(_)}` });
1116
1282
  }
1117
1283
  }
1118
1284
  });
1119
- const m = {}, v = [];
1120
- for (const b of r)
1121
- b && (Object.assign(m, b.files), v.push(...b.failures));
1122
- return { files: m, failures: v };
1123
- }
1124
- async function Sn(a, o, l, i) {
1125
- const r = await Mt(a), m = r.filter((_) => _.kind === "directory"), v = r.filter((_) => _.kind === "file"), b = o.join("/"), h = { folders: [], failures: [], truncated: !1 };
1126
- if (m.length === 0 || v.some((_) => _.name === i.entry)) {
1127
- const _ = await En(a, b, i);
1128
- return h.folders.push({ where: b, files: _.files }), h.failures.push(..._.failures), h;
1285
+ const m = {}, f = [];
1286
+ for (const c of u)
1287
+ c && (Object.assign(m, c.files), f.push(...c.failures));
1288
+ return { files: m, failures: f };
1289
+ }
1290
+ async function Mn(o, s, a, i) {
1291
+ const u = await At(o), m = u.filter((_) => _.kind === "directory"), f = u.filter((_) => _.kind === "file"), c = s.join("/"), h = { folders: [], failures: [], truncated: !1 };
1292
+ if (m.length === 0 || f.some((_) => _.name === i.entry)) {
1293
+ const _ = await Bn(o, c, i);
1294
+ return h.folders.push({ where: c, files: _.files }), h.failures.push(..._.failures), h;
1129
1295
  }
1130
- for (const _ of v)
1131
- o.length === 0 && i.rootSkipFiles.includes(_.name.toLowerCase()) || h.failures.push({
1296
+ for (const _ of f)
1297
+ s.length === 0 && i.rootSkipFiles.includes(_.name.toLowerCase()) || h.failures.push({
1132
1298
  kind: "file",
1133
- where: [...o, _.name].join("/"),
1299
+ where: [...s, _.name].join("/"),
1134
1300
  message: `这一层直接放着一份文件,但它自己不是块文件夹、也没有 ${i.entry},文件没有归属`
1135
1301
  });
1136
- const f = m.map((_) => async () => i.skipDirs.includes(_.name) ? Bo : l >= i.maxDepth ? {
1302
+ const v = m.map((_) => async () => i.skipDirs.includes(_.name) ? Lo : a >= i.maxDepth ? {
1137
1303
  folders: [],
1138
1304
  failures: [{
1139
1305
  kind: "dir",
1140
- where: [...o, _.name].join("/"),
1306
+ where: [...s, _.name].join("/"),
1141
1307
  message: `超过最大层数 ${i.maxDepth} 层还没见到 ${i.entry},没有继续往下找`
1142
1308
  }],
1143
1309
  truncated: !0
1144
- } : Sn(_, [...o, _.name], l + 1, i)), x = new Array(f.length);
1145
- await vt(f, async (_, g) => {
1146
- x[g] = await _();
1310
+ } : Mn(_, [...s, _.name], a + 1, i)), g = new Array(v.length);
1311
+ await ht(v, async (_, y) => {
1312
+ g[y] = await _();
1147
1313
  });
1148
- for (const _ of x)
1314
+ for (const _ of g)
1149
1315
  _ && (h.folders.push(..._.folders), h.failures.push(..._.failures), _.truncated && (h.truncated = !0));
1150
1316
  return h;
1151
1317
  }
1152
- function an(a) {
1153
- return a >= 1024 * 1024 ? `${(a / 1024 / 1024).toFixed(1)} MB` : `${Math.max(1, Math.round(a / 1024))} KB`;
1154
- }
1155
- async function Mo(a, o) {
1156
- const l = await Sn(a.handle, [], 0, o), i = {
1157
- root: a.name,
1158
- folders: l.folders,
1159
- failures: l.failures,
1160
- truncated: l.truncated
1161
- }, r = i.folders.reduce(
1162
- (m, v) => m + Object.values(v.files).reduce((b, h) => b + h.length, 0),
1318
+ function cn(o) {
1319
+ return o >= 1024 * 1024 ? `${(o / 1024 / 1024).toFixed(1)} MB` : `${Math.max(1, Math.round(o / 1024))} KB`;
1320
+ }
1321
+ async function Do(o, s) {
1322
+ const a = await Mn(o.handle, [], 0, s), i = {
1323
+ root: o.name,
1324
+ folders: a.folders,
1325
+ failures: a.failures,
1326
+ truncated: a.truncated
1327
+ }, u = i.folders.reduce(
1328
+ (m, f) => m + Object.values(f.files).reduce((c, h) => c + h.length, 0),
1163
1329
  0
1164
1330
  );
1165
- if (r > o.maxBodyBytes)
1331
+ if (u > s.maxBodyBytes)
1166
1332
  throw new Error(
1167
- `这个目录读到的正文有 ${an(r)},超过一次读回的上限 ${an(o.maxBodyBytes)}:请先只留要改的那几个块,或者把大文件挪走。`
1333
+ `这个目录读到的正文有 ${cn(u)},超过一次读回的上限 ${cn(s.maxBodyBytes)}:请先只留要改的那几个块,或者把大文件挪走。`
1168
1334
  );
1169
1335
  return i;
1170
1336
  }
1171
- const Ao = { class: "mbc__head" }, Ro = ["title"], Oo = ["title"], Po = {
1337
+ const Io = { class: "mbc__head" }, No = ["title"], Fo = ["title"], zo = {
1172
1338
  class: "mbc__tabs",
1173
1339
  role: "tablist"
1174
- }, Lo = ["aria-selected"], jo = { class: "mbc__count" }, Do = ["title"], Io = ["aria-selected"], No = ["title"], Fo = {
1340
+ }, Uo = ["aria-selected"], Ho = { class: "mbc__count" }, Ko = ["title"], qo = ["aria-selected"], Vo = ["title"], Jo = {
1175
1341
  key: 1,
1176
1342
  class: "mbc__chip is-ok"
1177
- }, Uo = { class: "mbc__body" }, zo = {
1343
+ }, Go = { class: "mbc__body" }, Wo = {
1178
1344
  key: 0,
1179
1345
  class: "mbc__running"
1180
- }, Ho = ["aria-valuenow"], Ko = {
1346
+ }, Yo = ["aria-valuenow"], Zo = {
1181
1347
  key: 1,
1182
1348
  class: "mbc__confirm"
1183
- }, Vo = { class: "mbc__confirm-title" }, qo = { class: "mbc__confirm-body" }, Jo = {
1349
+ }, Xo = { class: "mbc__confirm-title" }, Qo = { class: "mbc__confirm-body" }, tl = {
1184
1350
  key: 0,
1185
1351
  class: "mbc__mono"
1186
- }, Go = { class: "mbc__confirm-check" }, Wo = { class: "mbc__actions" }, Yo = ["disabled"], Zo = ["disabled"], Xo = ["disabled"], Qo = {
1352
+ }, el = { class: "mbc__confirm-check" }, nl = { class: "mbc__actions" }, sl = ["disabled"], ol = ["disabled"], ll = ["disabled"], al = {
1187
1353
  key: 2,
1188
1354
  class: "mbc__confirm"
1189
- }, ta = { class: "mbc__confirm-title" }, ea = { class: "mbc__confirm-body" }, na = { class: "mbc__mono" }, sa = { class: "mbc__actions" }, oa = ["disabled"], aa = ["disabled"], la = { class: "mbc__panel mbc__panel--blocks" }, ia = { class: "mbc__title" }, ua = { class: "mbc__count" }, ra = {
1355
+ }, il = { class: "mbc__confirm-title" }, ul = { class: "mbc__confirm-body" }, cl = { class: "mbc__mono" }, rl = { class: "mbc__actions" }, dl = ["disabled"], pl = ["disabled"], bl = { class: "mbc__panel mbc__panel--blocks" }, fl = { class: "mbc__title" }, ml = { class: "mbc__count" }, vl = {
1190
1356
  key: 0,
1191
1357
  class: "mbc__count mbc__count--tag"
1192
- }, ca = {
1358
+ }, hl = {
1193
1359
  key: 0,
1194
1360
  class: "mbc__tagbar"
1195
- }, da = ["title", "onClick"], pa = { class: "mbc__list" }, ba = ["title", "onClick"], ma = { class: "mbc__module" }, fa = { class: "mbc__name" }, va = ["title"], ha = {
1361
+ }, _l = ["title", "onClick"], gl = { class: "mbc__list" }, yl = ["title", "onClick"], kl = { class: "mbc__module" }, $l = { class: "mbc__name" }, wl = ["title"], xl = {
1196
1362
  key: 0,
1197
1363
  class: "mbc__where"
1198
- }, _a = ["title"], ga = {
1364
+ }, Cl = ["title"], Sl = {
1199
1365
  key: 0,
1200
1366
  class: "mbc__detail"
1201
- }, ya = {
1367
+ }, El = {
1202
1368
  key: 0,
1203
1369
  class: "mbc__hint"
1204
- }, ka = { class: "mbc__meta" }, $a = {
1205
- key: 0,
1206
- class: "mbc__blockdetail"
1207
- }, wa = {
1370
+ }, Tl = { class: "mbc__meta" }, Bl = ["innerHTML"], Ml = {
1208
1371
  key: 1,
1209
1372
  class: "mbc__hint"
1210
- }, xa = ["disabled", "onClick"], Ca = ["disabled", "onClick"], Ea = ["disabled"], Sa = { class: "mbc__hint" }, Ta = {
1373
+ }, Al = ["disabled", "onClick"], Rl = ["disabled", "onClick"], Ol = ["disabled"], Pl = { class: "mbc__hint" }, jl = {
1211
1374
  key: 0,
1212
1375
  class: "mbc__hint"
1213
- }, Ba = ["disabled", "onClick"], Ma = ["onKeyup"], Aa = ["disabled", "onClick"], Ra = ["disabled"], Oa = {
1376
+ }, Ll = ["disabled", "onClick"], Dl = ["onKeyup"], Il = ["disabled", "onClick"], Nl = ["disabled"], Fl = {
1214
1377
  key: 0,
1215
1378
  class: "mbc__tagbar"
1216
- }, Pa = ["title", "onClick"], La = {
1379
+ }, zl = ["title", "onClick"], Ul = {
1217
1380
  key: 1,
1218
1381
  class: "mbc__tagbar"
1219
- }, ja = ["title", "onClick"], Da = { class: "mbc__mono" }, Ia = { class: "mbc__actions mbc__actions--row" }, Na = ["disabled", "onClick"], Fa = { class: "mbc__versions" }, Ua = { class: "mbc__versions-head" }, za = ["disabled", "onClick"], Ha = {
1382
+ }, Hl = ["title", "onClick"], Kl = { class: "mbc__mono" }, ql = { class: "mbc__actions mbc__actions--row" }, Vl = ["disabled", "onClick"], Jl = { class: "mbc__versions" }, Gl = { class: "mbc__versions-head" }, Wl = ["disabled", "onClick"], Yl = {
1220
1383
  key: 0,
1221
1384
  class: "mbc__hint"
1222
- }, Ka = {
1385
+ }, Zl = {
1223
1386
  key: 1,
1224
1387
  class: "mbc__versions-list"
1225
- }, Va = { class: "mbc__mono" }, qa = { class: "mbc__hint" }, Ja = { class: "mbc__actions" }, Ga = ["disabled", "onClick", "title"], Wa = ["disabled", "onClick", "title"], Ya = ["disabled", "onClick", "title"], Za = ["disabled", "onClick", "title"], Xa = {
1388
+ }, Xl = { class: "mbc__mono" }, Ql = { class: "mbc__hint" }, ta = { class: "mbc__actions" }, ea = ["disabled", "onClick", "title"], na = ["disabled", "onClick", "title"], sa = ["disabled", "onClick", "title"], oa = ["disabled", "onClick", "title"], la = {
1226
1389
  key: 2,
1227
1390
  class: "mbc__hint"
1228
- }, Qa = {
1391
+ }, aa = {
1229
1392
  key: 3,
1230
1393
  class: "mbc__viewer"
1231
- }, tl = { class: "mbc__versions-head" }, el = { class: "mbc__mono" }, nl = { class: "mbc__viewer-body" }, sl = { class: "mbc__panel mbc__panel--export" }, ol = { class: "mbc__field" }, al = ["disabled"], ll = { class: "mbc__field" }, il = { class: "mbc__radio" }, ul = ["checked"], rl = { class: "mbc__radio" }, cl = ["checked"], dl = ["value", "disabled"], pl = {
1394
+ }, ia = { class: "mbc__versions-head" }, ua = { class: "mbc__mono" }, ca = { class: "mbc__viewer-body" }, ra = { class: "mbc__panel mbc__panel--export" }, da = { class: "mbc__field" }, pa = ["disabled"], ba = { class: "mbc__field" }, fa = { class: "mbc__radio" }, ma = ["checked"], va = { class: "mbc__radio" }, ha = ["checked"], _a = ["value", "disabled"], ga = {
1232
1395
  key: 0,
1233
1396
  value: ""
1234
- }, bl = ["value"], ml = { class: "mbc__field" }, fl = ["value"], vl = ["disabled"], hl = ["disabled", "title"], _l = { class: "mbc__hint" }, gl = {
1397
+ }, ya = ["value"], ka = { class: "mbc__field" }, $a = ["value"], wa = ["disabled"], xa = ["disabled", "title"], Ca = { class: "mbc__hint" }, Sa = {
1235
1398
  key: 0,
1236
1399
  class: "mbc__hint"
1237
- }, yl = { class: "mbc__panel mbc__panel--read" }, kl = { class: "mbc__field" }, $l = ["value"], wl = ["disabled"], xl = ["disabled"], Cl = {
1400
+ }, Ea = { class: "mbc__panel mbc__panel--read" }, Ta = { class: "mbc__field" }, Ba = ["value"], Ma = ["disabled"], Aa = ["disabled"], Ra = {
1238
1401
  key: 0,
1239
1402
  class: "mbc__hint"
1240
- }, El = {
1403
+ }, Oa = {
1241
1404
  key: 1,
1242
1405
  class: "mbc__hint"
1243
- }, Sl = {
1406
+ }, Pa = {
1244
1407
  key: 0,
1245
1408
  class: "mbc__hint"
1246
- }, Tl = { class: "mbc__ok-text" }, Bl = ["disabled"], Ml = ["disabled"], Al = {
1409
+ }, ja = { class: "mbc__ok-text" }, La = ["disabled"], Da = ["disabled"], Ia = {
1247
1410
  key: 1,
1248
1411
  class: "mbc__scan"
1249
- }, Rl = { class: "mbc__pick" }, Ol = ["disabled", "checked", "onChange"], Pl = { class: "mbc__name" }, Ll = { class: "mbc__module" }, jl = { class: "mbc__hint" }, Dl = { class: "mbc__mono" }, Il = {
1412
+ }, Na = { class: "mbc__pick" }, Fa = ["disabled", "checked", "onChange"], za = { class: "mbc__name" }, Ua = { class: "mbc__module" }, Ha = { class: "mbc__hint" }, Ka = { class: "mbc__mono" }, qa = {
1250
1413
  key: 0,
1251
1414
  class: "mbc__problem"
1252
- }, Nl = { class: "mbc__hint mbc__mono" }, Fl = {
1415
+ }, Va = { class: "mbc__hint mbc__mono" }, Ja = {
1253
1416
  key: 2,
1254
1417
  class: "mbc__hint"
1255
- }, Ul = { class: "mbc__field" }, zl = ["title"], Hl = {
1418
+ }, Ga = { class: "mbc__field" }, Wa = ["title"], Ya = {
1256
1419
  key: 1,
1257
1420
  class: "mbc__chip is-ok"
1258
- }, Kl = ["title"], Vl = {
1421
+ }, Za = ["title"], Xa = {
1259
1422
  key: 3,
1260
1423
  class: "mbc__hint"
1261
- }, ql = { class: "mbc__field mbc__field--end" }, Jl = ["disabled"], Gl = { class: "mbc__panel mbc__panel--declared" }, Wl = { class: "mbc__title" }, Yl = { class: "p-tag p-tag-info" }, Zl = { class: "mbc__count" }, Xl = {
1424
+ }, Qa = { class: "mbc__field mbc__field--end" }, ti = ["disabled"], ei = { class: "mbc__panel mbc__panel--declared" }, ni = { class: "mbc__title" }, si = { class: "p-tag p-tag-info" }, oi = { class: "mbc__count" }, li = {
1262
1425
  key: 0,
1263
1426
  class: "mbc__hint"
1264
- }, Ql = { class: "mbc__hint" }, ti = { class: "mbc__scan" }, ei = { class: "mbc__pick" }, ni = { class: "mbc__name" }, si = { class: "p-tag p-tag-info" }, oi = { class: "mbc__module" }, ai = { class: "mbc__hint" }, li = { class: "mbc__mono" }, ii = { class: "mbc__hint mbc__mono" }, ui = {
1427
+ }, ai = { class: "mbc__hint" }, ii = { class: "mbc__scan" }, ui = { class: "mbc__pick" }, ci = { class: "mbc__name" }, ri = { class: "p-tag p-tag-info" }, di = { class: "mbc__module" }, pi = { class: "mbc__hint" }, bi = { class: "mbc__mono" }, fi = { class: "mbc__hint mbc__mono" }, mi = {
1265
1428
  key: 3,
1266
1429
  class: "mbc__panel mbc__panel--result"
1267
- }, ri = { class: "mbc__summary" }, ci = { class: "mbc__chip is-ok" }, di = {
1430
+ }, vi = { class: "mbc__summary" }, hi = { class: "mbc__chip is-ok" }, _i = {
1268
1431
  key: 0,
1269
1432
  class: "mbc__chip is-bad"
1270
- }, pi = {
1433
+ }, gi = {
1271
1434
  key: 1,
1272
1435
  class: "mbc__chip is-bad"
1273
- }, bi = {
1436
+ }, yi = {
1274
1437
  key: 2,
1275
1438
  class: "mbc__hint"
1276
- }, mi = { class: "mbc__actions" }, fi = { class: "mbc__foot" }, vi = ["title"], hi = {
1439
+ }, ki = { class: "mbc__actions" }, $i = { class: "mbc__foot" }, wi = ["title"], xi = {
1277
1440
  key: 1,
1278
1441
  class: "mbc__error"
1279
- }, _i = {
1442
+ }, Ci = {
1280
1443
  key: 2,
1281
1444
  class: "mbc__notice"
1282
- }, gi = {
1445
+ }, Si = {
1283
1446
  key: 3,
1284
1447
  class: "mbc__hint mbc__foot-idle"
1285
- }, yi = { class: "mbc__modal-box" }, ki = { class: "mbc__modal-head" }, $i = { class: "mbc__modal-body" }, wi = {
1448
+ }, Ei = { class: "mbc__modal-box" }, Ti = { class: "mbc__modal-head" }, Bi = { class: "mbc__modal-body" }, Mi = {
1286
1449
  key: 0,
1287
1450
  class: "mbc__issues-group"
1288
- }, xi = { class: "mbc__title" }, Ci = { class: "mbc__failures" }, Ei = {
1451
+ }, Ai = { class: "mbc__title" }, Ri = { class: "mbc__failures" }, Oi = {
1289
1452
  key: 1,
1290
1453
  class: "mbc__issues-group"
1291
- }, Si = { class: "mbc__title" }, Ti = { class: "mbc__failures" }, Bi = { class: "mbc__kind" }, Mi = { class: "mbc__mono" }, Ai = {
1454
+ }, Pi = { class: "mbc__title" }, ji = { class: "mbc__failures" }, Li = { class: "mbc__kind" }, Di = { class: "mbc__mono" }, Ii = {
1292
1455
  key: 2,
1293
1456
  class: "mbc__issues-group"
1294
- }, Ri = { class: "mbc__title" }, Oi = { class: "mbc__failures" }, Pi = { class: "mbc__mono" }, Li = {
1457
+ }, Ni = { class: "mbc__title" }, Fi = { class: "mbc__failures" }, zi = { class: "mbc__mono" }, Ui = {
1295
1458
  key: 3,
1296
1459
  class: "mbc__issues-group"
1297
- }, ji = { class: "mbc__title" }, Di = { class: "mbc__failures" }, Ii = { key: 0 }, Ni = {
1460
+ }, Hi = { class: "mbc__title" }, Ki = { class: "mbc__failures" }, qi = { key: 0 }, Vi = {
1298
1461
  key: 1,
1299
1462
  class: "mbc__failures mbc__failures--nested"
1300
- }, Fi = {
1463
+ }, Ji = {
1301
1464
  key: 4,
1302
1465
  class: "mbc__hint"
1303
- }, Ui = { class: "mbc__modal-foot" }, zi = { class: "mbc__modal-box" }, Hi = { class: "mbc__modal-head" }, Ki = { class: "mbc__modal-body" }, Vi = { class: "mbc__reports" }, qi = { class: "mbc__report-head" }, Ji = { class: "mbc__mono" }, Gi = { class: "mbc__report-text" }, Wi = {
1466
+ }, Gi = { class: "mbc__modal-foot" }, Wi = { class: "mbc__modal-box" }, Yi = { class: "mbc__modal-head" }, Zi = { class: "mbc__modal-body" }, Xi = { class: "mbc__reports" }, Qi = { class: "mbc__report-head" }, tu = { class: "mbc__mono" }, eu = { class: "mbc__report-text" }, nu = {
1304
1467
  key: 0,
1305
1468
  class: "mbc__hint"
1306
- }, Yi = { class: "mbc__modal-foot" }, xe = 2, Zi = 100, Xi = 250, Qi = /* @__PURE__ */ Re({
1469
+ }, su = { class: "mbc__modal-foot" }, Se = 2, ou = 100, lu = 250, au = /* @__PURE__ */ Pe({
1307
1470
  __name: "MagicBlockConsole",
1308
- setup(a) {
1309
- const o = {
1471
+ setup(o) {
1472
+ const s = {
1310
1473
  modified: "有改动",
1311
1474
  unchanged: "没改动",
1312
1475
  missing: "目录里没有",
@@ -1314,250 +1477,250 @@ const Ao = { class: "mbc__head" }, Ro = ["title"], Oo = ["title"], Po = {
1314
1477
  两种情形共用它(前端声明了、手里却还没有那个文件夹 / 手里那个文件夹的清单 id 库里没有)
1315
1478
  —— 对用户是同一件事:这个块不在库里。 */
1316
1479
  "not-in-db": "不在数据库"
1317
- }, l = o["not-in-db"], { isStaff: i } = dn(), r = cn(), { active: m } = ps(), v = (n) => !pn(n, r), b = w(!1), h = w(""), f = w([]), x = w(""), _ = w(""), g = w(""), M = w([]), F = w(!1), B = w(!1), R = w("blocks"), L = w(""), G = w([]), pt = w(""), Z = w(""), gt = w(""), yt = w(""), C = w(!1), Lt = w(!1), lt = w(!1), kt = w(!1), nt = w(!1), K = w(null), U = w(null), X = w("one"), $t = w(Ht()), bt = O(() => f.value.find((n) => n.id === $t.value) ?? null), wt = () => X.value === "all" ? {} : { blocks: [$t.value] };
1318
- function zt(n) {
1319
- $t.value = n;
1480
+ }, a = s["not-in-db"], { isStaff: i } = fn(), u = bn(), { active: m } = ms(), f = (n) => !mn(n, u), c = x(!1), h = x(""), v = x([]), g = x(""), _ = x(""), y = x(""), E = x([]), A = x(!1), C = x(!1), R = x("blocks"), P = x(""), z = x([]), Z = x(""), X = x(""), yt = x(""), kt = x(""), S = x(!1), Dt = x(!1), ut = x(!1), $t = x(!1), st = x(!1), q = x(null), U = x(null), Q = x("one"), wt = x(qt()), ft = j(() => v.value.find((n) => n.id === wt.value) ?? null), xt = () => Q.value === "all" ? {} : { blocks: [wt.value] };
1481
+ function Kt(n) {
1482
+ wt.value = n;
1320
1483
  try {
1321
1484
  window.localStorage.setItem("mb:export-block", n);
1322
1485
  } catch {
1323
1486
  }
1324
1487
  }
1325
- function Ht() {
1488
+ function qt() {
1326
1489
  try {
1327
1490
  return window.localStorage.getItem("mb:export-block") ?? "";
1328
1491
  } catch {
1329
1492
  return "";
1330
1493
  }
1331
1494
  }
1332
- Ot(f, (n) => {
1333
- n.length !== 0 && (n.some((t) => t.id === $t.value) || zt(n[0].id));
1495
+ Pt(v, (n) => {
1496
+ n.length !== 0 && (n.some((t) => t.id === wt.value) || Kt(n[0].id));
1334
1497
  });
1335
- const Q = w(null), V = w(""), A = w(null), it = w({}), W = w([]), Y = w([]), st = w({}), $ = w(""), E = w(null);
1336
- async function j(n) {
1337
- $.value = n;
1498
+ const tt = x(null), V = x(""), O = x(null), ct = x({}), W = x([]), Y = x([]), ot = x({}), w = x(""), T = x(null);
1499
+ async function D(n) {
1500
+ w.value = n;
1338
1501
  try {
1339
1502
  const t = await at(`/magic-blocks/${encodeURIComponent(n)}/versions`);
1340
- st.value = { ...st.value, [n]: t.versions ?? [] };
1503
+ ot.value = { ...ot.value, [n]: t.versions ?? [] };
1341
1504
  } catch (t) {
1342
- Nt(t, "读版本列表");
1505
+ zt(t, "读版本列表");
1343
1506
  } finally {
1344
- $.value = "";
1507
+ w.value = "";
1345
1508
  }
1346
1509
  }
1347
- function ut(n) {
1510
+ function rt(n) {
1348
1511
  const t = [n.current ? "当前" : "", n.empty ? "空包(代码被删过)" : ""].filter(Boolean).join("、");
1349
1512
  return `v${n.number}${t ? ` · ${t}` : ""}`;
1350
1513
  }
1351
- function jt(n) {
1514
+ function It(n) {
1352
1515
  return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${Math.round(n / 1024)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
1353
1516
  }
1354
- const z = w(null);
1355
- function Dt(n, t) {
1517
+ const H = x(null);
1518
+ function Nt(n, t) {
1356
1519
  return `${String(t || "").replace(/[\\/:*?"<>|]/g, "").trim() || "block"}-${n}`;
1357
1520
  }
1358
- const ne = (n) => J(async () => {
1359
- const t = Dt(n.id, n.name || n.module);
1360
- let e = K.value, u = null;
1521
+ const oe = (n) => G(async () => {
1522
+ const t = Nt(n.id, n.name || n.module);
1523
+ let e = q.value, r = null;
1361
1524
  if (e)
1362
1525
  try {
1363
- u = await we(e, Q.value ?? await pe());
1526
+ r = await Ce(e, tt.value ?? await fe());
1364
1527
  } catch {
1365
- e = null, u = null;
1528
+ e = null, r = null;
1366
1529
  }
1367
- z.value = { row: n, target: e, folder: t, inventory: u };
1368
- }, C), se = () => J(async () => {
1369
- const n = z.value;
1370
- if (z.value = null, !n) return;
1530
+ H.value = { row: n, target: e, folder: t, inventory: r };
1531
+ }, S), le = () => G(async () => {
1532
+ const n = H.value;
1533
+ if (H.value = null, !n) return;
1371
1534
  const t = `「${n.row.module} / ${n.row.name || n.row.id}」`;
1372
- je(), N.value = { active: !0, percent: 0, stage: "清本机那个文件夹…", failed: !1 };
1535
+ Ie(), F.value = { active: !0, percent: 0, stage: "清本机那个文件夹…", failed: !1 };
1373
1536
  let e = "";
1374
1537
  if (n.target)
1375
1538
  try {
1376
- const u = await oe(n.target, n.folder), S = await wo(u);
1377
- e = `清掉了本机「${n.target.name}/${n.folder}」里的 ${S} 项`;
1378
- } catch (u) {
1379
- e = `本机那份没清成(${Rt(u)})`;
1539
+ const r = await ae(n.target, n.folder), B = await Mo(r);
1540
+ e = `清掉了本机「${n.target.name}/${n.folder}」里的 ${B} 项`;
1541
+ } catch (r) {
1542
+ e = `本机那份没清成(${Ot(r)})`;
1380
1543
  }
1381
1544
  else
1382
1545
  e = "没选开发目录 ⇒ 本机那份没动";
1383
- ot(60, "清库里那份代码…");
1546
+ lt(60, "清库里那份代码…");
1384
1547
  try {
1385
1548
  await at(`/magic-blocks/${n.row.id}`, { method: "DELETE" });
1386
- } catch (u) {
1387
- throw xt(!1, "本机清了,但库里那份代码没清成"), new Error(`${e};但**库里那份代码没清成**(${Rt(u)})—— 再点一次「删除代码文件」`);
1549
+ } catch (r) {
1550
+ throw Ct(!1, "本机清了,但库里那份代码没清成"), new Error(`${e};但**库里那份代码没清成**(${Ot(r)})—— 再点一次「删除代码文件」`);
1388
1551
  }
1389
- await Et(), V.value = `${t}的代码文件已删除:${e};库里那一份也清空了 ——**块还在**(页面上会显示成占位框)。想找回来:上面「块」那一屏点开这一块 → 版本史 → 对上一版点「切回」`, g.value = `删掉了${t}的代码文件(块本身还在)`, xt(!0, "完成");
1390
- }, C);
1391
- async function oe(n, t) {
1552
+ await Et(), V.value = `${t}的代码文件已删除:${e};库里那一份也清空了 ——**块还在**(页面上会显示成占位框)。想找回来:上面「块」那一屏点开这一块 → 版本史 → 对上一版点「切回」`, y.value = `删掉了${t}的代码文件(块本身还在)`, Ct(!0, "完成");
1553
+ }, S);
1554
+ async function ae(n, t) {
1392
1555
  let e = n.handle;
1393
- for (const u of Pe(t))
1394
- e = await e.getDirectoryHandle(u, { create: !0 });
1556
+ for (const r of Le(t))
1557
+ e = await e.getDirectoryHandle(r, { create: !0 });
1395
1558
  return { handle: e, name: `${n.name}/${t}` };
1396
1559
  }
1397
- const q = w(null), Kt = w(!1), N = w({ active: !1, percent: 0, stage: "", failed: !1 }), Tn = O(() => ({
1398
- width: `${Math.max(0, Math.min(100, N.value.percent))}%`,
1399
- background: N.value.failed ? "var(--sp-color-danger)" : "var(--sp-color-primary, var(--primary-color))"
1560
+ const J = x(null), Vt = x(!1), F = x({ active: !1, percent: 0, stage: "", failed: !1 }), An = j(() => ({
1561
+ width: `${Math.max(0, Math.min(100, F.value.percent))}%`,
1562
+ background: F.value.failed ? "var(--sp-color-danger)" : "var(--sp-color-primary, var(--primary-color))"
1400
1563
  }));
1401
- let ae = [], Le = 0;
1402
- function le(n = !1) {
1403
- if (!(!n && performance.now() - Le < Xi)) {
1404
- Le = performance.now();
1564
+ let ie = [], De = 0;
1565
+ function ue(n = !1) {
1566
+ if (!(!n && performance.now() - De < lu)) {
1567
+ De = performance.now();
1405
1568
  try {
1406
- window.localStorage.setItem("mb:progress", JSON.stringify(ae));
1569
+ window.localStorage.setItem("mb:progress", JSON.stringify(ie));
1407
1570
  } catch {
1408
1571
  }
1409
1572
  }
1410
1573
  }
1411
- function ot(n, t) {
1412
- N.value = { active: !0, percent: Math.max(N.value.percent, n), stage: t, failed: !1 }, ae.push({ p: N.value.percent, s: t, t: Math.round(performance.now()) }), le();
1574
+ function lt(n, t) {
1575
+ F.value = { active: !0, percent: Math.max(F.value.percent, n), stage: t, failed: !1 }, ie.push({ p: F.value.percent, s: t, t: Math.round(performance.now()) }), ue();
1413
1576
  }
1414
- function xt(n, t) {
1415
- ot(n ? 100 : N.value.percent, t), N.value = { active: !n, percent: n ? 100 : N.value.percent, stage: t, failed: !n }, le(!0);
1577
+ function Ct(n, t) {
1578
+ lt(n ? 100 : F.value.percent, t), F.value = { active: !n, percent: n ? 100 : F.value.percent, stage: t, failed: !n }, ue(!0);
1416
1579
  }
1417
- function je() {
1418
- ae = [], le(!0);
1580
+ function Ie() {
1581
+ ie = [], ue(!0);
1419
1582
  }
1420
- const De = (n) => (n.disabledReason ?? "").trim(), ie = (n) => (n.issues ?? []).map((t) => String(t?.message ?? "")).filter(Boolean), Vt = (n) => Gs(n.id);
1421
- function Bn(n) {
1422
- x.value = x.value === n.id ? "" : n.id, x.value === n.id && j(n.id);
1583
+ const Ne = (n) => (n.disabledReason ?? "").trim(), ce = (n) => (n.issues ?? []).map((t) => String(t?.message ?? "")).filter(Boolean), Jt = (n) => Qs(n.id);
1584
+ function Rn(n) {
1585
+ g.value = g.value === n.id ? "" : n.id, g.value === n.id && D(n.id);
1423
1586
  const t = m.value;
1424
- wn(n.id);
1425
- const e = n.name || n.id, u = Vt(n);
1426
- if (u.length === 0) {
1427
- g.value = `「${e}」这次会话里还没在哪条标签上露过面:先打开挂着它的那一页,再点一次`;
1587
+ Sn(n.id);
1588
+ const e = n.name || n.id, r = Jt(n);
1589
+ if (r.length === 0) {
1590
+ y.value = `「${e}」这次会话里还没在哪条标签上露过面:先打开挂着它的那一页,再点一次`;
1428
1591
  return;
1429
1592
  }
1430
- if (u.includes(t)) {
1431
- g.value = `「${e}」就在这一条标签上(${u.join(" / ")}):已经把它标红`;
1593
+ if (r.includes(t)) {
1594
+ y.value = `「${e}」就在这一条标签上(${r.join(" / ")}):已经把它标红`;
1432
1595
  return;
1433
1596
  }
1434
- const S = Ws(n.id, t, v);
1435
- if (S) {
1436
- g.value = `「${e}」不在这一条标签上:正在切到 ${S} 那条标签`, Ee(S);
1597
+ const B = to(n.id, t, f);
1598
+ if (B) {
1599
+ y.value = `「${e}」不在这一条标签上:正在切到 ${B} 那条标签`, Te(B);
1437
1600
  return;
1438
1601
  }
1439
- g.value = `「${e}」只挂在带参数的实例标签上(${u.join(" / ")}):不替你挑一单 —— 自己打开要看的那一页再点`;
1602
+ y.value = `「${e}」只挂在带参数的实例标签上(${r.join(" / ")}):不替你挑一单 —— 自己打开要看的那一页再点`;
1440
1603
  }
1441
- const Mn = (n, t) => J(async () => {
1604
+ const On = (n, t) => G(async () => {
1442
1605
  const e = await at(
1443
1606
  `/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`
1444
1607
  );
1445
- E.value = { id: n.id, number: t, files: e.files ?? {} }, g.value = `正在看「${n.name || n.id}」的 v${t}(只读:不会改库里任何东西)`;
1446
- }, C), An = (n, t) => J(async () => {
1608
+ T.value = { id: n.id, number: t, files: e.files ?? {} }, y.value = `正在看「${n.name || n.id}」的 v${t}(只读:不会改库里任何东西)`;
1609
+ }, S), Pn = (n, t) => G(async () => {
1447
1610
  window.confirm(`把「${n.name || n.id}」切回 v${t}?
1448
1611
 
1449
- 这会把那一版的代码变成**当前版**,并且记成一个**新版本**(号继续 +1):历史只追加,旧版本一个都不会没。`) && (await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { updatedBy: "" }), g.value = `「${n.name || n.id}」已切回 v${t}(并记成了一个新版本)`, await Et(), await j(n.id));
1450
- }, C), Rn = (n, t) => J(async () => {
1612
+ 这会把那一版的代码变成**当前版**,并且记成一个**新版本**(号继续 +1):历史只追加,旧版本一个都不会没。`) && (await St(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { updatedBy: "" }), y.value = `「${n.name || n.id}」已切回 v${t}(并记成了一个新版本)`, await Et(), await D(n.id));
1613
+ }, S), jn = (n, t) => G(async () => {
1451
1614
  window.confirm(`删掉「${n.name || n.id}」的 v${t}?
1452
1615
 
1453
- 这一版的代码就找不回来了(别的版本不受影响)。`) && (await at(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { method: "DELETE" }), g.value = `删掉了「${n.name || n.id}」的 v${t}`, await j(n.id));
1454
- }, C), On = (n, t) => J(async () => {
1616
+ 这一版的代码就找不回来了(别的版本不受影响)。`) && (await at(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { method: "DELETE" }), y.value = `删掉了「${n.name || n.id}」的 v${t}`, await D(n.id));
1617
+ }, S), Ln = (n, t) => G(async () => {
1455
1618
  const e = await fetch(
1456
1619
  `http://localhost:3000/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}?download=1`,
1457
- { credentials: "include", headers: te("GET", !1) }
1620
+ { credentials: "include", headers: ne("GET", !1) }
1458
1621
  );
1459
1622
  if (!e.ok) throw new Error(`下载失败(HTTP ${e.status})`);
1460
- const u = await e.blob(), S = URL.createObjectURL(u);
1623
+ const r = await e.blob(), B = URL.createObjectURL(r);
1461
1624
  try {
1462
- const D = document.createElement("a");
1463
- D.href = S, D.download = `magic-block-${n.name || n.id}-v${t}.zip`, document.body.appendChild(D), D.click(), D.remove();
1625
+ const I = document.createElement("a");
1626
+ I.href = B, I.download = `magic-block-${n.name || n.id}-v${t}.zip`, document.body.appendChild(I), I.click(), I.remove();
1464
1627
  } finally {
1465
- setTimeout(() => URL.revokeObjectURL(S), 0);
1628
+ setTimeout(() => URL.revokeObjectURL(B), 0);
1466
1629
  }
1467
- g.value = `已下载「${n.name || n.id}」的 v${t}`;
1468
- }, C);
1469
- function Pn(n) {
1470
- pt.value = n.id, Z.value = (n.tags ?? []).join(", ");
1471
- }
1472
- const Ie = (n) => J(async () => {
1473
- const t = Z.value.split(/[,,\s]+/).map((u) => u.trim()).filter(Boolean), e = await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/tags`, { tags: t });
1474
- pt.value = "", g.value = `「${n.name || n.id}」的标签已存:${(e.tags ?? []).join(" / ") || "(一个都不剩)"}`, await Et();
1475
- }, C, "存标签"), Ln = (n) => J(async () => {
1476
- const t = await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/detail`, { detail: yt.value });
1477
- gt.value = "", g.value = `「${n.name || n.id}」的详情已存${(t.detail ?? "").trim() ? "" : "(清掉了)"};下次导出会写进它的 magic-block.open.yaml`, await Et();
1478
- }, C, "存详情");
1479
- function jn(n) {
1480
- gt.value = n.id, yt.value = (n.detail ?? "").trim();
1481
- }
1630
+ y.value = `已下载「${n.name || n.id}」的 v${t}`;
1631
+ }, S);
1482
1632
  function Dn(n) {
1483
- const t = Z.value.split(/[,,\s]+/).map((e) => e.trim()).filter(Boolean);
1484
- t.some((e) => e.toLowerCase() === n.toLowerCase()) || t.push(n), Z.value = t.join(", ");
1633
+ Z.value = n.id, X.value = (n.tags ?? []).join(", ");
1634
+ }
1635
+ const Fe = (n) => G(async () => {
1636
+ const t = X.value.split(/[,,\s]+/).map((r) => r.trim()).filter(Boolean), e = await St(`/magic-blocks/${encodeURIComponent(n.id)}/tags`, { tags: t });
1637
+ Z.value = "", y.value = `「${n.name || n.id}」的标签已存:${(e.tags ?? []).join(" / ") || "(一个都不剩)"}`, await Et();
1638
+ }, S, "存标签"), In = (n) => G(async () => {
1639
+ const t = await St(`/magic-blocks/${encodeURIComponent(n.id)}/detail`, { detail: kt.value });
1640
+ yt.value = "", y.value = `「${n.name || n.id}」的详情已存${(t.detail ?? "").trim() ? "" : "(清掉了)"};下次导出会写进它的 magic-block.open.yaml`, await Et();
1641
+ }, S, "存详情");
1642
+ function Nn(n) {
1643
+ yt.value = n.id, kt.value = (n.detail ?? "").trim();
1485
1644
  }
1486
- function In(n) {
1487
- Z.value = Z.value.split(/[,,\s]+/).map((t) => t.trim()).filter((t) => t && t.toLowerCase() !== n.toLowerCase()).join(", ");
1645
+ function Fn(n) {
1646
+ const t = X.value.split(/[,,\s]+/).map((e) => e.trim()).filter(Boolean);
1647
+ t.some((e) => e.toLowerCase() === n.toLowerCase()) || t.push(n), X.value = t.join(", ");
1488
1648
  }
1489
- function Nn(n) {
1490
- const t = L.value.trim().toLowerCase();
1649
+ function zn(n) {
1650
+ X.value = X.value.split(/[,,\s]+/).map((t) => t.trim()).filter((t) => t && t.toLowerCase() !== n.toLowerCase()).join(", ");
1651
+ }
1652
+ function Un(n) {
1653
+ const t = P.value.trim().toLowerCase();
1491
1654
  return t ? (n.tags ?? []).some((e) => e.toLowerCase().includes(t)) : !0;
1492
1655
  }
1493
- function Fn(n) {
1494
- const t = Vt(n), e = t.length === 0 ? "点一下:这次会话里它还没在哪条标签上露过面" : `点一下:把「${n.name || n.id}」标红,并在需要时切到挂着它的标签(${t.join(" / ")})`, u = De(n);
1495
- return u ? `${u}
1656
+ function Hn(n) {
1657
+ const t = Jt(n), e = t.length === 0 ? "点一下:这次会话里它还没在哪条标签上露过面" : `点一下:把「${n.name || n.id}」标红,并在需要时切到挂着它的标签(${t.join(" / ")})`, r = Ne(n);
1658
+ return r ? `${r}
1496
1659
  ${e}` : e;
1497
1660
  }
1498
- const Ne = O(() => {
1661
+ const ze = j(() => {
1499
1662
  const n = h.value.trim().toLowerCase();
1500
- return f.value.filter((t) => Nn(t) ? n ? `${t.module} ${t.name} ${t.brief} ${t.detail ?? ""} ${t.id} v${t.version ?? ""} ${(t.tags ?? []).join(" ")}`.toLowerCase().includes(n) : !0 : !1);
1501
- }), qt = O(() => (A.value?.blocks ?? []).filter((n) => n.canApply)), Jt = O(() => qt.value.filter((n) => it.value[n.id] === !0)), At = w(!1), rt = O(() => W.value.length + (A.value?.failures ?? []).length + Y.value.filter((n) => !n.ok).length), It = O(() => Y.value.filter((n) => !n.ok)), ue = O(() => Y.value.filter((n) => n.ok).length), re = O(() => f.value.filter((n) => n.enabled === !1).length);
1502
- function Un() {
1663
+ return v.value.filter((t) => Un(t) ? n ? `${t.module} ${t.name} ${t.brief} ${t.detail ?? ""} ${t.id} v${t.version ?? ""} ${(t.tags ?? []).join(" ")}`.toLowerCase().includes(n) : !0 : !1);
1664
+ }), Gt = j(() => (O.value?.blocks ?? []).filter((n) => n.canApply)), Wt = j(() => Gt.value.filter((n) => ct.value[n.id] === !0)), Rt = x(!1), dt = j(() => W.value.length + (O.value?.failures ?? []).length + Y.value.filter((n) => !n.ok).length), Ft = j(() => Y.value.filter((n) => !n.ok)), re = j(() => Y.value.filter((n) => n.ok).length), de = j(() => v.value.filter((n) => n.enabled === !1).length);
1665
+ function Kn() {
1503
1666
  const n = /* @__PURE__ */ new Set(), t = [];
1504
- for (const e of Fe()) {
1505
- const u = typeof e?.path == "string" ? e.path.trim() : "";
1506
- if (!u || n.has(u) || u.includes(":") || u.includes("*") || e.redirect || !e.components?.default || e.meta?.tab === !1) continue;
1507
- n.add(u);
1508
- const S = e.meta?.title ?? e.meta?.sub, D = e.meta?.group;
1667
+ for (const e of Ue()) {
1668
+ const r = typeof e?.path == "string" ? e.path.trim() : "";
1669
+ if (!r || n.has(r) || r.includes(":") || r.includes("*") || e.redirect || !e.components?.default || e.meta?.tab === !1) continue;
1670
+ n.add(r);
1671
+ const B = e.meta?.title ?? e.meta?.sub, I = e.meta?.group;
1509
1672
  t.push({
1510
- path: u,
1511
- title: typeof S == "string" && S.trim() ? S.trim() : u,
1512
- group: typeof D == "string" ? D.trim() : ""
1673
+ path: r,
1674
+ title: typeof B == "string" && B.trim() ? B.trim() : r,
1675
+ group: typeof I == "string" ? I.trim() : ""
1513
1676
  });
1514
1677
  }
1515
1678
  return t;
1516
1679
  }
1517
- function Fe() {
1518
- return r?.getRoutes?.() ?? [];
1680
+ function Ue() {
1681
+ return u?.getRoutes?.() ?? [];
1519
1682
  }
1520
- const ce = O(() => bo(Fe(), ro, f.value.map((n) => n.id)));
1521
- function Rt(n) {
1683
+ const pe = j(() => yo(Ue(), mo, v.value.map((n) => n.id)));
1684
+ function Ot(n) {
1522
1685
  return (n instanceof Error ? n.message.trim() : String(n)) || "请求没有到达后端(网络或登录态的问题),请重试";
1523
1686
  }
1524
- function zn(n) {
1687
+ function qn(n) {
1525
1688
  const t = n?.issues;
1526
1689
  return Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : String(e?.message ?? "")).filter(Boolean) : [];
1527
1690
  }
1528
- async function Ct(n, t) {
1691
+ async function St(n, t) {
1529
1692
  const e = JSON.stringify(t);
1530
1693
  try {
1531
1694
  return await at(n, { method: "POST", body: e });
1532
- } catch (u) {
1533
- const S = Rt(u), D = await fetch(`http://localhost:3000${n}`, {
1695
+ } catch (r) {
1696
+ const B = Ot(r), I = await fetch(`http://localhost:3000${n}`, {
1534
1697
  method: "POST",
1535
1698
  credentials: "include",
1536
- headers: { "Content-Type": "application/json", ...te("POST", !0) },
1699
+ headers: { "Content-Type": "application/json", ...ne("POST", !0) },
1537
1700
  body: e
1538
- }).then((mt) => mt.json()).catch(() => null), P = zn(D);
1539
- throw P.length === 0 ? new Error(S) : new Error(`${String(D?.message ?? S)}
1540
- - ${P.join(`
1701
+ }).then((mt) => mt.json()).catch(() => null), L = qn(I);
1702
+ throw L.length === 0 ? new Error(B) : new Error(`${String(I?.message ?? B)}
1703
+ - ${L.join(`
1541
1704
  - `)}`);
1542
1705
  }
1543
1706
  }
1544
- async function Hn() {
1545
- const n = M.value.map((t) => `[${t.at}] ${t.where}
1707
+ async function Vn() {
1708
+ const n = E.value.map((t) => `[${t.at}] ${t.where}
1546
1709
  ${t.text}`).join(`
1547
1710
 
1548
1711
  `);
1549
1712
  try {
1550
- await navigator.clipboard.writeText(n), g.value = `已复制 ${M.value.length} 条报错`;
1713
+ await navigator.clipboard.writeText(n), y.value = `已复制 ${E.value.length} 条报错`;
1551
1714
  } catch (t) {
1552
- Nt(t, "复制报错");
1715
+ zt(t, "复制报错");
1553
1716
  }
1554
1717
  }
1555
- function Kn() {
1718
+ function Jn() {
1556
1719
  const n = [];
1557
1720
  W.value.length > 0 && n.push("【前端校验拦下的】", ...W.value.map((t) => `- ${t}`), "");
1558
- for (const t of A.value?.failures ?? [])
1721
+ for (const t of O.value?.failures ?? [])
1559
1722
  n.push(`【读回:${t.kind || "问题"}】${t.where || ""}`, `- ${t.message || ""}`, "");
1560
- for (const t of It.value)
1723
+ for (const t of Ft.value)
1561
1724
  n.push(
1562
1725
  `【没存成】${t.name || t.id}`,
1563
1726
  `- ${t.error || ""}`,
@@ -1567,664 +1730,671 @@ ${t.text}`).join(`
1567
1730
  return n.join(`
1568
1731
  `).trim() || "这一趟没有问题。";
1569
1732
  }
1570
- async function Vn() {
1733
+ async function Gn() {
1571
1734
  try {
1572
- await navigator.clipboard.writeText(Kn()), g.value = `已复制这一趟的 ${rt.value} 条问题`;
1735
+ await navigator.clipboard.writeText(Jn()), y.value = `已复制这一趟的 ${dt.value} 条问题`;
1573
1736
  } catch (n) {
1574
- Nt(n, "复制问题");
1737
+ zt(n, "复制问题");
1575
1738
  }
1576
1739
  }
1577
- function Nt(n, t) {
1578
- const e = Rt(n);
1579
- _.value = e, M.value = [...M.value, { at: (/* @__PURE__ */ new Date()).toLocaleTimeString(), where: t, text: e }];
1740
+ function zt(n, t) {
1741
+ const e = Ot(n);
1742
+ _.value = e, E.value = [...E.value, { at: (/* @__PURE__ */ new Date()).toLocaleTimeString(), where: t, text: e }];
1580
1743
  }
1581
- function de() {
1582
- _.value = "", M.value = [];
1744
+ function be() {
1745
+ _.value = "", E.value = [];
1583
1746
  }
1584
1747
  async function Et() {
1585
1748
  try {
1586
1749
  const n = await at("/magic-blocks/index");
1587
- f.value = n.blocks ?? [], G.value = n.tags ?? [];
1750
+ v.value = n.blocks ?? [], z.value = n.tags ?? [];
1588
1751
  } catch (n) {
1589
- Nt(n, "读块清单");
1752
+ zt(n, "读块清单");
1590
1753
  }
1591
1754
  }
1592
- async function J(n, t, e = "") {
1593
- t.value = !0, de();
1755
+ async function G(n, t, e = "") {
1756
+ t.value = !0, be();
1594
1757
  try {
1595
- await n(), Us();
1596
- } catch (u) {
1597
- Nt(u, e || "这个动作");
1758
+ await n(), Vs();
1759
+ } catch (r) {
1760
+ zt(r, e || "这个动作");
1598
1761
  } finally {
1599
1762
  t.value = !1;
1600
1763
  }
1601
1764
  }
1602
- const qn = () => J(async () => {
1603
- Lt.value = !0;
1765
+ const Wn = () => G(async () => {
1766
+ Dt.value = !0;
1604
1767
  try {
1605
- await at("/magic-blocks/check", { method: "POST", body: JSON.stringify({}) }), g.value = "全部魔法块重新校验完了", await Et();
1768
+ await at("/magic-blocks/check", { method: "POST", body: JSON.stringify({}) }), y.value = "全部魔法块重新校验完了", await Et();
1606
1769
  } finally {
1607
- Lt.value = !1;
1770
+ Dt.value = !1;
1608
1771
  }
1609
- }, C), Ue = (n) => J(async () => {
1610
- const t = await $e();
1611
- n === "export" ? (K.value = t, U.value || (U.value = t)) : (U.value = t, K.value || (K.value = t)), g.value = n === "export" ? `导出目录:${t.name}${U.value === t ? "(读回目录也填成它了)" : ""}` : `读回目录:${t.name}`;
1612
- }, C);
1613
- async function pe() {
1614
- if (Q.value) return Q.value;
1772
+ }, S), He = (n) => G(async () => {
1773
+ const t = await xe();
1774
+ n === "export" ? (q.value = t, U.value || (U.value = t)) : (U.value = t, q.value || (q.value = t)), y.value = n === "export" ? `导出目录:${t.name}${U.value === t ? "(读回目录也填成它了)" : ""}` : `读回目录:${t.name}`;
1775
+ }, S);
1776
+ async function fe() {
1777
+ if (tt.value) return tt.value;
1615
1778
  const n = await at("/magic-blocks/rules");
1616
- return Q.value = n.rules, n.rules;
1779
+ return tt.value = n.rules, n.rules;
1617
1780
  }
1618
- const Jn = () => J(async () => {
1619
- if (!xn()) throw new Error("这个浏览器没法直接写你本机的文件夹:请用 Chrome / Edge,并从 https 或 localhost 打开");
1620
- if (X.value === "one" && !bt.value)
1781
+ const Yn = () => G(async () => {
1782
+ if (!En()) throw new Error("这个浏览器没法直接写你本机的文件夹:请用 Chrome / Edge,并从 https 或 localhost 打开");
1783
+ if (Q.value === "one" && !ft.value)
1621
1784
  throw new Error("还没挑块:上面选「仅这一个块」时要先在下拉里挑一个块(或者把范围改成「全部块」)");
1622
- lt.value = !0, g.value = "", V.value = "", de(), je(), Gt.length = 0, N.value = { active: !0, percent: 0, stage: "准备…", failed: !1 };
1785
+ ut.value = !0, y.value = "", V.value = "", be(), Ie(), Yt.length = 0, F.value = { active: !0, percent: 0, stage: "准备…", failed: !1 };
1623
1786
  try {
1624
- const n = K.value ?? await $e();
1625
- K.value = n, U.value || (U.value = n);
1626
- const t = Ct("/magic-blocks/export", wt()), e = be(), u = Q.value ? we(n, Q.value) : null, S = await St("取包", t);
1627
- Q.value = S.rules, Eo(n, S.rules);
1628
- const D = u ? await St("数目录", u) : await St("数目录", we(n, S.rules));
1629
- if (D.topCount > 0) {
1630
- ot(5, "等你确认要不要先清空"), q.value = { target: n, inventory: D };
1787
+ const n = q.value ?? await xe();
1788
+ q.value = n, U.value || (U.value = n);
1789
+ const t = St("/magic-blocks/export", xt()), e = me(), r = tt.value ? Ce(n, tt.value) : null, B = await Tt("取包", t);
1790
+ tt.value = B.rules, Oo(n, B.rules);
1791
+ const I = r ? await Tt("数目录", r) : await Tt("数目录", Ce(n, B.rules));
1792
+ if (I.topCount > 0) {
1793
+ lt(5, "等你确认要不要先清空"), J.value = { target: n, inventory: I };
1631
1794
  return;
1632
1795
  }
1633
- await me(n, S, { clean: !1, verify: !1, front: e });
1796
+ await ve(n, B, { clean: !1, verify: !1, front: e });
1634
1797
  } catch (n) {
1635
- throw xt(!1, "导出失败"), n;
1798
+ throw Ct(!1, "导出失败"), n;
1636
1799
  } finally {
1637
- lt.value = !1;
1800
+ ut.value = !1;
1638
1801
  }
1639
- }, C), ze = /* @__PURE__ */ new WeakMap(), Gt = [];
1640
- function He(n, t) {
1641
- Gt.push([n, Math.round(performance.now() - t)]);
1802
+ }, S), Ke = /* @__PURE__ */ new WeakMap(), Yt = [];
1803
+ function qe(n, t) {
1804
+ Yt.push([n, Math.round(performance.now() - t)]);
1642
1805
  }
1643
- async function St(n, t) {
1806
+ async function Tt(n, t) {
1644
1807
  const e = performance.now();
1645
1808
  try {
1646
1809
  return await t;
1647
1810
  } finally {
1648
- He(n, e);
1811
+ qe(n, e);
1649
1812
  }
1650
1813
  }
1651
- function Gn() {
1652
- return Gt.length > 0 ? `;耗时:${Gt.map(([n, t]) => `${n} ${t}ms`).join(" · ")}` : "";
1814
+ function Zn() {
1815
+ return Yt.length > 0 ? `;耗时:${Yt.map(([n, t]) => `${n} ${t}ms`).join(" · ")}` : "";
1653
1816
  }
1654
- function be() {
1817
+ function me() {
1655
1818
  try {
1656
- const n = $n();
1819
+ const n = Cn();
1657
1820
  return {
1658
1821
  css: n.css,
1659
- controls: Ks(),
1822
+ controls: Ws(),
1660
1823
  note: n.skipped.length > 0 ? `;⚠️ 有 ${n.skipped.length} 张样式表读不到规则(跨源):${n.skipped.join(" / ")}` : ""
1661
1824
  };
1662
1825
  } catch (n) {
1663
- return { css: "", controls: "", note: `;主题 CSS 没收成(${Rt(n)}):${Tt} 没写,其余照旧` };
1826
+ return { css: "", controls: "", note: `;主题 CSS 没收成(${Ot(n)}):${Bt} 没写,其余照旧` };
1664
1827
  }
1665
1828
  }
1666
- async function me(n, t, e) {
1667
- const { clean: u, verify: S, thorough: D, front: P } = e;
1829
+ async function ve(n, t, e) {
1830
+ const { clean: r, verify: B, thorough: I, front: L } = e;
1668
1831
  try {
1669
- ot(20, "准备写盘…");
1670
- const mt = vo(Un()), ct = { ...t.files };
1671
- ct[ke] = mt, P.css && (ct[Tt] = P.css), P.controls && (ct[Qt] = P.controls), t.exampleDir && (ct[`${t.exampleDir}/${ke}`] = mt, P.css && (ct[`${t.exampleDir}/${Tt}`] = P.css), P.controls && (ct[`${t.exampleDir}/${Qt}`] = P.controls));
1672
- const ts = P.note;
1673
- await new Promise((et) => {
1674
- setTimeout(et, 0);
1832
+ lt(20, "准备写盘…");
1833
+ const mt = wo(Kn()), pt = { ...t.files };
1834
+ pt[we] = mt, L.css && (pt[Bt] = L.css), L.controls && (pt[ee] = L.controls), t.exampleDir && (pt[`${t.exampleDir}/${we}`] = mt, L.css && (pt[`${t.exampleDir}/${Bt}`] = L.css), L.controls && (pt[`${t.exampleDir}/${ee}`] = L.controls));
1835
+ const ss = L.note;
1836
+ await new Promise((nt) => {
1837
+ setTimeout(nt, 0);
1675
1838
  });
1676
- let Ge = "", fe;
1677
- if (u) {
1678
- ot(35, "清掉这一包不要的东西…");
1679
- const et = await St("清多余", xo(n, ct));
1680
- fe = et.existing, Ge = et.removed > 0 ? `,先清掉了 ${et.removed} 项` : ",没有多余的东西要清";
1839
+ let Ye = "", he;
1840
+ if (r) {
1841
+ lt(35, "清掉这一包不要的东西…");
1842
+ const nt = await Tt("清多余", Ao(n, pt));
1843
+ he = nt.existing, Ye = nt.removed > 0 ? `,先清掉了 ${nt.removed} 项` : ",没有多余的东西要清";
1681
1844
  } else
1682
- ot(35, "看一眼目录里有什么…"), fe = await St("看目录", Co(n, ct));
1683
- const es = ze.get(n.handle), ns = Object.keys(ct).length, ve = u ? 45 : 30;
1684
- ot(ve, `写文件 0/${ns}…`);
1685
- let We = 0;
1686
- const ss = performance.now(), tt = await $o(n, ct, (et, he) => {
1687
- const Ye = Date.now();
1688
- et < he && Ye - We < Zi || (We = Ye, ot(ve + Math.round(et / Math.max(1, he) * (95 - ve)), `写文件 ${et}/${he}…`));
1845
+ lt(35, "看一眼目录里有什么…"), he = await Tt("看目录", Ro(n, pt));
1846
+ const os = Ke.get(n.handle), ls = Object.keys(pt).length, _e = r ? 45 : 30;
1847
+ lt(_e, `写文件 0/${ls}…`);
1848
+ let Ze = 0;
1849
+ const as = performance.now(), et = await Bo(n, pt, (nt, ge) => {
1850
+ const Xe = Date.now();
1851
+ nt < ge && Xe - Ze < ou || (Ze = Xe, lt(_e + Math.round(nt / Math.max(1, ge) * (95 - _e)), `写文件 ${nt}/${ge}…`));
1689
1852
  }, {
1690
- verify: S,
1853
+ verify: B,
1691
1854
  // 🔴 账本:勾了「逐个核对磁盘」就不给它 —— 那样连上一趟铺过的也重新核对一遍。
1692
- trust: D ? void 0 : es,
1693
- existing: fe
1855
+ trust: I ? void 0 : os,
1856
+ existing: he
1694
1857
  });
1695
- He("写盘", ss), ze.set(n.handle, tt.fingerprints), ot(98, "收尾…");
1696
- const os = tt.failed.length > 0 ? `;⚠️ ${tt.failed.length} 个文件没写成:${tt.failed.slice(0, 3).map((et) => `${et.path}(${et.message})`).join("、")}` + (tt.failed.length > 3 ? ` 等 ${tt.failed.length} 条` : "") : "", Wt = [];
1697
- tt.skipped > 0 && Wt.push(`${tt.skipped} 个与库里一字不差(逐字节比过)`), tt.trusted > 0 && Wt.push(`${tt.trusted} 个按上一趟的账本跳过(没再碰磁盘)`);
1698
- const as = Wt.length > 0 ? `,跳过 ${Wt.join(" / ")}` : "";
1699
- V.value = `铺到「${n.name}」:${t.blocks} 个块、写了 ${tt.written} 个文件${as}(含 ${ke} / ${Tt} / ${Qt})${Ge}${os}${ts}${Gn()}`, g.value = tt.failed.length > 0 ? "导出完了,但有文件没写成(见下面那句)" : "导出完了:用你自己的编辑器改,改完回这里「读回改动」", xt(!0, "完成");
1858
+ qe("写盘", as), Ke.set(n.handle, et.fingerprints), lt(98, "收尾…");
1859
+ const is = et.failed.length > 0 ? `;⚠️ ${et.failed.length} 个文件没写成:${et.failed.slice(0, 3).map((nt) => `${nt.path}(${nt.message})`).join("、")}` + (et.failed.length > 3 ? ` 等 ${et.failed.length} 条` : "") : "", Zt = [];
1860
+ et.skipped > 0 && Zt.push(`${et.skipped} 个与库里一字不差(逐字节比过)`), et.trusted > 0 && Zt.push(`${et.trusted} 个按上一趟的账本跳过(没再碰磁盘)`);
1861
+ const us = Zt.length > 0 ? `,跳过 ${Zt.join(" / ")}` : "";
1862
+ V.value = `铺到「${n.name}」:${t.blocks} 个块、写了 ${et.written} 个文件${us}(含 ${we} / ${Bt} / ${ee})${Ye}${is}${ss}${Zn()}`, y.value = et.failed.length > 0 ? "导出完了,但有文件没写成(见下面那句)" : "导出完了:用你自己的编辑器改,改完回这里「读回改动」", Ct(!0, "完成");
1700
1863
  } catch (mt) {
1701
- throw xt(!1, "导出中途失败(已经铺进去的文件不会自己删掉)"), mt;
1864
+ throw Ct(!1, "导出中途失败(已经铺进去的文件不会自己删掉)"), mt;
1702
1865
  }
1703
1866
  }
1704
- const Wn = () => J(async () => {
1705
- const n = q.value;
1706
- if (q.value = null, !!n) {
1707
- lt.value = !0;
1867
+ const Xn = () => G(async () => {
1868
+ const n = J.value;
1869
+ if (J.value = null, !!n) {
1870
+ ut.value = !0;
1708
1871
  try {
1709
- ot(15, "重新取一份开发包…");
1710
- const t = Ct("/magic-blocks/export", wt()), e = be(), u = await St("取包", t);
1711
- Q.value = u.rules, await me(n.target, u, { clean: !0, verify: !0, thorough: Kt.value, front: e });
1872
+ lt(15, "重新取一份开发包…");
1873
+ const t = St("/magic-blocks/export", xt()), e = me(), r = await Tt("取包", t);
1874
+ tt.value = r.rules, await ve(n.target, r, { clean: !0, verify: !0, thorough: Vt.value, front: e });
1712
1875
  } catch (t) {
1713
- throw xt(!1, "导出失败"), t;
1876
+ throw Ct(!1, "导出失败"), t;
1714
1877
  } finally {
1715
- lt.value = !1;
1878
+ ut.value = !1;
1716
1879
  }
1717
1880
  }
1718
- }, C), Yn = () => J(async () => {
1719
- const n = q.value;
1720
- if (q.value = null, !!n) {
1721
- lt.value = !0;
1881
+ }, S), Qn = () => G(async () => {
1882
+ const n = J.value;
1883
+ if (J.value = null, !!n) {
1884
+ ut.value = !0;
1722
1885
  try {
1723
- ot(15, "重新取一份开发包…");
1724
- const t = Ct("/magic-blocks/export", wt()), e = be(), u = await St("取包", t);
1725
- Q.value = u.rules, await me(n.target, u, { clean: !1, verify: !0, thorough: Kt.value, front: e });
1886
+ lt(15, "重新取一份开发包…");
1887
+ const t = St("/magic-blocks/export", xt()), e = me(), r = await Tt("取包", t);
1888
+ tt.value = r.rules, await ve(n.target, r, { clean: !1, verify: !0, thorough: Vt.value, front: e });
1726
1889
  } catch (t) {
1727
- throw xt(!1, "导出失败"), t;
1890
+ throw Ct(!1, "导出失败"), t;
1728
1891
  } finally {
1729
- lt.value = !1;
1892
+ ut.value = !1;
1730
1893
  }
1731
1894
  }
1732
- }, C);
1733
- function Zn() {
1734
- q.value = null, N.value = { active: !1, percent: 0, stage: "", failed: !1 }, g.value = "这次没有导出(目录里的东西一个字节都没动)", V.value = "";
1895
+ }, S);
1896
+ function ts() {
1897
+ J.value = null, F.value = { active: !1, percent: 0, stage: "", failed: !1 }, y.value = "这次没有导出(目录里的东西一个字节都没动)", V.value = "";
1735
1898
  }
1736
- const Ke = () => J(async () => {
1737
- const n = U.value ?? await $e();
1738
- U.value = n, K.value || (K.value = n), kt.value = !0, g.value = "", W.value = [], Y.value = [];
1899
+ const Ve = () => G(async () => {
1900
+ const n = U.value ?? await xe();
1901
+ U.value = n, q.value || (q.value = n), $t.value = !0, y.value = "", W.value = [], Y.value = [];
1739
1902
  try {
1740
- const t = await pe().catch((P) => {
1741
- throw new Error(`取不到扫描规则(GET /magic-blocks/rules):${Rt(P)}`);
1742
- }), e = await Mo(n, t), u = await at("/magic-blocks/read", {
1903
+ const t = await fe().catch((L) => {
1904
+ throw new Error(`取不到扫描规则(GET /magic-blocks/rules):${Ot(L)}`);
1905
+ }), e = await Do(n, t), r = await at("/magic-blocks/read", {
1743
1906
  method: "POST",
1744
1907
  body: JSON.stringify({ ...e, includeMissing: !1 })
1745
1908
  });
1746
- A.value = u;
1747
- const S = {};
1748
- for (const P of u.blocks ?? []) S[P.id] = P.status === "modified" && P.canApply;
1749
- it.value = S;
1750
- const D = (u.blocks ?? []).reduce((P, mt) => ({ ...P, [mt.status]: (P[mt.status] ?? 0) + 1 }), {});
1751
- g.value = `扫到 ${u.folders} 个文件夹、${u.files} 个文件:有改动 ${D.modified ?? 0} / 没改动 ${D.unchanged ?? 0}` + (u.complete ? "" : "(层数到了上限,没走完,可能还有块没扫到)");
1909
+ O.value = r;
1910
+ const B = {};
1911
+ for (const L of r.blocks ?? []) B[L.id] = L.status === "modified" && L.canApply;
1912
+ ct.value = B;
1913
+ const I = (r.blocks ?? []).reduce((L, mt) => ({ ...L, [mt.status]: (L[mt.status] ?? 0) + 1 }), {});
1914
+ y.value = `扫到 ${r.folders} 个文件夹、${r.files} 个文件:有改动 ${I.modified ?? 0} / 没改动 ${I.unchanged ?? 0}` + (r.complete ? "" : "(层数到了上限,没走完,可能还有块没扫到)");
1752
1915
  } finally {
1753
- kt.value = !1;
1916
+ $t.value = !1;
1754
1917
  }
1755
- }, C), Xn = () => J(async () => {
1756
- const n = Jt.value, t = As(n);
1918
+ }, S), es = () => G(async () => {
1919
+ const n = Wt.value, t = Ls(n);
1757
1920
  if (W.value = t.issues, Y.value = [], t.issues.length > 0)
1758
- throw g.value = "", new Error(`前端校验没过(${t.issues.length} 条),没有发请求:
1921
+ throw y.value = "", new Error(`前端校验没过(${t.issues.length} 条),没有发请求:
1759
1922
  - ${t.issues.join(`
1760
1923
  - `)}`);
1761
- nt.value = !0, g.value = "";
1924
+ st.value = !0, y.value = "";
1762
1925
  try {
1763
- const e = await Ct("/magic-blocks/import", { updatedBy: "", blocks: n });
1764
- Y.value = e.results ?? [], g.value = `保存:成功 ${e.saved} 个、失败 ${e.failed} 个`, await Et();
1765
- const u = g.value;
1766
- await Ke(), g.value = `${u};已重新读回该目录`;
1926
+ const e = await St("/magic-blocks/import", { updatedBy: "", blocks: n });
1927
+ Y.value = e.results ?? [], y.value = `保存:成功 ${e.saved} 个、失败 ${e.failed} 个`, await Et();
1928
+ const r = y.value;
1929
+ await Ve(), y.value = `${r};已重新读回该目录`;
1767
1930
  } finally {
1768
- nt.value = !1;
1931
+ st.value = !1;
1769
1932
  }
1770
- }, C);
1771
- function Qn(n, t) {
1933
+ }, S);
1934
+ function ns(n, t) {
1772
1935
  const e = t.target;
1773
- it.value[n] = e?.checked === !0;
1936
+ ct.value[n] = e?.checked === !0;
1774
1937
  }
1775
- function Ve(n) {
1776
- const t = { ...it.value };
1777
- for (const e of qt.value) t[e.id] = n;
1778
- it.value = t;
1938
+ function Je(n) {
1939
+ const t = { ...ct.value };
1940
+ for (const e of Gt.value) t[e.id] = n;
1941
+ ct.value = t;
1779
1942
  }
1780
- function qe(n) {
1943
+ function Ge(n) {
1781
1944
  const t = n.detail?.uuid ?? "";
1782
- b.value = !0, x.value = t;
1945
+ c.value = !0, g.value = t;
1783
1946
  }
1784
- function Je(n) {
1785
- n.key === "Escape" && b.value && (b.value = !1);
1947
+ function We(n) {
1948
+ n.key === "Escape" && c.value && (c.value = !1);
1786
1949
  }
1787
- return ln(() => {
1788
- window.addEventListener("magic-block:open-console", qe), window.addEventListener("keydown", Je), Et(), pe().catch(() => {
1950
+ return rn(() => {
1951
+ window.addEventListener("magic-block:open-console", Ge), window.addEventListener("keydown", We), Et(), fe().catch(() => {
1789
1952
  });
1790
- }), un(() => {
1791
- window.removeEventListener("magic-block:open-console", qe), window.removeEventListener("keydown", Je);
1792
- }), (n, t) => _t(i) ? (c(), d("div", {
1953
+ }), dn(() => {
1954
+ window.removeEventListener("magic-block:open-console", Ge), window.removeEventListener("keydown", We);
1955
+ }), (n, t) => it(i) ? (d(), p("div", {
1793
1956
  key: 0,
1794
- class: H(["mbc__shell", { "is-wide": B.value }])
1957
+ class: K(["mbc__shell", { "is-wide": C.value }])
1795
1958
  }, [
1796
- s("button", {
1959
+ l("button", {
1797
1960
  class: "fab",
1798
1961
  type: "button",
1799
1962
  title: "magic block 控制台",
1800
- onClick: t[0] || (t[0] = (e) => b.value = !0)
1963
+ onClick: t[0] || (t[0] = (e) => c.value = !0)
1801
1964
  }, "块"),
1802
- b.value ? (c(), d("aside", {
1965
+ c.value ? (d(), p("aside", {
1803
1966
  key: 0,
1804
- class: H(["mbc", { "is-wide": B.value }])
1967
+ class: K(["mbc", { "is-wide": C.value }])
1805
1968
  }, [
1806
- s("header", Ao, [
1807
- t[43] || (t[43] = s("strong", { class: "mbc__brand" }, "magic block", -1)),
1808
- s("span", {
1969
+ l("header", Io, [
1970
+ t[43] || (t[43] = l("strong", { class: "mbc__brand" }, "magic block", -1)),
1971
+ l("span", {
1809
1972
  class: "mbc__count",
1810
- title: `库里一共 ${f.value.length} 个块`
1811
- }, p(f.value.length) + " 个块", 9, Ro),
1812
- t[44] || (t[44] = s("span", { class: "mbc__grow" }, null, -1)),
1813
- s("button", {
1973
+ title: `库里一共 ${v.value.length} 个块`
1974
+ }, b(v.value.length) + " 个块", 9, No),
1975
+ t[44] || (t[44] = l("span", { class: "mbc__grow" }, null, -1)),
1976
+ l("button", {
1814
1977
  class: "p-button p-button-sm p-button-text",
1815
1978
  type: "button",
1816
- title: B.value ? "收起(回到右侧那条窄抽屉)" : "展开:整屏(块 / 工作区两个页签)",
1817
- onClick: t[1] || (t[1] = (e) => B.value = !B.value)
1818
- }, p(B.value ? "收起" : "展开全屏"), 9, Oo),
1819
- s("button", {
1979
+ title: C.value ? "收起(回到右侧那条窄抽屉)" : "展开:整屏(块 / 工作区两个页签)",
1980
+ onClick: t[1] || (t[1] = (e) => C.value = !C.value)
1981
+ }, b(C.value ? "收起" : "展开全屏"), 9, Fo),
1982
+ l("button", {
1820
1983
  class: "p-button p-button-sm p-button-text",
1821
1984
  type: "button",
1822
- onClick: t[2] || (t[2] = (e) => b.value = !1)
1985
+ onClick: t[2] || (t[2] = (e) => c.value = !1)
1823
1986
  }, "关闭")
1824
1987
  ]),
1825
- s("div", Po, [
1826
- s("button", {
1827
- class: H(["mbc__tab", { "is-on": R.value === "blocks" }]),
1988
+ l("div", zo, [
1989
+ l("button", {
1990
+ class: K(["mbc__tab", { "is-on": R.value === "blocks" }]),
1828
1991
  type: "button",
1829
1992
  role: "tab",
1830
1993
  "aria-selected": R.value === "blocks",
1831
1994
  onClick: t[3] || (t[3] = (e) => R.value = "blocks")
1832
1995
  }, [
1833
- t[45] || (t[45] = y(" 块 ", -1)),
1834
- s("span", jo, p(f.value.length), 1),
1835
- re.value > 0 ? (c(), d("span", {
1996
+ t[45] || (t[45] = $(" 块 ", -1)),
1997
+ l("span", Ho, b(v.value.length), 1),
1998
+ de.value > 0 ? (d(), p("span", {
1836
1999
  key: 0,
1837
2000
  class: "mbc__chip is-bad",
1838
- title: `${re.value} 个块被停用(体检没过)`
1839
- }, p(re.value) + " 停用", 9, Do)) : k("", !0)
1840
- ], 10, Lo),
1841
- s("button", {
1842
- class: H(["mbc__tab", { "is-on": R.value === "workspace" }]),
2001
+ title: `${de.value} 个块被停用(体检没过)`
2002
+ }, b(de.value) + " 停用", 9, Ko)) : k("", !0)
2003
+ ], 10, Uo),
2004
+ l("button", {
2005
+ class: K(["mbc__tab", { "is-on": R.value === "workspace" }]),
1843
2006
  type: "button",
1844
2007
  role: "tab",
1845
2008
  "aria-selected": R.value === "workspace",
1846
2009
  onClick: t[4] || (t[4] = (e) => R.value = "workspace")
1847
2010
  }, [
1848
- t[46] || (t[46] = y(" 工作区(导出 / 读回 / 校验) ", -1)),
1849
- rt.value > 0 ? (c(), d("span", {
2011
+ t[46] || (t[46] = $(" 工作区(导出 / 读回 / 校验) ", -1)),
2012
+ dt.value > 0 ? (d(), p("span", {
1850
2013
  key: 0,
1851
2014
  class: "mbc__chip is-bad",
1852
- title: `这一趟有 ${rt.value} 条问题`
1853
- }, p(rt.value), 9, No)) : Y.value.length > 0 ? (c(), d("span", Fo, p(ue.value) + " 存成", 1)) : k("", !0)
1854
- ], 10, Io)
2015
+ title: `这一趟有 ${dt.value} 条问题`
2016
+ }, b(dt.value), 9, Vo)) : Y.value.length > 0 ? (d(), p("span", Jo, b(re.value) + " 存成", 1)) : k("", !0)
2017
+ ], 10, qo)
1855
2018
  ]),
1856
- s("div", Uo, [
1857
- N.value.active ? (c(), d("div", zo, [
1858
- s("div", {
1859
- class: H(["mbc__progress", { "is-failed": N.value.failed }]),
2019
+ l("div", Go, [
2020
+ F.value.active ? (d(), p("div", Wo, [
2021
+ l("div", {
2022
+ class: K(["mbc__progress", { "is-failed": F.value.failed }]),
1860
2023
  role: "progressbar",
1861
- "aria-valuenow": N.value.percent,
2024
+ "aria-valuenow": F.value.percent,
1862
2025
  "aria-valuemin": "0",
1863
2026
  "aria-valuemax": "100"
1864
2027
  }, [
1865
- s("div", {
2028
+ l("div", {
1866
2029
  class: "mbc__progress-bar",
1867
- style: rn(Tn.value)
2030
+ style: pn(An.value)
1868
2031
  }, null, 4)
1869
- ], 10, Ho),
1870
- s("p", {
1871
- class: H(["mbc__hint", { "mbc__progress-note": N.value.failed }])
1872
- }, p(N.value.failed ? "✗" : "") + " " + p(N.value.percent) + "% · " + p(N.value.stage), 3)
2032
+ ], 10, Yo),
2033
+ l("p", {
2034
+ class: K(["mbc__hint", { "mbc__progress-note": F.value.failed }])
2035
+ }, b(F.value.failed ? "✗" : "") + " " + b(F.value.percent) + "% · " + b(F.value.stage), 3)
1873
2036
  ])) : k("", !0),
1874
- q.value ? (c(), d("div", Ko, [
1875
- s("p", Vo, "「" + p(q.value.target.name) + "」里现在有 " + p(q.value.inventory.dirs) + " 个文件夹 / " + p(q.value.inventory.files) + " 个文件", 1),
1876
- s("p", qo, [
1877
- t[47] || (t[47] = s("b", null, "只覆盖", -1)),
1878
- t[48] || (t[48] = y("(天天用这个):只把库里", -1)),
1879
- t[49] || (t[49] = s("b", null, "改过 / 缺了", -1)),
1880
- t[50] || (t[50] = y("的那些写下去 —— 上一趟铺过、 这一趟一字没变的**一概不碰**(所以很快;代价是你自己在编辑器里改过、还没读回库的那些 ", -1)),
1881
- t[51] || (t[51] = s("b", null, "会留着", -1)),
1882
- t[52] || (t[52] = y(")。 ", -1)),
1883
- t[53] || (t[53] = s("b", null, "清空并导出", -1)),
1884
- t[54] || (t[54] = y(":先删掉这一包没有的东西,其余同上。 两种都只动这个目录", -1)),
1885
- t[55] || (t[55] = s("b", null, "里面", -1)),
1886
- t[56] || (t[56] = y("的子项:目录本身、以及它外面的任何东西都不会被碰。", -1)),
1887
- q.value.inventory.items.length > 0 ? (c(), d("span", Jo, "(" + p(q.value.inventory.items.slice(0, 6).map((e) => e.name).join(" / ")) + p(q.value.inventory.items.length > 6 ? " …" : "") + ")", 1)) : k("", !0)
2037
+ J.value ? (d(), p("div", Zo, [
2038
+ l("p", Xo, "「" + b(J.value.target.name) + "」里现在有 " + b(J.value.inventory.dirs) + " 个文件夹 / " + b(J.value.inventory.files) + " 个文件", 1),
2039
+ l("p", Qo, [
2040
+ t[47] || (t[47] = l("b", null, "只覆盖", -1)),
2041
+ t[48] || (t[48] = $("(天天用这个):只把库里", -1)),
2042
+ t[49] || (t[49] = l("b", null, "改过 / 缺了", -1)),
2043
+ t[50] || (t[50] = $("的那些写下去 —— 上一趟铺过、 这一趟一字没变的**一概不碰**(所以很快;代价是你自己在编辑器里改过、还没读回库的那些 ", -1)),
2044
+ t[51] || (t[51] = l("b", null, "会留着", -1)),
2045
+ t[52] || (t[52] = $(")。 ", -1)),
2046
+ t[53] || (t[53] = l("b", null, "清空并导出", -1)),
2047
+ t[54] || (t[54] = $(":先删掉这一包没有的东西,其余同上。 两种都只动这个目录", -1)),
2048
+ t[55] || (t[55] = l("b", null, "里面", -1)),
2049
+ t[56] || (t[56] = $("的子项:目录本身、以及它外面的任何东西都不会被碰。", -1)),
2050
+ J.value.inventory.items.length > 0 ? (d(), p("span", tl, "(" + b(J.value.inventory.items.slice(0, 6).map((e) => e.name).join(" / ")) + b(J.value.inventory.items.length > 6 ? " …" : "") + ")", 1)) : k("", !0)
1888
2051
  ]),
1889
- s("label", Go, [
1890
- ft(s("input", {
1891
- "onUpdate:modelValue": t[5] || (t[5] = (e) => Kt.value = e),
2052
+ l("label", el, [
2053
+ vt(l("input", {
2054
+ "onUpdate:modelValue": t[5] || (t[5] = (e) => Vt.value = e),
1892
2055
  type: "checkbox"
1893
2056
  }, null, 512), [
1894
- [is, Kt.value]
2057
+ [rs, Vt.value]
1895
2058
  ]),
1896
- t[57] || (t[57] = s("span", null, [
1897
- y("逐个核对磁盘(慢):把上一趟铺过的也重新读一遍比对,"),
1898
- s("b", null, "你在编辑器里改过、还没读回库的那些会被库里的那份盖掉")
2059
+ t[57] || (t[57] = l("span", null, [
2060
+ $("逐个核对磁盘(慢):把上一趟铺过的也重新读一遍比对,"),
2061
+ l("b", null, "你在编辑器里改过、还没读回库的那些会被库里的那份盖掉")
1899
2062
  ], -1))
1900
2063
  ]),
1901
- s("div", Wo, [
1902
- s("button", {
2064
+ l("div", nl, [
2065
+ l("button", {
1903
2066
  class: "p-button p-button-sm",
1904
2067
  type: "button",
1905
- disabled: C.value,
1906
- onClick: t[6] || (t[6] = (e) => Wn())
1907
- }, "清空并导出", 8, Yo),
1908
- s("button", {
2068
+ disabled: S.value,
2069
+ onClick: t[6] || (t[6] = (e) => Xn())
2070
+ }, "清空并导出", 8, sl),
2071
+ l("button", {
1909
2072
  class: "p-button p-button-sm p-button-outlined",
1910
2073
  type: "button",
1911
- disabled: C.value,
1912
- onClick: t[7] || (t[7] = (e) => Yn())
1913
- }, "只覆盖", 8, Zo),
1914
- s("button", {
2074
+ disabled: S.value,
2075
+ onClick: t[7] || (t[7] = (e) => Qn())
2076
+ }, "只覆盖", 8, ol),
2077
+ l("button", {
1915
2078
  class: "p-button p-button-sm p-button-text",
1916
2079
  type: "button",
1917
- disabled: C.value,
1918
- onClick: t[8] || (t[8] = (e) => Zn())
1919
- }, "取消", 8, Xo)
2080
+ disabled: S.value,
2081
+ onClick: t[8] || (t[8] = (e) => ts())
2082
+ }, "取消", 8, ll)
1920
2083
  ])
1921
2084
  ])) : k("", !0),
1922
- z.value ? (c(), d("div", Qo, [
1923
- s("p", ta, "删掉「" + p(z.value.row.module) + " / " + p(z.value.row.name || z.value.row.id) + "」的代码文件", 1),
1924
- s("p", ea, [
1925
- t[66] || (t[66] = s("b", null, "库里那一份代码正文会被清空", -1)),
1926
- t[67] || (t[67] = y("(入口 / 清单 / 后端一起); ", -1)),
1927
- z.value.target ? (c(), d(T, { key: 0 }, [
1928
- t[58] || (t[58] = y(" 同时清掉你本机那个块文件夹 ", -1)),
1929
- s("span", na, p(z.value.target.name) + "/" + p(z.value.folder), 1),
1930
- z.value.inventory && z.value.inventory.items.some((e) => e.name === z.value?.folder) ? (c(), d(T, { key: 0 }, [
1931
- y(" (它现在在顶层,里面有东西:本次会先清空)。 ")
2085
+ H.value ? (d(), p("div", al, [
2086
+ l("p", il, "删掉「" + b(H.value.row.module) + " / " + b(H.value.row.name || H.value.row.id) + "」的代码文件", 1),
2087
+ l("p", ul, [
2088
+ t[66] || (t[66] = l("b", null, "库里那一份代码正文会被清空", -1)),
2089
+ t[67] || (t[67] = $("(入口 / 清单 / 后端一起); ", -1)),
2090
+ H.value.target ? (d(), p(M, { key: 0 }, [
2091
+ t[58] || (t[58] = $(" 同时清掉你本机那个块文件夹 ", -1)),
2092
+ l("span", cl, b(H.value.target.name) + "/" + b(H.value.folder), 1),
2093
+ H.value.inventory && H.value.inventory.items.some((e) => e.name === H.value?.folder) ? (d(), p(M, { key: 0 }, [
2094
+ $(" (它现在在顶层,里面有东西:本次会先清空)。 ")
1932
2095
  ], 64)) : k("", !0),
1933
- t[59] || (t[59] = s("b", null, "只动这一个块的文件夹", -1)),
1934
- t[60] || (t[60] = y(":别的块、", -1)),
1935
- t[61] || (t[61] = s("span", { class: "mbc__mono" }, "example/", -1)),
1936
- t[62] || (t[62] = y("、以及目录外面的一切都不会被碰。 ", -1))
1937
- ], 64)) : (c(), d(T, { key: 1 }, [
1938
- t[63] || (t[63] = y(" 现在没有选中开发目录 / 或者读不到它,所以", -1)),
1939
- t[64] || (t[64] = s("b", null, "本机那份不动", -1)),
1940
- t[65] || (t[65] = y(",只清库里那份。 ", -1))
2096
+ t[59] || (t[59] = l("b", null, "只动这一个块的文件夹", -1)),
2097
+ t[60] || (t[60] = $(":别的块、", -1)),
2098
+ t[61] || (t[61] = l("span", { class: "mbc__mono" }, "example/", -1)),
2099
+ t[62] || (t[62] = $("、以及目录外面的一切都不会被碰。 ", -1))
2100
+ ], 64)) : (d(), p(M, { key: 1 }, [
2101
+ t[63] || (t[63] = $(" 现在没有选中开发目录 / 或者读不到它,所以", -1)),
2102
+ t[64] || (t[64] = l("b", null, "本机那份不动", -1)),
2103
+ t[65] || (t[65] = $(",只清库里那份。 ", -1))
1941
2104
  ], 64)),
1942
- t[68] || (t[68] = s("br", null, null, -1)),
1943
- t[69] || (t[69] = y(" 🔴 ", -1)),
1944
- t[70] || (t[70] = s("b", null, "块本身留着", -1)),
1945
- t[71] || (t[71] = y('(这一行不动):页面上那块会显示成占位框,而不是"库里没有这个块"; 删错了也能救回来:展开这一块 → 版本史 → 「切回」删之前那一版。 ', -1))
2105
+ t[68] || (t[68] = l("br", null, null, -1)),
2106
+ t[69] || (t[69] = $(" 🔴 ", -1)),
2107
+ t[70] || (t[70] = l("b", null, "块本身留着", -1)),
2108
+ t[71] || (t[71] = $('(这一行不动):页面上那块会显示成占位框,而不是"库里没有这个块"; 删错了也能救回来:展开这一块 → 版本史 → 「切回」删之前那一版。 ', -1))
1946
2109
  ]),
1947
- s("div", sa, [
1948
- s("button", {
2110
+ l("div", rl, [
2111
+ l("button", {
1949
2112
  class: "p-button p-button-sm",
1950
2113
  type: "button",
1951
- disabled: C.value,
1952
- onClick: t[9] || (t[9] = (e) => se())
1953
- }, "确认删除代码文件", 8, oa),
1954
- s("button", {
2114
+ disabled: S.value,
2115
+ onClick: t[9] || (t[9] = (e) => le())
2116
+ }, "确认删除代码文件", 8, dl),
2117
+ l("button", {
1955
2118
  class: "p-button p-button-sm p-button-text",
1956
2119
  type: "button",
1957
- disabled: C.value,
1958
- onClick: t[10] || (t[10] = (e) => z.value = null)
1959
- }, "取消", 8, aa)
2120
+ disabled: S.value,
2121
+ onClick: t[10] || (t[10] = (e) => H.value = null)
2122
+ }, "取消", 8, pl)
1960
2123
  ])
1961
2124
  ])) : k("", !0),
1962
- ft(s("section", la, [
1963
- s("h3", ia, [
1964
- t[72] || (t[72] = y(" 库里的块 ", -1)),
1965
- s("span", ua, p(Ne.value.length) + " / " + p(f.value.length), 1),
1966
- L.value.trim() ? (c(), d("span", ra, "标签:" + p(L.value), 1)) : k("", !0)
2125
+ vt(l("section", bl, [
2126
+ l("h3", fl, [
2127
+ t[72] || (t[72] = $(" 库里的块 ", -1)),
2128
+ l("span", ml, b(ze.value.length) + " / " + b(v.value.length), 1),
2129
+ P.value.trim() ? (d(), p("span", vl, "标签:" + b(P.value), 1)) : k("", !0)
1967
2130
  ]),
1968
- ft(s("input", {
2131
+ vt(l("input", {
1969
2132
  "onUpdate:modelValue": t[11] || (t[11] = (e) => h.value = e),
1970
2133
  class: "p-inputtext p-component mbc__search",
1971
2134
  type: "search",
1972
2135
  placeholder: "筛选 module / 名字 / 备注 / 详情 / id / 版本号 / 标签"
1973
2136
  }, null, 512), [
1974
- [Yt, h.value]
2137
+ [Xt, h.value]
1975
2138
  ]),
1976
- G.value.length > 0 ? (c(), d("div", ca, [
1977
- t[73] || (t[73] = s("span", { class: "mbc__label" }, "标签", -1)),
1978
- ft(s("input", {
1979
- "onUpdate:modelValue": t[12] || (t[12] = (e) => L.value = e),
2139
+ z.value.length > 0 ? (d(), p("div", hl, [
2140
+ t[73] || (t[73] = l("span", { class: "mbc__label" }, "标签", -1)),
2141
+ vt(l("input", {
2142
+ "onUpdate:modelValue": t[12] || (t[12] = (e) => P.value = e),
1980
2143
  class: "p-inputtext p-component mbc__tagfilter",
1981
2144
  type: "search",
1982
2145
  placeholder: "只看贴了…的块"
1983
2146
  }, null, 512), [
1984
- [Yt, L.value]
2147
+ [Xt, P.value]
1985
2148
  ]),
1986
- (c(!0), d(T, null, I(G.value.slice(0, 24), (e) => (c(), d("button", {
2149
+ (d(!0), p(M, null, N(z.value.slice(0, 24), (e) => (d(), p("button", {
1987
2150
  key: e.tag,
1988
- class: H(["p-tag mbc__tag", { "is-on": L.value.trim().toLowerCase() === e.tag.toLowerCase() }]),
2151
+ class: K(["p-tag mbc__tag", { "is-on": P.value.trim().toLowerCase() === e.tag.toLowerCase() }]),
1989
2152
  type: "button",
1990
2153
  title: `只看贴了「${e.tag}」的块(${e.count} 个)`,
1991
- onClick: (u) => L.value = L.value.trim().toLowerCase() === e.tag.toLowerCase() ? "" : e.tag
1992
- }, p(e.tag) + " " + p(e.count), 11, da))), 128)),
1993
- L.value ? (c(), d("button", {
2154
+ onClick: (r) => P.value = P.value.trim().toLowerCase() === e.tag.toLowerCase() ? "" : e.tag
2155
+ }, b(e.tag) + " " + b(e.count), 11, _l))), 128)),
2156
+ P.value ? (d(), p("button", {
1994
2157
  key: 0,
1995
2158
  class: "p-button p-button-sm p-button-text",
1996
2159
  type: "button",
1997
- onClick: t[13] || (t[13] = (e) => L.value = "")
2160
+ onClick: t[13] || (t[13] = (e) => P.value = "")
1998
2161
  }, "清掉标签筛选")) : k("", !0)
1999
2162
  ])) : k("", !0),
2000
- s("ul", pa, [
2001
- (c(!0), d(T, null, I(Ne.value, (e) => (c(), d("li", {
2163
+ l("ul", gl, [
2164
+ (d(!0), p(M, null, N(ze.value, (e) => (d(), p("li", {
2002
2165
  key: e.id
2003
2166
  }, [
2004
- s("button", {
2167
+ l("button", {
2005
2168
  type: "button",
2006
- class: H(["mbc__row", { "is-active": e.id === x.value, "is-off": e.enabled === !1 }]),
2007
- title: Fn(e),
2008
- onClick: (u) => Bn(e)
2169
+ class: K(["mbc__row", { "is-active": e.id === g.value, "is-off": e.enabled === !1 }]),
2170
+ title: Hn(e),
2171
+ onClick: (r) => Rn(e)
2009
2172
  }, [
2010
- s("span", ma, p(e.module || "unassigned"), 1),
2011
- s("span", fa, p(e.name || e.id), 1),
2012
- s("span", {
2173
+ l("span", kl, b(e.module || "unassigned"), 1),
2174
+ l("span", $l, b(e.name || e.id), 1),
2175
+ l("span", {
2013
2176
  class: "mbc__version-badge",
2014
2177
  title: `当前是第 ${e.version || 1} 版,一共留着 ${e.versionCount ?? 1} 版`
2015
2178
  }, [
2016
- y("v" + p(e.version || 1), 1),
2017
- (e.versionCount ?? 1) > 1 ? (c(), d(T, { key: 0 }, [
2018
- y("/" + p(e.versionCount), 1)
2179
+ $("v" + b(e.version || 1), 1),
2180
+ (e.versionCount ?? 1) > 1 ? (d(), p(M, { key: 0 }, [
2181
+ $("/" + b(e.versionCount), 1)
2019
2182
  ], 64)) : k("", !0)
2020
- ], 8, va),
2021
- (c(!0), d(T, null, I(e.tags ?? [], (u) => (c(), d("span", {
2022
- key: u,
2183
+ ], 8, wl),
2184
+ (d(!0), p(M, null, N(e.tags ?? [], (r) => (d(), p("span", {
2185
+ key: r,
2023
2186
  class: "p-tag mbc__tag mbc__tag--on-row"
2024
- }, p(u), 1))), 128)),
2025
- Vt(e).length > 0 ? (c(), d("span", ha, p(Vt(e).join(" / ")), 1)) : k("", !0),
2026
- s("em", {
2027
- class: H({ "is-off": e.enabled === !1 })
2028
- }, p(e.enabled === !1 ? De(e) || "校验失败已停用" : "可用"), 3),
2029
- (e.detail ?? "").trim() ? (c(), d("span", {
2187
+ }, b(r), 1))), 128)),
2188
+ Jt(e).length > 0 ? (d(), p("span", xl, b(Jt(e).join(" / ")), 1)) : k("", !0),
2189
+ l("em", {
2190
+ class: K({ "is-off": e.enabled === !1 })
2191
+ }, b(e.enabled === !1 ? Ne(e) || "校验失败已停用" : "可用"), 3),
2192
+ (e.detail ?? "").trim() ? (d(), p("span", {
2030
2193
  key: 1,
2031
2194
  class: "mbc__detail-line",
2032
- title: e.detail
2033
- }, p(e.detail), 9, _a)) : k("", !0)
2034
- ], 10, ba),
2035
- x.value === e.id ? (c(), d("div", ga, [
2036
- (c(!0), d(T, null, I(ie(e).slice(0, xe), (u, S) => (c(), d("p", {
2037
- key: S,
2195
+ title: it(un)(e.detail ?? "", 240)
2196
+ }, b(it(un)(e.detail ?? "")), 9, Cl)) : k("", !0)
2197
+ ], 10, yl),
2198
+ g.value === e.id ? (d(), p("div", Sl, [
2199
+ (d(!0), p(M, null, N(ce(e).slice(0, Se), (r, B) => (d(), p("p", {
2200
+ key: B,
2038
2201
  class: "mbc__problem"
2039
- }, p(u), 1))), 128)),
2040
- ie(e).length > xe ? (c(), d("p", ya, "还有 " + p(ie(e).length - xe) + " 条问题没显示出来:点上面的「校验全部魔法块」重算一遍(这几条是上次校验的结论)", 1)) : k("", !0),
2041
- s("dl", ka, [
2042
- t[77] || (t[77] = s("dt", null, "详情", -1)),
2043
- s("dd", null, [
2044
- gt.value !== e.id ? (c(), d(T, { key: 0 }, [
2045
- (e.detail ?? "").trim() ? (c(), d("span", $a, p(e.detail), 1)) : (c(), d("span", wa, [...t[74] || (t[74] = [
2046
- y("(这一块没写详情 —— 点右边「写详情」写一段:它会存进库,下次导出还会写进它的 ", -1),
2047
- s("span", { class: "mbc__mono" }, "magic-block.open.yaml", -1),
2048
- y(")", -1)
2049
- ])])),
2050
- s("button", {
2202
+ }, b(r), 1))), 128)),
2203
+ ce(e).length > Se ? (d(), p("p", El, "还有 " + b(ce(e).length - Se) + " 条问题没显示出来:点上面的「校验全部魔法块」重算一遍(这几条是上次校验的结论)", 1)) : k("", !0),
2204
+ l("dl", Tl, [
2205
+ t[76] || (t[76] = l("dt", null, "详情", -1)),
2206
+ l("dd", null, [
2207
+ yt.value !== e.id ? (d(), p(M, { key: 0 }, [
2208
+ (e.detail ?? "").trim() ? (d(), p("div", {
2209
+ key: 0,
2210
+ class: "mbc__blockdetail",
2211
+ innerHTML: it(ho)(e.detail ?? "")
2212
+ }, null, 8, Bl)) : (d(), p("span", Ml, "(这一块没写详情 —— 点右边「写详情」写一段**业务功能说明**:谁能用、什么场景、解决什么、输入输出是什么业务含义;用 Markdown 写,**别写路由 / 字段 / 实现方式**)")),
2213
+ l("button", {
2051
2214
  class: "p-button p-button-sm p-button-text",
2052
2215
  type: "button",
2053
- disabled: C.value,
2054
- onClick: (u) => jn(e)
2055
- }, p((e.detail ?? "").trim() ? "改详情" : "写详情"), 9, xa)
2056
- ], 64)) : (c(), d(T, { key: 1 }, [
2057
- ft(s("textarea", {
2058
- "onUpdate:modelValue": t[14] || (t[14] = (u) => yt.value = u),
2216
+ disabled: S.value,
2217
+ onClick: (r) => Nn(e)
2218
+ }, b((e.detail ?? "").trim() ? "改详情" : "写详情"), 9, Al)
2219
+ ], 64)) : (d(), p(M, { key: 1 }, [
2220
+ vt(l("textarea", {
2221
+ "onUpdate:modelValue": t[14] || (t[14] = (r) => kt.value = r),
2059
2222
  class: "p-inputtext p-component mbc__detailinput",
2060
- rows: "3",
2061
- placeholder: "一段给人读的说明:这个块解决什么、怎么用、有哪些前提(只占一行)"
2223
+ rows: "6",
2224
+ placeholder: `业务功能说明,用 Markdown 写 —— 例如:
2225
+ # 客户档案
2226
+
2227
+ 业务上解决「这个客户是谁、跟我们要过什么」。
2228
+
2229
+ - 谁能用:销售 · 客服
2230
+ - 怎么用:搜手机号 → 打开档案
2231
+ (**别写**路由名 / 字段名 / 实现方式)`
2062
2232
  }, null, 512), [
2063
- [Yt, yt.value]
2233
+ [Xt, kt.value]
2064
2234
  ]),
2065
- s("button", {
2235
+ l("button", {
2066
2236
  class: "p-button p-button-sm",
2067
2237
  type: "button",
2068
- disabled: C.value,
2069
- onClick: (u) => Ln(e)
2070
- }, "存详情", 8, Ca),
2071
- s("button", {
2238
+ disabled: S.value,
2239
+ onClick: (r) => In(e)
2240
+ }, "存详情", 8, Rl),
2241
+ l("button", {
2072
2242
  class: "p-button p-button-sm p-button-text",
2073
2243
  type: "button",
2074
- disabled: C.value,
2075
- onClick: t[15] || (t[15] = (u) => gt.value = "")
2076
- }, "取消", 8, Ea)
2244
+ disabled: S.value,
2245
+ onClick: t[15] || (t[15] = (r) => yt.value = "")
2246
+ }, "取消", 8, Ol)
2077
2247
  ], 64))
2078
2248
  ]),
2079
- t[78] || (t[78] = s("dt", null, "文件", -1)),
2080
- s("dd", null, p((e.fileNames || []).join(" / ") || "(没有文件)"), 1),
2081
- t[79] || (t[79] = s("dt", null, "版本", -1)),
2082
- s("dd", null, [
2083
- y("v" + p(e.version || 1), 1),
2084
- s("span", Sa, "(一共留着 " + p(e.versionCount ?? st.value[e.id]?.length ?? 1) + " 版)", 1)
2249
+ t[77] || (t[77] = l("dt", null, "文件", -1)),
2250
+ l("dd", null, b((e.fileNames || []).join(" / ") || "(没有文件)"), 1),
2251
+ t[78] || (t[78] = l("dt", null, "版本", -1)),
2252
+ l("dd", null, [
2253
+ $("v" + b(e.version || 1), 1),
2254
+ l("span", Pl, "(一共留着 " + b(e.versionCount ?? ot.value[e.id]?.length ?? 1) + " 版)", 1)
2085
2255
  ]),
2086
- t[80] || (t[80] = s("dt", null, "标签", -1)),
2087
- s("dd", null, [
2088
- pt.value !== e.id ? (c(), d(T, { key: 0 }, [
2089
- (c(!0), d(T, null, I(e.tags ?? [], (u) => (c(), d("span", {
2090
- key: u,
2256
+ t[79] || (t[79] = l("dt", null, "标签", -1)),
2257
+ l("dd", null, [
2258
+ Z.value !== e.id ? (d(), p(M, { key: 0 }, [
2259
+ (d(!0), p(M, null, N(e.tags ?? [], (r) => (d(), p("span", {
2260
+ key: r,
2091
2261
  class: "p-tag mbc__tag"
2092
- }, p(u), 1))), 128)),
2093
- (e.tags ?? []).length === 0 ? (c(), d("span", Ta, "(没贴标签)")) : k("", !0),
2094
- s("button", {
2262
+ }, b(r), 1))), 128)),
2263
+ (e.tags ?? []).length === 0 ? (d(), p("span", jl, "(没贴标签)")) : k("", !0),
2264
+ l("button", {
2095
2265
  class: "p-button p-button-sm p-button-text",
2096
2266
  type: "button",
2097
- disabled: C.value,
2098
- onClick: (u) => Pn(e)
2099
- }, "改标签", 8, Ba)
2100
- ], 64)) : (c(), d(T, { key: 1 }, [
2101
- ft(s("input", {
2102
- "onUpdate:modelValue": t[16] || (t[16] = (u) => Z.value = u),
2267
+ disabled: S.value,
2268
+ onClick: (r) => Dn(e)
2269
+ }, "改标签", 8, Ll)
2270
+ ], 64)) : (d(), p(M, { key: 1 }, [
2271
+ vt(l("input", {
2272
+ "onUpdate:modelValue": t[16] || (t[16] = (r) => X.value = r),
2103
2273
  class: "p-inputtext p-component mbc__taginput",
2104
2274
  type: "text",
2105
2275
  placeholder: "逗号分隔,例如:订单, 报表",
2106
- onKeyup: us((u) => Ie(e), ["enter"])
2107
- }, null, 40, Ma), [
2108
- [Yt, Z.value]
2276
+ onKeyup: ds((r) => Fe(e), ["enter"])
2277
+ }, null, 40, Dl), [
2278
+ [Xt, X.value]
2109
2279
  ]),
2110
- s("button", {
2280
+ l("button", {
2111
2281
  class: "p-button p-button-sm",
2112
2282
  type: "button",
2113
- disabled: C.value,
2114
- onClick: (u) => Ie(e)
2115
- }, "存标签", 8, Aa),
2116
- s("button", {
2283
+ disabled: S.value,
2284
+ onClick: (r) => Fe(e)
2285
+ }, "存标签", 8, Il),
2286
+ l("button", {
2117
2287
  class: "p-button p-button-sm p-button-text",
2118
2288
  type: "button",
2119
- disabled: C.value,
2120
- onClick: t[17] || (t[17] = (u) => pt.value = "")
2121
- }, "取消", 8, Ra),
2122
- G.value.length > 0 ? (c(), d("div", Oa, [
2123
- t[75] || (t[75] = s("span", { class: "mbc__hint" }, "点现成的加进去:", -1)),
2124
- (c(!0), d(T, null, I(G.value.slice(0, 16), (u) => (c(), d("button", {
2125
- key: u.tag,
2289
+ disabled: S.value,
2290
+ onClick: t[17] || (t[17] = (r) => Z.value = "")
2291
+ }, "取消", 8, Nl),
2292
+ z.value.length > 0 ? (d(), p("div", Fl, [
2293
+ t[74] || (t[74] = l("span", { class: "mbc__hint" }, "点现成的加进去:", -1)),
2294
+ (d(!0), p(M, null, N(z.value.slice(0, 16), (r) => (d(), p("button", {
2295
+ key: r.tag,
2126
2296
  class: "p-tag mbc__tag",
2127
2297
  type: "button",
2128
- title: `把「${u.tag}」加进去`,
2129
- onClick: (S) => Dn(u.tag)
2130
- }, p(u.tag), 9, Pa))), 128))
2298
+ title: `把「${r.tag}」加进去`,
2299
+ onClick: (B) => Fn(r.tag)
2300
+ }, b(r.tag), 9, zl))), 128))
2131
2301
  ])) : k("", !0),
2132
- Z.value.trim() ? (c(), d("div", La, [
2133
- t[76] || (t[76] = s("span", { class: "mbc__hint" }, "这一块会贴:", -1)),
2134
- (c(!0), d(T, null, I(Z.value.split(/[,,\s]+/).filter(Boolean), (u) => (c(), d("button", {
2135
- key: u,
2302
+ X.value.trim() ? (d(), p("div", Ul, [
2303
+ t[75] || (t[75] = l("span", { class: "mbc__hint" }, "这一块会贴:", -1)),
2304
+ (d(!0), p(M, null, N(X.value.split(/[,,\s]+/).filter(Boolean), (r) => (d(), p("button", {
2305
+ key: r,
2136
2306
  class: "p-tag mbc__tag",
2137
2307
  type: "button",
2138
- title: `从这一块上摘掉「${u}」`,
2139
- onClick: (S) => In(u)
2140
- }, p(u) + " ×", 9, ja))), 128))
2308
+ title: `从这一块上摘掉「${r}」`,
2309
+ onClick: (B) => zn(r)
2310
+ }, b(r) + " ×", 9, Hl))), 128))
2141
2311
  ])) : k("", !0)
2142
2312
  ], 64))
2143
2313
  ]),
2144
- t[81] || (t[81] = s("dt", null, "更新", -1)),
2145
- s("dd", null, p(e.updatedAt || "—"), 1),
2146
- t[82] || (t[82] = s("dt", null, "id", -1)),
2147
- s("dd", Da, p(e.id), 1)
2314
+ t[80] || (t[80] = l("dt", null, "更新", -1)),
2315
+ l("dd", null, b(e.updatedAt || "—"), 1),
2316
+ t[81] || (t[81] = l("dt", null, "id", -1)),
2317
+ l("dd", Kl, b(e.id), 1)
2148
2318
  ]),
2149
- s("div", Ia, [
2150
- s("button", {
2319
+ l("div", ql, [
2320
+ l("button", {
2151
2321
  class: "p-button p-button-sm p-button-outlined",
2152
2322
  type: "button",
2153
- disabled: C.value,
2154
- onClick: (u) => ne(e),
2323
+ disabled: S.value,
2324
+ onClick: (r) => oe(e),
2155
2325
  title: "删掉这一块的代码文件:本机的文件夹 + 库里那份代码正文(点下去会先问你确认)。块本身留着,页面上会显示成占位框"
2156
- }, "删除代码文件", 8, Na)
2326
+ }, "删除代码文件", 8, Vl)
2157
2327
  ]),
2158
- s("div", Fa, [
2159
- s("div", Ua, [
2160
- t[83] || (t[83] = s("strong", null, "版本(每次上传 +1,旧的都留着)", -1)),
2161
- s("button", {
2328
+ l("div", Jl, [
2329
+ l("div", Gl, [
2330
+ t[82] || (t[82] = l("strong", null, "版本(每次上传 +1,旧的都留着)", -1)),
2331
+ l("button", {
2162
2332
  class: "p-button p-button-sm p-button-text",
2163
2333
  type: "button",
2164
- disabled: C.value,
2165
- onClick: (u) => j(e.id)
2166
- }, p($.value === e.id ? "读版本中…" : "刷新版本"), 9, za)
2334
+ disabled: S.value,
2335
+ onClick: (r) => D(e.id)
2336
+ }, b(w.value === e.id ? "读版本中…" : "刷新版本"), 9, Wl)
2167
2337
  ]),
2168
- st.value[e.id] ? st.value[e.id].length > 0 ? (c(), d("ul", Ka, [
2169
- (c(!0), d(T, null, I(st.value[e.id], (u) => (c(), d("li", {
2170
- key: u.number,
2171
- class: H({ "is-current": u.current })
2338
+ ot.value[e.id] ? ot.value[e.id].length > 0 ? (d(), p("ul", Zl, [
2339
+ (d(!0), p(M, null, N(ot.value[e.id], (r) => (d(), p("li", {
2340
+ key: r.number,
2341
+ class: K({ "is-current": r.current })
2172
2342
  }, [
2173
- s("span", Va, p(ut(u)), 1),
2174
- s("span", qa, [
2175
- y(p(u.fileCount) + " 个文件 · " + p(jt(u.sizeBytes)), 1),
2176
- u.createdBy ? (c(), d(T, { key: 0 }, [
2177
- y(" · " + p(u.createdBy), 1)
2343
+ l("span", Xl, b(rt(r)), 1),
2344
+ l("span", Ql, [
2345
+ $(b(r.fileCount) + " 个文件 · " + b(It(r.sizeBytes)), 1),
2346
+ r.createdBy ? (d(), p(M, { key: 0 }, [
2347
+ $(" · " + b(r.createdBy), 1)
2178
2348
  ], 64)) : k("", !0),
2179
- y(" · " + p(u.createdAt || "—"), 1)
2349
+ $(" · " + b(r.createdAt || "—"), 1)
2180
2350
  ]),
2181
- s("span", Ja, [
2182
- s("button", {
2351
+ l("span", ta, [
2352
+ l("button", {
2183
2353
  class: "p-button p-button-sm p-button-text",
2184
2354
  type: "button",
2185
- disabled: C.value || u.empty,
2186
- onClick: (S) => Mn(e, u.number),
2187
- title: u.empty ? "这一版是空包(代码被删过),没有正文可看" : "看这一版的正文(只读)"
2188
- }, "查看", 8, Ga),
2189
- s("button", {
2355
+ disabled: S.value || r.empty,
2356
+ onClick: (B) => On(e, r.number),
2357
+ title: r.empty ? "这一版是空包(代码被删过),没有正文可看" : "看这一版的正文(只读)"
2358
+ }, "查看", 8, ea),
2359
+ l("button", {
2190
2360
  class: "p-button p-button-sm p-button-text",
2191
2361
  type: "button",
2192
- disabled: C.value || u.current || u.empty,
2193
- onClick: (S) => An(e, u.number),
2194
- title: u.current ? "这一版正在跑" : "把这一版变成当前版(会记成一个新版本)"
2195
- }, "切回", 8, Wa),
2196
- s("button", {
2362
+ disabled: S.value || r.current || r.empty,
2363
+ onClick: (B) => Pn(e, r.number),
2364
+ title: r.current ? "这一版正在跑" : "把这一版变成当前版(会记成一个新版本)"
2365
+ }, "切回", 8, na),
2366
+ l("button", {
2197
2367
  class: "p-button p-button-sm p-button-text",
2198
2368
  type: "button",
2199
- disabled: C.value || u.empty,
2200
- onClick: (S) => On(e, u.number),
2201
- title: u.empty ? "空包没什么可下的" : "下载这一版(一个 zip)"
2202
- }, "下载", 8, Ya),
2203
- s("button", {
2369
+ disabled: S.value || r.empty,
2370
+ onClick: (B) => Ln(e, r.number),
2371
+ title: r.empty ? "空包没什么可下的" : "下载这一版(一个 zip)"
2372
+ }, "下载", 8, sa),
2373
+ l("button", {
2204
2374
  class: "p-button p-button-sm p-button-text",
2205
2375
  type: "button",
2206
- disabled: C.value || u.current,
2207
- onClick: (S) => Rn(e, u.number),
2208
- title: u.current ? "当前那一版不许删:先切到别的版本" : "删掉这一版(别的版本不受影响)"
2209
- }, "删", 8, Za)
2376
+ disabled: S.value || r.current,
2377
+ onClick: (B) => jn(e, r.number),
2378
+ title: r.current ? "当前那一版不许删:先切到别的版本" : "删掉这一版(别的版本不受影响)"
2379
+ }, "删", 8, oa)
2210
2380
  ])
2211
2381
  ], 2))), 128))
2212
- ])) : (c(), d("p", Xa, "这个块还没有版本记录(它从没被保存过)。")) : (c(), d("p", Ha, "正在读版本…(没读到时点「刷新版本」)")),
2213
- E.value && E.value.id === e.id ? (c(), d("div", Qa, [
2214
- s("div", tl, [
2215
- s("strong", null, "看 v" + p(E.value.number) + " 的正文(只读)", 1),
2216
- s("button", {
2382
+ ])) : (d(), p("p", la, "这个块还没有版本记录(它从没被保存过)。")) : (d(), p("p", Yl, "正在读版本…(没读到时点「刷新版本」)")),
2383
+ T.value && T.value.id === e.id ? (d(), p("div", aa, [
2384
+ l("div", ia, [
2385
+ l("strong", null, "看 v" + b(T.value.number) + " 的正文(只读)", 1),
2386
+ l("button", {
2217
2387
  class: "p-button p-button-sm p-button-text",
2218
2388
  type: "button",
2219
- onClick: t[18] || (t[18] = (u) => E.value = null)
2389
+ onClick: t[18] || (t[18] = (r) => T.value = null)
2220
2390
  }, "收起")
2221
2391
  ]),
2222
- (c(!0), d(T, null, I(E.value.files, (u, S) => (c(), d("details", {
2223
- key: S,
2392
+ (d(!0), p(M, null, N(T.value.files, (r, B) => (d(), p("details", {
2393
+ key: B,
2224
2394
  class: "mbc__viewer-file"
2225
2395
  }, [
2226
- s("summary", el, p(S) + "(" + p(jt(u.length)) + ")", 1),
2227
- s("pre", nl, p(u), 1)
2396
+ l("summary", ua, b(B) + "(" + b(It(r.length)) + ")", 1),
2397
+ l("pre", ca, b(r), 1)
2228
2398
  ]))), 128))
2229
2399
  ])) : k("", !0)
2230
2400
  ])
@@ -2232,438 +2402,438 @@ ${t.text}`).join(`
2232
2402
  ]))), 128))
2233
2403
  ])
2234
2404
  ], 512), [
2235
- [Zt, R.value === "blocks"]
2405
+ [Qt, R.value === "blocks"]
2236
2406
  ]),
2237
- ft(s("section", sl, [
2238
- t[93] || (t[93] = s("h3", { class: "mbc__title" }, "导出去改(用你自己的编辑器)", -1)),
2239
- s("div", ol, [
2240
- t[84] || (t[84] = s("span", { class: "mbc__label" }, "体检", -1)),
2241
- s("button", {
2407
+ vt(l("section", ra, [
2408
+ t[92] || (t[92] = l("h3", { class: "mbc__title" }, "导出去改(用你自己的编辑器)", -1)),
2409
+ l("div", da, [
2410
+ t[83] || (t[83] = l("span", { class: "mbc__label" }, "体检", -1)),
2411
+ l("button", {
2242
2412
  class: "p-button p-button-sm",
2243
2413
  type: "button",
2244
- disabled: C.value,
2245
- onClick: t[19] || (t[19] = (e) => qn())
2246
- }, p(Lt.value ? "校验中…" : "校验全部魔法块"), 9, al),
2247
- t[85] || (t[85] = s("span", { class: "mbc__hint" }, "重新跑一遍逐块判据(试加载 + 引用深检),过不了的整块停用;改好再点一次就恢复。", -1))
2414
+ disabled: S.value,
2415
+ onClick: t[19] || (t[19] = (e) => Wn())
2416
+ }, b(Dt.value ? "校验中…" : "校验全部魔法块"), 9, pa),
2417
+ t[84] || (t[84] = l("span", { class: "mbc__hint" }, "重新跑一遍逐块判据(试加载 + 引用深检),过不了的整块停用;改好再点一次就恢复。", -1))
2248
2418
  ]),
2249
- t[94] || (t[94] = s("hr", { class: "mbc__rule" }, null, -1)),
2250
- s("div", ll, [
2251
- t[87] || (t[87] = s("span", { class: "mbc__label" }, "导出范围", -1)),
2252
- s("label", il, [
2253
- s("input", {
2419
+ t[93] || (t[93] = l("hr", { class: "mbc__rule" }, null, -1)),
2420
+ l("div", ba, [
2421
+ t[86] || (t[86] = l("span", { class: "mbc__label" }, "导出范围", -1)),
2422
+ l("label", fa, [
2423
+ l("input", {
2254
2424
  type: "radio",
2255
2425
  name: "mbc-scope",
2256
2426
  value: "one",
2257
- checked: X.value === "one",
2258
- onChange: t[20] || (t[20] = (e) => X.value = "one")
2259
- }, null, 40, ul),
2260
- t[86] || (t[86] = y(" 仅这一个块 ", -1))
2427
+ checked: Q.value === "one",
2428
+ onChange: t[20] || (t[20] = (e) => Q.value = "one")
2429
+ }, null, 40, ma),
2430
+ t[85] || (t[85] = $(" 仅这一个块 ", -1))
2261
2431
  ]),
2262
- s("label", rl, [
2263
- s("input", {
2432
+ l("label", va, [
2433
+ l("input", {
2264
2434
  type: "radio",
2265
2435
  name: "mbc-scope",
2266
2436
  value: "all",
2267
- checked: X.value === "all",
2268
- onChange: t[21] || (t[21] = (e) => X.value = "all")
2269
- }, null, 40, cl),
2270
- y(" 全部块(" + p(f.value.length) + " 个) ", 1)
2437
+ checked: Q.value === "all",
2438
+ onChange: t[21] || (t[21] = (e) => Q.value = "all")
2439
+ }, null, 40, ha),
2440
+ $(" 全部块(" + b(v.value.length) + " 个) ", 1)
2271
2441
  ]),
2272
- X.value === "one" ? (c(), d("select", {
2442
+ Q.value === "one" ? (d(), p("select", {
2273
2443
  key: 0,
2274
2444
  class: "p-inputtext p-component mbc__grow",
2275
- value: $t.value,
2276
- disabled: C.value || f.value.length === 0,
2277
- onChange: t[22] || (t[22] = (e) => zt(e.target.value))
2445
+ value: wt.value,
2446
+ disabled: S.value || v.value.length === 0,
2447
+ onChange: t[22] || (t[22] = (e) => Kt(e.target.value))
2278
2448
  }, [
2279
- f.value.length === 0 ? (c(), d("option", pl, "(库里还没有块)")) : k("", !0),
2280
- (c(!0), d(T, null, I(f.value, (e) => (c(), d("option", {
2449
+ v.value.length === 0 ? (d(), p("option", ga, "(库里还没有块)")) : k("", !0),
2450
+ (d(!0), p(M, null, N(v.value, (e) => (d(), p("option", {
2281
2451
  key: e.id,
2282
2452
  value: e.id
2283
- }, p(e.module) + " / " + p(e.name || e.id), 9, bl))), 128))
2284
- ], 40, dl)) : k("", !0)
2453
+ }, b(e.module) + " / " + b(e.name || e.id), 9, ya))), 128))
2454
+ ], 40, _a)) : k("", !0)
2285
2455
  ]),
2286
- s("div", ml, [
2287
- t[88] || (t[88] = s("label", { for: "mbc-dir" }, "导出目录", -1)),
2288
- s("input", {
2456
+ l("div", ka, [
2457
+ t[87] || (t[87] = l("label", { for: "mbc-dir" }, "导出目录", -1)),
2458
+ l("input", {
2289
2459
  id: "mbc-dir",
2290
2460
  class: "p-inputtext p-component mbc__grow mbc__mono",
2291
2461
  type: "text",
2292
2462
  readonly: "",
2293
- value: K.value ? K.value.name : "(还没选:点右边那个按钮选一个文件夹)"
2294
- }, null, 8, fl),
2295
- s("button", {
2463
+ value: q.value ? q.value.name : "(还没选:点右边那个按钮选一个文件夹)"
2464
+ }, null, 8, $a),
2465
+ l("button", {
2296
2466
  class: "p-button p-button-sm p-button-outlined",
2297
2467
  type: "button",
2298
- disabled: C.value,
2299
- onClick: t[23] || (t[23] = (e) => Ue("export"))
2300
- }, "选择文件夹", 8, vl),
2301
- s("button", {
2468
+ disabled: S.value,
2469
+ onClick: t[23] || (t[23] = (e) => He("export"))
2470
+ }, "选择文件夹", 8, wa),
2471
+ l("button", {
2302
2472
  class: "p-button p-button-sm mbc__act-export",
2303
2473
  type: "button",
2304
- disabled: C.value || X.value === "one" && !bt.value,
2305
- title: X.value === "one" && !bt.value ? "先在左边挑一个块(或者把范围改成「全部块」)" : "把库里的块铺到你选的文件夹",
2306
- onClick: t[24] || (t[24] = (e) => Jn())
2307
- }, p(lt.value ? "导出中…" : "导出"), 9, hl)
2474
+ disabled: S.value || Q.value === "one" && !ft.value,
2475
+ title: Q.value === "one" && !ft.value ? "先在左边挑一个块(或者把范围改成「全部块」)" : "把库里的块铺到你选的文件夹",
2476
+ onClick: t[24] || (t[24] = (e) => Yn())
2477
+ }, b(ut.value ? "导出中…" : "导出"), 9, xa)
2308
2478
  ]),
2309
- s("p", _l, [
2310
- y(p(X.value === "all" ? `这一趟铺全部 ${f.value.length} 个块` : bt.value ? `这一趟只铺「${bt.value.module} / ${bt.value.name || bt.value.id}」` : "先挑一个块") + " ⇒ ", 1),
2311
- t[89] || (t[89] = s("span", { class: "mbc__mono" }, "workspace/<可读名>-<块 uuid>/", -1)),
2312
- t[90] || (t[90] = y(",顶层另附开发说明与 ", -1)),
2313
- t[91] || (t[91] = s("span", { class: "mbc__mono" }, "example/", -1)),
2314
- t[92] || (t[92] = y("。 ", -1))
2479
+ l("p", Ca, [
2480
+ $(b(Q.value === "all" ? `这一趟铺全部 ${v.value.length} 个块` : ft.value ? `这一趟只铺「${ft.value.module} / ${ft.value.name || ft.value.id}」` : "先挑一个块") + " ⇒ ", 1),
2481
+ t[88] || (t[88] = l("span", { class: "mbc__mono" }, "workspace/<可读名>-<块 uuid>/", -1)),
2482
+ t[89] || (t[89] = $(",顶层另附开发说明与 ", -1)),
2483
+ t[90] || (t[90] = l("span", { class: "mbc__mono" }, "example/", -1)),
2484
+ t[91] || (t[91] = $("。 ", -1))
2315
2485
  ]),
2316
- V.value ? (c(), d("p", gl, p(V.value), 1)) : k("", !0)
2486
+ V.value ? (d(), p("p", Sa, b(V.value), 1)) : k("", !0)
2317
2487
  ], 512), [
2318
- [Zt, R.value === "workspace"]
2488
+ [Qt, R.value === "workspace"]
2319
2489
  ]),
2320
- ft(s("section", yl, [
2321
- t[103] || (t[103] = s("h3", { class: "mbc__title" }, "读回改动", -1)),
2322
- s("div", kl, [
2323
- t[95] || (t[95] = s("label", { for: "mbc-read-dir" }, "读回目录", -1)),
2324
- s("input", {
2490
+ vt(l("section", Ea, [
2491
+ t[102] || (t[102] = l("h3", { class: "mbc__title" }, "读回改动", -1)),
2492
+ l("div", Ta, [
2493
+ t[94] || (t[94] = l("label", { for: "mbc-read-dir" }, "读回目录", -1)),
2494
+ l("input", {
2325
2495
  id: "mbc-read-dir",
2326
2496
  class: "p-inputtext p-component mbc__grow mbc__mono",
2327
2497
  type: "text",
2328
2498
  readonly: "",
2329
2499
  value: U.value ? U.value.name : "(还没选:导出会自动填上,也可以自己选一个)"
2330
- }, null, 8, $l),
2331
- s("button", {
2500
+ }, null, 8, Ba),
2501
+ l("button", {
2332
2502
  class: "p-button p-button-sm p-button-outlined",
2333
2503
  type: "button",
2334
- disabled: C.value,
2335
- onClick: t[25] || (t[25] = (e) => Ue("read"))
2336
- }, "选择文件夹", 8, wl),
2337
- s("button", {
2504
+ disabled: S.value,
2505
+ onClick: t[25] || (t[25] = (e) => He("read"))
2506
+ }, "选择文件夹", 8, Ma),
2507
+ l("button", {
2338
2508
  class: "p-button p-button-sm p-button-outlined",
2339
2509
  type: "button",
2340
- disabled: C.value,
2341
- onClick: t[26] || (t[26] = (e) => Ke())
2342
- }, p(kt.value ? "读回中…" : "读回改动"), 9, xl)
2510
+ disabled: S.value,
2511
+ onClick: t[26] || (t[26] = (e) => Ve())
2512
+ }, b($t.value ? "读回中…" : "读回改动"), 9, Aa)
2343
2513
  ]),
2344
- U.value && K.value && U.value.name !== K.value.name ? (c(), d("p", Cl, " 读回的是「" + p(U.value.name) + "」(与导出目录「" + p(K.value.name) + "」不是同一个 —— 想同步就再选一次)。 ", 1)) : (c(), d("p", El, "读回目录默认跟着导出目录;要读别的文件夹就点「选择文件夹」单独选一个。")),
2345
- A.value ? (c(), d(T, { key: 2 }, [
2346
- qt.value.length > 0 ? (c(), d("p", Sl, [
2347
- t[96] || (t[96] = y(" 扫到 ", -1)),
2348
- s("b", null, p(A.value.blocks.length), 1),
2349
- t[97] || (t[97] = y(" 个块,其中 ", -1)),
2350
- s("b", Tl, p(qt.value.length), 1),
2351
- t[98] || (t[98] = y(" 个可以存;已经勾了 ", -1)),
2352
- s("b", null, p(Jt.value.length), 1),
2353
- t[99] || (t[99] = y(" 个。 ", -1)),
2354
- s("button", {
2514
+ U.value && q.value && U.value.name !== q.value.name ? (d(), p("p", Ra, " 读回的是「" + b(U.value.name) + "」(与导出目录「" + b(q.value.name) + "」不是同一个 —— 想同步就再选一次)。 ", 1)) : (d(), p("p", Oa, "读回目录默认跟着导出目录;要读别的文件夹就点「选择文件夹」单独选一个。")),
2515
+ O.value ? (d(), p(M, { key: 2 }, [
2516
+ Gt.value.length > 0 ? (d(), p("p", Pa, [
2517
+ t[95] || (t[95] = $(" 扫到 ", -1)),
2518
+ l("b", null, b(O.value.blocks.length), 1),
2519
+ t[96] || (t[96] = $(" 个块,其中 ", -1)),
2520
+ l("b", ja, b(Gt.value.length), 1),
2521
+ t[97] || (t[97] = $(" 个可以存;已经勾了 ", -1)),
2522
+ l("b", null, b(Wt.value.length), 1),
2523
+ t[98] || (t[98] = $(" 个。 ", -1)),
2524
+ l("button", {
2355
2525
  class: "p-button p-button-sm p-button-text",
2356
2526
  type: "button",
2357
- disabled: C.value,
2358
- onClick: t[27] || (t[27] = (e) => Ve(!0))
2359
- }, "全选可存的", 8, Bl),
2360
- s("button", {
2527
+ disabled: S.value,
2528
+ onClick: t[27] || (t[27] = (e) => Je(!0))
2529
+ }, "全选可存的", 8, La),
2530
+ l("button", {
2361
2531
  class: "p-button p-button-sm p-button-text",
2362
2532
  type: "button",
2363
- disabled: C.value || Jt.value.length === 0,
2364
- onClick: t[28] || (t[28] = (e) => Ve(!1))
2365
- }, "全不选", 8, Ml)
2533
+ disabled: S.value || Wt.value.length === 0,
2534
+ onClick: t[28] || (t[28] = (e) => Je(!1))
2535
+ }, "全不选", 8, Da)
2366
2536
  ])) : k("", !0),
2367
- A.value.blocks.length > 0 ? (c(), d("ul", Al, [
2368
- (c(!0), d(T, null, I(A.value.blocks, (e) => (c(), d("li", {
2537
+ O.value.blocks.length > 0 ? (d(), p("ul", Ia, [
2538
+ (d(!0), p(M, null, N(O.value.blocks, (e) => (d(), p("li", {
2369
2539
  key: e.id,
2370
- class: H(["mbc__block", { "is-picked": it.value[e.id] === !0, "is-blocked": !e.canApply }])
2540
+ class: K(["mbc__block", { "is-picked": ct.value[e.id] === !0, "is-blocked": !e.canApply }])
2371
2541
  }, [
2372
- s("label", Rl, [
2373
- s("span", {
2374
- class: H(["p-checkbox p-component", { "p-disabled": !e.canApply }])
2542
+ l("label", Na, [
2543
+ l("span", {
2544
+ class: K(["p-checkbox p-component", { "p-disabled": !e.canApply }])
2375
2545
  }, [
2376
- s("input", {
2546
+ l("input", {
2377
2547
  class: "p-checkbox-input",
2378
2548
  type: "checkbox",
2379
2549
  disabled: !e.canApply,
2380
- checked: it.value[e.id] === !0,
2381
- onChange: (u) => Qn(e.id, u)
2382
- }, null, 40, Ol),
2383
- t[100] || (t[100] = s("span", { class: "p-checkbox-box" }, null, -1))
2550
+ checked: ct.value[e.id] === !0,
2551
+ onChange: (r) => ns(e.id, r)
2552
+ }, null, 40, Fa),
2553
+ t[99] || (t[99] = l("span", { class: "p-checkbox-box" }, null, -1))
2384
2554
  ], 2),
2385
- s("span", Pl, p(e.name || e.id), 1),
2386
- s("span", {
2387
- class: H(["p-tag", e.status === "modified" ? "p-tag-success" : e.status === "missing" ? "p-tag-warning" : e.status === "not-in-db" ? "p-tag-info" : ""])
2388
- }, p(o[e.status]), 3),
2389
- s("span", Ll, p(e.module || "—"), 1)
2555
+ l("span", za, b(e.name || e.id), 1),
2556
+ l("span", {
2557
+ class: K(["p-tag", e.status === "modified" ? "p-tag-success" : e.status === "missing" ? "p-tag-warning" : e.status === "not-in-db" ? "p-tag-info" : ""])
2558
+ }, b(s[e.status]), 3),
2559
+ l("span", Ua, b(e.module || "—"), 1)
2390
2560
  ]),
2391
- s("p", jl, [
2392
- e.status === "missing" ? (c(), d(T, { key: 0 }, [
2393
- y("目录里没有这一块,勾不上")
2394
- ], 64)) : e.status === "not-in-db" ? (c(), d(T, { key: 1 }, [
2395
- y("库里还没有这一块 —— 勾上它保存,就是按这一包新建")
2396
- ], 64)) : e.changedFiles.length > 0 ? (c(), d(T, { key: 2 }, [
2397
- t[101] || (t[101] = y("改了:", -1)),
2398
- s("span", Dl, p(e.changedFiles.join(" / ")), 1)
2399
- ], 64)) : (c(), d(T, { key: 3 }, [
2400
- y("内容与库里一致")
2561
+ l("p", Ha, [
2562
+ e.status === "missing" ? (d(), p(M, { key: 0 }, [
2563
+ $("目录里没有这一块,勾不上")
2564
+ ], 64)) : e.status === "not-in-db" ? (d(), p(M, { key: 1 }, [
2565
+ $("库里还没有这一块 —— 勾上它保存,就是按这一包新建")
2566
+ ], 64)) : e.changedFiles.length > 0 ? (d(), p(M, { key: 2 }, [
2567
+ t[100] || (t[100] = $("改了:", -1)),
2568
+ l("span", Ka, b(e.changedFiles.join(" / ")), 1)
2569
+ ], 64)) : (d(), p(M, { key: 3 }, [
2570
+ $("内容与库里一致")
2401
2571
  ], 64))
2402
2572
  ]),
2403
- e.blockedWhy ? (c(), d("p", Il, "不能存:" + p(e.blockedWhy), 1)) : k("", !0),
2404
- s("p", Nl, p(e.folder || e.where), 1)
2573
+ e.blockedWhy ? (d(), p("p", qa, "不能存:" + b(e.blockedWhy), 1)) : k("", !0),
2574
+ l("p", Va, b(e.folder || e.where), 1)
2405
2575
  ], 2))), 128))
2406
- ])) : (c(), d("p", Fl, "这个目录里没有认出任何块(点上面那个按钮再扫一次,或者确认文件夹名里有那个块的 uuid)。")),
2407
- s("div", Ul, [
2408
- rt.value > 0 ? (c(), d("button", {
2576
+ ])) : (d(), p("p", Ja, "这个目录里没有认出任何块(点上面那个按钮再扫一次,或者确认文件夹名里有那个块的 uuid)。")),
2577
+ l("div", Ga, [
2578
+ dt.value > 0 ? (d(), p("button", {
2409
2579
  key: 0,
2410
2580
  class: "p-button p-button-sm mbc__report-btn",
2411
2581
  type: "button",
2412
- title: "点开看这一趟的全部问题(" + rt.value + " 条)",
2413
- onClick: t[29] || (t[29] = (e) => At.value = !0)
2414
- }, "查看问题(" + p(rt.value) + ")⚠", 9, zl)) : (c(), d("span", Hl, "这一趟没有问题")),
2415
- A.value.unmatched.length > 0 ? (c(), d("span", {
2582
+ title: "点开看这一趟的全部问题(" + dt.value + " 条)",
2583
+ onClick: t[29] || (t[29] = (e) => Rt.value = !0)
2584
+ }, "查看问题(" + b(dt.value) + ")⚠", 9, Wa)) : (d(), p("span", Ya, "这一趟没有问题")),
2585
+ O.value.unmatched.length > 0 ? (d(), p("span", {
2416
2586
  key: 2,
2417
2587
  class: "mbc__chip is-bad",
2418
- title: A.value.unmatched.join(" / ")
2419
- }, "认不出归属的文件夹 " + p(A.value.unmatched.length), 9, Kl)) : k("", !0)
2588
+ title: O.value.unmatched.join(" / ")
2589
+ }, "认不出归属的文件夹 " + b(O.value.unmatched.length), 9, Za)) : k("", !0)
2420
2590
  ]),
2421
- (A.value.skipped ?? []).length > 0 ? (c(), d("p", Vl, [
2422
- y(" 忽略了 " + p((A.value.skipped ?? []).length) + " 个文件夹(名字里没有 uuid,当测试文件处理 —— 与忽略 ", 1),
2423
- t[102] || (t[102] = s("span", { class: "mbc__mono" }, "example/", -1)),
2424
- y(" 同一个规矩):" + p((A.value.skipped ?? []).join(" / ")), 1)
2591
+ (O.value.skipped ?? []).length > 0 ? (d(), p("p", Xa, [
2592
+ $(" 忽略了 " + b((O.value.skipped ?? []).length) + " 个文件夹(名字里没有 uuid,当测试文件处理 —— 与忽略 ", 1),
2593
+ t[101] || (t[101] = l("span", { class: "mbc__mono" }, "example/", -1)),
2594
+ $(" 同一个规矩):" + b((O.value.skipped ?? []).join(" / ")), 1)
2425
2595
  ])) : k("", !0),
2426
- s("div", ql, [
2427
- s("button", {
2596
+ l("div", Qa, [
2597
+ l("button", {
2428
2598
  class: "p-button p-button-sm mbc__act-import",
2429
2599
  type: "button",
2430
- disabled: C.value,
2431
- onClick: t[30] || (t[30] = (e) => Xn())
2432
- }, p(nt.value ? "保存中…" : `保存选中的块(${Jt.value.length})`), 9, Jl)
2600
+ disabled: S.value,
2601
+ onClick: t[30] || (t[30] = (e) => es())
2602
+ }, b(st.value ? "保存中…" : `保存选中的块(${Wt.value.length})`), 9, ti)
2433
2603
  ])
2434
2604
  ], 64)) : k("", !0)
2435
2605
  ], 512), [
2436
- [Zt, R.value === "workspace"]
2606
+ [Qt, R.value === "workspace"]
2437
2607
  ]),
2438
- ft(s("section", Gl, [
2439
- s("h3", Wl, [
2440
- t[104] || (t[104] = y(" 不在数据库 ", -1)),
2441
- s("span", Yl, p(_t(l)), 1),
2442
- s("span", Zl, p(ce.value.length), 1)
2608
+ vt(l("section", ei, [
2609
+ l("h3", ni, [
2610
+ t[103] || (t[103] = $(" 不在数据库 ", -1)),
2611
+ l("span", si, b(it(a)), 1),
2612
+ l("span", oi, b(pe.value.length), 1)
2443
2613
  ]),
2444
- ce.value.length === 0 ? (c(), d("p", Xl, "路由表里声明的块,库里都有那一行。")) : (c(), d(T, { key: 1 }, [
2445
- s("p", Ql, [
2446
- t[105] || (t[105] = y(" 这些页面的路由(", -1)),
2447
- t[106] || (t[106] = s("span", { class: "mbc__mono" }, "component: MagicBlockPage", -1)),
2448
- t[107] || (t[107] = y(")声明了块的 uuid, ", -1)),
2449
- t[108] || (t[108] = s("span", { class: "mbc__mono" }, "/magic-blocks/index", -1)),
2450
- t[109] || (t[109] = y(" 里却没有这一行 —— 页面上那一块现在是占位框。 ", -1)),
2451
- t[110] || (t[110] = s("b", null, "要建进库", -1)),
2452
- y(":在上面「读回改动」里选中放这一块的文件夹(文件夹名里有 uuid), 扫出来就是一条标签写着「" + p(_t(l)) + "」、能勾能存的条目。 ", 1)
2614
+ pe.value.length === 0 ? (d(), p("p", li, "路由表里声明的块,库里都有那一行。")) : (d(), p(M, { key: 1 }, [
2615
+ l("p", ai, [
2616
+ t[104] || (t[104] = $(" 这些页面的路由(", -1)),
2617
+ t[105] || (t[105] = l("span", { class: "mbc__mono" }, "component: MagicBlockPage", -1)),
2618
+ t[106] || (t[106] = $(")声明了块的 uuid, ", -1)),
2619
+ t[107] || (t[107] = l("span", { class: "mbc__mono" }, "/magic-blocks/index", -1)),
2620
+ t[108] || (t[108] = $(" 里却没有这一行 —— 页面上那一块现在是占位框。 ", -1)),
2621
+ t[109] || (t[109] = l("b", null, "要建进库", -1)),
2622
+ $(":在上面「读回改动」里选中放这一块的文件夹(文件夹名里有 uuid), 扫出来就是一条标签写着「" + b(it(a)) + "」、能勾能存的条目。 ", 1)
2453
2623
  ]),
2454
- s("ul", ti, [
2455
- (c(!0), d(T, null, I(ce.value, (e) => (c(), d("li", {
2624
+ l("ul", ii, [
2625
+ (d(!0), p(M, null, N(pe.value, (e) => (d(), p("li", {
2456
2626
  key: e.uuid,
2457
2627
  class: "mbc__block is-blocked"
2458
2628
  }, [
2459
- s("label", ei, [
2460
- t[111] || (t[111] = s("span", { class: "p-checkbox p-component p-disabled" }, [
2461
- s("input", {
2629
+ l("label", ui, [
2630
+ t[110] || (t[110] = l("span", { class: "p-checkbox p-component p-disabled" }, [
2631
+ l("input", {
2462
2632
  class: "p-checkbox-input",
2463
2633
  type: "checkbox",
2464
2634
  disabled: ""
2465
2635
  }),
2466
- s("span", { class: "p-checkbox-box" })
2636
+ l("span", { class: "p-checkbox-box" })
2467
2637
  ], -1)),
2468
- s("span", ni, p(e.title || e.uuid), 1),
2469
- s("span", si, p(_t(l)), 1),
2470
- s("span", oi, p(e.module || "—"), 1)
2638
+ l("span", ci, b(e.title || e.uuid), 1),
2639
+ l("span", ri, b(it(a)), 1),
2640
+ l("span", di, b(e.module || "—"), 1)
2471
2641
  ]),
2472
- s("p", ai, [
2473
- t[112] || (t[112] = y(" 路由 ", -1)),
2474
- s("span", li, p(e.path), 1),
2475
- t[113] || (t[113] = y(" 声明了它,库里没有这个块 —— 手里还没有放这个块的文件夹,所以这里勾不上(勾上了也没有正文可存)。 ", -1))
2642
+ l("p", pi, [
2643
+ t[111] || (t[111] = $(" 路由 ", -1)),
2644
+ l("span", bi, b(e.path), 1),
2645
+ t[112] || (t[112] = $(" 声明了它,库里没有这个块 —— 手里还没有放这个块的文件夹,所以这里勾不上(勾上了也没有正文可存)。 ", -1))
2476
2646
  ]),
2477
- s("p", ii, p(e.uuid), 1)
2647
+ l("p", fi, b(e.uuid), 1)
2478
2648
  ]))), 128))
2479
2649
  ])
2480
2650
  ], 64))
2481
2651
  ], 512), [
2482
- [Zt, R.value === "workspace"]
2652
+ [Qt, R.value === "workspace"]
2483
2653
  ]),
2484
- R.value === "workspace" && (W.value.length > 0 || Y.value.length > 0) ? (c(), d("section", ui, [
2485
- t[114] || (t[114] = s("h3", { class: "mbc__title" }, "保存结果", -1)),
2486
- s("p", ri, [
2487
- s("span", ci, "存成 " + p(ue.value), 1),
2488
- It.value.length > 0 ? (c(), d("span", di, "没存成 " + p(It.value.length), 1)) : k("", !0),
2489
- W.value.length > 0 ? (c(), d("span", pi, "前端拦下 " + p(W.value.length), 1)) : k("", !0),
2490
- It.value.length === 0 && W.value.length === 0 ? (c(), d("span", bi, "明细在下面那个「查看问题」里(没问题时是空的)。")) : k("", !0)
2654
+ R.value === "workspace" && (W.value.length > 0 || Y.value.length > 0) ? (d(), p("section", mi, [
2655
+ t[113] || (t[113] = l("h3", { class: "mbc__title" }, "保存结果", -1)),
2656
+ l("p", vi, [
2657
+ l("span", hi, "存成 " + b(re.value), 1),
2658
+ Ft.value.length > 0 ? (d(), p("span", _i, "没存成 " + b(Ft.value.length), 1)) : k("", !0),
2659
+ W.value.length > 0 ? (d(), p("span", gi, "前端拦下 " + b(W.value.length), 1)) : k("", !0),
2660
+ Ft.value.length === 0 && W.value.length === 0 ? (d(), p("span", yi, "明细在下面那个「查看问题」里(没问题时是空的)。")) : k("", !0)
2491
2661
  ]),
2492
- s("div", mi, [
2493
- s("button", {
2662
+ l("div", ki, [
2663
+ l("button", {
2494
2664
  class: "p-button p-button-sm mbc__report-btn",
2495
2665
  type: "button",
2496
- onClick: t[31] || (t[31] = (e) => At.value = !0)
2497
- }, "查看问题(" + p(rt.value) + ")⚠", 1)
2666
+ onClick: t[31] || (t[31] = (e) => Rt.value = !0)
2667
+ }, "查看问题(" + b(dt.value) + ")⚠", 1)
2498
2668
  ])
2499
2669
  ])) : k("", !0),
2500
- t[115] || (t[115] = s("div", {
2670
+ t[114] || (t[114] = l("div", {
2501
2671
  class: "mbc__tailspace",
2502
2672
  "aria-hidden": "true"
2503
2673
  }, null, -1))
2504
2674
  ]),
2505
- s("footer", fi, [
2506
- M.value.length > 0 ? (c(), d("button", {
2675
+ l("footer", $i, [
2676
+ E.value.length > 0 ? (d(), p("button", {
2507
2677
  key: 0,
2508
2678
  class: "p-button p-button-sm mbc__report-btn",
2509
2679
  type: "button",
2510
- title: "点开看全部报错(" + M.value.length + " 条)",
2511
- onClick: t[32] || (t[32] = (e) => F.value = !0)
2512
- }, "查看报错(" + p(M.value.length) + " 条)⚠", 9, vi)) : k("", !0),
2513
- _.value ? (c(), d("p", hi, p(_.value), 1)) : g.value ? (c(), d("p", _i, p(g.value), 1)) : (c(), d("p", gi, "—"))
2680
+ title: "点开看全部报错(" + E.value.length + " 条)",
2681
+ onClick: t[32] || (t[32] = (e) => A.value = !0)
2682
+ }, "查看报错(" + b(E.value.length) + " 条)⚠", 9, wi)) : k("", !0),
2683
+ _.value ? (d(), p("p", xi, b(_.value), 1)) : y.value ? (d(), p("p", Ci, b(y.value), 1)) : (d(), p("p", Si, "—"))
2514
2684
  ])
2515
2685
  ], 2)) : k("", !0),
2516
- b.value && At.value ? (c(), d("div", {
2686
+ c.value && Rt.value ? (d(), p("div", {
2517
2687
  key: 1,
2518
2688
  class: "mbc__modal",
2519
2689
  role: "dialog",
2520
2690
  "aria-modal": "true",
2521
- onClick: t[36] || (t[36] = Ce((e) => At.value = !1, ["self"]))
2691
+ onClick: t[36] || (t[36] = Ee((e) => Rt.value = !1, ["self"]))
2522
2692
  }, [
2523
- s("div", yi, [
2524
- s("header", ki, [
2525
- s("strong", null, "读回 / 保存的问题(" + p(rt.value) + " 条)", 1),
2526
- s("button", {
2693
+ l("div", Ei, [
2694
+ l("header", Ti, [
2695
+ l("strong", null, "读回 / 保存的问题(" + b(dt.value) + " 条)", 1),
2696
+ l("button", {
2527
2697
  class: "p-button p-button-sm p-button-text",
2528
2698
  type: "button",
2529
- onClick: t[33] || (t[33] = (e) => At.value = !1)
2699
+ onClick: t[33] || (t[33] = (e) => Rt.value = !1)
2530
2700
  }, "收起")
2531
2701
  ]),
2532
- s("div", $i, [
2533
- W.value.length > 0 ? (c(), d("section", wi, [
2534
- s("h4", xi, "前端校验拦下的(" + p(W.value.length) + ")", 1),
2535
- s("ul", Ci, [
2536
- (c(!0), d(T, null, I(W.value, (e, u) => (c(), d("li", { key: u }, p(e), 1))), 128))
2702
+ l("div", Bi, [
2703
+ W.value.length > 0 ? (d(), p("section", Mi, [
2704
+ l("h4", Ai, "前端校验拦下的(" + b(W.value.length) + ")", 1),
2705
+ l("ul", Ri, [
2706
+ (d(!0), p(M, null, N(W.value, (e, r) => (d(), p("li", { key: r }, b(e), 1))), 128))
2537
2707
  ])
2538
2708
  ])) : k("", !0),
2539
- (A.value?.failures ?? []).length > 0 ? (c(), d("section", Ei, [
2540
- s("h4", Si, "读回时逐条回的(" + p((A.value?.failures ?? []).length) + ")", 1),
2541
- s("ul", Ti, [
2542
- (c(!0), d(T, null, I(A.value?.failures ?? [], (e, u) => (c(), d("li", { key: u }, [
2543
- s("span", Bi, p(e.kind || "问题"), 1),
2544
- s("span", Mi, p(e.where), 1),
2545
- y(" " + p(e.message), 1)
2709
+ (O.value?.failures ?? []).length > 0 ? (d(), p("section", Oi, [
2710
+ l("h4", Pi, "读回时逐条回的(" + b((O.value?.failures ?? []).length) + ")", 1),
2711
+ l("ul", ji, [
2712
+ (d(!0), p(M, null, N(O.value?.failures ?? [], (e, r) => (d(), p("li", { key: r }, [
2713
+ l("span", Li, b(e.kind || "问题"), 1),
2714
+ l("span", Di, b(e.where), 1),
2715
+ $(" " + b(e.message), 1)
2546
2716
  ]))), 128))
2547
2717
  ])
2548
2718
  ])) : k("", !0),
2549
- (A.value?.unmatched ?? []).length > 0 ? (c(), d("section", Ai, [
2550
- s("h4", Ri, "认不出归属的文件夹(" + p((A.value?.unmatched ?? []).length) + ")", 1),
2551
- s("ul", Oi, [
2552
- (c(!0), d(T, null, I(A.value?.unmatched ?? [], (e, u) => (c(), d("li", { key: u }, [
2553
- s("span", Pi, p(e), 1)
2719
+ (O.value?.unmatched ?? []).length > 0 ? (d(), p("section", Ii, [
2720
+ l("h4", Ni, "认不出归属的文件夹(" + b((O.value?.unmatched ?? []).length) + ")", 1),
2721
+ l("ul", Fi, [
2722
+ (d(!0), p(M, null, N(O.value?.unmatched ?? [], (e, r) => (d(), p("li", { key: r }, [
2723
+ l("span", zi, b(e), 1)
2554
2724
  ]))), 128))
2555
2725
  ])
2556
2726
  ])) : k("", !0),
2557
- Y.value.length > 0 ? (c(), d("section", Li, [
2558
- s("h4", ji, "保存结果(" + p(Y.value.length) + ":存成 " + p(ue.value) + ",没存成 " + p(It.value.length) + ")", 1),
2559
- s("ul", Di, [
2560
- (c(!0), d(T, null, I(Y.value, (e) => (c(), d("li", {
2727
+ Y.value.length > 0 ? (d(), p("section", Ui, [
2728
+ l("h4", Hi, "保存结果(" + b(Y.value.length) + ":存成 " + b(re.value) + ",没存成 " + b(Ft.value.length) + ")", 1),
2729
+ l("ul", Ki, [
2730
+ (d(!0), p(M, null, N(Y.value, (e) => (d(), p("li", {
2561
2731
  key: e.id,
2562
- class: H({ "is-ok": e.ok })
2732
+ class: K({ "is-ok": e.ok })
2563
2733
  }, [
2564
- s("strong", null, p(e.name || e.id) + ":" + p(e.ok ? "已保存" : "没保存"), 1),
2565
- !e.ok && e.error ? (c(), d("span", Ii, p(e.error), 1)) : k("", !0),
2566
- !e.ok && (e.issues ?? []).length > 0 ? (c(), d("ul", Ni, [
2567
- (c(!0), d(T, null, I(e.issues, (u, S) => (c(), d("li", { key: S }, p(u), 1))), 128))
2734
+ l("strong", null, b(e.name || e.id) + ":" + b(e.ok ? "已保存" : "没保存"), 1),
2735
+ !e.ok && e.error ? (d(), p("span", qi, b(e.error), 1)) : k("", !0),
2736
+ !e.ok && (e.issues ?? []).length > 0 ? (d(), p("ul", Vi, [
2737
+ (d(!0), p(M, null, N(e.issues, (r, B) => (d(), p("li", { key: B }, b(r), 1))), 128))
2568
2738
  ])) : k("", !0)
2569
2739
  ], 2))), 128))
2570
2740
  ])
2571
2741
  ])) : k("", !0),
2572
- rt.value === 0 ? (c(), d("p", Fi, "这一趟没有问题。")) : k("", !0)
2742
+ dt.value === 0 ? (d(), p("p", Ji, "这一趟没有问题。")) : k("", !0)
2573
2743
  ]),
2574
- s("footer", Ui, [
2575
- s("button", {
2744
+ l("footer", Gi, [
2745
+ l("button", {
2576
2746
  class: "p-button p-button-sm p-button-outlined",
2577
2747
  type: "button",
2578
- onClick: t[34] || (t[34] = (e) => Vn())
2748
+ onClick: t[34] || (t[34] = (e) => Gn())
2579
2749
  }, "复制全部"),
2580
- s("button", {
2750
+ l("button", {
2581
2751
  class: "p-button p-button-sm",
2582
2752
  type: "button",
2583
- onClick: t[35] || (t[35] = (e) => At.value = !1)
2753
+ onClick: t[35] || (t[35] = (e) => Rt.value = !1)
2584
2754
  }, "知道了")
2585
2755
  ])
2586
2756
  ])
2587
2757
  ])) : k("", !0),
2588
- b.value && F.value ? (c(), d("div", {
2758
+ c.value && A.value ? (d(), p("div", {
2589
2759
  key: 2,
2590
2760
  class: "mbc__modal",
2591
2761
  role: "dialog",
2592
2762
  "aria-modal": "true",
2593
- onClick: t[41] || (t[41] = Ce((e) => F.value = !1, ["self"]))
2763
+ onClick: t[41] || (t[41] = Ee((e) => A.value = !1, ["self"]))
2594
2764
  }, [
2595
- s("div", zi, [
2596
- s("header", Hi, [
2597
- s("strong", null, "报错(" + p(M.value.length) + " 条)", 1),
2598
- s("button", {
2765
+ l("div", Wi, [
2766
+ l("header", Yi, [
2767
+ l("strong", null, "报错(" + b(E.value.length) + " 条)", 1),
2768
+ l("button", {
2599
2769
  class: "p-button p-button-sm p-button-text",
2600
2770
  type: "button",
2601
- onClick: t[37] || (t[37] = (e) => F.value = !1)
2771
+ onClick: t[37] || (t[37] = (e) => A.value = !1)
2602
2772
  }, "收起")
2603
2773
  ]),
2604
- s("div", Ki, [
2605
- s("ol", Vi, [
2606
- (c(!0), d(T, null, I(M.value, (e, u) => (c(), d("li", { key: u }, [
2607
- s("div", qi, [
2608
- s("span", Ji, p(e.at), 1),
2609
- y(" · " + p(e.where), 1)
2774
+ l("div", Zi, [
2775
+ l("ol", Xi, [
2776
+ (d(!0), p(M, null, N(E.value, (e, r) => (d(), p("li", { key: r }, [
2777
+ l("div", Qi, [
2778
+ l("span", tu, b(e.at), 1),
2779
+ $(" · " + b(e.where), 1)
2610
2780
  ]),
2611
- s("pre", Gi, p(e.text), 1)
2781
+ l("pre", eu, b(e.text), 1)
2612
2782
  ]))), 128))
2613
2783
  ]),
2614
- M.value.length === 0 ? (c(), d("p", Wi, "这一轮没有报错。")) : k("", !0)
2784
+ E.value.length === 0 ? (d(), p("p", nu, "这一轮没有报错。")) : k("", !0)
2615
2785
  ]),
2616
- s("footer", Yi, [
2617
- s("button", {
2786
+ l("footer", su, [
2787
+ l("button", {
2618
2788
  class: "p-button p-button-sm p-button-outlined",
2619
2789
  type: "button",
2620
- onClick: t[38] || (t[38] = (e) => Hn())
2790
+ onClick: t[38] || (t[38] = (e) => Vn())
2621
2791
  }, "复制全部"),
2622
- s("button", {
2792
+ l("button", {
2623
2793
  class: "p-button p-button-sm p-button-text",
2624
2794
  type: "button",
2625
- onClick: t[39] || (t[39] = (e) => de())
2795
+ onClick: t[39] || (t[39] = (e) => be())
2626
2796
  }, "清空报错"),
2627
- s("button", {
2797
+ l("button", {
2628
2798
  class: "p-button p-button-sm",
2629
2799
  type: "button",
2630
- onClick: t[40] || (t[40] = (e) => F.value = !1)
2800
+ onClick: t[40] || (t[40] = (e) => A.value = !1)
2631
2801
  }, "知道了")
2632
2802
  ])
2633
2803
  ])
2634
2804
  ])) : k("", !0),
2635
- b.value ? (c(), d("button", {
2805
+ c.value ? (d(), p("button", {
2636
2806
  key: 3,
2637
2807
  class: "mbc__close",
2638
2808
  type: "button",
2639
2809
  title: "关掉 magic block 控制台(Esc)",
2640
- onClick: t[42] || (t[42] = (e) => b.value = !1)
2810
+ onClick: t[42] || (t[42] = (e) => c.value = !1)
2641
2811
  }, "×")) : k("", !0)
2642
2812
  ], 2)) : k("", !0);
2643
2813
  }
2644
- }), ou = /* @__PURE__ */ bn(Qi, [["__scopeId", "data-v-8e10f9f2"]]);
2814
+ }), du = /* @__PURE__ */ vn(au, [["__scopeId", "data-v-98b797e3"]]);
2645
2815
  export {
2646
- cs as API_BASE,
2647
- Rs as BLOCK_BACKEND_FILE,
2648
- Ut as BLOCK_ENTRY,
2649
- _e as BLOCK_MANIFEST,
2650
- ms as CLIENT_SOURCE,
2651
- ge as MANIFEST_KEYS,
2652
- Qe as MANIFEST_REQUIRED,
2653
- ou as MagicBlockConsole,
2654
- ro as MagicBlockPage,
2655
- Oe as NAME_MAX,
2656
- Ns as buildPreview,
2657
- As as checkSelection,
2658
- bo as declaredMissing,
2659
- co as declaredUuidOf,
2660
- po as declaredUuidsOf,
2661
- hs as installBridge,
2662
- zs as loadBlockRender,
2663
- Fs as onBlockRenderRefresh,
2664
- Ts as parseManifest,
2665
- Us as refreshBlockRender,
2666
- Bs as validFileName,
2667
- ws as validName,
2668
- Ms as validateBlock
2816
+ bs as API_BASE,
2817
+ Ds as BLOCK_BACKEND_FILE,
2818
+ Ht as BLOCK_ENTRY,
2819
+ ye as BLOCK_MANIFEST,
2820
+ hs as CLIENT_SOURCE,
2821
+ ke as MANIFEST_KEYS,
2822
+ en as MANIFEST_REQUIRED,
2823
+ du as MagicBlockConsole,
2824
+ mo as MagicBlockPage,
2825
+ je as NAME_MAX,
2826
+ Ks as buildPreview,
2827
+ Ls as checkSelection,
2828
+ yo as declaredMissing,
2829
+ _o as declaredUuidOf,
2830
+ go as declaredUuidsOf,
2831
+ ys as installBridge,
2832
+ Js as loadBlockRender,
2833
+ qs as onBlockRenderRefresh,
2834
+ Os as parseManifest,
2835
+ Vs as refreshBlockRender,
2836
+ Ps as validFileName,
2837
+ Es as validName,
2838
+ js as validateBlock
2669
2839
  };