@xiaobuyu/nodesign 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -79
- package/README.zh-CN.md +254 -67
- package/package.json +2 -2
- package/server/api/admin.js +7 -0
- package/server/api/assets/docx-page.js +5 -4
- package/server/api/assets/helpers.js +8 -0
- package/server/api/assets.js +21 -33
- package/server/api/board.js +29 -1
- package/server/api/browse.js +3 -2
- package/server/api/chatai.js +9 -8
- package/server/api/exports/cards.js +7 -6
- package/server/api/exports/docx-pdf.js +4 -1
- package/server/api/local.js +10 -8
- package/server/api/projects.js +19 -3
- package/server/api/publish.js +3 -2
- package/server/api/sessions-rewind.js +220 -0
- package/server/api/sessions.js +58 -194
- package/server/api/stage.js +35 -0
- package/server/api/turn-model-switch.js +109 -0
- package/server/api/turn.js +52 -88
- package/server/auth/middleware.js +29 -6
- package/server/auth/tier.js +27 -7
- package/server/auth/users-store.js +14 -1
- package/server/engine/agent/actor-trail.js +110 -0
- package/server/engine/agent/agent-shared.js +22 -52
- package/server/engine/agent/beat-state.js +61 -0
- package/server/engine/agent/cast.js +322 -0
- package/server/engine/agent/events.js +9 -2
- package/server/engine/agent/hooks/beat-gate.js +73 -0
- package/server/engine/agent/hooks/lifecycle.js +6 -2
- package/server/engine/agent/hooks/post-trim.js +1 -0
- package/server/engine/agent/hooks/pre-board-dirty.js +29 -0
- package/server/engine/agent/hooks/pre-defaults.js +206 -2
- package/server/engine/agent/hooks/pre-injectors.js +19 -2
- package/server/engine/agent/hooks/pre-peer-guard.js +88 -0
- package/server/engine/agent/hooks/pre-unknown-params.js +82 -0
- package/server/engine/agent/hooks/pre-workspace-scope-guard.js +33 -0
- package/server/engine/agent/hooks/resident-role-lifecycle.js +100 -0
- package/server/engine/agent/hooks/slot-alias.js +30 -0
- package/server/engine/agent/hooks/user-prompt-submit.js +197 -7
- package/server/engine/agent/hooks.js +76 -6
- package/server/engine/agent/isolation.js +25 -2
- package/server/engine/agent/memory-config.js +27 -1
- package/server/engine/agent/model-context.js +102 -18
- package/server/engine/agent/model-table.js +361 -58
- package/server/engine/agent/prompts/nodesign-prelude.md +566 -59
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +1 -1
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +2 -2
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +1 -1
- package/server/engine/agent/prompts/tools/site-reference.md +2 -1
- package/server/engine/agent/role-card.js +175 -0
- package/server/engine/agent/rp-mode.js +17 -0
- package/server/engine/agent/session-loop.js +26 -14
- package/server/engine/agent/stage-status.js +73 -0
- package/server/engine/agent/subagent-flight.js +73 -0
- package/server/engine/agent/system-prompts.js +41 -0
- package/server/engine/agent/tool-input-stream.js +165 -0
- package/server/engine/mcp/actor.js +59 -0
- package/server/engine/mcp/capability-gate.js +21 -2
- package/server/engine/mcp/index.js +116 -24
- package/server/engine/mcp/mode-profile.js +139 -0
- package/server/engine/mcp/server-name.js +19 -0
- package/server/engine/mcp/tools/artifact-session.js +2 -1
- package/server/engine/mcp/tools/browse-find-batch.js +76 -14
- package/server/engine/mcp/tools/browse.js +1 -1
- package/server/engine/mcp/tools/cast-role.js +167 -0
- package/server/engine/mcp/tools/draw-trend.js +104 -0
- package/server/engine/mcp/tools/edit-board-schema.js +56 -0
- package/server/engine/mcp/tools/edit-board.js +569 -0
- package/server/engine/mcp/tools/look-at-board.js +4 -3
- package/server/engine/mcp/tools/open-sheet.js +242 -0
- package/server/engine/mcp/tools/organize-board.js +19 -5
- package/server/engine/mcp/tools/paint-still.js +1 -1
- package/server/engine/mcp/tools/pin-to-board.js +78 -3
- package/server/engine/mcp/tools/read-board.js +109 -16
- package/server/engine/mcp/tools/read-tavern-json.js +87 -19
- package/server/engine/mcp/tools/report-issue.js +1 -0
- package/server/engine/mcp/tools/role-memory.js +83 -0
- package/server/engine/mcp/tools/roll-dice.js +82 -0
- package/server/engine/mcp/tools/roll-film.js +1 -1
- package/server/engine/mcp/tools/screenshot.js +2 -2
- package/server/engine/mcp/tools/set-vars.js +150 -0
- package/server/engine/mcp/tools/sheet-replan.js +46 -0
- package/server/engine/mcp/tools/web-search.js +1 -1
- package/server/engine/mcp/tools/write-on-board-flow.js +108 -0
- package/server/engine/mcp/tools/write-on-board-place.js +211 -0
- package/server/engine/mcp/tools/write-on-board-role-anchor.js +48 -0
- package/server/engine/mcp/tools/write-on-board-schema.js +125 -0
- package/server/engine/mcp/tools/write-on-board.js +567 -107
- package/server/engine/plugins/nodesign/skills/blackboard-rp/SKILL.md +215 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +11 -3
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +34 -4
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +20 -4
- package/server/engine/plugins/nodesign/skills/story-craft/SKILL.md +94 -0
- package/server/engine/plugins/nodesign/skills/story-import/SKILL.md +112 -0
- package/server/engine/plugins/nodesign/skills/story-intimacy/SKILL.md +72 -0
- package/server/engine/plugins/nodesign/skills/story-voice/SKILL.md +66 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//345/206/267/347/241/254.md +33 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/203/205/346/204/237/347/233/264/347/273/231.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/204/217/350/257/206/346/265/201.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/255/246/344/276/240/347/231/275/350/257/235.md +34 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/224/237/346/264/273/346/265/201.md +35 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/231/275/346/217/217.md +37 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//350/210/236/345/217/260/345/211/247.md +32 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//351/230/266/346/256/265/345/210/207/346/215/242.md +42 -0
- package/server/engine/runs/board-seater.js +272 -0
- package/server/engine/runs/board-tasklist.js +90 -48
- package/server/engine/runs/turn-relay.js +24 -2
- package/server/engine/runs/user-chalk-echo.js +44 -0
- package/server/index.js +2 -0
- package/server/lib/board-anchor.js +49 -0
- package/server/lib/board-dirty.js +93 -0
- package/server/lib/board-excerpt.js +80 -0
- package/server/lib/board-follow.js +111 -0
- package/server/lib/board-groups.js +1 -5
- package/server/lib/board-hero.js +3 -1
- package/server/lib/board-kind-sizes.js +36 -0
- package/server/lib/board-lanes.js +58 -0
- package/server/lib/board-obstacles.js +80 -0
- package/server/lib/board-relations.js +5 -1
- package/server/lib/board-sheets.js +467 -0
- package/server/lib/board-shelf.js +86 -0
- package/server/lib/board-transform.js +62 -0
- package/server/lib/canvas-id.js +18 -1
- package/server/lib/chalk-flow.js +88 -0
- package/server/lib/chalk-rewrite.js +63 -0
- package/server/lib/chalk-size-pref.js +48 -0
- package/server/lib/chalk.js +42 -3
- package/server/lib/ingress/forward-openai-chat.js +16 -4
- package/server/lib/ingress/openai-chat.js +23 -12
- package/server/lib/ingress/session-routes.js +3 -3
- package/server/lib/ingress/stream-watchdog.js +53 -0
- package/server/lib/ingress/upstream-billing.js +15 -0
- package/server/lib/ingress/upstream-error-hints.js +36 -0
- package/server/lib/json-preview.js +58 -0
- package/server/lib/model-ingress.js +26 -1
- package/server/lib/moderation.js +10 -5
- package/server/lib/quota.js +26 -6
- package/server/lib/rect.js +50 -0
- package/server/lib/screen.js +36 -0
- package/server/lib/sheet-state.js +19 -0
- package/server/lib/sketch-array.js +118 -0
- package/server/lib/sketch-hatch.js +99 -0
- package/server/lib/sketch-layout.js +269 -69
- package/server/lib/sketch-shapes.js +152 -0
- package/server/lib/sketch-stencils.js +170 -0
- package/server/lib/state-table.js +237 -0
- package/server/lib/state-trend.js +94 -0
- package/server/lib/state-triggers.js +199 -0
- package/server/lib/tavern-json.js +48 -0
- package/server/lib/user-uploads.js +88 -0
- package/server/projects/board-limits.js +5 -3
- package/server/projects/board-sanitize.js +220 -10
- package/server/projects/board-store.js +95 -6
- package/server/projects/session-jsonl.js +110 -0
- package/server/projects/store.js +56 -3
- package/server/projects/viewpoint-store.js +35 -3
- package/server/projects/workspace-slots.js +30 -0
- package/server/projects/workspace-templates.js +29 -0
- package/server/projects/workspace.js +16 -17
- package/server/runtime/capabilities.js +6 -2
- package/server/shared/locales.js +70 -0
- package/server/shared/messages-en.js +69 -0
- package/server/shared/messages.js +65 -0
- package/server/ws/broker.js +3 -0
- package/server/ws/index.js +43 -3
- package/web/README.md +1 -1
- package/web/dist/assets/{BrowserWindow-BoOBaIyz.js → BrowserWindow-CcaGRWz5.js} +1 -1
- package/web/dist/assets/DeckWindow-BIr2KGFT.js +6 -0
- package/web/dist/assets/{DocxWindow-B_u6aX9o.js → DocxWindow-B9KZmU5z.js} +2 -2
- package/web/dist/assets/{MermaidBlock-BO-46Du5.js → MermaidBlock-DrfRnz8E.js} +43 -43
- package/web/dist/assets/{SiteWindow-ConPmzdM.js → SiteWindow-CJOjCF7d.js} +6 -6
- package/web/dist/assets/{abnfDiagram-VCTEODGH-FCO9yf-n.js → abnfDiagram-VCTEODGH-CUZbQGIg.js} +1 -1
- package/web/dist/assets/{arc-BLcEOSRX.js → arc-C1-HSUny.js} +1 -1
- package/web/dist/assets/{architectureDiagram-5GKGNRK7-kxiX4TeN.js → architectureDiagram-5GKGNRK7-B5nwvu60.js} +2 -2
- package/web/dist/assets/{blockDiagram-NRAW4CY4-CptFksix.js → blockDiagram-NRAW4CY4-uPPuFLwR.js} +1 -1
- package/web/dist/assets/{c4Diagram-UCG6FXSJ-Dxmxj34F.js → c4Diagram-UCG6FXSJ-C0mKBFlz.js} +1 -1
- package/web/dist/assets/channel-BxpWNOGU.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-D9inx5oo.js → chunk-2Q5K7J3B-Cs0rlZ4q.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-DydfHlEc.js → chunk-5VM5RSS4-DtR63oYb.js} +1 -1
- package/web/dist/assets/{chunk-F27PBJKO-BO7GxhSv.js → chunk-F27PBJKO-B3MRdezJ.js} +1 -1
- package/web/dist/assets/{chunk-G27WJ6UU-BzP6YiQ_.js → chunk-G27WJ6UU-BtwntwpS.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-CHcgcd0s.js → chunk-JWPE2WC7-BHsTe5PD.js} +1 -1
- package/web/dist/assets/{chunk-LCL6LL3I-D2Wg5JtX.js → chunk-LCL6LL3I-knY15Qdm.js} +1 -1
- package/web/dist/assets/{chunk-POPQ4Y6H-B2fCRfpM.js → chunk-POPQ4Y6H-C51tgK_I.js} +1 -1
- package/web/dist/assets/{chunk-SVP7TREG-JSLcsRlZ.js → chunk-SVP7TREG-CnwRZmF_.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-BCjvaeHm.js → chunk-XXDRQBXY-BtXzVF-_.js} +1 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-DUEKmDfo.js +1 -0
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-DUEKmDfo.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-0uKv6oJ7.js → cose-bilkent-JH36ORCC-CzWlGP6i.js} +1 -1
- package/web/dist/assets/{cynefin-OW5HDTMX-Bvt-gEmA.js → cynefin-OW5HDTMX-vK64EGSv.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-C9Ht02qC.js → cynefinDiagram-5FMLGOSQ-Bs3g1Gvh.js} +1 -1
- package/web/dist/assets/{dagre-3AP2YEHR-BfxZny4s.js → dagre-3AP2YEHR-BhgkYe8V.js} +1 -1
- package/web/dist/assets/{diagram-S7CK7UJ4-CrE0ZETE.js → diagram-S7CK7UJ4-C_6mvD2V.js} +1 -1
- package/web/dist/assets/{diagram-UQ7AKVKN-BO8VQ4Fx.js → diagram-UQ7AKVKN-qW7tssUW.js} +1 -1
- package/web/dist/assets/{diagram-VSXAHHWV-CHUZnR9F.js → diagram-VSXAHHWV-txJPHpvG.js} +1 -1
- package/web/dist/assets/{diagram-VX7I27RA-DYQAz1Vu.js → diagram-VX7I27RA-CQTMsCnL.js} +1 -1
- package/web/dist/assets/{diagram-Z3DM3KII-BDjivgLr.js → diagram-Z3DM3KII--cb1hoE6.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-PWID7BFC-Bpe_QVbH.js → ebnfDiagram-PWID7BFC-Da6lDU77.js} +1 -1
- package/web/dist/assets/{erDiagram-SSCWMZ5O-BxhwuAu1.js → erDiagram-SSCWMZ5O-DGCMrsQn.js} +1 -1
- package/web/dist/assets/{flowDiagram-A5DVABFB-CCw2H08-.js → flowDiagram-A5DVABFB-GdOL_qno.js} +1 -1
- package/web/dist/assets/{ganttDiagram-EL5Y4UJY-DtTc7MyI.js → ganttDiagram-EL5Y4UJY-Cx1F_jBK.js} +4 -4
- package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-BvORxMd2.js → gitGraphDiagram-WWUBYQGX-B5_6JhR3.js} +1 -1
- package/web/dist/assets/hand-CuvZZQGW.webp +0 -0
- package/web/dist/assets/index-BYKfMnmv.js +2759 -0
- package/web/dist/assets/index-CW7VsrVg.css +1 -0
- package/web/dist/assets/{infoDiagram-RXCK75RN-DMcrkypD.js → infoDiagram-RXCK75RN-CjvKpSPA.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-5VMMS53U-CZkTIbe-.js → ishikawaDiagram-5VMMS53U-CxLoAPhx.js} +1 -1
- package/web/dist/assets/{journeyDiagram-EYS64GPL-DR0XazdE.js → journeyDiagram-EYS64GPL-BfvS1upJ.js} +1 -1
- package/web/dist/assets/{kanban-definition-3QL26DDD-DN8VbwVu.js → kanban-definition-3QL26DDD-DKPPu0w4.js} +1 -1
- package/web/dist/assets/{layout-9_paCbyt.js → layout-Dhgck-Zo.js} +1 -1
- package/web/dist/assets/{linear-g6Ct012e.js → linear-DMSQ-aUw.js} +1 -1
- package/web/dist/assets/lxgw-nd-app-bold-D1pKA1bR.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-app-regular-BDe3d26v.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-bold-Bufvlg03.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-DQwoI4OP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-100-DLPe7tEt.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-101-d3VsZKWT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-102-ClzJuLq6.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-103-DuDnQ6K-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-104-kPGW3Eem.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-105-BzD54h-0.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-106-BQ7fIzlx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-107-D8tDfFHI.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-108-tGhkpwep.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-109-7SMVSrly.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-110-_uDKrFed.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-111-Bio825RE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-112-D2ee0i-C.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-113-JPFVDrga.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-114-BcfxYA4w.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-115-B1HeeOsd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-116-hY12tXpq.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-117-BvuZwmre.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-118-tzvs_H7j.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-119-J2DWuYDN.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-21-pDubCJV5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-22-ChAPMpqp.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-23-BBx3oNpT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-24-CYt-Oagk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-25-Cx3j-ZUv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-26-B9AfZ3LL.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-27-Bh2s9MNE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-28-C02JPoKP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-29-T_tbUGhk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-30-DMfyNzhz.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-31-DFfdzbkg.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-32-Bs1fz2iW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-33-cpB96OkZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-34-BhinPYWX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-35-D_njRQqA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-36-DqXlLE3t.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-37-j5LbvMph.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-38-oO4jWdKm.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-39-CabsX4rw.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-4-PatS3YHh.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-40-yrLg3C3e.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-41-DBXmCQhc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-42-Bqij_UiQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-43-D3kp0Ntc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-44-B_BNGvK4.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-45-CZc0cQWs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-46-CHQX5Kd9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-47-Ci8gLrHA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-48-run3ugD3.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-49-DgfiUb6u.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-5-B0CtGbX_.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-50-CdCG-POr.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-51-L2okeQZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-52-BZAqyGJW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-53-B0xWqLeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-54-BZVQX-EA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-55-093mkIUJ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-56-CbhWG8G-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-57-pLQuvo6c.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-58-BHhoY50x.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-59-D1_6DuIQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-6-BnAelmYU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-60-HDBIuLTZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-61-C-c13SeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-62-kHRVOhZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-63-C0MCsvFv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-64-DZekguCj.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-65-CtP6c3IU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-66-DLVWoMSf.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-67-BVuOnayH.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-68-DpxQ6Mnx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-69-qesBxLmC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-70-BBt1xN7h.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-71-BWqZacwB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-72-B1wP_Yst.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-73-C99T7jNZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-74-DrUTsWBe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-75-C4M5XXQe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-76-Bq8spVWF.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-77-D9vNupE2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-78-D6th7Gnu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-79-bezM85cS.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-80-DD8pnhG2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-81-N6jtSyBs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-82-D6c180bZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-83-em17AadM.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-84-CJ8gdrMK.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-85-9PPGO1eB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-86-CjWPf-u5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-87-8D_X_yOC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-88-9vtKFPBx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-89-BhE5jAKX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-90-D2Npfm5E.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-91-C6Ft1-Eu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-97-CaExyQP9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-98-CPoVbsUd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-99-ZUQZGVgH.woff2 +0 -0
- package/web/dist/assets/{mindmap-definition-FBJOCRG2-BGt4omYC.js → mindmap-definition-FBJOCRG2-CalfL_Kn.js} +1 -1
- package/web/dist/assets/{pegDiagram-XKGWAZYB-uSfS-PBE.js → pegDiagram-XKGWAZYB-D9mVWz7l.js} +1 -1
- package/web/dist/assets/pending-edit-apply-kwMFWsUe.js +31 -0
- package/web/dist/assets/{pieDiagram-E7YTZNPT-DpeI935H.js → pieDiagram-E7YTZNPT-DELzbZNS.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-AXDQQJYC-B7IuNvWa.js → quadrantDiagram-AXDQQJYC-TZqp4mfA.js} +1 -1
- package/web/dist/assets/{railroadDiagram-O6MQD6OU-ARzYpPQI.js → railroadDiagram-O6MQD6OU-DxX59f0i.js} +1 -1
- package/web/dist/assets/{requirementDiagram-EFPCY7ZU-Cj4upkAo.js → requirementDiagram-EFPCY7ZU-DFdsJLIe.js} +1 -1
- package/web/dist/assets/{rotate-cw-CXJcyHWk.js → rotate-cw-62liz7LX.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-P5KCCOFB-OaVwSnLP.js → sankeyDiagram-P5KCCOFB-ByYcd3fG.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-1yrUbq4t.js → sequenceDiagram-WJ2MYXX4-Bj-ml1jS.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-nYH5p9D6.js → sizeCapture-X5ZJPWSS-KhsXThyD.js} +1 -1
- package/web/dist/assets/{square-dashed-mouse-pointer-CTtTVKoH.js → square-dashed-mouse-pointer-D_VrqVpy.js} +1 -1
- package/web/dist/assets/{stateDiagram-HBIQ2CUA-Dj5HvyNq.js → stateDiagram-HBIQ2CUA-BJlpHfWU.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-CR2kYAH2.js +1 -0
- package/web/dist/assets/{swimlanes-XN3QIQJK-umeT0HpB.js → swimlanes-XN3QIQJK-DUB9OJVs.js} +1 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BitOxnG2.js +8 -0
- package/web/dist/assets/{timeline-definition-24CTP7MA-MqnQfHKB.js → timeline-definition-24CTP7MA-C03NX82A.js} +1 -1
- package/web/dist/assets/{vennDiagram-4TSXK5OY-b2liyZra.js → vennDiagram-4TSXK5OY-B9pjzngp.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-VM6X3IG4-QMK-zNh1.js → wardleyDiagram-VM6X3IG4-UqWq_mcT.js} +1 -1
- package/web/dist/assets/{xychartDiagram-S5SC5T6Z-D5Mc6tfA.js → xychartDiagram-S5SC5T6Z-D2pDKtOv.js} +1 -1
- package/web/dist/index.html +2 -2
- package/server/engine/mcp/tools/arrange-on-board.js +0 -126
- package/server/engine/mcp/tools/create-on-board.js +0 -152
- package/server/engine/mcp/tools/edit-sketch.js +0 -167
- package/server/engine/mcp/tools/relate-on-board.js +0 -150
- package/server/engine/mcp/tools/sketch-on-board.js +0 -345
- package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +0 -235
- package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +0 -78
- package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +0 -268
- package/web/dist/assets/DeckWindow-Bg3rgkvi.js +0 -11
- package/web/dist/assets/channel-DFyiuGL0.js +0 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-Aw1f8z-b.js +0 -1
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-Aw1f8z-b.js +0 -1
- package/web/dist/assets/index-C0KUf6Wd.css +0 -1
- package/web/dist/assets/index-DGG5wIZs.js +0 -2118
- package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
- package/web/dist/assets/pending-edit-apply-uP4uvrOD.js +0 -31
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-kJ1m_zJT.js +0 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-DPSkMbbl.js +0 -8
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<!-- 隐私声明:平台据它把标注里的文本剥成占位符再发给 agent。
|
|
7
|
-
演出.js 发现没有会自己补一条,但**自己写上更好**(不依赖脚本跑起来) -->
|
|
8
|
-
<meta name="nd-privacy" content="演出">
|
|
9
|
-
<title>演出</title>
|
|
10
|
-
<style>
|
|
11
|
-
/* ── 这一整块是"皮肤",按题材整个重画:字体、色纸、气泡形态都是戏的一部分 ── */
|
|
12
|
-
:root { --纸: #F4EFE4; --墨: #2B2117; --淡: #8A7A62; }
|
|
13
|
-
* { box-sizing: border-box; }
|
|
14
|
-
body { margin: 0; height: 100dvh; display: flex; flex-direction: column;
|
|
15
|
-
background: var(--纸); color: var(--墨);
|
|
16
|
-
font: 16px/1.85 "Songti SC", "Noto Serif CJK SC", serif; }
|
|
17
|
-
#台 { flex: 1; overflow-y: auto; padding: 24px 18px 8px; max-width: 720px; width: 100%; margin: 0 auto; }
|
|
18
|
-
.回合 { margin: 0 0 18px; white-space: pre-wrap; }
|
|
19
|
-
.回合.用户 { color: var(--淡); }
|
|
20
|
-
.回合.用户::before { content: "› "; }
|
|
21
|
-
.等::after { content: "…"; opacity: .5; }
|
|
22
|
-
.提示, .出错 { font-size: 13px; margin: 10px 0; }
|
|
23
|
-
.提示 { color: var(--淡); }
|
|
24
|
-
.出错 { color: #A8362B; }
|
|
25
|
-
form { display: flex; gap: 10px; padding: 12px 18px 18px; max-width: 720px; width: 100%; margin: 0 auto; }
|
|
26
|
-
textarea { flex: 1; resize: none; height: 44px; padding: 10px 12px; font: inherit; font-size: 15px;
|
|
27
|
-
background: #fff8; border: 1px solid #0002; border-radius: 2px; outline: none; color: inherit; }
|
|
28
|
-
button { padding: 0 18px; font: inherit; font-size: 14px; letter-spacing: .2em;
|
|
29
|
-
background: var(--墨); color: var(--纸); border: 0; border-radius: 2px; cursor: pointer; }
|
|
30
|
-
button:disabled { background: var(--淡); cursor: default; }
|
|
31
|
-
</style>
|
|
32
|
-
</head>
|
|
33
|
-
<body>
|
|
34
|
-
<div id="台"></div>
|
|
35
|
-
<form id="条" autocomplete="off">
|
|
36
|
-
<textarea id="输入" rows="1" placeholder="你做什么、说什么…"></textarea>
|
|
37
|
-
<button id="发送" type="submit">进</button>
|
|
38
|
-
</form>
|
|
39
|
-
|
|
40
|
-
<!-- ⚠️ classic script,**不要写 type="module"**:agent 自检截图走 file://,
|
|
41
|
-
ES module 在 file: 下会被当跨源拦掉,整页脚本一起死 -->
|
|
42
|
-
<script src="演出.js"></script>
|
|
43
|
-
<script>
|
|
44
|
-
const 台 = document.getElementById('台');
|
|
45
|
-
|
|
46
|
-
/** 皮肤只需要回答"一条消息长什么样",管线的事一件都不用管 */
|
|
47
|
-
function 条(cls, 文) {
|
|
48
|
-
const el = document.createElement('div');
|
|
49
|
-
el.className = cls;
|
|
50
|
-
el.textContent = 文;
|
|
51
|
-
台.appendChild(el);
|
|
52
|
-
return el;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const 场 = ND演出.挂载({
|
|
56
|
-
台,
|
|
57
|
-
输入: document.getElementById('输入'),
|
|
58
|
-
发送钮: document.getElementById('发送'),
|
|
59
|
-
画: {
|
|
60
|
-
用户: (文) => 条('回合 用户', 文),
|
|
61
|
-
演出: () => {
|
|
62
|
-
const el = 条('回合 演出 等', '');
|
|
63
|
-
return {
|
|
64
|
-
写: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
|
|
65
|
-
完成: (全文) => { el.classList.remove('等'); el.textContent = 全文; },
|
|
66
|
-
撤: () => el.remove(),
|
|
67
|
-
};
|
|
68
|
-
},
|
|
69
|
-
提示: (文) => 条('提示', 文),
|
|
70
|
-
出错: (文) => 条('出错', 文),
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// 表单提交也走同一个口(回车已由 演出.js 接管,含输入法判定)
|
|
75
|
-
document.getElementById('条').addEventListener('submit', (e) => { e.preventDefault(); 场.发送(); });
|
|
76
|
-
</script>
|
|
77
|
-
</body>
|
|
78
|
-
</html>
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 演出.js —— 演出页的管线(NoDesign RP,2026-08-15)
|
|
3
|
-
*
|
|
4
|
-
* ⭐ **起手文件**:加载 rp-craft skill 时平台自动把它拷进工作区根,
|
|
5
|
-
* agent 只需 `cp 演出.template.js <演出文件夹>/演出.js`。**一个字都别改** ——
|
|
6
|
-
* 这里面全是协议和踩过的坑,不是设计。
|
|
7
|
-
* (为什么不放 patterns/ 让 agent 自己读:真跑实测它会 `find /` 全盘搜,
|
|
8
|
-
* 搜出生产仓和开发 worktree 两份再自己猜哪份对 —— 今天字节相同侥幸没事,
|
|
9
|
-
* 哪天两边不同步就会静默抄错版本。起手文件由平台投递,没有猜的余地。)
|
|
10
|
-
* 页面负责长什么样(`画` 里那几个函数随便写),这个文件负责让它能玩:
|
|
11
|
-
*
|
|
12
|
-
* URL 自省 · 铺场 · SSE 跨分片解析 · 错误话术 · 中断 · 输入法回车 ·
|
|
13
|
-
* 滚动锚定 · 摘要折叠提示 · 隐私声明 · 探针模式
|
|
14
|
-
*
|
|
15
|
-
* ⚠️ **必须用 classic script 引**:`<script src="演出.js"></script>`,
|
|
16
|
-
* **不能写 type="module"**。
|
|
17
|
-
*
|
|
18
|
-
* 理由更新(2026-08-18):原来的理由是"agent 自检走 file://,module 在 file: 下
|
|
19
|
-
* 被当跨源拦掉"—— 感知层今天改走 http 了,这个理由**已经不成立**。规则本身仍然
|
|
20
|
-
* 保留,因为它保护的是另一个真场景:**用户把演出页导出成 zip、在本地双击打开**,
|
|
21
|
-
* 那才是 file://,module 在那里照样整页死。
|
|
22
|
-
* (规则对但理由死了的注释,比没有注释更危险 —— 下一个人会按死理由去推翻规则。)
|
|
23
|
-
*
|
|
24
|
-
* ## 怎么用
|
|
25
|
-
*
|
|
26
|
-
* const 场 = ND演出.挂载({
|
|
27
|
-
* 台: document.getElementById('台'), // 滚动容器
|
|
28
|
-
* 输入: document.getElementById('输入'), // 可选,给了就接管回车
|
|
29
|
-
* 发送钮: document.getElementById('发送'), // 可选,给了就接管点击与禁用态
|
|
30
|
-
* 画: {
|
|
31
|
-
* 用户: (文) => {…; return 节点}, // 画一条用户消息
|
|
32
|
-
* 演出: () => ({ 写(全文), 完成(全文), 撤() }), // 画一条演出气泡,返回把手
|
|
33
|
-
* 提示: (文) => {…}, // 灰字提示(摘要折叠、探针说明)
|
|
34
|
-
* 出错: (文) => {…}, // 错误条
|
|
35
|
-
* },
|
|
36
|
-
* });
|
|
37
|
-
* // 想自己接管发送按钮就调 场.发送(文本);想中断当前这轮调 场.中断()
|
|
38
|
-
*
|
|
39
|
-
* `画.演出()` 返回的把手:`写(全文)` 每来一片调一次(给的是**到目前为止的全文**,
|
|
40
|
-
* 不是增量,页面直接 textContent = 全文 最省事);`完成(全文)` 收尾调一次;
|
|
41
|
-
* `撤()` 出错时把这条气泡拿掉。
|
|
42
|
-
*/
|
|
43
|
-
(function (global) {
|
|
44
|
-
'use strict';
|
|
45
|
-
|
|
46
|
-
/** 端点上限,跟服务端 MAX_INPUT_CHARS 对齐 */
|
|
47
|
-
var 输入上限 = 8000;
|
|
48
|
-
|
|
49
|
-
/** 样例台账:探针模式下渲这个,真台账一个字都不取 */
|
|
50
|
-
var 样例 = [
|
|
51
|
-
{ role: 'assistant', text: '〔样例〕雾夜里,摊子上的豆油灯亮着。' },
|
|
52
|
-
{ role: 'user', text: '〔样例〕我走近摊子。' },
|
|
53
|
-
];
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 从页面 URL 认出项目和演出文件夹。
|
|
57
|
-
* 线上是 `/api/projects/<pid>/artifact-file/<dir>/index.html`;
|
|
58
|
-
* file:// 打开时认不出来(导出的 zip 在本地双击就是这种)—— 那是探针模式,
|
|
59
|
-
* 不是坏了。
|
|
60
|
-
*/
|
|
61
|
-
function 自省() {
|
|
62
|
-
var m = location.pathname.match(/^\/api\/projects\/([^/]+)\/artifact-file\/(.+)$/);
|
|
63
|
-
if (!m) return { pid: null, dir: null };
|
|
64
|
-
// ⚠️ pathname 是**已经百分号编码**的:中文文件夹名在这儿长成 %E6%A8%A1…,
|
|
65
|
-
// 不解码就会在 encodeURIComponent 时二次编码,服务端收到 %25E6… 直接 404。
|
|
66
|
-
// 逐段解码('/' 是分隔符,不能整串解)。这个产品的文件夹名默认就是中文,
|
|
67
|
-
// 所以这一步不是边角情况,是主路径。
|
|
68
|
-
var dir = m[2].split('/').slice(0, -1).map(decodeURIComponent).join('/');
|
|
69
|
-
return { pid: m[1], dir: dir };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* 隐私声明自检:页面上没有 `<meta name="nd-privacy">` 就现补一条。
|
|
74
|
-
*
|
|
75
|
-
* 这道防线不能指望"皮肤作者记得写"—— 平台据它把标注里的文本剥成占位符再发给
|
|
76
|
-
* agent。三张真页面里只有一张带着它(2026-08-15 查实),所以责任内建在管线里。
|
|
77
|
-
*/
|
|
78
|
-
function 保证隐私声明() {
|
|
79
|
-
if (document.querySelector('meta[name="nd-privacy"]')) return;
|
|
80
|
-
var meta = document.createElement('meta');
|
|
81
|
-
meta.setAttribute('name', 'nd-privacy');
|
|
82
|
-
meta.setAttribute('content', '演出');
|
|
83
|
-
(document.head || document.documentElement).appendChild(meta);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** 用户是不是本来就贴着底:只有贴着底才跟随滚动,不然会把正在往上翻的人拽回来 */
|
|
87
|
-
function 贴底(台) {
|
|
88
|
-
if (!台) return false;
|
|
89
|
-
return 台.scrollHeight - 台.scrollTop - 台.clientHeight < 40;
|
|
90
|
-
}
|
|
91
|
-
function 跟随(台, 要跟) {
|
|
92
|
-
if (台 && 要跟) 台.scrollTop = 台.scrollHeight;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** 输入法回车判定:组字中的回车不是发送(10 处踩过的同一个坑) */
|
|
96
|
-
function 是输入法回车(e) {
|
|
97
|
-
return e.isComposing || e.keyCode === 229 || e.which === 229;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function 话术(status, 服务端说的) {
|
|
101
|
-
if (服务端说的) return 服务端说的; // 服务端的话最准,优先用
|
|
102
|
-
if (status === 409) return '这场演出正有一轮在跑,等它回完';
|
|
103
|
-
if (status === 429) return '太快了,或者额度用完了,歇一会儿';
|
|
104
|
-
if (status === 403) return '这个账号还没开通演出通路';
|
|
105
|
-
if (status === 404) return '找不到这场演出的文件夹';
|
|
106
|
-
if (status === 422) return '这一轮没被接受(输入是空的或者太长)';
|
|
107
|
-
return '出错了(' + status + ')';
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function 挂载(选项) {
|
|
111
|
-
var 台 = 选项.台 || null;
|
|
112
|
-
var 输入 = 选项.输入 || null;
|
|
113
|
-
var 发送钮 = 选项.发送钮 || null;
|
|
114
|
-
var 画 = 选项.画 || {};
|
|
115
|
-
var 当摘要 = 选项.当摘要 || function () {};
|
|
116
|
-
var 当状态 = 选项.当状态 || function () {};
|
|
117
|
-
|
|
118
|
-
保证隐私声明();
|
|
119
|
-
|
|
120
|
-
var 址 = 自省();
|
|
121
|
-
var 探针 = location.protocol === 'file:'
|
|
122
|
-
|| new URLSearchParams(location.search).has('nd_probe')
|
|
123
|
-
|| !址.pid;
|
|
124
|
-
var 跑着 = false;
|
|
125
|
-
var 控制器 = null;
|
|
126
|
-
|
|
127
|
-
function api(路) {
|
|
128
|
-
return '/api/projects/' + 址.pid + '/chatai/' + 路;
|
|
129
|
-
}
|
|
130
|
-
function 忙(值) {
|
|
131
|
-
跑着 = 值;
|
|
132
|
-
if (发送钮) 发送钮.disabled = 值;
|
|
133
|
-
当状态(值 ? '跑着' : '闲着');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/** 开场铺台账。探针模式渲样例,绝不打网络。 */
|
|
137
|
-
async function 铺场() {
|
|
138
|
-
if (探针) {
|
|
139
|
-
样例.forEach(function (r) {
|
|
140
|
-
if (r.role === 'user') 画.用户(r.text);
|
|
141
|
-
else { var h = 画.演出(); h.完成(r.text); }
|
|
142
|
-
});
|
|
143
|
-
if (画.提示) 画.提示('(探针模式:样例台账,没有读真实记录)');
|
|
144
|
-
跟随(台, true);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
try {
|
|
148
|
-
var r = await fetch(api('log') + '?dir=' + encodeURIComponent(址.dir));
|
|
149
|
-
var j = await r.json().catch(function () { return {}; });
|
|
150
|
-
if (!r.ok) { if (画.出错) 画.出错(话术(r.status, j.error)); return; }
|
|
151
|
-
(j.records || []).forEach(function (rec) { // 端点给的就叫 records
|
|
152
|
-
if (rec.role === 'user') 画.用户(rec.text);
|
|
153
|
-
else { var h = 画.演出(); h.完成(rec.text); }
|
|
154
|
-
});
|
|
155
|
-
跟随(台, true);
|
|
156
|
-
} catch (e) {
|
|
157
|
-
if (画.出错) 画.出错('读不到台账:' + (e && e.message ? e.message : '网络断了'));
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/** 发一轮。文本从参数来(没给就从输入框取),走 SSE。 */
|
|
162
|
-
async function 发送(文本) {
|
|
163
|
-
var text = String(文本 != null ? 文本 : (输入 ? 输入.value : '')).trim();
|
|
164
|
-
if (!text || 跑着) return;
|
|
165
|
-
if (text.length > 输入上限) {
|
|
166
|
-
if (画.出错) 画.出错('这段太长了(上限 ' + 输入上限 + ' 字)');
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
忙(true);
|
|
170
|
-
var 要跟 = 贴底(台);
|
|
171
|
-
画.用户(text);
|
|
172
|
-
跟随(台, 要跟);
|
|
173
|
-
if (输入) 输入.value = '';
|
|
174
|
-
|
|
175
|
-
if (探针) { // 探针模式不打网络,回一句样例
|
|
176
|
-
var 样 = 画.演出();
|
|
177
|
-
样.完成('〔样例〕摊主抬头看了你一眼,没说话。');
|
|
178
|
-
跟随(台, 要跟);
|
|
179
|
-
忙(false);
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
var 手 = 画.演出();
|
|
184
|
-
var 还回去 = function (话) {
|
|
185
|
-
if (手.撤) 手.撤();
|
|
186
|
-
if (画.出错) 画.出错(话);
|
|
187
|
-
if (输入 && !输入.value) 输入.value = text; // 失败把话还给用户,别让他重打
|
|
188
|
-
忙(false);
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
控制器 = new AbortController();
|
|
192
|
-
var res;
|
|
193
|
-
try {
|
|
194
|
-
res = await fetch(api('turn'), {
|
|
195
|
-
method: 'POST',
|
|
196
|
-
headers: { 'Content-Type': 'application/json' },
|
|
197
|
-
body: JSON.stringify({ dir: 址.dir, input: text }),
|
|
198
|
-
signal: 控制器.signal,
|
|
199
|
-
});
|
|
200
|
-
} catch (e) {
|
|
201
|
-
return 还回去(e && e.name === 'AbortError' ? '这一轮中断了' : '网络断了,稍后重发');
|
|
202
|
-
}
|
|
203
|
-
if (!res.ok) {
|
|
204
|
-
var j2 = await res.json().catch(function () { return {}; });
|
|
205
|
-
return 还回去(话术(res.status, j2.error));
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// SSE:`data: {...}\n\n`。⚠️ 一个事件会跨 chunk 到(中转站分片很粗),
|
|
209
|
-
// 所以必须按 '\n\n' 切、把最后半截留在缓冲里,不能逐 chunk 解析。
|
|
210
|
-
var reader = res.body.getReader();
|
|
211
|
-
var dec = new TextDecoder();
|
|
212
|
-
var buf = '';
|
|
213
|
-
var 全文 = '';
|
|
214
|
-
var 出过错 = false;
|
|
215
|
-
try {
|
|
216
|
-
while (true) {
|
|
217
|
-
var 步 = await reader.read();
|
|
218
|
-
if (步.done) break;
|
|
219
|
-
buf += dec.decode(步.value, { stream: true });
|
|
220
|
-
var 块 = buf.split('\n\n');
|
|
221
|
-
buf = 块.pop();
|
|
222
|
-
for (var i = 0; i < 块.length; i++) {
|
|
223
|
-
var 行 = 块[i].split('\n').filter(function (l) { return l.indexOf('data:') === 0; })[0];
|
|
224
|
-
if (!行) continue;
|
|
225
|
-
var ev;
|
|
226
|
-
try { ev = JSON.parse(行.slice(5)); } catch (e) { continue; }
|
|
227
|
-
if (ev.delta) { 全文 += ev.delta; 手.写(全文); 跟随(台, 要跟); }
|
|
228
|
-
if (ev.error) { 出过错 = true; 还回去(ev.error); }
|
|
229
|
-
if (ev.done) {
|
|
230
|
-
if (!全文 && ev.text) 全文 = ev.text;
|
|
231
|
-
手.完成(全文);
|
|
232
|
-
跟随(台, 要跟);
|
|
233
|
-
if (ev.摘要 && 画.提示) {
|
|
234
|
-
画.提示(ev.摘要.失败 ? '(前情提要没写成,下一轮再试)' : '(已把旧的对话折进前情提要)');
|
|
235
|
-
}
|
|
236
|
-
当摘要(ev.摘要 || null);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
} catch (e) {
|
|
241
|
-
if (!出过错) return 还回去(e && e.name === 'AbortError' ? '这一轮中断了' : '流断了,刚才那段可能没说完');
|
|
242
|
-
}
|
|
243
|
-
控制器 = null;
|
|
244
|
-
if (!出过错) 忙(false);
|
|
245
|
-
if (输入 && 输入.focus) 输入.focus();
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/** 掐掉正在跑的那一轮(服务端会一起掐上游,不留半条记录) */
|
|
249
|
-
function 中断() {
|
|
250
|
-
if (控制器) { 控制器.abort(); 控制器 = null; }
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
if (输入) {
|
|
254
|
-
输入.addEventListener('keydown', function (e) {
|
|
255
|
-
if (e.key === 'Enter' && !e.shiftKey && !是输入法回车(e)) {
|
|
256
|
-
e.preventDefault();
|
|
257
|
-
发送();
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
if (发送钮) 发送钮.addEventListener('click', function () { 发送(); });
|
|
262
|
-
|
|
263
|
-
铺场();
|
|
264
|
-
return { 发送: 发送, 中断: 中断, 铺场: 铺场, 探针: 探针, 址: 址 };
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
global.ND演出 = { 挂载: 挂载, 版本: '1.0' };
|
|
268
|
-
}(window));
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{c as Je,r as a,j as e,d as r,G as s,_ as Mt,R as z,F as m,a as F,$ as Ce,u as D,X as ue,w as Rt,e as E,a0 as et,a1 as Ot,a2 as Bt,a3 as ke,a4 as Ht,a5 as tt,P as nt,a6 as _t,a7 as st,a8 as rt,a9 as Dt,aa as qt,ab as It,ac as it,o as lt,ad as Nt,k as Gt,ae as ot,m as Ut,af as Xt,S as Vt,ag as at,ah as Kt,ai as Yt,aj as Ge,ak as Zt,Q as Qt,al as Jt,am as Ct,an as en,M as tn,ao as nn,ap as sn,n as rn,A as ln}from"./index-DGG5wIZs.js";import{d as Ue,c as Xe,M as on,o as an,t as dn,E as cn,C as un,G as xn,p as pn,D as fn,b as gn,a as hn,P as yn,I as mn,R as bn,e as wn}from"./pending-edit-apply-uP4uvrOD.js";import{E as kn,S as vn}from"./square-dashed-mouse-pointer-CTtTVKoH.js";/**
|
|
2
|
-
* @license lucide-react v0.468.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const dt=Je("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/**
|
|
7
|
-
* @license lucide-react v0.468.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const jn=Je("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),Sn=1920,zn=1080;function En({src:n,srcDoc:t,mode:i="edit",onSelect:d,onTextEdit:c,onIframeReady:h,zoom:y=1,deckW:u=Sn,deckH:b=zn}){const o=a.useRef(null),p=a.useRef(!1),w=a.useRef(0),[g,v]=a.useState(!1);a.useEffect(()=>{v(!0)},[n,t]),a.useEffect(()=>{const l=o.current;if(!(!l||!p.current))return Ue(l),i==="edit"&&Xe(l,{onSelect:d,onTextEdit:c}),()=>Ue(l)},[i,d,c]),a.useEffect(()=>()=>{var l;try{const S=(l=o.current)==null?void 0:l.contentWindow;S&&typeof S.scrollY=="number"&&(w.current=S.scrollY)}catch{}},[n,t]);const k=()=>{p.current=!0;const l=o.current;if(l){if(h==null||h(l),i==="edit"&&Xe(l,{onSelect:d,onTextEdit:c}),w.current>0)try{requestAnimationFrame(()=>{var S;try{(S=l.contentWindow)==null||S.scrollTo(0,w.current)}catch{}})}catch{}requestAnimationFrame(()=>{requestAnimationFrame(()=>v(!1))})}};return e.jsx("div",{style:{flex:1,minHeight:0,overflow:"hidden",background:r.bgWhite,position:"relative",display:"flex",alignItems:"center",justifyContent:"center"},children:e.jsx("iframe",{ref:o,src:n,srcDoc:t,onLoad:k,sandbox:"allow-scripts allow-same-origin",style:{width:`${u}px`,height:`${b}px`,flexShrink:0,border:0,background:r.bgWhite,transform:y===1?"none":`scale(${y})`,transformOrigin:"center center",opacity:g?.5:1,transition:"opacity 180ms ease-out"}})})}function $n({candidates:n,activeId:t,onSelect:i,onAdd:d,onRemove:c,onRename:h}){if(!n||n.length===0)return null;const y=n.length===1;return e.jsxs("div",{style:{flexShrink:0,height:36,borderBottom:`1px solid ${r.border}`,background:r.bgWhite,padding:`0 ${s.lg}px`,display:"flex",alignItems:"center",gap:s.xs,overflowX:"auto",overflowY:"hidden"},children:[e.jsx(Mt,{size:11,color:r.sub,style:{flexShrink:0,marginRight:s.xs}}),n.map(u=>{const b=u.id===t;return e.jsx(Ln,{candidate:u,active:b,onSelect:()=>i==null?void 0:i(u.id),onRemove:y?null:()=>c==null?void 0:c(u.id),onRename:h},u.id)}),e.jsxs("button",{onClick:d,title:"新建候选(mock 复制当前)",style:{flexShrink:0,padding:`${s.xs}px ${s.md}px`,display:"inline-flex",alignItems:"center",gap:s.xs,fontFamily:F,fontSize:m.xs,color:r.sub,background:"transparent",border:`1px dashed ${r.borderMd}`,borderRadius:z.sm,cursor:"pointer"},onMouseEnter:u=>{u.currentTarget.style.color=r.text2,u.currentTarget.style.background="rgba(0,0,0,0.03)"},onMouseLeave:u=>{u.currentTarget.style.color=r.sub,u.currentTarget.style.background="transparent"},children:[e.jsx(Ce,{size:11})," 新候选"]}),e.jsx("div",{style:{flex:1}}),e.jsxs("span",{style:{fontFamily:F,fontSize:m.xs,color:r.sub,opacity:y?0:.7,flexShrink:0},children:[n.length," 个候选"]})]})}function Ln({candidate:n,active:t,onSelect:i,onRemove:d,onRename:c}){const[h,y]=a.useState(!1),u=D(w=>w.prompt),b=D(w=>w.confirm),o=async w=>{if(w.stopPropagation(),!c)return;const g=await u({title:"重命名候选",initialValue:n.label,placeholder:"候选名"});g&&g.trim()&&g!==n.label&&c(n.id,g.trim())},p=async w=>{w.stopPropagation(),await b({title:"删除候选",message:`删除候选「${n.label}」?`,confirmLabel:"删除",danger:!0})&&d()};return e.jsxs("div",{onMouseEnter:()=>y(!0),onMouseLeave:()=>y(!1),style:{flexShrink:0,position:"relative",display:"inline-flex",alignItems:"center",background:t?"rgba(45,36,24,0.06)":"transparent",borderRadius:z.sm,transition:"background 0.15s"},children:[e.jsx("button",{onClick:i,onDoubleClick:o,title:"双击重命名",style:{padding:`${s.xs}px ${d&&h?s.lg:s.md}px ${s.xs}px ${s.md}px`,fontFamily:F,fontSize:m.xs,fontWeight:t?500:400,color:t?r.text:r.text4,background:"transparent",borderRadius:z.sm,cursor:"pointer",transition:"all 0.15s"},children:n.label}),d&&h&&e.jsx("button",{onClick:p,style:{position:"absolute",right:2,top:"50%",transform:"translateY(-50%)",width:14,height:14,borderRadius:z.xs,background:"rgba(0,0,0,0.06)",color:r.sub,display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer"},onMouseEnter:w=>{w.currentTarget.style.background="rgba(184,58,42,0.15)",w.currentTarget.style.color=r.error},onMouseLeave:w=>{w.currentTarget.style.background="rgba(0,0,0,0.06)",w.currentTarget.style.color=r.sub},title:"删除候选",children:e.jsx(ue,{size:9})})]})}const de=12,Fn=8;function Se(n,t){const[i,d]=a.useState(null);return a.useLayoutEffect(()=>{const c=n==null?void 0:n.current;if(!c){d(null);return}const h=()=>{const y=c.getBoundingClientRect();if(!y.width&&!y.height){d(null);return}const u=window.innerWidth,b=window.innerHeight,o=Math.max(de,Math.min(y.left,u-t-de)),p=Math.min(y.bottom+Fn,b-de-120);d({position:"fixed",left:o,top:p,maxHeight:b-p-de})};return h(),window.addEventListener("resize",h),()=>window.removeEventListener("resize",h)},[n,t]),i||{position:"absolute",top:78,right:16}}function An({anchorRef:n,onClose:t,iframeDoc:i}){const d=a.useRef(null),c=Se(n,320),[h,y]=a.useState(!1),[u,b]=a.useState(null);a.useEffect(()=>{i&&o()},[i]),a.useEffect(()=>{const p=w=>{var g;d.current&&!d.current.contains(w.target)&&!((g=n==null?void 0:n.current)!=null&&g.contains(w.target))&&(t==null||t())};return window.addEventListener("mousedown",p),()=>window.removeEventListener("mousedown",p)},[t,n]);const o=()=>{i&&(y(!0),setTimeout(()=>{b(Tn(i)),y(!1)},400))};return e.jsxs("div",{ref:d,style:{...c,width:320,background:r.bgWhite,borderRadius:2,boxShadow:"0 2px 4px rgba(0,0,0,0.04), 0 8px 20px rgba(0,0,0,0.08), 0 24px 48px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.8)",zIndex:60,overflow:"hidden"},children:[e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,display:"flex",alignItems:"center",justifyContent:"space-between",borderBottom:`1px solid ${r.borderLt}`},children:[e.jsx("span",{style:{fontFamily:F,fontSize:m.sm,fontWeight:500,color:r.text},children:"Accessibility Review"}),e.jsx("button",{onClick:o,disabled:h,style:{padding:s.xs,color:r.sub,borderRadius:z.xs,opacity:h?.5:1},title:"重新扫描",children:e.jsx(Rt,{size:11,className:h?"spin":""})})]}),e.jsxs("div",{style:{padding:s.lg,maxHeight:360,overflowY:"auto"},children:[h&&e.jsx("div",{style:{fontFamily:E,fontSize:m.sm,color:r.sub,textAlign:"center",padding:s.lg},children:"扫描中…"}),!h&&u&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s.sm},children:u.map((p,w)=>e.jsx(Pn,{...p},w))})]}),e.jsx("div",{style:{padding:`${s.sm}px ${s.lg}px`,background:r.bgCard,borderTop:`1px solid ${r.borderLt}`,fontFamily:E,fontSize:m.xs,color:r.sub,lineHeight:1.5},children:"P5 接 LLM 真做 contrast / hierarchy / usability 审查;当前是启发式扫描。"})]})}function Pn({kind:n,label:t,hint:i,count:d}){const c=n==="ok",h=n==="warn",y=c?et:h?Ot:ue,u=c?r.success:h?r.warn:r.error;return e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:s.sm,padding:`${s.xs}px ${s.sm}px`,background:c?"transparent":"rgba(0,0,0,0.02)",borderRadius:z.sm},children:[e.jsx(y,{size:12,color:u,style:{marginTop:s.xxs,flexShrink:0}}),e.jsxs("div",{style:{flex:1},children:[e.jsxs("div",{style:{fontFamily:E,fontSize:m.sm,color:r.text2,lineHeight:1.4},children:[t," ",d!=null&&e.jsxs("span",{style:{color:r.sub,fontSize:m.xs},children:["(",d,")"]})]}),i&&e.jsx("div",{style:{fontFamily:E,fontSize:m.xs,color:r.sub,marginTop:1,lineHeight:1.4},children:i})]})]})}function Tn(n){const t=[],i=Array.from(n.querySelectorAll("img")),d=i.filter(o=>!o.hasAttribute("alt"));i.length===0?t.push({kind:"ok",label:"无图片元素需要 alt",hint:"没有 <img> 标签"}):d.length===0?t.push({kind:"ok",label:"图片 alt 完整",count:i.length}):t.push({kind:"warn",label:"部分图片缺 alt",count:d.length,hint:"加 alt 才能让屏幕阅读器识别"});const c=n.querySelectorAll("h1").length,h=n.querySelectorAll("h2").length;c===0&&h===0?t.push({kind:"warn",label:"没有 h1/h2 标题",hint:"层级缺失,screen reader 难导航"}):c>5?t.push({kind:"warn",label:"h1 过多",count:c,hint:"一般每页只 1 个 h1(每 section 1 个也可)"}):t.push({kind:"ok",label:"标题层级合理",hint:`h1 × ${c}, h2 × ${h}`});const y=Array.from(n.querySelectorAll("button")),u=y.filter(o=>!(o.textContent||"").trim()&&!o.getAttribute("aria-label"));y.length===0?t.push({kind:"ok",label:"无 button 需要文本",hint:"页面没有 <button>"}):u.length===0?t.push({kind:"ok",label:"按钮文本完整",count:y.length}):t.push({kind:"warn",label:"部分按钮缺文本/aria-label",count:u.length});const b=n.documentElement;return b.hasAttribute("lang")?t.push({kind:"ok",label:`<html> 标记了 lang="${b.getAttribute("lang")}"`}):t.push({kind:"warn",label:"<html> 缺 lang 属性",hint:"影响 screen reader 发音"}),t.push({kind:"ok",label:"色彩对比度(抽样)",hint:"主色块 WCAG AA pass(mock)"}),t.push({kind:"ok",label:"焦点顺序(mock)",hint:"Tab 键 traversal — P5 真模拟"}),t}function Wn({project:n,deckSpec:t,projectId:i}){var H,I,N;const d=Bt(f=>{var P;return((P=f.contextByProject[i])==null?void 0:P.systemInfo)||null}),c=D(f=>f.showToast),h=D(f=>f.confirm),[y,u]=a.useState([]),[b,o]=a.useState(!1),[p,w]=a.useState(!1),g=a.useRef(null),v=a.useCallback(async()=>{if(i){o(!0);try{const{plugins:f}=await ke.listProject(i);u(f||[])}catch(f){console.error("[SystemTab] listProject plugins failed:",f)}finally{o(!1)}}},[i]);a.useEffect(()=>{v()},[v]);const k=a.useCallback(async(f,P=!1)=>{var T,ee,X,V,B;if(!(!f||!i)){w(!0);try{const L=await ke.installProject(i,f,{force:P}),G=(T=L==null?void 0:L.installed)==null?void 0:T.name;c(`已装 plugin \`${G}\`(新会话生效)`,"success"),(ee=L==null?void 0:L.warnings)!=null&&ee.length&&c(`警告:${L.warnings.join(";")}`,"warn"),await v()}catch(L){if(L.status===409&&((X=L.body)!=null&&X.existing)){await h({title:"覆盖已装 plugin?",message:`已装 \`${L.body.existing.name}@${L.body.existing.version}\`,将覆盖为 \`${L.body.incoming.name}@${L.body.incoming.version}\`。`,confirmLabel:"覆盖",cancelLabel:"取消",danger:!0})&&await k(f,!0);return}const G=(B=(V=L.body)==null?void 0:V.errors)!=null&&B.length?`:${L.body.errors.join(";")}`:"";c(`安装失败${G||`:${L.message}`}`,"error")}finally{w(!1),g.current&&(g.current.value="")}}},[i,v,c,h]),l=a.useCallback(async f=>{if(await h({title:"卸载 plugin?",message:`从 project 移除 \`${f}\`(新会话生效)。文件会被删除。`,confirmLabel:"卸载",cancelLabel:"取消",danger:!0}))try{await ke.removeProject(i,f),c(`已卸载 \`${f}\``,"success"),await v()}catch(T){c(`卸载失败:${T.message}`,"error")}},[i,v,c,h]),S=Array.isArray(d==null?void 0:d.skills)?d.skills.map(f=>typeof f=="string"?f:f.name||f.id).filter(Boolean):[],A=Array.isArray(d==null?void 0:d.plugins)?d.plugins.map(f=>typeof f=="string"?f:f.name||f.id).filter(Boolean):[];return e.jsxs("div",{style:{padding:s.lg,display:"flex",flexDirection:"column",gap:s.xl},children:[e.jsx(C,{label:"本会话的 Skills",children:S.length===0?e.jsx("span",{style:{fontFamily:E,fontSize:m.sm,color:r.sub},children:"(等会话起动后从 SDK system_init 拉取)"}):e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:s.xs},children:S.map(f=>e.jsx(Ve,{icon:Ht,label:f},f))})}),e.jsx(C,{label:"本会话的 Plugins",children:A.length===0?e.jsx("span",{style:{fontFamily:E,fontSize:m.sm,color:r.sub},children:"—"}):e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:s.xs},children:A.map(f=>e.jsx(Ve,{icon:tt,label:f},f))})}),e.jsxs(C,{label:"Project 级 Plugins",children:[e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s.xs,marginBottom:s.sm},children:b&&y.length===0?e.jsx("span",{style:{fontFamily:E,fontSize:m.sm,color:r.sub},children:"加载中…"}):y.length===0?e.jsx("span",{style:{fontFamily:E,fontSize:m.sm,color:r.sub},children:"暂无(上传 zip 安装到本 project)"}):y.map(f=>e.jsx(Mn,{plugin:f,onUninstall:()=>l(f.name)},f.name))}),e.jsx("input",{ref:g,type:"file",accept:".md,.zip,application/zip,text/markdown,text/plain",style:{display:"none"},onChange:f=>{var T;const P=(T=f.target.files)==null?void 0:T[0];P&&k(P)}}),e.jsxs("button",{onClick:()=>{var f;return(f=g.current)==null?void 0:f.click()},disabled:p,style:{display:"inline-flex",alignItems:"center",gap:s.xs,padding:`${s.xs+1}px ${s.md}px`,fontFamily:E,fontSize:m.xs,color:r.text2,background:r.bgWhite,boxShadow:nt.far,borderRadius:z.md,cursor:p?"not-allowed":"pointer",opacity:p?.6:1},children:[e.jsx(_t,{size:11})," ",p?"安装中…":"上传 skill / plugin"]}),e.jsx("div",{style:{marginTop:s.xs,fontFamily:E,fontSize:m.xs,color:r.sub,lineHeight:1.5},children:"支持单 .md / skill zip / 完整 plugin zip。仅装到本 project;全局可见的走右上角 Skill 页面。新会话生效。"})]}),e.jsxs(C,{label:"模型",children:[e.jsx(ce,{k:"LLM",v:(d==null?void 0:d.model)||"—"}),(d==null?void 0:d.cwd)&&e.jsx(ce,{k:"cwd",v:d.cwd})]}),t&&e.jsxs(C,{label:"设计意图(spec)",children:[e.jsx(ce,{k:"metaphor",v:((H=t.meta)==null?void 0:H.metaphor)||"—"}),e.jsx(ce,{k:"audience",v:((I=t.meta)==null?void 0:I.audience)||"—"}),((N=t.meta)==null?void 0:N.intent)&&e.jsx("div",{style:{marginTop:s.sm,padding:s.md,background:r.bgCard,border:`1px solid ${r.borderLt}`,borderRadius:z.md,fontFamily:E,fontSize:m.xs,color:r.text2,lineHeight:1.6},children:t.meta.intent}),t.outline&&t.outline.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{marginTop:s.lg,fontFamily:F,fontSize:m.xs,color:r.sub,textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:s.sm},children:["页面 outline (",t.outline.length,")"]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s.xs},children:t.outline.map(f=>e.jsxs("div",{style:{padding:`${s.xs+1}px ${s.md}px`,fontFamily:E,fontSize:m.xs,background:"rgba(43,33,23,0.025)",borderRadius:z.sm,display:"flex",gap:s.sm,alignItems:"baseline"},children:[e.jsx("span",{style:{fontFamily:F,color:r.sub,minWidth:24},children:String(f.index).padStart(2,"0")}),e.jsx("span",{style:{color:r.text3,minWidth:64,fontFamily:F,fontSize:m.xs,textTransform:"uppercase"},children:f.layout}),e.jsx("span",{style:{color:r.text2,flex:1,lineHeight:1.4},children:f.intent})]},f.id))})]})]})]})}function Mn({plugin:n,onUninstall:t}){var i;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:s.sm,padding:`${s.xs+1}px ${s.sm}px`,background:"rgba(43,33,23,0.025)",borderRadius:z.sm},children:[e.jsx(tt,{size:11,color:r.text4}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:s.xs},children:[e.jsx("span",{style:{fontFamily:F,fontSize:m.sm,color:r.text2},children:n.name}),e.jsx("span",{style:{fontFamily:F,fontSize:m.xs,color:r.sub},children:n.version}),e.jsxs("span",{style:{fontFamily:E,fontSize:m.xs,color:r.sub},children:["· ",((i=n.skills)==null?void 0:i.length)||0," skill"]})]}),n.description&&e.jsx("div",{style:{fontFamily:E,fontSize:m.xs,color:r.sub,lineHeight:1.4,marginTop:s.xxs,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:n.description,children:n.description})]}),e.jsx("button",{onClick:t,title:"卸载",style:{background:"transparent",border:"none",color:r.sub,cursor:"pointer",padding:s.xxs},children:e.jsx(st,{size:11})})]})}function Ve({icon:n,label:t}){return e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:s.xs,padding:`${s.xxs}px ${s.sm}px`,fontFamily:F,fontSize:m.xs,color:r.text2,background:"rgba(43,33,23,0.04)",borderRadius:z.pill},children:[e.jsx(n,{size:10,color:r.text4}),t]})}function C({label:n,children:t}){return e.jsxs("div",{children:[e.jsx("div",{style:{fontFamily:F,fontSize:m.xs,color:r.sub,textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:s.sm},children:n}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s.xs},children:t})]})}function ce({k:n,v:t}){return e.jsxs("div",{style:{display:"flex",gap:s.md,fontFamily:E,fontSize:m.sm},children:[e.jsx("span",{style:{color:r.sub,minWidth:70},children:n}),e.jsx("span",{style:{color:r.text2,flex:1,wordBreak:"break-word"},children:t})]})}function Rn({anchorRef:n,onClose:t,project:i,deckSpec:d,projectId:c,sessionId:h,onA11yClick:y,tweaksEnabled:u=null,onTweaksEnabledChange:b=null}){const o=D(l=>l.canvasFont),p=D(l=>l.followAgent),w=D(l=>l.setFollowAgent),g=D(l=>l.setCanvasFont),v=a.useRef(null),k=Se(n,360);return a.useEffect(()=>{const l=S=>{var A;v.current&&!v.current.contains(S.target)&&!((A=n==null?void 0:n.current)!=null&&A.contains(S.target))&&(t==null||t())};return window.addEventListener("mousedown",l),()=>window.removeEventListener("mousedown",l)},[t,n]),a.useEffect(()=>{const l=S=>{S.key==="Escape"&&(t==null||t())};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[t]),e.jsxs("div",{ref:v,style:{...k,width:360,background:r.bgWhite,borderRadius:2,boxShadow:"0 2px 4px rgba(0,0,0,0.04), 0 8px 20px rgba(0,0,0,0.08), 0 24px 48px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.8)",zIndex:60,display:"flex",flexDirection:"column",overflow:"hidden"},children:[e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,display:"flex",alignItems:"center",gap:s.sm,borderBottom:`1px solid ${r.borderLt}`,flexShrink:0},children:[e.jsx(rt,{size:12,color:r.text4}),e.jsx("span",{style:{fontFamily:F,fontSize:m.sm,fontWeight:500,color:r.text},children:"System"})]}),e.jsxs("div",{style:{flex:1,minHeight:0,overflowY:"auto"},children:[y&&e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,borderBottom:`1px solid ${r.borderLt}`,display:"flex",flexDirection:"column",gap:s.sm},children:[e.jsx("div",{style:{fontFamily:F,fontSize:m.xs,color:r.sub,textTransform:"uppercase",letterSpacing:"0.05em"},children:"Canvas 工具"}),e.jsx("div",{style:{display:"flex",gap:s.sm},children:e.jsxs("button",{onClick:()=>{y(),t==null||t()},style:On,title:"无障碍审查(mock)",children:[e.jsx(jn,{size:11})," A11y"]})})]}),b&&e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,borderBottom:`1px solid ${r.borderLt}`,display:"flex",alignItems:"center",gap:s.sm},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontFamily:E,fontSize:m.sm,color:r.text},children:"Tweaks 模式"}),e.jsx("div",{style:{fontFamily:E,fontSize:m.xs,color:r.sub,marginTop:2,lineHeight:1.5},children:u?"开:agent 会主动把核心参数做成控件让你拖":"关:不暴露控件,改样式走对话"})]}),e.jsx(Ke,{checked:!!u,onChange:b})]}),e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,borderBottom:`1px solid ${r.borderLt}`,display:"flex",alignItems:"center",gap:s.sm},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontFamily:E,fontSize:m.sm,color:r.text},children:"镜头跟随 agent"}),e.jsx("div",{style:{fontFamily:E,fontSize:m.xs,color:r.sub,marginTop:2,lineHeight:1.5},children:p?"开:agent 换到哪个产物,镜头就飞过去(你操作后 8 秒内不抢)":"关:镜头只听你的;agent 在动什么看光圈"})]}),e.jsx(Ke,{checked:p,onChange:w})]}),e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,borderBottom:`1px solid ${r.borderLt}`},children:[e.jsx("div",{style:{fontFamily:E,fontSize:m.sm,color:r.text},children:"画布手写字体"}),e.jsx("div",{style:{fontFamily:E,fontSize:m.xs,color:r.sub,marginTop:2,marginBottom:s.sm},children:"用「文字」工具(T)在画布上写字时用这个"}),e.jsx("div",{style:{display:"flex",gap:s.xs,flexWrap:"wrap"},children:Object.entries(Dt).map(([l,S])=>e.jsx("button",{onClick:()=>g({...o,font:l}),style:{padding:`${s.xs}px ${s.sm}px`,borderRadius:z.md,cursor:"pointer",fontFamily:qt[l],fontSize:m.sm,border:`1px solid ${o.font===l?r.text:r.borderLt}`,background:o.font===l?r.text:"transparent",color:o.font===l?r.bg:r.text2},children:S},l))}),e.jsx("div",{style:{display:"flex",gap:s.xs,marginTop:s.sm},children:Object.entries(It).map(([l,S])=>e.jsx("button",{onClick:()=>g({...o,size:l}),style:{padding:`${s.xs}px ${s.sm}px`,borderRadius:z.md,cursor:"pointer",fontFamily:E,fontSize:m.xs,border:`1px solid ${o.size===l?r.text:r.borderLt}`,background:o.size===l?r.text:"transparent",color:o.size===l?r.bg:r.text2},children:S},l))})]}),e.jsx(Wn,{project:i,deckSpec:d,projectId:c})]}),e.jsx("div",{style:{padding:`${s.sm}px ${s.lg}px`,background:r.bgCard,borderTop:`1px solid ${r.borderLt}`,fontFamily:E,fontSize:m.xs,color:r.sub,lineHeight:1.5,flexShrink:0},children:"spec 不可在此编辑 — 改 spec 跟 agent 说,触发新 run。"})]})}function Ke({checked:n,onChange:t,title:i}){return e.jsx("button",{onClick:()=>t==null?void 0:t(!n),title:i,style:{width:28,height:16,padding:0,border:"none",borderRadius:z.lg,background:n?r.text:"rgba(0,0,0,0.18)",position:"relative",cursor:"pointer",transition:"background 0.15s",flexShrink:0},children:e.jsx("span",{style:{position:"absolute",top:2,left:n?14:2,width:12,height:12,borderRadius:z.round,background:r.bgWhite,boxShadow:it.crispSm,transition:"left 0.15s"}})})}const On={padding:`${s.xs+1}px ${s.md}px`,fontFamily:F,fontSize:m.xs,color:r.text4,background:"rgba(0,0,0,0.04)",border:"none",borderRadius:z.sm,display:"inline-flex",alignItems:"center",gap:s.xs,cursor:"pointer"};function Bn({comments:n=[],iframeDoc:t,iframeRef:i,anchorRef:d,onClose:c,onResolveComment:h,onDeleteComment:y,onSelectAnchor:u}){const b=a.useRef(null),o=Se(d,380);a.useEffect(()=>{const g=v=>{var k;b.current&&!b.current.contains(v.target)&&!((k=d==null?void 0:d.current)!=null&&k.contains(v.target))&&(c==null||c())};return window.addEventListener("mousedown",g),()=>window.removeEventListener("mousedown",g)},[c,d]),a.useEffect(()=>{const g=v=>{v.key==="Escape"&&(c==null||c())};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[c]);const p=a.useMemo(()=>{const g=new Map;for(const k of n){const l=t&&k.anchor?lt(k.anchor,t.body):null,S=l?Nt(l):null,A=(S==null?void 0:S.index)??null;g.has(A)||g.set(A,[]),g.get(A).push({comment:k,el:l})}return[...g.entries()].sort((k,l)=>k[0]===null?1:l[0]===null?-1:k[0]-l[0])},[n,t]),w=g=>{if(g.el)try{g.el.scrollIntoView({behavior:"smooth",block:"center"})}catch{}u&&u(g.comment.anchor)};return e.jsxs("div",{ref:b,style:{...o,width:380,background:r.bgWhite,borderRadius:2,boxShadow:"0 2px 4px rgba(0,0,0,0.04), 0 8px 20px rgba(0,0,0,0.08), 0 24px 48px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.8)",zIndex:60,display:"flex",flexDirection:"column",overflow:"hidden"},children:[e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,display:"flex",alignItems:"center",gap:s.sm,borderBottom:`1px solid ${r.borderLt}`,flexShrink:0},children:[e.jsx(dt,{size:12,color:r.text4}),e.jsxs("span",{style:{fontFamily:F,fontSize:m.sm,fontWeight:500,color:r.text,flex:1},children:["全部评论 ",n.length>0&&`(${n.length})`]}),e.jsx("button",{onClick:c,title:"关闭",style:{padding:s.xs,color:r.text5,borderRadius:z.xs,background:"transparent",border:"none",cursor:"pointer"},children:e.jsx(ue,{size:12})})]}),e.jsx("div",{style:{flex:1,minHeight:0,overflowY:"auto"},children:n.length===0?e.jsxs("div",{style:{padding:`${s.lg+s.md}px ${s.lg}px`,fontFamily:E,fontSize:m.sm,color:r.sub,textAlign:"center",lineHeight:1.6},children:["还没有评论。",e.jsx("br",{}),"点击画布上任意元素 → 在弹出的浮卡里写评论。"]}):p.map(([g,v])=>e.jsxs("div",{style:{padding:`${s.md}px ${s.lg}px`,borderBottom:`1px solid ${r.borderLt}`},children:[e.jsxs("div",{style:{fontFamily:F,fontSize:m.xs,color:r.sub,textTransform:"uppercase",letterSpacing:"0.05em",marginBottom:s.sm},children:[g===null?"未定位":`第 ${g+1} 页`," · ",v.length," 条"]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:s.xs},children:v.map(({comment:k,el:l})=>e.jsx(Hn,{comment:k,available:!!l,onClick:()=>w({comment:k,el:l}),onResolve:()=>h==null?void 0:h(k.id),onDelete:()=>y==null?void 0:y(k.id)},k.id))})]},g??"orphan"))}),e.jsx("div",{style:{padding:`${s.sm}px ${s.lg}px`,background:r.bgCard,borderTop:`1px solid ${r.borderLt}`,fontFamily:E,fontSize:m.xs,color:r.sub,lineHeight:1.5,flexShrink:0},children:"点击评论 → 跳到对应元素;evaluator 切到 edit 模式后可在浮卡续写。"})]})}function Hn({comment:n,available:t,onClick:i,onResolve:d,onDelete:c}){var y,u,b;const h=n.status==="resolved";return e.jsxs("div",{style:{padding:`${s.sm}px ${s.md}px`,background:r.bgWhite,boxShadow:nt.far,borderRadius:z.md,display:"flex",flexDirection:"column",gap:s.xs,opacity:h?.5:1,cursor:t?"pointer":"default",transition:"background 0.1s"},onClick:t?i:void 0,onMouseEnter:o=>{t&&(o.currentTarget.style.background="rgba(0,0,0,0.02)")},onMouseLeave:o=>{o.currentTarget.style.background=r.bgWhite},children:[e.jsx("div",{style:{fontFamily:E,fontSize:m.sm,color:r.text2,lineHeight:1.5,textDecoration:h?"line-through":"none",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:n.text}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:s.xs,fontFamily:F,fontSize:m.xs,color:r.sub},children:[t?e.jsxs(e.Fragment,{children:[e.jsx(on,{size:9}),e.jsx("span",{children:((y=n.anchor)==null?void 0:y.dataId)||((b=(u=n.anchor)==null?void 0:u.path)==null?void 0:b.split(">").pop())||"元素"})]}):e.jsx("span",{style:{fontStyle:"italic"},children:"元素已不在"}),e.jsx("span",{style:{flex:1}}),e.jsx("button",{onClick:o=>{o.stopPropagation(),d()},title:h?"取消解决":"标记解决",style:{padding:s.xxs,color:r.sub,borderRadius:z.xs,background:"transparent",border:"none",cursor:"pointer"},children:e.jsx(et,{size:11})}),e.jsx("button",{onClick:o=>{o.stopPropagation(),c()},title:"删除",style:{padding:s.xxs,color:r.sub,borderRadius:z.xs,background:"transparent",border:"none",cursor:"pointer"},children:e.jsx(st,{size:11})})]})]})}function _n({iframeDoc:n,active:t}){const[i,d]=a.useState([]),[c,h]=a.useState(0);a.useEffect(()=>{if(!t||!n){d([]);return}let u=null;const b=()=>{const p=Array.from(n.querySelectorAll("section[data-page]"));if(d(p),u&&u.disconnect(),!!p.length)try{u=new(n.defaultView||window).IntersectionObserver(w=>{const g=w.filter(k=>k.isIntersecting).sort((k,l)=>l.intersectionRatio-k.intersectionRatio)[0];if(!g)return;const v=p.indexOf(g.target);v>=0&&h(v)},{threshold:[.35,.6]}),p.forEach(w=>u.observe(w))}catch{}};b();let o=null;try{o=new(n.defaultView||window).MutationObserver(()=>b()),n.body&&o.observe(n.body,{childList:!0,subtree:!0})}catch{}return()=>{u==null||u.disconnect(),o==null||o.disconnect()}},[n,t]);const y=a.useCallback(u=>{h(b=>{const o=Math.max(0,Math.min(i.length-1,b+u)),p=i[o];if(p)try{p.scrollIntoView({behavior:"smooth",block:"start"})}catch{}return o})},[i]);return a.useEffect(()=>{if(!t||i.length<2)return;const u=o=>{if(o.key!=="ArrowLeft"&&o.key!=="ArrowRight")return;const p=o.target;p&&(p.tagName==="INPUT"||p.tagName==="TEXTAREA"||p.isContentEditable)||(o.preventDefault(),y(o.key==="ArrowRight"?1:-1))};window.addEventListener("keydown",u);let b=null;try{b=n,b==null||b.addEventListener("keydown",u)}catch{}return()=>{window.removeEventListener("keydown",u);try{b==null||b.removeEventListener("keydown",u)}catch{}}},[t,i.length,y,n]),!t||i.length<2?null:e.jsxs("div",{style:{position:"absolute",bottom:16,left:"50%",transform:"translateX(-50%)",display:"flex",alignItems:"center",gap:s.xxs,background:"rgba(28,24,18,0.86)",borderRadius:z.pill,padding:s.xs,boxShadow:"0 6px 22px rgba(0,0,0,0.22)",zIndex:30,backdropFilter:"blur(6px)"},children:[e.jsx(Ye,{onClick:()=>y(-1),disabled:c===0,icon:Gt,title:"上一页(←)"}),e.jsxs("span",{style:{fontFamily:F,fontSize:m.sm,color:ot.ink,padding:`0 ${s.md}px`,minWidth:52,textAlign:"center",userSelect:"none"},children:[c+1," / ",i.length]}),e.jsx(Ye,{onClick:()=>y(1),disabled:c===i.length-1,icon:Ut,title:"下一页(→)"})]})}function Ye({onClick:n,disabled:t,icon:i,title:d}){return e.jsx("button",{onClick:n,disabled:t,title:d,style:{display:"flex",alignItems:"center",justifyContent:"center",width:26,height:26,borderRadius:z.round,border:"none",background:"transparent",color:t?"rgba(232,226,210,0.3)":ot.ink,cursor:t?"default":"pointer",transition:"background 0.15s"},onMouseEnter:c=>{t||(c.currentTarget.style.background="rgba(255,255,255,0.12)")},onMouseLeave:c=>{c.currentTarget.style.background="transparent"},children:e.jsx(i,{size:15})})}function Dn({edits:n=[],onApply:t,onUndo:i,onClearAll:d,canUndo:c=!1,isRunning:h=!1}){const y=n.length;if(y===0)return null;const u=qn(n);return e.jsxs("div",{style:{position:"absolute",bottom:16,left:"50%",transform:"translateX(-50%)",background:"rgba(45, 36, 24, 0.94)",color:r.btnText,borderRadius:z.lg,padding:`${s.sm}px ${s.lg}px`,display:"flex",alignItems:"center",gap:s.md,fontFamily:F,fontSize:m.xs,boxShadow:"0 8px 32px rgba(0,0,0,0.25), 0 2px 8px rgba(0,0,0,0.18)",zIndex:50,backdropFilter:"blur(8px)",WebkitBackdropFilter:"blur(8px)"},children:[e.jsx("span",{style:{padding:`${s.xxs}px ${s.md}px`,background:"rgba(245, 240, 232, 0.15)",borderRadius:z.xl,fontWeight:600,minWidth:22,textAlign:"center"},children:y}),e.jsxs("span",{style:{color:"#dfd6c6"},children:[u," 待应用"]}),e.jsx("div",{style:{width:1,height:18,background:"rgba(245,240,232,0.2)"}}),e.jsxs("button",{onClick:i,disabled:!c,title:c?"撤销最近一次 (Cmd+Z)":"无可撤销操作",style:{...Ze,opacity:c?1:.4,cursor:c?"pointer":"not-allowed"},children:[e.jsx(Xt,{size:11})," 撤销"]}),e.jsxs("button",{onClick:d,title:"全部撤销 — 把所有 pending 编辑清掉",style:Ze,children:[e.jsx(ue,{size:11})," 全部撤销"]}),e.jsxs("button",{onClick:t,disabled:h,title:h?"agent 正在跑,等当前 run 结束":"让 agent 把这些调整落到源代码",style:{...In,opacity:h?.6:1,cursor:h?"wait":"pointer"},children:[e.jsx(Vt,{size:11})," 应用"]})]})}function qn(n){const t={move:0,style:0,dup:0,del:0};for(const d of n)d.kind==="pending-move"?t.move++:d.kind==="pending-style"?t.style++:d.kind==="pending-duplicate"?t.dup++:d.kind==="pending-delete"&&t.del++;const i=[];return t.move&&i.push(`${t.move} 拖动`),t.dup&&i.push(`${t.dup} 复制`),t.style&&i.push(`${t.style} 样式`),t.del&&i.push(`${t.del} 删除`),i.join(" · ")||"调整"}const Ze={display:"inline-flex",alignItems:"center",gap:s.xs,padding:`${s.xs}px ${s.base}px`,fontFamily:"inherit",fontSize:m.xs,color:r.btnText,background:"transparent",border:"1px solid rgba(245,240,232,0.25)",borderRadius:z.sm},In={display:"inline-flex",alignItems:"center",gap:s.xs,padding:"5px 14px",fontFamily:"inherit",fontSize:m.xs,fontWeight:600,color:r.btn,background:r.btnText,border:"none",borderRadius:z.sm,boxShadow:"0 1px 2px rgba(0,0,0,0.15)"},Qe=at.purple,Nn=Kt(at.purple,.18);function Gn({edits:n=[],iframeRef:t,zoom:i=1}){const[,d]=a.useState(0);a.useEffect(()=>{if(n.length===0)return;const g=t==null?void 0:t.current;if(!g)return;const v=g.contentWindow;if(!v)return;let k=null;const l=()=>{k||(k=requestAnimationFrame(()=>{k=null,d(S=>S+1)}))};try{v.addEventListener("scroll",l,{passive:!0,capture:!0}),v.addEventListener("resize",l),window.addEventListener("resize",l)}catch{}return()=>{try{v.removeEventListener("scroll",l,{capture:!0}),v.removeEventListener("resize",l),window.removeEventListener("resize",l)}catch{}k&&cancelAnimationFrame(k)}},[n.length,t]);const c=a.useMemo(()=>n.filter(g=>(g.kind==="pending-move"||g.kind==="pending-duplicate")&&g.reactMount===!0),[n]);if(c.length===0||!(t!=null&&t.current))return null;const h=t.current,y=h.contentDocument;if(!y)return null;const u=h.getBoundingClientRect(),b=an(h);if(!b)return null;const o=h.contentWindow,p=(o==null?void 0:o.innerWidth)??u.width/i,w=(o==null?void 0:o.innerHeight)??u.height/i;return e.jsx(e.Fragment,{children:c.map((g,v)=>{var f;const k=lt(g.anchor,y.body);if(!k)return null;const l=k.getBoundingClientRect();if(l.bottom<=0||l.top>=w||l.right<=0||l.left>=p)return null;const{top:S,left:A}=dn(b,l.left,l.top,i),H=l.width*i,I=l.height*i,N=(f=g.aiContext)!=null&&f.targetContainerTag?`${g.aiContext.targetContainerTag}`:"目标容器";return e.jsxs("div",{style:{position:"absolute",top:0,left:0,pointerEvents:"none"},children:[e.jsx("div",{style:{position:"absolute",pointerEvents:"none",top:S-3,left:A-3,width:H+6,height:I+6,border:`2px dashed ${Qe}`,borderRadius:z.sm,boxShadow:`0 0 0 3px ${Nn}`,zIndex:9}}),e.jsxs("div",{style:{position:"absolute",pointerEvents:"none",top:S-12,left:A+H-8,transform:"translateX(-100%)",padding:`${s.xxs}px ${s.sm}px`,fontFamily:F,fontSize:m.xs,lineHeight:"14px",fontWeight:500,color:r.bgWhite,background:Qe,borderRadius:z.xs,whiteSpace:"nowrap",boxShadow:it.crisp,zIndex:11,maxWidth:Math.max(120,H),overflow:"hidden",textOverflow:"ellipsis"},children:[g.kind==="pending-duplicate"?"复制到":"移到"," <",N,">"]})]},v)})})}const ve={"16:9":{w:1920,h:1080},"16:10":{w:1920,h:1200},"9:16":{w:1080,h:1920},"4:3":{w:1440,h:1080}},je="16:9";function Un(n){if(!n||typeof n!="string")return je;const t=n.match(/<div\b[^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"][^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"]/i)||n.match(/<div\b[^>]*data-deck-aspect\s*=\s*['"]([^'"]+)['"][^>]*class\s*=\s*['"][^'"]*__nd-deck-wrap[^'"]*['"]/i);return t&&ve[t[1]]?t[1]:je}function Yn({tab:n,onTabChange:t,onClose:i,artifactExports:d=null,onExport:c=null,onToolbarGroups:h=null,title:y="幻灯",htmlSrc:u,htmlContent:b,selectedAnchor:o,onSelectChange:p,onTextEdit:w,onIframeReady:g,candidates:v,activeCandidateId:k,onSelectCandidate:l,onAddCandidate:S,onRemoveCandidate:A,onRenameCandidate:H,project:I,deckSpec:N,projectId:f,sessionId:P,comments:T=[],onAddComment:ee,onResolveComment:X,onDeleteComment:V,onRegionComment:B=null,tweaksAvailable:L=!1,pendingEdits:G=[],onCommitMove:q,onCommitFreePosition:xe,onSubmitDragNote:ct,lastPendingEditId:ut=null,onApplyPendingEdits:xt,onUndoPending:pt,onClearAllPending:ft,canUndoPending:gt=!1,isStreaming:U=!1}){var We,Me,Re,Oe,Be,He,_e,De,qe,Ie;const{panels:pe,setPanelVisible:ht}=Yt(),fe=!!((We=pe==null?void 0:pe.tweaks)!=null&&We.visible),yt=()=>ht("tweaks",!fe),[K,ze]=a.useState(!1);a.useEffect(()=>{U&&n==="drag"&&(t==null||t("edit"))},[U,n,t]);const mt=a.useRef(null),[ge,bt]=a.useState(!1),[Ee,wt]=a.useState(null),[kt,$e]=a.useState(!1),[Y,te]=a.useState("fit"),[Z,vt]=a.useState({width:0,height:0}),[Le,jt]=a.useState(0),[he,ne]=a.useState(""),[ye,se]=a.useState(!1),[_,Fe]=a.useState(null),[me,re]=a.useState(!1),[Q,ie]=a.useState(!1),[J,le]=a.useState(!1),[oe,Ae]=a.useState(!0),O=a.useRef(null),be=a.useRef(null),Pe=a.useRef(null);a.useEffect(()=>{if(!f||!P)return;let x=!1;return Ge.read(f).then(({config:j})=>{x||j&&typeof j.tweaks_mode_enabled=="boolean"&&Ae(j.tweaks_mode_enabled)}).catch(()=>{}),()=>{x=!0}},[f,P]);const St=a.useCallback(x=>{Ae(x),!(!f||!P)&&Ge.patch(f,{tweaks_mode_enabled:x}).catch(()=>{})},[f,P]);a.useEffect(()=>{const x=O.current;if(!x)return;const j=()=>{const M=x.getBoundingClientRect();vt(R=>R.width===M.width&&R.height===M.height?R:{width:M.width,height:M.height})};j();let $=null;try{$=new ResizeObserver(j),$.observe(x)}catch{}return window.addEventListener("resize",j),()=>{$&&$.disconnect(),window.removeEventListener("resize",j)}},[n]);const Te=Un(he),ae=ve[Te]||ve[je],W=Y==="fit"?Z.width>0&&Z.height>0?Math.min(Z.width/ae.w,Z.height/ae.h):1:Y,zt=v&&v.length>=1;a.useEffect(()=>{se(!1),Fe(null)},[k]),a.useEffect(()=>{const x=$=>{var R;if($.key!=="Escape")return;const M=$.target;((R=M==null?void 0:M.getAttribute)==null?void 0:R.call(M,"contenteditable"))!=="true"&&(Q||me||J||(o?p==null||p(null):i==null||i()))};window.addEventListener("keydown",x);let j=null;try{j=_,j==null||j.addEventListener("keydown",x)}catch{}return()=>{window.removeEventListener("keydown",x);try{j==null||j.removeEventListener("keydown",x)}catch{}}},[o,_,p,i,Q,me,J]),a.useEffect(()=>{const x=j=>{const $=j==null?void 0:j.data;if(!(!$||typeof $!="object")&&$.type==="canvas-page-change"&&Number.isFinite($.page))try{window.dispatchEvent(new CustomEvent("nd-canvas-page-change",{detail:{page:$.page}}))}catch{}};return window.addEventListener("message",x),()=>window.removeEventListener("message",x)},[]),a.useEffect(()=>{if(!u){ne(b||""),se(!1);return}fetch(u).then(x=>x.text()).then(x=>{ne(x),se(!1)}).catch(()=>ne("<!-- 无法加载源码 -->"))},[u,b,Le]);const Et=x=>{p==null||p((x==null?void 0:x.anchor)||null)},$t=x=>{w==null||w(x),console.log("[direct edit]",x)},Lt=a.useCallback(x=>{ne(x),se(!0)},[]),Ft=a.useCallback(x=>{try{Fe(x.contentDocument)}catch{}g==null||g(x)},[g]),At=()=>{jt(x=>x+1),p==null||p(null)},Pt=()=>{re(!1),ie(!1),le(x=>!x)},Tt=()=>{re(!1),le(!1),ie(x=>!x)},we=Array.isArray(T)?T.filter(x=>x.status!=="resolved").length:0,Wt=a.useMemo(()=>[rn({kind:"deck",exports:d,onExport:c}),{id:"mode",type:"mode",value:n,onChange:x=>{t==null||t(x),p==null||p(null)},items:[{id:"preview",icon:kn,label:"预览",title:"看成品(左右键翻页)"},{id:"edit",icon:Zt,label:"编辑",title:"双击文字直接改 · 单击元素弹评论卡"},{id:"drag",icon:Qt,label:"拖拽",disabled:U,title:U?"agent 正在跑,拖拽暂停以免和它抢同一份源码":"拖动元素调布局"},{id:"region",icon:vn,label:"圈选",disabled:!B,title:B?"框一块地方说事 —— 框住谁、当时长什么样、你想说什么,一起交给 agent":"要先开一个会话才能把圈选交给 agent"},{id:"code",icon:Jt,label:"源码",title:"看/改这一份 HTML"}]},n==="drag"&&{id:"dragmode",items:[{id:"free",icon:Ct,label:K?"自由":"嵌入",active:K,title:K?"自由摆放 · 松手落到像素位置(P 切回嵌入)":"嵌入 · 松手按 DOM 树插进容器(P 切自由摆放)",onClick:()=>ze(x=>!x)}]},n!=="code"&&{id:"zoom",items:[{id:"zoomOut",icon:en,title:"缩小",onClick:()=>te(Math.max(.25,W-.1))},{id:"zoomLevel",label:`${Math.round(W*100)}%`,active:Y==="fit",title:Y==="fit"?"当前自适应窗口":"点一下自适应窗口",onClick:()=>te("fit")},{id:"zoomIn",icon:Ce,title:"放大",onClick:()=>te(Math.min(3,W+.1))},{id:"fit",icon:tn,title:"自适应窗口",onClick:()=>te("fit")}]},{id:"actions",items:[{id:"tweaks",icon:nn,active:fe,disabled:!oe,title:oe?L?"Tweaks:拖控件实时改样式":"Tweaks(agent 还没暴露参数 — 跟它说一句让它 expose_tweaks)":"Tweaks 模式已关(在 System 里开)",onClick:yt},{id:"comment",icon:dt,label:we>0?String(we):void 0,active:J,btnRef:Pe,title:"这一份上已有的评论",onClick:Pt},{id:"reload",icon:sn,title:"重载(agent 改完没刷新时用)",onClick:At},{id:"system",icon:rt,active:Q,btnRef:be,title:"System:项目档案 / Tweaks 模式 / A11y",onClick:Tt}]}].filter(Boolean),[n,U,K,Y,W,fe,oe,L,J,Q,we,B,d,c]);return e.jsxs(ln,{kind:"deck",title:y,subtitle:Te,onClose:i,escToClose:!1,groups:Wt,onToolbarGroups:h,headerExtra:zt?e.jsx($n,{candidates:v,activeId:k,onSelect:l,onAdd:S,onRemove:A,onRename:H}):null,children:[(n==="edit"||n==="preview"||n==="drag"||n==="region")&&e.jsxs("div",{ref:O,style:{flex:1,minHeight:0,position:"relative",display:"flex",flexDirection:"column"},children:[e.jsx(En,{src:ye?void 0:u,srcDoc:ye?he:u?void 0:b,mode:n==="drag"||n==="region"?"preview":n,onSelect:Et,onTextEdit:$t,onIframeReady:Ft,zoom:W,deckW:ae.w,deckH:ae.h},`${k||"default"}-${Le}-${ye?"doc":"src"}`),n==="edit"&&o&&e.jsx(cn,{selectedAnchor:o,iframeRef:{current:(Me=O.current)==null?void 0:Me.querySelector("iframe")},zoom:W}),e.jsx(un,{comments:T,iframeRef:{current:(Re=O.current)==null?void 0:Re.querySelector("iframe")},zoom:W,onSelectAnchor:x=>{n!=="edit"&&(t==null||t("edit")),p==null||p(x)}}),e.jsx(Gn,{edits:G,iframeRef:{current:(Oe=O.current)==null?void 0:Oe.querySelector("iframe")},zoom:W}),e.jsx(_n,{iframeDoc:_,active:n==="preview"}),e.jsx(xn,{active:n==="drag"&&!ge,iframeRef:{current:(Be=O.current)==null?void 0:Be.querySelector("iframe")},zoom:W,pickDragSource:pn,isDragging:ge}),e.jsx(fn,{active:n==="drag",iframeRef:{current:(He=O.current)==null?void 0:He.querySelector("iframe")},zoom:W,freeMode:K,onFreeModeChange:ze,apiRef:mt,onDraggingChange:bt,onSelectionChange:x=>{wt(x),x&&$e(!0)},onCommitMove:(x,j)=>{var M;if(j.duplicate){const R=(M=j.sourceEl)==null?void 0:M.cloneNode(!0);let Ne=()=>{};if(R&&j.targetContainer){try{R.removeAttribute("data-anchor")}catch{}j.beforeEl&&j.beforeEl.parentNode===j.targetContainer?j.targetContainer.insertBefore(R,j.beforeEl):j.targetContainer.appendChild(R),Ne=()=>{try{R.remove()}catch{}}}q==null||q(x,Ne);return}const $=hn({iframeDoc:_,sourceEl:j.sourceEl,targetContainer:j.targetContainer,beforeEl:j.beforeEl});q==null||q(x,$==null?void 0:$.revert)},onCommitFreePosition:(x,j)=>{const $=gn({sourceEl:j.sourceEl,parentEl:j.parentEl,styleDelta:x.styleDelta,runtimeLocks:x.runtimeLocks,parentNeedsRelative:x.parentNeedsRelative});xe==null||xe(x,$==null?void 0:$.revert)}}),e.jsx(yn,{active:n==="drag"&&kt&&!ge&&!!Ee,iframeRef:{current:(_e=O.current)==null?void 0:_e.querySelector("iframe")},zoom:W,sourceEl:Ee,hasPendingEditId:!!ut,onSubmit:ct,onDismiss:()=>$e(!1)}),n==="edit"&&o&&_&&e.jsx(mn,{selectedAnchor:o,iframeDoc:_,iframeRef:{current:(De=O.current)==null?void 0:De.querySelector("iframe")},iframeRect:Z,zoom:W,comments:T,onClose:()=>p==null?void 0:p(null),onAddComment:ee,onResolveComment:X,onDeleteComment:V}),e.jsx(bn,{active:n==="region"&&!!B,iframeRef:{current:(qe=O.current)==null?void 0:qe.querySelector("iframe")},zoom:W,onSubmit:x=>B==null?void 0:B(x),onExit:()=>t==null?void 0:t("preview")}),e.jsx(Dn,{edits:G,onApply:xt,onUndo:pt,onClearAll:ft,canUndo:gt,isRunning:U})]}),n==="code"&&e.jsx(wn,{value:he,onChange:Lt,readOnly:!1}),me&&e.jsx(An,{anchorRef:be,onClose:()=>re(!1),iframeDoc:_}),Q&&e.jsx(Rn,{anchorRef:be,onClose:()=>ie(!1),project:I,deckSpec:N,projectId:f,sessionId:P,onA11yClick:()=>{ie(!1),re(!0)},tweaksEnabled:oe,onTweaksEnabledChange:St}),J&&e.jsx(Bn,{comments:T,iframeDoc:_,iframeRef:{current:(Ie=O.current)==null?void 0:Ie.querySelector("iframe")},anchorRef:Pe,onClose:()=>le(!1),onResolveComment:X,onDeleteComment:V,onSelectAnchor:x=>{le(!1),n!=="edit"&&(t==null||t("edit")),p==null||p(x)}})]})}export{Yn as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ai as o,aj as n}from"./MermaidBlock-BO-46Du5.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-LCL6LL3I-D2Wg5JtX.js";import{_ as i}from"./MermaidBlock-BO-46Du5.js";import"./chunk-5VM5RSS4-DydfHlEc.js";import"./chunk-XXDRQBXY-BCjvaeHm.js";import"./chunk-POPQ4Y6H-B2fCRfpM.js";import"./chunk-F27PBJKO-BO7GxhSv.js";import"./index-DGG5wIZs.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-LCL6LL3I-D2Wg5JtX.js";import{_ as i}from"./MermaidBlock-BO-46Du5.js";import"./chunk-5VM5RSS4-DydfHlEc.js";import"./chunk-XXDRQBXY-BCjvaeHm.js";import"./chunk-POPQ4Y6H-B2fCRfpM.js";import"./chunk-F27PBJKO-BO7GxhSv.js";import"./index-DGG5wIZs.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2) format("woff2"),url(/assets/KaTeX_AMS-Regular-DMm9YOAa.woff) format("woff"),url(/assets/KaTeX_AMS-Regular-DRggAlZN.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2) format("woff2"),url(/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff) format("woff"),url(/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff) format("woff"),url(/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2) format("woff2"),url(/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff) format("woff"),url(/assets/KaTeX_Fraktur-Regular-CB_wures.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/assets/KaTeX_Main-Bold-Cx986IdX.woff2) format("woff2"),url(/assets/KaTeX_Main-Bold-Jm3AIy58.woff) format("woff"),url(/assets/KaTeX_Main-Bold-waoOVXN0.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2) format("woff2"),url(/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff) format("woff"),url(/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2) format("woff2"),url(/assets/KaTeX_Main-Italic-BMLOBm91.woff) format("woff"),url(/assets/KaTeX_Main-Italic-3WenGoN9.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Main-Regular-B22Nviop.woff2) format("woff2"),url(/assets/KaTeX_Main-Regular-Dr94JaBh.woff) format("woff"),url(/assets/KaTeX_Main-Regular-ypZvNtVU.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2) format("woff2"),url(/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff) format("woff"),url(/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/assets/KaTeX_Math-Italic-t53AETM-.woff2) format("woff2"),url(/assets/KaTeX_Math-Italic-DA0__PXp.woff) format("woff"),url(/assets/KaTeX_Math-Italic-flOr_0UB.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff) format("woff"),url(/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff) format("woff"),url(/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2) format("woff2"),url(/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff) format("woff"),url(/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Script-Regular-D3wIWfF6.woff2) format("woff2"),url(/assets/KaTeX_Script-Regular-D5yQViql.woff) format("woff"),url(/assets/KaTeX_Script-Regular-C5JkGWo-.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2) format("woff2"),url(/assets/KaTeX_Size1-Regular-C195tn64.woff) format("woff"),url(/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2) format("woff2"),url(/assets/KaTeX_Size2-Regular-oD1tc_U0.woff) format("woff"),url(/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/KaTeX_Size3-Regular-CTq5MqoE.woff) format("woff"),url(/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2) format("woff2"),url(/assets/KaTeX_Size4-Regular-BF-4gkZK.woff) format("woff"),url(/assets/KaTeX_Size4-Regular-DWFBv043.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2) format("woff2"),url(/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff) format("woff"),url(/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf) format("truetype")}.katex{font: 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.47"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}@font-face{font-family:LXGW WenKai ND;src:url(/assets/lxgw-nd-regular-CpMw9Ehg.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:LXGW WenKai ND;src:url(/assets/lxgw-nd-bold-DbRfiTgo.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Long Cang ND;src:url(/assets/longcang-regular-C0uvTuKa.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Caveat ND;src:url(/assets/caveat-nd-CP6HlsNg.woff2) format("woff2");font-weight:400 700;font-style:normal;font-display:swap}*{box-sizing:border-box}html,body,#root{margin:0;padding:0;height:100%;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;background:#f9f8f6;color:#3a2a18;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea,select{font-family:inherit;font-size:inherit;color:inherit}button{cursor:pointer;border:none;background:transparent;padding:0}a{color:inherit;text-decoration:none}.nd-composer textarea{caret-color:#a8362b}.nd-composer:focus-within{box-shadow:-2px 3px 4px #5d4a2c2e,-6px 13px 26px #5d4a2c38!important}::selection{background:#a8362b33}iframe{border:0}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#0000001f;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#0003}.nd-shimmer{background:linear-gradient(90deg,#4a4540,#4a4540 40%,#d97706,#4a4540 60%,#4a4540);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:nd-shimmer-sweep 2.4s linear infinite}@keyframes nd-shimmer-sweep{0%{background-position:200% 0}to{background-position:-200% 0}}.katex-display{margin:8px 0;overflow-x:auto;overflow-y:hidden;padding:2px 0}.katex-error{color:#b0554f;font-family:SF Mono,Cascadia Code,Menlo,monospace;font-size:11px}[data-board-pane]{user-select:none;-webkit-user-select:none}[data-board-pane] input,[data-board-pane] textarea,[data-board-pane] [contenteditable=true]{user-select:text;-webkit-user-select:text}
|