contactsheet 0.1.1 → 0.1.2

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.
@@ -2571,8 +2571,17 @@ ${board.entry.kind} \xB7 ${board.entry.id}`);
2571
2571
  const boot2 = qs("#cs-boot");
2572
2572
  boot2.textContent = "";
2573
2573
  const card = h("div", "cs-card");
2574
- const compileErr = /HTTP 5\d\d/.test(String(err));
2575
- if (compileErr) {
2574
+ const msg = String(err);
2575
+ const target = state.info?.target ?? "http://localhost:3000";
2576
+ if (/HTTP 50[24]/.test(msg)) {
2577
+ card.appendChild(h("h2", void 0, "\u8FDE\u4E0D\u4E0A\u4F60\u7684 dev server"));
2578
+ card.appendChild(
2579
+ h("p", void 0, `\u5916\u58F3\u6B63\u628A\u8BF7\u6C42\u4EE3\u7406\u5230 ${target},\u4F46\u90A3\u91CC\u6CA1\u6709\u54CD\u5E94\u3002\u4E24\u79CD\u53EF\u80FD:dev server \u8FD8\u6CA1\u8D77;\u6216\u5B83\u8DD1\u5728\u522B\u7684\u7AEF\u53E3(\u53BB package.json \u7684 dev script \u770B\u771F\u5B9E\u7AEF\u53E3,\u6539 contactsheet.config.json \u7684 target,\u6216\u91CD\u542F\u65F6\u52A0 --target)\u3002`)
2580
+ );
2581
+ const p = h("p");
2582
+ p.appendChild(h("code", void 0, "pnpm dev"));
2583
+ card.appendChild(p);
2584
+ } else if (/HTTP 5\d\d/.test(msg)) {
2576
2585
  card.appendChild(h("h2", void 0, "\u753B\u677F\u6587\u4EF6\u7F16\u8BD1\u9519\u8BEF"));
2577
2586
  card.appendChild(
2578
2587
  h("p", void 0, "next dev \u5728\u8DD1,\u4F46\u753B\u677F\u6CE8\u518C\u8868\u6A21\u5757\u6E32\u67D3\u5931\u8D25 \u2014\u2014 \u901A\u5E38\u662F\u67D0\u4E2A *.artboard.tsx \u6709\u8BED\u6CD5\u6216 import \u9519\u8BEF\u3002\u53BB next dev \u7684\u7EC8\u7AEF\u770B\u5177\u4F53\u62A5\u9519,\u4FEE\u597D\u540E\u8FD9\u9762\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002")
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/canvas/api.ts", "../../src/canvas/dom.ts", "../../src/canvas/state.ts", "../../src/canvas/hud.ts", "../../src/canvas/args-panel.ts", "../../src/canvas/toast.ts", "../../src/canvas/refs.ts", "../../src/canvas/select.ts", "../../src/canvas/pins.ts", "../../src/canvas/view.ts", "../../src/canvas/modes.ts", "../../src/canvas/wall.ts", "../../src/canvas/sidebar.ts", "../../src/canvas/app.ts"],
4
- "sourcesContent": ["// \u5916\u58F3 API \u5C01\u88C5 + SSE \u8FDE\u63A5\u3002\u6240\u6709\u8DEF\u5F84\u90FD\u5728 /__cs \u524D\u7F00\u4E0B\nimport type { Annotation, RegistryEntry, Selection, StateInfo, CsEvent } from \"../types.js\"\n\nconst BASE = \"/__cs\"\n\nasync function req<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, init)\n if (!res.ok) throw new Error(`${init?.method ?? \"GET\"} ${url} \u2192 HTTP ${res.status}`)\n const text = await res.text()\n return (text ? JSON.parse(text) : null) as T\n}\n\nfunction jsonInit(method: string, body: unknown): RequestInit {\n return { method, headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(body) }\n}\n\nexport function fetchState(): Promise<StateInfo> {\n return req<StateInfo>(`${BASE}/api/state`)\n}\n\n/** registry \u7531\u6CE8\u5165\u5230 Next \u91CC\u7684\u8DEF\u7531\u63D0\u4F9B(\u5916\u58F3\u76F4\u63A5\u4EE3\u7406\u653E\u884C) */\nexport function fetchRegistry(): Promise<RegistryEntry[]> {\n return req<RegistryEntry[]>(`${BASE}/registry`)\n}\n\nexport function fetchAnnotations(): Promise<Annotation[]> {\n return req<Annotation[]>(`${BASE}/api/annotations`)\n}\n\nexport function postSelection(sel: Selection): Promise<void> {\n return req<void>(`${BASE}/api/selection`, jsonInit(\"POST\", sel))\n}\n\n/** \u65B0\u5EFA\u6279\u6CE8:\u4E0D\u5E26 id/createdAt,\u670D\u52A1\u7AEF\u751F\u6210 */\nexport function createAnnotation(body: {\n artboardId?: string\n anchor?: { selector: string; x: number; y: number }\n text: string\n refs: string[]\n status: \"open\" | \"resolved\"\n}): Promise<Annotation> {\n return req<Annotation>(`${BASE}/api/annotations`, jsonInit(\"POST\", body))\n}\n\nexport async function deleteAnnotation(id: string): Promise<void> {\n const res = await fetch(`${BASE}/api/annotations/${encodeURIComponent(id)}`, { method: \"DELETE\" })\n if (!res.ok) throw new Error(`DELETE annotation \u2192 HTTP ${res.status}`)\n}\n\nexport interface PushChooseItem {\n pid: number\n name: string\n status: string\n cwd: string\n}\nexport type PushResponse =\n | { ok: true; pid: number; name: string }\n | { ok: false; reason?: string; choose?: PushChooseItem[] }\n\n/** \u4E00\u952E\u63A8\u9001:\u6CE8\u5165\u7ED1\u5B9A\u7684 Claude Code \u4F1A\u8BDD;\u591A\u5019\u9009\u65F6\u670D\u52A1\u7AEF\u8FD4\u56DE choose \u5217\u8868\u8BA9\u524D\u7AEF\u51FA\u9009\u62E9\u5668 */\nexport async function pushContext(pid?: number): Promise<PushResponse> {\n // token \u7531\u670D\u52A1\u7AEF\u6CE8\u5165\u753B\u5E03\u9875\u7684 <meta>,iframe \u91CC\u7684\u7528\u6237\u9875\u9762\u62FF\u4E0D\u5230,\u5192\u7528\u4E0D\u4E86\n const token = document.querySelector<HTMLMetaElement>('meta[name=\"cs-token\"]')?.content ?? \"\"\n const res = await fetch(`${BASE}/api/push`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-cs-token\": token },\n body: JSON.stringify(pid !== undefined ? { pid } : {}),\n })\n if (!res.ok) throw new Error(`POST push \u2192 HTTP ${res.status}`)\n return res.json() as Promise<PushResponse>\n}\n\n/** hook \u6CE8\u5165\u7EC8\u7AEF\u7528\u7684\u540C\u4E00\u4EFD\u6587\u672C\u6458\u8981 \u2014\u2014 \u590D\u5236\u6279\u6CE8\u6309\u94AE\u76F4\u63A5\u590D\u7528,\u4FDD\u8BC1\u4E24\u6761\u901A\u9053\u683C\u5F0F\u4E00\u81F4 */\nexport async function fetchContext(): Promise<string> {\n const res = await fetch(`${BASE}/api/context`)\n if (!res.ok) throw new Error(`GET context \u2192 HTTP ${res.status}`)\n return res.text()\n}\n\nexport function patchAnnotation(id: string, patch: Partial<Annotation>): Promise<Annotation> {\n return req<Annotation>(`${BASE}/api/annotations/${encodeURIComponent(id)}`, jsonInit(\"PATCH\", patch))\n}\n\nexport function postRef(name: string, dataBase64: string): Promise<{ path: string }> {\n return req<{ path: string }>(`${BASE}/api/refs`, jsonInit(\"POST\", { name, dataBase64 }))\n}\n\n/** \u53C2\u8003\u56FE\u7684\u53D6\u56FE\u5730\u5740(repo \u76F8\u5BF9\u8DEF\u5F84 \u2192 \u5916\u58F3 URL)\u3002\n * \u26A0\uFE0F \u9700\u8981\u5916\u58F3\u8865\u4E00\u6761 `GET /__cs/api/refs/<repo \u76F8\u5BF9\u8DEF\u5F84>` \u8DEF\u7531(\u89C1\u5B8C\u6210\u62A5\u544A);\u8FD8\u6CA1\u6709\u8FD9\u6761\u8DEF\u7531\u65F6\n * <img> \u4F1A 404 \u2014\u2014 \u7F29\u7565\u56FE\u81EA\u5DF1\u4F1A\u9000\u5316\u6210\u6587\u4EF6\u540D chip,\u4E0D\u4F1A\u53D8\u6210\u7834\u56FE\u6807\u3002 */\nexport function refUrl(path: string): string {\n return `${BASE}/api/refs/${path.split(\"/\").map(encodeURIComponent).join(\"/\")}`\n}\n\n/** \u753B\u677F iframe \u7684 URL:component \u8D70\u6CE8\u5165\u8DEF\u7531,screen \u76F4\u63A5\u8D70\u4EE3\u7406\u5230\u76EE\u6807\u9875\u9762 */\nexport function boardUrl(entry: RegistryEntry, args: Record<string, unknown> | null): string {\n if (entry.kind === \"screen\") return entry.url || \"/\"\n const base = `${BASE}/ab/${encodeURIComponent(entry.id)}`\n if (!args) return base\n return `${base}?args=${encodeURIComponent(JSON.stringify(args))}`\n}\n\n/** \u8FDE SSE:\u4E8B\u4EF6\u540D = CsEvent.type,data = JSON */\nexport function connectEvents(on: {\n registry(entries: RegistryEntry[]): void\n annotations(list: Annotation[]): void\n}): EventSource {\n const es = new EventSource(`${BASE}/events`)\n const dispatch = (raw: unknown) => {\n if (typeof raw !== \"string\") return\n let ev: CsEvent\n try {\n ev = JSON.parse(raw) as CsEvent\n } catch {\n return\n }\n if (ev.type === \"registry\") on.registry(ev.entries ?? [])\n else if (ev.type === \"annotations\") on.annotations(ev.annotations ?? [])\n }\n es.addEventListener(\"registry\", (e) => dispatch((e as MessageEvent<string>).data))\n es.addEventListener(\"annotations\", (e) => dispatch((e as MessageEvent<string>).data))\n // \u6CA1\u5E26 event \u540D\u7684\u6D88\u606F\u4E5F\u8BA4(data \u91CC\u6709 type)\n es.onmessage = (e) => dispatch(e.data)\n return es\n}\n", "// \u753B\u5E03\u7528\u7684\u6781\u5C0F DOM \u5DE5\u5177,\u4E0D\u5F15\u4EFB\u4F55\u8FD0\u884C\u65F6\u4F9D\u8D56\n\n/** \u5EFA\u5143\u7D20:h(\"div\", \"cls\", \"\u6587\u672C\") */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n cls?: string,\n text?: string\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (cls) el.className = cls\n if (text !== undefined) el.textContent = text\n return el\n}\n\n/** \u53D6\u5FC5\u7136\u5B58\u5728\u7684\u5143\u7D20(\u9AA8\u67B6\u5728 index.html \u91CC),\u627E\u4E0D\u5230\u76F4\u63A5\u629B,\u514D\u5F97\u5230\u5904\u5224\u7A7A */\nexport function qs<T extends Element = HTMLElement>(sel: string): T {\n const el = document.querySelector(sel)\n if (!el) throw new Error(`canvas: \u7F3A\u5C11\u9AA8\u67B6\u5143\u7D20 ${sel}`)\n return el as unknown as T\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v\n}\n\n/** \u5C3E\u90E8\u53BB\u6296 */\nexport function debounce<A extends unknown[]>(ms: number, fn: (...args: A) => void) {\n let timer: ReturnType<typeof setTimeout> | undefined\n return (...args: A) => {\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(() => fn(...args), ms)\n }\n}\n\n/** \u540C\u6E90 iframe \u7684 document,\u62FF\u4E0D\u5230(\u672A\u52A0\u8F7D/\u5F02\u5E38)\u8FD4\u56DE null */\nexport function frameDoc(iframe: HTMLIFrameElement | null): Document | null {\n if (!iframe) return null\n try {\n return iframe.contentDocument\n } catch {\n return null\n }\n}\n", "// \u753B\u5E03\u7684\u5168\u5C40\u53EF\u53D8\u72B6\u6001 \u2014\u2014 \u53EA\u653E\u6570\u636E,\u4E0D import \u5176\u5B83\u753B\u5E03\u6A21\u5757(\u907F\u514D\u73AF)\nimport type { Annotation, RegistryEntry, Selection, StateInfo } from \"../types.js\"\n\nexport type Mode = \"browse\" | \"interact\" | \"review\"\n\n/** \u4E00\u5757\u753B\u677F\u7684\u8FD0\u884C\u65F6\u5BF9\u8C61 */\nexport interface Board {\n entry: RegistryEntry\n /** \u5916\u5C42 .cs-board */\n el: HTMLDivElement\n titleEl: HTMLDivElement\n nameEl: HTMLSpanElement\n badgeEl: HTMLSpanElement\n argsCountEl: HTMLSpanElement\n /** .cs-frame,\u5C3A\u5BF8\u5199\u5728\u5B83\u8EAB\u4E0A */\n frameEl: HTMLDivElement\n overlayEl: HTMLDivElement\n pinLayerEl: HTMLDivElement\n placeholderEl: HTMLDivElement\n iframe: HTMLIFrameElement | null\n width: number\n height: number\n /** \u7528\u6237\u5728 args \u9762\u677F\u6539\u8FC7\u7684 args;null = \u7528\u753B\u677F\u81EA\u5DF1\u7684\u9ED8\u8BA4\u503C */\n argsOverride: Record<string, unknown> | null\n}\n\nexport const state = {\n info: null as StateInfo | null,\n entries: [] as RegistryEntry[],\n boards: new Map<string, Board>(),\n /** file \u2192 \u8BE5\u7EC4\u5185\u753B\u677F id \u7684\u7A33\u5B9A\u987A\u5E8F(\u5DF2\u6709 id \u4E0D\u52A8,\u65B0 id \u6392\u7EC4\u5C3E) */\n order: new Map<string, string[]>(),\n annotations: [] as Annotation[],\n\n mode: \"browse\" as Mode,\n /** \u8FDB\u8D70\u67E5\u524D\u7684\u6A21\u5F0F,Esc \u9010\u7EA7\u9000\u56DE */\n modeBeforeReview: \"browse\" as Mode,\n /** \u8D70\u67E5\u524D\u7684\u89C6\u56FE,\u9000\u51FA\u65F6\u8FD8\u539F */\n viewBeforeReview: null as { scale: number; tx: number; ty: number } | null,\n\n /** \u5F53\u524D\u6D3B\u52A8\u753B\u677F(hover/\u70B9\u51FB/\u53CC\u51FB\u90FD\u4F1A\u66F4\u65B0),Enter \u8D70\u67E5\u7684\u5C31\u662F\u5B83 */\n activeId: null as string | null,\n selection: null as Selection | null,\n /** \u6309\u4E86 c\u3001\u7B49\u7740\u70B9\u5143\u7D20\u843D pin */\n pinPending: false,\n pinnedThisRun: 0,\n\n scale: 1,\n tx: 284, // \u7ED9\u5DE6\u4FA7\u680F\u8BA9\u4F4D(\u4FA7\u680F 236 + \u8FB9\u8DDD)\n ty: 48,\n}\n", "// \u5DE6\u4E0B\u89D2 HUD:\u6A21\u5F0F\u6307\u793A + \u53CD\u67E5\u4FE1\u606F\u884C\nimport { qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\n\nlet modeEl: HTMLElement\nlet probeEl: HTMLElement\n\nconst MODE_LABEL: Record<string, string> = { browse: \"\u6D4F\u89C8\", interact: \"\u4EA4\u4E92\", review: \"\u8D70\u67E5\" }\n\nexport function initHud(): void {\n modeEl = qs(\"#cs-mode\")\n probeEl = qs(\"#cs-probe\")\n syncHud()\n}\n\nexport function syncHud(): void {\n // \u6279\u6CE8\u6A21\u5F0F\u4E0B\u5E26\u4E0A\u672C\u8F6E\u8BA1\u6570,\u8BA9\"\u53EF\u4EE5\u8FDE\u9489\"\u8FD9\u4EF6\u4E8B\u81EA\u5DF1\u8BF4\u51FA\u6765\n const n = state.pinPending ? state.pinnedThisRun : 0\n modeEl.textContent = state.pinPending\n ? n > 0\n ? `\u6279\u6CE8\u4E2D \u00B7 \u5DF2\u9489 ${n}`\n : \"\u6279\u6CE8\u4E2D\"\n : MODE_LABEL[state.mode]\n document.body.dataset.mode = state.mode\n document.body.dataset.pin = state.pinPending ? \"on\" : \"off\"\n}\n\n/** \u4FE1\u606F\u884C:hover \u53CD\u67E5\u7ED3\u679C / \u64CD\u4F5C\u56DE\u6267 */\nexport function setProbe(text: string): void {\n probeEl.textContent = text\n}\n", "// \u53F3\u4FA7 args \u9762\u677F:\u8BFB iframe \u91CC\u7684 #__cs_meta,\u6309\u503C\u7C7B\u578B\u51FA\u63A7\u4EF6,\u6539\u52A8\u53BB\u6296\u540E\u91CD\u8F7D iframe\nimport { boardUrl } from \"./api.js\"\nimport { debounce, frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet panel: HTMLElement\nlet openId: string | null = null\n/** \u6BCF\u4E2A\u5B57\u6BB5\u4E00\u4E2A\u8BFB\u503C\u51FD\u6570,\u8FD4\u56DE undefined \u8868\u793A\u8FD9\u6B21\u5148\u522B\u6539(\u6BD4\u5982 JSON \u6CA1\u5199\u5B8C) */\nlet readers: Array<{ key: string; read(): unknown }> = []\n\nexport function initArgsPanel(): void {\n panel = qs(\"#cs-args\")\n}\n\n/** \u4ECE\u753B\u677F iframe \u91CC\u8BFB __cs_meta;\u8BFB\u4E0D\u5230\u5C31\u9000\u56DE registry \u4E0A\u7684\u9ED8\u8BA4 args */\nfunction readMeta(board: Board): Record<string, unknown> | null {\n const doc = frameDoc(board.iframe)\n const node = doc?.getElementById(\"__cs_meta\")\n if (node?.textContent) {\n try {\n const meta = JSON.parse(node.textContent) as { args?: Record<string, unknown> }\n if (meta && typeof meta === \"object\" && meta.args && typeof meta.args === \"object\") return meta.args\n } catch {\n /* \u843D\u5230\u4E0B\u9762\u7684\u515C\u5E95 */\n }\n }\n return board.argsOverride ?? board.entry.args ?? null\n}\n\nexport function closeArgsPanel(): void {\n openId = null\n readers = []\n panel.hidden = true\n panel.textContent = \"\"\n document.body.dataset.args = \"closed\"\n}\n\nexport function isArgsOpen(id: string): boolean {\n return openId === id\n}\n\nexport function openArgsPanel(board: Board): void {\n openId = board.entry.id\n readers = []\n panel.textContent = \"\"\n panel.hidden = false\n document.body.dataset.args = \"open\"\n\n const head = h(\"div\", \"cs-args-head\")\n const title = h(\"div\", \"cs-args-title\", board.entry.exportName)\n const close = h(\"button\", \"cs-x\", \"\u2715\")\n close.title = \"\u5173\u95ED\"\n close.addEventListener(\"click\", closeArgsPanel)\n head.append(title, close)\n\n const sub = h(\"div\", \"cs-args-sub\", `${board.entry.file}\\n${board.entry.kind} \u00B7 ${board.entry.id}`)\n const body = h(\"div\", \"cs-args-body\")\n\n const args = readMeta(board)\n const keys = args ? Object.keys(args) : []\n if (!args || keys.length === 0) {\n body.appendChild(\n h(\n \"div\",\n \"cs-args-empty\",\n board.entry.kind === \"screen\"\n ? \"screen \u753B\u677F\u6CA1\u6709 args(\u5B83\u76F4\u63A5\u6E32\u67D3\u76EE\u6807\u9875\u9762)\u3002\"\n : \"\u8FD9\u4E2A\u753B\u677F\u6CA1\u6709\u58F0\u660E args\u3002\u5728 .artboard.tsx \u91CC\u52A0 args: { \u2026 } \u5C31\u80FD\u5728\u8FD9\u91CC\u8C03\u3002\"\n )\n )\n } else {\n for (const key of keys) body.appendChild(field(key, args[key]))\n }\n\n const foot = h(\"div\", \"cs-args-foot\")\n const save = h(\"button\", undefined, \"\u5B58\u4E3A\u753B\u677F\")\n save.disabled = true\n save.title = \"v1 \u672A\u5B9E\u73B0:\u6539\u597D\u7684 args \u8BF7\u624B\u52A8\u5199\u56DE .artboard.tsx \u65B0\u589E\u4E00\u4E2A export\"\n foot.appendChild(save)\n\n panel.append(head, sub, body, foot)\n}\n\nconst applySoon = debounce(300, () => {\n if (!openId) return\n const board = state.boards.get(openId)\n if (!board) return\n const next: Record<string, unknown> = { ...(readMeta(board) ?? {}) }\n for (const f of readers) {\n const v = f.read()\n if (v === undefined) return // \u6709\u5B57\u6BB5\u8FD8\u4E0D\u5408\u6CD5,\u6574\u6279\u4E0D\u53D1\n next[f.key] = v\n }\n board.argsOverride = next\n const url = boardUrl(board.entry, next)\n const win = board.iframe?.contentWindow\n if (win) win.location.replace(url)\n else if (board.iframe) board.iframe.src = url\n if (board.iframe) board.iframe.dataset.csUrl = url\n setProbe(`args \u5DF2\u5E94\u7528:${url.slice(0, 70)}`)\n})\n\nfunction field(key: string, value: unknown): HTMLElement {\n const wrap = h(\"div\", \"cs-field\")\n\n if (typeof value === \"boolean\") {\n wrap.classList.add(\"is-bool\")\n const label = h(\"label\")\n const input = h(\"input\")\n input.type = \"checkbox\"\n input.checked = value\n input.dataset.key = key\n label.append(input, h(\"span\", undefined, key))\n wrap.appendChild(label)\n readers.push({ key, read: () => input.checked })\n input.addEventListener(\"change\", applySoon)\n return wrap\n }\n\n if (typeof value === \"number\") {\n wrap.appendChild(h(\"label\", undefined, key))\n const input = h(\"input\")\n input.type = \"number\"\n input.value = String(value)\n wrap.appendChild(input)\n readers.push({\n key,\n read: () => {\n const n = Number(input.value)\n return input.value.trim() === \"\" || Number.isNaN(n) ? undefined : n\n },\n })\n input.addEventListener(\"input\", applySoon)\n return wrap\n }\n\n if (typeof value === \"string\") {\n wrap.appendChild(h(\"label\", undefined, key))\n const input = h(\"input\")\n input.type = \"text\"\n input.value = value\n wrap.appendChild(input)\n readers.push({ key, read: () => input.value })\n input.addEventListener(\"input\", applySoon)\n return wrap\n }\n\n // \u5176\u4F59\u7C7B\u578B(\u5BF9\u8C61/\u6570\u7EC4/null)\u8D70 JSON \u6587\u672C\u6846\n wrap.appendChild(h(\"label\", undefined, `${key} (JSON)`))\n const ta = h(\"textarea\")\n ta.value = JSON.stringify(value ?? null, null, 2)\n wrap.appendChild(ta)\n readers.push({\n key,\n read: () => {\n try {\n return JSON.parse(ta.value) as unknown\n } catch {\n ta.style.borderColor = \"var(--cs-danger)\"\n return undefined\n }\n },\n })\n ta.addEventListener(\"input\", () => {\n ta.style.borderColor = \"\"\n applySoon()\n })\n return wrap\n}\n", "// \u4E00\u6B21\u6027\u56DE\u6267\u901A\u9053\u3002\u4EE5\u524D\u6240\u6709\u7ED3\u679C\u90FD\u5199\u8FDB\u5DE6\u4E0B\u89D2 HUD \u7684 probe \u884C\u2014\u2014\u90A3\u884C\u540C\u65F6\u8FD8\u662F\n// hover \u53CD\u67E5\u7684\u5B9E\u65F6\u8BFB\u6570,\u9F20\u6807\u4E00\u52A8\u5C31\u628A\"\u5DF2\u63A8\u9001\u7ED9 X\"\u64E6\u6389\u4E86\u3002\n// \u89C4\u5219:probe \u53EA\u7559\u6301\u7EED\u8BFB\u6570(\u53CD\u67E5/\u62D6\u62FD\u5C3A\u5BF8/\u6A21\u5F0F\u8BF4\u660E),\u4E00\u6B21\u6027\u7ED3\u679C\u4E00\u5F8B\u8D70 toast\u3002\nimport { h, qs } from \"./dom.js\"\n\nexport type ToastKind = \"info\" | \"ok\" | \"warn\" | \"error\"\n\nlet host: HTMLElement | null = null\n\nfunction ensureHost(): HTMLElement {\n if (host) return host\n host = document.getElementById(\"cs-toasts\")\n if (!host) {\n host = h(\"div\", \"cs-toasts\")\n host.id = \"cs-toasts\"\n qs(\"body\").appendChild(host)\n }\n return host\n}\n\n/** \u5F39\u4E00\u6761\u56DE\u6267\u3002error \u505C\u7559\u4E45\u4E00\u70B9(\u7528\u6237\u591A\u534A\u8981\u8BFB\u5168) */\nexport function toast(text: string, kind: ToastKind = \"info\"): void {\n const el = h(\"div\", `cs-toast is-${kind}`, text)\n ensureHost().appendChild(el)\n // \u5165\u573A:\u4E0B\u4E00\u5E27\u52A0 is-in,\u8BA9 transition \u6709\u8D77\u70B9\n requestAnimationFrame(() => el.classList.add(\"is-in\"))\n const life = kind === \"error\" ? 6000 : kind === \"warn\" ? 4500 : 3000\n setTimeout(() => {\n el.classList.remove(\"is-in\")\n el.addEventListener(\"transitionend\", () => el.remove(), { once: true })\n setTimeout(() => el.remove(), 400) // transitionend \u4E07\u4E00\u4E0D\u6765\u7684\u515C\u5E95\n }, life)\n}\n", "// \u8D34\u56FE:paste \u6536\u56FE \u2192 POST /__cs/api/refs\n//\n// \u5F52\u5C5E\u89C4\u5219:\u6279\u6CE8\u8F93\u5165\u6846(composer)\u6216 pin \u6C14\u6CE1\u7684\u7F16\u8F91\u6001\u5F00\u7740\u65F6,\u56FE\u5F52**\u90A3\u6761\u6279\u6CE8**\n// (\u7531 pins.ts \u767B\u8BB0 pasteTarget);\u6CA1\u6709\u4EFB\u4F55\u6279\u6CE8\u8F93\u5165\u6846\u5728\u65F6\u624D\u843D\u5230\u53F3\u4E0B\u89D2\u7684**\u5168\u5C40**\u53C2\u8003\u56FE\u575E\u2014\u2014\n// \u90A3\u662F\"\u6CA1\u6709\u5F52\u5C5E\u7684\u7C98\u8D34\"\u7684\u515C\u5E95,\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u4E00\u6761\u6279\u6CE8\u3002\nimport { postRef, refUrl } from \"./api.js\"\nimport { h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { toast } from \"./toast.js\"\n\nlet dock: HTMLDivElement\nlet lightbox: HTMLDivElement\nlet dockHead: HTMLDivElement | null = null\n\n/** \u672C\u6B21\u4F1A\u8BDD\u4F20\u4E0A\u53BB\u7684\u56FE:path \u2192 dataURL\u3002\u7701\u4E00\u6B21\u5F80\u8FD4,\u4E5F\u8BA9\u521A\u8D34\u7684\u56FE\u7ACB\u523B\u80FD\u663E\u793A */\nconst localSrc = new Map<string, string>()\n\n/** \u8C01\u5728\u63A5\u7BA1\u7C98\u8D34\u3002el \u4ECE DOM \u4E0A\u6458\u6389\u5373\u81EA\u52A8\u5931\u6548,\u4E0D\u7528\u5728\u6BCF\u4E2A\u5173\u95ED\u8DEF\u5F84\u4E0A\u6458\u94A9\u5B50 */\ninterface PasteTarget {\n el: HTMLElement\n onFile(file: File): void\n}\nlet pasteTarget: PasteTarget | null = null\n\nexport function setPasteTarget(target: PasteTarget | null): void {\n pasteTarget = target\n}\n\nfunction activeTarget(): PasteTarget | null {\n if (pasteTarget && !pasteTarget.el.isConnected) pasteTarget = null\n return pasteTarget\n}\n\nexport function initRefs(): void {\n dock = qs<HTMLDivElement>(\"#cs-refs\")\n dock.title = \"\u5168\u5C40\u53C2\u8003\u56FE:\u7C98\u8D34\u65F6\u6CA1\u6709\u5F00\u7740\u6279\u6CE8\u8F93\u5165\u6846\u7684\u56FE\u843D\u5728\u8FD9\u91CC,\u4E0D\u6302\u5728\u4EFB\u4F55\u4E00\u6761\u6279\u6CE8\u4E0A\"\n lightbox = qs<HTMLDivElement>(\"#cs-lightbox\")\n lightbox.addEventListener(\"click\", () => {\n lightbox.hidden = true\n lightbox.textContent = \"\"\n })\n document.addEventListener(\"paste\", onPaste)\n}\n\nfunction onPaste(e: ClipboardEvent): void {\n const items = e.clipboardData?.items\n if (!items) return\n for (const item of Array.from(items)) {\n if (item.kind !== \"file\" || !item.type.startsWith(\"image/\")) continue\n const file = item.getAsFile()\n if (!file) continue\n e.preventDefault()\n const target = activeTarget()\n if (target) target.onFile(file) // \u6302\u5230\u90A3\u6761\u6279\u6CE8\n else void uploadToDock(file) // \u6CA1\u5F52\u5C5E \u2192 \u5168\u5C40\u575E\n return\n }\n}\n\n/** \u4E0A\u4F20\u4E00\u5F20\u56FE,\u8FD4\u56DE repo \u76F8\u5BF9\u8DEF\u5F84(\u5931\u8D25\u629B) */\nexport async function uploadRef(file: File): Promise<string> {\n const dataUrl = await readDataUrl(file)\n const base64 = dataUrl.slice(dataUrl.indexOf(\",\") + 1)\n const ext = (file.type.split(\"/\")[1] || \"png\").replace(\"jpeg\", \"jpg\")\n const name = file.name || `paste-${Date.now()}.${ext}`\n setProbe(`\u4E0A\u4F20\u53C2\u8003\u56FE ${name}\u2026`)\n const { path } = await postRef(name, base64)\n localSrc.set(path, dataUrl)\n return path\n}\n\nfunction readDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = () => reject(new Error(\"\u8BFB\u56FE\u5931\u8D25\"))\n reader.onload = () => resolve(String(reader.result))\n reader.readAsDataURL(file)\n })\n}\n\n/** \u663E\u793A\u5730\u5740:\u672C\u6B21\u4F1A\u8BDD\u4F20\u8FC7\u7684\u76F4\u63A5\u7528 dataURL,\u5176\u4F59\u8D70\u5916\u58F3\u7684\u53D6\u56FE\u8DEF\u7531 */\nexport function refSrc(path: string): string {\n return localSrc.get(path) ?? refUrl(path)\n}\n\n/** \u53C2\u8003\u56FE\u7F29\u7565\u56FE:\u70B9\u51FB\u5F00\u5927\u56FE\u3002\u53D6\u4E0D\u5230\u56FE\u65F6\u9000\u5316\u6210\u6587\u4EF6\u540D chip(\u4E0D\u7559\u7834\u56FE\u6807) */\nexport function refThumb(path: string): HTMLElement {\n const card = h(\"div\", \"cs-ref-thumb\")\n card.title = path\n const img = h(\"img\")\n const broken = (): void => {\n img.hidden = true\n card.classList.add(\"is-broken\")\n }\n img.addEventListener(\"error\", broken)\n img.alt = path\n img.src = refSrc(path)\n // \u5DF2\u89E3\u7801\u5B8C\u6210\u7684\u56FE(dataURL/\u7F13\u5B58)\u4E0D\u4F1A\u518D\u8865\u53D1 error \u4E8B\u4EF6,\u540C\u6B65\u8865\u6D4B\u4E00\u6B21\n if (img.complete && img.naturalWidth === 0) broken()\n card.append(img, h(\"span\", \"cs-ref-name\", fileOf(path)))\n card.addEventListener(\"click\", (e) => {\n e.stopPropagation() // \u522B\u987A\u5E26\u628A pin \u9009\u4E2D/\u628A\u6C14\u6CE1\u5F53\u6210\u70B9\u4E86\u522B\u5904\n openLightbox(refSrc(path), path)\n })\n return card\n}\n\nexport function openLightbox(src: string, caption: string): void {\n lightbox.textContent = \"\"\n const big = h(\"img\")\n big.src = src\n big.alt = caption\n lightbox.append(big, h(\"span\", undefined, caption))\n lightbox.hidden = false\n}\n\nfunction fileOf(path: string): string {\n return path.split(\"/\").pop() ?? path\n}\n\n// ---------- \u5168\u5C40\u575E(\u6CA1\u6709\u5F52\u5C5E\u7684\u7C98\u8D34) ----------\n\nasync function uploadToDock(file: File): Promise<void> {\n try {\n const path = await uploadRef(file)\n addThumb(path)\n toast(\n `\u53C2\u8003\u56FE\u5DF2\u5B58:${path} \u2014\u2014 \u8FD9\u662F\u5168\u5C40\u53C2\u8003\u56FE,\u6CA1\u6302\u5728\u6279\u6CE8\u4E0A\u3002\u8981\u6302\u5230\u67D0\u6761\u6279\u6CE8:\u6309 c \u5199\u6279\u6CE8\u65F6\u7C98\u8D34,\u6216\u5728 pin \u6C14\u6CE1\u91CC\u70B9\u300C\u7F16\u8F91\u300D\u540E\u7C98\u8D34`,\n \"ok\"\n )\n } catch (err) {\n toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\")\n }\n}\n\nfunction addThumb(path: string): void {\n ensureDockHead()\n const card = h(\"div\", \"cs-ref\")\n const img = h(\"img\")\n img.src = refSrc(path)\n img.alt = path\n card.append(img, h(\"span\", undefined, fileOf(path)))\n card.title = `${path}(\u5168\u5C40\u53C2\u8003\u56FE,\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u6279\u6CE8)`\n card.addEventListener(\"click\", () => openLightbox(refSrc(path), path))\n dock.appendChild(card)\n}\n\n/** \u575E\u7684\u6807\u9898:\u8BF4\u6E05\u695A\u8FD9\u4E00\u5217\u662F\u5168\u5C40\u7684\u3002\u575E\u662F column-reverse,\u9996\u4E2A\u5B50\u8282\u70B9\u663E\u793A\u5728\u6700\u4E0B\u9762 */\nfunction ensureDockHead(): void {\n if (dockHead) return\n dockHead = h(\"div\", \"cs-refs-head\", \"\u5168\u5C40\u53C2\u8003\u56FE \u00B7 \u672A\u6302\u5230\u6279\u6CE8\")\n dockHead.title = \"\u7C98\u8D34\u65F6\u6CA1\u6709\u5F00\u7740\u6279\u6CE8\u8F93\u5165\u6846\u7684\u56FE\u843D\u5728\u8FD9\u91CC\u3002\u8981\u6302\u5230\u67D0\u6761\u6279\u6CE8:\u6309 c \u5199\u6279\u6CE8\u65F6\u7C98\u8D34,\u6216\u5728 pin \u6C14\u6CE1\u91CC\u70B9\u300C\u7F16\u8F91\u300D\u540E\u7C98\u8D34\"\n dock.insertBefore(dockHead, dock.firstChild)\n}\n", "// \u540C\u6E90\u53CD\u67E5:iframe \u5185\u5143\u7D20\u5B9A\u4F4D\u3001CSS selector \u751F\u6210\u3001\u5916\u58F3\u5C42\u63CF\u8FB9\u6846\nimport { clamp, frameDoc, h, qs } from \"./dom.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet fx: HTMLDivElement\nlet hoverBox: HTMLDivElement\nlet selectBox: HTMLDivElement\n\n/** hover \u7684\u662F\u54EA\u4E2A\u5143\u7D20(\u76F4\u63A5\u6301\u5F15\u7528,HMR \u6362 DOM \u540E\u81EA\u7136\u5931\u6548) */\nlet hoverRef: { board: Board; el: Element } | null = null\n/** \u9009\u4E2D\u7684\u8BB0 selector,HMR \u540E\u4ECD\u80FD\u91CD\u65B0\u5B9A\u4F4D;el \u662F\u89E3\u6790\u51FA\u6765\u7684\u7F13\u5B58,\u65AD\u94FE\u540E\u91CD\u67E5 */\nlet selectRef: { board: Board; selector: string; el: Element | null } | null = null\n\n/** \u4E00\u4E2A\u6846\u4E0A\u6B21\u753B\u6210\u4EC0\u4E48\u6837:\u5B8C\u5168\u6CA1\u53D8\u5C31\u6574\u5E27\u8DF3\u8FC7(\u8DDF\u968F\u5FAA\u73AF\u9760\u8FD9\u4E2A\u505C\u4E0B\u6765) */\ninterface Painted {\n sig: string\n /** \u6807\u7B7E\u7684\u5B9E\u6D4B\u5C3A\u5BF8,\u53EA\u5728\u6587\u6848/\u53EF\u7528\u5BBD\u53D8\u4E86\u624D\u91CD\u91CF */\n tagKey: string\n tagW: number\n tagH: number\n}\nconst painted = new Map<HTMLDivElement, Painted>()\n\nfunction makeBox(kind: \"hover\" | \"select\"): HTMLDivElement {\n const box = h(\"div\", \"cs-box\")\n box.dataset.kind = kind\n box.appendChild(h(\"span\", \"cs-box-tag\"))\n fx.appendChild(box)\n return box\n}\n\nexport function initSelect(): void {\n fx = qs<HTMLDivElement>(\"#cs-fx\")\n hoverBox = makeBox(\"hover\")\n selectBox = makeBox(\"select\")\n}\n\n// ---------- \u5750\u6807\u6362\u7B97 ----------\n\n/** \u5C4F\u5E55\u5750\u6807 \u2192 iframe \u5185\u5143\u7D20(\u4E16\u754C\u7F29\u653E\u8981\u9664\u6389) */\nexport function elementAt(board: Board, clientX: number, clientY: number): Element | null {\n const doc = frameDoc(board.iframe)\n if (!doc || !board.iframe) return null\n const r = board.iframe.getBoundingClientRect()\n const s = liveScale(board, board.frameEl.getBoundingClientRect())\n let stack: Element[]\n try {\n stack = doc.elementsFromPoint((clientX - r.left) / s, (clientY - r.top) / s)\n } catch {\n return null\n }\n // screen \u753B\u677F\u4E0D\u8FC7\u6EE4:\u90A3\u662F\u4E00\u6574\u4E2A\u771F\u5B9E\u9875\u9762,body/\u5BB9\u5668\u5C31\u662F\u9875\u9762\u672C\u8EAB\n if (board.entry.kind !== \"component\") return stack[0] ?? null\n // \u7EC4\u4EF6\u753B\u677F:\u80FD\u88AB\u6307\u7740\u7684\u5FC5\u987B\u662F\"\u753B\u4E86\u4E1C\u897F\"\u7684\u5143\u7D20\u3002\u547D\u4E2D\u6808\u4ECE\u6700\u4E0A\u5C42\u5F80\u4E0B\u627E\u7B2C\u4E00\u4E2A\u53EF\u89C1\u7684;\n // \u8D70\u5230 html/body/\u6CE8\u5165\u7684 wrapper \u5C31\u505C \u2014\u2014 \u7EC4\u4EF6\u5C0F\u3001\u89C6\u53E3\u5927\u65F6\u7A7A\u767D\u5904\u547D\u4E2D\u7684\u662F\u4E00\u6574\u7247 body,\n // \u800C\u7EC4\u4EF6\u6839\u5F80\u5F80\u662F\u4E2A\u900F\u660E\u7684\u5E03\u5C40\u5BB9\u5668(grid/flex),\u9AD8\u4EAE\u5B83\u4EEC\u90FD\u662F\"\u9009\u4E2D\u4E86\u4E00\u5927\u7247\u770B\u4E0D\u89C1\u7684\u9762\u677F\"\u3002\n // \u6307\u7740\u7A7A\u767D = \u6CA1\u6307\u4EFB\u4F55\u4E1C\u897F\u3002\n for (const el of stack) {\n const t = el.tagName\n if (t === \"HTML\" || t === \"BODY\" || el.hasAttribute(\"data-cs-artboard\")) return null\n if (paintsSomething(el, doc)) return el\n }\n return null\n}\n\n/** \u5929\u751F\u53EF\u89C1\u7684\u5143\u7D20:\u66FF\u6362\u5143\u7D20\u4E0E\u8868\u5355\u63A7\u4EF6,\u4E0D\u770B\u6837\u5F0F\u5C31\u77E5\u9053\u753B\u4E86\u4E1C\u897F */\nconst VISIBLE_TAGS = new Set([\n \"IMG\", \"VIDEO\", \"CANVAS\", \"INPUT\", \"SELECT\", \"TEXTAREA\", \"BUTTON\", \"HR\", \"IFRAME\",\n \"PICTURE\", \"AUDIO\", \"EMBED\", \"OBJECT\",\n])\n\n/** computed backgroundColor \u2192 alpha\u3002\u73B0\u4EE3\u6D4F\u89C8\u5668\u53EF\u80FD\u7ED9 lab()/oklch(),\u975E rgba \u683C\u5F0F\u4E00\u5F8B\u5F53\u4E0D\u900F\u660E */\nfunction bgAlpha(bg: string): number {\n if (bg === \"transparent\") return 0\n const m = bg.match(/^rgba\\([^)]*,\\s*([\\d.]+)\\s*\\)$/)\n return m ? parseFloat(m[1]) : 1\n}\n\n/** \u8FD9\u4E2A\u5143\u7D20\u5728\u89C6\u89C9\u4E0A\u753B\u4E86\u4EFB\u4F55\u4E1C\u897F\u5417(\u5E95\u8272/\u8FB9\u6846/\u9634\u5F71/\u56FE\u7247/\u76F4\u63A5\u6587\u672C)?\u7EAF\u5E03\u5C40\u5BB9\u5668\u8FD4\u56DE false */\nfunction paintsSomething(el: Element, doc: Document): boolean {\n if (VISIBLE_TAGS.has(el.tagName)) return true\n if (el.closest(\"svg\")) return true\n for (const n of el.childNodes) {\n if (n.nodeType === 3 && n.textContent && n.textContent.trim()) return true // \u76F4\u63A5\u6587\u672C\u8282\u70B9\n }\n const win = doc.defaultView\n if (!win) return false\n const cs = win.getComputedStyle(el)\n if (cs.backgroundImage !== \"none\") return true\n if (bgAlpha(cs.backgroundColor) > 0) return true\n if (cs.boxShadow !== \"none\") return true\n if (\n (parseFloat(cs.borderTopWidth) || 0) + (parseFloat(cs.borderRightWidth) || 0) +\n (parseFloat(cs.borderBottomWidth) || 0) + (parseFloat(cs.borderLeftWidth) || 0) > 0\n ) return true\n if (cs.outlineStyle !== \"none\" && (parseFloat(cs.outlineWidth) || 0) > 0) return true\n return false\n}\n\n/**\n * iframe \u5185\u5143\u7D20\u7684\u5305\u56F4\u76D2 \u2192 \u5C4F\u5E55\u5750\u6807\u3002\n * \u7F29\u653E\u5FC5\u987B\u73B0\u91CF,\u4E0D\u80FD\u7528 state.scale:\u4E16\u754C\u5BB9\u5668 #cs-world \u7684 transform \u5E26 260ms \u8FC7\u6E21\n * (view.ts \u7684 animateTo \u2014\u2014 \u5168\u666F 1 / \u805A\u7126 2 / 100% 0 / \u4FA7\u680F\u70B9\u6761\u76EE\u90FD\u8D70\u5B83),\u8FC7\u6E21\u9014\u4E2D\n * state.scale \u5DF2\u662F\u7EC8\u503C\u800C DOM \u8FD8\u505C\u5728\u534A\u8DEF,\u4E24\u8005\u6DF7\u7528\u6846\u5C31\u6574\u4F53\u9519\u4F4D\u3002\n */\nfunction screenRect(board: Board, el: Element): DOMRect | null {\n if (!board.iframe || !board.el.isConnected) return null\n const fr = board.iframe.getBoundingClientRect()\n const s = liveScale(board, board.frameEl.getBoundingClientRect())\n const b = el.getBoundingClientRect()\n return new DOMRect(fr.left + b.left * s, fr.top + b.top * s, b.width * s, b.height * s)\n}\n\n/**\n * \u8FD9\u4E00\u77AC\u95F4\u753B\u677F\u771F\u6B63\u88AB\u7F29\u653E\u6210\u4E86\u51E0\u500D:.cs-frame \u7684 CSS \u5BBD\u6052\u7B49\u4E8E board.width(wall.ts \u7684\n * applySize \u5199\u6B7B),\u5C4F\u5E55\u5BBD \u00F7 \u5B83\u5C31\u662F\u5F53\u524D\u751F\u6548\u7684\u7F29\u653E,\u8FC7\u6E21\u52A8\u753B\u4E2D\u9014\u4E5F\u51C6\u3002\u91CF\u4E0D\u51FA\u6765\u624D\u9000\u56DE state.scale\u3002\n */\nfunction liveScale(board: Board, frame: DOMRect): number {\n if (board.width > 0 && frame.width > 0) return frame.width / board.width\n return state.scale || 1\n}\n\n/** \u70B9\u51FB\u4F4D\u7F6E\u76F8\u5BF9\u5143\u7D20\u7684 0-1 \u5750\u6807 */\nexport function relPos(el: Element, clientX: number, clientY: number, board: Board): { x: number; y: number } {\n const r = screenRect(board, el)\n if (!r || r.width === 0 || r.height === 0) return { x: 0, y: 0 }\n const round = (v: number) => Math.round(clamp(v, 0, 1) * 1000) / 1000\n return { x: round((clientX - r.left) / r.width), y: round((clientY - r.top) / r.height) }\n}\n\n// ---------- selector \u751F\u6210 ----------\n\nfunction isUnique(doc: Document, sel: string): boolean {\n try {\n return doc.querySelectorAll(sel).length === 1\n } catch {\n return false\n }\n}\n\nfunction idSelector(el: Element): string | null {\n const id = el.getAttribute(\"id\")\n if (!id) return null\n return `#${CSS.escape(id)}`\n}\n\nfunction dataSelector(el: Element): string | null {\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith(\"data-\") || !attr.value) continue\n const v = attr.value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')\n return `[${attr.name}=\"${v}\"]`\n }\n return null\n}\n\nfunction nthPart(el: Element): string {\n const tag = el.localName\n const parent = el.parentElement\n if (!parent) return tag\n const sames = Array.from(parent.children).filter((c) => c.localName === tag)\n if (sames.length < 2) return tag\n return `${tag}:nth-of-type(${sames.indexOf(el) + 1})`\n}\n\n/** \u4F18\u5148 id,\u518D data-*,\u5426\u5219 \u6807\u7B7E+nth-of-type \u94FE(\u6700\u591A 5 \u5C42) */\nexport function buildSelector(el: Element): string {\n const doc = el.ownerDocument\n const parts: string[] = []\n let cur: Element | null = el\n while (cur && cur !== doc.documentElement && parts.length < 5) {\n const byId = idSelector(cur)\n if (byId && isUnique(doc, byId)) {\n parts.unshift(byId)\n return parts.join(\" > \")\n }\n const byData = dataSelector(cur)\n if (byData && isUnique(doc, byData)) {\n parts.unshift(byData)\n return parts.join(\" > \")\n }\n parts.unshift(nthPart(cur))\n const joined = parts.join(\" > \")\n if (isUnique(doc, joined)) return joined\n cur = cur.parentElement\n }\n return parts.join(\" > \") || el.localName\n}\n\n/** HUD \u6587\u6848:tag / probe / \u7C7B\u540D\u3002\u6CE8\u610F iframe \u91CC\u7684\u5143\u7D20\u8DE8 realm,\u4E0D\u80FD\u7528 instanceof \u5224\u7C7B\u578B */\nexport function describe(el: Element): string {\n const probe = el.closest(\"[data-probe]\")?.getAttribute(\"data-probe\")\n const cls = typeof el.className === \"string\" ? el.className : \"\"\n return (\n `<${el.localName}>` +\n (probe ? ` probe=${probe}` : \"\") +\n (cls ? ` .${cls.trim().split(/\\s+/).slice(0, 3).join(\".\")}` : \"\")\n )\n}\n\n// ---------- \u63CF\u8FB9\u6846 ----------\n\n/** \u6807\u7B7E\u4E0E\u6846\u4E4B\u95F4\u7684\u7F1D;\u8D34\u8FB9\u7FFB\u8FDB\u6846\u5185\u65F6\u540C\u6837\u7528\u5B83 */\nconst TAG_GAP = 1\n\n/**\n * \u6807\u7B7E(.cs-box-tag)\u5FC5\u987B\u7559\u5728\u753B\u677F\u7684\u53EF\u89C6\u533A\u91CC \u2014\u2014 \u5B83\u662F\u5C4F\u5E55\u5750\u6807\u5C42\u7684\u4E1C\u897F,\u4E0D\u53D7\u753B\u677F\n * overflow:hidden \u7EA6\u675F,\u4E0D\u7BA1\u5C31\u4F1A\u98D8\u5230\u753B\u677F\u5916\u9762\u7684\u753B\u5E03\u4E0A\u3002\n * \u9ED8\u8BA4\u8D34\u6846\u7684\u5DE6\u4E0A\u5916\u4FA7;\u4E0A\u9762\u585E\u4E0D\u4E0B\u5C31\u7FFB\u5230\u6846\u5185\u4FA7,\u518D\u4E0D\u884C\u6309\u53EF\u89C6\u533A\u8FB9\u7F18\u538B\u4F4F\u3002\n */\nfunction placeTag(tag: HTMLElement, box: DOMRect, frame: DOMRect, st: Painted, label: string): void {\n // \u957F selector \u4E0D\u8BB8\u9876\u7A7F\u753B\u677F:\u53EF\u7528\u5BBD\u7ED9\u6B7B,\u8D85\u51FA\u90E8\u5206\u7531 style-select.css \u7684\u7701\u7565\u53F7\u6536\u5C3E\n const maxW = Math.max(24, Math.floor(frame.width) - 2)\n const key = `${label}|${maxW}`\n if (st.tagKey !== key) {\n tag.style.maxWidth = `${maxW}px`\n const t = tag.getBoundingClientRect()\n // \u91CF\u5230 0 \u8BF4\u660E\u6846\u8FD9\u4E00\u523B\u8FD8\u662F display:none(\u8C03\u7528\u65B9\u5FC5\u987B\u5148 is-on \u518D\u6765),\u4E0D\u7F13\u5B58,\u4E0B\u4E00\u5E27\u91CD\u91CF\n st.tagKey = t.height > 0 ? key : \"\"\n st.tagW = t.width\n st.tagH = t.height\n }\n let x = box.left\n let y = box.top - st.tagH - TAG_GAP\n if (y < frame.top) y = box.top + TAG_GAP // \u9876\u8FB9\u8D34\u4F4F\u4E86 \u2192 \u7FFB\u5230\u6846\u5185\u4FA7\n y = clamp(y, frame.top, Math.max(frame.top, frame.bottom - st.tagH))\n x = clamp(x, frame.left, Math.max(frame.left, frame.right - st.tagW))\n // .cs-box \u662F border-box + 1px \u8FB9\u6846,\u6807\u7B7E\u7684\u5305\u542B\u5757\u662F\u5B83\u7684 padding box,\u6240\u4EE5\u8981\u5404\u51CF 1\n tag.style.left = `${x - box.left - 1}px`\n tag.style.top = `${y - box.top - 1}px`\n}\n\n/** \u753B\u4E00\u4E2A\u6846\u3002\u8FD4\u56DE true = \u8FD9\u6B21\u771F\u6539\u4E86 DOM(\u8DDF\u968F\u5FAA\u73AF\u9760\u5B83\u5224\u65AD\"\u8FD8\u5728\u52A8\") */\nfunction paint(box: HTMLDivElement, board: Board, el: Element, label: string): boolean {\n const r = screenRect(board, el)\n if (!r || r.width + r.height === 0) {\n const off = box.classList.contains(\"is-on\")\n box.classList.remove(\"is-on\")\n return off\n }\n const frame = board.frameEl.getBoundingClientRect()\n const sig = `${r.left},${r.top},${r.width},${r.height}|${frame.left},${frame.top},${frame.width},${frame.height}|${label}`\n let st = painted.get(box)\n if (st && st.sig === sig && box.classList.contains(\"is-on\")) return false\n if (!st) {\n st = { sig, tagKey: \"\", tagW: 0, tagH: 0 }\n painted.set(box, st)\n }\n st.sig = sig\n box.style.left = `${r.left}px`\n box.style.top = `${r.top}px`\n box.style.width = `${r.width}px`\n box.style.height = `${r.height}px`\n const tag = box.firstElementChild as HTMLElement\n if (tag.textContent !== label) tag.textContent = label\n // \u5148\u4EAE\u8D77\u6765\u518D\u6446\u6807\u7B7E:\u6846\u8FD8\u662F display:none \u7684\u8BDD,\u6807\u7B7E\u91CF\u51FA\u6765\u662F 0\u00D70,\u7FFB\u8FB9/\u5939\u8FB9\u5168\u7B97\u9519\n box.classList.add(\"is-on\")\n placeTag(tag, r, frame, st, label)\n return true\n}\n\n/** \u9009\u4E2D\u6846\u7684\u5143\u7D20:\u7F13\u5B58\u4F4F,\u65AD\u94FE(HMR \u6362 DOM)\u4E86\u518D\u6309 selector \u91CD\u67E5 */\nfunction resolveSelected(): Element | null {\n if (!selectRef) return null\n if (selectRef.el?.isConnected) return selectRef.el\n const doc = frameDoc(selectRef.board.iframe)\n try {\n selectRef.el = doc ? doc.querySelector(selectRef.selector) : null\n } catch {\n selectRef.el = null\n }\n return selectRef.el\n}\n\n/** \u628A\u4E24\u4E2A\u6846\u90FD\u6309\u5F53\u524D\u51E0\u4F55\u753B\u4E00\u904D,\u8FD4\u56DE\u662F\u5426\u6709\u53D8\u5316 */\nfunction paintAll(): boolean {\n let changed = false\n if (hoverRef) {\n if (hoverRef.el.isConnected) {\n changed = paint(hoverBox, hoverRef.board, hoverRef.el, hoverRef.el.localName) || changed\n } else {\n hideHover()\n changed = true\n }\n }\n if (selectRef) {\n const el = resolveSelected()\n if (el) changed = paint(selectBox, selectRef.board, el, selectRef.selector) || changed\n else if (selectBox.classList.contains(\"is-on\")) {\n selectBox.classList.remove(\"is-on\")\n changed = true\n }\n }\n return changed\n}\n\n// ---------- \u8DDF\u968F ----------\n//\n// refreshBoxes() \u53EA\u5728\"\u89C6\u56FE\u53D8\u5316\u90A3\u4E00\u523B\"\u88AB\u8C03\u4E00\u6B21,\u800C\u4E16\u754C\u5BB9\u5668\u7684 transform \u5E26 260ms \u8FC7\u6E21\n// (view.ts \u7684 animateTo),\u753B\u677F\u81EA\u52A8\u6D4B\u9AD8\u3001iframe \u5185\u5BB9\u91CD\u6392\u4E5F\u90FD\u4E0D\u662F\u4E00\u5E27\u5C31\u5B8C\u4E8B\u7684 \u2014\u2014\n// \u53EA\u753B\u4E00\u6B21,\u6846\u5C31\u505C\u5728\u534A\u8DEF\u4E0A\u518D\u4E5F\u4E0D\u52A8\u4E86\u3002\n// \u6240\u4EE5\u8FD9\u91CC\u8BA9\u6846\u8DDF\u5230\u505C:\u6BCF\u5E27\u53EA\u91CD\u7B97\u5F53\u524D\u4EAE\u7740\u7684\u90A3 1~2 \u4E2A\u6846,\u8FDE\u7EED STILL_FRAMES \u5E27\u51E0\u4F55\u6CA1\u53D8\n// \u5C31\u81EA\u5DF1\u505C\u6389(\u9759\u6B62\u60AC\u505C\u65F6\u4E0D\u70E7\u5E27),\u89C6\u56FE\u518D\u53D8\u65F6\u7531 refreshBoxes/showHover \u5524\u9192\u3002\nconst STILL_FRAMES = 24\nlet followRaf = 0\nlet stillFrames = 0\n\nfunction follow(): void {\n followRaf = 0\n if (!hoverRef && !selectRef) return\n stillFrames = paintAll() ? 0 : stillFrames + 1\n if (stillFrames < STILL_FRAMES) followRaf = requestAnimationFrame(follow)\n}\n\nfunction wake(): void {\n stillFrames = 0\n if (!followRaf && (hoverRef || selectRef)) followRaf = requestAnimationFrame(follow)\n}\n\nexport function showHover(board: Board, el: Element): void {\n hoverRef = { board, el }\n paint(hoverBox, board, el, el.localName)\n wake()\n}\n\nexport function hideHover(): void {\n hoverRef = null\n hoverBox.classList.remove(\"is-on\")\n}\n\nexport function showSelection(board: Board, selector: string): void {\n selectRef = { board, selector, el: null }\n refreshBoxes()\n}\n\nexport function clearSelection(): void {\n selectRef = null\n selectBox.classList.remove(\"is-on\")\n}\n\n/** \u5E73\u79FB/\u7F29\u653E/\u91CD\u6392\u540E\u91CD\u753B\u4E24\u4E2A\u6846(\u89C6\u56FE\u53D8\u5316\u7684\u5165\u53E3,\u540C\u65F6\u5524\u9192\u8DDF\u968F) */\nexport function refreshBoxes(): void {\n if (hoverRef && !hoverRef.el.isConnected) hideHover()\n paintAll()\n wake()\n}\n", "// pin \u6279\u6CE8:\u753B\u70B9\u3001hover \u6C14\u6CE1\u3001\u5C31\u5730\u8F93\u5165\u6846\nimport type { Annotation } from \"../types.js\"\nimport { createAnnotation, deleteAnnotation, fetchContext, patchAnnotation, pushContext } from \"./api.js\"\nimport { frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe, syncHud } from \"./hud.js\"\nimport { refThumb, setPasteTarget, uploadRef } from \"./refs.js\"\nimport { toast } from \"./toast.js\"\nimport { buildSelector, relPos } from \"./select.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet fx: HTMLDivElement\nlet composer: HTMLDivElement | null = null\n\nexport function initPins(): void {\n fx = qs<HTMLDivElement>(\"#cs-fx\")\n}\n\n/** \u91CD\u753B\u6240\u6709\u753B\u677F\u7684 pin */\nexport function renderPins(): void {\n for (const board of state.boards.values()) renderBoardPins(board)\n}\n\nexport function renderBoardPins(board: Board): void {\n const layer = board.pinLayerEl\n layer.textContent = \"\"\n const doc = frameDoc(board.iframe)\n // verified = \u4EBA\u5DE5\u6838\u9A8C\u5B8C\u6BD5,\u4ECE\u5899\u4E0A\u6D88\u5931(\u4F46\u7559\u5728 annotations.json \u91CC\u5F53\u5386\u53F2)\n const list = state.annotations.filter(\n (a) => a.artboardId === board.entry.id && a.status !== \"verified\"\n )\n const used = new Map<string, number>() // \u540C\u951A\u70B9\u7684\u591A\u6761\u6279\u6CE8\u6A2A\u5411\u9519\u5F00,\u5426\u5219\u4E0B\u9762\u90A3\u6761\u6C38\u8FDC\u70B9\u4E0D\u5230\n list.forEach((ann, i) => {\n let left = 8\n let top = 8\n let orphan = true\n if (doc && ann.anchor) {\n let el: Element | null = null\n try {\n el = doc.querySelector(ann.anchor.selector)\n } catch {\n el = null\n }\n if (el) {\n const r = el.getBoundingClientRect()\n left = r.left + ann.anchor.x * r.width\n top = r.top + ann.anchor.y * r.height\n orphan = false\n }\n }\n // 12px \u7F51\u683C\u805A\u7C7B:\u540C\u70B9\u6216\u8FD1\u91CD\u53E0(\u5DEE\u51E0\u4E2A\u50CF\u7D20)\u7684 pin \u90FD\u8981\u9519\u5F00,\u5426\u5219\u4E0B\u9762\u90A3\u9897\u70B9\u4E0D\u5230\n const key = `${Math.round(left / 12)}:${Math.round(top / 12)}`\n const dup = used.get(key) ?? 0\n used.set(key, dup + 1)\n left += dup * 20\n\n // \u663E\u793A\u6C38\u4E45\u5E8F\u53F7,\u4E0D\u662F\"\u672C\u677F\u7B2C\u51E0\u4E2A\":\u4E24\u5757\u677F\u5404\u81EA\u4ECE 1 \u6570\u4F1A\u51FA\u73B0\u597D\u51E0\u4E2A\"1\",\n // \u800C\u4E14\u524D\u9762\u7684\u6279\u6CE8\u88AB\u6838\u9A8C\u540E,\u540E\u9762\u7684\u53F7\u5168\u4F53\u524D\u79FB \u2014\u2014 \u8DDF Claude \u5BF9\u8BDD\u65F6\u6307\u8BA4\u4E0D\u4E86\u540C\u4E00\u6761\n const pin = h(\"div\", \"cs-pin\", String(ann.seq ?? i + 1))\n pin.dataset.annId = ann.id\n if (ann.status === \"resolved\") pin.classList.add(\"is-resolved\")\n if (ann.id === selectedPinId) pin.classList.add(\"is-selected\")\n if (orphan) {\n pin.classList.add(\"is-orphan\")\n pin.title = \"\u951A\u70B9\u5143\u7D20\u6CA1\u627E\u5230,pin \u843D\u5728\u753B\u677F\u5DE6\u4E0A\u89D2\"\n }\n pin.style.left = `${left}px`\n pin.style.top = `${top}px`\n // \u70B9 pin = \u9009\u4E2D\u5B83,\u4E4B\u540E Enter \u7F16\u8F91 / Backspace \u5220\u9664\n pin.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n selectPin(ann.id)\n })\n pin.appendChild(bubble(ann))\n attachHoverGrace(pin)\n layer.appendChild(pin)\n })\n}\n\n// ---------- pin \u9009\u4E2D + \u952E\u76D8\u64CD\u4F5C ----------\n\nlet selectedPinId: string | null = null\n\nexport function selectedPin(): string | null {\n return selectedPinId\n}\n\nexport function selectPin(id: string | null): void {\n selectedPinId = id\n for (const p of document.querySelectorAll<HTMLElement>(\".cs-pin\")) {\n p.classList.toggle(\"is-selected\", !!id && p.dataset.annId === id)\n if (id && p.dataset.annId === id) p.classList.add(\"is-open\") // \u9009\u4E2D\u5C31\u628A\u6C14\u6CE1\u7559\u4F4F\n else p.classList.remove(\"is-open\")\n }\n setProbe(id ? \"\u6279\u6CE8\u5DF2\u9009\u4E2D:Enter \u7F16\u8F91 \u00B7 Backspace \u5220\u9664 \u00B7 Esc \u53D6\u6D88\" : \"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n\n/** Enter:\u6CA1\u5728\u7F16\u8F91\u5C31\u8FDB\u7F16\u8F91,\u6B63\u5728\u7F16\u8F91\u5C31\u4FDD\u5B58 */\nexport function editSelectedPin(): void {\n if (!selectedPinId) return\n const pin = document.querySelector<HTMLElement>(`.cs-pin[data-ann-id=\"${CSS.escape(selectedPinId)}\"]`)\n if (!pin) return\n const box = pin.querySelector<HTMLElement>(\".cs-pin-bubble\")\n if (!box) return\n const saveBtn = [...box.querySelectorAll(\"button\")].find((b) => b.textContent === \"\u4FDD\u5B58\")\n if (saveBtn) {\n saveBtn.click() // \u7F16\u8F91\u4E2D \u2192 \u4FDD\u5B58\n return\n }\n const ann = state.annotations.find((a) => a.id === selectedPinId)\n const textEl = box.querySelector<HTMLElement>(\".cs-pin-text\")\n if (ann && textEl) startEdit(box, textEl, ann)\n}\n\nexport function deleteSelectedPin(): void {\n if (!selectedPinId) return\n const id = selectedPinId\n selectedPinId = null\n void remove(id)\n}\n\n/** hover \u5F00\u5408\u8D70 JS + 250ms \u5173\u95ED\u5BBD\u9650\u3002\n * pin \u4E0E\u6C14\u6CE1\u4E4B\u95F4\u90A3\u6761\u7F1D\u73B0\u5728\u7531 style-pins.css \u7684\u900F\u660E\u6865\u63A5(`.cs-pin.is-open::after`)\u8865\u6210\n * pin \u81EA\u5DF1\u7684\u547D\u4E2D\u533A \u2014\u2014 \u7F1D\u91CC\u7684\u50CF\u7D20\u4E0D\u518D\u843D\u5230\u753B\u677F\u4E0A\u3002\u5BBD\u9650\u7559\u7740\u515C\u5FEB\u901F\u7529\u52A8:\u9F20\u6807\u4E00\u5E27\u8DE8\u8FC7\u6574\u6761\u6865\n * \u65F6 mouseleave \u7167\u6837\u4F1A\u6765,250ms \u5185\u4E0D\u5173,\u6309\u94AE\u8FD8\u70B9\u5F97\u5230\u3002 */\nfunction attachHoverGrace(pin: HTMLElement): void {\n let timer: ReturnType<typeof setTimeout> | null = null\n pin.addEventListener(\"mouseenter\", () => {\n if (timer !== null) clearTimeout(timer)\n timer = null\n pin.classList.add(\"is-open\")\n })\n pin.addEventListener(\"mouseleave\", () => {\n timer = setTimeout(() => {\n // \u7F16\u8F91\u4E2D\u4E0D\u81EA\u52A8\u5173(textarea \u91CC\u6253\u5B57\u65F6\u9F20\u6807\u53EF\u80FD\u79FB\u8D70)\n if (!pin.querySelector(\".cs-pin-bubble.is-editing\")) pin.classList.remove(\"is-open\")\n }, 250)\n })\n}\n\n/** \u4E00\u6761\u6279\u6CE8\u6302\u7684\u53C2\u8003\u56FE:\u6A2A\u6392\u7F29\u7565\u56FE,\u70B9\u5F00\u5927\u56FE */\nfunction refStrip(paths: string[]): HTMLElement {\n const strip = h(\"div\", \"cs-ref-strip\")\n for (const p of paths) strip.appendChild(refThumb(p))\n return strip\n}\n\nfunction bubble(ann: Annotation): HTMLElement {\n const box = h(\"div\", \"cs-pin-bubble\")\n const textEl = h(\"div\", \"cs-pin-text\", ann.text)\n box.appendChild(textEl)\n if (ann.refs?.length) box.appendChild(refStrip(ann.refs))\n const meta = h(\"div\", \"cs-pin-meta\")\n meta.appendChild(h(\"span\", undefined, ann.status === \"open\" ? \"open\" : \"\u5F85\u6838\u9A8C\"))\n\n const act = (label: string, cls: string, fn: () => void): void => {\n const btn = h(\"button\", cls, label)\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n fn()\n })\n meta.appendChild(btn)\n }\n\n if (ann.status === \"open\") {\n // Claude(\u6216\u4EBA)\u6807\u8BB0\"\u505A\u5B8C\u4E86\" \u2014\u2014 \u8FDB\u5165\u5F85\u6838\u9A8C,\u8FD8\u4E0D\u6D88\u5931\n act(\"\u6807\u8BB0\u5B8C\u6210\", \"cs-x\", () =>\n void transition(ann.id, { status: \"resolved\", resolvedAt: new Date().toISOString() }, \"\u5DF2\u6807\u8BB0\u5B8C\u6210,\u5F85\u4EBA\u5DE5\u6838\u9A8C\")\n )\n } else {\n // \u6838\u9A8C\u662F\u4EBA\u7684\u4E13\u5C5E\u52A8\u4F5C:\u901A\u8FC7 \u2192 \u4ECE\u5899\u4E0A\u6D88\u5931,\u8FDB\u5386\u53F2;\u4E0D\u901A\u8FC7 \u2192 \u6253\u56DE open\n act(\"\u6838\u9A8C\u901A\u8FC7\", \"cs-x\", () =>\n void transition(ann.id, { status: \"verified\", verifiedAt: new Date().toISOString() }, \"\u6838\u9A8C\u901A\u8FC7,\u5DF2\u5F52\u6863\u8FDB\u5386\u53F2\")\n )\n act(\"\u6253\u56DE\", \"cs-x\", () => void transition(ann.id, { status: \"open\" }, \"\u5DF2\u6253\u56DE,\u91CD\u65B0\u5F85\u5904\u7406\"))\n }\n act(\"\u7F16\u8F91\", \"cs-x\", () => startEdit(box, textEl, ann))\n act(\"\u5220\u9664\", \"cs-x cs-x-danger\", () => void remove(ann.id))\n box.appendChild(meta)\n return box\n}\n\nasync function transition(id: string, patch: Partial<Annotation>, msg: string): Promise<void> {\n try {\n const updated = await patchAnnotation(id, patch)\n upsert(updated)\n renderPins()\n toast(msg, \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u72B6\u6001\u66F4\u65B0\u5931\u8D25:${err}`, \"error\")\n }\n}\n\n/** \u5C31\u5730\u6539\u6279\u6CE8\u6587\u5B57 + \u6302\u53C2\u8003\u56FE:\u6587\u672C\u6362\u6210 textarea,\u4FDD\u5B58\u8D70 PATCH,SSE \u4F1A\u628A\u65B0\u5185\u5BB9\u63A8\u7ED9\u6240\u6709\u5BA2\u6237\u7AEF */\nfunction startEdit(box: HTMLElement, textEl: HTMLElement, ann: Annotation): void {\n if (box.querySelector(\"textarea\")) return\n box.classList.add(\"is-editing\") // \u7F16\u8F91\u4E2D\u6C14\u6CE1\u5E38\u663E,\u4E0D\u518D\u4F9D\u8D56 hover\n const ta = h(\"textarea\", \"cs-pin-edit\") as unknown as HTMLTextAreaElement\n ta.value = ann.text\n\n // \u7F16\u8F91\u6001\u91CC\u7C98\u8D34\u7684\u56FE\u6302\u5230\u8FD9\u6761\u6279\u6CE8\u3002\u5148\u53EA\u6682\u5B58,\u548C\u6587\u5B57\u4E00\u8D77\u5728\u300C\u4FDD\u5B58\u300D\u65F6 PATCH \u2014\u2014\n // \u7ACB\u523B PATCH \u4F1A\u7ECF SSE \u89E6\u53D1 renderPins,\u628A\u7528\u6237\u6B63\u5728\u6253\u7684\u5B57\u8FDE\u8F93\u5165\u6846\u4E00\u8D77\u51B2\u6389\u3002\n const refs = [...(ann.refs ?? [])]\n // \u5DF2\u6709\u56FE\u7684\u6C14\u6CE1\u91CC\u5DF2\u7ECF\u6709\u8FD9\u6761 strip,\u6CA1\u56FE\u7684\u73B0\u9020\u4E00\u6761(\u65B0\u9020\u7684\u8FD8\u6CA1\u8FDB DOM,\u63D2\u5230\u6309\u94AE\u884C\u524D\u9762)\n const strip = box.querySelector<HTMLElement>(\".cs-ref-strip\") ?? refStrip([])\n if (!strip.isConnected) box.insertBefore(strip, box.querySelector(\".cs-pin-meta\"))\n setPasteTarget({\n el: box,\n onFile: (file) => {\n void uploadRef(file)\n .then((path) => {\n refs.push(path)\n strip.appendChild(refThumb(path))\n toast(`\u53C2\u8003\u56FE\u5DF2\u4E0A\u4F20:${path} \u2014\u2014 \u70B9\u300C\u4FDD\u5B58\u300D\u540E\u624D\u6302\u5230\u8FD9\u6761\u6279\u6CE8`, \"ok\")\n })\n .catch((err) => toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\"))\n },\n })\n ta.addEventListener(\"keydown\", (e) => {\n e.stopPropagation() // \u7F16\u8F91\u65F6\u4E0D\u89E6\u53D1\u753B\u5E03\u5FEB\u6377\u952E\n // Enter \u4FDD\u5B58(Shift+Enter \u624D\u662F\u6362\u884C),Esc \u53D6\u6D88 \u2014\u2014 \u5168\u5C40\u5FEB\u6377\u952E\u5728\u8F93\u5165\u6846\u91CC\u88AB\u6321\u6389\u4E86,\n // \u6240\u4EE5\"Enter \u7F16\u8F91/\u4FDD\u5B58\"\u8FD9\u6761\u95ED\u73AF\u5FC5\u987B\u5728\u8FD9\u91CC\u81EA\u5DF1\u63A5\u4E0A\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault()\n save.click()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n renderPins()\n }\n })\n ta.addEventListener(\"mousedown\", (e) => e.stopPropagation())\n const row = h(\"div\", \"cs-pin-meta\")\n const save = h(\"button\", \"cs-x\", \"\u4FDD\u5B58\")\n save.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n const text = ta.value.trim()\n const textChanged = !!text && text !== ann.text\n const refsChanged = refs.length !== (ann.refs?.length ?? 0)\n if (!textChanged && !refsChanged) return renderPins()\n const patch: Partial<Annotation> = {}\n if (textChanged) patch.text = text\n if (refsChanged) patch.refs = refs\n void patchAnnotation(ann.id, patch)\n .then((updated) => {\n upsert(updated)\n renderPins()\n toast(\"\u6279\u6CE8\u5DF2\u66F4\u65B0\", \"ok\")\n })\n .catch((err) => toast(`\u6279\u6CE8\u66F4\u65B0\u5931\u8D25:${err}`, \"error\"))\n })\n const cancel = h(\"button\", \"cs-x\", \"\u53D6\u6D88\")\n cancel.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n renderPins() // \u91CD\u753B\u5373\u8FD8\u539F\n })\n row.appendChild(save)\n row.appendChild(cancel)\n textEl.replaceWith(ta)\n box.appendChild(row)\n ta.focus()\n ta.setSelectionRange(ta.value.length, ta.value.length)\n}\n\nasync function remove(id: string): Promise<void> {\n try {\n await deleteAnnotation(id)\n state.annotations = state.annotations.filter((a) => a.id !== id)\n renderPins()\n toast(\"\u6279\u6CE8\u5DF2\u5220\u9664\", \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u5220\u9664\u5931\u8D25:${err}`, \"error\")\n }\n}\n\n/** \u65E7\u7248\u672C\u628A\u4E0A\u6B21\u9009\u7684\u4F1A\u8BDD\u8BB0\u5728\u8FD9\u91CC\u3002\u73B0\u5728\u6BCF\u6B21\u90FD\u95EE,\u987A\u624B\u628A\u6B8B\u7559\u7684\u952E\u6E05\u6389 */\nfunction legacyPushMemKey(): string {\n return `cs-pushpid:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\n/**\n * \u4E00\u952E\u63A8\u9001\u3002**\u4E0D\u8BB0\u5FC6\u4F1A\u8BDD**:\u53EA\u8981\u6709\u591A\u4E2A\u5019\u9009,\u6BCF\u6B21\u63A8\u9001\u90FD\u5F39\u9009\u62E9\u5668\u8BA9\u4EBA\u5F53\u573A\u9009\n * \u2014\u2014\u63A8\u9519\u7A97\u53E3\u7684\u4EE3\u4EF7\u8FDC\u5927\u4E8E\u6BCF\u6B21\u70B9\u4E00\u4E0B\u3002\u552F\u4E00\u5019\u9009\u65F6\u670D\u52A1\u7AEF\u76F4\u53D1(\u4E0D\u6253\u6270)\u3002\n * pid \u53EA\u53EF\u80FD\u6765\u81EA\u521A\u624D\u90A3\u4E2A\u9009\u62E9\u5668\u3002\n * (\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F Shift+P\u300C\u5F3A\u5236\u91CD\u9009\u300D\u7684\u9057\u7559\u5165\u53C2,\u73B0\u5728\u6052\u7B49\u4E8E\u9ED8\u8BA4\u884C\u4E3A,\u7559\u7740\u53EA\u4E3A\u8BA9 modes.ts \u7F16\u8BD1\u8FC7;\n * \u89C1\u5B8C\u6210\u62A5\u544A:\u96C6\u6210\u8D1F\u8D23\u4EBA\u5220\u6389 modes.ts \u7684 Shift+P \u5206\u652F\u540E\u53EF\u4E00\u5E76\u53BB\u6389\u3002)\n */\nexport async function pushToClaudeCode(pid?: number): Promise<void> {\n setProbe(\"\u63A8\u9001\u4E2D\u2026\")\n try {\n try {\n localStorage.removeItem(legacyPushMemKey())\n } catch {\n /* \u6E05\u4E0D\u6389\u4E5F\u65E0\u6240\u8C13,\u53CD\u6B63\u4E0D\u518D\u8BFB\u5B83 */\n }\n let r = await pushContext(pid)\n // \u521A\u9009\u7684\u4F1A\u8BDD\u5728\u8FD9\u4E00\u77AC\u95F4\u5173\u6389\u4E86 \u2192 \u91CD\u65B0\u5217\u4E00\u904D(\u4F1A\u62FF\u5230\u65B0\u7684 choose \u6216\u552F\u4E00\u5019\u9009)\n if (!r.ok && \"reason\" in r && r.reason?.includes(\"\u5DF2\u4E0D\u5728\") && pid !== undefined) {\n r = await pushContext()\n }\n if (r.ok) {\n // \u8BF4\"\u5DF2\u6295\u9012\"\u800C\u4E0D\u662F\"\u5DF2\u9001\u8FBE\":Claude Code \u7684 inbound gate \u4F1A\u6309\u6743\u9650\u6A21\u5F0F hold/refuse,\n // \u76EE\u6807\u4F1A\u8BDD\u5F00\u7740 --dangerously-skip-permissions \u65F6\u5BF9\u65B9\u7EC8\u7AEF\u5F39\u7684\u662F\u5BA1\u6279\u6846,\u4E0D\u662F\u76F4\u63A5\u63A5\u6D3B\n toast(`\u5DF2\u6295\u9012\u5230\u300C${r.name}\u300D\u7684 inbox \u2014 \u8BE5\u4F1A\u8BDD\u53EF\u80FD\u9700\u8981\u4F60\u5728\u7EC8\u7AEF\u70B9\u4E00\u4E0B\u786E\u8BA4`, \"ok\")\n return\n }\n if (\"choose\" in r && r.choose?.length) {\n showSessionPicker(r.choose)\n return\n }\n toast(`${(\"reason\" in r && r.reason) || \"\u63A8\u9001\u5931\u8D25\"} \u2014\u2014 \u5DF2\u56DE\u843D\u4E3A\u590D\u5236\u5230\u526A\u8D34\u677F`, \"warn\")\n await copyContext()\n } catch (err) {\n toast(`\u63A8\u9001\u5931\u8D25:${err} \u2014\u2014 \u5DF2\u56DE\u843D\u4E3A\u590D\u5236\u5230\u526A\u8D34\u677F`, \"warn\")\n await copyContext()\n }\n}\n\n/** \u4F1A\u8BDD\u9009\u62E9\u5668:\u540C\u76EE\u5F55\u5F00\u4E86\u591A\u4E2A Claude \u7A97\u53E3\u65F6,\u6309\u540D\u5B57\u6311\u4E00\u4E2A(\u6570\u5B57\u952E/\u70B9\u51FB,Esc \u53D6\u6D88) */\nfunction showSessionPicker(items: Array<{ pid: number; name: string; status: string }>): void {\n document.getElementById(\"cs-picker\")?.remove()\n const wrap = h(\"div\", \"cs-picker\")\n wrap.id = \"cs-picker\"\n const card = h(\"div\", \"cs-card\")\n card.appendChild(h(\"h2\", undefined, \"\u63A8\u9001\u7ED9\u54EA\u4E2A\u4F1A\u8BDD?\"))\n\n // cleanup \u5FC5\u987B\u5728\u884C\u70B9\u51FB\u4E4B\u524D\u5B9A\u4E49:\u53EA remove \u4E0D\u6458\u76D1\u542C\u4F1A\u628A\u6355\u83B7\u671F keydown \u7559\u5728 document \u4E0A,\n // \u4E4B\u540E\u5728\u6279\u6CE8\u8F93\u5165\u6846\u91CC\u6253\u6570\u5B57\u5C31\u4F1A\u9759\u9ED8\u89E6\u53D1\u63A8\u9001(\u6355\u83B7\u671F\u8DD1\u5728\u8F93\u5165\u6846\u7684 stopPropagation \u4E4B\u524D)\n const cleanup = (): void => {\n document.removeEventListener(\"keydown\", onKey, true)\n wrap.remove()\n }\n\n items.slice(0, 9).forEach((it, i) => {\n const row = h(\n \"button\",\n \"cs-picker-row\",\n `${i + 1} ${it.name}`\n )\n const badge = h(\"span\", `cs-picker-status is-${it.status}`, it.status)\n row.appendChild(badge)\n row.addEventListener(\"click\", () => {\n cleanup()\n void pushToClaudeCode(it.pid)\n })\n card.appendChild(row)\n })\n card.appendChild(h(\"p\", \"cs-dim\", \"\u6570\u5B57\u952E\u9009\u62E9 \u00B7 Esc \u53D6\u6D88\"))\n wrap.appendChild(card)\n const onKey = (e: KeyboardEvent): void => {\n const n = Number(e.key)\n if (Number.isInteger(n) && n >= 1 && n <= Math.min(items.length, 9)) {\n e.stopPropagation()\n cleanup()\n void pushToClaudeCode(items[n - 1]!.pid)\n } else if (e.key === \"Escape\") {\n e.stopPropagation()\n cleanup()\n toast(\"\u5DF2\u53D6\u6D88\u63A8\u9001\")\n }\n }\n document.addEventListener(\"keydown\", onKey, true)\n wrap.addEventListener(\"click\", (e) => {\n if (e.target === wrap) cleanup()\n })\n document.body.appendChild(wrap)\n}\n\n/** \u590D\u5236\u6279\u6CE8\u7ED9 Claude:\u4E0E hook \u6CE8\u5165\u7EC8\u7AEF\u7684\u662F\u540C\u4E00\u4EFD /api/context \u6587\u672C */\nexport async function copyContext(): Promise<void> {\n try {\n const text = await fetchContext()\n if (!text.trim()) {\n toast(\"\u6CA1\u6709\u5F85\u5904\u7406\u7684\u6279\u6CE8\u6216\u9009\u4E2D,\u5148\u6309 c \u9489\u4E00\u6761\", \"warn\")\n return\n }\n await navigator.clipboard.writeText(text)\n const n = state.annotations.filter((a) => a.status === \"open\").length\n toast(`\u5DF2\u590D\u5236 ${n} \u6761\u6279\u6CE8(\u542B\u9009\u4E2D),\u7C98\u5230\u4EFB\u4F55 Claude Code \u7A97\u53E3\u5373\u53EF`, \"ok\")\n } catch (err) {\n toast(`\u590D\u5236\u5931\u8D25:${err}`, \"error\")\n }\n}\n\nfunction upsert(ann: Annotation): void {\n const i = state.annotations.findIndex((a) => a.id === ann.id)\n if (i >= 0) state.annotations[i] = ann\n else state.annotations.push(ann)\n}\n\n/** \u70B9\u4E86\u5143\u7D20,\u5C31\u5730\u5F00\u4E00\u4E2A\u5C0F\u8F93\u5165\u6846 */\nexport function openComposer(board: Board, el: Element, clientX: number, clientY: number): void {\n closeComposer()\n const selector = buildSelector(el)\n const rel = relPos(el, clientX, clientY, board)\n\n const box = h(\"div\", \"cs-pin-input\")\n box.style.left = `${Math.min(clientX + 10, window.innerWidth - 250)}px`\n // 170 \u800C\u4E0D\u662F 110:\u8D34\u4E00\u884C\u53C2\u8003\u56FE\u7F29\u7565\u56FE\u540E\u8FD9\u4E2A\u6846\u4F1A\u957F\u5230\u7EA6 150px \u9AD8,\u9760\u8FD1\u5C4F\u5E55\u5E95\u8FB9\u9489 pin \u65F6\u522B\u9732\u51FA\u53BB\n box.style.top = `${Math.min(clientY + 10, window.innerHeight - 170)}px`\n const ta = h(\"textarea\")\n ta.placeholder = `\u6279\u6CE8 ${selector}`\n const strip = refStrip([])\n const tip = h(\"div\", \"cs-pin-tip\", \"Enter \u63D0\u4EA4 \u00B7 Shift+Enter \u6362\u884C \u00B7 Cmd/Ctrl+V \u8D34\u53C2\u8003\u56FE \u00B7 Esc \u53D6\u6D88\")\n box.append(ta, strip, tip)\n fx.appendChild(box)\n composer = box\n ta.focus()\n\n // \u8F93\u5165\u6846\u5F00\u7740\u65F6\u7C98\u8D34\u7684\u56FE\u5F52\u8FD9\u6761\u6279\u6CE8(\u968F\u521B\u5EFA\u8BF7\u6C42\u4E00\u8D77\u63D0\u4EA4),\u4E0D\u518D\u8FDB\u5168\u5C40\u575E\n const refs: string[] = []\n setPasteTarget({\n el: box,\n onFile: (file) => {\n void uploadRef(file)\n .then((path) => {\n refs.push(path)\n strip.appendChild(refThumb(path))\n setProbe(`\u53C2\u8003\u56FE\u5DF2\u6302\u5230\u8FD9\u6761\u6279\u6CE8:${path}`)\n })\n .catch((err) => toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\"))\n },\n })\n\n ta.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n e.stopPropagation() // \u522B\u8BA9\u753B\u5E03\u5FEB\u6377\u952E\u62A2\u8D70\u6309\u952E\n if (e.key === \"Escape\") {\n closeComposer()\n exitPinMode()\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n const text = ta.value.trim()\n if (!text) {\n closeComposer()\n exitPinMode()\n return\n }\n void submit(board, selector, rel, text, refs)\n }\n })\n}\n\nasync function submit(\n board: Board,\n selector: string,\n rel: { x: number; y: number },\n text: string,\n refs: string[]\n): Promise<void> {\n closeComposer()\n // \u4E0D\u9000\u51FA\u6279\u6CE8\u6A21\u5F0F:\u8D70\u67E5\u4E00\u904D\u754C\u9762\u5F80\u5F80\u8981\u8FDE\u9489\u597D\u51E0\u6761,\u6BCF\u6761\u90FD\u91CD\u6309\u4E00\u6B21 c \u662F\u7EAF\u6469\u64E6\u3002\n // Esc \u9000\u51FA,HUD \u4F1A\u663E\u793A\"\u6279\u6CE8\u4E2D \u00B7 \u5DF2\u9489 N\"\u3002\n try {\n const ann = await createAnnotation({\n artboardId: board.entry.id,\n anchor: { selector, x: rel.x, y: rel.y },\n text,\n refs,\n status: \"open\",\n })\n upsert(ann)\n renderBoardPins(board)\n state.pinnedThisRun++\n syncHud()\n const withRefs = refs.length ? ` \u00B7 \u5E26 ${refs.length} \u5F20\u53C2\u8003\u56FE` : \"\"\n toast(`\u5DF2\u8BB0\u6279\u6CE8:${text.slice(0, 30)}${text.length > 30 ? \"\u2026\" : \"\"}${withRefs}`, \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u5931\u8D25:${String(err)}`, \"error\")\n }\n}\n\nexport function closeComposer(): void {\n composer?.remove()\n composer = null\n setPasteTarget(null) // \u8F93\u5165\u6846\u6CA1\u4E86,\u7C98\u8D34\u56DE\u5230\u5168\u5C40\u575E\n}\n\nexport function isComposing(): boolean {\n return composer !== null\n}\n\nexport function enterPinMode(): void {\n state.pinPending = true\n state.pinnedThisRun = 0\n syncHud()\n setProbe(\"\u6279\u6CE8\u6A21\u5F0F:\u70B9\u5143\u7D20\u843D pin,\u53EF\u8FDE\u9489\u591A\u6761,Esc \u9000\u51FA\")\n}\n\nexport function exitPinMode(): void {\n if (!state.pinPending) return\n state.pinPending = false\n if (state.pinnedThisRun > 0)\n toast(`\u672C\u8F6E\u9489\u4E86 ${state.pinnedThisRun} \u6761\u6279\u6CE8 \u00B7 \u6309 p \u63A8\u7ED9 Claude`, \"info\")\n state.pinnedThisRun = 0\n syncHud()\n setProbe(\"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n", "// \u4E16\u754C\u5BB9\u5668\u7684\u7F29\u653E/\u5E73\u79FB:transform \u5E94\u7528\u3001Ctrl+wheel \u4EE5\u5149\u6807\u4E3A\u951A\u7F29\u653E\u3001\u7A7A\u767D\u62D6\u62FD\u5E73\u79FB\nimport { clamp, qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\n\nexport const MIN_SCALE = 0.05\nexport const MAX_SCALE = 2\n\nlet viewport: HTMLDivElement\nlet world: HTMLDivElement\nlet zoomLabel: HTMLElement\nconst listeners: Array<() => void> = []\n\n/** \u89C6\u56FE\u53D8\u4E86(\u7F29\u653E/\u5E73\u79FB/\u5E03\u5C40)\u4E4B\u540E\u8981\u91CD\u7B97\u7684\u4E1C\u897F:\u9AD8\u4EAE\u6846\u3001\u7F29\u653E\u6807\u7B7E\u7B49 */\nexport function onViewChange(fn: () => void): void {\n listeners.push(fn)\n}\n\n// ---------- \u89C6\u56FE\u6301\u4E45\u5316:\u5237\u65B0/\u91CD\u542F\u540E\u56DE\u5230\u4E0A\u6B21\u7684\u4F4D\u7F6E\u4E0E\u7F29\u653E ----------\n\n/** \u6309\u9879\u76EE\u5206\u952E:\u591A\u9879\u76EE\u5171\u7528\u540C\u4E00\u7AEF\u53E3\u65F6 localStorage \u4E0D\u4E92\u76F8\u8E29 */\nfunction viewKey(): string {\n return `cs-view:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nlet saveTimer: ReturnType<typeof setTimeout> | null = null\nfunction persistView(): void {\n // \u8D70\u67E5\u6A21\u5F0F\u662F\u4E34\u65F6\u89C6\u56FE(Esc \u4F1A\u8FD8\u539F),\u4E0D\u843D\u76D8;\u843D\u7684\u662F\u5B83\u8FDB\u5165\u524D\u8BB0\u4F4F\u7684\u6D4F\u89C8\u89C6\u56FE\n const v =\n state.mode === \"review\" && state.viewBeforeReview\n ? state.viewBeforeReview\n : { tx: state.tx, ty: state.ty, scale: state.scale }\n if (saveTimer !== null) clearTimeout(saveTimer)\n saveTimer = setTimeout(() => {\n try {\n localStorage.setItem(viewKey(), JSON.stringify(v))\n } catch {\n /* \u9690\u79C1\u6A21\u5F0F\u7B49\u5B58\u4E0D\u4E86\u5C31\u7B97\u4E86 */\n }\n }, 300)\n}\n\n/** state.info \u5C31\u4F4D\u540E\u8C03\u7528:\u6062\u590D\u4E0A\u6B21\u89C6\u56FE,\u6CA1\u5B58\u8FC7\u8FD4\u56DE false(\u7528\u9ED8\u8BA4\u4F4D\u7F6E) */\nexport function restoreView(): boolean {\n try {\n const raw = localStorage.getItem(viewKey())\n if (!raw) return false\n const v = JSON.parse(raw) as { tx: number; ty: number; scale: number }\n if (![v.tx, v.ty, v.scale].every(Number.isFinite)) return false\n setView(v.tx, v.ty, v.scale)\n return true\n } catch {\n return false\n }\n}\n\nlet raf = 0\nexport function applyView(): void {\n world.style.transform = `translate(${state.tx}px, ${state.ty}px) scale(${state.scale})`\n // pin \u4E4B\u7C7B\u7684 UI \u7528\u53CD\u5411\u7F29\u653E\u62B5\u6D88,\u4FDD\u6301\u6052\u5B9A\u89C6\u89C9\u5927\u5C0F\n world.style.setProperty(\"--cs-inv\", String(1 / state.scale))\n // \u70B9\u9635\u80CC\u666F\u8DDF\u7740\u4E00\u8D77\u52A8,\u5E73\u79FB\u7F29\u653E\u624D\u6709\"\u771F\u5B9E\u7A7A\u95F4\"\u7684\u624B\u611F\n const grid = 24 * state.scale\n viewport.style.backgroundSize = `${grid}px ${grid}px`\n viewport.style.backgroundPosition = `${state.tx}px ${state.ty}px`\n zoomLabel.textContent = `${Math.round(state.scale * 100)}%`\n persistView()\n if (raf) return\n raf = requestAnimationFrame(() => {\n raf = 0\n for (const fn of listeners) fn()\n })\n}\n\nexport function setView(tx: number, ty: number, scale: number): void {\n state.scale = clamp(scale, MIN_SCALE, MAX_SCALE)\n state.tx = tx\n state.ty = ty\n applyView()\n}\n\n/** \u4EE5\u5C4F\u5E55\u4E0A\u67D0\u70B9\u4E3A\u951A\u7F29\u653E */\n/** \u4E16\u754C\u5185\u5BB9\u7684\u5305\u56F4\u76D2(\u4E16\u754C\u5750\u6807)\u3002\u7A7A\u5899\u8FD4\u56DE null */\nfunction worldBounds(): { x: number; y: number; w: number; h: number } | null {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n for (const b of state.boards.values()) {\n if (b.el.hidden) continue // \u9690\u85CF\u7684\u753B\u677F\u4E0D\u8BE5\u628A\u5305\u56F4\u76D2\u6491\u5927\n const x = parseFloat(b.el.style.left || \"0\")\n const y = parseFloat(b.el.style.top || \"0\")\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x + b.width)\n maxY = Math.max(maxY, y + b.height + 40)\n }\n if (!Number.isFinite(minX)) return null\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY }\n}\n\n/** \u5E73\u6ED1\u5730\u628A\u89C6\u56FE\u79FB\u5230\u76EE\u6807\u503C;\u62D6\u62FD/\u6EDA\u8F6E\u4E0D\u8D70\u8FD9\u91CC(\u90A3\u4E9B\u5FC5\u987B\u8DDF\u624B,\u4E0D\u80FD\u5E26\u8FC7\u6E21)\u3002\n * \u26A0\uFE0F \u8FC7\u6E21\u671F\u95F4 state \u5DF2\u662F\u7EC8\u503C\u3001DOM \u8FD8\u5728\u534A\u8DEF,\u4EFB\u4F55\u8BFB\u51E0\u4F55\u7684\u76D1\u542C\u8005(\u9AD8\u4EAE\u6846\u3001pin \u951A\u70B9)\n * \u8FD9\u4E00\u5E27\u7B97\u51FA\u6765\u7684\u90FD\u662F\u9519\u7684,\u800C applyView \u53EA\u5728\u5F00\u5934\u89E6\u53D1\u8FC7\u4E00\u6B21 \u2014\u2014 \u6240\u4EE5\u8FC7\u6E21\u7ED3\u675F\u540E\u5FC5\u987B\u518D\u8865\u4E00\u6B21,\n * \u5426\u5219\u9519\u4F4D\u4F1A\u6C38\u4E45\u9489\u5728\u90A3\u91CC\u3002 */\nfunction animateTo(tx: number, ty: number, scale: number): void {\n const world = qs<HTMLDivElement>(\"#cs-world\")\n world.style.transition = `transform var(--cs-dur-3) var(--cs-ease-out)`\n setView(tx, ty, scale)\n window.setTimeout(() => {\n world.style.transition = \"\" // \u52A8\u753B\u7ED3\u675F\u5C31\u6458\u6389,\u907F\u514D\u6C61\u67D3\u540E\u7EED\u8DDF\u624B\u64CD\u4F5C\n applyView() // DOM \u5DF2\u5230\u7EC8\u70B9,\u8BA9\u76D1\u542C\u8005\u6309\u771F\u5B9E\u51E0\u4F55\u91CD\u7B97\u4E00\u6B21\n }, 260)\n}\n\n/** \u53EF\u7528\u89C6\u53E3:\u6263\u6389\u5DE6\u4FA7\u680F,\u5426\u5219\u5185\u5BB9\u4F1A\u88AB\u538B\u5728\u680F\u5E95\u4E0B */\nexport function usableViewport(): { x: number; y: number; width: number; height: number } {\n const vp = qs(\"#cs-viewport\").getBoundingClientRect()\n const sb = document.getElementById(\"cs-sidebar\")\n const off = sb && document.body.dataset.sidebar !== \"off\" ? sb.getBoundingClientRect().width : 0\n return { x: vp.x + off, y: vp.y, width: vp.width - off, height: vp.height }\n}\n\n/** \u5168\u666F:\u4E00\u5C4F\u770B\u5B8C\u6574\u9762\u5899 */\nexport function fitAll(pad = 64): void {\n const b = worldBounds()\n if (!b) return\n const vp = usableViewport()\n const scale = clamp(\n Math.min((vp.width - pad * 2) / b.w, (vp.height - pad * 2) / b.h),\n MIN_SCALE,\n MAX_SCALE\n )\n animateTo(\n vp.x + vp.width / 2 - (b.x + b.w / 2) * scale,\n vp.y + vp.height / 2 - (b.y + b.h / 2) * scale,\n scale\n )\n}\n\n/** \u805A\u7126\u5230\u67D0\u5757\u753B\u677F(\u9ED8\u8BA4\u5F53\u524D\u6D3B\u52A8\u677F) */\nexport function fitBoard(id?: string | null, pad = 80): void {\n const board = state.boards.get(id ?? state.activeId ?? \"\")\n if (!board) return fitAll()\n const x = parseFloat(board.el.style.left || \"0\")\n const y = parseFloat(board.el.style.top || \"0\")\n const vp = usableViewport()\n const scale = clamp(\n Math.min((vp.width - pad * 2) / board.width, (vp.height - pad * 2) / (board.height + 40)),\n MIN_SCALE,\n MAX_SCALE\n )\n animateTo(\n vp.x + vp.width / 2 - (x + board.width / 2) * scale,\n vp.y + vp.height / 2 - (y + (board.height + 40) / 2) * scale,\n scale\n )\n}\n\n/** \u7F29\u653E\u5230 100%,\u4FDD\u6301\u89C6\u53E3\u4E2D\u5FC3\u4E0D\u52A8 */\nexport function zoomReset(): void {\n const vp = usableViewport()\n const cx = vp.x + vp.width / 2\n const cy = vp.y + vp.height / 2\n const k = 1 / state.scale\n animateTo(cx - (cx - state.tx) * k, cy - (cy - state.ty) * k, 1)\n}\n\n/** \u4EE5\u89C6\u53E3\u4E2D\u5FC3\u4E3A\u951A\u70B9\u6B65\u8FDB\u7F29\u653E(+/- \u952E\u7528) */\nexport function zoomStep(factor: number): void {\n const vp = usableViewport()\n zoomAt(vp.x + vp.width / 2, vp.y + vp.height / 2, factor)\n}\n\nexport function zoomAt(clientX: number, clientY: number, factor: number): void {\n const next = clamp(state.scale * factor, MIN_SCALE, MAX_SCALE)\n if (next === state.scale) return\n const r = viewport.getBoundingClientRect()\n const cx = clientX - r.left\n const cy = clientY - r.top\n const k = next / state.scale\n state.tx = cx - (cx - state.tx) * k\n state.ty = cy - (cy - state.ty) * k\n state.scale = next\n applyView()\n}\n\n/** \u4E8B\u4EF6\u76EE\u6807\u7B97\u4E0D\u7B97\"\u7A7A\u767D\"(\u7A7A\u767D\u5904\u624D\u62D6\u52A8\u5E73\u79FB) */\nfunction isBlank(target: EventTarget | null): boolean {\n const el = target as Element | null\n if (!el) return false\n return !el.closest(\".cs-board\")\n}\n\nexport function initView(): void {\n viewport = qs<HTMLDivElement>(\"#cs-viewport\")\n world = qs<HTMLDivElement>(\"#cs-world\")\n zoomLabel = qs(\"#cs-zoom\")\n\n viewport.addEventListener(\n \"wheel\",\n (e: WheelEvent) => {\n e.preventDefault()\n if (e.ctrlKey || e.metaKey) {\n // Ctrl+wheel / \u89E6\u63A7\u677F\u634F\u5408(\u6D4F\u89C8\u5668\u628A\u634F\u5408\u62A5\u6210 ctrlKey \u7684 wheel)\n zoomAt(e.clientX, e.clientY, Math.exp(-e.deltaY / 260))\n } else {\n // \u53CC\u6307\u6EDA\u8F6E = \u5E73\u79FB\n state.tx -= e.deltaX\n state.ty -= e.deltaY\n applyView()\n }\n },\n { passive: false }\n )\n\n let panId: number | null = null\n let lastX = 0\n let lastY = 0\n viewport.addEventListener(\"pointerdown\", (e: PointerEvent) => {\n // \u7A7A\u767D\u5904\u5DE6\u952E \u6216 \u4EFB\u610F\u5904\u4E2D\u952E \u2192 \u5E73\u79FB\n if (!(e.button === 1 || (e.button === 0 && isBlank(e.target)))) return\n panId = e.pointerId\n lastX = e.clientX\n lastY = e.clientY\n viewport.classList.add(\"is-panning\")\n viewport.setPointerCapture(e.pointerId)\n })\n viewport.addEventListener(\"pointermove\", (e: PointerEvent) => {\n if (panId !== e.pointerId) return\n state.tx += e.clientX - lastX\n state.ty += e.clientY - lastY\n lastX = e.clientX\n lastY = e.clientY\n applyView()\n })\n const endPan = (e: PointerEvent) => {\n if (panId !== e.pointerId) return\n panId = null\n viewport.classList.remove(\"is-panning\")\n }\n viewport.addEventListener(\"pointerup\", endPan)\n viewport.addEventListener(\"pointercancel\", endPan)\n\n applyView()\n}\n\nexport function isPanning(): boolean {\n return viewport.classList.contains(\"is-panning\")\n}\n", "// \u4E09\u6A21\u5F0F(\u6D4F\u89C8/\u4EA4\u4E92/\u8D70\u67E5)+ overlay \u4E8B\u4EF6\u53CD\u67E5 + \u5FEB\u6377\u952E\nimport { postSelection } from \"./api.js\"\nimport { clamp, qs } from \"./dom.js\"\nimport { setProbe, syncHud } from \"./hud.js\"\nimport { closeArgsPanel, isArgsOpen, openArgsPanel } from \"./args-panel.js\"\nimport {\n closeComposer, copyContext, deleteSelectedPin, editSelectedPin, enterPinMode, exitPinMode,\n isComposing, openComposer, pushToClaudeCode, selectPin, selectedPin,\n} from \"./pins.js\"\nimport {\n buildSelector,\n clearSelection,\n describe,\n elementAt,\n hideHover,\n relPos,\n showHover,\n showSelection,\n} from \"./select.js\"\nimport { state, type Board, type Mode } from \"./state.js\"\nimport {\n MAX_SCALE, MIN_SCALE, applyView, fitAll, fitBoard, isPanning, setView, zoomReset, zoomStep,\n} from \"./view.js\"\n\nlet viewport: HTMLDivElement\n\nfunction boardOf(target: EventTarget | null): Board | null {\n const el = (target as Element | null)?.closest?.(\".cs-board\") as HTMLElement | null\n if (!el?.dataset.id) return null\n return state.boards.get(el.dataset.id) ?? null\n}\n\nexport function setActive(id: string | null): void {\n if (state.activeId === id) return\n state.activeId = id\n for (const b of state.boards.values()) b.el.classList.toggle(\"is-active\", b.entry.id === id)\n}\n\nexport function setMode(mode: Mode, boardId?: string): void {\n if (mode !== \"browse\" && boardId) setActive(boardId)\n if (mode === \"review\" && !state.activeId) return\n const from = state.mode\n state.mode = mode\n hideHover()\n // \u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u4E0B,\u53EF\u4EA4\u4E92\u7684\u662F\u6574\u5757\u753B\u677F,\u5143\u7D20\u7EA7\u7684\u9009\u4E2D\u6846\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\"\u53EA\u6709\u8FD9\u4E2A\u5143\u7D20\u80FD\u70B9\"\u3002\n // \u6536\u6389\u6846,\u6539\u7531\u753B\u677F\u6574\u4F53\u7684\u9AD8\u4EAE\u8FB9\u6846\u8868\u8FBE\u8303\u56F4 \u2014\u2014 \u4EA4\u4E92\u8303\u56F4 = \u9AD8\u4EAE\u8303\u56F4\u3002\n if (mode !== \"browse\") clearSelection()\n syncHud()\n\n if (mode === \"review\" && from !== \"review\") {\n state.modeBeforeReview = from\n state.viewBeforeReview = { scale: state.scale, tx: state.tx, ty: state.ty }\n closeArgsPanel() // \u8D70\u67E5\u8981\u7684\u662F\u5168\u5BBD,\u522B\u8BA9 args \u9762\u677F\u538B\u4F4F\u5BBD\u753B\u677F\n fitActiveBoard()\n } else if (mode !== \"review\" && from === \"review\" && state.viewBeforeReview) {\n const v = state.viewBeforeReview\n state.viewBeforeReview = null\n setView(v.tx, v.ty, v.scale)\n }\n setProbe(\n mode === \"interact\"\n ? \"\u4EA4\u4E92\u6A21\u5F0F:\u76F4\u63A5\u64CD\u4F5C\u8FD9\u5757\u753B\u677F,Esc \u56DE\u6D4F\u89C8\"\n : mode === \"review\"\n ? \"\u8D70\u67E5\u6A21\u5F0F:Esc \u9000\u51FA\"\n : \"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\"\n )\n}\n\n/** \u8D70\u67E5:\u628A\u5F53\u524D\u753B\u677F\u7F29\u653E\u5E73\u79FB\u5230\u94FA\u6EE1\u89C6\u53E3(\u4E0D\u642C DOM,iframe \u4E0D\u4F1A\u91CD\u8F7D) */\nfunction fitActiveBoard(): void {\n const board = state.activeId ? state.boards.get(state.activeId) : null\n if (!board) return\n // data-mode \u5DF2\u5207\u5230 review(\u6807\u9898\u6761\u5DF2\u9690\u85CF),\u6B64\u523B\u8BFB\u5230\u7684\u624D\u662F\u6700\u7EC8\u4F4D\u7F6E\n const r = board.frameEl.getBoundingClientRect()\n const worldX = (r.left - state.tx) / state.scale\n const worldY = (r.top - state.ty) / state.scale\n const vw = window.innerWidth\n const vh = window.innerHeight\n const s = clamp(Math.min(vw / board.width, vh / board.height), MIN_SCALE, MAX_SCALE)\n setView((vw - board.width * s) / 2 - worldX * s, (vh - board.height * s) / 2 - worldY * s, s)\n}\n\n/** Esc \u9010\u7EA7\u9000\u51FA:\u6279\u6CE8 \u2192 \u8D70\u67E5 \u2192 \u4EA4\u4E92 \u2192 \u6E05\u9009\u4E2D */\nfunction escape(): void {\n if (isComposing()) {\n closeComposer()\n exitPinMode()\n return\n }\n if (state.pinPending) {\n exitPinMode()\n return\n }\n if (selectedPin()) {\n selectPin(null)\n return\n }\n if (state.mode === \"review\") {\n setMode(state.modeBeforeReview === \"review\" ? \"browse\" : state.modeBeforeReview)\n return\n }\n if (state.mode === \"interact\") {\n setMode(\"browse\")\n return\n }\n clearSelection()\n closeArgsPanel()\n setProbe(\"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\" || el.isContentEditable === true) return true\n // chrome \u5C42(\u4FA7\u680F/args \u9762\u677F/\u9009\u62E9\u5668)\u91CC\u7684\u63A7\u4EF6\u81EA\u5DF1\u5C31\u8981\u7528 Enter/Space/Backspace\u3002\n // \u53EA\u6309\u6807\u7B7E\u540D\u5224\u65AD\u7684\u8BDD,\u7126\u70B9\u4E00\u843D\u5230\u4FA7\u680F\u7684\u6298\u53E0\u6309\u94AE\u4E0A,\u6309 Enter \u5C31\u88AB\"\u8D70\u67E5\"\u5403\u6389,\u6309\u94AE\u6C38\u8FDC\u6309\u4E0D\u4E0B\u53BB\u3002\n return el.closest(\"#cs-sidebar, #cs-args, .cs-picker, #cs-topbar\") !== null\n}\n\nfunction onKeyDown(e: KeyboardEvent): void {\n if (e.key === \"Escape\") {\n escape()\n return\n }\n if (isEditable(e.target) || e.metaKey || e.ctrlKey || e.altKey) return\n if (e.key === \"Enter\") {\n // \u9009\u4E2D\u4E86 pin \u5C31\u5148\u670D\u52A1\u5B83:Enter \u8FDB\u7F16\u8F91,\u7F16\u8F91\u4E2D Enter \u4FDD\u5B58\n if (selectedPin()) {\n e.preventDefault()\n editSelectedPin()\n return\n }\n if (state.mode !== \"review\" && state.activeId) {\n e.preventDefault()\n setMode(\"review\", state.activeId)\n }\n return\n }\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n if (selectedPin()) {\n e.preventDefault()\n deleteSelectedPin()\n }\n return\n }\n if (e.key === \"c\" || e.key === \"C\") {\n if (state.mode === \"browse\" && !state.pinPending) {\n e.preventDefault()\n enterPinMode()\n }\n return\n }\n if (e.key === \"y\" || e.key === \"Y\") {\n e.preventDefault()\n void copyContext()\n return\n }\n if (e.key === \"p\") {\n e.preventDefault()\n void pushToClaudeCode() // \u591A\u5019\u9009\u65F6\u6BCF\u6B21\u90FD\u5F39\u9009\u62E9\u5668,\u6CA1\u6709\"\u8BB0\u4F4F\u7684\u4F1A\u8BDD\"\u8FD9\u56DE\u4E8B\n return\n }\n // \u89C6\u56FE\u5BFC\u822A:\u4E00\u6574\u9762\u5899\u6CA1\u6709\"\u770B\u5168\"\u7684\u624B\u6BB5\u662F\u6700\u8981\u547D\u7684\u7F3A\u5931\n if (e.key === \"1\") {\n e.preventDefault()\n fitAll()\n return\n }\n if (e.key === \"2\") {\n e.preventDefault()\n fitBoard()\n return\n }\n if (e.key === \"0\") {\n e.preventDefault()\n zoomReset()\n return\n }\n if (e.key === \"=\" || e.key === \"+\") {\n e.preventDefault()\n zoomStep(1.25)\n return\n }\n if (e.key === \"-\" || e.key === \"_\") {\n e.preventDefault()\n zoomStep(0.8)\n }\n}\n\n/** \u540C\u6E90 iframe \u91CC\u7684\u6309\u952E\u4E5F\u8981\u80FD\u89E6\u53D1\u5916\u58F3\u5FEB\u6377\u952E(\u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u4E0B\u7126\u70B9\u5728 iframe \u5185) */\nexport function attachFrameKeys(doc: Document): void {\n doc.addEventListener(\"keydown\", onKeyDown)\n}\n\n// ---------- overlay \u4E8B\u4EF6 ----------\n\nfunction onMouseMove(e: MouseEvent): void {\n if (isPanning()) return\n const overlay = (e.target as Element | null)?.closest?.(\".cs-ovl\")\n const board = overlay ? boardOf(e.target) : null\n if (!board) {\n hideHover() // \u79FB\u51FA\u753B\u677F\u5230\u7A7A\u767D\u5904,\u522B\u628A\u63CF\u8FB9\u6846\u7559\u5728\u539F\u5730\n return\n }\n // \u53EA\u6709\u6D4F\u89C8\u6A21\u5F0F\u8DDF\u7740\u9F20\u6807\u6362\u6D3B\u52A8\u753B\u677F:\u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u7684\u76EE\u6807\u5FC5\u987B\u9489\u4F4F\n if (state.mode !== \"browse\") return\n setActive(board.entry.id)\n const el = elementAt(board, e.clientX, e.clientY)\n if (!el) {\n hideHover()\n return\n }\n showHover(board, el)\n setProbe(`${board.entry.exportName} ${describe(el)}`)\n}\n\nfunction onClick(e: MouseEvent): void {\n const target = e.target as Element | null\n\n // \u6807\u9898\u6761:\u5F00/\u5173 args \u9762\u677F\n const title = target?.closest?.(\".cs-board-title\")\n if (title) {\n const board = boardOf(target)\n if (!board) return\n setActive(board.entry.id)\n if (isArgsOpen(board.entry.id)) closeArgsPanel()\n else openArgsPanel(board)\n return\n }\n\n const overlay = target?.closest?.(\".cs-ovl\")\n if (!overlay) return\n const board = boardOf(target)\n if (!board) return\n if (state.mode === \"interact\") return // \u4EA4\u4E92\u6A21\u5F0F\u4E0B\u522B\u7684\u753B\u677F\u70B9\u4E00\u4E0B\u4E0D\u62A2\u7126\u70B9,\u8981\u6362\u677F\u8BF7\u53CC\u51FB\n setActive(board.entry.id)\n\n const el = elementAt(board, e.clientX, e.clientY)\n if (!el) return\n\n if (state.pinPending) {\n openComposer(board, el, e.clientX, e.clientY)\n return\n }\n if (state.mode !== \"browse\") return\n\n const selector = buildSelector(el)\n const rel = relPos(el, e.clientX, e.clientY, board)\n showSelection(board, selector)\n state.selection = { artboardId: board.entry.id, selector, x: rel.x, y: rel.y, ts: Date.now() }\n setProbe(`\u5DF2\u9009\u4E2D ${board.entry.exportName} \u2192 ${selector}`)\n postSelection(state.selection).catch((err) => setProbe(`selection \u53D1\u9001\u5931\u8D25:${String(err)}`))\n}\n\nfunction onDblClick(e: MouseEvent): void {\n const board = boardOf(e.target)\n if (!board || !(e.target as Element).closest(\".cs-ovl\")) return\n setMode(\"interact\", board.entry.id)\n}\n\nexport function initModes(): void {\n // \u6302\u5728\u89C6\u53E3\u4E0A(\u4E0D\u662F\u4E16\u754C\u5BB9\u5668):\u9F20\u6807\u79FB\u5230\u7A7A\u767D\u5904\u4E5F\u8981\u6536\u5230\u4E8B\u4EF6,\u624D\u597D\u628A\u63CF\u8FB9\u6846\u6536\u6389\n viewport = qs<HTMLDivElement>(\"#cs-viewport\")\n viewport.addEventListener(\"mousemove\", onMouseMove)\n viewport.addEventListener(\"mouseleave\", hideHover)\n viewport.addEventListener(\"click\", onClick)\n viewport.addEventListener(\"dblclick\", onDblClick)\n document.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"resize\", () => {\n if (state.mode === \"review\") fitActiveBoard()\n else applyView()\n })\n syncHud()\n}\n", "// \u5899:\u4F4D\u7F6E\u56FA\u5316\u7684\u5E03\u5C40(\u81EA\u52A8\u6392\u5217\u53EA\u5728\u9996\u6B21\u52A0\u8F7D/\u65B0\u753B\u677F/\u70B9\u6309\u94AE\u65F6\u53D1\u751F)\u3001\u753B\u677F\u751F\u547D\u5468\u671F\n// (\u61D2\u6302\u8F7D / \u81EA\u52A8\u6D4B\u9AD8 / \u589E\u91CF\u589E\u5220)\u3001\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u6863\u4F4D\nimport type { RegistryEntry } from \"../types.js\"\nimport { boardUrl } from \"./api.js\"\nimport { clamp, frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { attachFrameKeys } from \"./modes.js\"\nimport { renderBoardPins } from \"./pins.js\"\nimport { renderSidebar } from \"./sidebar.js\"\nimport { state, type Board } from \"./state.js\"\nimport { toast } from \"./toast.js\"\nimport { applyView } from \"./view.js\"\n\n// \u5E03\u5C40\u5E38\u91CF(\u4E16\u754C\u5750\u6807 px)\u3002\u5BC6\u5EA6\u662F\"\u4E13\u4E1A\u611F\"\u7684\u7B2C\u4E00\u6765\u6E90:\u4E00\u4E2A 56px \u9AD8\u7684\u5FBD\u7AE0\u539F\u5148\u8981\u5360\n// 222px \u7AD6\u5411\u7A7A\u95F4(\u5229\u7528\u7387 25%),\u4E00\u5C4F 87% \u662F\u7A7A\u7684\u2014\u2014\u8FD9\u4E0D\u662F\u914D\u8272\u95EE\u9898\u3002\n// \u26A0\uFE0F TITLE_H \u5FC5\u987B\u4E0E style.css \u7684 --cs-title-h \u4E00\u81F4(.cs-pins/.cs-rz-e \u7684\u504F\u79FB\u90FD\u7528\u5B83)\nconst PAD = 48\nconst BOARD_GAP = 24\nconst TITLE_H = 24\nconst SECTION_HEAD_H = 34\nconst SECTION_GAP = 40\n/** \u4E00\u884C\u7684\u8F6F\u4E0A\u9650:\u5373\u4F7F\u6CA1\u5230 PER_ROW,\u592A\u5BBD\u4E5F\u6362\u884C,\u514D\u5F97\u5899\u6A2A\u5411\u62C9\u5230\u5929\u8FB9 */\nconst ROW_MAX_W = 5200\nconst MIN_H = 88\nconst MAX_H = 1200\nconst DEFAULT_W = 480\n/** \u7F29\u5F97\u6BD4\u8FD9\u66F4\u5C0F\u5C31\u4E0D\u518D\u65B0\u6302 iframe:MIN_H \u964D\u4F4E\u540E\u4E00\u5C4F\u80FD\u585E\u4E0B\u51E0\u5341\u5757,\u5168\u6302\u4F1A\u628A next dev \u6253\u7206 */\nconst MOUNT_MIN_SCALE = 0.35\n\nlet world: HTMLDivElement\nlet io: IntersectionObserver\nconst groups = new Map<string, { el: HTMLDivElement; titleEl: HTMLDivElement }>()\n/** \u81EA\u52A8\u6D4B\u9AD8\u6B21\u6570\u4E0A\u9650,\u9632\u6B62\u5185\u5BB9\u4E0E\u5BB9\u5668\u4E92\u76F8\u8FFD\u7740\u6539\u7684\u6B7B\u5FAA\u73AF */\nconst measureCount = new Map<string, number>()\nconst lastBodyH = new Map<string, number>()\n/** \u6BCF\u5757\u753B\u677F\u4E00\u4E2A\u5185\u5BB9\u9AD8\u89C2\u5BDF\u8005,iframe \u91CD\u65B0\u5BFC\u822A\u65F6\u6362\u6389\u65E7\u7684 */\nconst heightWatchers = new Map<string, ResizeObserver>()\n\nexport function initWall(): void {\n world = qs<HTMLDivElement>(\"#cs-world\")\n initWallTools()\n io = new IntersectionObserver(\n (records) => {\n for (const r of records) {\n if (!r.isIntersecting) continue\n // \u5168\u666F\u89C6\u89D2(\u7F29\u5F97\u5F88\u5C0F)\u65F6\u4E0D\u6302\u8F7D:\u6B64\u65F6\u770B\u7684\u662F\u5E03\u5C40\u4E0D\u662F\u5185\u5BB9,\u800C\u4E00\u6B21\u6027\u6302\u51E0\u5341\u4E2A iframe\n // \u4F1A\u628A\u7528\u6237\u7684 dev server \u6253\u7206\u3002\u5DF2\u6302\u7684\u7EDD\u4E0D\u5378\u8F7D,\u653E\u5927\u56DE\u6765\u65F6\u518D\u8865\u6302\u3002\n if (state.scale < MOUNT_MIN_SCALE) continue\n const id = (r.target as HTMLElement).dataset.id\n const board = id ? state.boards.get(id) : null\n if (board) requestMount(board)\n io.unobserve(r.target)\n }\n },\n // \u89C6\u53E3\u5916 1.5 \u5C4F\u5C31\u5F00\u59CB\u6302\n { root: qs(\"#cs-viewport\"), rootMargin: \"150%\" }\n )\n}\n\n// ---------- \u589E\u91CF\u540C\u6B65 ----------\n\nexport function syncEntries(entries: RegistryEntry[]): void {\n state.entries = entries\n syncWallTools() // initWall \u65F6 state.info \u8FD8\u6CA1\u5230\u4F4D,\u8FD9\u91CC\u8865\u4E00\u6B21\u5168\u5C40\u6863\u4F4D\u7684\u9AD8\u4EAE\n\n const byFile = new Map<string, RegistryEntry[]>()\n for (const e of entries) {\n const list = byFile.get(e.file)\n if (list) list.push(e)\n else byFile.set(e.file, [e])\n }\n\n // \u6D88\u5931\u7684\u753B\u677F:\u6458\u6389\n const alive = new Set(entries.map((e) => e.id))\n for (const [id, board] of state.boards) {\n if (alive.has(id)) continue\n io.unobserve(board.el)\n board.el.remove()\n state.boards.delete(id)\n measureCount.delete(id)\n lastBodyH.delete(id)\n bgSyncs.delete(id)\n heightWatchers.get(id)?.disconnect()\n heightWatchers.delete(id)\n }\n for (const [file, list] of byFile) {\n const ids = list.map((e) => e.id)\n // \u4F4D\u7F6E\u7A33\u5B9A:\u5DF2\u6709 id \u4FDD\u6301\u539F\u987A\u5E8F,\u65B0 id \u8FFD\u52A0\u5230\u5C3E\u90E8\n const kept = (state.order.get(file) ?? []).filter((id) => ids.includes(id))\n state.order.set(file, kept.concat(ids.filter((id) => !kept.includes(id))))\n for (const entry of list) {\n const exist = state.boards.get(entry.id)\n if (exist) updateBoard(exist, entry)\n else state.boards.set(entry.id, createBoard(entry))\n }\n }\n // \u6587\u4EF6\u6CA1\u4E86\u5C31\u6E05\u6389\u5B83\u7684\u987A\u5E8F\u8868\n for (const file of [...state.order.keys()]) if (!byFile.has(file)) state.order.delete(file)\n\n // \u81EA\u52A8\u6392\u5217\u53EA\u5728\u4E09\u79CD\u65F6\u673A\u53D1\u751F:\u2460 \u8FD9\u4E2A\u9879\u76EE\u7B2C\u4E00\u6B21\u6253\u5F00 \u2461 \u51FA\u73B0\u4E86\u6CA1\u6709\u4F4D\u7F6E\u7684\u65B0\u753B\u677F\n // \u2462 \u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u3002\u5220\u753B\u677F\u3001\u6539\u5C3A\u5BF8\u3001HMR \u4E00\u5F8B\u4E0D\u91CD\u6392 \u2014\u2014 \u7528\u6237\u6446\u597D\u7684\u5899\u4E0D\u8BE5\u88AB\u51B2\u6389\u3002\n if (firstSync && !hasAnyPos()) {\n autoArrange()\n // \u753B\u677F\u521A\u5EFA\u597D\u65F6\u9AD8\u5EA6\u8FD8\u662F\u731C\u7684(iframe \u6CA1\u6302),\u7B49\u9996\u5C4F\u6D4B\u5B8C\u518D\u94FA\u4E00\u6B21,\u4E4B\u540E\u5C31\u5F7B\u5E95\u4E0D\u52A8\u4E86\n settleDeadline = Date.now() + SETTLE_WINDOW\n } else {\n const n = placeNewBoards()\n applyPositions()\n if (n && !firstSync) toast(`\u65B0\u753B\u677F ${n} \u5757 \u00B7 \u5DF2\u653E\u5230\u5899\u5E95\u90E8`, \"info\")\n }\n if (state.boards.size) firstSync = false\n renderSidebar()\n}\n\nexport function groupLabel(file: string): string {\n let s = file\n const dir = state.info?.designDir\n if (dir && s.startsWith(`${dir}/`)) s = s.slice(dir.length + 1)\n return s.replace(/\\.artboard\\.tsx?$/, \"\")\n}\n\n/** \u5206\u533A\u6807\u9898(\u9875\u9762 / \u7EC4\u4EF6),\u76F4\u63A5\u6302\u5728\u4E16\u754C\u5750\u6807\u91CC */\nfunction ensureSection(key: \"screen\" | \"component\"): HTMLDivElement {\n const found = groups.get(key)\n if (found) return found.titleEl\n const titleEl = h(\"div\", \"cs-section-title\")\n titleEl.dataset.section = key\n world.appendChild(titleEl)\n groups.set(key, { el: titleEl, titleEl })\n return titleEl\n}\n\n// ---------- \u753B\u677F ----------\n\nfunction createBoard(entry: RegistryEntry): Board {\n const el = h(\"div\", \"cs-board\")\n el.dataset.id = entry.id\n el.dataset.kind = entry.kind\n\n const titleEl = h(\"div\", \"cs-board-title\")\n const nameEl = h(\"span\", \"cs-name\", entry.exportName)\n const badgeEl = h(\"span\", \"cs-badge\", entry.kind)\n badgeEl.dataset.kind = entry.kind\n const argsCountEl = h(\"span\", \"cs-args-n\")\n titleEl.append(nameEl, badgeEl, argsCountEl)\n\n const frameEl = h(\"div\", \"cs-frame\")\n const placeholderEl = h(\"div\", \"cs-ph\", entry.exportName)\n const overlayEl = h(\"div\", \"cs-ovl\")\n const pinLayerEl = h(\"div\", \"cs-pins\")\n frameEl.append(placeholderEl, overlayEl)\n\n // pins \u5C42\u4E0D\u80FD\u8FDB frame:frame \u6709 overflow:hidden,pin \u9760\u8FD1\u753B\u677F\u9876\u90E8\u65F6\n // \u5411\u4E0A\u5F39\u7684\u6C14\u6CE1\u4F1A\u88AB\u88C1\u6389\u3002\u653E board \u5C42\u3001\u7528 CSS \u5BF9\u9F50\u5230 frame \u533A\u57DF(\u6807\u9898\u6761\u4E0B\u65B9)\u3002\n el.append(titleEl, frameEl, pinLayerEl)\n world.appendChild(el) // \u753B\u677F\u76F4\u63A5\u6D3B\u5728\u4E16\u754C\u5750\u6807\u91CC,\u8FD9\u6837\u624D\u597D\u81EA\u7531\u62D6\u52A8\n\n const board: Board = {\n entry,\n el,\n titleEl,\n nameEl,\n badgeEl,\n argsCountEl,\n frameEl,\n overlayEl,\n pinLayerEl,\n placeholderEl,\n iframe: null,\n width: boardWidth(entry),\n // \u9AD8\u5EA6\u4F18\u5148\u7EA7:\u624B\u52A8\u62D6\u8FC7\u7684 > \u58F0\u660E\u7684 > \u4E0A\u6B21\u6D4B\u51FA\u6765\u7F13\u5B58\u7684 > \u515C\u5E95 320\u3002\n // \u7528\u7F13\u5B58\u503C\u5F00\u5C40,\u61D2\u6302\u8F7D\u7684\u753B\u677F\u6302\u4E0A\u6765\u65F6\u9AD8\u5EA6\u5C31\u5DF2\u7ECF\u662F\u5BF9\u7684,\u4E0D\u4F1A\u6302\u4E00\u5757\u52A8\u4E00\u6B21\u5899\u3002\n height: clamp(getSize(entry.id).h ?? entry.env?.height ?? getFit(entry.id).h ?? 320, MIN_H, MAX_DRAG_H),\n argsOverride: null,\n }\n // \u63A7\u4EF6\u653E\u5230\u6807\u9898\u6761\u672B\u5C3E\u3002\u6807\u9898\u6761\u73B0\u5728\u6309\u5185\u5BB9\u6536\u7F29,\u82E5\u628A\u63A7\u4EF6\u63D2\u5728\u4E2D\u95F4,\u6807\u9898\u6761\u7684\u51E0\u4F55\u4E2D\u5FC3\n // \u5C31\u843D\u5728\u63A7\u4EF6\u4E0A\u2014\u2014\u70B9\"\u6807\u9898\u6761\u4E2D\u95F4\"\u4F1A\u88AB\u63A7\u4EF6\u5403\u6389,args \u9762\u677F\u6C38\u8FDC\u6253\u4E0D\u5F00\u3002\n if (entry.kind === \"screen\") titleEl.appendChild(widthSwitcher(board))\n if (entry.kind === \"component\") {\n titleEl.appendChild(bgToggle(board))\n board.el.dataset.bg = effectiveBg(entry.id) // iframe \u6302\u4E0A\u6765\u4E4B\u524D,\u5916\u5C42\u5E95\u8272\u4E5F\u5F97\u5148\u5BF9\n }\n attachResizeHandles(board)\n attachBoardDrag(board)\n applySize(board)\n updateBoard(board, entry)\n io.observe(el)\n return board\n}\n\n// ---------- \u6BCF\u677F\u7684\u672C\u673A\u8986\u76D6:\u5C3A\u5BF8(\u62D6\u62FD/\u5207\u6362\u5668) + \u5E95\u8272\u5F00\u5173 ----------\n\nconst WIDTH_PRESETS = [390, 768, 1024, 1280, 1440]\nconst MIN_SIZE = 120\nconst MAX_DRAG_H = 2400\n/** screen \u753B\u677F\u7684\u5BBD\u5EA6\u4E0B\u62C9,\u62D6\u62FD\u540E\u8981\u53CD\u5411\u540C\u6B65 */\nconst wsels = new Map<string, HTMLSelectElement>()\n\ninterface SizeOverride {\n w?: number\n h?: number\n}\n\nfunction sizeKey(id: string): string {\n return `cs-size:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction getSize(id: string): SizeOverride {\n try {\n return (JSON.parse(localStorage.getItem(sizeKey(id)) ?? \"{}\") as SizeOverride) ?? {}\n } catch {\n return {}\n }\n}\n\nfunction setSize(id: string, patch: SizeOverride): void {\n try {\n localStorage.setItem(sizeKey(id), JSON.stringify({ ...getSize(id), ...patch }))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\nfunction clearSize(id: string, dims: { w?: boolean; h?: boolean }): void {\n const cur = getSize(id)\n if (dims.w) delete cur.w\n if (dims.h) delete cur.h\n try {\n localStorage.setItem(sizeKey(id), JSON.stringify(cur))\n } catch {\n /* \u540C\u4E0A */\n }\n}\n\n/** \u753B\u677F\u5BBD:\u672C\u673A\u8986\u76D6(\u62D6\u62FD/\u5207\u6362\u5668) > \u58F0\u660E\u7684 env.width > \u4E0A\u6B21\u6D4B\u51FA\u6765\u7684\u5185\u5BB9\u5BBD > \u9ED8\u8BA4 */\nfunction boardWidth(entry: RegistryEntry): number {\n const o = getSize(entry.id).w\n if (typeof o === \"number\" && o >= MIN_SIZE) return o\n if (entry.env?.width) return entry.env.width\n return getFit(entry.id).w ?? DEFAULT_W\n}\n\n// ---------- \u81EA\u52A8\u6D4B\u91CF\u7ED3\u679C\u7684\u7F13\u5B58:\u4F4D\u7F6E\u56FA\u5316\u4E4B\u540E,\u5C3A\u5BF8\u4E5F\u5F97\u8DE8\u4F1A\u8BDD\u7A33\u5B9A ----------\n// \u4F4D\u7F6E\u4E00\u65E6\u56FA\u5316,\u5C3A\u5BF8\u5C31\u4E0D\u80FD\u6BCF\u6B21\u5237\u65B0\u90FD\u4ECE 320 \u91CD\u65B0\u957F\u8D77\u6765 \u2014\u2014 \u5426\u5219\u7B2C\u4E00\u6B21\u6D4B\u9AD8\u5C31\u628A\n// \u6392\u597D\u7684\u5899\u649E\u4E71\u3002\u6D4B\u51FA\u6765\u7684\u5BBD\u9AD8\u6309\u9879\u76EE\u5B58\u672C\u673A,\u4E0B\u6B21\u5F00\u5C40\u76F4\u63A5\u7528,\u6D4B\u91CF\u53EA\u662F\u6821\u6B63\u3002\n\nfunction fitKey(id: string): string {\n return `cs-fit:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction getFit(id: string): SizeOverride {\n try {\n return (JSON.parse(localStorage.getItem(fitKey(id)) ?? \"{}\") as SizeOverride) ?? {}\n } catch {\n return {}\n }\n}\n\nfunction setFit(id: string, patch: SizeOverride): void {\n try {\n localStorage.setItem(fitKey(id), JSON.stringify({ ...getFit(id), ...patch }))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n// ---------- \u624B\u52A8\u4F4D\u7F6E / \u663E\u9690(\u90FD\u6309\u9879\u76EE\u5206\u952E\u5B58\u672C\u673A) ----------\n\ninterface Pos {\n x: number\n y: number\n}\n\nfunction posKey(id: string): string {\n return `cs-pos:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nexport function getPos(id: string): Pos | null {\n try {\n const raw = localStorage.getItem(posKey(id))\n if (!raw) return null\n const p = JSON.parse(raw) as Pos\n return Number.isFinite(p?.x) && Number.isFinite(p?.y) ? p : null\n } catch {\n return null\n }\n}\n\nfunction setPos(id: string, p: Pos): void {\n try {\n localStorage.setItem(posKey(id), JSON.stringify(p))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n/** \u5899\u4E0A\u6709\u6CA1\u6709\u4EFB\u4F55\u4E00\u5757\u753B\u677F\u5DF2\u7ECF\u6709\u4F4D\u7F6E(\u5224\u65AD\"\u8FD9\u4E2A\u9879\u76EE\u662F\u4E0D\u662F\u7B2C\u4E00\u6B21\u6253\u5F00\") */\nfunction hasAnyPos(): boolean {\n for (const id of state.boards.keys()) if (getPos(id)) return true\n return false\n}\n\nfunction hiddenKey(): string {\n return `cs-hidden:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction hiddenSet(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(hiddenKey()) ?? \"[]\") as string[])\n } catch {\n return new Set()\n }\n}\n\nexport function isHidden(id: string): boolean {\n return hiddenSet().has(id)\n}\n\nexport function toggleHidden(id: string): void {\n setHidden([id], !hiddenSet().has(id))\n}\n\n/** \u6279\u91CF\u663E\u9690:\u4FA7\u680F\u7684\"\u4E00\u952E\u663E\u793A/\u9690\u85CF\u672C\u7EC4\"\u8D70\u8FD9\u6761\u3002\u9010\u6761\u8C03 toggleHidden \u4F1A\u6309\u6761\u6570\u91CD\u590D\u6574\u8F6E\u91CD\u6392,\n * \u51E0\u5341\u5757\u65E0\u611F,\u4E0A\u767E\u5757\u4F1A\u660E\u663E\u5361 \u2014\u2014 \u8FD9\u91CC\u843D\u76D8\u548C\u91CD\u6392\u5404\u53EA\u505A\u4E00\u6B21 */\nexport function setHidden(ids: string[], hidden: boolean): void {\n const s = hiddenSet()\n for (const id of ids) {\n if (hidden) s.add(id)\n else s.delete(id)\n }\n try {\n localStorage.setItem(hiddenKey(), JSON.stringify([...s]))\n } catch {\n /* \u540C\u4E0A */\n }\n cancelSettleArrange() // \u7528\u6237\u5F00\u59CB\u64CD\u4F5C\u5899\u4E86,\u9996\u5C4F\u6536\u5C3E\u91CD\u6392\u5230\u6B64\u4E3A\u6B62\n placeNewBoards() // \u4EAE\u56DE\u6765\u7684\u753B\u677F\u4E07\u4E00\u8FD8\u6CA1\u6709\u4F4D\u7F6E(\u9690\u85CF\u671F\u95F4\u65B0\u589E\u7684),\u7ED9\u5B83\u627E\u4E00\u5757\u7A7A\u5730\n applyPositions()\n}\n\n/** \u6807\u9898\u6761\u4E0A\u7684\u5BBD\u5EA6\u4E0B\u62C9:\u5207\u5BBD\u5EA6\u4E0D\u91CD\u8F7D\u9875\u9762,\u54CD\u5E94\u5F0F\u5F53\u573A\u91CD\u6392 */\nfunction widthSwitcher(board: Board): HTMLSelectElement {\n const sel = document.createElement(\"select\")\n sel.className = \"cs-wsel\"\n sel.title = \"\u89C6\u53E3\u5BBD\u5EA6:\u5207\u6362\u4E0D\u91CD\u8F7D,\u54CD\u5E94\u5F0F\u5F53\u573A\u91CD\u6392;\u9009\u8FC7\u7684\u8BB0\u5728\u672C\u673A\"\n const declared = board.entry.env?.width\n const opts = [...new Set([...(declared ? [declared] : []), ...WIDTH_PRESETS])].sort((a, b) => a - b)\n for (const w of opts) {\n const o = document.createElement(\"option\")\n o.value = String(w)\n o.textContent = `${w}${w === declared ? \" (\u58F0\u660E)\" : \"\"}`\n sel.appendChild(o)\n }\n const custom = document.createElement(\"option\")\n custom.value = \"custom\"\n custom.textContent = \"\u81EA\u5B9A\u4E49\u2026\"\n sel.appendChild(custom)\n sel.value = String(board.width)\n if (sel.value !== String(board.width)) {\n // \u5B58\u7684\u5BBD\u5EA6\u4E0D\u5728\u9884\u8BBE\u91CC,\u8865\u4E00\u4E2A\u5F53\u524D\u9879\n const o = document.createElement(\"option\")\n o.value = String(board.width)\n o.textContent = String(board.width)\n sel.insertBefore(o, custom)\n sel.value = String(board.width)\n }\n sel.addEventListener(\"click\", (e) => e.stopPropagation()) // \u522B\u89E6\u53D1\u6807\u9898\u6761\u7684 args \u9762\u677F\n sel.addEventListener(\"change\", (e) => {\n e.stopPropagation()\n let w: number\n if (sel.value === \"custom\") {\n const input = prompt(\"\u89C6\u53E3\u5BBD\u5EA6(px):\", String(board.width))\n w = Number(input)\n if (!Number.isFinite(w) || w < MIN_SIZE) {\n sel.value = String(board.width)\n return\n }\n } else {\n w = Number(sel.value)\n }\n syncWsel(sel, w)\n board.width = w\n setSize(board.entry.id, { w })\n cancelSettleArrange()\n applySize(board)\n applyPositions() // \u53EA\u6709\u5B83\u81EA\u5DF1\u53D8\u5BBD,\u90BB\u5C45\u4E0D\u52A8\n })\n wsels.set(board.entry.id, sel)\n return sel\n}\n\n/** \u8BA9\u4E0B\u62C9\u663E\u793A\u4EFB\u610F\u5BBD\u5EA6\u503C(\u4E0D\u5728\u9884\u8BBE\u91CC\u5C31\u8865\u4E00\u9879),\u62D6\u62FD\u540E\u4E5F\u8D70\u8FD9\u91CC\u540C\u6B65 */\nfunction syncWsel(sel: HTMLSelectElement, w: number): void {\n if (![...sel.options].some((o) => o.value === String(w))) {\n const custom = [...sel.options].find((o) => o.value === \"custom\") ?? null\n const o = document.createElement(\"option\")\n o.value = String(w)\n o.textContent = String(w)\n sel.insertBefore(o, custom)\n }\n sel.value = String(w)\n}\n\n/**\n * \u62D6\u6807\u9898\u6761\u632A\u753B\u677F\u3002\u6BCF\u5757\u753B\u677F\u7684\u4F4D\u7F6E\u90FD\u662F\u56FA\u5316\u7684,\u62D6\u5B8C\u53EA\u6709\u5B83\u81EA\u5DF1\u53D8 \u2014\u2014 \u90BB\u5C45\u4E00\u4E2A\u90FD\u4E0D\u52A8\u3001\n * \u4E5F\u4E0D\u4F1A\u6709\u8C01\u6765\"\u8865\u4F4D\"\u3002\u53CC\u51FB\u6807\u9898\u6761\u7A7A\u767D\u5904 = \u628A\u8FD9\u4E00\u5757\u653E\u56DE\u81EA\u52A8\u6392\u5217\u4F1A\u7ED9\u5B83\u7684\u4F4D\u7F6E\u3002\n * \u9608\u503C 4px:\u5C0F\u4E8E\u8FD9\u4E2A\u8DDD\u79BB\u5F53\u70B9\u51FB\u5904\u7406,\u514D\u5F97\"\u70B9\u6807\u9898\u6761\u5F00 args \u9762\u677F\"\u53D8\u5F97\u96BE\u70B9\u4E2D\u3002\n */\nfunction attachBoardDrag(board: Board): void {\n board.titleEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return\n cancelSettleArrange() // \u7528\u6237\u5F00\u59CB\u6446\u5899\u4E86,\u9996\u5C4F\u6536\u5C3E\u91CD\u6392\u7ACB\u523B\u4F5C\u5E9F\n // \u6807\u9898\u6761\u4E0A\u7684\u63A7\u4EF6(\u4E0B\u62C9/\u5E95\u8272\u5F00\u5173)\u81EA\u5DF1\u5904\u7406\u4E8B\u4EF6,\u4E0D\u8981\u88AB\u62D6\u62FD\u52AB\u6301\n if ((e.target as Element).closest(\"select,button\")) return\n const startX = e.clientX\n const startY = e.clientY\n const x0 = parseFloat(board.el.style.left || \"0\")\n const y0 = parseFloat(board.el.style.top || \"0\")\n let moved = false\n // \u5FC5\u987B\u5728 pointerdown \u5F53\u573A\u6355\u83B7:\u7B49\u79FB\u52A8\u4E86\u518D\u6355\u83B7\u7684\u8BDD,\u9F20\u6807\u65E9\u5DF2\u79BB\u5F00\u8FD9\u6761 24px \u9AD8\u7684\u6807\u9898\u6761,\n // pointermove \u6839\u672C\u6536\u4E0D\u5230,\u62D6\u62FD\u4F1A\u5728\u7B2C\u4E00\u50CF\u7D20\u5C31\u65AD\u6389\u3002\n board.titleEl.setPointerCapture(e.pointerId)\n const move = (ev: PointerEvent): void => {\n const dx = (ev.clientX - startX) / state.scale\n const dy = (ev.clientY - startY) / state.scale\n if (!moved && Math.hypot(ev.clientX - startX, ev.clientY - startY) < 4) return\n if (!moved) {\n moved = true\n board.el.classList.add(\"is-dragging\")\n }\n board.el.style.left = `${Math.round(x0 + dx)}px`\n board.el.style.top = `${Math.round(y0 + dy)}px`\n setProbe(`${Math.round(x0 + dx)}, ${Math.round(y0 + dy)}`)\n }\n const up = (): void => {\n board.titleEl.removeEventListener(\"pointermove\", move)\n board.titleEl.removeEventListener(\"pointerup\", up)\n board.titleEl.releasePointerCapture?.(e.pointerId)\n if (!moved) return\n board.el.classList.remove(\"is-dragging\")\n setPos(board.entry.id, {\n x: parseFloat(board.el.style.left || \"0\"),\n y: parseFloat(board.el.style.top || \"0\"),\n })\n applyPositions() // \u53EA\u662F\u628A\u56FA\u5316\u4F4D\u7F6E\u5199\u56DE\u53BB + \u5237\u65B0\u5206\u533A\u6807\u9898,\u522B\u4EBA\u7EB9\u4E1D\u4E0D\u52A8\n renderBoardPins(board)\n }\n board.titleEl.addEventListener(\"pointermove\", move)\n board.titleEl.addEventListener(\"pointerup\", up)\n })\n\n // \u53CC\u51FB\u6807\u9898\u6761:\u628A\u8FD9\u4E00\u5757\u653E\u56DE\"\u81EA\u52A8\u6392\u5217\u4F1A\u7ED9\u5B83\u7684\u4F4D\u7F6E\"(\u53EA\u52A8\u5B83\u81EA\u5DF1)\n board.titleEl.addEventListener(\"dblclick\", (e) => {\n if ((e.target as Element).closest(\"select,button\")) return\n e.stopPropagation()\n const p = computeAutoPositions().get(board.entry.id)\n if (!p) return\n setPos(board.entry.id, p)\n applyPositions()\n setProbe(\"\u5DF2\u5F52\u4F4D\u5230\u81EA\u52A8\u6392\u5217\u7684\u4F4D\u7F6E\")\n })\n}\n\n// ---------- \u62D6\u62FD\u8C03\u5C3A\u5BF8:\u53F3\u7F18\u8C03\u5BBD\u3001\u4E0B\u7F18\u8C03\u9AD8\u3001\u89D2\u4E0A\u540C\u65F6\u8C03 ----------\n\n/** \u62D6\u62FD\u4E2D\u7684\u753B\u677F id:\u6B64\u65F6\u81EA\u52A8\u6D4B\u9AD8\u5FC5\u987B\u95ED\u5634,\u5426\u5219 ResizeObserver \u4F1A\u628A\u62D6\u5230\u4E00\u534A\u7684\u9AD8\u5EA6\u5F53\u573A\u5F39\u56DE\u53BB */\nlet resizing: string | null = null\n\nfunction attachResizeHandles(board: Board): void {\n const mk = (cls: string, dw: boolean, dh: boolean): void => {\n const handle = h(\"div\", `cs-rz ${cls}`)\n handle.title = \"\u62D6\u52A8\u8C03\u6574 \u00B7 \u53CC\u51FB\u8FD8\u539F\u4E3A\u58F0\u660E/\u81EA\u52A8\u5C3A\u5BF8\"\n handle.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation()\n cancelSettleArrange()\n clearSize(board.entry.id, { w: dw, h: dh })\n board.width = boardWidth(board.entry)\n const sel = wsels.get(board.entry.id)\n if (sel && dw) syncWsel(sel, board.width)\n measureBoard(board) // \u9AD8\u5EA6\u56DE\u5230\u58F0\u660E\u503C\u6216\u81EA\u52A8\u6D4B\u91CF\n applySize(board)\n applyPositions()\n setProbe(\"\u5DF2\u8FD8\u539F\u5C3A\u5BF8\")\n })\n handle.addEventListener(\"pointerdown\", (e) => {\n e.stopPropagation()\n e.preventDefault()\n cancelSettleArrange()\n handle.setPointerCapture(e.pointerId)\n resizing = board.entry.id\n const startX = e.clientX\n const startY = e.clientY\n const w0 = board.width\n const h0 = board.frameEl.getBoundingClientRect().height / state.scale\n const move = (ev: PointerEvent): void => {\n // \u5C4F\u5E55\u4F4D\u79FB\u6362\u7B97\u56DE\u4E16\u754C\u5C3A\u5EA6\n if (dw) board.width = Math.round(clamp(w0 + (ev.clientX - startX) / state.scale, MIN_SIZE, MAX_DRAG_H))\n if (dh) board.height = Math.round(clamp(h0 + (ev.clientY - startY) / state.scale, MIN_SIZE, MAX_DRAG_H))\n applySize(board)\n setProbe(`${board.width} \u00D7 ${Math.round(board.height)}`)\n }\n const up = (): void => {\n handle.removeEventListener(\"pointermove\", move)\n handle.removeEventListener(\"pointerup\", up)\n const patch: SizeOverride = {}\n if (dw) patch.w = board.width\n if (dh) patch.h = Math.round(board.height)\n setSize(board.entry.id, patch) // \u5148\u843D\u76D8,\u518D\u653E\u5F00\u6D4B\u91CF \u2014\u2014 \u987A\u5E8F\u53CD\u4E86\u5C31\u4F1A\u88AB\u81EA\u52A8\u6D4B\u9AD8\u8986\u76D6\n resizing = null\n const sel = wsels.get(board.entry.id)\n if (sel && dw) syncWsel(sel, board.width)\n applyPositions() // \u6539\u7684\u662F\u81EA\u5DF1\u7684\u5C3A\u5BF8,\u90BB\u5C45\u4E0D\u8BE5\u88AB\u63A8\u5F00\n }\n handle.addEventListener(\"pointermove\", move)\n handle.addEventListener(\"pointerup\", up)\n })\n board.el.appendChild(handle)\n }\n mk(\"cs-rz-e\", true, false)\n mk(\"cs-rz-s\", false, true)\n mk(\"cs-rz-se\", true, true)\n}\n\nfunction updateBoard(board: Board, entry: RegistryEntry): void {\n const urlChanged = board.entry.kind !== entry.kind || board.entry.url !== entry.url\n board.entry = entry\n board.nameEl.textContent = entry.exportName\n board.nameEl.title = entry.exportName // \u540D\u5B57\u88AB\u88C1\u65F6\u4ECD\u80FD\u8BFB\u5168\n board.badgeEl.textContent = entry.kind\n board.badgeEl.title = entry.kind === \"screen\" ? \"\u9875\u9762\u753B\u677F\" : \"\u7EC4\u4EF6\u753B\u677F\" // \u5FBD\u6807\u5DF2\u7F29\u6210\u5706\u70B9\n board.badgeEl.dataset.kind = entry.kind\n board.el.dataset.kind = entry.kind\n // \u9875\u9762\u753B\u677F\u663E\u793A\u5B83\u5BF9\u5E94\u7684\u771F\u5B9E\u8DEF\u7531 \u2014\u2014 \u5149\u770B export \u540D\u4E0D\u77E5\u9053\u5B83\u662F\u54EA\u4E00\u9875\n const n = entry.args ? Object.keys(entry.args).length : 0\n if (entry.kind === \"screen\" && entry.url) {\n board.argsCountEl.textContent = entry.url\n board.argsCountEl.classList.add(\"cs-route\")\n board.argsCountEl.title = `\u8DEF\u7531 ${entry.url}`\n } else {\n board.argsCountEl.textContent = n ? `${n} args` : \"\"\n board.argsCountEl.classList.remove(\"cs-route\")\n board.argsCountEl.title = \"\"\n }\n board.width = boardWidth(entry)\n if (entry.env?.height) board.height = clamp(entry.env.height, MIN_H, MAX_H)\n applySize(board)\n if (urlChanged && board.iframe) {\n const url = boardUrl(entry, board.argsOverride)\n board.iframe.dataset.csUrl = url\n board.iframe.src = url\n }\n}\n\nfunction applySize(board: Board): void {\n board.el.style.width = `${board.width}px`\n board.frameEl.style.width = `${board.width}px`\n board.frameEl.style.height = `${board.height}px`\n // \u5C3A\u5BF8\u53D8\u4E86 = iframe \u91CC\u7684\u5185\u5BB9\u4F1A\u91CD\u6392 = pin \u7684\u951A\u70B9\u5143\u7D20\u4F4D\u7F6E\u53D8\u4E86\u3002\n // \u4E0D\u5728\u8FD9\u91CC\u91CD\u753B\u7684\u8BDD,\u6279\u6CE8\u5C31\u4F1A\u8DDF\u4E22(\u5207\u5BBD\u5EA6\u3001\u62D6\u5C3A\u5BF8\u3001\u81EA\u52A8\u6D4B\u9AD8\u4E4B\u540E\u90FD\u4F1A\u53D1\u751F)\u3002\n schedulePinSync(board)\n}\n\n/** pin \u91CD\u5B9A\u4F4D\u5408\u5E76\u5230\u4E0B\u4E00\u5E27:\u4E00\u6B21\u62D6\u62FD\u4F1A\u89E6\u53D1\u51E0\u5341\u6B21 applySize,\u4E0D\u80FD\u6BCF\u6B21\u90FD\u91CD\u753B */\nconst pinSyncPending = new Set<string>()\nlet pinSyncRaf = 0\nfunction schedulePinSync(board: Board): void {\n pinSyncPending.add(board.entry.id)\n if (pinSyncRaf) return\n pinSyncRaf = requestAnimationFrame(() => {\n pinSyncRaf = 0\n for (const id of pinSyncPending) {\n const b = state.boards.get(id)\n if (b) renderBoardPins(b)\n }\n pinSyncPending.clear()\n })\n}\n\n/** \u5185\u5BB9\u81EA\u5DF1\u91CD\u6392(HMR\u3001\u5F02\u6B65\u6E32\u67D3\u3001\u4EA4\u4E92\u5C55\u5F00\u83DC\u5355)\u65F6\u4E5F\u8981\u8DDF \u2014\u2014 \u7531 watchContentHeight \u91CC\u7684\u89C2\u5BDF\u8005\u8C03 */\nexport function syncPins(board: Board): void {\n schedulePinSync(board)\n}\n\n// \u9519\u5CF0\u6302\u8F7D:\u540C\u65F6\u52A0\u8F7D\u7684 iframe \u5C01\u9876,\u5176\u4F59\u6392\u961F \u2014\u2014 \u5237\u65B0\u65F6\u5341\u51E0\u5757\u4E00\u8D77\u6253 dev server \u4F1A\u8BA9\u9996\u5C4F\u66F4\u6162\nconst MAX_LOADING = 4\nlet loadingCount = 0\nconst mountQueue: Board[] = []\n\n/** \u4ECE\u5168\u666F\u653E\u5927\u56DE\u6765\u65F6\u8865\u6302:IO \u5728\u4F4E\u7F29\u653E\u4E0B\u8DF3\u8FC7\u7684\u753B\u677F,\u6B64\u523B\u82E5\u53EF\u89C1\u5C31\u6302\u4E0A */\nexport function mountVisible(): void {\n if (state.scale < MOUNT_MIN_SCALE) return\n const vp = qs(\"#cs-viewport\").getBoundingClientRect()\n for (const board of state.boards.values()) {\n if (board.iframe) continue\n const r = board.el.getBoundingClientRect()\n const visible = r.bottom > vp.top - vp.height && r.top < vp.bottom + vp.height &&\n r.right > vp.left - vp.width && r.left < vp.right + vp.width\n if (visible) requestMount(board)\n }\n}\n\nfunction requestMount(board: Board): void {\n if (board.iframe || mountQueue.includes(board)) return\n if (loadingCount >= MAX_LOADING) {\n mountQueue.push(board)\n return\n }\n mount(board)\n}\n\nfunction drainMountQueue(): void {\n while (loadingCount < MAX_LOADING && mountQueue.length) {\n const next = mountQueue.shift()\n if (next && !next.iframe) mount(next)\n }\n}\n\nfunction mount(board: Board): void {\n if (board.iframe) return\n loadingCount++\n const iframe = document.createElement(\"iframe\")\n iframe.title = board.entry.exportName\n const url = boardUrl(board.entry, board.argsOverride)\n iframe.dataset.csUrl = url\n let settled = false\n const settle = (): void => {\n if (settled) return\n settled = true\n loadingCount = Math.max(0, loadingCount - 1)\n drainMountQueue()\n }\n iframe.addEventListener(\"load\", () => {\n settle()\n onFrameLoad(board)\n })\n setTimeout(settle, 10000) // load \u4E8B\u4EF6\u4E07\u4E00\u4E0D\u6765,\u522B\u628A\u961F\u4F0D\u5835\u6B7B\n board.frameEl.insertBefore(iframe, board.overlayEl)\n iframe.src = url\n board.iframe = iframe\n board.placeholderEl.hidden = true\n}\n\nfunction onFrameLoad(board: Board): void {\n const doc = frameDoc(board.iframe)\n if (!doc) return\n attachFrameKeys(doc)\n injectWallCss(board)\n measureBoard(board)\n applyPositions() // \u6D4B\u51FA\u6765\u7684\u9AD8\u53EA\u6539\u81EA\u5DF1\u8FD9\u4E00\u5757,\u4E0D\u91CD\u6392\u522B\u4EBA\n scheduleSettleArrange() // \u53EA\u5728\u9996\u5C4F\u90A3\u51E0\u79D2\u6709\u6548,\u4E4B\u540E\u662F\u7A7A\u64CD\u4F5C\n renderBoardPins(board)\n watchContentHeight(board)\n}\n\n/** \u5899\u7684\u8BED\u5883\u6837\u5F0F\u6CE8\u5165(\u540C\u6E90\u624D\u53EF\u80FD):\u85CF Next dev indicator;\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u53E6\u8D70 applyBgPref */\nfunction injectWallCss(board: Board): void {\n const doc = frameDoc(board.iframe)\n if (!doc?.head) return\n if (!doc.getElementById(\"__cs_wall_css\")) {\n const st = doc.createElement(\"style\")\n st.id = \"__cs_wall_css\"\n // dev indicator \u7684 N,\u5899\u4E0A\u7EAF\u566A\u97F3(\u8981\u770B\u9519\u8BEF\u6D6E\u5C42\u53BB :3000)\n st.textContent = \"nextjs-portal{display:none !important}\"\n doc.head.appendChild(st)\n }\n applyBgPref(board)\n}\n\n// ---------- \u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272:\u878D\u5165\u753B\u5E03 / \u9879\u76EE\u771F\u5B9E\u5E95\u8272 ----------\n//\n// iframe \u7684\u753B\u5E03\u5E95\u5728\u6D4F\u89C8\u5668\u91CC\u5FC5\u7136\u4E0D\u900F\u660E:\u628A\u5D4C\u5165\u6587\u6863\u7684 html/body \u8BBE\u6210 background:transparent,\n// \u8BA1\u7B97\u503C\u786E\u5B9E\u662F\u900F\u660E,\u6E32\u67D3\u51FA\u6765\u4ECD\u7136\u662F\u767D\u3002\u6240\u4EE5\"\u8BA9\u5B83\u771F\u900F\u660E\"\u8FD9\u6761\u8DEF\u8D70\u4E0D\u901A,\u53EA\u6709\u4E24\u6863\u53EF\u9009:\n// blend\u300C\u878D\u5165\u753B\u5E03\u300D(\u9ED8\u8BA4):\u628A\u753B\u5E03\u5E95\u5237\u6210\u753B\u5E03\u540C\u8272(--cs-bg),\u90A3\u5757\u767D\u5C31\u5728\u5899\u91CC\u6D88\u5931\u4E86;\n// real \u300C\u9879\u76EE\u771F\u5B9E\u5E95\u8272\u300D:\u5237\u6210\u9879\u76EE\u81EA\u5DF1\u7684 --background,\u770B\u7EC4\u4EF6\u5728\u771F\u5B9E\u9875\u9762\u5E95\u8272\u4E0A\u7684\u6837\u5B50\u3002\n// \u9875\u9762(screen)\u753B\u677F\u4E0D\u53C2\u4E0E \u2014\u2014 \u5B83\u672C\u6765\u5C31\u8BE5\u663E\u793A\u771F\u5B9E\u9875\u9762\u3002\n\ntype BgMode = \"blend\" | \"real\"\n\n/** \u51FA\u5382\u9ED8\u8BA4\u5FC5\u987B\u662F\u4E0D\u663E\u773C\u7684\u90A3\u6863 */\nconst BG_FALLBACK: BgMode = \"blend\"\nconst BG_LABEL: Record<BgMode, string> = { blend: \"\u878D\u5165\u753B\u5E03\", real: \"\u9879\u76EE\u771F\u5B9E\u5E95\u8272\" }\n\n/** \u5168\u5C40\u9ED8\u8BA4\u6863(\u5899\u5C42\u9762,\u6309\u9879\u76EE\u5B58\u672C\u673A) */\nfunction bgGlobalKey(): string {\n return `cs-bg-default:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction globalBg(): BgMode {\n try {\n return localStorage.getItem(bgGlobalKey()) === \"real\" ? \"real\" : BG_FALLBACK\n } catch {\n return BG_FALLBACK\n }\n}\n\nfunction setGlobalBg(mode: BgMode): void {\n try {\n localStorage.setItem(bgGlobalKey(), mode)\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n/** \u6BCF\u677F\u8986\u76D6(\u6309\u9879\u76EE + \u753B\u677F\u5B58\u672C\u673A);\u6CA1\u6709\u8FD9\u4E2A\u952E = \u8DDF\u968F\u5168\u5C40 */\nfunction bgKey(id: string): string {\n return `cs-bg:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction bgOverride(id: string): BgMode | null {\n try {\n const v = localStorage.getItem(bgKey(id))\n if (v === \"blend\") return \"blend\"\n if (v === \"real\" || v === \"1\") return \"real\" // \"1\" \u662F\u8001\u7248\u672C\u7684\"\u663E\u793A\u9879\u76EE\u5E95\u8272\"\n return null\n } catch {\n return null\n }\n}\n\nfunction setBgOverride(id: string, mode: BgMode | null): void {\n try {\n if (mode) localStorage.setItem(bgKey(id), mode)\n else localStorage.removeItem(bgKey(id))\n } catch {\n /* \u540C\u4E0A */\n }\n}\n\nfunction effectiveBg(id: string): BgMode {\n return bgOverride(id) ?? globalBg()\n}\n\n/**\n * \u753B\u5E03\u81EA\u5DF1\u7684\u5E95\u8272\u3002\u6CE8\u5165\u8FDB iframe \u7684\u662F**\u8272\u503C**(iframe \u91CC\u6CA1\u6709\u753B\u5E03\u7684 CSS \u53D8\u91CF),\n * \u6240\u4EE5\u8FD9\u91CC\u73B0\u8BFB --cs-bg,\u6362\u4E3B\u9898\u81EA\u52A8\u8DDF\u968F;\u672B\u5C3E\u90A3\u4E2A\u5B57\u9762\u91CF\u53EA\u662F\u53D8\u91CF\u8BFB\u4E0D\u5230\u65F6\u7684\u515C\u5E95,\n * \u4E0D\u662F\u7B2C\u4E8C\u4E2A\u8272\u6E90\u3002\n */\nfunction canvasBg(): string {\n return getComputedStyle(document.documentElement).getPropertyValue(\"--cs-bg\").trim() || \"#0a0b0d\"\n}\n\n/** \u628A\u67D0\u5757\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u6863\u4F4D\u843D\u5230\u5916\u5C42 DOM + iframe \u91CC */\nfunction applyBgPref(board: Board): void {\n if (board.entry.kind !== \"component\") return\n const mode = effectiveBg(board.entry.id)\n board.el.dataset.bg = mode // .cs-frame \u7684\u5E95/\u63CF\u8FB9\u8DDF\u7740\u8FD9\u4E2A\u5C5E\u6027\u8D70(\u89C1 style-wall.css)\n const doc = frameDoc(board.iframe)\n if (!doc?.head) return\n let st = doc.getElementById(\"__cs_bg\") as HTMLStyleElement | null\n if (!st) {\n st = doc.createElement(\"style\")\n st.id = \"__cs_bg\"\n doc.head.appendChild(st)\n }\n // \u5237 html,body \u800C\u4E0D\u662F wrapper:\u753B\u5E03\u5E95\u662F\u4ECE html/body \u4F20\u64AD\u4E0A\u53BB\u7684,\n // \u53EA\u7ED9 wrapper \u4E0A\u8272\u7684\u8BDD padding \u4E4B\u5916\u4ECD\u662F\u4E00\u5708\u767D\u8FB9\n // \u987A\u5E26\u9690\u6389\u6839\u6EDA\u52A8\u6761:\u753B\u677F\u9AD8\u5EA6\u672C\u6765\u5C31\u81EA\u52A8\u8D34\u5185\u5BB9,\u6D4B\u9AD8\u7684\u534A\u8DEF\u4E0A\u5192\u51FA\u6765\u7684\u6EDA\u52A8\u6761\u53EA\u662F\u566A\u97F3,\n // \u767D\u8272\u8F68\u9053\u538B\u5728\u6697\u753B\u5E03\u4E0A\u5C24\u5176\u624E\u773C\u3002\u53EA\u9690 html/body \u8FD9\u4E00\u5C42,\u7EC4\u4EF6\u5185\u90E8\u7684\u6EDA\u52A8\u533A\u662F\u5B83\u81EA\u5DF1\u7684\u771F\u5B9E\u6837\u5B50,\u4E0D\u52A8\u3002\n const noScrollbar =\n \"html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{display:none}\"\n st.textContent =\n (mode === \"blend\"\n ? `html,body{background:${canvasBg()} !important}`\n : \"html,body{background:var(--background,#fff) !important}\") + noScrollbar\n}\n\n/** \u6BCF\u5757\u753B\u677F\u7684\u5E95\u8272\u6309\u94AE\u8981\u8DDF\u7740\u5168\u5C40\u6863\u4F4D\u6539\u5B57\u5F62,\u5B58\u4E0B\u5404\u81EA\u7684\u540C\u6B65\u51FD\u6570 */\nconst bgSyncs = new Map<string, () => void>()\n\n/**\n * \u6807\u9898\u6761\u4E0A\u7684\u5E95\u8272\u5F00\u5173(\u7EC4\u4EF6\u753B\u677F\u4E13\u7528)\u3002\u4E09\u6001,\u4F46\u987A\u5E8F\u4FDD\u8BC1\"\u6BCF\u6B21\u70B9\u51FB\u90FD\u770B\u5F97\u89C1\u53D8\u5316\":\n * \u8DDF\u968F\u5168\u5C40 \u2192 \u4E0E\u5168\u5C40\u76F8\u53CD(\u672C\u677F\u8986\u76D6) \u2192 \u4E0E\u5168\u5C40\u76F8\u540C(\u672C\u677F\u8986\u76D6) \u2192 \u56DE\u5230\u8DDF\u968F\u5168\u5C40\u3002\n */\nfunction bgToggle(board: Board): HTMLButtonElement {\n const id = board.entry.id\n const btn = document.createElement(\"button\")\n btn.className = \"cs-bgbtn\"\n const sync = (): void => {\n const ov = bgOverride(id)\n const eff = ov ?? globalBg()\n btn.textContent = eff === \"blend\" ? \"\u25FB\" : \"\u25A3\"\n btn.classList.toggle(\"is-on\", eff === \"real\")\n btn.classList.toggle(\"is-auto\", ov === null)\n btn.title = `\u5E95\u8272:${BG_LABEL[eff]}(${ov ? \"\u672C\u677F\u8986\u76D6\" : \"\u8DDF\u968F\u5168\u5C40\"}) \u00B7 \u70B9\u51FB\u5207\u6362`\n btn.setAttribute(\"aria-label\", btn.title)\n }\n sync()\n bgSyncs.set(id, sync)\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n const ov = bgOverride(id)\n const g = globalBg()\n setBgOverride(id, ov === null ? (g === \"blend\" ? \"real\" : \"blend\") : ov === g ? null : g)\n sync()\n applyBgPref(board)\n })\n return btn\n}\n\n// ---------- \u5899\u5C42\u9762\u7684\u5DE5\u5177\u6761(JS \u5EFA\u5143\u7D20,\u4E0D\u52A8 index.html) ----------\n\nconst segBtns: Array<{ el: HTMLButtonElement; mode: BgMode }> = []\n\n/** \u53F3\u4E0A\u89D2\u5C0F\u6761:\u5168\u5C40\u5E95\u8272\u9ED8\u8BA4\u6863 + \u81EA\u52A8\u6392\u5217\u3002\u8FD9\u4E24\u4EF6\u4E8B\u90FD\u662F\u6574\u9762\u5899\u7684,\u585E\u4E0D\u8FDB\u5355\u5757\u753B\u677F\u7684\u6807\u9898\u6761 */\nfunction initWallTools(): void {\n const bar = h(\"div\", \"cs-wall-tools\")\n bar.id = \"cs-wall-tools\"\n\n const label = h(\"span\", \"cs-wt-label\", \"\u7EC4\u4EF6\u5E95\u8272\")\n label.title = \"\u7EC4\u4EF6\u753B\u677F\u7684\u9ED8\u8BA4\u5E95\u8272(\u6309\u9879\u76EE\u8BB0\u5728\u672C\u673A)\u3002\u5355\u5757\u753B\u677F\u53EF\u4EE5\u7528\u6807\u9898\u6761\u4E0A\u7684 \u25FB/\u25A3 \u5355\u72EC\u8986\u76D6\"\n const seg = h(\"div\", \"cs-seg\")\n for (const mode of [\"blend\", \"real\"] as const) {\n const b = h(\"button\", \"cs-seg-btn\", mode === \"blend\" ? \"\u878D\u5165\u753B\u5E03\" : \"\u9879\u76EE\u5E95\u8272\")\n b.title =\n mode === \"blend\"\n ? \"\u6240\u6709\u7EC4\u4EF6\u753B\u677F\u9ED8\u8BA4\u628A\u5E95\u8272\u5237\u6210\u753B\u5E03\u540C\u8272 \u2014\u2014 \u767D\u5E95\u4E0D\u518D\u62A2\u955C\"\n : \"\u6240\u6709\u7EC4\u4EF6\u753B\u677F\u9ED8\u8BA4\u663E\u793A\u9879\u76EE\u81EA\u5DF1\u7684 --background\"\n b.addEventListener(\"click\", () => {\n setGlobalBg(mode)\n syncWallTools()\n for (const board of state.boards.values()) {\n applyBgPref(board) // \u6709\u672C\u677F\u8986\u76D6\u7684\u81EA\u5DF1\u8BF4\u4E86\u7B97,\u4E0D\u53D7\u5F71\u54CD\n bgSyncs.get(board.entry.id)?.()\n }\n })\n seg.appendChild(b)\n segBtns.push({ el: b, mode })\n }\n\n const arrange = h(\"button\", \"cs-wt-btn\", \"\u81EA\u52A8\u6392\u5217\")\n arrange.title = \"\u628A\u6240\u6709\u753B\u677F\u91CD\u65B0\u94FA\u5F00(\u9875\u9762 4/\u884C\u3001\u7EC4\u4EF6 15/\u884C)\u3002\u5E73\u65F6\u4E0D\u4F1A\u81EA\u52A8\u91CD\u6392 \u2014\u2014 \u4F60\u6446\u597D\u7684\u4F4D\u7F6E\u4E00\u76F4\u7559\u7740\"\n arrange.addEventListener(\"click\", () => {\n cancelSettleArrange()\n toast(`\u5DF2\u91CD\u65B0\u6392\u5217 ${autoArrange()} \u5757\u753B\u677F`, \"ok\")\n })\n\n bar.append(label, seg, arrange)\n document.body.appendChild(bar)\n syncWallTools()\n}\n\nfunction syncWallTools(): void {\n const g = globalBg()\n for (const s of segBtns) {\n s.el.classList.toggle(\"is-on\", s.mode === g)\n s.el.setAttribute(\"aria-pressed\", String(s.mode === g))\n }\n}\n\n/** \u5185\u5BB9\u81EA\u5DF1\u53D8\u9AD8\u53D8\u77EE(HMR\u3001\u5F02\u6B65\u6E32\u67D3)\u65F6\u8DDF\u7740\u6D4B\u4E00\u6B21 */\nfunction watchContentHeight(board: Board): void {\n heightWatchers.get(board.entry.id)?.disconnect()\n const doc = frameDoc(board.iframe)\n const body = doc?.body\n if (!body || typeof ResizeObserver === \"undefined\") return\n const ro = new ResizeObserver(() => {\n const cur = body.getBoundingClientRect().height\n const prev = lastBodyH.get(board.entry.id) ?? -1\n // \u5185\u5BB9\u91CD\u6392\u4F46\u603B\u9AD8\u6CA1\u53D8(\u6A2A\u5411\u91CD\u6392\u3001\u5C55\u5F00\u540C\u9AD8\u7684\u83DC\u5355)\u4E5F\u8981\u8BA9 pin \u8DDF\u4E0A\n schedulePinSync(board)\n if (Math.abs(cur - prev) < 2) return\n lastBodyH.set(board.entry.id, cur)\n const times = (measureCount.get(board.entry.id) ?? 0) + 1\n measureCount.set(board.entry.id, times)\n if (times > 30) {\n ro.disconnect() // \u515C\u5E95:\u522B\u8BA9\u5185\u5BB9\u548C\u5BB9\u5668\u4E92\u76F8\u8FFD\u9AD8\n return\n }\n measureBoard(board)\n applyPositions() // \u5185\u5BB9\u957F\u9AD8\u53EA\u5F71\u54CD\u5B83\u81EA\u5DF1,\u4E0D\u63A8\u5F00\u90BB\u5C45(\u8981\u91CD\u94FA\u8BF7\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D)\n scheduleSettleArrange()\n })\n ro.observe(body)\n heightWatchers.set(board.entry.id, ro)\n}\n\n/**\n * \u6D4B\u5185\u5BB9\u9AD8:env.height \u4F18\u5148;\u5426\u5219\u5148\u628A iframe \u538B\u5230\u6700\u5C0F\u518D\u8BFB scrollHeight\n * (\u4E0D\u538B\u7684\u8BDD scrollHeight \u4F1A\u88AB iframe \u81EA\u8EAB\u9AD8\u5EA6\u6491\u4F4F,\u53EA\u6DA8\u4E0D\u843D)\n */\nexport function measureBoard(board: Board): void {\n if (resizing === board.entry.id) return // \u62D6\u62FD\u4E2D,\u522B\u8DDF\u624B\u8F83\u52B2\n // \u624B\u52A8\u62D6\u8FC7\u7684\u5C3A\u5BF8\u4F18\u5148\u4E8E\u4E00\u5207\u81EA\u52A8\u6D4B\u91CF\n const manual = getSize(board.entry.id)\n if (manual.h) {\n board.height = clamp(manual.h, MIN_SIZE, MAX_DRAG_H)\n applySize(board)\n return\n }\n const fixed = board.entry.env?.height\n if (fixed) {\n board.height = clamp(fixed, MIN_H, MAX_H)\n applySize(board)\n return\n }\n const iframe = board.iframe\n const doc = frameDoc(iframe)\n if (!iframe || !doc?.documentElement) return\n const prev = iframe.style.height\n iframe.style.height = `${MIN_H}px`\n const raw = Math.max(doc.documentElement.scrollHeight, doc.body?.scrollHeight ?? 0)\n iframe.style.height = prev\n board.height = clamp(raw, MIN_H, MAX_H)\n lastBodyH.set(board.entry.id, doc.body?.getBoundingClientRect().height ?? -1)\n setFit(board.entry.id, { h: Math.round(board.height) }) // \u7F13\u5B58\u7ED9\u4E0B\u6B21\u5F00\u5C40\u7528\n // \u6CA1\u58F0\u660E env.width \u4E14\u6CA1\u624B\u52A8\u62D6\u8FC7\u7684\u7EC4\u4EF6\u753B\u677F:iframe \u5BBD\u6536\u7F29\u5230\u5185\u5BB9\u5B9E\u9645\u5BBD(\u6A21\u677F\u5DF2\u7ED9 wrapper fit-content)\n if (board.entry.kind === \"component\" && !board.entry.env?.width && !manual.w) {\n const ab = doc.querySelector(\"[data-cs-artboard]\")\n if (ab) {\n const w = Math.ceil(ab.getBoundingClientRect().width)\n if (w > 0) {\n board.width = clamp(w, 120, DEFAULT_W)\n setFit(board.entry.id, { w: board.width })\n }\n }\n }\n applySize(board)\n}\n\n/** SSE registry \u4E8B\u4EF6\u4E4B\u540E\u91CD\u6D4B\u6240\u6709\u5DF2\u6302\u8F7D\u753B\u677F(\u53EA\u66F4\u65B0\u5C3A\u5BF8,\u4F4D\u7F6E\u4E0D\u52A8) */\nexport function remeasureAll(): void {\n for (const board of state.boards.values()) {\n measureCount.set(board.entry.id, 0)\n if (board.iframe) measureBoard(board)\n }\n applyPositions()\n}\n\n// ---------- \u5E03\u5C40 ----------\n//\n// \u6BCF\u5757\u753B\u677F\u7684\u4F4D\u7F6E\u90FD\u662F\"\u56FA\u5316\"\u7684(\u5B58\u672C\u673A),\u5899\u5E73\u65F6\u53EA\u662F\u628A\u5B83\u4EEC\u7167\u7740\u5750\u6807\u6446\u597D\u3002\n// \u81EA\u52A8\u6392\u5217(\u5168\u91CF\u91CD\u7B97 + \u8986\u5199\u5750\u6807)\u53EA\u5728\u4E09\u79CD\u65F6\u673A\u53D1\u751F:\n// \u2460 \u8FD9\u4E2A\u9879\u76EE\u7B2C\u4E00\u6B21\u6253\u5F00(\u672C\u673A\u4E00\u4E2A\u5750\u6807\u90FD\u6CA1\u6709);\n// \u2461 \u51FA\u73B0\u4E86\u8FD8\u6CA1\u6709\u5750\u6807\u7684\u65B0\u753B\u677F \u2014\u2014 \u53EA\u7ED9\u65B0\u7684\u627E\u7A7A\u4F4D,\u5DF2\u6709\u7684\u4E00\u5757\u90FD\u4E0D\u52A8;\n// \u2462 \u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u3002\n// \u62D6\u52A8\u7ED3\u675F\u3001\u6539\u5C3A\u5BF8\u3001\u5185\u5BB9\u6D4B\u9AD8\u3001HMR\u3001\u5220\u753B\u677F\u90FD\u4E0D\u91CD\u6392\u3002\n\n/** \u6BCF\u884C\u6700\u591A\u51E0\u5757:\u9875\u9762\u5F88\u5BBD\u6240\u4EE5\u4E00\u884C 4 \u5757,\u7EC4\u4EF6\u5F88\u5C0F\u6240\u4EE5\u4E00\u884C 15 \u5757 */\nconst PER_ROW = { screen: 4, component: 15 }\n\n/** \u53C2\u4E0E\u6392\u5217\u7684\u753B\u677F:\u6309\u6587\u4EF6\u540D\u5B57\u5178\u5E8F + \u6587\u4EF6\u5185 export \u987A\u5E8F,\u9690\u85CF\u7684\u4E0D\u5360\u683C\u5B50 */\nfunction arrangeable(): Board[] {\n const out: Board[] = []\n for (const file of [...state.order.keys()].sort()) {\n for (const id of state.order.get(file) ?? []) {\n const b = state.boards.get(id)\n if (b && !isHidden(id)) out.push(b)\n }\n }\n return out\n}\n\n/** \u9010\u884C\u94FA:\u6512\u591F PER_ROW \u6216\u5BBD\u5EA6\u8D85\u8FC7\u8F6F\u4E0A\u9650\u5C31\u6362\u884C,\u884C\u9AD8\u53D6\u8BE5\u884C\u6700\u9AD8\u7684\u3002\u8FD4\u56DE\u4E0B\u4E00\u884C\u7684 y */\nfunction flowRows(list: Board[], kind: \"screen\" | \"component\", startY: number, out: Map<string, Pos>): number {\n let y = startY\n let row: Board[] = []\n let rowW = 0\n const flush = (): void => {\n if (!row.length) return\n let x = PAD\n const rowH = Math.max(...row.map((b) => TITLE_H + b.height))\n for (const b of row) {\n out.set(b.entry.id, { x, y })\n x += b.width + BOARD_GAP\n }\n y += rowH + BOARD_GAP\n row = []\n rowW = 0\n }\n for (const b of list) {\n if (row.length >= PER_ROW[kind] || (row.length && rowW + b.width > ROW_MAX_W)) flush()\n row.push(b)\n rowW += b.width + BOARD_GAP\n }\n flush()\n return y\n}\n\n/** \u7B97\u4E00\u904D\"\u81EA\u52A8\u6392\u5217\u4F1A\u628A\u6BCF\u5757\u653E\u5728\u54EA\"(\u7EAF\u8BA1\u7B97,\u4E0D\u78B0 DOM):\u6309 kind \u5206\u533A\u3001\u9875\u9762\u5728\u4E0A\u7EC4\u4EF6\u5728\u4E0B */\nfunction computeAutoPositions(): Map<string, Pos> {\n const out = new Map<string, Pos>()\n const ordered = arrangeable()\n let y = PAD\n for (const kind of [\"screen\", \"component\"] as const) {\n const list = ordered.filter((b) => b.entry.kind === kind)\n if (!list.length) continue\n y += SECTION_HEAD_H // \u7ED9\u5206\u533A\u6807\u9898\u7559\u4E00\u884C(\u6807\u9898\u5750\u6807\u7531 layoutSections \u4ECE\u753B\u677F\u53CD\u63A8)\n y = flowRows(list, kind, y, out)\n y += SECTION_GAP\n }\n return out\n}\n\n/** \u5168\u91CF\u91CD\u7B97\u5E76\u56FA\u5316\u5750\u6807 \u2014\u2014 \u53EA\u6709\u9996\u6B21\u52A0\u8F7D\u4E0E\u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u4F1A\u8D70\u5230\u8FD9\u3002\u8FD4\u56DE\u6392\u4E86\u51E0\u5757 */\nexport function autoArrange(): number {\n const pos = computeAutoPositions()\n for (const [id, p] of pos) setPos(id, p)\n applyPositions()\n return pos.size\n}\n\n/**\n * \u53EA\u7ED9\"\u8FD8\u6CA1\u6709\u5750\u6807\"\u7684\u753B\u677F\u627E\u5730\u65B9:\u94FA\u5728\u73B0\u6709\u5185\u5BB9\u7684\u4E0B\u6CBF\u4E4B\u5916,\u5DF2\u6709\u753B\u677F\u4E00\u5757\u90FD\u4E0D\u52A8\u3002\n * \u8FD4\u56DE\u65B0\u653E\u7F6E\u7684\u5757\u6570\u3002\n */\nfunction placeNewBoards(): number {\n const ordered = arrangeable()\n const fresh = ordered.filter((b) => !getPos(b.entry.id))\n if (!fresh.length) return 0\n let bottom = -Infinity\n for (const b of ordered) {\n const p = getPos(b.entry.id)\n if (p) bottom = Math.max(bottom, p.y + TITLE_H + b.height)\n }\n let y = Number.isFinite(bottom) ? bottom + SECTION_GAP : PAD\n const out = new Map<string, Pos>()\n for (const kind of [\"screen\", \"component\"] as const) {\n const list = fresh.filter((b) => b.entry.kind === kind)\n if (!list.length) continue\n y = flowRows(list, kind, y, out) + SECTION_GAP\n }\n for (const [id, p] of out) setPos(id, p)\n return out.size\n}\n\n/**\n * \u8F7B\u91CF:\u628A\u56FA\u5316\u7684\u5750\u6807\u5199\u56DE DOM\u3002\u4E0D\u6539\u4EFB\u4F55\u753B\u677F\u7684\u4F4D\u7F6E \u2014\u2014 \u62D6\u52A8\u7ED3\u675F\u3001\u6539\u5C3A\u5BF8\u3001\u5185\u5BB9\u6D4B\u9AD8\u3001\n * SSE \u5237\u65B0\u8D70\u7684\u90FD\u662F\u5B83,\u6240\u4EE5\u7528\u6237\u6446\u597D\u7684\u5899\u4E0D\u4F1A\u88AB\u51B2\u6389\u3002\n */\nexport function applyPositions(): void {\n for (const b of state.boards.values()) {\n const p = getPos(b.entry.id)\n if (p) {\n b.el.style.left = `${p.x}px`\n b.el.style.top = `${p.y}px`\n }\n // \u9690\u85CF\u7684\u753B\u677F\u4ECE\u5899\u4E0A\u64A4\u4E0B(\u4F46\u4ECD\u5728 state \u91CC,\u4FA7\u680F\u80FD\u52FE\u56DE\u6765)\n b.el.hidden = isHidden(b.entry.id)\n }\n layoutSections()\n // \u5FC5\u987B\u4FDD\u7559:select.ts \u7684\u9AD8\u4EAE\u6846/\u6807\u7B7E\u53EA\u5728 applyView \u7684\u76D1\u542C\u91CC\u91CD\u7B97,\u6458\u6389\u8FD9\u884C\u6846\u5C31\u4F1A\u843D\u540E\u4E00\u5E27\u5230\u505C\n applyView()\n}\n\n/** \u5206\u533A\u6807\u9898\u8D34\u5728\u672C\u533A\u753B\u677F\u5305\u56F4\u76D2\u7684\u5DE6\u4E0A\u89D2:\u5B83\u8DDF\u7740\u753B\u677F\u8D70,\u81EA\u5DF1\u4E0D\u5360\u5E03\u5C40 */\nfunction layoutSections(): void {\n for (const kind of [\"screen\", \"component\"] as const) {\n const titleEl = ensureSection(kind)\n let minX = Infinity\n let minY = Infinity\n let n = 0\n for (const b of state.boards.values()) {\n if (b.entry.kind !== kind || isHidden(b.entry.id)) continue\n n++\n const p = getPos(b.entry.id)\n if (!p) continue\n minX = Math.min(minX, p.x)\n minY = Math.min(minY, p.y)\n }\n if (!n || !Number.isFinite(minX)) {\n titleEl.hidden = true\n continue\n }\n titleEl.hidden = false\n titleEl.textContent = \"\"\n titleEl.append(\n h(\"span\", undefined, kind === \"screen\" ? \"\u9875\u9762\" : \"\u7EC4\u4EF6\"),\n h(\"span\", \"cs-section-count\", String(n))\n )\n titleEl.style.left = `${minX}px`\n titleEl.style.top = `${minY - SECTION_HEAD_H}px`\n }\n}\n\n// ---------- \u9996\u5C4F\u6536\u5C3E\u91CD\u6392 ----------\n//\n// \u753B\u677F\u521A\u5EFA\u597D\u65F6\u9AD8\u5EA6\u662F\u731C\u7684(iframe \u8FD8\u6CA1\u6302),\u9996\u6B21\u52A0\u8F7D\u90A3\u4E00\u94FA\u5FC5\u7136\u4E0D\u51C6\u3002\n// \u6240\u4EE5\u53EA\u5728\u5F00\u5C40\u7684\u51E0\u79D2\u91CC,\u7B49\u6D4B\u9AD8\u843D\u5B9A\u540E\u518D\u94FA\u4E00\u6B21;\u7528\u6237\u4E00\u52A8\u624B(\u62D6/\u6539\u5C3A\u5BF8/\u663E\u9690)\u7ACB\u523B\u4F5C\u5E9F,\n// \u4E4B\u540E\u5899\u5C31\u5F7B\u5E95\u4E0D\u518D\u81EA\u52A8\u91CD\u6392\u4E86\u3002\n\nconst SETTLE_WINDOW = 8000\nlet firstSync = true\nlet settleDeadline = 0\nlet settleTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction scheduleSettleArrange(): void {\n if (!settleDeadline || Date.now() > settleDeadline) return\n if (settleTimer !== null) clearTimeout(settleTimer)\n settleTimer = setTimeout(() => {\n settleTimer = null\n if (!settleDeadline) return\n autoArrange()\n }, 350)\n}\n\nfunction cancelSettleArrange(): void {\n settleDeadline = 0\n if (settleTimer !== null) clearTimeout(settleTimer)\n settleTimer = null\n}\n", "// \u5DE6\u4FA7\u56FE\u5C42\u5217\u8868:\u4E0A=\u9875\u9762(\u5E26\u8DEF\u7531,\u70B9\u51FB\u805A\u7126),\u4E0B=\u7EC4\u4EF6(\u6309\u6587\u4EF6\u5206\u7EC4)\u3002\n// \u641C\u7D22\u8FC7\u6EE4\u3001\u5355\u6761\u663E\u9690;\u5206\u533A/\u6587\u4EF6\u5206\u7EC4\u53EF\u6298\u53E0(\u6298\u53E0\u6001\u6309\u9879\u76EE\u5B58\u672C\u673A),\u6807\u9898\u884C\u5E26\u6279\u91CF\u663E\u9690\u3002\n// \u5B83\u66FF\u4EE3\u4E86\u5C0F\u5730\u56FE \u2014\u2014 \u7F29\u7565\u56FE\u53EA\u80FD\u56DE\u7B54\"\u6211\u5728\u54EA\",\u5217\u8868\u8FD8\u80FD\u56DE\u7B54\"\u6709\u4EC0\u4E48\u3001\u53EB\u4EC0\u4E48\u3001\u53BB\u54EA\"\u3002\nimport { h, qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\nimport { fitBoard } from \"./view.js\"\nimport { groupLabel, isHidden, setHidden, toggleHidden } from \"./wall.js\"\n\nlet root: HTMLElement\nlet listEl: HTMLElement\nlet filter = \"\"\n/**\n * \u641C\u7D22\u671F\u95F4\u7684\u4E34\u65F6\u6298\u53E0\u6001(\u9ED8\u8BA4\u5168\u5C55\u5F00)\u3002\u641C\u51FA\u6765\u7684\u4E1C\u897F\u4E0D\u8BE5\u85CF\u5728\u6298\u53E0\u91CC,\n * \u4F46\u6B64\u523B\u7684\u6298\u53E0\u52A8\u4F5C\u4E5F\u5F97\u5F53\u573A\u751F\u6548 \u2014\u2014 \u6240\u4EE5\u53E6\u5B58\u4E00\u4EFD,\u4E0D\u6C61\u67D3\u6301\u4E45\u5316\u7684\u90A3\u4EFD\u3002\n */\nlet searchCollapsed: Set<string> | null = null\n/** aria-controls \u8981\u5408\u6CD5 id,\u800C\u5206\u7EC4 key \u91CC\u6709 / \u548C . \u2014\u2014 \u6309\u6E32\u67D3\u5E8F\u53F7\u53D1\u53F7 */\nlet uid = 0\n\nexport function initSidebar(): void {\n root = qs(\"#cs-sidebar\")\n root.textContent = \"\"\n\n const head = h(\"div\", \"cs-sb-head\")\n const search = document.createElement(\"input\")\n search.className = \"cs-sb-search\"\n search.type = \"search\"\n search.placeholder = \"\u641C\u7D22\u753B\u677F\u2026\"\n search.addEventListener(\"input\", () => {\n filter = search.value.trim().toLowerCase()\n // \u8FDB\u5165/\u9000\u51FA\u641C\u7D22\u90FD\u91CD\u7F6E\u4E34\u65F6\u6298\u53E0\u6001:\u641C\u7D22\u7ED3\u679C\u4E00\u5F8B\u5148\u644A\u5F00\u7ED9\u4EBA\u770B\n searchCollapsed = filter ? new Set() : null\n renderSidebar()\n })\n // \u8F93\u5165\u6846\u91CC\u7684\u6309\u952E\u4E0D\u8BE5\u89E6\u53D1\u753B\u5E03\u5FEB\u6377\u952E(1/2/c/p \u90FD\u662F\u5355\u952E)\n search.addEventListener(\"keydown\", (e) => {\n e.stopPropagation()\n if (e.key === \"Escape\") {\n search.value = \"\"\n filter = \"\"\n searchCollapsed = null\n renderSidebar()\n search.blur()\n }\n })\n head.append(h(\"span\", \"cs-sb-title\", \"\u753B\u677F\"), search)\n\n listEl = h(\"div\", \"cs-sb-list\")\n // \u7126\u70B9\u5728\u5217\u8868\u91CC\u65F6,Enter/\u7A7A\u683C\u7684\u542B\u4E49\u662F\"\u6309\u4E0B\u8FD9\u4E2A\u6309\u94AE\",\u4E0D\u662F\u753B\u5E03\u7684 Enter=\u8D70\u67E5\u3002\n // modes.ts \u5728 document \u4E0A\u6536 Enter \u5E76 preventDefault,\u4E0D\u62E6\u4F4F\u7684\u8BDD\u6309\u94AE\u6839\u672C\u6309\u4E0D\u4E0B\u53BB\u3002\n listEl.addEventListener(\"keydown\", (e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && (e.target as HTMLElement).closest(\"button\")) {\n e.stopPropagation()\n }\n })\n root.append(head, listEl)\n\n const toggle = qs(\"#cs-sb-toggle\")\n toggle.addEventListener(\"click\", () => {\n const closed = document.body.dataset.sidebar === \"off\"\n document.body.dataset.sidebar = closed ? \"on\" : \"off\"\n toggle.title = closed ? \"\u6536\u8D77\u5217\u8868\" : \"\u5C55\u5F00\u5217\u8868\"\n })\n renderSidebar()\n}\n\nfunction match(text: string): boolean {\n return !filter || text.toLowerCase().includes(filter)\n}\n\n// ---------- \u6298\u53E0\u6001:\u6309\u9879\u76EE\u5B58\u672C\u673A(\u952E\u4E0E wall.ts \u7684\u663E\u9690\u8868\u540C\u6784) ----------\n\nfunction collapseKey(): string {\n return `cs-collapsed:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction collapsedSet(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(collapseKey()) ?? \"[]\") as string[])\n } catch {\n return new Set()\n }\n}\n\nfunction isCollapsed(key: string): boolean {\n return searchCollapsed ? searchCollapsed.has(key) : collapsedSet().has(key)\n}\n\nfunction toggleCollapsed(key: string): void {\n if (searchCollapsed) {\n if (!searchCollapsed.delete(key)) searchCollapsed.add(key)\n return\n }\n const s = collapsedSet()\n if (s.has(key)) s.delete(key)\n else s.add(key)\n try {\n localStorage.setItem(collapseKey(), JSON.stringify([...s]))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n// ---------- \u6279\u91CF\u663E\u9690 ----------\n\n/** \u4E00\u7EC4\u753B\u677F\u7684\u663E\u9690\u4E09\u6001:all=\u5168\u663E\u793A / some=\u90E8\u5206\u9690\u85CF / none=\u5168\u9690\u85CF */\ntype BulkMode = \"all\" | \"some\" | \"none\"\n\nfunction bulkMode(ids: string[]): { mode: BulkMode; shown: number } {\n const shown = ids.filter((id) => !isHidden(id)).length\n return { mode: shown === ids.length ? \"all\" : shown === 0 ? \"none\" : \"some\", shown }\n}\n\n/** \u628A\u4E00\u7EC4\u753B\u677F\u5BF9\u9F50\u5230\u540C\u4E00\u663E\u9690\u72B6\u6001:\u843D\u76D8\u548C\u91CD\u6392\u5404\u53EA\u505A\u4E00\u6B21 */\nfunction setGroupHidden(ids: string[], hide: boolean): void {\n setHidden(ids, hide)\n}\n\n/**\n * \u6BCF\u6B21\u64CD\u4F5C\u90FD\u6574\u8868\u91CD\u753B,\u7126\u70B9\u6240\u5728\u7684\u90A3\u4E2A\u6309\u94AE\u4F1A\u88AB\u6362\u6389 \u2014\u2014 \u952E\u76D8\u7528\u6237\u6309\u4E00\u6B21\u6298\u53E0\u5C31\u88AB\u5F39\u56DE\u9875\u9996,\n * \u8FDE\u6309\u4E24\u4E0B\u90FD\u505A\u4E0D\u5230\u3002\u6240\u4EE5\u7ED9\u6BCF\u4E2A\u6309\u94AE\u4E00\u4E2A\u7A33\u5B9A key,\u91CD\u753B\u540E\u628A\u7126\u70B9\u8FD8\u56DE\u539F\u4F4D\u3002\n */\nfunction focusedKey(): string | null {\n const el = document.activeElement as HTMLElement | null\n return el && listEl.contains(el) ? (el.dataset.fk ?? null) : null\n}\n\nfunction restoreFocus(key: string | null): void {\n if (!key) return\n const el = listEl.querySelector<HTMLElement>(`[data-fk=\"${CSS.escape(key)}\"]`)\n el?.focus({ preventScroll: true }) // \u522B\u987A\u624B\u628A\u5217\u8868\u6EDA\u8DD1\n}\n\n/** \u91CD\u753B\u5217\u8868\u3002\u6570\u636E\u6E90\u5C31\u662F state.entries,\u4E0D\u53E6\u5B58\u4E00\u4EFD,\u907F\u514D\u4E24\u5904\u72B6\u6001\u6F02\u79FB */\nexport function renderSidebar(): void {\n if (!listEl) return\n const keepFocus = focusedKey()\n listEl.textContent = \"\"\n uid = 0\n\n const screens = state.entries.filter((e) => e.kind === \"screen\")\n const comps = state.entries.filter((e) => e.kind !== \"screen\")\n\n // ---- \u9875\u9762:\u5E73\u94FA,\u526F\u6807\u9898\u662F\u771F\u5B9E\u8DEF\u7531 ----\n const visScreens = screens.filter((e) => match(e.exportName) || match(e.url ?? \"\"))\n if (visScreens.length) {\n const g = group(\"sec:screen\", \"\u9875\u9762\", visScreens.map((e) => e.id), \"cs-sb-section\")\n for (const e of visScreens) g.body.appendChild(row(e.id, e.exportName, e.url ?? \"\", \"screen\"))\n listEl.appendChild(g.el)\n }\n\n // ---- \u7EC4\u4EF6:\u6309\u6587\u4EF6\u5206\u7EC4,\u6BCF\u4E2A\u6587\u4EF6\u81EA\u5DF1\u4E5F\u80FD\u6298\u53E0 ----\n const byFile = new Map<string, typeof comps>()\n for (const e of comps) {\n if (!(match(e.exportName) || match(groupLabel(e.file)))) continue\n const l = byFile.get(e.file)\n if (l) l.push(e)\n else byFile.set(e.file, [e])\n }\n if (byFile.size) {\n const files = [...byFile.keys()].sort()\n const allIds = files.flatMap((f) => (byFile.get(f) ?? []).map((e) => e.id))\n const g = group(\"sec:component\", \"\u7EC4\u4EF6\", allIds, \"cs-sb-section\")\n for (const file of files) {\n const list = byFile.get(file) ?? []\n const fg = group(`file:${file}`, groupLabel(file), list.map((e) => e.id), \"cs-sb-file\")\n for (const e of list) fg.body.appendChild(row(e.id, e.exportName, \"\", \"component\"))\n g.body.appendChild(fg.el)\n }\n listEl.appendChild(g.el)\n }\n\n if (!listEl.childElementCount) {\n listEl.appendChild(h(\"div\", \"cs-sb-empty\", filter ? \"\u6CA1\u6709\u5339\u914D\u7684\u753B\u677F\" : \"\u8FD8\u6CA1\u6709\u753B\u677F\"))\n }\n syncActive()\n restoreFocus(keepFocus)\n}\n\n/**\n * \u4E00\u4E2A\u53EF\u6298\u53E0\u5206\u7EC4:\u6807\u9898\u884C(\u6298\u53E0\u6309\u94AE + \u6279\u91CF\u663E\u9690\u6309\u94AE)+ \u5185\u5BB9\u5BB9\u5668\u3002\n * \u4E24\u4E2A\u6309\u94AE\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684\u70B9\u51FB\u76EE\u6807,\u8C01\u4E5F\u4E0D\u5403\u8C01\u7684\u4E8B\u4EF6 \u2014\u2014 \u6298\u53E0\u4E0D\u8BE5\u987A\u624B\u628A\u4E00\u7EC4\u753B\u677F\u85CF\u6389\u3002\n */\nfunction group(\n key: string,\n label: string,\n ids: string[],\n headCls: string\n): { el: HTMLElement; body: HTMLElement } {\n const el = h(\"div\", \"cs-sb-group\")\n if (headCls === \"cs-sb-file\") el.classList.add(\"is-file\")\n const headEl = h(\"div\", headCls)\n const body = h(\"div\", \"cs-sb-items\")\n body.id = `cs-sb-g${++uid}`\n const collapsed = isCollapsed(key)\n body.hidden = collapsed // \u6298\u53E0\u7684\u5185\u5BB9\u8FDE Tab \u90FD\u5230\u4E0D\u4E86,\u4E0D\u7559\u5E7D\u7075\u7126\u70B9\n\n const { mode, shown } = bulkMode(ids)\n\n const caret = h(\"button\", \"cs-sb-caret\")\n caret.type = \"button\"\n caret.dataset.fk = `caret:${key}`\n caret.setAttribute(\"aria-expanded\", String(!collapsed))\n caret.setAttribute(\"aria-controls\", body.id)\n caret.title = collapsed ? `\u5C55\u5F00\u300C${label}\u300D` : `\u6298\u53E0\u300C${label}\u300D`\n const arrow = h(\"span\", \"cs-sb-arrow\", \"\u25B8\")\n arrow.setAttribute(\"aria-hidden\", \"true\") // \u7EAF\u88C5\u9970,\u53EF\u8BBF\u95EE\u540D\u7531\u4E0B\u9762\u7684\u6587\u5B57\u7ED9\n // \u8BA1\u6570\u540C\u65F6\u662F\u4E09\u6001\u7684\u7B2C\u4E8C\u5904\u7EBF\u7D22:\u5168\u663E\u793A\u53EA\u62A5\u603B\u6570,\u6709\u9690\u85CF\u5C31\u62A5\"\u663E\u793A\u4E2D/\u603B\u6570\"\n const count = h(\"span\", \"cs-sb-count\", mode === \"all\" ? String(ids.length) : `${shown}/${ids.length}`)\n caret.append(arrow, h(\"span\", \"cs-sb-label\", label), count)\n caret.addEventListener(\"click\", () => {\n toggleCollapsed(key)\n renderSidebar()\n })\n\n const bulk = h(\"button\", \"cs-sb-bulk\", mode === \"all\" ? \"\u25CF\" : mode === \"none\" ? \"\u25CC\" : \"\u25D0\")\n bulk.type = \"button\"\n bulk.dataset.fk = `bulk:${key}`\n bulk.dataset.state = mode\n // \u4E09\u6001\u76F4\u63A5\u6620\u5C04\u5230 aria-pressed \u7684\u4E09\u503C,\u8BFB\u5C4F\u80FD\u542C\u51FA\"\u90E8\u5206\"\n bulk.setAttribute(\"aria-pressed\", mode === \"all\" ? \"true\" : mode === \"none\" ? \"false\" : \"mixed\")\n const act = mode === \"all\" ? `\u9690\u85CF\u300C${label}\u300D\u4E0B\u5168\u90E8 ${ids.length} \u5757\u753B\u677F` : `\u663E\u793A\u300C${label}\u300D\u4E0B\u5168\u90E8 ${ids.length} \u5757\u753B\u677F`\n bulk.setAttribute(\"aria-label\", act)\n bulk.title = mode === \"some\" ? `${act}(\u5F53\u524D ${shown}/${ids.length} \u663E\u793A\u4E2D)` : act\n bulk.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n setGroupHidden(ids, mode === \"all\") // \u5168\u663E \u2192 \u5168\u9690;\u90E8\u5206/\u5168\u9690 \u2192 \u5168\u663E(\u5148\u628A\u4EBA\u635E\u56DE\u5168\u89C1)\n renderSidebar()\n })\n\n headEl.append(caret, bulk)\n el.append(headEl, body)\n return { el, body }\n}\n\nfunction row(id: string, name: string, sub: string, kind: string): HTMLElement {\n const el = h(\"div\", \"cs-sb-row\")\n el.dataset.id = id\n\n const go = h(\"button\", \"cs-sb-go\")\n go.type = \"button\"\n go.dataset.fk = `go:${id}`\n go.dataset.kind = kind\n go.title = sub ? `\u805A\u7126 ${name} (${sub})` : `\u805A\u7126 ${name}`\n go.append(h(\"span\", \"cs-sb-dot\"), h(\"span\", \"cs-sb-name\", name))\n if (sub) go.appendChild(h(\"span\", \"cs-sb-route\", sub))\n go.addEventListener(\"click\", () => {\n if (isHidden(id)) toggleHidden(id) // \u85CF\u7740\u7684\u5148\u4EAE\u51FA\u6765\u518D\u805A\u7126,\u5426\u5219\u70B9\u4E86\u6CA1\u53CD\u5E94\n fitBoard(id)\n state.activeId = id\n syncActive()\n })\n\n const eye = h(\"button\", \"cs-sb-eye\", isHidden(id) ? \"\u25CC\" : \"\u25CF\")\n eye.type = \"button\"\n eye.dataset.fk = `eye:${id}`\n eye.title = isHidden(id) ? \"\u663E\u793A\u8FD9\u5757\u753B\u677F\" : \"\u4ECE\u5899\u4E0A\u9690\u85CF(\u4E0D\u5220,\u968F\u65F6\u70B9\u56DE\u6765)\"\n eye.setAttribute(\"aria-label\", isHidden(id) ? `\u663E\u793A ${name}` : `\u9690\u85CF ${name}`)\n eye.setAttribute(\"aria-pressed\", String(!isHidden(id)))\n eye.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n toggleHidden(id)\n renderSidebar()\n })\n\n el.append(go, eye)\n if (isHidden(id)) el.classList.add(\"is-hidden-board\")\n return el\n}\n\n/** \u6D3B\u52A8\u753B\u677F\u5728\u5217\u8868\u91CC\u9AD8\u4EAE \u2014\u2014 \u8FD9\u662F\"\u6211\u5728\u54EA\"\u7684\u7B54\u6848 */\nexport function syncActive(): void {\n if (!listEl) return\n for (const r of listEl.querySelectorAll<HTMLElement>(\".cs-sb-row\")) {\n r.classList.toggle(\"is-active\", r.dataset.id === state.activeId)\n }\n}\n", "// contactsheet \u753B\u5E03\u5165\u53E3:\u62C9\u72B6\u6001\u5EFA\u5899\u3001\u8FDE SSE\u3001\u88C5\u914D\u5404\u6A21\u5757\n// \u884C\u4E3A\u89C4\u683C\u89C1 CONTRACTS.md\u300C\u753B\u5E03(Agent C)\u884C\u4E3A\u89C4\u683C\u300D\nimport type { Annotation, RegistryEntry } from \"../types.js\"\nimport { connectEvents, fetchAnnotations, fetchRegistry, fetchState } from \"./api.js\"\nimport { h, qs } from \"./dom.js\"\nimport { initHud } from \"./hud.js\"\nimport { initArgsPanel } from \"./args-panel.js\"\nimport { initModes } from \"./modes.js\"\nimport { copyContext, initPins, pushToClaudeCode, renderPins } from \"./pins.js\"\nimport { initRefs } from \"./refs.js\"\nimport { initSelect, refreshBoxes } from \"./select.js\"\nimport { state } from \"./state.js\"\nimport { initView, onViewChange, restoreView } from \"./view.js\"\nimport { initSidebar, syncActive } from \"./sidebar.js\"\nimport { initWall, mountVisible, remeasureAll, syncEntries } from \"./wall.js\"\n\nfunction showBootError(err: unknown): void {\n const boot = qs(\"#cs-boot\")\n boot.textContent = \"\"\n const card = h(\"div\", \"cs-card\")\n // 5xx = \u76EE\u6807\u6D3B\u7740\u4F46\u6CE8\u518C\u8868\u6A21\u5757\u70B8\u4E86(\u51E0\u4E4E\u603B\u662F\u67D0\u4E2A\u753B\u677F\u6587\u4EF6\u6709\u7F16\u8BD1\u9519\u8BEF);\u8FDE\u4E0D\u4E0A\u624D\u662F\u6CA1\u8D77 dev server\n const compileErr = /HTTP 5\\d\\d/.test(String(err))\n if (compileErr) {\n card.appendChild(h(\"h2\", undefined, \"\u753B\u677F\u6587\u4EF6\u7F16\u8BD1\u9519\u8BEF\"))\n card.appendChild(\n h(\"p\", undefined, \"next dev \u5728\u8DD1,\u4F46\u753B\u677F\u6CE8\u518C\u8868\u6A21\u5757\u6E32\u67D3\u5931\u8D25 \u2014\u2014 \u901A\u5E38\u662F\u67D0\u4E2A *.artboard.tsx \u6709\u8BED\u6CD5\u6216 import \u9519\u8BEF\u3002\u53BB next dev \u7684\u7EC8\u7AEF\u770B\u5177\u4F53\u62A5\u9519,\u4FEE\u597D\u540E\u8FD9\u9762\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002\")\n )\n } else {\n card.appendChild(h(\"h2\", undefined, \"\u76EE\u6807 dev server \u672A\u542F\u52A8\"))\n card.appendChild(h(\"p\", undefined, \"\u753B\u5E03\u8FDE\u4E0D\u4E0A\u753B\u677F\u6570\u636E\u3002\u5148\u5728\u9879\u76EE\u91CC\u8D77 next dev,\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002\"))\n const p = h(\"p\")\n p.appendChild(h(\"code\", undefined, \"pnpm dev\"))\n card.appendChild(p)\n }\n card.appendChild(h(\"div\", \"cs-err\", String(err)))\n card.appendChild(h(\"p\", \"cs-dim\", \"\u6BCF 3 \u79D2\u81EA\u52A8\u91CD\u8BD5\u4E2D\u2026\"))\n const btn = h(\"button\", undefined, \"\u7ACB\u5373\u91CD\u8BD5\")\n btn.addEventListener(\"click\", () => void tryLoadRegistry())\n card.appendChild(btn)\n boot.appendChild(card)\n boot.hidden = false\n}\n\nlet retryTimer: ReturnType<typeof setInterval> | null = null\n\n/** \u62C9\u6CE8\u518C\u8868:\u6210\u529F\u5C31\u5EFA\u5899\u5E76\u6536\u6389\u9519\u8BEF\u5361;\u5931\u8D25\u5C55\u793A\u539F\u56E0\u5E76\u4FDD\u6301\u6BCF 3 \u79D2\u91CD\u8BD5(\u4FEE\u597D\u753B\u677F\u6587\u4EF6\u540E\u5899\u81EA\u52A8\u590D\u6D3B) */\nasync function tryLoadRegistry(): Promise<boolean> {\n try {\n const reg = await fetchRegistry()\n syncEntries(reg)\n remeasureAll()\n renderPins()\n qs(\"#cs-boot\").hidden = true\n if (retryTimer !== null) {\n clearInterval(retryTimer)\n retryTimer = null\n }\n return true\n } catch (err) {\n showBootError(err)\n if (retryTimer === null) retryTimer = setInterval(() => void tryLoadRegistry(), 3000)\n return false\n }\n}\n\nfunction showTarget(): void {\n const info = state.info\n const el = qs(\"#cs-target\")\n el.textContent = info ? `${info.target} \u00B7 ${info.designDir}` : \"\"\n el.title = info ? `v${info.version} \u00B7 ${info.projectRoot}` : \"\"\n}\n\n/** SSE registry \u4E8B\u4EF6:\u7EDF\u4E00\u8D70 tryLoadRegistry(\u6743\u5A01\u6570\u636E + \u5931\u8D25\u65F6\u9519\u8BEF\u5361/\u91CD\u8BD5,\u4E0D\u62FF\u6B8B\u7F3A\u6761\u76EE\u5EFA\u5899)\u3002\n * \u4F46 SSE \u6BD4 Next \u91CD\u7F16\u8BD1\u5FEB\u7EA6 1 \u79D2:\u4E8B\u4EF6\u5230\u8FBE\u65F6 /__cs/registry \u5F80\u5F80\u8FD8\u662F\u65E7\u7684\u90A3\u4EFD,\u53EA\u62C9\u4E00\u6B21\u5C31\u505C,\n * \u65B0\u753B\u677F\u4F1A\u4E00\u76F4\u5361\u5230\u4E0B\u6B21\u6587\u4EF6\u53D8\u52A8\u6216\u624B\u52A8\u5237\u65B0\u3002\u62FF SSE \u62A5\u7684 id \u96C6\u5408\u5F53\u9884\u671F,\u5BF9\u4E0D\u4E0A\u5C31\u77ED\u95F4\u9694\u518D\u62C9\u51E0\u6B21\u3002 */\nfunction onRegistryEvent(entries: RegistryEntry[]): void {\n void reloadUntilMatches(entries.map((e) => e.id))\n}\n\nasync function reloadUntilMatches(wantIds: string[], tries = 4): Promise<void> {\n const want = new Set(wantIds)\n for (let i = 0; i < tries; i++) {\n if (!(await tryLoadRegistry())) return // \u5DF2\u7ECF\u8FDB\u9519\u8BEF\u5361 + 3 \u79D2\u91CD\u8BD5,\u522B\u518D\u53E0\u4E00\u5C42\u8F6E\u8BE2\n const got = new Set(state.entries.map((e) => e.id))\n if (got.size === want.size && [...want].every((id) => got.has(id))) return\n await new Promise((r) => setTimeout(r, 700))\n }\n}\n\nfunction onAnnotations(list: Annotation[]): void {\n state.annotations = list\n renderPins()\n}\n\nasync function boot(): Promise<void> {\n initView()\n initSelect()\n initHud()\n initPins()\n initArgsPanel()\n initWall()\n initSidebar()\n initModes()\n initRefs()\n onViewChange(refreshBoxes)\n // \u89C6\u56FE\u505C\u4E0B\u6765\u4E4B\u540E\u8865\u6302:\u4F4E\u7F29\u653E\u65F6 IO \u4F1A\u8DF3\u8FC7\u6302\u8F7D,\u653E\u5927\u56DE\u6765\u8981\u628A\u53EF\u89C1\u7684\u8865\u4E0A\n let mountTimer: ReturnType<typeof setTimeout> | null = null\n onViewChange(() => {\n if (mountTimer !== null) clearTimeout(mountTimer)\n mountTimer = setTimeout(mountVisible, 180)\n })\n qs(\"#cs-copy\").addEventListener(\"click\", () => void copyContext())\n qs(\"#cs-push\").addEventListener(\"click\", () => void pushToClaudeCode())\n\n // \u5916\u58F3\u81EA\u5DF1\u7684\u63A5\u53E3(state)\u62C9\u4E0D\u5230\u624D\u662F\u81F4\u547D\u9519(\u9875\u9762\u5C31\u662F\u5916\u58F3\u53D1\u7684,\u51E0\u4E4E\u4E0D\u53EF\u80FD)\n try {\n state.info = await fetchState()\n } catch (err) {\n showBootError(err)\n return\n }\n showTarget()\n restoreView() // info \u5C31\u4F4D\u540E\u6309\u9879\u76EE\u952E\u6062\u590D\u4E0A\u6B21\u7684\u4F4D\u7F6E\u4E0E\u7F29\u653E\n\n // \u6CE8\u518C\u8868\u5931\u8D25\u4E0D\u7EC8\u6B62\u542F\u52A8:\u9519\u8BEF\u5361 + \u81EA\u52A8\u91CD\u8BD5,SSE \u7167\u5E38\u8FDE \u2014\u2014 \u753B\u677F\u6587\u4EF6\u4FEE\u597D\u540E\u5899\u81EA\u52A8\u590D\u6D3B\n await tryLoadRegistry()\n\n try {\n state.annotations = await fetchAnnotations()\n renderPins()\n } catch {\n /* \u6279\u6CE8\u62C9\u4E0D\u5230\u4E0D\u7B97\u81F4\u547D,\u5899\u7167\u5E38\u7528 */\n }\n\n connectEvents({\n registry: onRegistryEvent,\n annotations: onAnnotations,\n })\n}\n\nvoid boot()\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// \u5916\u58F3 API \u5C01\u88C5 + SSE \u8FDE\u63A5\u3002\u6240\u6709\u8DEF\u5F84\u90FD\u5728 /__cs \u524D\u7F00\u4E0B\nimport type { Annotation, RegistryEntry, Selection, StateInfo, CsEvent } from \"../types.js\"\n\nconst BASE = \"/__cs\"\n\nasync function req<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, init)\n if (!res.ok) throw new Error(`${init?.method ?? \"GET\"} ${url} \u2192 HTTP ${res.status}`)\n const text = await res.text()\n return (text ? JSON.parse(text) : null) as T\n}\n\nfunction jsonInit(method: string, body: unknown): RequestInit {\n return { method, headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(body) }\n}\n\nexport function fetchState(): Promise<StateInfo> {\n return req<StateInfo>(`${BASE}/api/state`)\n}\n\n/** registry \u7531\u6CE8\u5165\u5230 Next \u91CC\u7684\u8DEF\u7531\u63D0\u4F9B(\u5916\u58F3\u76F4\u63A5\u4EE3\u7406\u653E\u884C) */\nexport function fetchRegistry(): Promise<RegistryEntry[]> {\n return req<RegistryEntry[]>(`${BASE}/registry`)\n}\n\nexport function fetchAnnotations(): Promise<Annotation[]> {\n return req<Annotation[]>(`${BASE}/api/annotations`)\n}\n\nexport function postSelection(sel: Selection): Promise<void> {\n return req<void>(`${BASE}/api/selection`, jsonInit(\"POST\", sel))\n}\n\n/** \u65B0\u5EFA\u6279\u6CE8:\u4E0D\u5E26 id/createdAt,\u670D\u52A1\u7AEF\u751F\u6210 */\nexport function createAnnotation(body: {\n artboardId?: string\n anchor?: { selector: string; x: number; y: number }\n text: string\n refs: string[]\n status: \"open\" | \"resolved\"\n}): Promise<Annotation> {\n return req<Annotation>(`${BASE}/api/annotations`, jsonInit(\"POST\", body))\n}\n\nexport async function deleteAnnotation(id: string): Promise<void> {\n const res = await fetch(`${BASE}/api/annotations/${encodeURIComponent(id)}`, { method: \"DELETE\" })\n if (!res.ok) throw new Error(`DELETE annotation \u2192 HTTP ${res.status}`)\n}\n\nexport interface PushChooseItem {\n pid: number\n name: string\n status: string\n cwd: string\n}\nexport type PushResponse =\n | { ok: true; pid: number; name: string }\n | { ok: false; reason?: string; choose?: PushChooseItem[] }\n\n/** \u4E00\u952E\u63A8\u9001:\u6CE8\u5165\u7ED1\u5B9A\u7684 Claude Code \u4F1A\u8BDD;\u591A\u5019\u9009\u65F6\u670D\u52A1\u7AEF\u8FD4\u56DE choose \u5217\u8868\u8BA9\u524D\u7AEF\u51FA\u9009\u62E9\u5668 */\nexport async function pushContext(pid?: number): Promise<PushResponse> {\n // token \u7531\u670D\u52A1\u7AEF\u6CE8\u5165\u753B\u5E03\u9875\u7684 <meta>,iframe \u91CC\u7684\u7528\u6237\u9875\u9762\u62FF\u4E0D\u5230,\u5192\u7528\u4E0D\u4E86\n const token = document.querySelector<HTMLMetaElement>('meta[name=\"cs-token\"]')?.content ?? \"\"\n const res = await fetch(`${BASE}/api/push`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-cs-token\": token },\n body: JSON.stringify(pid !== undefined ? { pid } : {}),\n })\n if (!res.ok) throw new Error(`POST push \u2192 HTTP ${res.status}`)\n return res.json() as Promise<PushResponse>\n}\n\n/** hook \u6CE8\u5165\u7EC8\u7AEF\u7528\u7684\u540C\u4E00\u4EFD\u6587\u672C\u6458\u8981 \u2014\u2014 \u590D\u5236\u6279\u6CE8\u6309\u94AE\u76F4\u63A5\u590D\u7528,\u4FDD\u8BC1\u4E24\u6761\u901A\u9053\u683C\u5F0F\u4E00\u81F4 */\nexport async function fetchContext(): Promise<string> {\n const res = await fetch(`${BASE}/api/context`)\n if (!res.ok) throw new Error(`GET context \u2192 HTTP ${res.status}`)\n return res.text()\n}\n\nexport function patchAnnotation(id: string, patch: Partial<Annotation>): Promise<Annotation> {\n return req<Annotation>(`${BASE}/api/annotations/${encodeURIComponent(id)}`, jsonInit(\"PATCH\", patch))\n}\n\nexport function postRef(name: string, dataBase64: string): Promise<{ path: string }> {\n return req<{ path: string }>(`${BASE}/api/refs`, jsonInit(\"POST\", { name, dataBase64 }))\n}\n\n/** \u53C2\u8003\u56FE\u7684\u53D6\u56FE\u5730\u5740(repo \u76F8\u5BF9\u8DEF\u5F84 \u2192 \u5916\u58F3 URL)\u3002\n * \u26A0\uFE0F \u9700\u8981\u5916\u58F3\u8865\u4E00\u6761 `GET /__cs/api/refs/<repo \u76F8\u5BF9\u8DEF\u5F84>` \u8DEF\u7531(\u89C1\u5B8C\u6210\u62A5\u544A);\u8FD8\u6CA1\u6709\u8FD9\u6761\u8DEF\u7531\u65F6\n * <img> \u4F1A 404 \u2014\u2014 \u7F29\u7565\u56FE\u81EA\u5DF1\u4F1A\u9000\u5316\u6210\u6587\u4EF6\u540D chip,\u4E0D\u4F1A\u53D8\u6210\u7834\u56FE\u6807\u3002 */\nexport function refUrl(path: string): string {\n return `${BASE}/api/refs/${path.split(\"/\").map(encodeURIComponent).join(\"/\")}`\n}\n\n/** \u753B\u677F iframe \u7684 URL:component \u8D70\u6CE8\u5165\u8DEF\u7531,screen \u76F4\u63A5\u8D70\u4EE3\u7406\u5230\u76EE\u6807\u9875\u9762 */\nexport function boardUrl(entry: RegistryEntry, args: Record<string, unknown> | null): string {\n if (entry.kind === \"screen\") return entry.url || \"/\"\n const base = `${BASE}/ab/${encodeURIComponent(entry.id)}`\n if (!args) return base\n return `${base}?args=${encodeURIComponent(JSON.stringify(args))}`\n}\n\n/** \u8FDE SSE:\u4E8B\u4EF6\u540D = CsEvent.type,data = JSON */\nexport function connectEvents(on: {\n registry(entries: RegistryEntry[]): void\n annotations(list: Annotation[]): void\n}): EventSource {\n const es = new EventSource(`${BASE}/events`)\n const dispatch = (raw: unknown) => {\n if (typeof raw !== \"string\") return\n let ev: CsEvent\n try {\n ev = JSON.parse(raw) as CsEvent\n } catch {\n return\n }\n if (ev.type === \"registry\") on.registry(ev.entries ?? [])\n else if (ev.type === \"annotations\") on.annotations(ev.annotations ?? [])\n }\n es.addEventListener(\"registry\", (e) => dispatch((e as MessageEvent<string>).data))\n es.addEventListener(\"annotations\", (e) => dispatch((e as MessageEvent<string>).data))\n // \u6CA1\u5E26 event \u540D\u7684\u6D88\u606F\u4E5F\u8BA4(data \u91CC\u6709 type)\n es.onmessage = (e) => dispatch(e.data)\n return es\n}\n", "// \u753B\u5E03\u7528\u7684\u6781\u5C0F DOM \u5DE5\u5177,\u4E0D\u5F15\u4EFB\u4F55\u8FD0\u884C\u65F6\u4F9D\u8D56\n\n/** \u5EFA\u5143\u7D20:h(\"div\", \"cls\", \"\u6587\u672C\") */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n cls?: string,\n text?: string\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n if (cls) el.className = cls\n if (text !== undefined) el.textContent = text\n return el\n}\n\n/** \u53D6\u5FC5\u7136\u5B58\u5728\u7684\u5143\u7D20(\u9AA8\u67B6\u5728 index.html \u91CC),\u627E\u4E0D\u5230\u76F4\u63A5\u629B,\u514D\u5F97\u5230\u5904\u5224\u7A7A */\nexport function qs<T extends Element = HTMLElement>(sel: string): T {\n const el = document.querySelector(sel)\n if (!el) throw new Error(`canvas: \u7F3A\u5C11\u9AA8\u67B6\u5143\u7D20 ${sel}`)\n return el as unknown as T\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v\n}\n\n/** \u5C3E\u90E8\u53BB\u6296 */\nexport function debounce<A extends unknown[]>(ms: number, fn: (...args: A) => void) {\n let timer: ReturnType<typeof setTimeout> | undefined\n return (...args: A) => {\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(() => fn(...args), ms)\n }\n}\n\n/** \u540C\u6E90 iframe \u7684 document,\u62FF\u4E0D\u5230(\u672A\u52A0\u8F7D/\u5F02\u5E38)\u8FD4\u56DE null */\nexport function frameDoc(iframe: HTMLIFrameElement | null): Document | null {\n if (!iframe) return null\n try {\n return iframe.contentDocument\n } catch {\n return null\n }\n}\n", "// \u753B\u5E03\u7684\u5168\u5C40\u53EF\u53D8\u72B6\u6001 \u2014\u2014 \u53EA\u653E\u6570\u636E,\u4E0D import \u5176\u5B83\u753B\u5E03\u6A21\u5757(\u907F\u514D\u73AF)\nimport type { Annotation, RegistryEntry, Selection, StateInfo } from \"../types.js\"\n\nexport type Mode = \"browse\" | \"interact\" | \"review\"\n\n/** \u4E00\u5757\u753B\u677F\u7684\u8FD0\u884C\u65F6\u5BF9\u8C61 */\nexport interface Board {\n entry: RegistryEntry\n /** \u5916\u5C42 .cs-board */\n el: HTMLDivElement\n titleEl: HTMLDivElement\n nameEl: HTMLSpanElement\n badgeEl: HTMLSpanElement\n argsCountEl: HTMLSpanElement\n /** .cs-frame,\u5C3A\u5BF8\u5199\u5728\u5B83\u8EAB\u4E0A */\n frameEl: HTMLDivElement\n overlayEl: HTMLDivElement\n pinLayerEl: HTMLDivElement\n placeholderEl: HTMLDivElement\n iframe: HTMLIFrameElement | null\n width: number\n height: number\n /** \u7528\u6237\u5728 args \u9762\u677F\u6539\u8FC7\u7684 args;null = \u7528\u753B\u677F\u81EA\u5DF1\u7684\u9ED8\u8BA4\u503C */\n argsOverride: Record<string, unknown> | null\n}\n\nexport const state = {\n info: null as StateInfo | null,\n entries: [] as RegistryEntry[],\n boards: new Map<string, Board>(),\n /** file \u2192 \u8BE5\u7EC4\u5185\u753B\u677F id \u7684\u7A33\u5B9A\u987A\u5E8F(\u5DF2\u6709 id \u4E0D\u52A8,\u65B0 id \u6392\u7EC4\u5C3E) */\n order: new Map<string, string[]>(),\n annotations: [] as Annotation[],\n\n mode: \"browse\" as Mode,\n /** \u8FDB\u8D70\u67E5\u524D\u7684\u6A21\u5F0F,Esc \u9010\u7EA7\u9000\u56DE */\n modeBeforeReview: \"browse\" as Mode,\n /** \u8D70\u67E5\u524D\u7684\u89C6\u56FE,\u9000\u51FA\u65F6\u8FD8\u539F */\n viewBeforeReview: null as { scale: number; tx: number; ty: number } | null,\n\n /** \u5F53\u524D\u6D3B\u52A8\u753B\u677F(hover/\u70B9\u51FB/\u53CC\u51FB\u90FD\u4F1A\u66F4\u65B0),Enter \u8D70\u67E5\u7684\u5C31\u662F\u5B83 */\n activeId: null as string | null,\n selection: null as Selection | null,\n /** \u6309\u4E86 c\u3001\u7B49\u7740\u70B9\u5143\u7D20\u843D pin */\n pinPending: false,\n pinnedThisRun: 0,\n\n scale: 1,\n tx: 284, // \u7ED9\u5DE6\u4FA7\u680F\u8BA9\u4F4D(\u4FA7\u680F 236 + \u8FB9\u8DDD)\n ty: 48,\n}\n", "// \u5DE6\u4E0B\u89D2 HUD:\u6A21\u5F0F\u6307\u793A + \u53CD\u67E5\u4FE1\u606F\u884C\nimport { qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\n\nlet modeEl: HTMLElement\nlet probeEl: HTMLElement\n\nconst MODE_LABEL: Record<string, string> = { browse: \"\u6D4F\u89C8\", interact: \"\u4EA4\u4E92\", review: \"\u8D70\u67E5\" }\n\nexport function initHud(): void {\n modeEl = qs(\"#cs-mode\")\n probeEl = qs(\"#cs-probe\")\n syncHud()\n}\n\nexport function syncHud(): void {\n // \u6279\u6CE8\u6A21\u5F0F\u4E0B\u5E26\u4E0A\u672C\u8F6E\u8BA1\u6570,\u8BA9\"\u53EF\u4EE5\u8FDE\u9489\"\u8FD9\u4EF6\u4E8B\u81EA\u5DF1\u8BF4\u51FA\u6765\n const n = state.pinPending ? state.pinnedThisRun : 0\n modeEl.textContent = state.pinPending\n ? n > 0\n ? `\u6279\u6CE8\u4E2D \u00B7 \u5DF2\u9489 ${n}`\n : \"\u6279\u6CE8\u4E2D\"\n : MODE_LABEL[state.mode]\n document.body.dataset.mode = state.mode\n document.body.dataset.pin = state.pinPending ? \"on\" : \"off\"\n}\n\n/** \u4FE1\u606F\u884C:hover \u53CD\u67E5\u7ED3\u679C / \u64CD\u4F5C\u56DE\u6267 */\nexport function setProbe(text: string): void {\n probeEl.textContent = text\n}\n", "// \u53F3\u4FA7 args \u9762\u677F:\u8BFB iframe \u91CC\u7684 #__cs_meta,\u6309\u503C\u7C7B\u578B\u51FA\u63A7\u4EF6,\u6539\u52A8\u53BB\u6296\u540E\u91CD\u8F7D iframe\nimport { boardUrl } from \"./api.js\"\nimport { debounce, frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet panel: HTMLElement\nlet openId: string | null = null\n/** \u6BCF\u4E2A\u5B57\u6BB5\u4E00\u4E2A\u8BFB\u503C\u51FD\u6570,\u8FD4\u56DE undefined \u8868\u793A\u8FD9\u6B21\u5148\u522B\u6539(\u6BD4\u5982 JSON \u6CA1\u5199\u5B8C) */\nlet readers: Array<{ key: string; read(): unknown }> = []\n\nexport function initArgsPanel(): void {\n panel = qs(\"#cs-args\")\n}\n\n/** \u4ECE\u753B\u677F iframe \u91CC\u8BFB __cs_meta;\u8BFB\u4E0D\u5230\u5C31\u9000\u56DE registry \u4E0A\u7684\u9ED8\u8BA4 args */\nfunction readMeta(board: Board): Record<string, unknown> | null {\n const doc = frameDoc(board.iframe)\n const node = doc?.getElementById(\"__cs_meta\")\n if (node?.textContent) {\n try {\n const meta = JSON.parse(node.textContent) as { args?: Record<string, unknown> }\n if (meta && typeof meta === \"object\" && meta.args && typeof meta.args === \"object\") return meta.args\n } catch {\n /* \u843D\u5230\u4E0B\u9762\u7684\u515C\u5E95 */\n }\n }\n return board.argsOverride ?? board.entry.args ?? null\n}\n\nexport function closeArgsPanel(): void {\n openId = null\n readers = []\n panel.hidden = true\n panel.textContent = \"\"\n document.body.dataset.args = \"closed\"\n}\n\nexport function isArgsOpen(id: string): boolean {\n return openId === id\n}\n\nexport function openArgsPanel(board: Board): void {\n openId = board.entry.id\n readers = []\n panel.textContent = \"\"\n panel.hidden = false\n document.body.dataset.args = \"open\"\n\n const head = h(\"div\", \"cs-args-head\")\n const title = h(\"div\", \"cs-args-title\", board.entry.exportName)\n const close = h(\"button\", \"cs-x\", \"\u2715\")\n close.title = \"\u5173\u95ED\"\n close.addEventListener(\"click\", closeArgsPanel)\n head.append(title, close)\n\n const sub = h(\"div\", \"cs-args-sub\", `${board.entry.file}\\n${board.entry.kind} \u00B7 ${board.entry.id}`)\n const body = h(\"div\", \"cs-args-body\")\n\n const args = readMeta(board)\n const keys = args ? Object.keys(args) : []\n if (!args || keys.length === 0) {\n body.appendChild(\n h(\n \"div\",\n \"cs-args-empty\",\n board.entry.kind === \"screen\"\n ? \"screen \u753B\u677F\u6CA1\u6709 args(\u5B83\u76F4\u63A5\u6E32\u67D3\u76EE\u6807\u9875\u9762)\u3002\"\n : \"\u8FD9\u4E2A\u753B\u677F\u6CA1\u6709\u58F0\u660E args\u3002\u5728 .artboard.tsx \u91CC\u52A0 args: { \u2026 } \u5C31\u80FD\u5728\u8FD9\u91CC\u8C03\u3002\"\n )\n )\n } else {\n for (const key of keys) body.appendChild(field(key, args[key]))\n }\n\n const foot = h(\"div\", \"cs-args-foot\")\n const save = h(\"button\", undefined, \"\u5B58\u4E3A\u753B\u677F\")\n save.disabled = true\n save.title = \"v1 \u672A\u5B9E\u73B0:\u6539\u597D\u7684 args \u8BF7\u624B\u52A8\u5199\u56DE .artboard.tsx \u65B0\u589E\u4E00\u4E2A export\"\n foot.appendChild(save)\n\n panel.append(head, sub, body, foot)\n}\n\nconst applySoon = debounce(300, () => {\n if (!openId) return\n const board = state.boards.get(openId)\n if (!board) return\n const next: Record<string, unknown> = { ...(readMeta(board) ?? {}) }\n for (const f of readers) {\n const v = f.read()\n if (v === undefined) return // \u6709\u5B57\u6BB5\u8FD8\u4E0D\u5408\u6CD5,\u6574\u6279\u4E0D\u53D1\n next[f.key] = v\n }\n board.argsOverride = next\n const url = boardUrl(board.entry, next)\n const win = board.iframe?.contentWindow\n if (win) win.location.replace(url)\n else if (board.iframe) board.iframe.src = url\n if (board.iframe) board.iframe.dataset.csUrl = url\n setProbe(`args \u5DF2\u5E94\u7528:${url.slice(0, 70)}`)\n})\n\nfunction field(key: string, value: unknown): HTMLElement {\n const wrap = h(\"div\", \"cs-field\")\n\n if (typeof value === \"boolean\") {\n wrap.classList.add(\"is-bool\")\n const label = h(\"label\")\n const input = h(\"input\")\n input.type = \"checkbox\"\n input.checked = value\n input.dataset.key = key\n label.append(input, h(\"span\", undefined, key))\n wrap.appendChild(label)\n readers.push({ key, read: () => input.checked })\n input.addEventListener(\"change\", applySoon)\n return wrap\n }\n\n if (typeof value === \"number\") {\n wrap.appendChild(h(\"label\", undefined, key))\n const input = h(\"input\")\n input.type = \"number\"\n input.value = String(value)\n wrap.appendChild(input)\n readers.push({\n key,\n read: () => {\n const n = Number(input.value)\n return input.value.trim() === \"\" || Number.isNaN(n) ? undefined : n\n },\n })\n input.addEventListener(\"input\", applySoon)\n return wrap\n }\n\n if (typeof value === \"string\") {\n wrap.appendChild(h(\"label\", undefined, key))\n const input = h(\"input\")\n input.type = \"text\"\n input.value = value\n wrap.appendChild(input)\n readers.push({ key, read: () => input.value })\n input.addEventListener(\"input\", applySoon)\n return wrap\n }\n\n // \u5176\u4F59\u7C7B\u578B(\u5BF9\u8C61/\u6570\u7EC4/null)\u8D70 JSON \u6587\u672C\u6846\n wrap.appendChild(h(\"label\", undefined, `${key} (JSON)`))\n const ta = h(\"textarea\")\n ta.value = JSON.stringify(value ?? null, null, 2)\n wrap.appendChild(ta)\n readers.push({\n key,\n read: () => {\n try {\n return JSON.parse(ta.value) as unknown\n } catch {\n ta.style.borderColor = \"var(--cs-danger)\"\n return undefined\n }\n },\n })\n ta.addEventListener(\"input\", () => {\n ta.style.borderColor = \"\"\n applySoon()\n })\n return wrap\n}\n", "// \u4E00\u6B21\u6027\u56DE\u6267\u901A\u9053\u3002\u4EE5\u524D\u6240\u6709\u7ED3\u679C\u90FD\u5199\u8FDB\u5DE6\u4E0B\u89D2 HUD \u7684 probe \u884C\u2014\u2014\u90A3\u884C\u540C\u65F6\u8FD8\u662F\n// hover \u53CD\u67E5\u7684\u5B9E\u65F6\u8BFB\u6570,\u9F20\u6807\u4E00\u52A8\u5C31\u628A\"\u5DF2\u63A8\u9001\u7ED9 X\"\u64E6\u6389\u4E86\u3002\n// \u89C4\u5219:probe \u53EA\u7559\u6301\u7EED\u8BFB\u6570(\u53CD\u67E5/\u62D6\u62FD\u5C3A\u5BF8/\u6A21\u5F0F\u8BF4\u660E),\u4E00\u6B21\u6027\u7ED3\u679C\u4E00\u5F8B\u8D70 toast\u3002\nimport { h, qs } from \"./dom.js\"\n\nexport type ToastKind = \"info\" | \"ok\" | \"warn\" | \"error\"\n\nlet host: HTMLElement | null = null\n\nfunction ensureHost(): HTMLElement {\n if (host) return host\n host = document.getElementById(\"cs-toasts\")\n if (!host) {\n host = h(\"div\", \"cs-toasts\")\n host.id = \"cs-toasts\"\n qs(\"body\").appendChild(host)\n }\n return host\n}\n\n/** \u5F39\u4E00\u6761\u56DE\u6267\u3002error \u505C\u7559\u4E45\u4E00\u70B9(\u7528\u6237\u591A\u534A\u8981\u8BFB\u5168) */\nexport function toast(text: string, kind: ToastKind = \"info\"): void {\n const el = h(\"div\", `cs-toast is-${kind}`, text)\n ensureHost().appendChild(el)\n // \u5165\u573A:\u4E0B\u4E00\u5E27\u52A0 is-in,\u8BA9 transition \u6709\u8D77\u70B9\n requestAnimationFrame(() => el.classList.add(\"is-in\"))\n const life = kind === \"error\" ? 6000 : kind === \"warn\" ? 4500 : 3000\n setTimeout(() => {\n el.classList.remove(\"is-in\")\n el.addEventListener(\"transitionend\", () => el.remove(), { once: true })\n setTimeout(() => el.remove(), 400) // transitionend \u4E07\u4E00\u4E0D\u6765\u7684\u515C\u5E95\n }, life)\n}\n", "// \u8D34\u56FE:paste \u6536\u56FE \u2192 POST /__cs/api/refs\n//\n// \u5F52\u5C5E\u89C4\u5219:\u6279\u6CE8\u8F93\u5165\u6846(composer)\u6216 pin \u6C14\u6CE1\u7684\u7F16\u8F91\u6001\u5F00\u7740\u65F6,\u56FE\u5F52**\u90A3\u6761\u6279\u6CE8**\n// (\u7531 pins.ts \u767B\u8BB0 pasteTarget);\u6CA1\u6709\u4EFB\u4F55\u6279\u6CE8\u8F93\u5165\u6846\u5728\u65F6\u624D\u843D\u5230\u53F3\u4E0B\u89D2\u7684**\u5168\u5C40**\u53C2\u8003\u56FE\u575E\u2014\u2014\n// \u90A3\u662F\"\u6CA1\u6709\u5F52\u5C5E\u7684\u7C98\u8D34\"\u7684\u515C\u5E95,\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u4E00\u6761\u6279\u6CE8\u3002\nimport { postRef, refUrl } from \"./api.js\"\nimport { h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { toast } from \"./toast.js\"\n\nlet dock: HTMLDivElement\nlet lightbox: HTMLDivElement\nlet dockHead: HTMLDivElement | null = null\n\n/** \u672C\u6B21\u4F1A\u8BDD\u4F20\u4E0A\u53BB\u7684\u56FE:path \u2192 dataURL\u3002\u7701\u4E00\u6B21\u5F80\u8FD4,\u4E5F\u8BA9\u521A\u8D34\u7684\u56FE\u7ACB\u523B\u80FD\u663E\u793A */\nconst localSrc = new Map<string, string>()\n\n/** \u8C01\u5728\u63A5\u7BA1\u7C98\u8D34\u3002el \u4ECE DOM \u4E0A\u6458\u6389\u5373\u81EA\u52A8\u5931\u6548,\u4E0D\u7528\u5728\u6BCF\u4E2A\u5173\u95ED\u8DEF\u5F84\u4E0A\u6458\u94A9\u5B50 */\ninterface PasteTarget {\n el: HTMLElement\n onFile(file: File): void\n}\nlet pasteTarget: PasteTarget | null = null\n\nexport function setPasteTarget(target: PasteTarget | null): void {\n pasteTarget = target\n}\n\nfunction activeTarget(): PasteTarget | null {\n if (pasteTarget && !pasteTarget.el.isConnected) pasteTarget = null\n return pasteTarget\n}\n\nexport function initRefs(): void {\n dock = qs<HTMLDivElement>(\"#cs-refs\")\n dock.title = \"\u5168\u5C40\u53C2\u8003\u56FE:\u7C98\u8D34\u65F6\u6CA1\u6709\u5F00\u7740\u6279\u6CE8\u8F93\u5165\u6846\u7684\u56FE\u843D\u5728\u8FD9\u91CC,\u4E0D\u6302\u5728\u4EFB\u4F55\u4E00\u6761\u6279\u6CE8\u4E0A\"\n lightbox = qs<HTMLDivElement>(\"#cs-lightbox\")\n lightbox.addEventListener(\"click\", () => {\n lightbox.hidden = true\n lightbox.textContent = \"\"\n })\n document.addEventListener(\"paste\", onPaste)\n}\n\nfunction onPaste(e: ClipboardEvent): void {\n const items = e.clipboardData?.items\n if (!items) return\n for (const item of Array.from(items)) {\n if (item.kind !== \"file\" || !item.type.startsWith(\"image/\")) continue\n const file = item.getAsFile()\n if (!file) continue\n e.preventDefault()\n const target = activeTarget()\n if (target) target.onFile(file) // \u6302\u5230\u90A3\u6761\u6279\u6CE8\n else void uploadToDock(file) // \u6CA1\u5F52\u5C5E \u2192 \u5168\u5C40\u575E\n return\n }\n}\n\n/** \u4E0A\u4F20\u4E00\u5F20\u56FE,\u8FD4\u56DE repo \u76F8\u5BF9\u8DEF\u5F84(\u5931\u8D25\u629B) */\nexport async function uploadRef(file: File): Promise<string> {\n const dataUrl = await readDataUrl(file)\n const base64 = dataUrl.slice(dataUrl.indexOf(\",\") + 1)\n const ext = (file.type.split(\"/\")[1] || \"png\").replace(\"jpeg\", \"jpg\")\n const name = file.name || `paste-${Date.now()}.${ext}`\n setProbe(`\u4E0A\u4F20\u53C2\u8003\u56FE ${name}\u2026`)\n const { path } = await postRef(name, base64)\n localSrc.set(path, dataUrl)\n return path\n}\n\nfunction readDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = () => reject(new Error(\"\u8BFB\u56FE\u5931\u8D25\"))\n reader.onload = () => resolve(String(reader.result))\n reader.readAsDataURL(file)\n })\n}\n\n/** \u663E\u793A\u5730\u5740:\u672C\u6B21\u4F1A\u8BDD\u4F20\u8FC7\u7684\u76F4\u63A5\u7528 dataURL,\u5176\u4F59\u8D70\u5916\u58F3\u7684\u53D6\u56FE\u8DEF\u7531 */\nexport function refSrc(path: string): string {\n return localSrc.get(path) ?? refUrl(path)\n}\n\n/** \u53C2\u8003\u56FE\u7F29\u7565\u56FE:\u70B9\u51FB\u5F00\u5927\u56FE\u3002\u53D6\u4E0D\u5230\u56FE\u65F6\u9000\u5316\u6210\u6587\u4EF6\u540D chip(\u4E0D\u7559\u7834\u56FE\u6807) */\nexport function refThumb(path: string): HTMLElement {\n const card = h(\"div\", \"cs-ref-thumb\")\n card.title = path\n const img = h(\"img\")\n const broken = (): void => {\n img.hidden = true\n card.classList.add(\"is-broken\")\n }\n img.addEventListener(\"error\", broken)\n img.alt = path\n img.src = refSrc(path)\n // \u5DF2\u89E3\u7801\u5B8C\u6210\u7684\u56FE(dataURL/\u7F13\u5B58)\u4E0D\u4F1A\u518D\u8865\u53D1 error \u4E8B\u4EF6,\u540C\u6B65\u8865\u6D4B\u4E00\u6B21\n if (img.complete && img.naturalWidth === 0) broken()\n card.append(img, h(\"span\", \"cs-ref-name\", fileOf(path)))\n card.addEventListener(\"click\", (e) => {\n e.stopPropagation() // \u522B\u987A\u5E26\u628A pin \u9009\u4E2D/\u628A\u6C14\u6CE1\u5F53\u6210\u70B9\u4E86\u522B\u5904\n openLightbox(refSrc(path), path)\n })\n return card\n}\n\nexport function openLightbox(src: string, caption: string): void {\n lightbox.textContent = \"\"\n const big = h(\"img\")\n big.src = src\n big.alt = caption\n lightbox.append(big, h(\"span\", undefined, caption))\n lightbox.hidden = false\n}\n\nfunction fileOf(path: string): string {\n return path.split(\"/\").pop() ?? path\n}\n\n// ---------- \u5168\u5C40\u575E(\u6CA1\u6709\u5F52\u5C5E\u7684\u7C98\u8D34) ----------\n\nasync function uploadToDock(file: File): Promise<void> {\n try {\n const path = await uploadRef(file)\n addThumb(path)\n toast(\n `\u53C2\u8003\u56FE\u5DF2\u5B58:${path} \u2014\u2014 \u8FD9\u662F\u5168\u5C40\u53C2\u8003\u56FE,\u6CA1\u6302\u5728\u6279\u6CE8\u4E0A\u3002\u8981\u6302\u5230\u67D0\u6761\u6279\u6CE8:\u6309 c \u5199\u6279\u6CE8\u65F6\u7C98\u8D34,\u6216\u5728 pin \u6C14\u6CE1\u91CC\u70B9\u300C\u7F16\u8F91\u300D\u540E\u7C98\u8D34`,\n \"ok\"\n )\n } catch (err) {\n toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\")\n }\n}\n\nfunction addThumb(path: string): void {\n ensureDockHead()\n const card = h(\"div\", \"cs-ref\")\n const img = h(\"img\")\n img.src = refSrc(path)\n img.alt = path\n card.append(img, h(\"span\", undefined, fileOf(path)))\n card.title = `${path}(\u5168\u5C40\u53C2\u8003\u56FE,\u4E0D\u5C5E\u4E8E\u4EFB\u4F55\u6279\u6CE8)`\n card.addEventListener(\"click\", () => openLightbox(refSrc(path), path))\n dock.appendChild(card)\n}\n\n/** \u575E\u7684\u6807\u9898:\u8BF4\u6E05\u695A\u8FD9\u4E00\u5217\u662F\u5168\u5C40\u7684\u3002\u575E\u662F column-reverse,\u9996\u4E2A\u5B50\u8282\u70B9\u663E\u793A\u5728\u6700\u4E0B\u9762 */\nfunction ensureDockHead(): void {\n if (dockHead) return\n dockHead = h(\"div\", \"cs-refs-head\", \"\u5168\u5C40\u53C2\u8003\u56FE \u00B7 \u672A\u6302\u5230\u6279\u6CE8\")\n dockHead.title = \"\u7C98\u8D34\u65F6\u6CA1\u6709\u5F00\u7740\u6279\u6CE8\u8F93\u5165\u6846\u7684\u56FE\u843D\u5728\u8FD9\u91CC\u3002\u8981\u6302\u5230\u67D0\u6761\u6279\u6CE8:\u6309 c \u5199\u6279\u6CE8\u65F6\u7C98\u8D34,\u6216\u5728 pin \u6C14\u6CE1\u91CC\u70B9\u300C\u7F16\u8F91\u300D\u540E\u7C98\u8D34\"\n dock.insertBefore(dockHead, dock.firstChild)\n}\n", "// \u540C\u6E90\u53CD\u67E5:iframe \u5185\u5143\u7D20\u5B9A\u4F4D\u3001CSS selector \u751F\u6210\u3001\u5916\u58F3\u5C42\u63CF\u8FB9\u6846\nimport { clamp, frameDoc, h, qs } from \"./dom.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet fx: HTMLDivElement\nlet hoverBox: HTMLDivElement\nlet selectBox: HTMLDivElement\n\n/** hover \u7684\u662F\u54EA\u4E2A\u5143\u7D20(\u76F4\u63A5\u6301\u5F15\u7528,HMR \u6362 DOM \u540E\u81EA\u7136\u5931\u6548) */\nlet hoverRef: { board: Board; el: Element } | null = null\n/** \u9009\u4E2D\u7684\u8BB0 selector,HMR \u540E\u4ECD\u80FD\u91CD\u65B0\u5B9A\u4F4D;el \u662F\u89E3\u6790\u51FA\u6765\u7684\u7F13\u5B58,\u65AD\u94FE\u540E\u91CD\u67E5 */\nlet selectRef: { board: Board; selector: string; el: Element | null } | null = null\n\n/** \u4E00\u4E2A\u6846\u4E0A\u6B21\u753B\u6210\u4EC0\u4E48\u6837:\u5B8C\u5168\u6CA1\u53D8\u5C31\u6574\u5E27\u8DF3\u8FC7(\u8DDF\u968F\u5FAA\u73AF\u9760\u8FD9\u4E2A\u505C\u4E0B\u6765) */\ninterface Painted {\n sig: string\n /** \u6807\u7B7E\u7684\u5B9E\u6D4B\u5C3A\u5BF8,\u53EA\u5728\u6587\u6848/\u53EF\u7528\u5BBD\u53D8\u4E86\u624D\u91CD\u91CF */\n tagKey: string\n tagW: number\n tagH: number\n}\nconst painted = new Map<HTMLDivElement, Painted>()\n\nfunction makeBox(kind: \"hover\" | \"select\"): HTMLDivElement {\n const box = h(\"div\", \"cs-box\")\n box.dataset.kind = kind\n box.appendChild(h(\"span\", \"cs-box-tag\"))\n fx.appendChild(box)\n return box\n}\n\nexport function initSelect(): void {\n fx = qs<HTMLDivElement>(\"#cs-fx\")\n hoverBox = makeBox(\"hover\")\n selectBox = makeBox(\"select\")\n}\n\n// ---------- \u5750\u6807\u6362\u7B97 ----------\n\n/** \u5C4F\u5E55\u5750\u6807 \u2192 iframe \u5185\u5143\u7D20(\u4E16\u754C\u7F29\u653E\u8981\u9664\u6389) */\nexport function elementAt(board: Board, clientX: number, clientY: number): Element | null {\n const doc = frameDoc(board.iframe)\n if (!doc || !board.iframe) return null\n const r = board.iframe.getBoundingClientRect()\n const s = liveScale(board, board.frameEl.getBoundingClientRect())\n let stack: Element[]\n try {\n stack = doc.elementsFromPoint((clientX - r.left) / s, (clientY - r.top) / s)\n } catch {\n return null\n }\n // screen \u753B\u677F\u4E0D\u8FC7\u6EE4:\u90A3\u662F\u4E00\u6574\u4E2A\u771F\u5B9E\u9875\u9762,body/\u5BB9\u5668\u5C31\u662F\u9875\u9762\u672C\u8EAB\n if (board.entry.kind !== \"component\") return stack[0] ?? null\n // \u7EC4\u4EF6\u753B\u677F:\u80FD\u88AB\u6307\u7740\u7684\u5FC5\u987B\u662F\"\u753B\u4E86\u4E1C\u897F\"\u7684\u5143\u7D20\u3002\u547D\u4E2D\u6808\u4ECE\u6700\u4E0A\u5C42\u5F80\u4E0B\u627E\u7B2C\u4E00\u4E2A\u53EF\u89C1\u7684;\n // \u8D70\u5230 html/body/\u6CE8\u5165\u7684 wrapper \u5C31\u505C \u2014\u2014 \u7EC4\u4EF6\u5C0F\u3001\u89C6\u53E3\u5927\u65F6\u7A7A\u767D\u5904\u547D\u4E2D\u7684\u662F\u4E00\u6574\u7247 body,\n // \u800C\u7EC4\u4EF6\u6839\u5F80\u5F80\u662F\u4E2A\u900F\u660E\u7684\u5E03\u5C40\u5BB9\u5668(grid/flex),\u9AD8\u4EAE\u5B83\u4EEC\u90FD\u662F\"\u9009\u4E2D\u4E86\u4E00\u5927\u7247\u770B\u4E0D\u89C1\u7684\u9762\u677F\"\u3002\n // \u6307\u7740\u7A7A\u767D = \u6CA1\u6307\u4EFB\u4F55\u4E1C\u897F\u3002\n for (const el of stack) {\n const t = el.tagName\n if (t === \"HTML\" || t === \"BODY\" || el.hasAttribute(\"data-cs-artboard\")) return null\n if (paintsSomething(el, doc)) return el\n }\n return null\n}\n\n/** \u5929\u751F\u53EF\u89C1\u7684\u5143\u7D20:\u66FF\u6362\u5143\u7D20\u4E0E\u8868\u5355\u63A7\u4EF6,\u4E0D\u770B\u6837\u5F0F\u5C31\u77E5\u9053\u753B\u4E86\u4E1C\u897F */\nconst VISIBLE_TAGS = new Set([\n \"IMG\", \"VIDEO\", \"CANVAS\", \"INPUT\", \"SELECT\", \"TEXTAREA\", \"BUTTON\", \"HR\", \"IFRAME\",\n \"PICTURE\", \"AUDIO\", \"EMBED\", \"OBJECT\",\n])\n\n/** computed backgroundColor \u2192 alpha\u3002\u73B0\u4EE3\u6D4F\u89C8\u5668\u53EF\u80FD\u7ED9 lab()/oklch(),\u975E rgba \u683C\u5F0F\u4E00\u5F8B\u5F53\u4E0D\u900F\u660E */\nfunction bgAlpha(bg: string): number {\n if (bg === \"transparent\") return 0\n const m = bg.match(/^rgba\\([^)]*,\\s*([\\d.]+)\\s*\\)$/)\n return m ? parseFloat(m[1]) : 1\n}\n\n/** \u8FD9\u4E2A\u5143\u7D20\u5728\u89C6\u89C9\u4E0A\u753B\u4E86\u4EFB\u4F55\u4E1C\u897F\u5417(\u5E95\u8272/\u8FB9\u6846/\u9634\u5F71/\u56FE\u7247/\u76F4\u63A5\u6587\u672C)?\u7EAF\u5E03\u5C40\u5BB9\u5668\u8FD4\u56DE false */\nfunction paintsSomething(el: Element, doc: Document): boolean {\n if (VISIBLE_TAGS.has(el.tagName)) return true\n if (el.closest(\"svg\")) return true\n for (const n of el.childNodes) {\n if (n.nodeType === 3 && n.textContent && n.textContent.trim()) return true // \u76F4\u63A5\u6587\u672C\u8282\u70B9\n }\n const win = doc.defaultView\n if (!win) return false\n const cs = win.getComputedStyle(el)\n if (cs.backgroundImage !== \"none\") return true\n if (bgAlpha(cs.backgroundColor) > 0) return true\n if (cs.boxShadow !== \"none\") return true\n if (\n (parseFloat(cs.borderTopWidth) || 0) + (parseFloat(cs.borderRightWidth) || 0) +\n (parseFloat(cs.borderBottomWidth) || 0) + (parseFloat(cs.borderLeftWidth) || 0) > 0\n ) return true\n if (cs.outlineStyle !== \"none\" && (parseFloat(cs.outlineWidth) || 0) > 0) return true\n return false\n}\n\n/**\n * iframe \u5185\u5143\u7D20\u7684\u5305\u56F4\u76D2 \u2192 \u5C4F\u5E55\u5750\u6807\u3002\n * \u7F29\u653E\u5FC5\u987B\u73B0\u91CF,\u4E0D\u80FD\u7528 state.scale:\u4E16\u754C\u5BB9\u5668 #cs-world \u7684 transform \u5E26 260ms \u8FC7\u6E21\n * (view.ts \u7684 animateTo \u2014\u2014 \u5168\u666F 1 / \u805A\u7126 2 / 100% 0 / \u4FA7\u680F\u70B9\u6761\u76EE\u90FD\u8D70\u5B83),\u8FC7\u6E21\u9014\u4E2D\n * state.scale \u5DF2\u662F\u7EC8\u503C\u800C DOM \u8FD8\u505C\u5728\u534A\u8DEF,\u4E24\u8005\u6DF7\u7528\u6846\u5C31\u6574\u4F53\u9519\u4F4D\u3002\n */\nfunction screenRect(board: Board, el: Element): DOMRect | null {\n if (!board.iframe || !board.el.isConnected) return null\n const fr = board.iframe.getBoundingClientRect()\n const s = liveScale(board, board.frameEl.getBoundingClientRect())\n const b = el.getBoundingClientRect()\n return new DOMRect(fr.left + b.left * s, fr.top + b.top * s, b.width * s, b.height * s)\n}\n\n/**\n * \u8FD9\u4E00\u77AC\u95F4\u753B\u677F\u771F\u6B63\u88AB\u7F29\u653E\u6210\u4E86\u51E0\u500D:.cs-frame \u7684 CSS \u5BBD\u6052\u7B49\u4E8E board.width(wall.ts \u7684\n * applySize \u5199\u6B7B),\u5C4F\u5E55\u5BBD \u00F7 \u5B83\u5C31\u662F\u5F53\u524D\u751F\u6548\u7684\u7F29\u653E,\u8FC7\u6E21\u52A8\u753B\u4E2D\u9014\u4E5F\u51C6\u3002\u91CF\u4E0D\u51FA\u6765\u624D\u9000\u56DE state.scale\u3002\n */\nfunction liveScale(board: Board, frame: DOMRect): number {\n if (board.width > 0 && frame.width > 0) return frame.width / board.width\n return state.scale || 1\n}\n\n/** \u70B9\u51FB\u4F4D\u7F6E\u76F8\u5BF9\u5143\u7D20\u7684 0-1 \u5750\u6807 */\nexport function relPos(el: Element, clientX: number, clientY: number, board: Board): { x: number; y: number } {\n const r = screenRect(board, el)\n if (!r || r.width === 0 || r.height === 0) return { x: 0, y: 0 }\n const round = (v: number) => Math.round(clamp(v, 0, 1) * 1000) / 1000\n return { x: round((clientX - r.left) / r.width), y: round((clientY - r.top) / r.height) }\n}\n\n// ---------- selector \u751F\u6210 ----------\n\nfunction isUnique(doc: Document, sel: string): boolean {\n try {\n return doc.querySelectorAll(sel).length === 1\n } catch {\n return false\n }\n}\n\nfunction idSelector(el: Element): string | null {\n const id = el.getAttribute(\"id\")\n if (!id) return null\n return `#${CSS.escape(id)}`\n}\n\nfunction dataSelector(el: Element): string | null {\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith(\"data-\") || !attr.value) continue\n const v = attr.value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')\n return `[${attr.name}=\"${v}\"]`\n }\n return null\n}\n\nfunction nthPart(el: Element): string {\n const tag = el.localName\n const parent = el.parentElement\n if (!parent) return tag\n const sames = Array.from(parent.children).filter((c) => c.localName === tag)\n if (sames.length < 2) return tag\n return `${tag}:nth-of-type(${sames.indexOf(el) + 1})`\n}\n\n/** \u4F18\u5148 id,\u518D data-*,\u5426\u5219 \u6807\u7B7E+nth-of-type \u94FE(\u6700\u591A 5 \u5C42) */\nexport function buildSelector(el: Element): string {\n const doc = el.ownerDocument\n const parts: string[] = []\n let cur: Element | null = el\n while (cur && cur !== doc.documentElement && parts.length < 5) {\n const byId = idSelector(cur)\n if (byId && isUnique(doc, byId)) {\n parts.unshift(byId)\n return parts.join(\" > \")\n }\n const byData = dataSelector(cur)\n if (byData && isUnique(doc, byData)) {\n parts.unshift(byData)\n return parts.join(\" > \")\n }\n parts.unshift(nthPart(cur))\n const joined = parts.join(\" > \")\n if (isUnique(doc, joined)) return joined\n cur = cur.parentElement\n }\n return parts.join(\" > \") || el.localName\n}\n\n/** HUD \u6587\u6848:tag / probe / \u7C7B\u540D\u3002\u6CE8\u610F iframe \u91CC\u7684\u5143\u7D20\u8DE8 realm,\u4E0D\u80FD\u7528 instanceof \u5224\u7C7B\u578B */\nexport function describe(el: Element): string {\n const probe = el.closest(\"[data-probe]\")?.getAttribute(\"data-probe\")\n const cls = typeof el.className === \"string\" ? el.className : \"\"\n return (\n `<${el.localName}>` +\n (probe ? ` probe=${probe}` : \"\") +\n (cls ? ` .${cls.trim().split(/\\s+/).slice(0, 3).join(\".\")}` : \"\")\n )\n}\n\n// ---------- \u63CF\u8FB9\u6846 ----------\n\n/** \u6807\u7B7E\u4E0E\u6846\u4E4B\u95F4\u7684\u7F1D;\u8D34\u8FB9\u7FFB\u8FDB\u6846\u5185\u65F6\u540C\u6837\u7528\u5B83 */\nconst TAG_GAP = 1\n\n/**\n * \u6807\u7B7E(.cs-box-tag)\u5FC5\u987B\u7559\u5728\u753B\u677F\u7684\u53EF\u89C6\u533A\u91CC \u2014\u2014 \u5B83\u662F\u5C4F\u5E55\u5750\u6807\u5C42\u7684\u4E1C\u897F,\u4E0D\u53D7\u753B\u677F\n * overflow:hidden \u7EA6\u675F,\u4E0D\u7BA1\u5C31\u4F1A\u98D8\u5230\u753B\u677F\u5916\u9762\u7684\u753B\u5E03\u4E0A\u3002\n * \u9ED8\u8BA4\u8D34\u6846\u7684\u5DE6\u4E0A\u5916\u4FA7;\u4E0A\u9762\u585E\u4E0D\u4E0B\u5C31\u7FFB\u5230\u6846\u5185\u4FA7,\u518D\u4E0D\u884C\u6309\u53EF\u89C6\u533A\u8FB9\u7F18\u538B\u4F4F\u3002\n */\nfunction placeTag(tag: HTMLElement, box: DOMRect, frame: DOMRect, st: Painted, label: string): void {\n // \u957F selector \u4E0D\u8BB8\u9876\u7A7F\u753B\u677F:\u53EF\u7528\u5BBD\u7ED9\u6B7B,\u8D85\u51FA\u90E8\u5206\u7531 style-select.css \u7684\u7701\u7565\u53F7\u6536\u5C3E\n const maxW = Math.max(24, Math.floor(frame.width) - 2)\n const key = `${label}|${maxW}`\n if (st.tagKey !== key) {\n tag.style.maxWidth = `${maxW}px`\n const t = tag.getBoundingClientRect()\n // \u91CF\u5230 0 \u8BF4\u660E\u6846\u8FD9\u4E00\u523B\u8FD8\u662F display:none(\u8C03\u7528\u65B9\u5FC5\u987B\u5148 is-on \u518D\u6765),\u4E0D\u7F13\u5B58,\u4E0B\u4E00\u5E27\u91CD\u91CF\n st.tagKey = t.height > 0 ? key : \"\"\n st.tagW = t.width\n st.tagH = t.height\n }\n let x = box.left\n let y = box.top - st.tagH - TAG_GAP\n if (y < frame.top) y = box.top + TAG_GAP // \u9876\u8FB9\u8D34\u4F4F\u4E86 \u2192 \u7FFB\u5230\u6846\u5185\u4FA7\n y = clamp(y, frame.top, Math.max(frame.top, frame.bottom - st.tagH))\n x = clamp(x, frame.left, Math.max(frame.left, frame.right - st.tagW))\n // .cs-box \u662F border-box + 1px \u8FB9\u6846,\u6807\u7B7E\u7684\u5305\u542B\u5757\u662F\u5B83\u7684 padding box,\u6240\u4EE5\u8981\u5404\u51CF 1\n tag.style.left = `${x - box.left - 1}px`\n tag.style.top = `${y - box.top - 1}px`\n}\n\n/** \u753B\u4E00\u4E2A\u6846\u3002\u8FD4\u56DE true = \u8FD9\u6B21\u771F\u6539\u4E86 DOM(\u8DDF\u968F\u5FAA\u73AF\u9760\u5B83\u5224\u65AD\"\u8FD8\u5728\u52A8\") */\nfunction paint(box: HTMLDivElement, board: Board, el: Element, label: string): boolean {\n const r = screenRect(board, el)\n if (!r || r.width + r.height === 0) {\n const off = box.classList.contains(\"is-on\")\n box.classList.remove(\"is-on\")\n return off\n }\n const frame = board.frameEl.getBoundingClientRect()\n const sig = `${r.left},${r.top},${r.width},${r.height}|${frame.left},${frame.top},${frame.width},${frame.height}|${label}`\n let st = painted.get(box)\n if (st && st.sig === sig && box.classList.contains(\"is-on\")) return false\n if (!st) {\n st = { sig, tagKey: \"\", tagW: 0, tagH: 0 }\n painted.set(box, st)\n }\n st.sig = sig\n box.style.left = `${r.left}px`\n box.style.top = `${r.top}px`\n box.style.width = `${r.width}px`\n box.style.height = `${r.height}px`\n const tag = box.firstElementChild as HTMLElement\n if (tag.textContent !== label) tag.textContent = label\n // \u5148\u4EAE\u8D77\u6765\u518D\u6446\u6807\u7B7E:\u6846\u8FD8\u662F display:none \u7684\u8BDD,\u6807\u7B7E\u91CF\u51FA\u6765\u662F 0\u00D70,\u7FFB\u8FB9/\u5939\u8FB9\u5168\u7B97\u9519\n box.classList.add(\"is-on\")\n placeTag(tag, r, frame, st, label)\n return true\n}\n\n/** \u9009\u4E2D\u6846\u7684\u5143\u7D20:\u7F13\u5B58\u4F4F,\u65AD\u94FE(HMR \u6362 DOM)\u4E86\u518D\u6309 selector \u91CD\u67E5 */\nfunction resolveSelected(): Element | null {\n if (!selectRef) return null\n if (selectRef.el?.isConnected) return selectRef.el\n const doc = frameDoc(selectRef.board.iframe)\n try {\n selectRef.el = doc ? doc.querySelector(selectRef.selector) : null\n } catch {\n selectRef.el = null\n }\n return selectRef.el\n}\n\n/** \u628A\u4E24\u4E2A\u6846\u90FD\u6309\u5F53\u524D\u51E0\u4F55\u753B\u4E00\u904D,\u8FD4\u56DE\u662F\u5426\u6709\u53D8\u5316 */\nfunction paintAll(): boolean {\n let changed = false\n if (hoverRef) {\n if (hoverRef.el.isConnected) {\n changed = paint(hoverBox, hoverRef.board, hoverRef.el, hoverRef.el.localName) || changed\n } else {\n hideHover()\n changed = true\n }\n }\n if (selectRef) {\n const el = resolveSelected()\n if (el) changed = paint(selectBox, selectRef.board, el, selectRef.selector) || changed\n else if (selectBox.classList.contains(\"is-on\")) {\n selectBox.classList.remove(\"is-on\")\n changed = true\n }\n }\n return changed\n}\n\n// ---------- \u8DDF\u968F ----------\n//\n// refreshBoxes() \u53EA\u5728\"\u89C6\u56FE\u53D8\u5316\u90A3\u4E00\u523B\"\u88AB\u8C03\u4E00\u6B21,\u800C\u4E16\u754C\u5BB9\u5668\u7684 transform \u5E26 260ms \u8FC7\u6E21\n// (view.ts \u7684 animateTo),\u753B\u677F\u81EA\u52A8\u6D4B\u9AD8\u3001iframe \u5185\u5BB9\u91CD\u6392\u4E5F\u90FD\u4E0D\u662F\u4E00\u5E27\u5C31\u5B8C\u4E8B\u7684 \u2014\u2014\n// \u53EA\u753B\u4E00\u6B21,\u6846\u5C31\u505C\u5728\u534A\u8DEF\u4E0A\u518D\u4E5F\u4E0D\u52A8\u4E86\u3002\n// \u6240\u4EE5\u8FD9\u91CC\u8BA9\u6846\u8DDF\u5230\u505C:\u6BCF\u5E27\u53EA\u91CD\u7B97\u5F53\u524D\u4EAE\u7740\u7684\u90A3 1~2 \u4E2A\u6846,\u8FDE\u7EED STILL_FRAMES \u5E27\u51E0\u4F55\u6CA1\u53D8\n// \u5C31\u81EA\u5DF1\u505C\u6389(\u9759\u6B62\u60AC\u505C\u65F6\u4E0D\u70E7\u5E27),\u89C6\u56FE\u518D\u53D8\u65F6\u7531 refreshBoxes/showHover \u5524\u9192\u3002\nconst STILL_FRAMES = 24\nlet followRaf = 0\nlet stillFrames = 0\n\nfunction follow(): void {\n followRaf = 0\n if (!hoverRef && !selectRef) return\n stillFrames = paintAll() ? 0 : stillFrames + 1\n if (stillFrames < STILL_FRAMES) followRaf = requestAnimationFrame(follow)\n}\n\nfunction wake(): void {\n stillFrames = 0\n if (!followRaf && (hoverRef || selectRef)) followRaf = requestAnimationFrame(follow)\n}\n\nexport function showHover(board: Board, el: Element): void {\n hoverRef = { board, el }\n paint(hoverBox, board, el, el.localName)\n wake()\n}\n\nexport function hideHover(): void {\n hoverRef = null\n hoverBox.classList.remove(\"is-on\")\n}\n\nexport function showSelection(board: Board, selector: string): void {\n selectRef = { board, selector, el: null }\n refreshBoxes()\n}\n\nexport function clearSelection(): void {\n selectRef = null\n selectBox.classList.remove(\"is-on\")\n}\n\n/** \u5E73\u79FB/\u7F29\u653E/\u91CD\u6392\u540E\u91CD\u753B\u4E24\u4E2A\u6846(\u89C6\u56FE\u53D8\u5316\u7684\u5165\u53E3,\u540C\u65F6\u5524\u9192\u8DDF\u968F) */\nexport function refreshBoxes(): void {\n if (hoverRef && !hoverRef.el.isConnected) hideHover()\n paintAll()\n wake()\n}\n", "// pin \u6279\u6CE8:\u753B\u70B9\u3001hover \u6C14\u6CE1\u3001\u5C31\u5730\u8F93\u5165\u6846\nimport type { Annotation } from \"../types.js\"\nimport { createAnnotation, deleteAnnotation, fetchContext, patchAnnotation, pushContext } from \"./api.js\"\nimport { frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe, syncHud } from \"./hud.js\"\nimport { refThumb, setPasteTarget, uploadRef } from \"./refs.js\"\nimport { toast } from \"./toast.js\"\nimport { buildSelector, relPos } from \"./select.js\"\nimport { state, type Board } from \"./state.js\"\n\nlet fx: HTMLDivElement\nlet composer: HTMLDivElement | null = null\n\nexport function initPins(): void {\n fx = qs<HTMLDivElement>(\"#cs-fx\")\n}\n\n/** \u91CD\u753B\u6240\u6709\u753B\u677F\u7684 pin */\nexport function renderPins(): void {\n for (const board of state.boards.values()) renderBoardPins(board)\n}\n\nexport function renderBoardPins(board: Board): void {\n const layer = board.pinLayerEl\n layer.textContent = \"\"\n const doc = frameDoc(board.iframe)\n // verified = \u4EBA\u5DE5\u6838\u9A8C\u5B8C\u6BD5,\u4ECE\u5899\u4E0A\u6D88\u5931(\u4F46\u7559\u5728 annotations.json \u91CC\u5F53\u5386\u53F2)\n const list = state.annotations.filter(\n (a) => a.artboardId === board.entry.id && a.status !== \"verified\"\n )\n const used = new Map<string, number>() // \u540C\u951A\u70B9\u7684\u591A\u6761\u6279\u6CE8\u6A2A\u5411\u9519\u5F00,\u5426\u5219\u4E0B\u9762\u90A3\u6761\u6C38\u8FDC\u70B9\u4E0D\u5230\n list.forEach((ann, i) => {\n let left = 8\n let top = 8\n let orphan = true\n if (doc && ann.anchor) {\n let el: Element | null = null\n try {\n el = doc.querySelector(ann.anchor.selector)\n } catch {\n el = null\n }\n if (el) {\n const r = el.getBoundingClientRect()\n left = r.left + ann.anchor.x * r.width\n top = r.top + ann.anchor.y * r.height\n orphan = false\n }\n }\n // 12px \u7F51\u683C\u805A\u7C7B:\u540C\u70B9\u6216\u8FD1\u91CD\u53E0(\u5DEE\u51E0\u4E2A\u50CF\u7D20)\u7684 pin \u90FD\u8981\u9519\u5F00,\u5426\u5219\u4E0B\u9762\u90A3\u9897\u70B9\u4E0D\u5230\n const key = `${Math.round(left / 12)}:${Math.round(top / 12)}`\n const dup = used.get(key) ?? 0\n used.set(key, dup + 1)\n left += dup * 20\n\n // \u663E\u793A\u6C38\u4E45\u5E8F\u53F7,\u4E0D\u662F\"\u672C\u677F\u7B2C\u51E0\u4E2A\":\u4E24\u5757\u677F\u5404\u81EA\u4ECE 1 \u6570\u4F1A\u51FA\u73B0\u597D\u51E0\u4E2A\"1\",\n // \u800C\u4E14\u524D\u9762\u7684\u6279\u6CE8\u88AB\u6838\u9A8C\u540E,\u540E\u9762\u7684\u53F7\u5168\u4F53\u524D\u79FB \u2014\u2014 \u8DDF Claude \u5BF9\u8BDD\u65F6\u6307\u8BA4\u4E0D\u4E86\u540C\u4E00\u6761\n const pin = h(\"div\", \"cs-pin\", String(ann.seq ?? i + 1))\n pin.dataset.annId = ann.id\n if (ann.status === \"resolved\") pin.classList.add(\"is-resolved\")\n if (ann.id === selectedPinId) pin.classList.add(\"is-selected\")\n if (orphan) {\n pin.classList.add(\"is-orphan\")\n pin.title = \"\u951A\u70B9\u5143\u7D20\u6CA1\u627E\u5230,pin \u843D\u5728\u753B\u677F\u5DE6\u4E0A\u89D2\"\n }\n pin.style.left = `${left}px`\n pin.style.top = `${top}px`\n // \u70B9 pin = \u9009\u4E2D\u5B83,\u4E4B\u540E Enter \u7F16\u8F91 / Backspace \u5220\u9664\n pin.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n selectPin(ann.id)\n })\n pin.appendChild(bubble(ann))\n attachHoverGrace(pin)\n layer.appendChild(pin)\n })\n}\n\n// ---------- pin \u9009\u4E2D + \u952E\u76D8\u64CD\u4F5C ----------\n\nlet selectedPinId: string | null = null\n\nexport function selectedPin(): string | null {\n return selectedPinId\n}\n\nexport function selectPin(id: string | null): void {\n selectedPinId = id\n for (const p of document.querySelectorAll<HTMLElement>(\".cs-pin\")) {\n p.classList.toggle(\"is-selected\", !!id && p.dataset.annId === id)\n if (id && p.dataset.annId === id) p.classList.add(\"is-open\") // \u9009\u4E2D\u5C31\u628A\u6C14\u6CE1\u7559\u4F4F\n else p.classList.remove(\"is-open\")\n }\n setProbe(id ? \"\u6279\u6CE8\u5DF2\u9009\u4E2D:Enter \u7F16\u8F91 \u00B7 Backspace \u5220\u9664 \u00B7 Esc \u53D6\u6D88\" : \"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n\n/** Enter:\u6CA1\u5728\u7F16\u8F91\u5C31\u8FDB\u7F16\u8F91,\u6B63\u5728\u7F16\u8F91\u5C31\u4FDD\u5B58 */\nexport function editSelectedPin(): void {\n if (!selectedPinId) return\n const pin = document.querySelector<HTMLElement>(`.cs-pin[data-ann-id=\"${CSS.escape(selectedPinId)}\"]`)\n if (!pin) return\n const box = pin.querySelector<HTMLElement>(\".cs-pin-bubble\")\n if (!box) return\n const saveBtn = [...box.querySelectorAll(\"button\")].find((b) => b.textContent === \"\u4FDD\u5B58\")\n if (saveBtn) {\n saveBtn.click() // \u7F16\u8F91\u4E2D \u2192 \u4FDD\u5B58\n return\n }\n const ann = state.annotations.find((a) => a.id === selectedPinId)\n const textEl = box.querySelector<HTMLElement>(\".cs-pin-text\")\n if (ann && textEl) startEdit(box, textEl, ann)\n}\n\nexport function deleteSelectedPin(): void {\n if (!selectedPinId) return\n const id = selectedPinId\n selectedPinId = null\n void remove(id)\n}\n\n/** hover \u5F00\u5408\u8D70 JS + 250ms \u5173\u95ED\u5BBD\u9650\u3002\n * pin \u4E0E\u6C14\u6CE1\u4E4B\u95F4\u90A3\u6761\u7F1D\u73B0\u5728\u7531 style-pins.css \u7684\u900F\u660E\u6865\u63A5(`.cs-pin.is-open::after`)\u8865\u6210\n * pin \u81EA\u5DF1\u7684\u547D\u4E2D\u533A \u2014\u2014 \u7F1D\u91CC\u7684\u50CF\u7D20\u4E0D\u518D\u843D\u5230\u753B\u677F\u4E0A\u3002\u5BBD\u9650\u7559\u7740\u515C\u5FEB\u901F\u7529\u52A8:\u9F20\u6807\u4E00\u5E27\u8DE8\u8FC7\u6574\u6761\u6865\n * \u65F6 mouseleave \u7167\u6837\u4F1A\u6765,250ms \u5185\u4E0D\u5173,\u6309\u94AE\u8FD8\u70B9\u5F97\u5230\u3002 */\nfunction attachHoverGrace(pin: HTMLElement): void {\n let timer: ReturnType<typeof setTimeout> | null = null\n pin.addEventListener(\"mouseenter\", () => {\n if (timer !== null) clearTimeout(timer)\n timer = null\n pin.classList.add(\"is-open\")\n })\n pin.addEventListener(\"mouseleave\", () => {\n timer = setTimeout(() => {\n // \u7F16\u8F91\u4E2D\u4E0D\u81EA\u52A8\u5173(textarea \u91CC\u6253\u5B57\u65F6\u9F20\u6807\u53EF\u80FD\u79FB\u8D70)\n if (!pin.querySelector(\".cs-pin-bubble.is-editing\")) pin.classList.remove(\"is-open\")\n }, 250)\n })\n}\n\n/** \u4E00\u6761\u6279\u6CE8\u6302\u7684\u53C2\u8003\u56FE:\u6A2A\u6392\u7F29\u7565\u56FE,\u70B9\u5F00\u5927\u56FE */\nfunction refStrip(paths: string[]): HTMLElement {\n const strip = h(\"div\", \"cs-ref-strip\")\n for (const p of paths) strip.appendChild(refThumb(p))\n return strip\n}\n\nfunction bubble(ann: Annotation): HTMLElement {\n const box = h(\"div\", \"cs-pin-bubble\")\n const textEl = h(\"div\", \"cs-pin-text\", ann.text)\n box.appendChild(textEl)\n if (ann.refs?.length) box.appendChild(refStrip(ann.refs))\n const meta = h(\"div\", \"cs-pin-meta\")\n meta.appendChild(h(\"span\", undefined, ann.status === \"open\" ? \"open\" : \"\u5F85\u6838\u9A8C\"))\n\n const act = (label: string, cls: string, fn: () => void): void => {\n const btn = h(\"button\", cls, label)\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n fn()\n })\n meta.appendChild(btn)\n }\n\n if (ann.status === \"open\") {\n // Claude(\u6216\u4EBA)\u6807\u8BB0\"\u505A\u5B8C\u4E86\" \u2014\u2014 \u8FDB\u5165\u5F85\u6838\u9A8C,\u8FD8\u4E0D\u6D88\u5931\n act(\"\u6807\u8BB0\u5B8C\u6210\", \"cs-x\", () =>\n void transition(ann.id, { status: \"resolved\", resolvedAt: new Date().toISOString() }, \"\u5DF2\u6807\u8BB0\u5B8C\u6210,\u5F85\u4EBA\u5DE5\u6838\u9A8C\")\n )\n } else {\n // \u6838\u9A8C\u662F\u4EBA\u7684\u4E13\u5C5E\u52A8\u4F5C:\u901A\u8FC7 \u2192 \u4ECE\u5899\u4E0A\u6D88\u5931,\u8FDB\u5386\u53F2;\u4E0D\u901A\u8FC7 \u2192 \u6253\u56DE open\n act(\"\u6838\u9A8C\u901A\u8FC7\", \"cs-x\", () =>\n void transition(ann.id, { status: \"verified\", verifiedAt: new Date().toISOString() }, \"\u6838\u9A8C\u901A\u8FC7,\u5DF2\u5F52\u6863\u8FDB\u5386\u53F2\")\n )\n act(\"\u6253\u56DE\", \"cs-x\", () => void transition(ann.id, { status: \"open\" }, \"\u5DF2\u6253\u56DE,\u91CD\u65B0\u5F85\u5904\u7406\"))\n }\n act(\"\u7F16\u8F91\", \"cs-x\", () => startEdit(box, textEl, ann))\n act(\"\u5220\u9664\", \"cs-x cs-x-danger\", () => void remove(ann.id))\n box.appendChild(meta)\n return box\n}\n\nasync function transition(id: string, patch: Partial<Annotation>, msg: string): Promise<void> {\n try {\n const updated = await patchAnnotation(id, patch)\n upsert(updated)\n renderPins()\n toast(msg, \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u72B6\u6001\u66F4\u65B0\u5931\u8D25:${err}`, \"error\")\n }\n}\n\n/** \u5C31\u5730\u6539\u6279\u6CE8\u6587\u5B57 + \u6302\u53C2\u8003\u56FE:\u6587\u672C\u6362\u6210 textarea,\u4FDD\u5B58\u8D70 PATCH,SSE \u4F1A\u628A\u65B0\u5185\u5BB9\u63A8\u7ED9\u6240\u6709\u5BA2\u6237\u7AEF */\nfunction startEdit(box: HTMLElement, textEl: HTMLElement, ann: Annotation): void {\n if (box.querySelector(\"textarea\")) return\n box.classList.add(\"is-editing\") // \u7F16\u8F91\u4E2D\u6C14\u6CE1\u5E38\u663E,\u4E0D\u518D\u4F9D\u8D56 hover\n const ta = h(\"textarea\", \"cs-pin-edit\") as unknown as HTMLTextAreaElement\n ta.value = ann.text\n\n // \u7F16\u8F91\u6001\u91CC\u7C98\u8D34\u7684\u56FE\u6302\u5230\u8FD9\u6761\u6279\u6CE8\u3002\u5148\u53EA\u6682\u5B58,\u548C\u6587\u5B57\u4E00\u8D77\u5728\u300C\u4FDD\u5B58\u300D\u65F6 PATCH \u2014\u2014\n // \u7ACB\u523B PATCH \u4F1A\u7ECF SSE \u89E6\u53D1 renderPins,\u628A\u7528\u6237\u6B63\u5728\u6253\u7684\u5B57\u8FDE\u8F93\u5165\u6846\u4E00\u8D77\u51B2\u6389\u3002\n const refs = [...(ann.refs ?? [])]\n // \u5DF2\u6709\u56FE\u7684\u6C14\u6CE1\u91CC\u5DF2\u7ECF\u6709\u8FD9\u6761 strip,\u6CA1\u56FE\u7684\u73B0\u9020\u4E00\u6761(\u65B0\u9020\u7684\u8FD8\u6CA1\u8FDB DOM,\u63D2\u5230\u6309\u94AE\u884C\u524D\u9762)\n const strip = box.querySelector<HTMLElement>(\".cs-ref-strip\") ?? refStrip([])\n if (!strip.isConnected) box.insertBefore(strip, box.querySelector(\".cs-pin-meta\"))\n setPasteTarget({\n el: box,\n onFile: (file) => {\n void uploadRef(file)\n .then((path) => {\n refs.push(path)\n strip.appendChild(refThumb(path))\n toast(`\u53C2\u8003\u56FE\u5DF2\u4E0A\u4F20:${path} \u2014\u2014 \u70B9\u300C\u4FDD\u5B58\u300D\u540E\u624D\u6302\u5230\u8FD9\u6761\u6279\u6CE8`, \"ok\")\n })\n .catch((err) => toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\"))\n },\n })\n ta.addEventListener(\"keydown\", (e) => {\n e.stopPropagation() // \u7F16\u8F91\u65F6\u4E0D\u89E6\u53D1\u753B\u5E03\u5FEB\u6377\u952E\n // Enter \u4FDD\u5B58(Shift+Enter \u624D\u662F\u6362\u884C),Esc \u53D6\u6D88 \u2014\u2014 \u5168\u5C40\u5FEB\u6377\u952E\u5728\u8F93\u5165\u6846\u91CC\u88AB\u6321\u6389\u4E86,\n // \u6240\u4EE5\"Enter \u7F16\u8F91/\u4FDD\u5B58\"\u8FD9\u6761\u95ED\u73AF\u5FC5\u987B\u5728\u8FD9\u91CC\u81EA\u5DF1\u63A5\u4E0A\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault()\n save.click()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n renderPins()\n }\n })\n ta.addEventListener(\"mousedown\", (e) => e.stopPropagation())\n const row = h(\"div\", \"cs-pin-meta\")\n const save = h(\"button\", \"cs-x\", \"\u4FDD\u5B58\")\n save.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n const text = ta.value.trim()\n const textChanged = !!text && text !== ann.text\n const refsChanged = refs.length !== (ann.refs?.length ?? 0)\n if (!textChanged && !refsChanged) return renderPins()\n const patch: Partial<Annotation> = {}\n if (textChanged) patch.text = text\n if (refsChanged) patch.refs = refs\n void patchAnnotation(ann.id, patch)\n .then((updated) => {\n upsert(updated)\n renderPins()\n toast(\"\u6279\u6CE8\u5DF2\u66F4\u65B0\", \"ok\")\n })\n .catch((err) => toast(`\u6279\u6CE8\u66F4\u65B0\u5931\u8D25:${err}`, \"error\"))\n })\n const cancel = h(\"button\", \"cs-x\", \"\u53D6\u6D88\")\n cancel.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n renderPins() // \u91CD\u753B\u5373\u8FD8\u539F\n })\n row.appendChild(save)\n row.appendChild(cancel)\n textEl.replaceWith(ta)\n box.appendChild(row)\n ta.focus()\n ta.setSelectionRange(ta.value.length, ta.value.length)\n}\n\nasync function remove(id: string): Promise<void> {\n try {\n await deleteAnnotation(id)\n state.annotations = state.annotations.filter((a) => a.id !== id)\n renderPins()\n toast(\"\u6279\u6CE8\u5DF2\u5220\u9664\", \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u5220\u9664\u5931\u8D25:${err}`, \"error\")\n }\n}\n\n/** \u65E7\u7248\u672C\u628A\u4E0A\u6B21\u9009\u7684\u4F1A\u8BDD\u8BB0\u5728\u8FD9\u91CC\u3002\u73B0\u5728\u6BCF\u6B21\u90FD\u95EE,\u987A\u624B\u628A\u6B8B\u7559\u7684\u952E\u6E05\u6389 */\nfunction legacyPushMemKey(): string {\n return `cs-pushpid:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\n/**\n * \u4E00\u952E\u63A8\u9001\u3002**\u4E0D\u8BB0\u5FC6\u4F1A\u8BDD**:\u53EA\u8981\u6709\u591A\u4E2A\u5019\u9009,\u6BCF\u6B21\u63A8\u9001\u90FD\u5F39\u9009\u62E9\u5668\u8BA9\u4EBA\u5F53\u573A\u9009\n * \u2014\u2014\u63A8\u9519\u7A97\u53E3\u7684\u4EE3\u4EF7\u8FDC\u5927\u4E8E\u6BCF\u6B21\u70B9\u4E00\u4E0B\u3002\u552F\u4E00\u5019\u9009\u65F6\u670D\u52A1\u7AEF\u76F4\u53D1(\u4E0D\u6253\u6270)\u3002\n * pid \u53EA\u53EF\u80FD\u6765\u81EA\u521A\u624D\u90A3\u4E2A\u9009\u62E9\u5668\u3002\n * (\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F Shift+P\u300C\u5F3A\u5236\u91CD\u9009\u300D\u7684\u9057\u7559\u5165\u53C2,\u73B0\u5728\u6052\u7B49\u4E8E\u9ED8\u8BA4\u884C\u4E3A,\u7559\u7740\u53EA\u4E3A\u8BA9 modes.ts \u7F16\u8BD1\u8FC7;\n * \u89C1\u5B8C\u6210\u62A5\u544A:\u96C6\u6210\u8D1F\u8D23\u4EBA\u5220\u6389 modes.ts \u7684 Shift+P \u5206\u652F\u540E\u53EF\u4E00\u5E76\u53BB\u6389\u3002)\n */\nexport async function pushToClaudeCode(pid?: number): Promise<void> {\n setProbe(\"\u63A8\u9001\u4E2D\u2026\")\n try {\n try {\n localStorage.removeItem(legacyPushMemKey())\n } catch {\n /* \u6E05\u4E0D\u6389\u4E5F\u65E0\u6240\u8C13,\u53CD\u6B63\u4E0D\u518D\u8BFB\u5B83 */\n }\n let r = await pushContext(pid)\n // \u521A\u9009\u7684\u4F1A\u8BDD\u5728\u8FD9\u4E00\u77AC\u95F4\u5173\u6389\u4E86 \u2192 \u91CD\u65B0\u5217\u4E00\u904D(\u4F1A\u62FF\u5230\u65B0\u7684 choose \u6216\u552F\u4E00\u5019\u9009)\n if (!r.ok && \"reason\" in r && r.reason?.includes(\"\u5DF2\u4E0D\u5728\") && pid !== undefined) {\n r = await pushContext()\n }\n if (r.ok) {\n // \u8BF4\"\u5DF2\u6295\u9012\"\u800C\u4E0D\u662F\"\u5DF2\u9001\u8FBE\":Claude Code \u7684 inbound gate \u4F1A\u6309\u6743\u9650\u6A21\u5F0F hold/refuse,\n // \u76EE\u6807\u4F1A\u8BDD\u5F00\u7740 --dangerously-skip-permissions \u65F6\u5BF9\u65B9\u7EC8\u7AEF\u5F39\u7684\u662F\u5BA1\u6279\u6846,\u4E0D\u662F\u76F4\u63A5\u63A5\u6D3B\n toast(`\u5DF2\u6295\u9012\u5230\u300C${r.name}\u300D\u7684 inbox \u2014 \u8BE5\u4F1A\u8BDD\u53EF\u80FD\u9700\u8981\u4F60\u5728\u7EC8\u7AEF\u70B9\u4E00\u4E0B\u786E\u8BA4`, \"ok\")\n return\n }\n if (\"choose\" in r && r.choose?.length) {\n showSessionPicker(r.choose)\n return\n }\n toast(`${(\"reason\" in r && r.reason) || \"\u63A8\u9001\u5931\u8D25\"} \u2014\u2014 \u5DF2\u56DE\u843D\u4E3A\u590D\u5236\u5230\u526A\u8D34\u677F`, \"warn\")\n await copyContext()\n } catch (err) {\n toast(`\u63A8\u9001\u5931\u8D25:${err} \u2014\u2014 \u5DF2\u56DE\u843D\u4E3A\u590D\u5236\u5230\u526A\u8D34\u677F`, \"warn\")\n await copyContext()\n }\n}\n\n/** \u4F1A\u8BDD\u9009\u62E9\u5668:\u540C\u76EE\u5F55\u5F00\u4E86\u591A\u4E2A Claude \u7A97\u53E3\u65F6,\u6309\u540D\u5B57\u6311\u4E00\u4E2A(\u6570\u5B57\u952E/\u70B9\u51FB,Esc \u53D6\u6D88) */\nfunction showSessionPicker(items: Array<{ pid: number; name: string; status: string }>): void {\n document.getElementById(\"cs-picker\")?.remove()\n const wrap = h(\"div\", \"cs-picker\")\n wrap.id = \"cs-picker\"\n const card = h(\"div\", \"cs-card\")\n card.appendChild(h(\"h2\", undefined, \"\u63A8\u9001\u7ED9\u54EA\u4E2A\u4F1A\u8BDD?\"))\n\n // cleanup \u5FC5\u987B\u5728\u884C\u70B9\u51FB\u4E4B\u524D\u5B9A\u4E49:\u53EA remove \u4E0D\u6458\u76D1\u542C\u4F1A\u628A\u6355\u83B7\u671F keydown \u7559\u5728 document \u4E0A,\n // \u4E4B\u540E\u5728\u6279\u6CE8\u8F93\u5165\u6846\u91CC\u6253\u6570\u5B57\u5C31\u4F1A\u9759\u9ED8\u89E6\u53D1\u63A8\u9001(\u6355\u83B7\u671F\u8DD1\u5728\u8F93\u5165\u6846\u7684 stopPropagation \u4E4B\u524D)\n const cleanup = (): void => {\n document.removeEventListener(\"keydown\", onKey, true)\n wrap.remove()\n }\n\n items.slice(0, 9).forEach((it, i) => {\n const row = h(\n \"button\",\n \"cs-picker-row\",\n `${i + 1} ${it.name}`\n )\n const badge = h(\"span\", `cs-picker-status is-${it.status}`, it.status)\n row.appendChild(badge)\n row.addEventListener(\"click\", () => {\n cleanup()\n void pushToClaudeCode(it.pid)\n })\n card.appendChild(row)\n })\n card.appendChild(h(\"p\", \"cs-dim\", \"\u6570\u5B57\u952E\u9009\u62E9 \u00B7 Esc \u53D6\u6D88\"))\n wrap.appendChild(card)\n const onKey = (e: KeyboardEvent): void => {\n const n = Number(e.key)\n if (Number.isInteger(n) && n >= 1 && n <= Math.min(items.length, 9)) {\n e.stopPropagation()\n cleanup()\n void pushToClaudeCode(items[n - 1]!.pid)\n } else if (e.key === \"Escape\") {\n e.stopPropagation()\n cleanup()\n toast(\"\u5DF2\u53D6\u6D88\u63A8\u9001\")\n }\n }\n document.addEventListener(\"keydown\", onKey, true)\n wrap.addEventListener(\"click\", (e) => {\n if (e.target === wrap) cleanup()\n })\n document.body.appendChild(wrap)\n}\n\n/** \u590D\u5236\u6279\u6CE8\u7ED9 Claude:\u4E0E hook \u6CE8\u5165\u7EC8\u7AEF\u7684\u662F\u540C\u4E00\u4EFD /api/context \u6587\u672C */\nexport async function copyContext(): Promise<void> {\n try {\n const text = await fetchContext()\n if (!text.trim()) {\n toast(\"\u6CA1\u6709\u5F85\u5904\u7406\u7684\u6279\u6CE8\u6216\u9009\u4E2D,\u5148\u6309 c \u9489\u4E00\u6761\", \"warn\")\n return\n }\n await navigator.clipboard.writeText(text)\n const n = state.annotations.filter((a) => a.status === \"open\").length\n toast(`\u5DF2\u590D\u5236 ${n} \u6761\u6279\u6CE8(\u542B\u9009\u4E2D),\u7C98\u5230\u4EFB\u4F55 Claude Code \u7A97\u53E3\u5373\u53EF`, \"ok\")\n } catch (err) {\n toast(`\u590D\u5236\u5931\u8D25:${err}`, \"error\")\n }\n}\n\nfunction upsert(ann: Annotation): void {\n const i = state.annotations.findIndex((a) => a.id === ann.id)\n if (i >= 0) state.annotations[i] = ann\n else state.annotations.push(ann)\n}\n\n/** \u70B9\u4E86\u5143\u7D20,\u5C31\u5730\u5F00\u4E00\u4E2A\u5C0F\u8F93\u5165\u6846 */\nexport function openComposer(board: Board, el: Element, clientX: number, clientY: number): void {\n closeComposer()\n const selector = buildSelector(el)\n const rel = relPos(el, clientX, clientY, board)\n\n const box = h(\"div\", \"cs-pin-input\")\n box.style.left = `${Math.min(clientX + 10, window.innerWidth - 250)}px`\n // 170 \u800C\u4E0D\u662F 110:\u8D34\u4E00\u884C\u53C2\u8003\u56FE\u7F29\u7565\u56FE\u540E\u8FD9\u4E2A\u6846\u4F1A\u957F\u5230\u7EA6 150px \u9AD8,\u9760\u8FD1\u5C4F\u5E55\u5E95\u8FB9\u9489 pin \u65F6\u522B\u9732\u51FA\u53BB\n box.style.top = `${Math.min(clientY + 10, window.innerHeight - 170)}px`\n const ta = h(\"textarea\")\n ta.placeholder = `\u6279\u6CE8 ${selector}`\n const strip = refStrip([])\n const tip = h(\"div\", \"cs-pin-tip\", \"Enter \u63D0\u4EA4 \u00B7 Shift+Enter \u6362\u884C \u00B7 Cmd/Ctrl+V \u8D34\u53C2\u8003\u56FE \u00B7 Esc \u53D6\u6D88\")\n box.append(ta, strip, tip)\n fx.appendChild(box)\n composer = box\n ta.focus()\n\n // \u8F93\u5165\u6846\u5F00\u7740\u65F6\u7C98\u8D34\u7684\u56FE\u5F52\u8FD9\u6761\u6279\u6CE8(\u968F\u521B\u5EFA\u8BF7\u6C42\u4E00\u8D77\u63D0\u4EA4),\u4E0D\u518D\u8FDB\u5168\u5C40\u575E\n const refs: string[] = []\n setPasteTarget({\n el: box,\n onFile: (file) => {\n void uploadRef(file)\n .then((path) => {\n refs.push(path)\n strip.appendChild(refThumb(path))\n setProbe(`\u53C2\u8003\u56FE\u5DF2\u6302\u5230\u8FD9\u6761\u6279\u6CE8:${path}`)\n })\n .catch((err) => toast(`\u53C2\u8003\u56FE\u4E0A\u4F20\u5931\u8D25:${String(err)}`, \"error\"))\n },\n })\n\n ta.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n e.stopPropagation() // \u522B\u8BA9\u753B\u5E03\u5FEB\u6377\u952E\u62A2\u8D70\u6309\u952E\n if (e.key === \"Escape\") {\n closeComposer()\n exitPinMode()\n } else if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n const text = ta.value.trim()\n if (!text) {\n closeComposer()\n exitPinMode()\n return\n }\n void submit(board, selector, rel, text, refs)\n }\n })\n}\n\nasync function submit(\n board: Board,\n selector: string,\n rel: { x: number; y: number },\n text: string,\n refs: string[]\n): Promise<void> {\n closeComposer()\n // \u4E0D\u9000\u51FA\u6279\u6CE8\u6A21\u5F0F:\u8D70\u67E5\u4E00\u904D\u754C\u9762\u5F80\u5F80\u8981\u8FDE\u9489\u597D\u51E0\u6761,\u6BCF\u6761\u90FD\u91CD\u6309\u4E00\u6B21 c \u662F\u7EAF\u6469\u64E6\u3002\n // Esc \u9000\u51FA,HUD \u4F1A\u663E\u793A\"\u6279\u6CE8\u4E2D \u00B7 \u5DF2\u9489 N\"\u3002\n try {\n const ann = await createAnnotation({\n artboardId: board.entry.id,\n anchor: { selector, x: rel.x, y: rel.y },\n text,\n refs,\n status: \"open\",\n })\n upsert(ann)\n renderBoardPins(board)\n state.pinnedThisRun++\n syncHud()\n const withRefs = refs.length ? ` \u00B7 \u5E26 ${refs.length} \u5F20\u53C2\u8003\u56FE` : \"\"\n toast(`\u5DF2\u8BB0\u6279\u6CE8:${text.slice(0, 30)}${text.length > 30 ? \"\u2026\" : \"\"}${withRefs}`, \"ok\")\n } catch (err) {\n toast(`\u6279\u6CE8\u5931\u8D25:${String(err)}`, \"error\")\n }\n}\n\nexport function closeComposer(): void {\n composer?.remove()\n composer = null\n setPasteTarget(null) // \u8F93\u5165\u6846\u6CA1\u4E86,\u7C98\u8D34\u56DE\u5230\u5168\u5C40\u575E\n}\n\nexport function isComposing(): boolean {\n return composer !== null\n}\n\nexport function enterPinMode(): void {\n state.pinPending = true\n state.pinnedThisRun = 0\n syncHud()\n setProbe(\"\u6279\u6CE8\u6A21\u5F0F:\u70B9\u5143\u7D20\u843D pin,\u53EF\u8FDE\u9489\u591A\u6761,Esc \u9000\u51FA\")\n}\n\nexport function exitPinMode(): void {\n if (!state.pinPending) return\n state.pinPending = false\n if (state.pinnedThisRun > 0)\n toast(`\u672C\u8F6E\u9489\u4E86 ${state.pinnedThisRun} \u6761\u6279\u6CE8 \u00B7 \u6309 p \u63A8\u7ED9 Claude`, \"info\")\n state.pinnedThisRun = 0\n syncHud()\n setProbe(\"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n", "// \u4E16\u754C\u5BB9\u5668\u7684\u7F29\u653E/\u5E73\u79FB:transform \u5E94\u7528\u3001Ctrl+wheel \u4EE5\u5149\u6807\u4E3A\u951A\u7F29\u653E\u3001\u7A7A\u767D\u62D6\u62FD\u5E73\u79FB\nimport { clamp, qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\n\nexport const MIN_SCALE = 0.05\nexport const MAX_SCALE = 2\n\nlet viewport: HTMLDivElement\nlet world: HTMLDivElement\nlet zoomLabel: HTMLElement\nconst listeners: Array<() => void> = []\n\n/** \u89C6\u56FE\u53D8\u4E86(\u7F29\u653E/\u5E73\u79FB/\u5E03\u5C40)\u4E4B\u540E\u8981\u91CD\u7B97\u7684\u4E1C\u897F:\u9AD8\u4EAE\u6846\u3001\u7F29\u653E\u6807\u7B7E\u7B49 */\nexport function onViewChange(fn: () => void): void {\n listeners.push(fn)\n}\n\n// ---------- \u89C6\u56FE\u6301\u4E45\u5316:\u5237\u65B0/\u91CD\u542F\u540E\u56DE\u5230\u4E0A\u6B21\u7684\u4F4D\u7F6E\u4E0E\u7F29\u653E ----------\n\n/** \u6309\u9879\u76EE\u5206\u952E:\u591A\u9879\u76EE\u5171\u7528\u540C\u4E00\u7AEF\u53E3\u65F6 localStorage \u4E0D\u4E92\u76F8\u8E29 */\nfunction viewKey(): string {\n return `cs-view:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nlet saveTimer: ReturnType<typeof setTimeout> | null = null\nfunction persistView(): void {\n // \u8D70\u67E5\u6A21\u5F0F\u662F\u4E34\u65F6\u89C6\u56FE(Esc \u4F1A\u8FD8\u539F),\u4E0D\u843D\u76D8;\u843D\u7684\u662F\u5B83\u8FDB\u5165\u524D\u8BB0\u4F4F\u7684\u6D4F\u89C8\u89C6\u56FE\n const v =\n state.mode === \"review\" && state.viewBeforeReview\n ? state.viewBeforeReview\n : { tx: state.tx, ty: state.ty, scale: state.scale }\n if (saveTimer !== null) clearTimeout(saveTimer)\n saveTimer = setTimeout(() => {\n try {\n localStorage.setItem(viewKey(), JSON.stringify(v))\n } catch {\n /* \u9690\u79C1\u6A21\u5F0F\u7B49\u5B58\u4E0D\u4E86\u5C31\u7B97\u4E86 */\n }\n }, 300)\n}\n\n/** state.info \u5C31\u4F4D\u540E\u8C03\u7528:\u6062\u590D\u4E0A\u6B21\u89C6\u56FE,\u6CA1\u5B58\u8FC7\u8FD4\u56DE false(\u7528\u9ED8\u8BA4\u4F4D\u7F6E) */\nexport function restoreView(): boolean {\n try {\n const raw = localStorage.getItem(viewKey())\n if (!raw) return false\n const v = JSON.parse(raw) as { tx: number; ty: number; scale: number }\n if (![v.tx, v.ty, v.scale].every(Number.isFinite)) return false\n setView(v.tx, v.ty, v.scale)\n return true\n } catch {\n return false\n }\n}\n\nlet raf = 0\nexport function applyView(): void {\n world.style.transform = `translate(${state.tx}px, ${state.ty}px) scale(${state.scale})`\n // pin \u4E4B\u7C7B\u7684 UI \u7528\u53CD\u5411\u7F29\u653E\u62B5\u6D88,\u4FDD\u6301\u6052\u5B9A\u89C6\u89C9\u5927\u5C0F\n world.style.setProperty(\"--cs-inv\", String(1 / state.scale))\n // \u70B9\u9635\u80CC\u666F\u8DDF\u7740\u4E00\u8D77\u52A8,\u5E73\u79FB\u7F29\u653E\u624D\u6709\"\u771F\u5B9E\u7A7A\u95F4\"\u7684\u624B\u611F\n const grid = 24 * state.scale\n viewport.style.backgroundSize = `${grid}px ${grid}px`\n viewport.style.backgroundPosition = `${state.tx}px ${state.ty}px`\n zoomLabel.textContent = `${Math.round(state.scale * 100)}%`\n persistView()\n if (raf) return\n raf = requestAnimationFrame(() => {\n raf = 0\n for (const fn of listeners) fn()\n })\n}\n\nexport function setView(tx: number, ty: number, scale: number): void {\n state.scale = clamp(scale, MIN_SCALE, MAX_SCALE)\n state.tx = tx\n state.ty = ty\n applyView()\n}\n\n/** \u4EE5\u5C4F\u5E55\u4E0A\u67D0\u70B9\u4E3A\u951A\u7F29\u653E */\n/** \u4E16\u754C\u5185\u5BB9\u7684\u5305\u56F4\u76D2(\u4E16\u754C\u5750\u6807)\u3002\u7A7A\u5899\u8FD4\u56DE null */\nfunction worldBounds(): { x: number; y: number; w: number; h: number } | null {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n for (const b of state.boards.values()) {\n if (b.el.hidden) continue // \u9690\u85CF\u7684\u753B\u677F\u4E0D\u8BE5\u628A\u5305\u56F4\u76D2\u6491\u5927\n const x = parseFloat(b.el.style.left || \"0\")\n const y = parseFloat(b.el.style.top || \"0\")\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x + b.width)\n maxY = Math.max(maxY, y + b.height + 40)\n }\n if (!Number.isFinite(minX)) return null\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY }\n}\n\n/** \u5E73\u6ED1\u5730\u628A\u89C6\u56FE\u79FB\u5230\u76EE\u6807\u503C;\u62D6\u62FD/\u6EDA\u8F6E\u4E0D\u8D70\u8FD9\u91CC(\u90A3\u4E9B\u5FC5\u987B\u8DDF\u624B,\u4E0D\u80FD\u5E26\u8FC7\u6E21)\u3002\n * \u26A0\uFE0F \u8FC7\u6E21\u671F\u95F4 state \u5DF2\u662F\u7EC8\u503C\u3001DOM \u8FD8\u5728\u534A\u8DEF,\u4EFB\u4F55\u8BFB\u51E0\u4F55\u7684\u76D1\u542C\u8005(\u9AD8\u4EAE\u6846\u3001pin \u951A\u70B9)\n * \u8FD9\u4E00\u5E27\u7B97\u51FA\u6765\u7684\u90FD\u662F\u9519\u7684,\u800C applyView \u53EA\u5728\u5F00\u5934\u89E6\u53D1\u8FC7\u4E00\u6B21 \u2014\u2014 \u6240\u4EE5\u8FC7\u6E21\u7ED3\u675F\u540E\u5FC5\u987B\u518D\u8865\u4E00\u6B21,\n * \u5426\u5219\u9519\u4F4D\u4F1A\u6C38\u4E45\u9489\u5728\u90A3\u91CC\u3002 */\nfunction animateTo(tx: number, ty: number, scale: number): void {\n const world = qs<HTMLDivElement>(\"#cs-world\")\n world.style.transition = `transform var(--cs-dur-3) var(--cs-ease-out)`\n setView(tx, ty, scale)\n window.setTimeout(() => {\n world.style.transition = \"\" // \u52A8\u753B\u7ED3\u675F\u5C31\u6458\u6389,\u907F\u514D\u6C61\u67D3\u540E\u7EED\u8DDF\u624B\u64CD\u4F5C\n applyView() // DOM \u5DF2\u5230\u7EC8\u70B9,\u8BA9\u76D1\u542C\u8005\u6309\u771F\u5B9E\u51E0\u4F55\u91CD\u7B97\u4E00\u6B21\n }, 260)\n}\n\n/** \u53EF\u7528\u89C6\u53E3:\u6263\u6389\u5DE6\u4FA7\u680F,\u5426\u5219\u5185\u5BB9\u4F1A\u88AB\u538B\u5728\u680F\u5E95\u4E0B */\nexport function usableViewport(): { x: number; y: number; width: number; height: number } {\n const vp = qs(\"#cs-viewport\").getBoundingClientRect()\n const sb = document.getElementById(\"cs-sidebar\")\n const off = sb && document.body.dataset.sidebar !== \"off\" ? sb.getBoundingClientRect().width : 0\n return { x: vp.x + off, y: vp.y, width: vp.width - off, height: vp.height }\n}\n\n/** \u5168\u666F:\u4E00\u5C4F\u770B\u5B8C\u6574\u9762\u5899 */\nexport function fitAll(pad = 64): void {\n const b = worldBounds()\n if (!b) return\n const vp = usableViewport()\n const scale = clamp(\n Math.min((vp.width - pad * 2) / b.w, (vp.height - pad * 2) / b.h),\n MIN_SCALE,\n MAX_SCALE\n )\n animateTo(\n vp.x + vp.width / 2 - (b.x + b.w / 2) * scale,\n vp.y + vp.height / 2 - (b.y + b.h / 2) * scale,\n scale\n )\n}\n\n/** \u805A\u7126\u5230\u67D0\u5757\u753B\u677F(\u9ED8\u8BA4\u5F53\u524D\u6D3B\u52A8\u677F) */\nexport function fitBoard(id?: string | null, pad = 80): void {\n const board = state.boards.get(id ?? state.activeId ?? \"\")\n if (!board) return fitAll()\n const x = parseFloat(board.el.style.left || \"0\")\n const y = parseFloat(board.el.style.top || \"0\")\n const vp = usableViewport()\n const scale = clamp(\n Math.min((vp.width - pad * 2) / board.width, (vp.height - pad * 2) / (board.height + 40)),\n MIN_SCALE,\n MAX_SCALE\n )\n animateTo(\n vp.x + vp.width / 2 - (x + board.width / 2) * scale,\n vp.y + vp.height / 2 - (y + (board.height + 40) / 2) * scale,\n scale\n )\n}\n\n/** \u7F29\u653E\u5230 100%,\u4FDD\u6301\u89C6\u53E3\u4E2D\u5FC3\u4E0D\u52A8 */\nexport function zoomReset(): void {\n const vp = usableViewport()\n const cx = vp.x + vp.width / 2\n const cy = vp.y + vp.height / 2\n const k = 1 / state.scale\n animateTo(cx - (cx - state.tx) * k, cy - (cy - state.ty) * k, 1)\n}\n\n/** \u4EE5\u89C6\u53E3\u4E2D\u5FC3\u4E3A\u951A\u70B9\u6B65\u8FDB\u7F29\u653E(+/- \u952E\u7528) */\nexport function zoomStep(factor: number): void {\n const vp = usableViewport()\n zoomAt(vp.x + vp.width / 2, vp.y + vp.height / 2, factor)\n}\n\nexport function zoomAt(clientX: number, clientY: number, factor: number): void {\n const next = clamp(state.scale * factor, MIN_SCALE, MAX_SCALE)\n if (next === state.scale) return\n const r = viewport.getBoundingClientRect()\n const cx = clientX - r.left\n const cy = clientY - r.top\n const k = next / state.scale\n state.tx = cx - (cx - state.tx) * k\n state.ty = cy - (cy - state.ty) * k\n state.scale = next\n applyView()\n}\n\n/** \u4E8B\u4EF6\u76EE\u6807\u7B97\u4E0D\u7B97\"\u7A7A\u767D\"(\u7A7A\u767D\u5904\u624D\u62D6\u52A8\u5E73\u79FB) */\nfunction isBlank(target: EventTarget | null): boolean {\n const el = target as Element | null\n if (!el) return false\n return !el.closest(\".cs-board\")\n}\n\nexport function initView(): void {\n viewport = qs<HTMLDivElement>(\"#cs-viewport\")\n world = qs<HTMLDivElement>(\"#cs-world\")\n zoomLabel = qs(\"#cs-zoom\")\n\n viewport.addEventListener(\n \"wheel\",\n (e: WheelEvent) => {\n e.preventDefault()\n if (e.ctrlKey || e.metaKey) {\n // Ctrl+wheel / \u89E6\u63A7\u677F\u634F\u5408(\u6D4F\u89C8\u5668\u628A\u634F\u5408\u62A5\u6210 ctrlKey \u7684 wheel)\n zoomAt(e.clientX, e.clientY, Math.exp(-e.deltaY / 260))\n } else {\n // \u53CC\u6307\u6EDA\u8F6E = \u5E73\u79FB\n state.tx -= e.deltaX\n state.ty -= e.deltaY\n applyView()\n }\n },\n { passive: false }\n )\n\n let panId: number | null = null\n let lastX = 0\n let lastY = 0\n viewport.addEventListener(\"pointerdown\", (e: PointerEvent) => {\n // \u7A7A\u767D\u5904\u5DE6\u952E \u6216 \u4EFB\u610F\u5904\u4E2D\u952E \u2192 \u5E73\u79FB\n if (!(e.button === 1 || (e.button === 0 && isBlank(e.target)))) return\n panId = e.pointerId\n lastX = e.clientX\n lastY = e.clientY\n viewport.classList.add(\"is-panning\")\n viewport.setPointerCapture(e.pointerId)\n })\n viewport.addEventListener(\"pointermove\", (e: PointerEvent) => {\n if (panId !== e.pointerId) return\n state.tx += e.clientX - lastX\n state.ty += e.clientY - lastY\n lastX = e.clientX\n lastY = e.clientY\n applyView()\n })\n const endPan = (e: PointerEvent) => {\n if (panId !== e.pointerId) return\n panId = null\n viewport.classList.remove(\"is-panning\")\n }\n viewport.addEventListener(\"pointerup\", endPan)\n viewport.addEventListener(\"pointercancel\", endPan)\n\n applyView()\n}\n\nexport function isPanning(): boolean {\n return viewport.classList.contains(\"is-panning\")\n}\n", "// \u4E09\u6A21\u5F0F(\u6D4F\u89C8/\u4EA4\u4E92/\u8D70\u67E5)+ overlay \u4E8B\u4EF6\u53CD\u67E5 + \u5FEB\u6377\u952E\nimport { postSelection } from \"./api.js\"\nimport { clamp, qs } from \"./dom.js\"\nimport { setProbe, syncHud } from \"./hud.js\"\nimport { closeArgsPanel, isArgsOpen, openArgsPanel } from \"./args-panel.js\"\nimport {\n closeComposer, copyContext, deleteSelectedPin, editSelectedPin, enterPinMode, exitPinMode,\n isComposing, openComposer, pushToClaudeCode, selectPin, selectedPin,\n} from \"./pins.js\"\nimport {\n buildSelector,\n clearSelection,\n describe,\n elementAt,\n hideHover,\n relPos,\n showHover,\n showSelection,\n} from \"./select.js\"\nimport { state, type Board, type Mode } from \"./state.js\"\nimport {\n MAX_SCALE, MIN_SCALE, applyView, fitAll, fitBoard, isPanning, setView, zoomReset, zoomStep,\n} from \"./view.js\"\n\nlet viewport: HTMLDivElement\n\nfunction boardOf(target: EventTarget | null): Board | null {\n const el = (target as Element | null)?.closest?.(\".cs-board\") as HTMLElement | null\n if (!el?.dataset.id) return null\n return state.boards.get(el.dataset.id) ?? null\n}\n\nexport function setActive(id: string | null): void {\n if (state.activeId === id) return\n state.activeId = id\n for (const b of state.boards.values()) b.el.classList.toggle(\"is-active\", b.entry.id === id)\n}\n\nexport function setMode(mode: Mode, boardId?: string): void {\n if (mode !== \"browse\" && boardId) setActive(boardId)\n if (mode === \"review\" && !state.activeId) return\n const from = state.mode\n state.mode = mode\n hideHover()\n // \u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u4E0B,\u53EF\u4EA4\u4E92\u7684\u662F\u6574\u5757\u753B\u677F,\u5143\u7D20\u7EA7\u7684\u9009\u4E2D\u6846\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\"\u53EA\u6709\u8FD9\u4E2A\u5143\u7D20\u80FD\u70B9\"\u3002\n // \u6536\u6389\u6846,\u6539\u7531\u753B\u677F\u6574\u4F53\u7684\u9AD8\u4EAE\u8FB9\u6846\u8868\u8FBE\u8303\u56F4 \u2014\u2014 \u4EA4\u4E92\u8303\u56F4 = \u9AD8\u4EAE\u8303\u56F4\u3002\n if (mode !== \"browse\") clearSelection()\n syncHud()\n\n if (mode === \"review\" && from !== \"review\") {\n state.modeBeforeReview = from\n state.viewBeforeReview = { scale: state.scale, tx: state.tx, ty: state.ty }\n closeArgsPanel() // \u8D70\u67E5\u8981\u7684\u662F\u5168\u5BBD,\u522B\u8BA9 args \u9762\u677F\u538B\u4F4F\u5BBD\u753B\u677F\n fitActiveBoard()\n } else if (mode !== \"review\" && from === \"review\" && state.viewBeforeReview) {\n const v = state.viewBeforeReview\n state.viewBeforeReview = null\n setView(v.tx, v.ty, v.scale)\n }\n setProbe(\n mode === \"interact\"\n ? \"\u4EA4\u4E92\u6A21\u5F0F:\u76F4\u63A5\u64CD\u4F5C\u8FD9\u5757\u753B\u677F,Esc \u56DE\u6D4F\u89C8\"\n : mode === \"review\"\n ? \"\u8D70\u67E5\u6A21\u5F0F:Esc \u9000\u51FA\"\n : \"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\"\n )\n}\n\n/** \u8D70\u67E5:\u628A\u5F53\u524D\u753B\u677F\u7F29\u653E\u5E73\u79FB\u5230\u94FA\u6EE1\u89C6\u53E3(\u4E0D\u642C DOM,iframe \u4E0D\u4F1A\u91CD\u8F7D) */\nfunction fitActiveBoard(): void {\n const board = state.activeId ? state.boards.get(state.activeId) : null\n if (!board) return\n // data-mode \u5DF2\u5207\u5230 review(\u6807\u9898\u6761\u5DF2\u9690\u85CF),\u6B64\u523B\u8BFB\u5230\u7684\u624D\u662F\u6700\u7EC8\u4F4D\u7F6E\n const r = board.frameEl.getBoundingClientRect()\n const worldX = (r.left - state.tx) / state.scale\n const worldY = (r.top - state.ty) / state.scale\n const vw = window.innerWidth\n const vh = window.innerHeight\n const s = clamp(Math.min(vw / board.width, vh / board.height), MIN_SCALE, MAX_SCALE)\n setView((vw - board.width * s) / 2 - worldX * s, (vh - board.height * s) / 2 - worldY * s, s)\n}\n\n/** Esc \u9010\u7EA7\u9000\u51FA:\u6279\u6CE8 \u2192 \u8D70\u67E5 \u2192 \u4EA4\u4E92 \u2192 \u6E05\u9009\u4E2D */\nfunction escape(): void {\n if (isComposing()) {\n closeComposer()\n exitPinMode()\n return\n }\n if (state.pinPending) {\n exitPinMode()\n return\n }\n if (selectedPin()) {\n selectPin(null)\n return\n }\n if (state.mode === \"review\") {\n setMode(state.modeBeforeReview === \"review\" ? \"browse\" : state.modeBeforeReview)\n return\n }\n if (state.mode === \"interact\") {\n setMode(\"browse\")\n return\n }\n clearSelection()\n closeArgsPanel()\n setProbe(\"\u79FB\u5230\u753B\u677F\u4E0A\u53CD\u67E5\u5143\u7D20\")\n}\n\nfunction isEditable(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n const tag = el.tagName\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\" || el.isContentEditable === true) return true\n // chrome \u5C42(\u4FA7\u680F/args \u9762\u677F/\u9009\u62E9\u5668)\u91CC\u7684\u63A7\u4EF6\u81EA\u5DF1\u5C31\u8981\u7528 Enter/Space/Backspace\u3002\n // \u53EA\u6309\u6807\u7B7E\u540D\u5224\u65AD\u7684\u8BDD,\u7126\u70B9\u4E00\u843D\u5230\u4FA7\u680F\u7684\u6298\u53E0\u6309\u94AE\u4E0A,\u6309 Enter \u5C31\u88AB\"\u8D70\u67E5\"\u5403\u6389,\u6309\u94AE\u6C38\u8FDC\u6309\u4E0D\u4E0B\u53BB\u3002\n return el.closest(\"#cs-sidebar, #cs-args, .cs-picker, #cs-topbar\") !== null\n}\n\nfunction onKeyDown(e: KeyboardEvent): void {\n if (e.key === \"Escape\") {\n escape()\n return\n }\n if (isEditable(e.target) || e.metaKey || e.ctrlKey || e.altKey) return\n if (e.key === \"Enter\") {\n // \u9009\u4E2D\u4E86 pin \u5C31\u5148\u670D\u52A1\u5B83:Enter \u8FDB\u7F16\u8F91,\u7F16\u8F91\u4E2D Enter \u4FDD\u5B58\n if (selectedPin()) {\n e.preventDefault()\n editSelectedPin()\n return\n }\n if (state.mode !== \"review\" && state.activeId) {\n e.preventDefault()\n setMode(\"review\", state.activeId)\n }\n return\n }\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n if (selectedPin()) {\n e.preventDefault()\n deleteSelectedPin()\n }\n return\n }\n if (e.key === \"c\" || e.key === \"C\") {\n if (state.mode === \"browse\" && !state.pinPending) {\n e.preventDefault()\n enterPinMode()\n }\n return\n }\n if (e.key === \"y\" || e.key === \"Y\") {\n e.preventDefault()\n void copyContext()\n return\n }\n if (e.key === \"p\") {\n e.preventDefault()\n void pushToClaudeCode() // \u591A\u5019\u9009\u65F6\u6BCF\u6B21\u90FD\u5F39\u9009\u62E9\u5668,\u6CA1\u6709\"\u8BB0\u4F4F\u7684\u4F1A\u8BDD\"\u8FD9\u56DE\u4E8B\n return\n }\n // \u89C6\u56FE\u5BFC\u822A:\u4E00\u6574\u9762\u5899\u6CA1\u6709\"\u770B\u5168\"\u7684\u624B\u6BB5\u662F\u6700\u8981\u547D\u7684\u7F3A\u5931\n if (e.key === \"1\") {\n e.preventDefault()\n fitAll()\n return\n }\n if (e.key === \"2\") {\n e.preventDefault()\n fitBoard()\n return\n }\n if (e.key === \"0\") {\n e.preventDefault()\n zoomReset()\n return\n }\n if (e.key === \"=\" || e.key === \"+\") {\n e.preventDefault()\n zoomStep(1.25)\n return\n }\n if (e.key === \"-\" || e.key === \"_\") {\n e.preventDefault()\n zoomStep(0.8)\n }\n}\n\n/** \u540C\u6E90 iframe \u91CC\u7684\u6309\u952E\u4E5F\u8981\u80FD\u89E6\u53D1\u5916\u58F3\u5FEB\u6377\u952E(\u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u4E0B\u7126\u70B9\u5728 iframe \u5185) */\nexport function attachFrameKeys(doc: Document): void {\n doc.addEventListener(\"keydown\", onKeyDown)\n}\n\n// ---------- overlay \u4E8B\u4EF6 ----------\n\nfunction onMouseMove(e: MouseEvent): void {\n if (isPanning()) return\n const overlay = (e.target as Element | null)?.closest?.(\".cs-ovl\")\n const board = overlay ? boardOf(e.target) : null\n if (!board) {\n hideHover() // \u79FB\u51FA\u753B\u677F\u5230\u7A7A\u767D\u5904,\u522B\u628A\u63CF\u8FB9\u6846\u7559\u5728\u539F\u5730\n return\n }\n // \u53EA\u6709\u6D4F\u89C8\u6A21\u5F0F\u8DDF\u7740\u9F20\u6807\u6362\u6D3B\u52A8\u753B\u677F:\u4EA4\u4E92/\u8D70\u67E5\u6A21\u5F0F\u7684\u76EE\u6807\u5FC5\u987B\u9489\u4F4F\n if (state.mode !== \"browse\") return\n setActive(board.entry.id)\n const el = elementAt(board, e.clientX, e.clientY)\n if (!el) {\n hideHover()\n return\n }\n showHover(board, el)\n setProbe(`${board.entry.exportName} ${describe(el)}`)\n}\n\nfunction onClick(e: MouseEvent): void {\n const target = e.target as Element | null\n\n // \u6807\u9898\u6761:\u5F00/\u5173 args \u9762\u677F\n const title = target?.closest?.(\".cs-board-title\")\n if (title) {\n const board = boardOf(target)\n if (!board) return\n setActive(board.entry.id)\n if (isArgsOpen(board.entry.id)) closeArgsPanel()\n else openArgsPanel(board)\n return\n }\n\n const overlay = target?.closest?.(\".cs-ovl\")\n if (!overlay) return\n const board = boardOf(target)\n if (!board) return\n if (state.mode === \"interact\") return // \u4EA4\u4E92\u6A21\u5F0F\u4E0B\u522B\u7684\u753B\u677F\u70B9\u4E00\u4E0B\u4E0D\u62A2\u7126\u70B9,\u8981\u6362\u677F\u8BF7\u53CC\u51FB\n setActive(board.entry.id)\n\n const el = elementAt(board, e.clientX, e.clientY)\n if (!el) return\n\n if (state.pinPending) {\n openComposer(board, el, e.clientX, e.clientY)\n return\n }\n if (state.mode !== \"browse\") return\n\n const selector = buildSelector(el)\n const rel = relPos(el, e.clientX, e.clientY, board)\n showSelection(board, selector)\n state.selection = { artboardId: board.entry.id, selector, x: rel.x, y: rel.y, ts: Date.now() }\n setProbe(`\u5DF2\u9009\u4E2D ${board.entry.exportName} \u2192 ${selector}`)\n postSelection(state.selection).catch((err) => setProbe(`selection \u53D1\u9001\u5931\u8D25:${String(err)}`))\n}\n\nfunction onDblClick(e: MouseEvent): void {\n const board = boardOf(e.target)\n if (!board || !(e.target as Element).closest(\".cs-ovl\")) return\n setMode(\"interact\", board.entry.id)\n}\n\nexport function initModes(): void {\n // \u6302\u5728\u89C6\u53E3\u4E0A(\u4E0D\u662F\u4E16\u754C\u5BB9\u5668):\u9F20\u6807\u79FB\u5230\u7A7A\u767D\u5904\u4E5F\u8981\u6536\u5230\u4E8B\u4EF6,\u624D\u597D\u628A\u63CF\u8FB9\u6846\u6536\u6389\n viewport = qs<HTMLDivElement>(\"#cs-viewport\")\n viewport.addEventListener(\"mousemove\", onMouseMove)\n viewport.addEventListener(\"mouseleave\", hideHover)\n viewport.addEventListener(\"click\", onClick)\n viewport.addEventListener(\"dblclick\", onDblClick)\n document.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"resize\", () => {\n if (state.mode === \"review\") fitActiveBoard()\n else applyView()\n })\n syncHud()\n}\n", "// \u5899:\u4F4D\u7F6E\u56FA\u5316\u7684\u5E03\u5C40(\u81EA\u52A8\u6392\u5217\u53EA\u5728\u9996\u6B21\u52A0\u8F7D/\u65B0\u753B\u677F/\u70B9\u6309\u94AE\u65F6\u53D1\u751F)\u3001\u753B\u677F\u751F\u547D\u5468\u671F\n// (\u61D2\u6302\u8F7D / \u81EA\u52A8\u6D4B\u9AD8 / \u589E\u91CF\u589E\u5220)\u3001\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u6863\u4F4D\nimport type { RegistryEntry } from \"../types.js\"\nimport { boardUrl } from \"./api.js\"\nimport { clamp, frameDoc, h, qs } from \"./dom.js\"\nimport { setProbe } from \"./hud.js\"\nimport { attachFrameKeys } from \"./modes.js\"\nimport { renderBoardPins } from \"./pins.js\"\nimport { renderSidebar } from \"./sidebar.js\"\nimport { state, type Board } from \"./state.js\"\nimport { toast } from \"./toast.js\"\nimport { applyView } from \"./view.js\"\n\n// \u5E03\u5C40\u5E38\u91CF(\u4E16\u754C\u5750\u6807 px)\u3002\u5BC6\u5EA6\u662F\"\u4E13\u4E1A\u611F\"\u7684\u7B2C\u4E00\u6765\u6E90:\u4E00\u4E2A 56px \u9AD8\u7684\u5FBD\u7AE0\u539F\u5148\u8981\u5360\n// 222px \u7AD6\u5411\u7A7A\u95F4(\u5229\u7528\u7387 25%),\u4E00\u5C4F 87% \u662F\u7A7A\u7684\u2014\u2014\u8FD9\u4E0D\u662F\u914D\u8272\u95EE\u9898\u3002\n// \u26A0\uFE0F TITLE_H \u5FC5\u987B\u4E0E style.css \u7684 --cs-title-h \u4E00\u81F4(.cs-pins/.cs-rz-e \u7684\u504F\u79FB\u90FD\u7528\u5B83)\nconst PAD = 48\nconst BOARD_GAP = 24\nconst TITLE_H = 24\nconst SECTION_HEAD_H = 34\nconst SECTION_GAP = 40\n/** \u4E00\u884C\u7684\u8F6F\u4E0A\u9650:\u5373\u4F7F\u6CA1\u5230 PER_ROW,\u592A\u5BBD\u4E5F\u6362\u884C,\u514D\u5F97\u5899\u6A2A\u5411\u62C9\u5230\u5929\u8FB9 */\nconst ROW_MAX_W = 5200\nconst MIN_H = 88\nconst MAX_H = 1200\nconst DEFAULT_W = 480\n/** \u7F29\u5F97\u6BD4\u8FD9\u66F4\u5C0F\u5C31\u4E0D\u518D\u65B0\u6302 iframe:MIN_H \u964D\u4F4E\u540E\u4E00\u5C4F\u80FD\u585E\u4E0B\u51E0\u5341\u5757,\u5168\u6302\u4F1A\u628A next dev \u6253\u7206 */\nconst MOUNT_MIN_SCALE = 0.35\n\nlet world: HTMLDivElement\nlet io: IntersectionObserver\nconst groups = new Map<string, { el: HTMLDivElement; titleEl: HTMLDivElement }>()\n/** \u81EA\u52A8\u6D4B\u9AD8\u6B21\u6570\u4E0A\u9650,\u9632\u6B62\u5185\u5BB9\u4E0E\u5BB9\u5668\u4E92\u76F8\u8FFD\u7740\u6539\u7684\u6B7B\u5FAA\u73AF */\nconst measureCount = new Map<string, number>()\nconst lastBodyH = new Map<string, number>()\n/** \u6BCF\u5757\u753B\u677F\u4E00\u4E2A\u5185\u5BB9\u9AD8\u89C2\u5BDF\u8005,iframe \u91CD\u65B0\u5BFC\u822A\u65F6\u6362\u6389\u65E7\u7684 */\nconst heightWatchers = new Map<string, ResizeObserver>()\n\nexport function initWall(): void {\n world = qs<HTMLDivElement>(\"#cs-world\")\n initWallTools()\n io = new IntersectionObserver(\n (records) => {\n for (const r of records) {\n if (!r.isIntersecting) continue\n // \u5168\u666F\u89C6\u89D2(\u7F29\u5F97\u5F88\u5C0F)\u65F6\u4E0D\u6302\u8F7D:\u6B64\u65F6\u770B\u7684\u662F\u5E03\u5C40\u4E0D\u662F\u5185\u5BB9,\u800C\u4E00\u6B21\u6027\u6302\u51E0\u5341\u4E2A iframe\n // \u4F1A\u628A\u7528\u6237\u7684 dev server \u6253\u7206\u3002\u5DF2\u6302\u7684\u7EDD\u4E0D\u5378\u8F7D,\u653E\u5927\u56DE\u6765\u65F6\u518D\u8865\u6302\u3002\n if (state.scale < MOUNT_MIN_SCALE) continue\n const id = (r.target as HTMLElement).dataset.id\n const board = id ? state.boards.get(id) : null\n if (board) requestMount(board)\n io.unobserve(r.target)\n }\n },\n // \u89C6\u53E3\u5916 1.5 \u5C4F\u5C31\u5F00\u59CB\u6302\n { root: qs(\"#cs-viewport\"), rootMargin: \"150%\" }\n )\n}\n\n// ---------- \u589E\u91CF\u540C\u6B65 ----------\n\nexport function syncEntries(entries: RegistryEntry[]): void {\n state.entries = entries\n syncWallTools() // initWall \u65F6 state.info \u8FD8\u6CA1\u5230\u4F4D,\u8FD9\u91CC\u8865\u4E00\u6B21\u5168\u5C40\u6863\u4F4D\u7684\u9AD8\u4EAE\n\n const byFile = new Map<string, RegistryEntry[]>()\n for (const e of entries) {\n const list = byFile.get(e.file)\n if (list) list.push(e)\n else byFile.set(e.file, [e])\n }\n\n // \u6D88\u5931\u7684\u753B\u677F:\u6458\u6389\n const alive = new Set(entries.map((e) => e.id))\n for (const [id, board] of state.boards) {\n if (alive.has(id)) continue\n io.unobserve(board.el)\n board.el.remove()\n state.boards.delete(id)\n measureCount.delete(id)\n lastBodyH.delete(id)\n bgSyncs.delete(id)\n heightWatchers.get(id)?.disconnect()\n heightWatchers.delete(id)\n }\n for (const [file, list] of byFile) {\n const ids = list.map((e) => e.id)\n // \u4F4D\u7F6E\u7A33\u5B9A:\u5DF2\u6709 id \u4FDD\u6301\u539F\u987A\u5E8F,\u65B0 id \u8FFD\u52A0\u5230\u5C3E\u90E8\n const kept = (state.order.get(file) ?? []).filter((id) => ids.includes(id))\n state.order.set(file, kept.concat(ids.filter((id) => !kept.includes(id))))\n for (const entry of list) {\n const exist = state.boards.get(entry.id)\n if (exist) updateBoard(exist, entry)\n else state.boards.set(entry.id, createBoard(entry))\n }\n }\n // \u6587\u4EF6\u6CA1\u4E86\u5C31\u6E05\u6389\u5B83\u7684\u987A\u5E8F\u8868\n for (const file of [...state.order.keys()]) if (!byFile.has(file)) state.order.delete(file)\n\n // \u81EA\u52A8\u6392\u5217\u53EA\u5728\u4E09\u79CD\u65F6\u673A\u53D1\u751F:\u2460 \u8FD9\u4E2A\u9879\u76EE\u7B2C\u4E00\u6B21\u6253\u5F00 \u2461 \u51FA\u73B0\u4E86\u6CA1\u6709\u4F4D\u7F6E\u7684\u65B0\u753B\u677F\n // \u2462 \u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u3002\u5220\u753B\u677F\u3001\u6539\u5C3A\u5BF8\u3001HMR \u4E00\u5F8B\u4E0D\u91CD\u6392 \u2014\u2014 \u7528\u6237\u6446\u597D\u7684\u5899\u4E0D\u8BE5\u88AB\u51B2\u6389\u3002\n if (firstSync && !hasAnyPos()) {\n autoArrange()\n // \u753B\u677F\u521A\u5EFA\u597D\u65F6\u9AD8\u5EA6\u8FD8\u662F\u731C\u7684(iframe \u6CA1\u6302),\u7B49\u9996\u5C4F\u6D4B\u5B8C\u518D\u94FA\u4E00\u6B21,\u4E4B\u540E\u5C31\u5F7B\u5E95\u4E0D\u52A8\u4E86\n settleDeadline = Date.now() + SETTLE_WINDOW\n } else {\n const n = placeNewBoards()\n applyPositions()\n if (n && !firstSync) toast(`\u65B0\u753B\u677F ${n} \u5757 \u00B7 \u5DF2\u653E\u5230\u5899\u5E95\u90E8`, \"info\")\n }\n if (state.boards.size) firstSync = false\n renderSidebar()\n}\n\nexport function groupLabel(file: string): string {\n let s = file\n const dir = state.info?.designDir\n if (dir && s.startsWith(`${dir}/`)) s = s.slice(dir.length + 1)\n return s.replace(/\\.artboard\\.tsx?$/, \"\")\n}\n\n/** \u5206\u533A\u6807\u9898(\u9875\u9762 / \u7EC4\u4EF6),\u76F4\u63A5\u6302\u5728\u4E16\u754C\u5750\u6807\u91CC */\nfunction ensureSection(key: \"screen\" | \"component\"): HTMLDivElement {\n const found = groups.get(key)\n if (found) return found.titleEl\n const titleEl = h(\"div\", \"cs-section-title\")\n titleEl.dataset.section = key\n world.appendChild(titleEl)\n groups.set(key, { el: titleEl, titleEl })\n return titleEl\n}\n\n// ---------- \u753B\u677F ----------\n\nfunction createBoard(entry: RegistryEntry): Board {\n const el = h(\"div\", \"cs-board\")\n el.dataset.id = entry.id\n el.dataset.kind = entry.kind\n\n const titleEl = h(\"div\", \"cs-board-title\")\n const nameEl = h(\"span\", \"cs-name\", entry.exportName)\n const badgeEl = h(\"span\", \"cs-badge\", entry.kind)\n badgeEl.dataset.kind = entry.kind\n const argsCountEl = h(\"span\", \"cs-args-n\")\n titleEl.append(nameEl, badgeEl, argsCountEl)\n\n const frameEl = h(\"div\", \"cs-frame\")\n const placeholderEl = h(\"div\", \"cs-ph\", entry.exportName)\n const overlayEl = h(\"div\", \"cs-ovl\")\n const pinLayerEl = h(\"div\", \"cs-pins\")\n frameEl.append(placeholderEl, overlayEl)\n\n // pins \u5C42\u4E0D\u80FD\u8FDB frame:frame \u6709 overflow:hidden,pin \u9760\u8FD1\u753B\u677F\u9876\u90E8\u65F6\n // \u5411\u4E0A\u5F39\u7684\u6C14\u6CE1\u4F1A\u88AB\u88C1\u6389\u3002\u653E board \u5C42\u3001\u7528 CSS \u5BF9\u9F50\u5230 frame \u533A\u57DF(\u6807\u9898\u6761\u4E0B\u65B9)\u3002\n el.append(titleEl, frameEl, pinLayerEl)\n world.appendChild(el) // \u753B\u677F\u76F4\u63A5\u6D3B\u5728\u4E16\u754C\u5750\u6807\u91CC,\u8FD9\u6837\u624D\u597D\u81EA\u7531\u62D6\u52A8\n\n const board: Board = {\n entry,\n el,\n titleEl,\n nameEl,\n badgeEl,\n argsCountEl,\n frameEl,\n overlayEl,\n pinLayerEl,\n placeholderEl,\n iframe: null,\n width: boardWidth(entry),\n // \u9AD8\u5EA6\u4F18\u5148\u7EA7:\u624B\u52A8\u62D6\u8FC7\u7684 > \u58F0\u660E\u7684 > \u4E0A\u6B21\u6D4B\u51FA\u6765\u7F13\u5B58\u7684 > \u515C\u5E95 320\u3002\n // \u7528\u7F13\u5B58\u503C\u5F00\u5C40,\u61D2\u6302\u8F7D\u7684\u753B\u677F\u6302\u4E0A\u6765\u65F6\u9AD8\u5EA6\u5C31\u5DF2\u7ECF\u662F\u5BF9\u7684,\u4E0D\u4F1A\u6302\u4E00\u5757\u52A8\u4E00\u6B21\u5899\u3002\n height: clamp(getSize(entry.id).h ?? entry.env?.height ?? getFit(entry.id).h ?? 320, MIN_H, MAX_DRAG_H),\n argsOverride: null,\n }\n // \u63A7\u4EF6\u653E\u5230\u6807\u9898\u6761\u672B\u5C3E\u3002\u6807\u9898\u6761\u73B0\u5728\u6309\u5185\u5BB9\u6536\u7F29,\u82E5\u628A\u63A7\u4EF6\u63D2\u5728\u4E2D\u95F4,\u6807\u9898\u6761\u7684\u51E0\u4F55\u4E2D\u5FC3\n // \u5C31\u843D\u5728\u63A7\u4EF6\u4E0A\u2014\u2014\u70B9\"\u6807\u9898\u6761\u4E2D\u95F4\"\u4F1A\u88AB\u63A7\u4EF6\u5403\u6389,args \u9762\u677F\u6C38\u8FDC\u6253\u4E0D\u5F00\u3002\n if (entry.kind === \"screen\") titleEl.appendChild(widthSwitcher(board))\n if (entry.kind === \"component\") {\n titleEl.appendChild(bgToggle(board))\n board.el.dataset.bg = effectiveBg(entry.id) // iframe \u6302\u4E0A\u6765\u4E4B\u524D,\u5916\u5C42\u5E95\u8272\u4E5F\u5F97\u5148\u5BF9\n }\n attachResizeHandles(board)\n attachBoardDrag(board)\n applySize(board)\n updateBoard(board, entry)\n io.observe(el)\n return board\n}\n\n// ---------- \u6BCF\u677F\u7684\u672C\u673A\u8986\u76D6:\u5C3A\u5BF8(\u62D6\u62FD/\u5207\u6362\u5668) + \u5E95\u8272\u5F00\u5173 ----------\n\nconst WIDTH_PRESETS = [390, 768, 1024, 1280, 1440]\nconst MIN_SIZE = 120\nconst MAX_DRAG_H = 2400\n/** screen \u753B\u677F\u7684\u5BBD\u5EA6\u4E0B\u62C9,\u62D6\u62FD\u540E\u8981\u53CD\u5411\u540C\u6B65 */\nconst wsels = new Map<string, HTMLSelectElement>()\n\ninterface SizeOverride {\n w?: number\n h?: number\n}\n\nfunction sizeKey(id: string): string {\n return `cs-size:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction getSize(id: string): SizeOverride {\n try {\n return (JSON.parse(localStorage.getItem(sizeKey(id)) ?? \"{}\") as SizeOverride) ?? {}\n } catch {\n return {}\n }\n}\n\nfunction setSize(id: string, patch: SizeOverride): void {\n try {\n localStorage.setItem(sizeKey(id), JSON.stringify({ ...getSize(id), ...patch }))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\nfunction clearSize(id: string, dims: { w?: boolean; h?: boolean }): void {\n const cur = getSize(id)\n if (dims.w) delete cur.w\n if (dims.h) delete cur.h\n try {\n localStorage.setItem(sizeKey(id), JSON.stringify(cur))\n } catch {\n /* \u540C\u4E0A */\n }\n}\n\n/** \u753B\u677F\u5BBD:\u672C\u673A\u8986\u76D6(\u62D6\u62FD/\u5207\u6362\u5668) > \u58F0\u660E\u7684 env.width > \u4E0A\u6B21\u6D4B\u51FA\u6765\u7684\u5185\u5BB9\u5BBD > \u9ED8\u8BA4 */\nfunction boardWidth(entry: RegistryEntry): number {\n const o = getSize(entry.id).w\n if (typeof o === \"number\" && o >= MIN_SIZE) return o\n if (entry.env?.width) return entry.env.width\n return getFit(entry.id).w ?? DEFAULT_W\n}\n\n// ---------- \u81EA\u52A8\u6D4B\u91CF\u7ED3\u679C\u7684\u7F13\u5B58:\u4F4D\u7F6E\u56FA\u5316\u4E4B\u540E,\u5C3A\u5BF8\u4E5F\u5F97\u8DE8\u4F1A\u8BDD\u7A33\u5B9A ----------\n// \u4F4D\u7F6E\u4E00\u65E6\u56FA\u5316,\u5C3A\u5BF8\u5C31\u4E0D\u80FD\u6BCF\u6B21\u5237\u65B0\u90FD\u4ECE 320 \u91CD\u65B0\u957F\u8D77\u6765 \u2014\u2014 \u5426\u5219\u7B2C\u4E00\u6B21\u6D4B\u9AD8\u5C31\u628A\n// \u6392\u597D\u7684\u5899\u649E\u4E71\u3002\u6D4B\u51FA\u6765\u7684\u5BBD\u9AD8\u6309\u9879\u76EE\u5B58\u672C\u673A,\u4E0B\u6B21\u5F00\u5C40\u76F4\u63A5\u7528,\u6D4B\u91CF\u53EA\u662F\u6821\u6B63\u3002\n\nfunction fitKey(id: string): string {\n return `cs-fit:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction getFit(id: string): SizeOverride {\n try {\n return (JSON.parse(localStorage.getItem(fitKey(id)) ?? \"{}\") as SizeOverride) ?? {}\n } catch {\n return {}\n }\n}\n\nfunction setFit(id: string, patch: SizeOverride): void {\n try {\n localStorage.setItem(fitKey(id), JSON.stringify({ ...getFit(id), ...patch }))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n// ---------- \u624B\u52A8\u4F4D\u7F6E / \u663E\u9690(\u90FD\u6309\u9879\u76EE\u5206\u952E\u5B58\u672C\u673A) ----------\n\ninterface Pos {\n x: number\n y: number\n}\n\nfunction posKey(id: string): string {\n return `cs-pos:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nexport function getPos(id: string): Pos | null {\n try {\n const raw = localStorage.getItem(posKey(id))\n if (!raw) return null\n const p = JSON.parse(raw) as Pos\n return Number.isFinite(p?.x) && Number.isFinite(p?.y) ? p : null\n } catch {\n return null\n }\n}\n\nfunction setPos(id: string, p: Pos): void {\n try {\n localStorage.setItem(posKey(id), JSON.stringify(p))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n/** \u5899\u4E0A\u6709\u6CA1\u6709\u4EFB\u4F55\u4E00\u5757\u753B\u677F\u5DF2\u7ECF\u6709\u4F4D\u7F6E(\u5224\u65AD\"\u8FD9\u4E2A\u9879\u76EE\u662F\u4E0D\u662F\u7B2C\u4E00\u6B21\u6253\u5F00\") */\nfunction hasAnyPos(): boolean {\n for (const id of state.boards.keys()) if (getPos(id)) return true\n return false\n}\n\nfunction hiddenKey(): string {\n return `cs-hidden:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction hiddenSet(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(hiddenKey()) ?? \"[]\") as string[])\n } catch {\n return new Set()\n }\n}\n\nexport function isHidden(id: string): boolean {\n return hiddenSet().has(id)\n}\n\nexport function toggleHidden(id: string): void {\n setHidden([id], !hiddenSet().has(id))\n}\n\n/** \u6279\u91CF\u663E\u9690:\u4FA7\u680F\u7684\"\u4E00\u952E\u663E\u793A/\u9690\u85CF\u672C\u7EC4\"\u8D70\u8FD9\u6761\u3002\u9010\u6761\u8C03 toggleHidden \u4F1A\u6309\u6761\u6570\u91CD\u590D\u6574\u8F6E\u91CD\u6392,\n * \u51E0\u5341\u5757\u65E0\u611F,\u4E0A\u767E\u5757\u4F1A\u660E\u663E\u5361 \u2014\u2014 \u8FD9\u91CC\u843D\u76D8\u548C\u91CD\u6392\u5404\u53EA\u505A\u4E00\u6B21 */\nexport function setHidden(ids: string[], hidden: boolean): void {\n const s = hiddenSet()\n for (const id of ids) {\n if (hidden) s.add(id)\n else s.delete(id)\n }\n try {\n localStorage.setItem(hiddenKey(), JSON.stringify([...s]))\n } catch {\n /* \u540C\u4E0A */\n }\n cancelSettleArrange() // \u7528\u6237\u5F00\u59CB\u64CD\u4F5C\u5899\u4E86,\u9996\u5C4F\u6536\u5C3E\u91CD\u6392\u5230\u6B64\u4E3A\u6B62\n placeNewBoards() // \u4EAE\u56DE\u6765\u7684\u753B\u677F\u4E07\u4E00\u8FD8\u6CA1\u6709\u4F4D\u7F6E(\u9690\u85CF\u671F\u95F4\u65B0\u589E\u7684),\u7ED9\u5B83\u627E\u4E00\u5757\u7A7A\u5730\n applyPositions()\n}\n\n/** \u6807\u9898\u6761\u4E0A\u7684\u5BBD\u5EA6\u4E0B\u62C9:\u5207\u5BBD\u5EA6\u4E0D\u91CD\u8F7D\u9875\u9762,\u54CD\u5E94\u5F0F\u5F53\u573A\u91CD\u6392 */\nfunction widthSwitcher(board: Board): HTMLSelectElement {\n const sel = document.createElement(\"select\")\n sel.className = \"cs-wsel\"\n sel.title = \"\u89C6\u53E3\u5BBD\u5EA6:\u5207\u6362\u4E0D\u91CD\u8F7D,\u54CD\u5E94\u5F0F\u5F53\u573A\u91CD\u6392;\u9009\u8FC7\u7684\u8BB0\u5728\u672C\u673A\"\n const declared = board.entry.env?.width\n const opts = [...new Set([...(declared ? [declared] : []), ...WIDTH_PRESETS])].sort((a, b) => a - b)\n for (const w of opts) {\n const o = document.createElement(\"option\")\n o.value = String(w)\n o.textContent = `${w}${w === declared ? \" (\u58F0\u660E)\" : \"\"}`\n sel.appendChild(o)\n }\n const custom = document.createElement(\"option\")\n custom.value = \"custom\"\n custom.textContent = \"\u81EA\u5B9A\u4E49\u2026\"\n sel.appendChild(custom)\n sel.value = String(board.width)\n if (sel.value !== String(board.width)) {\n // \u5B58\u7684\u5BBD\u5EA6\u4E0D\u5728\u9884\u8BBE\u91CC,\u8865\u4E00\u4E2A\u5F53\u524D\u9879\n const o = document.createElement(\"option\")\n o.value = String(board.width)\n o.textContent = String(board.width)\n sel.insertBefore(o, custom)\n sel.value = String(board.width)\n }\n sel.addEventListener(\"click\", (e) => e.stopPropagation()) // \u522B\u89E6\u53D1\u6807\u9898\u6761\u7684 args \u9762\u677F\n sel.addEventListener(\"change\", (e) => {\n e.stopPropagation()\n let w: number\n if (sel.value === \"custom\") {\n const input = prompt(\"\u89C6\u53E3\u5BBD\u5EA6(px):\", String(board.width))\n w = Number(input)\n if (!Number.isFinite(w) || w < MIN_SIZE) {\n sel.value = String(board.width)\n return\n }\n } else {\n w = Number(sel.value)\n }\n syncWsel(sel, w)\n board.width = w\n setSize(board.entry.id, { w })\n cancelSettleArrange()\n applySize(board)\n applyPositions() // \u53EA\u6709\u5B83\u81EA\u5DF1\u53D8\u5BBD,\u90BB\u5C45\u4E0D\u52A8\n })\n wsels.set(board.entry.id, sel)\n return sel\n}\n\n/** \u8BA9\u4E0B\u62C9\u663E\u793A\u4EFB\u610F\u5BBD\u5EA6\u503C(\u4E0D\u5728\u9884\u8BBE\u91CC\u5C31\u8865\u4E00\u9879),\u62D6\u62FD\u540E\u4E5F\u8D70\u8FD9\u91CC\u540C\u6B65 */\nfunction syncWsel(sel: HTMLSelectElement, w: number): void {\n if (![...sel.options].some((o) => o.value === String(w))) {\n const custom = [...sel.options].find((o) => o.value === \"custom\") ?? null\n const o = document.createElement(\"option\")\n o.value = String(w)\n o.textContent = String(w)\n sel.insertBefore(o, custom)\n }\n sel.value = String(w)\n}\n\n/**\n * \u62D6\u6807\u9898\u6761\u632A\u753B\u677F\u3002\u6BCF\u5757\u753B\u677F\u7684\u4F4D\u7F6E\u90FD\u662F\u56FA\u5316\u7684,\u62D6\u5B8C\u53EA\u6709\u5B83\u81EA\u5DF1\u53D8 \u2014\u2014 \u90BB\u5C45\u4E00\u4E2A\u90FD\u4E0D\u52A8\u3001\n * \u4E5F\u4E0D\u4F1A\u6709\u8C01\u6765\"\u8865\u4F4D\"\u3002\u53CC\u51FB\u6807\u9898\u6761\u7A7A\u767D\u5904 = \u628A\u8FD9\u4E00\u5757\u653E\u56DE\u81EA\u52A8\u6392\u5217\u4F1A\u7ED9\u5B83\u7684\u4F4D\u7F6E\u3002\n * \u9608\u503C 4px:\u5C0F\u4E8E\u8FD9\u4E2A\u8DDD\u79BB\u5F53\u70B9\u51FB\u5904\u7406,\u514D\u5F97\"\u70B9\u6807\u9898\u6761\u5F00 args \u9762\u677F\"\u53D8\u5F97\u96BE\u70B9\u4E2D\u3002\n */\nfunction attachBoardDrag(board: Board): void {\n board.titleEl.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return\n cancelSettleArrange() // \u7528\u6237\u5F00\u59CB\u6446\u5899\u4E86,\u9996\u5C4F\u6536\u5C3E\u91CD\u6392\u7ACB\u523B\u4F5C\u5E9F\n // \u6807\u9898\u6761\u4E0A\u7684\u63A7\u4EF6(\u4E0B\u62C9/\u5E95\u8272\u5F00\u5173)\u81EA\u5DF1\u5904\u7406\u4E8B\u4EF6,\u4E0D\u8981\u88AB\u62D6\u62FD\u52AB\u6301\n if ((e.target as Element).closest(\"select,button\")) return\n const startX = e.clientX\n const startY = e.clientY\n const x0 = parseFloat(board.el.style.left || \"0\")\n const y0 = parseFloat(board.el.style.top || \"0\")\n let moved = false\n // \u5FC5\u987B\u5728 pointerdown \u5F53\u573A\u6355\u83B7:\u7B49\u79FB\u52A8\u4E86\u518D\u6355\u83B7\u7684\u8BDD,\u9F20\u6807\u65E9\u5DF2\u79BB\u5F00\u8FD9\u6761 24px \u9AD8\u7684\u6807\u9898\u6761,\n // pointermove \u6839\u672C\u6536\u4E0D\u5230,\u62D6\u62FD\u4F1A\u5728\u7B2C\u4E00\u50CF\u7D20\u5C31\u65AD\u6389\u3002\n board.titleEl.setPointerCapture(e.pointerId)\n const move = (ev: PointerEvent): void => {\n const dx = (ev.clientX - startX) / state.scale\n const dy = (ev.clientY - startY) / state.scale\n if (!moved && Math.hypot(ev.clientX - startX, ev.clientY - startY) < 4) return\n if (!moved) {\n moved = true\n board.el.classList.add(\"is-dragging\")\n }\n board.el.style.left = `${Math.round(x0 + dx)}px`\n board.el.style.top = `${Math.round(y0 + dy)}px`\n setProbe(`${Math.round(x0 + dx)}, ${Math.round(y0 + dy)}`)\n }\n const up = (): void => {\n board.titleEl.removeEventListener(\"pointermove\", move)\n board.titleEl.removeEventListener(\"pointerup\", up)\n board.titleEl.releasePointerCapture?.(e.pointerId)\n if (!moved) return\n board.el.classList.remove(\"is-dragging\")\n setPos(board.entry.id, {\n x: parseFloat(board.el.style.left || \"0\"),\n y: parseFloat(board.el.style.top || \"0\"),\n })\n applyPositions() // \u53EA\u662F\u628A\u56FA\u5316\u4F4D\u7F6E\u5199\u56DE\u53BB + \u5237\u65B0\u5206\u533A\u6807\u9898,\u522B\u4EBA\u7EB9\u4E1D\u4E0D\u52A8\n renderBoardPins(board)\n }\n board.titleEl.addEventListener(\"pointermove\", move)\n board.titleEl.addEventListener(\"pointerup\", up)\n })\n\n // \u53CC\u51FB\u6807\u9898\u6761:\u628A\u8FD9\u4E00\u5757\u653E\u56DE\"\u81EA\u52A8\u6392\u5217\u4F1A\u7ED9\u5B83\u7684\u4F4D\u7F6E\"(\u53EA\u52A8\u5B83\u81EA\u5DF1)\n board.titleEl.addEventListener(\"dblclick\", (e) => {\n if ((e.target as Element).closest(\"select,button\")) return\n e.stopPropagation()\n const p = computeAutoPositions().get(board.entry.id)\n if (!p) return\n setPos(board.entry.id, p)\n applyPositions()\n setProbe(\"\u5DF2\u5F52\u4F4D\u5230\u81EA\u52A8\u6392\u5217\u7684\u4F4D\u7F6E\")\n })\n}\n\n// ---------- \u62D6\u62FD\u8C03\u5C3A\u5BF8:\u53F3\u7F18\u8C03\u5BBD\u3001\u4E0B\u7F18\u8C03\u9AD8\u3001\u89D2\u4E0A\u540C\u65F6\u8C03 ----------\n\n/** \u62D6\u62FD\u4E2D\u7684\u753B\u677F id:\u6B64\u65F6\u81EA\u52A8\u6D4B\u9AD8\u5FC5\u987B\u95ED\u5634,\u5426\u5219 ResizeObserver \u4F1A\u628A\u62D6\u5230\u4E00\u534A\u7684\u9AD8\u5EA6\u5F53\u573A\u5F39\u56DE\u53BB */\nlet resizing: string | null = null\n\nfunction attachResizeHandles(board: Board): void {\n const mk = (cls: string, dw: boolean, dh: boolean): void => {\n const handle = h(\"div\", `cs-rz ${cls}`)\n handle.title = \"\u62D6\u52A8\u8C03\u6574 \u00B7 \u53CC\u51FB\u8FD8\u539F\u4E3A\u58F0\u660E/\u81EA\u52A8\u5C3A\u5BF8\"\n handle.addEventListener(\"dblclick\", (e) => {\n e.stopPropagation()\n cancelSettleArrange()\n clearSize(board.entry.id, { w: dw, h: dh })\n board.width = boardWidth(board.entry)\n const sel = wsels.get(board.entry.id)\n if (sel && dw) syncWsel(sel, board.width)\n measureBoard(board) // \u9AD8\u5EA6\u56DE\u5230\u58F0\u660E\u503C\u6216\u81EA\u52A8\u6D4B\u91CF\n applySize(board)\n applyPositions()\n setProbe(\"\u5DF2\u8FD8\u539F\u5C3A\u5BF8\")\n })\n handle.addEventListener(\"pointerdown\", (e) => {\n e.stopPropagation()\n e.preventDefault()\n cancelSettleArrange()\n handle.setPointerCapture(e.pointerId)\n resizing = board.entry.id\n const startX = e.clientX\n const startY = e.clientY\n const w0 = board.width\n const h0 = board.frameEl.getBoundingClientRect().height / state.scale\n const move = (ev: PointerEvent): void => {\n // \u5C4F\u5E55\u4F4D\u79FB\u6362\u7B97\u56DE\u4E16\u754C\u5C3A\u5EA6\n if (dw) board.width = Math.round(clamp(w0 + (ev.clientX - startX) / state.scale, MIN_SIZE, MAX_DRAG_H))\n if (dh) board.height = Math.round(clamp(h0 + (ev.clientY - startY) / state.scale, MIN_SIZE, MAX_DRAG_H))\n applySize(board)\n setProbe(`${board.width} \u00D7 ${Math.round(board.height)}`)\n }\n const up = (): void => {\n handle.removeEventListener(\"pointermove\", move)\n handle.removeEventListener(\"pointerup\", up)\n const patch: SizeOverride = {}\n if (dw) patch.w = board.width\n if (dh) patch.h = Math.round(board.height)\n setSize(board.entry.id, patch) // \u5148\u843D\u76D8,\u518D\u653E\u5F00\u6D4B\u91CF \u2014\u2014 \u987A\u5E8F\u53CD\u4E86\u5C31\u4F1A\u88AB\u81EA\u52A8\u6D4B\u9AD8\u8986\u76D6\n resizing = null\n const sel = wsels.get(board.entry.id)\n if (sel && dw) syncWsel(sel, board.width)\n applyPositions() // \u6539\u7684\u662F\u81EA\u5DF1\u7684\u5C3A\u5BF8,\u90BB\u5C45\u4E0D\u8BE5\u88AB\u63A8\u5F00\n }\n handle.addEventListener(\"pointermove\", move)\n handle.addEventListener(\"pointerup\", up)\n })\n board.el.appendChild(handle)\n }\n mk(\"cs-rz-e\", true, false)\n mk(\"cs-rz-s\", false, true)\n mk(\"cs-rz-se\", true, true)\n}\n\nfunction updateBoard(board: Board, entry: RegistryEntry): void {\n const urlChanged = board.entry.kind !== entry.kind || board.entry.url !== entry.url\n board.entry = entry\n board.nameEl.textContent = entry.exportName\n board.nameEl.title = entry.exportName // \u540D\u5B57\u88AB\u88C1\u65F6\u4ECD\u80FD\u8BFB\u5168\n board.badgeEl.textContent = entry.kind\n board.badgeEl.title = entry.kind === \"screen\" ? \"\u9875\u9762\u753B\u677F\" : \"\u7EC4\u4EF6\u753B\u677F\" // \u5FBD\u6807\u5DF2\u7F29\u6210\u5706\u70B9\n board.badgeEl.dataset.kind = entry.kind\n board.el.dataset.kind = entry.kind\n // \u9875\u9762\u753B\u677F\u663E\u793A\u5B83\u5BF9\u5E94\u7684\u771F\u5B9E\u8DEF\u7531 \u2014\u2014 \u5149\u770B export \u540D\u4E0D\u77E5\u9053\u5B83\u662F\u54EA\u4E00\u9875\n const n = entry.args ? Object.keys(entry.args).length : 0\n if (entry.kind === \"screen\" && entry.url) {\n board.argsCountEl.textContent = entry.url\n board.argsCountEl.classList.add(\"cs-route\")\n board.argsCountEl.title = `\u8DEF\u7531 ${entry.url}`\n } else {\n board.argsCountEl.textContent = n ? `${n} args` : \"\"\n board.argsCountEl.classList.remove(\"cs-route\")\n board.argsCountEl.title = \"\"\n }\n board.width = boardWidth(entry)\n if (entry.env?.height) board.height = clamp(entry.env.height, MIN_H, MAX_H)\n applySize(board)\n if (urlChanged && board.iframe) {\n const url = boardUrl(entry, board.argsOverride)\n board.iframe.dataset.csUrl = url\n board.iframe.src = url\n }\n}\n\nfunction applySize(board: Board): void {\n board.el.style.width = `${board.width}px`\n board.frameEl.style.width = `${board.width}px`\n board.frameEl.style.height = `${board.height}px`\n // \u5C3A\u5BF8\u53D8\u4E86 = iframe \u91CC\u7684\u5185\u5BB9\u4F1A\u91CD\u6392 = pin \u7684\u951A\u70B9\u5143\u7D20\u4F4D\u7F6E\u53D8\u4E86\u3002\n // \u4E0D\u5728\u8FD9\u91CC\u91CD\u753B\u7684\u8BDD,\u6279\u6CE8\u5C31\u4F1A\u8DDF\u4E22(\u5207\u5BBD\u5EA6\u3001\u62D6\u5C3A\u5BF8\u3001\u81EA\u52A8\u6D4B\u9AD8\u4E4B\u540E\u90FD\u4F1A\u53D1\u751F)\u3002\n schedulePinSync(board)\n}\n\n/** pin \u91CD\u5B9A\u4F4D\u5408\u5E76\u5230\u4E0B\u4E00\u5E27:\u4E00\u6B21\u62D6\u62FD\u4F1A\u89E6\u53D1\u51E0\u5341\u6B21 applySize,\u4E0D\u80FD\u6BCF\u6B21\u90FD\u91CD\u753B */\nconst pinSyncPending = new Set<string>()\nlet pinSyncRaf = 0\nfunction schedulePinSync(board: Board): void {\n pinSyncPending.add(board.entry.id)\n if (pinSyncRaf) return\n pinSyncRaf = requestAnimationFrame(() => {\n pinSyncRaf = 0\n for (const id of pinSyncPending) {\n const b = state.boards.get(id)\n if (b) renderBoardPins(b)\n }\n pinSyncPending.clear()\n })\n}\n\n/** \u5185\u5BB9\u81EA\u5DF1\u91CD\u6392(HMR\u3001\u5F02\u6B65\u6E32\u67D3\u3001\u4EA4\u4E92\u5C55\u5F00\u83DC\u5355)\u65F6\u4E5F\u8981\u8DDF \u2014\u2014 \u7531 watchContentHeight \u91CC\u7684\u89C2\u5BDF\u8005\u8C03 */\nexport function syncPins(board: Board): void {\n schedulePinSync(board)\n}\n\n// \u9519\u5CF0\u6302\u8F7D:\u540C\u65F6\u52A0\u8F7D\u7684 iframe \u5C01\u9876,\u5176\u4F59\u6392\u961F \u2014\u2014 \u5237\u65B0\u65F6\u5341\u51E0\u5757\u4E00\u8D77\u6253 dev server \u4F1A\u8BA9\u9996\u5C4F\u66F4\u6162\nconst MAX_LOADING = 4\nlet loadingCount = 0\nconst mountQueue: Board[] = []\n\n/** \u4ECE\u5168\u666F\u653E\u5927\u56DE\u6765\u65F6\u8865\u6302:IO \u5728\u4F4E\u7F29\u653E\u4E0B\u8DF3\u8FC7\u7684\u753B\u677F,\u6B64\u523B\u82E5\u53EF\u89C1\u5C31\u6302\u4E0A */\nexport function mountVisible(): void {\n if (state.scale < MOUNT_MIN_SCALE) return\n const vp = qs(\"#cs-viewport\").getBoundingClientRect()\n for (const board of state.boards.values()) {\n if (board.iframe) continue\n const r = board.el.getBoundingClientRect()\n const visible = r.bottom > vp.top - vp.height && r.top < vp.bottom + vp.height &&\n r.right > vp.left - vp.width && r.left < vp.right + vp.width\n if (visible) requestMount(board)\n }\n}\n\nfunction requestMount(board: Board): void {\n if (board.iframe || mountQueue.includes(board)) return\n if (loadingCount >= MAX_LOADING) {\n mountQueue.push(board)\n return\n }\n mount(board)\n}\n\nfunction drainMountQueue(): void {\n while (loadingCount < MAX_LOADING && mountQueue.length) {\n const next = mountQueue.shift()\n if (next && !next.iframe) mount(next)\n }\n}\n\nfunction mount(board: Board): void {\n if (board.iframe) return\n loadingCount++\n const iframe = document.createElement(\"iframe\")\n iframe.title = board.entry.exportName\n const url = boardUrl(board.entry, board.argsOverride)\n iframe.dataset.csUrl = url\n let settled = false\n const settle = (): void => {\n if (settled) return\n settled = true\n loadingCount = Math.max(0, loadingCount - 1)\n drainMountQueue()\n }\n iframe.addEventListener(\"load\", () => {\n settle()\n onFrameLoad(board)\n })\n setTimeout(settle, 10000) // load \u4E8B\u4EF6\u4E07\u4E00\u4E0D\u6765,\u522B\u628A\u961F\u4F0D\u5835\u6B7B\n board.frameEl.insertBefore(iframe, board.overlayEl)\n iframe.src = url\n board.iframe = iframe\n board.placeholderEl.hidden = true\n}\n\nfunction onFrameLoad(board: Board): void {\n const doc = frameDoc(board.iframe)\n if (!doc) return\n attachFrameKeys(doc)\n injectWallCss(board)\n measureBoard(board)\n applyPositions() // \u6D4B\u51FA\u6765\u7684\u9AD8\u53EA\u6539\u81EA\u5DF1\u8FD9\u4E00\u5757,\u4E0D\u91CD\u6392\u522B\u4EBA\n scheduleSettleArrange() // \u53EA\u5728\u9996\u5C4F\u90A3\u51E0\u79D2\u6709\u6548,\u4E4B\u540E\u662F\u7A7A\u64CD\u4F5C\n renderBoardPins(board)\n watchContentHeight(board)\n}\n\n/** \u5899\u7684\u8BED\u5883\u6837\u5F0F\u6CE8\u5165(\u540C\u6E90\u624D\u53EF\u80FD):\u85CF Next dev indicator;\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u53E6\u8D70 applyBgPref */\nfunction injectWallCss(board: Board): void {\n const doc = frameDoc(board.iframe)\n if (!doc?.head) return\n if (!doc.getElementById(\"__cs_wall_css\")) {\n const st = doc.createElement(\"style\")\n st.id = \"__cs_wall_css\"\n // dev indicator \u7684 N,\u5899\u4E0A\u7EAF\u566A\u97F3(\u8981\u770B\u9519\u8BEF\u6D6E\u5C42\u53BB :3000)\n st.textContent = \"nextjs-portal{display:none !important}\"\n doc.head.appendChild(st)\n }\n applyBgPref(board)\n}\n\n// ---------- \u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272:\u878D\u5165\u753B\u5E03 / \u9879\u76EE\u771F\u5B9E\u5E95\u8272 ----------\n//\n// iframe \u7684\u753B\u5E03\u5E95\u5728\u6D4F\u89C8\u5668\u91CC\u5FC5\u7136\u4E0D\u900F\u660E:\u628A\u5D4C\u5165\u6587\u6863\u7684 html/body \u8BBE\u6210 background:transparent,\n// \u8BA1\u7B97\u503C\u786E\u5B9E\u662F\u900F\u660E,\u6E32\u67D3\u51FA\u6765\u4ECD\u7136\u662F\u767D\u3002\u6240\u4EE5\"\u8BA9\u5B83\u771F\u900F\u660E\"\u8FD9\u6761\u8DEF\u8D70\u4E0D\u901A,\u53EA\u6709\u4E24\u6863\u53EF\u9009:\n// blend\u300C\u878D\u5165\u753B\u5E03\u300D(\u9ED8\u8BA4):\u628A\u753B\u5E03\u5E95\u5237\u6210\u753B\u5E03\u540C\u8272(--cs-bg),\u90A3\u5757\u767D\u5C31\u5728\u5899\u91CC\u6D88\u5931\u4E86;\n// real \u300C\u9879\u76EE\u771F\u5B9E\u5E95\u8272\u300D:\u5237\u6210\u9879\u76EE\u81EA\u5DF1\u7684 --background,\u770B\u7EC4\u4EF6\u5728\u771F\u5B9E\u9875\u9762\u5E95\u8272\u4E0A\u7684\u6837\u5B50\u3002\n// \u9875\u9762(screen)\u753B\u677F\u4E0D\u53C2\u4E0E \u2014\u2014 \u5B83\u672C\u6765\u5C31\u8BE5\u663E\u793A\u771F\u5B9E\u9875\u9762\u3002\n\ntype BgMode = \"blend\" | \"real\"\n\n/** \u51FA\u5382\u9ED8\u8BA4\u5FC5\u987B\u662F\u4E0D\u663E\u773C\u7684\u90A3\u6863 */\nconst BG_FALLBACK: BgMode = \"blend\"\nconst BG_LABEL: Record<BgMode, string> = { blend: \"\u878D\u5165\u753B\u5E03\", real: \"\u9879\u76EE\u771F\u5B9E\u5E95\u8272\" }\n\n/** \u5168\u5C40\u9ED8\u8BA4\u6863(\u5899\u5C42\u9762,\u6309\u9879\u76EE\u5B58\u672C\u673A) */\nfunction bgGlobalKey(): string {\n return `cs-bg-default:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction globalBg(): BgMode {\n try {\n return localStorage.getItem(bgGlobalKey()) === \"real\" ? \"real\" : BG_FALLBACK\n } catch {\n return BG_FALLBACK\n }\n}\n\nfunction setGlobalBg(mode: BgMode): void {\n try {\n localStorage.setItem(bgGlobalKey(), mode)\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n/** \u6BCF\u677F\u8986\u76D6(\u6309\u9879\u76EE + \u753B\u677F\u5B58\u672C\u673A);\u6CA1\u6709\u8FD9\u4E2A\u952E = \u8DDF\u968F\u5168\u5C40 */\nfunction bgKey(id: string): string {\n return `cs-bg:${state.info?.projectRoot ?? \"unknown\"}:${id}`\n}\n\nfunction bgOverride(id: string): BgMode | null {\n try {\n const v = localStorage.getItem(bgKey(id))\n if (v === \"blend\") return \"blend\"\n if (v === \"real\" || v === \"1\") return \"real\" // \"1\" \u662F\u8001\u7248\u672C\u7684\"\u663E\u793A\u9879\u76EE\u5E95\u8272\"\n return null\n } catch {\n return null\n }\n}\n\nfunction setBgOverride(id: string, mode: BgMode | null): void {\n try {\n if (mode) localStorage.setItem(bgKey(id), mode)\n else localStorage.removeItem(bgKey(id))\n } catch {\n /* \u540C\u4E0A */\n }\n}\n\nfunction effectiveBg(id: string): BgMode {\n return bgOverride(id) ?? globalBg()\n}\n\n/**\n * \u753B\u5E03\u81EA\u5DF1\u7684\u5E95\u8272\u3002\u6CE8\u5165\u8FDB iframe \u7684\u662F**\u8272\u503C**(iframe \u91CC\u6CA1\u6709\u753B\u5E03\u7684 CSS \u53D8\u91CF),\n * \u6240\u4EE5\u8FD9\u91CC\u73B0\u8BFB --cs-bg,\u6362\u4E3B\u9898\u81EA\u52A8\u8DDF\u968F;\u672B\u5C3E\u90A3\u4E2A\u5B57\u9762\u91CF\u53EA\u662F\u53D8\u91CF\u8BFB\u4E0D\u5230\u65F6\u7684\u515C\u5E95,\n * \u4E0D\u662F\u7B2C\u4E8C\u4E2A\u8272\u6E90\u3002\n */\nfunction canvasBg(): string {\n return getComputedStyle(document.documentElement).getPropertyValue(\"--cs-bg\").trim() || \"#0a0b0d\"\n}\n\n/** \u628A\u67D0\u5757\u7EC4\u4EF6\u753B\u677F\u7684\u5E95\u8272\u6863\u4F4D\u843D\u5230\u5916\u5C42 DOM + iframe \u91CC */\nfunction applyBgPref(board: Board): void {\n if (board.entry.kind !== \"component\") return\n const mode = effectiveBg(board.entry.id)\n board.el.dataset.bg = mode // .cs-frame \u7684\u5E95/\u63CF\u8FB9\u8DDF\u7740\u8FD9\u4E2A\u5C5E\u6027\u8D70(\u89C1 style-wall.css)\n const doc = frameDoc(board.iframe)\n if (!doc?.head) return\n let st = doc.getElementById(\"__cs_bg\") as HTMLStyleElement | null\n if (!st) {\n st = doc.createElement(\"style\")\n st.id = \"__cs_bg\"\n doc.head.appendChild(st)\n }\n // \u5237 html,body \u800C\u4E0D\u662F wrapper:\u753B\u5E03\u5E95\u662F\u4ECE html/body \u4F20\u64AD\u4E0A\u53BB\u7684,\n // \u53EA\u7ED9 wrapper \u4E0A\u8272\u7684\u8BDD padding \u4E4B\u5916\u4ECD\u662F\u4E00\u5708\u767D\u8FB9\n // \u987A\u5E26\u9690\u6389\u6839\u6EDA\u52A8\u6761:\u753B\u677F\u9AD8\u5EA6\u672C\u6765\u5C31\u81EA\u52A8\u8D34\u5185\u5BB9,\u6D4B\u9AD8\u7684\u534A\u8DEF\u4E0A\u5192\u51FA\u6765\u7684\u6EDA\u52A8\u6761\u53EA\u662F\u566A\u97F3,\n // \u767D\u8272\u8F68\u9053\u538B\u5728\u6697\u753B\u5E03\u4E0A\u5C24\u5176\u624E\u773C\u3002\u53EA\u9690 html/body \u8FD9\u4E00\u5C42,\u7EC4\u4EF6\u5185\u90E8\u7684\u6EDA\u52A8\u533A\u662F\u5B83\u81EA\u5DF1\u7684\u771F\u5B9E\u6837\u5B50,\u4E0D\u52A8\u3002\n const noScrollbar =\n \"html{scrollbar-width:none}html::-webkit-scrollbar,body::-webkit-scrollbar{display:none}\"\n st.textContent =\n (mode === \"blend\"\n ? `html,body{background:${canvasBg()} !important}`\n : \"html,body{background:var(--background,#fff) !important}\") + noScrollbar\n}\n\n/** \u6BCF\u5757\u753B\u677F\u7684\u5E95\u8272\u6309\u94AE\u8981\u8DDF\u7740\u5168\u5C40\u6863\u4F4D\u6539\u5B57\u5F62,\u5B58\u4E0B\u5404\u81EA\u7684\u540C\u6B65\u51FD\u6570 */\nconst bgSyncs = new Map<string, () => void>()\n\n/**\n * \u6807\u9898\u6761\u4E0A\u7684\u5E95\u8272\u5F00\u5173(\u7EC4\u4EF6\u753B\u677F\u4E13\u7528)\u3002\u4E09\u6001,\u4F46\u987A\u5E8F\u4FDD\u8BC1\"\u6BCF\u6B21\u70B9\u51FB\u90FD\u770B\u5F97\u89C1\u53D8\u5316\":\n * \u8DDF\u968F\u5168\u5C40 \u2192 \u4E0E\u5168\u5C40\u76F8\u53CD(\u672C\u677F\u8986\u76D6) \u2192 \u4E0E\u5168\u5C40\u76F8\u540C(\u672C\u677F\u8986\u76D6) \u2192 \u56DE\u5230\u8DDF\u968F\u5168\u5C40\u3002\n */\nfunction bgToggle(board: Board): HTMLButtonElement {\n const id = board.entry.id\n const btn = document.createElement(\"button\")\n btn.className = \"cs-bgbtn\"\n const sync = (): void => {\n const ov = bgOverride(id)\n const eff = ov ?? globalBg()\n btn.textContent = eff === \"blend\" ? \"\u25FB\" : \"\u25A3\"\n btn.classList.toggle(\"is-on\", eff === \"real\")\n btn.classList.toggle(\"is-auto\", ov === null)\n btn.title = `\u5E95\u8272:${BG_LABEL[eff]}(${ov ? \"\u672C\u677F\u8986\u76D6\" : \"\u8DDF\u968F\u5168\u5C40\"}) \u00B7 \u70B9\u51FB\u5207\u6362`\n btn.setAttribute(\"aria-label\", btn.title)\n }\n sync()\n bgSyncs.set(id, sync)\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n const ov = bgOverride(id)\n const g = globalBg()\n setBgOverride(id, ov === null ? (g === \"blend\" ? \"real\" : \"blend\") : ov === g ? null : g)\n sync()\n applyBgPref(board)\n })\n return btn\n}\n\n// ---------- \u5899\u5C42\u9762\u7684\u5DE5\u5177\u6761(JS \u5EFA\u5143\u7D20,\u4E0D\u52A8 index.html) ----------\n\nconst segBtns: Array<{ el: HTMLButtonElement; mode: BgMode }> = []\n\n/** \u53F3\u4E0A\u89D2\u5C0F\u6761:\u5168\u5C40\u5E95\u8272\u9ED8\u8BA4\u6863 + \u81EA\u52A8\u6392\u5217\u3002\u8FD9\u4E24\u4EF6\u4E8B\u90FD\u662F\u6574\u9762\u5899\u7684,\u585E\u4E0D\u8FDB\u5355\u5757\u753B\u677F\u7684\u6807\u9898\u6761 */\nfunction initWallTools(): void {\n const bar = h(\"div\", \"cs-wall-tools\")\n bar.id = \"cs-wall-tools\"\n\n const label = h(\"span\", \"cs-wt-label\", \"\u7EC4\u4EF6\u5E95\u8272\")\n label.title = \"\u7EC4\u4EF6\u753B\u677F\u7684\u9ED8\u8BA4\u5E95\u8272(\u6309\u9879\u76EE\u8BB0\u5728\u672C\u673A)\u3002\u5355\u5757\u753B\u677F\u53EF\u4EE5\u7528\u6807\u9898\u6761\u4E0A\u7684 \u25FB/\u25A3 \u5355\u72EC\u8986\u76D6\"\n const seg = h(\"div\", \"cs-seg\")\n for (const mode of [\"blend\", \"real\"] as const) {\n const b = h(\"button\", \"cs-seg-btn\", mode === \"blend\" ? \"\u878D\u5165\u753B\u5E03\" : \"\u9879\u76EE\u5E95\u8272\")\n b.title =\n mode === \"blend\"\n ? \"\u6240\u6709\u7EC4\u4EF6\u753B\u677F\u9ED8\u8BA4\u628A\u5E95\u8272\u5237\u6210\u753B\u5E03\u540C\u8272 \u2014\u2014 \u767D\u5E95\u4E0D\u518D\u62A2\u955C\"\n : \"\u6240\u6709\u7EC4\u4EF6\u753B\u677F\u9ED8\u8BA4\u663E\u793A\u9879\u76EE\u81EA\u5DF1\u7684 --background\"\n b.addEventListener(\"click\", () => {\n setGlobalBg(mode)\n syncWallTools()\n for (const board of state.boards.values()) {\n applyBgPref(board) // \u6709\u672C\u677F\u8986\u76D6\u7684\u81EA\u5DF1\u8BF4\u4E86\u7B97,\u4E0D\u53D7\u5F71\u54CD\n bgSyncs.get(board.entry.id)?.()\n }\n })\n seg.appendChild(b)\n segBtns.push({ el: b, mode })\n }\n\n const arrange = h(\"button\", \"cs-wt-btn\", \"\u81EA\u52A8\u6392\u5217\")\n arrange.title = \"\u628A\u6240\u6709\u753B\u677F\u91CD\u65B0\u94FA\u5F00(\u9875\u9762 4/\u884C\u3001\u7EC4\u4EF6 15/\u884C)\u3002\u5E73\u65F6\u4E0D\u4F1A\u81EA\u52A8\u91CD\u6392 \u2014\u2014 \u4F60\u6446\u597D\u7684\u4F4D\u7F6E\u4E00\u76F4\u7559\u7740\"\n arrange.addEventListener(\"click\", () => {\n cancelSettleArrange()\n toast(`\u5DF2\u91CD\u65B0\u6392\u5217 ${autoArrange()} \u5757\u753B\u677F`, \"ok\")\n })\n\n bar.append(label, seg, arrange)\n document.body.appendChild(bar)\n syncWallTools()\n}\n\nfunction syncWallTools(): void {\n const g = globalBg()\n for (const s of segBtns) {\n s.el.classList.toggle(\"is-on\", s.mode === g)\n s.el.setAttribute(\"aria-pressed\", String(s.mode === g))\n }\n}\n\n/** \u5185\u5BB9\u81EA\u5DF1\u53D8\u9AD8\u53D8\u77EE(HMR\u3001\u5F02\u6B65\u6E32\u67D3)\u65F6\u8DDF\u7740\u6D4B\u4E00\u6B21 */\nfunction watchContentHeight(board: Board): void {\n heightWatchers.get(board.entry.id)?.disconnect()\n const doc = frameDoc(board.iframe)\n const body = doc?.body\n if (!body || typeof ResizeObserver === \"undefined\") return\n const ro = new ResizeObserver(() => {\n const cur = body.getBoundingClientRect().height\n const prev = lastBodyH.get(board.entry.id) ?? -1\n // \u5185\u5BB9\u91CD\u6392\u4F46\u603B\u9AD8\u6CA1\u53D8(\u6A2A\u5411\u91CD\u6392\u3001\u5C55\u5F00\u540C\u9AD8\u7684\u83DC\u5355)\u4E5F\u8981\u8BA9 pin \u8DDF\u4E0A\n schedulePinSync(board)\n if (Math.abs(cur - prev) < 2) return\n lastBodyH.set(board.entry.id, cur)\n const times = (measureCount.get(board.entry.id) ?? 0) + 1\n measureCount.set(board.entry.id, times)\n if (times > 30) {\n ro.disconnect() // \u515C\u5E95:\u522B\u8BA9\u5185\u5BB9\u548C\u5BB9\u5668\u4E92\u76F8\u8FFD\u9AD8\n return\n }\n measureBoard(board)\n applyPositions() // \u5185\u5BB9\u957F\u9AD8\u53EA\u5F71\u54CD\u5B83\u81EA\u5DF1,\u4E0D\u63A8\u5F00\u90BB\u5C45(\u8981\u91CD\u94FA\u8BF7\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D)\n scheduleSettleArrange()\n })\n ro.observe(body)\n heightWatchers.set(board.entry.id, ro)\n}\n\n/**\n * \u6D4B\u5185\u5BB9\u9AD8:env.height \u4F18\u5148;\u5426\u5219\u5148\u628A iframe \u538B\u5230\u6700\u5C0F\u518D\u8BFB scrollHeight\n * (\u4E0D\u538B\u7684\u8BDD scrollHeight \u4F1A\u88AB iframe \u81EA\u8EAB\u9AD8\u5EA6\u6491\u4F4F,\u53EA\u6DA8\u4E0D\u843D)\n */\nexport function measureBoard(board: Board): void {\n if (resizing === board.entry.id) return // \u62D6\u62FD\u4E2D,\u522B\u8DDF\u624B\u8F83\u52B2\n // \u624B\u52A8\u62D6\u8FC7\u7684\u5C3A\u5BF8\u4F18\u5148\u4E8E\u4E00\u5207\u81EA\u52A8\u6D4B\u91CF\n const manual = getSize(board.entry.id)\n if (manual.h) {\n board.height = clamp(manual.h, MIN_SIZE, MAX_DRAG_H)\n applySize(board)\n return\n }\n const fixed = board.entry.env?.height\n if (fixed) {\n board.height = clamp(fixed, MIN_H, MAX_H)\n applySize(board)\n return\n }\n const iframe = board.iframe\n const doc = frameDoc(iframe)\n if (!iframe || !doc?.documentElement) return\n const prev = iframe.style.height\n iframe.style.height = `${MIN_H}px`\n const raw = Math.max(doc.documentElement.scrollHeight, doc.body?.scrollHeight ?? 0)\n iframe.style.height = prev\n board.height = clamp(raw, MIN_H, MAX_H)\n lastBodyH.set(board.entry.id, doc.body?.getBoundingClientRect().height ?? -1)\n setFit(board.entry.id, { h: Math.round(board.height) }) // \u7F13\u5B58\u7ED9\u4E0B\u6B21\u5F00\u5C40\u7528\n // \u6CA1\u58F0\u660E env.width \u4E14\u6CA1\u624B\u52A8\u62D6\u8FC7\u7684\u7EC4\u4EF6\u753B\u677F:iframe \u5BBD\u6536\u7F29\u5230\u5185\u5BB9\u5B9E\u9645\u5BBD(\u6A21\u677F\u5DF2\u7ED9 wrapper fit-content)\n if (board.entry.kind === \"component\" && !board.entry.env?.width && !manual.w) {\n const ab = doc.querySelector(\"[data-cs-artboard]\")\n if (ab) {\n const w = Math.ceil(ab.getBoundingClientRect().width)\n if (w > 0) {\n board.width = clamp(w, 120, DEFAULT_W)\n setFit(board.entry.id, { w: board.width })\n }\n }\n }\n applySize(board)\n}\n\n/** SSE registry \u4E8B\u4EF6\u4E4B\u540E\u91CD\u6D4B\u6240\u6709\u5DF2\u6302\u8F7D\u753B\u677F(\u53EA\u66F4\u65B0\u5C3A\u5BF8,\u4F4D\u7F6E\u4E0D\u52A8) */\nexport function remeasureAll(): void {\n for (const board of state.boards.values()) {\n measureCount.set(board.entry.id, 0)\n if (board.iframe) measureBoard(board)\n }\n applyPositions()\n}\n\n// ---------- \u5E03\u5C40 ----------\n//\n// \u6BCF\u5757\u753B\u677F\u7684\u4F4D\u7F6E\u90FD\u662F\"\u56FA\u5316\"\u7684(\u5B58\u672C\u673A),\u5899\u5E73\u65F6\u53EA\u662F\u628A\u5B83\u4EEC\u7167\u7740\u5750\u6807\u6446\u597D\u3002\n// \u81EA\u52A8\u6392\u5217(\u5168\u91CF\u91CD\u7B97 + \u8986\u5199\u5750\u6807)\u53EA\u5728\u4E09\u79CD\u65F6\u673A\u53D1\u751F:\n// \u2460 \u8FD9\u4E2A\u9879\u76EE\u7B2C\u4E00\u6B21\u6253\u5F00(\u672C\u673A\u4E00\u4E2A\u5750\u6807\u90FD\u6CA1\u6709);\n// \u2461 \u51FA\u73B0\u4E86\u8FD8\u6CA1\u6709\u5750\u6807\u7684\u65B0\u753B\u677F \u2014\u2014 \u53EA\u7ED9\u65B0\u7684\u627E\u7A7A\u4F4D,\u5DF2\u6709\u7684\u4E00\u5757\u90FD\u4E0D\u52A8;\n// \u2462 \u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u3002\n// \u62D6\u52A8\u7ED3\u675F\u3001\u6539\u5C3A\u5BF8\u3001\u5185\u5BB9\u6D4B\u9AD8\u3001HMR\u3001\u5220\u753B\u677F\u90FD\u4E0D\u91CD\u6392\u3002\n\n/** \u6BCF\u884C\u6700\u591A\u51E0\u5757:\u9875\u9762\u5F88\u5BBD\u6240\u4EE5\u4E00\u884C 4 \u5757,\u7EC4\u4EF6\u5F88\u5C0F\u6240\u4EE5\u4E00\u884C 15 \u5757 */\nconst PER_ROW = { screen: 4, component: 15 }\n\n/** \u53C2\u4E0E\u6392\u5217\u7684\u753B\u677F:\u6309\u6587\u4EF6\u540D\u5B57\u5178\u5E8F + \u6587\u4EF6\u5185 export \u987A\u5E8F,\u9690\u85CF\u7684\u4E0D\u5360\u683C\u5B50 */\nfunction arrangeable(): Board[] {\n const out: Board[] = []\n for (const file of [...state.order.keys()].sort()) {\n for (const id of state.order.get(file) ?? []) {\n const b = state.boards.get(id)\n if (b && !isHidden(id)) out.push(b)\n }\n }\n return out\n}\n\n/** \u9010\u884C\u94FA:\u6512\u591F PER_ROW \u6216\u5BBD\u5EA6\u8D85\u8FC7\u8F6F\u4E0A\u9650\u5C31\u6362\u884C,\u884C\u9AD8\u53D6\u8BE5\u884C\u6700\u9AD8\u7684\u3002\u8FD4\u56DE\u4E0B\u4E00\u884C\u7684 y */\nfunction flowRows(list: Board[], kind: \"screen\" | \"component\", startY: number, out: Map<string, Pos>): number {\n let y = startY\n let row: Board[] = []\n let rowW = 0\n const flush = (): void => {\n if (!row.length) return\n let x = PAD\n const rowH = Math.max(...row.map((b) => TITLE_H + b.height))\n for (const b of row) {\n out.set(b.entry.id, { x, y })\n x += b.width + BOARD_GAP\n }\n y += rowH + BOARD_GAP\n row = []\n rowW = 0\n }\n for (const b of list) {\n if (row.length >= PER_ROW[kind] || (row.length && rowW + b.width > ROW_MAX_W)) flush()\n row.push(b)\n rowW += b.width + BOARD_GAP\n }\n flush()\n return y\n}\n\n/** \u7B97\u4E00\u904D\"\u81EA\u52A8\u6392\u5217\u4F1A\u628A\u6BCF\u5757\u653E\u5728\u54EA\"(\u7EAF\u8BA1\u7B97,\u4E0D\u78B0 DOM):\u6309 kind \u5206\u533A\u3001\u9875\u9762\u5728\u4E0A\u7EC4\u4EF6\u5728\u4E0B */\nfunction computeAutoPositions(): Map<string, Pos> {\n const out = new Map<string, Pos>()\n const ordered = arrangeable()\n let y = PAD\n for (const kind of [\"screen\", \"component\"] as const) {\n const list = ordered.filter((b) => b.entry.kind === kind)\n if (!list.length) continue\n y += SECTION_HEAD_H // \u7ED9\u5206\u533A\u6807\u9898\u7559\u4E00\u884C(\u6807\u9898\u5750\u6807\u7531 layoutSections \u4ECE\u753B\u677F\u53CD\u63A8)\n y = flowRows(list, kind, y, out)\n y += SECTION_GAP\n }\n return out\n}\n\n/** \u5168\u91CF\u91CD\u7B97\u5E76\u56FA\u5316\u5750\u6807 \u2014\u2014 \u53EA\u6709\u9996\u6B21\u52A0\u8F7D\u4E0E\u7528\u6237\u70B9\u300C\u81EA\u52A8\u6392\u5217\u300D\u4F1A\u8D70\u5230\u8FD9\u3002\u8FD4\u56DE\u6392\u4E86\u51E0\u5757 */\nexport function autoArrange(): number {\n const pos = computeAutoPositions()\n for (const [id, p] of pos) setPos(id, p)\n applyPositions()\n return pos.size\n}\n\n/**\n * \u53EA\u7ED9\"\u8FD8\u6CA1\u6709\u5750\u6807\"\u7684\u753B\u677F\u627E\u5730\u65B9:\u94FA\u5728\u73B0\u6709\u5185\u5BB9\u7684\u4E0B\u6CBF\u4E4B\u5916,\u5DF2\u6709\u753B\u677F\u4E00\u5757\u90FD\u4E0D\u52A8\u3002\n * \u8FD4\u56DE\u65B0\u653E\u7F6E\u7684\u5757\u6570\u3002\n */\nfunction placeNewBoards(): number {\n const ordered = arrangeable()\n const fresh = ordered.filter((b) => !getPos(b.entry.id))\n if (!fresh.length) return 0\n let bottom = -Infinity\n for (const b of ordered) {\n const p = getPos(b.entry.id)\n if (p) bottom = Math.max(bottom, p.y + TITLE_H + b.height)\n }\n let y = Number.isFinite(bottom) ? bottom + SECTION_GAP : PAD\n const out = new Map<string, Pos>()\n for (const kind of [\"screen\", \"component\"] as const) {\n const list = fresh.filter((b) => b.entry.kind === kind)\n if (!list.length) continue\n y = flowRows(list, kind, y, out) + SECTION_GAP\n }\n for (const [id, p] of out) setPos(id, p)\n return out.size\n}\n\n/**\n * \u8F7B\u91CF:\u628A\u56FA\u5316\u7684\u5750\u6807\u5199\u56DE DOM\u3002\u4E0D\u6539\u4EFB\u4F55\u753B\u677F\u7684\u4F4D\u7F6E \u2014\u2014 \u62D6\u52A8\u7ED3\u675F\u3001\u6539\u5C3A\u5BF8\u3001\u5185\u5BB9\u6D4B\u9AD8\u3001\n * SSE \u5237\u65B0\u8D70\u7684\u90FD\u662F\u5B83,\u6240\u4EE5\u7528\u6237\u6446\u597D\u7684\u5899\u4E0D\u4F1A\u88AB\u51B2\u6389\u3002\n */\nexport function applyPositions(): void {\n for (const b of state.boards.values()) {\n const p = getPos(b.entry.id)\n if (p) {\n b.el.style.left = `${p.x}px`\n b.el.style.top = `${p.y}px`\n }\n // \u9690\u85CF\u7684\u753B\u677F\u4ECE\u5899\u4E0A\u64A4\u4E0B(\u4F46\u4ECD\u5728 state \u91CC,\u4FA7\u680F\u80FD\u52FE\u56DE\u6765)\n b.el.hidden = isHidden(b.entry.id)\n }\n layoutSections()\n // \u5FC5\u987B\u4FDD\u7559:select.ts \u7684\u9AD8\u4EAE\u6846/\u6807\u7B7E\u53EA\u5728 applyView \u7684\u76D1\u542C\u91CC\u91CD\u7B97,\u6458\u6389\u8FD9\u884C\u6846\u5C31\u4F1A\u843D\u540E\u4E00\u5E27\u5230\u505C\n applyView()\n}\n\n/** \u5206\u533A\u6807\u9898\u8D34\u5728\u672C\u533A\u753B\u677F\u5305\u56F4\u76D2\u7684\u5DE6\u4E0A\u89D2:\u5B83\u8DDF\u7740\u753B\u677F\u8D70,\u81EA\u5DF1\u4E0D\u5360\u5E03\u5C40 */\nfunction layoutSections(): void {\n for (const kind of [\"screen\", \"component\"] as const) {\n const titleEl = ensureSection(kind)\n let minX = Infinity\n let minY = Infinity\n let n = 0\n for (const b of state.boards.values()) {\n if (b.entry.kind !== kind || isHidden(b.entry.id)) continue\n n++\n const p = getPos(b.entry.id)\n if (!p) continue\n minX = Math.min(minX, p.x)\n minY = Math.min(minY, p.y)\n }\n if (!n || !Number.isFinite(minX)) {\n titleEl.hidden = true\n continue\n }\n titleEl.hidden = false\n titleEl.textContent = \"\"\n titleEl.append(\n h(\"span\", undefined, kind === \"screen\" ? \"\u9875\u9762\" : \"\u7EC4\u4EF6\"),\n h(\"span\", \"cs-section-count\", String(n))\n )\n titleEl.style.left = `${minX}px`\n titleEl.style.top = `${minY - SECTION_HEAD_H}px`\n }\n}\n\n// ---------- \u9996\u5C4F\u6536\u5C3E\u91CD\u6392 ----------\n//\n// \u753B\u677F\u521A\u5EFA\u597D\u65F6\u9AD8\u5EA6\u662F\u731C\u7684(iframe \u8FD8\u6CA1\u6302),\u9996\u6B21\u52A0\u8F7D\u90A3\u4E00\u94FA\u5FC5\u7136\u4E0D\u51C6\u3002\n// \u6240\u4EE5\u53EA\u5728\u5F00\u5C40\u7684\u51E0\u79D2\u91CC,\u7B49\u6D4B\u9AD8\u843D\u5B9A\u540E\u518D\u94FA\u4E00\u6B21;\u7528\u6237\u4E00\u52A8\u624B(\u62D6/\u6539\u5C3A\u5BF8/\u663E\u9690)\u7ACB\u523B\u4F5C\u5E9F,\n// \u4E4B\u540E\u5899\u5C31\u5F7B\u5E95\u4E0D\u518D\u81EA\u52A8\u91CD\u6392\u4E86\u3002\n\nconst SETTLE_WINDOW = 8000\nlet firstSync = true\nlet settleDeadline = 0\nlet settleTimer: ReturnType<typeof setTimeout> | null = null\n\nfunction scheduleSettleArrange(): void {\n if (!settleDeadline || Date.now() > settleDeadline) return\n if (settleTimer !== null) clearTimeout(settleTimer)\n settleTimer = setTimeout(() => {\n settleTimer = null\n if (!settleDeadline) return\n autoArrange()\n }, 350)\n}\n\nfunction cancelSettleArrange(): void {\n settleDeadline = 0\n if (settleTimer !== null) clearTimeout(settleTimer)\n settleTimer = null\n}\n", "// \u5DE6\u4FA7\u56FE\u5C42\u5217\u8868:\u4E0A=\u9875\u9762(\u5E26\u8DEF\u7531,\u70B9\u51FB\u805A\u7126),\u4E0B=\u7EC4\u4EF6(\u6309\u6587\u4EF6\u5206\u7EC4)\u3002\n// \u641C\u7D22\u8FC7\u6EE4\u3001\u5355\u6761\u663E\u9690;\u5206\u533A/\u6587\u4EF6\u5206\u7EC4\u53EF\u6298\u53E0(\u6298\u53E0\u6001\u6309\u9879\u76EE\u5B58\u672C\u673A),\u6807\u9898\u884C\u5E26\u6279\u91CF\u663E\u9690\u3002\n// \u5B83\u66FF\u4EE3\u4E86\u5C0F\u5730\u56FE \u2014\u2014 \u7F29\u7565\u56FE\u53EA\u80FD\u56DE\u7B54\"\u6211\u5728\u54EA\",\u5217\u8868\u8FD8\u80FD\u56DE\u7B54\"\u6709\u4EC0\u4E48\u3001\u53EB\u4EC0\u4E48\u3001\u53BB\u54EA\"\u3002\nimport { h, qs } from \"./dom.js\"\nimport { state } from \"./state.js\"\nimport { fitBoard } from \"./view.js\"\nimport { groupLabel, isHidden, setHidden, toggleHidden } from \"./wall.js\"\n\nlet root: HTMLElement\nlet listEl: HTMLElement\nlet filter = \"\"\n/**\n * \u641C\u7D22\u671F\u95F4\u7684\u4E34\u65F6\u6298\u53E0\u6001(\u9ED8\u8BA4\u5168\u5C55\u5F00)\u3002\u641C\u51FA\u6765\u7684\u4E1C\u897F\u4E0D\u8BE5\u85CF\u5728\u6298\u53E0\u91CC,\n * \u4F46\u6B64\u523B\u7684\u6298\u53E0\u52A8\u4F5C\u4E5F\u5F97\u5F53\u573A\u751F\u6548 \u2014\u2014 \u6240\u4EE5\u53E6\u5B58\u4E00\u4EFD,\u4E0D\u6C61\u67D3\u6301\u4E45\u5316\u7684\u90A3\u4EFD\u3002\n */\nlet searchCollapsed: Set<string> | null = null\n/** aria-controls \u8981\u5408\u6CD5 id,\u800C\u5206\u7EC4 key \u91CC\u6709 / \u548C . \u2014\u2014 \u6309\u6E32\u67D3\u5E8F\u53F7\u53D1\u53F7 */\nlet uid = 0\n\nexport function initSidebar(): void {\n root = qs(\"#cs-sidebar\")\n root.textContent = \"\"\n\n const head = h(\"div\", \"cs-sb-head\")\n const search = document.createElement(\"input\")\n search.className = \"cs-sb-search\"\n search.type = \"search\"\n search.placeholder = \"\u641C\u7D22\u753B\u677F\u2026\"\n search.addEventListener(\"input\", () => {\n filter = search.value.trim().toLowerCase()\n // \u8FDB\u5165/\u9000\u51FA\u641C\u7D22\u90FD\u91CD\u7F6E\u4E34\u65F6\u6298\u53E0\u6001:\u641C\u7D22\u7ED3\u679C\u4E00\u5F8B\u5148\u644A\u5F00\u7ED9\u4EBA\u770B\n searchCollapsed = filter ? new Set() : null\n renderSidebar()\n })\n // \u8F93\u5165\u6846\u91CC\u7684\u6309\u952E\u4E0D\u8BE5\u89E6\u53D1\u753B\u5E03\u5FEB\u6377\u952E(1/2/c/p \u90FD\u662F\u5355\u952E)\n search.addEventListener(\"keydown\", (e) => {\n e.stopPropagation()\n if (e.key === \"Escape\") {\n search.value = \"\"\n filter = \"\"\n searchCollapsed = null\n renderSidebar()\n search.blur()\n }\n })\n head.append(h(\"span\", \"cs-sb-title\", \"\u753B\u677F\"), search)\n\n listEl = h(\"div\", \"cs-sb-list\")\n // \u7126\u70B9\u5728\u5217\u8868\u91CC\u65F6,Enter/\u7A7A\u683C\u7684\u542B\u4E49\u662F\"\u6309\u4E0B\u8FD9\u4E2A\u6309\u94AE\",\u4E0D\u662F\u753B\u5E03\u7684 Enter=\u8D70\u67E5\u3002\n // modes.ts \u5728 document \u4E0A\u6536 Enter \u5E76 preventDefault,\u4E0D\u62E6\u4F4F\u7684\u8BDD\u6309\u94AE\u6839\u672C\u6309\u4E0D\u4E0B\u53BB\u3002\n listEl.addEventListener(\"keydown\", (e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && (e.target as HTMLElement).closest(\"button\")) {\n e.stopPropagation()\n }\n })\n root.append(head, listEl)\n\n const toggle = qs(\"#cs-sb-toggle\")\n toggle.addEventListener(\"click\", () => {\n const closed = document.body.dataset.sidebar === \"off\"\n document.body.dataset.sidebar = closed ? \"on\" : \"off\"\n toggle.title = closed ? \"\u6536\u8D77\u5217\u8868\" : \"\u5C55\u5F00\u5217\u8868\"\n })\n renderSidebar()\n}\n\nfunction match(text: string): boolean {\n return !filter || text.toLowerCase().includes(filter)\n}\n\n// ---------- \u6298\u53E0\u6001:\u6309\u9879\u76EE\u5B58\u672C\u673A(\u952E\u4E0E wall.ts \u7684\u663E\u9690\u8868\u540C\u6784) ----------\n\nfunction collapseKey(): string {\n return `cs-collapsed:${state.info?.projectRoot ?? \"unknown\"}`\n}\n\nfunction collapsedSet(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(collapseKey()) ?? \"[]\") as string[])\n } catch {\n return new Set()\n }\n}\n\nfunction isCollapsed(key: string): boolean {\n return searchCollapsed ? searchCollapsed.has(key) : collapsedSet().has(key)\n}\n\nfunction toggleCollapsed(key: string): void {\n if (searchCollapsed) {\n if (!searchCollapsed.delete(key)) searchCollapsed.add(key)\n return\n }\n const s = collapsedSet()\n if (s.has(key)) s.delete(key)\n else s.add(key)\n try {\n localStorage.setItem(collapseKey(), JSON.stringify([...s]))\n } catch {\n /* \u5B58\u4E0D\u4E86\u5C31\u53EA\u5F71\u54CD\u672C\u6B21 */\n }\n}\n\n// ---------- \u6279\u91CF\u663E\u9690 ----------\n\n/** \u4E00\u7EC4\u753B\u677F\u7684\u663E\u9690\u4E09\u6001:all=\u5168\u663E\u793A / some=\u90E8\u5206\u9690\u85CF / none=\u5168\u9690\u85CF */\ntype BulkMode = \"all\" | \"some\" | \"none\"\n\nfunction bulkMode(ids: string[]): { mode: BulkMode; shown: number } {\n const shown = ids.filter((id) => !isHidden(id)).length\n return { mode: shown === ids.length ? \"all\" : shown === 0 ? \"none\" : \"some\", shown }\n}\n\n/** \u628A\u4E00\u7EC4\u753B\u677F\u5BF9\u9F50\u5230\u540C\u4E00\u663E\u9690\u72B6\u6001:\u843D\u76D8\u548C\u91CD\u6392\u5404\u53EA\u505A\u4E00\u6B21 */\nfunction setGroupHidden(ids: string[], hide: boolean): void {\n setHidden(ids, hide)\n}\n\n/**\n * \u6BCF\u6B21\u64CD\u4F5C\u90FD\u6574\u8868\u91CD\u753B,\u7126\u70B9\u6240\u5728\u7684\u90A3\u4E2A\u6309\u94AE\u4F1A\u88AB\u6362\u6389 \u2014\u2014 \u952E\u76D8\u7528\u6237\u6309\u4E00\u6B21\u6298\u53E0\u5C31\u88AB\u5F39\u56DE\u9875\u9996,\n * \u8FDE\u6309\u4E24\u4E0B\u90FD\u505A\u4E0D\u5230\u3002\u6240\u4EE5\u7ED9\u6BCF\u4E2A\u6309\u94AE\u4E00\u4E2A\u7A33\u5B9A key,\u91CD\u753B\u540E\u628A\u7126\u70B9\u8FD8\u56DE\u539F\u4F4D\u3002\n */\nfunction focusedKey(): string | null {\n const el = document.activeElement as HTMLElement | null\n return el && listEl.contains(el) ? (el.dataset.fk ?? null) : null\n}\n\nfunction restoreFocus(key: string | null): void {\n if (!key) return\n const el = listEl.querySelector<HTMLElement>(`[data-fk=\"${CSS.escape(key)}\"]`)\n el?.focus({ preventScroll: true }) // \u522B\u987A\u624B\u628A\u5217\u8868\u6EDA\u8DD1\n}\n\n/** \u91CD\u753B\u5217\u8868\u3002\u6570\u636E\u6E90\u5C31\u662F state.entries,\u4E0D\u53E6\u5B58\u4E00\u4EFD,\u907F\u514D\u4E24\u5904\u72B6\u6001\u6F02\u79FB */\nexport function renderSidebar(): void {\n if (!listEl) return\n const keepFocus = focusedKey()\n listEl.textContent = \"\"\n uid = 0\n\n const screens = state.entries.filter((e) => e.kind === \"screen\")\n const comps = state.entries.filter((e) => e.kind !== \"screen\")\n\n // ---- \u9875\u9762:\u5E73\u94FA,\u526F\u6807\u9898\u662F\u771F\u5B9E\u8DEF\u7531 ----\n const visScreens = screens.filter((e) => match(e.exportName) || match(e.url ?? \"\"))\n if (visScreens.length) {\n const g = group(\"sec:screen\", \"\u9875\u9762\", visScreens.map((e) => e.id), \"cs-sb-section\")\n for (const e of visScreens) g.body.appendChild(row(e.id, e.exportName, e.url ?? \"\", \"screen\"))\n listEl.appendChild(g.el)\n }\n\n // ---- \u7EC4\u4EF6:\u6309\u6587\u4EF6\u5206\u7EC4,\u6BCF\u4E2A\u6587\u4EF6\u81EA\u5DF1\u4E5F\u80FD\u6298\u53E0 ----\n const byFile = new Map<string, typeof comps>()\n for (const e of comps) {\n if (!(match(e.exportName) || match(groupLabel(e.file)))) continue\n const l = byFile.get(e.file)\n if (l) l.push(e)\n else byFile.set(e.file, [e])\n }\n if (byFile.size) {\n const files = [...byFile.keys()].sort()\n const allIds = files.flatMap((f) => (byFile.get(f) ?? []).map((e) => e.id))\n const g = group(\"sec:component\", \"\u7EC4\u4EF6\", allIds, \"cs-sb-section\")\n for (const file of files) {\n const list = byFile.get(file) ?? []\n const fg = group(`file:${file}`, groupLabel(file), list.map((e) => e.id), \"cs-sb-file\")\n for (const e of list) fg.body.appendChild(row(e.id, e.exportName, \"\", \"component\"))\n g.body.appendChild(fg.el)\n }\n listEl.appendChild(g.el)\n }\n\n if (!listEl.childElementCount) {\n listEl.appendChild(h(\"div\", \"cs-sb-empty\", filter ? \"\u6CA1\u6709\u5339\u914D\u7684\u753B\u677F\" : \"\u8FD8\u6CA1\u6709\u753B\u677F\"))\n }\n syncActive()\n restoreFocus(keepFocus)\n}\n\n/**\n * \u4E00\u4E2A\u53EF\u6298\u53E0\u5206\u7EC4:\u6807\u9898\u884C(\u6298\u53E0\u6309\u94AE + \u6279\u91CF\u663E\u9690\u6309\u94AE)+ \u5185\u5BB9\u5BB9\u5668\u3002\n * \u4E24\u4E2A\u6309\u94AE\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684\u70B9\u51FB\u76EE\u6807,\u8C01\u4E5F\u4E0D\u5403\u8C01\u7684\u4E8B\u4EF6 \u2014\u2014 \u6298\u53E0\u4E0D\u8BE5\u987A\u624B\u628A\u4E00\u7EC4\u753B\u677F\u85CF\u6389\u3002\n */\nfunction group(\n key: string,\n label: string,\n ids: string[],\n headCls: string\n): { el: HTMLElement; body: HTMLElement } {\n const el = h(\"div\", \"cs-sb-group\")\n if (headCls === \"cs-sb-file\") el.classList.add(\"is-file\")\n const headEl = h(\"div\", headCls)\n const body = h(\"div\", \"cs-sb-items\")\n body.id = `cs-sb-g${++uid}`\n const collapsed = isCollapsed(key)\n body.hidden = collapsed // \u6298\u53E0\u7684\u5185\u5BB9\u8FDE Tab \u90FD\u5230\u4E0D\u4E86,\u4E0D\u7559\u5E7D\u7075\u7126\u70B9\n\n const { mode, shown } = bulkMode(ids)\n\n const caret = h(\"button\", \"cs-sb-caret\")\n caret.type = \"button\"\n caret.dataset.fk = `caret:${key}`\n caret.setAttribute(\"aria-expanded\", String(!collapsed))\n caret.setAttribute(\"aria-controls\", body.id)\n caret.title = collapsed ? `\u5C55\u5F00\u300C${label}\u300D` : `\u6298\u53E0\u300C${label}\u300D`\n const arrow = h(\"span\", \"cs-sb-arrow\", \"\u25B8\")\n arrow.setAttribute(\"aria-hidden\", \"true\") // \u7EAF\u88C5\u9970,\u53EF\u8BBF\u95EE\u540D\u7531\u4E0B\u9762\u7684\u6587\u5B57\u7ED9\n // \u8BA1\u6570\u540C\u65F6\u662F\u4E09\u6001\u7684\u7B2C\u4E8C\u5904\u7EBF\u7D22:\u5168\u663E\u793A\u53EA\u62A5\u603B\u6570,\u6709\u9690\u85CF\u5C31\u62A5\"\u663E\u793A\u4E2D/\u603B\u6570\"\n const count = h(\"span\", \"cs-sb-count\", mode === \"all\" ? String(ids.length) : `${shown}/${ids.length}`)\n caret.append(arrow, h(\"span\", \"cs-sb-label\", label), count)\n caret.addEventListener(\"click\", () => {\n toggleCollapsed(key)\n renderSidebar()\n })\n\n const bulk = h(\"button\", \"cs-sb-bulk\", mode === \"all\" ? \"\u25CF\" : mode === \"none\" ? \"\u25CC\" : \"\u25D0\")\n bulk.type = \"button\"\n bulk.dataset.fk = `bulk:${key}`\n bulk.dataset.state = mode\n // \u4E09\u6001\u76F4\u63A5\u6620\u5C04\u5230 aria-pressed \u7684\u4E09\u503C,\u8BFB\u5C4F\u80FD\u542C\u51FA\"\u90E8\u5206\"\n bulk.setAttribute(\"aria-pressed\", mode === \"all\" ? \"true\" : mode === \"none\" ? \"false\" : \"mixed\")\n const act = mode === \"all\" ? `\u9690\u85CF\u300C${label}\u300D\u4E0B\u5168\u90E8 ${ids.length} \u5757\u753B\u677F` : `\u663E\u793A\u300C${label}\u300D\u4E0B\u5168\u90E8 ${ids.length} \u5757\u753B\u677F`\n bulk.setAttribute(\"aria-label\", act)\n bulk.title = mode === \"some\" ? `${act}(\u5F53\u524D ${shown}/${ids.length} \u663E\u793A\u4E2D)` : act\n bulk.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n setGroupHidden(ids, mode === \"all\") // \u5168\u663E \u2192 \u5168\u9690;\u90E8\u5206/\u5168\u9690 \u2192 \u5168\u663E(\u5148\u628A\u4EBA\u635E\u56DE\u5168\u89C1)\n renderSidebar()\n })\n\n headEl.append(caret, bulk)\n el.append(headEl, body)\n return { el, body }\n}\n\nfunction row(id: string, name: string, sub: string, kind: string): HTMLElement {\n const el = h(\"div\", \"cs-sb-row\")\n el.dataset.id = id\n\n const go = h(\"button\", \"cs-sb-go\")\n go.type = \"button\"\n go.dataset.fk = `go:${id}`\n go.dataset.kind = kind\n go.title = sub ? `\u805A\u7126 ${name} (${sub})` : `\u805A\u7126 ${name}`\n go.append(h(\"span\", \"cs-sb-dot\"), h(\"span\", \"cs-sb-name\", name))\n if (sub) go.appendChild(h(\"span\", \"cs-sb-route\", sub))\n go.addEventListener(\"click\", () => {\n if (isHidden(id)) toggleHidden(id) // \u85CF\u7740\u7684\u5148\u4EAE\u51FA\u6765\u518D\u805A\u7126,\u5426\u5219\u70B9\u4E86\u6CA1\u53CD\u5E94\n fitBoard(id)\n state.activeId = id\n syncActive()\n })\n\n const eye = h(\"button\", \"cs-sb-eye\", isHidden(id) ? \"\u25CC\" : \"\u25CF\")\n eye.type = \"button\"\n eye.dataset.fk = `eye:${id}`\n eye.title = isHidden(id) ? \"\u663E\u793A\u8FD9\u5757\u753B\u677F\" : \"\u4ECE\u5899\u4E0A\u9690\u85CF(\u4E0D\u5220,\u968F\u65F6\u70B9\u56DE\u6765)\"\n eye.setAttribute(\"aria-label\", isHidden(id) ? `\u663E\u793A ${name}` : `\u9690\u85CF ${name}`)\n eye.setAttribute(\"aria-pressed\", String(!isHidden(id)))\n eye.addEventListener(\"click\", (e) => {\n e.stopPropagation()\n toggleHidden(id)\n renderSidebar()\n })\n\n el.append(go, eye)\n if (isHidden(id)) el.classList.add(\"is-hidden-board\")\n return el\n}\n\n/** \u6D3B\u52A8\u753B\u677F\u5728\u5217\u8868\u91CC\u9AD8\u4EAE \u2014\u2014 \u8FD9\u662F\"\u6211\u5728\u54EA\"\u7684\u7B54\u6848 */\nexport function syncActive(): void {\n if (!listEl) return\n for (const r of listEl.querySelectorAll<HTMLElement>(\".cs-sb-row\")) {\n r.classList.toggle(\"is-active\", r.dataset.id === state.activeId)\n }\n}\n", "// contactsheet \u753B\u5E03\u5165\u53E3:\u62C9\u72B6\u6001\u5EFA\u5899\u3001\u8FDE SSE\u3001\u88C5\u914D\u5404\u6A21\u5757\n// \u884C\u4E3A\u89C4\u683C\u89C1 CONTRACTS.md\u300C\u753B\u5E03(Agent C)\u884C\u4E3A\u89C4\u683C\u300D\nimport type { Annotation, RegistryEntry } from \"../types.js\"\nimport { connectEvents, fetchAnnotations, fetchRegistry, fetchState } from \"./api.js\"\nimport { h, qs } from \"./dom.js\"\nimport { initHud } from \"./hud.js\"\nimport { initArgsPanel } from \"./args-panel.js\"\nimport { initModes } from \"./modes.js\"\nimport { copyContext, initPins, pushToClaudeCode, renderPins } from \"./pins.js\"\nimport { initRefs } from \"./refs.js\"\nimport { initSelect, refreshBoxes } from \"./select.js\"\nimport { state } from \"./state.js\"\nimport { initView, onViewChange, restoreView } from \"./view.js\"\nimport { initSidebar, syncActive } from \"./sidebar.js\"\nimport { initWall, mountVisible, remeasureAll, syncEntries } from \"./wall.js\"\n\nfunction showBootError(err: unknown): void {\n const boot = qs(\"#cs-boot\")\n boot.textContent = \"\"\n const card = h(\"div\", \"cs-card\")\n // \u4E09\u79CD\u60C5\u51B5\u5FC5\u987B\u5206\u5F00\u8BF4,\u5426\u5219\u7528\u6237\u5F80\u9519\u8BEF\u7684\u65B9\u5411\u6392\u67E5:\n // 502/504 = \u6211\u4EEC\u7684\u4EE3\u7406\u8FDE\u4E0D\u4E0A\u76EE\u6807(dev server \u6CA1\u8D77,\u6216\u8D77\u5728\u522B\u7684\u7AEF\u53E3 \u2014\u2014 target \u914D\u9519\u662F\u91CD\u707E\u533A);\n // \u5176\u4F59 5xx = \u76EE\u6807\u6D3B\u7740\u4F46\u6CE8\u518C\u8868\u6A21\u5757\u70B8\u4E86(\u51E0\u4E4E\u603B\u662F\u67D0\u4E2A\u753B\u677F\u6587\u4EF6\u6709\u7F16\u8BD1\u9519\u8BEF);\n // \u975E HTTP = \u8FDE\u5916\u58F3\u81EA\u5DF1\u90FD\u6CA1\u8FDE\u4E0A\u3002\n const msg = String(err)\n const target = state.info?.target ?? \"http://localhost:3000\"\n if (/HTTP 50[24]/.test(msg)) {\n card.appendChild(h(\"h2\", undefined, \"\u8FDE\u4E0D\u4E0A\u4F60\u7684 dev server\"))\n card.appendChild(\n h(\"p\", undefined, `\u5916\u58F3\u6B63\u628A\u8BF7\u6C42\u4EE3\u7406\u5230 ${target},\u4F46\u90A3\u91CC\u6CA1\u6709\u54CD\u5E94\u3002\u4E24\u79CD\u53EF\u80FD:dev server \u8FD8\u6CA1\u8D77;\u6216\u5B83\u8DD1\u5728\u522B\u7684\u7AEF\u53E3(\u53BB package.json \u7684 dev script \u770B\u771F\u5B9E\u7AEF\u53E3,\u6539 contactsheet.config.json \u7684 target,\u6216\u91CD\u542F\u65F6\u52A0 --target)\u3002`)\n )\n const p = h(\"p\")\n p.appendChild(h(\"code\", undefined, \"pnpm dev\"))\n card.appendChild(p)\n } else if (/HTTP 5\\d\\d/.test(msg)) {\n card.appendChild(h(\"h2\", undefined, \"\u753B\u677F\u6587\u4EF6\u7F16\u8BD1\u9519\u8BEF\"))\n card.appendChild(\n h(\"p\", undefined, \"next dev \u5728\u8DD1,\u4F46\u753B\u677F\u6CE8\u518C\u8868\u6A21\u5757\u6E32\u67D3\u5931\u8D25 \u2014\u2014 \u901A\u5E38\u662F\u67D0\u4E2A *.artboard.tsx \u6709\u8BED\u6CD5\u6216 import \u9519\u8BEF\u3002\u53BB next dev \u7684\u7EC8\u7AEF\u770B\u5177\u4F53\u62A5\u9519,\u4FEE\u597D\u540E\u8FD9\u9762\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002\")\n )\n } else {\n card.appendChild(h(\"h2\", undefined, \"\u76EE\u6807 dev server \u672A\u542F\u52A8\"))\n card.appendChild(h(\"p\", undefined, \"\u753B\u5E03\u8FDE\u4E0D\u4E0A\u753B\u677F\u6570\u636E\u3002\u5148\u5728\u9879\u76EE\u91CC\u8D77 next dev,\u5899\u4F1A\u81EA\u52A8\u6062\u590D\u3002\"))\n const p = h(\"p\")\n p.appendChild(h(\"code\", undefined, \"pnpm dev\"))\n card.appendChild(p)\n }\n card.appendChild(h(\"div\", \"cs-err\", String(err)))\n card.appendChild(h(\"p\", \"cs-dim\", \"\u6BCF 3 \u79D2\u81EA\u52A8\u91CD\u8BD5\u4E2D\u2026\"))\n const btn = h(\"button\", undefined, \"\u7ACB\u5373\u91CD\u8BD5\")\n btn.addEventListener(\"click\", () => void tryLoadRegistry())\n card.appendChild(btn)\n boot.appendChild(card)\n boot.hidden = false\n}\n\nlet retryTimer: ReturnType<typeof setInterval> | null = null\n\n/** \u62C9\u6CE8\u518C\u8868:\u6210\u529F\u5C31\u5EFA\u5899\u5E76\u6536\u6389\u9519\u8BEF\u5361;\u5931\u8D25\u5C55\u793A\u539F\u56E0\u5E76\u4FDD\u6301\u6BCF 3 \u79D2\u91CD\u8BD5(\u4FEE\u597D\u753B\u677F\u6587\u4EF6\u540E\u5899\u81EA\u52A8\u590D\u6D3B) */\nasync function tryLoadRegistry(): Promise<boolean> {\n try {\n const reg = await fetchRegistry()\n syncEntries(reg)\n remeasureAll()\n renderPins()\n qs(\"#cs-boot\").hidden = true\n if (retryTimer !== null) {\n clearInterval(retryTimer)\n retryTimer = null\n }\n return true\n } catch (err) {\n showBootError(err)\n if (retryTimer === null) retryTimer = setInterval(() => void tryLoadRegistry(), 3000)\n return false\n }\n}\n\nfunction showTarget(): void {\n const info = state.info\n const el = qs(\"#cs-target\")\n el.textContent = info ? `${info.target} \u00B7 ${info.designDir}` : \"\"\n el.title = info ? `v${info.version} \u00B7 ${info.projectRoot}` : \"\"\n}\n\n/** SSE registry \u4E8B\u4EF6:\u7EDF\u4E00\u8D70 tryLoadRegistry(\u6743\u5A01\u6570\u636E + \u5931\u8D25\u65F6\u9519\u8BEF\u5361/\u91CD\u8BD5,\u4E0D\u62FF\u6B8B\u7F3A\u6761\u76EE\u5EFA\u5899)\u3002\n * \u4F46 SSE \u6BD4 Next \u91CD\u7F16\u8BD1\u5FEB\u7EA6 1 \u79D2:\u4E8B\u4EF6\u5230\u8FBE\u65F6 /__cs/registry \u5F80\u5F80\u8FD8\u662F\u65E7\u7684\u90A3\u4EFD,\u53EA\u62C9\u4E00\u6B21\u5C31\u505C,\n * \u65B0\u753B\u677F\u4F1A\u4E00\u76F4\u5361\u5230\u4E0B\u6B21\u6587\u4EF6\u53D8\u52A8\u6216\u624B\u52A8\u5237\u65B0\u3002\u62FF SSE \u62A5\u7684 id \u96C6\u5408\u5F53\u9884\u671F,\u5BF9\u4E0D\u4E0A\u5C31\u77ED\u95F4\u9694\u518D\u62C9\u51E0\u6B21\u3002 */\nfunction onRegistryEvent(entries: RegistryEntry[]): void {\n void reloadUntilMatches(entries.map((e) => e.id))\n}\n\nasync function reloadUntilMatches(wantIds: string[], tries = 4): Promise<void> {\n const want = new Set(wantIds)\n for (let i = 0; i < tries; i++) {\n if (!(await tryLoadRegistry())) return // \u5DF2\u7ECF\u8FDB\u9519\u8BEF\u5361 + 3 \u79D2\u91CD\u8BD5,\u522B\u518D\u53E0\u4E00\u5C42\u8F6E\u8BE2\n const got = new Set(state.entries.map((e) => e.id))\n if (got.size === want.size && [...want].every((id) => got.has(id))) return\n await new Promise((r) => setTimeout(r, 700))\n }\n}\n\nfunction onAnnotations(list: Annotation[]): void {\n state.annotations = list\n renderPins()\n}\n\nasync function boot(): Promise<void> {\n initView()\n initSelect()\n initHud()\n initPins()\n initArgsPanel()\n initWall()\n initSidebar()\n initModes()\n initRefs()\n onViewChange(refreshBoxes)\n // \u89C6\u56FE\u505C\u4E0B\u6765\u4E4B\u540E\u8865\u6302:\u4F4E\u7F29\u653E\u65F6 IO \u4F1A\u8DF3\u8FC7\u6302\u8F7D,\u653E\u5927\u56DE\u6765\u8981\u628A\u53EF\u89C1\u7684\u8865\u4E0A\n let mountTimer: ReturnType<typeof setTimeout> | null = null\n onViewChange(() => {\n if (mountTimer !== null) clearTimeout(mountTimer)\n mountTimer = setTimeout(mountVisible, 180)\n })\n qs(\"#cs-copy\").addEventListener(\"click\", () => void copyContext())\n qs(\"#cs-push\").addEventListener(\"click\", () => void pushToClaudeCode())\n\n // \u5916\u58F3\u81EA\u5DF1\u7684\u63A5\u53E3(state)\u62C9\u4E0D\u5230\u624D\u662F\u81F4\u547D\u9519(\u9875\u9762\u5C31\u662F\u5916\u58F3\u53D1\u7684,\u51E0\u4E4E\u4E0D\u53EF\u80FD)\n try {\n state.info = await fetchState()\n } catch (err) {\n showBootError(err)\n return\n }\n showTarget()\n restoreView() // info \u5C31\u4F4D\u540E\u6309\u9879\u76EE\u952E\u6062\u590D\u4E0A\u6B21\u7684\u4F4D\u7F6E\u4E0E\u7F29\u653E\n\n // \u6CE8\u518C\u8868\u5931\u8D25\u4E0D\u7EC8\u6B62\u542F\u52A8:\u9519\u8BEF\u5361 + \u81EA\u52A8\u91CD\u8BD5,SSE \u7167\u5E38\u8FDE \u2014\u2014 \u753B\u677F\u6587\u4EF6\u4FEE\u597D\u540E\u5899\u81EA\u52A8\u590D\u6D3B\n await tryLoadRegistry()\n\n try {\n state.annotations = await fetchAnnotations()\n renderPins()\n } catch {\n /* \u6279\u6CE8\u62C9\u4E0D\u5230\u4E0D\u7B97\u81F4\u547D,\u5899\u7167\u5E38\u7528 */\n }\n\n connectEvents({\n registry: onRegistryEvent,\n annotations: onAnnotations,\n })\n}\n\nvoid boot()\n"],
5
+ "mappings": "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",
6
6
  "names": ["fx", "row", "world", "viewport", "board", "world", "o", "row", "boot"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "contactsheet",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "把你 UI 的各种状态摊在一面可缩放的墙上 —— 附着在 Next.js repo 上的联络表",
5
5
  "license": "MIT",
6
6
  "type": "module",