From 4c9bd5b86fae5ebb830c8f15f555c95284c19585 Mon Sep 17 00:00:00 2001 From: oliver Date: Thu, 17 Sep 2026 10:43:33 +0800 Subject: [PATCH] feat: add PNG/SVG export and expandable card property tips Toolbar exports PNG (fit+raster) and SVG; card click expands full fields, hover shows property tooltips, double-click opens the editor. Co-authored-by: Cursor --- apps/server/src/create-server.ts | 29 ++ apps/server/src/tools.ts | 27 +- apps/web/src/App.tsx | 39 +- apps/web/src/PropTooltip.tsx | 20 + apps/web/src/TopologyCanvas.tsx | 171 ++++++- apps/web/src/canvas-ui-text.ts | 16 +- apps/web/src/export-canvas.ts | 58 +++ apps/web/src/node-geometry.ts | 4 +- .../web/src/node-props/description-display.ts | 35 +- apps/web/src/node-props/draw-sheet.ts | 221 +++++++-- apps/web/src/node-props/index.ts | 3 +- apps/web/src/node-props/node-shell.css | 8 + apps/web/src/node-props/sizing.ts | 43 +- apps/web/src/styles.css | 39 ++ packages/dsh-plugin/bundle/server.mjs | 468 ++++++++++-------- .../bundle/web/assets/index-BK6FV7kG.css | 1 - .../bundle/web/assets/index-B_0PHR0v.js | 51 ++ .../bundle/web/assets/index-CACgBf2I.css | 1 + .../bundle/web/assets/index-iTIYRavW.js | 51 -- packages/dsh-plugin/bundle/web/index.html | 4 +- .../dsh-plugin/bundle/web/topo/ne-router.png | Bin 0 -> 7302 bytes packages/dsh-plugin/lib/tools.js | 4 +- 22 files changed, 978 insertions(+), 315 deletions(-) create mode 100644 apps/web/src/PropTooltip.tsx create mode 100644 apps/web/src/export-canvas.ts delete mode 100644 packages/dsh-plugin/bundle/web/assets/index-BK6FV7kG.css create mode 100644 packages/dsh-plugin/bundle/web/assets/index-B_0PHR0v.js create mode 100644 packages/dsh-plugin/bundle/web/assets/index-CACgBf2I.css delete mode 100644 packages/dsh-plugin/bundle/web/assets/index-iTIYRavW.js create mode 100644 packages/dsh-plugin/bundle/web/topo/ne-router.png diff --git a/apps/server/src/create-server.ts b/apps/server/src/create-server.ts index 78d9395..97d7c50 100644 --- a/apps/server/src/create-server.ts +++ b/apps/server/src/create-server.ts @@ -390,6 +390,35 @@ export function startMindMapServer( } }); + app.get("/api/canvases/:id/export.svg", async (c) => { + try { + const id = c.req.param("id"); + const result = (await runTool( + "mindmap_export", + { format: "svg", canvasId: id }, + { store, broadcast, defaultCanvasId: id }, + )) as { + ok?: boolean; + svg?: string; + title?: string; + }; + if (!result?.ok || typeof result.svg !== "string") { + return c.json({ ok: false, error: "export_failed" }, 400); + } + const safe = + String(result.title ?? "mindmap").replace(/[\\/:*?"<>|]+/g, "_") || + "mindmap"; + return new Response(result.svg, { + headers: { + "Content-Type": "image/svg+xml; charset=utf-8", + "Content-Disposition": `attachment; filename="${safe}.svg"`, + }, + }); + } catch { + return c.json({ ok: false, error: "not_found" }, 404); + } + }); + app.post("/api/tools/:name", async (c) => { const name = c.req.param("name"); const args = (await c.req.json().catch(() => ({}))) as Record; diff --git a/apps/server/src/tools.ts b/apps/server/src/tools.ts index a233a3e..e080f30 100644 --- a/apps/server/src/tools.ts +++ b/apps/server/src/tools.ts @@ -243,7 +243,7 @@ function escapeXml(s: string): string { .replace(/"/g, """); } -function exportSvg( +export function exportSvg( nodes: MindNode[], edges: MindEdge[], positions: Record, @@ -1108,24 +1108,37 @@ export async function runTool( snap.canvas.title, anchorId, ); + if (format === "png") { + // Server has no font/raster stack; return SVG payload plus png mime hint. + // Web UI toolbar「PNG」rasterizes the live canvas (CJK-accurate). + return { + ok: true, + format: "svg", + requestedFormat: "png", + title: snap.canvas.title, + mimeType: "image/svg+xml", + svg, + nodeCount: publicNodes.length, + edgeCount: publicEdges.length, + hint: + "PNG raster needs the web UI toolbar button (system fonts). This tool returns SVG which pastes into docs/PPT; save as .svg or convert locally.", + }; + } return { ok: true, - format: format === "png" ? "svg" : "svg", + format: "svg", title: snap.canvas.title, mimeType: "image/svg+xml", svg, nodeCount: publicNodes.length, edgeCount: publicEdges.length, - hint: - format === "png" - ? "Agent export returns SVG (vector). For raster PNG use the web UI「导出PNG」; SVG pastes into docs/PPT as well." - : "SVG can be saved as .svg or opened in browser / Office.", + hint: "SVG can be saved as .svg or opened in browser / Office.", }; } return { ok: false, error: "invalid_op", - message: 'format must be "json" | "md" | "svg" (png → svg for agents; UI has raster PNG)', + message: 'format must be "json" | "md" | "svg" | "png"', }; } diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 7131e50..ea13172 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -279,13 +279,48 @@ export function App() { + +
+
+ + +
{Math.round(viewport.zoom * 100)}% @@ -1629,13 +1777,22 @@ export function TopologyCanvas() { return ; })()} + {cardView && propTip ? ( + + ) : null} + {!locked && !ghost && cardView && - selectedIds[0] && + propEditId && viewport.zoom >= 0.35 && (() => { - const id = selectedIds[0]!; + const id = propEditId; const n = nodes.find((x) => x.id === id); if (!n || n.deletedAt) return null; const p = positions[id]; diff --git a/apps/web/src/canvas-ui-text.ts b/apps/web/src/canvas-ui-text.ts index 8df257f..20f0492 100644 --- a/apps/web/src/canvas-ui-text.ts +++ b/apps/web/src/canvas-ui-text.ts @@ -49,6 +49,10 @@ export type CanvasUi = { hintLocked: string; hintNodeDrag: string; hintBranchDrag: string; + exportPng: string; + exportPngTitle: string; + exportSvg: string; + exportSvgTitle: string; }; const zh: CanvasUi = { @@ -73,7 +77,7 @@ const zh: CanvasUi = { card: "卡片", topology: "拓扑", bubbleTitle: "气泡视图:精简标题", - cardTitle: "卡片视图:展开属性面板", + cardTitle: "卡片视图:单击展开全文 · 悬停属性看详情 · 双击编辑", topologyTitle: "拓扑视图:路由器图标 + 链路", unpin: "解钉", unpinTitle: "取消钉住:让选中节点重新参与自动布局", @@ -95,6 +99,10 @@ const zh: CanvasUi = { hintLocked: "已锁定 · 仅浏览/缩放/平移", hintNodeDrag: "单点拖 · 只移动当前节点 · Shift 临时单点 · Esc 取消", hintBranchDrag: "整枝拖 · 空白钉住 · 落到节点换父 · N 单点 · Esc 取消", + exportPng: "PNG", + exportPngTitle: "导出 PNG(先适应画布再截取)", + exportSvg: "SVG", + exportSvgTitle: "导出 SVG 矢量图", }; const en: CanvasUi = { @@ -119,7 +127,7 @@ const en: CanvasUi = { card: "Card", topology: "Topology", bubbleTitle: "Bubble view: title only", - cardTitle: "Card view: property sheet", + cardTitle: "Card view: click expand · hover props · double-click edit", topologyTitle: "Topology view: router icons + links", unpin: "Unpin", unpinTitle: "Unpin selected node for auto layout", @@ -141,6 +149,10 @@ const en: CanvasUi = { hintLocked: "Locked · browse / zoom / pan only", hintNodeDrag: "Node drag · Shift temp node · Esc cancel", hintBranchDrag: "Branch drag · pin on blank · drop to reparent · N node · Esc cancel", + exportPng: "PNG", + exportPngTitle: "Export PNG (fit view, then capture)", + exportSvg: "SVG", + exportSvgTitle: "Export SVG vector", }; export const canvasUiTables = { zh, en } as const; diff --git a/apps/web/src/export-canvas.ts b/apps/web/src/export-canvas.ts new file mode 100644 index 0000000..178e051 --- /dev/null +++ b/apps/web/src/export-canvas.ts @@ -0,0 +1,58 @@ +/** Client-side canvas / file export helpers. */ + +export function downloadBlob(blob: Blob, filename: string) { + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + a.click(); + window.setTimeout(() => URL.revokeObjectURL(url), 2_000); +} + +export function downloadText(text: string, filename: string, mime: string) { + downloadBlob(new Blob([text], { type: mime }), filename); +} + +/** Rasterize the on-screen canvas (current viewport) to PNG. */ +export function exportCanvasPng( + el: HTMLCanvasElement, + filename: string, +): Promise { + return new Promise((resolve, reject) => { + el.toBlob( + (blob) => { + if (!blob) { + reject(new Error("png_encode_failed")); + return; + } + downloadBlob(blob, filename); + resolve(); + }, + "image/png", + ); + }); +} + +/** Fit view → wait for paint → PNG of full graph in viewport. */ +export async function exportFitPng(opts: { + fitView: () => void; + canvas: HTMLCanvasElement; + filename: string; +}): Promise { + opts.fitView(); + await new Promise((r) => + requestAnimationFrame(() => requestAnimationFrame(() => r())), + ); + await new Promise((r) => setTimeout(r, 40)); + await exportCanvasPng(opts.canvas, opts.filename); +} + +export async function exportSvgFromApi( + canvasId: string, + filename: string, +): Promise { + const res = await fetch(`/api/canvases/${encodeURIComponent(canvasId)}/export.svg`); + if (!res.ok) throw new Error(`svg_export_${res.status}`); + const text = await res.text(); + downloadText(text, filename, "image/svg+xml;charset=utf-8"); +} diff --git a/apps/web/src/node-geometry.ts b/apps/web/src/node-geometry.ts index 96c6fa7..a1e4346 100644 --- a/apps/web/src/node-geometry.ts +++ b/apps/web/src/node-geometry.ts @@ -8,7 +8,7 @@ export const ROUTER_ICON_URL = "/topo/ne-router.png"; export function nodeBoxSize( n: MindNode, dens: boolean, - opts?: { asCard?: boolean; asTopology?: boolean }, + opts?: { asCard?: boolean; asTopology?: boolean; expanded?: boolean }, ): { w: number; h: number } { if (opts?.asTopology) { const icon = dens ? TOPO_ICON_PX.compact : TOPO_ICON_PX.comfortable; @@ -21,7 +21,7 @@ export function nodeBoxSize( }; } if (opts?.asCard || n.stylePreset === "card") { - return estimateCardSize(n, dens); + return estimateCardSize(n, dens, new Set(), { expanded: opts?.expanded }); } let w = dens ? 168 : 212; diff --git a/apps/web/src/node-props/description-display.ts b/apps/web/src/node-props/description-display.ts index 3318681..1b568c7 100644 --- a/apps/web/src/node-props/description-display.ts +++ b/apps/web/src/node-props/description-display.ts @@ -4,6 +4,8 @@ export type DescChip = { key: string; label: string; value: string; + /** Full value without truncation (for tooltips / expanded face). */ + fullValue: string; }; const LABEL_MAP: Record = { @@ -48,25 +50,27 @@ function truncate(s: string, max: number): string { return `${t.slice(0, max - 1)}…`; } -function formatValue(v: unknown): string | null { +function formatValueRaw(v: unknown): string | null { if (v == null) return null; if (typeof v === "string") { const t = v.trim(); - return t ? truncate(t, MAX_VALUE_LEN) : null; + return t || null; } if (typeof v === "number" || typeof v === "boolean") { - return truncate(String(v), MAX_VALUE_LEN); + return String(v); } if (Array.isArray(v)) { const parts = v - .map((x) => (typeof x === "string" || typeof x === "number" ? String(x) : null)) + .map((x) => + typeof x === "string" || typeof x === "number" ? String(x) : null, + ) .filter(Boolean) as string[]; if (!parts.length) return null; - return truncate(parts.join("、"), MAX_VALUE_LEN); + return parts.join("、"); } if (typeof v === "object") { try { - return truncate(JSON.stringify(v), MAX_VALUE_LEN); + return JSON.stringify(v); } catch { return null; } @@ -98,17 +102,28 @@ export function displayDescriptionKey(key: string): string { return labelForKey(key); } +export type DescriptionChipsOpts = { + max?: number; + /** When true, `value` is not truncated (same as fullValue). */ + full?: boolean; +}; + /** Flatten description object into labeled chips for card / editor face. */ export function descriptionChips( description: Record | null | undefined, - max = MAX_CHIPS, + maxOrOpts: number | DescriptionChipsOpts = MAX_CHIPS, ): DescChip[] { + const opts: DescriptionChipsOpts = + typeof maxOrOpts === "number" ? { max: maxOrOpts } : maxOrOpts; + const max = opts.max ?? (opts.full ? 64 : MAX_CHIPS); + const full = Boolean(opts.full); if (!description || typeof description !== "object") return []; const out: DescChip[] = []; for (const [key, raw] of Object.entries(description)) { - const value = formatValue(raw); - if (!value) continue; - out.push({ key, label: labelForKey(key), value }); + const fullValue = formatValueRaw(raw); + if (!fullValue) continue; + const value = full ? fullValue : truncate(fullValue, MAX_VALUE_LEN); + out.push({ key, label: labelForKey(key), value, fullValue }); if (out.length >= max) break; } return out; diff --git a/apps/web/src/node-props/draw-sheet.ts b/apps/web/src/node-props/draw-sheet.ts index e8c1e70..8b0360e 100644 --- a/apps/web/src/node-props/draw-sheet.ts +++ b/apps/web/src/node-props/draw-sheet.ts @@ -3,9 +3,10 @@ import { canvasFont, paintBadgeChip } from "../canvas-chrome"; import { getCachedImage, imageLoadFailed } from "../image-cache"; import type { SystemTheme } from "../system-theme"; import { roundRectPath, wrapTextLines } from "../node-geometry"; -import { descriptionChips } from "./description-display"; +import { descriptionChips, type DescChip } from "./description-display"; import { CARD_CHIP_H, + CARD_FOOTER_H, CARD_GAP, CARD_HEADER_H, CARD_HERO_H, @@ -31,6 +32,178 @@ function formatDate(ms?: number): string | null { } } +export type CardChipHit = { + key: string; + label: string; + value: string; + fullValue: string; + /** Card-local rect (relative to card top-left). */ + x: number; + y: number; + w: number; + h: number; +}; + +export type DrawPropSheetOpts = { + expanded?: boolean; +}; + +/** Compute chip hit targets in card-local coordinates (must match drawPropSheet). */ +export function cardChipHits( + node: MindNode, + dens: boolean, + expanded = false, +): CardChipHit[] { + const { w } = estimateCardSize(node, dens, new Set(), { expanded }); + let cy = CARD_HEADER_H + Math.max(4, CARD_PAD_Y - 4); + const contentW = w - CARD_PAD_X * 2; + + if (node.imageUrl?.trim()) { + cy += (dens ? CARD_HERO_H.compact : CARD_HERO_H.comfortable) + CARD_GAP; + } + + const note = node.note?.trim(); + if (note) { + const maxLines = expanded ? (dens ? 10 : 12) : dens ? 2 : 3; + // Approximate line count without canvas measure (hit test is generous) + const approxChars = dens ? 28 : 34; + const lines = Math.min( + maxLines, + Math.max(1, Math.ceil(note.length / approxChars)), + ); + const lh = dens ? 15 : 16; + cy += lines * lh + CARD_GAP; + } + + const chips = descriptionChips(node.description, { + full: expanded, + max: expanded ? 64 : 6, + }); + const hits: CardChipHit[] = []; + const rowGap = dens ? 4 : 5; + for (const chip of chips) { + const approx = dens ? 18 : 22; + const vLines = expanded + ? Math.min(8, Math.max(1, Math.ceil(chip.fullValue.length / approx))) + : 1; + const lh = dens ? 14 : 15; + const rowH = CARD_CHIP_H + Math.max(0, vLines - 1) * lh; + hits.push({ + key: chip.key, + label: chip.label, + value: chip.value, + fullValue: chip.fullValue, + x: CARD_PAD_X, + y: cy, + w: contentW, + h: rowH, + }); + cy += rowH + rowGap; + } + return hits; +} + +/** Also expose note / title as hoverable regions when truncated. */ +export function cardFieldHits( + node: MindNode, + dens: boolean, + expanded = false, +): CardChipHit[] { + const { w } = estimateCardSize(node, dens, new Set(), { expanded }); + const hits: CardChipHit[] = []; + const title = (node.text || "未命名").trim(); + hits.push({ + key: "__title", + label: "标题", + value: title, + fullValue: title, + x: 28, + y: 4, + w: w - 32 - CARD_PAD_X, + h: CARD_HEADER_H - 8, + }); + + let cy = CARD_HEADER_H + Math.max(4, CARD_PAD_Y - 4); + const contentW = w - CARD_PAD_X * 2; + + if (node.imageUrl?.trim()) { + cy += (dens ? CARD_HERO_H.compact : CARD_HERO_H.comfortable) + CARD_GAP; + } + + const note = node.note?.trim(); + if (note) { + const maxLines = expanded ? (dens ? 10 : 12) : dens ? 2 : 3; + const approxChars = dens ? 28 : 34; + const lines = Math.min( + maxLines, + Math.max(1, Math.ceil(note.length / approxChars)), + ); + const lh = dens ? 15 : 16; + const noteH = lines * lh; + hits.push({ + key: "__note", + label: "摘要", + value: note, + fullValue: note, + x: CARD_PAD_X, + y: cy, + w: contentW, + h: noteH, + }); + } + + return [...hits, ...cardChipHits(node, dens, expanded)]; +} + +function drawChipRows( + ctx: CanvasRenderingContext2D, + chips: DescChip[], + x: number, + startY: number, + contentW: number, + theme: SystemTheme, + dens: boolean, + expanded: boolean, +): number { + let cy = startY; + const rowGap = dens ? 4 : 5; + for (let i = 0; i < chips.length; i++) { + const chip = chips[i]!; + ctx.fillStyle = theme.labelSecondary; + ctx.font = canvasFont(10, 500); + ctx.textBaseline = "middle"; + const label = chip.label; + const labelW = Math.min(ctx.measureText(label).width, contentW * 0.36); + const text = expanded ? chip.fullValue : chip.value; + const vx = x + CARD_PAD_X + labelW + 10; + const vw = contentW - labelW - 10; + const maxLines = expanded ? 8 : 1; + ctx.font = canvasFont(dens ? 11 : 12, 500); + const vLines = wrapTextLines(ctx, text, vw, maxLines); + const lh = dens ? 14 : 15; + const rowH = Math.max(CARD_CHIP_H, vLines.length * lh); + + ctx.fillStyle = theme.labelSecondary; + ctx.font = canvasFont(10, 500); + ctx.textBaseline = "middle"; + ctx.fillText(label, x + CARD_PAD_X, cy + CARD_CHIP_H / 2, labelW); + + ctx.fillStyle = theme.labelPrimary; + ctx.font = canvasFont(dens ? 11 : 12, 500); + if (vLines.length <= 1) { + ctx.textBaseline = "middle"; + ctx.fillText(vLines[0] ?? text, vx, cy + CARD_CHIP_H / 2); + } else { + ctx.textBaseline = "top"; + for (let li = 0; li < vLines.length; li++) { + ctx.fillText(vLines[li]!, vx, cy + 2 + li * lh); + } + } + cy += rowH + rowGap; + } + return cy; +} + /** Glass card body: title → hero → note → meta chips → footer (no raw JSON). */ export function drawPropSheet( ctx: CanvasRenderingContext2D, @@ -42,8 +215,10 @@ export function drawPropSheet( dens: boolean, accent: string, onImage: () => void, + opts: DrawPropSheetOpts = {}, ) { - const { w, h } = estimateCardSize(node, dens); + const expanded = Boolean(opts.expanded); + const { w, h } = estimateCardSize(node, dens, new Set(), { expanded }); const radius = dens ? 14 : 16; ctx.save(); @@ -91,13 +266,13 @@ export function drawPropSheet( ctx, node.text || "未命名", titleMaxW, - dens ? 1 : 2, + expanded ? (dens ? 2 : 3) : dens ? 1 : 2, ); if (titleLines.length === 1) { ctx.fillText(titleLines[0]!, x + 28, y + CARD_HEADER_H / 2); } else { const lh = 14; - const ty = y + CARD_HEADER_H / 2 - lh / 2; + const ty = y + CARD_HEADER_H / 2 - ((titleLines.length - 1) * lh) / 2; titleLines.forEach((line, i) => { ctx.fillText(line, x + 28, ty + i * lh); }); @@ -118,7 +293,6 @@ export function drawPropSheet( ctx.fillStyle = theme.glassHeader; ctx.fillRect(x + CARD_PAD_X, cy, contentW, ih); if (img && img.naturalWidth > 0) { - // Cover: fill frame, crop edges lightly for magazine feel const scale = Math.max( contentW / img.naturalWidth, ih / img.naturalHeight, @@ -152,7 +326,8 @@ export function drawPropSheet( ctx.fillStyle = theme.labelSecondary; ctx.font = canvasFont(dens ? 11.5 : 12.5, 400); ctx.textBaseline = "top"; - const lines = wrapTextLines(ctx, note, contentW, dens ? 2 : 3); + const maxLines = expanded ? (dens ? 10 : 12) : dens ? 2 : 3; + const lines = wrapTextLines(ctx, note, contentW, maxLines); const lh = dens ? 15 : 16; for (let i = 0; i < lines.length; i++) { ctx.fillText(lines[i]!, x + CARD_PAD_X, cy + i * lh); @@ -160,34 +335,20 @@ export function drawPropSheet( cy += lines.length * lh + CARD_GAP; } - // Description as one compact key-value block (no row dividers) - const chips = descriptionChips(node.description); + // Description as key-value rows + const chips = descriptionChips(node.description, { + full: expanded, + max: expanded ? 64 : 6, + }); if (chips.length) { - const rowGap = dens ? 4 : 5; - for (let i = 0; i < chips.length; i++) { - const chip = chips[i]!; - ctx.fillStyle = theme.labelSecondary; - ctx.font = canvasFont(10, 500); - ctx.textBaseline = "middle"; - const label = chip.label; - const labelW = Math.min(ctx.measureText(label).width, contentW * 0.36); - ctx.fillText(label, x + CARD_PAD_X, cy + CARD_CHIP_H / 2, labelW); - - ctx.fillStyle = theme.labelPrimary; - ctx.font = canvasFont(dens ? 11 : 12, 500); - const vx = x + CARD_PAD_X + labelW + 10; - const vw = contentW - labelW - 10; - const vLines = wrapTextLines(ctx, chip.value, vw, 1); - ctx.fillText(vLines[0] ?? chip.value, vx, cy + CARD_CHIP_H / 2); - cy += CARD_CHIP_H + rowGap; - } + cy = drawChipRows(ctx, chips, x, cy, contentW, theme, dens, expanded); cy += CARD_GAP - 4; } // Footer: tags / source / dates as chips const footerBits: string[] = []; if (node.tags?.length) { - for (const t of node.tags.slice(0, 3)) footerBits.push(`#${t}`); + for (const t of node.tags.slice(0, expanded ? 12 : 3)) footerBits.push(`#${t}`); } if (node.links?.[0]) { const l = node.links[0]; @@ -205,7 +366,11 @@ export function drawPropSheet( for (const bit of footerBits) { const used = paintBadgeChip(ctx, bit, fx, fy, theme, zoom); fx += used; - if (fx > x + w - CARD_PAD_X - 24) break; + if (!expanded && fx > x + w - CARD_PAD_X - 24) break; + if (expanded && fx > x + w - CARD_PAD_X - 24) { + fx = x + CARD_PAD_X; + cy += CARD_FOOTER_H; + } } } diff --git a/apps/web/src/node-props/index.ts b/apps/web/src/node-props/index.ts index 02956d5..e13d9f6 100644 --- a/apps/web/src/node-props/index.ts +++ b/apps/web/src/node-props/index.ts @@ -1,6 +1,7 @@ export { PROP_FIELDS, visiblePropRows, hiddenAddableFields, commitField } from "./registry"; export { estimateCardSize, CARD_WIDTH } from "./sizing"; -export { drawPropSheet } from "./draw-sheet"; +export { drawPropSheet, cardChipHits, cardFieldHits } from "./draw-sheet"; +export type { CardChipHit } from "./draw-sheet"; export { descriptionChips, descriptionPreviewLine } from "./description-display"; export { NodePropEditor, NodePropOverlay } from "./NodePropEditor"; export type { PropFieldId, PropFieldDef } from "./types"; diff --git a/apps/web/src/node-props/node-shell.css b/apps/web/src/node-props/node-shell.css index cbd995a..b448257 100644 --- a/apps/web/src/node-props/node-shell.css +++ b/apps/web/src/node-props/node-shell.css @@ -134,6 +134,14 @@ min-width: 0; } +.ns-chip__v.is-expanded, +.ns-editor--expanded .ns-chip__v { + white-space: normal; + overflow: visible; + text-overflow: unset; + word-break: break-word; +} + .ns-kv { margin: 4px 2px 6px; padding: 4px 2px 6px; diff --git a/apps/web/src/node-props/sizing.ts b/apps/web/src/node-props/sizing.ts index 7f055f6..1356107 100644 --- a/apps/web/src/node-props/sizing.ts +++ b/apps/web/src/node-props/sizing.ts @@ -10,12 +10,19 @@ export const CARD_HERO_H = { comfortable: 108, compact: 90 } as const; export const CARD_CHIP_H = 18; export const CARD_FOOTER_H = 24; +export type CardSizeOpts = { + /** Click-expanded: show full note / multi-line props / more chips. */ + expanded?: boolean; +}; + /** Layout / hit-test height for a glass card node (title → image → note → chips → footer). */ export function estimateCardSize( node: MindNode, dens: boolean, _forced: ReadonlySet = new Set(), + opts: CardSizeOpts = {}, ): { w: number; h: number } { + const expanded = Boolean(opts.expanded); const w = dens ? CARD_WIDTH.compact : CARD_WIDTH.comfortable; let body = 0; @@ -24,12 +31,42 @@ export function estimateCardSize( } if (node.note?.trim()) { - body += (dens ? 40 : 48) + CARD_GAP; + if (expanded) { + // Rough multi-line note: ~42 chars/line at card width + const lines = Math.min( + 12, + Math.max(2, Math.ceil(node.note.trim().length / (dens ? 28 : 34))), + ); + body += lines * (dens ? 15 : 16) + CARD_GAP; + } else { + body += (dens ? 40 : 48) + CARD_GAP; + } } - const chips = descriptionChips(node.description); + const chips = descriptionChips(node.description, { + full: expanded, + max: expanded ? 64 : 6, + }); if (chips.length) { - body += chips.length * CARD_CHIP_H + Math.max(0, chips.length - 1) * 4 + CARD_GAP; + if (expanded) { + const rowGap = dens ? 4 : 5; + let chipH = 0; + for (const chip of chips) { + // ~22 chars per value line when label takes ~36% width + const vLines = Math.min( + 8, + Math.max(1, Math.ceil(chip.fullValue.length / (dens ? 18 : 22))), + ); + chipH += CARD_CHIP_H + Math.max(0, vLines - 1) * (dens ? 14 : 15); + chipH += rowGap; + } + body += chipH + CARD_GAP; + } else { + body += + chips.length * CARD_CHIP_H + + Math.max(0, chips.length - 1) * 4 + + CARD_GAP; + } } const hasFooter = diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index 6d7b835..5b8dc8f 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -506,6 +506,45 @@ input { line-height: 1.35; } +.prop-tooltip { + position: absolute; + z-index: 8; + max-width: 320px; + min-width: 140px; + padding: 10px 12px; + border-radius: 12px; + border: 1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, 0.14)); + background: color-mix( + in srgb, + var(--dsw-alias-bg-layer-1, #1b1e28) 94%, + transparent + ); + backdrop-filter: blur(12px); + box-shadow: + 0 1px 0 rgba(255, 255, 255, 0.06) inset, + 0 14px 40px rgba(0, 0, 0, 0.48); + pointer-events: none; + font-family: "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", + "Noto Sans SC", system-ui, sans-serif; +} + +.prop-tooltip__label { + font-size: 11px; + font-weight: 600; + letter-spacing: 0.02em; + color: var(--dsw-alias-label-secondary, #a5adb8); + margin-bottom: 4px; +} + +.prop-tooltip__value { + font-size: 12.5px; + font-weight: 500; + line-height: 1.45; + color: var(--dsw-alias-label-primary, #f4f5f7); + white-space: pre-wrap; + word-break: break-word; +} + .edit-overlay { position: absolute; z-index: 6; diff --git a/packages/dsh-plugin/bundle/server.mjs b/packages/dsh-plugin/bundle/server.mjs index 9530370..ad33690 100644 --- a/packages/dsh-plugin/bundle/server.mjs +++ b/packages/dsh-plugin/bundle/server.mjs @@ -35,9 +35,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge mod )); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/constants.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/constants.js var require_constants = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/constants.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/constants.js"(exports, module) { "use strict"; var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"]; var hasBlob = typeof Blob !== "undefined"; @@ -58,9 +58,9 @@ var require_constants = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/buffer-util.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/buffer-util.js var require_buffer_util = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/buffer-util.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/buffer-util.js"(exports, module) { "use strict"; var { EMPTY_BUFFER } = require_constants(); var FastBuffer = Buffer[Symbol.species]; @@ -133,9 +133,9 @@ var require_buffer_util = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/limiter.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/limiter.js var require_limiter = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/limiter.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/limiter.js"(exports, module) { "use strict"; var kDone = Symbol("kDone"); var kRun = Symbol("kRun"); @@ -183,9 +183,9 @@ var require_limiter = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/permessage-deflate.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/permessage-deflate.js var require_permessage_deflate = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/permessage-deflate.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/permessage-deflate.js"(exports, module) { "use strict"; var zlib = __require("zlib"); var bufferUtil = require_buffer_util(); @@ -566,9 +566,9 @@ var require_permessage_deflate = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/validation.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/validation.js var require_validation = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/validation.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/validation.js"(exports, module) { "use strict"; var { isUtf8 } = __require("buffer"); var { hasBlob } = require_constants(); @@ -767,9 +767,9 @@ var require_validation = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/receiver.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/receiver.js var require_receiver = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/receiver.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/receiver.js"(exports, module) { "use strict"; var { Writable } = __require("stream"); var PerMessageDeflate2 = require_permessage_deflate(); @@ -1390,9 +1390,9 @@ var require_receiver = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/sender.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/sender.js var require_sender = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/sender.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/sender.js"(exports, module) { "use strict"; var { Duplex } = __require("stream"); var { randomFillSync } = __require("crypto"); @@ -1883,9 +1883,9 @@ var require_sender = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/event-target.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/event-target.js var require_event_target = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/event-target.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/event-target.js"(exports, module) { "use strict"; var { kForOnEventAttribute, kListener } = require_constants(); var kCode = Symbol("kCode"); @@ -2112,9 +2112,9 @@ var require_event_target = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/extension.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/extension.js var require_extension = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/extension.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/extension.js"(exports, module) { "use strict"; var { tokenChars } = require_validation(); function push(dest, name17, elem) { @@ -2265,9 +2265,9 @@ var require_extension = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket.js var require_websocket = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket.js"(exports, module) { "use strict"; var EventEmitter = __require("events"); var https = __require("https"); @@ -3161,9 +3161,9 @@ var require_websocket = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/stream.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/stream.js var require_stream = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/stream.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/stream.js"(exports, module) { "use strict"; var WebSocket2 = require_websocket(); var { Duplex } = __require("stream"); @@ -3259,9 +3259,9 @@ var require_stream = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/subprotocol.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/subprotocol.js var require_subprotocol = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/subprotocol.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/subprotocol.js"(exports, module) { "use strict"; var { tokenChars } = require_validation(); function parse(header) { @@ -3304,9 +3304,9 @@ var require_subprotocol = __commonJS({ } }); -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket-server.js +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket-server.js var require_websocket_server = __commonJS({ - "node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket-server.js"(exports, module) { + "../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/lib/websocket-server.js"(exports, module) { "use strict"; var EventEmitter = __require("events"); var http = __require("http"); @@ -3705,9 +3705,9 @@ var require_websocket_server = __commonJS({ } }); -// node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js +// ../../node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js var require_secure_json_parse = __commonJS({ - "node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js"(exports, module) { + "../../node_modules/.pnpm/secure-json-parse@2.7.0/node_modules/secure-json-parse/index.js"(exports, module) { "use strict"; var hasBuffer = typeof Buffer !== "undefined"; var suspectProtoRx = /"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/; @@ -3809,9 +3809,9 @@ var require_secure_json_parse = __commonJS({ } }); -// node_modules/.pnpm/d3-flextree@2.1.2/node_modules/d3-flextree/build/d3-flextree.js +// ../../node_modules/.pnpm/d3-flextree@2.1.2/node_modules/d3-flextree/build/d3-flextree.js var require_d3_flextree = __commonJS({ - "node_modules/.pnpm/d3-flextree@2.1.2/node_modules/d3-flextree/build/d3-flextree.js"(exports, module) { + "../../node_modules/.pnpm/d3-flextree@2.1.2/node_modules/d3-flextree/build/d3-flextree.js"(exports, module) { (function(global2, factory) { typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : factory(global2.d3 = global2.d3 || {}); })(exports, (function(exports2) { @@ -4500,10 +4500,10 @@ var require_d3_flextree = __commonJS({ } }); -// apps/server/src/create-server.ts +// ../../apps/server/src/create-server.ts import fs2 from "node:fs"; -// node_modules/.pnpm/@hono+node-server@1.19.17_hono@4.13.7/node_modules/@hono/node-server/dist/index.mjs +// ../../node_modules/.pnpm/@hono+node-server@1.19.17_hono@4.13.7/node_modules/@hono/node-server/dist/index.mjs import { createServer as createServerHTTP } from "http"; import { Http2ServerRequest as Http2ServerRequest2, constants as h2constants } from "http2"; import { Http2ServerRequest } from "http2"; @@ -5144,7 +5144,7 @@ var serve = (options, listeningListener) => { return server; }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/mime.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/mime.js var getMimeType = (filename, mimes = baseMimes) => { const regexp = /\.([a-zA-Z0-9]+?)$/; const match2 = filename.match(regexp); @@ -5213,7 +5213,7 @@ var _baseMimes = { }; var baseMimes = _baseMimes; -// node_modules/.pnpm/@hono+node-server@1.19.17_hono@4.13.7/node_modules/@hono/node-server/dist/serve-static.mjs +// ../../node_modules/.pnpm/@hono+node-server@1.19.17_hono@4.13.7/node_modules/@hono/node-server/dist/serve-static.mjs import { createReadStream, statSync, existsSync } from "fs"; import { join } from "path"; import { versions } from "process"; @@ -5362,7 +5362,7 @@ var serveStatic = (options = { root: "" }) => { }; }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js var compose = (middleware, onError, onNotFound) => { return (context, next) => { let index = -1; @@ -5406,10 +5406,10 @@ var compose = (middleware, onError, onNotFound) => { }; }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js var GET_MATCH_RESULT = /* @__PURE__ */ Symbol(); -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js var bufferToFormData = (arrayBuffer, contentType) => { const response = new Response(arrayBuffer, { headers: { @@ -5420,7 +5420,7 @@ var bufferToFormData = (arrayBuffer, contentType) => { return response.formData(); }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js var MAX_NESTING_DEPTH = 32; var MAX_NESTED_OBJECTS = 1e4; var isRawRequest = (request) => "headers" in request; @@ -5518,7 +5518,7 @@ var throwNestingLimitExceeded = () => { throw new Error("Nesting limit exceeded"); }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js var splitPath = (path3) => { const paths = path3.split("/"); if (paths[0] === "") { @@ -5724,7 +5724,7 @@ var getQueryParams = (url, key) => { }; var decodeURIComponent_ = decodeURIComponent; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js var HonoRequest = class { /** * `.raw` can get the raw Request object. @@ -6005,7 +6005,7 @@ var HonoRequest = class { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js var HtmlEscapedCallbackPhase = { Stringify: 1, BeforeStream: 2, @@ -6047,7 +6047,7 @@ var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js var TEXT_PLAIN = "text/plain; charset=UTF-8"; var setDefaultContentType = (contentType, headers) => { return { @@ -6473,7 +6473,7 @@ var Context = class { }; }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js var METHOD_NAME_ALL = "ALL"; var METHOD_NAME_ALL_LOWERCASE = "all"; var METHODS = ["get", "post", "put", "delete", "options", "patch", "query"]; @@ -6481,10 +6481,10 @@ var MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is var UnsupportedPathError = class extends Error { }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js var COMPOSED_HANDLER = "__COMPOSED_HANDLER"; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js var notFoundHandler = (c) => { return c.text("404 Not Found", 404); }; @@ -6862,10 +6862,10 @@ var Hono = class _Hono { }; }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js var createNullObject = () => /* @__PURE__ */ Object.create(null); -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js var emptyParam = []; function match(method, path3) { const matchers = this.buildAllMatchers(); @@ -6886,7 +6886,7 @@ function match(method, path3) { return match2(method, path3); } -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js var LABEL_REG_EXP_STR = "[^/]+"; var ONLY_WILDCARD_REG_EXP_STR = ".*"; var TAIL_WILDCARD_REG_EXP_STR = "(?:|/.*)"; @@ -6993,7 +6993,7 @@ var Node = class _Node { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js var Trie = class { #context = { varIndex: 0 }; #root = new Node(); @@ -7057,7 +7057,7 @@ var Trie = class { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js var wildcardRegExpCache = createNullObject(); function buildWildcardRegExp(path3) { return wildcardRegExpCache[path3] ??= new RegExp( @@ -7178,7 +7178,7 @@ var RegExpRouter = class { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js var SmartRouter = class { name = "SmartRouter"; #routers = []; @@ -7233,7 +7233,7 @@ var SmartRouter = class { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js var emptyParams = createNullObject(); var order = 0; var Node2 = class _Node2 { @@ -7393,7 +7393,7 @@ var Node2 = class _Node2 { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js var TrieRouter = class { name = "TrieRouter"; #node = new Node2(); @@ -7407,7 +7407,7 @@ var TrieRouter = class { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js var Hono2 = class extends Hono { /** * Creates an instance of the Hono class. @@ -7422,7 +7422,7 @@ var Hono2 = class extends Hono { } }; -// node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js +// ../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js var cors = (options) => { const opts = { origin: "*", @@ -7507,11 +7507,11 @@ var cors = (options) => { }; }; -// apps/server/src/create-server.ts +// ../../apps/server/src/create-server.ts import path2 from "node:path"; import { fileURLToPath } from "node:url"; -// node_modules/.pnpm/ws@8.21.3/node_modules/ws/wrapper.mjs +// ../../node_modules/.pnpm/ws@8.21.3/node_modules/ws/wrapper.mjs var import_stream3 = __toESM(require_stream(), 1); var import_extension = __toESM(require_extension(), 1); var import_permessage_deflate = __toESM(require_permessage_deflate(), 1); @@ -7521,12 +7521,12 @@ var import_subprotocol = __toESM(require_subprotocol(), 1); var import_websocket = __toESM(require_websocket(), 1); var import_websocket_server = __toESM(require_websocket_server(), 1); -// packages/graph-store/src/index.ts +// ../graph-store/src/index.ts import { DatabaseSync } from "node:sqlite"; import fs from "node:fs"; import path from "node:path"; -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js var external_exports = {}; __export(external_exports, { BRAND: () => BRAND, @@ -7638,7 +7638,7 @@ __export(external_exports, { void: () => voidType }); -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js var util; (function(util2) { util2.assertEqual = (_) => { @@ -7772,7 +7772,7 @@ var getParsedType = (data) => { } }; -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js var ZodIssueCode = util.arrayToEnum([ "invalid_type", "invalid_literal", @@ -7890,7 +7890,7 @@ ZodError.create = (issues) => { return error; }; -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js var errorMap = (issue, _ctx) => { let message; switch (issue.code) { @@ -7993,7 +7993,7 @@ var errorMap = (issue, _ctx) => { }; var en_default = errorMap; -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js var overrideErrorMap = en_default; function setErrorMap(map) { overrideErrorMap = map; @@ -8002,7 +8002,7 @@ function getErrorMap() { return overrideErrorMap; } -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js var makeIssue = (params) => { const { data, path: path3, errorMaps, issueData } = params; const fullPath = [...path3, ...issueData.path || []]; @@ -8112,14 +8112,14 @@ var isDirty = (x) => x.status === "dirty"; var isValid = (x) => x.status === "valid"; var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js var errorUtil; (function(errorUtil2) { errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message; })(errorUtil || (errorUtil = {})); -// node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +// ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js var ParseInputLazyPath = class { constructor(parent, value, path3, key) { this._cachedPath = []; @@ -11567,7 +11567,7 @@ var coerce = { }; var NEVER = INVALID; -// packages/shared/src/types.ts +// ../shared/src/types.ts var StylePresetSchema = external_exports.enum([ "default", "title", @@ -11583,7 +11583,7 @@ var RiskProfileSchema = external_exports.enum(["fast", "strict"]); var AgentModeSchema = external_exports.enum(["explore", "edit", "critique"]); var NodeBadgesSchema = external_exports.enum(["off", "icons", "tags"]); var InspectorModeSchema = external_exports.enum(["selection", "always"]); -var NodeViewModeSchema = external_exports.enum(["bubble", "card"]); +var NodeViewModeSchema = external_exports.enum(["bubble", "card", "topology"]); var NodeIconSchema = external_exports.enum([ "server", "database", @@ -11596,7 +11596,8 @@ var NodeIconSchema = external_exports.enum([ "check", "star", "gear", - "globe" + "globe", + "router" ]); var EdgeLineStyleSchema = external_exports.enum(["solid", "dashed", "dotted"]); var EdgeDirectionSchema = external_exports.enum(["forward", "both", "none"]); @@ -11706,7 +11707,7 @@ var ErrorCodeSchema = external_exports.enum([ "mode_denied" ]); -// packages/shared/src/ops.ts +// ../shared/src/ops.ts var OP_TYPES = [ "create_node", "batch_create", @@ -12002,6 +12003,12 @@ var OP_SCHEMA_DOC = { ], _comment: "Bulk relation/hierarchy links (max 100). Prefer after nodes exist." }, + { + type: "create_node", + text: "\u6838\u5FC3\u4EA4\u6362\u673A", + alias: "core_sw", + icon: "router" + }, { type: "create_node", text: "AIOps\u8BCA\u65AD", @@ -12140,8 +12147,9 @@ var OP_SCHEMA_DOC = { unlink: "Remove an edge. Prefer {type:'unlink', edgeId} (exact). Sugar: {from, to, kind?} with id|@alias|title \u2014 server resolves to edgeId when unique. If multiple edges share the same from+to(+kind), sugar is ambiguous \u2192 must use edgeId (label is NOT a disambiguator).", set_style_preset: "Field name is stylePreset (not preset). Example: {type:'set_style_preset', nodeId:'@x', stylePreset:'risk'}.", restore_node: "Soft-deleted nodes keep their id. Pass that id (or deleted @alias / unique title). Restores compatible incident edges; children already promoted stay under the new parent.", - create_node: "Omit parentId for top-level. Optional pos pins immediately. Optional alias. Optional relations[] for outgoing graph edges (not URL links). Optional description object.", - update_node_meta: "Patch note/description/tags/links/imageUrl/dueAt/startAt/accentColor/icon/alias. description is a JSON object (knowledge fields). Null clears scalar fields. links = URL bookmarks.", + create_node: "Omit parentId for top-level. Optional pos pins immediately. Optional alias. Optional icon (server|database|cloud|person|folder|doc|link|warning|check|star|gear|globe|router). Optional relations[] for outgoing graph edges (not URL links). Optional description object.", + update_node_meta: "Patch note/description/tags/links/imageUrl/dueAt/startAt/accentColor/icon/alias. icon enum same as create_node. description is a JSON object (knowledge fields). Null clears scalar fields. links = URL bookmarks.", + set_prefs: "Partial canvas prefs: density, branchColoring, nodeViewMode (bubble|card|topology; canvas-global), showHoverCard, nodeBadges, showRelationEdges, riskProfile, themeId, inspectorMode.", update_edge_meta: "Patch label/tags/note/weight(1-5)/lineStyle(solid|dashed|dotted)/direction(forward|both|none) on an edge.", set_edge_label: "Need edgeId from spatial_context.edges or get_subgraph.", reorder: 'Sibling order on primary hierarchy edge. Also unpins the node so auto-layout can move it. Example: {"type":"reorder","nodeId":"\u2026","order":0}. Optional afterSiblingId (null=first).', @@ -12157,7 +12165,7 @@ var OP_SCHEMA_DOC = { } }; -// packages/shared/src/resolve-ops.ts +// ../shared/src/resolve-ops.ts function newId(prefix = "n") { return `${prefix}_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; } @@ -12642,7 +12650,7 @@ function buildNodeIdMap(nodes, opts) { return map; } -// packages/shared/src/graph-query.ts +// ../shared/src/graph-query.ts function nodeFunction(n) { const d = n.description; if (!d || typeof d !== "object") return void 0; @@ -13055,7 +13063,7 @@ function resolveQueryNodeRef(nodes, token, opts) { }; } -// packages/shared/src/index.ts +// ../shared/src/index.ts function now() { return Date.now(); } @@ -13095,7 +13103,7 @@ function computeFitViewport(positions, opts) { return { x: -cx * zoom, y: -cy * zoom, zoom }; } -// packages/graph-core/src/index.ts +// ../graph-core/src/index.ts var GraphError = class extends Error { constructor(code, message) { super(message); @@ -13177,7 +13185,7 @@ function promoteChildrenOnDelete(g, nodeId) { } return inverse; } -function createEmptyGraph(title = "\u672A\u547D\u540D\u753B\u5E03", rootText) { +function createEmptyGraph(title = "\u672A\u547D\u540D\u753B\u5E03", rootText, prefsOverride) { const canvasId = newId2("c"); const nodeId = newId2("n"); const t = now(); @@ -13190,7 +13198,8 @@ function createEmptyGraph(title = "\u672A\u547D\u540D\u753B\u5E03", rootText) { nodeBadges: "icons", showHoverCard: true, inspectorMode: "selection", - nodeViewMode: "card" + nodeViewMode: "card", + ...prefsOverride }; const canvas = { id: canvasId, @@ -13970,7 +13979,7 @@ function toSnapshot(g) { }; } -// packages/graph-store/src/index.ts +// ../graph-store/src/index.ts var SCHEMA = ` CREATE TABLE IF NOT EXISTS meta ( key TEXT PRIMARY KEY, @@ -14200,8 +14209,8 @@ CREATE INDEX IF NOT EXISTS idx_snapshots_canvas ON snapshots(canvas_id); deletedAt: r.deleted_at != null ? Number(r.deleted_at) : null }; } - createCanvas(title, rootText) { - const g = createEmptyGraph(title ?? "\u672A\u547D\u540D\u753B\u5E03", rootText); + createCanvas(title, rootText, prefsOverride) { + const g = createEmptyGraph(title ?? "\u672A\u547D\u540D\u753B\u5E03", rootText, prefsOverride); this.persistGraph(g, true); this.cache.set(g.canvas.id, g); return g; @@ -14643,7 +14652,7 @@ CREATE INDEX IF NOT EXISTS idx_snapshots_canvas ON snapshots(canvas_id); } }; -// packages/dream-skin/src/skins.json +// ../dream-skin/src/skins.json var skins_default = [ { id: "abyss", @@ -14975,13 +14984,13 @@ var skins_default = [ } ]; -// packages/dream-skin/src/index.ts +// ../dream-skin/src/index.ts var SKINS = skins_default; function listSkins() { return SKINS; } -// node_modules/.pnpm/@ai-sdk+provider@1.1.3/node_modules/@ai-sdk/provider/dist/index.mjs +// ../../node_modules/.pnpm/@ai-sdk+provider@1.1.3/node_modules/@ai-sdk/provider/dist/index.mjs var marker = "vercel.ai.error"; var symbol = Symbol.for(marker); var _a; @@ -15264,7 +15273,7 @@ var UnsupportedFunctionalityError = class extends AISDKError { }; _a14 = symbol14; -// node_modules/.pnpm/nanoid@3.3.18/node_modules/nanoid/non-secure/index.js +// ../../node_modules/.pnpm/nanoid@3.3.18/node_modules/nanoid/non-secure/index.js var customAlphabet = (alphabet, defaultSize = 21) => { return (size = defaultSize) => { let id = ""; @@ -15276,7 +15285,7 @@ var customAlphabet = (alphabet, defaultSize = 21) => { }; }; -// node_modules/.pnpm/@ai-sdk+provider-utils@2.2.8_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs +// ../../node_modules/.pnpm/@ai-sdk+provider-utils@2.2.8_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs var import_secure_json_parse = __toESM(require_secure_json_parse(), 1); function combineHeaders(...headers) { return headers.reduce( @@ -15873,7 +15882,7 @@ function withoutTrailingSlash(url) { return url == null ? void 0 : url.replace(/\/$/, ""); } -// node_modules/.pnpm/@ai-sdk+openai@1.3.22_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs +// ../../node_modules/.pnpm/@ai-sdk+openai@1.3.22_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs function convertToOpenAIChatMessages({ prompt, useLegacyFunctionCalling = false, @@ -18613,7 +18622,7 @@ var openai = createOpenAI({ // strict for OpenAI API }); -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use"); var defaultOptions = { name: void 0, @@ -18647,7 +18656,7 @@ var getDefaultOptions = (options) => typeof options === "string" ? { ...options }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js var getRefs = (options) => { const _options = getDefaultOptions(options); const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath; @@ -18668,7 +18677,7 @@ var getRefs = (options) => { }; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/errorMessages.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/errorMessages.js function addErrorMessage(res, key, errorMessage, refs) { if (!refs?.errorMessages) return; @@ -18684,7 +18693,7 @@ function setResponseValueAndErrors(res, key, value, errorMessage, refs) { addErrorMessage(res, key, errorMessage, refs); } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js var getRelativePath = (pathA, pathB) => { let i = 0; for (; i < pathA.length && i < pathB.length; i++) { @@ -18694,7 +18703,7 @@ var getRelativePath = (pathA, pathB) => { return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/"); }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/any.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/any.js function parseAnyDef(refs) { if (refs.target !== "openAi") { return {}; @@ -18710,7 +18719,7 @@ function parseAnyDef(refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js function parseArrayDef(def, refs) { const res = { type: "array" @@ -18734,7 +18743,7 @@ function parseArrayDef(def, refs) { return res; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js function parseBigintDef(def, refs) { const res = { type: "integer", @@ -18780,24 +18789,24 @@ function parseBigintDef(def, refs) { return res; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js function parseBooleanDef() { return { type: "boolean" }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js function parseBrandedDef(_def, refs) { return parseDef(_def.type._def, refs); } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js var parseCatchDef = (def, refs) => { return parseDef(def.innerType._def, refs); }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js function parseDateDef(def, refs, overrideDateStrategy) { const strategy = overrideDateStrategy ?? refs.dateStrategy; if (Array.isArray(strategy)) { @@ -18856,7 +18865,7 @@ var integerDateParser = (def, refs) => { return res; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/default.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/default.js function parseDefaultDef(_def, refs) { return { ...parseDef(_def.innerType._def, refs), @@ -18864,12 +18873,12 @@ function parseDefaultDef(_def, refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js function parseEffectsDef(_def, refs) { return refs.effectStrategy === "input" ? parseDef(_def.schema._def, refs) : parseAnyDef(refs); } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js function parseEnumDef(def) { return { type: "string", @@ -18877,7 +18886,7 @@ function parseEnumDef(def) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js var isJsonSchema7AllOfType = (type) => { if ("type" in type && type.type === "string") return false; @@ -18919,7 +18928,7 @@ function parseIntersectionDef(def, refs) { } : void 0; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js function parseLiteralDef(def, refs) { const parsedType = typeof def.value; if (parsedType !== "bigint" && parsedType !== "number" && parsedType !== "boolean" && parsedType !== "string") { @@ -18939,7 +18948,7 @@ function parseLiteralDef(def, refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js var emojiRegex2 = void 0; var zodPatterns = { /** @@ -19264,7 +19273,7 @@ function stringifyRegExpWithFlags(regex, refs) { return pattern; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js function parseRecordDef(def, refs) { if (refs.target === "openAi") { console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."); @@ -19316,7 +19325,7 @@ function parseRecordDef(def, refs) { return schema; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/map.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/map.js function parseMapDef(def, refs) { if (refs.mapStrategy === "record") { return parseRecordDef(def, refs); @@ -19341,7 +19350,7 @@ function parseMapDef(def, refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js function parseNativeEnumDef(def) { const object2 = def.values; const actualKeys = Object.keys(def.values).filter((key) => { @@ -19355,7 +19364,7 @@ function parseNativeEnumDef(def) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/never.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/never.js function parseNeverDef(refs) { return refs.target === "openAi" ? void 0 : { not: parseAnyDef({ @@ -19365,7 +19374,7 @@ function parseNeverDef(refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/null.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/null.js function parseNullDef(refs) { return refs.target === "openApi3" ? { enum: ["null"], @@ -19375,7 +19384,7 @@ function parseNullDef(refs) { }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js var primitiveMappings = { ZodString: "string", ZodNumber: "number", @@ -19443,7 +19452,7 @@ var asAnyOf = (def, refs) => { return anyOf.length ? { anyOf } : void 0; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js function parseNullableDef(def, refs) { if (["ZodString", "ZodNumber", "ZodBigInt", "ZodBoolean", "ZodNull"].includes(def.innerType._def.typeName) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) { if (refs.target === "openApi3") { @@ -19475,7 +19484,7 @@ function parseNullableDef(def, refs) { return base && { anyOf: [base, { type: "null" }] }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/number.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/number.js function parseNumberDef(def, refs) { const res = { type: "number" @@ -19524,7 +19533,7 @@ function parseNumberDef(def, refs) { return res; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/object.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/object.js function parseObjectDef(def, refs) { const forceOptionalIntoNullable = refs.target === "openAi"; const result = { @@ -19594,7 +19603,7 @@ function safeIsOptional(schema) { } } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js var parseOptionalDef = (def, refs) => { if (refs.currentPath.toString() === refs.propertyPath?.toString()) { return parseDef(def.innerType._def, refs); @@ -19613,7 +19622,7 @@ var parseOptionalDef = (def, refs) => { } : parseAnyDef(refs); }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js var parsePipelineDef = (def, refs) => { if (refs.pipeStrategy === "input") { return parseDef(def.in._def, refs); @@ -19633,12 +19642,12 @@ var parsePipelineDef = (def, refs) => { }; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js function parsePromiseDef(def, refs) { return parseDef(def.type._def, refs); } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/set.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/set.js function parseSetDef(def, refs) { const items = parseDef(def.valueType._def, { ...refs, @@ -19658,7 +19667,7 @@ function parseSetDef(def, refs) { return schema; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js function parseTupleDef(def, refs) { if (def.rest) { return { @@ -19686,24 +19695,24 @@ function parseTupleDef(def, refs) { } } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js function parseUndefinedDef(refs) { return { not: parseAnyDef(refs) }; } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js function parseUnknownDef(refs) { return parseAnyDef(refs); } -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js var parseReadonlyDef = (def, refs) => { return parseDef(def.innerType._def, refs); }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js var selectParser = (def, typeName, refs) => { switch (typeName) { case ZodFirstPartyTypeKind.ZodString: @@ -19779,7 +19788,7 @@ var selectParser = (def, typeName, refs) => { } }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js function parseDef(def, refs, forceResolution = false) { const seenItem = refs.seen.get(def); if (refs.override) { @@ -19835,7 +19844,7 @@ var addMeta = (def, refs, jsonSchema2) => { return jsonSchema2; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js var zodToJsonSchema = (schema, options) => { const refs = getRefs(options); let definitions = typeof options === "object" && options.definitions ? Object.entries(options.definitions).reduce((acc, [name18, schema2]) => ({ @@ -19897,10 +19906,10 @@ var zodToJsonSchema = (schema, options) => { return combined; }; -// node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/index.js +// ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/index.js var esm_default = zodToJsonSchema; -// node_modules/.pnpm/@ai-sdk+ui-utils@1.2.11_zod@3.25.76/node_modules/@ai-sdk/ui-utils/dist/index.mjs +// ../../node_modules/.pnpm/@ai-sdk+ui-utils@1.2.11_zod@3.25.76/node_modules/@ai-sdk/ui-utils/dist/index.mjs var textStreamPart = { code: "0", name: "text", @@ -20626,13 +20635,13 @@ function asSchema(schema) { return isSchema(schema) ? schema : zodSchema(schema); } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js var _globalThis = typeof globalThis === "object" ? globalThis : global; -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/version.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/version.js var VERSION = "1.9.0"; -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/internal/semver.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/internal/semver.js var re = /^(\d+)\.(\d+)\.(\d+)(-(.+))?$/; function _makeCompatibilityCheck(ownVersion) { var acceptedVersions = /* @__PURE__ */ new Set([ownVersion]); @@ -20699,7 +20708,7 @@ function _makeCompatibilityCheck(ownVersion) { } var isCompatible = _makeCompatibilityCheck(VERSION); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js var major = VERSION.split(".")[0]; var GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major); var _global = _globalThis; @@ -20741,7 +20750,7 @@ function unregisterGlobal(type, diag) { } } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js var __read = function(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; @@ -20821,7 +20830,7 @@ function logProxy(funcName, namespace, args) { return logger[funcName].apply(logger, __spreadArray([], __read(args), false)); } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/types.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/types.js var DiagLogLevel; (function(DiagLogLevel2) { DiagLogLevel2[DiagLogLevel2["NONE"] = 0] = "NONE"; @@ -20833,7 +20842,7 @@ var DiagLogLevel; DiagLogLevel2[DiagLogLevel2["ALL"] = 9999] = "ALL"; })(DiagLogLevel || (DiagLogLevel = {})); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js function createLogLevelDiagLogger(maxLevel, logger) { if (maxLevel < DiagLogLevel.NONE) { maxLevel = DiagLogLevel.NONE; @@ -20858,7 +20867,7 @@ function createLogLevelDiagLogger(maxLevel, logger) { }; } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/diag.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/diag.js var __read2 = function(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; @@ -20950,7 +20959,7 @@ var DiagAPI = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/context/context.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/context/context.js function createContextKey(description) { return Symbol.for(description); } @@ -20979,7 +20988,7 @@ var BaseContext = ( ); var ROOT_CONTEXT = new BaseContext(); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js var __read3 = function(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; @@ -21034,7 +21043,7 @@ var NoopContextManager = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/context.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/context.js var __read4 = function(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; @@ -21102,14 +21111,14 @@ var ContextAPI = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js var TraceFlags; (function(TraceFlags2) { TraceFlags2[TraceFlags2["NONE"] = 0] = "NONE"; TraceFlags2[TraceFlags2["SAMPLED"] = 1] = "SAMPLED"; })(TraceFlags || (TraceFlags = {})); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js var INVALID_SPANID = "0000000000000000"; var INVALID_TRACEID = "00000000000000000000000000000000"; var INVALID_SPAN_CONTEXT = { @@ -21118,7 +21127,7 @@ var INVALID_SPAN_CONTEXT = { traceFlags: TraceFlags.NONE }; -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js var NonRecordingSpan = ( /** @class */ (function() { @@ -21163,7 +21172,7 @@ var NonRecordingSpan = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js var SPAN_KEY = createContextKey("OpenTelemetry Context Key SPAN"); function getSpan(context) { return context.getValue(SPAN_KEY) || void 0; @@ -21185,7 +21194,7 @@ function getSpanContext(context) { return (_a17 = getSpan(context)) === null || _a17 === void 0 ? void 0 : _a17.spanContext(); } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js var VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i; var VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i; function isValidTraceId(traceId) { @@ -21201,7 +21210,7 @@ function wrapSpanContext(spanContext) { return new NonRecordingSpan(spanContext); } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js var contextApi = ContextAPI.getInstance(); var NoopTracer = ( /** @class */ @@ -21251,7 +21260,7 @@ function isSpanContext(spanContext) { return typeof spanContext === "object" && typeof spanContext["spanId"] === "string" && typeof spanContext["traceId"] === "string" && typeof spanContext["traceFlags"] === "number"; } -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js var NOOP_TRACER = new NoopTracer(); var ProxyTracer = ( /** @class */ @@ -21284,7 +21293,7 @@ var ProxyTracer = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js var NoopTracerProvider = ( /** @class */ (function() { @@ -21297,7 +21306,7 @@ var NoopTracerProvider = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js var NOOP_TRACER_PROVIDER = new NoopTracerProvider(); var ProxyTracerProvider = ( /** @class */ @@ -21323,7 +21332,7 @@ var ProxyTracerProvider = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/status.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace/status.js var SpanStatusCode; (function(SpanStatusCode2) { SpanStatusCode2[SpanStatusCode2["UNSET"] = 0] = "UNSET"; @@ -21331,7 +21340,7 @@ var SpanStatusCode; SpanStatusCode2[SpanStatusCode2["ERROR"] = 2] = "ERROR"; })(SpanStatusCode || (SpanStatusCode = {})); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/trace.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/api/trace.js var API_NAME3 = "trace"; var TraceAPI = ( /** @class */ @@ -21374,10 +21383,10 @@ var TraceAPI = ( })() ); -// node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace-api.js +// ../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/esm/trace-api.js var trace = TraceAPI.getInstance(); -// node_modules/.pnpm/ai@4.3.16_react@19.2.8_zod@3.25.76/node_modules/ai/dist/index.mjs +// ../../node_modules/.pnpm/ai@4.3.16_react@19.2.8_zod@3.25.76/node_modules/ai/dist/index.mjs var __defProp2 = Object.defineProperty; var __export2 = (target, all) => { for (var name17 in all) @@ -25356,13 +25365,23 @@ function trimStartOfStream() { } var HANGING_STREAM_WARNING_TIME_MS = 15 * 1e3; -// packages/layout-engine/src/index.ts +// ../layout-engine/src/index.ts var import_d3_flextree = __toESM(require_d3_flextree(), 1); var DENSITY = { comfortable: { gapX: 80, gapY: 40, nodeW: 212, nodeH: 60, pad: 20 }, compact: { gapX: 52, gapY: 28, nodeW: 168, nodeH: 48, pad: 12 } }; function nodeLayoutSize(node, dens, opts) { + if (opts?.asTopology) { + const icon = dens.nodeW >= 200 ? 36 : 30; + const caption = dens.nodeW >= 200 ? 20 : 18; + const gap = 6; + const pad = dens.nodeW >= 200 ? 8 : 6; + return { + w: Math.max(dens.nodeW >= 200 ? 88 : 72, icon + pad * 2), + h: icon + gap + caption + pad + }; + } let w = dens.nodeW; let h = dens.nodeH; const hasMeta = Boolean(node.tags?.length) || Boolean(node.links?.length) || Boolean(node.dueAt) || Boolean(node.note); @@ -25371,19 +25390,28 @@ function nodeLayoutSize(node, dens, opts) { const preset = node.stylePreset ?? "default"; const asCard = Boolean(opts?.asCard) || preset === "card"; if (asCard) { - const w2 = dens.nodeW >= 200 ? 288 : 248; + const cardW = dens.nodeW >= 200 ? 288 : 248; const gap = 10; + const headerH = 40; + const padY = 12; let body = 0; - if (node.note) body += 32 + gap; - if (node.imageUrl) body += 68 + gap; - if (node.tags?.length) body += 32 + gap; - if (node.links?.length) body += 32 + gap; - if (node.startAt != null) body += 32 + gap; - if (node.dueAt != null) body += 32 + gap; - if (node.pinned) body += 32 + gap; + if (node.imageUrl) body += (dens.nodeW >= 200 ? 108 : 90) + gap; + if (node.note) body += (dens.nodeW >= 200 ? 48 : 40) + gap; + const descCount = node.description ? Math.min( + 6, + Object.values(node.description).filter( + (v) => v != null && String(v).trim() !== "" + ).length + ) : 0; + if (descCount) body += descCount * 18 + Math.max(0, descCount - 1) * 4 + gap; + const hasFooter = Boolean(node.tags?.length) || Boolean(node.links?.length) || node.startAt != null || node.dueAt != null || Boolean(node.pinned); + if (hasFooter) body += 24 + gap; if (body > 0) body -= gap; - const h2 = 36 + 24 + Math.max(body, 12); - return { w: w2, h: Math.max(h2, dens.nodeW >= 200 ? 100 : 84) }; + const cardH = headerH + padY * 2 + Math.max(body, 8); + return { + w: cardW, + h: Math.max(cardH, dens.nodeW >= 200 ? 104 : 88) + }; } if (preset === "title") { w *= 1.2; @@ -25493,7 +25521,7 @@ function assignSides(focusId, nodesById, children) { } return sideOf; } -function buildSubtree(id, nodesById, children, dens, path3, asCard, childFilter) { +function buildSubtree(id, nodesById, children, dens, path3, sizeOpts, childFilter) { if (path3.has(id)) return null; const node = nodesById.get(id); if (!node || node.deletedAt) return null; @@ -25509,12 +25537,12 @@ function buildSubtree(id, nodesById, children, dens, path3, asCard, childFilter) children, dens, nextPath, - asCard + sizeOpts ); if (child) kids.push(child); } } - const box = nodeLayoutSize(node, dens, { asCard }); + const box = nodeLayoutSize(node, dens, sizeOpts); return { id, // flextree size = full box + gutters (claim real space, not a rigid grid cell) @@ -25604,6 +25632,7 @@ function hierarchyFingerprint(edges) { function layout(input) { const dens = DENSITY[input.density ?? "comfortable"]; const asCard = input.nodeViewMode === "card"; + const asTopology = input.nodeViewMode === "topology"; const nodesById = new Map(input.nodes.map((n) => [n.id, n])); if (!nodesById.has(input.focusNodeId)) return {}; const hidden = nodesHiddenByCollapse(input.nodes, input.edges); @@ -25611,7 +25640,7 @@ function layout(input) { const sizes = /* @__PURE__ */ new Map(); for (const n of input.nodes) { if (n.deletedAt || hidden.has(n.id)) continue; - sizes.set(n.id, nodeLayoutSize(n, dens, { asCard })); + sizes.set(n.id, nodeLayoutSize(n, dens, { asCard, asTopology })); } const prev = input.prevPositions; const fp = hierarchyFingerprint(input.edges); @@ -25682,7 +25711,7 @@ function layout(input) { children, dens, /* @__PURE__ */ new Set(), - asCard, + { asCard, asTopology }, (childId) => sideOf.get(childId) === side ); if (!tree?.children?.length) continue; @@ -25741,7 +25770,7 @@ function layout(input) { return positions; } -// apps/server/src/tools.ts +// ../../apps/server/src/tools.ts var activityByCanvas = /* @__PURE__ */ new Map(); function prepareOps(store, canvasId, rawOps) { if (!Array.isArray(rawOps)) { @@ -26031,8 +26060,8 @@ function finalizeAutoFit(store, canvasId, padding = 50) { return viewport; } function estimateOverlaps(nodes, positions, nodeViewMode, anchorId) { - const w = nodeViewMode === "card" ? 180 : 120; - const h = nodeViewMode === "card" ? 72 : 36; + const w = nodeViewMode === "card" ? 180 : nodeViewMode === "topology" ? 88 : 120; + const h = nodeViewMode === "card" ? 72 : nodeViewMode === "topology" ? 64 : 36; const ids = nodes.filter((n) => !n.deletedAt && n.id !== anchorId && positions[n.id]).map((n) => n.id); const pairs = []; for (let i = 0; i < ids.length; i++) { @@ -26228,11 +26257,24 @@ async function runTool(name17, rawArgs, ctx) { case "mindmap_create_canvas": { const title = String(rawArgs.title || "\u672A\u547D\u540D\u753B\u5E03"); const rootText = rawArgs.rootText != null && String(rawArgs.rootText).trim() ? String(rawArgs.rootText) : void 0; - const g = ctx.store.createCanvas(title, rootText); + const prefsArg = rawArgs.prefs && typeof rawArgs.prefs === "object" ? rawArgs.prefs : void 0; + const viewParsed = NodeViewModeSchema.safeParse( + rawArgs.nodeViewMode ?? prefsArg?.nodeViewMode + ); + const g = ctx.store.createCanvas( + title, + rootText, + viewParsed.success ? { nodeViewMode: viewParsed.data } : void 0 + ); return { ok: true, - canvas: { id: g.canvas.id, title: g.canvas.title, rev: g.canvas.rev }, - hint: "Canvas is empty visually. Create top-level nodes with {type:'create_node', text:'...'} (omit parentId). Use parentId only when nesting under an existing visible node." + canvas: { + id: g.canvas.id, + title: g.canvas.title, + rev: g.canvas.rev, + prefs: { nodeViewMode: g.canvas.prefs.nodeViewMode } + }, + hint: g.canvas.prefs.nodeViewMode === "topology" ? "Topology canvas: create NE nodes with icon:'router'. Omit parentId for top-level. Prefer straight hierarchy/relation links." : "Canvas is empty visually. Create top-level nodes with {type:'create_node', text:'...'} (omit parentId). Use parentId only when nesting under an existing visible node." }; } case "mindmap_open_canvas": { @@ -26509,21 +26551,34 @@ async function runTool(name17, rawArgs, ctx) { snap.canvas.title, anchorId ); + if (format === "png") { + return { + ok: true, + format: "svg", + requestedFormat: "png", + title: snap.canvas.title, + mimeType: "image/svg+xml", + svg, + nodeCount: publicNodes.length, + edgeCount: publicEdges.length, + hint: "PNG raster needs the web UI toolbar button (system fonts). This tool returns SVG which pastes into docs/PPT; save as .svg or convert locally." + }; + } return { ok: true, - format: format === "png" ? "svg" : "svg", + format: "svg", title: snap.canvas.title, mimeType: "image/svg+xml", svg, nodeCount: publicNodes.length, edgeCount: publicEdges.length, - hint: format === "png" ? "Agent export returns SVG (vector). For raster PNG use the web UI\u300C\u5BFC\u51FAPNG\u300D; SVG pastes into docs/PPT as well." : "SVG can be saved as .svg or opened in browser / Office." + hint: "SVG can be saved as .svg or opened in browser / Office." }; } return { ok: false, error: "invalid_op", - message: 'format must be "json" | "md" | "svg" (png \u2192 svg for agents; UI has raster PNG)' + message: 'format must be "json" | "md" | "svg" | "png"' }; } case "mindmap_get_node": { @@ -26836,20 +26891,11 @@ async function runTool(name17, rawArgs, ctx) { "edge_note", "all" ], - nodeIcons: [ - "server", - "database", - "cloud", - "person", - "folder", - "doc", - "link", - "warning", - "check", - "star", - "gear", - "globe" - ], + nodeIcons: NodeIconSchema.options, + nodeViewModes: NodeViewModeSchema.options, + createCanvas: { + nodeViewMode: "Optional on mindmap_create_canvas (canvas-global). Also changeable later via set_prefs." + }, edgeLineStyles: ["solid", "dashed", "dotted"], edgeDirections: ["forward", "both", "none"], getSubgraph: { @@ -27305,7 +27351,7 @@ async function runTool(name17, rawArgs, ctx) { } } -// apps/server/src/chat.ts +// ../../apps/server/src/chat.ts function llmConfigured() { return Boolean(process.env.LLM_API_KEY || process.env.OPENAI_API_KEY); } @@ -27346,9 +27392,10 @@ function createChatHandler(ctx) { 8. \u56FA\u5B9A\u5750\u6807\u7528 set_pinned \u6216 create_node \u5E26 pos\uFF1B\u4E0D\u786E\u5B9A\u65F6 mindmap_get_schema\u3002 9. \u8282\u70B9\u5C5E\u6027\uFF1A\u6807\u9898\u7528 update_text\uFF1B\u63CF\u8FF0/\u591A\u6807\u7B7E/\u591A\u94FE\u63A5/\u56FE\u7247URL/\u65F6\u95F4\u7528 update_node_meta\uFF08patch\uFF09\uFF1B\u8FB9\u7528 update_edge_meta \u6216 set_edge_label\u3002 10. \u8282\u70B9\u7C7B\u578B stylePreset\uFF1Adefault|card|title|decision|risk|note|muted\uFF08title \u4EC5\u753B\u5E03\u951A\u70B9\uFF0C\u52FF\u65B0\u5EFA\uFF1Bcard=\u65B0\u95FB\u5FEB\u7167\u5361\u7247\uFF0C\u914D\u56FE\u7528 imageUrl\u3001\u6458\u8981\u7528 note\u3001\u6765\u6E90\u7528 links\uFF09\u3002 -11. \u540C\u7EA7\u6392\u5E8F\u7528 reorder\uFF1A\u4F18\u5148 {"type":"reorder","nodeId":"...","order":10}\uFF1B\u4E5F\u53EF\u7528 afterSiblingId\uFF08null=\u7F6E\u9876\uFF09\u3002 -12. \u6298\u53E0 set_collapsed \u4F1A\u9690\u85CF\u8BE5\u8282\u70B9\u4E3B\u7236\u94FE\u4E0B\u7684\u5168\u90E8\u5B50\u5B59\u5E76\u91CD\u65B0\u5E03\u5C40\uFF1B\u5C55\u5F00\u540E\u6062\u590D\u3002 -13. \u95EE\u56FE\uFF1A\u7528 mindmap_query\uFF08neighbors|path|stats|orphans|missing_meta\uFF09\uFF1B\u7B54\u5B8C\u53EF\u7528 mindmap_highlight \u9AD8\u4EAE\u8DEF\u5F84\uFF1B\u7EC6\u8282\u7528 mindmap_get_node / mindmap_get_edge\u3002\u7981\u6B62\u7F16\u9020\u56FE\u4E2D\u6CA1\u6709\u7684\u4E8B\u5B9E\u3002 +11. \u8282\u70B9\u56FE\u6807 icon\uFF08create_node / update_node_meta.patch\uFF09\uFF1Aserver|database|cloud|person|folder|doc|link|warning|check|star|gear|globe|router\u3002\u62D3\u6251\u6392\u969C\u56FE\uFF1A\u5EFA\u753B\u5E03\u65F6\u53EF\u7528 mindmap_create_canvas({ title, nodeViewMode:"topology" })\uFF0C\u8282\u70B9 icon:"router"\uFF1BnodeViewMode \u662F\u753B\u5E03\u5168\u5C40\u504F\u597D\uFF0C\u4E5F\u53EF\u4E8B\u540E set_prefs \u4FEE\u6539\u3002 +12. \u540C\u7EA7\u6392\u5E8F\u7528 reorder\uFF1A\u4F18\u5148 {"type":"reorder","nodeId":"...","order":10}\uFF1B\u4E5F\u53EF\u7528 afterSiblingId\uFF08null=\u7F6E\u9876\uFF09\u3002 +13. \u6298\u53E0 set_collapsed \u4F1A\u9690\u85CF\u8BE5\u8282\u70B9\u4E3B\u7236\u94FE\u4E0B\u7684\u5168\u90E8\u5B50\u5B59\u5E76\u91CD\u65B0\u5E03\u5C40\uFF1B\u5C55\u5F00\u540E\u6062\u590D\u3002 +14. \u95EE\u56FE\uFF1A\u7528 mindmap_query\uFF08neighbors|path|stats|orphans|missing_meta\uFF09\uFF1B\u7B54\u5B8C\u53EF\u7528 mindmap_highlight \u9AD8\u4EAE\u8DEF\u5F84\uFF1B\u7EC6\u8282\u7528 mindmap_get_node / mindmap_get_edge\u3002\u7981\u6B62\u7F16\u9020\u56FE\u4E2D\u6CA1\u6709\u7684\u4E8B\u5B9E\u3002 \u5F53\u524D\u7A7A\u95F4\u4E0A\u4E0B\u6587\uFF08\u6458\u8981\uFF09\uFF1A ${JSON.stringify(spatial, null, 0).slice(0, 6e3)} @@ -27474,7 +27521,7 @@ ${JSON.stringify(spatial, null, 0).slice(0, 6e3)} }; } -// apps/server/src/create-server.ts +// ../../apps/server/src/create-server.ts function bridgeBase() { return (process.env.MINDMAP_DSH_BRIDGE || "").replace(/\/$/, ""); } @@ -27564,7 +27611,13 @@ function startMindMapServer(options = {}) { ); app.post("/api/canvases", async (c) => { const body = await c.req.json().catch(() => ({})); - const g = store.createCanvas(body.title, body.rootText); + const viewRaw = body.nodeViewMode ?? body.prefs?.nodeViewMode; + const parsed = NodeViewModeSchema.safeParse(viewRaw); + const g = store.createCanvas( + body.title, + body.rootText, + parsed.success ? { nodeViewMode: parsed.data } : void 0 + ); broadcast({ type: "canvas/created", canvasId: g.canvas.id }); return c.json(clientCanvasPayload(store, g.canvas.id)); }); @@ -27743,6 +27796,28 @@ function startMindMapServer(options = {}) { return c.json({ ok: false, error: "not_found" }, 404); } }); + app.get("/api/canvases/:id/export.svg", async (c) => { + try { + const id = c.req.param("id"); + const result = await runTool( + "mindmap_export", + { format: "svg", canvasId: id }, + { store, broadcast, defaultCanvasId: id } + ); + if (!result?.ok || typeof result.svg !== "string") { + return c.json({ ok: false, error: "export_failed" }, 400); + } + const safe = String(result.title ?? "mindmap").replace(/[\\/:*?"<>|]+/g, "_") || "mindmap"; + return new Response(result.svg, { + headers: { + "Content-Type": "image/svg+xml; charset=utf-8", + "Content-Disposition": `attachment; filename="${safe}.svg"` + } + }); + } catch { + return c.json({ ok: false, error: "not_found" }, 404); + } + }); app.post("/api/tools/:name", async (c) => { const name17 = c.req.param("name"); const args = await c.req.json().catch(() => ({})); @@ -27981,7 +28056,6 @@ function startMindMapServer(options = {}) { } }); const webDistAbs = resolveWebDist(root); - const webDistRel = path2.relative(process.cwd(), webDistAbs) || "."; if (fs2.existsSync(path2.join(webDistAbs, "index.html"))) { app.use( "/*", @@ -28063,5 +28137,5 @@ function startMindMapServer(options = {}) { }; } -// apps/server/src/index.ts +// ../../apps/server/src/index.ts startMindMapServer(); diff --git a/packages/dsh-plugin/bundle/web/assets/index-BK6FV7kG.css b/packages/dsh-plugin/bundle/web/assets/index-BK6FV7kG.css deleted file mode 100644 index 2b17ea7..0000000 --- a/packages/dsh-plugin/bundle/web/assets/index-BK6FV7kG.css +++ /dev/null @@ -1 +0,0 @@ -.ns-editor{--ns-bg: var(--dsw-alias-bg-layer-1, #1b1e28);--ns-border: var(--dsw-alias-border-l1, rgba(255, 255, 255, .1));--ns-label: var(--dsw-alias-label-secondary, #a5adb8);--ns-text: var(--dsw-alias-label-primary, #f4f5f7);--ns-brand: var(--dsw-alias-brand-primary, #5e6ad2);--ns-input: rgba(255, 255, 255, .04);--ns-font: "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", system-ui, sans-serif;display:flex;flex-direction:column;gap:0;background:var(--ns-bg);border:1px solid var(--ns-border);border-radius:14px;overflow:visible;box-shadow:0 1px #ffffff0a inset,0 10px 32px #00000061;color:var(--ns-text);font-family:var(--ns-font);font-size:12.5px;line-height:1.45;min-width:248px;max-width:320px}.ns-editor--panel{box-shadow:none;max-width:none;width:100%;background:transparent;border:none;border-radius:0}.ns-editor__header{display:flex;align-items:center;gap:10px;padding:10px 12px;background:linear-gradient(180deg,#00000047,#00000024);border-bottom:1px solid var(--ns-border);border-radius:14px 14px 0 0;cursor:grab;-webkit-user-select:none;user-select:none;overflow:hidden}.ns-editor__header:active{cursor:grabbing}.ns-editor__dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;background:var(--ns-brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--ns-brand) 28%,transparent)}.ns-editor__title{flex:1;min-width:0;border:none;background:transparent;color:var(--ns-text);font-family:inherit;font-weight:600;font-size:13.5px;letter-spacing:.01em;padding:2px 0;outline:none}.ns-editor__title:focus{box-shadow:inset 0 -1.5px 0 var(--ns-brand)}.ns-editor__body{display:flex;flex-direction:column;gap:2px;padding:8px 10px 10px}.ns-row{display:grid;grid-template-columns:1fr;gap:4px;align-items:start;padding:8px 6px;border-radius:8px}.ns-row:hover{background:#ffffff09}.ns-row__label{color:var(--ns-label);font-size:11px;font-weight:500;letter-spacing:.02em;line-height:1.2;-webkit-user-select:none;user-select:none}.ns-row__ctrl{min-width:0;display:flex;gap:6px;align-items:flex-start}.ns-row__ctrl input,.ns-row__ctrl textarea,.ns-row__ctrl select{flex:1;width:100%;border:1px solid transparent;background:var(--ns-input);color:var(--ns-text);font-family:inherit;font-size:12.5px;border-radius:8px;padding:7px 10px;outline:none;resize:vertical;transition:border-color .12s ease,background .12s ease;color-scheme:dark}.ns-row__ctrl select option{color:#f4f5f7;background:#1b1e28}.ns-row__ctrl input:focus,.ns-row__ctrl textarea:focus,.ns-row__ctrl select:focus{border-color:color-mix(in srgb,var(--ns-brand) 70%,transparent);background:#ffffff0e}.ns-row__clear{border:none;background:transparent;color:var(--ns-label);padding:6px;font-size:11px;line-height:1;opacity:.65;border-radius:6px;flex-shrink:0}.ns-row__clear:hover{opacity:1;color:var(--ns-text);background:#ffffff0f}.ns-thumb{width:100%;max-height:140px;height:auto;object-fit:contain;object-position:center;border-radius:8px;background:#00000038;display:block;margin-bottom:6px}.ns-row__ctrl--image{flex-direction:column;align-items:stretch;gap:6px}.ns-image-actions{display:flex;gap:6px;align-items:center;width:100%}.ns-image-pick{flex-shrink:0;border:1px solid var(--ns-border);background:#ffffff0f;color:var(--ns-text);border-radius:8px;padding:7px 10px;font-family:inherit;font-size:12px;cursor:pointer}.ns-image-pick:hover:not(:disabled){border-color:var(--ns-brand)}.ns-image-pick:disabled{opacity:.6;cursor:wait}.ns-image-url{flex:1;min-width:0}.ns-image-hint{font-size:10.5px;color:var(--ns-label);line-height:1.3}.ns-image-err{font-size:11px;color:#f87171}.ns-add{margin:2px 10px 10px;position:relative;z-index:6}.ns-add__btn{width:100%;border:1px dashed color-mix(in srgb,var(--ns-border) 80%,transparent);background:transparent;color:var(--ns-label);border-radius:10px;padding:8px 10px;font-family:inherit;font-size:11.5px;cursor:pointer;transition:border-color .12s ease,color .12s ease,background .12s ease}.ns-add__btn:hover{border-color:var(--ns-brand);color:var(--ns-text);background:#ffffff08}.ns-add__menu{position:absolute;left:0;right:0;top:calc(100% + 6px);bottom:auto;background:var(--ns-bg);border:1px solid var(--ns-border);border-radius:10px;padding:4px;z-index:20;box-shadow:0 12px 28px #00000073;max-height:220px;overflow:auto;pointer-events:auto}.ns-add__item{display:block;width:100%;text-align:left;border:none;background:transparent;color:var(--ns-text);font-family:inherit;padding:8px 10px;border-radius:8px;font-size:12px}.ns-add__item:hover{background:#ffffff12}.ns-overlay{position:absolute;z-index:8;pointer-events:none;transform-origin:center center}.ns-editor{pointer-events:none}.ns-editor--panel,.ns-editor__title,.ns-editor__body,.ns-add{pointer-events:auto}:root{color:var(--dsw-alias-label-primary, #f4f5f7);background:var(--dsw-alias-bg-base, #101014);font-family:Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:13px;line-height:1.45}*{box-sizing:border-box}html,body,#root{margin:0;height:100%;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-specific-selector, rgba(255, 255, 255, .08));border-radius:8px;padding:6px 10px}button:hover{background:var(--dsw-alias-interactive-bg-hover, rgba(94, 106, 210, .16))}button.primary{background:var(--dsw-alias-brand-primary, #5e6ad2);color:var(--dsw-alias-brand-text, #fff);border-color:transparent}input{background:var(--dsw-specific-input-major, rgba(255, 255, 255, .08));border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));border-radius:8px;padding:6px 8px;outline:none}.app-shell{display:grid;grid-template-rows:48px 1fr;height:100%}.app-shell.embed{grid-template-rows:1fr}.embed-main{display:grid!important;grid-template-columns:1fr!important;grid-template-rows:1fr;min-height:0;height:100%}.topbar{display:flex;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-alias-bg-layer-1, #1b1e28)}.topbar .brand{font-weight:650;letter-spacing:.02em;margin-right:8px}.topbar .spacer{flex:1}.main{display:grid;grid-template-columns:var(--left, 240px) 1fr;min-height:0}.main.left-collapsed{grid-template-columns:1fr}.panel{min-width:0;min-height:0;border-right:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-specific-sidebar-fill, rgba(16, 16, 20, .92));display:flex;flex-direction:column}.panel-header{padding:10px 12px;font-weight:600;color:var(--dsw-alias-label-secondary, #a5adb8);border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08))}.panel-body{flex:1;overflow:auto;padding:8px}.canvas-host{position:relative;min-width:0;min-height:0;background:var(--dsw-alias-bg-base, #101014)}.canvas-host canvas{width:100%;height:100%;display:block;touch-action:none}.canvas-list-item,.outline-item{padding:8px 10px;border-radius:8px;margin-bottom:4px;cursor:pointer;color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-list-item:hover,.outline-item:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .05))}.canvas-list-item.active,.outline-item.active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .09))}.muted{color:var(--dsw-alias-label-tertiary, #7b838f)}.skin-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.skin-swatch{height:28px;border-radius:6px;border:2px solid transparent;cursor:pointer}.skin-swatch.active{border-color:var(--dsw-alias-brand-primary, #5e6ad2)}.proposal-box{padding:8px 10px;border-top:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));max-height:180px;overflow:auto}.proposal-item{padding:8px;border-radius:8px;margin-bottom:6px;background:var(--dsw-specific-selector, rgba(255, 255, 255, .06))}.canvas-hint{position:absolute;left:56px;bottom:10px;font-size:12px;pointer-events:none;opacity:.75;max-width:calc(100% - 240px);z-index:1}.canvas-controls{position:absolute;left:12px;bottom:12px;z-index:4;display:flex;flex-direction:column;overflow:hidden;border-radius:8px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 92%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 4px 18px #00000047}.canvas-controls__btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0;margin:0;border:0;border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .1));border-radius:0;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);cursor:pointer}.canvas-controls__btn:last-child{border-bottom:0}.canvas-controls__btn:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .06));color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-controls__btn.is-active{color:var(--dsw-alias-state-warning, #d4a017);background:#d4a0171f}.canvas-controls__btn svg{display:block}.canvas-toolbar{position:absolute;top:10px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 92%,transparent);border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .1));-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:4;box-shadow:0 4px 18px #00000038;max-width:calc(100% - 24px)}.canvas-toolbar__group{display:flex;align-items:center;gap:2px}.canvas-toolbar__sep{width:1px;height:18px;background:var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));margin:0 2px}.canvas-toolbar__zoom{font-size:11px;color:var(--dsw-alias-label-tertiary, #7b838f);min-width:36px;text-align:right;padding-left:4px}.canvas-tool-btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);font-size:12px;line-height:1;padding:6px 9px;border-radius:7px;cursor:pointer;white-space:nowrap}.canvas-tool-btn:disabled{opacity:.35;cursor:default}.canvas-tool-btn:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .06));color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-tool-btn.is-active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .1));color:var(--dsw-alias-brand-primary, #5e6ad2)}.canvas-style-menu{position:relative}.canvas-style-menu__trigger:disabled{opacity:.45}.canvas-style-menu__panel{position:absolute;left:0;top:calc(100% + 6px);z-index:40;min-width:112px;padding:4px;border-radius:8px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:var(--dsw-alias-bg-layer-1, #1b1e28);box-shadow:0 10px 28px #00000073;display:flex;flex-direction:column;gap:2px}.canvas-style-menu__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);font-size:12px;text-align:left;padding:7px 10px;border-radius:6px;cursor:pointer}.canvas-style-menu__item:hover{background:#ffffff14;color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-style-menu__item.is-active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .1));color:var(--dsw-alias-brand-primary, #5e6ad2)}.canvas-host.is-locked .canvas-tool-btn.is-active{color:var(--dsw-alias-state-warning, #d4a017)}.canvas-minimap{position:absolute;right:12px;bottom:12px;width:168px;height:118px;border-radius:10px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .14));background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 88%,transparent);box-shadow:0 6px 20px #00000047;cursor:crosshair;z-index:3}.canvas-minimap canvas{display:block;width:100%;height:100%}.trash-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-radius:8px;margin-bottom:4px;background:var(--dsw-specific-selector, rgba(255, 255, 255, .06))}.trash-item button{padding:4px 8px;font-size:12px}.node-handles{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:4}.node-handle{position:absolute;pointer-events:auto;width:20px;height:20px;border-radius:999px;border:1px solid var(--dsw-alias-brand-primary, #5e6ad2);background:var(--dsw-alias-bg-layer-1, #1b1e28);color:var(--dsw-alias-brand-primary, #5e6ad2);font-size:14px;line-height:1;padding:0;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #00000059}.node-handle:hover{background:var(--dsw-alias-brand-primary, #5e6ad2);color:var(--dsw-alias-brand-text, #fff)}.hover-card{position:absolute;z-index:5;max-width:280px;min-width:180px;padding:12px 14px;border-radius:14px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:color-mix(in srgb,var(--dsw-alias-bg-layer-1, #1b1e28) 92%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:0 1px #ffffff0d inset,0 12px 36px #0000006b;pointer-events:none;font-family:Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Noto Sans SC,system-ui,sans-serif}.hover-card__title{font-weight:600;font-size:13.5px;letter-spacing:.01em;line-height:1.35;margin-bottom:6px;color:var(--dsw-alias-label-primary, #f4f5f7)}.hover-card__note{font-size:12px;line-height:1.45;color:var(--dsw-alias-label-secondary, #a5adb8);margin-bottom:8px}.hover-card__tags{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.hover-card__tag{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;background:#ffffff12;border:1px solid rgba(255,255,255,.06);color:var(--dsw-alias-label-secondary, #a5adb8)}.hover-card__meta{font-size:11px;color:var(--dsw-alias-label-tertiary, #7b838f);line-height:1.35}.edit-overlay{position:absolute;z-index:6;min-width:140px;padding:6px 10px;border-radius:10px;border:1px solid var(--dsw-alias-brand-primary, #5e6ad2);background:var(--dsw-alias-bg-layer-1, #1b1e28);color:var(--dsw-alias-label-primary, #f4f5f7);font:600 13px Segoe UI,PingFang SC,Microsoft YaHei,system-ui,sans-serif;box-shadow:0 8px 24px #0006;outline:none}.inspector{display:flex;flex-direction:column;gap:10px;padding:4px 0 12px}.inspector__title{font-weight:600;font-size:13px}.inspector__field{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--dsw-alias-label-secondary, #a5adb8)}.inspector__field input,.inspector__field textarea,.inspector__field select{width:100%;color:var(--dsw-alias-label-primary, #f4f5f7)}.inspector__field textarea{resize:vertical;min-height:56px}.inspector__row{display:flex;gap:8px;flex-wrap:wrap} diff --git a/packages/dsh-plugin/bundle/web/assets/index-B_0PHR0v.js b/packages/dsh-plugin/bundle/web/assets/index-B_0PHR0v.js new file mode 100644 index 0000000..c9000c3 --- /dev/null +++ b/packages/dsh-plugin/bundle/web/assets/index-B_0PHR0v.js @@ -0,0 +1,51 @@ +(function(){const f=document.createElement("link").relList;if(f&&f.supports&&f.supports("modulepreload"))return;for(const m of document.querySelectorAll('link[rel="modulepreload"]'))o(m);new MutationObserver(m=>{for(const v of m)if(v.type==="childList")for(const _ of v.addedNodes)_.tagName==="LINK"&&_.rel==="modulepreload"&&o(_)}).observe(document,{childList:!0,subtree:!0});function s(m){const v={};return m.integrity&&(v.integrity=m.integrity),m.referrerPolicy&&(v.referrerPolicy=m.referrerPolicy),m.crossOrigin==="use-credentials"?v.credentials="include":m.crossOrigin==="anonymous"?v.credentials="omit":v.credentials="same-origin",v}function o(m){if(m.ep)return;m.ep=!0;const v=s(m);fetch(m.href,v)}})();function Gy(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var co={exports:{}},Uu={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ah;function Vy(){if(ah)return Uu;ah=1;var i=Symbol.for("react.transitional.element"),f=Symbol.for("react.fragment");function s(o,m,v){var _=null;if(v!==void 0&&(_=""+v),m.key!==void 0&&(_=""+m.key),"key"in m){v={};for(var N in m)N!=="key"&&(v[N]=m[N])}else v=m;return m=v.ref,{$$typeof:i,type:o,key:_,ref:m!==void 0?m:null,props:v}}return Uu.Fragment=f,Uu.jsx=s,Uu.jsxs=s,Uu}var nh;function Qy(){return nh||(nh=1,co.exports=Vy()),co.exports}var y=Qy(),fo={exports:{}},Ru={},oo={exports:{}},so={};/** + * @license React + * scheduler.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var uh;function Zy(){return uh||(uh=1,(function(i){function f(O,V){var ot=O.length;O.push(V);t:for(;0>>1,Qt=O[Gt];if(0>>1;Gtm(Q,ot))km(st,Q)?(O[Gt]=st,O[k]=ot,Gt=k):(O[Gt]=Q,O[C]=ot,Gt=C);else if(km(st,ot))O[Gt]=st,O[k]=ot,Gt=k;else break t}}return V}function m(O,V){var ot=O.sortIndex-V.sortIndex;return ot!==0?ot:O.id-V.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var v=performance;i.unstable_now=function(){return v.now()}}else{var _=Date,N=_.now();i.unstable_now=function(){return _.now()-N}}var x=[],S=[],R=1,A=null,q=3,et=!1,tt=!1,dt=!1,ft=!1,G=typeof setTimeout=="function"?setTimeout:null,pt=typeof clearTimeout=="function"?clearTimeout:null,St=typeof setImmediate<"u"?setImmediate:null;function P(O){for(var V=s(S);V!==null;){if(V.callback===null)o(S);else if(V.startTime<=O)o(S),V.sortIndex=V.expirationTime,f(x,V);else break;V=s(S)}}function nt(O){if(dt=!1,P(O),!tt)if(s(x)!==null)tt=!0,H||(H=!0,Lt());else{var V=s(S);V!==null&&qt(nt,V.startTime-O)}}var H=!1,W=-1,nl=5,ul=-1;function vl(){return ft?!0:!(i.unstable_now()-ulO&&vl());){var Gt=A.callback;if(typeof Gt=="function"){A.callback=null,q=A.priorityLevel;var Qt=Gt(A.expirationTime<=O);if(O=i.unstable_now(),typeof Qt=="function"){A.callback=Qt,P(O),V=!0;break l}A===s(x)&&o(x),P(O)}else o(x);A=s(x)}if(A!==null)V=!0;else{var b=s(S);b!==null&&qt(nt,b.startTime-O),V=!1}}break t}finally{A=null,q=ot,et=!1}V=void 0}}finally{V?Lt():H=!1}}}var Lt;if(typeof St=="function")Lt=function(){St(rl)};else if(typeof MessageChannel<"u"){var lt=new MessageChannel,it=lt.port2;lt.port1.onmessage=rl,Lt=function(){it.postMessage(null)}}else Lt=function(){G(rl,0)};function qt(O,V){W=G(function(){O(i.unstable_now())},V)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(O){O.callback=null},i.unstable_forceFrameRate=function(O){0>O||125Gt?(O.sortIndex=ot,f(S,O),s(x)===null&&O===s(S)&&(dt?(pt(W),W=-1):dt=!0,qt(nt,ot-Gt))):(O.sortIndex=Qt,f(x,O),tt||et||(tt=!0,H||(H=!0,Lt()))),O},i.unstable_shouldYield=vl,i.unstable_wrapCallback=function(O){var V=q;return function(){var ot=q;q=V;try{return O.apply(this,arguments)}finally{q=ot}}}})(so)),so}var ih;function Ky(){return ih||(ih=1,oo.exports=Zy()),oo.exports}var ro={exports:{}},yt={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ch;function Jy(){if(ch)return yt;ch=1;var i=Symbol.for("react.transitional.element"),f=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),m=Symbol.for("react.profiler"),v=Symbol.for("react.consumer"),_=Symbol.for("react.context"),N=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),S=Symbol.for("react.memo"),R=Symbol.for("react.lazy"),A=Symbol.for("react.activity"),q=Symbol.iterator;function et(b){return b===null||typeof b!="object"?null:(b=q&&b[q]||b["@@iterator"],typeof b=="function"?b:null)}var tt={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},dt=Object.assign,ft={};function G(b,C,Q){this.props=b,this.context=C,this.refs=ft,this.updater=Q||tt}G.prototype.isReactComponent={},G.prototype.setState=function(b,C){if(typeof b!="object"&&typeof b!="function"&&b!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,b,C,"setState")},G.prototype.forceUpdate=function(b){this.updater.enqueueForceUpdate(this,b,"forceUpdate")};function pt(){}pt.prototype=G.prototype;function St(b,C,Q){this.props=b,this.context=C,this.refs=ft,this.updater=Q||tt}var P=St.prototype=new pt;P.constructor=St,dt(P,G.prototype),P.isPureReactComponent=!0;var nt=Array.isArray;function H(){}var W={H:null,A:null,T:null,S:null},nl=Object.prototype.hasOwnProperty;function ul(b,C,Q){var k=Q.ref;return{$$typeof:i,type:b,key:C,ref:k!==void 0?k:null,props:Q}}function vl(b,C){return ul(b.type,C,b.props)}function rl(b){return typeof b=="object"&&b!==null&&b.$$typeof===i}function Lt(b){var C={"=":"=0",":":"=2"};return"$"+b.replace(/[=:]/g,function(Q){return C[Q]})}var lt=/\/+/g;function it(b,C){return typeof b=="object"&&b!==null&&b.key!=null?Lt(""+b.key):C.toString(36)}function qt(b){switch(b.status){case"fulfilled":return b.value;case"rejected":throw b.reason;default:switch(typeof b.status=="string"?b.then(H,H):(b.status="pending",b.then(function(C){b.status==="pending"&&(b.status="fulfilled",b.value=C)},function(C){b.status==="pending"&&(b.status="rejected",b.reason=C)})),b.status){case"fulfilled":return b.value;case"rejected":throw b.reason}}throw b}function O(b,C,Q,k,st){var ht=typeof b;(ht==="undefined"||ht==="boolean")&&(b=null);var Dt=!1;if(b===null)Dt=!0;else switch(ht){case"bigint":case"string":case"number":Dt=!0;break;case"object":switch(b.$$typeof){case i:case f:Dt=!0;break;case R:return Dt=b._init,O(Dt(b._payload),C,Q,k,st)}}if(Dt)return st=st(b),Dt=k===""?"."+it(b,0):k,nt(st)?(Q="",Dt!=null&&(Q=Dt.replace(lt,"$&/")+"/"),O(st,C,Q,"",function(te){return te})):st!=null&&(rl(st)&&(st=vl(st,Q+(st.key==null||b&&b.key===st.key?"":(""+st.key).replace(lt,"$&/")+"/")+Dt)),C.push(st)),1;Dt=0;var tl=k===""?".":k+":";if(nt(b))for(var Pt=0;Pt"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(f){console.error(f)}}return i(),ho.exports=ky(),ho.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var rh;function Wy(){if(rh)return Ru;rh=1;var i=Ky(),f=bo(),s=$y();function o(t){var l="https://react.dev/errors/"+t;if(1Qt||(t.current=Gt[Qt],Gt[Qt]=null,Qt--)}function Q(t,l){Qt++,Gt[Qt]=t.current,t.current=l}var k=b(null),st=b(null),ht=b(null),Dt=b(null);function tl(t,l){switch(Q(ht,l),Q(st,t),Q(k,null),l.nodeType){case 9:case 11:t=(t=l.documentElement)&&(t=t.namespaceURI)?Md(t):0;break;default:if(t=l.tagName,l=l.namespaceURI)l=Md(l),t=xd(l,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}C(k),Q(k,t)}function Pt(){C(k),C(st),C(ht)}function te(t){t.memoizedState!==null&&Q(Dt,t);var l=k.current,e=xd(l,t.type);l!==e&&(Q(st,t),Q(k,e))}function se(t){st.current===t&&(C(k),C(st)),Dt.current===t&&(C(Dt),Ou._currentValue=ot)}var Oe,Da;function Ml(t){if(Oe===void 0)try{throw Error()}catch(e){var l=e.stack.trim().match(/\n( *(at )?)/);Oe=l&&l[1]||"",Da=-1)":-1n||h[a]!==E[n]){var j=` +`+h[a].replace(" at new "," at ");return t.displayName&&j.includes("")&&(j=j.replace("",t.displayName)),j}while(1<=a&&0<=n);break}}}finally{we=!1,Error.prepareStackTrace=e}return(e=t?t.displayName||t.name:"")?Ml(e):""}function ja(t,l){switch(t.tag){case 26:case 27:case 5:return Ml(t.type);case 16:return Ml("Lazy");case 13:return t.child!==l&&l!==null?Ml("Suspense Fallback"):Ml("Suspense");case 19:return Ml("SuspenseList");case 0:case 15:return cn(t.type,!1);case 11:return cn(t.type.render,!1);case 1:return cn(t.type,!0);case 31:return Ml("Activity");default:return""}}function fn(t){try{var l="",e=null;do l+=ja(t,e),e=t,t=t.return;while(t);return l}catch(a){return` +Error generating stack: `+a.message+` +`+a.stack}}var Be=Object.prototype.hasOwnProperty,Dl=i.unstable_scheduleCallback,Zn=i.unstable_cancelCallback,tc=i.unstable_shouldYield,Ca=i.unstable_requestPaint,Z=i.unstable_now,Bu=i.unstable_getCurrentPriorityLevel,Ua=i.unstable_ImmediatePriority,Tt=i.unstable_UserBlockingPriority,aa=i.unstable_NormalPriority,il=i.unstable_LowPriority,Kl=i.unstable_IdlePriority,dl=i.log,Ul=i.unstable_setDisableYieldValue,jl=null,Rl=null;function Ll(t){if(typeof dl=="function"&&Ul(t),Rl&&typeof Rl.setStrictMode=="function")try{Rl.setStrictMode(jl,t)}catch{}}var Gl=Math.clz32?Math.clz32:Ql,na=Math.log,Ra=Math.LN2;function Ql(t){return t>>>=0,t===0?32:31-(na(t)/Ra|0)|0}var ze=256,Ee=262144,De=4194304;function re(t){var l=t&42;if(l!==0)return l;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function Ha(t,l,e){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,c=t.pingedLanes;t=t.warmLanes;var r=a&134217727;return r!==0?(a=r&~u,a!==0?n=re(a):(c&=r,c!==0?n=re(c):e||(e=r&~t,e!==0&&(n=re(e))))):(r=a&~u,r!==0?n=re(r):c!==0?n=re(c):e||(e=a&~t,e!==0&&(n=re(e)))),n===0?0:l!==0&&l!==n&&(l&u)===0&&(u=n&-n,e=l&-l,u>=e||u===32&&(e&4194048)!==0)?l:n}function je(t,l){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&l)===0}function on(t,l){switch(t){case 1:case 2:case 4:case 8:case 64:return l+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Yu(){var t=De;return De<<=1,(De&62914560)===0&&(De=4194304),t}function sn(t){for(var l=[],e=0;31>e;e++)l.push(t);return l}function g(t,l){t.pendingLanes|=l,l!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function d(t,l,e,a,n,u){var c=t.pendingLanes;t.pendingLanes=e,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=e,t.entangledLanes&=e,t.errorRecoveryDisabledLanes&=e,t.shellSuspendCounter=0;var r=t.entanglements,h=t.expirationTimes,E=t.hiddenUpdates;for(e=c&~e;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var wl=/[\n"\\]/g;function hl(t){return t.replace(wl,function(l){return"\\"+l.charCodeAt(0).toString(16)+" "})}function le(t,l,e,a,n,u,c,r){t.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?t.type=c:t.removeAttribute("type"),l!=null?c==="number"?(l===0&&t.value===""||t.value!=l)&&(t.value=""+_t(l)):t.value!==""+_t(l)&&(t.value=""+_t(l)):c!=="submit"&&c!=="reset"||t.removeAttribute("value"),l!=null?rn(t,c,_t(l)):e!=null?rn(t,c,_t(e)):a!=null&&t.removeAttribute("value"),n==null&&u!=null&&(t.defaultChecked=!!u),n!=null&&(t.checked=n&&typeof n!="function"&&typeof n!="symbol"),r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"?t.name=""+_t(r):t.removeAttribute("name")}function qa(t,l,e,a,n,u,c,r){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(t.type=u),l!=null||e!=null){if(!(u!=="submit"&&u!=="reset"||l!=null)){Ba(t);return}e=e!=null?""+_t(e):"",l=l!=null?""+_t(l):e,r||l===t.value||(t.value=l),t.defaultValue=l}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,t.checked=r?t.checked:!!a,t.defaultChecked=!!a,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(t.name=c),Ba(t)}function rn(t,l,e){l==="number"&&Ya(t.ownerDocument)===t||t.defaultValue===""+e||(t.defaultValue=""+e)}function Ye(t,l,e,a){if(t=t.options,l){l={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ic=!1;if(Xe)try{var Jn={};Object.defineProperty(Jn,"passive",{get:function(){ic=!0}}),window.addEventListener("test",Jn,Jn),window.removeEventListener("test",Jn,Jn)}catch{ic=!1}var ua=null,cc=null,Lu=null;function xo(){if(Lu)return Lu;var t,l=cc,e=l.length,a,n="value"in ua?ua.value:ua.textContent,u=n.length;for(t=0;t=Wn),Uo=" ",Ro=!1;function Ho(t,l){switch(t){case"keyup":return sm.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function wo(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var yn=!1;function dm(t,l){switch(t){case"compositionend":return wo(l);case"keypress":return l.which!==32?null:(Ro=!0,Uo);case"textInput":return t=l.data,t===Uo&&Ro?null:t;default:return null}}function hm(t,l){if(yn)return t==="compositionend"||!dc&&Ho(t,l)?(t=xo(),Lu=cc=ua=null,yn=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:e,offset:l-t};t=a}t:{for(;e;){if(e.nextSibling){e=e.nextSibling;break t}e=e.parentNode}e=void 0}e=Qo(e)}}function Ko(t,l){return t&&l?t===l?!0:t&&t.nodeType===3?!1:l&&l.nodeType===3?Ko(t,l.parentNode):"contains"in t?t.contains(l):t.compareDocumentPosition?!!(t.compareDocumentPosition(l)&16):!1:!1}function Jo(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var l=Ya(t.document);l instanceof t.HTMLIFrameElement;){try{var e=typeof l.contentWindow.location.href=="string"}catch{e=!1}if(e)t=l.contentWindow;else break;l=Ya(t.document)}return l}function yc(t){var l=t&&t.nodeName&&t.nodeName.toLowerCase();return l&&(l==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||l==="textarea"||t.contentEditable==="true")}var Tm=Xe&&"documentMode"in document&&11>=document.documentMode,vn=null,vc=null,tu=null,gc=!1;function ko(t,l,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;gc||vn==null||vn!==Ya(a)||(a=vn,"selectionStart"in a&&yc(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),tu&&Pn(tu,a)||(tu=a,a=Ri(vc,"onSelect"),0>=c,n-=c,Ce=1<<32-Gl(l)+n|e<gt?(Ot=I,I=null):Ot=I.sibling;var Yt=M(T,I,z[gt],U);if(Yt===null){I===null&&(I=Ot);break}t&&I&&Yt.alternate===null&&l(T,I),p=u(Yt,p,gt),Bt===null?at=Yt:Bt.sibling=Yt,Bt=Yt,I=Ot}if(gt===z.length)return e(T,I),jt&&Ge(T,gt),at;if(I===null){for(;gtgt?(Ot=I,I=null):Ot=I.sibling;var xa=M(T,I,Yt.value,U);if(xa===null){I===null&&(I=Ot);break}t&&I&&xa.alternate===null&&l(T,I),p=u(xa,p,gt),Bt===null?at=xa:Bt.sibling=xa,Bt=xa,I=Ot}if(Yt.done)return e(T,I),jt&&Ge(T,gt),at;if(I===null){for(;!Yt.done;gt++,Yt=z.next())Yt=w(T,Yt.value,U),Yt!==null&&(p=u(Yt,p,gt),Bt===null?at=Yt:Bt.sibling=Yt,Bt=Yt);return jt&&Ge(T,gt),at}for(I=a(I);!Yt.done;gt++,Yt=z.next())Yt=D(I,T,gt,Yt.value,U),Yt!==null&&(t&&Yt.alternate!==null&&I.delete(Yt.key===null?gt:Yt.key),p=u(Yt,p,gt),Bt===null?at=Yt:Bt.sibling=Yt,Bt=Yt);return t&&I.forEach(function(Ly){return l(T,Ly)}),jt&&Ge(T,gt),at}function Ft(T,p,z,U){if(typeof z=="object"&&z!==null&&z.type===dt&&z.key===null&&(z=z.props.children),typeof z=="object"&&z!==null){switch(z.$$typeof){case et:t:{for(var at=z.key;p!==null;){if(p.key===at){if(at=z.type,at===dt){if(p.tag===7){e(T,p.sibling),U=n(p,z.props.children),U.return=T,T=U;break t}}else if(p.elementType===at||typeof at=="object"&&at!==null&&at.$$typeof===nl&&$a(at)===p.type){e(T,p.sibling),U=n(p,z.props),iu(U,z),U.return=T,T=U;break t}e(T,p);break}else l(T,p);p=p.sibling}z.type===dt?(U=Qa(z.props.children,T.mode,U,z.key),U.return=T,T=U):(U=Fu(z.type,z.key,z.props,null,T.mode,U),iu(U,z),U.return=T,T=U)}return c(T);case tt:t:{for(at=z.key;p!==null;){if(p.key===at)if(p.tag===4&&p.stateNode.containerInfo===z.containerInfo&&p.stateNode.implementation===z.implementation){e(T,p.sibling),U=n(p,z.children||[]),U.return=T,T=U;break t}else{e(T,p);break}else l(T,p);p=p.sibling}U=Ec(z,T.mode,U),U.return=T,T=U}return c(T);case nl:return z=$a(z),Ft(T,p,z,U)}if(qt(z))return $(T,p,z,U);if(Lt(z)){if(at=Lt(z),typeof at!="function")throw Error(o(150));return z=at.call(z),ct(T,p,z,U)}if(typeof z.then=="function")return Ft(T,p,ni(z),U);if(z.$$typeof===St)return Ft(T,p,ti(T,z),U);ui(T,z)}return typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint"?(z=""+z,p!==null&&p.tag===6?(e(T,p.sibling),U=n(p,z),U.return=T,T=U):(e(T,p),U=zc(z,T.mode,U),U.return=T,T=U),c(T)):e(T,p)}return function(T,p,z,U){try{uu=0;var at=Ft(T,p,z,U);return xn=null,at}catch(I){if(I===Mn||I===ei)throw I;var Bt=ae(29,I,null,T.mode);return Bt.lanes=U,Bt.return=T,Bt}finally{}}}var Fa=gs(!0),ps=gs(!1),sa=!1;function wc(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Bc(t,l){t=t.updateQueue,l.updateQueue===t&&(l.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function ra(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function da(t,l,e){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(Xt&2)!==0){var n=a.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),a.pending=l,l=Wu(t),ls(t,null,e),l}return $u(t,a,l,e),Wu(t)}function cu(t,l,e){if(l=l.updateQueue,l!==null&&(l=l.shared,(e&4194048)!==0)){var a=l.lanes;a&=t.pendingLanes,e|=a,l.lanes=e,X(t,e)}}function Yc(t,l){var e=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,e===a)){var n=null,u=null;if(e=e.firstBaseUpdate,e!==null){do{var c={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};u===null?n=u=c:u=u.next=c,e=e.next}while(e!==null);u===null?n=u=l:u=u.next=l}else n=u=l;e={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},t.updateQueue=e;return}t=e.lastBaseUpdate,t===null?e.firstBaseUpdate=l:t.next=l,e.lastBaseUpdate=l}var qc=!1;function fu(){if(qc){var t=An;if(t!==null)throw t}}function ou(t,l,e,a){qc=!1;var n=t.updateQueue;sa=!1;var u=n.firstBaseUpdate,c=n.lastBaseUpdate,r=n.shared.pending;if(r!==null){n.shared.pending=null;var h=r,E=h.next;h.next=null,c===null?u=E:c.next=E,c=h;var j=t.alternate;j!==null&&(j=j.updateQueue,r=j.lastBaseUpdate,r!==c&&(r===null?j.firstBaseUpdate=E:r.next=E,j.lastBaseUpdate=h))}if(u!==null){var w=n.baseState;c=0,j=E=h=null,r=u;do{var M=r.lane&-536870913,D=M!==r.lane;if(D?(Nt&M)===M:(a&M)===M){M!==0&&M===En&&(qc=!0),j!==null&&(j=j.next={lane:0,tag:r.tag,payload:r.payload,callback:null,next:null});t:{var $=t,ct=r;M=l;var Ft=e;switch(ct.tag){case 1:if($=ct.payload,typeof $=="function"){w=$.call(Ft,w,M);break t}w=$;break t;case 3:$.flags=$.flags&-65537|128;case 0:if($=ct.payload,M=typeof $=="function"?$.call(Ft,w,M):$,M==null)break t;w=A({},w,M);break t;case 2:sa=!0}}M=r.callback,M!==null&&(t.flags|=64,D&&(t.flags|=8192),D=n.callbacks,D===null?n.callbacks=[M]:D.push(M))}else D={lane:M,tag:r.tag,payload:r.payload,callback:r.callback,next:null},j===null?(E=j=D,h=w):j=j.next=D,c|=M;if(r=r.next,r===null){if(r=n.shared.pending,r===null)break;D=r,r=D.next,D.next=null,n.lastBaseUpdate=D,n.shared.pending=null}}while(!0);j===null&&(h=w),n.baseState=h,n.firstBaseUpdate=E,n.lastBaseUpdate=j,u===null&&(n.shared.lanes=0),ga|=c,t.lanes=c,t.memoizedState=w}}function bs(t,l){if(typeof t!="function")throw Error(o(191,t));t.call(l)}function Ss(t,l){var e=t.callbacks;if(e!==null)for(t.callbacks=null,t=0;tu?u:8;var c=O.T,r={};O.T=r,nf(t,!1,l,e);try{var h=n(),E=O.S;if(E!==null&&E(r,h),h!==null&&typeof h=="object"&&typeof h.then=="function"){var j=Dm(h,a);du(t,l,j,fe(t))}else du(t,l,a,fe(t))}catch(w){du(t,l,{then:function(){},status:"rejected",reason:w},fe())}finally{V.p=u,c!==null&&r.types!==null&&(c.types=r.types),O.T=c}}function wm(){}function ef(t,l,e,a){if(t.tag!==5)throw Error(o(476));var n=Is(t).queue;Fs(t,n,l,ot,e===null?wm:function(){return Ps(t),e(a)})}function Is(t){var l=t.memoizedState;if(l!==null)return l;l={memoizedState:ot,baseState:ot,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ke,lastRenderedState:ot},next:null};var e={};return l.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ke,lastRenderedState:e},next:null},t.memoizedState=l,t=t.alternate,t!==null&&(t.memoizedState=l),l}function Ps(t){var l=Is(t);l.next===null&&(l=t.alternate.memoizedState),du(t,l.next.queue,{},fe())}function af(){return Yl(Ou)}function tr(){return bl().memoizedState}function lr(){return bl().memoizedState}function Bm(t){for(var l=t.return;l!==null;){switch(l.tag){case 24:case 3:var e=fe();t=ra(e);var a=da(l,t,e);a!==null&&(Pl(a,l,e),cu(a,l,e)),l={cache:Cc()},t.payload=l;return}l=l.return}}function Ym(t,l,e){var a=fe();e={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},yi(t)?ar(l,e):(e=Tc(t,l,e,a),e!==null&&(Pl(e,t,a),nr(e,l,a)))}function er(t,l,e){var a=fe();du(t,l,e,a)}function du(t,l,e,a){var n={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(yi(t))ar(l,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=l.lastRenderedReducer,u!==null))try{var c=l.lastRenderedState,r=u(c,e);if(n.hasEagerState=!0,n.eagerState=r,ee(r,c))return $u(t,l,n,0),It===null&&ku(),!1}catch{}finally{}if(e=Tc(t,l,n,a),e!==null)return Pl(e,t,a),nr(e,l,a),!0}return!1}function nf(t,l,e,a){if(a={lane:2,revertLane:Bf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},yi(t)){if(l)throw Error(o(479))}else l=Tc(t,e,a,2),l!==null&&Pl(l,t,2)}function yi(t){var l=t.alternate;return t===vt||l!==null&&l===vt}function ar(t,l){On=fi=!0;var e=t.pending;e===null?l.next=l:(l.next=e.next,e.next=l),t.pending=l}function nr(t,l,e){if((e&4194048)!==0){var a=l.lanes;a&=t.pendingLanes,e|=a,l.lanes=e,X(t,e)}}var hu={readContext:Yl,use:ri,useCallback:ml,useContext:ml,useEffect:ml,useImperativeHandle:ml,useLayoutEffect:ml,useInsertionEffect:ml,useMemo:ml,useReducer:ml,useRef:ml,useState:ml,useDebugValue:ml,useDeferredValue:ml,useTransition:ml,useSyncExternalStore:ml,useId:ml,useHostTransitionStatus:ml,useFormState:ml,useActionState:ml,useOptimistic:ml,useMemoCache:ml,useCacheRefresh:ml};hu.useEffectEvent=ml;var ur={readContext:Yl,use:ri,useCallback:function(t,l){return Zl().memoizedState=[t,l===void 0?null:l],t},useContext:Yl,useEffect:Gs,useImperativeHandle:function(t,l,e){e=e!=null?e.concat([t]):null,hi(4194308,4,Ks.bind(null,l,t),e)},useLayoutEffect:function(t,l){return hi(4194308,4,t,l)},useInsertionEffect:function(t,l){hi(4,2,t,l)},useMemo:function(t,l){var e=Zl();l=l===void 0?null:l;var a=t();if(Ia){Ll(!0);try{t()}finally{Ll(!1)}}return e.memoizedState=[a,l],a},useReducer:function(t,l,e){var a=Zl();if(e!==void 0){var n=e(l);if(Ia){Ll(!0);try{e(l)}finally{Ll(!1)}}}else n=l;return a.memoizedState=a.baseState=n,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=Ym.bind(null,vt,t),[a.memoizedState,t]},useRef:function(t){var l=Zl();return t={current:t},l.memoizedState=t},useState:function(t){t=Fc(t);var l=t.queue,e=er.bind(null,vt,l);return l.dispatch=e,[t.memoizedState,e]},useDebugValue:tf,useDeferredValue:function(t,l){var e=Zl();return lf(e,t,l)},useTransition:function(){var t=Fc(!1);return t=Fs.bind(null,vt,t.queue,!0,!1),Zl().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,l,e){var a=vt,n=Zl();if(jt){if(e===void 0)throw Error(o(407));e=e()}else{if(e=l(),It===null)throw Error(o(349));(Nt&127)!==0||Ms(a,l,e)}n.memoizedState=e;var u={value:e,getSnapshot:l};return n.queue=u,Gs(Ns.bind(null,a,u,t),[t]),a.flags|=2048,jn(9,{destroy:void 0},xs.bind(null,a,u,e,l),null),e},useId:function(){var t=Zl(),l=It.identifierPrefix;if(jt){var e=Ue,a=Ce;e=(a&~(1<<32-Gl(a)-1)).toString(32)+e,l="_"+l+"R_"+e,e=oi++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?c.createElement("select",{is:a.is}):c.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?c.createElement(n,{is:a.is}):c.createElement(n)}}u[Ut]=l,u[bt]=a;t:for(c=l.child;c!==null;){if(c.tag===5||c.tag===6)u.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===l)break t;for(;c.sibling===null;){if(c.return===null||c.return===l)break t;c=c.return}c.sibling.return=c.return,c=c.sibling}l.stateNode=u;t:switch(Xl(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break t;case"img":a=!0;break t;default:a=!1}a&&ke(l)}}return al(l),bf(l,l.type,t===null?null:t.memoizedProps,l.pendingProps,e),null;case 6:if(t&&l.stateNode!=null)t.memoizedProps!==a&&ke(l);else{if(typeof a!="string"&&l.stateNode===null)throw Error(o(166));if(t=ht.current,_n(l)){if(t=l.stateNode,e=l.memoizedProps,a=null,n=Bl,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[Ut]=l,t=!!(t.nodeValue===e||a!==null&&a.suppressHydrationWarning===!0||Ed(t.nodeValue,e)),t||fa(l,!0)}else t=Hi(t).createTextNode(a),t[Ut]=l,l.stateNode=t}return al(l),null;case 31:if(e=l.memoizedState,t===null||t.memoizedState!==null){if(a=_n(l),e!==null){if(t===null){if(!a)throw Error(o(318));if(t=l.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(o(557));t[Ut]=l}else Za(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;al(l),t=!1}else e=Nc(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=e),t=!0;if(!t)return l.flags&256?(ue(l),l):(ue(l),null);if((l.flags&128)!==0)throw Error(o(558))}return al(l),null;case 13:if(a=l.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=_n(l),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(o(318));if(n=l.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(o(317));n[Ut]=l}else Za(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;al(l),n=!1}else n=Nc(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return l.flags&256?(ue(l),l):(ue(l),null)}return ue(l),(l.flags&128)!==0?(l.lanes=e,l):(e=a!==null,t=t!==null&&t.memoizedState!==null,e&&(a=l.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),e!==t&&e&&(l.child.flags|=8192),Si(l,l.updateQueue),al(l),null);case 4:return Pt(),t===null&&Lf(l.stateNode.containerInfo),al(l),null;case 10:return Qe(l.type),al(l),null;case 19:if(C(pl),a=l.memoizedState,a===null)return al(l),null;if(n=(l.flags&128)!==0,u=a.rendering,u===null)if(n)yu(a,!1);else{if(yl!==0||t!==null&&(t.flags&128)!==0)for(t=l.child;t!==null;){if(u=ci(t),u!==null){for(l.flags|=128,yu(a,!1),t=u.updateQueue,l.updateQueue=t,Si(l,t),l.subtreeFlags=0,t=e,e=l.child;e!==null;)es(e,t),e=e.sibling;return Q(pl,pl.current&1|2),jt&&Ge(l,a.treeForkCount),l.child}t=t.sibling}a.tail!==null&&Z()>Ai&&(l.flags|=128,n=!0,yu(a,!1),l.lanes=4194304)}else{if(!n)if(t=ci(u),t!==null){if(l.flags|=128,n=!0,t=t.updateQueue,l.updateQueue=t,Si(l,t),yu(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!jt)return al(l),null}else 2*Z()-a.renderingStartTime>Ai&&e!==536870912&&(l.flags|=128,n=!0,yu(a,!1),l.lanes=4194304);a.isBackwards?(u.sibling=l.child,l.child=u):(t=a.last,t!==null?t.sibling=u:l.child=u,a.last=u)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Z(),t.sibling=null,e=pl.current,Q(pl,n?e&1|2:e&1),jt&&Ge(l,a.treeForkCount),t):(al(l),null);case 22:case 23:return ue(l),Lc(),a=l.memoizedState!==null,t!==null?t.memoizedState!==null!==a&&(l.flags|=8192):a&&(l.flags|=8192),a?(e&536870912)!==0&&(l.flags&128)===0&&(al(l),l.subtreeFlags&6&&(l.flags|=8192)):al(l),e=l.updateQueue,e!==null&&Si(l,e.retryQueue),e=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),a=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(a=l.memoizedState.cachePool.pool),a!==e&&(l.flags|=2048),t!==null&&C(ka),null;case 24:return e=null,t!==null&&(e=t.memoizedState.cache),l.memoizedState.cache!==e&&(l.flags|=2048),Qe(Tl),al(l),null;case 25:return null;case 30:return null}throw Error(o(156,l.tag))}function Vm(t,l){switch(Mc(l),l.tag){case 1:return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 3:return Qe(Tl),Pt(),t=l.flags,(t&65536)!==0&&(t&128)===0?(l.flags=t&-65537|128,l):null;case 26:case 27:case 5:return se(l),null;case 31:if(l.memoizedState!==null){if(ue(l),l.alternate===null)throw Error(o(340));Za()}return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 13:if(ue(l),t=l.memoizedState,t!==null&&t.dehydrated!==null){if(l.alternate===null)throw Error(o(340));Za()}return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 19:return C(pl),null;case 4:return Pt(),null;case 10:return Qe(l.type),null;case 22:case 23:return ue(l),Lc(),t!==null&&C(ka),t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 24:return Qe(Tl),null;case 25:return null;default:return null}}function Or(t,l){switch(Mc(l),l.tag){case 3:Qe(Tl),Pt();break;case 26:case 27:case 5:se(l);break;case 4:Pt();break;case 31:l.memoizedState!==null&&ue(l);break;case 13:ue(l);break;case 19:C(pl);break;case 10:Qe(l.type);break;case 22:case 23:ue(l),Lc(),t!==null&&C(ka);break;case 24:Qe(Tl)}}function vu(t,l){try{var e=l.updateQueue,a=e!==null?e.lastEffect:null;if(a!==null){var n=a.next;e=n;do{if((e.tag&t)===t){a=void 0;var u=e.create,c=e.inst;a=u(),c.destroy=a}e=e.next}while(e!==n)}}catch(r){kt(l,l.return,r)}}function ya(t,l,e){try{var a=l.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&t)===t){var c=a.inst,r=c.destroy;if(r!==void 0){c.destroy=void 0,n=l;var h=e,E=r;try{E()}catch(j){kt(n,h,j)}}}a=a.next}while(a!==u)}}catch(j){kt(l,l.return,j)}}function Dr(t){var l=t.updateQueue;if(l!==null){var e=t.stateNode;try{Ss(l,e)}catch(a){kt(t,t.return,a)}}}function jr(t,l,e){e.props=Pa(t.type,t.memoizedProps),e.state=t.memoizedState;try{e.componentWillUnmount()}catch(a){kt(t,l,a)}}function gu(t,l){try{var e=t.ref;if(e!==null){switch(t.tag){case 26:case 27:case 5:var a=t.stateNode;break;case 30:a=t.stateNode;break;default:a=t.stateNode}typeof e=="function"?t.refCleanup=e(a):e.current=a}}catch(n){kt(t,l,n)}}function Re(t,l){var e=t.ref,a=t.refCleanup;if(e!==null)if(typeof a=="function")try{a()}catch(n){kt(t,l,n)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(n){kt(t,l,n)}else e.current=null}function Cr(t){var l=t.type,e=t.memoizedProps,a=t.stateNode;try{t:switch(l){case"button":case"input":case"select":case"textarea":e.autoFocus&&a.focus();break t;case"img":e.src?a.src=e.src:e.srcSet&&(a.srcset=e.srcSet)}}catch(n){kt(t,t.return,n)}}function Sf(t,l,e){try{var a=t.stateNode;ry(a,t.type,e,l),a[bt]=l}catch(n){kt(t,t.return,n)}}function Ur(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&_a(t.type)||t.tag===4}function Tf(t){t:for(;;){for(;t.sibling===null;){if(t.return===null||Ur(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&_a(t.type)||t.flags&2||t.child===null||t.tag===4)continue t;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function _f(t,l,e){var a=t.tag;if(a===5||a===6)t=t.stateNode,l?(e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e).insertBefore(t,l):(l=e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,l.appendChild(t),e=e._reactRootContainer,e!=null||l.onclick!==null||(l.onclick=qe));else if(a!==4&&(a===27&&_a(t.type)&&(e=t.stateNode,l=null),t=t.child,t!==null))for(_f(t,l,e),t=t.sibling;t!==null;)_f(t,l,e),t=t.sibling}function Ti(t,l,e){var a=t.tag;if(a===5||a===6)t=t.stateNode,l?e.insertBefore(t,l):e.appendChild(t);else if(a!==4&&(a===27&&_a(t.type)&&(e=t.stateNode),t=t.child,t!==null))for(Ti(t,l,e),t=t.sibling;t!==null;)Ti(t,l,e),t=t.sibling}function Rr(t){var l=t.stateNode,e=t.memoizedProps;try{for(var a=t.type,n=l.attributes;n.length;)l.removeAttributeNode(n[0]);Xl(l,a,e),l[Ut]=t,l[bt]=e}catch(u){kt(t,t.return,u)}}var $e=!1,El=!1,zf=!1,Hr=typeof WeakSet=="function"?WeakSet:Set,Cl=null;function Qm(t,l){if(t=t.containerInfo,Qf=Gi,t=Jo(t),yc(t)){if("selectionStart"in t)var e={start:t.selectionStart,end:t.selectionEnd};else t:{e=(e=t.ownerDocument)&&e.defaultView||window;var a=e.getSelection&&e.getSelection();if(a&&a.rangeCount!==0){e=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{e.nodeType,u.nodeType}catch{e=null;break t}var c=0,r=-1,h=-1,E=0,j=0,w=t,M=null;l:for(;;){for(var D;w!==e||n!==0&&w.nodeType!==3||(r=c+n),w!==u||a!==0&&w.nodeType!==3||(h=c+a),w.nodeType===3&&(c+=w.nodeValue.length),(D=w.firstChild)!==null;)M=w,w=D;for(;;){if(w===t)break l;if(M===e&&++E===n&&(r=c),M===u&&++j===a&&(h=c),(D=w.nextSibling)!==null)break;w=M,M=w.parentNode}w=D}e=r===-1||h===-1?null:{start:r,end:h}}else e=null}e=e||{start:0,end:0}}else e=null;for(Zf={focusedElem:t,selectionRange:e},Gi=!1,Cl=l;Cl!==null;)if(l=Cl,t=l.child,(l.subtreeFlags&1028)!==0&&t!==null)t.return=l,Cl=t;else for(;Cl!==null;){switch(l=Cl,u=l.alternate,t=l.flags,l.tag){case 0:if((t&4)!==0&&(t=l.updateQueue,t=t!==null?t.events:null,t!==null))for(e=0;e title"))),Xl(u,a,e),u[Ut]=t,mt(u),a=u;break t;case"link":var c=Ld("link","href",n).get(a+(e.href||""));if(c){for(var r=0;rFt&&(c=Ft,Ft=ct,ct=c);var T=Zo(r,ct),p=Zo(r,Ft);if(T&&p&&(D.rangeCount!==1||D.anchorNode!==T.node||D.anchorOffset!==T.offset||D.focusNode!==p.node||D.focusOffset!==p.offset)){var z=w.createRange();z.setStart(T.node,T.offset),D.removeAllRanges(),ct>Ft?(D.addRange(z),D.extend(p.node,p.offset)):(z.setEnd(p.node,p.offset),D.addRange(z))}}}}for(w=[],D=r;D=D.parentNode;)D.nodeType===1&&w.push({element:D,left:D.scrollLeft,top:D.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;re?32:e,O.T=null,e=Df,Df=null;var u=ba,c=ta;if(Ol=0,wn=ba=null,ta=0,(Xt&6)!==0)throw Error(o(331));var r=Xt;if(Xt|=4,Kr(u.current),Vr(u,u.current,c,e),Xt=r,zu(0,!1),Rl&&typeof Rl.onPostCommitFiberRoot=="function")try{Rl.onPostCommitFiberRoot(jl,u)}catch{}return!0}finally{V.p=n,O.T=a,sd(t,l)}}function dd(t,l,e){l=ye(e,l),l=of(t.stateNode,l,2),t=da(t,l,2),t!==null&&(g(t,2),He(t))}function kt(t,l,e){if(t.tag===3)dd(t,t,e);else for(;l!==null;){if(l.tag===3){dd(l,t,e);break}else if(l.tag===1){var a=l.stateNode;if(typeof l.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(pa===null||!pa.has(a))){t=ye(e,t),e=hr(2),a=da(l,e,2),a!==null&&(mr(e,a,l,t),g(a,2),He(a));break}}l=l.return}}function Rf(t,l,e){var a=t.pingCache;if(a===null){a=t.pingCache=new Jm;var n=new Set;a.set(l,n)}else n=a.get(l),n===void 0&&(n=new Set,a.set(l,n));n.has(e)||(Mf=!0,n.add(e),t=Im.bind(null,t,l,e),l.then(t,t))}function Im(t,l,e){var a=t.pingCache;a!==null&&a.delete(l),t.pingedLanes|=t.suspendedLanes&e,t.warmLanes&=~e,It===t&&(Nt&e)===e&&(yl===4||yl===3&&(Nt&62914560)===Nt&&300>Z()-Ei?(Xt&2)===0&&Bn(t,0):xf|=e,Hn===Nt&&(Hn=0)),He(t)}function hd(t,l){l===0&&(l=Yu()),t=Va(t,l),t!==null&&(g(t,l),He(t))}function Pm(t){var l=t.memoizedState,e=0;l!==null&&(e=l.retryLane),hd(t,e)}function ty(t,l){var e=0;switch(t.tag){case 31:case 13:var a=t.stateNode,n=t.memoizedState;n!==null&&(e=n.retryLane);break;case 19:a=t.stateNode;break;case 22:a=t.stateNode._retryCache;break;default:throw Error(o(314))}a!==null&&a.delete(l),hd(t,e)}function ly(t,l){return Dl(t,l)}var ji=null,qn=null,Hf=!1,Ci=!1,wf=!1,Ta=0;function He(t){t!==qn&&t.next===null&&(qn===null?ji=qn=t:qn=qn.next=t),Ci=!0,Hf||(Hf=!0,ay())}function zu(t,l){if(!wf&&Ci){wf=!0;do for(var e=!1,a=ji;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var c=a.suspendedLanes,r=a.pingedLanes;u=(1<<31-Gl(42|t)+1)-1,u&=n&~(c&~r),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(e=!0,gd(a,u))}else u=Nt,u=Ha(a,a===It?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||je(a,u)||(e=!0,gd(a,u));a=a.next}while(e);wf=!1}}function ey(){md()}function md(){Ci=Hf=!1;var t=0;Ta!==0&&hy()&&(t=Ta);for(var l=Z(),e=null,a=ji;a!==null;){var n=a.next,u=yd(a,l);u===0?(a.next=null,e===null?ji=n:e.next=n,n===null&&(qn=e)):(e=a,(t!==0||(u&3)!==0)&&(Ci=!0)),a=n}Ol!==0&&Ol!==5||zu(t),Ta!==0&&(Ta=0)}function yd(t,l){for(var e=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0r)break;var j=h.transferSize,w=h.initiatorType;j&&Ad(w)&&(h=h.responseEnd,c+=j*(h"u"?null:document;function Bd(t,l,e){var a=Xn;if(a&&typeof l=="string"&&l){var n=hl(l);n='link[rel="'+t+'"][href="'+n+'"]',typeof e=="string"&&(n+='[crossorigin="'+e+'"]'),wd.has(n)||(wd.add(n),t={rel:t,crossOrigin:e,href:l},a.querySelector(n)===null&&(l=a.createElement("link"),Xl(l,"link",t),mt(l),a.head.appendChild(l)))}}function _y(t){la.D(t),Bd("dns-prefetch",t,null)}function zy(t,l){la.C(t,l),Bd("preconnect",t,l)}function Ey(t,l,e){la.L(t,l,e);var a=Xn;if(a&&t&&l){var n='link[rel="preload"][as="'+hl(l)+'"]';l==="image"&&e&&e.imageSrcSet?(n+='[imagesrcset="'+hl(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(n+='[imagesizes="'+hl(e.imageSizes)+'"]')):n+='[href="'+hl(t)+'"]';var u=n;switch(l){case"style":u=Ln(t);break;case"script":u=Gn(t)}Te.has(u)||(t=A({rel:"preload",href:l==="image"&&e&&e.imageSrcSet?void 0:t,as:l},e),Te.set(u,t),a.querySelector(n)!==null||l==="style"&&a.querySelector(xu(u))||l==="script"&&a.querySelector(Nu(u))||(l=a.createElement("link"),Xl(l,"link",t),mt(l),a.head.appendChild(l)))}}function Ay(t,l){la.m(t,l);var e=Xn;if(e&&t){var a=l&&typeof l.as=="string"?l.as:"script",n='link[rel="modulepreload"][as="'+hl(a)+'"][href="'+hl(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Gn(t)}if(!Te.has(u)&&(t=A({rel:"modulepreload",href:t},l),Te.set(u,t),e.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(Nu(u)))return}a=e.createElement("link"),Xl(a,"link",t),mt(a),e.head.appendChild(a)}}}function My(t,l,e){la.S(t,l,e);var a=Xn;if(a&&t){var n=wt(a).hoistableStyles,u=Ln(t);l=l||"default";var c=n.get(u);if(!c){var r={loading:0,preload:null};if(c=a.querySelector(xu(u)))r.loading=5;else{t=A({rel:"stylesheet",href:t,"data-precedence":l},e),(e=Te.get(u))&&If(t,e);var h=c=a.createElement("link");mt(h),Xl(h,"link",t),h._p=new Promise(function(E,j){h.onload=E,h.onerror=j}),h.addEventListener("load",function(){r.loading|=1}),h.addEventListener("error",function(){r.loading|=2}),r.loading|=4,Bi(c,l,a)}c={type:"stylesheet",instance:c,count:1,state:r},n.set(u,c)}}}function xy(t,l){la.X(t,l);var e=Xn;if(e&&t){var a=wt(e).hoistableScripts,n=Gn(t),u=a.get(n);u||(u=e.querySelector(Nu(n)),u||(t=A({src:t,async:!0},l),(l=Te.get(n))&&Pf(t,l),u=e.createElement("script"),mt(u),Xl(u,"link",t),e.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Ny(t,l){la.M(t,l);var e=Xn;if(e&&t){var a=wt(e).hoistableScripts,n=Gn(t),u=a.get(n);u||(u=e.querySelector(Nu(n)),u||(t=A({src:t,async:!0,type:"module"},l),(l=Te.get(n))&&Pf(t,l),u=e.createElement("script"),mt(u),Xl(u,"link",t),e.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Yd(t,l,e,a){var n=(n=ht.current)?wi(n):null;if(!n)throw Error(o(446));switch(t){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(l=Ln(e.href),e=wt(n).hoistableStyles,a=e.get(l),a||(a={type:"style",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){t=Ln(e.href);var u=wt(n).hoistableStyles,c=u.get(t);if(c||(n=n.ownerDocument||n,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,c),(u=n.querySelector(xu(t)))&&!u._p&&(c.instance=u,c.state.loading=5),Te.has(t)||(e={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},Te.set(t,e),u||Oy(n,t,e,c.state))),l&&a===null)throw Error(o(528,""));return c}if(l&&a!==null)throw Error(o(529,""));return null;case"script":return l=e.async,e=e.src,typeof e=="string"&&l&&typeof l!="function"&&typeof l!="symbol"?(l=Gn(e),e=wt(n).hoistableScripts,a=e.get(l),a||(a={type:"script",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,t))}}function Ln(t){return'href="'+hl(t)+'"'}function xu(t){return'link[rel="stylesheet"]['+t+"]"}function qd(t){return A({},t,{"data-precedence":t.precedence,precedence:null})}function Oy(t,l,e,a){t.querySelector('link[rel="preload"][as="style"]['+l+"]")?a.loading=1:(l=t.createElement("link"),a.preload=l,l.addEventListener("load",function(){return a.loading|=1}),l.addEventListener("error",function(){return a.loading|=2}),Xl(l,"link",e),mt(l),t.head.appendChild(l))}function Gn(t){return'[src="'+hl(t)+'"]'}function Nu(t){return"script[async]"+t}function Xd(t,l,e){if(l.count++,l.instance===null)switch(l.type){case"style":var a=t.querySelector('style[data-href~="'+hl(e.href)+'"]');if(a)return l.instance=a,mt(a),a;var n=A({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),mt(a),Xl(a,"style",n),Bi(a,e.precedence,t),l.instance=a;case"stylesheet":n=Ln(e.href);var u=t.querySelector(xu(n));if(u)return l.state.loading|=4,l.instance=u,mt(u),u;a=qd(e),(n=Te.get(n))&&If(a,n),u=(t.ownerDocument||t).createElement("link"),mt(u);var c=u;return c._p=new Promise(function(r,h){c.onload=r,c.onerror=h}),Xl(u,"link",a),l.state.loading|=4,Bi(u,e.precedence,t),l.instance=u;case"script":return u=Gn(e.src),(n=t.querySelector(Nu(u)))?(l.instance=n,mt(n),n):(a=e,(n=Te.get(u))&&(a=A({},e),Pf(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),mt(n),Xl(n,"link",a),t.head.appendChild(n),l.instance=n);case"void":return null;default:throw Error(o(443,l.type))}else l.type==="stylesheet"&&(l.state.loading&4)===0&&(a=l.instance,l.state.loading|=4,Bi(a,e.precedence,t));return l.instance}function Bi(t,l,e){for(var a=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,c=0;c title"):null)}function Dy(t,l,e){if(e===1||l.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof l.precedence!="string"||typeof l.href!="string"||l.href==="")break;return!0;case"link":if(typeof l.rel!="string"||typeof l.href!="string"||l.href===""||l.onLoad||l.onError)break;switch(l.rel){case"stylesheet":return t=l.disabled,typeof l.precedence=="string"&&t==null;default:return!0}case"script":if(l.async&&typeof l.async!="function"&&typeof l.async!="symbol"&&!l.onLoad&&!l.onError&&l.src&&typeof l.src=="string")return!0}return!1}function Vd(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function jy(t,l,e,a){if(e.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var n=Ln(a.href),u=l.querySelector(xu(n));if(u){l=u._p,l!==null&&typeof l=="object"&&typeof l.then=="function"&&(t.count++,t=qi.bind(t),l.then(t,t)),e.state.loading|=4,e.instance=u,mt(u);return}u=l.ownerDocument||l,a=qd(a),(n=Te.get(n))&&If(a,n),u=u.createElement("link"),mt(u);var c=u;c._p=new Promise(function(r,h){c.onload=r,c.onerror=h}),Xl(u,"link",a),e.instance=u}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(e,l),(l=e.state.preload)&&(e.state.loading&3)===0&&(t.count++,e=qi.bind(t),l.addEventListener("load",e),l.addEventListener("error",e))}}var to=0;function Cy(t,l){return t.stylesheets&&t.count===0&&Li(t,t.stylesheets),0to?50:800)+l);return t.unsuspend=e,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function qi(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Li(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var Xi=null;function Li(t,l){t.stylesheets=null,t.unsuspend!==null&&(t.count++,Xi=new Map,l.forEach(Uy,t),Xi=null,qi.call(t))}function Uy(t,l){if(!(l.state.loading&4)){var e=Xi.get(t);if(e)var a=e.get(null);else{e=new Map,Xi.set(t,e);for(var n=t.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(f){console.error(f)}}return i(),fo.exports=Wy(),fo.exports}var Iy=Fy(),K=bo();const $i=Gy(K),vo={role:"角色",birth:"生卒",born:"出生",death:"卒年",dynasty:"朝代",era:"年代",nickname:"别称",alias:"别称",title:"头衔",name:"名称",function:"职能",summary:"概要",type:"类型",category:"分类",status:"状态",location:"地点",place:"地点",org:"组织",organization:"组织",party:"党派",nation:"国家",year:"年份",date:"日期",period:"时期",event:"事件",cause:"原因",effect:"影响",result:"结果",note:"备注",sla:"SLA"},hh=6,Py=36;function t0(i,f){const s=i.trim();return s.length<=f?s:`${s.slice(0,f-1)}…`}function l0(i){if(i==null)return null;if(typeof i=="string")return i.trim()||null;if(typeof i=="number"||typeof i=="boolean")return String(i);if(Array.isArray(i)){const f=i.map(s=>typeof s=="string"||typeof s=="number"?String(s):null).filter(Boolean);return f.length?f.join("、"):null}if(typeof i=="object")try{return JSON.stringify(i)}catch{return null}return null}function Nh(i){const f=i.toLowerCase();return vo[i]||vo[f]||i}const e0=(()=>{const i={};for(const[f,s]of Object.entries(vo))i[s]||(i[s]=f);return i})();function a0(i){const f=i.trim();return f&&(e0[f]||f)}function n0(i){return Nh(i)}function Fi(i,f=hh){const s=typeof f=="number"?{max:f}:f,o=s.max??(s.full?64:hh),m=!!s.full;if(!i||typeof i!="object")return[];const v=[];for(const[_,N]of Object.entries(i)){const x=l0(N);if(!x)continue;const S=m?x:t0(x,Py);if(v.push({key:_,label:Nh(_),value:S,fullValue:x}),v.length>=o)break}return v}function u0(i){const f=Fi(i,3);return f.length?f.map(s=>`${s.label} ${s.value}`).join(" · "):null}function i0(i){try{return new URL(i).hostname.replace(/^www\./,"")}catch{return i.slice(0,32)}}function mh(i){if(i==null||!Number.isFinite(i))return null;try{return new Date(i).toLocaleDateString()}catch{return null}}function yh(i){if(!i.trim())return null;const f=Date.parse(i);return Number.isFinite(f)?f:null}function c0(i){return i.split(` +`).map(f=>f.trim()).filter(Boolean).map(f=>{const s=f.indexOf("|");return s>=0?{title:f.slice(0,s).trim(),url:f.slice(s+1).trim()}:{url:f}}).filter(f=>f.url)}function f0(i){return(i??[]).map(f=>f.title?`${f.title}|${f.url}`:f.url).join(` +`)}const So=[{id:"text",label:"标题",kind:"title",always:!0,rowHeight:22,isEmpty:i=>{var f;return!((f=i.text)!=null&&f.trim())},preview:i=>{var f;return((f=i.text)==null?void 0:f.trim())||"未命名"},commit:(i,f)=>[{type:"update_text",nodeId:i,text:f.trim()||"未命名"}]},{id:"imageUrl",label:"配图",kind:"image",imageRow:!0,rowHeight:64,isEmpty:i=>{var f;return!((f=i.imageUrl)!=null&&f.trim())},preview:i=>{var f;return((f=i.imageUrl)==null?void 0:f.trim())||null},commit:(i,f)=>[{type:"update_node_meta",nodeId:i,patch:{imageUrl:f.trim()||null}}]},{id:"note",label:"摘要",kind:"textarea",rowHeight:18,isEmpty:i=>{var f;return!((f=i.note)!=null&&f.trim())},preview:i=>{var s;const f=(s=i.note)==null?void 0:s.trim();return f?f.length>72?`${f.slice(0,72)}…`:f:null},commit:(i,f)=>[{type:"update_node_meta",nodeId:i,patch:{note:f.trim()||null}}]},{id:"tags",label:"标签",kind:"tags",rowHeight:18,isEmpty:i=>{var f;return!(((f=i.tags)==null?void 0:f.length)>0)},preview:i=>{var f;return(f=i.tags)!=null&&f.length?i.tags.slice(0,4).map(s=>`#${s}`).join(" "):null},commit:(i,f)=>{const s=f.split(/[,,]/).map(o=>o.trim()).filter(Boolean);return[{type:"update_node_meta",nodeId:i,patch:{tags:s}}]}},{id:"links",label:"来源",kind:"links",rowHeight:18,isEmpty:i=>{var f;return!(((f=i.links)==null?void 0:f.length)>0)},preview:i=>{var m,v,_;const f=(m=i.links)==null?void 0:m[0];if(!f)return null;const s=((v=f.title)==null?void 0:v.trim())||i0(f.url),o=(((_=i.links)==null?void 0:_.length)??0)>1?` +${i.links.length-1}`:"";return`${s}${o}`},commit:(i,f)=>[{type:"update_node_meta",nodeId:i,patch:{links:c0(f)}}]},{id:"startAt",label:"开始",kind:"datetime",rowHeight:18,isEmpty:i=>i.startAt==null,preview:i=>mh(i.startAt),commit:(i,f)=>[{type:"update_node_meta",nodeId:i,patch:{startAt:yh(f)}}]},{id:"dueAt",label:"截止",kind:"datetime",rowHeight:18,isEmpty:i=>i.dueAt==null,preview:i=>mh(i.dueAt),commit:(i,f)=>[{type:"update_node_meta",nodeId:i,patch:{dueAt:yh(f)}}]},{id:"pinned",label:"固定",kind:"flag",rowHeight:18,isEmpty:i=>!i.pinned,preview:i=>i.pinned?"已钉住":null,commit:(i,f)=>[{type:"set_pinned",nodeId:i,pinned:f==="1"||f==="true"}]},{id:"description",label:"属性",kind:"textarea",rowHeight:36,isEmpty:i=>!i.description||Object.keys(i.description).length===0,preview:i=>u0(i.description),commit:(i,f)=>{const s=f.trim();if(!s)return[{type:"update_node_meta",nodeId:i,patch:{description:null}}];try{const o=JSON.parse(s);if(!o||typeof o!="object"||Array.isArray(o))throw new Error("description must be a JSON object");return[{type:"update_node_meta",nodeId:i,patch:{description:o}}]}catch{return[]}}}],o0=Object.fromEntries(So.map(i=>[i.id,i]));function s0(i,f=new Set){const s=[];for(const o of So)(o.always||!o.isEmpty(i)||f.has(o.id))&&s.push({def:o,preview:o.preview(i)});return s}function r0(i,f=new Set){return So.filter(s=>!s.always&&s.isEmpty(i)&&!f.has(s.id))}function d0(i,f){switch(f){case"text":return i.text??"";case"note":return i.note??"";case"description":return i.description?JSON.stringify(i.description,null,2):"";case"imageUrl":return i.imageUrl??"";case"tags":return(i.tags??[]).join(", ");case"links":return f0(i.links);case"startAt":return vh(i.startAt);case"dueAt":return vh(i.dueAt);case"pinned":return i.pinned?"1":"0";default:return""}}function vh(i){if(i==null||!Number.isFinite(i))return"";const f=new Date(i),s=o=>String(o).padStart(2,"0");return`${f.getFullYear()}-${s(f.getMonth()+1)}-${s(f.getDate())}T${s(f.getHours())}:${s(f.getMinutes())}`}function h0(i,f,s){return o0[f].commit(i.id,s,i)}const gh={comfortable:288,compact:248},ea=40,Ii=12,Al=14,oe=10,Oa={comfortable:108,compact:90},Qn=18,Oh=24;function Pi(i,f,s=new Set,o={}){var R,A,q,et;const m=!!o.expanded,v=f?gh.compact:gh.comfortable;let _=0;if((R=i.imageUrl)!=null&&R.trim()&&(_+=(f?Oa.compact:Oa.comfortable)+oe),(A=i.note)!=null&&A.trim())if(m){const tt=Math.min(12,Math.max(2,Math.ceil(i.note.trim().length/(f?28:34))));_+=tt*(f?15:16)+oe}else _+=(f?40:48)+oe;const N=Fi(i.description,{full:m,max:m?64:6});if(N.length)if(m){const tt=f?4:5;let dt=0;for(const ft of N){const G=Math.min(8,Math.max(1,Math.ceil(ft.fullValue.length/(f?18:22))));dt+=Qn+Math.max(0,G-1)*(f?14:15),dt+=tt}_+=dt+oe}else _+=N.length*Qn+Math.max(0,N.length-1)*4+oe;(!!((q=i.tags)!=null&&q.length)||!!((et=i.links)!=null&&et.length)||i.startAt!=null||i.dueAt!=null||!!i.pinned)&&(_+=Oh+oe),_>0&&(_-=oe);const S=ea+Ii*2+Math.max(_,8);return{w:v,h:Math.max(S,f?88:104)}}const m0='"Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", system-ui, sans-serif';function _e(i,f=400){return`${f===400?"":`${f} `}${i}px ${m0}`}function ph(i,f,s){const o=(s==null?void 0:s.weight)==="heavy",m=Math.max(.5,f);if(o){i.shadowColor=s!=null&&s.selected?"rgba(0, 0, 0, 0.62)":"rgba(0, 0, 0, 0.5)",i.shadowBlur=(s!=null&&s.selected?28:22)/m,i.shadowOffsetX=0,i.shadowOffsetY=7/m;return}i.shadowColor=s!=null&&s.selected?"rgba(0, 0, 0, 0.45)":"rgba(0, 0, 0, 0.28)",i.shadowBlur=(s!=null&&s.selected?18:12)/m,i.shadowOffsetX=0,i.shadowOffsetY=3/m}function mo(i){i.shadowColor="transparent",i.shadowBlur=0,i.shadowOffsetX=0,i.shadowOffsetY=0}function y0(i,f,s=.14){i.save(),i.globalAlpha=s,i.fillStyle=f,i.fill(),i.restore()}function v0(i,f,s,o,m,v=10){i.save(),i.beginPath();const N=Math.min(v,o/2);i.moveTo(f+N,s),i.lineTo(f+4,s),i.lineTo(f+4,s+o),i.lineTo(f+N,s+o),i.quadraticCurveTo(f,s+o,f,s+o-N),i.lineTo(f,s+N),i.quadraticCurveTo(f,s,f+N,s),i.closePath(),i.fillStyle=m,i.globalAlpha=.95,i.fill(),i.restore()}function Dh(i,f,s,o,m,v){const N=16/Math.max(.75,Math.min(1.2,v));i.font=_e(10/Math.max(.75,Math.min(1.2,v)),500);const S=i.measureText(f).width+12;i.beginPath();const R=N/2;return i.moveTo(s+R,o),i.arcTo(s+S,o,s+S,o+N,R),i.arcTo(s+S,o+N,s,o+N,R),i.arcTo(s,o+N,s,o,R),i.arcTo(s,o,s+S,o,R),i.closePath(),i.fillStyle=m.glassHeader??"rgba(255,255,255,0.06)",i.fill(),i.strokeStyle=m.glassBorder??m.border,i.lineWidth=1/Math.max(.5,v),i.stroke(),i.fillStyle=m.labelSecondary,i.textBaseline="middle",i.fillText(f,s+6,o+N/2),S+4}const Hu=new Map;function go(i,f){const s=Hu.get(i);if(s instanceof HTMLImageElement)return s;if(s==="loading"||s==="error")return null;Hu.set(i,"loading");const o=new Image;return o.decoding="async",o.crossOrigin="anonymous",o.onload=()=>{Hu.set(i,o),f()},o.onerror=()=>{Hu.set(i,"error"),f()},o.src=i,null}function g0(i){return Hu.get(i)==="error"}const Na={comfortable:36,compact:30},p0="/topo/ne-router.png";function b0(i,f,s){var N,x;if(s!=null&&s.asTopology){const S=f?Na.compact:Na.comfortable,R=f?18:20,A=6,q=f?6:8;return{w:Math.max(f?72:88,S+q*2),h:S+A+R+q}}if(s!=null&&s.asCard||i.stylePreset==="card")return Pi(i,f,new Set,{expanded:s==null?void 0:s.expanded});let o=f?168:212,m=f?48:60;const v=!!((N=i.tags)!=null&&N.length)||!!((x=i.links)!=null&&x.length)||i.dueAt!=null||!!i.note;m+=v?f?20:26:f?8:10;const _=i.stylePreset;return _==="title"?(o*=1.18,m*=1.15):_==="decision"?(o*=1.08,m*=1.12):_==="note"&&(m*=1.12),i.imageUrl&&(o=Math.max(o,f?200:248),m+=f?78:96),{w:o,h:m}}function bh(i,f,s,o,m,v,_){if(i.beginPath(),f==="decision"){const N=s+m/2,x=o+v/2;i.moveTo(N,o),i.lineTo(s+m,x),i.lineTo(N,o+v),i.lineTo(s,x),i.closePath()}else if(f==="note"){const N=Math.min(12,m*.12);i.moveTo(s,o),i.lineTo(s+m-N,o),i.lineTo(s+m,o+N),i.lineTo(s+m,o+v),i.lineTo(s,o+v),i.closePath()}else if(f==="title"){const N=v/2;Wi(i,s,o,m,v,N)}else Wi(i,s,o,m,v,_)}function Wi(i,f,s,o,m,v){const _=Math.min(v,o/2,m/2);i.moveTo(f+_,s),i.arcTo(f+o,s,f+o,s+m,_),i.arcTo(f+o,s+m,f,s+m,_),i.arcTo(f,s+m,f,s,_),i.arcTo(f,s,f+o,s,_),i.closePath()}function un(i,f,s,o){const m=f.replace(/\s+/g," ").trim();if(!m)return[];const v=[];let _=m;for(;_&&v.lengthS*.4&&(S=R);let A=_.slice(0,S).trimEnd();if(_=_.slice(S).trimStart(),v.length===o-1&&_){for(;A.length>1&&i.measureText(`${A}…`).width>s;)A=A.slice(0,-1);v.push(`${A}…`);break}v.push(A)}return v}function S0(i){var s,o;const f=[];if(i.icon){const m=T0[i.icon];m&&f.push(m)}return i.collapsed&&f.push("▸"),(s=i.links)!=null&&s.length&&f.push("🔗"),i.imageUrl&&f.push("🖼"),i.dueAt!=null&&f.push("⏰"),(o=i.tags)!=null&&o.length&&f.push(`#${i.tags.length}`),i.pinned&&f.push("📌"),f}const T0={server:"[服]",database:"[库]",cloud:"[云]",person:"[人]",folder:"[夹]",doc:"[档]",link:"[链]",warning:"[警]",check:"[✓]",star:"[★]",gear:"[设]",globe:"[球]",router:"[路]"};function _0(i){try{return new URL(i).hostname.replace(/^www\./,"")}catch{return i.slice(0,28)}}function Sh(i){if(i==null||!Number.isFinite(i))return null;try{return new Date(i).toLocaleDateString()}catch{return null}}function z0(i,f,s=!1){var R,A;const{w:o}=Pi(i,f,new Set,{expanded:s});let m=ea+Math.max(4,Ii-4);const v=o-Al*2;(R=i.imageUrl)!=null&&R.trim()&&(m+=(f?Oa.compact:Oa.comfortable)+oe);const _=(A=i.note)==null?void 0:A.trim();if(_){const q=s?f?10:12:f?2:3,et=f?28:34,tt=Math.min(q,Math.max(1,Math.ceil(_.length/et)));m+=tt*(f?15:16)+oe}const N=Fi(i.description,{full:s,max:s?64:6}),x=[],S=f?4:5;for(const q of N){const et=f?18:22,tt=s?Math.min(8,Math.max(1,Math.ceil(q.fullValue.length/et))):1,dt=f?14:15,ft=Qn+Math.max(0,tt-1)*dt;x.push({key:q.key,label:q.label,value:q.value,fullValue:q.fullValue,x:Al,y:m,w:v,h:ft}),m+=ft+S}return x}function E0(i,f,s=!1){var S,R;const{w:o}=Pi(i,f,new Set,{expanded:s}),m=[],v=(i.text||"未命名").trim();m.push({key:"__title",label:"标题",value:v,fullValue:v,x:28,y:4,w:o-32-Al,h:ea-8});let _=ea+Math.max(4,Ii-4);const N=o-Al*2;(S=i.imageUrl)!=null&&S.trim()&&(_+=(f?Oa.compact:Oa.comfortable)+oe);const x=(R=i.note)==null?void 0:R.trim();if(x){const A=s?f?10:12:f?2:3,q=f?28:34,dt=Math.min(A,Math.max(1,Math.ceil(x.length/q)))*(f?15:16);m.push({key:"__note",label:"摘要",value:x,fullValue:x,x:Al,y:_,w:N,h:dt})}return[...m,...z0(i,f,s)]}function A0(i,f,s,o,m,v,_,N){let x=o;const S=_?4:5;for(let R=0;R{i.fillText(O,s+Al,qt+V*it)}),i.restore();return}i.beginPath(),i.arc(s+16,o+ea/2,7,0,Math.PI*2),i.fillStyle=N,i.globalAlpha=.22,i.fill(),i.globalAlpha=1,i.beginPath(),i.arc(s+16,o+ea/2,4,0,Math.PI*2),i.fillStyle=N,i.fill(),i.fillStyle=m.labelPrimary,i.font=_e(_?13:14,600),i.textBaseline="middle";const tt=A-32-Al,dt=un(i,f.text||"未命名",tt,R?_?2:3:_?1:2);if(dt.length===1)i.fillText(dt[0],s+28,o+ea/2);else{const it=o+ea/2-(dt.length-1)*14/2;dt.forEach((qt,O)=>{i.fillText(qt,s+28,it+O*14)})}let ft=o+ea+Math.max(4,Ii-4);const G=A-Al*2,pt=(nl=f.imageUrl)==null?void 0:nl.trim();if(pt){const lt=_?Oa.compact:Oa.comfortable,it=go(pt,x);if(i.save(),i.beginPath(),Wi(i,s+Al,ft,G,lt,10),i.clip(),i.fillStyle=m.glassHeader,i.fillRect(s+Al,ft,G,lt),it&&it.naturalWidth>0){const qt=Math.max(G/it.naturalWidth,lt/it.naturalHeight),O=it.naturalWidth*qt,V=it.naturalHeight*qt;i.drawImage(it,s+Al+(G-O)/2,ft+(lt-V)/2,O,V)}else i.fillStyle=m.labelSecondary,i.font=_e(11,500),i.textBaseline="middle",i.fillText(g0(pt)?"配图失败":"加载中…",s+Al+10,ft+lt/2);i.restore(),ft+=lt+oe}const St=(ul=f.note)==null?void 0:ul.trim();if(St){i.fillStyle=m.labelSecondary,i.font=_e(_?11.5:12.5,400),i.textBaseline="top";const it=un(i,St,G,R?_?10:12:_?2:3),qt=_?15:16;for(let O=0;Os+A-Al-24)break;R&<>s+A-Al-24&&(lt=s+Al,ft+=Oh)}}i.restore()}const x0=1280,N0=.82;function O0(i){return new Promise((f,s)=>{const o=new FileReader;o.onload=()=>f(String(o.result||"")),o.onerror=()=>s(o.error||new Error("read failed")),o.readAsDataURL(i)})}function D0(i){return new Promise((f,s)=>{const o=new Image;o.onload=()=>f(o),o.onerror=()=>s(new Error("image decode failed")),o.src=i})}async function j0(i){const f=await O0(i),s=await D0(f),o=Math.min(1,x0/Math.max(s.width,s.height)),m=Math.max(1,Math.round(s.width*o)),v=Math.max(1,Math.round(s.height*o)),_=document.createElement("canvas");_.width=m,_.height=v;const N=_.getContext("2d");if(!N)throw new Error("canvas unavailable");N.drawImage(s,0,0,m,v);const x=i.type==="image/png"&&i.size<4e5&&o===1,S=x?"image/png":"image/jpeg";return{dataUrl:_.toDataURL(S,x?void 0:N0),mimeType:S}}async function C0(i){if(!i.type.startsWith("image/"))throw new Error("请选择图片文件");if(i.size>20*1024*1024)throw new Error("原图过大(请小于 20MB)");const{dataUrl:f,mimeType:s}=await j0(i),o=await fetch("/api/uploads",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataBase64:f,mimeType:s,filename:i.name})}),m=await o.json().catch(()=>({}));if(!o.ok||!m.ok||!m.url)throw new Error(m.message||`上传失败 (${o.status})`);return m.url}function Th(i){return i?Object.entries(i).map(([f,s],o)=>({id:`${f}-${o}`,key:n0(f),value:s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):Array.isArray(s)?s.map(String).join("、"):JSON.stringify(s)})):[]}function yo(i){const f={};for(const s of i){const o=a0(s.key);o&&(f[o]=s.value.trim())}return Object.keys(f).length?f:null}function jh({node:i,applyOps:f,accent:s,variant:o="overlay",onDragHandlePointerDown:m,showStylePreset:v}){const[_,N]=K.useState(()=>new Set),[x,S]=K.useState(!1);K.useEffect(()=>{N(new Set),S(!1)},[i.id]);const R=K.useMemo(()=>s0(i,_),[i,_]),A=K.useMemo(()=>R.filter(G=>G.def.id!=="text"&&G.def.id!=="description"),[R]),q=!U0(i)||_.has("description"),et=K.useMemo(()=>r0(i,_).filter(G=>G.id!=="description"),[i,_]),tt=(G,pt)=>{const St=h0(i,G,pt);St.length&&(f(St,`prop ${G}`),!pt.trim()&&G!=="text"&&N(P=>{const nt=new Set(P);return nt.delete(G),nt}))},dt=G=>{const pt=i.description??null;JSON.stringify(pt)!==JSON.stringify(G)&&(f([{type:"update_node_meta",nodeId:i.id,patch:{description:G}}],"prop description"),G||N(P=>{const nt=new Set(P);return nt.delete("description"),nt}))},ft=G=>y.jsx(H0,{def:G,node:i,onCommit:pt=>tt(G.id,pt),onClear:()=>{tt(G.id,""),N(pt=>{const St=new Set(pt);return St.delete(G.id),St})}},G.id);return y.jsxs("div",{className:`ns-editor${o==="panel"?" ns-editor--panel":""}`,style:s&&o==="overlay"?{"--ns-brand":s}:void 0,children:[y.jsxs("div",{className:"ns-editor__header","data-ns-drag-handle":!0,onPointerDown:m,children:[y.jsx("span",{className:"ns-editor__dot",style:s?{background:s}:void 0}),y.jsx("input",{className:"ns-editor__title",defaultValue:i.text,onPointerDown:G=>G.stopPropagation(),onBlur:G=>{G.target.value!==i.text&&tt("text",G.target.value)},onKeyDown:G=>{G.key==="Enter"&&G.target.blur()}},`title-${i.id}-${i.version}`)]}),y.jsxs("div",{className:"ns-editor__body",children:[v?y.jsxs("div",{className:"ns-row",children:[y.jsx("span",{className:"ns-row__label",children:"类型"}),y.jsx("div",{className:"ns-row__ctrl",children:y.jsxs("select",{value:i.stylePreset,onChange:G=>{f([{type:"set_style_preset",nodeId:i.id,stylePreset:G.target.value}],"style")},children:[y.jsx("option",{value:"default",children:"默认外形"}),y.jsx("option",{value:"title",children:"title"}),y.jsx("option",{value:"decision",children:"决策"}),y.jsx("option",{value:"risk",children:"风险"}),y.jsx("option",{value:"note",children:"便签"}),y.jsx("option",{value:"muted",children:"弱化"})]})}),y.jsx("span",{})]}):null,o==="panel"?y.jsxs(y.Fragment,{children:[y.jsxs("div",{className:"ns-row",children:[y.jsx("span",{className:"ns-row__label",children:"强调色"}),y.jsx("div",{className:"ns-row__ctrl",children:y.jsx("input",{type:"text",placeholder:"#e74c3c",defaultValue:i.accentColor??"",onBlur:G=>{const St=G.target.value.trim()||null;(i.accentColor??null)!==St&&f([{type:"update_node_meta",nodeId:i.id,patch:{accentColor:St}}])}},`ac-${i.id}-${i.version}`)}),y.jsx("span",{})]}),y.jsxs("div",{className:"ns-row",children:[y.jsx("span",{className:"ns-row__label",children:"图标"}),y.jsx("div",{className:"ns-row__ctrl",children:y.jsxs("select",{value:i.icon??"",onChange:G=>{const pt=G.target.value;f([{type:"update_node_meta",nodeId:i.id,patch:{icon:pt||null}}])},children:[y.jsx("option",{value:"",children:"无"}),y.jsx("option",{value:"router",children:"路由器"}),y.jsx("option",{value:"server",children:"🖥 服务器"}),y.jsx("option",{value:"database",children:"🗄 数据库"}),y.jsx("option",{value:"cloud",children:"☁ 云"}),y.jsx("option",{value:"person",children:"👤 人物"}),y.jsx("option",{value:"folder",children:"📁 文件夹"}),y.jsx("option",{value:"doc",children:"📄 文档"}),y.jsx("option",{value:"link",children:"🔗 链接"}),y.jsx("option",{value:"warning",children:"⚠ 警告"}),y.jsx("option",{value:"check",children:"✓ 完成"}),y.jsx("option",{value:"star",children:"★ 星标"}),y.jsx("option",{value:"gear",children:"⚙ 设置"}),y.jsx("option",{value:"globe",children:"🌐 全球"})]})}),y.jsx("span",{})]})]}):null,A.map(({def:G})=>ft(G)),q?y.jsx(R0,{nodeId:i.id,version:i.version,description:i.description,onCommit:dt}):y.jsx("button",{type:"button",className:"ns-kv__reveal",onClick:()=>N(G=>new Set(G).add("description")),children:"+ 添加属性列表"})]}),et.length>0?y.jsxs("div",{className:"ns-add",onPointerDown:G=>G.stopPropagation(),children:[x?y.jsx("div",{className:"ns-add__menu",children:et.map(G=>y.jsx("button",{type:"button",className:"ns-add__item",onClick:pt=>{pt.preventDefault(),pt.stopPropagation(),N(St=>new Set(St).add(G.id)),S(!1)},children:G.label},G.id))}):null,y.jsx("button",{type:"button",className:"ns-add__btn",onClick:G=>{G.preventDefault(),G.stopPropagation(),S(pt=>!pt)},children:"+ 添加字段"})]}):null]})}function U0(i){return!i.description||Object.keys(i.description).length===0}function R0({nodeId:i,version:f,description:s,onCommit:o}){const[m,v]=K.useState(()=>Th(s)),_=K.useRef(m);_.current=m,K.useEffect(()=>{v(Th(s))},[i,f,s]);const N=x=>{v(x),_.current=x,o(yo(x))};return y.jsxs("div",{className:"ns-kv",onPointerDown:x=>x.stopPropagation(),children:[y.jsx("div",{className:"ns-kv__title",children:"属性"}),y.jsx("ul",{className:"ns-kv__list",children:m.map(x=>y.jsxs("li",{className:"ns-kv__row",children:[y.jsx("input",{className:"ns-kv__key",value:x.key,placeholder:"名称","aria-label":"属性名",onChange:S=>{const R=S.target.value;v(A=>A.map(q=>q.id===x.id?{...q,key:R}:q))},onBlur:()=>o(yo(_.current))}),y.jsx("input",{className:"ns-kv__val",value:x.value,placeholder:"内容","aria-label":"属性值",onChange:S=>{const R=S.target.value;v(A=>A.map(q=>q.id===x.id?{...q,value:R}:q))},onBlur:()=>o(yo(_.current))}),y.jsx("button",{type:"button",className:"ns-kv__del",title:"删除",onClick:()=>N(_.current.filter(S=>S.id!==x.id)),children:"×"})]},x.id))}),y.jsx("button",{type:"button",className:"ns-kv__add",onClick:()=>{v(x=>[...x,{id:`new-${Date.now()}`,key:"",value:""}])},children:"+ 添加一项"})]})}function H0({def:i,node:f,onCommit:s,onClear:o}){const m=d0(f,i.id),v=!i.always,[_,N]=K.useState(!1),[x,S]=K.useState(null),R=K.useRef(null);return i.kind==="image"?y.jsxs("div",{className:"ns-row",children:[y.jsx("span",{className:"ns-row__label",children:i.label}),y.jsxs("div",{className:"ns-row__ctrl ns-row__ctrl--image",onPointerDown:A=>A.stopPropagation(),children:[m?y.jsx("img",{className:"ns-thumb",src:m,alt:""}):null,y.jsxs("div",{className:"ns-image-actions",children:[y.jsx("button",{type:"button",className:"ns-image-pick",disabled:_,onClick:()=>{var A;return(A=R.current)==null?void 0:A.click()},children:_?"上传中…":"选择文件"}),y.jsx("input",{ref:R,type:"file",accept:"image/jpeg,image/png,image/webp,image/gif",hidden:!0,onChange:A=>{var et;const q=(et=A.target.files)==null?void 0:et[0];A.target.value="",q&&(S(null),N(!0),C0(q).then(tt=>s(tt)).catch(tt=>S(String((tt==null?void 0:tt.message)||tt||"上传失败"))).finally(()=>N(!1)))}}),y.jsx("input",{className:"ns-image-url",defaultValue:m,placeholder:"或粘贴图片 URL",onBlur:A=>{const q=A.target.value.trim();q!==(m||"")&&s(q)},onKeyDown:A=>{A.key==="Enter"&&A.target.blur()}},`${i.id}-${f.id}-${f.version}`),v?y.jsx("button",{type:"button",className:"ns-row__clear",title:"清除",onClick:o,children:"×"}):null]}),x?y.jsx("div",{className:"ns-image-err",children:x}):null,y.jsx("div",{className:"ns-image-hint",children:"支持本地选图或粘贴 https://… 链接"})]})]}):y.jsxs("div",{className:"ns-row",children:[y.jsx("span",{className:"ns-row__label",children:i.label}),y.jsxs("div",{className:"ns-row__ctrl",onPointerDown:A=>A.stopPropagation(),children:[i.kind==="textarea"||i.kind==="links"?y.jsx("textarea",{defaultValue:m,rows:i.kind==="links"?3:2,placeholder:i.kind==="links"?"标题|url 每行一条":"",onBlur:A=>s(A.target.value)},`${i.id}-${f.id}-${f.version}`):i.kind==="datetime"?y.jsx("input",{type:"datetime-local",defaultValue:m,onBlur:A=>s(A.target.value)},`${i.id}-${f.id}-${f.version}`):i.kind==="flag"?y.jsx("button",{type:"button",onClick:()=>s(f.pinned?"0":"1"),children:f.pinned?"解钉":"钉住"}):y.jsx("input",{defaultValue:m,placeholder:i.kind==="tags"?"逗号分隔":"",onBlur:A=>s(A.target.value),onKeyDown:A=>{A.key==="Enter"&&A.target.blur()}},`${i.id}-${f.id}-${f.version}`),v?y.jsx("button",{type:"button",className:"ns-row__clear",title:"清除",onClick:o,children:"×"}):null]})]})}function w0({node:i,applyOps:f,screenX:s,screenY:o,zoom:m,accent:v,width:_,showStylePreset:N}){return y.jsx("div",{className:"ns-overlay",style:{left:s,top:o,width:_,transform:`translate(-50%, -50%) scale(${m})`},children:y.jsx(jh,{node:i,applyOps:f,accent:v,showStylePreset:N})})}const _h=i=>{let f;const s=new Set,o=(S,R)=>{const A=typeof S=="function"?S(f):S;if(!Object.is(A,f)){const q=f;f=R??(typeof A!="object"||A===null)?A:Object.assign({},f,A),s.forEach(et=>et(f,q))}},m=()=>f,N={setState:o,getState:m,getInitialState:()=>x,subscribe:S=>(s.add(S),()=>s.delete(S))},x=f=i(o,m,N);return N},B0=(i=>i?_h(i):_h),Y0=i=>i;function q0(i,f=Y0){const s=$i.useSyncExternalStore(i.subscribe,$i.useCallback(()=>f(i.getState()),[i,f]),$i.useCallback(()=>f(i.getInitialState()),[i,f]));return $i.useDebugValue(s),s}const zh=i=>{const f=B0(i),s=o=>q0(f,o);return Object.assign(s,f),s},X0=(i=>i?zh(i):zh);async function en(i,f){const s=await fetch(i,{...f,headers:{"Content-Type":"application/json",...(f==null?void 0:f.headers)??{}}}),o=await s.json();if(!s.ok)throw new Error(o.message??o.error??s.statusText);return o}function L0(i,f){const s={...i};for(const[o,m]of Object.entries(f))s[o]={...m};for(const o of Object.keys(s))o in f||delete s[o];return s}function Eh(i,f,s){const o={...f};for(const[m,v]of Object.entries(i))!s.has(m)&&o[m]&&(o[m]={...v});for(const m of s)f[m]?o[m]={...f[m]}:i[m]&&(o[m]={...i[m]});return o}const Ah=new Map,Ct=X0((i,f)=>({canvases:[],canvasId:null,canvas:null,nodes:[],edges:[],positions:{},selectedIds:[],selectedEdgeId:null,highlightIds:[],highlightEdgeIds:[],highlightStyle:null,fitViewport:null,leftCollapsed:!1,themeId:localStorage.getItem("mind-map:theme")??"abyss",lastChangeSetId:null,trash:[],loadCanvases:async()=>{const s=await en("/api/canvases");i({canvases:s.canvases}),!f().canvasId&&s.canvases[0]&&await f().openCanvas(s.canvases[0].id)},openCanvas:async s=>{const o=await en(`/api/canvases/${s}`);i({canvasId:s,canvas:o.canvas,nodes:o.nodes,edges:o.edges,positions:o.positions,selectedIds:[],selectedEdgeId:null,themeId:o.canvas.prefs.themeId??f().themeId}),await f().loadTrash()},createCanvas:async s=>{const o=await en("/api/canvases",{method:"POST",body:JSON.stringify({title:s})});await f().loadCanvases(),i({canvasId:o.canvas.id,canvas:o.canvas,nodes:o.nodes,edges:o.edges,positions:o.positions,selectedIds:[]})},patchLocal:s=>{i(o=>({nodes:s.nodes??o.nodes,edges:s.edges??o.edges,positions:s.positions??o.positions,canvas:s.canvas??o.canvas}))},requestFitViewport:s=>i({fitViewport:s}),consumeFitViewport:()=>{const s=f().fitViewport;return s&&i({fitViewport:null}),s},applyOps:async(s,o)=>{const m=f().canvasId;if(!m)return;const v=s.some(q=>q.type==="delete_node"||q.type==="restore_node"),_=s.some(q=>q.type==="set_prefs"||q.type==="update_text"),N=s.length>0&&s.every(q=>q.type==="set_pinned"),x=new Set(s.filter(q=>q.type==="set_pinned"&&q.pinned===!0).map(q=>q.nodeId)),S={...f().positions},R=await en(`/api/canvases/${m}/ops`,{method:"POST",body:JSON.stringify({ops:s,origin:"user",summary:o})}),A=N&&x.size>0?Eh(S,R.positions,x):L0(S,R.positions);i({canvas:R.canvas,nodes:R.nodes,edges:R.edges,positions:A,lastChangeSetId:R.changeSetId,themeId:R.canvas.prefs.themeId,...R.fitViewport?{fitViewport:R.fitViewport}:{}}),N&&x.size>0&&Ah.set(m,{positions:{...A},pinnedIds:[...x],until:Date.now()+2e3}),_&&f().loadCanvases(),v&&f().loadTrash()},applyCanvasPayload:(s,o)=>{const m=s.canvas.id,v=Ah.get(m),_=f().positions;let N=s.positions;if(o!=null&&o.preserveUnpinned||v&&v.until>Date.now()){const x=new Set((v==null?void 0:v.pinnedIds)??s.nodes.filter(S=>S.pinned&&S.pos).map(S=>S.id));N=Eh((v==null?void 0:v.positions)??_,s.positions,x)}i({canvasId:m,canvas:s.canvas,nodes:s.nodes,edges:s.edges,positions:N,themeId:s.canvas.prefs.themeId??f().themeId})},undo:async()=>{const s=f().canvasId,o=f().lastChangeSetId;if(!s||!o)return;const m=await en(`/api/canvases/${s}/undo`,{method:"POST",body:JSON.stringify({changeSetId:o})});await f().openCanvas(s),i({lastChangeSetId:m.changeSetId})},setSelection:s=>i({selectedIds:s,selectedEdgeId:null}),setSelectedEdge:s=>i({selectedEdgeId:s,selectedIds:s?[]:f().selectedIds}),flashHighlight:s=>{const o=Array.isArray(s)?{nodeIds:s}:s,m=o.nodeIds??[],v=o.edgeIds??[],_=o.style??null,N=Math.max(500,Math.min(6e4,o.ttlMs??2200));i({highlightIds:m,highlightEdgeIds:v,highlightStyle:_,selectedIds:m.length?m:f().selectedIds,selectedEdgeId:v.length===1?v[0]:f().selectedEdgeId}),window.setTimeout(()=>{const x=Ct.getState();x.highlightIds.length===m.length&&x.highlightIds.every((S,R)=>S===m[R])&&x.highlightEdgeIds.length===v.length&&x.highlightEdgeIds.every((S,R)=>S===v[R])&&i({highlightIds:[],highlightEdgeIds:[],highlightStyle:null})},N)},setThemeId:s=>{localStorage.setItem("mind-map:theme",s),i({themeId:s})},setCollapsedPanels:(s,o)=>{s==="left"&&i({leftCollapsed:o})},setPrefs:async s=>{await f().applyOps([{type:"set_prefs",prefs:s}],"update prefs")},setStylePreset:async(s,o)=>{await f().applyOps([{type:"set_style_preset",nodeId:s,stylePreset:o}],"style")},loadTrash:async()=>{const s=f().canvasId;if(!s)return;const o=await en(`/api/canvases/${s}/trash`);i({trash:o.nodes})},restoreFromTrash:async s=>{const o=f().canvasId;o&&(await en(`/api/canvases/${o}/trash/${s}/restore`,{method:"POST"}),await f().openCanvas(o),await f().loadTrash())}}));function G0(){const i=Ct(S=>S.canvas),f=Ct(S=>S.nodes),s=Ct(S=>S.edges),o=Ct(S=>S.selectedIds),m=Ct(S=>S.selectedEdgeId),v=Ct(S=>S.applyOps),_=(i==null?void 0:i.prefs.inspectorMode)??"selection",N=K.useMemo(()=>o[0]?f.find(S=>S.id===o[0]):void 0,[f,o]),x=K.useMemo(()=>m?s.find(S=>S.id===m):void 0,[s,m]);return _==="selection"&&!N&&!x?y.jsx("div",{className:"inspector muted",children:"选中节点或边以编辑属性"}):x&&!N?y.jsx(Q0,{edge:x,applyOps:v}):N?y.jsx(V0,{node:N,applyOps:v}):y.jsx("div",{className:"inspector muted",children:"选中节点或边以编辑属性"})}function V0({node:i,applyOps:f}){return y.jsxs("div",{className:"inspector",children:[y.jsx("div",{className:"inspector__title",children:"节点属性"}),y.jsx(jh,{node:i,applyOps:f,variant:"panel",showStylePreset:!0}),y.jsx("div",{className:"inspector__row",style:{marginTop:8},children:y.jsx("button",{type:"button",onClick:()=>void f([{type:"set_collapsed",nodeId:i.id,collapsed:!i.collapsed}]),children:i.collapsed?"展开":"折叠"})})]})}function Q0({edge:i,applyOps:f}){var m;const[s,o]=K.useState(((m=i.tags)==null?void 0:m.join(", "))??"");return K.useEffect(()=>{var v;o(((v=i.tags)==null?void 0:v.join(", "))??"")},[i.id,i.version,i.tags]),y.jsxs("div",{className:"inspector",children:[y.jsx("div",{className:"inspector__title",children:"边属性"}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"标签"}),y.jsx("input",{defaultValue:i.label??"",onBlur:v=>{f([{type:"update_edge_meta",edgeId:i.id,patch:{label:v.target.value||null}}])}},`el-${i.id}-${i.version}`)]}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"备注"}),y.jsx("textarea",{defaultValue:i.note??"",rows:2,onBlur:v=>{f([{type:"update_edge_meta",edgeId:i.id,patch:{note:v.target.value||null}}])}},`en-${i.id}-${i.version}`)]}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"线粗 (1-5)"}),y.jsx("input",{type:"number",min:1,max:5,defaultValue:i.weight??1,onBlur:v=>{const _=Number(v.target.value),N=Number.isFinite(_)?Math.max(1,Math.min(5,Math.round(_))):null;f([{type:"update_edge_meta",edgeId:i.id,patch:{weight:N}}])}},`ew-${i.id}-${i.version}`)]}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"线型"}),y.jsxs("select",{defaultValue:i.lineStyle??(i.kind==="relation"?"dashed":"solid"),onChange:v=>{const _=v.target.value;f([{type:"update_edge_meta",edgeId:i.id,patch:{lineStyle:_}}])},children:[y.jsx("option",{value:"solid",children:"实线"}),y.jsx("option",{value:"dashed",children:"虚线"}),y.jsx("option",{value:"dotted",children:"点线"})]},`es-${i.id}-${i.version}`)]}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"箭头"}),y.jsxs("select",{defaultValue:i.direction??(i.kind==="relation"?"forward":"none"),onChange:v=>{const _=v.target.value;f([{type:"update_edge_meta",edgeId:i.id,patch:{direction:_}}])},children:[y.jsx("option",{value:"forward",children:"单向 →"}),y.jsx("option",{value:"both",children:"双向 ↔"}),y.jsx("option",{value:"none",children:"无箭头"})]},`ed-${i.id}-${i.version}`)]}),y.jsxs("label",{className:"inspector__field",children:[y.jsx("span",{children:"标签(逗号分隔)"}),y.jsx("input",{value:s,onChange:v=>o(v.target.value),onBlur:()=>{const v=s.split(/[,,]/).map(_=>_.trim()).filter(Boolean);f([{type:"update_edge_meta",edgeId:i.id,patch:{tags:v}}])}})]}),y.jsxs("div",{className:"muted",style:{fontSize:11},children:[i.kind," · ",i.from.slice(0,8)," → ",i.to.slice(0,8)]})]})}const Ch={bgBase:"#101014",bgLayer1:"#1b1e28",labelPrimary:"#f4f5f7",labelSecondary:"#a5adb8",brand:"#5e6ad2",border:"rgba(255,255,255,0.08)",bubble:"rgba(37,42,58,0.9)",warn:"#f59e5b",error:"#ef4444",glassFill:"rgba(45, 52, 68, 0.96)",glassBorder:"rgba(255, 255, 255, 0.22)",glassHighlight:"rgba(255, 255, 255, 0.06)",glassHeader:"rgba(255, 255, 255, 0.05)"},Z0={bgBase:"#f4f5f7",bgLayer1:"#ffffff",labelPrimary:"#1f2329",labelSecondary:"#646a73",brand:"#5e6ad2",border:"rgba(0,0,0,0.08)",bubble:"rgba(255,255,255,0.92)",warn:"#d97706",error:"#dc2626",glassFill:"rgba(255, 255, 255, 0.96)",glassBorder:"rgba(0, 0, 0, 0.12)",glassHighlight:"rgba(255, 255, 255, 0.4)",glassHeader:"rgba(0, 0, 0, 0.03)"};function K0(){try{const i=document.documentElement.dataset.colorScheme;if(i==="light"||i==="dark")return i;if(matchMedia("(prefers-color-scheme: light)").matches)return"light"}catch{}return"dark"}const J0=Ch,Uh=[{key:"bgBase",css:"--dsw-alias-bg-base"},{key:"bgLayer1",css:"--dsw-alias-bg-layer-1"},{key:"labelPrimary",css:"--dsw-alias-label-primary"},{key:"labelSecondary",css:"--dsw-alias-label-secondary"},{key:"brand",css:"--dsw-alias-brand-primary"},{key:"border",css:"--dsw-alias-border-l1"},{key:"bubble",css:"--dsw-specific-bubble"},{key:"warn",css:"--dsw-alias-state-warn-primary"},{key:"error",css:"--dsw-alias-state-error-primary"}];function k0(i){try{return getComputedStyle(document.documentElement).getPropertyValue(i).trim()}catch{return""}}function $0(i=window.location.search){const f=new URLSearchParams(i),s=document.documentElement;for(const{key:m,css:v}of Uh){const _=f.get(`t_${m}`);_&&s.style.setProperty(v,decodeURIComponent(_))}const o=f.get("colorScheme");(o==="light"||o==="dark")&&(s.dataset.colorScheme=o)}function W0(){const f=K0()==="light"?Z0:Ch,s={...f};for(const{key:o,css:m}of Uh){const v=k0(m);v&&(s[o]=v)}return s.glassFill=f.glassFill,s.glassBorder=f.glassBorder,s.glassHighlight=f.glassHighlight,s.glassHeader=f.glassHeader,s}function F0(i,f=8){const s=i.startsWith("#")?i:J0.brand,o=/^#?([0-9a-f]{6})$/i.exec(s.trim()),m=o?parseInt(o[1],16):6187730,v=m>>16&255,_=m>>8&255,N=m&255,x=Math.max(v,_,N)/255,S=Math.min(v,_,N)/255,R=(x+S)/2;let A=0,q=0;if(x!==S){const tt=x-S;q=R>.5?tt/(2-x-S):tt/(x+S);const dt=v/255,ft=_/255,G=N/255;switch(x){case dt:A=((ft-G)/tt+(ft{const _=(v+i/30)%12,N=s-o*Math.max(Math.min(_-3,9-_,1),-1);return Math.round(255*N).toString(16).padStart(2,"0")};return`#${m(0)}${m(8)}${m(4)}`}function po(i,f){const s=new Map;for(const _ of f){if(_.deletedAt||_.kind!=="hierarchy"||!_.isPrimaryParent)continue;const N=s.get(_.from)??[];N.push(_.to),s.set(_.from,N)}const o=[i],m=new Set([i]),v=[i];for(;v.length;){const _=v.shift();for(const N of s.get(_)??[])m.has(N)||(m.add(N),o.push(N),v.push(N))}return o}function Mh(i,f,s){return po(f,s).includes(i)}function P0(i,f,s){if(f)return s&&s.ids.includes(i)?{x:f.x+s.dx,y:f.y+s.dy}:f}function tv({node:i,x:f,y:s}){var _;const o=(i.tags??[]).slice(0,4),m=(i.note??"").trim(),v=((_=i.links)==null?void 0:_.length)??0;return y.jsxs("div",{className:"hover-card",style:{left:f,top:s},children:[y.jsx("div",{className:"hover-card__title",children:i.text}),m?y.jsx("div",{className:"hover-card__note",children:m.slice(0,120)}):null,o.length?y.jsx("div",{className:"hover-card__tags",children:o.map(N=>y.jsx("span",{className:"hover-card__tag",children:N},N))}):null,y.jsxs("div",{className:"hover-card__meta",children:[v?`${v} 链接`:null,i.dueAt!=null?`${v?" · ":""}截止 ${new Date(i.dueAt).toLocaleDateString()}`:null,i.stylePreset!=="default"?`${v||i.dueAt?" · ":""}${i.stylePreset}`:null]})]})}function lv({label:i,value:f,x:s,y:o}){return y.jsxs("div",{className:"prop-tooltip",style:{left:s,top:o},role:"tooltip",children:[y.jsx("div",{className:"prop-tooltip__label",children:i}),y.jsx("div",{className:"prop-tooltip__value",children:f})]})}function Rh(i,f){const s=URL.createObjectURL(i),o=document.createElement("a");o.href=s,o.download=f,o.click(),window.setTimeout(()=>URL.revokeObjectURL(s),2e3)}function ev(i,f,s){Rh(new Blob([i],{type:s}),f)}function av(i,f){return new Promise((s,o)=>{i.toBlob(m=>{if(!m){o(new Error("png_encode_failed"));return}Rh(m,f),s()},"image/png")})}async function nv(i){i.fitView(),await new Promise(f=>requestAnimationFrame(()=>requestAnimationFrame(()=>f()))),await new Promise(f=>setTimeout(f,40)),await av(i.canvas,i.filename)}async function uv(i,f){const s=await fetch(`/api/canvases/${encodeURIComponent(i)}/export.svg`);if(!s.ok)throw new Error(`svg_export_${s.status}`);const o=await s.text();ev(o,f,"image/svg+xml;charset=utf-8")}const iv={unnamed:"未命名",newNode:"新节点",leftChild:"左侧子主题",rightChild:"右侧子主题",sibling:"兄弟节点",relationLabel:"关联",toolbarAria:"画布工具",controlsAria:"视图控制",backRosterTitle:"返回画布列表",backRoster:"返回",toolSelect:"选择",toolPan:"平移",toolLink:"连线",dragNode:"单点",dragBranch:"整枝",dragNodeTitle:"单点拖拽:只移动当前节点 (N);按住 Shift 也可临时单点",dragBranchTitle:"整枝拖拽:节点与子孙一起移动 (B)",bubble:"气泡",card:"卡片",topology:"拓扑",bubbleTitle:"气泡视图:精简标题",cardTitle:"卡片视图:单击展开全文 · 悬停属性看详情 · 双击编辑",topologyTitle:"拓扑视图:路由器图标 + 链路",unpin:"解钉",unpinTitle:"取消钉住:让选中节点重新参与自动布局",undo:"撤销",fullscreen:"全屏",exitFullscreen:"退出全屏",zoomIn:"放大",zoomInTitle:"放大 (+)",zoomOut:"缩小",zoomOutTitle:"缩小 (-)",fit:"适应画布",fitTitle:"适应画布 (F)",lock:"锁定",unlock:"解锁",lockTitle:"锁定画布 (L)",unlockTitle:"解锁画布 (L)",addLeftChildTitle:"添加左侧子主题",addRightChildTitle:"添加右侧子主题",hintLocked:"已锁定 · 仅浏览/缩放/平移",hintNodeDrag:"单点拖 · 只移动当前节点 · Shift 临时单点 · Esc 取消",hintBranchDrag:"整枝拖 · 空白钉住 · 落到节点换父 · N 单点 · Esc 取消",exportPng:"PNG",exportPngTitle:"导出 PNG(先适应画布再截取)",exportSvg:"SVG",exportSvgTitle:"导出 SVG 矢量图"},cv={unnamed:"Untitled",newNode:"New node",leftChild:"Left child",rightChild:"Right child",sibling:"Sibling",relationLabel:"Link",toolbarAria:"Canvas tools",controlsAria:"View controls",backRosterTitle:"Back to canvas list",backRoster:"Back",toolSelect:"Select",toolPan:"Pan",toolLink:"Link",dragNode:"Node",dragBranch:"Branch",dragNodeTitle:"Move node only (N); hold Shift for temporary node-drag",dragBranchTitle:"Move node with descendants (B)",bubble:"Bubble",card:"Card",topology:"Topology",bubbleTitle:"Bubble view: title only",cardTitle:"Card view: click expand · hover props · double-click edit",topologyTitle:"Topology view: router icons + links",unpin:"Unpin",unpinTitle:"Unpin selected node for auto layout",undo:"Undo",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",zoomIn:"Zoom in",zoomInTitle:"Zoom in (+)",zoomOut:"Zoom out",zoomOutTitle:"Zoom out (-)",fit:"Fit",fitTitle:"Fit view (F)",lock:"Lock",unlock:"Unlock",lockTitle:"Lock canvas (L)",unlockTitle:"Unlock canvas (L)",addLeftChildTitle:"Add left child",addRightChildTitle:"Add right child",hintLocked:"Locked · browse / zoom / pan only",hintNodeDrag:"Node drag · Shift temp node · Esc cancel",hintBranchDrag:"Branch drag · pin on blank · drop to reparent · N node · Esc cancel",exportPng:"PNG",exportPngTitle:"Export PNG (fit view, then capture)",exportSvg:"SVG",exportSvgTitle:"Export SVG vector"},fv={zh:iv,en:cv};function wu(i){const f=String(i??"").trim().toLowerCase();return f.startsWith("zh")?"zh":f?"en":typeof navigator<"u"&&String(navigator.language||"").toLowerCase().startsWith("zh")?"zh":"en"}function ov(i){const f=wu(i);return fv[f]}const sv="dsh-mind-map:locale";function Hh(){try{const i=new URLSearchParams(window.location.search),f=i.get("lang")||i.get("locale");return f?wu(f):null}catch{return null}}function wh(){var i;try{const f=(i=document.documentElement)==null?void 0:i.lang;return f?wu(f):null}catch{return null}}function rv(){return Hh()||wh()||wu(navigator.language)}function dv(){const[i,f]=K.useState(rv);K.useEffect(()=>{const o=N=>{const x=wu(N);f(S=>S===x?S:x)},m=N=>{const x=N==null?void 0:N.data;!x||typeof x!="object"||x.type===sv&&o(x.lang??x.locale)};window.addEventListener("message",m);const v=new MutationObserver(()=>{const N=wh();N&&o(N)});v.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]});const _=Hh();return _&&o(_),()=>{window.removeEventListener("message",m),v.disconnect()}},[]);const s=K.useMemo(()=>ov(i),[i]);return{locale:i,U:s}}const hv=200,an=168,nn=118;function xh(){var sn;const{U:i}=dv(),f=K.useRef(null),s=K.useRef(null),o=K.useRef(null),m=Ct(g=>g.nodes),v=Ct(g=>g.edges),_=Ct(g=>g.positions),N=Ct(g=>g.selectedIds),x=Ct(g=>g.highlightIds),S=Ct(g=>g.highlightEdgeIds),R=Ct(g=>g.highlightStyle),A=Ct(g=>g.canvas),q=Ct(g=>g.canvasId),et=Ct(g=>g.applyOps),tt=Ct(g=>g.setPrefs),dt=Ct(g=>g.patchLocal),ft=Ct(g=>g.setSelection),G=Ct(g=>g.undo),pt=Ct(g=>g.lastChangeSetId),St=typeof window<"u"&&(()=>{try{const g=new URLSearchParams(window.location.search);return g.get("embed")==="1"||g.get("embed")==="true"}catch{return!1}})(),P=K.useCallback(()=>{var g;try{(g=window.parent)==null||g.postMessage({type:"dsh-mind-map:back"},"*")}catch{}},[]),nt=K.useCallback(async()=>{var d;const g=o.current;if(g)try{if(document.fullscreenElement){await document.exitFullscreen();return}await g.requestFullscreen()}catch{try{(d=window.parent)==null||d.postMessage({type:"dsh-mind-map:fullscreen"},"*")}catch{}}},[]);K.useEffect(()=>{const g=()=>V(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",g),()=>document.removeEventListener("fullscreenchange",g)},[]);const[H,W]=K.useState({x:0,y:0,zoom:1}),nl=Ct(g=>g.fitViewport),ul=Ct(g=>g.consumeFitViewport);K.useEffect(()=>{if(!nl)return;const g=ul();g&&W(g)},[nl,ul]);const[vl,rl]=K.useState("select"),[Lt,lt]=K.useState("node"),[it,qt]=K.useState(!1),[O,V]=K.useState(!1),[ot,Gt]=K.useState(0),[Qt,b]=K.useState(0),[C,Q]=K.useState(null),[k,st]=K.useState(null),[ht,Dt]=K.useState(null),[tl,Pt]=K.useState(null),[te,se]=K.useState(null),[Oe,Da]=K.useState(null),[Ml,we]=K.useState(null),[cn,ja]=K.useState(null),[fn,Be]=K.useState(!1),[Dl,Zn]=K.useState({w:1,h:1}),[tc,Ca]=K.useState(null),Z=K.useRef({mode:"none",lastX:0,lastY:0,space:!1,nodeId:null,startX:0,startY:0,moved:!1,alt:!1,forcePin:!1,startWorldX:0,startWorldY:0,subtreeIds:[]}),Bu=K.useRef(null);Bu.current=Ml;const Ua=K.useRef(!1),Tt=K.useMemo(()=>W0(),[ot]),aa=K.useMemo(()=>F0(Tt.brand,8),[Tt.brand]);K.useEffect(()=>{var Y;const g=()=>Gt(X=>X+1),d=window.matchMedia("(prefers-color-scheme: light)");return(Y=d.addEventListener)==null||Y.call(d,"change",g),()=>{var X;return(X=d.removeEventListener)==null?void 0:X.call(d,"change",g)}},[]);const il=(A==null?void 0:A.prefs.density)==="compact",Kl=(A==null?void 0:A.prefs.nodeViewMode)??"card",dl=Kl==="card",Ul=Kl==="topology",jl=K.useCallback(g=>b0(g,il,{asCard:dl,asTopology:Ul,expanded:dl&&ht===g.id}),[il,dl,Ul,ht]),Rl=il?160:hv,Ll=K.useCallback(g=>!Ul||g.type!=="create_node"||g.icon!=null?g:{...g,icon:"router"},[Ul]),Gl=(A==null?void 0:A.prefs.branchColoring)!==!1,na=K.useMemo(()=>{const g=new Map;if(!Gl)return g;const d=m.filter(F=>F.deletedAt?!1:!v.some(L=>L.kind==="hierarchy"&&L.isPrimaryParent&&L.to===F.id));let Y=0;for(const F of d)g.set(F.id,aa[Y%aa.length]),Y++;const X=(F,L)=>{for(const J of v)J.kind==="hierarchy"&&J.isPrimaryParent&&J.from===F&&(g.set(J.to,L),X(J.to,L))};for(const[F,L]of g)X(F,L);return g},[m,v,aa,Gl]),Ra=K.useCallback((g,d)=>{const X=o.current.getBoundingClientRect();return{x:(g-X.left-X.width/2-H.x)/H.zoom,y:(d-X.top-X.height/2-H.y)/H.zoom}},[H]),Ql=K.useCallback(g=>P0(g,_[g],Ml),[_,Ml]),ze=K.useCallback((g,d,Y)=>{for(let X=m.length-1;X>=0;X--){const F=m[X];if(F.deletedAt||Y!=null&&Y.has(F.id))continue;const L=Ql(F.id);if(!L)continue;const{w:J,h:rt}=jl(F);if(g>=L.x-J/2&&g<=L.x+J/2&&d>=L.y-rt/2&&d<=L.y+rt/2)return F.id}return null},[m,Ql,il]),Ee=K.useMemo(()=>{let g=0,d=0,Y=0,X=0,F=!1;for(const J of m){if(J.deletedAt)continue;const rt=_[J.id];rt&&(F?(g=Math.min(g,rt.x),d=Math.max(d,rt.x),Y=Math.min(Y,rt.y),X=Math.max(X,rt.y)):(g=rt.x,d=rt.x,Y=rt.y,X=rt.y,F=!0))}if(!F)return{minX:-200,maxX:200,minY:-120,maxY:120};const L=80;return{minX:g-L,maxX:d+L,minY:Y-L,maxY:X+L}},[m,_]),De=K.useCallback(g=>{W(d=>({...d,zoom:Math.min(4,Math.max(.02,g))}))},[]),re=K.useCallback(()=>{const{minX:g,maxX:d,minY:Y,maxY:X}=Ee,F=Math.max(40,d-g),L=Math.max(40,X-Y),J=Dl.w||1,rt=Dl.h||1,Rt=Math.min(2.5,Math.max(.12,Math.min(J*.86/F,rt*.86/L))),zt=(g+d)/2,Ut=(Y+X)/2;W({x:-zt*Rt,y:-Ut*Rt,zoom:Rt})},[Ee,Dl]),Ha=K.useCallback((g,d)=>{const Y=s.current;if(!Y)return;const X=Y.getBoundingClientRect(),{minX:F,maxX:L,minY:J,maxY:rt}=Ee,Rt=Math.max(1,L-F),zt=Math.max(1,rt-J),Ut=F+(g-X.left)/X.width*Rt,bt=J+(d-X.top)/X.height*zt;W(B=>({...B,x:-Ut*B.zoom,y:-bt*B.zoom}))},[Ee]),je=K.useCallback(()=>{var bt;const g=f.current;if(!g)return;const d=g.getContext("2d");if(!d)return;const Y=window.devicePixelRatio||1;d.setTransform(Y,0,0,Y,0,0);const X=g.clientWidth,F=g.clientHeight;d.clearRect(0,0,X,F),d.fillStyle=Tt.bgBase,d.fillRect(0,0,X,F),d.save(),d.translate(X/2+H.x,F/2+H.y),d.scale(H.zoom,H.zoom),d.strokeStyle=Tt.border,d.lineWidth=1/H.zoom;const L=48,J=Math.floor((-X/2-H.x)/H.zoom/L)*L-L*2,rt=Math.ceil((X/2-H.x)/H.zoom/L)*L+L*2,Rt=Math.floor((-F/2-H.y)/H.zoom/L)*L-L*2,zt=Math.ceil((F/2-H.y)/H.zoom/L)*L+L*2;d.globalAlpha=.35,d.beginPath();for(let B=J;B<=rt;B+=L)d.moveTo(B,Rt),d.lineTo(B,zt);for(let B=Rt;B<=zt;B+=L)d.moveTo(J,B),d.lineTo(rt,B);d.stroke(),d.globalAlpha=1;for(const B of v){if((A==null?void 0:A.prefs.showRelationEdges)===!1&&B.kind==="relation")continue;const xt=Ql(B.from),ut=Ql(B.to);if(!xt||!ut)continue;const Ht=m.find(Kt=>Kt.id===B.from),Vt=m.find(Kt=>Kt.id===B.to),Zt=Ht?jl(Ht).w:Rl,gl=Vt?jl(Vt).w:Rl,ol=Ht?jl(Ht).h:40,Sl=Vt?jl(Vt).h:40;d.beginPath();let Et,wt,mt,ll,Hl;if(Ul){const Kt=il?Na.compact:Na.comfortable,_t=il?4:6;Et=xt.x,wt=xt.y-ol/2+_t+Kt/2,mt=ut.x,ll=ut.y-Sl/2+_t+Kt/2,Hl=(Et+mt)/2,d.moveTo(Et,wt),d.lineTo(mt,ll)}else Et=xt.x+(ut.x>=xt.x?Zt/2:-Zt/2),wt=xt.y,mt=ut.x+(ut.x>=xt.x?-gl/2:gl/2),ll=ut.y,Hl=(Et+mt)/2,d.moveTo(Et,wt),d.bezierCurveTo(Hl,wt,Hl,ll,mt,ll);const de=Math.max(1,Math.min(5,B.weight??1)),Ae=Ul?B.lineStyle??"solid":B.lineStyle??(B.kind==="relation"?"dashed":"solid");Ae==="dotted"?d.setLineDash([2/H.zoom,4/H.zoom]):Ae==="dashed"?d.setLineDash([6/H.zoom,4/H.zoom]):d.setLineDash([]);const sl=S.includes(B.id),xl=(R==null?void 0:R.edgeColor)??Tt.brand,cl=(R==null?void 0:R.edgeWidth)??3.6,Jl=sl?xl:Ul?"#2563eb":B.kind==="relation"?Tt.labelSecondary:na.get(B.to)??Tt.brand;d.strokeStyle=Jl,d.lineWidth=(sl?cl:Ul?1.8+(de-1)*.5:1.2+(de-1)*.7)/H.zoom,d.stroke(),d.setLineDash([]);const he=B.direction??(Ul?"none":B.kind==="relation"?"forward":"none");if(he==="forward"||he==="both"){const Kt=Ul?Math.atan2(ll-wt,mt-Et):Math.atan2(0,mt-Hl||(mt>=xt.x?1:-1)),_t=8/H.zoom;d.beginPath(),d.fillStyle=Jl,d.moveTo(mt,ll),d.lineTo(mt-_t*Math.cos(Kt-.45),ll-_t*Math.sin(Kt-.45)),d.lineTo(mt-_t*Math.cos(Kt+.45),ll-_t*Math.sin(Kt+.45)),d.closePath(),d.fill()}if(he==="both"){const Kt=Ul?Math.atan2(wt-ll,Et-mt):Math.atan2(0,Et-Hl||(xt.x>=ut.x?1:-1)),_t=8/H.zoom;d.beginPath(),d.fillStyle=Jl,d.moveTo(Et,wt),d.lineTo(Et-_t*Math.cos(Kt-.45),wt-_t*Math.sin(Kt-.45)),d.lineTo(Et-_t*Math.cos(Kt+.45),wt-_t*Math.sin(Kt+.45)),d.closePath(),d.fill()}B.label&&H.zoom>=.25&&(d.fillStyle=Tt.labelSecondary,d.font="11px sans-serif",d.fillText(B.label,Hl,(wt+ll)/2-6))}if(Oe){const B=Ql(Oe.fromId);if(B){const xt=m.find(Zt=>Zt.id===Oe.fromId),ut=xt?jl(xt).h:40;let Ht=B.x,Vt=B.y;if(Ul){const Zt=il?Na.compact:Na.comfortable,gl=il?4:6;Vt=B.y-ut/2+gl+Zt/2}d.beginPath(),d.setLineDash([4/H.zoom,4/H.zoom]),d.strokeStyle=Ul?"#2563eb":Tt.brand,d.moveTo(Ht,Vt),d.lineTo(Oe.x,Oe.y),d.stroke(),d.setLineDash([])}}const Ut=(A==null?void 0:A.prefs.nodeBadges)??"icons";for(const B of m){if(B.deletedAt)continue;const xt=Ql(B.id);if(!xt)continue;const ut=!!(Ml!=null&&Ml.ids.includes(B.id)),{w:Ht,h:Vt}=jl(B),Zt=xt.x-Ht/2,gl=xt.y-Vt/2,ol=B.accentColor??na.get(B.id)??Tt.bubble,Sl=N.includes(B.id),Et=x.includes(B.id),wt=(R==null?void 0:R.nodeColor)??Tt.brand,mt=k===B.id,ll=cn===B.id,Hl=fn&≪if(ut&&(d.globalAlpha=.7),Ul){const sl=il?Na.compact:Na.comfortable,xl=il?4:6,cl=Zt+(Ht-sl)/2,Nl=gl+xl;Et&&(R==null?void 0:R.nodeGlow)!==!1?(d.shadowColor=wt,d.shadowBlur=14/H.zoom):(Sl||mt)&&(d.shadowColor=ol,d.shadowBlur=10/H.zoom);const Jl=go(p0,()=>b(_t=>_t+1));if(Jl&&Jl.naturalWidth>0?d.drawImage(Jl,cl,Nl,sl,sl):(d.fillStyle=ol,d.beginPath(),(bt=d.roundRect)==null||bt.call(d,cl,Nl,sl,sl,6),d.roundRect||d.rect(cl,Nl,sl,sl),d.fill()),mo(d),Sl||mt||ll||Et){d.strokeStyle=Hl?Tt.warn:ll||Et?Tt.brand:ol,d.lineWidth=1.6/H.zoom,d.beginPath();const _t=6;d.moveTo(cl+_t,Nl),d.arcTo(cl+sl,Nl,cl+sl,Nl+sl,_t),d.arcTo(cl+sl,Nl+sl,cl,Nl+sl,_t),d.arcTo(cl,Nl+sl,cl,Nl,_t),d.arcTo(cl,Nl,cl+sl,Nl,_t),d.closePath(),d.stroke()}d.fillStyle=Tt.labelPrimary,d.font=_e(il?11:12,600),d.textAlign="center",d.textBaseline="top";const he=Nl+sl+4;un(d,B.text||i.unnamed,Ht-4,il?1:2).forEach((_t,wa)=>{d.fillText(_t,Zt+Ht/2,he+wa*(il?13:14))}),d.textAlign="left",d.globalAlpha=ut?.7:1;continue}Et&&(R==null?void 0:R.nodeGlow)!==!1?(d.shadowColor=wt,d.shadowBlur=14/H.zoom):dl?ph(d,H.zoom,{selected:Sl,weight:"heavy"}):ph(d,H.zoom,{selected:Sl}),d.fillStyle=dl?Tt.glassFill:Tt.bgLayer1;const de=dl?"card":B.stylePreset,Ae=dl?il?14:16:B.stylePreset==="title"?Vt/2:12;if(bh(d,de,Zt,gl,Ht,Vt,Ae),d.fill(),mo(d),d.globalAlpha=ut?.7:1,y0(d,ol,dl?.08:B.stylePreset==="title"?.22:.14),!dl&&B.stylePreset!=="decision"&&B.stylePreset!=="title"&&B.stylePreset!=="note"&&v0(d,Zt,gl,Vt,ol,12),!dl&&B.stylePreset==="note"?d.setLineDash([4/H.zoom,3/H.zoom]):d.setLineDash([]),dl?(d.strokeStyle=Hl?Tt.warn:ll||Et?Tt.brand:Sl||mt?ol:Tt.glassBorder,d.lineWidth=(ll||Et||Sl||mt?1.8:1.25)/H.zoom):(d.strokeStyle=Hl?Tt.warn:ll?Tt.brand:B.stylePreset==="risk"?Tt.warn:Et?wt:Sl||mt?Tt.brand:ol,d.lineWidth=(ll||Et||Sl||B.stylePreset==="title"||B.stylePreset==="decision"?2.4:1.35)/H.zoom),!dl&&B.stylePreset==="muted"&&(d.globalAlpha=ut?.4:.55),mo(d),d.stroke(),d.setLineDash([]),d.globalAlpha=ut?.7:1,dl)if(!(tl===B.id))M0(d,B,Zt,gl,Tt,H.zoom,il,ol,()=>b(xl=>xl+1),{expanded:ht===B.id});else{d.beginPath(),d.arc(Zt+16,gl+20,4,0,Math.PI*2),d.fillStyle=ol,d.fill(),d.fillStyle=Tt.labelPrimary,d.font=_e(14,600),d.textBaseline="middle";const xl=un(d,B.text||i.unnamed,Ht-44,1);d.fillText(xl[0]??"?",Zt+28,gl+20)}else{const xl=14+(B.stylePreset==="decision"||B.stylePreset==="title"||B.stylePreset==="note"?0:4);let cl=gl+12;if(B.imageUrl){const wl=il?64:78,hl=Ht-xl-12,le=go(B.imageUrl,()=>b(qa=>qa+1));if(d.save(),d.beginPath(),bh(d,"default",Zt+xl,cl,hl,wl,8),d.clip(),le&&le.naturalWidth>0){const qa=Math.min(hl/le.naturalWidth,wl/le.naturalHeight),rn=le.naturalWidth*qa,Ye=le.naturalHeight*qa;d.fillStyle="rgba(0,0,0,0.22)",d.fillRect(Zt+xl,cl,hl,wl),d.drawImage(le,Zt+xl+(hl-rn)/2,cl+(wl-Ye)/2,rn,Ye)}else d.fillStyle=Tt.border,d.fillRect(Zt+xl,cl,hl,wl);d.restore(),cl+=wl+8}d.fillStyle=B.stylePreset==="muted"?Tt.labelSecondary:Tt.labelPrimary;const Nl=il?12:B.stylePreset==="title"?15:13,Jl=B.stylePreset==="title"||B.stylePreset==="decision"?600:500;d.font=_e(Nl,Jl),d.textBaseline="top";const he=Ht-xl-12,Kt=(il||B.stylePreset==="title",2),_t=un(d,B.text||i.unnamed,he,Kt),wa=Nl+3,lc=_t.length*wa,Ba=Ut!=="off"&&H.zoom>=.35?Ut==="tags"?(B.tags??[]).slice(0,2).map(wl=>`#${wl}`):S0(B).slice(0,4):[],qu=Ba.length?20:0;let Ya=cl;if(!B.imageUrl){const wl=Vt-16-qu;Ya=gl+Math.max(10,(wl-lc)/2)}if(_t.forEach((wl,hl)=>{d.fillText(wl,Zt+xl,Ya+hl*wa)}),Ba.length){let wl=Zt+xl;const hl=gl+Vt-22;for(const le of Ba)wl+=Dh(d,le,wl,hl,Tt,H.zoom)}}d.globalAlpha=1}d.restore()},[Tt,H,v,Ql,m,na,N,x,S,R,k,Oe,Ml,cn,fn,Rl,il,dl,Ul,ht,tl,jl,A==null?void 0:A.prefs.showRelationEdges,A==null?void 0:A.prefs.nodeBadges,Qt,i]),on=K.useCallback(()=>{const g=s.current;if(!g)return;const d=g.getContext("2d");if(!d)return;const Y=window.devicePixelRatio||1;g.width=Math.floor(an*Y),g.height=Math.floor(nn*Y),g.style.width=`${an}px`,g.style.height=`${nn}px`,d.setTransform(Y,0,0,Y,0,0),d.clearRect(0,0,an,nn),d.fillStyle=Tt.bgLayer1,d.fillRect(0,0,an,nn);const{minX:X,maxX:F,minY:L,maxY:J}=Ee,rt=Math.max(1,F-X),Rt=Math.max(1,J-L),zt=an/rt,Ut=nn/Rt,bt=Math.min(zt,Ut),B=(an-rt*bt)/2,xt=(nn-Rt*bt)/2,ut=(Et,wt)=>({x:B+(Et-X)*bt,y:xt+(wt-L)*bt});d.strokeStyle=Tt.border,d.lineWidth=1;for(const Et of v){if(Et.kind!=="hierarchy")continue;const wt=Ql(Et.from),mt=Ql(Et.to);if(!wt||!mt)continue;const ll=ut(wt.x,wt.y),Hl=ut(mt.x,mt.y);d.beginPath(),d.moveTo(ll.x,ll.y),d.lineTo(Hl.x,Hl.y),d.stroke()}for(const Et of m){if(Et.deletedAt)continue;const wt=Ql(Et.id);if(!wt)continue;const mt=ut(wt.x,wt.y);d.fillStyle=na.get(Et.id)??Tt.brand,d.beginPath(),d.arc(mt.x,mt.y,2.2,0,Math.PI*2),d.fill()}const Ht=Dl.w/H.zoom,Vt=Dl.h/H.zoom,Zt=-H.x/H.zoom,gl=-H.y/H.zoom,ol=ut(Zt-Ht/2,gl-Vt/2),Sl=ut(Zt+Ht/2,gl+Vt/2);d.strokeStyle=Tt.brand,d.lineWidth=1.5,d.strokeRect(ol.x,ol.y,Math.max(4,Sl.x-ol.x),Math.max(4,Sl.y-ol.y))},[Tt,Ee,v,Ql,m,na,Dl,H]);K.useEffect(()=>{const g=f.current,d=o.current;if(!g||!d)return;const Y=()=>{const F=d.getBoundingClientRect(),L=window.devicePixelRatio||1;g.width=Math.floor(F.width*L),g.height=Math.floor(F.height*L),g.style.width=`${F.width}px`,g.style.height=`${F.height}px`,Zn({w:F.width,h:F.height}),je(),on()};Y();const X=new ResizeObserver(Y);return X.observe(d),()=>X.disconnect()},[je,on]),K.useEffect(()=>{je(),on()},[je,on]),K.useEffect(()=>{const g=Y=>{var F,L;const X=(F=Y.target)==null?void 0:F.tagName;if(!(X==="INPUT"||X==="TEXTAREA")){if(!Y.metaKey&&!Y.ctrlKey&&!Y.altKey){const J=Y.key.toLowerCase();J==="v"&&rl("select"),J==="h"&&rl("pan"),J==="c"&&rl("link"),J==="b"&<("branch"),J==="n"&<("node"),J==="l"&&qt(rt=>!rt),J==="f"&&re(),(J==="="||J==="+")&&De(H.zoom*1.15),(J==="-"||J==="_")&&De(H.zoom/1.15)}if(Y.code==="Space"&&(Z.current.space=!0),Y.key==="Alt"&&(Z.current.alt=!0),Y.key==="Escape"&&Z.current.mode==="node"){Y.preventDefault(),Z.current.mode="none",Z.current.nodeId=null,Z.current.moved=!1,we(null),ja(null),Be(!1),Ca(null);return}if(Y.key==="Escape"&&(tl||ht||te)){Y.preventDefault(),Pt(null),Dt(null),se(null);return}if(!it){if(Y.key==="Tab"&&!it){Y.preventDefault();const J=N[0];et([Ll(J?{type:"create_node",text:i.newNode,parentId:J}:{type:"create_node",text:i.newNode})])}if(Y.key==="ArrowLeft"&&N[0]&&!C&&(Y.preventDefault(),et([Ll({type:"create_node",text:i.leftChild,parentId:N[0],sidePref:-1})])),Y.key==="ArrowRight"&&N[0]&&!C&&(Y.preventDefault(),et([Ll({type:"create_node",text:i.rightChild,parentId:N[0],sidePref:1})])),(Y.key==="Delete"||Y.key==="Backspace")&&!C){const J=N[0];J&&et([{type:"delete_node",nodeId:J}])}if(Y.key==="Enter"&&N[0]&&!C){Y.preventDefault();const J=((L=v.find(rt=>rt.kind==="hierarchy"&&rt.isPrimaryParent&&rt.to===N[0]))==null?void 0:L.from)??null;et([Ll(J?{type:"create_node",text:i.sibling,parentId:J}:{type:"create_node",text:i.newNode})])}}}},d=Y=>{Y.code==="Space"&&(Z.current.space=!1),Y.key==="Alt"&&(Z.current.alt=!1)};return window.addEventListener("keydown",g),window.addEventListener("keyup",d),()=>{window.removeEventListener("keydown",g),window.removeEventListener("keyup",d)}},[et,A,N,C,v,it,re,De,H.zoom,i,Ll,G,pt,tl,ht,te]);const Yu=tc??(vl==="pan"||Z.current.space?"grab":vl==="link"?"crosshair":"default");return y.jsxs("div",{className:`canvas-host${it?" is-locked":""}`,ref:o,style:{cursor:Yu},onWheel:g=>{g.preventDefault();const d=g.deltaY>0?.9:1.1;W(Y=>({...Y,zoom:Math.min(4,Math.max(.02,Y.zoom*d))}))},onPointerDown:g=>{var L;const d=g.target;if((L=d==null?void 0:d.closest)!=null&&L.call(d,".canvas-toolbar, .canvas-controls, .canvas-minimap, .edit-overlay, .node-handles, .hover-card, .inspector"))return;const Y=Ra(g.clientX,g.clientY),X=ze(Y.x,Y.y);if(Z.current.lastX=g.clientX,Z.current.lastY=g.clientY,Z.current.startX=g.clientX,Z.current.startY=g.clientY,Z.current.moved=!1,Z.current.alt=g.altKey,Z.current.forcePin=g.ctrlKey||g.metaKey,Z.current.startWorldX=Y.x,Z.current.startWorldY=Y.y,Z.current.subtreeIds=[],g.currentTarget.setPointerCapture(g.pointerId),vl==="pan"||Z.current.space||g.button===1||g.button===2||!X&&vl!=="link"){Z.current.mode="pan",Z.current.nodeId=null,X||ft([]),Ca("grabbing");return}if(it){ft(X?[X]:[]),Z.current.mode="none";return}if(X&&(vl==="link"||g.altKey)){Z.current.mode="link",Z.current.nodeId=X,ft([X]),Da({fromId:X,x:Y.x,y:Y.y});return}if(X&&vl==="select"){Z.current.mode="node",Z.current.nodeId=X;const J=g.shiftKey||Lt==="node";Z.current.subtreeIds=J?[X]:po(X,v),ft([X]);return}Z.current.mode="pan",Ca("grabbing")},onPointerMove:g=>{var F;let d=Ra(g.clientX,g.clientY);const Y=g.clientX-Z.current.startX,X=g.clientY-Z.current.startY;if(Math.hypot(Y,X)>4&&(Z.current.moved=!0),Z.current.mode==="pan"){const L=g.clientX-Z.current.lastX,J=g.clientY-Z.current.lastY;Z.current.lastX=g.clientX,Z.current.lastY=g.clientY,W(rt=>({...rt,x:rt.x+L,y:rt.y+J}));return}if(Z.current.mode==="link"&&Z.current.nodeId){Da({fromId:Z.current.nodeId,x:d.x,y:d.y});return}if(Z.current.mode==="node"&&Z.current.nodeId&&Z.current.moved){const L=Z.current.nodeId,J=o.current;if(J){const B=J.getBoundingClientRect(),xt=48;let ut=0,Ht=0;g.clientXB.right-xt&&(ut=-12),g.clientYB.bottom-xt&&(Ht=-12),(ut||Ht)&&(W(Vt=>({...Vt,x:Vt.x+ut,y:Vt.y+Ht})),Z.current.startWorldX+=ut/H.zoom,Z.current.startWorldY+=Ht/H.zoom,d=Ra(g.clientX,g.clientY))}const rt=d.x-Z.current.startWorldX,Rt=d.y-Z.current.startWorldY,zt=Z.current.subtreeIds.length>0?Z.current.subtreeIds:po(L,v);if(we({rootId:L,dx:rt,dy:Rt,ids:zt}),Ca("grabbing"),Z.current.forcePin=g.ctrlKey||g.metaKey,Z.current.forcePin){ja(null),Be(!1),st(null);return}const Ut=new Set(zt),bt=ze(d.x,d.y,Ut);if(st(bt),bt&&bt!==L){const B=Mh(bt,L,v);ja(bt),Be(B)}else ja(null),Be(!1)}if(Z.current.mode==="none"&&!Ml){const L=ze(d.x,d.y);if(st(L),dl&&L&&H.zoom>=.35&&tl!==L){const J=m.find(Rt=>Rt.id===L),rt=J?Ql(L):null;if(J&&rt){const{w:Rt,h:zt}=jl(J),Ut=d.x-(rt.x-Rt/2),bt=d.y-(rt.y-zt/2),xt=E0(J,il,ht===J.id).find(ut=>Ut>=ut.x&&Ut<=ut.x+ut.w&&bt>=ut.y&&bt<=ut.y+ut.h);if(xt){const ut=(F=o.current)==null?void 0:F.getBoundingClientRect(),Ht=ut?g.clientX-ut.left+14:Dl.w/2+H.x+d.x*H.zoom+14,Vt=ut?g.clientY-ut.top+14:Dl.h/2+H.y+d.y*H.zoom+14;se({label:xt.label,value:xt.fullValue,x:Ht,y:Vt})}else se(null)}else se(null)}else se(null)}},onPointerUp:g=>{var rt;const d=Ra(g.clientX,g.clientY),Y=Z.current.mode,X=Z.current.nodeId,F=Z.current.moved,L=Bu.current,J=Z.current.forcePin||g.ctrlKey||g.metaKey;if(!it&&Y==="link"&&X){const Rt=ze(d.x,d.y);Rt&&Rt!==X&&et([{type:"link",from:X,to:Rt,kind:"relation",label:i.relationLabel}]),Da(null)}else if(!it&&Y==="node"&&X&&F&&L){const Rt=new Set(L.ids),zt=J||fn?null:ze(d.x,d.y,Rt);if(zt&&zt!==X&&!Mh(zt,X,v)&&zt){const bt=(((rt=_[zt])==null?void 0:rt.x)??0)<=0?-1:1,B={..._};for(const xt of L.ids){const ut=_[xt];ut&&(B[xt]={x:ut.x+L.dx,y:ut.y+L.dy})}dt({positions:B}),we(null),et([{type:"move_node",nodeId:X,newParentId:zt,sidePref:bt}])}else{const bt={..._},B=[],xt=m.map(ut=>{if(!Rt.has(ut.id))return ut;const Ht=_[ut.id];if(!Ht)return ut;const Vt={x:Ht.x+L.dx,y:Ht.y+L.dy};return bt[ut.id]=Vt,B.push({type:"set_pinned",nodeId:ut.id,pinned:!0,pos:Vt}),{...ut,pinned:!0,pos:Vt}});dt({positions:bt,nodes:xt}),we(null),et(B,"drag pin")}}else Y==="node"&&X&&!F?(ft([X]),dl&&(Dt(Rt=>Rt===X?null:X),tl&&tl!==X&&Pt(null))):Y==="pan"&&!F&&(Dt(null),Pt(null),se(null));Z.current.mode="none",Z.current.nodeId=null,Z.current.forcePin=!1,Z.current.subtreeIds=[],Da(null),we(null),ja(null),Be(!1),Ca(null)},onContextMenu:g=>g.preventDefault(),onDoubleClick:g=>{if(it)return;const d=Ra(g.clientX,g.clientY),Y=ze(d.x,d.y);if(Y){if(dl){ft([Y]),Dt(Y),Pt(Y),se(null);return}const X=m.find(J=>J.id===Y),F=o.current.getBoundingClientRect(),L=Ql(Y);Q({id:Y,text:X.text,x:F.width/2+H.x+L.x*H.zoom-70,y:F.height/2+H.y+L.y*H.zoom-16})}else vl==="select"&&et([Ll({type:"create_node",text:i.newNode,...N[0]?{parentId:N[0]}:{},sidePref:d.x<0?-1:1})])},children:[y.jsx("canvas",{ref:f}),y.jsxs("div",{className:"canvas-toolbar",role:"toolbar","aria-label":i.toolbarAria,onPointerDown:g=>g.stopPropagation(),children:[St?y.jsxs(y.Fragment,{children:[y.jsx("div",{className:"canvas-toolbar__group",children:y.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.backRosterTitle,onClick:P,children:i.backRoster})}),y.jsx("div",{className:"canvas-toolbar__sep"})]}):null,y.jsx("div",{className:"canvas-toolbar__group",children:[["select",i.toolSelect,"V"],["pan",i.toolPan,"H"],["link",i.toolLink,"C"]].map(([g,d,Y])=>y.jsx("button",{type:"button",className:`canvas-tool-btn${vl===g?" is-active":""}`,title:`${d} (${Y})`,"aria-pressed":vl===g,onClick:()=>rl(g),children:d},g))}),y.jsx("div",{className:"canvas-toolbar__sep"}),y.jsxs("div",{className:"canvas-toolbar__group",children:[y.jsx("button",{type:"button",className:`canvas-tool-btn${Lt==="node"?" is-active":""}`,title:i.dragNodeTitle,"aria-pressed":Lt==="node",onClick:()=>lt("node"),children:i.dragNode}),y.jsx("button",{type:"button",className:`canvas-tool-btn${Lt==="branch"?" is-active":""}`,title:i.dragBranchTitle,"aria-pressed":Lt==="branch",onClick:()=>lt("branch"),children:i.dragBranch})]}),y.jsx("div",{className:"canvas-toolbar__sep"}),y.jsxs("div",{className:"canvas-toolbar__group",children:[y.jsx("button",{type:"button",className:`canvas-tool-btn${Kl==="bubble"?" is-active":""}`,title:i.bubbleTitle,"aria-pressed":Kl==="bubble",disabled:it,onClick:()=>{Kl!=="bubble"&&tt({nodeViewMode:"bubble"})},children:i.bubble}),y.jsx("button",{type:"button",className:`canvas-tool-btn${Kl==="card"?" is-active":""}`,title:i.cardTitle,"aria-pressed":Kl==="card",disabled:it,onClick:()=>{Kl!=="card"&&tt({nodeViewMode:"card"})},children:i.card}),y.jsx("button",{type:"button",className:`canvas-tool-btn${Kl==="topology"?" is-active":""}`,title:i.topologyTitle,"aria-pressed":Kl==="topology",disabled:it,onClick:()=>{Kl!=="topology"&&tt({nodeViewMode:"topology"})},children:i.topology}),y.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.unpinTitle,disabled:it||!N[0]||!((sn=m.find(g=>g.id===N[0]))!=null&&sn.pinned),onClick:()=>{N[0]&&et([{type:"set_pinned",nodeId:N[0],pinned:!1}])},children:i.unpin})]}),y.jsx("div",{className:"canvas-toolbar__sep"}),y.jsx("div",{className:"canvas-toolbar__group",children:y.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.undo,disabled:!pt,onClick:()=>void G(),children:i.undo})}),y.jsx("div",{className:"canvas-toolbar__sep"}),y.jsxs("div",{className:"canvas-toolbar__group",children:[y.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.exportPngTitle,onClick:()=>{const g=f.current;if(!g)return;const d=((A==null?void 0:A.title)??"mindmap").replace(/[\\/:*?"<>|]+/g,"_");nv({fitView:re,canvas:g,filename:`${d}.png`}).catch(()=>{})},children:i.exportPng}),y.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.exportSvgTitle,disabled:!q,onClick:()=>{if(!q)return;const g=((A==null?void 0:A.title)??"mindmap").replace(/[\\/:*?"<>|]+/g,"_");uv(q,`${g}.svg`).catch(()=>{})},children:i.exportSvg})]}),y.jsxs("span",{className:"canvas-toolbar__zoom",children:[Math.round(H.zoom*100),"%"]})]}),y.jsxs("div",{className:"canvas-controls",role:"toolbar","aria-label":i.controlsAria,onPointerDown:g=>g.stopPropagation(),children:[y.jsx("button",{type:"button",className:"canvas-controls__btn",title:O?i.exitFullscreen:i.fullscreen,"aria-label":O?i.exitFullscreen:i.fullscreen,onClick:()=>void nt(),children:y.jsx(mv,{exit:O})}),y.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.zoomInTitle,"aria-label":i.zoomIn,onClick:()=>De(H.zoom*1.2),children:y.jsx(yv,{})}),y.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.zoomOutTitle,"aria-label":i.zoomOut,onClick:()=>De(H.zoom/1.2),children:y.jsx(vv,{})}),y.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.fitTitle,"aria-label":i.fit,onClick:re,children:y.jsx(gv,{})}),y.jsx("button",{type:"button",className:`canvas-controls__btn${it?" is-active":""}`,title:it?i.unlockTitle:i.lockTitle,"aria-label":it?i.unlock:i.lock,"aria-pressed":it,onClick:()=>qt(g=>!g),children:y.jsx(pv,{locked:it})})]}),y.jsx("div",{className:"canvas-minimap",onPointerDown:g=>{g.stopPropagation(),Ua.current=!0,g.currentTarget.setPointerCapture(g.pointerId),Ha(g.clientX,g.clientY)},onPointerMove:g=>{Ua.current&&Ha(g.clientX,g.clientY)},onPointerUp:()=>{Ua.current=!1},onPointerCancel:()=>{Ua.current=!1},children:y.jsx("canvas",{ref:s,width:an,height:nn})}),C&&y.jsx("input",{className:"edit-overlay",style:{left:C.x,top:C.y},autoFocus:!0,value:C.text,onChange:g=>Q({...C,text:g.target.value}),onBlur:()=>{et([{type:"update_text",nodeId:C.id,text:C.text}]),Q(null)},onKeyDown:g=>{g.key==="Enter"&&g.target.blur(),g.key==="Escape"&&Q(null)}}),!it&&N[0]&&!Ml&&_[N[0]]&&(()=>{const g=N[0],d=m.find(zt=>zt.id===g);if(!d||d.deletedAt)return null;const Y=_[g],{w:X}=jl(d),F=Dl.w/2+H.x+Y.x*H.zoom,L=Dl.h/2+H.y+Y.y*H.zoom,J=X/2*H.zoom,rt=il?100:140,Rt=zt=>{const Ut=zt<0?i.leftChild:i.rightChild,bt=il?160:200;et([Ll({type:"create_node",text:Ut,parentId:g,sidePref:zt,pos:{x:Y.x+zt*(X/2+bt/2+rt),y:Y.y}})])};return y.jsxs("div",{className:"node-handles",onPointerDown:zt=>zt.stopPropagation(),children:[y.jsx("button",{type:"button",className:"node-handle node-handle--left",style:{left:F-J-14,top:L-10},title:i.addLeftChildTitle,onClick:()=>Rt(-1),children:"+"}),y.jsx("button",{type:"button",className:"node-handle node-handle--right",style:{left:F+J-2,top:L-10},title:i.addRightChildTitle,onClick:()=>Rt(1),children:"+"})]})})(),(A==null?void 0:A.prefs.showHoverCard)!==!1&&k&&!Ml&&!dl&&(()=>{const g=m.find(L=>L.id===k);if(!g)return null;const d=g?_[g.id]:null;if(!d)return null;const{h:Y}=jl(g),X=Dl.w/2+H.x+d.x*H.zoom+12,F=Dl.h/2+H.y+d.y*H.zoom+Y/2*H.zoom+8;return y.jsx(tv,{node:g,x:X,y:F})})(),dl&&te?y.jsx(lv,{label:te.label,value:te.value,x:te.x,y:te.y}):null,!it&&!Ml&&dl&&tl&&H.zoom>=.35&&(()=>{const g=tl,d=m.find(J=>J.id===g);if(!d||d.deletedAt)return null;const Y=_[g];if(!Y)return null;const{w:X}=jl(d),F=Dl.w/2+H.x+Y.x*H.zoom,L=Dl.h/2+H.y+Y.y*H.zoom;return y.jsx(w0,{node:d,applyOps:et,screenX:F,screenY:L,zoom:H.zoom,width:X,accent:na.get(g),showStylePreset:!1})})(),y.jsx("div",{className:"canvas-hint muted",children:it?i.hintLocked:Lt==="node"?i.hintNodeDrag:i.hintBranchDrag})]})}function mv({exit:i}){return i?y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M7 14H5v5h5v-2H7v-3zm12 0h-2v3h-3v2h5v-5zM7 5h3V3H5v5h2V5zm10 0v3h2V3h-5v2h3z"})}):y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M7 14H5v5h5v-2H7v-3zm0-9h3V3H5v5h2V5zm12 9h-2v3h-3v2h5v-5zm-2-9V3h-3v2h3v3h2V5h-2z"})})}function yv(){return y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})}function vv(){return y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M19 13H5v-2h14v2z"})})}function gv(){return y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M3 5v4h2V7h2V5H3zm0 10v4h4v-2H5v-2H3zm14-10v2h2v2h2V5h-4zm4 10h-2v2h-2v2h4v-4zM7 9h10v6H7V9z"})})}function pv({locked:i}){return i?y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm6-7h-1V7a5 5 0 0 0-10 0v3H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2zM9 7a3 3 0 0 1 6 0v3H9V7z"})}):y.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:y.jsx("path",{fill:"currentColor",d:"M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm6-7h-1V7a5 5 0 0 0-9.9-1h2.1A3 3 0 0 1 15 7v3H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2z"})})}function bv(){try{return new URLSearchParams(window.location.search)}catch{return new URLSearchParams}}function Sv(){const i=K.useMemo(()=>bv(),[]),f=i.get("embed")==="1"||i.get("embed")==="true",s=i.get("canvasId")||"",{canvases:o,canvasId:m,canvas:v,nodes:_,selectedIds:N,leftCollapsed:x,loadCanvases:S,createCanvas:R,openCanvas:A,undo:q,setCollapsedPanels:et,setPrefs:tt,applyOps:dt,trash:ft,restoreFromTrash:G}=Ct();K.useEffect(()=>{$0()},[]),K.useEffect(()=>{(async()=>{if(await S(),s){await A(s);return}Ct.getState().canvasId||await R("未命名画布")})()},[S,R,A,s]),K.useEffect(()=>{const P=`${location.protocol==="https:"?"wss":"ws"}://${location.host}/ws`;let nt=null,H=!1,W,nl,ul=800;const vl=(Lt,lt)=>{window.clearTimeout(nl),nl=window.setTimeout(async()=>{if(Ct.getState().canvasId===Lt)try{const it=await fetch(`/api/canvases/${Lt}`).then(qt=>qt.json());Ct.getState().applyCanvasPayload(it,{preserveUnpinned:lt})}catch{Ct.getState().openCanvas(Lt)}},120)},rl=()=>{if(!H){try{nt=new WebSocket(P)}catch{W=window.setTimeout(rl,ul),ul=Math.min(8e3,ul*1.6);return}nt.onopen=()=>{ul=800},nt.onmessage=Lt=>{try{const lt=JSON.parse(String(Lt.data));if(lt.type==="canvas/event"&<.canvasId&<.canvasId===Ct.getState().canvasId&&(lt.fitViewport&&Ct.getState().requestFitViewport(lt.fitViewport),vl(lt.canvasId,lt.preserveUnpinned===!0)),lt.type==="canvas/highlight"&<.canvasId&<.canvasId===Ct.getState().canvasId){const it=Array.isArray(lt.nodeIds)?lt.nodeIds:[],qt=Array.isArray(lt.edgeIds)?lt.edgeIds:[];Ct.getState().flashHighlight({nodeIds:it,edgeIds:qt,style:lt.style&&typeof lt.style=="object"?lt.style:null,ttlMs:typeof lt.ttlMs=="number"?lt.ttlMs:qt.length?5e3:2200})}}catch{}},nt.onclose=()=>{H||(W=window.setTimeout(rl,ul),ul=Math.min(8e3,ul*1.6))},nt.onerror=()=>{try{nt==null||nt.close()}catch{}}}};return rl(),()=>{H=!0,window.clearTimeout(W),window.clearTimeout(nl);try{nt==null||nt.close()}catch{}}},[]),K.useEffect(()=>{const P=m;if(!P)return;const nt=window.setTimeout(()=>{fetch(`/api/canvases/${P}/activity`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({selectionIds:N,focusNodeId:(v==null?void 0:v.focusNodeId)??null,viewport:(v==null?void 0:v.viewport)??{x:0,y:0,zoom:1}})})},200);return()=>window.clearTimeout(nt)},[m,N,v==null?void 0:v.focusNodeId,v==null?void 0:v.viewport]);const pt=v==null?void 0:v.focusNodeId,St=_.filter(P=>!P.deletedAt);return f?y.jsx("div",{className:"app-shell embed",children:y.jsx("div",{className:"main embed-main",children:y.jsx(xh,{})})}):y.jsxs("div",{className:"app-shell",children:[y.jsxs("header",{className:"topbar",children:[y.jsx("div",{className:"brand",children:"Mind Map"}),y.jsx("button",{type:"button",onClick:()=>et("left",!x),children:x?"目录":"收目录"}),y.jsx("button",{type:"button",onClick:()=>void R(),children:"新建"}),y.jsx("button",{type:"button",onClick:()=>void q(),disabled:!Ct.getState().lastChangeSetId,children:"撤销"}),y.jsxs("button",{type:"button",onClick:()=>void tt({density:(v==null?void 0:v.prefs.density)==="compact"?"comfortable":"compact"}),children:["密度: ",(v==null?void 0:v.prefs.density)??"comfortable"]}),y.jsxs("button",{type:"button",onClick:()=>void tt({branchColoring:!((v==null?void 0:v.prefs.branchColoring)??!0)}),children:["分色: ",(v==null?void 0:v.prefs.branchColoring)===!1?"关":"开"]}),y.jsxs("button",{type:"button",onClick:()=>{const P=(v==null?void 0:v.prefs.nodeViewMode)??"card";tt({nodeViewMode:P==="bubble"?"card":P==="card"?"topology":"bubble"})},children:["模式:"," ",(v==null?void 0:v.prefs.nodeViewMode)==="bubble"?"气泡":(v==null?void 0:v.prefs.nodeViewMode)==="topology"?"拓扑":"卡片"]}),y.jsx("button",{type:"button",onClick:()=>{const P=m;P&&fetch(`/api/canvases/${P}/export.json`).then(nt=>nt.json()).then(nt=>{const H=new Blob([JSON.stringify(nt,null,2)],{type:"application/json"}),W=document.createElement("a");W.href=URL.createObjectURL(H),W.download=`${(v==null?void 0:v.title)??"mindmap"}.json`,W.click()})},children:"导出JSON"}),y.jsx("button",{type:"button",onClick:()=>{const P=m;if(!P)return;const nt=((v==null?void 0:v.title)??"mindmap").replace(/[\\/:*?"<>|]+/g,"_");fetch(`/api/canvases/${P}/export.svg`).then(H=>{if(!H.ok)throw new Error(String(H.status));return H.text()}).then(H=>{const W=document.createElement("a");W.href=URL.createObjectURL(new Blob([H],{type:"image/svg+xml;charset=utf-8"})),W.download=`${nt}.svg`,W.click()}).catch(()=>{})},children:"导出SVG"}),y.jsx("button",{type:"button",onClick:()=>{const P=document.querySelector(".canvas-host canvas");if(!P)return;const nt=((v==null?void 0:v.title)??"mindmap").replace(/[\\/:*?"<>|]+/g,"_");P.toBlob(H=>{if(!H)return;const W=document.createElement("a");W.href=URL.createObjectURL(H),W.download=`${nt}.png`,W.click()})},children:"导出PNG"}),y.jsx("div",{className:"spacer"})]}),y.jsxs("div",{className:`main ${x?"left-collapsed":""}`,children:[y.jsxs("aside",{className:"panel",style:{display:x?"none":void 0},children:[y.jsx("div",{className:"panel-header",children:"目录"}),y.jsxs("div",{className:"panel-body",children:[y.jsx("div",{className:"muted",style:{marginBottom:8},children:"画布"}),o.map(P=>y.jsx("div",{className:`canvas-list-item ${P.id===m?"active":""}`,onClick:()=>void A(P.id),children:P.title},P.id)),y.jsx("div",{className:"muted",style:{margin:"12px 0 8px"},children:"大纲"}),St.map(P=>y.jsxs("div",{className:`outline-item ${N.includes(P.id)?"active":""}`,onClick:()=>{Ct.getState().setSelection([P.id]),dt([{type:"set_focus",nodeId:P.id}])},children:[P.id===pt?"◎ ":"• ",P.text]},P.id)),y.jsx("div",{className:"muted",style:{margin:"12px 0 8px"},children:"属性"}),y.jsx(G0,{}),y.jsxs("div",{className:"muted",style:{margin:"12px 0 8px"},children:["回收站 (",ft.length,")"]}),ft.length===0&&y.jsx("div",{className:"muted",children:"空"}),ft.map(P=>y.jsxs("div",{className:"trash-item",children:[y.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis"},children:P.text}),y.jsx("button",{type:"button",onClick:()=>void G(P.id),children:"恢复"})]},P.id))]})]}),y.jsx(xh,{})]})]})}Iy.createRoot(document.getElementById("root")).render(y.jsx(Sv,{})); diff --git a/packages/dsh-plugin/bundle/web/assets/index-CACgBf2I.css b/packages/dsh-plugin/bundle/web/assets/index-CACgBf2I.css new file mode 100644 index 0000000..bbfe4f1 --- /dev/null +++ b/packages/dsh-plugin/bundle/web/assets/index-CACgBf2I.css @@ -0,0 +1 @@ +.ns-editor{--ns-bg: color-mix( in srgb, #2d3444 88%, var(--dsw-alias-bg-layer-1, #1b1e28) );--ns-border: rgba(255, 255, 255, .2);--ns-label: var(--dsw-alias-label-secondary, #a5adb8);--ns-text: var(--dsw-alias-label-primary, #f4f5f7);--ns-brand: var(--dsw-alias-brand-primary, #5e6ad2);--ns-input: rgba(255, 255, 255, .06);--ns-font: "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", system-ui, sans-serif;display:flex;flex-direction:column;gap:0;background:var(--ns-bg);border:1px solid var(--ns-border);border-radius:16px;overflow:visible;backdrop-filter:blur(18px) saturate(1.15);-webkit-backdrop-filter:blur(18px) saturate(1.15);box-shadow:0 10px 28px #00000073,0 22px 56px #00000061;color:var(--ns-text);font-family:var(--ns-font);font-size:12.5px;line-height:1.45;min-width:248px;max-width:320px}.ns-editor--panel{box-shadow:none;max-width:none;width:100%;background:transparent;border:none;border-radius:0;backdrop-filter:none;-webkit-backdrop-filter:none}.ns-editor__header{display:flex;align-items:center;gap:10px;padding:12px 14px 8px;background:transparent;border-bottom:none;border-radius:16px 16px 0 0;cursor:grab;-webkit-user-select:none;user-select:none;overflow:hidden}.ns-editor--panel .ns-editor__header{border-radius:0;background:transparent}.ns-editor__header:active{cursor:grabbing}.ns-editor__dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;background:var(--ns-brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--ns-brand) 28%,transparent)}.ns-editor__title{flex:1;min-width:0;border:none;background:transparent;color:var(--ns-text);font-family:inherit;font-weight:600;font-size:13.5px;letter-spacing:.01em;padding:2px 0;outline:none}.ns-editor__title:focus{box-shadow:inset 0 -1.5px 0 var(--ns-brand)}.ns-editor__body{display:flex;flex-direction:column;gap:2px;padding:8px 10px 10px}.ns-meta-chips{display:flex;flex-wrap:wrap;gap:6px;padding:4px 4px 10px}.ns-chip{display:inline-flex;align-items:baseline;gap:6px;max-width:100%;padding:4px 8px;border-radius:999px;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);font-size:11px;line-height:1.3}.ns-chip__k{color:var(--ns-label);font-weight:500;flex-shrink:0}.ns-chip__v{color:var(--ns-text);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ns-chip__v.is-expanded,.ns-editor--expanded .ns-chip__v{white-space:normal;overflow:visible;text-overflow:unset;word-break:break-word}.ns-kv{margin:4px 2px 6px;padding:4px 2px 6px;border-radius:0;background:transparent;border:none}.ns-kv__title{font-size:11px;font-weight:600;letter-spacing:.03em;color:var(--ns-label);margin:0 2px 8px}.ns-kv__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.ns-kv__row{display:grid;grid-template-columns:minmax(64px,.34fr) 1fr auto;gap:6px;align-items:center;padding:2px 0;border-top:none}.ns-kv__row:first-child{border-top:none;padding-top:0}.ns-kv__key,.ns-kv__val{width:100%;min-width:0;border:1px solid transparent;background:var(--ns-input);color:var(--ns-text);font-family:inherit;font-size:12px;border-radius:8px;padding:6px 8px;outline:none}.ns-kv__key{color:var(--ns-label);font-weight:500}.ns-kv__key:focus,.ns-kv__val:focus{border-color:color-mix(in srgb,var(--ns-brand) 70%,transparent);background:#ffffff0e}.ns-kv__del{border:none;background:transparent;color:var(--ns-label);padding:4px 6px;border-radius:6px;cursor:pointer;opacity:.7}.ns-kv__del:hover{opacity:1;color:var(--ns-text);background:#ffffff0f}.ns-kv__add,.ns-kv__reveal{width:100%;margin-top:8px;border:1px dashed rgba(255,255,255,.14);background:transparent;color:var(--ns-label);border-radius:8px;padding:7px 10px;font-family:inherit;font-size:11.5px;cursor:pointer}.ns-kv__reveal{margin:6px 2px}.ns-kv__add:hover,.ns-kv__reveal:hover{border-color:var(--ns-brand);color:var(--ns-text)}.ns-advanced{margin:6px 2px 2px;border-radius:10px;border:1px solid rgba(255,255,255,.08);background:#0000001f;overflow:hidden}.ns-advanced>summary{list-style:none;cursor:pointer;-webkit-user-select:none;user-select:none;padding:8px 10px;font-size:11px;font-weight:600;letter-spacing:.02em;color:var(--ns-label)}.ns-advanced>summary::-webkit-details-marker{display:none}.ns-advanced>summary:before{content:"▸";display:inline-block;margin-right:6px;transition:transform .12s ease}.ns-advanced[open]>summary:before{transform:rotate(90deg)}.ns-advanced[open]>summary{color:var(--ns-text);border-bottom:1px solid rgba(255,255,255,.06)}.ns-advanced__body{padding:4px 6px 8px}.ns-advanced__add{width:100%;border:1px dashed rgba(255,255,255,.12);background:transparent;color:var(--ns-label);border-radius:8px;padding:8px 10px;font-family:inherit;font-size:11.5px;cursor:pointer}.ns-advanced__add:hover{border-color:var(--ns-brand);color:var(--ns-text)}.ns-row{display:grid;grid-template-columns:1fr;gap:4px;align-items:start;padding:8px 6px;border-radius:8px}.ns-row:hover{background:#ffffff09}.ns-row__label{color:var(--ns-label);font-size:11px;font-weight:500;letter-spacing:.02em;line-height:1.2;-webkit-user-select:none;user-select:none}.ns-row__ctrl{min-width:0;display:flex;gap:6px;align-items:flex-start}.ns-row__ctrl input,.ns-row__ctrl textarea,.ns-row__ctrl select{flex:1;width:100%;border:1px solid transparent;background:var(--ns-input);color:var(--ns-text);font-family:inherit;font-size:12.5px;border-radius:8px;padding:7px 10px;outline:none;resize:vertical;transition:border-color .12s ease,background .12s ease;color-scheme:dark}.ns-row__ctrl select option{color:#f4f5f7;background:#1b1e28}.ns-row__ctrl input:focus,.ns-row__ctrl textarea:focus,.ns-row__ctrl select:focus{border-color:color-mix(in srgb,var(--ns-brand) 70%,transparent);background:#ffffff0e}.ns-row__clear{border:none;background:transparent;color:var(--ns-label);padding:6px;font-size:11px;line-height:1;opacity:.65;border-radius:6px;flex-shrink:0}.ns-row__clear:hover{opacity:1;color:var(--ns-text);background:#ffffff0f}.ns-thumb{width:100%;max-height:140px;height:auto;object-fit:contain;object-position:center;border-radius:8px;background:#00000038;display:block;margin-bottom:6px}.ns-row__ctrl--image{flex-direction:column;align-items:stretch;gap:6px}.ns-image-actions{display:flex;gap:6px;align-items:center;width:100%}.ns-image-pick{flex-shrink:0;border:1px solid var(--ns-border);background:#ffffff0f;color:var(--ns-text);border-radius:8px;padding:7px 10px;font-family:inherit;font-size:12px;cursor:pointer}.ns-image-pick:hover:not(:disabled){border-color:var(--ns-brand)}.ns-image-pick:disabled{opacity:.6;cursor:wait}.ns-image-url{flex:1;min-width:0}.ns-image-hint{font-size:10.5px;color:var(--ns-label);line-height:1.3}.ns-image-err{font-size:11px;color:#f87171}.ns-add{margin:2px 10px 10px;position:relative;z-index:6}.ns-add__btn{width:100%;border:1px dashed color-mix(in srgb,var(--ns-border) 80%,transparent);background:transparent;color:var(--ns-label);border-radius:10px;padding:8px 10px;font-family:inherit;font-size:11.5px;cursor:pointer;transition:border-color .12s ease,color .12s ease,background .12s ease}.ns-add__btn:hover{border-color:var(--ns-brand);color:var(--ns-text);background:#ffffff08}.ns-add__menu{position:absolute;left:0;right:0;top:calc(100% + 6px);bottom:auto;background:color-mix(in srgb,var(--dsw-alias-bg-layer-1, #1b1e28) 88%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--ns-border);border-radius:10px;padding:4px;z-index:20;box-shadow:0 12px 28px #00000073;max-height:220px;overflow:auto;pointer-events:auto}.ns-add__item{display:block;width:100%;text-align:left;border:none;background:transparent;color:var(--ns-text);font-family:inherit;padding:8px 10px;border-radius:8px;font-size:12px}.ns-add__item:hover{background:#ffffff12}.ns-overlay{position:absolute;z-index:8;pointer-events:none;transform-origin:center center}.ns-editor{pointer-events:none}.ns-editor--panel,.ns-editor__title,.ns-editor__body,.ns-add{pointer-events:auto}:root{color:var(--dsw-alias-label-primary, #f4f5f7);background:var(--dsw-alias-bg-base, #101014);font-family:Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:13px;line-height:1.45}*{box-sizing:border-box}html,body,#root{margin:0;height:100%;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-specific-selector, rgba(255, 255, 255, .08));border-radius:8px;padding:6px 10px}button:hover{background:var(--dsw-alias-interactive-bg-hover, rgba(94, 106, 210, .16))}button.primary{background:var(--dsw-alias-brand-primary, #5e6ad2);color:var(--dsw-alias-brand-text, #fff);border-color:transparent}input{background:var(--dsw-specific-input-major, rgba(255, 255, 255, .08));border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));border-radius:8px;padding:6px 8px;outline:none}.app-shell{display:grid;grid-template-rows:48px 1fr;height:100%}.app-shell.embed{grid-template-rows:1fr}.embed-main{display:grid!important;grid-template-columns:1fr!important;grid-template-rows:1fr;min-height:0;height:100%}.topbar{display:flex;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-alias-bg-layer-1, #1b1e28)}.topbar .brand{font-weight:650;letter-spacing:.02em;margin-right:8px}.topbar .spacer{flex:1}.main{display:grid;grid-template-columns:var(--left, 240px) 1fr;min-height:0}.main.left-collapsed{grid-template-columns:1fr}.panel{min-width:0;min-height:0;border-right:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));background:var(--dsw-specific-sidebar-fill, rgba(16, 16, 20, .92));display:flex;flex-direction:column}.panel-header{padding:10px 12px;font-weight:600;color:var(--dsw-alias-label-secondary, #a5adb8);border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08))}.panel-body{flex:1;overflow:auto;padding:8px}.canvas-host{position:relative;min-width:0;min-height:0;background:var(--dsw-alias-bg-base, #101014)}.canvas-host canvas{width:100%;height:100%;display:block;touch-action:none}.canvas-list-item,.outline-item{padding:8px 10px;border-radius:8px;margin-bottom:4px;cursor:pointer;color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-list-item:hover,.outline-item:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .05))}.canvas-list-item.active,.outline-item.active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .09))}.muted{color:var(--dsw-alias-label-tertiary, #7b838f)}.skin-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.skin-swatch{height:28px;border-radius:6px;border:2px solid transparent;cursor:pointer}.skin-swatch.active{border-color:var(--dsw-alias-brand-primary, #5e6ad2)}.proposal-box{padding:8px 10px;border-top:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .08));max-height:180px;overflow:auto}.proposal-item{padding:8px;border-radius:8px;margin-bottom:6px;background:var(--dsw-specific-selector, rgba(255, 255, 255, .06))}.canvas-hint{position:absolute;left:56px;bottom:10px;font-size:12px;pointer-events:none;opacity:.75;max-width:calc(100% - 240px);z-index:1}.canvas-controls{position:absolute;left:12px;bottom:12px;z-index:4;display:flex;flex-direction:column;overflow:hidden;border-radius:8px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 92%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 4px 18px #00000047}.canvas-controls__btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0;margin:0;border:0;border-bottom:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .1));border-radius:0;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);cursor:pointer}.canvas-controls__btn:last-child{border-bottom:0}.canvas-controls__btn:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .06));color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-controls__btn.is-active{color:var(--dsw-alias-state-warning, #d4a017);background:#d4a0171f}.canvas-controls__btn svg{display:block}.canvas-toolbar{position:absolute;top:10px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 92%,transparent);border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .1));-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:4;box-shadow:0 4px 18px #00000038;max-width:calc(100% - 24px)}.canvas-toolbar__group{display:flex;align-items:center;gap:2px}.canvas-toolbar__sep{width:1px;height:18px;background:var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));margin:0 2px}.canvas-toolbar__zoom{font-size:11px;color:var(--dsw-alias-label-tertiary, #7b838f);min-width:36px;text-align:right;padding-left:4px}.canvas-tool-btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);font-size:12px;line-height:1;padding:6px 9px;border-radius:7px;cursor:pointer;white-space:nowrap}.canvas-tool-btn:disabled{opacity:.35;cursor:default}.canvas-tool-btn:hover{background:var(--dsw-specific-sidebar-nav-item-hover, rgba(255, 255, 255, .06));color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-tool-btn.is-active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .1));color:var(--dsw-alias-brand-primary, #5e6ad2)}.canvas-style-menu{position:relative}.canvas-style-menu__trigger:disabled{opacity:.45}.canvas-style-menu__panel{position:absolute;left:0;top:calc(100% + 6px);z-index:40;min-width:112px;padding:4px;border-radius:8px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:var(--dsw-alias-bg-layer-1, #1b1e28);box-shadow:0 10px 28px #00000073;display:flex;flex-direction:column;gap:2px}.canvas-style-menu__item{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;background:transparent;color:var(--dsw-alias-label-secondary, #a5adb8);font-size:12px;text-align:left;padding:7px 10px;border-radius:6px;cursor:pointer}.canvas-style-menu__item:hover{background:#ffffff14;color:var(--dsw-alias-label-primary, #f4f5f7)}.canvas-style-menu__item.is-active{background:var(--dsw-specific-sidebar-nav-item-active, rgba(255, 255, 255, .1));color:var(--dsw-alias-brand-primary, #5e6ad2)}.canvas-host.is-locked .canvas-tool-btn.is-active{color:var(--dsw-alias-state-warning, #d4a017)}.canvas-minimap{position:absolute;right:12px;bottom:12px;width:168px;height:118px;border-radius:10px;overflow:hidden;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .14));background:color-mix(in srgb,var(--dsw-alias-bg-layer1, #1a1d27) 88%,transparent);box-shadow:0 6px 20px #00000047;cursor:crosshair;z-index:3}.canvas-minimap canvas{display:block;width:100%;height:100%}.trash-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-radius:8px;margin-bottom:4px;background:var(--dsw-specific-selector, rgba(255, 255, 255, .06))}.trash-item button{padding:4px 8px;font-size:12px}.node-handles{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:4}.node-handle{position:absolute;pointer-events:auto;width:20px;height:20px;border-radius:999px;border:1px solid var(--dsw-alias-brand-primary, #5e6ad2);background:var(--dsw-alias-bg-layer-1, #1b1e28);color:var(--dsw-alias-brand-primary, #5e6ad2);font-size:14px;line-height:1;padding:0;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #00000059}.node-handle:hover{background:var(--dsw-alias-brand-primary, #5e6ad2);color:var(--dsw-alias-brand-text, #fff)}.hover-card{position:absolute;z-index:5;max-width:280px;min-width:180px;padding:12px 14px;border-radius:14px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .12));background:color-mix(in srgb,var(--dsw-alias-bg-layer-1, #1b1e28) 92%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:0 1px #ffffff0d inset,0 12px 36px #0000006b;pointer-events:none;font-family:Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Noto Sans SC,system-ui,sans-serif}.hover-card__title{font-weight:600;font-size:13.5px;letter-spacing:.01em;line-height:1.35;margin-bottom:6px;color:var(--dsw-alias-label-primary, #f4f5f7)}.hover-card__note{font-size:12px;line-height:1.45;color:var(--dsw-alias-label-secondary, #a5adb8);margin-bottom:8px}.hover-card__tags{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.hover-card__tag{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;background:#ffffff12;border:1px solid rgba(255,255,255,.06);color:var(--dsw-alias-label-secondary, #a5adb8)}.hover-card__meta{font-size:11px;color:var(--dsw-alias-label-tertiary, #7b838f);line-height:1.35}.prop-tooltip{position:absolute;z-index:8;max-width:320px;min-width:140px;padding:10px 12px;border-radius:12px;border:1px solid var(--dsw-alias-border-l1, rgba(255, 255, 255, .14));background:color-mix(in srgb,var(--dsw-alias-bg-layer-1, #1b1e28) 94%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 1px #ffffff0f inset,0 14px 40px #0000007a;pointer-events:none;font-family:Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Noto Sans SC,system-ui,sans-serif}.prop-tooltip__label{font-size:11px;font-weight:600;letter-spacing:.02em;color:var(--dsw-alias-label-secondary, #a5adb8);margin-bottom:4px}.prop-tooltip__value{font-size:12.5px;font-weight:500;line-height:1.45;color:var(--dsw-alias-label-primary, #f4f5f7);white-space:pre-wrap;word-break:break-word}.edit-overlay{position:absolute;z-index:6;min-width:140px;padding:6px 10px;border-radius:10px;border:1px solid var(--dsw-alias-brand-primary, #5e6ad2);background:var(--dsw-alias-bg-layer-1, #1b1e28);color:var(--dsw-alias-label-primary, #f4f5f7);font:600 13px Segoe UI,PingFang SC,Microsoft YaHei,system-ui,sans-serif;box-shadow:0 8px 24px #0006;outline:none}.inspector{display:flex;flex-direction:column;gap:10px;padding:4px 0 12px}.inspector__title{font-weight:600;font-size:13px}.inspector__field{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--dsw-alias-label-secondary, #a5adb8)}.inspector__field input,.inspector__field textarea,.inspector__field select{width:100%;color:var(--dsw-alias-label-primary, #f4f5f7)}.inspector__field textarea{resize:vertical;min-height:56px}.inspector__row{display:flex;gap:8px;flex-wrap:wrap} diff --git a/packages/dsh-plugin/bundle/web/assets/index-iTIYRavW.js b/packages/dsh-plugin/bundle/web/assets/index-iTIYRavW.js deleted file mode 100644 index bceab24..0000000 --- a/packages/dsh-plugin/bundle/web/assets/index-iTIYRavW.js +++ /dev/null @@ -1,51 +0,0 @@ -(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const p of document.querySelectorAll('link[rel="modulepreload"]'))f(p);new MutationObserver(p=>{for(const g of p)if(g.type==="childList")for(const M of g.addedNodes)M.tagName==="LINK"&&M.rel==="modulepreload"&&f(M)}).observe(document,{childList:!0,subtree:!0});function r(p){const g={};return p.integrity&&(g.integrity=p.integrity),p.referrerPolicy&&(g.referrerPolicy=p.referrerPolicy),p.crossOrigin==="use-credentials"?g.credentials="include":p.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function f(p){if(p.ep)return;p.ep=!0;const g=r(p);fetch(p.href,g)}})();function O0(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Wf={exports:{}},Tu={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Kd;function D0(){if(Kd)return Tu;Kd=1;var i=Symbol.for("react.transitional.element"),o=Symbol.for("react.fragment");function r(f,p,g){var M=null;if(g!==void 0&&(M=""+g),p.key!==void 0&&(M=""+p.key),"key"in p){g={};for(var N in p)N!=="key"&&(g[N]=p[N])}else g=p;return p=g.ref,{$$typeof:i,type:f,key:M,ref:p!==void 0?p:null,props:g}}return Tu.Fragment=o,Tu.jsx=r,Tu.jsxs=r,Tu}var Jd;function x0(){return Jd||(Jd=1,Wf.exports=D0()),Wf.exports}var v=x0(),Ff={exports:{}},zu={},If={exports:{}},Pf={};/** - * @license React - * scheduler.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var kd;function j0(){return kd||(kd=1,(function(i){function o(x,G){var at=x.length;x.push(G);t:for(;0>>1,Ct=x[jt];if(0>>1;jtp(X,at))Zp(it,X)?(x[jt]=it,x[Z]=at,jt=Z):(x[jt]=X,x[U]=at,jt=U);else if(Zp(it,at))x[jt]=it,x[Z]=at,jt=Z;else break t}}return G}function p(x,G){var at=x.sortIndex-G.sortIndex;return at!==0?at:x.id-G.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var g=performance;i.unstable_now=function(){return g.now()}}else{var M=Date,N=M.now();i.unstable_now=function(){return M.now()-N}}var C=[],S=[],w=1,O=null,Q=3,k=!1,I=!1,lt=!1,Nt=!1,yt=typeof setTimeout=="function"?setTimeout:null,el=typeof clearTimeout=="function"?clearTimeout:null,Qt=typeof setImmediate<"u"?setImmediate:null;function nt(x){for(var G=r(S);G!==null;){if(G.callback===null)f(S);else if(G.startTime<=x)f(S),G.sortIndex=G.expirationTime,o(C,G);else break;G=r(S)}}function H(x){if(lt=!1,nt(x),!I)if(r(C)!==null)I=!0,vt||(vt=!0,Kt());else{var G=r(S);G!==null&&ol(H,G.startTime-x)}}var vt=!1,P=-1,Ut=5,Ot=-1;function Ol(){return Nt?!0:!(i.unstable_now()-Otx&&Ol());){var jt=O.callback;if(typeof jt=="function"){O.callback=null,Q=O.priorityLevel;var Ct=jt(O.expirationTime<=x);if(x=i.unstable_now(),typeof Ct=="function"){O.callback=Ct,nt(x),G=!0;break l}O===r(C)&&f(C),nt(x)}else f(C);O=r(C)}if(O!==null)G=!0;else{var h=r(S);h!==null&&ol(H,h.startTime-x),G=!1}}break t}finally{O=null,Q=at,k=!1}G=void 0}}finally{G?Kt():vt=!1}}}var Kt;if(typeof Qt=="function")Kt=function(){Qt($t)};else if(typeof MessageChannel<"u"){var ut=new MessageChannel,Dl=ut.port2;ut.port1.onmessage=$t,Kt=function(){Dl.postMessage(null)}}else Kt=function(){yt($t,0)};function ol(x,G){P=yt(function(){x(i.unstable_now())},G)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(x){x.callback=null},i.unstable_forceFrameRate=function(x){0>x||125jt?(x.sortIndex=at,o(S,x),r(C)===null&&x===r(S)&&(lt?(el(P),P=-1):lt=!0,ol(H,at-jt))):(x.sortIndex=Ct,o(C,x),I||k||(I=!0,vt||(vt=!0,Kt()))),x},i.unstable_shouldYield=Ol,i.unstable_wrapCallback=function(x){var G=Q;return function(){var at=Q;Q=G;try{return x.apply(this,arguments)}finally{Q=at}}}})(Pf)),Pf}var $d;function C0(){return $d||($d=1,If.exports=j0()),If.exports}var ts={exports:{}},ct={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wd;function U0(){if(Wd)return ct;Wd=1;var i=Symbol.for("react.transitional.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),p=Symbol.for("react.profiler"),g=Symbol.for("react.consumer"),M=Symbol.for("react.context"),N=Symbol.for("react.forward_ref"),C=Symbol.for("react.suspense"),S=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),O=Symbol.for("react.activity"),Q=Symbol.iterator;function k(h){return h===null||typeof h!="object"?null:(h=Q&&h[Q]||h["@@iterator"],typeof h=="function"?h:null)}var I={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},lt=Object.assign,Nt={};function yt(h,U,X){this.props=h,this.context=U,this.refs=Nt,this.updater=X||I}yt.prototype.isReactComponent={},yt.prototype.setState=function(h,U){if(typeof h!="object"&&typeof h!="function"&&h!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,h,U,"setState")},yt.prototype.forceUpdate=function(h){this.updater.enqueueForceUpdate(this,h,"forceUpdate")};function el(){}el.prototype=yt.prototype;function Qt(h,U,X){this.props=h,this.context=U,this.refs=Nt,this.updater=X||I}var nt=Qt.prototype=new el;nt.constructor=Qt,lt(nt,yt.prototype),nt.isPureReactComponent=!0;var H=Array.isArray;function vt(){}var P={H:null,A:null,T:null,S:null},Ut=Object.prototype.hasOwnProperty;function Ot(h,U,X){var Z=X.ref;return{$$typeof:i,type:h,key:U,ref:Z!==void 0?Z:null,props:X}}function Ol(h,U){return Ot(h.type,U,h.props)}function $t(h){return typeof h=="object"&&h!==null&&h.$$typeof===i}function Kt(h){var U={"=":"=0",":":"=2"};return"$"+h.replace(/[=:]/g,function(X){return U[X]})}var ut=/\/+/g;function Dl(h,U){return typeof h=="object"&&h!==null&&h.key!=null?Kt(""+h.key):U.toString(36)}function ol(h){switch(h.status){case"fulfilled":return h.value;case"rejected":throw h.reason;default:switch(typeof h.status=="string"?h.then(vt,vt):(h.status="pending",h.then(function(U){h.status==="pending"&&(h.status="fulfilled",h.value=U)},function(U){h.status==="pending"&&(h.status="rejected",h.reason=U)})),h.status){case"fulfilled":return h.value;case"rejected":throw h.reason}}throw h}function x(h,U,X,Z,it){var ft=typeof h;(ft==="undefined"||ft==="boolean")&&(h=null);var ot=!1;if(h===null)ot=!0;else switch(ft){case"bigint":case"string":case"number":ot=!0;break;case"object":switch(h.$$typeof){case i:case o:ot=!0;break;case w:return ot=h._init,x(ot(h._payload),U,X,Z,it)}}if(ot)return it=it(h),ot=Z===""?"."+Dl(h,0):Z,H(it)?(X="",ot!=null&&(X=ot.replace(ut,"$&/")+"/"),x(it,U,X,"",function(oe){return oe})):it!=null&&($t(it)&&(it=Ol(it,X+(it.key==null||h&&h.key===it.key?"":(""+it.key).replace(ut,"$&/")+"/")+ot)),U.push(it)),1;ot=0;var cl=Z===""?".":Z+":";if(H(h))for(var Wt=0;Wt"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(o){console.error(o)}}return i(),ls.exports=R0(),ls.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var th;function B0(){if(th)return zu;th=1;var i=C0(),o=as(),r=H0();function f(t){var l="https://react.dev/errors/"+t;if(1Ct||(t.current=jt[Ct],jt[Ct]=null,Ct--)}function X(t,l){Ct++,jt[Ct]=t.current,t.current=l}var Z=h(null),it=h(null),ft=h(null),ot=h(null);function cl(t,l){switch(X(ft,l),X(it,t),X(Z,null),l.nodeType){case 9:case 11:t=(t=l.documentElement)&&(t=t.namespaceURI)?yd(t):0;break;default:if(t=l.tagName,l=l.namespaceURI)l=yd(l),t=vd(l,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}U(Z),X(Z,t)}function Wt(){U(Z),U(it),U(ft)}function oe(t){t.memoizedState!==null&&X(ot,t);var l=Z.current,e=vd(l,t.type);l!==e&&(X(it,t),X(Z,e))}function $e(t){it.current===t&&(U(Z),U(it)),ot.current===t&&(U(ot),gu._currentValue=at)}var Ee,Ul;function Ae(t){if(Ee===void 0)try{throw Error()}catch(e){var l=e.stack.trim().match(/\n( *(at )?)/);Ee=l&&l[1]||"",Ul=-1)":-1n||d[a]!==_[n]){var D=` -`+d[a].replace(" at new "," at ");return t.displayName&&D.includes("")&&(D=D.replace("",t.displayName)),D}while(1<=a&&0<=n);break}}}finally{Nn=!1,Error.prepareStackTrace=e}return(e=t?t.displayName||t.name:"")?Ae(e):""}function W(t,l){switch(t.tag){case 26:case 27:case 5:return Ae(t.type);case 16:return Ae("Lazy");case 13:return t.child!==l&&l!==null?Ae("Suspense Fallback"):Ae("Suspense");case 19:return Ae("SuspenseList");case 0:case 15:return Me(t.type,!1);case 11:return Me(t.type.render,!1);case 1:return Me(t.type,!0);case 31:return Ae("Activity");default:return""}}function On(t){try{var l="",e=null;do l+=W(t,e),e=t,t=t.return;while(t);return l}catch(a){return` -Error generating stack: `+a.message+` -`+a.stack}}var We=Object.prototype.hasOwnProperty,gt=i.unstable_scheduleCallback,Ma=i.unstable_cancelCallback,Vl=i.unstable_shouldYield,al=i.unstable_requestPaint,nl=i.unstable_now,Dn=i.unstable_getCurrentPriorityLevel,xn=i.unstable_ImmediatePriority,re=i.unstable_UserBlockingPriority,be=i.unstable_NormalPriority,Bl=i.unstable_LowPriority,Fe=i.unstable_IdlePriority,Ie=i.log,Na=i.unstable_setDisableYieldValue,Ne=null,xl=null;function Zl(t){if(typeof Ie=="function"&&Na(t),xl&&typeof xl.setStrictMode=="function")try{xl.setStrictMode(Ne,t)}catch{}}var pl=Math.clz32?Math.clz32:b,Xi=Math.log,Mu=Math.LN2;function b(t){return t>>>=0,t===0?32:31-(Xi(t)/Mu|0)|0}var y=256,Y=262144,q=4194304;function V(t){var l=t&42;if(l!==0)return l;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function L(t,l,e){var a=t.pendingLanes;if(a===0)return 0;var n=0,u=t.suspendedLanes,c=t.pingedLanes;t=t.warmLanes;var s=a&134217727;return s!==0?(a=s&~u,a!==0?n=V(a):(c&=s,c!==0?n=V(c):e||(e=s&~t,e!==0&&(n=V(e))))):(s=a&~u,s!==0?n=V(s):c!==0?n=V(c):e||(e=a&~t,e!==0&&(n=V(e)))),n===0?0:l!==0&&l!==n&&(l&u)===0&&(u=n&-n,e=l&-l,u>=e||u===32&&(e&4194048)!==0)?l:n}function K(t,l){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&l)===0}function dt(t,l){switch(t){case 1:case 2:case 4:case 8:case 64:return l+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Xt(){var t=q;return q<<=1,(q&62914560)===0&&(q=4194304),t}function Rt(t){for(var l=[],e=0;31>e;e++)l.push(t);return l}function ll(t,l){t.pendingLanes|=l,l!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function B(t,l,e,a,n,u){var c=t.pendingLanes;t.pendingLanes=e,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=e,t.entangledLanes&=e,t.errorRecoveryDisabledLanes&=e,t.shellSuspendCounter=0;var s=t.entanglements,d=t.expirationTimes,_=t.hiddenUpdates;for(e=c&~e;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var zh=/[\n"\\]/g;function le(t){return t.replace(zh,function(l){return"\\"+l.charCodeAt(0).toString(16)+" "})}function Qi(t,l,e,a,n,u,c,s){t.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?t.type=c:t.removeAttribute("type"),l!=null?c==="number"?(l===0&&t.value===""||t.value!=l)&&(t.value=""+Rl(l)):t.value!==""+Rl(l)&&(t.value=""+Rl(l)):c!=="submit"&&c!=="reset"||t.removeAttribute("value"),l!=null?Vi(t,c,Rl(l)):e!=null?Vi(t,c,Rl(e)):a!=null&&t.removeAttribute("value"),n==null&&u!=null&&(t.defaultChecked=!!u),n!=null&&(t.checked=n&&typeof n!="function"&&typeof n!="symbol"),s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"?t.name=""+Rl(s):t.removeAttribute("name")}function fs(t,l,e,a,n,u,c,s){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(t.type=u),l!=null||e!=null){if(!(u!=="submit"&&u!=="reset"||l!=null)){Gi(t);return}e=e!=null?""+Rl(e):"",l=l!=null?""+Rl(l):e,s||l===t.value||(t.value=l),t.defaultValue=l}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,t.checked=s?t.checked:!!a,t.defaultChecked=!!a,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(t.name=c),Gi(t)}function Vi(t,l,e){l==="number"&&Nu(t.ownerDocument)===t||t.defaultValue===""+e||(t.defaultValue=""+e)}function Ja(t,l,e,a){if(t=t.options,l){l={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),$i=!1;if(Ue)try{var Hn={};Object.defineProperty(Hn,"passive",{get:function(){$i=!0}}),window.addEventListener("test",Hn,Hn),window.removeEventListener("test",Hn,Hn)}catch{$i=!1}var la=null,Wi=null,Du=null;function ys(){if(Du)return Du;var t,l=Wi,e=l.length,a,n="value"in la?la.value:la.textContent,u=n.length;for(t=0;t=wn),Ts=" ",zs=!1;function _s(t,l){switch(t){case"keyup":return Wh.indexOf(l.keyCode)!==-1;case"keydown":return l.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Es(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Fa=!1;function Ih(t,l){switch(t){case"compositionend":return Es(l);case"keypress":return l.which!==32?null:(zs=!0,Ts);case"textInput":return t=l.data,t===Ts&&zs?null:t;default:return null}}function Ph(t,l){if(Fa)return t==="compositionend"||!lc&&_s(t,l)?(t=ys(),Du=Wi=la=null,Fa=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(l.ctrlKey||l.altKey||l.metaKey)||l.ctrlKey&&l.altKey){if(l.char&&1=l)return{node:e,offset:l-t};t=a}t:{for(;e;){if(e.nextSibling){e=e.nextSibling;break t}e=e.parentNode}e=void 0}e=Cs(e)}}function Rs(t,l){return t&&l?t===l?!0:t&&t.nodeType===3?!1:l&&l.nodeType===3?Rs(t,l.parentNode):"contains"in t?t.contains(l):t.compareDocumentPosition?!!(t.compareDocumentPosition(l)&16):!1:!1}function Hs(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var l=Nu(t.document);l instanceof t.HTMLIFrameElement;){try{var e=typeof l.contentWindow.location.href=="string"}catch{e=!1}if(e)t=l.contentWindow;else break;l=Nu(t.document)}return l}function nc(t){var l=t&&t.nodeName&&t.nodeName.toLowerCase();return l&&(l==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||l==="textarea"||t.contentEditable==="true")}var cm=Ue&&"documentMode"in document&&11>=document.documentMode,Ia=null,uc=null,Gn=null,ic=!1;function Bs(t,l,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;ic||Ia==null||Ia!==Nu(a)||(a=Ia,"selectionStart"in a&&nc(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Gn&&Ln(Gn,a)||(Gn=a,a=zi(uc,"onSelect"),0>=c,n-=c,Se=1<<32-pl(l)+n|e<rt?(St=F,F=null):St=F.sibling;var Mt=E(T,F,z[rt],j);if(Mt===null){F===null&&(F=St);break}t&&F&&Mt.alternate===null&&l(T,F),m=u(Mt,m,rt),At===null?tt=Mt:At.sibling=Mt,At=Mt,F=St}if(rt===z.length)return e(T,F),Tt&&He(T,rt),tt;if(F===null){for(;rtrt?(St=F,F=null):St=F.sibling;var _a=E(T,F,Mt.value,j);if(_a===null){F===null&&(F=St);break}t&&F&&_a.alternate===null&&l(T,F),m=u(_a,m,rt),At===null?tt=_a:At.sibling=_a,At=_a,F=St}if(Mt.done)return e(T,F),Tt&&He(T,rt),tt;if(F===null){for(;!Mt.done;rt++,Mt=z.next())Mt=R(T,Mt.value,j),Mt!==null&&(m=u(Mt,m,rt),At===null?tt=Mt:At.sibling=Mt,At=Mt);return Tt&&He(T,rt),tt}for(F=a(F);!Mt.done;rt++,Mt=z.next())Mt=A(F,T,rt,Mt.value,j),Mt!==null&&(t&&Mt.alternate!==null&&F.delete(Mt.key===null?rt:Mt.key),m=u(Mt,m,rt),At===null?tt=Mt:At.sibling=Mt,At=Mt);return t&&F.forEach(function(N0){return l(T,N0)}),Tt&&He(T,rt),tt}function qt(T,m,z,j){if(typeof z=="object"&&z!==null&&z.type===lt&&z.key===null&&(z=z.props.children),typeof z=="object"&&z!==null){switch(z.$$typeof){case k:t:{for(var tt=z.key;m!==null;){if(m.key===tt){if(tt=z.type,tt===lt){if(m.tag===7){e(T,m.sibling),j=n(m,z.props.children),j.return=T,T=j;break t}}else if(m.elementType===tt||typeof tt=="object"&&tt!==null&&tt.$$typeof===Ut&&Ya(tt)===m.type){e(T,m.sibling),j=n(m,z.props),kn(j,z),j.return=T,T=j;break t}e(T,m);break}else l(T,m);m=m.sibling}z.type===lt?(j=Ca(z.props.children,T.mode,j,z.key),j.return=T,T=j):(j=qu(z.type,z.key,z.props,null,T.mode,j),kn(j,z),j.return=T,T=j)}return c(T);case I:t:{for(tt=z.key;m!==null;){if(m.key===tt)if(m.tag===4&&m.stateNode.containerInfo===z.containerInfo&&m.stateNode.implementation===z.implementation){e(T,m.sibling),j=n(m,z.children||[]),j.return=T,T=j;break t}else{e(T,m);break}else l(T,m);m=m.sibling}j=hc(z,T.mode,j),j.return=T,T=j}return c(T);case Ut:return z=Ya(z),qt(T,m,z,j)}if(ol(z))return J(T,m,z,j);if(Kt(z)){if(tt=Kt(z),typeof tt!="function")throw Error(f(150));return z=tt.call(z),et(T,m,z,j)}if(typeof z.then=="function")return qt(T,m,Ku(z),j);if(z.$$typeof===Qt)return qt(T,m,Gu(T,z),j);Ju(T,z)}return typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint"?(z=""+z,m!==null&&m.tag===6?(e(T,m.sibling),j=n(m,z),j.return=T,T=j):(e(T,m),j=dc(z,T.mode,j),j.return=T,T=j),c(T)):e(T,m)}return function(T,m,z,j){try{Jn=0;var tt=qt(T,m,z,j);return on=null,tt}catch(F){if(F===sn||F===Vu)throw F;var At=Jl(29,F,null,T.mode);return At.lanes=j,At.return=T,At}finally{}}}var qa=uo(!0),io=uo(!1),ia=!1;function Ac(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Mc(t,l){t=t.updateQueue,l.updateQueue===t&&(l.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function ca(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function fa(t,l,e){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(xt&2)!==0){var n=a.pending;return n===null?l.next=l:(l.next=n.next,n.next=l),a.pending=l,l=wu(t),Qs(t,null,e),l}return Yu(t,a,l,e),wu(t)}function $n(t,l,e){if(l=l.updateQueue,l!==null&&(l=l.shared,(e&4194048)!==0)){var a=l.lanes;a&=t.pendingLanes,e|=a,l.lanes=e,Vt(t,e)}}function Nc(t,l){var e=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,e===a)){var n=null,u=null;if(e=e.firstBaseUpdate,e!==null){do{var c={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};u===null?n=u=c:u=u.next=c,e=e.next}while(e!==null);u===null?n=u=l:u=u.next=l}else n=u=l;e={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},t.updateQueue=e;return}t=e.lastBaseUpdate,t===null?e.firstBaseUpdate=l:t.next=l,e.lastBaseUpdate=l}var Oc=!1;function Wn(){if(Oc){var t=fn;if(t!==null)throw t}}function Fn(t,l,e,a){Oc=!1;var n=t.updateQueue;ia=!1;var u=n.firstBaseUpdate,c=n.lastBaseUpdate,s=n.shared.pending;if(s!==null){n.shared.pending=null;var d=s,_=d.next;d.next=null,c===null?u=_:c.next=_,c=d;var D=t.alternate;D!==null&&(D=D.updateQueue,s=D.lastBaseUpdate,s!==c&&(s===null?D.firstBaseUpdate=_:s.next=_,D.lastBaseUpdate=d))}if(u!==null){var R=n.baseState;c=0,D=_=d=null,s=u;do{var E=s.lane&-536870913,A=E!==s.lane;if(A?(pt&E)===E:(a&E)===E){E!==0&&E===cn&&(Oc=!0),D!==null&&(D=D.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});t:{var J=t,et=s;E=l;var qt=e;switch(et.tag){case 1:if(J=et.payload,typeof J=="function"){R=J.call(qt,R,E);break t}R=J;break t;case 3:J.flags=J.flags&-65537|128;case 0:if(J=et.payload,E=typeof J=="function"?J.call(qt,R,E):J,E==null)break t;R=O({},R,E);break t;case 2:ia=!0}}E=s.callback,E!==null&&(t.flags|=64,A&&(t.flags|=8192),A=n.callbacks,A===null?n.callbacks=[E]:A.push(E))}else A={lane:E,tag:s.tag,payload:s.payload,callback:s.callback,next:null},D===null?(_=D=A,d=R):D=D.next=A,c|=E;if(s=s.next,s===null){if(s=n.shared.pending,s===null)break;A=s,s=A.next,A.next=null,n.lastBaseUpdate=A,n.shared.pending=null}}while(!0);D===null&&(d=R),n.baseState=d,n.firstBaseUpdate=_,n.lastBaseUpdate=D,u===null&&(n.shared.lanes=0),ha|=c,t.lanes=c,t.memoizedState=R}}function co(t,l){if(typeof t!="function")throw Error(f(191,t));t.call(l)}function fo(t,l){var e=t.callbacks;if(e!==null)for(t.callbacks=null,t=0;tu?u:8;var c=x.T,s={};x.T=s,Jc(t,!1,l,e);try{var d=n(),_=x.S;if(_!==null&&_(s,d),d!==null&&typeof d=="object"&&typeof d.then=="function"){var D=vm(d,a);tu(t,l,D,Il(t))}else tu(t,l,a,Il(t))}catch(R){tu(t,l,{then:function(){},status:"rejected",reason:R},Il())}finally{G.p=u,c!==null&&s.types!==null&&(c.types=s.types),x.T=c}}function zm(){}function Zc(t,l,e,a){if(t.tag!==5)throw Error(f(476));var n=Lo(t).queue;Xo(t,n,l,at,e===null?zm:function(){return Go(t),e(a)})}function Lo(t){var l=t.memoizedState;if(l!==null)return l;l={memoizedState:at,baseState:at,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:qe,lastRenderedState:at},next:null};var e={};return l.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:qe,lastRenderedState:e},next:null},t.memoizedState=l,t=t.alternate,t!==null&&(t.memoizedState=l),l}function Go(t){var l=Lo(t);l.next===null&&(l=t.alternate.memoizedState),tu(t,l.next.queue,{},Il())}function Kc(){return Al(gu)}function Qo(){return sl().memoizedState}function Vo(){return sl().memoizedState}function _m(t){for(var l=t.return;l!==null;){switch(l.tag){case 24:case 3:var e=Il();t=ca(e);var a=fa(l,t,e);a!==null&&(Ql(a,l,e),$n(a,l,e)),l={cache:Tc()},t.payload=l;return}l=l.return}}function Em(t,l,e){var a=Il();e={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},ai(t)?Ko(l,e):(e=oc(t,l,e,a),e!==null&&(Ql(e,t,a),Jo(e,l,a)))}function Zo(t,l,e){var a=Il();tu(t,l,e,a)}function tu(t,l,e,a){var n={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(ai(t))Ko(l,n);else{var u=t.alternate;if(t.lanes===0&&(u===null||u.lanes===0)&&(u=l.lastRenderedReducer,u!==null))try{var c=l.lastRenderedState,s=u(c,e);if(n.hasEagerState=!0,n.eagerState=s,Kl(s,c))return Yu(t,l,n,0),Gt===null&&Bu(),!1}catch{}finally{}if(e=oc(t,l,n,a),e!==null)return Ql(e,t,a),Jo(e,l,a),!0}return!1}function Jc(t,l,e,a){if(a={lane:2,revertLane:Mf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},ai(t)){if(l)throw Error(f(479))}else l=oc(t,e,a,2),l!==null&&Ql(l,t,2)}function ai(t){var l=t.alternate;return t===st||l!==null&&l===st}function Ko(t,l){dn=Wu=!0;var e=t.pending;e===null?l.next=l:(l.next=e.next,e.next=l),t.pending=l}function Jo(t,l,e){if((e&4194048)!==0){var a=l.lanes;a&=t.pendingLanes,e|=a,l.lanes=e,Vt(t,e)}}var lu={readContext:Al,use:Pu,useCallback:ul,useContext:ul,useEffect:ul,useImperativeHandle:ul,useLayoutEffect:ul,useInsertionEffect:ul,useMemo:ul,useReducer:ul,useRef:ul,useState:ul,useDebugValue:ul,useDeferredValue:ul,useTransition:ul,useSyncExternalStore:ul,useId:ul,useHostTransitionStatus:ul,useFormState:ul,useActionState:ul,useOptimistic:ul,useMemoCache:ul,useCacheRefresh:ul};lu.useEffectEvent=ul;var ko={readContext:Al,use:Pu,useCallback:function(t,l){return Hl().memoizedState=[t,l===void 0?null:l],t},useContext:Al,useEffect:jo,useImperativeHandle:function(t,l,e){e=e!=null?e.concat([t]):null,li(4194308,4,Ho.bind(null,l,t),e)},useLayoutEffect:function(t,l){return li(4194308,4,t,l)},useInsertionEffect:function(t,l){li(4,2,t,l)},useMemo:function(t,l){var e=Hl();l=l===void 0?null:l;var a=t();if(Xa){Zl(!0);try{t()}finally{Zl(!1)}}return e.memoizedState=[a,l],a},useReducer:function(t,l,e){var a=Hl();if(e!==void 0){var n=e(l);if(Xa){Zl(!0);try{e(l)}finally{Zl(!1)}}}else n=l;return a.memoizedState=a.baseState=n,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=Em.bind(null,st,t),[a.memoizedState,t]},useRef:function(t){var l=Hl();return t={current:t},l.memoizedState=t},useState:function(t){t=Xc(t);var l=t.queue,e=Zo.bind(null,st,l);return l.dispatch=e,[t.memoizedState,e]},useDebugValue:Qc,useDeferredValue:function(t,l){var e=Hl();return Vc(e,t,l)},useTransition:function(){var t=Xc(!1);return t=Xo.bind(null,st,t.queue,!0,!1),Hl().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,l,e){var a=st,n=Hl();if(Tt){if(e===void 0)throw Error(f(407));e=e()}else{if(e=l(),Gt===null)throw Error(f(349));(pt&127)!==0||yo(a,l,e)}n.memoizedState=e;var u={value:e,getSnapshot:l};return n.queue=u,jo(go.bind(null,a,u,t),[t]),a.flags|=2048,mn(9,{destroy:void 0},vo.bind(null,a,u,e,l),null),e},useId:function(){var t=Hl(),l=Gt.identifierPrefix;if(Tt){var e=Te,a=Se;e=(a&~(1<<32-pl(a)-1)).toString(32)+e,l="_"+l+"R_"+e,e=Fu++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?c.createElement("select",{is:a.is}):c.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?c.createElement(n,{is:a.is}):c.createElement(n)}}u[Et]=l,u[zt]=a;t:for(c=l.child;c!==null;){if(c.tag===5||c.tag===6)u.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===l)break t;for(;c.sibling===null;){if(c.return===null||c.return===l)break t;c=c.return}c.sibling.return=c.return,c=c.sibling}l.stateNode=u;t:switch(Nl(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break t;case"img":a=!0;break t;default:a=!1}a&&Le(l)}}return kt(l),ff(l,l.type,t===null?null:t.memoizedProps,l.pendingProps,e),null;case 6:if(t&&l.stateNode!=null)t.memoizedProps!==a&&Le(l);else{if(typeof a!="string"&&l.stateNode===null)throw Error(f(166));if(t=ft.current,nn(l)){if(t=l.stateNode,e=l.memoizedProps,a=null,n=El,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}t[Et]=l,t=!!(t.nodeValue===e||a!==null&&a.suppressHydrationWarning===!0||hd(t.nodeValue,e)),t||na(l,!0)}else t=_i(t).createTextNode(a),t[Et]=l,l.stateNode=t}return kt(l),null;case 31:if(e=l.memoizedState,t===null||t.memoizedState!==null){if(a=nn(l),e!==null){if(t===null){if(!a)throw Error(f(318));if(t=l.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(f(557));t[Et]=l}else Ua(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;kt(l),t=!1}else e=gc(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=e),t=!0;if(!t)return l.flags&256?($l(l),l):($l(l),null);if((l.flags&128)!==0)throw Error(f(558))}return kt(l),null;case 13:if(a=l.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(n=nn(l),a!==null&&a.dehydrated!==null){if(t===null){if(!n)throw Error(f(318));if(n=l.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(f(317));n[Et]=l}else Ua(),(l.flags&128)===0&&(l.memoizedState=null),l.flags|=4;kt(l),n=!1}else n=gc(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=n),n=!0;if(!n)return l.flags&256?($l(l),l):($l(l),null)}return $l(l),(l.flags&128)!==0?(l.lanes=e,l):(e=a!==null,t=t!==null&&t.memoizedState!==null,e&&(a=l.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),e!==t&&e&&(l.child.flags|=8192),fi(l,l.updateQueue),kt(l),null);case 4:return Wt(),t===null&&xf(l.stateNode.containerInfo),kt(l),null;case 10:return Ye(l.type),kt(l),null;case 19:if(U(fl),a=l.memoizedState,a===null)return kt(l),null;if(n=(l.flags&128)!==0,u=a.rendering,u===null)if(n)au(a,!1);else{if(il!==0||t!==null&&(t.flags&128)!==0)for(t=l.child;t!==null;){if(u=$u(t),u!==null){for(l.flags|=128,au(a,!1),t=u.updateQueue,l.updateQueue=t,fi(l,t),l.subtreeFlags=0,t=e,e=l.child;e!==null;)Vs(e,t),e=e.sibling;return X(fl,fl.current&1|2),Tt&&He(l,a.treeForkCount),l.child}t=t.sibling}a.tail!==null&&nl()>hi&&(l.flags|=128,n=!0,au(a,!1),l.lanes=4194304)}else{if(!n)if(t=$u(u),t!==null){if(l.flags|=128,n=!0,t=t.updateQueue,l.updateQueue=t,fi(l,t),au(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!Tt)return kt(l),null}else 2*nl()-a.renderingStartTime>hi&&e!==536870912&&(l.flags|=128,n=!0,au(a,!1),l.lanes=4194304);a.isBackwards?(u.sibling=l.child,l.child=u):(t=a.last,t!==null?t.sibling=u:l.child=u,a.last=u)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=nl(),t.sibling=null,e=fl.current,X(fl,n?e&1|2:e&1),Tt&&He(l,a.treeForkCount),t):(kt(l),null);case 22:case 23:return $l(l),xc(),a=l.memoizedState!==null,t!==null?t.memoizedState!==null!==a&&(l.flags|=8192):a&&(l.flags|=8192),a?(e&536870912)!==0&&(l.flags&128)===0&&(kt(l),l.subtreeFlags&6&&(l.flags|=8192)):kt(l),e=l.updateQueue,e!==null&&fi(l,e.retryQueue),e=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),a=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(a=l.memoizedState.cachePool.pool),a!==e&&(l.flags|=2048),t!==null&&U(Ba),null;case 24:return e=null,t!==null&&(e=t.memoizedState.cache),l.memoizedState.cache!==e&&(l.flags|=2048),Ye(hl),kt(l),null;case 25:return null;case 30:return null}throw Error(f(156,l.tag))}function Dm(t,l){switch(yc(l),l.tag){case 1:return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 3:return Ye(hl),Wt(),t=l.flags,(t&65536)!==0&&(t&128)===0?(l.flags=t&-65537|128,l):null;case 26:case 27:case 5:return $e(l),null;case 31:if(l.memoizedState!==null){if($l(l),l.alternate===null)throw Error(f(340));Ua()}return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 13:if($l(l),t=l.memoizedState,t!==null&&t.dehydrated!==null){if(l.alternate===null)throw Error(f(340));Ua()}return t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 19:return U(fl),null;case 4:return Wt(),null;case 10:return Ye(l.type),null;case 22:case 23:return $l(l),xc(),t!==null&&U(Ba),t=l.flags,t&65536?(l.flags=t&-65537|128,l):null;case 24:return Ye(hl),null;case 25:return null;default:return null}}function br(t,l){switch(yc(l),l.tag){case 3:Ye(hl),Wt();break;case 26:case 27:case 5:$e(l);break;case 4:Wt();break;case 31:l.memoizedState!==null&&$l(l);break;case 13:$l(l);break;case 19:U(fl);break;case 10:Ye(l.type);break;case 22:case 23:$l(l),xc(),t!==null&&U(Ba);break;case 24:Ye(hl)}}function nu(t,l){try{var e=l.updateQueue,a=e!==null?e.lastEffect:null;if(a!==null){var n=a.next;e=n;do{if((e.tag&t)===t){a=void 0;var u=e.create,c=e.inst;a=u(),c.destroy=a}e=e.next}while(e!==n)}}catch(s){Bt(l,l.return,s)}}function ra(t,l,e){try{var a=l.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&t)===t){var c=a.inst,s=c.destroy;if(s!==void 0){c.destroy=void 0,n=l;var d=e,_=s;try{_()}catch(D){Bt(n,d,D)}}}a=a.next}while(a!==u)}}catch(D){Bt(l,l.return,D)}}function pr(t){var l=t.updateQueue;if(l!==null){var e=t.stateNode;try{fo(l,e)}catch(a){Bt(t,t.return,a)}}}function Sr(t,l,e){e.props=La(t.type,t.memoizedProps),e.state=t.memoizedState;try{e.componentWillUnmount()}catch(a){Bt(t,l,a)}}function uu(t,l){try{var e=t.ref;if(e!==null){switch(t.tag){case 26:case 27:case 5:var a=t.stateNode;break;case 30:a=t.stateNode;break;default:a=t.stateNode}typeof e=="function"?t.refCleanup=e(a):e.current=a}}catch(n){Bt(t,l,n)}}function ze(t,l){var e=t.ref,a=t.refCleanup;if(e!==null)if(typeof a=="function")try{a()}catch(n){Bt(t,l,n)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(n){Bt(t,l,n)}else e.current=null}function Tr(t){var l=t.type,e=t.memoizedProps,a=t.stateNode;try{t:switch(l){case"button":case"input":case"select":case"textarea":e.autoFocus&&a.focus();break t;case"img":e.src?a.src=e.src:e.srcSet&&(a.srcset=e.srcSet)}}catch(n){Bt(t,t.return,n)}}function sf(t,l,e){try{var a=t.stateNode;Fm(a,t.type,e,l),a[zt]=l}catch(n){Bt(t,t.return,n)}}function zr(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&ba(t.type)||t.tag===4}function of(t){t:for(;;){for(;t.sibling===null;){if(t.return===null||zr(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&ba(t.type)||t.flags&2||t.child===null||t.tag===4)continue t;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function rf(t,l,e){var a=t.tag;if(a===5||a===6)t=t.stateNode,l?(e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e).insertBefore(t,l):(l=e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,l.appendChild(t),e=e._reactRootContainer,e!=null||l.onclick!==null||(l.onclick=Ce));else if(a!==4&&(a===27&&ba(t.type)&&(e=t.stateNode,l=null),t=t.child,t!==null))for(rf(t,l,e),t=t.sibling;t!==null;)rf(t,l,e),t=t.sibling}function si(t,l,e){var a=t.tag;if(a===5||a===6)t=t.stateNode,l?e.insertBefore(t,l):e.appendChild(t);else if(a!==4&&(a===27&&ba(t.type)&&(e=t.stateNode),t=t.child,t!==null))for(si(t,l,e),t=t.sibling;t!==null;)si(t,l,e),t=t.sibling}function _r(t){var l=t.stateNode,e=t.memoizedProps;try{for(var a=t.type,n=l.attributes;n.length;)l.removeAttributeNode(n[0]);Nl(l,a,e),l[Et]=t,l[zt]=e}catch(u){Bt(t,t.return,u)}}var Ge=!1,vl=!1,df=!1,Er=typeof WeakSet=="function"?WeakSet:Set,_l=null;function xm(t,l){if(t=t.containerInfo,Uf=xi,t=Hs(t),nc(t)){if("selectionStart"in t)var e={start:t.selectionStart,end:t.selectionEnd};else t:{e=(e=t.ownerDocument)&&e.defaultView||window;var a=e.getSelection&&e.getSelection();if(a&&a.rangeCount!==0){e=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{e.nodeType,u.nodeType}catch{e=null;break t}var c=0,s=-1,d=-1,_=0,D=0,R=t,E=null;l:for(;;){for(var A;R!==e||n!==0&&R.nodeType!==3||(s=c+n),R!==u||a!==0&&R.nodeType!==3||(d=c+a),R.nodeType===3&&(c+=R.nodeValue.length),(A=R.firstChild)!==null;)E=R,R=A;for(;;){if(R===t)break l;if(E===e&&++_===n&&(s=c),E===u&&++D===a&&(d=c),(A=R.nextSibling)!==null)break;R=E,E=R.parentNode}R=A}e=s===-1||d===-1?null:{start:s,end:d}}else e=null}e=e||{start:0,end:0}}else e=null;for(Rf={focusedElem:t,selectionRange:e},xi=!1,_l=l;_l!==null;)if(l=_l,t=l.child,(l.subtreeFlags&1028)!==0&&t!==null)t.return=l,_l=t;else for(;_l!==null;){switch(l=_l,u=l.alternate,t=l.flags,l.tag){case 0:if((t&4)!==0&&(t=l.updateQueue,t=t!==null?t.events:null,t!==null))for(e=0;e title"))),Nl(u,a,e),u[Et]=t,dl(u),a=u;break t;case"link":var c=xd("link","href",n).get(a+(e.href||""));if(c){for(var s=0;sqt&&(c=qt,qt=et,et=c);var T=Us(s,et),m=Us(s,qt);if(T&&m&&(A.rangeCount!==1||A.anchorNode!==T.node||A.anchorOffset!==T.offset||A.focusNode!==m.node||A.focusOffset!==m.offset)){var z=R.createRange();z.setStart(T.node,T.offset),A.removeAllRanges(),et>qt?(A.addRange(z),A.extend(m.node,m.offset)):(z.setEnd(m.node,m.offset),A.addRange(z))}}}}for(R=[],A=s;A=A.parentNode;)A.nodeType===1&&R.push({element:A,left:A.scrollLeft,top:A.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;se?32:e,x.T=null,e=pf,pf=null;var u=ya,c=Je;if(bl=0,pn=ya=null,Je=0,(xt&6)!==0)throw Error(f(331));var s=xt;if(xt|=4,Hr(u.current),Cr(u,u.current,c,e),xt=s,ru(0,!1),xl&&typeof xl.onPostCommitFiberRoot=="function")try{xl.onPostCommitFiberRoot(Ne,u)}catch{}return!0}finally{G.p=n,x.T=a,Pr(t,l)}}function ld(t,l,e){l=ae(e,l),l=Fc(t.stateNode,l,2),t=fa(t,l,2),t!==null&&(ll(t,2),_e(t))}function Bt(t,l,e){if(t.tag===3)ld(t,t,e);else for(;l!==null;){if(l.tag===3){ld(l,t,e);break}else if(l.tag===1){var a=l.stateNode;if(typeof l.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(ma===null||!ma.has(a))){t=ae(e,t),e=er(2),a=fa(l,e,2),a!==null&&(ar(e,a,l,t),ll(a,2),_e(a));break}}l=l.return}}function _f(t,l,e){var a=t.pingCache;if(a===null){a=t.pingCache=new Um;var n=new Set;a.set(l,n)}else n=a.get(l),n===void 0&&(n=new Set,a.set(l,n));n.has(e)||(yf=!0,n.add(e),t=wm.bind(null,t,l,e),l.then(t,t))}function wm(t,l,e){var a=t.pingCache;a!==null&&a.delete(l),t.pingedLanes|=t.suspendedLanes&e,t.warmLanes&=~e,Gt===t&&(pt&e)===e&&(il===4||il===3&&(pt&62914560)===pt&&300>nl()-di?(xt&2)===0&&Sn(t,0):vf|=e,bn===pt&&(bn=0)),_e(t)}function ed(t,l){l===0&&(l=Xt()),t=ja(t,l),t!==null&&(ll(t,l),_e(t))}function qm(t){var l=t.memoizedState,e=0;l!==null&&(e=l.retryLane),ed(t,e)}function Xm(t,l){var e=0;switch(t.tag){case 31:case 13:var a=t.stateNode,n=t.memoizedState;n!==null&&(e=n.retryLane);break;case 19:a=t.stateNode;break;case 22:a=t.stateNode._retryCache;break;default:throw Error(f(314))}a!==null&&a.delete(l),ed(t,e)}function Lm(t,l){return gt(t,l)}var pi=null,zn=null,Ef=!1,Si=!1,Af=!1,ga=0;function _e(t){t!==zn&&t.next===null&&(zn===null?pi=zn=t:zn=zn.next=t),Si=!0,Ef||(Ef=!0,Qm())}function ru(t,l){if(!Af&&Si){Af=!0;do for(var e=!1,a=pi;a!==null;){if(t!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var c=a.suspendedLanes,s=a.pingedLanes;u=(1<<31-pl(42|t)+1)-1,u&=n&~(c&~s),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(e=!0,id(a,u))}else u=pt,u=L(a,a===Gt?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||K(a,u)||(e=!0,id(a,u));a=a.next}while(e);Af=!1}}function Gm(){ad()}function ad(){Si=Ef=!1;var t=0;ga!==0&&Pm()&&(t=ga);for(var l=nl(),e=null,a=pi;a!==null;){var n=a.next,u=nd(a,l);u===0?(a.next=null,e===null?pi=n:e.next=n,n===null&&(zn=e)):(e=a,(t!==0||(u&3)!==0)&&(Si=!0)),a=n}bl!==0&&bl!==5||ru(t),ga!==0&&(ga=0)}function nd(t,l){for(var e=t.suspendedLanes,a=t.pingedLanes,n=t.expirationTimes,u=t.pendingLanes&-62914561;0s)break;var D=d.transferSize,R=d.initiatorType;D&&md(R)&&(d=d.responseEnd,c+=D*(d"u"?null:document;function Md(t,l,e){var a=_n;if(a&&typeof l=="string"&&l){var n=le(l);n='link[rel="'+t+'"][href="'+n+'"]',typeof e=="string"&&(n+='[crossorigin="'+e+'"]'),Ad.has(n)||(Ad.add(n),t={rel:t,crossOrigin:e,href:l},a.querySelector(n)===null&&(l=a.createElement("link"),Nl(l,"link",t),dl(l),a.head.appendChild(l)))}}function f0(t){ke.D(t),Md("dns-prefetch",t,null)}function s0(t,l){ke.C(t,l),Md("preconnect",t,l)}function o0(t,l,e){ke.L(t,l,e);var a=_n;if(a&&t&&l){var n='link[rel="preload"][as="'+le(l)+'"]';l==="image"&&e&&e.imageSrcSet?(n+='[imagesrcset="'+le(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(n+='[imagesizes="'+le(e.imageSizes)+'"]')):n+='[href="'+le(t)+'"]';var u=n;switch(l){case"style":u=En(t);break;case"script":u=An(t)}se.has(u)||(t=O({rel:"preload",href:l==="image"&&e&&e.imageSrcSet?void 0:t,as:l},e),se.set(u,t),a.querySelector(n)!==null||l==="style"&&a.querySelector(yu(u))||l==="script"&&a.querySelector(vu(u))||(l=a.createElement("link"),Nl(l,"link",t),dl(l),a.head.appendChild(l)))}}function r0(t,l){ke.m(t,l);var e=_n;if(e&&t){var a=l&&typeof l.as=="string"?l.as:"script",n='link[rel="modulepreload"][as="'+le(a)+'"][href="'+le(t)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=An(t)}if(!se.has(u)&&(t=O({rel:"modulepreload",href:t},l),se.set(u,t),e.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(vu(u)))return}a=e.createElement("link"),Nl(a,"link",t),dl(a),e.head.appendChild(a)}}}function d0(t,l,e){ke.S(t,l,e);var a=_n;if(a&&t){var n=ta(a).hoistableStyles,u=En(t);l=l||"default";var c=n.get(u);if(!c){var s={loading:0,preload:null};if(c=a.querySelector(yu(u)))s.loading=5;else{t=O({rel:"stylesheet",href:t,"data-precedence":l},e),(e=se.get(u))&&Lf(t,e);var d=c=a.createElement("link");dl(d),Nl(d,"link",t),d._p=new Promise(function(_,D){d.onload=_,d.onerror=D}),d.addEventListener("load",function(){s.loading|=1}),d.addEventListener("error",function(){s.loading|=2}),s.loading|=4,Ai(c,l,a)}c={type:"stylesheet",instance:c,count:1,state:s},n.set(u,c)}}}function h0(t,l){ke.X(t,l);var e=_n;if(e&&t){var a=ta(e).hoistableScripts,n=An(t),u=a.get(n);u||(u=e.querySelector(vu(n)),u||(t=O({src:t,async:!0},l),(l=se.get(n))&&Gf(t,l),u=e.createElement("script"),dl(u),Nl(u,"link",t),e.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function m0(t,l){ke.M(t,l);var e=_n;if(e&&t){var a=ta(e).hoistableScripts,n=An(t),u=a.get(n);u||(u=e.querySelector(vu(n)),u||(t=O({src:t,async:!0,type:"module"},l),(l=se.get(n))&&Gf(t,l),u=e.createElement("script"),dl(u),Nl(u,"link",t),e.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function Nd(t,l,e,a){var n=(n=ft.current)?Ei(n):null;if(!n)throw Error(f(446));switch(t){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(l=En(e.href),e=ta(n).hoistableStyles,a=e.get(l),a||(a={type:"style",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){t=En(e.href);var u=ta(n).hoistableStyles,c=u.get(t);if(c||(n=n.ownerDocument||n,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(t,c),(u=n.querySelector(yu(t)))&&!u._p&&(c.instance=u,c.state.loading=5),se.has(t)||(e={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},se.set(t,e),u||y0(n,t,e,c.state))),l&&a===null)throw Error(f(528,""));return c}if(l&&a!==null)throw Error(f(529,""));return null;case"script":return l=e.async,e=e.src,typeof e=="string"&&l&&typeof l!="function"&&typeof l!="symbol"?(l=An(e),e=ta(n).hoistableScripts,a=e.get(l),a||(a={type:"script",instance:null,count:0,state:null},e.set(l,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(f(444,t))}}function En(t){return'href="'+le(t)+'"'}function yu(t){return'link[rel="stylesheet"]['+t+"]"}function Od(t){return O({},t,{"data-precedence":t.precedence,precedence:null})}function y0(t,l,e,a){t.querySelector('link[rel="preload"][as="style"]['+l+"]")?a.loading=1:(l=t.createElement("link"),a.preload=l,l.addEventListener("load",function(){return a.loading|=1}),l.addEventListener("error",function(){return a.loading|=2}),Nl(l,"link",e),dl(l),t.head.appendChild(l))}function An(t){return'[src="'+le(t)+'"]'}function vu(t){return"script[async]"+t}function Dd(t,l,e){if(l.count++,l.instance===null)switch(l.type){case"style":var a=t.querySelector('style[data-href~="'+le(e.href)+'"]');if(a)return l.instance=a,dl(a),a;var n=O({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return a=(t.ownerDocument||t).createElement("style"),dl(a),Nl(a,"style",n),Ai(a,e.precedence,t),l.instance=a;case"stylesheet":n=En(e.href);var u=t.querySelector(yu(n));if(u)return l.state.loading|=4,l.instance=u,dl(u),u;a=Od(e),(n=se.get(n))&&Lf(a,n),u=(t.ownerDocument||t).createElement("link"),dl(u);var c=u;return c._p=new Promise(function(s,d){c.onload=s,c.onerror=d}),Nl(u,"link",a),l.state.loading|=4,Ai(u,e.precedence,t),l.instance=u;case"script":return u=An(e.src),(n=t.querySelector(vu(u)))?(l.instance=n,dl(n),n):(a=e,(n=se.get(u))&&(a=O({},e),Gf(a,n)),t=t.ownerDocument||t,n=t.createElement("script"),dl(n),Nl(n,"link",a),t.head.appendChild(n),l.instance=n);case"void":return null;default:throw Error(f(443,l.type))}else l.type==="stylesheet"&&(l.state.loading&4)===0&&(a=l.instance,l.state.loading|=4,Ai(a,e.precedence,t));return l.instance}function Ai(t,l,e){for(var a=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,c=0;c title"):null)}function v0(t,l,e){if(e===1||l.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof l.precedence!="string"||typeof l.href!="string"||l.href==="")break;return!0;case"link":if(typeof l.rel!="string"||typeof l.href!="string"||l.href===""||l.onLoad||l.onError)break;switch(l.rel){case"stylesheet":return t=l.disabled,typeof l.precedence=="string"&&t==null;default:return!0}case"script":if(l.async&&typeof l.async!="function"&&typeof l.async!="symbol"&&!l.onLoad&&!l.onError&&l.src&&typeof l.src=="string")return!0}return!1}function Cd(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function g0(t,l,e,a){if(e.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var n=En(a.href),u=l.querySelector(yu(n));if(u){l=u._p,l!==null&&typeof l=="object"&&typeof l.then=="function"&&(t.count++,t=Ni.bind(t),l.then(t,t)),e.state.loading|=4,e.instance=u,dl(u);return}u=l.ownerDocument||l,a=Od(a),(n=se.get(n))&&Lf(a,n),u=u.createElement("link"),dl(u);var c=u;c._p=new Promise(function(s,d){c.onload=s,c.onerror=d}),Nl(u,"link",a),e.instance=u}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(e,l),(l=e.state.preload)&&(e.state.loading&3)===0&&(t.count++,e=Ni.bind(t),l.addEventListener("load",e),l.addEventListener("error",e))}}var Qf=0;function b0(t,l){return t.stylesheets&&t.count===0&&Di(t,t.stylesheets),0Qf?50:800)+l);return t.unsuspend=e,function(){t.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function Ni(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Di(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var Oi=null;function Di(t,l){t.stylesheets=null,t.unsuspend!==null&&(t.count++,Oi=new Map,l.forEach(p0,t),Oi=null,Ni.call(t))}function p0(t,l){if(!(l.state.loading&4)){var e=Oi.get(t);if(e)var a=e.get(null);else{e=new Map,Oi.set(t,e);for(var n=t.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(o){console.error(o)}}return i(),Ff.exports=B0(),Ff.exports}var w0=Y0(),$=as();const Yi=O0($);function q0(i){try{return new URL(i).hostname.replace(/^www\./,"")}catch{return i.slice(0,32)}}function eh(i){if(i==null||!Number.isFinite(i))return null;try{return new Date(i).toLocaleDateString()}catch{return null}}function ah(i){if(!i.trim())return null;const o=Date.parse(i);return Number.isFinite(o)?o:null}function X0(i){return i.split(` -`).map(o=>o.trim()).filter(Boolean).map(o=>{const r=o.indexOf("|");return r>=0?{title:o.slice(0,r).trim(),url:o.slice(r+1).trim()}:{url:o}}).filter(o=>o.url)}function L0(i){return(i??[]).map(o=>o.title?`${o.title}|${o.url}`:o.url).join(` -`)}const ns=[{id:"text",label:"标题",kind:"title",always:!0,rowHeight:22,isEmpty:i=>{var o;return!((o=i.text)!=null&&o.trim())},preview:i=>{var o;return((o=i.text)==null?void 0:o.trim())||"未命名"},commit:(i,o)=>[{type:"update_text",nodeId:i,text:o.trim()||"未命名"}]},{id:"note",label:"摘要",kind:"textarea",rowHeight:18,isEmpty:i=>{var o;return!((o=i.note)!=null&&o.trim())},preview:i=>{var r;const o=(r=i.note)==null?void 0:r.trim();return o?o.length>48?`${o.slice(0,48)}…`:o:null},commit:(i,o)=>[{type:"update_node_meta",nodeId:i,patch:{note:o.trim()||null}}]},{id:"description",label:"结构化描述 (JSON)",kind:"textarea",rowHeight:36,isEmpty:i=>!i.description||Object.keys(i.description).length===0,preview:i=>{if(!i.description||!Object.keys(i.description).length)return null;const o=JSON.stringify(i.description);return o.length>48?`${o.slice(0,48)}…`:o},commit:(i,o)=>{const r=o.trim();if(!r)return[{type:"update_node_meta",nodeId:i,patch:{description:null}}];try{const f=JSON.parse(r);if(!f||typeof f!="object"||Array.isArray(f))throw new Error("description must be a JSON object");return[{type:"update_node_meta",nodeId:i,patch:{description:f}}]}catch{return[]}}},{id:"imageUrl",label:"配图",kind:"image",imageRow:!0,rowHeight:64,isEmpty:i=>{var o;return!((o=i.imageUrl)!=null&&o.trim())},preview:i=>{var o;return((o=i.imageUrl)==null?void 0:o.trim())||null},commit:(i,o)=>[{type:"update_node_meta",nodeId:i,patch:{imageUrl:o.trim()||null}}]},{id:"tags",label:"标签",kind:"tags",rowHeight:18,isEmpty:i=>{var o;return!(((o=i.tags)==null?void 0:o.length)>0)},preview:i=>{var o;return(o=i.tags)!=null&&o.length?i.tags.slice(0,4).map(r=>`#${r}`).join(" "):null},commit:(i,o)=>{const r=o.split(/[,,]/).map(f=>f.trim()).filter(Boolean);return[{type:"update_node_meta",nodeId:i,patch:{tags:r}}]}},{id:"links",label:"来源",kind:"links",rowHeight:18,isEmpty:i=>{var o;return!(((o=i.links)==null?void 0:o.length)>0)},preview:i=>{var p,g,M;const o=(p=i.links)==null?void 0:p[0];if(!o)return null;const r=((g=o.title)==null?void 0:g.trim())||q0(o.url),f=(((M=i.links)==null?void 0:M.length)??0)>1?` +${i.links.length-1}`:"";return`${r}${f}`},commit:(i,o)=>[{type:"update_node_meta",nodeId:i,patch:{links:X0(o)}}]},{id:"startAt",label:"开始",kind:"datetime",rowHeight:18,isEmpty:i=>i.startAt==null,preview:i=>eh(i.startAt),commit:(i,o)=>[{type:"update_node_meta",nodeId:i,patch:{startAt:ah(o)}}]},{id:"dueAt",label:"截止",kind:"datetime",rowHeight:18,isEmpty:i=>i.dueAt==null,preview:i=>eh(i.dueAt),commit:(i,o)=>[{type:"update_node_meta",nodeId:i,patch:{dueAt:ah(o)}}]},{id:"pinned",label:"固定",kind:"flag",rowHeight:18,isEmpty:i=>!i.pinned,preview:i=>i.pinned?"已钉住":null,commit:(i,o)=>[{type:"set_pinned",nodeId:i,pinned:o==="1"||o==="true"}]}],G0=Object.fromEntries(ns.map(i=>[i.id,i]));function us(i,o=new Set){const r=[];for(const f of ns)(f.always||!f.isEmpty(i)||o.has(f.id))&&r.push({def:f,preview:f.preview(i)});return r}function Q0(i,o=new Set){return ns.filter(r=>!r.always&&r.isEmpty(i)&&!o.has(r.id))}function V0(i,o){switch(o){case"text":return i.text??"";case"note":return i.note??"";case"description":return i.description?JSON.stringify(i.description,null,2):"";case"imageUrl":return i.imageUrl??"";case"tags":return(i.tags??[]).join(", ");case"links":return L0(i.links);case"startAt":return nh(i.startAt);case"dueAt":return nh(i.dueAt);case"pinned":return i.pinned?"1":"0";default:return""}}function nh(i){if(i==null||!Number.isFinite(i))return"";const o=new Date(i),r=f=>String(f).padStart(2,"0");return`${o.getFullYear()}-${r(o.getMonth()+1)}-${r(o.getDate())}T${r(o.getHours())}:${r(o.getMinutes())}`}function Z0(i,o,r){return G0[o].commit(i.id,r,i)}const uh={comfortable:288,compact:248},Ea=36,hh=12,Pl=12,wi=10;function mh(i,o,r=new Set){const f=o?uh.compact:uh.comfortable,p=us(i,r);let g=0;for(const{def:N}of p){if(N.id==="text")continue;const C=N.imageRow?(o?52:64)+4:Math.max(N.rowHeight+12,o?28:32);g+=C+wi}g>0&&(g-=wi);const M=Ea+hh*2+Math.max(g,12);return{w:f,h:Math.max(M,o?84:100)}}const K0='"Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", system-ui, sans-serif';function Aa(i,o=400){return`${o===400?"":`${o} `}${i}px ${K0}`}function J0(i,o,r){i.shadowColor=r!=null&&r.selected?"rgba(0, 0, 0, 0.45)":"rgba(0, 0, 0, 0.28)",i.shadowBlur=(r!=null&&r.selected?18:12)/Math.max(.5,o),i.shadowOffsetX=0,i.shadowOffsetY=3/Math.max(.5,o)}function k0(i){i.shadowColor="transparent",i.shadowBlur=0,i.shadowOffsetX=0,i.shadowOffsetY=0}function $0(i,o,r=.14){i.save(),i.globalAlpha=r,i.fillStyle=o,i.fill(),i.restore()}function W0(i,o,r,f,p,g=10){i.save(),i.beginPath();const N=Math.min(g,f/2);i.moveTo(o+N,r),i.lineTo(o+4,r),i.lineTo(o+4,r+f),i.lineTo(o+N,r+f),i.quadraticCurveTo(o,r+f,o,r+f-N),i.lineTo(o,r+N),i.quadraticCurveTo(o,r,o+N,r),i.closePath(),i.fillStyle=p,i.globalAlpha=.95,i.fill(),i.restore()}function F0(i,o,r,f,p,g){const N=16/Math.max(.75,Math.min(1.2,g));i.font=Aa(10/Math.max(.75,Math.min(1.2,g)),500);const S=i.measureText(o).width+12;i.beginPath();const w=N/2;return i.moveTo(r+w,f),i.arcTo(r+S,f,r+S,f+N,w),i.arcTo(r+S,f+N,r,f+N,w),i.arcTo(r,f+N,r,f,w),i.arcTo(r,f,r+S,f,w),i.closePath(),i.fillStyle="rgba(255,255,255,0.06)",i.fill(),i.strokeStyle=p.border,i.lineWidth=1/Math.max(.5,g),i.stroke(),i.fillStyle=p.labelSecondary,i.textBaseline="middle",i.fillText(o,r+6,f+N/2),S+4}const _u=new Map;function yh(i,o){const r=_u.get(i);if(r instanceof HTMLImageElement)return r;if(r==="loading"||r==="error")return null;_u.set(i,"loading");const f=new Image;return f.decoding="async",f.crossOrigin="anonymous",f.onload=()=>{_u.set(i,f),o()},f.onerror=()=>{_u.set(i,"error"),o()},f.src=i,null}function I0(i){return _u.get(i)==="error"}function P0(i,o,r){var N,C;if(r!=null&&r.asCard||i.stylePreset==="card")return mh(i,o);let f=o?168:212,p=o?48:60;const g=!!((N=i.tags)!=null&&N.length)||!!((C=i.links)!=null&&C.length)||i.dueAt!=null||!!i.note;p+=g?o?20:26:o?8:10;const M=i.stylePreset;return M==="title"?(f*=1.18,p*=1.15):M==="decision"?(f*=1.08,p*=1.12):M==="note"&&(p*=1.12),i.imageUrl&&(f=Math.max(f,o?200:248),p+=o?78:96),{w:f,h:p}}function ih(i,o,r,f,p,g,M){if(i.beginPath(),o==="decision"){const N=r+p/2,C=f+g/2;i.moveTo(N,f),i.lineTo(r+p,C),i.lineTo(N,f+g),i.lineTo(r,C),i.closePath()}else if(o==="note"){const N=Math.min(12,p*.12);i.moveTo(r,f),i.lineTo(r+p-N,f),i.lineTo(r+p,f+N),i.lineTo(r+p,f+g),i.lineTo(r,f+g),i.closePath()}else if(o==="title"){const N=g/2;qi(i,r,f,p,g,N)}else qi(i,r,f,p,g,M)}function qi(i,o,r,f,p,g){const M=Math.min(g,f/2,p/2);i.moveTo(o+M,r),i.arcTo(o+f,r,o+f,r+p,M),i.arcTo(o+f,r+p,o,r+p,M),i.arcTo(o,r+p,o,r,M),i.arcTo(o,r,o+f,r,M),i.closePath()}function Eu(i,o,r,f){const p=o.replace(/\s+/g," ").trim();if(!p)return[];const g=[];let M=p;for(;M&&g.lengthS*.4&&(S=w);let O=M.slice(0,S).trimEnd();if(M=M.slice(S).trimStart(),g.length===f-1&&M){for(;O.length>1&&i.measureText(`${O}…`).width>r;)O=O.slice(0,-1);g.push(`${O}…`);break}g.push(O)}return g}function ty(i){var r,f;const o=[];if(i.icon){const p=ly[i.icon];p&&o.push(p)}return i.collapsed&&o.push("▸"),(r=i.links)!=null&&r.length&&o.push("🔗"),i.imageUrl&&o.push("🖼"),i.dueAt!=null&&o.push("⏰"),(f=i.tags)!=null&&f.length&&o.push(`#${i.tags.length}`),i.pinned&&o.push("📌"),o}const ly={server:"[服]",database:"[库]",cloud:"[云]",person:"[人]",folder:"[夹]",doc:"[档]",link:"[链]",warning:"[警]",check:"[✓]",star:"[★]",gear:"[设]",globe:"[球]"};function ey(i,o,r,f,p,g,M,N,C){const{w:S,h:w}=mh(o,M),O=us(o),Q=M?12:14;if(i.save(),i.beginPath(),qi(i,r,f,S,w,Q),i.clip(),i.fillStyle=N,i.globalAlpha=.9,i.fillRect(r,f,S,3),i.globalAlpha=1,g<.35){i.fillStyle=p.labelPrimary,i.font=Aa(M?12:13,600),i.textBaseline="middle";const yt=Eu(i,o.text||"未命名",S-Pl*2,2),el=M?14:16,Qt=f+w/2-(yt.length-1)*el/2;yt.forEach((nt,H)=>{i.fillText(nt,r+Pl,Qt+H*el)}),i.restore();return}i.fillStyle="rgba(0,0,0,0.2)",i.fillRect(r,f,S,Ea),i.beginPath(),i.arc(r+14,f+Ea/2,4.5,0,Math.PI*2),i.fillStyle=N,i.fill(),i.fillStyle=p.labelPrimary,i.font=Aa(M?12:13,600),i.textBaseline="middle";const k=S-28-Pl,I=Eu(i,o.text||"未命名",k,M?1:2);if(I.length===1)i.fillText(I[0],r+26,f+Ea/2);else{const el=f+Ea/2-6.5;I.forEach((Qt,nt)=>{i.fillText(Qt,r+26,el+nt*13)})}i.strokeStyle=p.border,i.lineWidth=1/Math.max(.5,g),i.beginPath(),i.moveTo(r+Pl,f+Ea),i.lineTo(r+S-Pl,f+Ea),i.stroke();let lt=f+Ea+hh;const Nt=S-Pl*2;for(const{def:yt,preview:el}of O){if(yt.id==="text")continue;if(yt.imageRow&&el){const P=M?52:64,Ut=yh(el,C);if(i.save(),i.beginPath(),qi(i,r+Pl,lt,Nt,P,8),i.clip(),Ut&&Ut.naturalWidth>0){const Ot=Math.min(Nt/Ut.naturalWidth,P/Ut.naturalHeight),Ol=Ut.naturalWidth*Ot,$t=Ut.naturalHeight*Ot;i.fillStyle="rgba(0,0,0,0.22)",i.fillRect(r+Pl,lt,Nt,P),i.drawImage(Ut,r+Pl+(Nt-Ol)/2,lt+(P-$t)/2,Ol,$t)}else i.fillStyle=p.border,i.fillRect(r+Pl,lt,Nt,P),i.fillStyle=p.labelSecondary,i.font=Aa(11,500),i.textBaseline="middle",i.fillText(I0(el)?"配图失败":"加载中…",r+Pl+10,lt+P/2);i.restore(),lt+=P+wi;continue}i.fillStyle=p.labelSecondary,i.font=Aa(M?10:11,500),i.textBaseline="top",i.fillText(yt.label,r+Pl,lt),i.fillStyle=p.labelPrimary,i.font=Aa(M?11:12,400);const Qt=el??"—",nt=yt.kind==="textarea"?3:2,H=Eu(i,Qt,Nt,nt);let vt=lt+(M?14:15);for(const P of H)i.fillText(P,r+Pl,vt),vt+=M?14:15;lt=Math.max(lt+yt.rowHeight,vt)+wi}i.restore()}const ay=1280,ny=.82;function uy(i){return new Promise((o,r)=>{const f=new FileReader;f.onload=()=>o(String(f.result||"")),f.onerror=()=>r(f.error||new Error("read failed")),f.readAsDataURL(i)})}function iy(i){return new Promise((o,r)=>{const f=new Image;f.onload=()=>o(f),f.onerror=()=>r(new Error("image decode failed")),f.src=i})}async function cy(i){const o=await uy(i),r=await iy(o),f=Math.min(1,ay/Math.max(r.width,r.height)),p=Math.max(1,Math.round(r.width*f)),g=Math.max(1,Math.round(r.height*f)),M=document.createElement("canvas");M.width=p,M.height=g;const N=M.getContext("2d");if(!N)throw new Error("canvas unavailable");N.drawImage(r,0,0,p,g);const C=i.type==="image/png"&&i.size<4e5&&f===1,S=C?"image/png":"image/jpeg";return{dataUrl:M.toDataURL(S,C?void 0:ny),mimeType:S}}async function fy(i){if(!i.type.startsWith("image/"))throw new Error("请选择图片文件");if(i.size>20*1024*1024)throw new Error("原图过大(请小于 20MB)");const{dataUrl:o,mimeType:r}=await cy(i),f=await fetch("/api/uploads",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dataBase64:o,mimeType:r,filename:i.name})}),p=await f.json().catch(()=>({}));if(!f.ok||!p.ok||!p.url)throw new Error(p.message||`上传失败 (${f.status})`);return p.url}function vh({node:i,applyOps:o,accent:r,variant:f="overlay",onDragHandlePointerDown:p,showStylePreset:g}){const[M,N]=$.useState(()=>new Set),[C,S]=$.useState(!1);$.useEffect(()=>{N(new Set),S(!1)},[i.id]);const w=$.useMemo(()=>us(i,M),[i,M]),O=$.useMemo(()=>Q0(i,M),[i,M]),Q=(k,I)=>{const lt=Z0(i,k,I);lt.length&&(o(lt,`prop ${k}`),!I.trim()&&k!=="text"&&N(Nt=>{const yt=new Set(Nt);return yt.delete(k),yt}))};return v.jsxs("div",{className:`ns-editor${f==="panel"?" ns-editor--panel":""}`,children:[v.jsxs("div",{className:"ns-editor__header","data-ns-drag-handle":!0,onPointerDown:p,children:[v.jsx("span",{className:"ns-editor__dot",style:r?{background:r}:void 0}),v.jsx("input",{className:"ns-editor__title",defaultValue:i.text,onPointerDown:k=>k.stopPropagation(),onBlur:k=>{k.target.value!==i.text&&Q("text",k.target.value)},onKeyDown:k=>{k.key==="Enter"&&k.target.blur()}},`title-${i.id}-${i.version}`)]}),v.jsxs("div",{className:"ns-editor__body",children:[g?v.jsxs("div",{className:"ns-row",children:[v.jsx("span",{className:"ns-row__label",children:"类型"}),v.jsx("div",{className:"ns-row__ctrl",children:v.jsxs("select",{value:i.stylePreset,onChange:k=>{o([{type:"set_style_preset",nodeId:i.id,stylePreset:k.target.value}],"style")},children:[v.jsx("option",{value:"default",children:"默认外形"}),v.jsx("option",{value:"title",children:"title"}),v.jsx("option",{value:"decision",children:"决策"}),v.jsx("option",{value:"risk",children:"风险"}),v.jsx("option",{value:"note",children:"便签"}),v.jsx("option",{value:"muted",children:"弱化"})]})}),v.jsx("span",{})]}):null,v.jsxs("div",{className:"ns-row",children:[v.jsx("span",{className:"ns-row__label",children:"强调色"}),v.jsx("div",{className:"ns-row__ctrl",children:v.jsx("input",{type:"text",placeholder:"#e74c3c",defaultValue:i.accentColor??"",onBlur:k=>{const lt=k.target.value.trim()||null;(i.accentColor??null)!==lt&&o([{type:"update_node_meta",nodeId:i.id,patch:{accentColor:lt}}])}},`ac-${i.id}-${i.version}`)}),v.jsx("span",{})]}),v.jsxs("div",{className:"ns-row",children:[v.jsx("span",{className:"ns-row__label",children:"图标"}),v.jsx("div",{className:"ns-row__ctrl",children:v.jsxs("select",{value:i.icon??"",onChange:k=>{const I=k.target.value;o([{type:"update_node_meta",nodeId:i.id,patch:{icon:I||null}}])},children:[v.jsx("option",{value:"",children:"无"}),v.jsx("option",{value:"server",children:"🖥 服务器"}),v.jsx("option",{value:"database",children:"🗄 数据库"}),v.jsx("option",{value:"cloud",children:"☁ 云"}),v.jsx("option",{value:"person",children:"👤 人物"}),v.jsx("option",{value:"folder",children:"📁 文件夹"}),v.jsx("option",{value:"doc",children:"📄 文档"}),v.jsx("option",{value:"link",children:"🔗 链接"}),v.jsx("option",{value:"warning",children:"⚠ 警告"}),v.jsx("option",{value:"check",children:"✓ 完成"}),v.jsx("option",{value:"star",children:"★ 星标"}),v.jsx("option",{value:"gear",children:"⚙ 设置"}),v.jsx("option",{value:"globe",children:"🌐 全球"})]})}),v.jsx("span",{})]}),w.filter(k=>k.def.id!=="text").map(({def:k})=>v.jsx(sy,{def:k,node:i,onCommit:I=>Q(k.id,I),onClear:()=>{Q(k.id,""),N(I=>{const lt=new Set(I);return lt.delete(k.id),lt})}},k.id))]}),O.length>0?v.jsxs("div",{className:"ns-add",onPointerDown:k=>k.stopPropagation(),children:[C?v.jsx("div",{className:"ns-add__menu",children:O.map(k=>v.jsx("button",{type:"button",className:"ns-add__item",onClick:I=>{I.preventDefault(),I.stopPropagation(),N(lt=>new Set(lt).add(k.id)),S(!1)},children:k.label},k.id))}):null,v.jsx("button",{type:"button",className:"ns-add__btn",onClick:k=>{k.preventDefault(),k.stopPropagation(),S(I=>!I)},children:"+ 添加字段"})]}):null]})}function sy({def:i,node:o,onCommit:r,onClear:f}){const p=V0(o,i.id),g=!i.always,[M,N]=$.useState(!1),[C,S]=$.useState(null),w=$.useRef(null);return i.kind==="image"?v.jsxs("div",{className:"ns-row",children:[v.jsx("span",{className:"ns-row__label",children:i.label}),v.jsxs("div",{className:"ns-row__ctrl ns-row__ctrl--image",onPointerDown:O=>O.stopPropagation(),children:[p?v.jsx("img",{className:"ns-thumb",src:p,alt:""}):null,v.jsxs("div",{className:"ns-image-actions",children:[v.jsx("button",{type:"button",className:"ns-image-pick",disabled:M,onClick:()=>{var O;return(O=w.current)==null?void 0:O.click()},children:M?"上传中…":"选择文件"}),v.jsx("input",{ref:w,type:"file",accept:"image/jpeg,image/png,image/webp,image/gif",hidden:!0,onChange:O=>{var k;const Q=(k=O.target.files)==null?void 0:k[0];O.target.value="",Q&&(S(null),N(!0),fy(Q).then(I=>r(I)).catch(I=>S(String((I==null?void 0:I.message)||I||"上传失败"))).finally(()=>N(!1)))}}),v.jsx("input",{className:"ns-image-url",defaultValue:p,placeholder:"或粘贴图片 URL",onBlur:O=>{const Q=O.target.value.trim();Q!==(p||"")&&r(Q)},onKeyDown:O=>{O.key==="Enter"&&O.target.blur()}},`${i.id}-${o.id}-${o.version}`),g?v.jsx("button",{type:"button",className:"ns-row__clear",title:"清除",onClick:f,children:"×"}):null]}),C?v.jsx("div",{className:"ns-image-err",children:C}):null,v.jsx("div",{className:"ns-image-hint",children:"支持本地选图或粘贴 https://… 链接"})]})]}):v.jsxs("div",{className:"ns-row",children:[v.jsx("span",{className:"ns-row__label",children:i.label}),v.jsxs("div",{className:"ns-row__ctrl",onPointerDown:O=>O.stopPropagation(),children:[i.kind==="textarea"||i.kind==="links"?v.jsx("textarea",{defaultValue:p,rows:i.kind==="links"?3:2,placeholder:i.kind==="links"?"标题|url 每行一条":"",onBlur:O=>r(O.target.value)},`${i.id}-${o.id}-${o.version}`):i.kind==="datetime"?v.jsx("input",{type:"datetime-local",defaultValue:p,onBlur:O=>r(O.target.value)},`${i.id}-${o.id}-${o.version}`):i.kind==="flag"?v.jsx("button",{type:"button",onClick:()=>r(o.pinned?"0":"1"),children:o.pinned?"解钉":"钉住"}):v.jsx("input",{defaultValue:p,placeholder:i.kind==="tags"?"逗号分隔":"",onBlur:O=>r(O.target.value),onKeyDown:O=>{O.key==="Enter"&&O.target.blur()}},`${i.id}-${o.id}-${o.version}`),g?v.jsx("button",{type:"button",className:"ns-row__clear",title:"清除",onClick:f,children:"×"}):null]})]})}function oy({node:i,applyOps:o,screenX:r,screenY:f,zoom:p,accent:g,width:M,showStylePreset:N}){return v.jsx("div",{className:"ns-overlay",style:{left:r,top:f,width:M,transform:`translate(-50%, -50%) scale(${p})`},children:v.jsx(vh,{node:i,applyOps:o,accent:g,showStylePreset:N})})}const ch=i=>{let o;const r=new Set,f=(S,w)=>{const O=typeof S=="function"?S(o):S;if(!Object.is(O,o)){const Q=o;o=w??(typeof O!="object"||O===null)?O:Object.assign({},o,O),r.forEach(k=>k(o,Q))}},p=()=>o,N={setState:f,getState:p,getInitialState:()=>C,subscribe:S=>(r.add(S),()=>r.delete(S))},C=o=i(f,p,N);return N},ry=(i=>i?ch(i):ch),dy=i=>i;function hy(i,o=dy){const r=Yi.useSyncExternalStore(i.subscribe,Yi.useCallback(()=>o(i.getState()),[i,o]),Yi.useCallback(()=>o(i.getInitialState()),[i,o]));return Yi.useDebugValue(r),r}const fh=i=>{const o=ry(i),r=f=>hy(o,f);return Object.assign(r,o),r},my=(i=>i?fh(i):fh);async function Va(i,o){const r=await fetch(i,{...o,headers:{"Content-Type":"application/json",...(o==null?void 0:o.headers)??{}}}),f=await r.json();if(!r.ok)throw new Error(f.message??f.error??r.statusText);return f}function yy(i,o){const r={...i};for(const[f,p]of Object.entries(o))r[f]={...p};for(const f of Object.keys(r))f in o||delete r[f];return r}function sh(i,o,r){const f={...o};for(const[p,g]of Object.entries(i))!r.has(p)&&f[p]&&(f[p]={...g});for(const p of r)o[p]?f[p]={...o[p]}:i[p]&&(f[p]={...i[p]});return f}const oh=new Map,_t=my((i,o)=>({canvases:[],canvasId:null,canvas:null,nodes:[],edges:[],positions:{},selectedIds:[],selectedEdgeId:null,highlightIds:[],highlightEdgeIds:[],highlightStyle:null,fitViewport:null,leftCollapsed:!1,themeId:localStorage.getItem("mind-map:theme")??"abyss",lastChangeSetId:null,trash:[],loadCanvases:async()=>{const r=await Va("/api/canvases");i({canvases:r.canvases}),!o().canvasId&&r.canvases[0]&&await o().openCanvas(r.canvases[0].id)},openCanvas:async r=>{const f=await Va(`/api/canvases/${r}`);i({canvasId:r,canvas:f.canvas,nodes:f.nodes,edges:f.edges,positions:f.positions,selectedIds:[],selectedEdgeId:null,themeId:f.canvas.prefs.themeId??o().themeId}),await o().loadTrash()},createCanvas:async r=>{const f=await Va("/api/canvases",{method:"POST",body:JSON.stringify({title:r})});await o().loadCanvases(),i({canvasId:f.canvas.id,canvas:f.canvas,nodes:f.nodes,edges:f.edges,positions:f.positions,selectedIds:[]})},patchLocal:r=>{i(f=>({nodes:r.nodes??f.nodes,edges:r.edges??f.edges,positions:r.positions??f.positions,canvas:r.canvas??f.canvas}))},requestFitViewport:r=>i({fitViewport:r}),consumeFitViewport:()=>{const r=o().fitViewport;return r&&i({fitViewport:null}),r},applyOps:async(r,f)=>{const p=o().canvasId;if(!p)return;const g=r.some(Q=>Q.type==="delete_node"||Q.type==="restore_node"),M=r.some(Q=>Q.type==="set_prefs"||Q.type==="update_text"),N=r.length>0&&r.every(Q=>Q.type==="set_pinned"),C=new Set(r.filter(Q=>Q.type==="set_pinned"&&Q.pinned===!0).map(Q=>Q.nodeId)),S={...o().positions},w=await Va(`/api/canvases/${p}/ops`,{method:"POST",body:JSON.stringify({ops:r,origin:"user",summary:f})}),O=N&&C.size>0?sh(S,w.positions,C):yy(S,w.positions);i({canvas:w.canvas,nodes:w.nodes,edges:w.edges,positions:O,lastChangeSetId:w.changeSetId,themeId:w.canvas.prefs.themeId,...w.fitViewport?{fitViewport:w.fitViewport}:{}}),N&&C.size>0&&oh.set(p,{positions:{...O},pinnedIds:[...C],until:Date.now()+2e3}),M&&o().loadCanvases(),g&&o().loadTrash()},applyCanvasPayload:(r,f)=>{const p=r.canvas.id,g=oh.get(p),M=o().positions;let N=r.positions;if(f!=null&&f.preserveUnpinned||g&&g.until>Date.now()){const C=new Set((g==null?void 0:g.pinnedIds)??r.nodes.filter(S=>S.pinned&&S.pos).map(S=>S.id));N=sh((g==null?void 0:g.positions)??M,r.positions,C)}i({canvasId:p,canvas:r.canvas,nodes:r.nodes,edges:r.edges,positions:N,themeId:r.canvas.prefs.themeId??o().themeId})},undo:async()=>{const r=o().canvasId,f=o().lastChangeSetId;if(!r||!f)return;const p=await Va(`/api/canvases/${r}/undo`,{method:"POST",body:JSON.stringify({changeSetId:f})});await o().openCanvas(r),i({lastChangeSetId:p.changeSetId})},setSelection:r=>i({selectedIds:r,selectedEdgeId:null}),setSelectedEdge:r=>i({selectedEdgeId:r,selectedIds:r?[]:o().selectedIds}),flashHighlight:r=>{const f=Array.isArray(r)?{nodeIds:r}:r,p=f.nodeIds??[],g=f.edgeIds??[],M=f.style??null,N=Math.max(500,Math.min(6e4,f.ttlMs??2200));i({highlightIds:p,highlightEdgeIds:g,highlightStyle:M,selectedIds:p.length?p:o().selectedIds,selectedEdgeId:g.length===1?g[0]:o().selectedEdgeId}),window.setTimeout(()=>{const C=_t.getState();C.highlightIds.length===p.length&&C.highlightIds.every((S,w)=>S===p[w])&&C.highlightEdgeIds.length===g.length&&C.highlightEdgeIds.every((S,w)=>S===g[w])&&i({highlightIds:[],highlightEdgeIds:[],highlightStyle:null})},N)},setThemeId:r=>{localStorage.setItem("mind-map:theme",r),i({themeId:r})},setCollapsedPanels:(r,f)=>{r==="left"&&i({leftCollapsed:f})},setPrefs:async r=>{await o().applyOps([{type:"set_prefs",prefs:r}],"update prefs")},setStylePreset:async(r,f)=>{await o().applyOps([{type:"set_style_preset",nodeId:r,stylePreset:f}],"style")},loadTrash:async()=>{const r=o().canvasId;if(!r)return;const f=await Va(`/api/canvases/${r}/trash`);i({trash:f.nodes})},restoreFromTrash:async r=>{const f=o().canvasId;f&&(await Va(`/api/canvases/${f}/trash/${r}/restore`,{method:"POST"}),await o().openCanvas(f),await o().loadTrash())}}));function vy(){const i=_t(S=>S.canvas),o=_t(S=>S.nodes),r=_t(S=>S.edges),f=_t(S=>S.selectedIds),p=_t(S=>S.selectedEdgeId),g=_t(S=>S.applyOps),M=(i==null?void 0:i.prefs.inspectorMode)??"selection",N=$.useMemo(()=>f[0]?o.find(S=>S.id===f[0]):void 0,[o,f]),C=$.useMemo(()=>p?r.find(S=>S.id===p):void 0,[r,p]);return M==="selection"&&!N&&!C?v.jsx("div",{className:"inspector muted",children:"选中节点或边以编辑属性"}):C&&!N?v.jsx(by,{edge:C,applyOps:g}):N?v.jsx(gy,{node:N,applyOps:g}):v.jsx("div",{className:"inspector muted",children:"选中节点或边以编辑属性"})}function gy({node:i,applyOps:o}){return v.jsxs("div",{className:"inspector",children:[v.jsx("div",{className:"inspector__title",children:"节点属性"}),v.jsx(vh,{node:i,applyOps:o,variant:"panel",showStylePreset:!0}),v.jsx("div",{className:"inspector__row",style:{marginTop:8},children:v.jsx("button",{type:"button",onClick:()=>void o([{type:"set_collapsed",nodeId:i.id,collapsed:!i.collapsed}]),children:i.collapsed?"展开":"折叠"})})]})}function by({edge:i,applyOps:o}){var p;const[r,f]=$.useState(((p=i.tags)==null?void 0:p.join(", "))??"");return $.useEffect(()=>{var g;f(((g=i.tags)==null?void 0:g.join(", "))??"")},[i.id,i.version,i.tags]),v.jsxs("div",{className:"inspector",children:[v.jsx("div",{className:"inspector__title",children:"边属性"}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"标签"}),v.jsx("input",{defaultValue:i.label??"",onBlur:g=>{o([{type:"update_edge_meta",edgeId:i.id,patch:{label:g.target.value||null}}])}},`el-${i.id}-${i.version}`)]}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"备注"}),v.jsx("textarea",{defaultValue:i.note??"",rows:2,onBlur:g=>{o([{type:"update_edge_meta",edgeId:i.id,patch:{note:g.target.value||null}}])}},`en-${i.id}-${i.version}`)]}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"线粗 (1-5)"}),v.jsx("input",{type:"number",min:1,max:5,defaultValue:i.weight??1,onBlur:g=>{const M=Number(g.target.value),N=Number.isFinite(M)?Math.max(1,Math.min(5,Math.round(M))):null;o([{type:"update_edge_meta",edgeId:i.id,patch:{weight:N}}])}},`ew-${i.id}-${i.version}`)]}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"线型"}),v.jsxs("select",{defaultValue:i.lineStyle??(i.kind==="relation"?"dashed":"solid"),onChange:g=>{const M=g.target.value;o([{type:"update_edge_meta",edgeId:i.id,patch:{lineStyle:M}}])},children:[v.jsx("option",{value:"solid",children:"实线"}),v.jsx("option",{value:"dashed",children:"虚线"}),v.jsx("option",{value:"dotted",children:"点线"})]},`es-${i.id}-${i.version}`)]}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"箭头"}),v.jsxs("select",{defaultValue:i.direction??(i.kind==="relation"?"forward":"none"),onChange:g=>{const M=g.target.value;o([{type:"update_edge_meta",edgeId:i.id,patch:{direction:M}}])},children:[v.jsx("option",{value:"forward",children:"单向 →"}),v.jsx("option",{value:"both",children:"双向 ↔"}),v.jsx("option",{value:"none",children:"无箭头"})]},`ed-${i.id}-${i.version}`)]}),v.jsxs("label",{className:"inspector__field",children:[v.jsx("span",{children:"标签(逗号分隔)"}),v.jsx("input",{value:r,onChange:g=>f(g.target.value),onBlur:()=>{const g=r.split(/[,,]/).map(M=>M.trim()).filter(Boolean);o([{type:"update_edge_meta",edgeId:i.id,patch:{tags:g}}])}})]}),v.jsxs("div",{className:"muted",style:{fontSize:11},children:[i.kind," · ",i.from.slice(0,8)," → ",i.to.slice(0,8)]})]})}const gh={bgBase:"#101014",bgLayer1:"#1b1e28",labelPrimary:"#f4f5f7",labelSecondary:"#a5adb8",brand:"#5e6ad2",border:"rgba(255,255,255,0.08)",bubble:"rgba(37,42,58,0.9)",warn:"#f59e5b",error:"#ef4444"},bh=[{key:"bgBase",css:"--dsw-alias-bg-base"},{key:"bgLayer1",css:"--dsw-alias-bg-layer-1"},{key:"labelPrimary",css:"--dsw-alias-label-primary"},{key:"labelSecondary",css:"--dsw-alias-label-secondary"},{key:"brand",css:"--dsw-alias-brand-primary"},{key:"border",css:"--dsw-alias-border-l1"},{key:"bubble",css:"--dsw-specific-bubble"},{key:"warn",css:"--dsw-alias-state-warn-primary"},{key:"error",css:"--dsw-alias-state-error-primary"}];function py(i){try{return getComputedStyle(document.documentElement).getPropertyValue(i).trim()}catch{return""}}function Sy(i=window.location.search){const o=new URLSearchParams(i),r=document.documentElement;for(const{key:p,css:g}of bh){const M=o.get(`t_${p}`);M&&r.style.setProperty(g,decodeURIComponent(M))}const f=o.get("colorScheme");(f==="light"||f==="dark")&&(r.dataset.colorScheme=f)}function Ty(){const i={...gh};for(const{key:o,css:r}of bh){const f=py(r);f&&(i[o]=f)}return i}function zy(i,o=8){const r=i.startsWith("#")?i:gh.brand,f=/^#?([0-9a-f]{6})$/i.exec(r.trim()),p=f?parseInt(f[1],16):6187730,g=p>>16&255,M=p>>8&255,N=p&255,C=Math.max(g,M,N)/255,S=Math.min(g,M,N)/255,w=(C+S)/2;let O=0,Q=0;if(C!==S){const I=C-S;Q=w>.5?I/(2-C-S):I/(C+S);const lt=g/255,Nt=M/255,yt=N/255;switch(C){case lt:O=((Nt-yt)/I+(Nt{const M=(g+i/30)%12,N=r-f*Math.max(Math.min(M-3,9-M,1),-1);return Math.round(255*N).toString(16).padStart(2,"0")};return`#${p(0)}${p(8)}${p(4)}`}function es(i,o){const r=new Map;for(const M of o){if(M.deletedAt||M.kind!=="hierarchy"||!M.isPrimaryParent)continue;const N=r.get(M.from)??[];N.push(M.to),r.set(M.from,N)}const f=[i],p=new Set([i]),g=[i];for(;g.length;){const M=g.shift();for(const N of r.get(M)??[])p.has(N)||(p.add(N),f.push(N),g.push(N))}return f}function rh(i,o,r){return es(o,r).includes(i)}function Ey(i,o,r){if(o)return r&&r.ids.includes(i)?{x:o.x+r.dx,y:o.y+r.dy}:o}function Ay({node:i,x:o,y:r}){var M;const f=(i.tags??[]).slice(0,4),p=(i.note??"").trim(),g=((M=i.links)==null?void 0:M.length)??0;return v.jsxs("div",{className:"hover-card",style:{left:o,top:r},children:[v.jsx("div",{className:"hover-card__title",children:i.text}),p?v.jsx("div",{className:"hover-card__note",children:p.slice(0,120)}):null,f.length?v.jsx("div",{className:"hover-card__tags",children:f.map(N=>v.jsx("span",{className:"hover-card__tag",children:N},N))}):null,v.jsxs("div",{className:"hover-card__meta",children:[g?`${g} 链接`:null,i.dueAt!=null?`${g?" · ":""}截止 ${new Date(i.dueAt).toLocaleDateString()}`:null,i.stylePreset!=="default"?`${g||i.dueAt?" · ":""}${i.stylePreset}`:null]})]})}const My={unnamed:"未命名",newNode:"新节点",leftChild:"左侧子主题",rightChild:"右侧子主题",sibling:"兄弟节点",relationLabel:"关联",toolbarAria:"画布工具",controlsAria:"视图控制",backRosterTitle:"返回画布列表",backRoster:"返回",toolSelect:"选择",toolPan:"平移",toolLink:"连线",dragNode:"单点",dragBranch:"整枝",dragNodeTitle:"单点拖拽:只移动当前节点 (N);按住 Shift 也可临时单点",dragBranchTitle:"整枝拖拽:节点与子孙一起移动 (B)",bubble:"气泡",card:"卡片",bubbleTitle:"气泡视图:精简标题",cardTitle:"卡片视图:展开属性面板",unpin:"解钉",unpinTitle:"取消钉住:让选中节点重新参与自动布局",undo:"撤销",fullscreen:"全屏",exitFullscreen:"退出全屏",zoomIn:"放大",zoomInTitle:"放大 (+)",zoomOut:"缩小",zoomOutTitle:"缩小 (-)",fit:"适应画布",fitTitle:"适应画布 (F)",lock:"锁定",unlock:"解锁",lockTitle:"锁定画布 (L)",unlockTitle:"解锁画布 (L)",addLeftChildTitle:"添加左侧子主题",addRightChildTitle:"添加右侧子主题",hintLocked:"已锁定 · 仅浏览/缩放/平移",hintNodeDrag:"单点拖 · 只移动当前节点 · Shift 临时单点 · Esc 取消",hintBranchDrag:"整枝拖 · 空白钉住 · 落到节点换父 · N 单点 · Esc 取消"},Ny={unnamed:"Untitled",newNode:"New node",leftChild:"Left child",rightChild:"Right child",sibling:"Sibling",relationLabel:"Link",toolbarAria:"Canvas tools",controlsAria:"View controls",backRosterTitle:"Back to canvas list",backRoster:"Back",toolSelect:"Select",toolPan:"Pan",toolLink:"Link",dragNode:"Node",dragBranch:"Branch",dragNodeTitle:"Move node only (N); hold Shift for temporary node-drag",dragBranchTitle:"Move node with descendants (B)",bubble:"Bubble",card:"Card",bubbleTitle:"Bubble view: title only",cardTitle:"Card view: property sheet",unpin:"Unpin",unpinTitle:"Unpin selected node for auto layout",undo:"Undo",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",zoomIn:"Zoom in",zoomInTitle:"Zoom in (+)",zoomOut:"Zoom out",zoomOutTitle:"Zoom out (-)",fit:"Fit",fitTitle:"Fit view (F)",lock:"Lock",unlock:"Unlock",lockTitle:"Lock canvas (L)",unlockTitle:"Unlock canvas (L)",addLeftChildTitle:"Add left child",addRightChildTitle:"Add right child",hintLocked:"Locked · browse / zoom / pan only",hintNodeDrag:"Node drag · Shift temp node · Esc cancel",hintBranchDrag:"Branch drag · pin on blank · drop to reparent · N node · Esc cancel"},Oy={zh:My,en:Ny};function Au(i){const o=String(i??"").trim().toLowerCase();return o.startsWith("zh")?"zh":o?"en":typeof navigator<"u"&&String(navigator.language||"").toLowerCase().startsWith("zh")?"zh":"en"}function Dy(i){const o=Au(i);return Oy[o]}const xy="dsh-mind-map:locale";function ph(){try{const i=new URLSearchParams(window.location.search),o=i.get("lang")||i.get("locale");return o?Au(o):null}catch{return null}}function Sh(){var i;try{const o=(i=document.documentElement)==null?void 0:i.lang;return o?Au(o):null}catch{return null}}function jy(){return ph()||Sh()||Au(navigator.language)}function Cy(){const[i,o]=$.useState(jy);$.useEffect(()=>{const f=N=>{const C=Au(N);o(S=>S===C?S:C)},p=N=>{const C=N==null?void 0:N.data;!C||typeof C!="object"||C.type===xy&&f(C.lang??C.locale)};window.addEventListener("message",p);const g=new MutationObserver(()=>{const N=Sh();N&&f(N)});g.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]});const M=ph();return M&&f(M),()=>{window.removeEventListener("message",p),g.disconnect()}},[]);const r=$.useMemo(()=>Dy(i),[i]);return{locale:i,U:r}}const Uy=200,Za=168,Ka=118;function dh(){var Mu;const{U:i}=Cy(),o=$.useRef(null),r=$.useRef(null),f=$.useRef(null),p=_t(b=>b.nodes),g=_t(b=>b.edges),M=_t(b=>b.positions),N=_t(b=>b.selectedIds),C=_t(b=>b.highlightIds),S=_t(b=>b.highlightEdgeIds),w=_t(b=>b.highlightStyle),O=_t(b=>b.canvas),Q=_t(b=>b.applyOps),k=_t(b=>b.setPrefs),I=_t(b=>b.patchLocal),lt=_t(b=>b.setSelection),Nt=_t(b=>b.undo),yt=_t(b=>b.lastChangeSetId),el=typeof window<"u"&&(()=>{try{const b=new URLSearchParams(window.location.search);return b.get("embed")==="1"||b.get("embed")==="true"}catch{return!1}})(),Qt=$.useCallback(()=>{var b;try{(b=window.parent)==null||b.postMessage({type:"dsh-mind-map:back"},"*")}catch{}},[]),nt=$.useCallback(async()=>{var y;const b=f.current;if(b)try{if(document.fullscreenElement){await document.exitFullscreen();return}await b.requestFullscreen()}catch{try{(y=window.parent)==null||y.postMessage({type:"dsh-mind-map:fullscreen"},"*")}catch{}}},[]);$.useEffect(()=>{const b=()=>x(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",b),()=>document.removeEventListener("fullscreenchange",b)},[]);const[H,vt]=$.useState({x:0,y:0,zoom:1}),P=_t(b=>b.fitViewport),Ut=_t(b=>b.consumeFitViewport);$.useEffect(()=>{if(!P)return;const b=Ut();b&&vt(b)},[P,Ut]);const[Ot,Ol]=$.useState("select"),[$t,Kt]=$.useState("node"),[ut,Dl]=$.useState(!1),[ol,x]=$.useState(!1),[G,at]=$.useState(0),[jt,Ct]=$.useState(0),[h,U]=$.useState(null),[X,Z]=$.useState(null),[it,ft]=$.useState(null),[ot,cl]=$.useState(null),[Wt,oe]=$.useState(null),[$e,Ee]=$.useState(!1),[Ul,Ae]=$.useState({w:1,h:1}),[Nn,Me]=$.useState(null),W=$.useRef({mode:"none",lastX:0,lastY:0,space:!1,nodeId:null,startX:0,startY:0,moved:!1,alt:!1,forcePin:!1,startWorldX:0,startWorldY:0,subtreeIds:[]}),On=$.useRef(null);On.current=ot;const We=$.useRef(!1),gt=$.useMemo(()=>Ty(),[G]),Ma=$.useMemo(()=>zy(gt.brand,8),[gt.brand]);$.useEffect(()=>{var Y;const b=()=>at(q=>q+1),y=window.matchMedia("(prefers-color-scheme: light)");return(Y=y.addEventListener)==null||Y.call(y,"change",b),()=>{var q;return(q=y.removeEventListener)==null?void 0:q.call(y,"change",b)}},[]);const Vl=(O==null?void 0:O.prefs.density)==="compact",al=(O==null?void 0:O.prefs.nodeViewMode)!=="bubble",nl=$.useCallback(b=>P0(b,Vl,{asCard:al}),[Vl,al]),Dn=Vl?160:Uy,xn=(O==null?void 0:O.prefs.branchColoring)!==!1,re=$.useMemo(()=>{const b=new Map;if(!xn)return b;const y=p.filter(V=>V.deletedAt?!1:!g.some(L=>L.kind==="hierarchy"&&L.isPrimaryParent&&L.to===V.id));let Y=0;for(const V of y)b.set(V.id,Ma[Y%Ma.length]),Y++;const q=(V,L)=>{for(const K of g)K.kind==="hierarchy"&&K.isPrimaryParent&&K.from===V&&(b.set(K.to,L),q(K.to,L))};for(const[V,L]of b)q(V,L);return b},[p,g,Ma,xn]),be=$.useCallback((b,y)=>{const q=f.current.getBoundingClientRect();return{x:(b-q.left-q.width/2-H.x)/H.zoom,y:(y-q.top-q.height/2-H.y)/H.zoom}},[H]),Bl=$.useCallback(b=>Ey(b,M[b],ot),[M,ot]),Fe=$.useCallback((b,y,Y)=>{for(let q=p.length-1;q>=0;q--){const V=p[q];if(V.deletedAt||Y!=null&&Y.has(V.id))continue;const L=Bl(V.id);if(!L)continue;const{w:K,h:dt}=nl(V);if(b>=L.x-K/2&&b<=L.x+K/2&&y>=L.y-dt/2&&y<=L.y+dt/2)return V.id}return null},[p,Bl,Vl]),Ie=$.useMemo(()=>{let b=0,y=0,Y=0,q=0,V=!1;for(const K of p){if(K.deletedAt)continue;const dt=M[K.id];dt&&(V?(b=Math.min(b,dt.x),y=Math.max(y,dt.x),Y=Math.min(Y,dt.y),q=Math.max(q,dt.y)):(b=dt.x,y=dt.x,Y=dt.y,q=dt.y,V=!0))}if(!V)return{minX:-200,maxX:200,minY:-120,maxY:120};const L=80;return{minX:b-L,maxX:y+L,minY:Y-L,maxY:q+L}},[p,M]),Na=$.useCallback(b=>{vt(y=>({...y,zoom:Math.min(4,Math.max(.02,b))}))},[]),Ne=$.useCallback(()=>{const{minX:b,maxX:y,minY:Y,maxY:q}=Ie,V=Math.max(40,y-b),L=Math.max(40,q-Y),K=Ul.w||1,dt=Ul.h||1,Xt=Math.min(2.5,Math.max(.12,Math.min(K*.86/V,dt*.86/L))),Rt=(b+y)/2,ll=(Y+q)/2;vt({x:-Rt*Xt,y:-ll*Xt,zoom:Xt})},[Ie,Ul]),xl=$.useCallback((b,y)=>{const Y=r.current;if(!Y)return;const q=Y.getBoundingClientRect(),{minX:V,maxX:L,minY:K,maxY:dt}=Ie,Xt=Math.max(1,L-V),Rt=Math.max(1,dt-K),ll=V+(b-q.left)/q.width*Xt,B=K+(y-q.top)/q.height*Rt;vt(Dt=>({...Dt,x:-ll*Dt.zoom,y:-B*Dt.zoom}))},[Ie]),Zl=$.useCallback(()=>{const b=o.current;if(!b)return;const y=b.getContext("2d");if(!y)return;const Y=window.devicePixelRatio||1;y.setTransform(Y,0,0,Y,0,0);const q=b.clientWidth,V=b.clientHeight;y.clearRect(0,0,q,V),y.fillStyle=gt.bgBase,y.fillRect(0,0,q,V),y.save(),y.translate(q/2+H.x,V/2+H.y),y.scale(H.zoom,H.zoom),y.strokeStyle=gt.border,y.lineWidth=1/H.zoom;const L=48,K=Math.floor((-q/2-H.x)/H.zoom/L)*L-L*2,dt=Math.ceil((q/2-H.x)/H.zoom/L)*L+L*2,Xt=Math.floor((-V/2-H.y)/H.zoom/L)*L-L*2,Rt=Math.ceil((V/2-H.y)/H.zoom/L)*L+L*2;y.globalAlpha=.35,y.beginPath();for(let B=K;B<=dt;B+=L)y.moveTo(B,Xt),y.lineTo(B,Rt);for(let B=Xt;B<=Rt;B+=L)y.moveTo(K,B),y.lineTo(dt,B);y.stroke(),y.globalAlpha=1;for(const B of g){if((O==null?void 0:O.prefs.showRelationEdges)===!1&&B.kind==="relation")continue;const Dt=Bl(B.from),Vt=Bl(B.to);if(!Dt||!Vt)continue;const bt=p.find(Lt=>Lt.id===B.from),Ft=p.find(Lt=>Lt.id===B.to),Zt=bt?nl(bt).w:Dn,Sl=Ft?nl(Ft).w:Dn;y.beginPath();const Tl=Dt.x+(Vt.x>=Dt.x?Zt/2:-Zt/2),It=Dt.y,Et=Vt.x+(Vt.x>=Dt.x?-Sl/2:Sl/2),zt=Vt.y,Pt=(Tl+Et)/2;y.moveTo(Tl,It),y.bezierCurveTo(Pt,It,Pt,zt,Et,zt);const jl=Math.max(1,Math.min(5,B.weight??1)),Oe=B.lineStyle??(B.kind==="relation"?"dashed":"solid");Oe==="dotted"?y.setLineDash([2/H.zoom,4/H.zoom]):Oe==="dashed"?y.setLineDash([6/H.zoom,4/H.zoom]):y.setLineDash([]);const de=S.includes(B.id),Pe=(w==null?void 0:w.edgeColor)??gt.brand,De=(w==null?void 0:w.edgeWidth)??3.6;y.strokeStyle=de?Pe:B.kind==="relation"?gt.labelSecondary:re.get(B.to)??gt.brand,y.lineWidth=(de?De:1.2+(jl-1)*.7)/H.zoom,y.stroke(),y.setLineDash([]);const rl=B.direction??(B.kind==="relation"?"forward":"none");if(rl==="forward"||rl==="both"){const Lt=Math.atan2(0,Et-Pt||(Et>=Dt.x?1:-1)),gl=8/H.zoom,he=de?Pe:B.kind==="relation"?gt.labelSecondary:re.get(B.to)??gt.brand;y.beginPath(),y.fillStyle=he,y.moveTo(Et,zt),y.lineTo(Et-gl*Math.cos(Lt-.45),zt-gl*Math.sin(Lt-.45)),y.lineTo(Et-gl*Math.cos(Lt+.45),zt-gl*Math.sin(Lt+.45)),y.closePath(),y.fill()}if(rl==="both"){const Lt=Math.atan2(0,Tl-Pt||(Dt.x>=Vt.x?1:-1)),gl=8/H.zoom,he=de?Pe:B.kind==="relation"?gt.labelSecondary:re.get(B.to)??gt.brand;y.beginPath(),y.fillStyle=he,y.moveTo(Tl,It),y.lineTo(Tl-gl*Math.cos(Lt-.45),It-gl*Math.sin(Lt-.45)),y.lineTo(Tl-gl*Math.cos(Lt+.45),It-gl*Math.sin(Lt+.45)),y.closePath(),y.fill()}B.label&&H.zoom>=.25&&(y.fillStyle=gt.labelSecondary,y.font="11px sans-serif",y.fillText(B.label,Pt,(It+zt)/2-6))}if(it){const B=Bl(it.fromId);B&&(y.beginPath(),y.setLineDash([4/H.zoom,4/H.zoom]),y.strokeStyle=gt.brand,y.moveTo(B.x,B.y),y.lineTo(it.x,it.y),y.stroke(),y.setLineDash([]))}const ll=(O==null?void 0:O.prefs.nodeBadges)??"icons";for(const B of p){if(B.deletedAt)continue;const Dt=Bl(B.id);if(!Dt)continue;const Vt=!!(ot!=null&&ot.ids.includes(B.id)),{w:bt,h:Ft}=nl(B),Zt=Dt.x-bt/2,Sl=Dt.y-Ft/2,Tl=B.accentColor??re.get(B.id)??gt.bubble,It=N.includes(B.id),Et=C.includes(B.id),zt=(w==null?void 0:w.nodeColor)??gt.brand,Pt=X===B.id,jl=Wt===B.id,Oe=$e&&jl;Vt&&(y.globalAlpha=.7),Et&&(w==null?void 0:w.nodeGlow)!==!1?(y.shadowColor=zt,y.shadowBlur=14/H.zoom):J0(y,H.zoom,{selected:It}),y.fillStyle=gt.bgLayer1;const de=al?"card":B.stylePreset,Pe=al?14:B.stylePreset==="title"?Ft/2:12;if(ih(y,de,Zt,Sl,bt,Ft,Pe),y.fill(),$0(y,Tl,al?.1:B.stylePreset==="title"?.22:.14),!al&&B.stylePreset!=="decision"&&B.stylePreset!=="title"&&B.stylePreset!=="note"&&W0(y,Zt,Sl,Ft,Tl,12),!al&&B.stylePreset==="note"?y.setLineDash([4/H.zoom,3/H.zoom]):y.setLineDash([]),y.strokeStyle=Oe?gt.warn:jl?gt.brand:!al&&B.stylePreset==="risk"?gt.warn:Et?zt:It||Pt?gt.brand:Tl,y.lineWidth=(jl||Et||It||al||B.stylePreset==="title"||B.stylePreset==="decision"?2.4:1.35)/H.zoom,!al&&B.stylePreset==="muted"&&(y.globalAlpha=Vt?.4:.55),k0(y),y.stroke(),y.setLineDash([]),y.globalAlpha=Vt?.7:1,al)if(!N.includes(B.id))ey(y,B,Zt,Sl,gt,H.zoom,Vl,Tl,()=>Ct(rl=>rl+1));else{y.fillStyle="rgba(0,0,0,0.2)",y.fillRect(Zt,Sl,bt,36),y.beginPath(),y.arc(Zt+14,Sl+18,4.5,0,Math.PI*2),y.fillStyle=Tl,y.fill(),y.fillStyle=gt.labelPrimary,y.font=Aa(13,600),y.textBaseline="middle";const rl=Eu(y,B.text||i.unnamed,bt-40,1);y.fillText(rl[0]??"?",Zt+26,Sl+18)}else{const rl=14+(B.stylePreset==="decision"||B.stylePreset==="title"||B.stylePreset==="note"?0:4);let Lt=Sl+12;if(B.imageUrl){const zl=Vl?64:78,me=bt-rl-12,Yl=yh(B.imageUrl,()=>Ct(je=>je+1));if(y.save(),y.beginPath(),ih(y,"default",Zt+rl,Lt,me,zl,8),y.clip(),Yl&&Yl.naturalWidth>0){const je=Math.min(me/Yl.naturalWidth,zl/Yl.naturalHeight),te=Yl.naturalWidth*je,Rl=Yl.naturalHeight*je;y.fillStyle="rgba(0,0,0,0.22)",y.fillRect(Zt+rl,Lt,me,zl),y.drawImage(Yl,Zt+rl+(me-te)/2,Lt+(zl-Rl)/2,te,Rl)}else y.fillStyle=gt.border,y.fillRect(Zt+rl,Lt,me,zl);y.restore(),Lt+=zl+8}y.fillStyle=B.stylePreset==="muted"?gt.labelSecondary:gt.labelPrimary;const gl=Vl?12:B.stylePreset==="title"?15:13,he=B.stylePreset==="title"||B.stylePreset==="decision"?600:500;y.font=Aa(gl,he),y.textBaseline="top";const ta=bt-rl-12,dl=(Vl||B.stylePreset==="title",2),jn=Eu(y,B.text||i.unnamed,ta,dl),Cn=gl+3,xe=jn.length*Cn,pe=ll!=="off"&&H.zoom>=.35?ll==="tags"?(B.tags??[]).slice(0,2).map(zl=>`#${zl}`):ty(B).slice(0,4):[],Li=pe.length?20:0;let Un=Lt;if(!B.imageUrl){const zl=Ft-16-Li;Un=Sl+Math.max(10,(zl-xe)/2)}if(jn.forEach((zl,me)=>{y.fillText(zl,Zt+rl,Un+me*Cn)}),pe.length){let zl=Zt+rl;const me=Sl+Ft-22;for(const Yl of pe)zl+=F0(y,Yl,zl,me,gt,H.zoom)}}y.globalAlpha=1}y.restore()},[gt,H,g,Bl,p,re,N,C,S,w,X,it,ot,Wt,$e,Dn,Vl,al,nl,O==null?void 0:O.prefs.showRelationEdges,O==null?void 0:O.prefs.nodeBadges,jt,i]),pl=$.useCallback(()=>{const b=r.current;if(!b)return;const y=b.getContext("2d");if(!y)return;const Y=window.devicePixelRatio||1;b.width=Math.floor(Za*Y),b.height=Math.floor(Ka*Y),b.style.width=`${Za}px`,b.style.height=`${Ka}px`,y.setTransform(Y,0,0,Y,0,0),y.clearRect(0,0,Za,Ka),y.fillStyle=gt.bgLayer1,y.fillRect(0,0,Za,Ka);const{minX:q,maxX:V,minY:L,maxY:K}=Ie,dt=Math.max(1,V-q),Xt=Math.max(1,K-L),Rt=Za/dt,ll=Ka/Xt,B=Math.min(Rt,ll),Dt=(Za-dt*B)/2,Vt=(Ka-Xt*B)/2,bt=(zt,Pt)=>({x:Dt+(zt-q)*B,y:Vt+(Pt-L)*B});y.strokeStyle=gt.border,y.lineWidth=1;for(const zt of g){if(zt.kind!=="hierarchy")continue;const Pt=Bl(zt.from),jl=Bl(zt.to);if(!Pt||!jl)continue;const Oe=bt(Pt.x,Pt.y),de=bt(jl.x,jl.y);y.beginPath(),y.moveTo(Oe.x,Oe.y),y.lineTo(de.x,de.y),y.stroke()}for(const zt of p){if(zt.deletedAt)continue;const Pt=Bl(zt.id);if(!Pt)continue;const jl=bt(Pt.x,Pt.y);y.fillStyle=re.get(zt.id)??gt.brand,y.beginPath(),y.arc(jl.x,jl.y,2.2,0,Math.PI*2),y.fill()}const Ft=Ul.w/H.zoom,Zt=Ul.h/H.zoom,Sl=-H.x/H.zoom,Tl=-H.y/H.zoom,It=bt(Sl-Ft/2,Tl-Zt/2),Et=bt(Sl+Ft/2,Tl+Zt/2);y.strokeStyle=gt.brand,y.lineWidth=1.5,y.strokeRect(It.x,It.y,Math.max(4,Et.x-It.x),Math.max(4,Et.y-It.y))},[gt,Ie,g,Bl,p,re,Ul,H]);$.useEffect(()=>{const b=o.current,y=f.current;if(!b||!y)return;const Y=()=>{const V=y.getBoundingClientRect(),L=window.devicePixelRatio||1;b.width=Math.floor(V.width*L),b.height=Math.floor(V.height*L),b.style.width=`${V.width}px`,b.style.height=`${V.height}px`,Ae({w:V.width,h:V.height}),Zl(),pl()};Y();const q=new ResizeObserver(Y);return q.observe(y),()=>q.disconnect()},[Zl,pl]),$.useEffect(()=>{Zl(),pl()},[Zl,pl]),$.useEffect(()=>{const b=Y=>{var V,L;const q=(V=Y.target)==null?void 0:V.tagName;if(!(q==="INPUT"||q==="TEXTAREA")){if(!Y.metaKey&&!Y.ctrlKey&&!Y.altKey){const K=Y.key.toLowerCase();K==="v"&&Ol("select"),K==="h"&&Ol("pan"),K==="c"&&Ol("link"),K==="b"&&Kt("branch"),K==="n"&&Kt("node"),K==="l"&&Dl(dt=>!dt),K==="f"&&Ne(),(K==="="||K==="+")&&Na(H.zoom*1.15),(K==="-"||K==="_")&&Na(H.zoom/1.15)}if(Y.code==="Space"&&(W.current.space=!0),Y.key==="Alt"&&(W.current.alt=!0),Y.key==="Escape"&&W.current.mode==="node"){Y.preventDefault(),W.current.mode="none",W.current.nodeId=null,W.current.moved=!1,cl(null),oe(null),Ee(!1),Me(null);return}if(!ut){if(Y.key==="Tab"&&!ut){Y.preventDefault();const K=N[0];Q([K?{type:"create_node",text:i.newNode,parentId:K}:{type:"create_node",text:i.newNode}])}if(Y.key==="ArrowLeft"&&N[0]&&!h&&(Y.preventDefault(),Q([{type:"create_node",text:i.leftChild,parentId:N[0],sidePref:-1}])),Y.key==="ArrowRight"&&N[0]&&!h&&(Y.preventDefault(),Q([{type:"create_node",text:i.rightChild,parentId:N[0],sidePref:1}])),(Y.key==="Delete"||Y.key==="Backspace")&&!h){const K=N[0];K&&Q([{type:"delete_node",nodeId:K}])}if(Y.key==="Enter"&&N[0]&&!h){Y.preventDefault();const K=((L=g.find(dt=>dt.kind==="hierarchy"&&dt.isPrimaryParent&&dt.to===N[0]))==null?void 0:L.from)??null;Q([K?{type:"create_node",text:i.sibling,parentId:K}:{type:"create_node",text:i.newNode}])}}}},y=Y=>{Y.code==="Space"&&(W.current.space=!1),Y.key==="Alt"&&(W.current.alt=!1)};return window.addEventListener("keydown",b),window.addEventListener("keyup",y),()=>{window.removeEventListener("keydown",b),window.removeEventListener("keyup",y)}},[Q,O,N,h,g,ut,Ne,Na,H.zoom,i]);const Xi=Nn??(Ot==="pan"||W.current.space?"grab":Ot==="link"?"crosshair":"default");return v.jsxs("div",{className:`canvas-host${ut?" is-locked":""}`,ref:f,style:{cursor:Xi},onWheel:b=>{b.preventDefault();const y=b.deltaY>0?.9:1.1;vt(Y=>({...Y,zoom:Math.min(4,Math.max(.02,Y.zoom*y))}))},onPointerDown:b=>{var L;const y=b.target;if((L=y==null?void 0:y.closest)!=null&&L.call(y,".canvas-toolbar, .canvas-controls, .canvas-minimap, .edit-overlay, .node-handles, .hover-card, .inspector"))return;const Y=be(b.clientX,b.clientY),q=Fe(Y.x,Y.y);if(W.current.lastX=b.clientX,W.current.lastY=b.clientY,W.current.startX=b.clientX,W.current.startY=b.clientY,W.current.moved=!1,W.current.alt=b.altKey,W.current.forcePin=b.ctrlKey||b.metaKey,W.current.startWorldX=Y.x,W.current.startWorldY=Y.y,W.current.subtreeIds=[],b.currentTarget.setPointerCapture(b.pointerId),Ot==="pan"||W.current.space||b.button===1||b.button===2||!q&&Ot!=="link"){W.current.mode="pan",W.current.nodeId=null,q||lt([]),Me("grabbing");return}if(ut){lt(q?[q]:[]),W.current.mode="none";return}if(q&&(Ot==="link"||b.altKey)){W.current.mode="link",W.current.nodeId=q,lt([q]),ft({fromId:q,x:Y.x,y:Y.y});return}if(q&&Ot==="select"){W.current.mode="node",W.current.nodeId=q;const K=b.shiftKey||$t==="node";W.current.subtreeIds=K?[q]:es(q,g),lt([q]);return}W.current.mode="pan",Me("grabbing")},onPointerMove:b=>{let y=be(b.clientX,b.clientY);const Y=b.clientX-W.current.startX,q=b.clientY-W.current.startY;if(Math.hypot(Y,q)>4&&(W.current.moved=!0),W.current.mode==="pan"){const V=b.clientX-W.current.lastX,L=b.clientY-W.current.lastY;W.current.lastX=b.clientX,W.current.lastY=b.clientY,vt(K=>({...K,x:K.x+V,y:K.y+L}));return}if(W.current.mode==="link"&&W.current.nodeId){ft({fromId:W.current.nodeId,x:y.x,y:y.y});return}if(W.current.mode==="node"&&W.current.nodeId&&W.current.moved){const V=W.current.nodeId,L=f.current;if(L){const B=L.getBoundingClientRect(),Dt=48;let Vt=0,bt=0;b.clientXB.right-Dt&&(Vt=-12),b.clientYB.bottom-Dt&&(bt=-12),(Vt||bt)&&(vt(Ft=>({...Ft,x:Ft.x+Vt,y:Ft.y+bt})),W.current.startWorldX+=Vt/H.zoom,W.current.startWorldY+=bt/H.zoom,y=be(b.clientX,b.clientY))}const K=y.x-W.current.startWorldX,dt=y.y-W.current.startWorldY,Xt=W.current.subtreeIds.length>0?W.current.subtreeIds:es(V,g);if(cl({rootId:V,dx:K,dy:dt,ids:Xt}),Me("grabbing"),W.current.forcePin=b.ctrlKey||b.metaKey,W.current.forcePin){oe(null),Ee(!1),Z(null);return}const Rt=new Set(Xt),ll=Fe(y.x,y.y,Rt);if(Z(ll),ll&&ll!==V){const B=rh(ll,V,g);oe(ll),Ee(B)}else oe(null),Ee(!1)}},onPointerUp:b=>{var dt;const y=be(b.clientX,b.clientY),Y=W.current.mode,q=W.current.nodeId,V=W.current.moved,L=On.current,K=W.current.forcePin||b.ctrlKey||b.metaKey;if(!ut&&Y==="link"&&q){const Xt=Fe(y.x,y.y);Xt&&Xt!==q&&Q([{type:"link",from:q,to:Xt,kind:"relation",label:i.relationLabel}]),ft(null)}else if(!ut&&Y==="node"&&q&&V&&L){const Xt=new Set(L.ids),Rt=K||$e?null:Fe(y.x,y.y,Xt);if(Rt&&Rt!==q&&!rh(Rt,q,g)&&Rt){const B=(((dt=M[Rt])==null?void 0:dt.x)??0)<=0?-1:1,Dt={...M};for(const Vt of L.ids){const bt=M[Vt];bt&&(Dt[Vt]={x:bt.x+L.dx,y:bt.y+L.dy})}I({positions:Dt}),cl(null),Q([{type:"move_node",nodeId:q,newParentId:Rt,sidePref:B}])}else{const B={...M},Dt=[],Vt=p.map(bt=>{if(!Xt.has(bt.id))return bt;const Ft=M[bt.id];if(!Ft)return bt;const Zt={x:Ft.x+L.dx,y:Ft.y+L.dy};return B[bt.id]=Zt,Dt.push({type:"set_pinned",nodeId:bt.id,pinned:!0,pos:Zt}),{...bt,pinned:!0,pos:Zt}});I({positions:B,nodes:Vt}),cl(null),Q(Dt,"drag pin")}}else Y==="node"&&q&&!V&<([q]);W.current.mode="none",W.current.nodeId=null,W.current.forcePin=!1,W.current.subtreeIds=[],ft(null),cl(null),oe(null),Ee(!1),Me(null)},onContextMenu:b=>b.preventDefault(),onDoubleClick:b=>{if(ut)return;const y=be(b.clientX,b.clientY),Y=Fe(y.x,y.y);if(Y){const q=p.find(K=>K.id===Y),V=f.current.getBoundingClientRect(),L=Bl(Y);U({id:Y,text:q.text,x:V.width/2+H.x+L.x*H.zoom-70,y:V.height/2+H.y+L.y*H.zoom-16})}else Ot==="select"&&Q([{type:"create_node",text:i.newNode,...N[0]?{parentId:N[0]}:{},sidePref:y.x<0?-1:1}])},children:[v.jsx("canvas",{ref:o}),v.jsxs("div",{className:"canvas-toolbar",role:"toolbar","aria-label":i.toolbarAria,onPointerDown:b=>b.stopPropagation(),children:[el?v.jsxs(v.Fragment,{children:[v.jsx("div",{className:"canvas-toolbar__group",children:v.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.backRosterTitle,onClick:Qt,children:i.backRoster})}),v.jsx("div",{className:"canvas-toolbar__sep"})]}):null,v.jsx("div",{className:"canvas-toolbar__group",children:[["select",i.toolSelect,"V"],["pan",i.toolPan,"H"],["link",i.toolLink,"C"]].map(([b,y,Y])=>v.jsx("button",{type:"button",className:`canvas-tool-btn${Ot===b?" is-active":""}`,title:`${y} (${Y})`,"aria-pressed":Ot===b,onClick:()=>Ol(b),children:y},b))}),v.jsx("div",{className:"canvas-toolbar__sep"}),v.jsxs("div",{className:"canvas-toolbar__group",children:[v.jsx("button",{type:"button",className:`canvas-tool-btn${$t==="node"?" is-active":""}`,title:i.dragNodeTitle,"aria-pressed":$t==="node",onClick:()=>Kt("node"),children:i.dragNode}),v.jsx("button",{type:"button",className:`canvas-tool-btn${$t==="branch"?" is-active":""}`,title:i.dragBranchTitle,"aria-pressed":$t==="branch",onClick:()=>Kt("branch"),children:i.dragBranch})]}),v.jsx("div",{className:"canvas-toolbar__sep"}),v.jsxs("div",{className:"canvas-toolbar__group",children:[v.jsx("button",{type:"button",className:`canvas-tool-btn${al?"":" is-active"}`,title:i.bubbleTitle,"aria-pressed":!al,disabled:ut,onClick:()=>{al&&k({nodeViewMode:"bubble"})},children:i.bubble}),v.jsx("button",{type:"button",className:`canvas-tool-btn${al?" is-active":""}`,title:i.cardTitle,"aria-pressed":al,disabled:ut,onClick:()=>{al||k({nodeViewMode:"card"})},children:i.card}),v.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.unpinTitle,disabled:ut||!N[0]||!((Mu=p.find(b=>b.id===N[0]))!=null&&Mu.pinned),onClick:()=>{N[0]&&Q([{type:"set_pinned",nodeId:N[0],pinned:!1}])},children:i.unpin})]}),v.jsx("div",{className:"canvas-toolbar__sep"}),v.jsx("div",{className:"canvas-toolbar__group",children:v.jsx("button",{type:"button",className:"canvas-tool-btn",title:i.undo,disabled:!yt,onClick:()=>void Nt(),children:i.undo})}),v.jsxs("span",{className:"canvas-toolbar__zoom",children:[Math.round(H.zoom*100),"%"]})]}),v.jsxs("div",{className:"canvas-controls",role:"toolbar","aria-label":i.controlsAria,onPointerDown:b=>b.stopPropagation(),children:[v.jsx("button",{type:"button",className:"canvas-controls__btn",title:ol?i.exitFullscreen:i.fullscreen,"aria-label":ol?i.exitFullscreen:i.fullscreen,onClick:()=>void nt(),children:v.jsx(Ry,{exit:ol})}),v.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.zoomInTitle,"aria-label":i.zoomIn,onClick:()=>Na(H.zoom*1.2),children:v.jsx(Hy,{})}),v.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.zoomOutTitle,"aria-label":i.zoomOut,onClick:()=>Na(H.zoom/1.2),children:v.jsx(By,{})}),v.jsx("button",{type:"button",className:"canvas-controls__btn",title:i.fitTitle,"aria-label":i.fit,onClick:Ne,children:v.jsx(Yy,{})}),v.jsx("button",{type:"button",className:`canvas-controls__btn${ut?" is-active":""}`,title:ut?i.unlockTitle:i.lockTitle,"aria-label":ut?i.unlock:i.lock,"aria-pressed":ut,onClick:()=>Dl(b=>!b),children:v.jsx(wy,{locked:ut})})]}),v.jsx("div",{className:"canvas-minimap",onPointerDown:b=>{b.stopPropagation(),We.current=!0,b.currentTarget.setPointerCapture(b.pointerId),xl(b.clientX,b.clientY)},onPointerMove:b=>{We.current&&xl(b.clientX,b.clientY)},onPointerUp:()=>{We.current=!1},onPointerCancel:()=>{We.current=!1},children:v.jsx("canvas",{ref:r,width:Za,height:Ka})}),h&&v.jsx("input",{className:"edit-overlay",style:{left:h.x,top:h.y},autoFocus:!0,value:h.text,onChange:b=>U({...h,text:b.target.value}),onBlur:()=>{Q([{type:"update_text",nodeId:h.id,text:h.text}]),U(null)},onKeyDown:b=>{b.key==="Enter"&&b.target.blur(),b.key==="Escape"&&U(null)}}),!ut&&N[0]&&!ot&&M[N[0]]&&(()=>{const b=N[0],y=p.find(Rt=>Rt.id===b);if(!y||y.deletedAt)return null;const Y=M[b],{w:q}=nl(y),V=Ul.w/2+H.x+Y.x*H.zoom,L=Ul.h/2+H.y+Y.y*H.zoom,K=q/2*H.zoom,dt=Vl?100:140,Xt=Rt=>{const ll=Rt<0?i.leftChild:i.rightChild,B=Vl?160:200;Q([{type:"create_node",text:ll,parentId:b,sidePref:Rt,pos:{x:Y.x+Rt*(q/2+B/2+dt),y:Y.y}}])};return v.jsxs("div",{className:"node-handles",onPointerDown:Rt=>Rt.stopPropagation(),children:[v.jsx("button",{type:"button",className:"node-handle node-handle--left",style:{left:V-K-14,top:L-10},title:i.addLeftChildTitle,onClick:()=>Xt(-1),children:"+"}),v.jsx("button",{type:"button",className:"node-handle node-handle--right",style:{left:V+K-2,top:L-10},title:i.addRightChildTitle,onClick:()=>Xt(1),children:"+"})]})})(),(O==null?void 0:O.prefs.showHoverCard)!==!1&&X&&!ot&&!al&&(()=>{const b=p.find(L=>L.id===X);if(!b)return null;const y=b?M[b.id]:null;if(!y)return null;const{h:Y}=nl(b),q=Ul.w/2+H.x+y.x*H.zoom+12,V=Ul.h/2+H.y+y.y*H.zoom+Y/2*H.zoom+8;return v.jsx(Ay,{node:b,x:q,y:V})})(),!ut&&!ot&&al&&N[0]&&H.zoom>=.35&&(()=>{const b=N[0],y=p.find(K=>K.id===b);if(!y||y.deletedAt)return null;const Y=M[b];if(!Y)return null;const{w:q}=nl(y),V=Ul.w/2+H.x+Y.x*H.zoom,L=Ul.h/2+H.y+Y.y*H.zoom;return v.jsx(oy,{node:y,applyOps:Q,screenX:V,screenY:L,zoom:H.zoom,width:q,accent:re.get(b),showStylePreset:!1})})(),v.jsx("div",{className:"canvas-hint muted",children:ut?i.hintLocked:$t==="node"?i.hintNodeDrag:i.hintBranchDrag})]})}function Ry({exit:i}){return i?v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M7 14H5v5h5v-2H7v-3zm12 0h-2v3h-3v2h5v-5zM7 5h3V3H5v5h2V5zm10 0v3h2V3h-5v2h3z"})}):v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M7 14H5v5h5v-2H7v-3zm0-9h3V3H5v5h2V5zm12 9h-2v3h-3v2h5v-5zm-2-9V3h-3v2h3v3h2V5h-2z"})})}function Hy(){return v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})}function By(){return v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M19 13H5v-2h14v2z"})})}function Yy(){return v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M3 5v4h2V7h2V5H3zm0 10v4h4v-2H5v-2H3zm14-10v2h2v2h2V5h-4zm4 10h-2v2h-2v2h4v-4zM7 9h10v6H7V9z"})})}function wy({locked:i}){return i?v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm6-7h-1V7a5 5 0 0 0-10 0v3H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2zM9 7a3 3 0 0 1 6 0v3H9V7z"})}):v.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true",children:v.jsx("path",{fill:"currentColor",d:"M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm6-7h-1V7a5 5 0 0 0-9.9-1h2.1A3 3 0 0 1 15 7v3H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2z"})})}function qy(){try{return new URLSearchParams(window.location.search)}catch{return new URLSearchParams}}function Xy(){const i=$.useMemo(()=>qy(),[]),o=i.get("embed")==="1"||i.get("embed")==="true",r=i.get("canvasId")||"",{canvases:f,canvasId:p,canvas:g,nodes:M,selectedIds:N,leftCollapsed:C,loadCanvases:S,createCanvas:w,openCanvas:O,undo:Q,setCollapsedPanels:k,setPrefs:I,applyOps:lt,trash:Nt,restoreFromTrash:yt}=_t();$.useEffect(()=>{Sy()},[]),$.useEffect(()=>{(async()=>{if(await S(),r){await O(r);return}_t.getState().canvasId||await w("未命名画布")})()},[S,w,O,r]),$.useEffect(()=>{const nt=`${location.protocol==="https:"?"wss":"ws"}://${location.host}/ws`;let H=null,vt=!1,P,Ut,Ot=800;const Ol=(Kt,ut)=>{window.clearTimeout(Ut),Ut=window.setTimeout(async()=>{if(_t.getState().canvasId===Kt)try{const Dl=await fetch(`/api/canvases/${Kt}`).then(ol=>ol.json());_t.getState().applyCanvasPayload(Dl,{preserveUnpinned:ut})}catch{_t.getState().openCanvas(Kt)}},120)},$t=()=>{if(!vt){try{H=new WebSocket(nt)}catch{P=window.setTimeout($t,Ot),Ot=Math.min(8e3,Ot*1.6);return}H.onopen=()=>{Ot=800},H.onmessage=Kt=>{try{const ut=JSON.parse(String(Kt.data));if(ut.type==="canvas/event"&&ut.canvasId&&ut.canvasId===_t.getState().canvasId&&(ut.fitViewport&&_t.getState().requestFitViewport(ut.fitViewport),Ol(ut.canvasId,ut.preserveUnpinned===!0)),ut.type==="canvas/highlight"&&ut.canvasId&&ut.canvasId===_t.getState().canvasId){const Dl=Array.isArray(ut.nodeIds)?ut.nodeIds:[],ol=Array.isArray(ut.edgeIds)?ut.edgeIds:[];_t.getState().flashHighlight({nodeIds:Dl,edgeIds:ol,style:ut.style&&typeof ut.style=="object"?ut.style:null,ttlMs:typeof ut.ttlMs=="number"?ut.ttlMs:ol.length?5e3:2200})}}catch{}},H.onclose=()=>{vt||(P=window.setTimeout($t,Ot),Ot=Math.min(8e3,Ot*1.6))},H.onerror=()=>{try{H==null||H.close()}catch{}}}};return $t(),()=>{vt=!0,window.clearTimeout(P),window.clearTimeout(Ut);try{H==null||H.close()}catch{}}},[]),$.useEffect(()=>{const nt=p;if(!nt)return;const H=window.setTimeout(()=>{fetch(`/api/canvases/${nt}/activity`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({selectionIds:N,focusNodeId:(g==null?void 0:g.focusNodeId)??null,viewport:(g==null?void 0:g.viewport)??{x:0,y:0,zoom:1}})})},200);return()=>window.clearTimeout(H)},[p,N,g==null?void 0:g.focusNodeId,g==null?void 0:g.viewport]);const el=g==null?void 0:g.focusNodeId,Qt=M.filter(nt=>!nt.deletedAt);return o?v.jsx("div",{className:"app-shell embed",children:v.jsx("div",{className:"main embed-main",children:v.jsx(dh,{})})}):v.jsxs("div",{className:"app-shell",children:[v.jsxs("header",{className:"topbar",children:[v.jsx("div",{className:"brand",children:"Mind Map"}),v.jsx("button",{type:"button",onClick:()=>k("left",!C),children:C?"目录":"收目录"}),v.jsx("button",{type:"button",onClick:()=>void w(),children:"新建"}),v.jsx("button",{type:"button",onClick:()=>void Q(),disabled:!_t.getState().lastChangeSetId,children:"撤销"}),v.jsxs("button",{type:"button",onClick:()=>void I({density:(g==null?void 0:g.prefs.density)==="compact"?"comfortable":"compact"}),children:["密度: ",(g==null?void 0:g.prefs.density)??"comfortable"]}),v.jsxs("button",{type:"button",onClick:()=>void I({branchColoring:!((g==null?void 0:g.prefs.branchColoring)??!0)}),children:["分色: ",(g==null?void 0:g.prefs.branchColoring)===!1?"关":"开"]}),v.jsxs("button",{type:"button",onClick:()=>void I({nodeViewMode:(g==null?void 0:g.prefs.nodeViewMode)!=="bubble"?"bubble":"card"}),children:["模式: ",(g==null?void 0:g.prefs.nodeViewMode)!=="bubble"?"卡片":"气泡"]}),v.jsx("button",{type:"button",onClick:()=>{const nt=p;nt&&fetch(`/api/canvases/${nt}/export.json`).then(H=>H.json()).then(H=>{const vt=new Blob([JSON.stringify(H,null,2)],{type:"application/json"}),P=document.createElement("a");P.href=URL.createObjectURL(vt),P.download=`${(g==null?void 0:g.title)??"mindmap"}.json`,P.click()})},children:"导出JSON"}),v.jsx("button",{type:"button",onClick:()=>{const nt=document.querySelector(".canvas-host canvas");nt&&nt.toBlob(H=>{if(!H)return;const vt=document.createElement("a");vt.href=URL.createObjectURL(H),vt.download=`${(g==null?void 0:g.title)??"mindmap"}.png`,vt.click()})},children:"导出PNG"}),v.jsx("div",{className:"spacer"})]}),v.jsxs("div",{className:`main ${C?"left-collapsed":""}`,children:[v.jsxs("aside",{className:"panel",style:{display:C?"none":void 0},children:[v.jsx("div",{className:"panel-header",children:"目录"}),v.jsxs("div",{className:"panel-body",children:[v.jsx("div",{className:"muted",style:{marginBottom:8},children:"画布"}),f.map(nt=>v.jsx("div",{className:`canvas-list-item ${nt.id===p?"active":""}`,onClick:()=>void O(nt.id),children:nt.title},nt.id)),v.jsx("div",{className:"muted",style:{margin:"12px 0 8px"},children:"大纲"}),Qt.map(nt=>v.jsxs("div",{className:`outline-item ${N.includes(nt.id)?"active":""}`,onClick:()=>{_t.getState().setSelection([nt.id]),lt([{type:"set_focus",nodeId:nt.id}])},children:[nt.id===el?"◎ ":"• ",nt.text]},nt.id)),v.jsx("div",{className:"muted",style:{margin:"12px 0 8px"},children:"属性"}),v.jsx(vy,{}),v.jsxs("div",{className:"muted",style:{margin:"12px 0 8px"},children:["回收站 (",Nt.length,")"]}),Nt.length===0&&v.jsx("div",{className:"muted",children:"空"}),Nt.map(nt=>v.jsxs("div",{className:"trash-item",children:[v.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis"},children:nt.text}),v.jsx("button",{type:"button",onClick:()=>void yt(nt.id),children:"恢复"})]},nt.id))]})]}),v.jsx(dh,{})]})]})}w0.createRoot(document.getElementById("root")).render(v.jsx(Xy,{})); diff --git a/packages/dsh-plugin/bundle/web/index.html b/packages/dsh-plugin/bundle/web/index.html index 7083022..5bed4c9 100644 --- a/packages/dsh-plugin/bundle/web/index.html +++ b/packages/dsh-plugin/bundle/web/index.html @@ -4,8 +4,8 @@ Mind Map - - + +
diff --git a/packages/dsh-plugin/bundle/web/topo/ne-router.png b/packages/dsh-plugin/bundle/web/topo/ne-router.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5ed53441d8a8de21ad75da823e7f69effede35 GIT binary patch literal 7302 zcmV;19C_o3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGr5&!@f5&>tQ(oz5b92-eQK~#8N?Ol0v z6;+zgKXcBgJtM6>-97Db9JjVx1*gT8Rb&asDj;DC0RmYFA!H#5+4qG&2q6i9gakrZ zW#42y;xb~ZT#>ySM{pid-dK6dEYs|(>AZ_)~$Pg z_uKAwD-k_GR%|}`$g(ZR7FTzksITcfampK1Z#kZaHmWv1IY4PPETJrg?N9a+lfLXZ9Dwsvdt&RLH2~S+Q->~s?BV6ejA&RQZMlE+-lZuX1N9rPA_G5 zjL&o7zNsZ{*Nlu`!NxAEbF~v&ypb(jww3WdlF#-8Xt%1)<9`Ti5erh<{zPNx`a_>r zcOEAP(+G=dwy|kh%`B2n9wt$qWIgVlT*U65R$>`_9?d7)QPFowv3MrPGGl2AOIg01 zRc*4~|Ei9o7r7aH3(l}I3}Gp2J5*e<{?Mmfy^@2b2Uh=-j3z+<{VE4A>HTMvv0<@Q z?9qiQ1tz7`vFOZ3zhPqXN;W>JRy^aOm`aj7znNUfBI9b=oPu_i-+X|47d<#Ret@sk zBO{!g)jK1L)*bkya^q2QaAXv$Jt(vQr2+a*(Gp;KMguvCfdu+7CSir>6Ud_W_1>rw zHhMuFi!a|qzNa4WpGsN}ABQPbhVAl{?55o@MJ)%BFLM6gru8#FYz{=}RB=7{4B=>TE1n)R}{&L~CQsbfmepYeI!FRenInq~cpIp>( zz>o}xEc8SGU=l7jA{gPZlvQlV>`L}ulL~~>Iw`dQlTVHp0CI3``?4~`-AA(4?*EV6 zhCQDdg_Gqxl#5!jMmU8s5gtic9uj^*umIPATTe`q8atO$ngY9*B`zB$6Xoz(2~U! zkB`V-yYC08u#4s#0IgsoIH16Ba_@?n?*mA(mc7<(%z;WC!Y--XzEPQ?z{nle>^kp*QPo66dsaO;e$9bhWpO;a!A zEzZ98F_Y!1^WU&H-u=K9PQUs#+kN~6LligcB%d9MKsY;aRyj*3qqC&ht9N~_OqsKi zT(-w{RK#={B~oR!?V?d0?A;K(ztinb_H8sX&WGbBlk zP_zDkcot0ZP_8k?FIpuugnnM~*X;X#ZhDP#39qEG4R26{zy=k_fb5)8j^ukEo)ZJ@ zq&)fJn`}f}6&n@5j7>~gN%q4NQY$;yx8HrQwCJ4Z$%{?8;qz)(N!ww!`N?bAbI}oE zP=tU}Gh+U7K?sDI{@#sL5hyM3;G8mc)qn(nq4O%qzIcMFC7cwHcgWldLEZ@qFPUg) z=i&2~akH^UGf#lui9rzps%mKLGC>Fwra0+LzV^TGDZ^n+o__f)+bC$><08br4qCtm z*#7%q^#(#q$mD%+W{F!rBIi3yjQEoEPwR6KG9ggY;AE(Yfwn7~4nOA_G;eVG#HD0k zJYivJJF95kE09ySLlCXJ?Vua>KmDqPkbnB3GzOcx{B<}n8aF=7#X!Y zzE!5yJBi6%n_a96c>+lY;H5KvP=>>vfEYg=wus#@I-OlRWT9r#JppQ2?!(-iX3hV% zg1e{YlWohmeR8horyY^C#BCF@$Y-k%#AwtK1M`o^%+ermq$gZv@qJ#22=*15f^s2z~8FCH-fWu)C(@2~z5D&&(pW ze(%%ln+xA5J+&sk2l?)&^G{I+Io>%@wE1C5>T<;7Y ziF%$Hu#huXX}939@MChCnw67Bm2LP|E64FEW1y>L_SZ((=WcMTx~3`zxyGJ$!;R=2he|z+UOl*QOSV! z!NgPY^@VR;?+j33s1?k~StoK!^4wTMG&W5S!ofra}RCnOD&ASNR6u;W^bpOE{ISq+n#zWi0{dBa5sRTMgB(EQffk zFW*Pu84FJAJMVwOb{+ezFcH{j^Og+21g`Ont zU%SsEG0@(4Y2SbXq6YX6zKAC>Ac{b!Y9w;9%G*q<9&>Wn3bP^4b#mpV?-VLrl9Z~= znj`&XZBGba0#(*j!%hH$V-&;7b`^t3-7mw6Uob3jxyJ+${047`VMYdIS_kpTR-b_c z86{{#zRyas$|`c3w3$x$lJF@NIz&WFU(y(r)394}(VT)dVLEVdg=*9ZU}YjtfW*;` zBhRzi&ZDmV0a;7P14;o&ra%A1JWR!Y1KR90ILQ(*tVA~uJ7fUNBCU8HRjK#hG-iqB zK3|bo(yp0rYbM+qmvHHlku0m0&!9V~Gl{}y-Fo{Oqx1EgP$mCjA zn^x3vGM}KoeENlQx4W2;0eJ-@BEyGL3vJGveV;w^%G<7mAUoCGZsi*R4yWFPBow#( zL!ks6b)YyDCzq%OodzZyD}&rOm{#C+y`799A{co3@}yaf`{#0varoKai8dgZxRyOn zu_5u*n)XzHz-ZfQ2x+tste8u0P}ri~6G^SvdMOH7RJlpxPZTsC5T*lV^`knQy3L_*BS02_~THmZF)Kq;KM-99?8M*JHb zW%viGz^v)-3l%IV+n||u_?6Ka4XqK_KGjDaIO2zT396xB0c5aJyo>w;l3WxS?Amxc zfMzhtv8?CO6m?Iq5nrU;IYpj|M<7QchQ(LZ>q&v{H=#_QYA9HcS05!H19BO1=&Ayl zK&W9mHr^`C$RJDMn%(66!NlCWb((nx#w0F(C*s~2#oH)S;4A^vP_Te-lky?V$N==7 zoa>j=upU;)06~<35E#Uy+6or*ngY3sA#=(|~?E1{Q9hx7bGMmMhR;Y%82~5Q2 z|LEHA@6GJW7y1Mie2RfFrRO64ZP>zWy`zb5PX=-m z%np{;ZWWnMGcx!y9jw9*8IUcN3xQ-HQRW0$y#W<{JTSfJqlhc|$1T?Xi0@K{nol7E zzQNB&q-X{ki7k~3m_T3aDOK1Z1Cm;(_mDG@Dnf}2Dv+#_=e?kLKkG9&=Z}IE)A$AQ zkEqTGQD{&18OW!0a;4w9tvXvO5oQR zUjP6qw(JnrUzpD|p*-Kf(D_xDNYQKX0yq1zpmK}fzb^q`aExR=4?ES3FQkj9`^`%5 zJ;|;UFIn>ZF_N>kzazn8|r$ep^rFA*B@rLKf3f1DezL`7p-*LN*$l< z|GG@0!SPg3qE8=tE6qEf)U-ap^pFUzYjWs6(VC1m+ zvr5|zk}I@dzJW3rnOM`+7nv03RIJX<6t^B`(=(0FH`s;IF+jbRKr~^83|O^L=UBN& z7FjvPo!797?4t^-;7^pg2{ZZqJ0F;?cB2wQIH|Hv;%k+*9l%t`^NftPYu8sM1#r)_ zLRQwUy&-jl@1Oet%<3;?EipEw&K4P{Y9|!CV$eNFPW|I#UsWL2@xFyJyyv(RYve2% zEd;qr8*n1wMj?qW9(jHNq$FH@(USrW=X_o26TlWL^#D8Yq$Mzs7$_@ZmLvk;^vx=0 z@kk8(p2}@0)n64T!?SY82*l9eYqk*NDs6w)UmAh(CEzmP`L6NPlLCMTsxQ-m_CSNw zgRB6n$f!6KANKGU84$Igwn2R^O8q?v5>Hc>nA>ukCBb!`%ti5ilafFCrH+>VqY)N7Mt&U^Y0O z#H@M>&}#-GY&oR;S`4BFeeo_FZBN7~|LCjrVMZR9 zS*+=cfDtJGZ1L)yPNYTW<=cy^QKx8EVC#*lrvR&Dka6s}-@EoGs5ViRg|E+0_sS@2 z++~Rv7rv#xQX@YftJLW*6lP!V4gk}$n>6q5f*C0Q*c-jd0a0czwVsx>n|(B^k?@8L zGA1rwDKvuIrZ<(>wHv(qgd<2Po4`PXq51+UU~$b>ceA0w6Dbgl#FuJ|I|0PGR)~SG z!rBppn6UHE5-=MoR&GAZIuHD}D1ybF2XYuPjKV<*D3`~(!It|{uep4~A*I*WMW3v4 zq9RNNMF?mOEH1Sldi-oy%Il`20N`I_5&nf0Vpy$1@I|l#NC1M$f+7U`ihePrn)%h^`jM%BjJPQ>Z8r6z4B>dLcK_=%AO@Tms#A#3 z10hLe8-z&#ye-W2#_zE!flO9Wgn&OdD7I452MRZiPX8$4f#}j0>PJ0{hygDa;f}sz zMlrfSML*Eq)-QOw>uN{jXve8!6*RYg{|W#hhVexskChR6PtN^7eA0;ek%AF1;EZCE zMeZO@j>884T6aIC@eu&{4px9~M;eJd(6E#8^R2?{Q%e34_)79PI+3hGRH%;@0Xu{M z`c5tQK$Q4jGlWhGQTX}r6qdR|d(2P;5?uPsCmcCLPuGv|cA!BDmAsn{JnJGYv=Bv7 zGZ=~d-ESuj3u7BXUquC!Z+L?Bn|&#rZUuKo<)0TN{(Yhf$P0{ss3f-7eUAhHTV-vSv#l@o*YR@KE z#e~#)lA!?d?9_gVeE!lZP=%!)wx!??rwwO8sdw}z{F$tRcF=EbsmNZvn}^)mYIiH> z&6R_z#D88%J9&{6^qpQTKIuz!4k3^?sqtU|c>{`+6p#|92x=>VQ9sI=1mN4v z$ZH|z$qL5sMeZu`kLBwAx<`x?8lC`iGMAeZefCoY5++oH5{7laR6zS0jd2k-7k3(b z^u#I>d9ZNH*d=cWQlN@=QdTp0p&i^8T|)l3A{F@fmfgLRo(`B`6jd9U3Lv(01G5t> zQ25oPT$aR1;YxF(h9bLRk8m`o8|*;T8s@Gu^fdseKb&Kv1|f_tASsB$Ic8+YYu?Z9 ze9SlPpdzMZ0~-V1QYFPthb|J~e#4POd)E;ryj#?sZh z49x^k&V99E3zn1P?hSr6VlgXOe~8^RC0Dy47Q-Ew^!i=oO}?Pd)B>)B=&(rz1^}i7 z1hKNwcDVsWz@pUGJm^u$weO7F7Qbk88Ig20p^dUMmECQU}C z)@yzX7GPpvXXkKc=QdmSLxPRWhCOU@b~C$cdQrekgBjo!z&$|UCZ-W{YeWiQ8n?~r zi#Zjh`T`8_9X!k(pWet~%eY$S4rq0!_HS>39bjT+ zlW4m?_rLJ0P|yILAQPgrjhl^eIbGf zimf286YxX|pzn+#O^5|2g}N?`(1c6~V3wzP3y|Wfeu+`!j}ivVDc2BV3J)1Cx7Bnx z0vnvFQwgA6LVrTe4Isro4~`o^{;0#~WbHSx5UySmggizV)&OT$oh!?P0Qx8FiHH~+ z(~JC(z?c;6*-|99Zkv=tUK>Vma1Hm7u%96lBDHqAH9~M)F(9s0{AD2OMe_K3OE}ng#48u44`msE* zu_ey~f`W(Rt)B{$a9$7s;wdaO0%H6{#Az}38uvsye+Z~2K@NXd|9Cc7aPtdg;B|Mn$SlDOv)`bPbr0Ajvo(M$i}9vCdWIjyu+td!4(4%D-}j` z$(8-$-=i+Hit9$Dv8>f}E#};^4pDJM-4}*6{P>}TY!nYO2>ZORnr6Zb9#OYyK8EJt!!L(0sbi7(8L-`3#F|6h&T=I z+ymA*V<`IXXFQFH!JE#7@eKBR?oP(XJC`2(Md3c6M=0<(tX^?@? z5!qgZh*NW0L?VxR2MRa?Gb&}3s7IyR_BXER7q>;3a%+M_2Gx*Lz=}X&u3dttfI~aC zbc0Cm!g0k{dv6@;3}NtRHYq{;V?9_JrSf znr_fpfFL*+g99?uKzak5V+CncjOBJ36KaO2rE4|!m_-G4P}F)*oNc)|c-h|bZiy;8 zVs{7C-@yI~Du`l=+iV>%3?)GGq0$>ks2~zS#YMOW%Jh0C*h=LM`8`ba79dGqZXU4G zQhlt@b_zJ%hRQTlKZRHk(nXKqr&S3xV(6ik^$$&2!KQGPk23u1CiA%8SBTZmNtwKS zn<)2(HbWn%{)GtqM+j9yofu|-%Ep9Y;xK{U04KcAMxY`CKg0ioP(=`XWI_#dcFg%M1| zpH`+QI080;m2~IA2q^dhb(QFcf+)2Z7u`A