dudu-converter-cli 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
.app-icon[data-v-84fb32bd]{flex-shrink:0;display:block}.update-banner[data-v-69c975e5]{position:relative;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 auto 18px;max-width:1280px;width:100%;padding:10px 16px;background:linear-gradient(92deg,#fff8e6,#fffdf5);border:1px solid #f3d9a4;border-radius:var(--radius-sm);font-size:13px;color:#92540a}.update-banner[data-v-69c975e5] .app-icon{color:#d99a1e}.banner-text[data-v-69c975e5]{flex:1;min-width:200px;font-weight:600}.copy[data-v-69c975e5]{display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:8px;padding:6px 12px;background:#d99a1e;color:#fff;font-size:12px;font-weight:650;transition:filter var(--ease)}.copy[data-v-69c975e5]:hover{filter:brightness(1.08)}.copy[data-v-69c975e5]:active{transform:var(--press)}.copy.ok[data-v-69c975e5]{background:#059669}.how[data-v-69c975e5]{display:inline-flex;align-items:center;gap:4px;background:transparent;color:#92540a;padding:4px 8px;font-size:12px;font-weight:600}.how[data-v-69c975e5]:hover{background:#d99a1e1f}.how svg[data-v-69c975e5]{transition:transform var(--ease)}.how svg.open[data-v-69c975e5]{transform:rotate(180deg)}.close[data-v-69c975e5]{background:transparent;color:#b98a3e;padding:4px;border-radius:6px}.close[data-v-69c975e5]:hover{background:#d99a1e26}.banner-detail[data-v-69c975e5]{flex-basis:100%;margin-top:6px;padding-top:8px;border-top:1px dashed #ecd9ae}.banner-detail ol[data-v-69c975e5]{margin:0;padding-left:18px;display:grid;gap:3px}.banner-detail li[data-v-69c975e5]{font-size:12.5px;color:#7a5417;line-height:1.7}.app-shell[data-v-e736b31c]{min-height:100vh;display:flex;flex-direction:column}.app-header[data-v-e736b31c]{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:28px;padding:12px 28px;background:#ffffffdb;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--border)}.brand[data-v-e736b31c]{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--text)}.brand strong[data-v-e736b31c]{font-size:15px;letter-spacing:-.2px}.logo[data-v-e736b31c]{width:36px;height:36px;display:grid;place-items:center;border-radius:10px;background:linear-gradient(135deg,#818cf8,#34d399);color:#fff;font-size:16px;font-weight:700;box-shadow:0 0 20px #818cf859}nav[data-v-e736b31c]{display:flex;gap:4px;margin-right:auto}nav a[data-v-e736b31c]{color:var(--text-2);text-decoration:none;font-weight:600;font-size:13.5px;padding:7px 14px;border-radius:999px;transition:background-color var(--ease),color var(--ease)}nav a[data-v-e736b31c]:hover{color:var(--primary);background:var(--primary-soft)}nav a.router-link-active[data-v-e736b31c]{color:var(--primary);background:var(--primary-soft)}.connection[data-v-e736b31c]{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:600;color:var(--success)}.connection.offline[data-v-e736b31c]{color:var(--danger)}.connection .dot[data-v-e736b31c]{width:8px;height:8px;border-radius:50%;background:currentColor;animation:pulse-e736b31c 2s ease infinite}.connection.offline .dot[data-v-e736b31c]{animation:none}@keyframes pulse-e736b31c{0%,to{box-shadow:0 0 #04785759}50%{box-shadow:0 0 0 5px #04785700}}main[data-v-e736b31c]{flex:1;padding:28px;max-width:1280px;margin:0 auto;width:100%}.history[data-v-b299457c]{display:grid;gap:16px;max-width:900px;margin:0 auto}.page-subtitle[data-v-b299457c]{margin:0 0 6px}.toolbar[data-v-b299457c]{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.hint-alert[data-v-b299457c]{display:flex;align-items:center;gap:8px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.toolbar-right[data-v-b299457c]{display:flex;align-items:center;gap:10px}.icon-btn[data-v-b299457c]{padding:5px;border-radius:8px;background:transparent;color:var(--muted)}.icon-btn[data-v-b299457c]:hover{background:var(--danger-soft);color:var(--danger)}.icon-btn[data-v-b299457c]:active{transform:var(--press)}.filters[data-v-b299457c]{display:flex;gap:8px}.filter-chip[data-v-b299457c]{display:inline-flex;align-items:center;gap:7px;padding:7px 15px;border-radius:999px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:650;color:var(--text-2);transition:all var(--ease)}.filter-chip em[data-v-b299457c]{font-style:normal;font-size:11.5px;color:var(--muted)}.filter-chip[data-v-b299457c]:hover{border-color:#b9cdf8;color:var(--primary)}.filter-chip[data-v-b299457c]:active{transform:var(--press)}.filter-chip.active[data-v-b299457c]{background:var(--primary);border-color:var(--primary);color:#fff}.filter-chip.active em[data-v-b299457c]{color:#ffffffbf}.search[data-v-b299457c]{display:flex;align-items:center;gap:8px;min-width:220px;color:var(--muted);border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;padding:0 12px}.search input[data-v-b299457c]{border:none;min-height:36px}.search input[data-v-b299457c]:focus{box-shadow:none}.day-group[data-v-b299457c]{display:grid;gap:8px}.day-head[data-v-b299457c]{display:flex;align-items:baseline;gap:10px;font-weight:750;font-size:14px;padding:4px 4px 0}.day-head em[data-v-b299457c]{font-style:normal;font-size:12px;color:var(--muted);font-weight:500}.day-list[data-v-b299457c]{display:grid;padding:6px 0}.history-item[data-v-b299457c]{display:flex;align-items:center;gap:14px;padding:12px 18px;transition:background-color var(--ease)}.history-item[data-v-b299457c]:hover{background:#fafbfe}.history-item+.history-item[data-v-b299457c]{border-top:1px solid var(--border)}.item-icon[data-v-b299457c]{width:38px;height:38px;flex-shrink:0;display:grid;place-items:center;border-radius:10px;color:var(--primary);background:var(--primary-soft)}.item-icon.failed[data-v-b299457c]{color:var(--danger);background:var(--danger-soft)}.item-icon.success[data-v-b299457c]{color:var(--success);background:var(--success-soft)}.item-main[data-v-b299457c]{flex:1;min-width:0;display:grid;gap:3px}.item-title[data-v-b299457c]{display:flex;align-items:center;gap:8px;min-width:0}.item-title strong[data-v-b299457c]{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13.5px}.arrow[data-v-b299457c]{color:var(--muted);display:grid;place-items:center}.target[data-v-b299457c]{font-weight:800;font-size:12px;color:var(--primary)}.item-title .badge[data-v-b299457c]{margin-left:auto}.spinner.tiny[data-v-b299457c]{width:12px;height:12px;border-width:2px}.item-meta[data-v-b299457c]{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-text[data-v-b299457c]{color:var(--danger)}.row-badge[data-v-b299457c]{flex-shrink:0;margin-left:auto}.item-actions[data-v-b299457c]{display:flex;gap:8px;flex-shrink:0;align-items:center}.item-actions .ghost.tiny[data-v-b299457c]{padding:6px 12px;font-size:12px;text-decoration:none;white-space:nowrap}.empty[data-v-b299457c]{display:grid;gap:10px;justify-items:center;color:var(--muted)}.landing[data-v-63ba655a]{display:grid;gap:64px}.hero[data-v-63ba655a]{padding:52px 44px 40px;border-radius:24px;border:1px solid var(--border);background:radial-gradient(900px 420px at 12% -10%,rgb(37 99 235 / 12%),transparent 60%),radial-gradient(700px 360px at 100% 0%,rgb(124 58 237 / 9%),transparent 55%),linear-gradient(180deg,#fbfcff,#f7f9fd)}.hero-grid[data-v-63ba655a]{display:grid;grid-template-columns:1fr 1.08fr;gap:40px;align-items:center}.hero-badge[data-v-63ba655a]{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:12.5px;font-weight:700}.hero h1[data-v-63ba655a]{margin:16px 0 0;font-size:42px;font-weight:800;letter-spacing:-1.2px;line-height:1.22}.hero h1 em[data-v-63ba655a]{font-style:normal;background:linear-gradient(92deg,var(--primary),#7c3aed);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.tagline[data-v-63ba655a]{margin:14px 0 0;color:var(--text-2);font-size:15px;max-width:460px;line-height:1.85}.cta-row[data-v-63ba655a]{display:flex;gap:12px;margin-top:26px;flex-wrap:wrap}.cta[data-v-63ba655a]{padding:13px 30px;font-size:15px;border-radius:12px}.local-badge[data-v-63ba655a]{margin:14px 0 0;display:inline-flex;align-items:center;gap:6px;color:var(--success);background:var(--success-soft);border-radius:999px;padding:6px 15px;font-size:13px;font-weight:600}.terminal-card[data-v-63ba655a]{border-radius:16px;background:#0f172a;box-shadow:0 24px 60px -18px #0f172a8c,0 0 0 1px #0f172a0a;overflow:hidden}.term-head[data-v-63ba655a]{display:flex;align-items:center;gap:12px;padding:13px 18px;background:#ffffff0d;border-bottom:1px solid rgb(255 255 255 / 8%)}.dots[data-v-63ba655a]{display:inline-flex;gap:6px}.dots i[data-v-63ba655a]{width:11px;height:11px;border-radius:50%;background:#ff5f57}.dots i[data-v-63ba655a]:nth-child(2){background:#febc2e}.dots i[data-v-63ba655a]:nth-child(3){background:#28c840}.term-head strong[data-v-63ba655a]{color:#e2e8f0;font-size:13px;font-weight:650;margin-right:auto}.term-pills[data-v-63ba655a]{display:inline-flex;gap:3px;padding:3px;border-radius:8px;background:#ffffff14}.term-pills button[data-v-63ba655a]{border:none;background:transparent;color:#94a3b8;padding:4px 12px;border-radius:6px;font-size:11.5px;font-weight:700;cursor:pointer;transition:all var(--ease)}.term-pills button.active[data-v-63ba655a]{background:#2563eb;color:#fff}.term-body[data-v-63ba655a]{padding:18px}.command-row code[data-v-63ba655a]{display:block;padding:12px 14px;background:#ffffff0f;color:#7dd3fc;border-radius:10px;font-size:12.5px;line-height:1.7;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;word-break:break-all}.command-row code .prompt[data-v-63ba655a]{color:#64748b;margin-right:8px;-webkit-user-select:none;user-select:none}.one-click[data-v-63ba655a]{width:100%;margin-top:10px;display:inline-flex;align-items:center;justify-content:center;gap:7px;border:none;cursor:pointer;border-radius:9px;padding:9px;background:linear-gradient(92deg,#2563eb,#3b82f6);color:#fff;font-size:13px;font-weight:700;transition:filter var(--ease),transform var(--ease),background var(--ease)}.one-click[data-v-63ba655a]:hover{filter:brightness(1.08)}.one-click[data-v-63ba655a]:active{transform:var(--press)}.one-click.ok[data-v-63ba655a]{background:linear-gradient(92deg,#059669,#10b981)}.term-steps[data-v-63ba655a]{list-style:none;margin:16px 0 0;padding:0;display:grid;gap:9px}.term-steps li[data-v-63ba655a]{display:flex;gap:9px;align-items:baseline;color:#94a3b8;font-size:12px;line-height:1.6}.term-steps li span[data-v-63ba655a]{flex-shrink:0;width:17px;height:17px;display:grid;place-items:center;border-radius:50%;background:#2563eb4d;color:#93c5fd;font-size:10.5px;font-weight:800;transform:translateY(2px)}.stats[data-v-63ba655a]{display:flex;gap:clamp(24px,6vw,64px);margin-top:34px;padding-top:26px;border-top:1px solid var(--border);flex-wrap:wrap}.stat[data-v-63ba655a]{display:grid;gap:2px}.stat strong[data-v-63ba655a]{font-size:25px;font-weight:800;letter-spacing:-.5px}.stat span[data-v-63ba655a]{font-size:12.5px;color:var(--muted);font-weight:600}.section[data-v-63ba655a]{display:grid;gap:16px}.section h2[data-v-63ba655a]{margin:0;font-size:22px;font-weight:780;letter-spacing:-.4px}.section-sub[data-v-63ba655a]{margin:-8px 0 0;color:var(--muted);font-size:13.5px}.pain-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.pain-card[data-v-63ba655a]{display:flex;gap:14px;padding:20px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),transform var(--ease)}.pain-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.icon[data-v-63ba655a]{display:grid;place-items:center;border-radius:12px;flex-shrink:0}.icon.pain[data-v-63ba655a]{width:42px;height:42px;color:var(--danger);background:var(--danger-soft)}.pain-card strong[data-v-63ba655a]{display:block;margin-bottom:4px;font-size:14.5px}.pain-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:13px;line-height:1.7}.value-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.value-card[data-v-63ba655a]{position:relative;display:grid;gap:10px;padding:24px 22px;justify-items:start;background:linear-gradient(180deg,#fff,#fbfdff);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;transition:box-shadow var(--ease),transform var(--ease),border-color var(--ease)}.value-card[data-v-63ba655a]:before{content:"";position:absolute;inset:0 0 auto 0;height:3px;background:linear-gradient(90deg,var(--primary),#7c3aed);opacity:0;transition:opacity var(--ease)}.value-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px);border-color:#d6e2fb}.value-card[data-v-63ba655a]:hover:before{opacity:1}.icon.value[data-v-63ba655a]{width:46px;height:46px;color:var(--primary);background:var(--primary-soft);border-radius:13px}.value-card strong[data-v-63ba655a]{font-size:15px}.value-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:13px;line-height:1.75}.category-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}@media (min-width: 1024px){.category-grid[data-v-63ba655a]{grid-template-columns:repeat(4,1fr)}.category-grid .category-card[data-v-63ba655a]:nth-child(7){grid-column:span 2}}.category-card[data-v-63ba655a]{display:flex;gap:14px;padding:17px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),border-color var(--ease),transform var(--ease)}.category-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);border-color:#d6e2fb;transform:translateY(-2px)}.icon.cat[data-v-63ba655a]{width:42px;height:42px;color:var(--primary);background:var(--primary-soft)}.cat-body[data-v-63ba655a]{display:grid;gap:3px;min-width:0}.cat-body strong[data-v-63ba655a]{font-size:14.5px}.cat-body p[data-v-63ba655a]{margin:0;font-size:13px;color:var(--text-2)}.cat-body small[data-v-63ba655a]{color:var(--muted);font-size:12px}.scene-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px}.scene-card[data-v-63ba655a]{display:flex;gap:13px;padding:17px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),transform var(--ease)}.scene-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.icon.scene[data-v-63ba655a]{width:40px;height:40px;color:var(--primary);background:var(--primary-soft)}.scene-card div[data-v-63ba655a]{min-width:0}.scene-card strong[data-v-63ba655a]{display:block;margin-bottom:3px;font-size:14px}.scene-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:12.5px;line-height:1.65}.table-wrap[data-v-63ba655a]{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:#fff}.compare-table[data-v-63ba655a]{width:100%;border-collapse:collapse;font-size:13.5px;min-width:560px}.compare-table th[data-v-63ba655a]{text-align:left;padding:12px 18px;background:#f7f9fc;color:var(--muted);font-size:12px;font-weight:700;border-bottom:1px solid var(--border)}.compare-table td[data-v-63ba655a]{padding:13px 18px;border-bottom:1px solid var(--border)}.compare-table tbody tr:last-child td[data-v-63ba655a]{border-bottom:0}.compare-table tbody tr[data-v-63ba655a]:hover{background:#fafbfe}.c-item[data-v-63ba655a]{font-weight:700;width:130px}.c-online[data-v-63ba655a]{color:var(--muted)}.c-local[data-v-63ba655a]{color:var(--success);font-weight:650;white-space:nowrap}.c-local[data-v-63ba655a] .app-icon{display:inline-block;vertical-align:-2px;margin-right:7px}.faq[data-v-63ba655a]{display:grid;gap:9px}.faq-item[data-v-63ba655a]{background:#fff;border:1px solid var(--border);border-radius:var(--radius);padding:0 18px;transition:border-color var(--ease)}.faq-item[open][data-v-63ba655a]{border-color:#c7d6f2}.faq-item summary[data-v-63ba655a]{list-style:none;cursor:pointer;padding:15px 0;display:flex;align-items:center;justify-content:space-between;gap:12px;font-weight:650;font-size:14px}.faq-item summary[data-v-63ba655a]::-webkit-details-marker{display:none}.faq-item summary[data-v-63ba655a] .app-icon{color:var(--muted);transition:transform var(--ease)}.faq-item[open] summary[data-v-63ba655a] .app-icon{transform:rotate(180deg);color:var(--primary)}.faq-item p[data-v-63ba655a]{margin:0;padding:0 0 15px;color:var(--muted);font-size:13px;line-height:1.8}.landing-footer[data-v-63ba655a]{text-align:center;font-size:12.5px;padding-bottom:10px}@media (max-width: 960px){.hero[data-v-63ba655a]{padding:36px 24px 30px}.hero-grid[data-v-63ba655a]{grid-template-columns:1fr;gap:30px}.terminal-card[data-v-63ba655a]{transform:none}.hero h1[data-v-63ba655a]{font-size:32px}}.dependency-row[data-v-d296fa22]{display:flex;align-items:center;gap:16px;padding:14px;border-bottom:1px solid var(--border);border-radius:var(--radius-sm);transition:background-color var(--ease)}.dependency-row[data-v-d296fa22]:hover{background:#f8fafd}.dependency-row[data-v-d296fa22]:last-of-type{border-bottom:0}.tool-info[data-v-d296fa22]{flex:1;min-width:0}.title[data-v-d296fa22]{display:flex;align-items:center;gap:8px;margin-bottom:3px;flex-wrap:wrap}.title strong[data-v-d296fa22]{font-size:14.5px}.chip.version[data-v-d296fa22]{font-size:11px;padding:2px 8px;color:var(--muted)}.tool-info p[data-v-d296fa22]{margin:0;font-size:12.5px}.actions[data-v-d296fa22]{display:flex;align-items:center;gap:8px;flex-shrink:0}.actions .primary[data-v-d296fa22],.actions .ghost[data-v-d296fa22]{padding:7px 15px;font-size:12.5px}.actions .ghost.danger[data-v-d296fa22]{color:var(--danger)}.actions .ghost.danger[data-v-d296fa22]:hover{background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}@media (max-width: 640px){.dependency-row[data-v-d296fa22]{flex-wrap:wrap}.actions[data-v-d296fa22]{width:100%;justify-content:flex-end}}.log-stream[data-v-a4d9e36c]{height:260px;overflow:auto;background:#111827;color:#d1f0ea;border-radius:10px;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.log-stream p[data-v-a4d9e36c]{margin:2px 0;white-space:pre-wrap}.settings[data-v-b8d6e7ed]{max-width:820px;margin:0 auto;display:grid;gap:18px}.running-chip[data-v-b8d6e7ed]{color:var(--success);background:var(--success-soft);border-color:transparent}.running-chip .dot[data-v-b8d6e7ed]{width:7px;height:7px;border-radius:50%;background:currentColor;animation:pulse-dot-b8d6e7ed 2s ease infinite}@keyframes pulse-dot-b8d6e7ed{0%,to{box-shadow:0 0 #04785759}50%{box-shadow:0 0 0 5px #04785700}}.stop-row[data-v-b8d6e7ed]{display:flex;justify-content:space-between;align-items:center;gap:16px}.version-chip[data-v-b8d6e7ed]{font-size:11px;font-weight:600;color:var(--muted);background:#f0f3f8;border-color:transparent;vertical-align:2px;margin-left:4px}.stop-desc[data-v-b8d6e7ed]{margin:0;font-size:12.5px;line-height:1.7;flex:1}.stop-desc code[data-v-b8d6e7ed]{background:#f0f3f8;padding:2px 7px;border-radius:5px;font-size:12px}.stop-btn[data-v-b8d6e7ed]{flex-shrink:0;color:var(--danger)}.stop-btn[data-v-b8d6e7ed]:hover:not(:disabled){background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}.stopped-card[data-v-b8d6e7ed]{display:grid;gap:10px;padding:18px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.stopped-card>p[data-v-b8d6e7ed]{margin:0;display:flex;align-items:center;gap:8px;font-size:14px}.stopped-card .muted[data-v-b8d6e7ed]{font-size:13px;line-height:1.7}.command-row[data-v-b8d6e7ed]{display:flex;gap:8px;align-items:stretch}.command-row code[data-v-b8d6e7ed]{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.command-row code .prompt[data-v-b8d6e7ed]{color:#64748b;-webkit-user-select:none;user-select:none;margin-right:8px}.page-subtitle[data-v-b8d6e7ed]{margin:0 0 4px}.panel[data-v-b8d6e7ed]{display:grid;gap:16px}.section-head[data-v-b8d6e7ed]{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.section-head h2[data-v-b8d6e7ed]{margin:0;font-size:17px}.section-head h3[data-v-b8d6e7ed]{margin:0;font-size:15px}.section-sub[data-v-b8d6e7ed]{margin:4px 0 0;font-size:12.5px}.recheck[data-v-b8d6e7ed]{flex-shrink:0}.summary-card[data-v-b8d6e7ed]{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:22px;padding:14px 18px;background:#fafbfd;border:1px solid var(--border);border-radius:var(--radius)}.summary-text[data-v-b8d6e7ed]{display:flex;align-items:baseline;gap:8px}.summary-text strong[data-v-b8d6e7ed]{font-size:24px;font-weight:800;letter-spacing:-.5px}.summary-text span[data-v-b8d6e7ed]{color:var(--muted);font-size:13px;font-weight:600}.alert[data-v-b8d6e7ed]{padding:10px 14px;border-radius:var(--radius-sm);background:var(--danger-soft);color:var(--danger);margin:0;font-size:13px}.dep-list[data-v-b8d6e7ed]{display:grid}.install-session[data-v-b8d6e7ed]{display:grid;gap:8px;margin-top:4px}.session-state[data-v-b8d6e7ed]{margin:0;font-size:13px;font-weight:650;display:flex;align-items:center;gap:8px}.session-state.progress[data-v-b8d6e7ed]{color:var(--muted)}.session-state.done[data-v-b8d6e7ed]{color:var(--success)}.session-state.failed[data-v-b8d6e7ed]{color:var(--danger)}form[data-v-b8d6e7ed]{display:grid;gap:20px}.field[data-v-b8d6e7ed]{display:grid;gap:8px}.field>span[data-v-b8d6e7ed]{font-weight:650;font-size:13.5px}.directory-editor[data-v-b8d6e7ed]{display:flex;gap:8px}.directory-editor input[data-v-b8d6e7ed]{flex:1}.concurrency[data-v-b8d6e7ed]{display:flex;align-items:center;gap:12px}.concurrency input[data-v-b8d6e7ed]{max-width:120px}.concurrency small[data-v-b8d6e7ed]{font-size:12px}.error[data-v-b8d6e7ed]{color:var(--danger);margin:0;background:var(--danger-soft);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px}.saved[data-v-b8d6e7ed]{color:var(--success);margin:0;background:var(--success-soft);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px;display:flex;align-items:center;gap:7px}.actions[data-v-b8d6e7ed]{display:flex;justify-content:flex-end;gap:10px}.install-guide[data-v-56162934]{display:grid;gap:18px}.platform-switch[data-v-56162934]{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--border);border-radius:11px;width:fit-content;background:#f6f8fc}.platform-switch button[data-v-56162934]{border:none;background:transparent;padding:7px 22px;border-radius:8px;cursor:pointer;font-weight:650;font-size:13px;color:var(--muted);transition:all var(--ease)}.platform-switch button[data-v-56162934]:hover{color:var(--text)}.platform-switch button.active[data-v-56162934]{background:#fff;color:var(--primary);font-weight:750;box-shadow:var(--shadow-sm),inset 0 0 0 1px #d6e2fb}.steps[data-v-56162934]{display:grid;gap:16px;padding-left:0;margin:0;list-style:none}.steps li[data-v-56162934]{display:flex;gap:14px}.step-no[data-v-56162934]{width:26px;height:26px;flex-shrink:0;display:grid;place-items:center;border-radius:50%;font-weight:800;font-size:13px;background:var(--primary-soft);color:var(--primary)}.steps strong[data-v-56162934]{font-size:14px;display:block;margin-bottom:4px}.steps p[data-v-56162934]{margin:0;font-size:13px;line-height:1.7}.steps .hint[data-v-56162934]{color:var(--muted)}.command-block[data-v-56162934]{display:grid;gap:8px}.command-row[data-v-56162934]{display:flex;gap:8px;align-items:stretch}.command-row code[data-v-56162934]{flex:1;min-width:0;display:flex;align-items:center;gap:10px;padding:12px 14px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow-x:auto;white-space:nowrap}.command-row code .prompt[data-v-56162934]{color:#64748b;flex-shrink:0;-webkit-user-select:none;user-select:none}.copy[data-v-56162934]{flex-shrink:0}.daemon-gate[data-v-0f39bf4c]{display:grid;gap:20px;padding:30px;border:1px solid var(--border);border-radius:var(--radius);background:#fff;max-width:760px;box-shadow:var(--shadow-sm)}.gate-state[data-v-0f39bf4c]{display:grid;gap:12px;justify-items:center;text-align:center}.gate-state>p[data-v-0f39bf4c]{margin:0;font-size:15.5px;font-weight:700}.gate-state .hint[data-v-0f39bf4c]{font-weight:400;font-size:13px}.gate-icon[data-v-0f39bf4c]{width:56px;height:56px;display:grid;place-items:center;border-radius:50%}.gate-icon.ok[data-v-0f39bf4c]{color:var(--success);background:var(--success-soft)}.gate-icon.off[data-v-0f39bf4c]{color:var(--warning);background:var(--warning-soft)}.checking[data-v-0f39bf4c]{align-items:center;padding:30px 0}.spinner.big[data-v-0f39bf4c]{width:28px;height:28px;border-width:3px}.actions[data-v-0f39bf4c]{display:flex;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap}.direct-link[data-v-0f39bf4c]{text-decoration:none;font-size:13px}.offline[data-v-0f39bf4c] .install-guide{justify-items:start;text-align:left;margin-top:6px;width:100%}.start-block[data-v-0f39bf4c]{display:grid;gap:12px;width:100%;padding:18px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.manual[data-v-0f39bf4c]{display:grid;gap:8px}.manual-label[data-v-0f39bf4c]{font-size:12px;font-weight:700;color:var(--muted)}.manual-row[data-v-0f39bf4c]{display:flex;gap:8px;align-items:stretch}.manual-row code[data-v-0f39bf4c]{flex:1;min-width:0;display:flex;align-items:center;gap:8px;padding:10px 13px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:12.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.manual-row code .prompt[data-v-0f39bf4c]{color:#64748b;-webkit-user-select:none;user-select:none}.copy[data-v-0f39bf4c]{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:9px;padding:0 13px;background:#2563eb;color:#fff;font-size:12.5px;font-weight:650;transition:filter var(--ease)}.copy[data-v-0f39bf4c]:hover{filter:brightness(1.1)}.copy[data-v-0f39bf4c]:active{transform:var(--press)}.copy.ok[data-v-0f39bf4c]{background:#059669}.manual-hint[data-v-0f39bf4c]{margin:0;color:var(--muted);font-size:12.5px;line-height:1.6}.install-collapsed[data-v-0f39bf4c]{border-top:1px solid var(--border);padding-top:12px}.install-toggle[data-v-0f39bf4c]{display:inline-flex;align-items:center;gap:5px;background:transparent;color:var(--muted);padding:4px 6px;font-size:12.5px}.install-toggle[data-v-0f39bf4c]:hover{color:var(--primary);background:var(--primary-soft)}.install-toggle svg[data-v-0f39bf4c]{transition:transform var(--ease)}.install-toggle svg.open[data-v-0f39bf4c]{transform:rotate(180deg)}.follow-gate[data-v-0fe4c6f1]{display:grid;grid-template-columns:220px 1fr;gap:30px;align-items:start;padding:30px;border-radius:var(--radius);background:linear-gradient(180deg,#fbfcff,#f6f8fc);border:1px solid var(--border)}.gate-left[data-v-0fe4c6f1]{display:grid;gap:10px;justify-items:center;text-align:center}.gh-qrcode[data-v-0fe4c6f1]{width:200px;height:200px;border-radius:12px;border:1px solid var(--border);background:#fff;object-fit:contain}.qr-hint[data-v-0fe4c6f1]{margin:0;font-size:12.5px;color:var(--muted);font-weight:600}.gate-right[data-v-0fe4c6f1]{display:grid;gap:14px}.gate-right h2[data-v-0fe4c6f1]{margin:0;font-size:21px;font-weight:780;letter-spacing:-.4px}.gate-desc[data-v-0fe4c6f1]{margin:0;color:var(--text-2);font-size:13.5px;line-height:1.7}.gate-desc strong[data-v-0fe4c6f1]{color:var(--primary)}.code-row[data-v-0fe4c6f1]{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:13px 16px;border-radius:var(--radius-sm);background:#0f172a}.code-label[data-v-0fe4c6f1]{color:#94a3b8;font-size:12px;font-weight:600}.code-row code[data-v-0fe4c6f1]{flex:1;min-width:0;color:#7dd3fc;font-size:19px;font-weight:800;letter-spacing:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.copy[data-v-0fe4c6f1]{display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:8px;padding:7px 13px;background:#2563eb;color:#fff;font-size:12.5px;font-weight:650;transition:filter var(--ease)}.copy[data-v-0fe4c6f1]:hover{filter:brightness(1.1)}.copy[data-v-0fe4c6f1]:active{transform:var(--press)}.copy.ok[data-v-0fe4c6f1]{background:#059669}.gate-steps[data-v-0fe4c6f1]{list-style:none;margin:0;padding:0;display:grid;gap:8px}.gate-steps li[data-v-0fe4c6f1]{display:flex;gap:9px;align-items:baseline;color:var(--text-2);font-size:13px;line-height:1.6}.gate-steps li span[data-v-0fe4c6f1]{flex-shrink:0;width:19px;height:19px;display:grid;place-items:center;border-radius:50%;background:var(--primary-soft);color:var(--primary);font-size:11px;font-weight:800;transform:translateY(2px)}.gate-error[data-v-0fe4c6f1]{display:flex;align-items:center;gap:7px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.waiting[data-v-0fe4c6f1]{margin:0;display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12.5px}.spinner.tiny[data-v-0fe4c6f1]{width:13px;height:13px;border-width:2px}@media (max-width: 760px){.follow-gate[data-v-0fe4c6f1]{grid-template-columns:1fr}.gate-left[data-v-0fe4c6f1]{justify-self:center}}.workbench[data-v-9641c996]{display:grid;gap:18px}.page-subtitle[data-v-9641c996]{margin:0 0 20px}.tabbed[data-v-9641c996]{display:grid;grid-template-columns:148px 1fr;gap:16px;align-items:start}.tab-rail[data-v-9641c996]{display:grid;gap:4px;padding:8px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);position:sticky;top:84px}.tab-btn[data-v-9641c996]{display:flex;align-items:center;gap:9px;padding:10px 12px;border-radius:var(--radius-sm);background:transparent;border:none;color:var(--text-2);font-weight:600;font-size:13.5px;cursor:pointer;text-align:left;transition:background-color var(--ease),color var(--ease)}.tab-btn[data-v-9641c996]:hover{background:var(--primary-soft);color:var(--primary)}.tab-btn[data-v-9641c996]:active{transform:var(--press)}.tab-btn.active[data-v-9641c996]{background:var(--primary);color:#fff;box-shadow:0 3px 10px -2px #2563eb66}.tab-label[data-v-9641c996]{flex:1}.tab-count[data-v-9641c996]{min-width:20px;height:20px;padding:0 6px;display:grid;place-items:center;border-radius:999px;font-size:11px;font-weight:800;background:#e8edf6;color:var(--text-2)}.tab-btn.active .tab-count[data-v-9641c996]{background:#ffffff40;color:#fff}.tab-panel[data-v-9641c996]{display:grid;gap:16px;min-width:0}.dropzone[data-v-9641c996]{display:grid;gap:8px;justify-items:center;text-align:center;padding:38px 24px 24px;border:2px dashed #c3cfe3;border-radius:var(--radius);background:linear-gradient(180deg,#fbfcff,#f6f8fc);transition:border-color var(--ease),background-color var(--ease)}.dropzone.dragging[data-v-9641c996]{border-color:var(--primary);background:var(--primary-soft)}.dropzone.compact[data-v-9641c996]{padding:12px 18px;grid-template-columns:auto auto 1fr;align-items:center;gap:8px 12px;text-align:left}.dropzone.compact .drop-actions[data-v-9641c996]{grid-column:1 / -1}.drop-compact-text[data-v-9641c996]{font-size:13px;color:var(--muted);font-weight:600}.drop-icon[data-v-9641c996]{width:58px;height:58px;display:grid;place-items:center;border-radius:50%;color:var(--primary);background:var(--primary-soft)}.drop-title[data-v-9641c996]{font-size:16.5px}.drop-hint[data-v-9641c996]{margin:0;font-size:12.5px}.drop-actions[data-v-9641c996]{display:flex;gap:8px;width:min(560px,100%);margin-top:4px}.dropzone.compact .drop-actions[data-v-9641c996]{margin-top:0}.drop-actions input[data-v-9641c996]{flex:1;min-width:0}.hint-alert[data-v-9641c996]{display:flex;align-items:center;gap:8px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.tools-missing[data-v-9641c996]{flex-wrap:wrap}.tools-missing .hint-text[data-v-9641c996]{flex:1;min-width:180px}.goto-settings[data-v-9641c996]{padding:7px 16px;font-size:12.5px}.target-bar[data-v-9641c996]{display:grid;gap:9px}.section-title[data-v-9641c996]{font-weight:700;font-size:13.5px}.target-chips[data-v-9641c996]{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.target-chip[data-v-9641c996]{padding:7px 16px;border-radius:999px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:700;color:var(--text-2);transition:all var(--ease)}.target-chip[data-v-9641c996]:hover{border-color:#b9cdf8;color:var(--primary);background:var(--primary-soft)}.target-chip[data-v-9641c996]:active{transform:var(--press)}.target-chip.active[data-v-9641c996]{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 3px 10px -2px #2563eb73}.table-wrap[data-v-9641c996]{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:#fff}.file-table[data-v-9641c996]{width:100%;border-collapse:collapse;min-width:760px;font-size:13px}.file-table th[data-v-9641c996]{text-align:left;padding:10px 14px;background:#f7f9fc;color:var(--muted);font-size:12px;font-weight:700;letter-spacing:.3px;border-bottom:1px solid var(--border)}.file-table td[data-v-9641c996]{padding:10px 14px;border-bottom:1px solid var(--border);vertical-align:middle}.file-table tbody tr:last-child td[data-v-9641c996]{border-bottom:0}.file-table tbody tr[data-v-9641c996]{transition:background-color var(--ease)}.file-table tbody tr[data-v-9641c996]:hover{background:#fafbfe}.cell-file[data-v-9641c996]{display:flex;align-items:center;gap:9px;min-width:0}.file-icon[data-v-9641c996]{color:var(--muted);display:grid;place-items:center}.file-name[data-v-9641c996]{font-weight:650;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip.ext[data-v-9641c996]{font-size:10.5px;padding:2px 8px;color:var(--primary);background:var(--primary-soft);border-color:transparent;font-weight:750}.cell-path[data-v-9641c996]{max-width:260px}.path-link[data-v-9641c996]{background:none;border:none;padding:0;cursor:pointer;color:var(--primary);font-size:12.5px;text-align:left;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.path-link[data-v-9641c996]:hover{text-decoration:underline}.path-link[data-v-9641c996]:active{opacity:.7}.cell-size[data-v-9641c996]{white-space:nowrap;color:var(--muted);font-size:12.5px}.row-status[data-v-9641c996]{display:inline-flex;align-items:center;gap:7px;font-weight:650;font-size:12.5px;white-space:nowrap}.row-status.pending[data-v-9641c996]{color:var(--muted)}.row-status.converting[data-v-9641c996]{color:var(--warning)}.row-status.success[data-v-9641c996]{color:var(--success)}.row-status.failed[data-v-9641c996]{color:var(--danger);flex-wrap:wrap;white-space:normal}.row-status em[data-v-9641c996]{font-style:normal;font-size:11.5px;opacity:.85}.row-error[data-v-9641c996]{max-width:220px;overflow:hidden;text-overflow:ellipsis;font-weight:500}.spinner.tiny[data-v-9641c996]{width:13px;height:13px;border-width:2px}.cell-actions[data-v-9641c996]{white-space:nowrap}.cell-actions .ghost.tiny[data-v-9641c996]{padding:5px 11px;font-size:12px;margin-right:6px}.cell-actions .icon-btn[data-v-9641c996]{padding:5px;border-radius:8px;background:transparent;color:var(--muted)}.cell-actions .icon-btn[data-v-9641c996]:hover{background:var(--danger-soft);color:var(--danger)}.params[data-v-9641c996]{display:grid;gap:10px;padding:14px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.params-grid[data-v-9641c996]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.param-field[data-v-9641c996]{display:grid;gap:6px;min-width:0}.param-label[data-v-9641c996]{font-weight:650;font-size:13px}.param-label .required[data-v-9641c996]{color:var(--danger);font-style:normal;margin-left:2px}.watermark-editor[data-v-9641c996]{display:flex;gap:8px}.watermark-editor input[data-v-9641c996]{flex:1;min-width:0}.param-description[data-v-9641c996]{color:var(--muted);font-size:12px;line-height:1.6}.batch-bar[data-v-9641c996]{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:13px 18px;border-radius:var(--radius);background:linear-gradient(92deg,#f0f5ff,#f8faff);border:1px solid #d9e4fb}.summary[data-v-9641c996]{font-size:13.5px;color:var(--text-2)}.summary strong[data-v-9641c996]{color:var(--primary);font-size:14.5px}.batch-bar.disabled .summary[data-v-9641c996]{color:var(--muted)}.batch-actions[data-v-9641c996]{display:flex;gap:10px;align-items:center}.batch[data-v-9641c996]{padding:11px 28px;font-size:14px}@media (max-width: 900px){.tabbed[data-v-9641c996]{grid-template-columns:1fr}.tab-rail[data-v-9641c996]{position:static;grid-auto-flow:column;grid-auto-columns:max-content;overflow-x:auto}.params-grid[data-v-9641c996]{grid-template-columns:1fr}}:root{--primary: #2563eb;--primary-hover: #1d4ed8;--primary-active: #1e40af;--primary-soft: #eff4ff;--primary-soft-hover: #e3ecff;--primary-ring: 0 0 0 3px rgb(37 99 235 / 22%);--text: #0f172a;--text-2: #3f4a5c;--muted: #768193;--border: #e4e9f1;--border-strong: #cdd6e4;--surface: #f5f7fb;--card: #ffffff;--danger: #dc2626;--danger-soft: #fee2e2;--warning: #b45309;--warning-soft: #fef3c7;--success: #047857;--success-soft: #d1fae5;--radius: 14px;--radius-sm: 10px;--shadow-sm: 0 1px 2px rgb(15 23 42 / 5%);--shadow-md: 0 6px 22px -6px rgb(15 23 42 / 12%);--shadow-lg: 0 18px 44px -12px rgb(15 23 42 / 20%);--press: translateY(1px);--ease: .16s cubic-bezier(.3, .7, .4, 1)}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased}body{margin:0;font-family:Inter,PingFang SC,HarmonyOS Sans SC,Microsoft YaHei,system-ui,sans-serif;color:var(--text);background:var(--surface);font-size:14px;line-height:1.6}::selection{background:#2563eb2e}button,.btn{font:inherit;font-weight:600;border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;padding:9px 16px;display:inline-flex;align-items:center;justify-content:center;gap:7px;text-decoration:none;white-space:nowrap;transition:background-color var(--ease),border-color var(--ease),color var(--ease),box-shadow var(--ease),transform var(--ease),opacity var(--ease)}button:active,.btn:active{transform:var(--press)}button:focus-visible,.btn:focus-visible,a:focus-visible{outline:none;box-shadow:var(--primary-ring);border-radius:var(--radius-sm)}button.primary,.btn.primary,a.primary{background:var(--primary);color:#fff;box-shadow:var(--shadow-sm)}button.primary:hover,.btn.primary:hover,a.primary:hover{background:var(--primary-hover);box-shadow:var(--shadow-md)}button.primary:active,.btn.primary:active,a.primary:active{background:var(--primary-active);box-shadow:none}button.primary:disabled,.btn.primary:disabled{background:#b7c6e4;color:#f2f5fb;cursor:not-allowed;box-shadow:none;transform:none}button.ghost,.btn.ghost,a.ghost{background:var(--card);border-color:var(--border);color:var(--text-2)}button.ghost:hover,.btn.ghost:hover,a.ghost:hover{border-color:var(--border-strong);background:#f8fafd;color:var(--text)}button.ghost:active,.btn.ghost:active,a.ghost:active{background:#eef2f8;transform:var(--press)}button.ghost:disabled,.btn.ghost:disabled{color:#b3bccb;border-color:var(--border);background:#f6f8fb;cursor:not-allowed;transform:none}button.ghost.danger,a.ghost.danger{color:var(--danger)}button.ghost.danger:hover{background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}button.ghost.danger:active{background:var(--danger-soft)}button.link{background:transparent;color:var(--primary);padding:4px 6px}button.link:hover{color:var(--primary-hover);background:var(--primary-soft)}button.link:active{transform:var(--press)}.card,.panel{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:22px;box-shadow:var(--shadow-sm)}.grid{display:grid;gap:18px}.muted{color:var(--muted)}input,select{min-height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font:inherit;color:var(--text);background:var(--card);width:100%;transition:border-color var(--ease),box-shadow var(--ease),background-color var(--ease)}input:hover,select:hover{border-color:var(--border-strong)}input:focus,select:focus{outline:none;border-color:var(--primary);box-shadow:var(--primary-ring)}input:disabled{background:#f4f6fa;color:var(--muted);cursor:not-allowed}input::placeholder{color:#a5aebd}label{color:var(--text-2)}.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:700;line-height:1.5}.badge:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.badge.ready,.badge.success{color:var(--success);background:var(--success-soft)}.badge.outdated,.badge.running{color:var(--warning);background:var(--warning-soft)}.badge.missing-required,.badge.failed{color:var(--danger);background:var(--danger-soft)}.badge.missing-optional,.badge.queued{color:#5b6779;background:#eef1f6}.chip{display:inline-flex;align-items:center;gap:5px;padding:4px 11px;border-radius:999px;border:1px solid var(--border);background:var(--card);color:var(--text-2);font-size:12px;font-weight:600}.bar{height:6px;background:#e8edf5;border-radius:99px;overflow:hidden}.bar i{display:block;height:100%;background:linear-gradient(90deg,var(--primary),#60a5fa);border-radius:99px;transition:width .3s ease}.spinner{width:18px;height:18px;border:2.5px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.page-title{margin:0 0 6px;font-size:24px;font-weight:700;letter-spacing:-.3px}.page-subtitle{margin:0 0 22px;color:var(--muted)}.empty{text-align:center;color:var(--muted);padding:48px 20px;display:grid;gap:10px;justify-items:center}.errors{color:var(--danger);padding:10px 14px;background:var(--danger-soft);border-radius:var(--radius-sm);list-style:none;margin:0;font-size:13px;display:grid;gap:4px}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#ccd5e3;border-radius:99px;border:2.5px solid var(--surface)}::-webkit-scrollbar-thumb:hover{background:#b6c2d4}::-webkit-scrollbar-track{background:transparent}
|
|
1
|
+
.app-icon[data-v-84fb32bd]{flex-shrink:0;display:block}.update-banner[data-v-69c975e5]{position:relative;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 auto 18px;max-width:1280px;width:100%;padding:10px 16px;background:linear-gradient(92deg,#fff8e6,#fffdf5);border:1px solid #f3d9a4;border-radius:var(--radius-sm);font-size:13px;color:#92540a}.update-banner[data-v-69c975e5] .app-icon{color:#d99a1e}.banner-text[data-v-69c975e5]{flex:1;min-width:200px;font-weight:600}.copy[data-v-69c975e5]{display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:8px;padding:6px 12px;background:#d99a1e;color:#fff;font-size:12px;font-weight:650;transition:filter var(--ease)}.copy[data-v-69c975e5]:hover{filter:brightness(1.08)}.copy[data-v-69c975e5]:active{transform:var(--press)}.copy.ok[data-v-69c975e5]{background:#059669}.how[data-v-69c975e5]{display:inline-flex;align-items:center;gap:4px;background:transparent;color:#92540a;padding:4px 8px;font-size:12px;font-weight:600}.how[data-v-69c975e5]:hover{background:#d99a1e1f}.how svg[data-v-69c975e5]{transition:transform var(--ease)}.how svg.open[data-v-69c975e5]{transform:rotate(180deg)}.close[data-v-69c975e5]{background:transparent;color:#b98a3e;padding:4px;border-radius:6px}.close[data-v-69c975e5]:hover{background:#d99a1e26}.banner-detail[data-v-69c975e5]{flex-basis:100%;margin-top:6px;padding-top:8px;border-top:1px dashed #ecd9ae}.banner-detail ol[data-v-69c975e5]{margin:0;padding-left:18px;display:grid;gap:3px}.banner-detail li[data-v-69c975e5]{font-size:12.5px;color:#7a5417;line-height:1.7}.app-shell[data-v-e736b31c]{min-height:100vh;display:flex;flex-direction:column}.app-header[data-v-e736b31c]{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:28px;padding:12px 28px;background:#ffffffdb;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--border)}.brand[data-v-e736b31c]{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--text)}.brand strong[data-v-e736b31c]{font-size:15px;letter-spacing:-.2px}.logo[data-v-e736b31c]{width:36px;height:36px;display:grid;place-items:center;border-radius:10px;background:linear-gradient(135deg,#818cf8,#34d399);color:#fff;font-size:16px;font-weight:700;box-shadow:0 0 20px #818cf859}nav[data-v-e736b31c]{display:flex;gap:4px;margin-right:auto}nav a[data-v-e736b31c]{color:var(--text-2);text-decoration:none;font-weight:600;font-size:13.5px;padding:7px 14px;border-radius:999px;transition:background-color var(--ease),color var(--ease)}nav a[data-v-e736b31c]:hover{color:var(--primary);background:var(--primary-soft)}nav a.router-link-active[data-v-e736b31c]{color:var(--primary);background:var(--primary-soft)}.connection[data-v-e736b31c]{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:600;color:var(--success)}.connection.offline[data-v-e736b31c]{color:var(--danger)}.connection .dot[data-v-e736b31c]{width:8px;height:8px;border-radius:50%;background:currentColor;animation:pulse-e736b31c 2s ease infinite}.connection.offline .dot[data-v-e736b31c]{animation:none}@keyframes pulse-e736b31c{0%,to{box-shadow:0 0 #04785759}50%{box-shadow:0 0 0 5px #04785700}}main[data-v-e736b31c]{flex:1;padding:28px;max-width:1280px;margin:0 auto;width:100%}.history[data-v-b299457c]{display:grid;gap:16px;max-width:900px;margin:0 auto}.page-subtitle[data-v-b299457c]{margin:0 0 6px}.toolbar[data-v-b299457c]{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap}.hint-alert[data-v-b299457c]{display:flex;align-items:center;gap:8px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.toolbar-right[data-v-b299457c]{display:flex;align-items:center;gap:10px}.icon-btn[data-v-b299457c]{padding:5px;border-radius:8px;background:transparent;color:var(--muted)}.icon-btn[data-v-b299457c]:hover{background:var(--danger-soft);color:var(--danger)}.icon-btn[data-v-b299457c]:active{transform:var(--press)}.filters[data-v-b299457c]{display:flex;gap:8px}.filter-chip[data-v-b299457c]{display:inline-flex;align-items:center;gap:7px;padding:7px 15px;border-radius:999px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:650;color:var(--text-2);transition:all var(--ease)}.filter-chip em[data-v-b299457c]{font-style:normal;font-size:11.5px;color:var(--muted)}.filter-chip[data-v-b299457c]:hover{border-color:#b9cdf8;color:var(--primary)}.filter-chip[data-v-b299457c]:active{transform:var(--press)}.filter-chip.active[data-v-b299457c]{background:var(--primary);border-color:var(--primary);color:#fff}.filter-chip.active em[data-v-b299457c]{color:#ffffffbf}.search[data-v-b299457c]{display:flex;align-items:center;gap:8px;min-width:220px;color:var(--muted);border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;padding:0 12px}.search input[data-v-b299457c]{border:none;min-height:36px}.search input[data-v-b299457c]:focus{box-shadow:none}.day-group[data-v-b299457c]{display:grid;gap:8px}.day-head[data-v-b299457c]{display:flex;align-items:baseline;gap:10px;font-weight:750;font-size:14px;padding:4px 4px 0}.day-head em[data-v-b299457c]{font-style:normal;font-size:12px;color:var(--muted);font-weight:500}.day-list[data-v-b299457c]{display:grid;padding:6px 0}.history-item[data-v-b299457c]{display:flex;align-items:center;gap:14px;padding:12px 18px;transition:background-color var(--ease)}.history-item[data-v-b299457c]:hover{background:#fafbfe}.history-item+.history-item[data-v-b299457c]{border-top:1px solid var(--border)}.item-icon[data-v-b299457c]{width:38px;height:38px;flex-shrink:0;display:grid;place-items:center;border-radius:10px;color:var(--primary);background:var(--primary-soft)}.item-icon.failed[data-v-b299457c]{color:var(--danger);background:var(--danger-soft)}.item-icon.success[data-v-b299457c]{color:var(--success);background:var(--success-soft)}.item-main[data-v-b299457c]{flex:1;min-width:0;display:grid;gap:3px}.item-title[data-v-b299457c]{display:flex;align-items:center;gap:8px;min-width:0}.item-title strong[data-v-b299457c]{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13.5px}.arrow[data-v-b299457c]{color:var(--muted);display:grid;place-items:center}.target[data-v-b299457c]{font-weight:800;font-size:12px;color:var(--primary)}.item-title .badge[data-v-b299457c]{margin-left:auto}.spinner.tiny[data-v-b299457c]{width:12px;height:12px;border-width:2px}.item-meta[data-v-b299457c]{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.error-text[data-v-b299457c]{color:var(--danger)}.row-badge[data-v-b299457c]{flex-shrink:0;margin-left:auto}.item-actions[data-v-b299457c]{display:flex;gap:8px;flex-shrink:0;align-items:center}.item-actions .ghost.tiny[data-v-b299457c]{padding:6px 12px;font-size:12px;text-decoration:none;white-space:nowrap}.empty[data-v-b299457c]{display:grid;gap:10px;justify-items:center;color:var(--muted)}.landing[data-v-63ba655a]{display:grid;gap:64px}.hero[data-v-63ba655a]{padding:52px 44px 40px;border-radius:24px;border:1px solid var(--border);background:radial-gradient(900px 420px at 12% -10%,rgb(37 99 235 / 12%),transparent 60%),radial-gradient(700px 360px at 100% 0%,rgb(124 58 237 / 9%),transparent 55%),linear-gradient(180deg,#fbfcff,#f7f9fd)}.hero-grid[data-v-63ba655a]{display:grid;grid-template-columns:1fr 1.08fr;gap:40px;align-items:center}.hero-badge[data-v-63ba655a]{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:12.5px;font-weight:700}.hero h1[data-v-63ba655a]{margin:16px 0 0;font-size:42px;font-weight:800;letter-spacing:-1.2px;line-height:1.22}.hero h1 em[data-v-63ba655a]{font-style:normal;background:linear-gradient(92deg,var(--primary),#7c3aed);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}.tagline[data-v-63ba655a]{margin:14px 0 0;color:var(--text-2);font-size:15px;max-width:460px;line-height:1.85}.cta-row[data-v-63ba655a]{display:flex;gap:12px;margin-top:26px;flex-wrap:wrap}.cta[data-v-63ba655a]{padding:13px 30px;font-size:15px;border-radius:12px}.local-badge[data-v-63ba655a]{margin:14px 0 0;display:inline-flex;align-items:center;gap:6px;color:var(--success);background:var(--success-soft);border-radius:999px;padding:6px 15px;font-size:13px;font-weight:600}.terminal-card[data-v-63ba655a]{border-radius:16px;background:#0f172a;box-shadow:0 24px 60px -18px #0f172a8c,0 0 0 1px #0f172a0a;overflow:hidden}.term-head[data-v-63ba655a]{display:flex;align-items:center;gap:12px;padding:13px 18px;background:#ffffff0d;border-bottom:1px solid rgb(255 255 255 / 8%)}.dots[data-v-63ba655a]{display:inline-flex;gap:6px}.dots i[data-v-63ba655a]{width:11px;height:11px;border-radius:50%;background:#ff5f57}.dots i[data-v-63ba655a]:nth-child(2){background:#febc2e}.dots i[data-v-63ba655a]:nth-child(3){background:#28c840}.term-head strong[data-v-63ba655a]{color:#e2e8f0;font-size:13px;font-weight:650;margin-right:auto}.term-pills[data-v-63ba655a]{display:inline-flex;gap:3px;padding:3px;border-radius:8px;background:#ffffff14}.term-pills button[data-v-63ba655a]{border:none;background:transparent;color:#94a3b8;padding:4px 12px;border-radius:6px;font-size:11.5px;font-weight:700;cursor:pointer;transition:all var(--ease)}.term-pills button.active[data-v-63ba655a]{background:#2563eb;color:#fff}.term-body[data-v-63ba655a]{padding:18px}.command-row code[data-v-63ba655a]{display:block;padding:12px 14px;background:#ffffff0f;color:#7dd3fc;border-radius:10px;font-size:12.5px;line-height:1.7;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;word-break:break-all}.command-row code .prompt[data-v-63ba655a]{color:#64748b;margin-right:8px;-webkit-user-select:none;user-select:none}.one-click[data-v-63ba655a]{width:100%;margin-top:10px;display:inline-flex;align-items:center;justify-content:center;gap:7px;border:none;cursor:pointer;border-radius:9px;padding:9px;background:linear-gradient(92deg,#2563eb,#3b82f6);color:#fff;font-size:13px;font-weight:700;transition:filter var(--ease),transform var(--ease),background var(--ease)}.one-click[data-v-63ba655a]:hover{filter:brightness(1.08)}.one-click[data-v-63ba655a]:active{transform:var(--press)}.one-click.ok[data-v-63ba655a]{background:linear-gradient(92deg,#059669,#10b981)}.term-steps[data-v-63ba655a]{list-style:none;margin:16px 0 0;padding:0;display:grid;gap:9px}.term-steps li[data-v-63ba655a]{display:flex;gap:9px;align-items:baseline;color:#94a3b8;font-size:12px;line-height:1.6}.term-steps li span[data-v-63ba655a]{flex-shrink:0;width:17px;height:17px;display:grid;place-items:center;border-radius:50%;background:#2563eb4d;color:#93c5fd;font-size:10.5px;font-weight:800;transform:translateY(2px)}.stats[data-v-63ba655a]{display:flex;gap:clamp(24px,6vw,64px);margin-top:34px;padding-top:26px;border-top:1px solid var(--border);flex-wrap:wrap}.stat[data-v-63ba655a]{display:grid;gap:2px}.stat strong[data-v-63ba655a]{font-size:25px;font-weight:800;letter-spacing:-.5px}.stat span[data-v-63ba655a]{font-size:12.5px;color:var(--muted);font-weight:600}.section[data-v-63ba655a]{display:grid;gap:16px}.section h2[data-v-63ba655a]{margin:0;font-size:22px;font-weight:780;letter-spacing:-.4px}.section-sub[data-v-63ba655a]{margin:-8px 0 0;color:var(--muted);font-size:13.5px}.pain-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.pain-card[data-v-63ba655a]{display:flex;gap:14px;padding:20px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),transform var(--ease)}.pain-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.icon[data-v-63ba655a]{display:grid;place-items:center;border-radius:12px;flex-shrink:0}.icon.pain[data-v-63ba655a]{width:42px;height:42px;color:var(--danger);background:var(--danger-soft)}.pain-card strong[data-v-63ba655a]{display:block;margin-bottom:4px;font-size:14.5px}.pain-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:13px;line-height:1.7}.value-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.value-card[data-v-63ba655a]{position:relative;display:grid;gap:10px;padding:24px 22px;justify-items:start;background:linear-gradient(180deg,#fff,#fbfdff);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;transition:box-shadow var(--ease),transform var(--ease),border-color var(--ease)}.value-card[data-v-63ba655a]:before{content:"";position:absolute;inset:0 0 auto 0;height:3px;background:linear-gradient(90deg,var(--primary),#7c3aed);opacity:0;transition:opacity var(--ease)}.value-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px);border-color:#d6e2fb}.value-card[data-v-63ba655a]:hover:before{opacity:1}.icon.value[data-v-63ba655a]{width:46px;height:46px;color:var(--primary);background:var(--primary-soft);border-radius:13px}.value-card strong[data-v-63ba655a]{font-size:15px}.value-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:13px;line-height:1.75}.category-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}@media (min-width: 1024px){.category-grid[data-v-63ba655a]{grid-template-columns:repeat(4,1fr)}.category-grid .category-card[data-v-63ba655a]:nth-child(7){grid-column:span 2}}.category-card[data-v-63ba655a]{display:flex;gap:14px;padding:17px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),border-color var(--ease),transform var(--ease)}.category-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);border-color:#d6e2fb;transform:translateY(-2px)}.icon.cat[data-v-63ba655a]{width:42px;height:42px;color:var(--primary);background:var(--primary-soft)}.cat-body[data-v-63ba655a]{display:grid;gap:3px;min-width:0}.cat-body strong[data-v-63ba655a]{font-size:14.5px}.cat-body p[data-v-63ba655a]{margin:0;font-size:13px;color:var(--text-2)}.cat-body small[data-v-63ba655a]{color:var(--muted);font-size:12px}.scene-grid[data-v-63ba655a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px}.scene-card[data-v-63ba655a]{display:flex;gap:13px;padding:17px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);transition:box-shadow var(--ease),transform var(--ease)}.scene-card[data-v-63ba655a]:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}.icon.scene[data-v-63ba655a]{width:40px;height:40px;color:var(--primary);background:var(--primary-soft)}.scene-card div[data-v-63ba655a]{min-width:0}.scene-card strong[data-v-63ba655a]{display:block;margin-bottom:3px;font-size:14px}.scene-card p[data-v-63ba655a]{margin:0;color:var(--muted);font-size:12.5px;line-height:1.65}.table-wrap[data-v-63ba655a]{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:#fff}.compare-table[data-v-63ba655a]{width:100%;border-collapse:collapse;font-size:13.5px;min-width:560px}.compare-table th[data-v-63ba655a]{text-align:left;padding:12px 18px;background:#f7f9fc;color:var(--muted);font-size:12px;font-weight:700;border-bottom:1px solid var(--border)}.compare-table td[data-v-63ba655a]{padding:13px 18px;border-bottom:1px solid var(--border)}.compare-table tbody tr:last-child td[data-v-63ba655a]{border-bottom:0}.compare-table tbody tr[data-v-63ba655a]:hover{background:#fafbfe}.c-item[data-v-63ba655a]{font-weight:700;width:130px}.c-online[data-v-63ba655a]{color:var(--muted)}.c-local[data-v-63ba655a]{color:var(--success);font-weight:650;white-space:nowrap}.c-local[data-v-63ba655a] .app-icon{display:inline-block;vertical-align:-2px;margin-right:7px}.faq[data-v-63ba655a]{display:grid;gap:9px}.faq-item[data-v-63ba655a]{background:#fff;border:1px solid var(--border);border-radius:var(--radius);padding:0 18px;transition:border-color var(--ease)}.faq-item[open][data-v-63ba655a]{border-color:#c7d6f2}.faq-item summary[data-v-63ba655a]{list-style:none;cursor:pointer;padding:15px 0;display:flex;align-items:center;justify-content:space-between;gap:12px;font-weight:650;font-size:14px}.faq-item summary[data-v-63ba655a]::-webkit-details-marker{display:none}.faq-item summary[data-v-63ba655a] .app-icon{color:var(--muted);transition:transform var(--ease)}.faq-item[open] summary[data-v-63ba655a] .app-icon{transform:rotate(180deg);color:var(--primary)}.faq-item p[data-v-63ba655a]{margin:0;padding:0 0 15px;color:var(--muted);font-size:13px;line-height:1.8}.landing-footer[data-v-63ba655a]{text-align:center;font-size:12.5px;padding-bottom:10px}@media (max-width: 960px){.hero[data-v-63ba655a]{padding:36px 24px 30px}.hero-grid[data-v-63ba655a]{grid-template-columns:1fr;gap:30px}.terminal-card[data-v-63ba655a]{transform:none}.hero h1[data-v-63ba655a]{font-size:32px}}.dependency-row[data-v-d296fa22]{display:flex;align-items:center;gap:16px;padding:14px;border-bottom:1px solid var(--border);border-radius:var(--radius-sm);transition:background-color var(--ease)}.dependency-row[data-v-d296fa22]:hover{background:#f8fafd}.dependency-row[data-v-d296fa22]:last-of-type{border-bottom:0}.tool-info[data-v-d296fa22]{flex:1;min-width:0}.title[data-v-d296fa22]{display:flex;align-items:center;gap:8px;margin-bottom:3px;flex-wrap:wrap}.title strong[data-v-d296fa22]{font-size:14.5px}.chip.version[data-v-d296fa22]{font-size:11px;padding:2px 8px;color:var(--muted)}.tool-info p[data-v-d296fa22]{margin:0;font-size:12.5px}.actions[data-v-d296fa22]{display:flex;align-items:center;gap:8px;flex-shrink:0}.actions .primary[data-v-d296fa22],.actions .ghost[data-v-d296fa22]{padding:7px 15px;font-size:12.5px}.actions .ghost.danger[data-v-d296fa22]{color:var(--danger)}.actions .ghost.danger[data-v-d296fa22]:hover{background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}@media (max-width: 640px){.dependency-row[data-v-d296fa22]{flex-wrap:wrap}.actions[data-v-d296fa22]{width:100%;justify-content:flex-end}}.log-stream[data-v-a4d9e36c]{height:260px;overflow:auto;background:#111827;color:#d1f0ea;border-radius:10px;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.log-stream p[data-v-a4d9e36c]{margin:2px 0;white-space:pre-wrap}.settings[data-v-b8d6e7ed]{max-width:820px;margin:0 auto;display:grid;gap:18px}.running-chip[data-v-b8d6e7ed]{color:var(--success);background:var(--success-soft);border-color:transparent}.running-chip .dot[data-v-b8d6e7ed]{width:7px;height:7px;border-radius:50%;background:currentColor;animation:pulse-dot-b8d6e7ed 2s ease infinite}@keyframes pulse-dot-b8d6e7ed{0%,to{box-shadow:0 0 #04785759}50%{box-shadow:0 0 0 5px #04785700}}.stop-row[data-v-b8d6e7ed]{display:flex;justify-content:space-between;align-items:center;gap:16px}.version-chip[data-v-b8d6e7ed]{font-size:11px;font-weight:600;color:var(--muted);background:#f0f3f8;border-color:transparent;vertical-align:2px;margin-left:4px}.stop-desc[data-v-b8d6e7ed]{margin:0;font-size:12.5px;line-height:1.7;flex:1}.stop-desc code[data-v-b8d6e7ed]{background:#f0f3f8;padding:2px 7px;border-radius:5px;font-size:12px}.stop-btn[data-v-b8d6e7ed]{flex-shrink:0;color:var(--danger)}.stop-btn[data-v-b8d6e7ed]:hover:not(:disabled){background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}.stopped-card[data-v-b8d6e7ed]{display:grid;gap:10px;padding:18px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.stopped-card>p[data-v-b8d6e7ed]{margin:0;display:flex;align-items:center;gap:8px;font-size:14px}.stopped-card .muted[data-v-b8d6e7ed]{font-size:13px;line-height:1.7}.command-row[data-v-b8d6e7ed]{display:flex;gap:8px;align-items:stretch}.command-row code[data-v-b8d6e7ed]{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.command-row code .prompt[data-v-b8d6e7ed]{color:#64748b;-webkit-user-select:none;user-select:none;margin-right:8px}.page-subtitle[data-v-b8d6e7ed]{margin:0 0 4px}.panel[data-v-b8d6e7ed]{display:grid;gap:16px}.section-head[data-v-b8d6e7ed]{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.section-head h2[data-v-b8d6e7ed]{margin:0;font-size:17px}.section-head h3[data-v-b8d6e7ed]{margin:0;font-size:15px}.section-sub[data-v-b8d6e7ed]{margin:4px 0 0;font-size:12.5px}.recheck[data-v-b8d6e7ed]{flex-shrink:0}.summary-card[data-v-b8d6e7ed]{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:22px;padding:14px 18px;background:#fafbfd;border:1px solid var(--border);border-radius:var(--radius)}.summary-text[data-v-b8d6e7ed]{display:flex;align-items:baseline;gap:8px}.summary-text strong[data-v-b8d6e7ed]{font-size:24px;font-weight:800;letter-spacing:-.5px}.summary-text span[data-v-b8d6e7ed]{color:var(--muted);font-size:13px;font-weight:600}.alert[data-v-b8d6e7ed]{padding:10px 14px;border-radius:var(--radius-sm);background:var(--danger-soft);color:var(--danger);margin:0;font-size:13px}.dep-list[data-v-b8d6e7ed]{display:grid}.install-session[data-v-b8d6e7ed]{display:grid;gap:8px;margin-top:4px}.session-state[data-v-b8d6e7ed]{margin:0;font-size:13px;font-weight:650;display:flex;align-items:center;gap:8px}.session-state.progress[data-v-b8d6e7ed]{color:var(--muted)}.session-state.done[data-v-b8d6e7ed]{color:var(--success)}.session-state.failed[data-v-b8d6e7ed]{color:var(--danger)}form[data-v-b8d6e7ed]{display:grid;gap:20px}.field[data-v-b8d6e7ed]{display:grid;gap:8px}.field>span[data-v-b8d6e7ed]{font-weight:650;font-size:13.5px}.directory-editor[data-v-b8d6e7ed]{display:flex;gap:8px}.directory-editor input[data-v-b8d6e7ed]{flex:1}.concurrency[data-v-b8d6e7ed]{display:flex;align-items:center;gap:12px}.concurrency input[data-v-b8d6e7ed]{max-width:120px}.concurrency small[data-v-b8d6e7ed]{font-size:12px}.error[data-v-b8d6e7ed]{color:var(--danger);margin:0;background:var(--danger-soft);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px}.saved[data-v-b8d6e7ed]{color:var(--success);margin:0;background:var(--success-soft);padding:10px 14px;border-radius:var(--radius-sm);font-size:13px;display:flex;align-items:center;gap:7px}.actions[data-v-b8d6e7ed]{display:flex;justify-content:flex-end;gap:10px}.install-guide[data-v-56162934]{display:grid;gap:18px}.platform-switch[data-v-56162934]{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--border);border-radius:11px;width:fit-content;background:#f6f8fc}.platform-switch button[data-v-56162934]{border:none;background:transparent;padding:7px 22px;border-radius:8px;cursor:pointer;font-weight:650;font-size:13px;color:var(--muted);transition:all var(--ease)}.platform-switch button[data-v-56162934]:hover{color:var(--text)}.platform-switch button.active[data-v-56162934]{background:#fff;color:var(--primary);font-weight:750;box-shadow:var(--shadow-sm),inset 0 0 0 1px #d6e2fb}.steps[data-v-56162934]{display:grid;gap:16px;padding-left:0;margin:0;list-style:none}.steps li[data-v-56162934]{display:flex;gap:14px}.step-no[data-v-56162934]{width:26px;height:26px;flex-shrink:0;display:grid;place-items:center;border-radius:50%;font-weight:800;font-size:13px;background:var(--primary-soft);color:var(--primary)}.steps strong[data-v-56162934]{font-size:14px;display:block;margin-bottom:4px}.steps p[data-v-56162934]{margin:0;font-size:13px;line-height:1.7}.steps .hint[data-v-56162934]{color:var(--muted)}.command-block[data-v-56162934]{display:grid;gap:8px}.command-row[data-v-56162934]{display:flex;gap:8px;align-items:stretch}.command-row code[data-v-56162934]{flex:1;min-width:0;display:flex;align-items:center;gap:10px;padding:12px 14px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow-x:auto;white-space:nowrap}.command-row code .prompt[data-v-56162934]{color:#64748b;flex-shrink:0;-webkit-user-select:none;user-select:none}.copy[data-v-56162934]{flex-shrink:0}.daemon-gate[data-v-0f39bf4c]{display:grid;gap:20px;padding:30px;border:1px solid var(--border);border-radius:var(--radius);background:#fff;max-width:760px;box-shadow:var(--shadow-sm)}.gate-state[data-v-0f39bf4c]{display:grid;gap:12px;justify-items:center;text-align:center}.gate-state>p[data-v-0f39bf4c]{margin:0;font-size:15.5px;font-weight:700}.gate-state .hint[data-v-0f39bf4c]{font-weight:400;font-size:13px}.gate-icon[data-v-0f39bf4c]{width:56px;height:56px;display:grid;place-items:center;border-radius:50%}.gate-icon.ok[data-v-0f39bf4c]{color:var(--success);background:var(--success-soft)}.gate-icon.off[data-v-0f39bf4c]{color:var(--warning);background:var(--warning-soft)}.checking[data-v-0f39bf4c]{align-items:center;padding:30px 0}.spinner.big[data-v-0f39bf4c]{width:28px;height:28px;border-width:3px}.actions[data-v-0f39bf4c]{display:flex;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap}.direct-link[data-v-0f39bf4c]{text-decoration:none;font-size:13px}.offline[data-v-0f39bf4c] .install-guide{justify-items:start;text-align:left;margin-top:6px;width:100%}.start-block[data-v-0f39bf4c]{display:grid;gap:12px;width:100%;padding:18px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.manual[data-v-0f39bf4c]{display:grid;gap:8px}.manual-label[data-v-0f39bf4c]{font-size:12px;font-weight:700;color:var(--muted)}.manual-row[data-v-0f39bf4c]{display:flex;gap:8px;align-items:stretch}.manual-row code[data-v-0f39bf4c]{flex:1;min-width:0;display:flex;align-items:center;gap:8px;padding:10px 13px;background:#0f172a;color:#7dd3fc;border-radius:var(--radius-sm);font-size:12.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.manual-row code .prompt[data-v-0f39bf4c]{color:#64748b;-webkit-user-select:none;user-select:none}.copy[data-v-0f39bf4c]{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:9px;padding:0 13px;background:#2563eb;color:#fff;font-size:12.5px;font-weight:650;transition:filter var(--ease)}.copy[data-v-0f39bf4c]:hover{filter:brightness(1.1)}.copy[data-v-0f39bf4c]:active{transform:var(--press)}.copy.ok[data-v-0f39bf4c]{background:#059669}.manual-hint[data-v-0f39bf4c]{margin:0;color:var(--muted);font-size:12.5px;line-height:1.6}.install-collapsed[data-v-0f39bf4c]{border-top:1px solid var(--border);padding-top:12px}.install-toggle[data-v-0f39bf4c]{display:inline-flex;align-items:center;gap:5px;background:transparent;color:var(--muted);padding:4px 6px;font-size:12.5px}.install-toggle[data-v-0f39bf4c]:hover{color:var(--primary);background:var(--primary-soft)}.install-toggle svg[data-v-0f39bf4c]{transition:transform var(--ease)}.install-toggle svg.open[data-v-0f39bf4c]{transform:rotate(180deg)}.follow-gate[data-v-8a413519]{display:grid;grid-template-columns:220px 1fr;gap:30px;align-items:start;padding:30px;border-radius:var(--radius);background:linear-gradient(180deg,#fbfcff,#f6f8fc);border:1px solid var(--border)}.gate-left[data-v-8a413519]{display:grid;gap:10px;justify-items:center;text-align:center}.gh-qrcode[data-v-8a413519]{width:200px;height:200px;border-radius:12px;border:1px solid var(--border);background:#fff;object-fit:contain}.qr-hint[data-v-8a413519]{margin:0;font-size:12.5px;color:var(--muted);font-weight:600}.gate-right[data-v-8a413519]{display:grid;gap:14px}.gate-right h2[data-v-8a413519]{margin:0;font-size:21px;font-weight:780;letter-spacing:-.4px}.gate-desc[data-v-8a413519]{margin:0;color:var(--text-2);font-size:13.5px;line-height:1.7}.gate-desc strong[data-v-8a413519]{color:var(--primary)}.code-row[data-v-8a413519]{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:13px 16px;border-radius:var(--radius-sm);background:#0f172a}.code-label[data-v-8a413519]{color:#94a3b8;font-size:12px;font-weight:600}.code-row code[data-v-8a413519]{flex:1;min-width:0;color:#7dd3fc;font-size:19px;font-weight:800;letter-spacing:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.copy[data-v-8a413519]{display:inline-flex;align-items:center;gap:5px;border:none;cursor:pointer;border-radius:8px;padding:7px 13px;background:#2563eb;color:#fff;font-size:12.5px;font-weight:650;transition:filter var(--ease)}.copy[data-v-8a413519]:hover{filter:brightness(1.1)}.copy[data-v-8a413519]:active{transform:var(--press)}.copy.ok[data-v-8a413519]{background:#059669}.gate-steps[data-v-8a413519]{list-style:none;margin:0;padding:0;display:grid;gap:8px}.gate-steps li[data-v-8a413519]{display:flex;gap:9px;align-items:baseline;color:var(--text-2);font-size:13px;line-height:1.6}.gate-steps li span[data-v-8a413519]{flex-shrink:0;width:19px;height:19px;display:grid;place-items:center;border-radius:50%;background:var(--primary-soft);color:var(--primary);font-size:11px;font-weight:800;transform:translateY(2px)}.gate-error[data-v-8a413519]{display:flex;align-items:center;gap:7px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.waiting[data-v-8a413519]{margin:0;display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12.5px}.spinner.tiny[data-v-8a413519]{width:13px;height:13px;border-width:2px}@media (max-width: 760px){.follow-gate[data-v-8a413519]{grid-template-columns:1fr}.gate-left[data-v-8a413519]{justify-self:center}}.workbench[data-v-9641c996]{display:grid;gap:18px}.page-subtitle[data-v-9641c996]{margin:0 0 20px}.tabbed[data-v-9641c996]{display:grid;grid-template-columns:148px 1fr;gap:16px;align-items:start}.tab-rail[data-v-9641c996]{display:grid;gap:4px;padding:8px;background:#fff;border:1px solid var(--border);border-radius:var(--radius);position:sticky;top:84px}.tab-btn[data-v-9641c996]{display:flex;align-items:center;gap:9px;padding:10px 12px;border-radius:var(--radius-sm);background:transparent;border:none;color:var(--text-2);font-weight:600;font-size:13.5px;cursor:pointer;text-align:left;transition:background-color var(--ease),color var(--ease)}.tab-btn[data-v-9641c996]:hover{background:var(--primary-soft);color:var(--primary)}.tab-btn[data-v-9641c996]:active{transform:var(--press)}.tab-btn.active[data-v-9641c996]{background:var(--primary);color:#fff;box-shadow:0 3px 10px -2px #2563eb66}.tab-label[data-v-9641c996]{flex:1}.tab-count[data-v-9641c996]{min-width:20px;height:20px;padding:0 6px;display:grid;place-items:center;border-radius:999px;font-size:11px;font-weight:800;background:#e8edf6;color:var(--text-2)}.tab-btn.active .tab-count[data-v-9641c996]{background:#ffffff40;color:#fff}.tab-panel[data-v-9641c996]{display:grid;gap:16px;min-width:0}.dropzone[data-v-9641c996]{display:grid;gap:8px;justify-items:center;text-align:center;padding:38px 24px 24px;border:2px dashed #c3cfe3;border-radius:var(--radius);background:linear-gradient(180deg,#fbfcff,#f6f8fc);transition:border-color var(--ease),background-color var(--ease)}.dropzone.dragging[data-v-9641c996]{border-color:var(--primary);background:var(--primary-soft)}.dropzone.compact[data-v-9641c996]{padding:12px 18px;grid-template-columns:auto auto 1fr;align-items:center;gap:8px 12px;text-align:left}.dropzone.compact .drop-actions[data-v-9641c996]{grid-column:1 / -1}.drop-compact-text[data-v-9641c996]{font-size:13px;color:var(--muted);font-weight:600}.drop-icon[data-v-9641c996]{width:58px;height:58px;display:grid;place-items:center;border-radius:50%;color:var(--primary);background:var(--primary-soft)}.drop-title[data-v-9641c996]{font-size:16.5px}.drop-hint[data-v-9641c996]{margin:0;font-size:12.5px}.drop-actions[data-v-9641c996]{display:flex;gap:8px;width:min(560px,100%);margin-top:4px}.dropzone.compact .drop-actions[data-v-9641c996]{margin-top:0}.drop-actions input[data-v-9641c996]{flex:1;min-width:0}.hint-alert[data-v-9641c996]{display:flex;align-items:center;gap:8px;margin:0;color:var(--warning);background:var(--warning-soft);padding:9px 13px;border-radius:var(--radius-sm);font-size:13px}.tools-missing[data-v-9641c996]{flex-wrap:wrap}.tools-missing .hint-text[data-v-9641c996]{flex:1;min-width:180px}.goto-settings[data-v-9641c996]{padding:7px 16px;font-size:12.5px}.target-bar[data-v-9641c996]{display:grid;gap:9px}.section-title[data-v-9641c996]{font-weight:700;font-size:13.5px}.target-chips[data-v-9641c996]{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.target-chip[data-v-9641c996]{padding:7px 16px;border-radius:999px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:700;color:var(--text-2);transition:all var(--ease)}.target-chip[data-v-9641c996]:hover{border-color:#b9cdf8;color:var(--primary);background:var(--primary-soft)}.target-chip[data-v-9641c996]:active{transform:var(--press)}.target-chip.active[data-v-9641c996]{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 3px 10px -2px #2563eb73}.table-wrap[data-v-9641c996]{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius);background:#fff}.file-table[data-v-9641c996]{width:100%;border-collapse:collapse;min-width:760px;font-size:13px}.file-table th[data-v-9641c996]{text-align:left;padding:10px 14px;background:#f7f9fc;color:var(--muted);font-size:12px;font-weight:700;letter-spacing:.3px;border-bottom:1px solid var(--border)}.file-table td[data-v-9641c996]{padding:10px 14px;border-bottom:1px solid var(--border);vertical-align:middle}.file-table tbody tr:last-child td[data-v-9641c996]{border-bottom:0}.file-table tbody tr[data-v-9641c996]{transition:background-color var(--ease)}.file-table tbody tr[data-v-9641c996]:hover{background:#fafbfe}.cell-file[data-v-9641c996]{display:flex;align-items:center;gap:9px;min-width:0}.file-icon[data-v-9641c996]{color:var(--muted);display:grid;place-items:center}.file-name[data-v-9641c996]{font-weight:650;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip.ext[data-v-9641c996]{font-size:10.5px;padding:2px 8px;color:var(--primary);background:var(--primary-soft);border-color:transparent;font-weight:750}.cell-path[data-v-9641c996]{max-width:260px}.path-link[data-v-9641c996]{background:none;border:none;padding:0;cursor:pointer;color:var(--primary);font-size:12.5px;text-align:left;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.path-link[data-v-9641c996]:hover{text-decoration:underline}.path-link[data-v-9641c996]:active{opacity:.7}.cell-size[data-v-9641c996]{white-space:nowrap;color:var(--muted);font-size:12.5px}.row-status[data-v-9641c996]{display:inline-flex;align-items:center;gap:7px;font-weight:650;font-size:12.5px;white-space:nowrap}.row-status.pending[data-v-9641c996]{color:var(--muted)}.row-status.converting[data-v-9641c996]{color:var(--warning)}.row-status.success[data-v-9641c996]{color:var(--success)}.row-status.failed[data-v-9641c996]{color:var(--danger);flex-wrap:wrap;white-space:normal}.row-status em[data-v-9641c996]{font-style:normal;font-size:11.5px;opacity:.85}.row-error[data-v-9641c996]{max-width:220px;overflow:hidden;text-overflow:ellipsis;font-weight:500}.spinner.tiny[data-v-9641c996]{width:13px;height:13px;border-width:2px}.cell-actions[data-v-9641c996]{white-space:nowrap}.cell-actions .ghost.tiny[data-v-9641c996]{padding:5px 11px;font-size:12px;margin-right:6px}.cell-actions .icon-btn[data-v-9641c996]{padding:5px;border-radius:8px;background:transparent;color:var(--muted)}.cell-actions .icon-btn[data-v-9641c996]:hover{background:var(--danger-soft);color:var(--danger)}.params[data-v-9641c996]{display:grid;gap:10px;padding:14px;border:1px solid var(--border);border-radius:var(--radius);background:#fafbfd}.params-grid[data-v-9641c996]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.param-field[data-v-9641c996]{display:grid;gap:6px;min-width:0}.param-label[data-v-9641c996]{font-weight:650;font-size:13px}.param-label .required[data-v-9641c996]{color:var(--danger);font-style:normal;margin-left:2px}.watermark-editor[data-v-9641c996]{display:flex;gap:8px}.watermark-editor input[data-v-9641c996]{flex:1;min-width:0}.param-description[data-v-9641c996]{color:var(--muted);font-size:12px;line-height:1.6}.batch-bar[data-v-9641c996]{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:13px 18px;border-radius:var(--radius);background:linear-gradient(92deg,#f0f5ff,#f8faff);border:1px solid #d9e4fb}.summary[data-v-9641c996]{font-size:13.5px;color:var(--text-2)}.summary strong[data-v-9641c996]{color:var(--primary);font-size:14.5px}.batch-bar.disabled .summary[data-v-9641c996]{color:var(--muted)}.batch-actions[data-v-9641c996]{display:flex;gap:10px;align-items:center}.batch[data-v-9641c996]{padding:11px 28px;font-size:14px}@media (max-width: 900px){.tabbed[data-v-9641c996]{grid-template-columns:1fr}.tab-rail[data-v-9641c996]{position:static;grid-auto-flow:column;grid-auto-columns:max-content;overflow-x:auto}.params-grid[data-v-9641c996]{grid-template-columns:1fr}}:root{--primary: #2563eb;--primary-hover: #1d4ed8;--primary-active: #1e40af;--primary-soft: #eff4ff;--primary-soft-hover: #e3ecff;--primary-ring: 0 0 0 3px rgb(37 99 235 / 22%);--text: #0f172a;--text-2: #3f4a5c;--muted: #768193;--border: #e4e9f1;--border-strong: #cdd6e4;--surface: #f5f7fb;--card: #ffffff;--danger: #dc2626;--danger-soft: #fee2e2;--warning: #b45309;--warning-soft: #fef3c7;--success: #047857;--success-soft: #d1fae5;--radius: 14px;--radius-sm: 10px;--shadow-sm: 0 1px 2px rgb(15 23 42 / 5%);--shadow-md: 0 6px 22px -6px rgb(15 23 42 / 12%);--shadow-lg: 0 18px 44px -12px rgb(15 23 42 / 20%);--press: translateY(1px);--ease: .16s cubic-bezier(.3, .7, .4, 1)}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased}body{margin:0;font-family:Inter,PingFang SC,HarmonyOS Sans SC,Microsoft YaHei,system-ui,sans-serif;color:var(--text);background:var(--surface);font-size:14px;line-height:1.6}::selection{background:#2563eb2e}button,.btn{font:inherit;font-weight:600;border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;padding:9px 16px;display:inline-flex;align-items:center;justify-content:center;gap:7px;text-decoration:none;white-space:nowrap;transition:background-color var(--ease),border-color var(--ease),color var(--ease),box-shadow var(--ease),transform var(--ease),opacity var(--ease)}button:active,.btn:active{transform:var(--press)}button:focus-visible,.btn:focus-visible,a:focus-visible{outline:none;box-shadow:var(--primary-ring);border-radius:var(--radius-sm)}button.primary,.btn.primary,a.primary{background:var(--primary);color:#fff;box-shadow:var(--shadow-sm)}button.primary:hover,.btn.primary:hover,a.primary:hover{background:var(--primary-hover);box-shadow:var(--shadow-md)}button.primary:active,.btn.primary:active,a.primary:active{background:var(--primary-active);box-shadow:none}button.primary:disabled,.btn.primary:disabled{background:#b7c6e4;color:#f2f5fb;cursor:not-allowed;box-shadow:none;transform:none}button.ghost,.btn.ghost,a.ghost{background:var(--card);border-color:var(--border);color:var(--text-2)}button.ghost:hover,.btn.ghost:hover,a.ghost:hover{border-color:var(--border-strong);background:#f8fafd;color:var(--text)}button.ghost:active,.btn.ghost:active,a.ghost:active{background:#eef2f8;transform:var(--press)}button.ghost:disabled,.btn.ghost:disabled{color:#b3bccb;border-color:var(--border);background:#f6f8fb;cursor:not-allowed;transform:none}button.ghost.danger,a.ghost.danger{color:var(--danger)}button.ghost.danger:hover{background:#fef5f4;border-color:#f3c1bd;color:#b91c1c}button.ghost.danger:active{background:var(--danger-soft)}button.link{background:transparent;color:var(--primary);padding:4px 6px}button.link:hover{color:var(--primary-hover);background:var(--primary-soft)}button.link:active{transform:var(--press)}.card,.panel{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:22px;box-shadow:var(--shadow-sm)}.grid{display:grid;gap:18px}.muted{color:var(--muted)}input,select{min-height:40px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px;font:inherit;color:var(--text);background:var(--card);width:100%;transition:border-color var(--ease),box-shadow var(--ease),background-color var(--ease)}input:hover,select:hover{border-color:var(--border-strong)}input:focus,select:focus{outline:none;border-color:var(--primary);box-shadow:var(--primary-ring)}input:disabled{background:#f4f6fa;color:var(--muted);cursor:not-allowed}input::placeholder{color:#a5aebd}label{color:var(--text-2)}.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:700;line-height:1.5}.badge:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.badge.ready,.badge.success{color:var(--success);background:var(--success-soft)}.badge.outdated,.badge.running{color:var(--warning);background:var(--warning-soft)}.badge.missing-required,.badge.failed{color:var(--danger);background:var(--danger-soft)}.badge.missing-optional,.badge.queued{color:#5b6779;background:#eef1f6}.chip{display:inline-flex;align-items:center;gap:5px;padding:4px 11px;border-radius:999px;border:1px solid var(--border);background:var(--card);color:var(--text-2);font-size:12px;font-weight:600}.bar{height:6px;background:#e8edf5;border-radius:99px;overflow:hidden}.bar i{display:block;height:100%;background:linear-gradient(90deg,var(--primary),#60a5fa);border-radius:99px;transition:width .3s ease}.spinner{width:18px;height:18px;border:2.5px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.page-title{margin:0 0 6px;font-size:24px;font-weight:700;letter-spacing:-.3px}.page-subtitle{margin:0 0 22px;color:var(--muted)}.empty{text-align:center;color:var(--muted);padding:48px 20px;display:grid;gap:10px;justify-items:center}.errors{color:var(--danger);padding:10px 14px;background:var(--danger-soft);border-radius:var(--radius-sm);list-style:none;margin:0;font-size:13px;display:grid;gap:4px}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#ccd5e3;border-radius:99px;border:2.5px solid var(--surface)}::-webkit-scrollbar-thumb:hover{background:#b6c2d4}::-webkit-scrollbar-track{background:transparent}
|
|
@@ -29,4 +29,4 @@ var Sl=Object.defineProperty;var xl=(e,t,s)=>t in e?Sl(e,t,{enumerable:!0,config
|
|
|
29
29
|
* @license MIT
|
|
30
30
|
*/let Vu=()=>location.protocol+"//"+location.host;function gl(e,t){const{pathname:s,search:n,hash:o}=t,i=e.indexOf("#");if(i>-1){let r=o.includes(e.slice(i))?e.slice(i).length:1,l=o.slice(r);return l[0]!=="/"&&(l="/"+l),_i(l,"")}return _i(s,e)+n+o}function Lu(e,t,s,n){let o=[],i=[],r=null;const l=({state:v})=>{const x=gl(e,location),V=s.value,M=t.value;let z=0;if(v){if(s.value=x,t.value=v,r&&r===V){r=null;return}z=M?v.position-M.position:0}else n(x);o.forEach(N=>{N(s.value,V,{delta:z,type:ro.pop,direction:z?z>0?Bn.forward:Bn.back:Bn.unknown})})};function a(){r=s.value}function d(v){o.push(v);const x=()=>{const V=o.indexOf(v);V>-1&&o.splice(V,1)};return i.push(x),x}function u(){if(document.visibilityState==="hidden"){const{history:v}=window;if(!v.state)return;v.replaceState(ue({},v.state,{scroll:Cn()}),"")}}function h(){for(const v of i)v();i=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:a,listen:d,destroy:h}}function ki(e,t,s,n=!1,o=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:o?Cn():null}}function Hu(e){const{history:t,location:s}=window,n={value:gl(e,s)},o={value:t.state};o.value||i(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(a,d,u){const h=e.indexOf("#"),v=h>-1?(s.host&&document.querySelector("base")?e:e.slice(h))+a:Vu()+e+a;try{t[u?"replaceState":"pushState"](d,"",v),o.value=d}catch(x){console.error(x),s[u?"replace":"assign"](v)}}function r(a,d){i(a,ue({},t.state,ki(o.value.back,a,o.value.forward,!0),d,{position:o.value.position}),!0),n.value=a}function l(a,d){const u=ue({},o.value,t.state,{forward:a,scroll:Cn()});i(u.current,u,!0),i(a,ue({},ki(n.value,a,null),{position:u.position+1},d),!1),n.value=a}return{location:n,state:o,push:l,replace:r}}function ju(e){e=ku(e);const t=Hu(e),s=Lu(e,t.state,t.location,t.replace);function n(i,r=!0){r||s.pauseListeners(),history.go(i)}const o=ue({location:"",base:e,go:n,createHref:Eu.bind(null,e)},t,s);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Uu(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),ju(e)}let Zt=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Ae=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Ae||{});const Bu={type:Zt.Static,value:""},zu=/[a-zA-Z0-9_]/;function Ku(e){if(!e)return[[]];if(e==="/")return[[Bu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(x){throw new Error(`ERR (${s})/"${d}": ${x}`)}let s=Ae.Static,n=s;const o=[];let i;function r(){i&&o.push(i),i=[]}let l=0,a,d="",u="";function h(){d&&(s===Ae.Static?i.push({type:Zt.Static,value:d}):s===Ae.Param||s===Ae.ParamRegExp||s===Ae.ParamRegExpEnd?(i.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),i.push({type:Zt.Param,value:d,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),d="")}function v(){d+=a}for(;l<e.length;){if(a=e[l++],a==="\\"&&s!==Ae.ParamRegExp){n=s,s=Ae.EscapeNext;continue}switch(s){case Ae.Static:a==="/"?(d&&h(),r()):a===":"?(h(),s=Ae.Param):v();break;case Ae.EscapeNext:v(),s=n;break;case Ae.Param:a==="("?s=Ae.ParamRegExp:zu.test(a)?v():(h(),s=Ae.Static,a!=="*"&&a!=="?"&&a!=="+"&&l--);break;case Ae.ParamRegExp:a===")"?u[u.length-1]=="\\"?u=u.slice(0,-1)+a:s=Ae.ParamRegExpEnd:u+=a;break;case Ae.ParamRegExpEnd:h(),s=Ae.Static,a!=="*"&&a!=="?"&&a!=="+"&&l--,u="";break;default:t("Unknown state");break}}return s===Ae.ParamRegExp&&t(`Unfinished custom RegExp for param "${d}"`),h(),r(),o}const Ci="[^/]+?",Wu={sensitive:!1,strict:!1,start:!0,end:!0};var Fe=function(e){return e[e._multiplier=10]="_multiplier",e[e.Root=90]="Root",e[e.Segment=40]="Segment",e[e.SubSegment=30]="SubSegment",e[e.Static=40]="Static",e[e.Dynamic=20]="Dynamic",e[e.BonusCustomRegExp=10]="BonusCustomRegExp",e[e.BonusWildcard=-50]="BonusWildcard",e[e.BonusRepeatable=-20]="BonusRepeatable",e[e.BonusOptional=-8]="BonusOptional",e[e.BonusStrict=.7000000000000001]="BonusStrict",e[e.BonusCaseSensitive=.25]="BonusCaseSensitive",e}(Fe||{});const Gu=/[.+*?^${}()[\]/\\]/g;function qu(e,t){const s=ue({},Wu,t),n=[];let o=s.start?"^":"";const i=[];for(const d of e){const u=d.length?[]:[Fe.Root];s.strict&&!d.length&&(o+="/");for(let h=0;h<d.length;h++){const v=d[h];let x=Fe.Segment+(s.sensitive?Fe.BonusCaseSensitive:0);if(v.type===Zt.Static)h||(o+="/"),o+=v.value.replace(Gu,"\\$&"),x+=Fe.Static;else if(v.type===Zt.Param){const{value:V,repeatable:M,optional:z,regexp:N}=v;i.push({name:V,repeatable:M,optional:z});const E=N||Ci;if(E!==Ci){x+=Fe.BonusCustomRegExp;try{`${E}`}catch(D){throw new Error(`Invalid custom RegExp for param "${V}" (${E}): `+D.message)}}let T=M?`((?:${E})(?:/(?:${E}))*)`:`(${E})`;h||(T=z&&d.length<2?`(?:/${T})`:"/"+T),z&&(T+="?"),o+=T,x+=Fe.Dynamic,z&&(x+=Fe.BonusOptional),M&&(x+=Fe.BonusRepeatable),E===".*"&&(x+=Fe.BonusWildcard)}u.push(x)}n.push(u)}if(s.strict&&s.end){const d=n.length-1;n[d][n[d].length-1]+=Fe.BonusStrict}s.strict||(o+="/?"),s.end?o+="$":s.strict&&!o.endsWith("/")&&(o+="(?:/|$)");const r=new RegExp(o,s.sensitive?"":"i");function l(d){const u=d.match(r),h={};if(!u)return null;for(let v=1;v<u.length;v++){const x=u[v]||"",V=i[v-1];h[V.name]=x&&V.repeatable?x.split("/"):x}return h}function a(d){let u="",h=!1;for(const v of e){(!h||!u.endsWith("/"))&&(u+="/"),h=!1;for(const x of v)if(x.type===Zt.Static)u+=x.value;else if(x.type===Zt.Param){const{value:V,repeatable:M,optional:z}=x,N=V in d?d[V]:"";if(ct(N)&&!M)throw new Error(`Provided param "${V}" is an array but it is not repeatable (* or + modifiers)`);const E=ct(N)?N.join("/"):N;if(!E)if(z)v.length<2&&(u.endsWith("/")?u=u.slice(0,-1):h=!0);else throw new Error(`Missing required param "${V}"`);u+=E}}return u||"/"}return{re:r,score:n,keys:i,parse:l,stringify:a}}function Ju(e,t){let s=0;for(;s<e.length&&s<t.length;){const n=t[s]-e[s];if(n)return n;s++}return e.length<t.length?e.length===1&&e[0]===Fe.Static+Fe.Segment?-1:1:e.length>t.length?t.length===1&&t[0]===Fe.Static+Fe.Segment?1:-1:0}function ml(e,t){let s=0;const n=e.score,o=t.score;for(;s<n.length&&s<o.length;){const i=Ju(n[s],o[s]);if(i)return i;s++}if(Math.abs(o.length-n.length)===1){if(Ei(n))return 1;if(Ei(o))return-1}return o.length-n.length}function Ei(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const Yu={strict:!1,end:!0,sensitive:!1};function Qu(e,t,s){const n=qu(Ku(e.path),s),o=ue(n,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function Xu(e,t){const s=[],n=new Map;t=yi(Yu,t);function o(h){return n.get(h)}function i(h,v,x){const V=!x,M=Ri(h);M.aliasOf=x&&x.record;const z=yi(t,h),N=[M];if("alias"in h){const D=typeof h.alias=="string"?[h.alias]:h.alias;for(const B of D)N.push(Ri(ue({},M,{components:x?x.record.components:M.components,path:B,aliasOf:x?x.record:M})))}let E,T;for(const D of N){const{path:B}=D;if(v&&B[0]!=="/"){const _e=v.record.path,te=_e[_e.length-1]==="/"?"":"/";D.path=v.record.path+(B&&te+B)}if(E=Qu(D,v,z),x?x.alias.push(E):(T=T||E,T!==E&&T.alias.push(E),V&&h.name&&!Ti(E)&&r(h.name)),vl(E)&&a(E),M.children){const _e=M.children;for(let te=0;te<_e.length;te++)i(_e[te],E,x&&x.children[te])}x=x||E}return T?()=>{r(T)}:Rs}function r(h){if(dl(h)){const v=n.get(h);v&&(n.delete(h),s.splice(s.indexOf(v),1),v.children.forEach(r),v.alias.forEach(r))}else{const v=s.indexOf(h);v>-1&&(s.splice(v,1),h.record.name&&n.delete(h.record.name),h.children.forEach(r),h.alias.forEach(r))}}function l(){return s}function a(h){const v=tf(h,s);s.splice(v,0,h),h.record.name&&!Ti(h)&&n.set(h.record.name,h)}function d(h,v){let x,V={},M,z;if("name"in h&&h.name){if(x=n.get(h.name),!x)throw hs(be.MATCHER_NOT_FOUND,{location:h});z=x.record.name,V=ue(Ai(v.params,x.keys.filter(T=>!T.optional).concat(x.parent?x.parent.keys.filter(T=>T.optional):[]).map(T=>T.name)),h.params&&Ai(h.params,x.keys.map(T=>T.name))),M=x.stringify(V)}else if(h.path!=null)M=h.path,x=s.find(T=>T.re.test(M)),x&&(V=x.parse(M),z=x.record.name);else{if(x=v.name?n.get(v.name):s.find(T=>T.re.test(v.path)),!x)throw hs(be.MATCHER_NOT_FOUND,{location:h,currentLocation:v});z=x.record.name,V=ue({},v.params,h.params),M=x.stringify(V)}const N=[];let E=x;for(;E;)N.unshift(E.record),E=E.parent;return{name:z,path:M,params:V,matched:N,meta:ef(N)}}e.forEach(h=>i(h));function u(){s.length=0,n.clear()}return{addRoute:i,resolve:d,removeRoute:r,clearRoutes:u,getRoutes:l,getRecordMatcher:o}}function Ai(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function Ri(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Zu(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Zu(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function Ti(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function ef(e){return e.reduce((t,s)=>ue(t,s.meta),{})}function tf(e,t){let s=0,n=t.length;for(;s!==n;){const i=s+n>>1;ml(e,t[i])<0?n=i:s=i+1}const o=sf(e);return o&&(n=t.lastIndexOf(o,n-1)),n}function sf(e){let t=e;for(;t=t.parent;)if(vl(t)&&ml(e,t)===0)return t}function vl({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Oi(e){const t=ot(En),s=ot(pl),n=oe(()=>{const a=y(e.to);return t.resolve(a)}),o=oe(()=>{const{matched:a}=n.value,{length:d}=a,u=a[d-1],h=s.matched;if(!u||!h.length)return-1;const v=h.findIndex(ds.bind(null,u));if(v>-1)return v;const x=Pi(a[d-2]);return d>1&&Pi(u)===x&&h[h.length-1].path!==x?h.findIndex(ds.bind(null,a[d-2])):v}),i=oe(()=>o.value>-1&&lf(s.params,n.value.params)),r=oe(()=>o.value>-1&&o.value===s.matched.length-1&&fl(s.params,n.value.params));function l(a={}){if(rf(a)){const d=t[y(e.replace)?"replace":"push"](y(e.to)).catch(Rs);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:n,href:oe(()=>n.value.href),isActive:i,isExactActive:r,navigate:l}}function nf(e){return e.length===1?e[0]:e}const of=He({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Oi,setup(e,{slots:t}){const s=ns(Oi(e)),{options:n}=ot(En),o=oe(()=>({[Ii(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[Ii(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const i=t.default&&nf(t.default(s));return e.custom?i:Xr("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:o.value},i)}}}),Qt=of;function rf(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function lf(e,t){for(const s in t){const n=t[s],o=e[s];if(typeof n=="string"){if(n!==o)return!1}else if(!ct(o)||o.length!==n.length||n.some((i,r)=>i.valueOf()!==o[r].valueOf()))return!1}return!0}function Pi(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ii=(e,t,s)=>e??t??s,af=He({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=ot(ao),o=oe(()=>e.route||n.value),i=ot(xi,0),r=oe(()=>{let d=y(i);const{matched:u}=o.value;let h;for(;(h=u[d])&&!h.components;)d++;return d}),l=oe(()=>o.value.matched[r.value]);Js(xi,oe(()=>r.value+1)),Js(Du,l),Js(ao,o);const a=se();return Mt(()=>[a.value,l.value,e.name],([d,u,h],[v,x,V])=>{u&&(u.instances[h]=d,x&&x!==u&&d&&d===v&&(u.leaveGuards.size||(u.leaveGuards=x.leaveGuards),u.updateGuards.size||(u.updateGuards=x.updateGuards))),d&&u&&(!x||!ds(u,x)||!v)&&(u.enterCallbacks[h]||[]).forEach(M=>M(d))},{flush:"post"}),()=>{const d=o.value,u=e.name,h=l.value,v=h&&h.components[u];if(!v)return $i(s.default,{Component:v,route:d});const x=h.props[u],V=x?x===!0?d.params:typeof x=="function"?x(d):x:null,z=Xr(v,ue({},V,t,{onVnodeUnmounted:N=>{N.component.isUnmounted&&(h.instances[u]=null)},ref:a}));return $i(s.default,{Component:z,route:d})||z}}});function $i(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const yl=af;function cf(e){const t=Xu(e.routes,e),s=e.parseQuery||Mu,n=e.stringifyQuery||Si,o=e.history,i=ys(),r=ys(),l=ys(),a=ea(Ft);let d=Ft;cs&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=jn.bind(null,O=>""+O),h=jn.bind(null,vu),v=jn.bind(null,Ds);function x(O,j){let L,G;return dl(O)?(L=t.getRecordMatcher(O),G=j):G=O,t.addRoute(G,L)}function V(O){const j=t.getRecordMatcher(O);j&&t.removeRoute(j)}function M(){return t.getRoutes().map(O=>O.record)}function z(O){return!!t.getRecordMatcher(O)}function N(O,j){if(j=ue({},j||a.value),typeof O=="string"){const k=Un(s,O,j.path),A=t.resolve({path:k.path},j),P=o.createHref(k.fullPath);return ue(k,A,{params:v(A.params),hash:Ds(k.hash),redirectedFrom:void 0,href:P})}let L;if(O.path!=null)L=ue({},O,{path:Un(s,O.path,j.path).path});else{const k=ue({},O.params);for(const A in k)k[A]==null&&delete k[A];L=ue({},O,{params:h(k)}),j.params=h(j.params)}const G=t.resolve(L,j),f=O.hash||"";G.params=u(v(G.params));const p=bu(n,ue({},O,{hash:pu(f),path:G.path})),_=o.createHref(p);return ue({fullPath:p,hash:f,query:n===Si?Nu(O.query):O.query||{}},G,{redirectedFrom:void 0,href:_})}function E(O){return typeof O=="string"?Un(s,O,a.value.path):ue({},O)}function T(O,j){if(d!==O)return hs(be.NAVIGATION_CANCELLED,{from:j,to:O})}function D(O){return te(O)}function B(O){return D(ue(E(O),{replace:!0}))}function _e(O,j){const L=O.matched[O.matched.length-1];if(L&&L.redirect){const{redirect:G}=L;let f=typeof G=="function"?G(O,j):G;return typeof f=="string"&&(f=f.includes("?")||f.includes("#")?f=E(f):{path:f},f.params={}),ue({query:O.query,hash:O.hash,params:f.path!=null?{}:O.params},f)}}function te(O,j){const L=d=N(O),G=a.value,f=O.state,p=O.force,_=O.replace===!0,k=_e(L,G);if(k)return te(ue(E(k),{state:typeof k=="object"?ue({},f,k.state):f,force:p,replace:_}),j||L);const A=L;A.redirectedFrom=j;let P;return!p&&wu(n,G,L)&&(P=hs(be.NAVIGATION_DUPLICATED,{to:A,from:G}),Ge(G,G,!0,!1)),(P?Promise.resolve(P):le(A,G)).catch(m=>At(m)?At(m,be.NAVIGATION_GUARD_REDIRECT)?m:ft(m):ie(m,A,G)).then(m=>{if(m){if(At(m,be.NAVIGATION_GUARD_REDIRECT))return te(ue({replace:_},E(m.to),{state:typeof m.to=="object"?ue({},f,m.to.state):f,force:p}),j||A)}else m=Te(A,G,!0,_,f);return de(A,G,m),m})}function Z(O,j){const L=T(O,j);return L?Promise.reject(L):Promise.resolve()}function ee(O){const j=et.values().next().value;return j&&typeof j.runWithContext=="function"?j.runWithContext(O):O()}function le(O,j){let L;const[G,f,p]=Fu(O,j);L=zn(G.reverse(),"beforeRouteLeave",O,j);for(const k of G)k.leaveGuards.forEach(A=>{L.push(Ht(A,O,j))});const _=Z.bind(null,O,j);return L.push(_),Ne(L).then(()=>{L=[];for(const k of i.list())L.push(Ht(k,O,j));return L.push(_),Ne(L)}).then(()=>{L=zn(f,"beforeRouteUpdate",O,j);for(const k of f)k.updateGuards.forEach(A=>{L.push(Ht(A,O,j))});return L.push(_),Ne(L)}).then(()=>{L=[];for(const k of p)if(k.beforeEnter)if(ct(k.beforeEnter))for(const A of k.beforeEnter)L.push(Ht(A,O,j));else L.push(Ht(k.beforeEnter,O,j));return L.push(_),Ne(L)}).then(()=>(O.matched.forEach(k=>k.enterCallbacks={}),L=zn(p,"beforeRouteEnter",O,j,ee),L.push(_),Ne(L))).then(()=>{L=[];for(const k of r.list())L.push(Ht(k,O,j));return L.push(_),Ne(L)}).catch(k=>At(k,be.NAVIGATION_CANCELLED)?k:Promise.reject(k))}function de(O,j,L){l.list().forEach(G=>ee(()=>G(O,j,L)))}function Te(O,j,L,G,f){const p=T(O,j);if(p)return p;const _=j===Ft,k=cs?history.state:{};L&&(G||_?o.replace(O.fullPath,ue({scroll:_&&k&&k.scroll},f)):o.push(O.fullPath,f)),a.value=O,Ge(O,j,L,_),ft()}let Ee;function Ze(){Ee||(Ee=o.listen((O,j,L)=>{if(!Ct.listening)return;const G=N(O),f=_e(G,Ct.currentRoute.value);if(f){te(ue(f,{replace:!0,force:!0}),G).catch(Rs);return}d=G;const p=a.value;cs&&Tu(wi(p.fullPath,L.delta),Cn()),le(G,p).catch(_=>At(_,be.NAVIGATION_ABORTED|be.NAVIGATION_CANCELLED)?_:At(_,be.NAVIGATION_GUARD_REDIRECT)?(te(ue(E(_.to),{force:!0}),G).then(k=>{At(k,be.NAVIGATION_ABORTED|be.NAVIGATION_DUPLICATED)&&!L.delta&&L.type===ro.pop&&o.go(-1,!1)}).catch(Rs),Promise.reject()):(L.delta&&o.go(-L.delta,!1),ie(_,G,p))).then(_=>{_=_||Te(G,p,!1),_&&(L.delta&&!At(_,be.NAVIGATION_CANCELLED)?o.go(-L.delta,!1):L.type===ro.pop&&At(_,be.NAVIGATION_ABORTED|be.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),de(G,p,_)}).catch(Rs)}))}let ut=ys(),me=ys(),Y;function ie(O,j,L){ft(O);const G=me.list();return G.length?G.forEach(f=>f(O,j,L)):console.error(O),Promise.reject(O)}function We(){return Y&&a.value!==Ft?Promise.resolve():new Promise((O,j)=>{ut.add([O,j])})}function ft(O){return Y||(Y=!O,Ze(),ut.list().forEach(([j,L])=>O?L(O):j()),ut.reset()),O}function Ge(O,j,L,G){const{scrollBehavior:f}=e;if(!cs||!f)return Promise.resolve();const p=!L&&Ou(wi(O.fullPath,0))||(G||!L)&&history.state&&history.state.scroll||null;return ps().then(()=>f(O,j,p)).then(_=>_&&Ru(_)).catch(_=>ie(_,O,j))}const Pe=O=>o.go(O);let qe;const et=new Set,Ct={currentRoute:a,listening:!0,addRoute:x,removeRoute:V,clearRoutes:t.clearRoutes,hasRoute:z,getRoutes:M,resolve:N,options:e,push:D,replace:B,go:Pe,back:()=>Pe(-1),forward:()=>Pe(1),beforeEach:i.add,beforeResolve:r.add,afterEach:l.add,onError:me.add,isReady:We,install(O){O.component("RouterLink",Qt),O.component("RouterView",yl),O.config.globalProperties.$router=Ct,Object.defineProperty(O.config.globalProperties,"$route",{enumerable:!0,get:()=>y(a)}),cs&&!qe&&a.value===Ft&&(qe=!0,D(o.location).catch(G=>{}));const j={};for(const G in Ft)Object.defineProperty(j,G,{get:()=>a.value[G],enumerable:!0});O.provide(En,Ct),O.provide(pl,hr(j)),O.provide(ao,a);const L=O.unmount;et.add(O),O.unmount=function(){et.delete(O),et.size<1&&(d=Ft,Ee&&Ee(),Ee=null,a.value=Ft,qe=!1,Y=!1),L()}}};function Ne(O){return O.reduce((j,L)=>j.then(()=>ee(L)),Promise.resolve())}return Ct}function uf(){return ot(En)}class ff{constructor(t=`${location.protocol==="https:"?"wss":"ws"}://${location.host}/ws`){Wt(this,"socket");Wt(this,"attempts",0);Wt(this,"timer");Wt(this,"handlers",new Set);Wt(this,"stateHandlers",new Set);Wt(this,"reconnectAfterResync");this.url=t}onMessage(t){return this.handlers.add(t),()=>this.handlers.delete(t)}onConnectionChange(t){return this.stateHandlers.add(t),()=>this.stateHandlers.delete(t)}onResync(t){this.reconnectAfterResync=()=>void t()}connect(){var s;clearTimeout(this.timer),(s=this.socket)==null||s.close();const t=new WebSocket(this.url);this.socket=t,t.onopen=()=>{var n;this.attempts=0,this.stateHandlers.forEach(o=>o(!0)),(n=this.reconnectAfterResync)==null||n.call(this)},t.onmessage=n=>{try{const o=JSON.parse(n.data);this.handlers.forEach(i=>i(o))}catch{}},t.onclose=()=>{this.stateHandlers.forEach(o=>o(!1)),this.attempts+=1;const n=Math.min(15e3,1e3*2**(this.attempts-1));this.timer=window.setTimeout(()=>this.connect(),n)},t.onerror=()=>t.close()}}let Mi;function Ao(){return Mi??(Mi=new ff),Mi}class Ro extends Error{constructor(t,s,n,o){super(n),this.status=t,this.code=s,this.details=o,this.name="ApiError"}}async function Oe(e,t){const s=await fetch(e,{...t,headers:{"content-type":"application/json",...(t==null?void 0:t.headers)??{}}}),n=await s.json().catch(()=>({code:"INVALID_RESPONSE",message:"响应不是合法 JSON"}));if(!s.ok){const o=n;throw new Ro(s.status,o.code??"UNKNOWN_ERROR",o.message??"请求失败",o.details)}return n}async function Ni(e){const t=new URLSearchParams({filename:e.name}),s=await fetch(`/api/uploads?${t}`,{method:"POST",headers:{"content-type":"application/octet-stream"},body:e}),n=await s.json().catch(()=>({code:"INVALID_RESPONSE",message:"上传响应不是合法 JSON"}));if(!s.ok){const o=n;throw new Ro(s.status,o.code??"UNKNOWN_ERROR",o.message??"文件上传失败",o.details)}return n}const xe={doctor:()=>Oe("/api/doctor"),recheckDoctor:()=>Oe("/api/doctor/recheck",{method:"POST"}),install:e=>Oe(`/api/doctor/install/${e}`,{method:"POST"}),uninstall:e=>Oe(`/api/doctor/uninstall/${e}`,{method:"POST"}),features:()=>Oe("/api/features"),tasks:()=>Oe("/api/tasks"),revealTask:e=>Oe(`/api/tasks/${e}/reveal`,{method:"POST"}),revealPath:e=>Oe("/api/reveal",{method:"POST",body:JSON.stringify({path:e})}),wxStatus:()=>Oe("/api/wx/status"),version:()=>Oe("/api/version"),wxActivate:e=>Oe("/api/wx/activate",{method:"POST",body:JSON.stringify({token:e})}),deleteHistory:e=>Oe(`/api/history/${e}`,{method:"DELETE"}),clearHistory:()=>Oe("/api/history/clear",{method:"POST"}),serviceStop:()=>Oe("/api/service/stop",{method:"POST"}),settings:()=>Oe("/api/settings"),selectOutputDir:()=>Oe("/api/settings/select-output-dir",{method:"POST"}),saveSettings:e=>Oe("/api/settings",{method:"POST",body:JSON.stringify(e)}),convert:e=>Oe("/api/convert",{method:"POST",body:JSON.stringify(e)})},To=Hs("doctor",{state:()=>({statuses:[],loading:!1,connected:!0,error:"",installSession:{state:"idle",logs:[]}}),getters:{readyCount:e=>e.statuses.filter(t=>t.installed&&t.versionOk).length,usableFeatures:e=>e.statuses.reduce((t,s)=>t+s.features.length,0)},actions:{async load(){this.loading=!0;try{this.statuses=await xe.doctor(),this.error=""}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loading=!1}},async recheck(){this.loading=!0;try{this.statuses=await xe.recheckDoctor(),this.error=""}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loading=!1}},startInstall(e,t){this.startOperation(e,t,"install")},startUninstall(e,t){this.startOperation(e,t,"uninstall")},startOperation(e,t,s){if(this.installSession.state==="progress")throw new Ro(409,"OPERATION_IN_PROGRESS","已有依赖操作进行中");this.installSession={depId:e,state:"progress",logs:[t]},(s==="install"?xe.install(e):xe.uninstall(e)).catch(n=>{this.installSession={depId:e,state:"failed",logs:[t,`操作未启动:${n.message}`],error:{depId:e,exitCode:1,stderrTail:n.message}}})},applyProgress(e){this.installSession.depId===e.depId&&("line"in e&&this.installSession.logs.push(e.line),this.installSession.logs.length>1e3&&this.installSession.logs.shift())},applyDone(e){this.statuses=e,this.installSession.state="done"},applyFailure(e){if(this.installSession.depId&&this.installSession.depId!==e.depId)return;const t=e.stderrTail.split(/\r?\n/).filter(s=>s.trim());this.installSession={depId:e.depId,state:"failed",logs:[`操作失败(退出码 ${e.exitCode})`,...t],error:e}}}}),Oo=Hs("features",{state:()=>({features:[],loading:!1,error:""}),getters:{available:e=>e.features.filter(t=>t.available),byKey:e=>new Map(e.features.map(t=>[t.key,t]))},actions:{async load(){this.loading=!0;try{this.features=await xe.features(),this.error=""}finally{this.loading=!1}}}}),Po=Hs("tasks",{state:()=>({tasks:[],loading:!1,error:""}),getters:{active:e=>e.tasks.filter(t=>t.status==="queued"||t.status==="running"),history:e=>e.tasks.filter(t=>t.status==="success"||t.status==="failed").slice(0,200)},actions:{async load(){this.loading=!0;try{this.tasks=await xe.tasks(),this.error=""}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loading=!1}},upsert(e){const t=this.tasks.findIndex(s=>s.taskId===e.taskId);t<0?this.tasks.unshift(e):this.tasks[t]=e}}}),_l=Hs("settings",{state:()=>({settings:{autostart:!1,outputDir:"",concurrency:2,language:"zh-CN"},form:{autostart:!1,outputDir:"",concurrency:2,language:"zh-CN"},loading:!1,saving:!1,error:""}),actions:{async load(){this.loading=!0;try{this.settings=await xe.settings(),this.form={...this.settings},this.error=""}finally{this.loading=!1}},async save(){const e={...this.form};this.saving=!0;try{this.settings=await xe.saveSettings(this.form),this.form={...this.settings},this.error=""}catch(t){throw this.form=e,this.error=t instanceof Error?t.message:String(t),t}finally{this.saving=!1}}}}),df=3456,co=`http://127.0.0.1:${df}`,hf="https://duduer.com";function js(){return location.hostname==="127.0.0.1"||location.hostname==="localhost"}function Io(){return/Windows|Win32|Win64/i.test(navigator.userAgent)?"windows":"macos"}async function pf(e=1500){const t=new AbortController,s=setTimeout(()=>t.abort(),e);try{return await fetch(`${co}/api/doctor`,{mode:"no-cors",cache:"no-store",signal:t.signal}),!0}catch{return!1}finally{clearTimeout(s)}}function gf(){return js()?hf:location.origin}function $o(e){const t=gf();return e==="macos"?`curl -fsSL ${t}/install.sh | sh`:`$w=New-Object Net.WebClient;$w.Encoding=[Text.Encoding]::UTF8;iex $w.DownloadString('${t}/install.ps1')`}function mf(){const e=To(),t=Oo(),s=Po(),n=_l(),o=Ao();async function i(){await Promise.all([e.load(),t.load(),s.load()])}async function r(){await t.load()}function l(a){a.type==="doctor:status"?(e.statuses=a.data,r()):a.type==="task:update"?s.upsert(a.data):a.type==="install:start"||a.type==="install:progress"||a.type==="uninstall:start"||a.type==="uninstall:progress"?e.applyProgress(a.data):a.type==="install:done"||a.type==="uninstall:done"?(e.applyDone(a.data.status),r()):(a.type==="install:fail"||a.type==="uninstall:fail")&&e.applyFailure(a.data)}os(async()=>{js()&&(o.onMessage(l),o.onConnectionChange(a=>{e.connected=a}),o.onResync(i),o.connect(),await Promise.all([i(),n.load()]))}),bn(()=>{})}const C={appName:"嘟嘟转换器",nav:{home:"首页",workbench:"功能页",history:"转换历史",settings:"设置"},connection:{connected:"已连接本地服务",disconnected:"连接已断开,正在自动重连"},doctor:{title:"依赖与环境",recheck:"重新检测",install:"一键安装",uninstall:"一键卸载",copy:"复制命令",manual:"手动下载",logs:"操作日志",ready:"可用",outdated:"版本过旧",missingRequired:"必需缺失",missingOptional:"可选缺失",portableInstall:"内置直装(国内镜像下载,无需包管理器)",portableUninstall:"删除本地便携版组件",sessionRunning:"执行中,请耐心等待…",sessionRunningFull:"正在安装,请耐心等待完成(可能需要几分钟)——期间请不要关闭或刷新此页面;日志长时间无输出属正常现象(正在后台下载)",sessionDone:"✅ 操作完成",sessionFailed:"❌ 操作失败,详情见下方日志"},workbench:{title:"转换工作台",subtitle:"按类型分栏管理,文件入表后逐个或批量转换",dropTitle:"把{tab}文件拖到这里",dropHint:"支持 {exts} 等格式",dropCompact:"继续添加{tab}文件",pastePlaceholder:"粘贴文件绝对路径,回车添加",wrongTab:"{name} 不属于{tab},请切换到对应标签页添加",fileDuplicate:"已在列表中,无需重复添加",addFile:"选择文件",addPath:"添加",convertTo:"批量转换为",noCommonTargets:"当前文件没有共同的转换目标,请清理后分批转换",noTools:"该类别依赖的工具尚未安装,转换前需要先完成安装",gotoSettings:"去设置页安装依赖",tableFile:"文件名",tablePath:"路径",tableSize:"大小",tableStatus:"状态",tableActions:"操作",statusPending:"待转换",statusRunning:"转换中",statusSuccess:"转换成功",statusFailed:"转换失败",convert:"转换",retry:"重试",openFolder:"打开目录",download:"下载",remove:"移除",clearDone:"清除已完成",batchConvert:"开始批量转换",batchConvertN:"开始批量转换({n} 个)",batchDone:"本次批量转换已完成",paramsTitle:"高级参数",advanced:"高级设置",chooseFile:"选择文件"},history:{title:"转换历史",subtitle:"所有转换任务按时间倒序排列,可随时下载或打开产物",filterAll:"全部",statTotal:"累计任务",statSuccess:"成功",statFailed:"失败",searchPlaceholder:"搜索文件名…",empty:"还没有转换记录,去工作台开始第一次转换吧",today:"今天",yesterday:"昨天",openFolder:"打开目录",download:"下载",remove:"删除",clear:"清空历史"},landing:{heroBadge:"本地转换 · 零上传 · 不限文件大小",heroTitle:"你的文件,",heroAccent:"不必上传",heroTagline:"嘟嘟本地万能转换器:视频、音频、图片、文档在本机一步完成 —— 没有大小限制,没有隐私顾虑,没有漫长等待。",cta:"立即开始转换",ctaInstall:"查看安装指南",localRunning:"转换器已在本机运行,可直接进入功能页",stats:[{value:"22",label:"转换能力"},{value:"40+",label:"支持格式"},{value:"0",label:"文件上传"},{value:"100%",label:"本机运行"}],painTitle:"你是不是也有这些顾虑?",painSub:"嘟嘟把这些通通变成过去。",pains:[{icon:"shield",title:"文件传上去,心里不踏实",text:"合同、证件、家庭影像……一旦上传到陌生服务器,隐私就不再由你掌控。"},{icon:"globe",title:"在线工具处处受限",text:"大小限制、格式缺失、会员付费、广告弹窗,简单转个文件总要妥协。"},{icon:"clock",title:"传上去再下载,来回折腾",text:"大文件先上传一小时,转换完再下载一小时,网速决定了心情。"}],valueTitle:"换一种方式转换文件",valueSub:"本机运行带来的三个直接好处",values:[{icon:"shield-check",title:"文件不出你的电脑",text:"所有解析与转换都在本机完成,不经任何服务器,隐私天然无忧。"},{icon:"package-plus",title:"缺什么,一键装什么",text:"首次使用自动体检环境,FFmpeg 等引擎在页面里点一下即可安装。"},{icon:"zap",title:"装完即用,秒级开始",text:"一条命令安装,浏览器自动打开操作界面,拖入文件立刻出结果。"}],scenesTitle:"这些瞬间,嘟嘟都帮得上忙",scenesSub:"来自日常使用的高频场景",scenes:[{icon:"video",title:"网课录屏瘦身",text:"几个 G 的课程录像压成几百 MB,备份分享都不再犯难"},{icon:"image",title:"聊天图片压缩",text:"手机原图一张 8MB,压完不到 1MB,清晰度几乎不变"},{icon:"pdf",title:"发票合并归档",text:"几十张发票 PDF 按顺序合并成一个文件,报销不再手忙脚乱"},{icon:"sparkles",title:"表情包制作",text:"精彩片段一键做成 GIF 动图,斗图弹药永远充足"},{icon:"markdown",title:"简历笔记定稿",text:"Markdown 写完一键转 Word / PDF,排版不乱直接发"},{icon:"shield",title:"证件照脱敏外发",text:"身份证扫描件加水印或加密,发给陌生方也更安心"}],featuresTitle:"覆盖你日常的每一类文件",featuresSub:"22 类能力 · 40+ 种格式,全部本机完成",compareTitle:"和在线转换工具比一比",compareSub:"同样的转换,不同的体验",compare:[{item:"文件隐私",online:"上传到陌生服务器",local:"全程留在你的电脑里"},{item:"文件大小",online:"免费版普遍限制 100MB",local:"无任何限制"},{item:"转换速度",online:"上传 + 下载双倍耗时",local:"直接读写本地磁盘"},{item:"批量处理",online:"多数按次收费",local:"免费,支持批量队列"},{item:"网络依赖",online:"必须联网上传",local:"断网也能正常转换"}],faqTitle:"常见问题",faqSub:"关于嘟嘟的几个高频疑问",faq:[{q:"我的文件会被上传吗?",a:"不会。嘟嘟完全运行在你自己的电脑上,转换过程不经过任何服务器,即使断网也能正常转换。"},{q:"需要付费吗?",a:"免费使用:无功能限制、无水印、无次数限制,也不需要注册账号。"},{q:"转换用的引擎需要自己装吗?",a:"不用自己找教程。首次使用某类能力时,应用会自动检测缺失的引擎,在「设置 → 依赖与环境」里点一下即可安装,全程图形化操作。"},{q:"支持 Windows 吗?",a:"支持。macOS 12+ 与 Windows 10/11 均可使用,安装命令在首页首屏即可一键复制。"},{q:"大文件会很慢或卡住吗?",a:"转换在本地队列并发执行(1–4 个可调),大文件只是耗时更长,不会占用云端额度,也不影响电脑其他操作。"}],footer:"嘟嘟转换器 · 本地优先的文件转换工具 · 文件永不上传"},install:{title:"安装转换器",step1:"打开终端",step2:"粘贴以下命令并回车",step3:"等待安装完成,浏览器会自动打开转换器",macos:"macOS",windows:"Windows",copy:"复制",copied:"已复制",macosTerminal:"按 ⌘+空格 打开聚焦搜索,输入「终端」或「Terminal」,回车打开",windowsTerminal:"点击开始菜单,输入「PowerShell」,回车打开",alreadyInstalled:"已经安装过?再次执行此命令会自动升级到新版本",manualTitle:"自动安装失败?手动安装",manualSteps:[{title:"安装 Node.js",text:"打开 nodejs.org 下载 Node.js 18 或更高版本,双击安装(保持默认选项)"},{title:"安装嘟嘟转换器",text:"打开终端(macOS:终端;Windows:PowerShell),执行 npm install -g dudu-converter-cli"},{title:"启动服务",text:"执行 converter start,浏览器访问 http://127.0.0.1:3456"}],startHint:"如果已经安装但未运行:在终端执行 converter start 启动后,回到此页重新检测"},gate:{checking:"正在检测本地转换器…",online:"已检测到本地转换器正在运行",open:"打开本地转换器",offline:"未检测到本地转换器",installedTitle:"转换器已安装,但服务未运行",manualTitle:"手动启动(一行命令)",manualHint:"复制命令 → 打开终端粘贴回车;若已开启开机自启,重启电脑也会自动运行",retry:"重新检测",notInstalledTitle:"尚未安装?查看安装步骤"},settings:{title:"设置",preferences:"应用设置",autostart:"开机自动启动",outputDir:"输出目录",chooseDir:"选择文件夹",concurrency:"并发数",language:"界面语言",save:"保存设置",saved:"设置已保存",service:"服务管理",serviceRunning:"转换服务运行中",stopService:"停止服务",stopConfirm:`确定停止转换服务吗?
|
|
31
31
|
停止后转换功能不可用;已开启的开机自启会在下次重启电脑时自动运行服务。`,serviceStopped:"转换服务已停止",stoppedGuide:"重新启动:在终端执行下方命令;若已开启开机自启,重启电脑后服务也会自动运行。",startCommand:"converter start"},update:{banner:"发现新版本 v{latest}(当前 v{current}),建议升级获得最新功能与修复",copy:"复制升级命令",copied:"已复制,打开终端粘贴即可",how:"如何升级",dismiss:"暂不提醒",steps:["点击「复制升级命令」,打开终端粘贴并回车(macOS 用终端,Windows 用 PowerShell)","安装命令会自动停止旧服务、完成升级并启动新版本,无需手动操作","刷新浏览器页面即可"]},common:{retry:"重试",close:"关闭",loading:"加载中…",save:"保存",cancel:"取消"}},vf={video:["M3 5.5A2.5 2.5 0 0 1 5.5 3h13A2.5 2.5 0 0 1 21 5.5v13a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 18.5z","M7 3v18","M17 3v18","M3 12h18"],music:["M9 18V5l12-2v13","M3 18a3 3 0 1 0 6 0 3 3 0 1 0-6 0","M15 16a3 3 0 1 0 6 0 3 3 0 1 0-6 0"],image:["M5 3h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z","M7 9a2 2 0 1 0 4 0 2 2 0 1 0-4 0","m21 15-4.6-4.6a2 2 0 0 0-2.8 0L4 20"],archive:["M3 3h18v5H3z","M5 8v11a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8","M10 12h4"],office:["M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z","M14 2v5h5","M9 13h6","M9 17h6","M9 9h1"],pdf:["M12 7v14","M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"],markdown:["M12 20h9","M16.4 3.6a1.4 1.4 0 0 1 2 2L7.5 16.5a2 2 0 0 1-.9.5l-2.8.8a.5.5 0 0 1-.6-.6l.8-2.8a2 2 0 0 1 .5-.9z"],shield:["M20 13c0 5-3.5 7.5-7.7 9a.6.6 0 0 1-.6 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.2-2.7a1.2 1.2 0 0 1 1.6 0C14.5 3.8 17 5 19 5a1 1 0 0 1 1 1z"],"shield-check":["M20 13c0 5-3.5 7.5-7.7 9a.6.6 0 0 1-.6 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.2-2.7a1.2 1.2 0 0 1 1.6 0C14.5 3.8 17 5 19 5a1 1 0 0 1 1 1z","m9 12 2 2 4-4"],"package-plus":["M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z","M3.3 7 12 12l8.7-5","M12 22V12","M19 13v6","M16 16h6"],zap:["M4 14a1 1 0 0 1-.8-1.6l9.9-10.2a.5.5 0 0 1 .9.5l-1.9 6a1 1 0 0 0 1 1.3h7a1 1 0 0 1 .7 1.6l-9.9 10.2a.5.5 0 0 1-.9-.5l1.9-6a1 1 0 0 0-.9-1.3z"],globe:["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M2 12h20","M12 2a15 15 0 0 1 4 10 15 15 0 0 1-4 10 15 15 0 0 1-4-10 15 15 0 0 1 4-10z"],clock:["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M12 6v6l4 2"],"check-circle":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","m9 12 2 2 4-4"],"x-circle":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","m15 9-6 6","m9 9 6 6"],"minus-circle":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M8 12h8"],"alert-circle":["M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z","M12 8v4","M12 16h.01"],copy:["M10 8h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-9a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2z","M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"],"external-link":["M15 3h6v6","M10 14 21 3","M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"],refresh:["M3 12a9 9 0 0 1 15.7-6","M21 3v5h-5","M21 12a9 9 0 0 1-15.7 6","M3 21v-5h5"],upload:["M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4","m7 8 5-5 5 5","M12 3v12"],download:["M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4","m7 10 5 5 5-5","M12 15V3"],plus:["M5 12h14","M12 5v14"],x:["M18 6 6 18","m6 6 12 12"],settings:["M4 6h6","M14 6h6","M4 12h10","M18 12h2","M4 18h4","M12 18h8","M10 4v4","M14 10v4","M8 16v4"],terminal:["m4 17 6-6-6-6","M12 19h8"],"arrow-right":["M5 12h14","m12 5 7 7-7 7"],"chevron-down":["m6 9 6 6 6-6"],file:["M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z","M14 2v5h5"],folder:["M11 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7l-2-2z"],sparkles:["M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9z","M19 17v4","M21 19h-4","M5 3v2","M4 4h2"],repeat:["m17 2 4 4-4 4","M3 11v-1a4 4 0 0 1 4-4h14","m7 22-4-4 4-4","M21 13v1a4 4 0 0 1-4 4H3"]},bl={video:"video",audio:"music",image:"image",archive:"archive",office:"office",pdf:"pdf",markdown:"markdown"},yf=["width","height"],_f=["d"],bf=He({__name:"AppIcon",props:{name:{},size:{default:20}},setup(e){const t=e;return(s,n)=>(R(),I("svg",{width:t.size,height:t.size,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",class:"app-icon"},[(R(!0),I(ne,null,Ce(y(vf)[t.name],(o,i)=>(R(),I("path",{key:i,d:o},null,8,_f))),128))],8,yf))}}),Xe=(e,t)=>{const s=e.__vccOpts||e;for(const[n,o]of t)s[n]=o;return s},J=Xe(bf,[["__scopeId","data-v-84fb32bd"]]),Mo=Hs("version",{state:()=>({status:{current:"",latest:"",updateAvailable:!1},dismissed:!1,loaded:!1}),getters:{visible:e=>e.status.updateAvailable&&!e.dismissed},actions:{async load(){try{this.status=await xe.version()}catch{}finally{this.loaded=!0}},listenWs(){Ao().onMessage(e=>{e.type==="update:available"&&(this.status=e.data,this.dismissed=!1)})},dismiss(){this.dismissed=!0}}}),wf={key:0,class:"update-banner","data-testid":"update-banner"},Sf={class:"banner-text"},xf=["title"],kf={key:0,class:"banner-detail"},Cf=He({__name:"UpdateBanner",setup(e){const t=Mo(),s=se(Io()),n=se(!1),o=se(!1),i=se($o(s.value));async function r(){try{await navigator.clipboard.writeText(i.value),n.value=!0,setTimeout(()=>{n.value=!1},2500)}catch{}}return(l,a)=>y(t).visible?(R(),I("div",wf,[U(J,{name:"sparkles",size:15}),c("span",Sf,S(y(C).update.banner.replace("{latest}",y(t).status.latest).replace("{current}",y(t).status.current)),1),c("button",{class:ye(["copy",{ok:n.value}]),type:"button",onClick:r},[U(J,{name:n.value?"check-circle":"copy",size:13},null,8,["name"]),H(" "+S(n.value?y(C).update.copied:y(C).update.copy),1)],2),c("button",{class:"how",type:"button",onClick:a[0]||(a[0]=d=>o.value=!o.value)},[H(S(y(C).update.how),1),U(J,{name:"chevron-down",size:13,class:ye({open:o.value})},null,8,["class"])]),c("button",{class:"close",type:"button",title:y(C).update.dismiss,onClick:a[1]||(a[1]=d=>y(t).dismiss())},[U(J,{name:"x",size:13})],8,xf),o.value?(R(),I("div",kf,[c("ol",null,[(R(!0),I(ne,null,Ce(y(C).update.steps,(d,u)=>(R(),I("li",{key:d},S(u+1)+". "+S(d),1))),128))])])):Q("",!0)])):Q("",!0)}}),Ef=Xe(Cf,[["__scopeId","data-v-69c975e5"]]),Af={class:"app-shell"},Rf={class:"app-header"},Tf=He({__name:"App",setup(e){mf();const t=To(),s=js(),n=Mo();return s&&(n.listenWs(),n.load()),(o,i)=>(R(),I("div",Af,[c("header",Rf,[U(y(Qt),{to:"/",class:"brand"},{default:Yt(()=>[i[0]||(i[0]=c("span",{class:"logo"},"嘟",-1)),c("strong",null,S(y(C).appName),1)]),_:1}),c("nav",null,[U(y(Qt),{to:"/"},{default:Yt(()=>[H(S(y(C).nav.home),1)]),_:1}),U(y(Qt),{to:"/workbench"},{default:Yt(()=>[H(S(y(C).nav.workbench),1)]),_:1}),y(s)?(R(),it(y(Qt),{key:0,to:"/history"},{default:Yt(()=>[H(S(y(C).nav.history),1)]),_:1})):Q("",!0),y(s)?(R(),it(y(Qt),{key:1,to:"/settings"},{default:Yt(()=>[H(S(y(C).nav.settings),1)]),_:1})):Q("",!0)]),y(s)?(R(),I("span",{key:0,class:ye(["connection",{offline:!y(t).connected}])},[i[1]||(i[1]=c("i",{class:"dot"},null,-1)),H(S(y(t).connected?y(C).connection.connected:y(C).connection.disconnected),1)],2)):Q("",!0)]),c("main",null,[y(s)?(R(),it(Ef,{key:0})):Q("",!0),U(y(yl))])]))}}),Of=Xe(Tf,[["__scopeId","data-v-e736b31c"]]),Pf={class:"history","data-testid":"history"},If={class:"page-title"},$f={class:"page-subtitle"},Mf={class:"toolbar"},Nf={class:"filters"},Df=["onClick"],Ff={class:"toolbar-right"},Vf={class:"search"},Lf=["placeholder"],Hf={key:0,class:"hint-alert"},jf={key:1,class:"panel empty"},Uf={class:"day-head"},Bf={class:"panel day-list"},zf={class:"item-main"},Kf={class:"item-title"},Wf=["title"],Gf={class:"arrow"},qf={class:"target"},Jf={class:"item-meta"},Yf={class:"error-text"},Qf={key:0,class:"spinner tiny"},Xf={class:"item-actions"},Zf=["onClick"],ed=["title","onClick"],td=He({__name:"HistoryView",setup(e){const t=Po(),s=Oo(),n=se("all"),o=se("");os(()=>{t.load(),s.load()});const i=oe(()=>({total:t.tasks.length,success:t.tasks.filter(N=>N.status==="success").length,failed:t.tasks.filter(N=>N.status==="failed").length})),r=oe(()=>t.tasks.filter(N=>!(n.value!=="all"&&N.status!==n.value||o.value.trim()&&!N.input.toLowerCase().includes(o.value.trim().toLowerCase()))).sort((N,E)=>E.startedAt.localeCompare(N.startedAt))),l=se("");async function a(N){l.value="";try{await xe.revealTask(N.taskId)}catch(E){l.value=E instanceof Error?E.message:"打开目录失败"}}async function d(N){l.value="";try{await xe.deleteHistory(N),await t.load()}catch(E){t.error=E instanceof Error?E.message:"删除失败"}}async function u(){if(window.confirm("确定清空全部转换历史吗?此操作不可恢复。"))try{await xe.clearHistory(),await t.load()}catch(N){t.error=N instanceof Error?N.message:"清空失败"}}function h(N){const E=new Date(N);if(Number.isNaN(E.getTime()))return"";const T=new Date,D=te=>new Date(te.getFullYear(),te.getMonth(),te.getDate()).getTime(),B=Math.round((D(T)-D(E))/864e5);return B<=0?C.history.today:B===1?C.history.yesterday:E.getFullYear()===T.getFullYear()?`${E.getMonth()+1} 月 ${E.getDate()} 日`:`${E.getFullYear()} 年 ${E.getMonth()+1} 月 ${E.getDate()} 日`}const v=oe(()=>{const N=new Map;for(const E of r.value){const T=h(E.startedAt),D=N.get(T);D?D.push(E):N.set(T,[E])}return[...N.entries()]});function x(N){const E=new Date(N);return Number.isNaN(E.getTime())?"":`${String(E.getHours()).padStart(2,"0")}:${String(E.getMinutes()).padStart(2,"0")}`}function V(N){return N.split(/[\\/]/).pop()??N}function M(N){var T;const E=(T=s.byKey.get(N.conversionKey))==null?void 0:T.category;return bl[E??"file"]??"file"}function z(N){var E;return((E=s.byKey.get(N.conversionKey))==null?void 0:E.label)??N.conversionKey}return(N,E)=>(R(),I("section",Pf,[c("h1",If,S(y(C).history.title),1),c("p",$f,S(y(C).history.subtitle),1),c("div",Mf,[c("div",Nf,[(R(!0),I(ne,null,Ce([{key:"all",label:y(C).history.filterAll,count:i.value.total},{key:"success",label:y(C).history.statSuccess,count:i.value.success},{key:"failed",label:y(C).history.statFailed,count:i.value.failed}],T=>(R(),I("button",{key:T.key,type:"button",class:ye(["filter-chip",{active:n.value===T.key}]),onClick:D=>n.value=T.key},[H(S(T.label)+" ",1),c("em",null,S(T.count),1)],10,Df))),128))]),c("div",Ff,[c("div",Vf,[U(J,{name:"file",size:14}),It(c("input",{"onUpdate:modelValue":E[0]||(E[0]=T=>o.value=T),type:"text",placeholder:y(C).history.searchPlaceholder},null,8,Lf),[[Ut,o.value]])]),y(t).tasks.length?(R(),I("button",{key:0,class:"ghost danger",type:"button",onClick:u},[U(J,{name:"x",size:13}),H(S(y(C).history.clear),1)])):Q("",!0)])]),l.value?(R(),I("p",Hf,[U(J,{name:"alert-circle",size:15}),H(S(l.value),1)])):Q("",!0),r.value.length?Q("",!0):(R(),I("div",jf,[U(J,{name:"folder",size:36}),c("span",null,S(y(C).history.empty),1)])),(R(!0),I(ne,null,Ce(v.value,([T,D])=>(R(),I("div",{key:T,class:"day-group"},[c("div",Uf,[H(S(T),1),c("em",null,S(D.length)+" 条",1)]),c("div",Bf,[(R(!0),I(ne,null,Ce(D,B=>(R(),I("article",{key:B.taskId,class:"history-item"},[c("span",{class:ye(["item-icon",B.status])},[U(J,{name:M(B),size:18},null,8,["name"])],2),c("div",zf,[c("div",Kf,[c("strong",{title:B.input},S(V(B.input)),9,Wf),c("span",Gf,[U(J,{name:"arrow-right",size:13})]),c("span",qf,S(B.targetFormat.toUpperCase()),1)]),c("div",Jf,[H(S(z(B))+" · "+S(x(B.startedAt))+S(B.durationMs?` · ${B.durationMs} ms`:"")+" ",1),B.error?(R(),I(ne,{key:0},[E[1]||(E[1]=H(" · ",-1)),c("span",Yf,S(B.error.message),1)],64)):Q("",!0)])]),c("span",{class:ye(["badge row-badge",B.status])},[B.status==="running"?(R(),I("span",Qf)):Q("",!0),H(" "+S(B.status==="success"?y(C).workbench.statusSuccess:B.status==="failed"?y(C).workbench.statusFailed:B.status==="running"?y(C).workbench.statusRunning:y(C).workbench.statusPending),1)],2),c("div",Xf,[B.status==="success"?(R(),I("button",{key:0,class:"ghost tiny",type:"button",onClick:_e=>a(B)},[U(J,{name:"folder",size:13}),H(S(y(C).history.openFolder),1)],8,Zf)):Q("",!0),c("button",{class:"icon-btn",type:"button",title:y(C).history.remove,onClick:_e=>d(B.taskId)},[U(J,{name:"x",size:14})],8,ed)])]))),128))])]))),128))]))}}),sd=Xe(td,[["__scopeId","data-v-b299457c"]]),nd={class:"landing","data-testid":"landing"},od={class:"hero"},id={class:"hero-grid"},rd={class:"hero-copy"},ld={class:"hero-badge"},ad={class:"tagline"},cd={class:"cta-row"},ud={key:0,class:"local-badge"},fd={class:"terminal-card","data-testid":"install-guide"},dd={class:"term-head"},hd={class:"term-pills"},pd={class:"term-body"},gd={class:"command-row"},md={"data-testid":"install-command"},vd={class:"stats"},yd={class:"section"},_d={class:"section-sub"},bd={class:"pain-grid"},wd={class:"icon pain"},Sd={class:"section"},xd={class:"section-sub"},kd={class:"value-grid"},Cd={class:"icon value"},Ed={class:"section"},Ad={class:"section-sub"},Rd={class:"scene-grid"},Td={class:"icon scene"},Od={id:"features",class:"section"},Pd={class:"section-sub"},Id={class:"category-grid"},$d={class:"icon cat"},Md={class:"cat-body"},Nd={class:"section"},Dd={class:"section-sub"},Fd={class:"table-wrap"},Vd={class:"compare-table"},Ld={class:"c-item"},Hd={class:"c-online"},jd={class:"c-local"},Ud={class:"section"},Bd={class:"section-sub"},zd={class:"faq"},Kd={class:"landing-footer muted"},Wd=He({__name:"LandingView",setup(e){const t=js(),s=se(Io()),n=oe(()=>$o(s.value)),o=se(!1);async function i(){try{await navigator.clipboard.writeText(n.value),o.value=!0,setTimeout(()=>{o.value=!1},2e3)}catch{}}function r(){var a;(a=document.getElementById("features"))==null||a.scrollIntoView({behavior:"smooth",block:"start"})}const l=[{icon:"video",title:"视频",lines:["格式转换 · 压缩 · 延迟摄影","MP4 · AVI · MKV · MOV · WebM"]},{icon:"music",title:"音频",lines:["格式转换 · 提取 · 压缩","MP3 · AAC · WAV · FLAC"]},{icon:"image",title:"图片",lines:["格式 · 缩放 · 压缩 · 水印","JPG · PNG · WebP · HEIC · AVIF"]},{icon:"archive",title:"压缩包",lines:["文件压缩 · 解压","7z · Zip"]},{icon:"office",title:"Office 文档",lines:["转 PDF / HTML · 家族互转","Word · Excel · PowerPoint"]},{icon:"pdf",title:"PDF",lines:["转图片文本 · 合并拆分 · 规则拆分","全套 PDF 处理"]},{icon:"markdown",title:"Markdown",lines:["互转 Word / HTML / PDF","写作发布一步到位"]}];return(a,d)=>(R(),I("section",nd,[c("div",od,[c("div",id,[c("div",rd,[c("span",ld,[U(J,{name:"sparkles",size:14}),H(S(y(C).landing.heroBadge),1)]),c("h1",null,[H(S(y(C).landing.heroTitle),1),c("em",null,S(y(C).landing.heroAccent),1)]),c("p",ad,S(y(C).landing.heroTagline),1),c("div",cd,[U(y(Qt),{class:"btn primary cta",to:"/workbench","data-testid":"landing-cta"},{default:Yt(()=>[H(S(y(C).landing.cta),1),U(J,{name:"arrow-right",size:16})]),_:1}),c("button",{class:"btn ghost",type:"button",onClick:r},[d[2]||(d[2]=H("了解功能",-1)),U(J,{name:"chevron-down",size:15})])]),y(t)?(R(),I("p",ud,[U(J,{name:"check-circle",size:14}),H(S(y(C).landing.localRunning),1)])):Q("",!0)]),c("div",fd,[c("div",dd,[d[3]||(d[3]=c("span",{class:"dots","aria-hidden":"true"},[c("i"),c("i"),c("i")],-1)),d[4]||(d[4]=c("strong",null,"一键安装嘟嘟转换器 · 全程约 1 分钟",-1)),c("div",hd,[c("button",{type:"button",class:ye({active:s.value==="macos"}),onClick:d[0]||(d[0]=u=>s.value="macos")},"macOS",2),c("button",{type:"button",class:ye({active:s.value==="windows"}),onClick:d[1]||(d[1]=u=>s.value="windows")},"Windows",2)])]),c("div",pd,[c("div",gd,[c("code",md,[d[5]||(d[5]=c("span",{class:"prompt"},"$",-1)),H(S(n.value),1)])]),c("button",{class:ye(["one-click",{ok:o.value}]),type:"button","data-testid":"install-copy",onClick:i},[U(J,{name:o.value?"check-circle":"copy",size:15},null,8,["name"]),H(" "+S(o.value?"已复制!打开终端粘贴回车即可":"一键复制安装命令"),1)],2),d[6]||(d[6]=c("ol",{class:"term-steps"},[c("li",null,[c("span",null,"1"),H("点击上方按钮复制安装命令")]),c("li",null,[c("span",null,"2"),H("打开终端粘贴并回车(macOS:⌘+空格 搜「终端」;Windows:开始菜单搜 PowerShell)")]),c("li",null,[c("span",null,"3"),H("安装全自动完成,浏览器自动打开转换器")])],-1))])])]),c("div",vd,[(R(!0),I(ne,null,Ce(y(C).landing.stats,u=>(R(),I("div",{key:u.label,class:"stat"},[c("strong",null,S(u.value),1),c("span",null,S(u.label),1)]))),128))])]),c("div",yd,[c("h2",null,S(y(C).landing.painTitle),1),c("p",_d,S(y(C).landing.painSub),1),c("div",bd,[(R(!0),I(ne,null,Ce(y(C).landing.pains,u=>(R(),I("article",{key:u.title,class:"pain-card"},[c("span",wd,[U(J,{name:u.icon,size:21},null,8,["name"])]),c("div",null,[c("strong",null,S(u.title),1),c("p",null,S(u.text),1)])]))),128))])]),c("div",Sd,[c("h2",null,S(y(C).landing.valueTitle),1),c("p",xd,S(y(C).landing.valueSub),1),c("div",kd,[(R(!0),I(ne,null,Ce(y(C).landing.values,u=>(R(),I("article",{key:u.title,class:"value-card"},[c("span",Cd,[U(J,{name:u.icon,size:23},null,8,["name"])]),c("strong",null,S(u.title),1),c("p",null,S(u.text),1)]))),128))])]),c("div",Ed,[c("h2",null,S(y(C).landing.scenesTitle),1),c("p",Ad,S(y(C).landing.scenesSub),1),c("div",Rd,[(R(!0),I(ne,null,Ce(y(C).landing.scenes,u=>(R(),I("article",{key:u.title,class:"scene-card"},[c("span",Td,[U(J,{name:u.icon,size:20},null,8,["name"])]),c("div",null,[c("strong",null,S(u.title),1),c("p",null,S(u.text),1)])]))),128))])]),c("div",Od,[c("h2",null,S(y(C).landing.featuresTitle),1),c("p",Pd,S(y(C).landing.featuresSub),1),c("div",Id,[(R(),I(ne,null,Ce(l,u=>c("article",{key:u.title,class:"category-card"},[c("span",$d,[U(J,{name:u.icon,size:21},null,8,["name"])]),c("div",Md,[c("strong",null,S(u.title),1),c("p",null,S(u.lines[0]),1),c("small",null,S(u.lines[1]),1)])])),64))])]),c("div",Nd,[c("h2",null,S(y(C).landing.compareTitle),1),c("p",Dd,S(y(C).landing.compareSub),1),c("div",Fd,[c("table",Vd,[d[7]||(d[7]=c("thead",null,[c("tr",null,[c("th",null,"对比项"),c("th",null,"在线转换工具"),c("th",null,"嘟嘟转换器")])],-1)),c("tbody",null,[(R(!0),I(ne,null,Ce(y(C).landing.compare,u=>(R(),I("tr",{key:u.item},[c("td",Ld,S(u.item),1),c("td",Hd,S(u.online),1),c("td",jd,[U(J,{name:"check-circle",size:14}),H(S(u.local),1)])]))),128))])])])]),c("div",Ud,[c("h2",null,S(y(C).landing.faqTitle),1),c("p",Bd,S(y(C).landing.faqSub),1),c("div",zd,[(R(!0),I(ne,null,Ce(y(C).landing.faq,u=>(R(),I("details",{key:u.q,class:"faq-item"},[c("summary",null,[H(S(u.q),1),U(J,{name:"chevron-down",size:15})]),c("p",null,S(u.a),1)]))),128))])]),c("footer",Kd,S(y(C).landing.footer),1)]))}}),Gd=Xe(Wd,[["__scopeId","data-v-63ba655a"]]),qd=He({__name:"StatusBadge",props:{state:{}},setup(e){const t=e,s=oe(()=>C.doctor[t.state==="ready"?"ready":t.state==="outdated"?"outdated":t.state==="missing-required"?"missingRequired":"missingOptional"]);return(n,o)=>(R(),I("span",{class:ye(["badge",e.state])},S(s.value),3))}}),Jd={class:"tool-info"},Yd={class:"title"},Qd={key:0,class:"chip version"},Xd={class:"muted"},Zd={class:"actions"},eh=["disabled"],th=["disabled"],sh=He({__name:"DependencyRow",props:{status:{},installing:{type:Boolean}},emits:["install","uninstall"],setup(e,{emit:t}){const s=e,n=t;let o;const i=se(!1);async function r(){s.status.installCommand&&(await navigator.clipboard.writeText(s.status.installCommand),i.value=!0,clearTimeout(o),o=window.setTimeout(()=>{i.value=!1},2e3))}return(l,a)=>(R(),I("article",{class:ye(["dependency-row",`is-${e.status.state}`])},[c("div",Jd,[c("div",Yd,[c("strong",null,S(e.status.name),1),U(qd,{state:e.status.state},null,8,["state"]),e.status.version?(R(),I("span",Qd,S(e.status.version),1)):Q("",!0)]),c("p",Xd,S(e.status.description),1)]),c("div",Zd,[(e.status.installCommand||e.status.installMethod==="portable")&&(!e.status.installed||e.status.state==="outdated")?(R(),I("button",{key:0,class:"primary",disabled:e.installing,onClick:a[0]||(a[0]=d=>n("install",e.status))},S(y(C).doctor.install),9,eh)):Q("",!0),e.status.installCommand?(R(),I("button",{key:1,class:"ghost",onClick:r},S(i.value?y(C).install.copied:y(C).doctor.copy),1)):Q("",!0),e.status.installed&&(e.status.uninstallCommand||e.status.installMethod==="portable")?(R(),I("button",{key:2,class:"ghost danger",disabled:e.installing,onClick:a[1]||(a[1]=d=>n("uninstall",e.status))},S(y(C).doctor.uninstall),9,th)):Q("",!0)])],2))}}),nh=Xe(sh,[["__scopeId","data-v-d296fa22"]]),oh=He({__name:"LogStream",props:{logs:{}},setup(e){const t=e,s=se(),n=se(!0);Mt(()=>[...t.logs],async()=>{n.value&&(await ps(),s.value&&(s.value.scrollTop=s.value.scrollHeight))});function o(){const i=s.value;i&&(n.value=i.scrollHeight-i.scrollTop-i.clientHeight<24)}return(i,r)=>(R(),I("div",{ref_key:"container",ref:s,class:"log-stream",onScroll:o},[(R(!0),I(ne,null,Ce(e.logs,(l,a)=>(R(),I("p",{key:`${a}-${l}`},S(l),1))),128))],544))}}),ih=Xe(oh,[["__scopeId","data-v-a4d9e36c"]]),rh={class:"settings","data-testid":"settings"},lh={class:"page-title"},ah={class:"panel"},ch={class:"section-head"},uh={key:0,class:"chip version-chip"},fh={key:0,class:"chip running-chip"},dh={key:0,class:"stop-row"},hh=["disabled"],ph={key:0,class:"spinner",style:{width:"13px",height:"13px","border-color":"#ffffff88","border-top-color":"#fff"}},gh={key:1,class:"stopped-card"},mh={class:"muted"},vh={class:"command-row"},yh={class:"panel"},_h={class:"section-head"},bh=["disabled"],wh={key:1,class:"spinner",style:{width:"14px",height:"14px"}},Sh={class:"summary-card"},xh={class:"summary-text"},kh={class:"summary-bar bar"},Ch={key:0,class:"alert"},Eh={class:"dep-list"},Ah={key:0,class:"spinner",style:{width:"13px",height:"13px"}},Rh={class:"section-head"},Th={class:"field"},Oh={class:"directory-editor"},Ph=["disabled"],Ih={key:1,class:"spinner",style:{width:"13px",height:"13px"}},$h={class:"field"},Mh={class:"concurrency"},Nh={class:"field"},Dh={key:0,class:"error"},Fh={key:1,class:"saved"},Vh={class:"actions"},Lh=["disabled"],Hh={key:0,class:"spinner",style:{"border-color":"#ffffff88","border-top-color":"#fff"}},jh=He({__name:"SettingsView",setup(e){const t=To(),s=_l(),n=Mo();os(()=>{n.loaded||n.load()});const o=se(!1),i=se(!1),r=se(!1),l=se(!1),a=se(!1);async function d(){try{await navigator.clipboard.writeText(C.settings.startCommand),a.value=!0,setTimeout(()=>{a.value=!1},2e3)}catch{}}async function u(){if(window.confirm(C.settings.stopConfirm)){l.value=!0;try{await xe.serviceStop(),r.value=!0,t.connected=!1}catch(E){s.error=E instanceof Error?E.message:"停止服务失败"}finally{l.value=!1}}}const h=oe(()=>t.installSession.state==="progress"),v=se();Mt(()=>t.installSession.state,E=>{E==="progress"&&ps(()=>{var T,D;(D=(T=v.value)==null?void 0:T.scrollIntoView)==null||D.call(T,{behavior:"smooth",block:"center"})})});const x=oe(()=>t.statuses.length?Math.round(t.readyCount/t.statuses.length*100):0);function V(E){h.value||!E.installCommand&&E.installMethod!=="portable"||E.state==="outdated"&&!window.confirm(`${E.name} 已安装但版本过低,确认重新安装?`)||t.startInstall(E.id,E.installCommand||C.doctor.portableInstall)}function M(E){if(h.value||!E.uninstallCommand&&E.installMethod!=="portable")return;const T=`确定要卸载 ${E.name} 吗?
|
|
32
|
-
卸载后相关转换功能将不可用。`;window.confirm(T)&&t.startUninstall(E.id,E.uninstallCommand||C.doctor.portableUninstall)}async function z(){o.value=!0;try{const E=await xe.selectOutputDir();E.selected&&E.path&&(s.form.outputDir=E.path)}catch(E){s.error=E instanceof Error?E.message:"无法打开目录选择器"}finally{o.value=!1}}async function N(){try{await s.save(),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}catch{}}return(E,T)=>(R(),I("section",rh,[c("h1",lh,S(y(C).settings.title),1),T[12]||(T[12]=c("p",{class:"page-subtitle"},"转换引擎与应用偏好集中在这里管理",-1)),c("div",ah,[c("div",ch,[c("div",null,[c("h2",null,[H(S(y(C).settings.service)+" ",1),y(n).status.current?(R(),I("span",uh,"v"+S(y(n).status.current),1)):Q("",!0)]),T[4]||(T[4]=c("p",{class:"muted section-sub"},"转换服务的运行控制",-1))]),r.value?Q("",!0):(R(),I("span",fh,[T[5]||(T[5]=c("span",{class:"dot"},null,-1)),H(S(y(C).settings.serviceRunning),1)]))]),r.value?(R(),I("div",gh,[c("p",null,[U(J,{name:"check-circle",size:15}),c("strong",null,S(y(C).settings.serviceStopped),1)]),c("p",mh,S(y(C).settings.stoppedGuide),1),c("div",vh,[c("code",null,[T[7]||(T[7]=c("span",{class:"prompt"},"$",-1)),H(S(y(C).settings.startCommand),1)]),c("button",{class:"ghost",type:"button",onClick:d},S(a.value?"已复制":"复制"),1)])])):(R(),I("div",dh,[T[6]||(T[6]=c("p",{class:"muted stop-desc"},[H("停止后转换功能不可用。已开启的开机自启会在下次重启电脑时自动运行服务;重新启动请在终端执行 "),c("code",null,"converter start"),H("。")],-1)),c("button",{class:"ghost danger stop-btn",type:"button","data-testid":"stop-service",disabled:l.value,onClick:u},[l.value?(R(),I("span",ph)):Q("",!0),H(" "+S(l.value?"停止中…":y(C).settings.stopService),1)],8,hh)]))]),c("div",yh,[c("div",_h,[c("div",null,[c("h2",null,S(y(C).doctor.title),1),T[8]||(T[8]=c("p",{class:"muted section-sub"},"缺什么就一键补齐",-1))]),c("button",{class:"ghost recheck",disabled:y(t).loading,onClick:T[0]||(T[0]=D=>y(t).recheck())},[y(t).loading?(R(),I("span",wh)):(R(),it(J,{key:0,name:"refresh",size:15})),H(" "+S(y(C).doctor.recheck),1)],8,bh)]),c("div",Sh,[c("div",xh,[c("strong",null,S(y(t).readyCount)+" / "+S(y(t).statuses.length),1),T[9]||(T[9]=c("span",null,"个引擎可用",-1))]),c("div",kh,[c("i",{style:pn({width:`${x.value}%`})},null,4)])]),y(t).error?(R(),I("p",Ch,S(y(t).error),1)):Q("",!0),c("div",Eh,[(R(!0),I(ne,null,Ce(y(t).statuses,D=>(R(),it(nh,{key:D.id,status:D,installing:h.value,onInstall:V,onUninstall:M},null,8,["status","installing"]))),128))]),y(t).installSession.state!=="idle"?(R(),I("div",{key:1,ref_key:"installSessionRef",ref:v,class:"install-session"},[c("h3",null,S(y(C).doctor.logs),1),c("p",{class:ye(["session-state",y(t).installSession.state])},[y(t).installSession.state==="progress"?(R(),I("span",Ah)):Q("",!0),H(" "+S(y(t).installSession.state==="progress"?y(C).doctor.sessionRunningFull:y(t).installSession.state==="done"?y(C).doctor.sessionDone:y(C).doctor.sessionFailed),1)],2),U(ih,{logs:y(t).installSession.logs},null,8,["logs"])],512)):Q("",!0)]),c("form",{class:"panel",onSubmit:so(N,["prevent"])},[c("div",Rh,[c("h2",null,S(y(C).settings.preferences),1)]),c("label",Th,[c("span",null,S(y(C).settings.outputDir),1),c("div",Oh,[It(c("input",{"onUpdate:modelValue":T[1]||(T[1]=D=>y(s).form.outputDir=D),type:"text",placeholder:"转换结果保存目录"},null,512),[[Ut,y(s).form.outputDir]]),c("button",{class:"ghost",type:"button",disabled:o.value,onClick:z},[o.value?(R(),I("span",Ih)):(R(),it(J,{key:0,name:"folder",size:14})),H(" "+S(o.value?"打开中…":y(C).settings.chooseDir),1)],8,Ph)])]),c("label",$h,[c("span",null,S(y(C).settings.concurrency),1),c("div",Mh,[It(c("input",{"onUpdate:modelValue":T[2]||(T[2]=D=>y(s).form.concurrency=D),type:"number",min:"1",max:"4"},null,512),[[Ut,y(s).form.concurrency,void 0,{number:!0}]]),T[10]||(T[10]=c("small",{class:"muted"},"同时进行的转换任务数(1–4)",-1))])]),c("label",Nh,[c("span",null,S(y(C).settings.language),1),It(c("select",{"onUpdate:modelValue":T[3]||(T[3]=D=>y(s).form.language=D),disabled:""},[...T[11]||(T[11]=[c("option",{value:"zh-CN"},"简体中文",-1)])],512),[[Co,y(s).form.language]])]),y(s).error?(R(),I("p",Dh,S(y(s).error),1)):i.value?(R(),I("p",Fh,[U(J,{name:"check-circle",size:14}),H(S(y(C).settings.saved),1)])):Q("",!0),c("div",Vh,[c("button",{class:"primary",disabled:y(s).saving,type:"submit"},[y(s).saving?(R(),I("span",Hh)):Q("",!0),H(" "+S(y(s).saving?"保存中…":y(C).settings.save),1)],8,Lh)])],32)]))}}),Uh=Xe(jh,[["__scopeId","data-v-b8d6e7ed"]]),ls=[{key:"image",label:"图片",icon:"image",categories:["image"]},{key:"video",label:"视频",icon:"video",categories:["video"]},{key:"audio",label:"音频",icon:"music",categories:["audio"]},{key:"office",label:"文档",icon:"office",categories:["office","markdown"]},{key:"pdf",label:"PDF",icon:"pdf",categories:["pdf"]},{key:"archive",label:"压缩包",icon:"archive",categories:["archive"]}];function wl(e,t){return e.filter(s=>t.categories.includes(s.category))}function Di(e,t){const s=new Set;for(const n of wl(e,t))for(const o of n.fromFormats)s.add(o);return s}const Bh={"image-resize":"缩放","image-compress":"压缩","image-watermark":"加水印","video-compress":"压缩","video-timelapse":"延迟摄影","media-compress":"压缩","pdf-merge":"合并","pdf-split":"拆分","pdf-protect":"加密/解密","archive-extract":"解压"};function zh(e){return Bh[e]}const Fi={jpg:"jpg",jpeg:"jpg"};function Kh(e,t){return(Fi[e]??e)===(Fi[t]??t)}function Wh(e){const t=e.split(/[\\/]/).pop()??"",s=t.lastIndexOf(".");return s>0?t.slice(s+1).toLowerCase():""}function Gh(e,t){if(!t.length)return[];const s=[...new Set(t.map(i=>i.toLowerCase()))],n=[],o=new Set;for(const i of e){if(!i.available||!s.every(l=>i.fromFormats.includes(l)))continue;const r=zh(i.key);if(r){const l=`op:${i.key}`;if(o.has(l))continue;o.add(l),n.push({conversionKey:i.key,format:"",label:r,capability:i.label,category:i.category,kind:"operate"});continue}for(const l of i.toFormats){if(s.every(d=>Kh(d,l)))continue;const a=`${i.key}:${l}`;o.has(a)||(o.add(a),n.push({conversionKey:i.key,format:l,label:l==="folder"?"解压为文件夹":l.toUpperCase(),capability:i.label,category:i.category,kind:"convert"}))}}return n}function qh(e,t){return t?[...e].sort((s,n)=>+(n.category===t)-+(s.category===t)):[...e]}function Vi(e,t){var n;const s=t.toLowerCase();return(n=e.find(o=>o.fromFormats.includes(s)))==null?void 0:n.category}function Li(e,t){return e.some(n=>n!==t&&n.label===t.label)?`${t.label} · ${t.capability}`:t.label}function Jh(e){return e===void 0?"":e<1024?`${e} B`:e<1024**2?`${(e/1024).toFixed(0)} KB`:e<1024**3?`${(e/1024**2).toFixed(1)} MB`:`${(e/1024**3).toFixed(2)} GB`}const Yh={class:"install-guide","data-testid":"install-guide"},Qh={class:"platform-switch",role:"tablist"},Xh=["aria-selected"],Zh=["aria-selected"],ep={class:"steps"},tp={class:"muted"},sp={class:"command-block"},np={class:"command-row"},op={"data-testid":"install-command"},ip={class:"muted hint"},rp={class:"manual-block"},lp={key:0,class:"manual-steps"},ap={class:"step-no"},cp=He({__name:"InstallGuide",setup(e){const t=se(Io()),s=se(!1),n=oe(()=>$o(t.value)),o=se(!1);async function i(){try{await navigator.clipboard.writeText(n.value),o.value=!0,setTimeout(()=>{o.value=!1},2e3)}catch{}}return(r,l)=>(R(),I("div",Yh,[c("div",Qh,[c("button",{type:"button",class:ye({active:t.value==="macos"}),role:"tab","aria-selected":t.value==="macos",onClick:l[0]||(l[0]=a=>t.value="macos")},S(y(C).install.macos),11,Xh),c("button",{type:"button",class:ye({active:t.value==="windows"}),role:"tab","aria-selected":t.value==="windows",onClick:l[1]||(l[1]=a=>t.value="windows")},S(y(C).install.windows),11,Zh)]),c("ol",ep,[c("li",null,[l[3]||(l[3]=c("span",{class:"step-no"},"1",-1)),c("div",null,[c("strong",null,S(y(C).install.step1),1),c("p",tp,S(t.value==="macos"?y(C).install.macosTerminal:y(C).install.windowsTerminal),1)])]),c("li",null,[l[5]||(l[5]=c("span",{class:"step-no"},"2",-1)),c("div",sp,[c("strong",null,S(y(C).install.step2),1),c("div",np,[c("code",op,[l[4]||(l[4]=c("span",{class:"prompt"},"$",-1)),H(S(n.value),1)]),c("button",{class:"ghost copy",type:"button",onClick:i},[U(J,{name:o.value?"check-circle":"copy",size:14},null,8,["name"]),H(" "+S(o.value?y(C).install.copied:y(C).install.copy),1)])])])]),c("li",null,[l[6]||(l[6]=c("span",{class:"step-no"},"3",-1)),c("div",null,[c("strong",null,S(y(C).install.step3),1),c("p",ip,S(y(C).install.alreadyInstalled),1)])])]),c("div",rp,[c("button",{class:"manual-toggle",type:"button",onClick:l[2]||(l[2]=a=>s.value=!s.value)},[H(S(y(C).install.manualTitle),1),U(J,{name:"chevron-down",size:14,class:ye({open:s.value})},null,8,["class"])]),s.value?(R(),I("ol",lp,[(R(!0),I(ne,null,Ce(y(C).install.manualSteps,(a,d)=>(R(),I("li",{key:a.title},[c("span",ap,S(d+1),1),c("div",null,[c("strong",null,S(a.title),1),c("p",null,S(a.text),1)])]))),128))])):Q("",!0)])]))}}),up=Xe(cp,[["__scopeId","data-v-56162934"]]),fp={class:"daemon-gate","data-testid":"daemon-gate"},dp={key:0,class:"gate-state checking"},hp={key:1,class:"gate-state online","data-testid":"gate-online"},pp={class:"gate-icon ok"},gp={class:"actions"},mp=["href"],vp={key:2,class:"gate-state offline","data-testid":"gate-offline"},yp={class:"gate-icon off"},_p={class:"start-block"},bp={class:"manual"},wp={class:"manual-label"},Sp={class:"manual-row"},xp={class:"manual-hint"},kp={class:"actions"},Cp=["href"],Ep={class:"install-collapsed"},Ap=He({__name:"DaemonGate",setup(e){const t=se("checking"),s=se(!1),n=se(!1);async function o(){try{await navigator.clipboard.writeText("converter start"),n.value=!0,setTimeout(()=>{n.value=!1},2e3)}catch{}}async function i(){t.value="checking",t.value=await pf()?"online":"offline"}return os(()=>{i()}),(r,l)=>(R(),I("div",fp,[t.value==="checking"?(R(),I("div",dp,[l[1]||(l[1]=c("span",{class:"spinner big","aria-hidden":"true"},null,-1)),c("p",null,S(y(C).gate.checking),1)])):t.value==="online"?(R(),I("div",hp,[c("div",pp,[U(J,{name:"check-circle",size:26})]),c("p",null,S(y(C).gate.online),1),l[2]||(l[2]=c("p",{class:"hint muted"},"转换在本机完成,点击进入操作界面",-1)),c("div",gp,[c("a",{class:"btn primary",href:y(co),target:"_blank",rel:"noopener"},[H(S(y(C).gate.open),1),U(J,{name:"arrow-right",size:15})],8,mp),c("button",{class:"ghost",type:"button",onClick:i},[U(J,{name:"refresh",size:14}),H(S(y(C).gate.retry),1)])])])):(R(),I("div",vp,[c("div",yp,[U(J,{name:"alert-circle",size:26})]),c("p",null,S(y(C).gate.offline),1),c("div",_p,[c("div",bp,[c("span",wp,S(y(C).gate.manualTitle),1),c("div",Sp,[l[3]||(l[3]=c("code",null,[c("span",{class:"prompt"},"$"),H("converter start")],-1)),c("button",{class:"copy",type:"button",onClick:o},[U(J,{name:n.value?"check-circle":"copy",size:13},null,8,["name"]),H(S(n.value?"已复制":"复制"),1)])]),c("p",xp,S(y(C).gate.manualHint),1)]),c("div",kp,[c("button",{class:"ghost",type:"button",onClick:i},[U(J,{name:"refresh",size:14}),H(S(y(C).gate.retry),1)]),c("a",{class:"ghost direct-link",href:y(co),target:"_blank",rel:"noopener"},S(y(C).gate.open),9,Cp)])]),c("div",Ep,[c("button",{class:"install-toggle",type:"button",onClick:l[0]||(l[0]=a=>s.value=!s.value)},[H(S(y(C).gate.notInstalledTitle),1),U(J,{name:"chevron-down",size:14,class:ye({open:s.value})},null,8,["class"])]),s.value?(R(),it(up,{key:0})):Q("",!0)])]))]))}}),Rp=Xe(Ap,[["__scopeId","data-v-0f39bf4c"]]),Tp="/gh-qrcode.png",Op={class:"follow-gate","data-testid":"follow-gate"},Pp={class:"gate-right"},Ip={class:"code-row"},$p={"data-testid":"pair-code"},Mp={key:0,class:"gate-error"},Np=He({__name:"FollowGate",props:{pairCode:{}},emits:["activated"],setup(e,{emit:t}){const s=e,n=t,o=oe(()=>s.pairCode??""),i=se(!1),r=se("");let l;async function a(){try{await navigator.clipboard.writeText(o.value),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}catch{}}async function d(){const v=s.pairCode;if(v)try{const x=await fetch(`https://duduer.com/api/wx/activate/${encodeURIComponent(v)}`);if(!x.ok)return;const V=await x.json();V.status==="active"&&V.token?(h(),await xe.wxActivate(V.token),n("activated",V.token)):V.subscribed===!1?r.value="检测到关注已取消,重新关注即可恢复使用":r.value=""}catch{}}function u(){l=window.setInterval(()=>{d()},5e3)}function h(){l!==void 0&&(clearInterval(l),l=void 0)}return os(()=>{u()}),bn(()=>{h()}),(v,x)=>(R(),I("div",Op,[x[5]||(x[5]=c("div",{class:"gate-left"},[c("img",{class:"gh-qrcode",src:Tp,alt:"公众号二维码"}),c("p",{class:"qr-hint"},"微信扫码,关注公众号")],-1)),c("div",Pp,[x[1]||(x[1]=c("h2",null,"免费解锁全部功能",-1)),x[2]||(x[2]=c("p",{class:"gate-desc"},[H("关注公众号并回复你的绑定码,即可"),c("strong",null,"永久免费"),H("使用全部转换功能")],-1)),c("div",Ip,[x[0]||(x[0]=c("span",{class:"code-label"},"你的绑定码",-1)),c("code",$p,S(o.value),1),c("button",{class:"copy",type:"button",onClick:a},[U(J,{name:i.value?"check-circle":"copy",size:13},null,8,["name"]),H(S(i.value?"已复制":"复制"),1)])]),x[3]||(x[3]=c("ol",{class:"gate-steps"},[c("li",null,[c("span",null,"1"),H("微信扫描左侧二维码,关注公众号")]),c("li",null,[c("span",null,"2"),H("在公众号里发送你的绑定码(点击上方「复制」)")]),c("li",null,[c("span",null,"3"),H("收到「绑定成功」回复后,本页自动解锁")])],-1)),r.value?(R(),I("p",Mp,[U(J,{name:"alert-circle",size:14}),H(S(r.value),1)])):Q("",!0),x[4]||(x[4]=c("p",{class:"waiting"},[c("span",{class:"spinner tiny"}),H("正在等待绑定完成,每 5 秒自动检测…")],-1))])]))}}),Dp=Xe(Np,[["__scopeId","data-v-0fe4c6f1"]]),Fp={class:"workbench","data-testid":"workbench"},Vp={class:"page-title"},Lp={class:"page-subtitle"},Hp={key:2,class:"tabbed"},jp={class:"tab-rail"},Up=["data-testid","onClick"],Bp={class:"tab-label"},zp={key:0,class:"tab-count"},Kp={class:"tab-panel panel"},Wp={class:"drop-icon"},Gp={class:"drop-title"},qp={class:"muted drop-hint"},Jp={class:"drop-compact-text"},Yp={class:"drop-actions"},Qp=["placeholder"],Xp=["disabled"],Zp=["disabled"],eg={key:1,class:"spinner",style:{width:"13px",height:"13px","border-color":"#ffffff88","border-top-color":"#fff"}},tg=["accept"],sg={key:0,class:"hint-alert"},ng={class:"target-bar"},og={class:"section-title"},ig={key:0,class:"target-chips"},rg=["onClick"],lg={key:1,class:"hint-alert"},ag={key:2,class:"hint-alert tools-missing"},cg={class:"hint-text"},ug={class:"table-wrap"},fg={class:"file-table","data-testid":"file-table"},dg={class:"cell-file"},hg={class:"cell-path"},pg={class:"cell-size"},gg={class:"cell-status"},mg={class:"cell-actions"},vg={class:"cell-file"},yg={class:"file-icon"},_g=["title"],bg={class:"chip ext"},wg={class:"cell-path"},Sg=["title","onClick"],xg={class:"cell-size muted"},kg={class:"cell-status"},Cg=["title"],Eg={key:0,class:"spinner tiny"},Ag={key:1},Rg={key:2,class:"row-error"},Tg={class:"cell-actions"},Og=["onClick"],Pg=["onClick"],Ig=["onClick"],$g=["title","onClick"],Mg={key:0,class:"params"},Ng={class:"section-title"},Dg={class:"params-grid"},Fg={class:"param-label"},Vg={key:1,class:"required"},Lg=["onUpdate:modelValue","data-testid"],Hg=["value"],jg=["onUpdate:modelValue","min","max","data-testid"],Ug={key:2,class:"watermark-editor"},Bg=["onUpdate:modelValue","data-testid"],zg=["disabled"],Kg=["onUpdate:modelValue","type","data-testid"],Wg={key:4,class:"param-description"},Gg={class:"summary"},qg={class:"batch-actions"},Jg=["disabled"],Yg={key:0,class:"spinner",style:{"border-color":"#ffffff88","border-top-color":"#fff"}},Qg=He({__name:"WorkbenchView",setup(e){const t=js(),s=uf(),n=Oo(),o=ns({checking:t,activated:!0}),i=Po(),r=se(ls[0].key),l=ns(Object.fromEntries(ls.map(m=>[m.key,{rows:[],selected:null,paramValues:{}}]))),a=se("");function d(){s.push("/settings")}const u=m=>{xe.wxActivate(m).then(()=>{o.activated=!0}).catch(()=>{})},h=oe(()=>ls.find(m=>m.key===r.value)),v=oe(()=>l[r.value]),x=oe(()=>wl(n.features,h.value)),V=oe(()=>Di(n.features,h.value)),M=oe(()=>{const m=Gh(x.value,v.value.rows.map(g=>g.ext)),w=v.value.rows[0]?Vi(n.features,v.value.rows[0].ext):void 0;return qh(m,w)}),z=oe(()=>{var m;return v.value.selected?((m=n.byKey.get(v.value.selected.conversionKey))==null?void 0:m.params)??[]:[]}),N=oe(()=>z.value.filter(m=>m.required&&String(v.value.paramValues[m.key]??"").trim()==="")),E=oe(()=>{var m;return((m=v.value.selected)==null?void 0:m.conversionKey)==="pdf-merge"});Mt(()=>[r.value,M.value.map(m=>`${m.conversionKey}:${m.format}`).join("|")],()=>{const m=v.value.selected,w=m!==null&&M.value.some(g=>g.conversionKey===m.conversionKey&&g.format===m.format);v.value.selected=w?m:M.value[0]??null,T()});function T(){var w;const m={};for(const g of z.value)g.defaultValue!==void 0?m[g.key]=g.defaultValue:g.control==="preset"&&((w=g.presets)!=null&&w.length)&&(m[g.key]=g.presets[0].value);v.value.paramValues=m}function D(m){const w=v.value.selected;return(w==null?void 0:w.conversionKey)===m.conversionKey&&(w==null?void 0:w.format)===m.format}function B(m){v.value.selected=m,T()}function _e(){const m={};for(const w of z.value){const g=v.value.paramValues[w.key];w.control==="preset"||w.control==="number"?typeof g=="number"&&Number.isFinite(g)&&(m[w.key]=g):typeof g=="string"&&g.trim()&&(m[w.key]=g.trim())}return m}function te(m,w){var b;if(m.kind!=="operate")return m.format;const g=((b=n.byKey.get(m.conversionKey))==null?void 0:b.toFormats)??[];return g.includes(w.ext)?w.ext:g[0]??w.ext}const Z=se(""),ee=se(!1),le=se(!1),de=se(""),Te=se(),Ee=se();function Ze(m){return m.split(/[\\/]/).pop()??m}function ut(m){return bl[Vi(n.features,m)??"file"]??"file"}function me(m){const w=ls.find(g=>Di(n.features,g).has(m));return(w==null?void 0:w.label)??"其他"}function Y(m,w,g){const b=m.trim();if(!b)return;const F=Wh(b);if(!V.value.has(F)){de.value=C.workbench.wrongTab.replace("{name}",Ze(b)).replace("{tab}",`「${h.value.label}」`).replace("对应标签页",`「${me(F)}」标签页`);return}const $=g??Ze(b);if(v.value.rows.some(q=>q.path===b||w!==void 0&&q.name===$&&q.size===w)){de.value=`${$} ${C.workbench.fileDuplicate}`;return}de.value="",v.value.rows.push({path:b,ext:F,name:$,status:"pending",...w!==void 0?{size:w}:{}})}function ie(){Y(Z.value),Z.value=""}async function We(m){if(m.length){le.value=!0,de.value="";try{for(const w of m){const g=w.path;if(g){Y(g,w.size,w.name);continue}if(v.value.rows.some(F=>F.name===w.name&&F.size===w.size)){de.value=`${w.name} ${C.workbench.fileDuplicate}`;continue}const b=await Ni(w);Y(b.inputPath,b.size,b.originalName)}}catch(w){de.value=w instanceof Error?w.message:"文件导入失败"}finally{le.value=!1,Te.value&&(Te.value.value="")}}}function ft(m){We(Array.from(m.target.files??[]))}function Ge(m){var w;ee.value=!1,We(Array.from(((w=m.dataTransfer)==null?void 0:w.files)??[]))}async function Pe(m){const w=Array.from(m.target.files??[])[0],g=z.value.find(b=>b.control==="file");if(!(!w||!g)){le.value=!0;try{const b=w.path;if(b)v.value.paramValues[g.key]=b;else{const F=await Ni(w);v.value.paramValues[g.key]=F.inputPath}}catch(b){de.value=b instanceof Error?b.message:"水印图片选择失败"}finally{le.value=!1,Ee.value&&(Ee.value.value="")}}}const qe=se(!1),et=oe(()=>v.value.rows.filter(m=>m.status==="pending").length),Ct=oe(()=>v.value.rows.some(m=>m.status==="success"||m.status==="failed")),Ne=oe(()=>et.value>0&&v.value.selected!==null&&N.value.length===0&&!qe.value);async function O(m){const w=v.value.selected;if(!(!w||E.value)){m.status="converting",m.targetFormat=te(w,m),m.progress=0,m.error=void 0,m.output=void 0;try{const g=await xe.convert({inputPath:m.path,targetFormat:m.targetFormat,conversionKey:w.conversionKey,options:_e()});m.taskId=g.taskId}catch(g){m.status="failed",m.error=g instanceof Error?g.message:"提交失败"}}}async function j(){const m=v.value.selected,w=v.value.rows.filter(g=>g.status==="pending");if(!(!m||!w.length||N.value.length)){if(qe.value=!0,m.conversionKey==="pdf-merge"){const g=w.map(b=>b.path);for(const b of w)b.status="converting",b.targetFormat=te(m,b),b.error=void 0;try{const b=await xe.convert({inputPath:g[0],targetFormat:te(m,w[0]),conversionKey:m.conversionKey,options:{..._e(),inputs:g}});for(const F of w)F.taskId=b.taskId}catch(b){const F=b instanceof Error?b.message:"提交失败";for(const $ of w)$.status="failed",$.error=F}}else for(const g of w)await O(g);qe.value=!1}}Mt(()=>i.tasks,m=>{var g;const w=new Map(m.map(b=>[b.taskId,b]));for(const b of ls)for(const F of l[b.key].rows){if(!F.taskId)continue;const $=w.get(F.taskId);$&&($.status==="success"?(F.status="success",F.output=$.output,F.progress=100):$.status==="failed"?(F.status="failed",F.error=((g=$.error)==null?void 0:g.message)??"转换失败"):(F.status="converting",F.progress=$.progress??F.progress))}},{deep:!0});function L(m){v.value.rows.splice(m,1)}function G(){v.value.rows=v.value.rows.filter(m=>m.status==="pending"||m.status==="converting")}async function f(m){try{await xe.revealPath(m.path)}catch(w){de.value=w instanceof Error?w.message:"打开目录失败"}}async function p(m){if(m.taskId)try{await xe.revealTask(m.taskId)}catch(w){de.value=w instanceof Error?w.message:"打开目录失败"}}function _(m){return m==="pending"?C.workbench.statusPending:m==="converting"?C.workbench.statusRunning:m==="success"?C.workbench.statusSuccess:C.workbench.statusFailed}const k=oe(()=>[...V.value].slice(0,10).map(m=>m.toUpperCase()).join(" / ")),A=oe(()=>[...V.value].map(m=>`.${m}`).join(","));let P;return os(()=>{t&&(P=Ao().onMessage(m=>{m.type==="activation:revoked"&&(o.activated=!1,o.checking=!1)}),xe.wxStatus().then(m=>{o.activated=m.activated,a.value=m.pairCode,o.checking=!1}).catch(()=>{o.checking=!1}))}),bn(()=>{P==null||P()}),(m,w)=>(R(),I("section",Fp,[c("h1",Vp,S(y(C).workbench.title),1),c("p",Lp,S(y(C).workbench.subtitle),1),y(t)?o.activated?(R(),I("div",Hp,[c("aside",jp,[(R(!0),I(ne,null,Ce(y(ls),g=>(R(),I("button",{key:g.key,type:"button",class:ye(["tab-btn",{active:r.value===g.key}]),"data-testid":`tab-${g.key}`,onClick:b=>{r.value=g.key,de.value=""}},[U(J,{name:g.icon,size:17},null,8,["name"]),c("span",Bp,S(g.label),1),l[g.key].rows.length?(R(),I("span",zp,S(l[g.key].rows.length),1)):Q("",!0)],10,Up))),128))]),c("div",Kp,[c("div",{class:ye(["dropzone",{dragging:ee.value,compact:v.value.rows.length>0}]),"data-testid":"dropzone",onDragover:w[2]||(w[2]=so(g=>ee.value=!0,["prevent"])),onDragleave:w[3]||(w[3]=g=>ee.value=!1),onDrop:so(Ge,["prevent"])},[v.value.rows.length?(R(),I(ne,{key:1},[U(J,{name:"upload",size:15}),c("span",Jp,S(y(C).workbench.dropCompact.replace("{tab}",h.value.label)),1)],64)):(R(),I(ne,{key:0},[c("span",Wp,[U(J,{name:h.value.icon,size:30},null,8,["name"])]),c("strong",Gp,S(y(C).workbench.dropTitle.replace("{tab}",h.value.label)),1),c("p",qp,S(y(C).workbench.dropHint.replace("{exts}",k.value)),1)],64)),c("div",Yp,[It(c("input",{"onUpdate:modelValue":w[0]||(w[0]=g=>Z.value=g),type:"text",placeholder:y(C).workbench.pastePlaceholder,onKeydown:Wc(ie,["enter"])},null,40,Qp),[[Ut,Z.value]]),c("button",{class:"ghost",type:"button",disabled:!Z.value.trim(),onClick:ie},[U(J,{name:"plus",size:14}),H(S(y(C).workbench.addPath),1)],8,Xp),c("button",{class:"primary",type:"button",disabled:le.value,onClick:w[1]||(w[1]=g=>{var b;return(b=Te.value)==null?void 0:b.click()})},[le.value?(R(),I("span",eg)):(R(),it(J,{key:0,name:"file",size:14})),H(" "+S(le.value?"导入中…":y(C).workbench.addFile),1)],8,Zp)]),c("input",{ref_key:"fileInput",ref:Te,type:"file",multiple:"",hidden:"",accept:A.value,onChange:ft},null,40,tg)],34),de.value?(R(),I("p",sg,[U(J,{name:"alert-circle",size:15}),H(S(de.value),1)])):Q("",!0),v.value.rows.length?(R(),I(ne,{key:1},[c("div",ng,[c("span",og,S(y(C).workbench.convertTo),1),M.value.length?(R(),I("div",ig,[(R(!0),I(ne,null,Ce(M.value,g=>(R(),I("button",{key:`${g.conversionKey}:${g.format}`,type:"button",class:ye(["target-chip",{active:D(g)}]),"data-testid":"target-chip",onClick:b=>B(g)},S(y(Li)(M.value,g)),11,rg))),128))])):x.value.some(g=>g.available)?(R(),I("p",lg,[U(J,{name:"alert-circle",size:15}),H(S(y(C).workbench.noCommonTargets),1)])):(R(),I("div",ag,[U(J,{name:"alert-circle",size:15}),c("span",cg,S(y(C).workbench.noTools),1),c("button",{class:"btn primary goto-settings",type:"button","data-testid":"goto-settings",onClick:d},S(y(C).workbench.gotoSettings),1)]))]),c("div",ug,[c("table",fg,[c("thead",null,[c("tr",null,[c("th",dg,S(y(C).workbench.tableFile),1),c("th",hg,S(y(C).workbench.tablePath),1),c("th",pg,S(y(C).workbench.tableSize),1),c("th",gg,S(y(C).workbench.tableStatus),1),c("th",mg,S(y(C).workbench.tableActions),1)])]),c("tbody",null,[(R(!0),I(ne,null,Ce(v.value.rows,(g,b)=>(R(),I("tr",{key:g.path,"data-testid":"file-row"},[c("td",vg,[c("span",yg,[U(J,{name:ut(g.ext),size:16},null,8,["name"])]),c("span",{class:"file-name",title:g.path},S(g.name??Ze(g.path)),9,_g),c("span",bg,S(g.ext?g.ext.toUpperCase():"?"),1)]),c("td",wg,[c("button",{class:"path-link",type:"button","data-testid":"row-path",title:g.path,onClick:F=>f(g)},S(g.path),9,Sg)]),c("td",xg,S(g.size!==void 0?y(Jh)(g.size):"—"),1),c("td",kg,[c("span",{class:ye(["row-status",g.status]),title:g.error??""},[g.status==="converting"?(R(),I("span",Eg)):Q("",!0),H(" "+S(_(g.status))+" ",1),g.status==="converting"&&g.progress!==void 0?(R(),I("em",Ag,S(g.progress)+"%",1)):Q("",!0),g.status==="failed"&&g.error?(R(),I("em",Rg,S(g.error),1)):Q("",!0)],10,Cg)]),c("td",Tg,[g.status==="pending"&&!E.value?(R(),I("button",{key:0,class:"ghost tiny",type:"button",onClick:F=>O(g)},S(y(C).workbench.convert),9,Og)):Q("",!0),g.status==="failed"&&!E.value?(R(),I("button",{key:1,class:"ghost tiny",type:"button",onClick:F=>O(g)},S(y(C).workbench.retry),9,Pg)):Q("",!0),g.status==="success"?(R(),I("button",{key:2,class:"ghost tiny",type:"button",onClick:F=>p(g)},S(y(C).workbench.openFolder),9,Ig)):Q("",!0),c("button",{class:"icon-btn",type:"button",title:y(C).workbench.remove,onClick:F=>L(b)},[U(J,{name:"x",size:14})],8,$g)])]))),128))])])]),z.value.length?(R(),I("div",Mg,[c("div",Ng,S(y(C).workbench.paramsTitle),1),c("div",Dg,[(R(!0),I(ne,null,Ce(z.value,g=>(R(),I("label",{key:g.key,class:ye(["param-field",{wide:g.control==="file"}])},[c("span",Fg,[H(S(g.label),1),g.unit?(R(),I(ne,{key:0},[H("("+S(g.unit)+")",1)],64)):Q("",!0),g.required?(R(),I("i",Vg,"*")):Q("",!0)]),g.control==="preset"?It((R(),I("select",{key:0,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,"data-testid":`param-${g.key}`},[(R(!0),I(ne,null,Ce(g.presets??[],b=>(R(),I("option",{key:b.value,value:b.value},S(b.label),9,Hg))),128))],8,Lg)),[[Co,v.value.paramValues[g.key]]]):g.control==="number"?It((R(),I("input",{key:1,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:"number",min:g.min,max:g.max,placeholder:"不调整","data-testid":`param-${g.key}`},null,8,jg)),[[Ut,v.value.paramValues[g.key],void 0,{number:!0}]]):g.control==="file"?(R(),I("div",Ug,[It(c("input",{"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:"text",placeholder:"选择或粘贴水印图片路径","data-testid":`param-${g.key}`},null,8,Bg),[[Ut,v.value.paramValues[g.key],void 0,{trim:!0}]]),c("button",{class:"ghost",type:"button",disabled:le.value,onClick:w[4]||(w[4]=b=>{var F;return(F=Ee.value)==null?void 0:F.click()})},S(y(C).workbench.chooseFile),9,zg),c("input",{ref_for:!0,ref_key:"watermarkInput",ref:Ee,type:"file",hidden:"",accept:"image/*",onChange:Pe},null,544)])):It((R(),I("input",{key:3,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:g.control==="password"?"password":"text","data-testid":`param-${g.key}`},null,8,Kg)),[[jc,v.value.paramValues[g.key],void 0,{trim:!0}]]),g.description?(R(),I("small",Wg,S(g.description),1)):Q("",!0)],2))),128))])])):Q("",!0),c("div",{class:ye(["batch-bar",{disabled:!Ne.value}])},[c("span",Gg,[w[5]||(w[5]=H(" 待转换 ",-1)),c("strong",null,S(et.value),1),H(" 个 → "+S(v.value.selected?y(Li)(M.value,v.value.selected):"—"),1)]),c("div",qg,[Ct.value?(R(),I("button",{key:0,class:"ghost",type:"button",onClick:G},"清除已完成")):Q("",!0),c("button",{class:"primary batch",type:"button","data-testid":"batch-convert",disabled:!Ne.value,onClick:j},[qe.value?(R(),I("span",Yg)):Q("",!0),H(" "+S(qe.value?"转换中…":y(C).workbench.batchConvertN.replace("{n}",String(et.value))),1)],8,Jg)])],2)],64)):Q("",!0)])])):(R(),it(Dp,{key:1,"pair-code":a.value,"data-testid":"follow-gate",onActivated:u},null,8,["pair-code"])):(R(),it(Rp,{key:0}))]))}}),Xg=Xe(Qg,[["__scopeId","data-v-9641c996"]]),Zg=cf({history:Uu(),routes:[{path:"/",name:"landing",component:Gd},{path:"/workbench",name:"workbench",component:Xg},{path:"/history",name:"history",component:sd},{path:"/settings",name:"settings",component:Uh},{path:"/:pathMatch(.*)*",redirect:"/"}]});Jc(Of).use(Xc()).use(Zg).mount("#app");
|
|
32
|
+
卸载后相关转换功能将不可用。`;window.confirm(T)&&t.startUninstall(E.id,E.uninstallCommand||C.doctor.portableUninstall)}async function z(){o.value=!0;try{const E=await xe.selectOutputDir();E.selected&&E.path&&(s.form.outputDir=E.path)}catch(E){s.error=E instanceof Error?E.message:"无法打开目录选择器"}finally{o.value=!1}}async function N(){try{await s.save(),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}catch{}}return(E,T)=>(R(),I("section",rh,[c("h1",lh,S(y(C).settings.title),1),T[12]||(T[12]=c("p",{class:"page-subtitle"},"转换引擎与应用偏好集中在这里管理",-1)),c("div",ah,[c("div",ch,[c("div",null,[c("h2",null,[H(S(y(C).settings.service)+" ",1),y(n).status.current?(R(),I("span",uh,"v"+S(y(n).status.current),1)):Q("",!0)]),T[4]||(T[4]=c("p",{class:"muted section-sub"},"转换服务的运行控制",-1))]),r.value?Q("",!0):(R(),I("span",fh,[T[5]||(T[5]=c("span",{class:"dot"},null,-1)),H(S(y(C).settings.serviceRunning),1)]))]),r.value?(R(),I("div",gh,[c("p",null,[U(J,{name:"check-circle",size:15}),c("strong",null,S(y(C).settings.serviceStopped),1)]),c("p",mh,S(y(C).settings.stoppedGuide),1),c("div",vh,[c("code",null,[T[7]||(T[7]=c("span",{class:"prompt"},"$",-1)),H(S(y(C).settings.startCommand),1)]),c("button",{class:"ghost",type:"button",onClick:d},S(a.value?"已复制":"复制"),1)])])):(R(),I("div",dh,[T[6]||(T[6]=c("p",{class:"muted stop-desc"},[H("停止后转换功能不可用。已开启的开机自启会在下次重启电脑时自动运行服务;重新启动请在终端执行 "),c("code",null,"converter start"),H("。")],-1)),c("button",{class:"ghost danger stop-btn",type:"button","data-testid":"stop-service",disabled:l.value,onClick:u},[l.value?(R(),I("span",ph)):Q("",!0),H(" "+S(l.value?"停止中…":y(C).settings.stopService),1)],8,hh)]))]),c("div",yh,[c("div",_h,[c("div",null,[c("h2",null,S(y(C).doctor.title),1),T[8]||(T[8]=c("p",{class:"muted section-sub"},"缺什么就一键补齐",-1))]),c("button",{class:"ghost recheck",disabled:y(t).loading,onClick:T[0]||(T[0]=D=>y(t).recheck())},[y(t).loading?(R(),I("span",wh)):(R(),it(J,{key:0,name:"refresh",size:15})),H(" "+S(y(C).doctor.recheck),1)],8,bh)]),c("div",Sh,[c("div",xh,[c("strong",null,S(y(t).readyCount)+" / "+S(y(t).statuses.length),1),T[9]||(T[9]=c("span",null,"个引擎可用",-1))]),c("div",kh,[c("i",{style:pn({width:`${x.value}%`})},null,4)])]),y(t).error?(R(),I("p",Ch,S(y(t).error),1)):Q("",!0),c("div",Eh,[(R(!0),I(ne,null,Ce(y(t).statuses,D=>(R(),it(nh,{key:D.id,status:D,installing:h.value,onInstall:V,onUninstall:M},null,8,["status","installing"]))),128))]),y(t).installSession.state!=="idle"?(R(),I("div",{key:1,ref_key:"installSessionRef",ref:v,class:"install-session"},[c("h3",null,S(y(C).doctor.logs),1),c("p",{class:ye(["session-state",y(t).installSession.state])},[y(t).installSession.state==="progress"?(R(),I("span",Ah)):Q("",!0),H(" "+S(y(t).installSession.state==="progress"?y(C).doctor.sessionRunningFull:y(t).installSession.state==="done"?y(C).doctor.sessionDone:y(C).doctor.sessionFailed),1)],2),U(ih,{logs:y(t).installSession.logs},null,8,["logs"])],512)):Q("",!0)]),c("form",{class:"panel",onSubmit:so(N,["prevent"])},[c("div",Rh,[c("h2",null,S(y(C).settings.preferences),1)]),c("label",Th,[c("span",null,S(y(C).settings.outputDir),1),c("div",Oh,[It(c("input",{"onUpdate:modelValue":T[1]||(T[1]=D=>y(s).form.outputDir=D),type:"text",placeholder:"转换结果保存目录"},null,512),[[Ut,y(s).form.outputDir]]),c("button",{class:"ghost",type:"button",disabled:o.value,onClick:z},[o.value?(R(),I("span",Ih)):(R(),it(J,{key:0,name:"folder",size:14})),H(" "+S(o.value?"打开中…":y(C).settings.chooseDir),1)],8,Ph)])]),c("label",$h,[c("span",null,S(y(C).settings.concurrency),1),c("div",Mh,[It(c("input",{"onUpdate:modelValue":T[2]||(T[2]=D=>y(s).form.concurrency=D),type:"number",min:"1",max:"4"},null,512),[[Ut,y(s).form.concurrency,void 0,{number:!0}]]),T[10]||(T[10]=c("small",{class:"muted"},"同时进行的转换任务数(1–4)",-1))])]),c("label",Nh,[c("span",null,S(y(C).settings.language),1),It(c("select",{"onUpdate:modelValue":T[3]||(T[3]=D=>y(s).form.language=D),disabled:""},[...T[11]||(T[11]=[c("option",{value:"zh-CN"},"简体中文",-1)])],512),[[Co,y(s).form.language]])]),y(s).error?(R(),I("p",Dh,S(y(s).error),1)):i.value?(R(),I("p",Fh,[U(J,{name:"check-circle",size:14}),H(S(y(C).settings.saved),1)])):Q("",!0),c("div",Vh,[c("button",{class:"primary",disabled:y(s).saving,type:"submit"},[y(s).saving?(R(),I("span",Hh)):Q("",!0),H(" "+S(y(s).saving?"保存中…":y(C).settings.save),1)],8,Lh)])],32)]))}}),Uh=Xe(jh,[["__scopeId","data-v-b8d6e7ed"]]),ls=[{key:"image",label:"图片",icon:"image",categories:["image"]},{key:"video",label:"视频",icon:"video",categories:["video"]},{key:"audio",label:"音频",icon:"music",categories:["audio"]},{key:"office",label:"文档",icon:"office",categories:["office","markdown"]},{key:"pdf",label:"PDF",icon:"pdf",categories:["pdf"]},{key:"archive",label:"压缩包",icon:"archive",categories:["archive"]}];function wl(e,t){return e.filter(s=>t.categories.includes(s.category))}function Di(e,t){const s=new Set;for(const n of wl(e,t))for(const o of n.fromFormats)s.add(o);return s}const Bh={"image-resize":"缩放","image-compress":"压缩","image-watermark":"加水印","video-compress":"压缩","video-timelapse":"延迟摄影","media-compress":"压缩","pdf-merge":"合并","pdf-split":"拆分","pdf-protect":"加密/解密","archive-extract":"解压"};function zh(e){return Bh[e]}const Fi={jpg:"jpg",jpeg:"jpg"};function Kh(e,t){return(Fi[e]??e)===(Fi[t]??t)}function Wh(e){const t=e.split(/[\\/]/).pop()??"",s=t.lastIndexOf(".");return s>0?t.slice(s+1).toLowerCase():""}function Gh(e,t){if(!t.length)return[];const s=[...new Set(t.map(i=>i.toLowerCase()))],n=[],o=new Set;for(const i of e){if(!i.available||!s.every(l=>i.fromFormats.includes(l)))continue;const r=zh(i.key);if(r){const l=`op:${i.key}`;if(o.has(l))continue;o.add(l),n.push({conversionKey:i.key,format:"",label:r,capability:i.label,category:i.category,kind:"operate"});continue}for(const l of i.toFormats){if(s.every(d=>Kh(d,l)))continue;const a=`${i.key}:${l}`;o.has(a)||(o.add(a),n.push({conversionKey:i.key,format:l,label:l==="folder"?"解压为文件夹":l.toUpperCase(),capability:i.label,category:i.category,kind:"convert"}))}}return n}function qh(e,t){return t?[...e].sort((s,n)=>+(n.category===t)-+(s.category===t)):[...e]}function Vi(e,t){var n;const s=t.toLowerCase();return(n=e.find(o=>o.fromFormats.includes(s)))==null?void 0:n.category}function Li(e,t){return e.some(n=>n!==t&&n.label===t.label)?`${t.label} · ${t.capability}`:t.label}function Jh(e){return e===void 0?"":e<1024?`${e} B`:e<1024**2?`${(e/1024).toFixed(0)} KB`:e<1024**3?`${(e/1024**2).toFixed(1)} MB`:`${(e/1024**3).toFixed(2)} GB`}const Yh={class:"install-guide","data-testid":"install-guide"},Qh={class:"platform-switch",role:"tablist"},Xh=["aria-selected"],Zh=["aria-selected"],ep={class:"steps"},tp={class:"muted"},sp={class:"command-block"},np={class:"command-row"},op={"data-testid":"install-command"},ip={class:"muted hint"},rp={class:"manual-block"},lp={key:0,class:"manual-steps"},ap={class:"step-no"},cp=He({__name:"InstallGuide",setup(e){const t=se(Io()),s=se(!1),n=oe(()=>$o(t.value)),o=se(!1);async function i(){try{await navigator.clipboard.writeText(n.value),o.value=!0,setTimeout(()=>{o.value=!1},2e3)}catch{}}return(r,l)=>(R(),I("div",Yh,[c("div",Qh,[c("button",{type:"button",class:ye({active:t.value==="macos"}),role:"tab","aria-selected":t.value==="macos",onClick:l[0]||(l[0]=a=>t.value="macos")},S(y(C).install.macos),11,Xh),c("button",{type:"button",class:ye({active:t.value==="windows"}),role:"tab","aria-selected":t.value==="windows",onClick:l[1]||(l[1]=a=>t.value="windows")},S(y(C).install.windows),11,Zh)]),c("ol",ep,[c("li",null,[l[3]||(l[3]=c("span",{class:"step-no"},"1",-1)),c("div",null,[c("strong",null,S(y(C).install.step1),1),c("p",tp,S(t.value==="macos"?y(C).install.macosTerminal:y(C).install.windowsTerminal),1)])]),c("li",null,[l[5]||(l[5]=c("span",{class:"step-no"},"2",-1)),c("div",sp,[c("strong",null,S(y(C).install.step2),1),c("div",np,[c("code",op,[l[4]||(l[4]=c("span",{class:"prompt"},"$",-1)),H(S(n.value),1)]),c("button",{class:"ghost copy",type:"button",onClick:i},[U(J,{name:o.value?"check-circle":"copy",size:14},null,8,["name"]),H(" "+S(o.value?y(C).install.copied:y(C).install.copy),1)])])])]),c("li",null,[l[6]||(l[6]=c("span",{class:"step-no"},"3",-1)),c("div",null,[c("strong",null,S(y(C).install.step3),1),c("p",ip,S(y(C).install.alreadyInstalled),1)])])]),c("div",rp,[c("button",{class:"manual-toggle",type:"button",onClick:l[2]||(l[2]=a=>s.value=!s.value)},[H(S(y(C).install.manualTitle),1),U(J,{name:"chevron-down",size:14,class:ye({open:s.value})},null,8,["class"])]),s.value?(R(),I("ol",lp,[(R(!0),I(ne,null,Ce(y(C).install.manualSteps,(a,d)=>(R(),I("li",{key:a.title},[c("span",ap,S(d+1),1),c("div",null,[c("strong",null,S(a.title),1),c("p",null,S(a.text),1)])]))),128))])):Q("",!0)])]))}}),up=Xe(cp,[["__scopeId","data-v-56162934"]]),fp={class:"daemon-gate","data-testid":"daemon-gate"},dp={key:0,class:"gate-state checking"},hp={key:1,class:"gate-state online","data-testid":"gate-online"},pp={class:"gate-icon ok"},gp={class:"actions"},mp=["href"],vp={key:2,class:"gate-state offline","data-testid":"gate-offline"},yp={class:"gate-icon off"},_p={class:"start-block"},bp={class:"manual"},wp={class:"manual-label"},Sp={class:"manual-row"},xp={class:"manual-hint"},kp={class:"actions"},Cp=["href"],Ep={class:"install-collapsed"},Ap=He({__name:"DaemonGate",setup(e){const t=se("checking"),s=se(!1),n=se(!1);async function o(){try{await navigator.clipboard.writeText("converter start"),n.value=!0,setTimeout(()=>{n.value=!1},2e3)}catch{}}async function i(){t.value="checking",t.value=await pf()?"online":"offline"}return os(()=>{i()}),(r,l)=>(R(),I("div",fp,[t.value==="checking"?(R(),I("div",dp,[l[1]||(l[1]=c("span",{class:"spinner big","aria-hidden":"true"},null,-1)),c("p",null,S(y(C).gate.checking),1)])):t.value==="online"?(R(),I("div",hp,[c("div",pp,[U(J,{name:"check-circle",size:26})]),c("p",null,S(y(C).gate.online),1),l[2]||(l[2]=c("p",{class:"hint muted"},"转换在本机完成,点击进入操作界面",-1)),c("div",gp,[c("a",{class:"btn primary",href:y(co),target:"_blank",rel:"noopener"},[H(S(y(C).gate.open),1),U(J,{name:"arrow-right",size:15})],8,mp),c("button",{class:"ghost",type:"button",onClick:i},[U(J,{name:"refresh",size:14}),H(S(y(C).gate.retry),1)])])])):(R(),I("div",vp,[c("div",yp,[U(J,{name:"alert-circle",size:26})]),c("p",null,S(y(C).gate.offline),1),c("div",_p,[c("div",bp,[c("span",wp,S(y(C).gate.manualTitle),1),c("div",Sp,[l[3]||(l[3]=c("code",null,[c("span",{class:"prompt"},"$"),H("converter start")],-1)),c("button",{class:"copy",type:"button",onClick:o},[U(J,{name:n.value?"check-circle":"copy",size:13},null,8,["name"]),H(S(n.value?"已复制":"复制"),1)])]),c("p",xp,S(y(C).gate.manualHint),1)]),c("div",kp,[c("button",{class:"ghost",type:"button",onClick:i},[U(J,{name:"refresh",size:14}),H(S(y(C).gate.retry),1)]),c("a",{class:"ghost direct-link",href:y(co),target:"_blank",rel:"noopener"},S(y(C).gate.open),9,Cp)])]),c("div",Ep,[c("button",{class:"install-toggle",type:"button",onClick:l[0]||(l[0]=a=>s.value=!s.value)},[H(S(y(C).gate.notInstalledTitle),1),U(J,{name:"chevron-down",size:14,class:ye({open:s.value})},null,8,["class"])]),s.value?(R(),it(up,{key:0})):Q("",!0)])]))]))}}),Rp=Xe(Ap,[["__scopeId","data-v-0f39bf4c"]]),Tp="/gh-qrcode.png",Op={class:"follow-gate","data-testid":"follow-gate"},Pp={class:"gate-right"},Ip={class:"code-row"},$p={"data-testid":"pair-code"},Mp={key:0,class:"gate-error"},Np=He({__name:"FollowGate",props:{pairCode:{}},emits:["activated"],setup(e,{emit:t}){const s=e,n=t,o=oe(()=>s.pairCode??""),i=se(!1),r=se("");let l;async function a(){try{await navigator.clipboard.writeText(o.value),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}catch{}}async function d(){const v=s.pairCode;if(v)try{const x=await fetch(`https://duduer.com/api/wx/activate/${encodeURIComponent(v)}`);if(!x.ok)return;const V=await x.json();V.status==="active"&&V.token?(h(),await xe.wxActivate(V.token),n("activated",V.token)):V.subscribed===!1?r.value="检测到关注已取消,重新关注即可恢复使用":r.value=""}catch{}}function u(){l=window.setInterval(()=>{d()},5e3)}function h(){l!==void 0&&(clearInterval(l),l=void 0)}return os(()=>{u()}),bn(()=>{h()}),(v,x)=>(R(),I("div",Op,[x[5]||(x[5]=c("div",{class:"gate-left"},[c("img",{class:"gh-qrcode",src:Tp,alt:"公众号二维码"}),c("p",{class:"qr-hint"},"微信扫码,关注公众号")],-1)),c("div",Pp,[x[1]||(x[1]=c("h2",null,"免费解锁全部功能",-1)),x[2]||(x[2]=c("p",{class:"gate-desc"},[H("关注公众号并回复你的绑定码,即可"),c("strong",null,"永久免费"),H("使用全部转换功能")],-1)),c("div",Ip,[x[0]||(x[0]=c("span",{class:"code-label"},"你的绑定码",-1)),c("code",$p,S(o.value),1),c("button",{class:"copy",type:"button",onClick:a},[U(J,{name:i.value?"check-circle":"copy",size:13},null,8,["name"]),H(S(i.value?"已复制":"复制"),1)])]),x[3]||(x[3]=c("ol",{class:"gate-steps"},[c("li",null,[c("span",null,"1"),H("微信扫描左侧二维码,关注公众号")]),c("li",null,[c("span",null,"2"),H("在公众号里发送你的绑定码(点击上方「复制」;手机手动输入请切换英文键盘,用半角字符)")]),c("li",null,[c("span",null,"3"),H("收到「绑定成功」回复后,本页自动解锁")])],-1)),r.value?(R(),I("p",Mp,[U(J,{name:"alert-circle",size:14}),H(S(r.value),1)])):Q("",!0),x[4]||(x[4]=c("p",{class:"waiting"},[c("span",{class:"spinner tiny"}),H("正在等待绑定完成,每 5 秒自动检测…")],-1))])]))}}),Dp=Xe(Np,[["__scopeId","data-v-8a413519"]]),Fp={class:"workbench","data-testid":"workbench"},Vp={class:"page-title"},Lp={class:"page-subtitle"},Hp={key:2,class:"tabbed"},jp={class:"tab-rail"},Up=["data-testid","onClick"],Bp={class:"tab-label"},zp={key:0,class:"tab-count"},Kp={class:"tab-panel panel"},Wp={class:"drop-icon"},Gp={class:"drop-title"},qp={class:"muted drop-hint"},Jp={class:"drop-compact-text"},Yp={class:"drop-actions"},Qp=["placeholder"],Xp=["disabled"],Zp=["disabled"],eg={key:1,class:"spinner",style:{width:"13px",height:"13px","border-color":"#ffffff88","border-top-color":"#fff"}},tg=["accept"],sg={key:0,class:"hint-alert"},ng={class:"target-bar"},og={class:"section-title"},ig={key:0,class:"target-chips"},rg=["onClick"],lg={key:1,class:"hint-alert"},ag={key:2,class:"hint-alert tools-missing"},cg={class:"hint-text"},ug={class:"table-wrap"},fg={class:"file-table","data-testid":"file-table"},dg={class:"cell-file"},hg={class:"cell-path"},pg={class:"cell-size"},gg={class:"cell-status"},mg={class:"cell-actions"},vg={class:"cell-file"},yg={class:"file-icon"},_g=["title"],bg={class:"chip ext"},wg={class:"cell-path"},Sg=["title","onClick"],xg={class:"cell-size muted"},kg={class:"cell-status"},Cg=["title"],Eg={key:0,class:"spinner tiny"},Ag={key:1},Rg={key:2,class:"row-error"},Tg={class:"cell-actions"},Og=["onClick"],Pg=["onClick"],Ig=["onClick"],$g=["title","onClick"],Mg={key:0,class:"params"},Ng={class:"section-title"},Dg={class:"params-grid"},Fg={class:"param-label"},Vg={key:1,class:"required"},Lg=["onUpdate:modelValue","data-testid"],Hg=["value"],jg=["onUpdate:modelValue","min","max","data-testid"],Ug={key:2,class:"watermark-editor"},Bg=["onUpdate:modelValue","data-testid"],zg=["disabled"],Kg=["onUpdate:modelValue","type","data-testid"],Wg={key:4,class:"param-description"},Gg={class:"summary"},qg={class:"batch-actions"},Jg=["disabled"],Yg={key:0,class:"spinner",style:{"border-color":"#ffffff88","border-top-color":"#fff"}},Qg=He({__name:"WorkbenchView",setup(e){const t=js(),s=uf(),n=Oo(),o=ns({checking:t,activated:!0}),i=Po(),r=se(ls[0].key),l=ns(Object.fromEntries(ls.map(m=>[m.key,{rows:[],selected:null,paramValues:{}}]))),a=se("");function d(){s.push("/settings")}const u=m=>{xe.wxActivate(m).then(()=>{o.activated=!0}).catch(()=>{})},h=oe(()=>ls.find(m=>m.key===r.value)),v=oe(()=>l[r.value]),x=oe(()=>wl(n.features,h.value)),V=oe(()=>Di(n.features,h.value)),M=oe(()=>{const m=Gh(x.value,v.value.rows.map(g=>g.ext)),w=v.value.rows[0]?Vi(n.features,v.value.rows[0].ext):void 0;return qh(m,w)}),z=oe(()=>{var m;return v.value.selected?((m=n.byKey.get(v.value.selected.conversionKey))==null?void 0:m.params)??[]:[]}),N=oe(()=>z.value.filter(m=>m.required&&String(v.value.paramValues[m.key]??"").trim()==="")),E=oe(()=>{var m;return((m=v.value.selected)==null?void 0:m.conversionKey)==="pdf-merge"});Mt(()=>[r.value,M.value.map(m=>`${m.conversionKey}:${m.format}`).join("|")],()=>{const m=v.value.selected,w=m!==null&&M.value.some(g=>g.conversionKey===m.conversionKey&&g.format===m.format);v.value.selected=w?m:M.value[0]??null,T()});function T(){var w;const m={};for(const g of z.value)g.defaultValue!==void 0?m[g.key]=g.defaultValue:g.control==="preset"&&((w=g.presets)!=null&&w.length)&&(m[g.key]=g.presets[0].value);v.value.paramValues=m}function D(m){const w=v.value.selected;return(w==null?void 0:w.conversionKey)===m.conversionKey&&(w==null?void 0:w.format)===m.format}function B(m){v.value.selected=m,T()}function _e(){const m={};for(const w of z.value){const g=v.value.paramValues[w.key];w.control==="preset"||w.control==="number"?typeof g=="number"&&Number.isFinite(g)&&(m[w.key]=g):typeof g=="string"&&g.trim()&&(m[w.key]=g.trim())}return m}function te(m,w){var b;if(m.kind!=="operate")return m.format;const g=((b=n.byKey.get(m.conversionKey))==null?void 0:b.toFormats)??[];return g.includes(w.ext)?w.ext:g[0]??w.ext}const Z=se(""),ee=se(!1),le=se(!1),de=se(""),Te=se(),Ee=se();function Ze(m){return m.split(/[\\/]/).pop()??m}function ut(m){return bl[Vi(n.features,m)??"file"]??"file"}function me(m){const w=ls.find(g=>Di(n.features,g).has(m));return(w==null?void 0:w.label)??"其他"}function Y(m,w,g){const b=m.trim();if(!b)return;const F=Wh(b);if(!V.value.has(F)){de.value=C.workbench.wrongTab.replace("{name}",Ze(b)).replace("{tab}",`「${h.value.label}」`).replace("对应标签页",`「${me(F)}」标签页`);return}const $=g??Ze(b);if(v.value.rows.some(q=>q.path===b||w!==void 0&&q.name===$&&q.size===w)){de.value=`${$} ${C.workbench.fileDuplicate}`;return}de.value="",v.value.rows.push({path:b,ext:F,name:$,status:"pending",...w!==void 0?{size:w}:{}})}function ie(){Y(Z.value),Z.value=""}async function We(m){if(m.length){le.value=!0,de.value="";try{for(const w of m){const g=w.path;if(g){Y(g,w.size,w.name);continue}if(v.value.rows.some(F=>F.name===w.name&&F.size===w.size)){de.value=`${w.name} ${C.workbench.fileDuplicate}`;continue}const b=await Ni(w);Y(b.inputPath,b.size,b.originalName)}}catch(w){de.value=w instanceof Error?w.message:"文件导入失败"}finally{le.value=!1,Te.value&&(Te.value.value="")}}}function ft(m){We(Array.from(m.target.files??[]))}function Ge(m){var w;ee.value=!1,We(Array.from(((w=m.dataTransfer)==null?void 0:w.files)??[]))}async function Pe(m){const w=Array.from(m.target.files??[])[0],g=z.value.find(b=>b.control==="file");if(!(!w||!g)){le.value=!0;try{const b=w.path;if(b)v.value.paramValues[g.key]=b;else{const F=await Ni(w);v.value.paramValues[g.key]=F.inputPath}}catch(b){de.value=b instanceof Error?b.message:"水印图片选择失败"}finally{le.value=!1,Ee.value&&(Ee.value.value="")}}}const qe=se(!1),et=oe(()=>v.value.rows.filter(m=>m.status==="pending").length),Ct=oe(()=>v.value.rows.some(m=>m.status==="success"||m.status==="failed")),Ne=oe(()=>et.value>0&&v.value.selected!==null&&N.value.length===0&&!qe.value);async function O(m){const w=v.value.selected;if(!(!w||E.value)){m.status="converting",m.targetFormat=te(w,m),m.progress=0,m.error=void 0,m.output=void 0;try{const g=await xe.convert({inputPath:m.path,targetFormat:m.targetFormat,conversionKey:w.conversionKey,options:_e()});m.taskId=g.taskId}catch(g){m.status="failed",m.error=g instanceof Error?g.message:"提交失败"}}}async function j(){const m=v.value.selected,w=v.value.rows.filter(g=>g.status==="pending");if(!(!m||!w.length||N.value.length)){if(qe.value=!0,m.conversionKey==="pdf-merge"){const g=w.map(b=>b.path);for(const b of w)b.status="converting",b.targetFormat=te(m,b),b.error=void 0;try{const b=await xe.convert({inputPath:g[0],targetFormat:te(m,w[0]),conversionKey:m.conversionKey,options:{..._e(),inputs:g}});for(const F of w)F.taskId=b.taskId}catch(b){const F=b instanceof Error?b.message:"提交失败";for(const $ of w)$.status="failed",$.error=F}}else for(const g of w)await O(g);qe.value=!1}}Mt(()=>i.tasks,m=>{var g;const w=new Map(m.map(b=>[b.taskId,b]));for(const b of ls)for(const F of l[b.key].rows){if(!F.taskId)continue;const $=w.get(F.taskId);$&&($.status==="success"?(F.status="success",F.output=$.output,F.progress=100):$.status==="failed"?(F.status="failed",F.error=((g=$.error)==null?void 0:g.message)??"转换失败"):(F.status="converting",F.progress=$.progress??F.progress))}},{deep:!0});function L(m){v.value.rows.splice(m,1)}function G(){v.value.rows=v.value.rows.filter(m=>m.status==="pending"||m.status==="converting")}async function f(m){try{await xe.revealPath(m.path)}catch(w){de.value=w instanceof Error?w.message:"打开目录失败"}}async function p(m){if(m.taskId)try{await xe.revealTask(m.taskId)}catch(w){de.value=w instanceof Error?w.message:"打开目录失败"}}function _(m){return m==="pending"?C.workbench.statusPending:m==="converting"?C.workbench.statusRunning:m==="success"?C.workbench.statusSuccess:C.workbench.statusFailed}const k=oe(()=>[...V.value].slice(0,10).map(m=>m.toUpperCase()).join(" / ")),A=oe(()=>[...V.value].map(m=>`.${m}`).join(","));let P;return os(()=>{t&&(P=Ao().onMessage(m=>{m.type==="activation:revoked"&&(o.activated=!1,o.checking=!1)}),xe.wxStatus().then(m=>{o.activated=m.activated,a.value=m.pairCode,o.checking=!1}).catch(()=>{o.checking=!1}))}),bn(()=>{P==null||P()}),(m,w)=>(R(),I("section",Fp,[c("h1",Vp,S(y(C).workbench.title),1),c("p",Lp,S(y(C).workbench.subtitle),1),y(t)?o.activated?(R(),I("div",Hp,[c("aside",jp,[(R(!0),I(ne,null,Ce(y(ls),g=>(R(),I("button",{key:g.key,type:"button",class:ye(["tab-btn",{active:r.value===g.key}]),"data-testid":`tab-${g.key}`,onClick:b=>{r.value=g.key,de.value=""}},[U(J,{name:g.icon,size:17},null,8,["name"]),c("span",Bp,S(g.label),1),l[g.key].rows.length?(R(),I("span",zp,S(l[g.key].rows.length),1)):Q("",!0)],10,Up))),128))]),c("div",Kp,[c("div",{class:ye(["dropzone",{dragging:ee.value,compact:v.value.rows.length>0}]),"data-testid":"dropzone",onDragover:w[2]||(w[2]=so(g=>ee.value=!0,["prevent"])),onDragleave:w[3]||(w[3]=g=>ee.value=!1),onDrop:so(Ge,["prevent"])},[v.value.rows.length?(R(),I(ne,{key:1},[U(J,{name:"upload",size:15}),c("span",Jp,S(y(C).workbench.dropCompact.replace("{tab}",h.value.label)),1)],64)):(R(),I(ne,{key:0},[c("span",Wp,[U(J,{name:h.value.icon,size:30},null,8,["name"])]),c("strong",Gp,S(y(C).workbench.dropTitle.replace("{tab}",h.value.label)),1),c("p",qp,S(y(C).workbench.dropHint.replace("{exts}",k.value)),1)],64)),c("div",Yp,[It(c("input",{"onUpdate:modelValue":w[0]||(w[0]=g=>Z.value=g),type:"text",placeholder:y(C).workbench.pastePlaceholder,onKeydown:Wc(ie,["enter"])},null,40,Qp),[[Ut,Z.value]]),c("button",{class:"ghost",type:"button",disabled:!Z.value.trim(),onClick:ie},[U(J,{name:"plus",size:14}),H(S(y(C).workbench.addPath),1)],8,Xp),c("button",{class:"primary",type:"button",disabled:le.value,onClick:w[1]||(w[1]=g=>{var b;return(b=Te.value)==null?void 0:b.click()})},[le.value?(R(),I("span",eg)):(R(),it(J,{key:0,name:"file",size:14})),H(" "+S(le.value?"导入中…":y(C).workbench.addFile),1)],8,Zp)]),c("input",{ref_key:"fileInput",ref:Te,type:"file",multiple:"",hidden:"",accept:A.value,onChange:ft},null,40,tg)],34),de.value?(R(),I("p",sg,[U(J,{name:"alert-circle",size:15}),H(S(de.value),1)])):Q("",!0),v.value.rows.length?(R(),I(ne,{key:1},[c("div",ng,[c("span",og,S(y(C).workbench.convertTo),1),M.value.length?(R(),I("div",ig,[(R(!0),I(ne,null,Ce(M.value,g=>(R(),I("button",{key:`${g.conversionKey}:${g.format}`,type:"button",class:ye(["target-chip",{active:D(g)}]),"data-testid":"target-chip",onClick:b=>B(g)},S(y(Li)(M.value,g)),11,rg))),128))])):x.value.some(g=>g.available)?(R(),I("p",lg,[U(J,{name:"alert-circle",size:15}),H(S(y(C).workbench.noCommonTargets),1)])):(R(),I("div",ag,[U(J,{name:"alert-circle",size:15}),c("span",cg,S(y(C).workbench.noTools),1),c("button",{class:"btn primary goto-settings",type:"button","data-testid":"goto-settings",onClick:d},S(y(C).workbench.gotoSettings),1)]))]),c("div",ug,[c("table",fg,[c("thead",null,[c("tr",null,[c("th",dg,S(y(C).workbench.tableFile),1),c("th",hg,S(y(C).workbench.tablePath),1),c("th",pg,S(y(C).workbench.tableSize),1),c("th",gg,S(y(C).workbench.tableStatus),1),c("th",mg,S(y(C).workbench.tableActions),1)])]),c("tbody",null,[(R(!0),I(ne,null,Ce(v.value.rows,(g,b)=>(R(),I("tr",{key:g.path,"data-testid":"file-row"},[c("td",vg,[c("span",yg,[U(J,{name:ut(g.ext),size:16},null,8,["name"])]),c("span",{class:"file-name",title:g.path},S(g.name??Ze(g.path)),9,_g),c("span",bg,S(g.ext?g.ext.toUpperCase():"?"),1)]),c("td",wg,[c("button",{class:"path-link",type:"button","data-testid":"row-path",title:g.path,onClick:F=>f(g)},S(g.path),9,Sg)]),c("td",xg,S(g.size!==void 0?y(Jh)(g.size):"—"),1),c("td",kg,[c("span",{class:ye(["row-status",g.status]),title:g.error??""},[g.status==="converting"?(R(),I("span",Eg)):Q("",!0),H(" "+S(_(g.status))+" ",1),g.status==="converting"&&g.progress!==void 0?(R(),I("em",Ag,S(g.progress)+"%",1)):Q("",!0),g.status==="failed"&&g.error?(R(),I("em",Rg,S(g.error),1)):Q("",!0)],10,Cg)]),c("td",Tg,[g.status==="pending"&&!E.value?(R(),I("button",{key:0,class:"ghost tiny",type:"button",onClick:F=>O(g)},S(y(C).workbench.convert),9,Og)):Q("",!0),g.status==="failed"&&!E.value?(R(),I("button",{key:1,class:"ghost tiny",type:"button",onClick:F=>O(g)},S(y(C).workbench.retry),9,Pg)):Q("",!0),g.status==="success"?(R(),I("button",{key:2,class:"ghost tiny",type:"button",onClick:F=>p(g)},S(y(C).workbench.openFolder),9,Ig)):Q("",!0),c("button",{class:"icon-btn",type:"button",title:y(C).workbench.remove,onClick:F=>L(b)},[U(J,{name:"x",size:14})],8,$g)])]))),128))])])]),z.value.length?(R(),I("div",Mg,[c("div",Ng,S(y(C).workbench.paramsTitle),1),c("div",Dg,[(R(!0),I(ne,null,Ce(z.value,g=>(R(),I("label",{key:g.key,class:ye(["param-field",{wide:g.control==="file"}])},[c("span",Fg,[H(S(g.label),1),g.unit?(R(),I(ne,{key:0},[H("("+S(g.unit)+")",1)],64)):Q("",!0),g.required?(R(),I("i",Vg,"*")):Q("",!0)]),g.control==="preset"?It((R(),I("select",{key:0,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,"data-testid":`param-${g.key}`},[(R(!0),I(ne,null,Ce(g.presets??[],b=>(R(),I("option",{key:b.value,value:b.value},S(b.label),9,Hg))),128))],8,Lg)),[[Co,v.value.paramValues[g.key]]]):g.control==="number"?It((R(),I("input",{key:1,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:"number",min:g.min,max:g.max,placeholder:"不调整","data-testid":`param-${g.key}`},null,8,jg)),[[Ut,v.value.paramValues[g.key],void 0,{number:!0}]]):g.control==="file"?(R(),I("div",Ug,[It(c("input",{"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:"text",placeholder:"选择或粘贴水印图片路径","data-testid":`param-${g.key}`},null,8,Bg),[[Ut,v.value.paramValues[g.key],void 0,{trim:!0}]]),c("button",{class:"ghost",type:"button",disabled:le.value,onClick:w[4]||(w[4]=b=>{var F;return(F=Ee.value)==null?void 0:F.click()})},S(y(C).workbench.chooseFile),9,zg),c("input",{ref_for:!0,ref_key:"watermarkInput",ref:Ee,type:"file",hidden:"",accept:"image/*",onChange:Pe},null,544)])):It((R(),I("input",{key:3,"onUpdate:modelValue":b=>v.value.paramValues[g.key]=b,type:g.control==="password"?"password":"text","data-testid":`param-${g.key}`},null,8,Kg)),[[jc,v.value.paramValues[g.key],void 0,{trim:!0}]]),g.description?(R(),I("small",Wg,S(g.description),1)):Q("",!0)],2))),128))])])):Q("",!0),c("div",{class:ye(["batch-bar",{disabled:!Ne.value}])},[c("span",Gg,[w[5]||(w[5]=H(" 待转换 ",-1)),c("strong",null,S(et.value),1),H(" 个 → "+S(v.value.selected?y(Li)(M.value,v.value.selected):"—"),1)]),c("div",qg,[Ct.value?(R(),I("button",{key:0,class:"ghost",type:"button",onClick:G},"清除已完成")):Q("",!0),c("button",{class:"primary batch",type:"button","data-testid":"batch-convert",disabled:!Ne.value,onClick:j},[qe.value?(R(),I("span",Yg)):Q("",!0),H(" "+S(qe.value?"转换中…":y(C).workbench.batchConvertN.replace("{n}",String(et.value))),1)],8,Jg)])],2)],64)):Q("",!0)])])):(R(),it(Dp,{key:1,"pair-code":a.value,"data-testid":"follow-gate",onActivated:u},null,8,["pair-code"])):(R(),it(Rp,{key:0}))]))}}),Xg=Xe(Qg,[["__scopeId","data-v-9641c996"]]),Zg=cf({history:Uu(),routes:[{path:"/",name:"landing",component:Gd},{path:"/workbench",name:"workbench",component:Xg},{path:"/history",name:"history",component:sd},{path:"/settings",name:"settings",component:Uh},{path:"/:pathMatch(.*)*",redirect:"/"}]});Jc(Of).use(Xc()).use(Zg).mount("#app");
|
package/web/dist/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>嘟嘟转换器 · 本地万能文件转换</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-Dgk6et5J.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Cqte_K_a.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|