// ==UserScript== // @name LibTV Canvas Boost // @version 1.9.4 // @icon https://raw.githubusercontent.com/lonely814/Messy/refs/heads/main/libtv-boost/libtv-boost-icon.png // @license MIT // @author oocc00 // @description 性能优化 · G网格 T性能 H隐藏 L连线 C全链 F搜索 P提示词 X专注 R直角 ?帮助 · AI增强 · 标签 · 提示词模板 · 模板变量 · 主题(画布配色DIY) // @match *://*.iblib.tv/canvas* // @match *://*.liblib.tv/canvas* // @match https://www.liblib.tv/* // @run-at document-idle // @grant GM_registerMenuCommand // @grant unsafeWindow // ==/UserScript== (function(){ 'use strict'; /* ========================================================= * 1. CSS 注入 * ========================================================= */ var style = document.createElement('style'); style.id = 'libtv-boost-css'; style.textContent = [ /* 主题变量 */ ':root {', ' --accent: #6366f1;', ' --accent-light: #818cf8;', ' --accent-dark: #4f46e5;', ' --accent-rgb: 99,102,241;', ' --accent-light-rgb: 129,140,248;', ' --canvas-bg: #0f0f0f;', ' --grid-color: rgba(255,255,255,0.12);', ' --node-bg: #1a1a2e;', ' --border-color: rgba(255,255,255,0.12);', ' --edge-color: rgba(255,255,255,0.08);', '}', /* 节点卡片 — 玻璃质感 */ '.react-flow__node {', ' transition: all 0.25s ease !important;', ' border-radius: 14px !important;', ' background: rgba(255,255,255,0.02) !important;', ' backdrop-filter: blur(8px) !important;', ' -webkit-backdrop-filter: blur(8px) !important;', ' border: 1px solid rgba(255,255,255,0.06) !important;', ' box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.06) !important;', '}', '.react-flow__node:hover {', ' border-color: rgba(129,140,248,0.2) !important;', ' box-shadow: 0 4px 12px rgba(0,0,0,0.15), 0 0 0 1px rgba(129,140,248,0.08) !important;', '}', /* 选中节点 — 全息投影 + 浮起 */ '.react-flow__node.selected {', ' outline: none !important;', ' border-color: var(--accent, #6366f1) !important;', ' border-width: 1.5px !important;', ' box-shadow:', ' 0 0 0 2px rgba(255,255,255,0.3),', ' 0 0 0 4.5px var(--accent, #6366f1),', ' 0 0 20px var(--accent, #6366f1),', ' 0 0 60px rgba(var(--accent-rgb),0.3) !important;', '}', '.react-flow__node.selected::after {', ' content: ""; position: absolute;', ' inset: -1px; border-radius: 15px;', ' background: linear-gradient(135deg, rgba(255,255,255,0.08), transparent, rgba(var(--accent-light-rgb),0.05)) !important;', ' pointer-events: none; z-index: 0;', '}', /* 网格背景隐藏 */ '.react-flow__background.perf-no-grid { display: none !important; }', /* 隐藏连线 */ '.react-flow__edges.perf-hide-edges { display: none !important; }', /* 连线 — 渐变发光 */ '.react-flow__edge-path {', ' stroke: var(--edge-color, rgba(255,255,255,0.12)) !important;', ' stroke-width: 2 !important;', ' transition: stroke 0.2s, stroke-width 0.2s !important;', '}', '.react-flow__edge:hover .react-flow__edge-path {', ' stroke: var(--accent-light, #818cf8) !important;', ' stroke-width: 2.5 !important;', ' filter: drop-shadow(0 0 4px rgba(var(--accent-light-rgb),0.3)) !important;', '}', /* 链高亮 — 增强发光 */ 'body.libtv-chain .react-flow__edge.libtv-chain-edge .react-flow__edge-path {', ' stroke: var(--accent, #818cf8) !important;', ' stroke-width: 2.8 !important;', ' filter: drop-shadow(0 0 8px rgba(var(--accent-light-rgb),0.5)) !important;', '}', '.react-flow__edge.libtv-edge-active .react-flow__edge-path {', ' stroke: var(--strong, #818cf8) !important;', ' stroke-width: 2.5 !important;', '}', 'body.libtv-chain .react-flow__edge.libtv-chain-edge .react-flow__edge-path {', ' stroke: var(--accent, #818cf8) !important;', ' stroke-width: 2.5 !important;', ' filter: drop-shadow(0 0 6px rgba(var(--accent-light-rgb),0.6));', '}', 'body.perf-mode .react-flow__edge-path {', ' stroke-width: 0.8 !important;', ' transition: none !important;', ' filter: none !important;', '}', 'body.libtv-step-edges .react-flow__edge-path {', ' transition: none !important;', '}', /* 隐藏图片 */ 'body.perf-hide-imgs .react-flow__node img {', ' display: none !important;', '}', /* 性能模式 */ 'body.perf-mode .react-flow__node {', ' box-shadow: none !important; border-radius: 0 !important;', ' background: none !important;', ' backdrop-filter: none !important; -webkit-backdrop-filter: none !important;', ' border-color: rgba(255,255,255,0.06) !important;', ' opacity: 0.85;', ' transition: none !important;', ' animation: none !important;', '}', 'body.perf-mode .react-flow__node [class*="rounded"] { border-radius: 0 !important; }', 'body.perf-mode .react-flow__node:hover {', ' opacity: 1;', '}', 'body.perf-mode .react-flow {', ' backdrop-filter: none !important;', '}', 'body.perf-mode * {', ' animation-duration: 0s !important;', ' animation-delay: 0s !important;', ' transition-duration: 0s !important;', ' backdrop-filter: none !important;', '}', 'body.perf-mode #libtv-glow { display: none !important; }', /* FPS 面板 — 紧凑小药丸 */ '#libtv-fps {', ' position: fixed; right: 14px; bottom: 14px; z-index: 99999;', ' padding: 5px 12px; border-radius: 10px;', ' background: rgba(10,10,15,0.55); color: rgba(255,255,255,0.5);', ' font: 11px/1.5 -apple-system, "SF Mono", monospace;', ' user-select: none;', ' backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);', ' border: 1px solid rgba(255,255,255,0.06);', ' white-space: nowrap;', ' display: inline-flex; align-items: center; gap: 5px;', ' cursor: grab;', ' transition: all 0.2s ease;', ' box-shadow: 0 2px 12px rgba(0,0,0,0.2);', '}', '#libtv-fps:hover {', ' background: rgba(10,10,15,0.75);', ' border-color: rgba(129,140,248,0.15);', ' padding: 5px 14px;', ' box-shadow: 0 4px 16px rgba(0,0,0,0.3);', '}', '#libtv-fps:active { cursor: grabbing; }', '#libtv-fps .fps-val { color: #4ade80; font-weight: 600; }', '#libtv-fps .fps-flag { color: #fbbf24; }', '#libtv-fps .fps-sep { color: rgba(255,255,255,0.08); }', '#libtv-fps .fps-zoom { color: #818cf8; }', '#libtv-fps .fps-cnt { color: rgba(255,255,255,0.35); }', /* 快捷键提示 — 右下角卡片,悬停 FPS 面板出现 */ '#libtv-help {', ' position:fixed; right:14px; bottom:118px; z-index:99997;', ' max-width:260px; padding:10px 12px;', ' background:rgba(18,18,28,0.92);', ' border:1px solid rgba(129,140,248,0.25); border-radius:10px;', ' color:rgba(255,255,255,0.6);', ' font:11px/1.8 -apple-system,"SF Mono",monospace;', ' pointer-events:none; user-select:none;', ' white-space:pre-line; text-align:left;', ' box-shadow:0 8px 24px rgba(0,0,0,0.4);', ' transition: opacity 0.3s ease, transform 0.3s ease;', '}', '#libtv-help.libtv-hide {', ' opacity:0;', ' transform:translateY(8px);', ' pointer-events:none;', '}', /* 链高亮模式 */ 'body.libtv-chain .react-flow__node { opacity: 0.08 !important; }', 'body.libtv-chain .react-flow__node.selected,', 'body.libtv-chain .react-flow__node.libtv-chain-node', ' { opacity: 1 !important; }', 'body.libtv-chain .react-flow__edge { opacity: 0.03 !important; }', 'body.libtv-chain .react-flow__edge.libtv-chain-edge', ' { opacity: 0.6 !important; }', /* 专注模式 — 隐藏工具栏/侧栏/顶栏/头像等 */ 'body.libtv-focus [data-toolbar-collapsed],' + 'body.libtv-focus [data-sidebar-container],' + 'body.libtv-focus header,' + 'body.libtv-focus nav,' + 'body.libtv-focus aside {', ' display: none !important;', '}', /* 专注模式时放大画布区域 */ 'body.libtv-focus .react-flow {', ' width: 100vw !important;', ' height: 100vh !important;', ' max-width: none !important;', '}', /* 搜索框玻璃效果 */ '#libtv-search {', ' backdrop-filter: blur(20px) !important;', ' -webkit-backdrop-filter: blur(20px) !important;', ' border: 1px solid rgba(255,255,255,0.08) !important;', '}', /* 提示词面板 — 霓虹玻璃风格 */ '#libtv-prompt {', ' position:fixed; z-index:99999;', ' width:440px; max-width:88vw; max-height:68vh;', ' background:rgba(12,12,20,0.88);', ' backdrop-filter:blur(32px) saturate(1.4); -webkit-backdrop-filter:blur(32px) saturate(1.4);', ' border:1px solid rgba(129,140,248,0.25);', ' border-radius:16px; padding:0; overflow:hidden;', ' display:flex; flex-direction:column;', ' font:13px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; color:#d4d4d8;', ' animation:ltFadeIn .15s ease;', ' box-shadow:', ' 0 0 1px rgba(129,140,248,0.6),', ' 0 0 8px rgba(129,140,248,0.15),', ' 0 0 24px rgba(129,140,248,0.08),', ' 0 16px 48px rgba(0,0,0,0.5);', ' animation: libtv-panel-glow 4s ease-in-out infinite alternate;', '}', '@keyframes libtv-panel-glow {', ' 0% { border-color:rgba(129,140,248,0.2); box-shadow:0 0 1px rgba(129,140,248,0.5),0 0 8px rgba(129,140,248,0.1),0 0 20px rgba(129,140,248,0.05),0 16px 48px rgba(0,0,0,0.5); }', ' 100% { border-color:rgba(129,140,248,0.4); box-shadow:0 0 1px rgba(129,140,248,0.8),0 0 12px rgba(129,140,248,0.25),0 0 32px rgba(129,140,248,0.12),0 16px 48px rgba(0,0,0,0.5); }', '}', '#libtv-prompt::before {', ' content:""; position:absolute; top:-1px; left:20%; right:20%; height:1px;', ' background:linear-gradient(90deg,transparent,rgba(129,140,248,0.6),transparent);', ' pointer-events:none;', '}', '#libtv-prompt .ltp-head {', ' display:flex; align-items:center; justify-content:space-between;', ' padding:14px 18px 10px; border-bottom:1px solid rgba(129,140,248,0.12);', ' flex-shrink:0;', '}', '#libtv-prompt .ltp-head h3 { margin:0; font-size:13px; color:#e0e7ff; font-weight:600; letter-spacing:0.02em; text-shadow:0 0 12px rgba(129,140,248,0.4); }', '#libtv-prompt .ltp-close { cursor:pointer; font-size:16px; color:rgba(255,255,255,0.25); transition:all .15s; line-height:1; }', '#libtv-prompt .ltp-close:hover { color:#818cf8; text-shadow:0 0 8px rgba(129,140,248,0.5); }', '#libtv-prompt .ltp-tabs { display:flex; gap:0; padding:0 18px; border-bottom:1px solid rgba(129,140,248,0.12); flex-shrink:0; }', '#libtv-prompt .ltp-tab { padding:10px 16px; cursor:pointer; color:rgba(255,255,255,0.3); font-size:12px; border-bottom:1.5px solid transparent; transition:all .15s; letter-spacing:0.02em; user-select:none; }', '#libtv-prompt .ltp-tab:hover { color:rgba(224,231,255,0.7); }', '#libtv-prompt .ltp-tab.active { color:#818cf8; border-bottom-color:#818cf8; text-shadow:0 0 8px rgba(129,140,248,0.5); }', '#libtv-prompt .ltp-body { padding:14px 18px; overflow-y:auto; flex:1; max-height:42vh; position:relative; }', '#libtv-prompt .ltp-body textarea { width:100%; box-sizing:border-box; min-height:80px; padding:10px 12px; border-radius:10px; border:1px solid rgba(129,140,248,0.2); background:rgba(129,140,248,0.04); color:#e0e7ff; font:12px/1.5 ui-monospace,SFMono-Regular,monospace; outline:none; resize:vertical; transition:border-color .15s, box-shadow .15s; }', '#libtv-prompt .ltp-body textarea:focus { border-color:#818cf8; box-shadow:0 0 12px rgba(129,140,248,0.2); }', '#libtv-prompt .ltp-body input[type="text"],#libtv-prompt .ltp-body input[type="password"] { width:100%; box-sizing:border-box; padding:8px 12px; border-radius:8px; border:1px solid rgba(129,140,248,0.2); background:rgba(129,140,248,0.04); color:#e0e7ff; font:12px/1.5 ui-monospace,SFMono-Regular,monospace; outline:none; transition:border-color .15s, box-shadow .15s; }', '#libtv-prompt .ltp-body input:focus { border-color:#818cf8; box-shadow:0 0 12px rgba(129,140,248,0.2); }', '#libtv-prompt .ltp-btn { display:inline-flex; align-items:center; gap:5px; padding:6px 14px; border-radius:8px; border:none; cursor:pointer; font:12px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; transition:all .15s; }', '#libtv-prompt .ltp-btn-primary { background:linear-gradient(135deg,#6366f1,#818cf8); color:#fff; box-shadow:0 0 12px rgba(129,140,248,0.3); }', '#libtv-prompt .ltp-btn-primary:hover { background:linear-gradient(135deg,#818cf8,#a5b4fc); box-shadow:0 0 16px rgba(129,140,248,0.4); }', '#libtv-prompt .ltp-btn-sm { padding:4px 12px; font-size:11px; border-radius:6px; }', '#libtv-prompt .ltp-btn-danger { background:rgba(239,68,68,0.12); color:#f87171; }', '#libtv-prompt .ltp-btn-danger:hover { background:rgba(239,68,68,0.22); }', '#libtv-prompt .ltp-btn-ghost { background:rgba(255,255,255,0.04); color:#aaa; }', '#libtv-prompt .ltp-btn-ghost:hover { background:rgba(255,255,255,0.08); color:#fff; }', '#libtv-prompt .ltp-cat { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:12px; }', '#libtv-prompt .ltp-cat-btn { padding:3px 12px; border-radius:14px; border:1px solid rgba(129,140,248,0.2); cursor:pointer; font:11px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; color:rgba(255,255,255,0.4); background:transparent; transition:all .15s; }', '#libtv-prompt .ltp-cat-btn:hover { border-color:rgba(129,140,248,0.4); color:#818cf8; }', '#libtv-prompt .ltp-cat-btn.active { background:rgba(129,140,248,0.2); border-color:#818cf8; color:#a5b4fc; box-shadow:0 0 8px rgba(129,140,248,0.2); }', '#libtv-prompt .ltp-item { display:flex; align-items:center; justify-content:space-between; padding:7px 10px; border-radius:8px; cursor:pointer; transition:background .12s; position:relative; overflow:hidden; }', '#libtv-prompt .ltp-item::before { content:""; position:absolute; inset:0; border-radius:8px; opacity:0; transition:opacity .25s; background:radial-gradient(300px circle at var(--mx,50%) var(--my,50%),rgba(129,140,248,0.18),transparent 55%); pointer-events:none; }', '#libtv-prompt .ltp-item:hover::before { opacity:1; }', '#libtv-prompt .ltp-item:hover { background:rgba(255,255,255,0.04); }', '#libtv-prompt .ltp-item .ltp-name { font-size:12px; color:#c7d2fe; flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }', '#libtv-prompt .ltp-item .ltp-actions { display:flex; gap:4px; opacity:0; transition:opacity .15s; }', '#libtv-prompt .ltp-item:hover .ltp-actions { opacity:1; }', '#libtv-prompt .ltp-item .ltp-preview { font-size:11px; color:rgba(255,255,255,0.25); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }', '#libtv-prompt .ltp-status { font-size:11px; color:rgba(255,255,255,0.3); margin-top:6px; }', '#libtv-prompt .ltp-empty { text-align:center; padding:30px 0; color:rgba(255,255,255,0.2); font-size:13px; }', /* 模板变量填充弹窗 */ '#libtv-prompt .ltp-var-overlay { position:absolute; inset:0; z-index:10; background:rgba(8,8,16,0.94); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); display:flex; flex-direction:column; padding:16px 18px; border-radius:12px; border:1px solid rgba(129,140,248,0.15); }', '#libtv-prompt .ltp-var-title { font-size:13px; color:#fff; font-weight:600; margin-bottom:10px; }', '#libtv-prompt .ltp-var-sub { font-size:11px; color:rgba(255,255,255,0.25); margin-bottom:12px; padding-bottom:10px; border-bottom:1px solid rgba(255,255,255,0.06); }', '#libtv-prompt .ltp-var-row { margin-bottom:8px; display:flex; align-items:center; gap:8px; }', '#libtv-prompt .ltp-var-row label { font-size:11px; color:rgba(255,255,255,0.4); min-width:64px; flex-shrink:0; text-align:right; }', '#libtv-prompt .ltp-var-row input { flex:1; padding:6px 10px; border-radius:6px; border:1px solid rgba(129,140,248,0.2); background:rgba(129,140,248,0.04); color:#e0e7ff; font:12px/1.4 ui-monospace,SFMono-Regular,monospace; outline:none; transition:border-color .15s, box-shadow .15s; }', '#libtv-prompt .ltp-var-row input:focus { border-color:#818cf8; box-shadow:0 0 8px rgba(129,140,248,0.2); }', '#libtv-prompt .ltp-var-preview { margin-top:8px; padding:8px 10px; border-radius:6px; background:rgba(255,255,255,0.03); font-size:11px; color:rgba(255,255,255,0.3); white-space:pre-wrap; word-break:break-all; max-height:80px; overflow-y:auto; flex-shrink:0; }', '#libtv-prompt .ltp-var-actions { display:flex; gap:6px; margin-top:auto; padding-top:10px; justify-content:flex-end; border-top:1px solid rgba(255,255,255,0.06); }', /* 调色板 */ '.ltp-pal-section { margin-bottom:14px; }', '.ltp-pal-section-title { font-size:11px; color:rgba(255,255,255,0.35); letter-spacing:0.05em; margin-bottom:8px; cursor:pointer; display:flex; align-items:center; gap:6px; user-select:none; }', '.ltp-pal-section-title::before { content:"▸"; font-size:9px; transition:transform .15s; }', '.ltp-pal-section-title.open::before { transform:rotate(90deg); }', '.ltp-pal-section-body { display:grid; grid-template-columns:repeat(auto-fill,minmax(32px,1fr)); gap:6px; }', '.ltp-pal-section-body.collapsed { display:none; }', '.ltp-pal-swatch { width:32px; height:32px; border-radius:6px; cursor:pointer; border:2px solid transparent; transition:all .15s; position:relative; }', '.ltp-pal-swatch:hover { transform:scale(1.15); border-color:rgba(255,255,255,0.4); z-index:1; }', '.ltp-pal-swatch.copied { border-color:#22c55e !important; }', '.ltp-pal-swatch .ltp-pal-tip { position:absolute; bottom:calc(100% + 4px); left:50%; transform:translateX(-50%); background:rgba(0,0,0,0.85); color:#fff; font-size:10px; padding:2px 6px; border-radius:4px; white-space:nowrap; opacity:0; pointer-events:none; transition:opacity .15s; }', '.ltp-pal-swatch:hover .ltp-pal-tip { opacity:1; }', '.ltp-pal-picker { display:flex; align-items:center; gap:12px; margin-bottom:16px; padding:12px; border-radius:10px; background:rgba(255,255,255,0.03); border:1px solid rgba(129,140,248,0.12); }', '.ltp-pal-picker input[type="color"] { width:48px; height:48px; border:none; border-radius:8px; cursor:pointer; background:none; padding:0; }', '.ltp-pal-picker input[type="color"]::-webkit-color-swatch-wrapper { padding:0; }', '.ltp-pal-picker input[type="color"]::-webkit-color-swatch { border-radius:8px; border:2px solid rgba(255,255,255,0.1); }', '.ltp-pal-info { flex:1; }', '.ltp-pal-hex { font-size:16px; font-weight:600; color:#e0e7ff; cursor:pointer; letter-spacing:0.03em; }', '.ltp-pal-hex:hover { color:#a5b4fc; }', '.ltp-pal-rgb, .ltp-pal-hsl { font-size:11px; color:rgba(255,255,255,0.35); margin-top:2px; cursor:pointer; }', '.ltp-pal-rgb:hover, .ltp-pal-hsl:hover { color:rgba(255,255,255,0.6); }', '.ltp-pal-ai { display:flex; gap:6px; align-items:center; margin-top:10px; padding:8px 10px; border-radius:8px; background:rgba(129,140,248,0.08); border:1px solid rgba(129,140,248,0.15); }', '.ltp-pal-ai-desc { flex:1; font-size:11px; color:rgba(255,255,255,0.5); line-height:1.5; }', '.ltp-pal-recent { display:flex; gap:4px; flex-wrap:wrap; margin-top:12px; }', '.ltp-pal-recent-title { width:100%; font-size:11px; color:rgba(255,255,255,0.3); margin-bottom:4px; }', '.ltp-pal-toast { position:fixed; bottom:30px; left:50%; transform:translateX(-50%); background:rgba(129,140,248,0.9); color:#fff; font-size:12px; padding:6px 16px; border-radius:8px; z-index:999999; pointer-events:none; opacity:0; transition:opacity .2s; }', '.ltp-pal-toast.show { opacity:1; }', /* 提示词悬浮按钮 */ '#libtv-pbtn {', ' transition: transform 0.2s ease !important;', ' background: #000 !important;', ' border: none !important;', ' box-shadow:', ' inset 0 0 8px #fff,', ' inset 3px 0 10px #f0f,', ' inset -3px 0 10px #0ff,', ' inset 3px 0 30px #f0f,', ' inset -3px 0 30px #0ff,', ' 0 0 8px #fff,', ' -2px 0 10px #f0f,', ' 2px 0 10px #0ff !important;', ' animation: libtv-pbtn-glow 3s ease-in-out infinite alternate !important;', '}', '@keyframes libtv-pbtn-glow {', ' 0% { box-shadow: inset 0 0 6px #fff, inset 2px 0 8px #f0f, inset -2px 0 8px #0ff, inset 2px 0 20px #f0f, inset -2px 0 20px #0ff, 0 0 6px #fff, -1px 0 8px #f0f, 1px 0 8px #0ff !important; }', ' 100% { box-shadow: inset 0 0 12px #fff, inset 4px 0 14px #f0f, inset -4px 0 14px #0ff, inset 4px 0 40px #f0f, inset -4px 0 40px #0ff, 0 0 12px #fff, -3px 0 14px #f0f, 3px 0 14px #0ff !important; }', '}', '.lt-tag-icon {', ' background:rgba(18,18,28,0.6) !important;', ' border:1px solid rgba(129,140,248,0.4);', ' color:#c7d2fe;', ' opacity:0.8;', ' box-shadow:0 1px 6px rgba(129,140,248,0.25);', ' transition:opacity 0.15s,box-shadow 0.15s,transform 0.15s,background 0.15s;', '}', '.lt-tag-icon:hover {', ' opacity:1 !important;', ' color:#fff;', ' background:rgba(129,140,248,0.18) !important;', ' border-color:rgba(129,140,248,0.7);', ' box-shadow:0 2px 10px rgba(129,140,248,0.45);', ' transform:scale(1.06);', '}', '#libtv-pbtn:hover {', ' transform: scale(1.08) !important;', '}', '#libtv-pbtn:active {', ' cursor: grabbing !important;', ' transform: scale(0.94) !important;', '}', /* 画布主题覆盖 — 仅覆盖节点/连线的颜色,不动画布背景(保留站点原生网格) */ '.react-flow__node { background: var(--node-bg) !important; border-color: var(--border-color) !important; }', '.react-flow__edge-path { stroke: var(--edge-color) !important; }', /* 标签系统 · 四层结构 */ '.lt-tag-menu { position:fixed; z-index:100000; width:520px; animation:ltFadeIn .15s ease; max-height:250px; min-width:240px; min-height:160px; background:rgba(15,15,20,0.94); backdrop-filter:blur(24px) saturate(1.3); -webkit-backdrop-filter:blur(24px) saturate(1.3); border:1px solid rgba(129,140,248,0.25); border-radius:12px; overflow:hidden; display:flex; flex-direction:column; box-shadow:0 8px 32px rgba(0,0,0,0.6),0 0 0 1px rgba(129,140,248,0.1),0 0 20px rgba(129,140,248,0.12); resize:none; }', '.lt-tag-resize { position:absolute; right:0; bottom:0; width:18px; height:18px; cursor:nwse-resize; display:flex; align-items:flex-end; justify-content:flex-end; z-index:5; touch-action:none; }', '.lt-tag-resize::after { content:""; width:9px; height:9px; margin:0 3px 3px 0; border-right:2px solid rgba(199,210,254,0.45); border-bottom:2px solid rgba(199,210,254,0.45); border-bottom-right-radius:3px; }', '.lt-tag-resize:hover::after { border-color:#818cf8; }', '.lt-tag-header { display:flex; align-items:center; gap:6px; padding:9px 10px; border-bottom:1px solid rgba(129,140,248,0.12); flex-shrink:0; }', '.lt-tag-lib { flex:0 0 auto; max-width:112px; background:rgba(129,140,248,0.1); border:1px solid rgba(129,140,248,0.2); color:#c7d2fe; border-radius:6px; padding:4px 6px; font-size:11px; outline:none; cursor:pointer; }', '.lt-tag-search { flex:1; min-width:0; background:rgba(255,255,255,0.05); border:1px solid rgba(129,140,248,0.15); color:#e0e7ff; border-radius:6px; padding:5px 8px; font-size:11px; outline:none; transition:border-color .12s; }', '.lt-tag-search:focus { border-color:#818cf8; }', '.lt-tag-refresh,.lt-tag-close { flex:0 0 auto; width:24px; height:24px; border:none; border-radius:6px; background:rgba(129,140,248,0.1); color:rgba(255,255,255,0.5); cursor:pointer; font-size:13px; line-height:1; display:flex; align-items:center; justify-content:center; transition:all .12s; }', '.lt-tag-refresh:hover,.lt-tag-close:hover { background:rgba(129,140,248,0.25); color:#fff; }', '.lt-tag-tabs { display:flex; align-items:center; gap:2px; padding:6px 8px 0; border-bottom:1px solid rgba(129,140,248,0.1); flex-shrink:0; overflow-x:auto; }', '.lt-tag-tab { padding:6px 10px 8px; cursor:pointer; font-size:11px; color:rgba(255,255,255,0.4); border-bottom:2px solid transparent; transition:all .15s; user-select:none; white-space:nowrap; }', '.lt-tag-tab:hover { color:rgba(224,231,255,0.75); }', '.lt-tag-tab.active { color:#818cf8; border-bottom-color:#818cf8; text-shadow:0 0 8px rgba(129,140,248,0.5); }', '.lt-tag-add { margin-left:auto; flex:0 0 auto; width:22px; height:22px; border-radius:6px; background:rgba(129,140,248,0.1); color:rgba(255,255,255,0.5); cursor:pointer; font-size:14px; line-height:22px; text-align:center; transition:all .12s; }', '.lt-tag-add:hover { background:rgba(129,140,248,0.25); color:#fff; }', '.lt-tag-content { flex:1; overflow-y:auto; padding:8px 10px 12px; }', '.lt-tag-recent { margin-bottom:8px; }', '.lt-tag-recent-head,.lt-tag-ins-head { font-size:11px; color:rgba(255,255,255,0.45); margin:2px 2px 6px; display:flex; align-items:center; justify-content:space-between; }', '.lt-rec-clear,.lt-ins-clear { color:rgba(255,255,255,0.3); cursor:pointer; font-size:10px; padding:1px 6px; border-radius:4px; }', '.lt-rec-clear:hover,.lt-ins-clear:hover { color:#f87171; background:rgba(239,68,68,0.12); }', '.lt-tag-group { margin-bottom:8px; border:1px solid rgba(129,140,248,0.1); border-radius:8px; overflow:hidden; background:rgba(129,140,248,0.03); }', '.lt-tag-group-head { display:flex; align-items:center; justify-content:space-between; padding:7px 10px; cursor:pointer; user-select:none; background:rgba(129,140,248,0.06); }', '.lt-tag-group-head:hover { background:rgba(129,140,248,0.12); }', '.lt-tag-group-name { font-size:11px; color:#c7d2fe; font-weight:600; letter-spacing:0.02em; }', '.lt-tag-group-actions { display:flex; align-items:center; gap:8px; }', '.lt-tag-add-item { width:18px; height:18px; border-radius:4px; background:rgba(129,140,248,0.15); color:#c7d2fe; cursor:pointer; font-size:13px; line-height:18px; text-align:center; transition:all .12s; }', '.lt-tag-add-item:hover { background:#818cf8; color:#fff; }', '.lt-tag-arrow { font-size:10px; color:rgba(255,255,255,0.4); transition:transform .15s; }', '.lt-tag-arrow.open { transform:rotate(0deg); }', '.lt-tag-arrow:not(.open) { transform:rotate(-90deg); }', '.lt-tag-group-head-static { padding:6px 10px; font-size:11px; color:#c7d2fe; font-weight:600; border-bottom:1px solid rgba(129,140,248,0.08); }', '.lt-tag-grid { display:flex; flex-wrap:wrap; align-content:flex-start; gap:6px; padding:8px; }', '.lt-tag-item { padding:5px 11px; border-radius:16px; font-size:11px; color:rgba(255,255,255,0.78); background:rgba(129,140,248,0.1); border:1px solid rgba(129,140,248,0.14); cursor:pointer; transition:all .12s; user-select:none; line-height:1.4; }', '.lt-tag-item:hover { background:rgba(129,140,248,0.28); color:#fff; border-color:rgba(129,140,248,0.4); box-shadow:0 0 10px rgba(129,140,248,0.25); transform:translateY(-1px); }', '.lt-tag-add-group-wrap { text-align:center; margin-top:6px; }', '.lt-tag-add-group { display:inline-block; padding:5px 14px; border-radius:8px; background:rgba(129,140,248,0.08); border:1px dashed rgba(129,140,248,0.3); color:rgba(199,210,254,0.7); font-size:11px; cursor:pointer; transition:all .12s; }', '.lt-tag-add-group:hover { background:rgba(129,140,248,0.2); color:#fff; }', '.lt-tag-empty,.lt-tag-search-hint { font-size:11px; color:rgba(255,255,255,0.4); padding:10px 4px; text-align:center; }', /* 管理面板 */ '.lt-mgr-overlay { position:fixed; inset:0; z-index:100001; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,0.5); backdrop-filter:blur(4px); }', '.lt-mgr-panel { width:400px; max-width:88vw; max-height:70vh; background:rgba(15,15,20,0.95); backdrop-filter:blur(32px) saturate(1.3); -webkit-backdrop-filter:blur(32px) saturate(1.3); border:1px solid rgba(129,140,248,0.2); border-radius:14px; display:flex; flex-direction:column; overflow:hidden; box-shadow:0 16px 48px rgba(0,0,0,0.6); }', '.lt-mgr-head { display:flex; align-items:center; justify-content:space-between; padding:14px 16px 10px; border-bottom:1px solid rgba(129,140,248,0.1); font-size:13px; color:#e0e7ff; font-weight:600; flex-shrink:0; }', '.lt-mgr-body { flex:1; overflow-y:auto; padding:12px 16px; }', '.lt-mgr-foot { padding:10px 16px 14px; border-top:1px solid rgba(129,140,248,0.08); flex-shrink:0; }', '.lt-mgr-group { margin-bottom:14px; border:1px solid rgba(129,140,248,0.1); border-radius:8px; padding:10px 12px; background:rgba(129,140,248,0.03); }', '.lt-mgr-ghead { display:flex; align-items:center; gap:8px; margin-bottom:8px; }', '.lt-mgr-gname { flex:1; background:rgba(255,255,255,0.04); border:1px solid rgba(129,140,248,0.12); border-radius:5px; padding:4px 8px; font:12px/1.5 -apple-system,sans-serif; color:#d4d4d8; outline:none; transition:border-color .12s; }', '.lt-mgr-gname:focus { border-color:#818cf8; }', '.lt-tag-delg { background:none; border:none; color:rgba(239,68,68,0.5); cursor:pointer; font-size:10px; padding:2px 6px; border-radius:4px; transition:all .12s; }', '.lt-tag-delg:hover { background:rgba(239,68,68,0.15); color:#f87171; }', '.lt-mgr-item { display:flex; align-items:center; gap:6px; margin:4px 0; }', '.lt-mgr-itext { flex:1; background:rgba(255,255,255,0.04); border:1px solid rgba(129,140,248,0.1); border-radius:4px; padding:3px 8px; font:11px/1.5 -apple-system,sans-serif; color:#d4d4d8; outline:none; }', '.lt-mgr-itext:focus { border-color:#818cf8; }', '.lt-tag-deli { background:none; border:none; color:rgba(239,68,68,0.4); cursor:pointer; font-size:9px; padding:2px 4px; border-radius:3px; }', '.lt-tag-deli:hover { background:rgba(239,68,68,0.12); color:#f87171; }', '.lt-mgr-add-item { margin-top:4px; }', '/* 毛玻璃 - 节点浮动面板 */', '.react-flow__nodes .node-floating-ui > div.bg-panel-background {', ' background-color: rgba(38, 38, 38, 0.55) !important;', ' backdrop-filter: blur(20px) !important;', ' -webkit-backdrop-filter: blur(20px) !important;', ' border: 1px solid rgba(255, 255, 255, 0.08) !important;', '}', '/* 毛玻璃 - 底部导航栏 */', 'div[class*="b768:bottom-3"] {', ' background-color: rgba(38, 38, 38, 0.55) !important;', ' backdrop-filter: blur(20px) !important;', ' -webkit-backdrop-filter: blur(20px) !important;', ' border: 1px solid rgba(255, 255, 255, 0.08) !important;', '}', '/* 隐藏青色"会员超市"按钮 */', 'button[aria-label="会员超市"],', 'button[class*="text-[#05A3C5]"] {', ' display: none !important;', '}', '/* 隐藏Mantine图标按钮 */', '#mantine-y9su9myak-target {', ' display: none !important;', '}', '/* 隐藏额外的Mantine图标按钮 */', '#mantine-44x1mzccr-target {', ' display: none !important;', '}', '/* 隐藏"限时40折"徽章 */', '[class*="bg-[#FAD6A4]"] {', ' display: none !important;', '}', '/* 隐藏导航栏右侧文字div */', 'div[class*="border-"][class*="topnav-btn-border"] > div.relative:first-child > div.relative:last-child {', ' display: none !important;', '}', '/* 画布背景:网格参考线 + 中心暖色辉光 */', '.react-flow__pane {', ' background-image: ', ' radial-gradient(ellipse at 50% 50%, rgba(255, 180, 80, 0.06) 0%, rgba(var(--accent-light-rgb, 129, 140, 248), 0.04) 15%, rgba(255, 140, 50, 0.02) 30%, transparent 60%),', ' repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.012) 0px, rgba(255, 255, 255, 0.012) 1px, transparent 1px, transparent 40px),', ' repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.012) 0px, rgba(255, 255, 255, 0.012) 1px, transparent 1px, transparent 40px) !important;', ' background-color: transparent !important;', '}', /* ===== 隐藏干扰元素 ===== */ 'header.m_3b16f56b > div.relative:first-child {', ' display: none !important;', '}', 'button[aria-label="会员超市"], button[class*="text-[#05A3C5]"] {', ' display: none !important;', '}', '[class*="bg-[#FAD6A4]"] {', ' display: none !important;', '}', '#mantine-ycmieh2cx-target,', '#mantine-cdb8qursd-target,', 'button[aria-label="帮助信息"] {', ' display: none !important;', '}', /* 主 Banner / 横向轮播 / AI输入区 / TV Show 区域 / 底部滚动按钮 */ 'div.b1280\\:max-w-\\[1440px\\] > div.block,', 'div.b1280\\:max-w-\\[1440px\\] > div.hidden,', 'div.b1280\\:max-w-\\[1440px\\] > div.mx-auto,', 'div.b1280\\:max-w-\\[1440px\\] > div.mt-10,', 'div.b1280\\:max-w-\\[1440px\\] > button.border-border-default {', ' display: none !important;', '}', /* ===== 首页-个人最近项目 ===== */ 'div.b768\\:mb-8:nth-of-type(4) {', ' width: 100% !important;', ' max-width: 1200px !important;', ' height: auto !important;', ' margin: 48px auto !important;', ' padding: 0 24px !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) > div.b768\\:mb-4 {', ' margin-bottom: 28px !important;', ' padding: 0 4px !important;', ' display: flex !important;', ' visibility: visible !important;', ' opacity: 1 !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) > div.b768\\:mb-4 div.b768\\:text-\\[18px\\] {', ' font-size: 22px !important;', ' font-weight: 600 !important;', ' letter-spacing: 0.3px !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.scrollbar-hide {', ' display: grid !important;', ' grid-template-columns: repeat(3, 1fr) !important;', ' gap: 24px !important;', ' width: 100% !important;', ' height: auto !important;', ' min-width: 0 !important;', '}', '/* 开始创作卡片 */', 'div.b768\\:mb-8:nth-of-type(4) div.aspect-video,', 'div.b768\\:mb-8:nth-of-type(4) div.aspect-video > div.cursor-pointer {', ' width: 100% !important;', ' height: 320px !important;', ' max-width: 100% !important;', ' min-width: 0 !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.create-new-project-card {', ' width: 100% !important;', ' height: 100% !important;', ' background-color: rgba(38, 38, 38, 0.4) !important;', ' border: 2px dashed rgba(255, 255, 255, 0.12) !important;', ' border-radius: 16px !important;', ' gap: 16px !important;', ' transition: all 0.3s ease !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.create-new-project-card:hover {', ' background-color: rgba(38, 38, 38, 0.65) !important;', ' border-color: rgba(255, 255, 255, 0.25) !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.create-new-project-card div.text-fg-default {', ' font-size: 16px !important;', ' color: rgba(255, 255, 255, 0.7) !important;', ' text-align: center !important;', ' width: auto !important;', '}', '/* 项目卡片 */', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto {', ' width: 100% !important;', ' height: 320px !important;', ' max-width: 100% !important;', ' min-width: 0 !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group {', ' width: 100% !important;', ' height: 100% !important;', ' border-radius: 16px !important;', ' overflow: hidden !important;', ' background-color: #1e1e1e !important;', ' border: 1px solid rgba(255, 255, 255, 0.06) !important;', ' transition: transform 0.3s ease, box-shadow 0.3s ease !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group:hover {', ' transform: translateY(-4px) !important;', ' box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5) !important;', '}', '/* 封面 */', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group > div:nth-of-type(1),', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.rounded-xl,', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.rounded-xl div.relative {', ' width: 100% !important;', ' height: 210px !important;', ' border-radius: 0 !important;', '}', '/* 底部信息 */', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.items-top {', ' width: 100% !important;', ' height: 110px !important;', ' padding: 16px !important;', ' flex-direction: column !important;', ' align-items: flex-start !important;', ' gap: 8px !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.items-top div.max-w-\\[calc\\(100\\%-34px\\)\\] {', ' width: 100% !important;', ' max-width: 100% !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.items-top p.text-fg-default {', ' font-size: 15px !important;', ' font-weight: 500 !important;', ' line-height: 1.4 !important;', ' color: #f0f0f0 !important;', ' display: -webkit-box !important;', ' -webkit-line-clamp: 2 !important;', ' -webkit-box-orient: vertical !important;', ' overflow: hidden !important;', '}', 'div.b768\\:mb-8:nth-of-type(4) div.md\\:w-auto div.group div.items-top p.text-xs {', ' font-size: 13px !important;', ' color: #888 !important;', '}', /* ===== 全部项目 - 容器 ===== */ 'div.b768\\:px-\\[10px\\] > div.mx-auto {', ' max-width: 1800px !important;', ' padding: 0 24px !important;', ' margin: 0 auto !important;', '}', '/* 面包屑导航 */', 'div.b768\\:px-\\[10px\\] > div.mx-auto > div.mb-6 {', ' margin: 28px 0 24px 0 !important;', ' justify-content: space-between !important;', ' align-items: center !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto > div.mb-6 div.text-base {', ' font-size: 24px !important;', ' font-weight: 600 !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto > div.mb-6 button.bg-btn-secondary {', ' background-color: rgba(255, 255, 255, 0.08) !important;', ' border: 1px solid rgba(255, 255, 255, 0.12) !important;', ' padding: 4px 16px !important;', ' border-radius: 8px !important;', '}', '/* 网格 */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 {', ' display: grid !important;', ' grid-template-columns: repeat(6, 1fr) !important;', ' gap: 16px !important;', ' width: 100% !important;', ' height: auto !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto input.hidden {', ' display: none !important;', '}', '/* "最近项目" 分区标题 */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3::before {', ' content: \'最近项目\' !important;', ' grid-column: 1 / -1 !important;', ' display: block !important;', ' font-size: 18px !important;', ' font-weight: 600 !important;', ' color: rgba(255, 255, 255, 0.9) !important;', ' padding: 4px 0 !important;', ' margin-bottom: 4px !important;', '}', '/* 开始创作卡片 - 280px */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.aspect-video {', ' width: 100% !important;', ' min-width: 0 !important;', ' height: 280px !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.create-new-project-card {', ' width: 100% !important;', ' height: 280px !important;', ' background-color: rgba(38, 38, 38, 0.4) !important;', ' border: 2px dashed rgba(255, 255, 255, 0.12) !important;', ' border-radius: 16px !important;', ' gap: 8px !important;', ' transition: all 0.3s ease !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.create-new-project-card:hover {', ' background-color: rgba(38, 38, 38, 0.65) !important;', ' border-color: rgba(255, 255, 255, 0.25) !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.create-new-project-card div.text-fg-default {', ' font-size: 16px !important;', ' text-align: center !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.create-new-project-card svg,', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.create-new-project-card div.py-2\\.5 p {', ' display: block !important;', '}', '/* 项目卡片 - 280px */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group {', ' border-radius: 16px !important;', ' overflow: hidden !important;', ' background-color: #1a1a1a !important;', ' border: 1px solid rgba(255, 255, 255, 0.06) !important;', ' transition: transform 0.25s ease, box-shadow 0.25s ease !important;', ' width: 100% !important;', ' min-width: 0 !important;', ' height: 280px !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group:hover {', ' transform: translateY(-3px) !important;', ' box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5) !important;', '}', '/* 封面 - 170px */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group > div:nth-of-type(1) {', ' width: 100% !important;', ' height: 170px !important;', ' overflow: hidden !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group div.aspect-video {', ' width: 100% !important;', ' height: 170px !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group img {', ' width: 100% !important;', ' height: 100% !important;', ' object-fit: cover !important;', '}', '/* 底部信息 - 110px */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group div.items-top {', ' width: 100% !important;', ' padding: 14px 16px !important;', ' height: 110px !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group div.items-top p.text-fg-default {', ' font-size: 13px !important;', ' font-weight: 500 !important;', ' color: #eee !important;', ' line-height: 1.3 !important;', ' white-space: nowrap !important;', ' overflow: hidden !important;', ' text-overflow: ellipsis !important;', ' display: -webkit-box !important;', ' -webkit-line-clamp: 2 !important;', ' -webkit-box-orient: vertical !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group div.items-top p.text-xs {', ' font-size: 11px !important;', ' color: #888 !important;', '}', '/* 分割线 + "所有项目" 标题 */', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group:nth-of-type(12) {', ' position: relative !important;', '}', 'div.b768\\:px-\\[10px\\] > div.mx-auto div.b768\\:grid-cols-3 > div.group:nth-of-type(12)::after {', ' content: \'所有项目\' !important;', ' position: absolute !important;', ' bottom: -52px !important;', ' left: -1200% !important;', ' width: 5000px !important;', ' padding-top: 28px !important;', ' font-size: 18px !important;', ' font-weight: 600 !important;', ' color: rgba(255, 255, 255, 0.9) !important;', ' border-top: 1px solid rgba(255, 255, 255, 0.10) !important;', ' pointer-events: none !important;', '}', '/* ⚙ 设置面板 */', '.lt-settings { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); animation:ltFadeIn .15s ease; z-index:100002; width:440px; max-width:90vw; max-height:80vh; background:rgba(15,15,20,0.96); backdrop-filter:blur(32px) saturate(1.3); -webkit-backdrop-filter:blur(32px) saturate(1.3); border:1px solid rgba(129,140,248,0.2); border-radius:14px; display:flex; flex-direction:column; overflow:hidden; box-shadow:0 16px 48px rgba(0,0,0,0.6); }', '.lt-settings-head { display:flex; align-items:center; justify-content:space-between; padding:16px 18px 10px; border-bottom:1px solid rgba(129,140,248,0.1); font-size:14px; color:#e0e7ff; font-weight:600; flex-shrink:0; letter-spacing:0.02em; }', '.lt-settings-close { cursor:pointer; font-size:16px; color:rgba(255,255,255,0.2); transition:color .15s; line-height:1; }', '.lt-settings-close:hover { color:#818cf8; }', '.lt-settings-body { flex:1; overflow-y:auto; padding:4px 18px 18px; }', '.lt-settings-sec { margin-top:16px; }', '.lt-settings-stitle { font-size:11px; color:rgba(129,140,248,0.5); margin-bottom:8px; letter-spacing:0.04em; text-transform:uppercase; }', '.lt-settings-toggle { display:flex; align-items:center; justify-content:space-between; padding:8px 0; cursor:pointer; border-bottom:1px solid rgba(255,255,255,0.03); }', '.lt-settings-toggle span:first-child { font-size:13px; color:rgba(255,255,255,0.55); }', '.lt-settings-switch { width:36px; height:20px; border-radius:10px; background:rgba(255,255,255,0.1); position:relative; transition:background .2s; flex-shrink:0; }', '.lt-settings-switch::after { content:\'\'; position:absolute; top:2px; left:2px; width:16px; height:16px; border-radius:50%; background:#fff; transition:transform .2s; }', '.lt-settings-switch.on { background:#818cf8; }', '.lt-settings-switch.on::after { transform:translateX(16px); }', '.lt-settings-row { display:flex; align-items:center; gap:8px; margin-bottom:6px; }', '.lt-settings-row label { font-size:11px; color:rgba(255,255,255,0.3); min-width:60px; flex-shrink:0; }', '.lt-settings-inp { flex:1; background:rgba(255,255,255,0.04); border:1px solid rgba(129,140,248,0.12); border-radius:6px; padding:7px 10px; font:12px/1.4 -apple-system,sans-serif; color:#d4d4d8; outline:none; transition:border-color .12s; }', '.lt-settings-inp:focus { border-color:#818cf8; }', '.lt-settings-status { font-size:11px; color:rgba(74,222,128,0.7); margin-left:8px; }', '.lt-settings-dlist { margin-bottom:8px; }', '.lt-settings-ditem { display:flex; align-items:center; gap:6px; padding:5px 0; border-bottom:1px solid rgba(255,255,255,0.02); font-size:11px; }', '.lt-settings-ditem span:first-child { flex:1; color:rgba(255,255,255,0.35); }', '.lt-settings-ditem span:nth-child(2) { color:rgba(255,255,255,0.15); min-width:40px; text-align:right; }', '.lt-settings-dclear { background:none; border:none; color:rgba(239,68,68,0.4); cursor:pointer; font-size:10px; padding:1px 6px; border-radius:3px; transition:all .12s; }', '.lt-settings-dclear:hover { background:rgba(239,68,68,0.12); color:#f87171; }', '.lt-settings-about { font-size:11px; color:rgba(255,255,255,0.2); line-height:1.6; margin-top:4px; }', '.lt-settings-cpbtns { display:flex; gap:6px; margin-top:8px; }', /* 面板打开时画布压暗 */ 'body:has(#libtv-prompt) .react-flow__renderer, body:has(#lt-settings) .react-flow__renderer {', ' transition: filter 0.3s ease;', ' filter: brightness(0.7) saturate(0.5);', '}', 'body:has(#libtv-prompt) .react-flow__background, body:has(#lt-settings) .react-flow__background {', ' opacity: 0.3; transition: opacity 0.3s ease;', '}', '.lt-settings-btn { display:inline-flex; align-items:center; gap:4px; padding:6px 12px; border-radius:7px; border:none; cursor:pointer; font:12px/1.4 -apple-system,sans-serif; transition:all .15s; }', '.lt-settings-btn-primary { background:#6366f1; color:#fff; }', '.lt-settings-btn-primary:hover { background:#818cf8; }', '.lt-settings-btn-ghost { background:rgba(255,255,255,0.05); color:rgba(255,255,255,0.55); border:1px solid rgba(255,255,255,0.06); }', '.lt-settings-btn-ghost:hover { background:rgba(255,255,255,0.1); color:#fff; }', '.lt-settings-btn-sm { padding:4px 10px; font-size:11px; }', /* Toast 通知 */ '.lt-toast { position:fixed; bottom:24px; right:24px; z-index:999999; padding:10px 18px; border-radius:10px; font:13px/1.4 -apple-system,sans-serif; color:#fff; backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); box-shadow:0 4px 20px rgba(0,0,0,0.3); transform:translateY(20px); opacity:0; transition:all .25s ease; pointer-events:none; }', '.lt-toast.show { transform:translateY(0); opacity:1; }', '.lt-toast-success { background:rgba(16,185,129,0.9); }', '.lt-toast-error { background:rgba(239,68,68,0.9); }', '.lt-toast-info { background:rgba(99,102,241,0.9); }', '', ].join('\n'); document.head.appendChild(style); /* ========================================================= * 2. FPS 面板 * ========================================================= */ var fpsEl = document.createElement('div'); fpsEl.id = 'libtv-fps'; fpsEl.textContent = 'FPS: --'; document.body.appendChild(fpsEl); var helpEl = document.createElement('div'); helpEl.id = 'libtv-help'; helpEl.classList.add('libtv-hide'); helpEl.textContent = '画布\n G 网格 T 性能 H 隐藏 L 连线\n C 全链 R 直角 X 专注\n工具\n F 搜索 P 提示词 ? 帮助'; document.body.appendChild(helpEl); function _showHelp(){ if(helpEl) helpEl.classList.remove('libtv-hide'); } function _hideHelp(){ if(helpEl && !helpEl.classList.contains('libtv-pin')) helpEl.classList.add('libtv-hide'); } if(fpsEl){ fpsEl.addEventListener('mouseenter', _showHelp); fpsEl.addEventListener('mouseleave', _hideHelp); } var _fc = 0, _lastT = performance.now(), _fps = 0; // FPS 拖拽 (function(){ var dx = 0, dy = 0, dragging = false; fpsEl.addEventListener('mousedown', function(e){ dragging = true; dx = e.clientX - fpsEl.offsetLeft; dy = e.clientY - fpsEl.offsetTop; e.preventDefault(); }); document.addEventListener('mousemove', function(e){ if(!dragging) return; var l = e.clientX - dx, t = e.clientY - dy; var pw = fpsEl.offsetWidth, ph = fpsEl.offsetHeight; l = Math.max(4, Math.min(l, window.innerWidth - pw - 4)); t = Math.max(4, Math.min(t, window.innerHeight - ph - 4)); fpsEl.style.left = l + 'px'; fpsEl.style.top = t + 'px'; fpsEl.style.bottom = 'auto'; fpsEl.style.right = 'auto'; }); document.addEventListener('mouseup', function(){ dragging = false; }); })(); function fpsLoop(now){ _fc++; if (now - _lastT >= 1000){ _fps = Math.round(_fc * 1000 / (now - _lastT)); var flags = '', zoom = ''; var bg = document.querySelector('.react-flow__background'); if (bg && bg.classList.contains('perf-no-grid')) flags += ''; if (document.body.classList.contains('perf-mode')) flags += ''; if (document.body.classList.contains('perf-hide-imgs')) flags += ''; var edges = document.querySelector('.react-flow__edges'); if (edges && edges.classList.contains('perf-hide-edges')) flags += ''; if (document.body.classList.contains('libtv-chain')) flags += ''; if (document.body.classList.contains('libtv-autochain')) flags += ''; if (document.body.classList.contains('libtv-focus')) flags += ''; if (document.body.classList.contains('libtv-step-edges')) flags += ''; var nTotal = document.querySelectorAll('.react-flow__node').length; // 缩放级别 var vp = document.querySelector('.react-flow__viewport'); if(vp){ var m = (vp.style.transform || '').match(/scale\(([^)]+)\)/); if(m) zoom = Math.round(parseFloat(m[1]) * 100) + '%'; } fpsEl.innerHTML = '' + _fps + 'fps' + (zoom ? '|' + zoom + '' : '') + '|' + nTotal + '节点' + (flags ? '|' + flags : ''); _fc = 0; _lastT = now; } requestAnimationFrame(fpsLoop); } requestAnimationFrame(fpsLoop); /* ========================================================= * 流动光效 — 全屏 SVG overlay,不碰节点 DOM * ========================================================= */ (function(){ var svgNS='http://www.w3.org/2000/svg'; var overlay=document.createElementNS(svgNS,'svg'); overlay.id='libtv-glow'; overlay.style.cssText='position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:50;'; document.body.appendChild(overlay); var glowDefs=document.createElementNS(svgNS,'defs'); var filter=document.createElementNS(svgNS,'filter'); filter.setAttribute('id','glowBlur'); filter.setAttribute('x','-50%');filter.setAttribute('y','-50%'); filter.setAttribute('width','200%');filter.setAttribute('height','200%'); var blur=document.createElementNS(svgNS,'feGaussianBlur'); blur.setAttribute('stdDeviation','6'); filter.appendChild(blur); glowDefs.appendChild(filter); overlay.appendChild(glowDefs); var animGroup=document.createElementNS(svgNS,'g'); overlay.appendChild(animGroup); var prevNodes=new Set(); var animRaf=null; function readAccent(){ var n=document.querySelector('.react-flow__node'); if(!n)return{accent:'#6366f1',accentLight:'#818cf8'}; var s=getComputedStyle(n); return{ accent:s.getPropertyValue('--accent').trim()||'#6366f1', accentLight:s.getPropertyValue('--accent-light').trim()||'#818cf8' }; } function buildFrame(){ while(animGroup.firstChild)animGroup.removeChild(animGroup.firstChild); var nodes=document.querySelectorAll('.react-flow__node.selected'); if(!nodes.length){prevNodes.clear();return;} var c=readAccent(); var now=performance.now(); nodes.forEach(function(node){ var r=node.getBoundingClientRect(); var w=r.width,h=r.height; var cssW=node.offsetWidth||w,cssH=node.offsetHeight||h; var zoomX=cssW?w/cssW:1,zoomY=cssH?h/cssH:1; var zoom=Math.min(zoomX,zoomY); var cssBr=parseFloat(getComputedStyle(node).borderRadius)||12; var br=cssBr*zoom; var perim=2*(w+h); var dash=Math.round(perim*0.12),gap=perim-dash; function mkRect(stroke,sw){ var el=document.createElementNS(svgNS,'rect'); el.setAttribute('x',0);el.setAttribute('y',0); el.setAttribute('width',w);el.setAttribute('height',h); el.setAttribute('rx',br);el.setAttribute('fill','none'); el.setAttribute('stroke',stroke);el.setAttribute('stroke-width',sw); el.setAttribute('stroke-dasharray',dash+' '+gap); return el; } var g1=mkRect(c.accentLight,8); g1.setAttribute('filter','url(#glowBlur)'); var g2=mkRect('#fff',2); var p=((now%7000)/7000); var off=Math.round(p*perim); g1.setAttribute('stroke-dashoffset',off); g2.setAttribute('stroke-dashoffset',off); var wrap=document.createElementNS(svgNS,'g'); wrap.setAttribute('transform','translate('+r.left+','+r.top+')'); wrap.appendChild(g1); wrap.appendChild(g2); animGroup.appendChild(wrap); }); } function loop(){buildFrame();animRaf=requestAnimationFrame(loop);} loop(); })(); /* ========================================================= * AI Agent Drawer 适配 — 动态读宽度右推 * ========================================================= */ (function(){ var drawerSel = '.canvas-agent-drawer-chat'; function drawerEl(){ return document.querySelector(drawerSel) || document.querySelector('.mantine-Drawer-content.canvas-agent-drawer-chat'); } function adjust(){ var el = drawerEl(), dw = el ? el.offsetWidth : 0; var fps = document.getElementById('libtv-fps'); var pbtn = document.getElementById('libtv-pbtn'); if(dw > 0 && el.getBoundingClientRect().right > window.innerWidth / 2){ /* Drawer on right — shift our elements if they're still in default right position (not dragged) */ var gap = 16; [fps, pbtn].forEach(function(x){ if(x && !x.style.left){ if(!x._dd){ x._dd = true; x._dr = x.style.right; x._db = x.style.bottom; } x.style.right = (dw + gap + (x === pbtn ? 46 : 0)) + 'px'; } }); } else if(dw === 0){ [fps, pbtn].forEach(function(x){ if(x && x._dd){ x.style.right = x._dr; x.style.bottom = x._db; delete x._dd; delete x._dr; delete x._db; } }); } } var obs = new MutationObserver(function(){ if(obs._t) clearTimeout(obs._t); obs._t = setTimeout(adjust, 50); }); obs.observe(document.body, { childList: true, subtree: true }); window.addEventListener('resize', function(){ if(drawerEl()) setTimeout(adjust, 50); }); setTimeout(adjust, 500); })(); /* ========================================================= * 3. 快捷键 + 状态持久化 * ========================================================= */ var hook = document.createElement('script'); hook.textContent = [ '(function(){', /* ———— 链高亮引擎 ———— */ ' function _ltClearChain(){', ' document.body.classList.remove("libtv-chain");', ' document.querySelectorAll(".libtv-chain-node,.libtv-chain-edge").forEach(function(e){', ' e.classList.remove("libtv-chain-node","libtv-chain-edge");', ' });', ' };', ' var _ltAutoChain=localStorage.getItem("_lt_autochain")==="1";', ' if(_ltAutoChain) document.body.classList.add("libtv-autochain");', ' var _ltGraphCache=null;', ' function _ltGetGraph(){', ' if(!_ltGraphCache){', ' var up={},down={};', ' document.querySelectorAll(".react-flow__edge").forEach(function(e){', ' var lb=e.getAttribute("aria-label")||"",m=lb.match(/^Edge from (\\S+) to (\\S+)$/);', ' if(!m)return;', ' var s=m[1],t=m[2];', ' if(!down[s])down[s]=[]; down[s].push(t);', ' if(!up[t])up[t]=[]; up[t].push(s);', ' });', ' _ltGraphCache={up:up,down:down};', ' }', ' return _ltGraphCache;', ' }', ' function _ltInvalidateGraph(){_ltGraphCache=null;}', ' document.addEventListener("click",function(e){', ' _ltInvalidateGraph();', ' if(!_ltAutoChain) return;', ' if(!e.target.closest(".react-flow__node")){', ' _ltClearChain(); return;', ' }', ' setTimeout(function(){', ' if(document.querySelector(".react-flow__node.selected")){', ' var g=_ltGetGraph(),sid=document.querySelector(".react-flow__node.selected").getAttribute("data-id")||"";', ' if(!sid||!g)return;', ' var v={},q=[sid]; v[sid]=1;', ' while(q.length){', ' var c=q.shift();', ' (g.up[c]||[]).forEach(function(n){if(!v[n]){v[n]=1;q.push(n);}});', ' (g.down[c]||[]).forEach(function(n){if(!v[n]){v[n]=1;q.push(n);}});', ' }', ' document.querySelectorAll(".react-flow__node").forEach(function(n){', ' n.classList[(v[n.getAttribute("data-id")||n.id||""])?"add":"remove"]("libtv-chain-node");', ' });', ' document.querySelectorAll(".react-flow__edge").forEach(function(e){', ' var lb=e.getAttribute("aria-label")||"",m=lb.match(/^Edge from (\\S+) to (\\S+)$/);', ' e.classList[(m&&v[m[1]]&&v[m[2]])?"add":"remove"]("libtv-chain-edge");', ' });', ' document.body.classList.add("libtv-chain");', ' }', ' }, 50);', ' }, true);', /* ———— 连线 hover 高亮 ———— */ ' document.addEventListener("mouseover",function(e){', ' var n=e.target.closest(".react-flow__node");', ' if(!n)return;', ' var id=n.getAttribute("data-id")||n.id||""; if(!id)return;', ' document.querySelectorAll(".react-flow__edge").forEach(function(ed){', ' var lb=ed.getAttribute("aria-label")||"",m=lb.match(/^Edge from (\\S+) to (\\S+)$/);', ' if(m&&(m[1]===id||m[2]===id)) ed.classList.add("libtv-edge-active");', ' });', ' },true);', ' document.addEventListener("mouseout",function(e){', ' if(!e.target.closest(".react-flow__node"))return;', ' document.querySelectorAll(".react-flow__edge.libtv-edge-active").forEach(function(ed){', ' ed.classList.remove("libtv-edge-active");', ' });', ' },true);', /* ———— 节点搜索 ———— */ ' function _ltSearch(){', ' var overlay=document.getElementById("libtv-search");', ' if(overlay){ overlay.remove(); return; }', ' var items=[];', ' document.querySelectorAll(".react-flow__node").forEach(function(n){', ' var id=n.getAttribute("data-id")||n.id||"";', ' if(!id)return;', ' var txt=(n.textContent||"").trim().split("\\n")[0].trim().slice(0,50);', ' items.push({id:id,name:txt||id,el:n});', ' });', ' var div=document.createElement("div");', ' div.id="libtv-search";', ' div.style.cssText="position:fixed;top:60px;right:20px;z-index:99999;background:rgba(0,0,0,0.9);border-radius:10px;padding:10px;width:280px;max-height:60vh;overflow:auto;font:12px/1.5 sans-serif;";', ' div.innerHTML="
";', ' document.body.appendChild(div);', ' function render(q){', ' var q=(q||"").toLowerCase(),html="";', ' items.forEach(function(it){', ' if(!q||it.name.toLowerCase().indexOf(q)>=0||it.id.toLowerCase().indexOf(q)>=0){', ' html+="
"+_ltEsc(it.name)+"
";', ' }', ' });', ' document.getElementById("lt-search-results").innerHTML=html;', ' }', ' render("");', ' document.getElementById("lt-search-input").addEventListener("input",function(){', ' render(this.value);', ' });', ' document.getElementById("lt-search-results").addEventListener("click",function(e){', ' var item=e.target.closest("[data-id]");', ' if(!item)return;', ' var id=item.getAttribute("data-id");', ' var el=document.querySelector(\'.react-flow__node[data-id="\'+id+\'"],.react-flow__node#\'+id);', ' if(el){', ' el.scrollIntoView({behavior:"smooth",block:"center"});', ' el.click();', ' }', ' div.remove();', ' });', ' document.getElementById("lt-search-input").focus();', ' }', /* ———— 提示词工具 ———— */ ' var _ltPrompts=JSON.parse(localStorage.getItem("_lt_prompts")||"[]");', ' if(!_ltPrompts.length){', ' _ltPrompts=[', ' {id:"d1",name:"产品摄影",category:"图像",content:"Product photography on {background=white} background, {lighting=studio lighting}, high detail, 8K, sharp focus, {extra}"},', ' {id:"d2",name:"电影镜头",category:"图像",content:"Cinematic shot, {lens=anamorphic} lens, {lighting=dramatic} lighting, shallow depth of field, {style}"},', ' {id:"d3",name:"动画-吉卜力风",category:"图像",content:"Studio Ghibli style, hand-drawn animation, {palette=soft pastel} colors, {atmosphere=whimsical}"},', ' {id:"d4",name:"产品展示-环绕",category:"视频",content:"Smooth 360 orbit around {subject=product}, {lighting=soft studio} lighting, slow motion, {extra}"},', ' {id:"d5",name:"风光-延时",category:"视频",content:"Timelapse, {time=golden hour}, {sky=dramatic clouds}, warm tones, smooth transition, {extra}"},', ' ];', ' localStorage.setItem("_lt_prompts",JSON.stringify(_ltPrompts));', ' }', ' var _ltPromptAPI=JSON.parse(localStorage.getItem("_lt_prompt_api")||"{\\"url\\":\\"https://api.deepseek.com/chat/completions\\",\\"model\\":\\"deepseek-v4-flash\\"}");', ' if(!_ltPromptAPI.url){_ltPromptAPI.url="https://api.deepseek.com/chat/completions";_ltPromptAPI.model=_ltPromptAPI.model||"deepseek-v4-flash";}', ' var _ltThemePresets=[', ' {n:"靛蓝",a:"#6366f1",l:"#818cf8",d:"#4f46e5",ar:"99,102,241",alr:"129,140,248",cb:"#0e0e12",gc:"rgba(255,255,255,0.12)",nb:"#16162a",nc:"rgba(129,140,248,0.15)",ec:"rgba(129,140,248,0.15)",cat:"dark"},', ' {n:"翡翠",a:"#10b981",l:"#34d399",d:"#059669",ar:"16,185,129",alr:"52,211,153",cb:"#0b120f",gc:"rgba(255,255,255,0.12)",nb:"#12261c",nc:"rgba(52,211,153,0.15)",ec:"rgba(52,211,153,0.15)",cat:"dark"},', ' {n:"玫瑰",a:"#f43f5e",l:"#fb7185",d:"#e11d48",ar:"244,63,94",alr:"251,113,133",cb:"#120b0d",gc:"rgba(255,255,255,0.12)",nb:"#261318",nc:"rgba(251,113,133,0.15)",ec:"rgba(251,113,133,0.15)",cat:"dark"},', ' {n:"琥珀",a:"#f59e0b",l:"#fbbf24",d:"#d97706",ar:"245,158,11",alr:"251,191,36",cb:"#12100a",gc:"rgba(255,255,255,0.12)",nb:"#261e12",nc:"rgba(251,191,36,0.15)",ec:"rgba(251,191,36,0.15)",cat:"dark"},', ' {n:"天蓝",a:"#0ea5e9",l:"#38bdf8",d:"#0284c7",ar:"14,165,233",alr:"56,189,248",cb:"#0a1013",gc:"rgba(255,255,255,0.12)",nb:"#111f28",nc:"rgba(56,189,248,0.15)",ec:"rgba(56,189,248,0.15)",cat:"dark"},', ' {n:"紫色",a:"#8b5cf6",l:"#a78bfa",d:"#7c3aed",ar:"139,92,246",alr:"167,139,250",cb:"#0e0c14",gc:"rgba(255,255,255,0.12)",nb:"#1b1730",nc:"rgba(167,139,250,0.15)",ec:"rgba(167,139,250,0.15)",cat:"dark"},', ' {n:"暗夜绿",a:"#22c55e",l:"#4ade80",d:"#16a34a",ar:"34,197,94",alr:"74,222,128",cb:"#080c0a",gc:"rgba(255,255,255,0.08)",nb:"#0f1a14",nc:"rgba(74,222,128,0.12)",ec:"rgba(74,222,128,0.12)",cat:"dark"},', ' {n:"赛博朋克",a:"#f472b6",l:"#fb923c",d:"#e11d48",ar:"244,114,182",alr:"251,146,60",cb:"#0a0a14",gc:"rgba(255,255,255,0.08)",nb:"#14142a",nc:"rgba(244,114,182,0.15)",ec:"rgba(244,114,182,0.15)",cat:"dark"},', ' {n:"暖棕复古",a:"#d97706",l:"#f59e0b",d:"#b45309",ar:"217,119,6",alr:"245,158,11",cb:"#0f0c08",gc:"rgba(255,255,255,0.08)",nb:"#1c160e",nc:"rgba(245,158,11,0.12)",ec:"rgba(245,158,11,0.12)",cat:"dark"},', ' {n:"极简白",a:"#6366f1",l:"#818cf8",d:"#4f46e5",ar:"99,102,241",alr:"129,140,248",cb:"#f5f5f0",gc:"rgba(0,0,0,0.06)",nb:"#ffffff",nc:"rgba(99,102,241,0.12)",ec:"rgba(0,0,0,0.08)",cat:"light"},', ' {n:"灰银",a:"#6b7280",l:"#9ca3af",d:"#4b5563",ar:"107,114,128",alr:"156,163,175",cb:"#e8e8e5",gc:"rgba(0,0,0,0.06)",nb:"#f0f0ed",nc:"rgba(0,0,0,0.1)",ec:"rgba(0,0,0,0.08)",cat:"light"},', ' {n:"暖白",a:"#d97706",l:"#f59e0b",d:"#b45309",ar:"217,119,6",alr:"245,158,11",cb:"#f0ebe3",gc:"rgba(0,0,0,0.06)",nb:"#faf5ed",nc:"rgba(217,119,6,0.1)",ec:"rgba(0,0,0,0.08)",cat:"light"},', ' {n:"高对比",a:"#ffffff",l:"#e0e0e0",d:"#ffffff",ar:"255,255,255",alr:"224,224,224",cb:"#000000",gc:"rgba(255,255,255,0.15)",nb:"#1a1a1a",nc:"rgba(255,255,255,0.2)",ec:"rgba(255,255,255,0.2)",cat:"high"},', ' {n:"高对比蓝",a:"#00bfff",l:"#87ceeb",d:"#00bfff",ar:"0,191,255",alr:"135,206,235",cb:"#000000",gc:"rgba(0,191,255,0.1)",nb:"#0a0a14",nc:"rgba(0,191,255,0.2)",ec:"rgba(0,191,255,0.2)",cat:"high"},', ' ];', ' var _ltTheme=JSON.parse(localStorage.getItem("_lt_theme")||"null")||_ltThemePresets[0];', ' if(!_ltTheme.cb){_ltTheme.cb=_ltThemePresets[0].cb;_ltTheme.gc=_ltThemePresets[0].gc;_ltTheme.nb=_ltThemePresets[0].nb;_ltTheme.nc=_ltThemePresets[0].nc;_ltTheme.ec=_ltThemePresets[0].ec;}', ' function _ltApplyTheme(t){', ' var r=document.documentElement;', ' r.style.setProperty("--accent",t.a);', ' r.style.setProperty("--accent-light",t.l);', ' r.style.setProperty("--accent-dark",t.d);', ' r.style.setProperty("--accent-rgb",t.ar);', ' r.style.setProperty("--accent-light-rgb",t.alr);', ' r.style.setProperty("--canvas-bg",t.cb);', ' r.style.setProperty("--node-bg",t.nb);', ' r.style.setProperty("--border-color",t.nc);', ' r.style.setProperty("--edge-color",t.ec);', ' _ltTheme=t;', ' localStorage.setItem("_lt_theme",JSON.stringify(t));', ' try{document.getElementById("ltp-theme-preview").style.background=t.l;}catch(e){}', ' try{var _e=document.querySelectorAll(".react-flow__renderer,.react-flow");for(var _i=0;_i<_e.length;_i++)_e[_i].style.backgroundColor=t.cb;}catch(e){}', ' }', ' _ltApplyTheme(_ltTheme);', ' setTimeout(function(){try{var _e=document.querySelectorAll(".react-flow__renderer,.react-flow");for(var _i=0;_i<_e.length;_i++)_e[_i].style.backgroundColor=_ltTheme.cb;}catch(e){}},500);', ' var _ltPActiveTab="templates",_ltPCat="",_ltAISource=null,_ltBodyOrigMinH="";', ' function _ltPromptPanel(anchor){', ' if(_ltPActiveTab==="settings")_ltPActiveTab="templates";', ' var el=document.getElementById("libtv-prompt");', ' if(el){el.remove();return;}', ' function savePrompts(){localStorage.setItem("_lt_prompts",JSON.stringify(_ltPrompts));}', ' function renderBody(){', ' var body=document.getElementById("ltp-body"); if(!body)return;', ' if(_ltPActiveTab==="templates"){', ' var cats={};', ' _ltPrompts.forEach(function(p){if(!cats[p.category])cats[p.category]=0;cats[p.category]++;});', ' var catKeys=Object.keys(cats);', ' var filtered= _ltPCat ? _ltPrompts.filter(function(p){return p.category===_ltPCat;}) : _ltPrompts;', ' var h=\'
\';', ' catKeys.forEach(function(c){h+=\'\';});', ' h+="
";', ' if(!filtered.length){h+=\'
暂无模板,点击右上角 + 添加
\';}', ' else{', ' filtered.forEach(function(p){', ' h+=\'
\'', ' +\'
\'+_ltEsc(p.name)+\'
\'', ' +\'
\'+_ltEsc(p.content.slice(0,60))+\'
\'', ' +\'
\'', ' +\'\'', ' +\'\'', ' +\'\'', ' +\'
\';', ' });', ' }', ' body.innerHTML=h;', ' body.querySelectorAll(".ltp-cat-btn").forEach(function(b){b.onclick=function(){_ltPCat=this.getAttribute("data-cat")||"";renderBody();};});', ' body.querySelectorAll("[data-action=copy]").forEach(function(b){b.onclick=function(){var id=b.getAttribute("data-id"),p=_ltPrompts.find(function(x){return x.id===id;});if(!p)return;var m,pairs=[],re=/\\{(\\w+)(?:=([^}]*))?\\}/g;while((m=re.exec(p.content))!==null)pairs.push({n:m[1],d:m[2]||""});if(!pairs.length){navigator.clipboard.writeText(p.content).then(function(){b.textContent="✅";setTimeout(function(){b.textContent="复制";},1200);});return;}var overlay=document.createElement("div");overlay.className="ltp-var-overlay";var html=\'
\'+_ltEsc(p.name)+\'
填写变量后点击确认,替换结果将复制到剪贴板
\';pairs.forEach(function(v){html+=\'
\';});html+=\'
\'+_ltEsc(p.content)+\'
\';overlay.innerHTML=html;_ltBodyOrigMinH=body.style.minHeight||"";body.style.minHeight="320px";body.appendChild(overlay);function _clean(){if(overlay.parentNode)overlay.parentNode.removeChild(overlay);body.style.minHeight=_ltBodyOrigMinH;}function _upd(){var r=p.content;overlay.querySelectorAll(".ltp-var-inp").forEach(function(i){r=r.replace(new RegExp("\\\\{"+i.getAttribute("data-var")+"(?:=[^}]*)?\\\\}","g"),i.value||i.getAttribute("data-var"));});overlay.querySelector("#ltp-var-ovprev").textContent=r;}overlay.querySelectorAll(".ltp-var-inp").forEach(function(i){i.addEventListener("input",_upd);});overlay.querySelector("#ltp-var-cancel").onclick=function(){_clean();};overlay.querySelector("#ltp-var-ok").onclick=function(){var r=p.content;overlay.querySelectorAll(".ltp-var-inp").forEach(function(i){r=r.replace(new RegExp("\\\\{"+i.getAttribute("data-var")+"(?:=[^}]*)?\\\\}","g"),i.value);});navigator.clipboard.writeText(r).then(function(){b.textContent="✅";setTimeout(function(){b.textContent="复制";},1200);_clean();}).catch(function(){_clean();});};};});', ' body.querySelectorAll("[data-action=edit]").forEach(function(b){b.onclick=function(){var id=this.getAttribute("data-id"),p=_ltPrompts.find(function(x){return x.id===id;});if(!p)return;var nn=prompt("名称:",p.name);if(nn===null)return;var cc=prompt("内容:",p.content);if(cc===null)return;var cat=prompt("分类:",p.category);if(cat===null)return;p.name=nn;p.content=cc;p.category=cat||"通用";savePrompts();renderBody();};});', ' body.querySelectorAll("[data-action=del]").forEach(function(b){b.onclick=function(){var id=this.getAttribute("data-id");_ltPrompts=_ltPrompts.filter(function(x){return x.id!==id;});savePrompts();renderBody();};});', ' }', ' else if(_ltPActiveTab==="ai"){', ' var api=_ltPromptAPI;', ' body.innerHTML=\'
输入或修改提示词,AI 将帮你润色/扩写
\'', ' +\'\'', ' +\'
\'', ' +\'\'', ' +\'\'', ' +\'\'', ' +\'\'', ' +\'
\'', ' +\'
\'', ' +\'
\'+(api.url?"已配置 "+api.url:"未配置 API,请在⚙设置中配置")+\'
\';', ' document.getElementById("ltp-ai-fill").onclick=function(){', ' var candidates=[],best=null;', ' document.querySelectorAll("textarea").forEach(function(t){if(t.offsetParent!==null)candidates.push({el:t,val:t.value});});', ' document.querySelectorAll("input[type=text]").forEach(function(t){if(t.offsetParent!==null)candidates.push({el:t,val:t.value});});', ' document.querySelectorAll("[contenteditable=true]").forEach(function(t){if(t.offsetParent!==null)candidates.push({el:t,val:t.textContent||""});});', ' candidates.forEach(function(c){if(c.val.trim()&&(!best||c.val.length>best.val.length))best=c;});', ' document.getElementById("ltp-ai-input").value=best?best.val:"";', ' _ltAISource=best?best.el:null;', ' document.getElementById("ltp-ai-status").textContent=_ltAISource?"✅ 已绑定源输入框,增强结果点击即可写入":"⚠ 未找到可见输入框";', ' };', ' document.getElementById("ltp-ai-clear").onclick=function(){document.getElementById("ltp-ai-input").value="";document.getElementById("ltp-ai-result").textContent="";};', ' var _ltDoAI=function(text,btn,sysPrompt,langLabel){', ' var api=_ltPromptAPI;', ' if(!api.url||!api.key){document.getElementById("ltp-ai-status").textContent="❌ 请先在⚙设置中配置 API";btn.textContent=langLabel;btn.disabled=false;return;}', ' fetch(api.url,{', ' method:"POST",', ' headers:{"Content-Type":"application/json","Authorization":"Bearer "+api.key},', ' body:JSON.stringify({model:api.model||"deepseek-v4-flash",messages:[{role:"system",content:sysPrompt},{role:"user",content:text}],max_tokens:1000})', ' }).then(function(r){return r.json();}).then(function(d){', ' var result=d.choices&&d.choices[0]&&d.choices[0].message?d.choices[0].message.content:JSON.stringify(d);', ' document.getElementById("ltp-ai-result").textContent=result;', ' document.getElementById("ltp-ai-result").style.cursor="pointer";', ' if(_ltAISource){', ' document.getElementById("ltp-ai-status").textContent="✅ 完成,点击结果直接写回节点";', ' document.getElementById("ltp-ai-result").onclick=function(){', ' try{', ' if(_ltAISource.tagName==="TEXTAREA"||_ltAISource.tagName==="INPUT"){_ltAISource.value=result;_ltAISource.dispatchEvent(new Event("input",{bubbles:true}));}', ' else if(_ltAISource.isContentEditable){_ltAISource.textContent=result;_ltAISource.dispatchEvent(new Event("input",{bubbles:true}));}', ' document.getElementById("ltp-ai-status").textContent="✅ ✅ 已写回节点";', ' }catch(ex){document.getElementById("ltp-ai-status").textContent="❌ 写入失败: "+ex.message;}', ' };', ' }else{', ' document.getElementById("ltp-ai-status").textContent="✅ 完成,点击结果可复制";', ' document.getElementById("ltp-ai-result").onclick=function(){', ' var sel=window.getSelection();var r=document.createRange();r.selectNodeContents(this);sel.removeAllRanges();sel.addRange(r);', ' try{var ok=document.execCommand("copy");if(ok){sel.removeAllRanges();document.getElementById("ltp-ai-status").textContent="✅ ✅ 已复制到剪贴板";return;}}catch(e){}', ' document.getElementById("ltp-ai-status").textContent="✅ 文本已选中,请按 Ctrl+C";', ' };', ' }', ' btn.textContent=langLabel; btn.disabled=false;', ' }).catch(function(err){', ' document.getElementById("ltp-ai-status").textContent="❌ 请求失败: "+err.message;', ' btn.textContent=langLabel; btn.disabled=false;', ' });', ' };', ' document.getElementById("ltp-ai-zh").onclick=function(){', ' var text=document.getElementById("ltp-ai-input").value.trim();', ' if(!text)return;', ' var btn=this; btn.textContent="处理中..."; btn.disabled=true;', ' _ltDoAI(text,btn,"你是一个提示词工程专家。请优化并扩展用户的 AI 图像/视频生成提示词,保持简洁的同时补充光影、构图、风格、氛围等细节。请务必用中文回复,只输出中文提示词,不要输出英文。","🇨🇳 中文增强");', ' };', ' document.getElementById("ltp-ai-en").onclick=function(){', ' var text=document.getElementById("ltp-ai-input").value.trim();', ' if(!text)return;', ' var btn=this; btn.textContent="Processing..."; btn.disabled=true;', ' _ltDoAI(text,btn,"You are a prompt engineering expert. Improve and expand the user\'s prompt for AI image/video generation. Keep it concise but add details about lighting, composition, style, and atmosphere. Output only the enhanced prompt, no explanations.","🇺🇸 English Enhance");', ' };', ' }', ' else if(_ltPActiveTab==="theme"){', ' function _ltRenderTheme(){', ' var cats=[["dark","\\u6df1\\u8272\\u7cfb"],["light","\\u6d45\\u8272\\u7cfb"],["high","\\u9ad8\\u5bf9\\u6bd4"]],html="";', ' cats.forEach(function(c){', ' var items=_ltThemePresets.filter(function(t){return t.cat===c[0];});', ' if(!items.length)return;', ' html+=\'
\'+c[1]+\'
\';', ' html+=\'
\';', ' items.forEach(function(t,i){', ' var idx=_ltThemePresets.indexOf(t);', ' var sel=t.a===_ltTheme.a&&t.cb===_ltTheme.cb?"2px solid var(--accent-light)":"1px solid rgba(255,255,255,0.06)";', ' html+=\'\';', ' });', ' html+=\'
\';', ' });', ' html+=\'
\';', ' body.innerHTML=html;', ' body.querySelectorAll(".ltp-theme-preset").forEach(function(b){', ' b.onclick=function(){', ' var idx=parseInt(this.getAttribute("data-idx")),t=_ltThemePresets[idx];', ' _ltApplyTheme(t);', ' _ltRenderTheme();', ' };', ' });', ' document.getElementById("ltp-theme-reset").onclick=function(){', ' var t=_ltThemePresets[0];', ' _ltApplyTheme(t);', ' _ltRenderTheme();', ' };', ' }', ' _ltRenderTheme();', ' }', ' else if(_ltPActiveTab==="palette"){', ' var _presets={', ' "电影色调":["#2c1e30","#4a2c4a","#c9a227","#e8d5b7","#1a3a4a","#2d5a7b","#8b4513","#cd853f"],', ' "赛博朋克":["#ff00ff","#00ffff","#ff1493","#00bfff","#ff6ec7","#7b68ee","#ff4500","#1c1c3c"],', ' "莫兰迪":["#b5c4b1","#e8e0d4","#c9b8a8","#a8b5c4","#d4c5b9","#b9c4d4","#c4b5b1","#d4d0c5"],', ' "马卡龙":["#ffb3ba","#bae1ff","#baffc9","#ffffba","#e8baff","#baffee","#ffd1ba","#d4baff"],', ' "暖色系":["#ff6b35","#f7c59f","#efefd0","#ffb4a2","#e5989b","#b5838d","#6d6875","#ffcdb2"],', ' "冷色系":["#023e8a","#0077b6","#0096c7","#00b4d8","#48cae4","#90e0ef","#ade8f4","#caf0f8"],', ' "黑白灰":["#000000","#1a1a1a","#333333","#666666","#999999","#cccccc","#e5e5e5","#ffffff"],', ' "高饱和":["#ff0000","#ff8800","#ffff00","#00ff00","#0088ff","#8800ff","#ff00ff","#00ffff"],', ' "低饱和":["#8b7d72","#a0937e","#b8a99a","#c4b7a6","#d1c4b0","#e0d6c8","#ebe3d7","#f5f0e8"]', ' };', ' function _hex2rgb(h){h=h.replace("#","");return[parseInt(h.slice(0,2),16),parseInt(h.slice(2,4),16),parseInt(h.slice(4,6),16)];}', ' function _rgb2hsl(r,g,b){r/=255;g/=255;b/=255;var mx=Math.max(r,g,b),mn=Math.min(r,g,b),h,s,l=(mx+mn)/2;if(mx===mn){h=s=0;}else{var d=mx-mn;s=l>0.5?d/(2-mx-mn):d/(mx+mn);switch(mx){case r:h=((g-b)/d+(g=345)hue="red";else if(h<45)hue="orange";else if(h<70)hue="yellow";else if(h<160)hue="green";else if(h<200)hue="cyan";else if(h<260)hue="blue";else if(h<310)hue="purple";else hue="pink";return desc+" "+hue+" ("+hex+")";}', ' var _recent=JSON.parse(localStorage.getItem("_lt_pal_recent")||"[]");', ' function _saveRecent(c){_recent=_recent.filter(function(x){return x!==c;});_recent.unshift(c);if(_recent.length>20)_recent.pop();localStorage.setItem("_lt_pal_recent",JSON.stringify(_recent));}', ' function _copySwatch(el,color){navigator.clipboard.writeText(color).then(function(){el.classList.add("copied");setTimeout(function(){el.classList.remove("copied");},800);var toast=document.createElement("div");toast.className="ltp-pal-toast show";toast.textContent="Copied "+color.toUpperCase();document.body.appendChild(toast);setTimeout(function(){toast.classList.remove("show");setTimeout(function(){toast.remove();},300);},1200);_saveRecent(color);});}', ' function _renderPalette(){', ' var h=\'
#818CF8
rgb(129, 140, 248)
hsl(235, 91%, 74%)
\';', ' h+=\'
muted blue (#818cf8)
\';', ' h+=\'
我的收藏
\';', ' if(_recent.length){', ' h+=\'
最近使用
\';', ' }', ' Object.keys(_presets).forEach(function(name){', ' h+=\'
\'+name+\'
\';', ' });', ' body.innerHTML=h;', ' var _fav=JSON.parse(localStorage.getItem("_lt_pal_fav")||"[]");', ' function _renderFav(){var fb=document.getElementById("ltp-pal-fav");if(!fb)return;fb.innerHTML="";_fav.forEach(function(c,i){var s=document.createElement("div");s.className="ltp-pal-swatch";s.style.background=c;s.setAttribute("data-color",c);s.innerHTML=\'
\'+_ltEsc(c)+\'
\';s.onclick=function(){_copySwatch(s,c);_updPicker(c);};fb.appendChild(s);});}', ' _renderFav();', ' function _updPicker(hex){document.getElementById("ltp-pal-pick").value=hex;document.getElementById("ltp-pal-hex").textContent=hex.toUpperCase();var rgb=_hex2rgb(hex);document.getElementById("ltp-pal-rgb").textContent="rgb("+rgb.join(", ")+")";var hsl=_rgb2hsl(rgb[0],rgb[1],rgb[2]);document.getElementById("ltp-pal-hsl").textContent="hsl("+hsl[0]+", "+hsl[1]+"%, "+hsl[2]+"%)";document.getElementById("ltp-pal-ai-desc").textContent=_aiDesc(hex);}', ' document.getElementById("ltp-pal-pick").oninput=function(){_updPicker(this.value);};', ' body.querySelectorAll(".ltp-pal-swatch").forEach(function(s){s.onclick=function(){var c=this.getAttribute("data-color");_copySwatch(s,c);_updPicker(c);};});', ' body.querySelectorAll(".ltp-pal-section-title").forEach(function(t){t.onclick=function(){var b=this.nextElementSibling;if(b)b.classList.toggle("collapsed");this.classList.toggle("open");};});', ' document.getElementById("ltp-pal-hex").onclick=function(){var v=this.textContent;navigator.clipboard.writeText(v);var toast=document.createElement("div");toast.className="ltp-pal-toast show";toast.textContent="Copied "+v;document.body.appendChild(toast);setTimeout(function(){toast.classList.remove("show");setTimeout(function(){toast.remove();},300);},1200);};', ' document.getElementById("ltp-pal-rgb").onclick=function(){var v=this.textContent;navigator.clipboard.writeText(v);var toast=document.createElement("div");toast.className="ltp-pal-toast show";toast.textContent="Copied "+v;document.body.appendChild(toast);setTimeout(function(){toast.classList.remove("show");setTimeout(function(){toast.remove();},300);},1200);};', ' document.getElementById("ltp-pal-hsl").onclick=function(){var v=this.textContent;navigator.clipboard.writeText(v);var toast=document.createElement("div");toast.className="ltp-pal-toast show";toast.textContent="Copied "+v;document.body.appendChild(toast);setTimeout(function(){toast.classList.remove("show");setTimeout(function(){toast.remove();},300);},1200);};', ' document.getElementById("ltp-pal-ai-copy").onclick=function(){var v=document.getElementById("ltp-pal-ai-desc").textContent;navigator.clipboard.writeText(v);var toast=document.createElement("div");toast.className="ltp-pal-toast show";toast.textContent="Copied AI描述";document.body.appendChild(toast);setTimeout(function(){toast.classList.remove("show");setTimeout(function(){toast.remove();},300);},1200);};', ' document.getElementById("ltp-pal-add-fav").onclick=function(){var hex=document.getElementById("ltp-pal-pick").value;if(!_fav.includes(hex)){_fav.push(hex);localStorage.setItem("_lt_pal_fav",JSON.stringify(_fav));_renderFav();}};', ' }', ' _renderPalette();', ' }', ' else if(_ltPActiveTab==="settings"){', ' var existing=document.getElementById("lt-settings");', ' if(existing){existing.remove();return;}', ' var p=document.getElementById("libtv-prompt");', ' if(p)p.remove();', ' _ltSettingsPanel();', ' return;', ' }', ' }', ' var div=document.createElement("div");', ' div.id="libtv-prompt";', ' div.innerHTML=\'

提示词工具

\'', ' +\'
模板调色AI 增强主题设置
\'', ' +\'
\'', ' +\'
\'', ' +\'\'', ' +\'\'', ' +\'
\';', ' document.body.appendChild(div);', ' if(!anchor||!anchor.getBoundingClientRect){', ' div.style.left="50%"; div.style.top="50%";', ' div.style.transform="translate(-50%,-50%)";', ' }', ' renderBody();', ' div.addEventListener("mousemove",function(e){', ' var items=div.querySelectorAll(".ltp-item");', ' items.forEach(function(it){', ' var r=it.getBoundingClientRect();', ' it.style.setProperty("--mx",(e.clientX-r.left)+"px");', ' it.style.setProperty("--my",(e.clientY-r.top)+"px");', ' });', ' });', ' document.getElementById("ltp-close").onclick=function(){div.remove();};', ' document.getElementById("ltp-add").onclick=function(){', ' var nn=prompt("模板名称:"); if(nn===null)return;', ' var cc=prompt("提示词内容:"); if(cc===null)return;', ' var cat=prompt("分类(如:图像/视频/通用):")||"通用";', ' _ltPrompts.push({id:"p"+Date.now(),name:nn,content:cc,category:cat});', ' savePrompts(); renderBody();', ' };', ' document.getElementById("ltp-reset").onclick=function(){', ' if(!confirm("恢复默认模板将覆盖当前所有模板,确认?"))return;', ' _ltPrompts=[', ' {id:"d1",name:"产品摄影",category:"图像",content:"Product photography on {background=white} background, {lighting=studio lighting}, high detail, 8K, sharp focus, {extra}"},', ' {id:"d2",name:"电影镜头",category:"图像",content:"Cinematic shot, {lens=anamorphic} lens, {lighting=dramatic} lighting, shallow depth of field, {style}"},', ' {id:"d3",name:"动画-吉卜力风",category:"图像",content:"Studio Ghibli style, hand-drawn animation, {palette=soft pastel} colors, {atmosphere=whimsical}"},', ' {id:"d4",name:"产品展示-环绕",category:"视频",content:"Smooth 360 orbit around {subject=product}, {lighting=soft studio} lighting, slow motion, {extra}"},', ' {id:"d5",name:"风光-延时",category:"视频",content:"Timelapse, {time=golden hour}, {sky=dramatic clouds}, warm tones, smooth transition, {extra}"},', ' ];', ' savePrompts(); renderBody();', ' };', ' div.querySelectorAll(".ltp-tab").forEach(function(t){t.onclick=function(){_ltPActiveTab=this.getAttribute("data-tab");div.querySelectorAll(".ltp-tab").forEach(function(x){x.classList.toggle("active",x===t);});renderBody();};});', ' window._ltPromptRefresh=function(){var d=document.getElementById("libtv-prompt");if(d){_ltPrompts=JSON.parse(localStorage.getItem("_lt_prompts")||"[]");renderBody();}};', ' }', /* ———— 标签系统 ———— */ ' var _ltTagLibs=JSON.parse(localStorage.getItem("_lt_tag_libs")||"null");', ' if(!_ltTagLibs){', ' _ltTagLibs={"默认标签":{categories:[', ' {name:"常规标签",icon:"⭐",groups:[', ' {name:"画质",open:true,items:["杰作","写实","提高质量","最佳质量","高分辨率","超高分辨率","超高清","更多细节","简单背景","模糊背景","清晰背景","清晰细节","超精细绘画","聚焦清晰","物理渲染","极详细刻画","改善细节","添加鲜艳色彩","扫描"]},', ' {name:"负面标签",open:false,items:["低质量","模糊","畸形","多余手指","水印","签名","丑陋","变形","低分辨率","噪点","抖动","糟糕构图","文本","拼贴","多余的文字"]},', ' {name:"摄影",open:false,items:["摄影","单反","胶片颗粒","移轴","长曝光","微距摄影","人像摄影","风景摄影"]},', ' {name:"光影",open:false,items:["工作室光照","戏剧性光照","柔光","黄金时刻","霓虹灯光","轮廓光","体积光","电影光照"]},', ' {name:"构图",open:false,items:["特写","广角","鸟瞰","低角度","对称构图","三分法","居中构图","前景"]}', ' ]},', ' {name:"艺术题材",icon:"🎨",groups:[', ' {name:"题材",open:false,items:["奇幻","科幻","赛博朋克","蒸汽朋克","水墨","浮世绘","像素艺术","低多边形","超现实主义","复古"]}', ' ]},', ' {name:"人物类",icon:"👤",groups:[', ' {name:"人物",open:false,items:["女孩","男孩","少女","少年","女人","男人","老者","儿童","多人","角色设计","五官精致","红发","蓝眼"]}', ' ]},', ' {name:"场景",icon:"🏞",groups:[', ' {name:"场景",open:false,items:["城市","森林","山脉","海滩","星空","室内","废墟","花园","雪景","夜景","雨天"]}', ' ]}', ' ]}};', ' try{localStorage.setItem("_lt_tag_libs",JSON.stringify(_ltTagLibs));}catch(e){}', ' }', ' var _ltCurLib=localStorage.getItem("_lt_cur_lib")||"默认标签";', ' if(!_ltTagLibs[_ltCurLib])_ltCurLib=Object.keys(_ltTagLibs)[0];', ' var _ltTagActiveCat=0;', ' var _ltTagSearch="";', ' var _ltRecentTags=JSON.parse(localStorage.getItem("_lt_recent")||"[]");', ' var _ltTagMenuEl=null,_ltTagInputEl=null;', ' function _ltCurLibCats(){var l=_ltTagLibs[_ltCurLib];return l&&l.categories?l.categories:[];}', ' function _ltCurCatGroups(){var c=_ltCurLibCats()[_ltTagActiveCat];return c&&c.groups?c.groups:[];}', ' function _ltSaveLibs(){try{localStorage.setItem("_lt_tag_libs",JSON.stringify(_ltTagLibs));localStorage.setItem("_lt_cur_lib",_ltCurLib);}catch(e){}}', ' window._ltTagRefresh=function(){var s=localStorage.getItem("_lt_tag_libs");if(s){try{_ltTagLibs=JSON.parse(s);}catch(e){}}if(!_ltTagLibs[_ltCurLib])_ltCurLib=Object.keys(_ltTagLibs)[0];if(_ltTagMenuEl)_ltRenderTagMenu();};', ' function _ltPushRecent(t){t=String(t);if(!t)return;_ltRecentTags=_ltRecentTags.filter(function(x){return x!==t;});_ltRecentTags.push(t);if(_ltRecentTags.length>40)_ltRecentTags=_ltRecentTags.slice(-40);try{localStorage.setItem("_lt_recent",JSON.stringify(_ltRecentTags));}catch(e){}if(_ltTagMenuEl&&_ltTagActiveCat>=_ltCurLibCats().length)_ltRenderTagMenu();}', ' var _ltTagMenuEl=null,_ltTagInputEl=null;', ' function _ltInsertTagAtCursor(tagText){', ' var ta=_ltTagInputEl; if(!ta)return;', ' if(ta.tagName==="TEXTAREA"||(ta.tagName==="INPUT"&&ta.type==="text")){', ' var start=ta.selectionStart,end=ta.selectionEnd,val=ta.value;', ' var before=val.slice(0,start);', ' var sep=(before.length>0&&!/[\\s,,]$/.test(before))?", ":"";', ' var ins=sep+tagText;', ' var newVal=val.slice(0,start)+ins+val.slice(end);', ' var proto=ta.tagName==="TEXTAREA"?HTMLTextAreaElement.prototype:HTMLInputElement.prototype;', ' var nativeSetter=Object.getOwnPropertyDescriptor(proto,"value").set;', ' nativeSetter.call(ta,newVal);', ' var pos=start+ins.length;', ' ta.setSelectionRange(pos,pos);', ' ta.dispatchEvent(new Event("input",{bubbles:true}));', ' }else if(ta.isContentEditable){', ' var sel=window.getSelection();', ' if(!sel||!sel.rangeCount){var pre0=ta.textContent;ta.appendChild(document.createTextNode((pre0&&pre0.length?", ":"")+tagText));}', ' else{', ' var r=sel.getRangeAt(0);', ' var pr=r.cloneRange();pr.selectNodeContents(ta);pr.setEnd(r.startContainer,r.startOffset);', ' var beforeText=pr.toString();', ' var sep=(beforeText.length>0&&!/[\\s,,]$/.test(beforeText))?", ":"";', ' r.deleteContents();', ' r.insertNode(document.createTextNode(sep+tagText));', ' r.collapse(false);', ' sel.removeAllRanges();sel.addRange(r);', ' }', ' ta.dispatchEvent(new Event("input",{bubbles:true}));', ' }', ' ta.focus();', ' }', ' function _ltRenderCat(cat){', ' if(!cat)return "";', ' var h="";', ' if(_ltRecentTags.length){', ' h+="
最近使用清空
";', ' _ltRecentTags.slice(-10).reverse().forEach(function(t){var s=_ltEsc(t);h+="
"+s+"
";});', ' h+="
";', ' }', ' (cat.groups||[]).forEach(function(g,gi){', ' h+="
";', ' h+="
"+_ltEsc(g.name)+"+
";', ' if(g.open){', ' h+="
";', ' (g.items||[]).forEach(function(it){var s=_ltEsc(it);h+="
"+s+"
";});', ' h+="
";', ' }', ' h+="
";', ' });', ' h+="
+ 新增分组
";', ' return h;', ' }', ' function _ltRenderSearch(){', ' var q=_ltTagSearch,h="
搜索:“"+q+"”
",found=false;', ' _ltCurLibCats().forEach(function(cat){', ' (cat.groups||[]).forEach(function(g){', ' var ms=(g.items||[]).filter(function(it){return String(it).toLowerCase().indexOf(q)>=0;});', ' if(ms.length){', ' found=true;', ' h+="
"+_ltEsc(cat.name)+" · "+_ltEsc(g.name)+"
";', ' ms.forEach(function(it){var s=_ltEsc(it);h+="
"+s+"
";});', ' h+="
";', ' }', ' });', ' });', ' if(!found)h+="
无匹配标签
";', ' return h;', ' }', ' function _ltRenderInserted(){', ' var h="
已插入清空
";', ' if(!_ltRecentTags.length){h+="
还没有插入过标签
";return h;}', ' h+="
";', ' _ltRecentTags.slice().reverse().forEach(function(t){var s=_ltEsc(t);h+="
"+s+"
";});', ' h+="
";', ' return h;', ' }', ' function _ltRenderTagMenu(){', ' if(!_ltTagMenuEl)return;', ' var cats=_ltCurLibCats();', ' var isInserted=_ltTagActiveCat>=cats.length;', ' var sel=_ltTagMenuEl.querySelector("#lt-tag-lib");', ' if(sel)sel.innerHTML=Object.keys(_ltTagLibs).map(function(n){return "";}).join("");', ' var tabs=_ltTagMenuEl.querySelector("#lt-tag-tabs");', ' var th="";', ' cats.forEach(function(c,i){th+=""+(c.icon?_ltEsc(c.icon)+" ":"")+_ltEsc(c.name)+"";});', ' th+="已插入";', ' th+="+";', ' tabs.innerHTML=th;', ' var content=_ltTagMenuEl.querySelector("#lt-tag-content");', ' if(isInserted)content.innerHTML=_ltRenderInserted();', ' else if(_ltTagSearch)content.innerHTML=_ltRenderSearch();', ' else content.innerHTML=_ltRenderCat(cats[_ltTagActiveCat]);', ' }', ' function _ltPosTagMenu(){', ' if(!_ltTagMenuEl||!_ltTagInputEl)return;', ' var mw=_ltTagMenuEl.offsetWidth||688,mh=_ltTagMenuEl.offsetHeight||420;', ' var icon=_ltTagInputEl.parentNode?_ltTagInputEl.parentNode.querySelector(".lt-tag-icon"):null;', ' var ir=icon?icon.getBoundingClientRect():_ltTagInputEl.getBoundingClientRect();', ' var l=ir.right; if(l+mw>window.innerWidth-8)l=window.innerWidth-8-mw; if(l<8)l=8;', ' var t=ir.top-mh; if(t<8)t=ir.bottom+6;', ' _ltTagMenuEl.style.left=l+"px";_ltTagMenuEl.style.top=t+"px";', ' }', ' function _ltShowTagMenu(ta){', ' _ltCloseTagMenu();', ' _ltTagInputEl=ta;', ' var div=document.createElement("div");div.className="lt-tag-menu";div.id="lt-tag-menu";', ' div.innerHTML=', ' "
"', ' +""', ' +""', ' +""', ' +""', ' +"
"', ' +"
"', ' +"
"', ' +"
";', ' document.body.appendChild(div);', ' _ltTagMenuEl=div;', ' var libSel=div.querySelector("#lt-tag-lib");', ' libSel.onchange=function(){_ltCurLib=libSel.value;_ltTagActiveCat=0;_ltSaveLibs();_ltRenderTagMenu();};', ' var search=div.querySelector("#lt-tag-search");', ' search.oninput=function(){_ltTagSearch=search.value.trim().toLowerCase();_ltRenderTagMenu();};', ' div.querySelector("#lt-tag-refresh").onclick=function(){search.value="";_ltTagSearch="";_ltTagActiveCat=0;_ltRenderTagMenu();};', ' div.querySelector("#lt-tag-close").onclick=_ltCloseTagMenu;', ' div.querySelector("#lt-tag-tabs").addEventListener("click",function(e){', ' var tab=e.target.closest(".lt-tag-tab");', ' if(tab){var v=tab.getAttribute("data-cat");_ltTagActiveCat=(v==="ins")?_ltCurLibCats().length:parseInt(v);_ltRenderTagMenu();return;}', ' var ac=e.target.closest("#lt-tag-add-cat");', ' if(ac){var n=prompt("新分类名称:");if(n&&n.trim()){_ltCurLibCats().push({name:n.trim(),icon:"",groups:[{name:"新分组",open:true,items:[]}]});_ltSaveLibs();_ltTagActiveCat=_ltCurLibCats().length-1;_ltRenderTagMenu();}}', ' });', ' div.querySelector("#lt-tag-content").addEventListener("click",function(e){', ' var item=e.target.closest(".lt-tag-item");', ' if(item){_ltInsertTagAtCursor(item.getAttribute("data-text"));_ltPushRecent(item.getAttribute("data-text"));if(_ltTagActiveCat>=_ltCurLibCats().length)_ltRenderTagMenu();return;}', ' var ai=e.target.closest(".lt-tag-add-item");', ' if(ai){var gi=parseInt(ai.getAttribute("data-gi"));var txt=prompt("新标签:");if(txt&&txt.trim()){_ltCurCatGroups()[gi].items.push(txt.trim());_ltSaveLibs();_ltRenderTagMenu();}return;}', ' var gh=e.target.closest(".lt-tag-group-head");', ' if(gh){var gi=parseInt(gh.getAttribute("data-gi"));var g=_ltCurCatGroups()[gi];if(g){g.open=!g.open;_ltSaveLibs();_ltRenderTagMenu();}return;}', ' var ag=e.target.closest(".lt-tag-add-group");', ' if(ag){var n=prompt("新分组名称:");if(n&&n.trim()){_ltCurCatGroups().push({name:n.trim(),open:true,items:[]});_ltSaveLibs();_ltRenderTagMenu();}return;}', ' var rc=e.target.closest(".lt-rec-clear");', ' if(rc){_ltRecentTags=[];try{localStorage.removeItem("_lt_recent");}catch(ex){}_ltRenderTagMenu();return;}', ' var ic=e.target.closest(".lt-ins-clear");', ' if(ic){_ltRecentTags=[];try{localStorage.removeItem("_lt_recent");}catch(ex){}_ltRenderTagMenu();return;}', ' });', ' _ltRenderTagMenu();', ' _ltPosTagMenu();', ' var rz=div.querySelector("#lt-tag-resize");', ' rz.addEventListener("mousedown",function(ev){', ' ev.preventDefault();ev.stopPropagation();', ' var sw=div.offsetWidth,sh=div.offsetHeight,sx=ev.clientX,sy=ev.clientY;', ' var left=parseInt(div.style.left)||0,top=parseInt(div.style.top)||0;', ' function mm(e){', ' var nw=Math.max(240,sw+(e.clientX-sx));', ' var nh=Math.max(160,sh+(e.clientY-sy));', ' if(left+nw>window.innerWidth-8)nw=window.innerWidth-8-left;', ' if(top+nh>window.innerHeight-8)nh=window.innerHeight-8-top;', ' div.style.width=nw+"px";div.style.height=nh+"px";div.style.maxHeight=nh+"px";', ' }', ' function mu(){document.removeEventListener("mousemove",mm);document.removeEventListener("mouseup",mu);document.body.style.userSelect="";}', ' document.addEventListener("mousemove",mm);', ' document.addEventListener("mouseup",mu);', ' document.body.style.userSelect="none";', ' });', ' }', ' function _ltCloseTagMenu(){', ' var el=document.getElementById("lt-tag-menu");if(el)el.remove();', ' _ltTagMenuEl=null;_ltTagInputEl=null;', ' }', ' /* 标签管理已移至面板内联(新增标签 / 分组 / 分类) */', ' (function(){', ' function _ltTagScan(){', ' var els=document.querySelectorAll("textarea,input[type=\\"text\\"],[contenteditable=\\"true\\"]");', '', ' els.forEach(function(ta){', ' if(ta.offsetParent===null)return;', ' /* unified tag icon for all inputs; anchored to parent, shows/hides with input */', ' var wr=ta.parentNode;', ' if(wr&&!wr.querySelector(":scope > .lt-tag-icon")){', ' if(ta.parentNode&&!ta.parentNode.querySelector(".lt-tag-icon")){', ' var wr=ta.parentNode;', ' if(getComputedStyle(wr).position==="static")wr.style.position="relative";', ' var icon=document.createElement("div");', ' icon.className="lt-tag-icon";', ' icon.title="\\u6807\\u7b7e";', ' icon.innerHTML=\'\';', ' icon.style.cssText="position:absolute;right:6px;bottom:6px;z-index:2147483646;width:24px;height:24px;pointer-events:auto;border-radius:6px;display:flex;align-items:center;justify-content:center;cursor:pointer;";', '', '', ' icon.onclick=function(e){e.stopPropagation();if(document.getElementById("lt-tag-menu"))_ltCloseTagMenu();else _ltShowTagMenu(ta);};', ' wr.appendChild(icon);', ' console.log("[LibTV Tag] attached icon to",ta.tagName);', ' }', ' }', ' });', ' }', ' _ltTagScan();', ' setTimeout(function(){console.log("[LibTV Tag] retry scan");_ltTagScan();},3000);', ' _ltTagScan();', ' var _ltTagTimer=null;', ' var _ltTagObs=new MutationObserver(function(){', ' if(_ltTagTimer)clearTimeout(_ltTagTimer);', ' _ltTagTimer=setTimeout(_ltTagScan,100);', ' });', ' _ltTagObs.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["style","class","hidden"]});', ' setInterval(_ltTagScan,1500);', ' })();', /* ———— 悬浮提示词按钮 ———— */ ' (function(){', ' var btn=document.createElement("div");', ' btn.id="libtv-pbtn";', ' btn.title="提示词工具 (P)";', ' btn.innerHTML=\'\';', ' btn.style.cssText="position:fixed;right:60px;bottom:70px;z-index:99998;width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,rgba(99,102,241,0.9),rgba(79,70,229,0.9));color:#fff;display:flex;align-items:center;justify-content:center;cursor:grab;user-select:none;box-shadow:0 4px 16px rgba(99,102,241,0.25);";', ' btn.onmouseenter=function(){btn.style.transform="scale(1.08)";btn.style.boxShadow="0 6px 24px rgba(99,102,241,0.35)";};', ' btn.onmouseleave=function(){btn.style.transform="scale(1)";btn.style.boxShadow="0 4px 16px rgba(99,102,241,0.25)";};', ' document.body.appendChild(btn);', ' function _ltPosPanel(){', ' var p=document.getElementById("libtv-prompt");if(!p)return;', ' var r=btn.getBoundingClientRect(),pw=Math.min(520,window.innerWidth-32),ph=p.offsetHeight||400;', ' p.style.left=Math.max(12,Math.min(r.left+r.width/2-pw/2,window.innerWidth-pw-12))+"px";', ' var t=r.bottom+10;if(t+ph>window.innerHeight-12)t=Math.max(12,r.top-ph-10);', ' p.style.top=t+"px";p.style.transform="none";', ' }', ' function _ltToggle(){', ' var p=document.getElementById("libtv-prompt");if(p){p.remove();return;}', ' _ltPromptPanel(btn);_ltPosPanel();', ' }', ' btn.onclick=_ltToggle;', ' function _ltClamp(){var pw=36,ph=36;var l=parseInt(btn.style.left);var t=parseInt(btn.style.top);if(!isNaN(l)){l=Math.max(4,Math.min(l,window.innerWidth-pw-4));btn.style.left=l+"px";}if(!isNaN(t)){t=Math.max(4,Math.min(t,window.innerHeight-ph-4));btn.style.top=t+"px";}_ltPosPanel();}', ' var dx=0,dy=0,dragging=false;', ' btn.addEventListener("mousedown",function(e){dragging=true;dx=e.clientX-btn.offsetLeft;dy=e.clientY-btn.offsetTop;e.preventDefault();});', ' document.addEventListener("mousemove",function(e){if(!dragging)return;var pw=36,ph=36,l=e.clientX-dx,t=e.clientY-dy;l=Math.max(4,Math.min(l,window.innerWidth-pw-4));t=Math.max(4,Math.min(t,window.innerHeight-ph-4));btn.style.left=l+"px";btn.style.top=t+"px";btn.style.right="auto";btn.style.bottom="auto";_ltPosPanel();});', ' document.addEventListener("mouseup",function(){if(dragging){dragging=false;try{localStorage.removeItem("_lt_pbtn_r");localStorage.removeItem("_lt_pbtn_b");localStorage.removeItem("_lt_pbtn_x");localStorage.removeItem("_lt_pbtn_y");}catch(ex){}}});', ' window.addEventListener("resize",_ltClamp);', ' })();', /* ———— 直角连线 ———— */ ' var _ltStepTo=null;', ' function _ltStepEdges(){', ' document.querySelectorAll(".react-flow__edges path").forEach(function(p){', ' var d=p.getAttribute("d")||"";', ' if(d.indexOf("C")===-1)return;', ' try{', ' var len=p.getTotalLength();', ' if(!len||isNaN(len))return;', ' var s=p.getPointAtLength(0),e=p.getPointAtLength(len);', ' p.setAttribute("d","M "+s.x+" "+s.y+" L "+e.x+" "+s.y+" L "+e.x+" "+e.y);', ' }catch(ex){}', ' });', ' }', ' var _ltStepObs=null,_ltStepRetries=0;', ' function _ltStepApply(){', ' if(_ltStepTo){clearTimeout(_ltStepTo);_ltStepTo=null;}', ' var ed=document.querySelector(".react-flow__edges");', ' if(!ed){if(++_ltStepRetries>5)return;_ltStepTo=setTimeout(_ltStepApply,500);return;}', ' _ltStepRetries=0;', ' if(document.body.classList.contains("libtv-step-edges")){', ' _ltStepEdges();', ' if(!_ltStepObs){', ' var _ltStepParent=document.querySelector(".react-flow")||document.body;', ' _ltStepObs=new MutationObserver(function(){_ltStepRetries=0;_ltStepApply();});', ' _ltStepObs.observe(_ltStepParent,{childList:true,subtree:true,attributes:true,attributeFilter:["d"]});', ' }', ' }else{', ' if(_ltStepObs){_ltStepObs.disconnect();_ltStepObs=null;}', ' }', ' }', ' var _ltStepOn=localStorage.getItem("_lt_step")==="1";', ' if(_ltStepOn){ document.body.classList.add("libtv-step-edges"); _ltStepApply(); }', /* ———— 快捷键 ———— */ ' document.addEventListener("keydown",function(e){', ' if(e.ctrlKey||e.metaKey||e.altKey)return;', /* Escape 始终可用 */ ' if(e.key==="Escape"){', ' var _handled=false; var _tm=document.getElementById("lt-tag-menu"); if(_tm){_ltCloseTagMenu();_handled=true;}', ' _ltClearChain();', ' var _ss=document.getElementById("libtv-search"); if(_ss){_ss.remove();_handled=true;}', ' var _pp=document.getElementById("libtv-prompt"); if(_pp){_pp.remove();_handled=true;}', ' var _dd=document.getElementById("lt-debug"); if(_dd){_dd.remove();_handled=true;}', ' if(_handled){e.preventDefault();e.stopPropagation();}', ' return;', ' }', ' var t=e.target||document.activeElement;', ' if(t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.isContentEditable)){', ' return;', ' }', /* G: 网格 */ ' if(e.key==="g"||e.key==="G"){', ' e.preventDefault(); e.stopPropagation();', ' var bg=document.querySelector(".react-flow__background");', ' if(bg) bg.classList.toggle("perf-no-grid");', ' try{localStorage.setItem("_lt_grid",bg.classList.contains("perf-no-grid")?"1":"0");}catch(ex){}', ' return;', ' }', /* T: 性能 */ ' if(e.key==="t"||e.key==="T"){', ' e.preventDefault(); e.stopPropagation();', ' document.body.classList.toggle("perf-mode");', ' try{localStorage.setItem("_lt_perf",document.body.classList.contains("perf-mode")?"1":"0");}catch(ex){}', ' return;', ' }', /* H: 隐藏图片 */ ' if(e.key==="h"||e.key==="H"){', ' e.preventDefault(); e.stopPropagation();', ' document.body.classList.toggle("perf-hide-imgs");', ' try{localStorage.setItem("_lt_hide",document.body.classList.contains("perf-hide-imgs")?"1":"0");}catch(ex){}', ' return;', ' }', /* L: 隐藏连线 */ ' if(e.key==="l"||e.key==="L"){', ' e.preventDefault(); e.stopPropagation();', ' var edges=document.querySelector(".react-flow__edges");', ' if(edges) edges.classList.toggle("perf-hide-edges");', ' try{localStorage.setItem("_lt_edges",edges.classList.contains("perf-hide-edges")?"1":"0");}catch(ex){}', ' return;', ' }', /* C: 自动全链路模式 */ ' if(e.key==="c"||e.key==="C"){', ' e.preventDefault(); e.stopPropagation();', ' _ltAutoChain=!_ltAutoChain;', ' document.body.classList.toggle("libtv-autochain",_ltAutoChain);', ' try{localStorage.setItem("_lt_autochain",_ltAutoChain?"1":"0");}catch(ex){}', ' if(!_ltAutoChain) _ltClearChain();', ' return;', ' }', /* F: 搜索 */ ' if(e.key==="f"||e.key==="F"){', ' e.preventDefault(); e.stopPropagation();', ' _ltSearch();', ' return;', ' }', /* P: 提示词工具 */ ' if(e.key==="p"||e.key==="P"){', ' e.preventDefault(); e.stopPropagation();', ' _ltPromptPanel();', ' return;', ' }', /* X: 专注模式 */ ' if(e.key==="x"||e.key==="X"){', ' e.preventDefault(); e.stopPropagation();', ' document.body.classList.toggle("libtv-focus");', ' try{localStorage.setItem("_lt_focus",document.body.classList.contains("libtv-focus")?"1":"0");}catch(ex){}', ' return;', ' }', /* R: 直角连线 */ ' if(e.key==="r"||e.key==="R"){', ' e.preventDefault(); e.stopPropagation();', ' document.body.classList.toggle("libtv-step-edges");', ' try{localStorage.setItem("_lt_step",document.body.classList.contains("libtv-step-edges")?"1":"0");}catch(ex){}', ' _ltStepApply();', ' return;', ' }', /* ?: 帮助(固定/取消固定快捷键提示) */ ' if(e.key==="?"||e.key==="/"){', ' e.preventDefault(); e.stopPropagation();', ' var h=document.getElementById("libtv-help");', ' if(h){ h.classList.toggle("libtv-pin"); if(h.classList.contains("libtv-pin")) h.classList.remove("libtv-hide"); else h.classList.add("libtv-hide"); }', ' return;', ' }', ' }, true);', /* ———— 通用 HTML 转义(防止内容包/用户输入造成 XSS) ———— */ ' function _ltEsc(s){return String(s==null?"":s).replace(/&/g,"&").replace(//g,">").replace(/"/g,""");}', ' function _ltToast(m,t){t=t||"info";var e=document.createElement("div");e.className="lt-toast lt-toast-"+t;e.textContent=m;document.body.appendChild(e);setTimeout(function(){e.classList.add("show");},10);setTimeout(function(){e.classList.remove("show");setTimeout(function(){e.remove();},300);},3000);}', /* ———— 内容包:导出 / 导入(提示词 + 标签) ———— */ ' function _ltBuildContentPack(){', ' var prompts=JSON.parse(localStorage.getItem("_lt_prompts")||"[]");', ' var tagLibs=JSON.parse(localStorage.getItem("_lt_tag_libs")||"null")||{};', ' var curLib=localStorage.getItem("_lt_cur_lib")||"默认标签";', ' return {app:"libtv-boost",type:"content-pack",version:1,exportedAt:new Date().toISOString(),currentLib:curLib,prompts:prompts,tagLibs:tagLibs};', ' }', ' function _ltDownloadContentPack(){', ' var str=JSON.stringify(_ltBuildContentPack(),null,2);', ' var blob=new Blob([str],{type:"application/json"});', ' var url=URL.createObjectURL(blob);', ' var a=document.createElement("a");', ' var d=new Date(),pad=function(n){return (n<10?"0":"")+n;};', ' a.href=url;a.download="libtv-content-pack-"+d.getFullYear()+"-"+pad(d.getMonth()+1)+"-"+pad(d.getDate())+".json";', ' document.body.appendChild(a);a.click();a.remove();', ' setTimeout(function(){try{URL.revokeObjectURL(url);}catch(e){}},1000);', ' }', ' function _ltImportContentPackFromFile(){', ' var inp=document.createElement("input");inp.type="file";inp.accept="application/json,.json";', ' inp.onchange=function(){var f=inp.files&&inp.files[0];if(!f)return;var r=new FileReader();r.onload=function(){try{_ltShowContentPackChooser(String(r.result));}catch(e){_ltToast("内容包解析失败:"+e.message,"error");}};r.readAsText(f);};', ' inp.click();', ' }', ' function _ltShowContentPackChooser(text){', ' var data;try{data=JSON.parse(text);}catch(e){_ltToast("不是有效的 JSON 内容包:"+e.message,"error");return;}', ' if(!data||data.type!=="content-pack"){_ltToast("文件不是 libtv-boost 内容包","error");return;}', ' var ov=document.createElement("div");ov.id="lt-cp-overlay";', ' ov.style.cssText="position:fixed;inset:0;background:rgba(0,0,0,0.6);z-index:2147483647;display:flex;align-items:center;justify-content:center;";', ' var box=document.createElement("div");', ' box.style.cssText="background:#1b1d2a;border:1px solid rgba(129,140,248,0.3);border-radius:12px;padding:22px;min-width:320px;max-width:90vw;color:#e7e9f3;font-family:inherit;";', ' var pcount=Array.isArray(data.prompts)?data.prompts.length:0;', ' var tcount=data.tagLibs?Object.keys(data.tagLibs).length:0;', ' box.innerHTML=\'
导入内容包
\'', ' +\'
检测到 \'+pcount+\' 条提示词 · \'+tcount+\' 个标签库
\'', ' +\'
\'', ' +\'\'', ' +\'\'', ' +\'\'', ' +\'
\';', ' ov.appendChild(box);document.body.appendChild(ov);', ' function close(){if(ov.parentNode)ov.parentNode.removeChild(ov);}', ' document.getElementById("lt-cp-replace").onclick=function(){close();_ltApplyContentPack(data,"replace");};', ' document.getElementById("lt-cp-merge").onclick=function(){close();_ltApplyContentPack(data,"merge");};', ' document.getElementById("lt-cp-cancel").onclick=close;', ' ov.onclick=function(e){if(e.target===ov)close();};', ' }', ' function _ltApplyContentPack(data,mode){', ' try{', ' if(mode==="replace"){', ' if(Array.isArray(data.prompts))localStorage.setItem("_lt_prompts",JSON.stringify(data.prompts));', ' if(data.tagLibs&&typeof data.tagLibs==="object")localStorage.setItem("_lt_tag_libs",JSON.stringify(data.tagLibs));', ' if(data.currentLib)localStorage.setItem("_lt_cur_lib",data.currentLib);', ' }else{', ' var prompts=JSON.parse(localStorage.getItem("_lt_prompts")||"[]");', ' var seen={};prompts.forEach(function(p){seen[(p&&p.id)||("n"+Math.random())]=true;});', ' (data.prompts||[]).forEach(function(p){if(p&&p.id&&!seen[p.id]){prompts.push(p);seen[p.id]=true;}});', ' localStorage.setItem("_lt_prompts",JSON.stringify(prompts));', ' var tagLibs=JSON.parse(localStorage.getItem("_lt_tag_libs")||"null");if(!tagLibs)tagLibs={};', ' var src=data.tagLibs||{};', ' for(var k in src){if(!src.hasOwnProperty(k))continue;', ' if(!tagLibs[k]){tagLibs[k]=src[k];continue;}', ' var dstCats=tagLibs[k].categories||[];var srcCats=src[k].categories||[];', ' srcCats.forEach(function(c){', ' var ex=null;for(var i=0;i⚙ \\u8bbe\\u7f6e\\u2715"', ' +"
";', ' /* \\u5f00\\u5173 */', ' var toggles=[', ' {k:"perf",l:"\\u6027\\u80fd\\u6a21\\u5f0f"},', ' {k:"hide",l:"\\u9690\\u85cf\\u56fe\\u7247"},', ' {k:"edges",l:"\\u9690\\u85cf\\u8fde\\u7ebf"},', ' {k:"grid",l:"\\u9690\\u85cf\\u7f51\\u683c"},', ' {k:"focus",l:"\\u4e13\\u6ce8\\u6a21\\u5f0f"},', ' ];', ' h+="
\\u5f00\\u5173
";', ' toggles.forEach(function(t){', ' var on=document.body.classList.contains("perf-mode")||localStorage.getItem("_lt_"+t.k)==="1";', ' h+="
"+t.l+"
";', ' });', ' h+="
";', ' /* API */', ' var api=JSON.parse(localStorage.getItem("_lt_prompt_api")||"{}");', ' h+="
AI \\u589e\\u5f3a API
"', ' +"
"', ' +"
"', ' +"
"', ' +"
"', ' +"
";', ' /* \\u6570\\u636e */', ' h+="
\\u6570\\u636e\\u7ba1\\u7406
"', ' +"
"', ' +""', ' +"
"', ' +""', ' +""', ' +"
"', ' +"
";', ' /* \\u5173\\u4e8e */', ' h+="
\\u5173\\u4e8e
"', ' +"
LibTV Canvas Boost v1.9.4
\\u6e90\\u7801\\u6a21\\u5757\\u5316\\u6784\\u5efa\\uff0c\\u63d0\\u4f9b\\u6027\\u80fd\\u4f18\\u5316\\u3001\\u89c6\\u89c9\\u589e\\u5f3a\\u3001AI \\u63d0\\u793a\\u8bcd\\u3001\\u6807\\u7b7e\\u7cfb\\u7edf
"', ' +"
";', ' h+="
";', ' div.innerHTML=h;', ' document.body.appendChild(div);', ' /* \\u5f00\\u5173\\u4e8b\\u4ef6 */', ' div.querySelectorAll(".lt-settings-toggle").forEach(function(el){', ' el.onclick=function(){', ' var k=this.getAttribute("data-key");', ' var v=localStorage.getItem("_lt_"+k)!=="1";', ' localStorage.setItem("_lt_"+k,v?"1":"0");', ' if(k==="grid"){var bg=document.querySelector(".react-flow__background");if(bg)bg.classList.toggle("perf-no-grid",v);}', ' else if(k==="edges"){var ed=document.querySelector(".react-flow__edges");if(ed)ed.classList.toggle("perf-hide-edges",v);}', ' else document.body.classList.toggle(k==="perf"?"perf-mode":k==="hide"?"perf-hide-imgs":"libtv-"+k,v);', ' this.querySelector(".lt-settings-switch").classList.toggle("on",v);', ' };', ' });', ' /* API \\u4fdd\\u5b58 */', ' document.getElementById("lt-set-api-save").onclick=function(){', ' var d={url:document.getElementById("lt-set-url").value.trim(),key:document.getElementById("lt-set-key").value.trim(),model:document.getElementById("lt-set-model").value.trim()||"deepseek-v4-flash"};', ' localStorage.setItem("_lt_prompt_api",JSON.stringify(d));', ' document.getElementById("lt-set-api-status").textContent="\\u2705 \\u5df2\\u4fdd\\u5b58";', ' };', ' /* \\u6570\\u636e\\u6e05\\u5355 */', ' var keys=[["_lt_tag_libs","\\u6807\\u7b7e\\u5e93"],["_lt_cur_lib","\\u5f53\\u524d\\u6807\\u7b7e\\u5e93"],["_lt_recent","\\u5df2\\u63d2\\u5165\\u5386\\u53f2"]];', ' var dl=document.getElementById("lt-settings-dlist");', ' keys.forEach(function(kv){', ' var val=localStorage.getItem(kv[0]);', ' if(!val)return;', ' var size=Math.round(val.length/1024);', ' var el=document.createElement("div");el.className="lt-settings-ditem";', ' el.innerHTML=""+kv[1]+""+size+"KB";', ' el.querySelector(".lt-settings-dclear").onclick=function(e){e.stopPropagation();localStorage.removeItem(this.getAttribute("data-key"));el.remove();};', ' dl.appendChild(el);', ' });', ' /* \\u5bfc\\u51fa\\u5168\\u90e8 */', ' document.getElementById("lt-set-export-all").onclick=function(){', ' var data={};', ' keys.forEach(function(kv){var v=localStorage.getItem(kv[0]);if(v)data[kv[0]]=v;});', ' data._version="1.8.3";', ' data._exportedAt=new Date().toISOString();', ' var blob=new Blob([JSON.stringify(data,null,2)],{type:"application/json"});', ' var url=URL.createObjectURL(blob);', ' var a=document.createElement("a");a.href=url;a.download="libtv-boost-config-"+new Date().toISOString().slice(0,10)+".json";a.click();', ' setTimeout(function(){URL.revokeObjectURL(url);},1000);', ' };', ' document.getElementById("lt-set-cp-export").onclick=function(){ _ltDownloadContentPack(); };', ' document.getElementById("lt-set-cp-import").onclick=function(){ _ltImportContentPackFromFile(); };', ' /* \\u5173\\u95ed */', ' document.getElementById("lt-settings-close").onclick=function(){div.remove();};', ' }', ' window._ltOpenSettings=_ltSettingsPanel;', ' window._ltContent={exportPack:_ltDownloadContentPack,importFile:_ltImportContentPackFromFile};', ' window._ltShowTagMenu=_ltShowTagMenu;', ' console.log("[LibTV Boost] v1.9.4 · G网格 T性能 H隐藏 L连线 C全链 F搜索 P提示词 X专注 R直角 ?帮助 · AI增强 · DIY主题 · 画布配色 · 模板变量 · 标签 · 内容包 · by oocc00");', '})();' ].join('\n'); document.body.appendChild(hook); /* ========================================================= * 4. 菜单开关 + 状态持久化 * ========================================================= */ var _toggles = { perf: function(v){ document.body.classList.toggle('perf-mode', v); }, hide: function(v){ document.body.classList.toggle('perf-hide-imgs', v); }, grid: function(v){ var bg = document.querySelector('.react-flow__background'); if(bg) bg.classList.toggle('perf-no-grid', v); }, edges: function(v){ var edges = document.querySelector('.react-flow__edges'); if(edges) edges.classList.toggle('perf-hide-edges', v); }, focus: function(v){ document.body.classList.toggle('libtv-focus', v); }, }; function _read(){ var s = {}; for(var k in _toggles) if(_toggles.hasOwnProperty(k)) s[k] = localStorage.getItem('_lt_'+k) === '1'; return s; } function _apply(){ var s = _read(); for(var k in _toggles) if(_toggles.hasOwnProperty(k)) _toggles[k](s[k]); } function _click(key){ var v = localStorage.getItem('_lt_'+key) !== '1'; localStorage.setItem('_lt_'+key, v ? '1' : '0'); _toggles[key](v); } setTimeout(_apply, 1000); GM_registerMenuCommand('⚙ 设置', function(){ if(unsafeWindow._ltOpenSettings) unsafeWindow._ltOpenSettings(); }); GM_registerMenuCommand('🔍 诊断', function(){ try { var info = []; info.push('=== 边 (class 含 edge) ==='); var es = document.querySelectorAll('[class*="edge"]'); info.push('数量: ' + es.length); for(var i=0;i
'; document.body.appendChild(div); document.getElementById('lt-dbg-copy').onclick = function(){ navigator.clipboard.writeText(txt).then(function(){ document.getElementById('lt-dbg-copy').textContent = '✅ 已复制'; }); }; document.getElementById('lt-dbg-close').onclick = function(){ div.remove(); }; } catch(e){ alert(e.message); } }); })();