@marktowin/prototype-core 1.2.11 → 1.2.12

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,6 +1,6 @@
1
- import { defineComponent as tn, computed as k, openBlock as d, createBlock as Me, resolveDynamicComponent as ro, createElementBlock as v, Fragment as D, renderList as T, normalizeClass as A, createTextVNode as K, toDisplayString as c, createElementVNode as e, normalizeStyle as Te, createCommentVNode as S, ref as y, watch as Ye, createVNode as V, Transition as Ta, withCtx as Na, unref as i, withModifiers as Ce, withDirectives as N, vModelText as z, createStaticVNode as Ii, reactive as lo, onBeforeUnmount as Xo, vModelSelect as st, onMounted as Wi, nextTick as Sa, isRef as so, vModelCheckbox as wd, withKeys as Ca } from "vue";
2
- import { Save as Sd, CloudUpload as Cd, Download as kd, X as vn, Plus as Pn, ChevronDown as xd, ChevronRight as Id, Trash2 as Dn, RefreshCw as Yi, AlertTriangle as $d, CheckCircle2 as _d, CircleDot as $i, Bug as Pd, ImagePlus as _i, Filter as Dd, Search as Ra, ArrowLeft as Pi, FileJson as Xi, FileSpreadsheet as Ad, ArrowUp as Ed, ArrowDown as Td, Check as Zi, CircleAlert as qi, Clipboard as Qi, SunMedium as Nd, RotateCcw as Rd, PanelTop as er, BookOpen as Di, Cloud as Od, Database as Bd, Keyboard as jd } from "@lucide/vue";
3
- import { g as vo, a as js, s as Ud } from "./index-CxLROYE8.js";
1
+ import { defineComponent as tn, computed as k, openBlock as d, createBlock as Me, resolveDynamicComponent as ro, createElementBlock as v, Fragment as D, renderList as E, normalizeClass as A, createTextVNode as K, toDisplayString as c, createElementVNode as e, normalizeStyle as Ee, createCommentVNode as S, ref as y, watch as Ye, createVNode as V, Transition as Ea, withCtx as Na, unref as i, withModifiers as Ce, withDirectives as N, vModelText as z, createStaticVNode as Ii, reactive as lo, onBeforeUnmount as Xo, vModelSelect as st, onMounted as Wi, nextTick as Sa, isRef as so, vModelCheckbox as wd, withKeys as Ca } from "vue";
2
+ import { Save as Sd, CloudUpload as Cd, Download as kd, X as vn, Plus as Pn, ChevronDown as xd, ChevronRight as Id, Trash2 as Dn, RefreshCw as Yi, AlertTriangle as $d, CheckCircle2 as _d, CircleDot as $i, Bug as Pd, ImagePlus as _i, Filter as Dd, Search as Ra, ArrowLeft as Pi, FileJson as Xi, FileSpreadsheet as Ad, ArrowUp as Td, ArrowDown as Ed, Check as Zi, CircleAlert as qi, Clipboard as Qi, SunMedium as Nd, RotateCcw as Rd, PanelTop as er, BookOpen as Di, Cloud as Od, Database as Bd, Keyboard as jd } from "@lucide/vue";
3
+ import { g as vo, a as js, s as Ud } from "./index-CQZFzzRZ.js";
4
4
  const Lo = /* @__PURE__ */ tn({
5
5
  __name: "ScreenRenderer",
6
6
  props: {
@@ -19,7 +19,7 @@ const Lo = /* @__PURE__ */ tn({
19
19
  emits: ["change"],
20
20
  setup(t) {
21
21
  return (n, o) => (d(), v("div", Md, [
22
- (d(!0), v(D, null, T(t.items, (a) => (d(), v("button", {
22
+ (d(!0), v(D, null, E(t.items, (a) => (d(), v("button", {
23
23
  key: a.id,
24
24
  class: A(["flex flex-col items-center gap-1 rounded-full py-2 text-xs font-normal transition active:scale-95", t.active === a.id ? "bg-soft text-ocean" : "text-muted"]),
25
25
  onClick: (r) => n.$emit("change", a.id)
@@ -46,7 +46,7 @@ const Lo = /* @__PURE__ */ tn({
46
46
  const o = n;
47
47
  return (a, r) => (d(), v("aside", Fd, [
48
48
  e("p", null, c(t.title), 1),
49
- (d(!0), v(D, null, T(t.options, (p) => {
49
+ (d(!0), v(D, null, E(t.options, (p) => {
50
50
  var g, h;
51
51
  return d(), v("button", {
52
52
  key: p.id,
@@ -57,7 +57,7 @@ const Lo = /* @__PURE__ */ tn({
57
57
  (g = t.highlightedColors) != null && g[p.id] ? (d(), v("span", {
58
58
  key: 0,
59
59
  class: "prototype-state-highlight-bookmark",
60
- style: Te({ backgroundColor: t.highlightedColors[p.id] }),
60
+ style: Ee({ backgroundColor: t.highlightedColors[p.id] }),
61
61
  "aria-hidden": "true"
62
62
  }, null, 4)) : (d(), v("span", zd)),
63
63
  K(" " + c(p.label) + " ", 1),
@@ -89,7 +89,7 @@ const Lo = /* @__PURE__ */ tn({
89
89
  }, _p = {
90
90
  class: "screen-content",
91
91
  style: { height: "100%", overflow: "hidden", "padding-bottom": "20px" }
92
- }, Pp = ["onClick"], Dp = { class: "flex items-center justify-center gap-1 max-w-full" }, Ap = { class: "text-center text-[11px] text-ink leading-tight truncate" }, Ep = { class: "text-center text-[10px] text-muted" }, Tp = {
92
+ }, Pp = ["onClick"], Dp = { class: "flex items-center justify-center gap-1 max-w-full" }, Ap = { class: "text-center text-[11px] text-ink leading-tight truncate" }, Tp = { class: "text-center text-[10px] text-muted" }, Ep = {
93
93
  key: 1,
94
94
  class: "flex flex-col items-center justify-center w-full h-48 text-muted relative"
95
95
  }, Np = {
@@ -108,7 +108,7 @@ const Lo = /* @__PURE__ */ tn({
108
108
  }, Kp = { key: 1 }, Jp = { class: "grid grid-cols-2 gap-3" }, Wp = ["onDragstart"], Yp = { class: "desktop-frame-thumb" }, Xp = { class: "desktop-screen-content-thumb" }, Zp = { class: "flex items-center gap-1 px-0.5" }, qp = { class: "text-[10px] font-mono text-muted" }, Qp = { class: "text-[10px] text-ink leading-tight truncate" }, ev = {
109
109
  key: 0,
110
110
  class: "px-0.5 text-[10px] leading-tight text-ocean truncate"
111
- }, tv = 0.18, nv = 0.38, Ai = 393, ov = 852, jo = 640, Ei = 360, Ti = 1920, sv = /* @__PURE__ */ tn({
111
+ }, tv = 0.18, nv = 0.38, Ai = 393, ov = 852, jo = 640, Ti = 360, Ei = 1920, sv = /* @__PURE__ */ tn({
112
112
  __name: "FlowEditor",
113
113
  props: {
114
114
  flows: {},
@@ -127,18 +127,18 @@ const Lo = /* @__PURE__ */ tn({
127
127
  return ((I = h.value) == null ? void 0 : I.rows[g.value]) ?? [];
128
128
  }), P = y(0.28);
129
129
  function oe(I) {
130
- return I === "pc" ? P.value * jo / Ti : P.value;
130
+ return I === "pc" ? P.value * jo / Ei : P.value;
131
131
  }
132
132
  function xe(I) {
133
- const _ = I === "pc" ? jo : Ai, Y = I === "pc" ? Ei : ov;
133
+ const _ = I === "pc" ? jo : Ai, Y = I === "pc" ? Ti : ov;
134
134
  return {
135
135
  width: `${Math.ceil(_ * P.value) + 2}px`,
136
136
  height: `${Math.ceil(Y * P.value) + 2}px`
137
137
  };
138
138
  }
139
- const pe = k(() => Math.ceil(Ai * P.value) + 16), ue = k(() => Math.ceil(jo * P.value) + 16), ae = k(() => P.value * 0.55), B = k(() => ae.value * jo / Ti), ke = k(() => ({
139
+ const pe = k(() => Math.ceil(Ai * P.value) + 16), ue = k(() => Math.ceil(jo * P.value) + 16), ae = k(() => P.value * 0.55), B = k(() => ae.value * jo / Ei), ke = k(() => ({
140
140
  width: `${Math.ceil(jo * ae.value) + 2}px`,
141
- height: `${Math.ceil(Ei * ae.value) + 2}px`
141
+ height: `${Math.ceil(Ti * ae.value) + 2}px`
142
142
  })), ge = y(/* @__PURE__ */ new Set([0]));
143
143
  function Ae(I) {
144
144
  ge.value.has(I) ? ge.value.delete(I) : ge.value.add(I);
@@ -146,7 +146,7 @@ const Lo = /* @__PURE__ */ tn({
146
146
  function J(I, _) {
147
147
  p.value = I, g.value = _;
148
148
  }
149
- function Ee(I) {
149
+ function Te(I) {
150
150
  return o.screens.find((_) => _.id === I);
151
151
  }
152
152
  function Re() {
@@ -198,7 +198,7 @@ const Lo = /* @__PURE__ */ tn({
198
198
  ), Ve = k(() => H.value.filter((I) => I.screen.platform === "mobile")), Oe = k(() => H.value.filter((I) => I.screen.platform === "pc"));
199
199
  function ce(I) {
200
200
  var _;
201
- return ((_ = Ee(I.screenId)) == null ? void 0 : _.platform) ?? "mobile";
201
+ return ((_ = Te(I.screenId)) == null ? void 0 : _.platform) ?? "mobile";
202
202
  }
203
203
  function fe(I) {
204
204
  return {
@@ -209,7 +209,7 @@ const Lo = /* @__PURE__ */ tn({
209
209
  }
210
210
  function Ie(I) {
211
211
  var we;
212
- const _ = Ee(I.screenId) ?? o.screens[0], Y = I.stateId ? (we = o.stateOptionsByScreen(_.id).find((E) => E.id === I.stateId)) == null ? void 0 : we.label : void 0;
212
+ const _ = Te(I.screenId) ?? o.screens[0], Y = I.stateId ? (we = o.stateOptionsByScreen(_.id).find((T) => T.id === I.stateId)) == null ? void 0 : we.label : void 0;
213
213
  return {
214
214
  ..._,
215
215
  stateId: I.stateId,
@@ -236,8 +236,8 @@ const Lo = /* @__PURE__ */ tn({
236
236
  }
237
237
  function $(I, _) {
238
238
  I.preventDefault();
239
- const we = I.currentTarget.getBoundingClientRect(), E = we.left + we.width / 2;
240
- _e.value = I.clientX < E ? "before" : "after", Z.value = _;
239
+ const we = I.currentTarget.getBoundingClientRect(), T = we.left + we.width / 2;
240
+ _e.value = I.clientX < T ? "before" : "after", Z.value = _;
241
241
  }
242
242
  function C(I, _) {
243
243
  var Je;
@@ -246,20 +246,20 @@ const Lo = /* @__PURE__ */ tn({
246
246
  Z.value = -1, ze.value = null, G.value = -1, de.value = null;
247
247
  const we = (Je = I.dataTransfer) == null ? void 0 : Je.getData("text/plain");
248
248
  if (!we) return;
249
- let E;
249
+ let T;
250
250
  try {
251
- E = JSON.parse(we);
251
+ T = JSON.parse(we);
252
252
  } catch {
253
253
  return;
254
254
  }
255
255
  const q = Ge();
256
256
  if (!q) return;
257
257
  const Ke = Y === "before" ? _ : _ + 1;
258
- if (E.type === "palette" && E.screenId) {
259
- const We = { screenId: E.screenId, stateId: E.stateId };
258
+ if (T.type === "palette" && T.screenId) {
259
+ const We = { screenId: T.screenId, stateId: T.stateId };
260
260
  q.splice(Ke, 0, We);
261
- } else if (E.type === "sort" && typeof E.fromIndex == "number") {
262
- const We = E.fromIndex;
261
+ } else if (T.type === "sort" && typeof T.fromIndex == "number") {
262
+ const We = T.fromIndex;
263
263
  if (We === Ke) return;
264
264
  const [yo] = q.splice(We, 1), Ft = We < Ke ? Ke - 1 : Ke;
265
265
  q.splice(Ft, 0, yo);
@@ -277,9 +277,9 @@ const Lo = /* @__PURE__ */ tn({
277
277
  return;
278
278
  }
279
279
  if (Y.type === "palette" && Y.screenId) {
280
- const E = Ge();
281
- if (!E) return;
282
- E.push({ screenId: Y.screenId, stateId: Y.stateId });
280
+ const T = Ge();
281
+ if (!T) return;
282
+ T.push({ screenId: Y.screenId, stateId: Y.stateId });
283
283
  }
284
284
  }
285
285
  function He(I, _) {
@@ -322,7 +322,7 @@ const Lo = /* @__PURE__ */ tn({
322
322
  _[4] || (_[4] = e("h2", { class: "text-lg font-semibold text-ink" }, "流程编排", -1)),
323
323
  e("span", Zd, c((Y = h.value) == null ? void 0 : Y.title) + " · 子流程 " + c(g.value + 1) + " / " + c((we = h.value) == null ? void 0 : we.rows.length), 1)
324
324
  ]),
325
- V(Ta, { name: "toast" }, {
325
+ V(Ea, { name: "toast" }, {
326
326
  default: Na(() => [
327
327
  rt.value ? (d(), v("div", {
328
328
  key: 0,
@@ -376,8 +376,8 @@ const Lo = /* @__PURE__ */ tn({
376
376
  ])
377
377
  ]),
378
378
  e("div", sp, [
379
- (d(!0), v(D, null, T(r.value, (E, q) => (d(), v("div", {
380
- key: E.id,
379
+ (d(!0), v(D, null, E(r.value, (T, q) => (d(), v("div", {
380
+ key: T.id,
381
381
  class: A(["rounded-xl border border-line bg-soft overflow-hidden", { "ring-1 ring-ocean": p.value === q }])
382
382
  }, [
383
383
  e("div", {
@@ -386,7 +386,7 @@ const Lo = /* @__PURE__ */ tn({
386
386
  }, [
387
387
  (d(), Me(ro(ge.value.has(q) ? i(xd) : i(Id)), { class: "h-4 w-4 text-muted" })),
388
388
  e("input", {
389
- value: E.title,
389
+ value: T.title,
390
390
  class: "flex-1 min-w-0 bg-transparent text-sm font-semibold text-ink outline-none",
391
391
  onClick: _[0] || (_[0] = Ce(() => {
392
392
  }, ["stop"])),
@@ -401,7 +401,7 @@ const Lo = /* @__PURE__ */ tn({
401
401
  ], 8, ip)
402
402
  ], 8, ap),
403
403
  ge.value.has(q) ? (d(), v("div", rp, [
404
- (d(!0), v(D, null, T(E.rows, (Ke, Je) => (d(), v("div", {
404
+ (d(!0), v(D, null, E(T.rows, (Ke, Je) => (d(), v("div", {
405
405
  key: Je,
406
406
  class: A(["group/row flex items-center gap-2 py-2 text-xs cursor-pointer hover:bg-canvas transition", [
407
407
  p.value === q && g.value === Je ? "pl-[9px] pr-3 bg-ocean/5 border-l-[3px] border-ocean" : "px-3"
@@ -413,7 +413,7 @@ const Lo = /* @__PURE__ */ tn({
413
413
  }, null, 2),
414
414
  e("span", {
415
415
  class: A(["flex-1 min-w-0 truncate", p.value === q && g.value === Je ? "text-ink font-medium" : "text-muted"])
416
- }, c(M(E, Je)), 3),
416
+ }, c(M(T, Je)), 3),
417
417
  e("span", {
418
418
  class: A(["", p.value === q && g.value === Je ? "text-ocean" : "text-muted/60"])
419
419
  }, c(Ke.length) + " 页", 3),
@@ -444,14 +444,14 @@ const Lo = /* @__PURE__ */ tn({
444
444
  value: M(h.value, g.value),
445
445
  class: "rounded-lg border border-line bg-canvas px-3 py-1.5 text-sm text-ink outline-none focus:border-ocean",
446
446
  placeholder: "输入子流程名称...",
447
- onInput: _[1] || (_[1] = (E) => ye(g.value, E.target.value))
447
+ onInput: _[1] || (_[1] = (T) => ye(g.value, T.target.value))
448
448
  }, null, 40, mp)
449
449
  ]),
450
450
  e("div", gp, [
451
451
  e("div", hp, [
452
452
  _[9] || (_[9] = e("span", { class: "text-xs text-muted" }, "缩略图", -1)),
453
453
  N(e("input", {
454
- "onUpdate:modelValue": _[2] || (_[2] = (E) => P.value = E),
454
+ "onUpdate:modelValue": _[2] || (_[2] = (T) => P.value = T),
455
455
  type: "range",
456
456
  min: tv,
457
457
  max: nv,
@@ -485,15 +485,15 @@ const Lo = /* @__PURE__ */ tn({
485
485
  onDrop: se
486
486
  }, [
487
487
  e("div", bp, [
488
- b.value.length > 0 ? (d(!0), v(D, { key: 0 }, T(b.value, (E, q) => {
488
+ b.value.length > 0 ? (d(!0), v(D, { key: 0 }, E(b.value, (T, q) => {
489
489
  var Ke, Je;
490
490
  return d(), v("div", {
491
- key: `${E.screenId}-${q}`,
491
+ key: `${T.screenId}-${q}`,
492
492
  class: A(["group relative flex flex-col items-center gap-2", {
493
493
  "opacity-40 scale-[0.96]": G.value === q,
494
494
  "transition-all duration-150": !0
495
495
  }]),
496
- style: Te({ width: `${ce(E) === "pc" ? ue.value : pe.value}px` }),
496
+ style: Ee({ width: `${ce(T) === "pc" ? ue.value : pe.value}px` }),
497
497
  draggable: "true",
498
498
  onDragstart: (We) => te(We, q),
499
499
  onDragend: qe,
@@ -504,26 +504,26 @@ const Lo = /* @__PURE__ */ tn({
504
504
  q === b.value.length - 1 && Rt.value === b.value.length ? (d(), v("div", Cp)) : S("", !0),
505
505
  e("div", kp, [
506
506
  e("div", {
507
- class: A(["thumb-frame", { "pc-thumb-frame": ce(E) === "pc" }]),
508
- style: Te(xe(ce(E)))
507
+ class: A(["thumb-frame", { "pc-thumb-frame": ce(T) === "pc" }]),
508
+ style: Ee(xe(ce(T)))
509
509
  }, [
510
510
  e("div", {
511
511
  class: "thumb-scale",
512
- style: Te({ transform: `scale(${oe(ce(E))})` })
512
+ style: Ee({ transform: `scale(${oe(ce(T))})` })
513
513
  }, [
514
- ce(E) === "pc" ? (d(), v("div", xp, [
514
+ ce(T) === "pc" ? (d(), v("div", xp, [
515
515
  e("div", Ip, [
516
- E.screenId ? (d(), Me(Lo, {
516
+ T.screenId ? (d(), Me(Lo, {
517
517
  key: 0,
518
- screen: Ie(E)
518
+ screen: Ie(T)
519
519
  }, null, 8, ["screen"])) : S("", !0)
520
520
  ])
521
521
  ])) : (d(), v("div", $p, [
522
522
  _[11] || (_[11] = Ii('<div class="status-bar" data-v-f5226710><span data-v-f5226710>9:41</span><span class="flex items-center gap-1" data-v-f5226710><svg class="h-3 w-3" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-f5226710><path d="M12 2a4 4 0 0 0-4 4c0 2.5 3 5.5 4 9 1-3.5 4-6.5 4-9a4 4 0 0 0-4-4Z" data-v-f5226710></path><circle cx="12" cy="6" r="1.5" data-v-f5226710></circle></svg> 86% </span></div>', 1)),
523
523
  e("div", _p, [
524
- E.screenId ? (d(), Me(Lo, {
524
+ T.screenId ? (d(), Me(Lo, {
525
525
  key: 0,
526
- screen: Ie(E)
526
+ screen: Ie(T)
527
527
  }, null, 8, ["screen"])) : S("", !0)
528
528
  ])
529
529
  ]))
@@ -538,18 +538,18 @@ const Lo = /* @__PURE__ */ tn({
538
538
  ]),
539
539
  e("div", Dp, [
540
540
  e("span", {
541
- class: A(["platform-badge is-small", ce(E) === "pc" ? "is-pc" : "is-mobile"])
542
- }, c(ce(E) === "pc" ? "P" : "M"), 3),
543
- e("span", Ap, c(((Ke = Ee(E.screenId)) == null ? void 0 : Ke.title) ?? E.screenId), 1)
541
+ class: A(["platform-badge is-small", ce(T) === "pc" ? "is-pc" : "is-mobile"])
542
+ }, c(ce(T) === "pc" ? "P" : "M"), 3),
543
+ e("span", Ap, c(((Ke = Te(T.screenId)) == null ? void 0 : Ke.title) ?? T.screenId), 1)
544
544
  ]),
545
- e("span", Ep, [
546
- K(c(((Je = Ee(E.screenId)) == null ? void 0 : Je.code) ?? ""), 1),
547
- E.stateId ? (d(), v(D, { key: 0 }, [
548
- K(" · " + c(Ie(E).stateLabel), 1)
545
+ e("span", Tp, [
546
+ K(c(((Je = Te(T.screenId)) == null ? void 0 : Je.code) ?? ""), 1),
547
+ T.stateId ? (d(), v(D, { key: 0 }, [
548
+ K(" · " + c(Ie(T).stateLabel), 1)
549
549
  ], 64)) : S("", !0)
550
550
  ])
551
551
  ], 46, wp);
552
- }), 128)) : (d(), v("div", Tp, [
552
+ }), 128)) : (d(), v("div", Ep, [
553
553
  ze.value ? (d(), v("div", Np)) : S("", !0),
554
554
  e("div", Rp, [
555
555
  V(i(Pn), { class: "h-6 w-6" })
@@ -568,28 +568,28 @@ const Lo = /* @__PURE__ */ tn({
568
568
  Ve.value.length ? (d(), v("div", jp, [
569
569
  _[15] || (_[15] = e("p", { class: "mb-2 text-xs font-semibold text-muted" }, "移动端", -1)),
570
570
  e("div", Up, [
571
- (d(!0), v(D, null, T(Ve.value, (E) => (d(), v("div", {
572
- key: E.key,
571
+ (d(!0), v(D, null, E(Ve.value, (T) => (d(), v("div", {
572
+ key: T.key,
573
573
  class: A(["group flex flex-col gap-1 p-2 rounded-xl border border-line bg-soft hover:border-ocean hover:shadow-sm transition cursor-grab active:cursor-grabbing", {
574
- "opacity-40 ring-2 ring-ocean/40": de.value === E.key
574
+ "opacity-40 ring-2 ring-ocean/40": de.value === T.key
575
575
  }]),
576
576
  draggable: "true",
577
- onDragstart: (q) => be(q, E),
577
+ onDragstart: (q) => be(q, T),
578
578
  onDragend: qe
579
579
  }, [
580
580
  e("div", {
581
581
  class: "thumb-frame",
582
- style: Te(xe("mobile"))
582
+ style: Ee(xe("mobile"))
583
583
  }, [
584
584
  e("div", {
585
585
  class: "thumb-scale",
586
- style: Te({ transform: `scale(${P.value})` })
586
+ style: Ee({ transform: `scale(${P.value})` })
587
587
  }, [
588
588
  e("div", Vp, [
589
589
  _[13] || (_[13] = Ii('<div class="status-bar" data-v-f5226710><span data-v-f5226710>9:41</span><span class="flex items-center gap-1" data-v-f5226710><svg class="h-3 w-3" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-f5226710><path d="M12 2a4 4 0 0 0-4 4c0 2.5 3 5.5 4 9 1-3.5 4-6.5 4-9a4 4 0 0 0-4-4Z" data-v-f5226710></path><circle cx="12" cy="6" r="1.5" data-v-f5226710></circle></svg> 86% </span></div>', 1)),
590
590
  e("div", Lp, [
591
591
  V(Lo, {
592
- screen: fe(E)
592
+ screen: fe(T)
593
593
  }, null, 8, ["screen"])
594
594
  ])
595
595
  ])
@@ -597,37 +597,37 @@ const Lo = /* @__PURE__ */ tn({
597
597
  ], 4),
598
598
  e("div", Fp, [
599
599
  _[14] || (_[14] = e("span", { class: "platform-badge is-small is-mobile" }, "M", -1)),
600
- e("span", Gp, c(E.screen.code), 1),
601
- e("span", zp, c(E.screen.title), 1)
600
+ e("span", Gp, c(T.screen.code), 1),
601
+ e("span", zp, c(T.screen.title), 1)
602
602
  ]),
603
- E.stateLabel ? (d(), v("span", Hp, c(E.stateLabel), 1)) : S("", !0)
603
+ T.stateLabel ? (d(), v("span", Hp, c(T.stateLabel), 1)) : S("", !0)
604
604
  ], 42, Mp))), 128))
605
605
  ])
606
606
  ])) : S("", !0),
607
607
  Oe.value.length ? (d(), v("div", Kp, [
608
608
  _[17] || (_[17] = e("p", { class: "mb-2 text-xs font-semibold text-muted" }, "PC 端", -1)),
609
609
  e("div", Jp, [
610
- (d(!0), v(D, null, T(Oe.value, (E) => (d(), v("div", {
611
- key: E.key,
610
+ (d(!0), v(D, null, E(Oe.value, (T) => (d(), v("div", {
611
+ key: T.key,
612
612
  class: A(["group flex flex-col gap-1 p-2 rounded-xl border border-line bg-soft hover:border-ocean hover:shadow-sm transition cursor-grab active:cursor-grabbing", {
613
- "opacity-40 ring-2 ring-ocean/40": de.value === E.key
613
+ "opacity-40 ring-2 ring-ocean/40": de.value === T.key
614
614
  }]),
615
615
  draggable: "true",
616
- onDragstart: (q) => be(q, E),
616
+ onDragstart: (q) => be(q, T),
617
617
  onDragend: qe
618
618
  }, [
619
619
  e("div", {
620
620
  class: "thumb-frame pc-thumb-frame",
621
- style: Te(ke.value)
621
+ style: Ee(ke.value)
622
622
  }, [
623
623
  e("div", {
624
624
  class: "thumb-scale",
625
- style: Te({ transform: `scale(${B.value})` })
625
+ style: Ee({ transform: `scale(${B.value})` })
626
626
  }, [
627
627
  e("div", Yp, [
628
628
  e("div", Xp, [
629
629
  V(Lo, {
630
- screen: fe(E)
630
+ screen: fe(T)
631
631
  }, null, 8, ["screen"])
632
632
  ])
633
633
  ])
@@ -635,10 +635,10 @@ const Lo = /* @__PURE__ */ tn({
635
635
  ], 4),
636
636
  e("div", Zp, [
637
637
  _[16] || (_[16] = e("span", { class: "platform-badge is-small is-pc" }, "P", -1)),
638
- e("span", qp, c(E.screen.code), 1),
639
- e("span", Qp, c(E.screen.title), 1)
638
+ e("span", qp, c(T.screen.code), 1),
639
+ e("span", Qp, c(T.screen.title), 1)
640
640
  ]),
641
- E.stateLabel ? (d(), v("span", ev, c(E.stateLabel), 1)) : S("", !0)
641
+ T.stateLabel ? (d(), v("span", ev, c(T.stateLabel), 1)) : S("", !0)
642
642
  ], 42, Wp))), 128))
643
643
  ])
644
644
  ])) : S("", !0)
@@ -884,7 +884,7 @@ async function gv(t, n, o) {
884
884
  return await mv(ur(), r, a != null && a.legacy ? null : (a == null ? void 0 : a.sha) ?? null, fv(t, n)), pr();
885
885
  });
886
886
  }
887
- const vr = ["功能异常", "UI/文案", "流程阻塞", "数据/报告", "设备/蓝牙", "性能/稳定性", "兼容性", "其他"], fr = ["P0", "P1", "P2", "P3", "P4"], mr = ["安卓侧", "iOS 侧", "后端"], gr = ["后端开发", "iOS 开发", "安卓开发", "产品经理", "算法开发", "硬件嵌入式开发"], hr = ["待处理", "已确认", "修复中", "已修复", "已验证", "无需处理"], yr = ["待处理", "已确认", "修复中"], Et = y([]), Ka = y(ir), br = y(ir ? "loading" : "idle"), Ja = y("");
887
+ const vr = ["功能异常", "UI/文案", "流程阻塞", "数据/报告", "设备/蓝牙", "性能/稳定性", "兼容性", "其他"], fr = ["P0", "P1", "P2", "P3", "P4"], mr = ["安卓侧", "iOS 侧", "后端"], gr = ["后端开发", "iOS 开发", "安卓开发", "产品经理", "算法开发", "硬件嵌入式开发"], hr = ["待处理", "已确认", "修复中", "已修复", "已验证", "无需处理"], yr = ["待处理", "已确认", "修复中"], Tt = y([]), Ka = y(ir), br = y(ir ? "loading" : "idle"), Ja = y("");
888
888
  let Bi = !1;
889
889
  function hv(t) {
890
890
  return typeof t == "string" && vr.includes(t);
@@ -955,13 +955,13 @@ async function wr() {
955
955
  try {
956
956
  Yt("loading", "正在同步 Gitee Bug 数据");
957
957
  const n = await pr();
958
- Et.value = io((n == null ? void 0 : n.value) ?? []), Zt("bugs", Et.value, (n == null ? void 0 : n.sha) ?? null, (/* @__PURE__ */ new Date()).toISOString(), "synced"), Yt("success", "已同步 Gitee Bug 数据");
958
+ Tt.value = io((n == null ? void 0 : n.value) ?? []), Zt("bugs", Tt.value, (n == null ? void 0 : n.sha) ?? null, (/* @__PURE__ */ new Date()).toISOString(), "synced"), Yt("success", "已同步 Gitee Bug 数据");
959
959
  return;
960
960
  } catch (n) {
961
961
  const o = Xt("bugs");
962
962
  o && Zt("bugs", o.value, o.revision, o.lastRemoteSyncAt, "stale", n instanceof Error ? n.message : "Gitee Bug 数据同步失败"), Yt("error", n instanceof Error ? n.message : "Gitee Bug 数据同步失败,已切换本地兜底");
963
963
  }
964
- Et.value = io(((t = Xt("bugs")) == null ? void 0 : t.value) ?? []), Ja.value || Yt("idle", "当前使用本地 Bug 数据");
964
+ Tt.value = io(((t = Xt("bugs")) == null ? void 0 : t.value) ?? []), Ja.value || Yt("idle", "当前使用本地 Bug 数据");
965
965
  }
966
966
  async function xv() {
967
967
  if (!Bi) {
@@ -969,25 +969,25 @@ async function xv() {
969
969
  try {
970
970
  await wr();
971
971
  } catch {
972
- Et.value = [], Yt("error", "Bug 数据初始化失败");
972
+ Tt.value = [], Yt("error", "Bug 数据初始化失败");
973
973
  }
974
974
  }
975
975
  }
976
976
  async function Iv(t, n, o) {
977
977
  const a = () => {
978
- Et.value = io(o(Et.value)), kv(Et.value);
978
+ Tt.value = io(o(Tt.value)), kv(Tt.value);
979
979
  };
980
980
  if (Ka.value)
981
981
  try {
982
982
  Yt("loading", "正在提交 Gitee Bug 数据");
983
983
  const r = await gv(t, n, (p) => io(o(io(p))));
984
- return Et.value = io((r == null ? void 0 : r.value) ?? []), Zt("bugs", Et.value, (r == null ? void 0 : r.sha) ?? null, (/* @__PURE__ */ new Date()).toISOString(), "synced"), Yt("success", "Bug 数据已提交"), !0;
984
+ return Tt.value = io((r == null ? void 0 : r.value) ?? []), Zt("bugs", Tt.value, (r == null ? void 0 : r.sha) ?? null, (/* @__PURE__ */ new Date()).toISOString(), "synced"), Yt("success", "Bug 数据已提交"), !0;
985
985
  } catch (r) {
986
986
  return Yt("error", r instanceof Error ? r.message : "Bug 数据提交失败"), !1;
987
987
  }
988
988
  return a(), Yt("success", "Bug 数据已保存到本地"), !0;
989
989
  }
990
- const $v = k(() => Et.value.filter((t) => yr.includes(t.status)).length);
990
+ const $v = k(() => Tt.value.filter((t) => yr.includes(t.status)).length);
991
991
  function _v(t) {
992
992
  const n = t.reduce((o, a) => {
993
993
  const r = /^BUG-(\d+)$/i.exec(a.id.trim());
@@ -997,7 +997,7 @@ function _v(t) {
997
997
  }
998
998
  function Sr() {
999
999
  return {
1000
- bugs: Et,
1000
+ bugs: Tt,
1001
1001
  bugTypes: vr,
1002
1002
  bugSeverities: fr,
1003
1003
  bugSourceSides: mr,
@@ -1030,7 +1030,7 @@ async function Av(t, n) {
1030
1030
  const o = new TextEncoder(), a = await crypto.subtle.importKey("raw", o.encode(n), { name: "HMAC", hash: "SHA-1" }, !1, ["sign"]), r = await crypto.subtle.sign("HMAC", a, o.encode(t));
1031
1031
  return Dv(r);
1032
1032
  }
1033
- function Ev(t, n) {
1033
+ function Tv(t, n) {
1034
1034
  const o = new Date(Date.now() + 6e5).toISOString();
1035
1035
  return btoa(
1036
1036
  JSON.stringify({
@@ -1043,7 +1043,7 @@ function Ev(t, n) {
1043
1043
  })
1044
1044
  );
1045
1045
  }
1046
- function Tv() {
1046
+ function Ev() {
1047
1047
  return !!Wa();
1048
1048
  }
1049
1049
  function Nv(t) {
@@ -1056,7 +1056,7 @@ function xa(t) {
1056
1056
  async function Rv(t, n) {
1057
1057
  const o = Wa();
1058
1058
  if (!o) throw new Error("缺少 OSS 上传配置");
1059
- const a = Ev(t, n.size), r = await Av(a, o.accessKeySecret), p = new FormData();
1059
+ const a = Tv(t, n.size), r = await Av(a, o.accessKeySecret), p = new FormData();
1060
1060
  p.set("key", t), p.set("policy", a), p.set("OSSAccessKeyId", o.accessKeyId), p.set("signature", r), p.set("success_action_status", "201"), p.set("Content-Type", n.type || "application/octet-stream"), p.set("file", n);
1061
1061
  const g = await fetch(o.baseUrl, {
1062
1062
  method: "POST",
@@ -1083,10 +1083,10 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1083
1083
  }, xf = ["disabled"], If = ["disabled"], $f = { class: "bug-list" }, _f = {
1084
1084
  key: 0,
1085
1085
  class: "bug-empty"
1086
- }, Pf = { class: "bug-list-main" }, Df = { class: "bug-list-meta" }, Af = { key: 0 }, Ef = {
1086
+ }, Pf = { class: "bug-list-main" }, Df = { class: "bug-list-meta" }, Af = { key: 0 }, Tf = {
1087
1087
  key: 0,
1088
1088
  class: "bug-list-images"
1089
- }, Tf = ["onClick"], Nf = ["src", "alt"], Rf = { key: 0 }, Of = ["onClick"], Bf = {
1089
+ }, Ef = ["onClick"], Nf = ["src", "alt"], Rf = { key: 0 }, Of = ["onClick"], Bf = {
1090
1090
  key: 1,
1091
1091
  class: "bug-pagination"
1092
1092
  }, jf = ["disabled"], Uf = ["disabled"], Mf = { class: "bug-detail-panel" }, Vf = { class: "bug-detail-head" }, Lf = { class: "bug-detail-summary" }, Ff = { key: 0 }, Gf = { class: "bug-detail-actions" }, zf = { key: 1 }, Hf = {
@@ -1155,7 +1155,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1155
1155
  P2: 2,
1156
1156
  P3: 3,
1157
1157
  P4: 4
1158
- }, Ee = [
1158
+ }, Te = [
1159
1159
  { value: "createdDesc", label: "创建时间 新→旧" },
1160
1160
  { value: "createdAsc", label: "创建时间 旧→新" },
1161
1161
  { value: "updatedDesc", label: "更新时间 新→旧" },
@@ -1209,7 +1209,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1209
1209
  sourceSideVersion: "",
1210
1210
  ownerRole: "后端开发",
1211
1211
  description: ""
1212
- }), de = y([]), Rt = y(null), be = y([]), te = y(""), qe = y(null), $ = Tv(), C = k(() => a.value.find((x) => x.id === ye.value) ?? null), se = k(() => !!(C.value && !["已验证", "无需处理"].includes(C.value.status))), He = k(() => a.value.filter((x) => x.status === "已修复" || x.status === "已验证").length), rt = k(() => a.value.filter((x) => x.status === "无需处理").length), ut = k(
1212
+ }), de = y([]), Rt = y(null), be = y([]), te = y(""), qe = y(null), $ = Ev(), C = k(() => a.value.find((x) => x.id === ye.value) ?? null), se = k(() => !!(C.value && !["已验证", "无需处理"].includes(C.value.status))), He = k(() => a.value.filter((x) => x.status === "已修复" || x.status === "已验证").length), rt = k(() => a.value.filter((x) => x.status === "无需处理").length), ut = k(
1213
1213
  () => Array.from(new Set(a.value.map((x) => {
1214
1214
  var f;
1215
1215
  return (f = x.sourceSideVersion) == null ? void 0 : f.trim();
@@ -1244,7 +1244,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1244
1244
  const W = (/* @__PURE__ */ new Date()).toISOString().replace(/\D/g, "").slice(0, 14);
1245
1245
  return `bugs/${x}/${W}-${_(f.name)}.${Y(f)}`;
1246
1246
  }
1247
- async function E(x) {
1247
+ async function T(x) {
1248
1248
  if (!["image/png", "image/jpeg", "image/jpg", "image/webp"].includes(x.type)) throw new Error("仅支持 png、jpg、jpeg、webp 图片");
1249
1249
  return {
1250
1250
  id: `pending-image-${Date.now()}-${Math.random().toString(16).slice(2)}`,
@@ -1268,7 +1268,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1268
1268
  }
1269
1269
  for (const Q of f.slice(0, m))
1270
1270
  try {
1271
- be.value = [...be.value, await E(Q)];
1271
+ be.value = [...be.value, await T(Q)];
1272
1272
  } catch (Qe) {
1273
1273
  te.value = Qe instanceof Error ? Qe.message : "图片处理失败";
1274
1274
  }
@@ -1519,7 +1519,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1519
1519
  onPaste: Je
1520
1520
  }, [
1521
1521
  e("datalist", zv, [
1522
- (d(!0), v(D, null, T(ut.value, (m) => (d(), v("option", {
1522
+ (d(!0), v(D, null, E(ut.value, (m) => (d(), v("option", {
1523
1523
  key: m,
1524
1524
  value: m
1525
1525
  }, null, 8, Hv))), 128))
@@ -1554,7 +1554,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1554
1554
  N(e("select", {
1555
1555
  "onUpdate:modelValue": f[4] || (f[4] = (m) => L.type = m)
1556
1556
  }, [
1557
- (d(!0), v(D, null, T(i(r), (m) => (d(), v("option", {
1557
+ (d(!0), v(D, null, E(i(r), (m) => (d(), v("option", {
1558
1558
  key: m,
1559
1559
  value: m
1560
1560
  }, c(m), 9, Wv))), 128))
@@ -1567,7 +1567,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1567
1567
  N(e("select", {
1568
1568
  "onUpdate:modelValue": f[5] || (f[5] = (m) => L.severity = m)
1569
1569
  }, [
1570
- (d(!0), v(D, null, T(i(p), (m) => (d(), v("option", {
1570
+ (d(!0), v(D, null, E(i(p), (m) => (d(), v("option", {
1571
1571
  key: m,
1572
1572
  value: m
1573
1573
  }, c(m), 9, Yv))), 128))
@@ -1580,7 +1580,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1580
1580
  N(e("select", {
1581
1581
  "onUpdate:modelValue": f[6] || (f[6] = (m) => L.sourceSide = m)
1582
1582
  }, [
1583
- (d(!0), v(D, null, T(i(g), (m) => (d(), v("option", {
1583
+ (d(!0), v(D, null, E(i(g), (m) => (d(), v("option", {
1584
1584
  key: m,
1585
1585
  value: m
1586
1586
  }, c(m), 9, Xv))), 128))
@@ -1604,7 +1604,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1604
1604
  N(e("select", {
1605
1605
  "onUpdate:modelValue": f[8] || (f[8] = (m) => L.ownerRole = m)
1606
1606
  }, [
1607
- (d(!0), v(D, null, T(i(h), (m) => (d(), v("option", {
1607
+ (d(!0), v(D, null, E(i(h), (m) => (d(), v("option", {
1608
1608
  key: m,
1609
1609
  value: m
1610
1610
  }, c(m), 9, Zv))), 128))
@@ -1647,7 +1647,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1647
1647
  }, null, 544),
1648
1648
  f[55] || (f[55] = e("p", { class: "bug-image-hint" }, "支持 png、jpg、webp;最多 10 张;图片将按原文件直接上传 OSS。", -1)),
1649
1649
  be.value.length ? (d(), v("div", tf, [
1650
- (d(!0), v(D, null, T(be.value, (m) => (d(), v("article", {
1650
+ (d(!0), v(D, null, E(be.value, (m) => (d(), v("article", {
1651
1651
  key: m.id,
1652
1652
  class: A(`is-${m.status}`)
1653
1653
  }, [
@@ -1695,7 +1695,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1695
1695
  }, [
1696
1696
  f[57] || (f[57] = e("option", { value: "未修复" }, "未修复", -1)),
1697
1697
  f[58] || (f[58] = e("option", { value: "全部" }, "全部状态", -1)),
1698
- (d(!0), v(D, null, T(i(b), (m) => (d(), v("option", {
1698
+ (d(!0), v(D, null, E(i(b), (m) => (d(), v("option", {
1699
1699
  key: m,
1700
1700
  value: m
1701
1701
  }, c(m), 9, vf))), 128))
@@ -1706,7 +1706,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1706
1706
  "onUpdate:modelValue": f[12] || (f[12] = (m) => H.type = m)
1707
1707
  }, [
1708
1708
  f[59] || (f[59] = e("option", { value: "全部" }, "全部类型", -1)),
1709
- (d(!0), v(D, null, T(i(r), (m) => (d(), v("option", {
1709
+ (d(!0), v(D, null, E(i(r), (m) => (d(), v("option", {
1710
1710
  key: m,
1711
1711
  value: m
1712
1712
  }, c(m), 9, ff))), 128))
@@ -1717,7 +1717,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1717
1717
  "onUpdate:modelValue": f[13] || (f[13] = (m) => H.severity = m)
1718
1718
  }, [
1719
1719
  f[60] || (f[60] = e("option", { value: "全部" }, "全部等级", -1)),
1720
- (d(!0), v(D, null, T(i(p), (m) => (d(), v("option", {
1720
+ (d(!0), v(D, null, E(i(p), (m) => (d(), v("option", {
1721
1721
  key: m,
1722
1722
  value: m
1723
1723
  }, c(m), 9, mf))), 128))
@@ -1728,7 +1728,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1728
1728
  "onUpdate:modelValue": f[14] || (f[14] = (m) => H.ownerRole = m)
1729
1729
  }, [
1730
1730
  f[61] || (f[61] = e("option", { value: "全部" }, "全部归属", -1)),
1731
- (d(!0), v(D, null, T(i(h), (m) => (d(), v("option", {
1731
+ (d(!0), v(D, null, E(i(h), (m) => (d(), v("option", {
1732
1732
  key: m,
1733
1733
  value: m
1734
1734
  }, c(m), 9, gf))), 128))
@@ -1739,7 +1739,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1739
1739
  "onUpdate:modelValue": f[15] || (f[15] = (m) => H.sourceSide = m)
1740
1740
  }, [
1741
1741
  f[62] || (f[62] = e("option", { value: "全部" }, "全部发生侧", -1)),
1742
- (d(!0), v(D, null, T(i(g), (m) => (d(), v("option", {
1742
+ (d(!0), v(D, null, E(i(g), (m) => (d(), v("option", {
1743
1743
  key: m,
1744
1744
  value: m
1745
1745
  }, c(m), 9, hf))), 128))
@@ -1750,7 +1750,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1750
1750
  "onUpdate:modelValue": f[16] || (f[16] = (m) => H.sourceSideVersion = m)
1751
1751
  }, [
1752
1752
  f[63] || (f[63] = e("option", { value: "全部" }, "全部发生侧版本", -1)),
1753
- (d(!0), v(D, null, T(ut.value, (m) => (d(), v("option", {
1753
+ (d(!0), v(D, null, E(ut.value, (m) => (d(), v("option", {
1754
1754
  key: m,
1755
1755
  value: m
1756
1756
  }, c(m), 9, yf))), 128))
@@ -1774,7 +1774,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1774
1774
  N(e("select", {
1775
1775
  "onUpdate:modelValue": f[18] || (f[18] = (m) => Ve.value = m)
1776
1776
  }, [
1777
- (d(), v(D, null, T(Ee, (m) => e("option", {
1777
+ (d(), v(D, null, E(Te, (m) => e("option", {
1778
1778
  key: m.value,
1779
1779
  value: m.value
1780
1780
  }, c(m.label), 9, Sf)), 64))
@@ -1787,7 +1787,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1787
1787
  N(e("select", {
1788
1788
  "onUpdate:modelValue": f[19] || (f[19] = (m) => Oe.value = m)
1789
1789
  }, [
1790
- (d(), v(D, null, T(Re, (m) => e("option", {
1790
+ (d(), v(D, null, E(Re, (m) => e("option", {
1791
1791
  key: m,
1792
1792
  value: m
1793
1793
  }, c(m) + " 条", 9, Cf)), 64))
@@ -1820,7 +1820,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1820
1820
  ])) : S("", !0),
1821
1821
  e("div", $f, [
1822
1822
  vt.value.length ? S("", !0) : (d(), v("p", _f, "当前筛选条件下暂无 Bug。")),
1823
- (d(!0), v(D, null, T($e.value, (m) => {
1823
+ (d(!0), v(D, null, E($e.value, (m) => {
1824
1824
  var Q;
1825
1825
  return d(), v("article", {
1826
1826
  key: m.id,
@@ -1842,8 +1842,8 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1842
1842
  ]),
1843
1843
  e("h2", null, c(m.title), 1),
1844
1844
  e("p", null, c(m.description), 1),
1845
- (Q = m.attachments) != null && Q.length ? (d(), v("div", Ef, [
1846
- (d(!0), v(D, null, T(m.attachments.slice(0, 3), (Qe) => (d(), v("button", {
1845
+ (Q = m.attachments) != null && Q.length ? (d(), v("div", Tf, [
1846
+ (d(!0), v(D, null, E(m.attachments.slice(0, 3), (Qe) => (d(), v("button", {
1847
1847
  key: Qe.id,
1848
1848
  type: "button",
1849
1849
  onClick: (bn) => qe.value = Qe
@@ -1853,7 +1853,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1853
1853
  alt: Qe.name,
1854
1854
  loading: "lazy"
1855
1855
  }, null, 8, Nf)
1856
- ], 8, Tf))), 128)),
1856
+ ], 8, Ef))), 128)),
1857
1857
  m.attachments.length > 3 ? (d(), v("span", Rf, "+" + c(m.attachments.length - 3), 1)) : S("", !0)
1858
1858
  ])) : S("", !0),
1859
1859
  e("small", null, [
@@ -1991,7 +1991,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
1991
1991
  N(e("select", {
1992
1992
  "onUpdate:modelValue": f[26] || (f[26] = (m) => G.type = m)
1993
1993
  }, [
1994
- (d(!0), v(D, null, T(i(r), (m) => (d(), v("option", {
1994
+ (d(!0), v(D, null, E(i(r), (m) => (d(), v("option", {
1995
1995
  key: m,
1996
1996
  value: m
1997
1997
  }, c(m), 9, Wf))), 128))
@@ -2004,7 +2004,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2004
2004
  N(e("select", {
2005
2005
  "onUpdate:modelValue": f[27] || (f[27] = (m) => G.severity = m)
2006
2006
  }, [
2007
- (d(!0), v(D, null, T(i(p), (m) => (d(), v("option", {
2007
+ (d(!0), v(D, null, E(i(p), (m) => (d(), v("option", {
2008
2008
  key: m,
2009
2009
  value: m
2010
2010
  }, c(m), 9, Yf))), 128))
@@ -2017,7 +2017,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2017
2017
  N(e("select", {
2018
2018
  "onUpdate:modelValue": f[28] || (f[28] = (m) => G.sourceSide = m)
2019
2019
  }, [
2020
- (d(!0), v(D, null, T(i(g), (m) => (d(), v("option", {
2020
+ (d(!0), v(D, null, E(i(g), (m) => (d(), v("option", {
2021
2021
  key: m,
2022
2022
  value: m
2023
2023
  }, c(m), 9, Xf))), 128))
@@ -2041,7 +2041,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2041
2041
  N(e("select", {
2042
2042
  "onUpdate:modelValue": f[30] || (f[30] = (m) => G.ownerRole = m)
2043
2043
  }, [
2044
- (d(!0), v(D, null, T(i(h), (m) => (d(), v("option", {
2044
+ (d(!0), v(D, null, E(i(h), (m) => (d(), v("option", {
2045
2045
  key: m,
2046
2046
  value: m
2047
2047
  }, c(m), 9, Zf))), 128))
@@ -2073,7 +2073,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2073
2073
  })
2074
2074
  }, " 添加图片 / 粘贴截图 ", 8, em),
2075
2075
  de.value.length ? (d(), v("div", tm, [
2076
- (d(!0), v(D, null, T(de.value, (m) => (d(), v("article", {
2076
+ (d(!0), v(D, null, E(de.value, (m) => (d(), v("article", {
2077
2077
  key: m.id
2078
2078
  }, [
2079
2079
  e("button", {
@@ -2101,7 +2101,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2101
2101
  ]))), 128))
2102
2102
  ])) : S("", !0),
2103
2103
  be.value.length ? (d(), v("div", am, [
2104
- (d(!0), v(D, null, T(be.value, (m) => (d(), v("article", {
2104
+ (d(!0), v(D, null, E(be.value, (m) => (d(), v("article", {
2105
2105
  key: m.id,
2106
2106
  class: A(`is-${m.status}`)
2107
2107
  }, [
@@ -2141,7 +2141,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2141
2141
  !_e.value && ((W = C.value.attachments) != null && W.length) ? (d(), v("section", mm, [
2142
2142
  f[77] || (f[77] = e("h3", null, "问题截图", -1)),
2143
2143
  e("div", null, [
2144
- (d(!0), v(D, null, T(C.value.attachments, (m) => (d(), v("button", {
2144
+ (d(!0), v(D, null, E(C.value.attachments, (m) => (d(), v("button", {
2145
2145
  key: m.id,
2146
2146
  type: "button",
2147
2147
  onClick: (Q) => qe.value = m
@@ -2168,7 +2168,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2168
2168
  N(e("select", {
2169
2169
  "onUpdate:modelValue": f[33] || (f[33] = (m) => fe.status = m)
2170
2170
  }, [
2171
- (d(!0), v(D, null, T(i(b), (m) => (d(), v("option", {
2171
+ (d(!0), v(D, null, E(i(b), (m) => (d(), v("option", {
2172
2172
  key: m,
2173
2173
  value: m
2174
2174
  }, c(m), 9, bm))), 128))
@@ -2217,7 +2217,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2217
2217
  e("section", xm, [
2218
2218
  f[83] || (f[83] = e("h3", null, "处理记录", -1)),
2219
2219
  C.value.history.length ? S("", !0) : (d(), v("p", Im, "暂无状态变更记录。")),
2220
- (d(!0), v(D, null, T(C.value.history, (m) => (d(), v("article", {
2220
+ (d(!0), v(D, null, E(C.value.history, (m) => (d(), v("article", {
2221
2221
  key: m.id
2222
2222
  }, [
2223
2223
  e("b", null, c(m.fromStatus) + " → " + c(m.toStatus), 1),
@@ -2253,7 +2253,7 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2253
2253
  ]);
2254
2254
  };
2255
2255
  }
2256
- }), Em = {
2256
+ }), Tm = {
2257
2257
  prototypeStateSwitch: "切换业务状态",
2258
2258
  annotationExpand: "展开注释面板",
2259
2259
  annotationCollapse: "收起注释面板",
@@ -2332,12 +2332,12 @@ const Ov = { class: "bug-page" }, Bv = { class: "bug-page-head" }, jv = ["disabl
2332
2332
  testCaseUnknown: "未知页面或状态"
2333
2333
  };
2334
2334
  function ve(t) {
2335
- const n = Em[t];
2335
+ const n = Tm[t];
2336
2336
  if (typeof n != "string" || n.length === 0)
2337
2337
  throw new Error(`🈶 [内核文案] 缺少中文文案:${t}`);
2338
2338
  return n;
2339
2339
  }
2340
- function Tm(t, n, o, a = o) {
2340
+ function Em(t, n, o, a = o) {
2341
2341
  return t[n][o] ?? t.zh[o] ?? a;
2342
2342
  }
2343
2343
  function tt(t, n) {
@@ -2627,10 +2627,10 @@ async function Km(t, n, o) {
2627
2627
  function Ar() {
2628
2628
  return Vt("pageDescriptions");
2629
2629
  }
2630
- function Er(t) {
2630
+ function Tr(t) {
2631
2631
  return Vt("pageDescriptions", t);
2632
2632
  }
2633
- function Tr(t, n, o) {
2633
+ function Er(t, n, o) {
2634
2634
  return Dr("pageDescriptions", o, t, n, "保存");
2635
2635
  }
2636
2636
  function Nr(t, n, o) {
@@ -2657,9 +2657,9 @@ function Ym() {
2657
2657
  function Xm(t, n) {
2658
2658
  return Dr("flows", { version: "1.0.0", flows: n }, "", t, "保存");
2659
2659
  }
2660
- const Qt = y([]), Bt = y(null), po = y(""), zo = y(!1), Or = y(!1), Tn = y({ source: "local-seed", status: "idle" }), dn = js(), Nt = Ze();
2660
+ const Qt = y([]), Bt = y(null), po = y(""), zo = y(!1), Or = y(!1), En = y({ source: "local-seed", status: "idle" }), dn = js(), Nt = Ze();
2661
2661
  function gt(t, n, o = "", a) {
2662
- Tn.value = { source: t, status: n, ...o ? { message: o } : {}, ...a ? { syncedAt: a } : {} };
2662
+ En.value = { source: t, status: n, ...o ? { message: o } : {}, ...a ? { syncedAt: a } : {} };
2663
2663
  }
2664
2664
  async function Zm() {
2665
2665
  try {
@@ -2717,10 +2717,10 @@ async function Za(t = !1) {
2717
2717
  var o;
2718
2718
  if (!zo.value || !Nt.remoteReadable || !po.value) return;
2719
2719
  if (Ms(t, Or.value)) {
2720
- gt(Tn.value.source, "idle", "检测到未保存编辑,已暂缓轮询覆盖");
2720
+ gt(En.value.source, "idle", "检测到未保存编辑,已暂缓轮询覆盖");
2721
2721
  return;
2722
2722
  }
2723
- gt(Tn.value.source, "syncing");
2723
+ gt(En.value.source, "syncing");
2724
2724
  const n = po.value;
2725
2725
  try {
2726
2726
  const [a, r] = await Promise.all([Rr(), Xa(n)]);
@@ -2743,7 +2743,7 @@ async function Za(t = !1) {
2743
2743
  nt("testCases", n, b, r.sha, P, "synced"), Ho(n, b), Ba(n, b.length), gt("gitee", "success", "", P);
2744
2744
  } catch (a) {
2745
2745
  const r = it("testCases").scopes[n];
2746
- r && nt("testCases", n, r.value, r.revision, r.lastRemoteSyncAt, r.status === "pending" ? "pending" : "stale", a instanceof Error ? a.message : "测试用例同步失败"), gt(r ? "local-cache" : Tn.value.source, "error", a instanceof Error ? a.message : "测试用例同步失败");
2746
+ r && nt("testCases", n, r.value, r.revision, r.lastRemoteSyncAt, r.status === "pending" ? "pending" : "stale", a instanceof Error ? a.message : "测试用例同步失败"), gt(r ? "local-cache" : En.value.source, "error", a instanceof Error ? a.message : "测试用例同步失败");
2747
2747
  }
2748
2748
  }
2749
2749
  async function tg(t, n) {
@@ -2755,7 +2755,7 @@ async function tg(t, n) {
2755
2755
  const g = it("testCases").scopes[o];
2756
2756
  return nt("testCases", o, p, (g == null ? void 0 : g.revision) ?? null, (g == null ? void 0 : g.lastRemoteSyncAt) ?? null, "pending"), Ba(o, p.length), gt("local-cache", "success", `${Nt.unavailableReason || "Gitee 当前不可写"},修改尚未同步`), !0;
2757
2757
  }
2758
- gt(Tn.value.source, "syncing");
2758
+ gt(En.value.source, "syncing");
2759
2759
  try {
2760
2760
  const p = await Jm(o, a, t, (P) => Ui(co(P), t, n));
2761
2761
  if (!p) throw new Error("测试用例写入后未能回读");
@@ -2766,7 +2766,7 @@ async function tg(t, n) {
2766
2766
  return Bt.value = b.value, gt("gitee", "success", "", h), !0;
2767
2767
  } catch (p) {
2768
2768
  const g = p instanceof Error ? p.message : "测试用例保存失败";
2769
- return gt(Tn.value.source, p instanceof mo ? "conflict" : "error", g), !1;
2769
+ return gt(En.value.source, p instanceof mo ? "conflict" : "error", g), !1;
2770
2770
  }
2771
2771
  }
2772
2772
  async function ng() {
@@ -2798,7 +2798,7 @@ function jr() {
2798
2798
  testCaseManifest: Bt,
2799
2799
  selectedScopeId: po,
2800
2800
  initialized: zo,
2801
- sourceState: Tn,
2801
+ sourceState: En,
2802
2802
  selectedScopeCases: k(() => Qt.value.filter((t) => tt(t.screenId, t.stateId) === po.value)),
2803
2803
  scopes: Br,
2804
2804
  initializeTestCases: Qm,
@@ -2817,10 +2817,10 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
2817
2817
  }, Ig = { class: "test-case-table-wrap" }, $g = { class: "test-case-table" }, _g = ["onClick"], Pg = { key: 0 }, Dg = ["aria-label", "onClick"], Ag = {
2818
2818
  key: 0,
2819
2819
  class: "test-case-empty"
2820
- }, Eg = {
2820
+ }, Tg = {
2821
2821
  key: 0,
2822
2822
  class: "test-case-editor"
2823
- }, Tg = ["aria-label"], Ng = { class: "test-case-editor-body" }, Rg = ["value"], Og = ["onUpdate:modelValue"], Bg = ["aria-label", "disabled", "onClick"], jg = ["aria-label", "disabled", "onClick"], Ug = ["aria-label", "disabled", "onClick"], Mg = ["disabled"], Vg = /* @__PURE__ */ tn({
2823
+ }, Eg = ["aria-label"], Ng = { class: "test-case-editor-body" }, Rg = ["value"], Og = ["onUpdate:modelValue"], Bg = ["aria-label", "disabled", "onClick"], jg = ["aria-label", "disabled", "onClick"], Ug = ["aria-label", "disabled", "onClick"], Mg = ["disabled"], Vg = /* @__PURE__ */ tn({
2824
2824
  __name: "TestCaseWorkbench",
2825
2825
  props: {
2826
2826
  lang: {},
@@ -2876,7 +2876,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
2876
2876
  moveDown: ve("testCaseMoveDown"),
2877
2877
  removeStep: ve("testCaseRemoveStep"),
2878
2878
  unknown: ve("testCaseUnknown")
2879
- }, ke = y(""), ge = y(""), Ae = y("current"), J = y("cases"), Ee = y(!1), Re = y(""), F = lo(Ia()), Fe = y(""), he = y(""), L = y(!1), M = k(() => b(o.lang)), ye = k(() => M.value.find(($) => $.id === g.value) ?? M.value[0]), H = k(() => {
2879
+ }, ke = y(""), ge = y(""), Ae = y("current"), J = y("cases"), Te = y(!1), Re = y(""), F = lo(Ia()), Fe = y(""), he = y(""), L = y(!1), M = k(() => b(o.lang)), ye = k(() => M.value.find(($) => $.id === g.value) ?? M.value[0]), H = k(() => {
2880
2880
  const $ = ke.value.trim().toLowerCase();
2881
2881
  return $ ? M.value.filter((C) => `${C.screenCode} ${C.screenTitle} ${C.stateLabel}`.toLowerCase().includes($)) : M.value;
2882
2882
  }), Ve = k(() => {
@@ -2888,7 +2888,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
2888
2888
  }), Oe = k(() => {
2889
2889
  const $ = Ae.value === "all" ? r.value : r.value.filter((se) => tt(se.screenId, se.stateId) === g.value), C = ge.value.trim().toLowerCase();
2890
2890
  return C ? $.filter((se) => [se.module, se.testItem, se.testPoint, se.preconditions, se.steps.join(" "), se.expectedResult, se.actualResult].join(" ").toLowerCase().includes(C)) : $;
2891
- }), ce = k(() => Ee.value && JSON.stringify(F) !== Fe.value), fe = k(() => {
2891
+ }), ce = k(() => Te.value && JSON.stringify(F) !== Fe.value), fe = k(() => {
2892
2892
  const $ = h.value.source === "gitee" ? "Gitee" : h.value.source === "local-cache" ? "本地缓存" : "JSON 种子", C = h.value.status === "syncing" ? "同步中" : h.value.status === "conflict" ? "冲突" : h.value.status === "error" ? "失败" : h.value.source === "local-cache" ? "待同步" : "已就绪";
2893
2893
  return `${$} · ${C}`;
2894
2894
  });
@@ -2903,7 +2903,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
2903
2903
  }
2904
2904
  function ze() {
2905
2905
  var $;
2906
- Re.value = "", Ie(Ia((($ = ye.value) == null ? void 0 : $.screenTitle) ?? "")), Ee.value = !0;
2906
+ Re.value = "", Ie(Ia((($ = ye.value) == null ? void 0 : $.screenTitle) ?? "")), Te.value = !0;
2907
2907
  }
2908
2908
  function Z($) {
2909
2909
  Re.value = $.id, Ie({
@@ -2914,10 +2914,10 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
2914
2914
  steps: [...$.steps],
2915
2915
  expectedResult: $.expectedResult,
2916
2916
  actualResult: $.actualResult
2917
- }), Ee.value = !0;
2917
+ }), Te.value = !0;
2918
2918
  }
2919
2919
  function _e($ = !0) {
2920
- $ && !Le() || (Ee.value = !1, Re.value = "", Ie(Ia()));
2920
+ $ && !Le() || (Te.value = !1, Re.value = "", Ie(Ia()));
2921
2921
  }
2922
2922
  function G($, C) {
2923
2923
  const se = $ + C;
@@ -3031,7 +3031,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3031
3031
  ])
3032
3032
  ]),
3033
3033
  e("div", {
3034
- class: A(["test-case-grid", [{ "has-editor": Ee.value }, `mobile-${J.value}`]])
3034
+ class: A(["test-case-grid", [{ "has-editor": Te.value }, `mobile-${J.value}`]])
3035
3035
  }, [
3036
3036
  e("aside", cg, [
3037
3037
  e("label", dg, [
@@ -3045,14 +3045,14 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3045
3045
  ])
3046
3046
  ]),
3047
3047
  e("div", vg, [
3048
- (d(!0), v(D, null, T(Ve.value, (R) => (d(), v("section", {
3048
+ (d(!0), v(D, null, E(Ve.value, (R) => (d(), v("section", {
3049
3049
  key: R.screenId
3050
3050
  }, [
3051
3051
  e("div", fg, [
3052
3052
  e("b", null, c(R.code), 1),
3053
3053
  e("span", null, c(R.title), 1)
3054
3054
  ]),
3055
- (d(!0), v(D, null, T(R.scopes, (ne) => {
3055
+ (d(!0), v(D, null, E(R.scopes, (ne) => {
3056
3056
  var $e, It, ft;
3057
3057
  return d(), v("button", {
3058
3058
  key: ne.id,
@@ -3137,7 +3137,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3137
3137
  ])
3138
3138
  ]),
3139
3139
  e("tbody", null, [
3140
- (d(!0), v(D, null, T(Oe.value, (R) => {
3140
+ (d(!0), v(D, null, E(Oe.value, (R) => {
3141
3141
  var ne;
3142
3142
  return d(), v("tr", {
3143
3143
  key: R.id,
@@ -3152,7 +3152,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3152
3152
  e("td", null, c(R.preconditions), 1),
3153
3153
  e("td", null, [
3154
3154
  e("ol", null, [
3155
- (d(!0), v(D, null, T(R.steps, ($e, It) => (d(), v("li", { key: It }, c($e), 1))), 128))
3155
+ (d(!0), v(D, null, E(R.steps, ($e, It) => (d(), v("li", { key: It }, c($e), 1))), 128))
3156
3156
  ])
3157
3157
  ]),
3158
3158
  e("td", null, c(R.expectedResult), 1),
@@ -3176,7 +3176,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3176
3176
  ]))
3177
3177
  ])
3178
3178
  ]),
3179
- Ee.value ? (d(), v("aside", Eg, [
3179
+ Te.value ? (d(), v("aside", Tg, [
3180
3180
  e("header", null, [
3181
3181
  e("div", null, [
3182
3182
  e("small", null, c((ut = ye.value) == null ? void 0 : ut.screenCode) + " · " + c((vt = ye.value) == null ? void 0 : vt.stateLabel), 1),
@@ -3188,7 +3188,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3188
3188
  onClick: C[8] || (C[8] = (R) => _e())
3189
3189
  }, [
3190
3190
  V(i(vn))
3191
- ], 8, Tg)
3191
+ ], 8, Eg)
3192
3192
  ]),
3193
3193
  e("div", Ng, [
3194
3194
  e("label", null, [
@@ -3237,7 +3237,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3237
3237
  ]),
3238
3238
  e("fieldset", null, [
3239
3239
  e("legend", null, c(B.steps) + " *", 1),
3240
- (d(!0), v(D, null, T(F.steps, (R, ne) => (d(), v("div", {
3240
+ (d(!0), v(D, null, E(F.steps, (R, ne) => (d(), v("div", {
3241
3241
  key: ne,
3242
3242
  class: "test-case-step"
3243
3243
  }, [
@@ -3255,7 +3255,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3255
3255
  disabled: ne === 0,
3256
3256
  onClick: ($e) => G(ne, -1)
3257
3257
  }, [
3258
- V(i(Ed))
3258
+ V(i(Td))
3259
3259
  ], 8, Bg),
3260
3260
  e("button", {
3261
3261
  type: "button",
@@ -3263,7 +3263,7 @@ const og = { class: "test-case-workbench" }, sg = { class: "test-case-toolbar" }
3263
3263
  disabled: ne === F.steps.length - 1,
3264
3264
  onClick: ($e) => G(ne, 1)
3265
3265
  }, [
3266
- V(i(Td))
3266
+ V(i(Ed))
3267
3267
  ], 8, jg),
3268
3268
  e("button", {
3269
3269
  type: "button",
@@ -3637,13 +3637,27 @@ export const product: PrototypeProductDefinition = {
3637
3637
 
3638
3638
  用户确认后再实施;纯文案、颜色或已确定样式的局部修正可直接修改。
3639
3639
 
3640
+ #### 6.2.1 手机画布与消费者容器边界
3641
+
3642
+ 内核负责手机外框、状态栏、滚动容器和 TabBar 预留空间,消费者负责手机画布内的业务页面。实现移动端页面前必须先检查当前安装版本的内核样式,确认 \`.screen-content\` 已提供的横向、顶部和底部留白;不得在业务页面根节点机械重复同等 padding。当前默认手机预览内容区已有 \`20px\` 横向留白,实际值仍以消费者安装版本为准。
3643
+
3644
+ - 页面背景需要覆盖完整业务画布时,把背景设置在页面根节点,并确保根节点至少覆盖可用高度;不要只给内部内容块着色,形成四周或底部断层。
3645
+ - 需要全幅背景、全幅标题或贴边分区时,只在一个共享页面根类中统一抵消内核留白,并在交互、全图、流程和演示模式中验证;不要让每个页面分别硬编码负边距。
3646
+ - 需要保留画布留白时,卡片、标题和表单只增加业务层间距;先检查父级,再决定是否增加子级 padding,禁止层层叠加导致组件宽度被挤压。
3647
+ - 背景颜色不同的相邻区域必须选择一种清晰关系:全幅分区使用 \`--ds-rounded-none\` 并铺满边界;内嵌卡片与画布保持明确间距,并使用统一的 \`--ds-rounded-*\` 圆角。不得让异色矩形直接贴住手机边框,也不得只处理上圆角或下圆角。
3648
+ - 同一产品中重复出现的普通标题、返回标题、状态摘要等结构应封装为消费者公共组件;标题、返回热区、边距、圆角和深浅色变体从同一处维护。
3649
+ - TabBar 由内核渲染时不得在业务页面重复实现。必须按实际 Tab 数量检查等宽分栏、选中态和点击热区;项目 Tab 数量与内核当前布局不匹配时,应明确记录为内核兼容问题,不通过压缩业务内容掩盖。
3650
+ - 颜色、圆角、间距和阴影优先使用 \`--ds-*\` token。触控目标不小于 \`44 × 44px\`,并在 \`393 × 852\` 基准画布及至少 \`375px\` 宽度检查溢出、滚动、固定底栏和键盘遮挡。
3651
+
3640
3652
  ### 6.3 编写业务组件
3641
3653
 
3642
3654
  - 页面只实现业务内容,不复制手机外框、顶部模式栏、协作面板等内核 UI。
3643
3655
  - 页内弹窗、输入、展开、加载等使用普通 Vue 状态。
3644
3656
  - 跨页面、Tab 和评审状态切换使用内核上下文。
3645
- - 页面组件会收到 \`screen\` 属性;需要元数据时显式声明 prop
3657
+ - 页面组件会收到响应式 \`screen: DisplayScreen\` 属性;状态页面必须显式声明该 prop,并以 \`screen.stateId\` 渲染当前页面实例。
3646
3658
  - 保持消费者现有组件库、尺寸体系和样式约定,不顺手重构其他页面。
3659
+ - 定时器、\`requestAnimationFrame\`、音频、Canvas 绘制任务和设备监听必须在重新开始前先清理,并在 \`onBeforeUnmount\` 中释放;不得假设状态切换后组件实例仍然存在。
3660
+ - 状态评审数据与真实业务数据分离。状态按钮用于展示空、失败、加载等评审结果时,不得写入真实缓存、最近记录、导入草稿或正式报告;真实业务动作只在明确的确认点写入。
3647
3661
 
3648
3662
  ### 6.4 注册页面
3649
3663
 
@@ -3663,17 +3677,72 @@ export const product: PrototypeProductDefinition = {
3663
3677
  - \`states[screenId]\` 中的状态 ID。
3664
3678
  - \`copy.zh\` 与 \`copy.en\` 对应 \`labelKey\`。
3665
3679
  - \`copy.zh/en\` 只维护消费者业务文案;注释、页面描述、协作状态、数据源和测试工具等内核文案固定为中文,不得复制到消费者配置中。
3666
- - 页面组件根据 \`activePrototypeStateId\` 呈现该状态。
3680
+ - 页面组件根据传入实例的 \`screen.stateId\` 呈现该状态;不得把 \`activePrototypeStateId\` 作为页面内容的首要展示来源。
3667
3681
  - 流程需要时引用同一 \`stateId\`。
3668
3682
  - 状态级页面描述使用相同 scope。
3669
3683
 
3684
+ #### 6.5.1 \`screen.stateId\` 与 \`activePrototypeStateId\`
3685
+
3686
+ 两者用途不同:
3687
+
3688
+ | 值 | 含义 | 正确用途 |
3689
+ | --- | --- | --- |
3690
+ | \`screen.stateId\` | 当前这一张 \`DisplayScreen\` 页面实例要展示的状态 | 消费者页面模板、计算属性、状态数据选择和状态级 UI |
3691
+ | \`activePrototypeStateId\` | 当前交互页面在内核中的活动状态 | 没有 \`screen\` prop 的外围控制、当前协作 scope 或主动状态控制 |
3692
+
3693
+ 交互模式通常只渲染当前页面,因此两个值看起来可能相同;全图模式会同时为同一页面生成多张不同 \`stateId\` 的卡片,流程模式也会按节点传入各自状态。此时如果业务组件读取全局 \`activePrototypeStateId\`,多张卡片会错误地显示成同一个状态。
3694
+
3695
+ 状态页面使用以下模式:
3696
+
3697
+ \`\`\`vue
3698
+ <script setup lang="ts">
3699
+ import { computed } from 'vue'
3700
+ import { usePrototypeContext } from '@marktowin/prototype-core'
3701
+ import type { DisplayScreen } from '@marktowin/prototype-core'
3702
+
3703
+ const props = defineProps<{ screen: DisplayScreen }>()
3704
+ const { setPrototypeState } = usePrototypeContext()
3705
+
3706
+ const stateId = computed(() => props.screen.stateId ?? 'ready')
3707
+ const isEmpty = computed(() => stateId.value === 'empty')
3708
+
3709
+ function showEmptyState() {
3710
+ setPrototypeState(props.screen.id, 'empty')
3711
+ }
3712
+ <\/script>
3713
+
3714
+ <template>
3715
+ <p v-if="isEmpty">暂无数据</p>
3716
+ <p v-else>正常内容</p>
3717
+ <button type="button" @click="showEmptyState">显示空状态</button>
3718
+ </template>
3719
+ \`\`\`
3720
+
3721
+ 禁止以下实现:
3722
+
3723
+ - 只在 \`setup\` 初始化时执行 \`ref(props.screen.stateId === 'empty')\`,后续状态切换不会自动同步。
3724
+ - 仅在 \`mode === 'overview'\` 时读取 \`screen.stateId\`,导致交互模式的状态按钮只改变标签、不改变页面内容。
3725
+ - 页面内容优先读取 Store,只有 Store 为空时才读取状态 ID,导致“空状态”仍显示真实数据。
3726
+ - 为了展示评审状态而修改真实业务 Store、\`localStorage\` 或 \`sessionStorage\`。
3727
+
3728
+ 当状态需要演示数据时,为各状态提供只读预览数据;非运行态的评审展示由当前页面实例的 \`screen.stateId\` 决定。真实业务流程可以通过显式的 \`runtimeDriven\`(或同义状态)暂时展示 Store 中的实时结果,但手动切换评审状态时必须退出运行态并恢复为 \`screen.stateId\` 驱动,不能让 Store 静默覆盖状态选择器。编辑、删除和确认操作必须明确区分“预览数据”与“真实草稿”。
3729
+
3730
+ #### 6.5.2 状态切换与长任务生命周期
3731
+
3732
+ 内核当前使用包含 \`screen.id\` 和 \`screen.stateId\` 的 key 渲染页面实例。调用 \`setPrototypeState\` 后,消费者页面可能被卸载并重新创建;组件内的计时器、采样进度、Canvas 动画和局部 ref 不会自动延续。
3733
+
3734
+ - 纯展示状态可以直接调用 \`setPrototypeState\`。
3735
+ - 采集、上传、轮询、倒计时等运行中阶段,如果任务依赖组件本地计时器,不要在每个中间阶段调用 \`setPrototypeState\`;先用页内 Vue 状态推进,任务结束并清理资源后再同步终态或跳转。
3736
+ - 如果评审面板必须实时反映“进行中”状态,应把任务、时间基准和可恢复进度移到组件外的 Store 或独立 composable;组件重建后从外部状态恢复,而不是依赖旧实例继续运行。
3737
+ - 页面离开、手动切换评审状态或重新测试时,必须停止旧任务。Canvas 不可用或绘制失败时,文字状态和业务判定仍应保留。
3738
+
3670
3739
  ### 6.6 实现跳转
3671
3740
 
3672
3741
  \`\`\`vue
3673
3742
  <script setup lang="ts">
3674
3743
  import { usePrototypeContext } from '@marktowin/prototype-core'
3675
3744
 
3676
- const { activePrototypeStateId, go, goTab, setPrototypeState } = usePrototypeContext()
3745
+ const { go, goTab, setPrototypeState } = usePrototypeContext()
3677
3746
 
3678
3747
  // go('detail'):跳转到已注册页面
3679
3748
  // goTab('home'):按 Tab 语义切换到已注册页面
@@ -3685,6 +3754,7 @@ const { activePrototypeStateId, go, goTab, setPrototypeState } = usePrototypeCon
3685
3754
  - \`go\` 与 \`goTab\` 只接收已注册 ID。
3686
3755
  - 当前不是 Vue Router,不假设 URL、历史栈、参数、守卫或文件路由。
3687
3756
  - 流程节点不会自动生成点击逻辑;页面事件与流程数据必须分别实现并保持一致。
3757
+ - \`go/goTab\` 修改当前页面,但不应被当作“自动退出全图/流程模式”的承诺。业务按钮以交互模式为主要运行环境;如果产品明确要求从其他模式触发业务跳转,应先显式切回 \`interactive\`,并回归状态面板、页面导航和业务按钮的点击层级。
3688
3758
 
3689
3759
  ### 6.7 补入流程
3690
3760
 
@@ -3720,15 +3790,18 @@ const { activePrototypeStateId, go, goTab, setPrototypeState } = usePrototypeCon
3720
3790
  - 页面/状态描述已补全。
3721
3791
  - 交互、全图、流程模式均可展示。
3722
3792
  - 移动端/PC 尺寸、滚动、遮挡和交互已回归。
3793
+ - 每个状态切换后,手机内容、状态文案、按钮可用性和演示数据同步变化,而不只是状态按钮的选中样式变化。
3794
+ - 页面根背景铺满预期画布,未出现重复内边距、异色直角贴边、局部背景断层或 TabBar 非等宽布局。
3795
+ - 长任务可从开始推进到终态;状态切换、重新开始和页面离开后没有残留计时器、绘制任务或设备监听。
3723
3796
  - 相关协作资源已按任务要求完成本地与远端验证。
3724
3797
 
3725
3798
  ## 7. 核心操作规范
3726
3799
 
3727
3800
  ### 7.1 新增或修改状态
3728
3801
 
3729
- 标准动作:确认状态语义 → 注册 ID → 补双语标签 → 实现页面展示 → 更新跳转/流程 → 补状态描述 → 回归连续切换。
3802
+ 标准动作:确认状态语义 → 注册 ID → 补双语标签 → 使用 \`screen.stateId\` 实现响应式展示 隔离预览与真实数据 → 更新跳转/流程 → 补状态描述 → 回归连续切换和组件重建。
3730
3803
 
3731
- 禁止:只在组件中写字符串状态、只改 UI 不注册、复用含义不同的旧状态 ID
3804
+ 禁止:只在组件中写字符串状态、只改 UI 不注册、复用含义不同的旧状态 ID、只改变状态按钮选中态而不改变页面内容、用评审状态覆盖真实业务缓存。
3732
3805
 
3733
3806
  ### 7.2 删除页面或状态
3734
3807
 
@@ -3998,11 +4071,13 @@ const runtimeConfig: PrototypeRuntimeConfig = {
3998
4071
 
3999
4072
  ### 11.3 运行时回归
4000
4073
 
4001
- - 交互模式:点击、输入、弹窗、跳转、Tab、状态切换。
4002
- - 全图模式:所有页面和状态可见,缩放与布局正常。
4003
- - 流程模式:节点、顺序、分支与页面实现一致。
4074
+ - 交互模式:点击、输入、弹窗、跳转、Tab、状态切换;逐个状态确认页面内容确实变化,不能只看状态按钮是否选中。
4075
+ - 全图模式:所有页面和状态可见,每张卡片按自身 \`screen.stateId\` 独立渲染,缩放与布局正常。
4076
+ - 流程模式:节点、顺序、分支与页面实现一致;同一页面的不同流程状态不得显示成同一内容。
4004
4077
  - 批注模式:任意位置可落点,交互组件不会抢占标注点击。
4005
4078
  - 演示模式:移动端保持基准比例整体缩放。
4079
+ - 动态任务:采集、上传、轮询、倒计时和 Canvas 动画能完整到达终态;重新开始、切换状态和离开页面后旧任务停止。
4080
+ - 移动端视觉:在基准画布和窄屏检查根背景、有效内容宽度、滚动、键盘、固定底栏、圆角过渡和触控热区;展开的内核面板不得遮挡状态按钮或页面导航。
4006
4081
  - 协作工具:注释、页面描述、测试用例和流程的读、写、冲突、失败降级和轮询行为符合预期。
4007
4082
 
4008
4083
  ### 11.4 远端精确验证
@@ -4041,7 +4116,10 @@ Git 状态:未提交 / 已提交 / 已推送
4041
4116
  - [ ] 页面清单、状态清单和流程清单来自真实需求。
4042
4117
  - [ ] 每个页面有唯一 ID、正确端型和组件注册。
4043
4118
  - [ ] 页面状态、双语文案、流程节点和跳转调用完全一致。
4119
+ - [ ] 状态页面以响应式 \`screen.stateId\` 渲染;全图和流程中的同页多状态可以同时显示不同内容。
4044
4120
  - [ ] 页面 UI 方案已确认,页内与跨页交互均实现。
4121
+ - [ ] 页面根背景、有效内容宽度、内边距、圆角和 TabBar 分栏已在基准画布及窄屏验证。
4122
+ - [ ] 状态预览不污染真实缓存;长任务在组件重建、重新开始和页面离开后可以正确继续或清理。
4045
4123
  - [ ] 页面/状态描述与真实实现一致。
4046
4124
  - [ ] 测试用例按页面/状态 scope 维护,远端真值和整体导出范围已核对。
4047
4125
  - [ ] 本地种子、缓存和 Gitee 真值的状态已区分报告。
@@ -4058,7 +4136,7 @@ Git 状态:未提交 / 已提交 / 已推送
4058
4136
  __name: "PrototypeCoreHelpPage",
4059
4137
  emits: ["close"],
4060
4138
  setup(t) {
4061
- const n = y("idle"), o = "1.2.11";
4139
+ const n = y("idle"), o = "1.2.12";
4062
4140
  let a;
4063
4141
  function r() {
4064
4142
  const g = document.createElement("textarea");
@@ -4130,7 +4208,7 @@ Git 状态:未提交 / 已提交 / 已推送
4130
4208
  __name: "PrototypeCoreThemeGuidePage",
4131
4209
  emits: ["close"],
4132
4210
  setup(t) {
4133
- const n = y("idle"), o = "1.2.11";
4211
+ const n = y("idle"), o = "1.2.12";
4134
4212
  let a;
4135
4213
  function r() {
4136
4214
  const g = document.createElement("textarea");
@@ -4405,7 +4483,7 @@ const ch = Wt({
4405
4483
  Object.entries(Vr).forEach(([t, n]) => {
4406
4484
  n.length && (Qa[t] = n[0].id);
4407
4485
  });
4408
- const vh = y("annotations"), nn = y($r), pn = y("idle"), fn = y($r ? "云端协作已启用" : "本地兜底模式"), xt = y(""), uo = y(qr), Es = y(String(qr)), Ts = y(""), fh = y(!1), mh = y(!0), Ls = y(!1), Fs = y(""), Zo = y(null), el = y(""), qo = y("view"), An = y({ featureName: "", featureDescription: "", specialNote: "", color: Ot.ocean }), ie = y([]), mn = y(null), Xe = y([]), ht = y(null), jn = y("local-seed"), nu = y(!1), Ut = y({
4486
+ const vh = y("annotations"), nn = y($r), pn = y("idle"), fn = y($r ? "云端协作已启用" : "本地兜底模式"), xt = y(""), uo = y(qr), Ts = y(String(qr)), Es = y(""), fh = y(!1), mh = y(!0), Ls = y(!1), Fs = y(""), Zo = y(null), el = y(""), qo = y("view"), An = y({ featureName: "", featureDescription: "", specialNote: "", color: Ot.ocean }), ie = y([]), mn = y(null), Xe = y([]), ht = y(null), jn = y("local-seed"), nu = y(!1), Ut = y({
4409
4487
  gitee: {},
4410
4488
  "local-cache": {},
4411
4489
  "local-seed": {}
@@ -4426,7 +4504,7 @@ const vh = y("annotations"), nn = y($r), pn = y("idle"), fn = y($r ? "云端协
4426
4504
  pageDescriptions: { source: "local-seed", status: "idle" },
4427
4505
  testCases: { source: "local-seed", status: "idle" },
4428
4506
  flows: { source: "local-seed", status: "idle" }
4429
- }), cn = y("idle"), at = y({ current: 0, total: 0, label: "" }), En = y(""), gh = y(!1), su = k(() => nn.value && Pe.remoteWritable), hh = y(1), yh = y(3), Wo = y(null), Bn = Mr;
4507
+ }), cn = y("idle"), at = y({ current: 0, total: 0, label: "" }), Tn = y(""), gh = y(!1), su = k(() => nn.value && Pe.remoteWritable), hh = y(1), yh = y(3), Wo = y(null), Bn = Mr;
4430
4508
  function jt() {
4431
4509
  return typeof window > "u" ? null : window.localStorage;
4432
4510
  }
@@ -4453,7 +4531,7 @@ const bh = k(() => {
4453
4531
  return t[t.length - 1] ?? "";
4454
4532
  }), Sh = k(() => {
4455
4533
  if (cn.value === "running") return `正在初始化 Gitee · ${at.value.current} / ${at.value.total}`;
4456
- if (En.value) return En.value;
4534
+ if (Tn.value) return Tn.value;
4457
4535
  if (!Pe.remoteWritable) return Pe.unavailableReason;
4458
4536
  if (iu.value === "conflict") return "远端已更新,请处理本地草稿";
4459
4537
  const t = Object.values(Ne.value).find((n) => n.status === "error");
@@ -4469,7 +4547,7 @@ function nl(t, n, o, a, r) {
4469
4547
  var g, h, b;
4470
4548
  if (!o || !n) return;
4471
4549
  const p = t === "flows" ? (g = Xt("flows")) == null ? void 0 : g.revision : t === "annotations" ? (h = it("annotations").scopes[r ?? ""]) == null ? void 0 : h.revision : (b = it("pageDescriptions").scopes[r ?? ""]) == null ? void 0 : b.revision;
4472
- p && p !== n && (Ts.value = `检测到远端${a}更新,已同步到当前页面`);
4550
+ p && p !== n && (Es.value = `检测到远端${a}更新,已同步到当前页面`);
4473
4551
  }
4474
4552
  function ol(t, n) {
4475
4553
  re(t, Ne.value[t].source, "conflict", n), pn.value = "error", fn.value = n;
@@ -4478,7 +4556,7 @@ function kh(t, n) {
4478
4556
  Jo.value = { ...Jo.value, [t]: n };
4479
4557
  }
4480
4558
  function ru(t, n = t) {
4481
- return Tm(rh, tu.value, t, n);
4559
+ return Em(rh, tu.value, t, n);
4482
4560
  }
4483
4561
  function Yo(t) {
4484
4562
  return /^#[0-9a-fA-F]{6}$/.test(t);
@@ -4555,10 +4633,10 @@ function Dh(t, n) {
4555
4633
  function Ah(t, n) {
4556
4634
  n.trim() && (De.value = { ...De.value, radius: { ...De.value.radius, [t]: n.trim() } }, St.value = "custom");
4557
4635
  }
4558
- function Eh() {
4636
+ function Th() {
4559
4637
  De.value = Wt(), St.value = "default";
4560
4638
  }
4561
- function Th(t) {
4639
+ function Eh(t) {
4562
4640
  var n;
4563
4641
  return ((n = Yr[t.nameKey]) == null ? void 0 : n.name) ?? t.nameKey;
4564
4642
  }
@@ -4672,7 +4750,7 @@ const Fa = k(() => ie.value.filter((t) => j(t.screenId, t.stateId) === en())), i
4672
4750
  function Ga(t) {
4673
4751
  return Object.fromEntries(t.map((n) => [j(n.screenId, n.stateId), n]));
4674
4752
  }
4675
- function Tt(t, n, o) {
4753
+ function Et(t, n, o) {
4676
4754
  const a = { ...Ut.value[t] };
4677
4755
  o ? a[n] = o : delete a[n], Ut.value = { ...Ut.value, [t]: a };
4678
4756
  }
@@ -4789,7 +4867,7 @@ async function Yh() {
4789
4867
  const t = (Re = jt()) == null ? void 0 : Re.getItem(Xr);
4790
4868
  t && (xt.value = t);
4791
4869
  const n = (F = jt()) == null ? void 0 : F.getItem(Zr), o = n == null ? Number.NaN : Number(n);
4792
- Number.isFinite(o) && (uo.value = Math.min(eu, Math.max(Qr, o)), Es.value = String(uo.value));
4870
+ Number.isFinite(o) && (uo.value = Math.min(eu, Math.max(Qr, o)), Ts.value = String(uo.value));
4793
4871
  try {
4794
4872
  const M = JSON.parse(((Fe = jt()) == null ? void 0 : Fe.getItem(ja)) ?? "null");
4795
4873
  (M != null && M.colors || M != null && M.designColors || M != null && M.typography || M != null && M.radius || M != null && M.spacing || M != null && M.shadow) && (De.value = uu(M), St.value = M.selectedThemeId ?? St.value);
@@ -4818,12 +4896,12 @@ async function Yh() {
4818
4896
  M[j(ye.screenId, ye.stateId)] = { value: ye, revision: null, cachedAt: (/* @__PURE__ */ new Date()).toISOString(), lastRemoteSyncAt: null, status: "stale" };
4819
4897
  }), Ri("pageDescriptions", M);
4820
4898
  }
4821
- const P = it("annotations"), oe = it("pageDescriptions"), xe = Object.values(P.scopes).flatMap((M) => M.value), pe = Object.values(oe.scopes).map((M) => M.value), ue = new Set(Object.keys(P.scopes)), ae = new Set(Object.keys(oe.scopes)), B = [...g.annotations.filter((M) => !ue.has(j(M.screenId, M.stateId))), ...xe], ke = [...g.pageDescriptions.filter((M) => !ae.has(j(M.screenId, M.stateId))), ...pe], ge = ar("flows"), Ae = ue.size ? { value: B, source: "local-cache" } : { value: g.annotations, source: "local-seed" }, J = ae.size ? { value: ke, source: "local-cache" } : { value: g.pageDescriptions, source: "local-seed" }, Ee = rv(ge, g.flows);
4899
+ const P = it("annotations"), oe = it("pageDescriptions"), xe = Object.values(P.scopes).flatMap((M) => M.value), pe = Object.values(oe.scopes).map((M) => M.value), ue = new Set(Object.keys(P.scopes)), ae = new Set(Object.keys(oe.scopes)), B = [...g.annotations.filter((M) => !ue.has(j(M.screenId, M.stateId))), ...xe], ke = [...g.pageDescriptions.filter((M) => !ae.has(j(M.screenId, M.stateId))), ...pe], ge = ar("flows"), Ae = ue.size ? { value: B, source: "local-cache" } : { value: g.annotations, source: "local-seed" }, J = ae.size ? { value: ke, source: "local-cache" } : { value: g.pageDescriptions, source: "local-seed" }, Te = rv(ge, g.flows);
4822
4900
  ie.value = Ae.value, Xe.value = J.value, Ut.value = {
4823
4901
  gitee: {},
4824
4902
  "local-cache": Ga(pe),
4825
4903
  "local-seed": Ga(g.pageDescriptions)
4826
- }, jn.value = Ut.value["local-cache"][en()] ? "local-cache" : "local-seed", et.value = Ee.value, re("annotations", Ae.source, "idle"), re("pageDescriptions", J.source, "idle"), re("flows", Ee.source, "idle"), Lt.value = ((L = et.value[0]) == null ? void 0 : L.id) ?? "", nn.value ? await Bs(!1) : fn.value = Pe.unavailableReason, Un(), ou.value = !0;
4904
+ }, jn.value = Ut.value["local-cache"][en()] ? "local-cache" : "local-seed", et.value = Te.value, re("annotations", Ae.source, "idle"), re("pageDescriptions", J.source, "idle"), re("flows", Te.source, "idle"), Lt.value = ((L = et.value[0]) == null ? void 0 : L.id) ?? "", nn.value ? await Bs(!1) : fn.value = Pe.unavailableReason, Un(), ou.value = !0;
4827
4905
  }
4828
4906
  Ye([De, St], () => {
4829
4907
  var t;
@@ -4876,19 +4954,19 @@ async function Xh(t, n = Qo(t, wt.value), o = !1) {
4876
4954
  return nt("annotations", r, p, a.sha, h, "synced"), ie.value = g, Gs(t, n, p.length), re("annotations", "gitee", "success", a.legacy ? "已读取主分支旧目录" : "", h), !0;
4877
4955
  }
4878
4956
  async function Zh(t = !1) {
4879
- const n = pt.value, o = wt.value, a = j(n, o), r = await Er(j(n, o));
4957
+ const n = pt.value, o = wt.value, a = j(n, o), r = await Tr(j(n, o));
4880
4958
  if (!r) return !1;
4881
4959
  nl("pageDescriptions", r.sha, t, "页面描述", a);
4882
4960
  const p = Nn([{ ...r.value, screenId: n, stateId: o }])[0];
4883
4961
  if (!p) return;
4884
4962
  const g = (/* @__PURE__ */ new Date()).toISOString();
4885
- Tt("gitee", a, p);
4963
+ Et("gitee", a, p);
4886
4964
  const h = it("pageDescriptions").scopes[a];
4887
4965
  if ((h == null ? void 0 : h.status) === "pending")
4888
4966
  re("pageDescriptions", "local-cache", "idle", "已读取 Gitee,本地缓存仍有待推送修改", g);
4889
4967
  else {
4890
4968
  const b = [...Xe.value.filter((P) => j(P.screenId, P.stateId) !== a), p];
4891
- nt("pageDescriptions", a, p, r.sha, g, "synced"), Tt("local-cache", a, p), Xe.value = b, zs(n, o, 1, p.highlighted, p.highlightColor), nu.value || (jn.value = "gitee"), re("pageDescriptions", "gitee", "success", r.legacy ? "已读取主分支旧目录" : "", g);
4969
+ nt("pageDescriptions", a, p, r.sha, g, "synced"), Et("local-cache", a, p), Xe.value = b, zs(n, o, 1, p.highlighted, p.highlightColor), nu.value || (jn.value = "gitee"), re("pageDescriptions", "gitee", "success", r.legacy ? "已读取主分支旧目录" : "", g);
4892
4970
  }
4893
4971
  return a === en() && Un(), !0;
4894
4972
  }
@@ -4929,9 +5007,9 @@ async function ul(t = !1) {
4929
5007
  ht.value = (o == null ? void 0 : o.value) ?? ht.value;
4930
5008
  const a = await Zh(t), r = en();
4931
5009
  if (!a && !((n = o == null ? void 0 : o.value.scopes) != null && n[r])) {
4932
- Tt("gitee", r, null);
5010
+ Et("gitee", r, null);
4933
5011
  const p = it("pageDescriptions").scopes[r];
4934
- (p == null ? void 0 : p.status) === "pending" ? re("pageDescriptions", "local-cache", "idle", "Gitee 当前 Scope 不存在,本地缓存待推送") : (Ha("pageDescriptions", r), Tt("local-cache", r, null), Xe.value = Xe.value.filter((g) => j(g.screenId, g.stateId) !== r), re("pageDescriptions", "gitee", "success", "", (/* @__PURE__ */ new Date()).toISOString())), Un();
5012
+ (p == null ? void 0 : p.status) === "pending" ? re("pageDescriptions", "local-cache", "idle", "Gitee 当前 Scope 不存在,本地缓存待推送") : (Ha("pageDescriptions", r), Et("local-cache", r, null), Xe.value = Xe.value.filter((g) => j(g.screenId, g.stateId) !== r), re("pageDescriptions", "gitee", "success", "", (/* @__PURE__ */ new Date()).toISOString())), Un();
4935
5013
  } else if (!a) throw new Error("Gitee 当前页面描述不存在");
4936
5014
  pn.value = "success", fn.value = Ne.value.pageDescriptions.source === "local-cache" ? "已读取 Gitee,本地缓存待推送" : "页面说明已同步";
4937
5015
  } catch (o) {
@@ -4987,14 +5065,14 @@ function Fi(t) {
4987
5065
  async function qh() {
4988
5066
  if (!Pe.remoteWritable || cn.value === "running") return;
4989
5067
  const t = xt.value.trim() || "初始化工具";
4990
- cn.value = "running", En.value = "", at.value = { current: 0, total: 1, label: "检查初始化状态" };
5068
+ cn.value = "running", Tn.value = "", at.value = { current: 0, total: 1, label: "检查初始化状态" };
4991
5069
  try {
4992
5070
  if (await Fm()) {
4993
- cn.value = "success", at.value = { current: 1, total: 1, label: "远端已初始化" }, En.value = "远端已初始化:未逐文件检查,未产生重复提交", await Bs(!1);
5071
+ cn.value = "success", at.value = { current: 1, total: 1, label: "远端已初始化" }, Tn.value = "远端已初始化:未逐文件检查,未产生重复提交", await Bs(!1);
4994
5072
  return;
4995
5073
  }
4996
5074
  } catch (r) {
4997
- cn.value = "partial", at.value = { current: 1, total: 1, label: "初始化状态检查失败" }, En.value = r instanceof Error ? r.message : "无法检查 Gitee 初始化状态", console.error("❌ [Gitee 初始化] 初始化状态检查失败", { error: r });
5075
+ cn.value = "partial", at.value = { current: 1, total: 1, label: "初始化状态检查失败" }, Tn.value = r instanceof Error ? r.message : "无法检查 Gitee 初始化状态", console.error("❌ [Gitee 初始化] 初始化状态检查失败", { error: r });
4998
5076
  return;
4999
5077
  }
5000
5078
  const n = [], o = /* @__PURE__ */ new Map();
@@ -5022,7 +5100,7 @@ async function qh() {
5022
5100
  } catch (r) {
5023
5101
  a.failed += 1, console.error("❌ [Gitee 初始化] 完成标记写入失败", { error: r });
5024
5102
  }
5025
- at.value = { ...at.value, current: at.value.current + 1 }, cn.value = a.failed ? "partial" : "success", En.value = a.failed ? `初始化部分完成:新建 ${a.created},跳过 ${a.unchanged + a.protected},失败 ${a.failed}` : a.created ? `初始化成功:新建 ${a.created},跳过 ${a.unchanged + a.protected}` : `远端已初始化:未重复创建,检查 ${a.unchanged + a.protected}`, await Bs(!1);
5103
+ at.value = { ...at.value, current: at.value.current + 1 }, cn.value = a.failed ? "partial" : "success", Tn.value = a.failed ? `初始化部分完成:新建 ${a.created},跳过 ${a.unchanged + a.protected},失败 ${a.failed}` : a.created ? `初始化成功:新建 ${a.created},跳过 ${a.unchanged + a.protected}` : `远端已初始化:未重复创建,检查 ${a.unchanged + a.protected}`, await Bs(!1);
5026
5104
  }
5027
5105
  function Qh() {
5028
5106
  Ls.value = !0, Zo.value = null;
@@ -5167,21 +5245,21 @@ function cl() {
5167
5245
  }
5168
5246
  function dl() {
5169
5247
  const t = cl(), n = j(t.screenId, t.stateId), o = it("pageDescriptions").scopes[n];
5170
- return nt("pageDescriptions", n, t, (o == null ? void 0 : o.revision) ?? null, (o == null ? void 0 : o.lastRemoteSyncAt) ?? null, "pending"), Tt("local-cache", n, t), Xe.value = [...Xe.value.filter((a) => j(a.screenId, a.stateId) !== n), t], zs(t.screenId, t.stateId, 1, t.highlighted, t.highlightColor), re("pageDescriptions", "local-cache", "success", "页面描述已保存到本地缓存,尚未推送 Gitee"), !0;
5248
+ return nt("pageDescriptions", n, t, (o == null ? void 0 : o.revision) ?? null, (o == null ? void 0 : o.lastRemoteSyncAt) ?? null, "pending"), Et("local-cache", n, t), Xe.value = [...Xe.value.filter((a) => j(a.screenId, a.stateId) !== n), t], zs(t.screenId, t.stateId, 1, t.highlighted, t.highlightColor), re("pageDescriptions", "local-cache", "success", "页面描述已保存到本地缓存,尚未推送 Gitee"), !0;
5171
5249
  }
5172
5250
  async function Su(t) {
5173
5251
  if (!Pe.remoteWritable)
5174
5252
  return re("pageDescriptions", jn.value, "error", Pe.unavailableReason || "Gitee 当前不可写"), !1;
5175
5253
  const n = j(t.screenId, t.stateId);
5176
5254
  try {
5177
- const o = await Tr(n, t.authorName ?? "未署名", t);
5255
+ const o = await Er(n, t.authorName ?? "未署名", t);
5178
5256
  if (!o || (zs(t.screenId, t.stateId, 1, t.highlighted, t.highlightColor), !ht.value)) return !1;
5179
5257
  const a = await Nr(ht.value, t.authorName ?? "未署名", n);
5180
5258
  if (!a) throw new Error(`页面描述 ${n} 已写入,但 manifest 回读失败`);
5181
5259
  const r = Nn([{ ...o.value, screenId: t.screenId, stateId: t.stateId }])[0];
5182
5260
  if (!r) throw new Error(`页面描述 ${n} 回读内容无效`);
5183
5261
  const p = (/* @__PURE__ */ new Date()).toISOString();
5184
- return nt("pageDescriptions", n, r, o.sha, p, "synced"), Tt("gitee", n, r), Tt("local-cache", n, r), Xe.value = [...Xe.value.filter((g) => j(g.screenId, g.stateId) !== n), r], ht.value = a.value, re("pageDescriptions", "gitee", "success", "", p), !0;
5262
+ return nt("pageDescriptions", n, r, o.sha, p, "synced"), Et("gitee", n, r), Et("local-cache", n, r), Xe.value = [...Xe.value.filter((g) => j(g.screenId, g.stateId) !== n), r], ht.value = a.value, re("pageDescriptions", "gitee", "success", "", p), !0;
5185
5263
  } catch (o) {
5186
5264
  const a = o instanceof Error ? o.message : "页面描述保存失败";
5187
5265
  return o instanceof mo ? ol("pageDescriptions", a) : re("pageDescriptions", Ne.value.pageDescriptions.source, "error", a), !1;
@@ -5221,18 +5299,18 @@ async function Cu(t = {}) {
5221
5299
  for (const ue of p) {
5222
5300
  const ae = j(ue.screenId, ue.stateId), B = ((pe = ue.authorName) == null ? void 0 : pe.trim()) || xt.value.trim() || "AI";
5223
5301
  try {
5224
- const ke = await Er(ae), ge = ke ? Nn([{ ...ke.value, screenId: ue.screenId, stateId: ue.stateId }])[0] : void 0;
5302
+ const ke = await Tr(ae), ge = ke ? Nn([{ ...ke.value, screenId: ue.screenId, stateId: ue.stateId }])[0] : void 0;
5225
5303
  if (ke && ge && nr(ge, ue)) {
5226
5304
  const F = (/* @__PURE__ */ new Date()).toISOString();
5227
- nt("pageDescriptions", ae, ge, ke.sha, F, "synced"), Tt("gitee", ae, ge), Tt("local-cache", ae, ge), Xe.value = [...Xe.value.filter((Fe) => j(Fe.screenId, Fe.stateId) !== ae), ge], b.push(ae);
5305
+ nt("pageDescriptions", ae, ge, ke.sha, F, "synced"), Et("gitee", ae, ge), Et("local-cache", ae, ge), Xe.value = [...Xe.value.filter((Fe) => j(Fe.screenId, Fe.stateId) !== ae), ge], b.push(ae);
5228
5306
  continue;
5229
5307
  }
5230
- const Ae = await Tr(ae, B, ue);
5308
+ const Ae = await Er(ae, B, ue);
5231
5309
  if (!Ae) throw new Error(`页面描述 ${ae} 写入后未能回读`);
5232
5310
  const J = Nn([{ ...Ae.value, screenId: ue.screenId, stateId: ue.stateId }])[0];
5233
5311
  if (!J) throw new Error(`页面描述 ${ae} 回读内容无效`);
5234
- const Ee = (/* @__PURE__ */ new Date()).toISOString();
5235
- if (nt("pageDescriptions", ae, J, Ae.sha, Ee, "synced"), Tt("gitee", ae, J), Tt("local-cache", ae, J), Xe.value = [...Xe.value.filter((F) => j(F.screenId, F.stateId) !== ae), J], zs(J.screenId, J.stateId, 1, J.highlighted, J.highlightColor), !ht.value) throw new Error("页面描述索引未初始化");
5312
+ const Te = (/* @__PURE__ */ new Date()).toISOString();
5313
+ if (nt("pageDescriptions", ae, J, Ae.sha, Te, "synced"), Et("gitee", ae, J), Et("local-cache", ae, J), Xe.value = [...Xe.value.filter((F) => j(F.screenId, F.stateId) !== ae), J], zs(J.screenId, J.stateId, 1, J.highlighted, J.highlightColor), !ht.value) throw new Error("页面描述索引未初始化");
5236
5314
  const Re = await Nr(ht.value, B, ae);
5237
5315
  if (!Re) throw new Error(`页面描述 ${ae} 已写入,但 manifest 回读失败`);
5238
5316
  ht.value = Re.value, h.push(ae);
@@ -5254,12 +5332,12 @@ function py() {
5254
5332
  }
5255
5333
  function vy() {
5256
5334
  var n;
5257
- const t = Number(Es.value);
5335
+ const t = Number(Ts.value);
5258
5336
  if (!Number.isFinite(t)) {
5259
- Ts.value = "请输入数字";
5337
+ Es.value = "请输入数字";
5260
5338
  return;
5261
5339
  }
5262
- uo.value = Math.min(eu, Math.max(Qr, t)), Es.value = String(uo.value), (n = jt()) == null || n.setItem(Zr, String(uo.value)), Ts.value = "已保存同步间隔";
5340
+ uo.value = Math.min(eu, Math.max(Qr, t)), Ts.value = String(uo.value), (n = jt()) == null || n.setItem(Zr, String(uo.value)), Es.value = "已保存同步间隔";
5263
5341
  }
5264
5342
  const fy = k(() => ({
5265
5343
  "--flow-zoom": String(dt.value)
@@ -5367,12 +5445,12 @@ async function Ay(t) {
5367
5445
  return r instanceof mo ? ol("flows", p) : re("flows", Ne.value.flows.source, "error", p), !1;
5368
5446
  }
5369
5447
  }
5370
- function Ey(t = et.value) {
5448
+ function Ty(t = et.value) {
5371
5449
  const n = new Blob([JSON.stringify({ version: "1.0.0", flows: t }, null, 2)], { type: "application/json;charset=utf-8" }), o = document.createElement("a");
5372
5450
  o.href = URL.createObjectURL(n), o.download = "flows.json", o.click(), URL.revokeObjectURL(o.href);
5373
5451
  }
5374
- function Ty() {
5375
- return { saveFlowsToSession: $u, pushFlowsToGitee: Ay, exportFlows: Ey };
5452
+ function Ey() {
5453
+ return { saveFlowsToSession: $u, pushFlowsToGitee: Ay, exportFlows: Ty };
5376
5454
  }
5377
5455
  function Ny() {
5378
5456
  const t = {
@@ -5400,8 +5478,8 @@ function Ny() {
5400
5478
  annotationSyncLabel: fn,
5401
5479
  annotationAuthorName: xt,
5402
5480
  annotationPollingIntervalSeconds: uo,
5403
- annotationPollingIntervalInput: Es,
5404
- annotationPollingNotice: Ts,
5481
+ annotationPollingIntervalInput: Ts,
5482
+ annotationPollingNotice: Es,
5405
5483
  collaborationInitialized: ou,
5406
5484
  collaborationContext: Pe,
5407
5485
  collaborationSources: Ne,
@@ -5411,7 +5489,7 @@ function Ny() {
5411
5489
  collaborationLastSyncedAt: wh,
5412
5490
  collaborationBootstrapStatus: cn,
5413
5491
  collaborationBootstrapProgress: at,
5414
- collaborationBootstrapMessage: En,
5492
+ collaborationBootstrapMessage: Tn,
5415
5493
  canInitializeRemote: Ch,
5416
5494
  annotationPanelCollapsed: fh,
5417
5495
  annotationPointsVisible: mh,
@@ -5430,7 +5508,7 @@ function Ny() {
5430
5508
  activeDesignColors: xh,
5431
5509
  themeOptions: cu,
5432
5510
  themeStyle: Ih,
5433
- themeLabel: Th,
5511
+ themeLabel: Eh,
5434
5512
  themeDescription: Nh,
5435
5513
  screens: Bn,
5436
5514
  mainFlows: et,
@@ -5465,7 +5543,7 @@ function Ny() {
5465
5543
  updateCustomThemeDesignColor: Ph,
5466
5544
  updateCustomThemeTypography: Dh,
5467
5545
  updateCustomThemeRadius: Ah,
5468
- resetCustomTheme: Eh,
5546
+ resetCustomTheme: Th,
5469
5547
  exportCustomTheme: Rh,
5470
5548
  importCustomTheme: Oh,
5471
5549
  setPrototypeState: La,
@@ -5586,7 +5664,7 @@ const Ry = {
5586
5664
  }, _b = {
5587
5665
  key: 1,
5588
5666
  class: "apple-side-nav overview-side-nav"
5589
- }, Pb = { class: "px-2 pb-4" }, Db = { class: "flex items-center gap-3" }, Ab = { class: "min-w-5 text-center text-xs font-semibold text-ink" }, Eb = { class: "px-2" }, Tb = { class: "flex items-center gap-2" }, Nb = { class: "min-w-10 text-center text-xs font-semibold text-ink" }, Rb = {
5667
+ }, Pb = { class: "px-2 pb-4" }, Db = { class: "flex items-center gap-3" }, Ab = { class: "min-w-5 text-center text-xs font-semibold text-ink" }, Tb = { class: "px-2" }, Eb = { class: "flex items-center gap-2" }, Nb = { class: "min-w-10 text-center text-xs font-semibold text-ink" }, Rb = {
5590
5668
  key: 2,
5591
5669
  class: "apple-side-nav flow-side-nav lg:w-80"
5592
5670
  }, Ob = { class: "flex items-center justify-between px-2 pb-3" }, Bb = ["onClick"], jb = { class: "min-w-0 flex-1 text-left" }, Ub = {
@@ -5644,7 +5722,7 @@ const Ry = {
5644
5722
  }, _1 = { class: "page-description-editor-source-row" }, P1 = {
5645
5723
  class: "page-description-source-switcher",
5646
5724
  "aria-label": "切换编辑数据源"
5647
- }, D1 = ["aria-pressed", "onClick"], A1 = ["disabled"], E1 = { class: "page-description-highlight-field" }, T1 = {
5725
+ }, D1 = ["aria-pressed", "onClick"], A1 = ["disabled"], T1 = { class: "page-description-highlight-field" }, E1 = {
5648
5726
  key: 0,
5649
5727
  class: "page-description-highlight-colors"
5650
5728
  }, N1 = { class: "page-description-highlight-swatches" }, R1 = ["aria-label", "title", "onClick"], O1 = { class: "page-description-custom-color" }, B1 = ["onKeydown"], j1 = { key: 0 }, U1 = ["placeholder"], M1 = ["placeholder"], V1 = ["placeholder"], L1 = ["placeholder"], F1 = ["placeholder"], G1 = {
@@ -5670,7 +5748,7 @@ const Ry = {
5670
5748
  role: "dialog",
5671
5749
  "aria-modal": "true",
5672
5750
  "aria-label": "原型健康检查"
5673
- }, _w = { class: "prototype-health-head" }, Pw = { class: "prototype-health-tabs" }, Dw = { class: "prototype-health-stat-grid" }, Aw = { class: "prototype-health-section" }, Ew = { class: "prototype-health-section-head" }, Tw = { class: "prototype-health-issues" }, Nw = {
5751
+ }, _w = { class: "prototype-health-head" }, Pw = { class: "prototype-health-tabs" }, Dw = { class: "prototype-health-stat-grid" }, Aw = { class: "prototype-health-section" }, Tw = { class: "prototype-health-section-head" }, Ew = { class: "prototype-health-issues" }, Nw = {
5674
5752
  key: 1,
5675
5753
  class: "prototype-health-section prototype-health-matrix-section"
5676
5754
  }, Rw = { class: "prototype-health-table-wrap" }, Ow = { class: "prototype-health-table" }, Bw = { class: "w-full max-w-xl rounded-[24px] border border-line bg-panel p-5 text-left shadow-[0_24px_70px_rgb(0_0_0/0.18)]" }, jw = { class: "flex items-start justify-between gap-4" }, Uw = { class: "mt-1 text-xs text-muted" }, Mw = { class: "mt-4 max-h-[60vh] space-y-3 overflow-y-auto pr-1" }, Vw = ["onClick"], Lw = { class: "flex items-center justify-between gap-3" }, Fw = { class: "text-sm font-semibold text-ink" }, Gw = { class: "flex shrink-0 items-center gap-2" }, zw = { class: "rounded-full bg-panel px-2 py-1 text-xs text-muted" }, Hw = { class: "mt-2 text-sm leading-5 text-muted" }, Kw = {
@@ -5685,13 +5763,13 @@ const Ry = {
5685
5763
  }, Yw = {
5686
5764
  key: 0,
5687
5765
  class: "rounded-[16px] bg-soft p-3 text-sm text-muted"
5688
- }, Xw = { class: "mobile-page-picker" }, Zw = { class: "mobile-page-picker-list" }, qw = ["onClick"], Qw = { class: "mobile-page-picker-code" }, e0 = { class: "mobile-page-picker-copy" }, t0 = {
5766
+ }, Xw = { class: "mobile-page-picker" }, Zw = { class: "mobile-page-picker-list" }, qw = ["onClick"], Qw = { class: "mobile-page-picker-code" }, eS = { class: "mobile-page-picker-copy" }, tS = {
5689
5767
  key: 0,
5690
5768
  class: "mobile-page-picker-count"
5691
- }, n0 = {
5769
+ }, nS = {
5692
5770
  key: 0,
5693
5771
  class: "mobile-page-picker-states"
5694
- }, o0 = ["onClick"], Ki = "prototype-core-authenticated", Vo = "prototype-core-page-description-summary-sections", Ps = "prototype-core-panel-state-v1", ao = 393, Aa = 852, s0 = 24, Ea = 1920, a0 = 1080, l0 = 640, c0 = /* @__PURE__ */ tn({
5772
+ }, oS = ["onClick"], Ki = "prototype-core-authenticated", Vo = "prototype-core-page-description-summary-sections", Ps = "prototype-core-panel-state-v1", ao = 393, Aa = 852, sS = 24, Ta = 1920, aS = 1080, lS = 640, cS = /* @__PURE__ */ tn({
5695
5773
  __name: "App",
5696
5774
  setup(t) {
5697
5775
  var ki;
@@ -5715,7 +5793,7 @@ const Ry = {
5715
5793
  annotationSyncStatus: ge,
5716
5794
  annotationSyncLabel: Ae,
5717
5795
  annotationAuthorName: J,
5718
- annotationPollingIntervalSeconds: Ee,
5796
+ annotationPollingIntervalSeconds: Te,
5719
5797
  annotationPollingIntervalInput: Re,
5720
5798
  annotationPollingNotice: F,
5721
5799
  collaborationInitialized: Fe,
@@ -5757,7 +5835,7 @@ const Ry = {
5757
5835
  flowRows: _,
5758
5836
  visibleScreens: Y,
5759
5837
  prototypeStateOptions: we,
5760
- activePrototypeStateId: E,
5838
+ activePrototypeStateId: T,
5761
5839
  getPrototypeStateOptions: q,
5762
5840
  getPrototypeStateLabel: Ke,
5763
5841
  normalizePrototypeStateId: Je,
@@ -5800,12 +5878,12 @@ const Ry = {
5800
5878
  annotationCountByState: Pu,
5801
5879
  refreshPrototypeAnnotations: Du,
5802
5880
  refreshPageDescriptions: Au,
5803
- refreshAllCollaborationData: Eu,
5881
+ refreshAllCollaborationData: Tu,
5804
5882
  setCollaborationEditing: qs,
5805
5883
  initializeRemoteCollaborationData: bl,
5806
5884
  saveAnnotationPollingInterval: wl,
5807
5885
  exportAnnotations: Sl,
5808
- saveCurrentPageDescription: Tu,
5886
+ saveCurrentPageDescription: Eu,
5809
5887
  saveCurrentPageDescriptionToCache: Nu,
5810
5888
  pushPageDescriptionSourceToGitee: Ru,
5811
5889
  selectPageDescriptionSource: Cl,
@@ -5822,7 +5900,7 @@ const Ry = {
5822
5900
  zoomFlowAtPoint: Vu,
5823
5901
  overviewZoom: Gt,
5824
5902
  overviewColumns: wn
5825
- } = Ny(), { saveFlowsToSession: Lu, pushFlowsToGitee: Fu, exportFlows: Gu } = Ty(), { unresolvedBugCount: Pl, initializeBugs: zu } = Sr(), { initializeTestCases: Hu, refreshTestCases: Ku, sourceState: Ju } = jr(), Wu = k(
5903
+ } = Ny(), { saveFlowsToSession: Lu, pushFlowsToGitee: Fu, exportFlows: Gu } = Ey(), { unresolvedBugCount: Pl, initializeBugs: zu } = Sr(), { initializeTestCases: Hu, refreshTestCases: Ku, sourceState: Ju } = jr(), Wu = k(
5826
5904
  () => R.filter((u) => u.platform === "mobile" && u.hasTabBar).map((u) => ({ id: u.id, label: u.title, icon: u.icon }))
5827
5905
  ), is = {
5828
5906
  gitee: "Gitee",
@@ -5837,7 +5915,7 @@ const Ry = {
5837
5915
  Ye(Ju, (u) => {
5838
5916
  L.value = { ...L.value, testCases: { ...u } };
5839
5917
  }, { deep: !0, immediate: !0 });
5840
- const Qu = ["structure", "features"], rs = y(""), us = y(""), wo = y(""), Fn = y(!1), Al = y(!1), sn = y(!1), Sn = y(!1), So = y("overview"), _t = y(!1), an = y(""), bt = y([...Qu]), zt = y(!1), Gn = y(""), El = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#3b82f6", "#8b5cf6"], Tl = El, cs = y(""), Co = y(""), Nl = `prototype-highlight-colors:${he.projectId}`, ds = y(ec()), zn = y(""), Cn = y(""), Rl = `prototype-annotation-colors:${he.projectId}`, ko = y(tc());
5918
+ const Qu = ["structure", "features"], rs = y(""), us = y(""), wo = y(""), Fn = y(!1), Al = y(!1), sn = y(!1), Sn = y(!1), So = y("overview"), _t = y(!1), an = y(""), bt = y([...Qu]), zt = y(!1), Gn = y(""), Tl = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#3b82f6", "#8b5cf6"], El = Tl, cs = y(""), Co = y(""), Nl = `prototype-highlight-colors:${he.projectId}`, ds = y(ec()), zn = y(""), Cn = y(""), Rl = `prototype-annotation-colors:${he.projectId}`, ko = y(tc());
5841
5919
  function ec() {
5842
5920
  try {
5843
5921
  const u = window.localStorage.getItem(Nl);
@@ -5953,7 +6031,7 @@ const Ry = {
5953
6031
  ]
5954
6032
  }
5955
6033
  ];
5956
- }), Bl = k(() => ta.value.reduce((u, s) => u + s.items.length, 0)), jl = k(() => ta.value.reduce((u, s) => u + s.items.filter((l) => l.configured).length, 0)), na = k(() => Bl.value - jl.value), oa = "1.2.11", sa = y(""), kn = y("idle"), oc = k(() => kn.value === "success" && sa.value !== oa), sc = k(() => kn.value === "success" ? `v${sa.value}` : kn.value === "error" ? "版本暂不可用" : "版本检测中");
6034
+ }), Bl = k(() => ta.value.reduce((u, s) => u + s.items.length, 0)), jl = k(() => ta.value.reduce((u, s) => u + s.items.filter((l) => l.configured).length, 0)), na = k(() => Bl.value - jl.value), oa = "1.2.12", sa = y(""), kn = y("idle"), oc = k(() => kn.value === "success" && sa.value !== oa), sc = k(() => kn.value === "success" ? `v${sa.value}` : kn.value === "error" ? "版本暂不可用" : "版本检测中");
5957
6035
  async function ac() {
5958
6036
  if (kn.value !== "idle") return;
5959
6037
  kn.value = "loading";
@@ -6034,7 +6112,7 @@ const Ry = {
6034
6112
  const ee = k(() => me.value ? "interactive" : g.value), fc = k(
6035
6113
  () => me.value ? [$t.value] : Y.value
6036
6114
  ), qn = k(
6037
- () => E.value ? Ke(h.value, E.value) : ""
6115
+ () => T.value ? Ke(h.value, T.value) : ""
6038
6116
  ), mc = k(() => {
6039
6117
  const u = Io.value.trim().toLowerCase();
6040
6118
  return R.map((s) => {
@@ -6047,9 +6125,9 @@ const Ry = {
6047
6125
  };
6048
6126
  }).filter((s) => s.visible);
6049
6127
  }), gc = k(
6050
- () => !!(Z.value && Z.value.screenId === h.value && Z.value.stateId === Je(h.value, E.value))
6128
+ () => !!(Z.value && Z.value.screenId === h.value && Z.value.stateId === Je(h.value, T.value))
6051
6129
  );
6052
- Ye([h, E, B], () => {
6130
+ Ye([h, T, B], () => {
6053
6131
  zt.value = !1;
6054
6132
  }), Ye(zt, (u) => qs("pageDescriptions", u), { immediate: !0 }), Ye($e, (u) => qs("flows", u), { immediate: !0 }), Ye([G, Z], ([u, s]) => {
6055
6133
  qs("annotations", u !== "view" || !!s);
@@ -6091,14 +6169,14 @@ const Ry = {
6091
6169
  Hl(), zt.value = !1;
6092
6170
  }
6093
6171
  async function yc() {
6094
- await Tu() && (zt.value = !1);
6172
+ await Eu() && (zt.value = !1);
6095
6173
  }
6096
6174
  function bc() {
6097
6175
  Nu() && (zt.value = !1);
6098
6176
  }
6099
6177
  async function wc() {
6100
6178
  if (te.value === "gitee") return;
6101
- const u = To(h.value, E.value), s = he.branchKey || "未知分支", l = `projects/${he.projectId}/branches/${s}/page-descriptions/${u}.json`, w = te.value === "local-cache" ? "本地缓存" : "JSON";
6179
+ const u = Eo(h.value, T.value), s = he.branchKey || "未知分支", l = `projects/${he.projectId}/branches/${s}/page-descriptions/${u}.json`, w = te.value === "local-cache" ? "本地缓存" : "JSON";
6102
6180
  if (!window.confirm(`将${w}中的当前页面描述覆盖推送到 Gitee?
6103
6181
 
6104
6182
  Scope:${u}
@@ -6118,7 +6196,7 @@ Scope:${u}
6118
6196
  function kc() {
6119
6197
  hs && (window.clearTimeout(hs), hs = null);
6120
6198
  }
6121
- function Eo() {
6199
+ function To() {
6122
6200
  kc(), Hn.value = "", Be = null;
6123
6201
  }
6124
6202
  function Kl(u, s) {
@@ -6157,7 +6235,7 @@ Scope:${u}
6157
6235
  function Dc(u, s) {
6158
6236
  if (s.pointerType === "mouse" && s.button !== 0 || Kn.value.has(u.id)) return;
6159
6237
  const l = s.currentTarget.closest(".screen-content");
6160
- l && (Eo(), ze.value = "", Hn.value = u.id, Be = {
6238
+ l && (To(), ze.value = "", Hn.value = u.id, Be = {
6161
6239
  annotation: u,
6162
6240
  pointerId: s.pointerId,
6163
6241
  startClientX: s.clientX,
@@ -6178,17 +6256,17 @@ Scope:${u}
6178
6256
  function Ac(u) {
6179
6257
  if (!Be || Be.pointerId !== u.pointerId) return;
6180
6258
  if (!Be.activated) {
6181
- Math.hypot(u.clientX - Be.startClientX, u.clientY - Be.startClientY) > 8 && Eo();
6259
+ Math.hypot(u.clientX - Be.startClientX, u.clientY - Be.startClientY) > 8 && To();
6182
6260
  return;
6183
6261
  }
6184
6262
  u.preventDefault(), u.stopPropagation();
6185
6263
  const { x: s, y: l } = Jl(u.clientX, u.clientY, Be.content);
6186
6264
  Pt.value = { id: Be.annotation.id, x: s, y: l };
6187
6265
  }
6188
- function Ec(u) {
6266
+ function Tc(u) {
6189
6267
  if (!Be || Be.pointerId !== u.pointerId) return;
6190
6268
  const s = Be, l = Pt.value;
6191
- if (Eo(), !s.activated || !l || l.id !== s.annotation.id) return;
6269
+ if (To(), !s.activated || !l || l.id !== s.annotation.id) return;
6192
6270
  if (u.preventDefault(), u.stopPropagation(), ea = s.annotation.id, Math.max(
6193
6271
  Math.abs(l.x - s.annotation.x),
6194
6272
  Math.abs(l.y - s.annotation.y)
@@ -6208,8 +6286,8 @@ Scope:${u}
6208
6286
  }, 300);
6209
6287
  $o.set(s.annotation.id, X);
6210
6288
  }
6211
- function Tc(u) {
6212
- !Be || Be.pointerId !== u.pointerId || (Eo(), Pt.value = null);
6289
+ function Ec(u) {
6290
+ !Be || Be.pointerId !== u.pointerId || (To(), Pt.value = null);
6213
6291
  }
6214
6292
  function Nc(u, s) {
6215
6293
  Hn.value || Pt.value || (gs.value = s.currentTarget.getBoundingClientRect(), hl(u.id));
@@ -6224,7 +6302,7 @@ Scope:${u}
6224
6302
  if (!((s = Se.value) != null && s.authorName) && !((l = Se.value) != null && l.updatedAt)) return "";
6225
6303
  const u = pa(Se.value.updatedAt);
6226
6304
  return `${Se.value.authorName || "未署名"}${u ? ` · ${u}` : ""}`;
6227
- }), Oc = k(() => To(h.value, E.value)), Wl = [
6305
+ }), Oc = k(() => Eo(h.value, T.value)), Wl = [
6228
6306
  { source: "gitee", label: "Gitee", icon: Od },
6229
6307
  { source: "local-cache", label: "本地缓存", icon: Bd },
6230
6308
  { source: "local-seed", label: "JSON", icon: Xi }
@@ -6258,7 +6336,7 @@ Scope:${u}
6258
6336
 
6259
6337
  `)
6260
6338
  );
6261
- function To(u, s) {
6339
+ function Eo(u, s) {
6262
6340
  return s ? `${u}__${s}` : u;
6263
6341
  }
6264
6342
  const da = k(
@@ -6276,7 +6354,7 @@ Scope:${u}
6276
6354
  )
6277
6355
  ), Zl = k(() => {
6278
6356
  var s;
6279
- const u = new Set(Rt.value.map((l) => To(l.screenId, l.stateId)));
6357
+ const u = new Set(Rt.value.map((l) => Eo(l.screenId, l.stateId)));
6280
6358
  return ke.value && ((s = be.value) != null && s.scopes) && Object.entries(be.value.scopes).forEach(([l, w]) => {
6281
6359
  ((w == null ? void 0 : w.count) ?? 0) > 0 && u.add(l);
6282
6360
  }), u;
@@ -6286,10 +6364,10 @@ Scope:${u}
6286
6364
  }), Qn = k(
6287
6365
  () => R.map((u) => {
6288
6366
  const s = q(u.id), l = s.length ? s.map((X) => ({
6289
- id: To(u.id, X.id),
6367
+ id: Eo(u.id, X.id),
6290
6368
  stateId: X.id,
6291
6369
  label: X.label
6292
- })) : [{ id: To(u.id), stateId: void 0, label: "默认" }], w = l.filter((X) => Zl.value.has(X.id)).length, O = da.value.filter((X) => X.screenId === u.id).length;
6370
+ })) : [{ id: Eo(u.id), stateId: void 0, label: "默认" }], w = l.filter((X) => Zl.value.has(X.id)).length, O = da.value.filter((X) => X.screenId === u.id).length;
6293
6371
  return {
6294
6372
  ...u,
6295
6373
  stateCount: l.length,
@@ -6377,14 +6455,14 @@ Scope:${u}
6377
6455
  bt.value = xn.value.map((s) => s.id).filter((s) => !u.has(s)), window.localStorage.setItem(Vo, JSON.stringify(bt.value));
6378
6456
  }
6379
6457
  const va = k(() => {
6380
- const u = Math.max(1, wn.value), l = ((ua.value || window.innerWidth) - s0 * (u - 1)) / u;
6458
+ const u = Math.max(1, wn.value), l = ((ua.value || window.innerWidth) - sS * (u - 1)) / u;
6381
6459
  return Math.min(1, Math.max(0.36, Number((l / ao).toFixed(3))));
6382
6460
  }), ni = k(() => Math.round(ao * va.value * 100) / 100), zc = k(() => Math.round(Aa * va.value * 100) / 100);
6383
6461
  function Hc() {
6384
6462
  if (lt.value)
6385
- return Math.min(Ea, Yn.value, Math.max(0, Do.value - 48) * 16 / 9);
6463
+ return Math.min(Ta, Yn.value, Math.max(0, Do.value - 48) * 16 / 9);
6386
6464
  if (ee.value === "overview") return ni.value;
6387
- if (ee.value === "flow") return l0;
6465
+ if (ee.value === "flow") return lS;
6388
6466
  const u = ua.value || Yn.value;
6389
6467
  return Math.min(1440, u, Math.max(0, Do.value - 120) * 16 / 9);
6390
6468
  }
@@ -6404,12 +6482,12 @@ Scope:${u}
6404
6482
  "--presentation-phone-scale": String(O / ao)
6405
6483
  };
6406
6484
  }
6407
- const l = Math.max(1, Hc()), w = l * a0 / Ea;
6485
+ const l = Math.max(1, Hc()), w = l * aS / Ta;
6408
6486
  return {
6409
6487
  ...s,
6410
6488
  "--desktop-display-width": `${l}px`,
6411
6489
  "--desktop-display-height": `${w}px`,
6412
- "--desktop-preview-scale": String(l / Ea)
6490
+ "--desktop-preview-scale": String(l / Ta)
6413
6491
  };
6414
6492
  }
6415
6493
  const Jc = k(() => ({
@@ -6610,10 +6688,10 @@ Scope:${u}
6610
6688
  );
6611
6689
  function pi() {
6612
6690
  ui(), ke.value && (Is = window.setInterval(() => {
6613
- console.info("🔄 [协作同步] 开始轮询注释、页面描述、测试用例和流程"), Eu(!0), Ku(!0);
6614
- }, Ee.value * 1e3));
6691
+ console.info("🔄 [协作同步] 开始轮询注释、页面描述、测试用例和流程"), Tu(!0), Ku(!0);
6692
+ }, Te.value * 1e3));
6615
6693
  }
6616
- Ye(Ee, () => {
6694
+ Ye(Te, () => {
6617
6695
  Fe.value && pi();
6618
6696
  });
6619
6697
  function ld() {
@@ -6791,13 +6869,13 @@ Scope:${u}
6791
6869
  var u;
6792
6870
  ha(), Vc(), ad(), In = window.matchMedia("(max-width: 640px)"), ba(In), In.addEventListener("change", ba), window.addEventListener("touchstart", wi, { passive: !0 }), window.addEventListener("touchmove", Si, { passive: !1 }), window.addEventListener("touchend", $s, { passive: !0 }), window.addEventListener("touchcancel", $s, { passive: !0 }), window.addEventListener("resize", Ci), window.addEventListener("hashchange", ha), wa(), eo = new ResizeObserver(wa), ws.value && eo.observe(ws.value), window.addEventListener("keydown", di), Fn.value = ((u = Ct.auth) == null ? void 0 : u.enabled) !== !0 || window.localStorage.getItem(Ki) === "true", Fn.value ? Ll() : Vl() || console.error("🔐 [前端认证] 已启用认证但未提供用户名或密码,访问页将无法登录");
6793
6871
  }), Xo(() => {
6794
- ui(), Eo(), xc(), In == null || In.removeEventListener("change", ba), In = void 0, window.removeEventListener("touchstart", wi), window.removeEventListener("touchmove", Si), window.removeEventListener("touchend", $s), window.removeEventListener("touchcancel", $s), window.removeEventListener("resize", Ci), window.removeEventListener("hashchange", ha), window.removeEventListener("keydown", di), eo == null || eo.disconnect(), eo = void 0, id(), Jn && window.clearTimeout(Jn), Wn && window.clearTimeout(Wn);
6872
+ ui(), To(), xc(), In == null || In.removeEventListener("change", ba), In = void 0, window.removeEventListener("touchstart", wi), window.removeEventListener("touchmove", Si), window.removeEventListener("touchend", $s), window.removeEventListener("touchcancel", $s), window.removeEventListener("resize", Ci), window.removeEventListener("hashchange", ha), window.removeEventListener("keydown", di), eo == null || eo.disconnect(), eo = void 0, id(), Jn && window.clearTimeout(Jn), Wn && window.clearTimeout(Wn);
6795
6873
  }), (u, s) => (d(), v("main", {
6796
6874
  class: A(["min-h-screen bg-canvas text-ink transition-[padding] duration-200", [
6797
6875
  me.value ? "mobile-pure-interactive" : "",
6798
6876
  le.value === "help" || le.value === "themeGuide" ? "prototype-help-route" : le.value === "testCases" ? "test-cases-route" : lt.value ? "presentation-mode" : !me.value && (No.value ? "has-update-banner pt-[120px]" : "pt-[68px]")
6799
6877
  ]]),
6800
- style: Te(i(rt))
6878
+ style: Ee(i(rt))
6801
6879
  }, [
6802
6880
  No.value && Fn.value ? (d(), v("div", Ry, [
6803
6881
  e("div", { class: "update-banner-inner" }, [
@@ -6902,7 +6980,7 @@ Scope:${u}
6902
6980
  }, [
6903
6981
  e("span", {
6904
6982
  class: "theme-swatch",
6905
- style: Te({ "--swatch-color": i(se).primary })
6983
+ style: Ee({ "--swatch-color": i(se).primary })
6906
6984
  }, null, 4),
6907
6985
  s[100] || (s[100] = K(" 主题切换 ", -1))
6908
6986
  ], 2),
@@ -6931,14 +7009,14 @@ Scope:${u}
6931
7009
  ]),
6932
7010
  s[102] || (s[102] = e("p", { class: "theme-section-title" }, "预设主题", -1)),
6933
7011
  e("div", eb, [
6934
- (d(!0), v(D, null, T(i(He), (l) => (d(), v("button", {
7012
+ (d(!0), v(D, null, E(i(He), (l) => (d(), v("button", {
6935
7013
  key: l.id,
6936
7014
  class: A(["theme-scheme-btn", { active: i(P) === l.id }]),
6937
7015
  onClick: (w) => i(Ys)(l.id)
6938
7016
  }, [
6939
7017
  e("span", {
6940
7018
  class: "theme-swatch",
6941
- style: Te({ "--swatch-color": l.designColors.primary })
7019
+ style: Ee({ "--swatch-color": l.designColors.primary })
6942
7020
  }, null, 4),
6943
7021
  e("span", nb, [
6944
7022
  e("b", null, c(i(ut)(l)), 1),
@@ -6971,7 +7049,7 @@ Scope:${u}
6971
7049
  ]),
6972
7050
  s[103] || (s[103] = e("p", { class: "theme-section-title" }, "设计系统颜色", -1)),
6973
7051
  e("div", sb, [
6974
- (d(!0), v(D, null, T(i(o), (l) => (d(), v("label", {
7052
+ (d(!0), v(D, null, E(i(o), (l) => (d(), v("label", {
6975
7053
  key: l.key,
6976
7054
  class: "theme-color-field"
6977
7055
  }, [
@@ -6993,7 +7071,7 @@ Scope:${u}
6993
7071
  ]),
6994
7072
  s[104] || (s[104] = e("p", { class: "theme-section-title" }, "字体", -1)),
6995
7073
  e("div", ib, [
6996
- (d(!0), v(D, null, T(i(a), (l) => {
7074
+ (d(!0), v(D, null, E(i(a), (l) => {
6997
7075
  var w;
6998
7076
  return d(), v("label", {
6999
7077
  key: l.key,
@@ -7013,7 +7091,7 @@ Scope:${u}
7013
7091
  ]),
7014
7092
  s[105] || (s[105] = e("p", { class: "theme-section-title" }, "形状", -1)),
7015
7093
  e("div", ub, [
7016
- (d(!0), v(D, null, T(i(r), (l) => {
7094
+ (d(!0), v(D, null, E(i(r), (l) => {
7017
7095
  var w;
7018
7096
  return d(), v("label", {
7019
7097
  key: l.key,
@@ -7033,7 +7111,7 @@ Scope:${u}
7033
7111
  ]),
7034
7112
  s[106] || (s[106] = e("p", { class: "theme-section-title" }, "内核兼容颜色", -1)),
7035
7113
  e("div", db, [
7036
- (d(!0), v(D, null, T(i(n), (l) => (d(), v("label", {
7114
+ (d(!0), v(D, null, E(i(n), (l) => (d(), v("label", {
7037
7115
  key: l.key,
7038
7116
  class: "theme-color-field"
7039
7117
  }, [
@@ -7071,7 +7149,7 @@ Scope:${u}
7071
7149
  key: 1,
7072
7150
  lang: i(p),
7073
7151
  "current-screen-id": i(h),
7074
- "current-state-id": i(E),
7152
+ "current-state-id": i(T),
7075
7153
  "author-name": i(J),
7076
7154
  "onUpdate:authorName": s[13] || (s[13] = (l) => J.value = l),
7077
7155
  onClose: pd
@@ -7086,7 +7164,7 @@ Scope:${u}
7086
7164
  me.value ? S("", !0) : (d(), v("section", fb, [
7087
7165
  ee.value === "interactive" ? (d(), v("div", mb, [
7088
7166
  e("div", gb, [
7089
- (d(), v(D, null, T(Wl, (l) => e("button", {
7167
+ (d(), v(D, null, E(Wl, (l) => e("button", {
7090
7168
  key: l.source,
7091
7169
  type: "button",
7092
7170
  class: A({ active: i(te) === l.source }),
@@ -7136,7 +7214,7 @@ Scope:${u}
7136
7214
  class: "interactive-side-nav-scroll",
7137
7215
  onScroll: fa
7138
7216
  }, [
7139
- (d(!0), v(D, null, T(i(R), (l) => (d(), v("button", {
7217
+ (d(!0), v(D, null, E(i(R), (l) => (d(), v("button", {
7140
7218
  key: l.id,
7141
7219
  class: A(["nav-row", { active: i(h) === l.id }]),
7142
7220
  onClick: (w) => i(Qe)(l.id)
@@ -7149,7 +7227,7 @@ Scope:${u}
7149
7227
  i(Ks)(l.id) ? (d(), v("span", {
7150
7228
  key: 0,
7151
7229
  class: "screen-highlight-bookmark",
7152
- style: Te({ backgroundColor: i(Js)(l.id) }),
7230
+ style: Ee({ backgroundColor: i(Js)(l.id) }),
7153
7231
  "aria-hidden": "true"
7154
7232
  }, null, 4)) : S("", !0),
7155
7233
  e("span", Cb, c(l.code) + " " + c(l.title), 1),
@@ -7192,9 +7270,9 @@ Scope:${u}
7192
7270
  e("strong", Ab, c(i(wn)), 1)
7193
7271
  ])
7194
7272
  ]),
7195
- e("div", Eb, [
7273
+ e("div", Tb, [
7196
7274
  s[114] || (s[114] = e("label", { class: "mb-2 block text-xs font-semibold text-muted" }, "缩放", -1)),
7197
- e("div", Tb, [
7275
+ e("div", Eb, [
7198
7276
  e("button", {
7199
7277
  type: "button",
7200
7278
  class: "overview-zoom-btn",
@@ -7238,7 +7316,7 @@ Scope:${u}
7238
7316
  K(" 编辑流程 ", -1)
7239
7317
  ])])
7240
7318
  ]),
7241
- (d(!0), v(D, null, T(i(ne), (l) => (d(), v("button", {
7319
+ (d(!0), v(D, null, E(i(ne), (l) => (d(), v("button", {
7242
7320
  key: l.id,
7243
7321
  class: A(["nav-row flow-nav-row", { active: i(b) === l.id }]),
7244
7322
  onClick: (w) => i(Ou)(l.id)
@@ -7295,7 +7373,7 @@ Scope:${u}
7295
7373
  ee.value === "overview" ? "overview-canvas" : ee.value === "flow" ? "flow-grid" : "grid gap-6 place-items-center",
7296
7374
  { "is-flow-panning": i(ue), "is-overview-panning": Ss.value }
7297
7375
  ]),
7298
- style: Te(ee.value === "flow" ? i(We) : void 0),
7376
+ style: Ee(ee.value === "flow" ? i(We) : void 0),
7299
7377
  onMousedown: s[25] || (s[25] = (l) => ee.value === "flow" ? i(Uu)(l) : ee.value === "overview" ? Yc(l) : void 0),
7300
7378
  onMousemove: s[26] || (s[26] = (l) => ee.value === "flow" ? i(Mu)(l) : ee.value === "overview" ? Xc(l) : void 0),
7301
7379
  onMouseup: s[27] || (s[27] = (l) => ee.value === "flow" ? i(_l)() : ai()),
@@ -7306,17 +7384,17 @@ Scope:${u}
7306
7384
  ref_key: "overviewGridRef",
7307
7385
  ref: zl,
7308
7386
  class: A(ee.value === "overview" ? "overview-grid" : "contents"),
7309
- style: Te(ee.value === "overview" ? Jc.value : void 0)
7387
+ style: Ee(ee.value === "overview" ? Jc.value : void 0)
7310
7388
  }, [
7311
- (d(!0), v(D, null, T(ee.value === "flow" ? i(_) : [], (l) => (d(), v("div", {
7389
+ (d(!0), v(D, null, E(ee.value === "flow" ? i(_) : [], (l) => (d(), v("div", {
7312
7390
  key: l.key,
7313
7391
  class: "flow-row-label",
7314
- style: Te(i(ju)(l.row))
7392
+ style: Ee(i(ju)(l.row))
7315
7393
  }, [
7316
7394
  s[119] || (s[119] = e("span", null, "子流程", -1)),
7317
7395
  e("strong", null, c(l.label), 1)
7318
7396
  ], 4))), 128)),
7319
- (d(!0), v(D, null, T(fc.value, (l) => (d(), v("article", {
7397
+ (d(!0), v(D, null, E(fc.value, (l) => (d(), v("article", {
7320
7398
  key: ee.value === "flow" ? `${l.id}-${l.stateId ?? "default"}-${l.flowRow}-${l.flowCol}` : `${l.id}-${l.stateId ?? "default"}`,
7321
7399
  class: A([
7322
7400
  l.platform === "pc" ? "desktop-shell" : "phone-shell",
@@ -7326,7 +7404,7 @@ Scope:${u}
7326
7404
  "flow-has-next": ee.value === "flow" && l.hasNext
7327
7405
  }
7328
7406
  ]),
7329
- style: Te(Kc(l))
7407
+ style: Ee(Kc(l))
7330
7408
  }, [
7331
7409
  e("div", {
7332
7410
  class: A(["prototype-preview-scaler", {
@@ -7334,11 +7412,11 @@ Scope:${u}
7334
7412
  "overview-desktop-scale": ee.value === "overview" && l.platform === "pc"
7335
7413
  }])
7336
7414
  }, [
7337
- ee.value === "interactive" && !me.value && l.platform === "mobile" && i(we).length && i(E) ? (d(), Me(Jd, {
7415
+ ee.value === "interactive" && !me.value && l.platform === "mobile" && i(we).length && i(T) ? (d(), Me(Jd, {
7338
7416
  key: 0,
7339
7417
  title: i(U)("prototypeStateSwitch"),
7340
7418
  options: i(we),
7341
- "active-id": i(E),
7419
+ "active-id": i(T),
7342
7420
  "count-for-state": (w) => i(Pu)(i(h), w),
7343
7421
  "highlighted-colors": i(Mn),
7344
7422
  onChange: s[23] || (s[23] = (w) => i(m)(i(h), w))
@@ -7361,7 +7439,7 @@ Scope:${u}
7361
7439
  e("div", Fb, [
7362
7440
  V(Lo, { screen: l }, null, 8, ["screen"]),
7363
7441
  ee.value === "interactive" && !me.value && !lt.value && i(B) === "annotations" && i(Le) ? (d(), v("div", Gb, [
7364
- (d(!0), v(D, null, T(i(Ft), (w, O) => {
7442
+ (d(!0), v(D, null, E(i(Ft), (w, O) => {
7365
7443
  var X;
7366
7444
  return d(), v("div", {
7367
7445
  key: w.id,
@@ -7371,7 +7449,7 @@ Scope:${u}
7371
7449
  "is-dragging": ((X = Pt.value) == null ? void 0 : X.id) === w.id,
7372
7450
  "is-syncing-position": Kn.value.has(w.id)
7373
7451
  }]),
7374
- style: Te(Ic(w)),
7452
+ style: Ee(Ic(w)),
7375
7453
  onMouseenter: (je) => Nc(w, je),
7376
7454
  onMouseleave: s[24] || (s[24] = //@ts-ignore
7377
7455
  (...je) => i(Ln) && i(Ln)(...je))
@@ -7384,15 +7462,15 @@ Scope:${u}
7384
7462
  onClick: Ce((je) => _c(w), ["stop"]),
7385
7463
  onPointerdown: Ce((je) => Dc(w, je), ["stop"]),
7386
7464
  onPointermove: Ac,
7387
- onPointerup: Ec,
7388
- onPointercancel: Tc
7465
+ onPointerup: Tc,
7466
+ onPointercancel: Ec
7389
7467
  }, c(O + 1), 41, Hb)
7390
7468
  ], 46, zb);
7391
7469
  }), 128)),
7392
7470
  gc.value ? (d(), v("div", {
7393
7471
  key: 0,
7394
7472
  class: "annotation-point-wrap draft",
7395
- style: Te(i(xl)(i(Z)))
7473
+ style: Ee(i(xl)(i(Z)))
7396
7474
  }, [...s[121] || (s[121] = [
7397
7475
  e("button", {
7398
7476
  class: "annotation-point",
@@ -7539,7 +7617,7 @@ Scope:${u}
7539
7617
  e("small", null, c(i(U)("annotationPollingUnit")), 1),
7540
7618
  e("button", {
7541
7619
  type: "button",
7542
- disabled: Number(i(Re)) === i(Ee),
7620
+ disabled: Number(i(Re)) === i(Te),
7543
7621
  onClick: s[41] || (s[41] = //@ts-ignore
7544
7622
  (...l) => i(wl) && i(wl)(...l))
7545
7623
  }, c(i(U)("annotationPollingSave")), 9, o1)
@@ -7548,7 +7626,7 @@ Scope:${u}
7548
7626
  i(F) ? (d(), v("p", s1, c(i(F)), 1)) : S("", !0),
7549
7627
  i(B) === "annotations" ? (d(), v("div", a1, [
7550
7628
  i(Ft).length ? S("", !0) : (d(), v("p", l1, c(i(U)("annotationEmpty")), 1)),
7551
- (d(!0), v(D, null, T(i(Ft), (l, w) => (d(), v("section", {
7629
+ (d(!0), v(D, null, E(i(Ft), (l, w) => (d(), v("section", {
7552
7630
  key: l.id,
7553
7631
  onMouseenter: (O) => Rc(l),
7554
7632
  onMouseleave: s[42] || (s[42] = //@ts-ignore
@@ -7584,7 +7662,7 @@ Scope:${u}
7584
7662
  ])) : (d(), v("div", p1, [
7585
7663
  i(Se) ? (d(), v(D, { key: 1 }, [
7586
7664
  Cs.value ? (d(), v("small", f1, c(Cs.value), 1)) : S("", !0),
7587
- (d(!0), v(D, null, T(xn.value, (l) => (d(), v("section", {
7665
+ (d(!0), v(D, null, E(xn.value, (l) => (d(), v("section", {
7588
7666
  key: l.id
7589
7667
  }, [
7590
7668
  e("h3", null, c(l.label), 1),
@@ -7657,11 +7735,11 @@ Scope:${u}
7657
7735
  }, "×")
7658
7736
  ]),
7659
7737
  e("div", b1, [
7660
- (d(!0), v(D, null, T(ta.value, (l) => (d(), v("section", {
7738
+ (d(!0), v(D, null, E(ta.value, (l) => (d(), v("section", {
7661
7739
  key: l.id
7662
7740
  }, [
7663
7741
  e("h3", null, c(l.title), 1),
7664
- (d(!0), v(D, null, T(l.items, (w) => (d(), v("div", {
7742
+ (d(!0), v(D, null, E(l.items, (w) => (d(), v("div", {
7665
7743
  key: w.name,
7666
7744
  class: A(["environment-check-row", { missing: !w.configured }])
7667
7745
  }, [
@@ -7692,12 +7770,12 @@ Scope:${u}
7692
7770
  e("strong", null, "当前面板快捷键"),
7693
7771
  e("span", null, "输入内容时自动停用")
7694
7772
  ], -1)),
7695
- (d(), v(D, null, T(ci, (l) => e("section", {
7773
+ (d(), v(D, null, E(ci, (l) => e("section", {
7696
7774
  key: l.title,
7697
7775
  class: "shortcut-group"
7698
7776
  }, [
7699
7777
  e("h3", null, c(l.title), 1),
7700
- (d(!0), v(D, null, T(l.items, (w) => (d(), v("div", {
7778
+ (d(!0), v(D, null, E(l.items, (w) => (d(), v("div", {
7701
7779
  key: w.key,
7702
7780
  class: "shortcut-row"
7703
7781
  }, [
@@ -7707,13 +7785,13 @@ Scope:${u}
7707
7785
  ])), 64))
7708
7786
  ], 64))
7709
7787
  ], 2)) : S("", !0),
7710
- V(Ta, { name: "shortcut-toast" }, {
7788
+ V(Ea, { name: "shortcut-toast" }, {
7711
7789
  default: Na(() => [
7712
7790
  le.value === "prototype" && la.value && !me.value && !lt.value ? (d(), v("div", S1, " 按快捷键 P 可以进入/退出演示模式 ")) : S("", !0)
7713
7791
  ]),
7714
7792
  _: 1
7715
7793
  }),
7716
- V(Ta, { name: "shortcut-toast" }, {
7794
+ V(Ea, { name: "shortcut-toast" }, {
7717
7795
  default: Na(() => [
7718
7796
  ia.value && !me.value && !lt.value ? (d(), v("div", C1, " 还未配置产品文档地址,请在 PrototypeProductDefinition.document.url 中配置 ")) : S("", !0)
7719
7797
  ]),
@@ -7748,7 +7826,7 @@ Scope:${u}
7748
7826
  i(Se) ? Cs.value ? (d(), v("small", $1, c(Cs.value), 1)) : S("", !0) : (d(), v("p", I1, c(i(U)("pageDescriptionEmpty")), 1)),
7749
7827
  e("div", _1, [
7750
7828
  e("div", P1, [
7751
- (d(), v(D, null, T(Wl, (l) => e("button", {
7829
+ (d(), v(D, null, E(Wl, (l) => e("button", {
7752
7830
  key: l.source,
7753
7831
  type: "button",
7754
7832
  class: A({ active: i(te) === l.source }),
@@ -7767,7 +7845,7 @@ Scope:${u}
7767
7845
  class: "page-description-editor-fields",
7768
7846
  disabled: i(te) === "local-seed"
7769
7847
  }, [
7770
- e("label", E1, [
7848
+ e("label", T1, [
7771
7849
  N(e("input", {
7772
7850
  "onUpdate:modelValue": s[49] || (s[49] = (l) => i($).highlighted = l),
7773
7851
  type: "checkbox"
@@ -7776,14 +7854,14 @@ Scope:${u}
7776
7854
  ]),
7777
7855
  s[125] || (s[125] = e("span", null, "重点标注当前状态页", -1))
7778
7856
  ]),
7779
- i($).highlighted ? (d(), v("section", T1, [
7857
+ i($).highlighted ? (d(), v("section", E1, [
7780
7858
  s[126] || (s[126] = e("span", null, "标记颜色", -1)),
7781
7859
  e("div", N1, [
7782
- (d(!0), v(D, null, T([...El, ...ds.value], (l) => (d(), v("button", {
7860
+ (d(!0), v(D, null, E([...Tl, ...ds.value], (l) => (d(), v("button", {
7783
7861
  key: l,
7784
7862
  type: "button",
7785
7863
  class: A({ active: i($).highlightColor === l }),
7786
- style: Te({ backgroundColor: l }),
7864
+ style: Ee({ backgroundColor: l }),
7787
7865
  "aria-label": `选择颜色 ${l}`,
7788
7866
  title: l,
7789
7867
  onClick: (w) => nc(l)
@@ -7919,7 +7997,7 @@ Scope:${u}
7919
7997
  le.value === "prototype" && i(on) && !me.value && !lt.value ? (d(), v("div", {
7920
7998
  key: 9,
7921
7999
  class: "annotation-popover annotation-floating-popover",
7922
- style: Te($c.value),
8000
+ style: Ee($c.value),
7923
8001
  onMouseenter: s[61] || (s[61] = //@ts-ignore
7924
8002
  (...l) => i(gl) && i(gl)(...l)),
7925
8003
  onMouseleave: s[62] || (s[62] = //@ts-ignore
@@ -7979,11 +8057,11 @@ Scope:${u}
7979
8057
  e("section", q1, [
7980
8058
  s[132] || (s[132] = e("span", null, "注释点颜色", -1)),
7981
8059
  e("div", Q1, [
7982
- (d(!0), v(D, null, T([...i(Tl), ...ko.value], (l) => (d(), v("button", {
8060
+ (d(!0), v(D, null, E([...i(El), ...ko.value], (l) => (d(), v("button", {
7983
8061
  key: l,
7984
8062
  type: "button",
7985
8063
  class: A({ active: i(Z).color === l }),
7986
- style: Te({ backgroundColor: l }),
8064
+ style: Ee({ backgroundColor: l }),
7987
8065
  "aria-label": `选择颜色 ${l}`,
7988
8066
  title: l,
7989
8067
  onClick: (w) => Qs(l, "draft")
@@ -8070,11 +8148,11 @@ Scope:${u}
8070
8148
  i(G) === "edit" ? (d(), v("section", cw, [
8071
8149
  s[133] || (s[133] = e("span", null, "注释点颜色", -1)),
8072
8150
  e("div", dw, [
8073
- (d(!0), v(D, null, T([...i(Tl), ...ko.value], (l) => (d(), v("button", {
8151
+ (d(!0), v(D, null, E([...i(El), ...ko.value], (l) => (d(), v("button", {
8074
8152
  key: l,
8075
8153
  type: "button",
8076
8154
  class: A({ active: i(de).color === l }),
8077
- style: Te({ backgroundColor: l }),
8155
+ style: Ee({ backgroundColor: l }),
8078
8156
  "aria-label": `选择颜色 ${l}`,
8079
8157
  title: l,
8080
8158
  onClick: (w) => Qs(l, "editor")
@@ -8160,7 +8238,7 @@ Scope:${u}
8160
8238
  }, "反选")
8161
8239
  ]),
8162
8240
  e("div", null, [
8163
- (d(!0), v(D, null, T(xn.value, (l) => (d(), v("label", {
8241
+ (d(!0), v(D, null, E(xn.value, (l) => (d(), v("label", {
8164
8242
  key: l.id
8165
8243
  }, [
8166
8244
  e("input", {
@@ -8173,7 +8251,7 @@ Scope:${u}
8173
8251
  ])
8174
8252
  ]),
8175
8253
  e("div", Cw, [
8176
- ks.value.length ? (d(!0), v(D, { key: 1 }, T(ks.value, (l) => (d(), v("p", {
8254
+ ks.value.length ? (d(!0), v(D, { key: 1 }, E(ks.value, (l) => (d(), v("p", {
8177
8255
  key: l.id
8178
8256
  }, [
8179
8257
  e("b", null, c(l.label) + ":", 1),
@@ -8221,7 +8299,7 @@ Scope:${u}
8221
8299
  ]),
8222
8300
  So.value === "overview" ? (d(), v(D, { key: 0 }, [
8223
8301
  e("div", Dw, [
8224
- (d(!0), v(D, null, T(Uc.value, (l) => (d(), v("section", {
8302
+ (d(!0), v(D, null, E(Uc.value, (l) => (d(), v("section", {
8225
8303
  key: l.label
8226
8304
  }, [
8227
8305
  e("span", null, c(l.label), 1),
@@ -8230,12 +8308,12 @@ Scope:${u}
8230
8308
  ]))), 128))
8231
8309
  ]),
8232
8310
  e("div", Aw, [
8233
- e("div", Ew, [
8311
+ e("div", Tw, [
8234
8312
  s[137] || (s[137] = e("p", null, "问题清单", -1)),
8235
8313
  e("span", null, c(ti.value.filter((l) => l.tone !== "success").length) + " 个待关注项", 1)
8236
8314
  ]),
8237
- e("div", Tw, [
8238
- (d(!0), v(D, null, T(ti.value, (l) => (d(), v("section", {
8315
+ e("div", Ew, [
8316
+ (d(!0), v(D, null, E(ti.value, (l) => (d(), v("section", {
8239
8317
  key: l.title,
8240
8318
  class: A(`is-${l.tone}`)
8241
8319
  }, [
@@ -8263,7 +8341,7 @@ Scope:${u}
8263
8341
  ])
8264
8342
  ], -1)),
8265
8343
  e("tbody", null, [
8266
- (d(!0), v(D, null, T(Qn.value, (l) => (d(), v("tr", {
8344
+ (d(!0), v(D, null, E(Qn.value, (l) => (d(), v("tr", {
8267
8345
  key: l.id,
8268
8346
  class: A({ "has-gap": l.describedCount < l.stateCount || !l.inFlow })
8269
8347
  }, [
@@ -8301,7 +8379,7 @@ Scope:${u}
8301
8379
  }, " × ")
8302
8380
  ]),
8303
8381
  e("div", Mw, [
8304
- (d(!0), v(D, null, T(i(ys), (l) => (d(), v("section", {
8382
+ (d(!0), v(D, null, E(i(ys), (l) => (d(), v("section", {
8305
8383
  key: l.hash,
8306
8384
  class: "overflow-hidden rounded-[16px] bg-soft transition"
8307
8385
  }, [
@@ -8323,7 +8401,7 @@ Scope:${u}
8323
8401
  ], 8, Vw),
8324
8402
  bs.value === l.hash ? (d(), v("div", Kw, [
8325
8403
  li(l).length ? (d(), v("div", Jw, [
8326
- (d(!0), v(D, null, T(li(l), (w) => (d(), v("p", {
8404
+ (d(!0), v(D, null, E(li(l), (w) => (d(), v("p", {
8327
8405
  key: `${l.hash}-${w}`,
8328
8406
  class: "rounded-[12px] bg-panel px-3 py-2 text-xs leading-5 text-muted"
8329
8407
  }, c(w), 1))), 128))
@@ -8366,7 +8444,7 @@ Scope:${u}
8366
8444
  [z, Io.value]
8367
8445
  ]),
8368
8446
  e("div", Zw, [
8369
- (d(!0), v(D, null, T(mc.value, (l) => (d(), v("section", {
8447
+ (d(!0), v(D, null, E(mc.value, (l) => (d(), v("section", {
8370
8448
  key: l.screen.id,
8371
8449
  class: "mobile-page-picker-item"
8372
8450
  }, [
@@ -8376,22 +8454,22 @@ Scope:${u}
8376
8454
  onClick: (w) => l.states.length ? hd(l.screen.id) : yd(l.screen.id)
8377
8455
  }, [
8378
8456
  e("span", Qw, c(l.screen.code), 1),
8379
- e("span", e0, [
8457
+ e("span", eS, [
8380
8458
  e("b", null, c(l.screen.title), 1),
8381
8459
  e("small", null, c(l.screen.subtitle), 1)
8382
8460
  ]),
8383
- l.states.length ? (d(), v("span", t0, c(l.states.length), 1)) : S("", !0)
8461
+ l.states.length ? (d(), v("span", tS, c(l.states.length), 1)) : S("", !0)
8384
8462
  ], 10, qw),
8385
- l.states.length && (l.forceExpanded || vs.value.has(l.screen.id)) ? (d(), v("div", n0, [
8386
- (d(!0), v(D, null, T(l.states, (w) => (d(), v("button", {
8463
+ l.states.length && (l.forceExpanded || vs.value.has(l.screen.id)) ? (d(), v("div", nS, [
8464
+ (d(!0), v(D, null, E(l.states, (w) => (d(), v("button", {
8387
8465
  key: w.id,
8388
8466
  type: "button",
8389
- class: A({ active: i(h) === l.screen.id && i(E) === w.id }),
8467
+ class: A({ active: i(h) === l.screen.id && i(T) === w.id }),
8390
8468
  onClick: (O) => bd(l.screen.id, w.id)
8391
8469
  }, [
8392
8470
  s[142] || (s[142] = e("span", null, null, -1)),
8393
8471
  K(" " + c(w.label), 1)
8394
- ], 10, o0))), 128))
8472
+ ], 10, oS))), 128))
8395
8473
  ])) : S("", !0)
8396
8474
  ]))), 128))
8397
8475
  ])
@@ -8456,5 +8534,5 @@ Scope:${u}
8456
8534
  }
8457
8535
  });
8458
8536
  export {
8459
- c0 as default
8537
+ cS as default
8460
8538
  };