Newnai2 / frontend /index.html
Logankunfall's picture
Upload 21 files
f4541b5 verified
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
<title>New NAI - 本地可视化前端</title>
<link rel="stylesheet" href="assets/style.css" />
</head>
<body>
<!-- 手机端侧边栏 -->
<div id="sidebar" class="sidebar">
<div class="sidebar-header">
<div class="brand">New NAI</div>
<button id="sidebar-close" class="sidebar-close">×</button>
</div>
<nav class="sidebar-nav">
<button class="tab-btn active" data-tab="tab-config">配置</button>
<button class="tab-btn" data-tab="tab-t2i">文生图</button>
<button class="tab-btn" data-tab="tab-i2i">图生图</button>
<button class="tab-btn" data-tab="tab-inpaint">局部重绘</button>
</nav>
<div class="sidebar-actions">
<button id="theme-toggle-mobile" class="tab-btn">主题:深色</button>
<button id="sound-toggle-mobile" class="tab-btn" aria-pressed="false">提示音:关</button>
</div>
</div>
<div id="sidebar-overlay" class="sidebar-overlay"></div>
<header class="app-header">
<button id="menu-toggle" class="menu-toggle"></button>
<div class="brand">New NAI</div>
<nav class="tabs">
<button class="tab-btn active" data-tab="tab-config">配置</button>
<button class="tab-btn" data-tab="tab-t2i">文生图</button>
<button class="tab-btn" data-tab="tab-i2i">图生图</button>
<button class="tab-btn" data-tab="tab-inpaint">局部重绘</button>
</nav>
<div class="header-actions">
<button id="theme-toggle" class="tab-btn">主题:深色</button>
<button id="sound-toggle" class="tab-btn" aria-pressed="false">提示音:关</button>
</div>
</header>
<main>
<!-- 配置 -->
<section id="tab-config" class="tab active">
<h2>配置设置</h2>
<div class="card">
<div class="form-grid">
<label>
<span>Key(原 Token)</span>
<input id="cfg-key" type="password" placeholder="在此填入 NovelAI Key" autocomplete="off" />
</label>
<label>
<span>模型</span>
<select id="cfg-model">
<option value="nai-diffusion-3">nai-diffusion-3</option>
<option value="nai-diffusion-furry-3">nai-diffusion-furry-3</option>
<option value="nai-diffusion-4-curated-preview">nai-diffusion-4-curated-preview</option>
<option value="nai-diffusion-4-full">nai-diffusion-4-full</option>
<option value="nai-diffusion-4-5-curated">nai-diffusion-4-5-curated</option>
<option value="nai-diffusion-4-5-full">nai-diffusion-4-5-full</option>
</select>
</label>
<label>
<span>采样器</span>
<select id="cfg-sampler">
<option value="k_euler">k_euler</option>
<option value="k_euler_ancestral">k_euler_ancestral</option>
<option value="k_dpmpp_2s_ancestral">k_dpmpp_2s_ancestral</option>
<option value="k_dpmpp_2m">k_dpmpp_2m</option>
<option value="k_dpmpp_sde">k_dpmpp_sde</option>
<option value="k_dpmpp_2m_sde">k_dpmpp_2m_sde</option>
<option value="ddim_v3">ddim_v3</option>
</select>
</label>
<label>
<span>步数</span>
<input id="cfg-steps" type="number" min="1" step="1" placeholder="默认 28" />
</label>
<label>
<span>CFG 强度</span>
<input id="cfg-scale" type="number" min="0" step="0.1" placeholder="默认 5.0" />
</label>
<label>
<span>CFG 重缩放</span>
<input id="cfg-cfg-rescale" type="number" min="0" step="0.1" placeholder="默认 0" />
</label>
<label>
<span>噪声调度</span>
<select id="cfg-noise-schedule">
<option value="">(随模型/采样器自动)</option>
<option value="native">native</option>
<option value="karras">karras</option>
<option value="exponential">exponential</option>
<option value="polyexponential">polyexponential</option>
</select>
</label>
<label>
<span>UC 预设</span>
<input id="cfg-uc-preset" type="number" min="0" step="1" placeholder="默认 4" />
</label>
<label class="switch">
<input id="cfg-quality-toggle" type="checkbox" />
<span>质量优化</span>
</label>
<label class="switch">
<input id="cfg-legacy-uc" type="checkbox" />
<span>兼容旧版 UC</span>
</label>
<label class="switch">
<input id="cfg-save-output" type="checkbox" />
<span>保存到输出目录</span>
</label>
<label class="full">
<span>保存目录</span>
<input id="cfg-output-dir" type="text" placeholder="例如:/home/user/output(留空=默认 output)" />
</label>
<!-- 自定义背景 -->
<label class="full">
<span>自定义背景图片</span>
<div class="background-upload-wrapper">
<input id="cfg-custom-bg" type="file" accept="image/*" />
<button id="btn-reset-bg" type="button">重置背景</button>
</div>
</label>
</div>
<div class="actions dir-actions">
<button id="btn-select-output-dir">选择保存目录</button>
<button id="btn-open-output-dir">打开保存目录</button>
</div>
<p id="cfg-message" class="message"></p>
<p class="hf-notice">注:配置会自动保存。手机端请直接在输入框填写保存目录路径</p>
</div>
</section>
<!-- 文生图 -->
<section id="tab-t2i" class="tab">
<h2>文生图</h2>
<div class="card">
<div class="form-grid">
<label class="full">
<span>正面提示词</span>
<textarea id="t2i-prompt" rows="3" placeholder="输入提示词"></textarea>
</label>
<label class="full">
<span>负面提示词</span>
<textarea id="t2i-negative" rows="2" placeholder="可留空"></textarea>
</label>
<label>
<span>宽度</span>
<input id="t2i-width" type="number" min="64" step="64" value="768" />
</label>
<label>
<span>高度</span>
<input id="t2i-height" type="number" min="64" step="64" value="768" />
</label>
<label>
<span>步数</span>
<input id="t2i-steps" type="number" min="1" step="1" placeholder="留空=配置默认" />
</label>
<label>
<span>CFG 强度</span>
<input id="t2i-scale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
<label>
<span>采样器</span>
<select id="t2i-sampler">
<option value="">(配置默认)</option>
<option value="k_euler">k_euler</option>
<option value="k_euler_ancestral">k_euler_ancestral</option>
<option value="k_dpmpp_2s_ancestral">k_dpmpp_2s_ancestral</option>
<option value="k_dpmpp_2m">k_dpmpp_2m</option>
<option value="k_dpmpp_sde">k_dpmpp_sde</option>
<option value="k_dpmpp_2m_sde">k_dpmpp_2m_sde</option>
<option value="ddim_v3">ddim_v3</option>
</select>
</label>
<label>
<span>噪声调度</span>
<select id="t2i-noise-schedule">
<option value="">(自动)</option>
<option value="native">native</option>
<option value="karras">karras</option>
<option value="exponential">exponential</option>
<option value="polyexponential">polyexponential</option>
</select>
</label>
<label>
<span>随机种子</span>
<input id="t2i-seed" type="number" step="1" value="-1" />
</label>
<label class="switch">
<input id="t2i-variety" type="checkbox" />
<span>多样性</span>
</label>
<label class="switch">
<input id="t2i-decrisp" type="checkbox" />
<span>动态阈值</span>
</label>
<label>
<span>CFG 重缩放</span>
<input id="t2i-cfg-rescale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
</div>
<div class="actions">
<button id="btn-t2i" class="primary">生成</button>
</div>
<div class="result">
<img id="t2i-img" alt="生成结果" />
<div class="image-actions" id="t2i-actions" style="display:none;">
<button id="btn-save-t2i" class="save-btn">💾 保存图片</button>
</div>
<div class="image-info" id="t2i-info" style="display:none;">
<div class="image-info-header">
<span class="image-info-title">图片信息</span>
<button class="image-info-toggle" data-target="t2i-info-content">展开 ▼</button>
</div>
<div class="image-info-content" id="t2i-info-content">
<div class="image-info-row">
<span class="image-info-label">模型</span>
<span class="image-info-value" id="t2i-model"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">分辨率</span>
<span class="image-info-value" id="t2i-resolution"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">正面提示词</span>
<span class="image-info-value" id="t2i-prompt-text"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">负面提示词</span>
<span class="image-info-value" id="t2i-negative-text"></span>
</div>
</div>
</div>
<div class="saved-path">
<label>保存路径</label>
<input id="t2i-saved" type="text" readonly />
</div>
</div>
</div>
</section>
<!-- 图生图 -->
<section id="tab-i2i" class="tab">
<h2>图生图</h2>
<div class="card">
<div class="form-grid">
<label class="full">
<span>正面提示词</span>
<textarea id="i2i-positive" rows="2" placeholder="输入正面提示词"></textarea>
</label>
<label class="full">
<span>负面提示词</span>
<textarea id="i2i-negative" rows="2" placeholder="可留空"></textarea>
</label>
<label class="full">
<span>输入图片</span>
<input id="i2i-image" type="file" accept="image/*" />
</label>
<label>
<span>宽度</span>
<input id="i2i-width" type="number" min="64" step="64" placeholder="留空=768" />
</label>
<label>
<span>高度</span>
<input id="i2i-height" type="number" min="64" step="64" placeholder="留空=768" />
</label>
<label>
<span>步数</span>
<input id="i2i-steps" type="number" min="1" step="1" placeholder="留空=配置默认" />
</label>
<label>
<span>CFG 强度</span>
<input id="i2i-scale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
<label>
<span>采样器</span>
<select id="i2i-sampler">
<option value="">(配置默认)</option>
<option value="k_euler">k_euler</option>
<option value="k_euler_ancestral">k_euler_ancestral</option>
<option value="k_dpmpp_2s_ancestral">k_dpmpp_2s_ancestral</option>
<option value="k_dpmpp_2m">k_dpmpp_2m</option>
<option value="k_dpmpp_sde">k_dpmpp_sde</option>
<option value="k_dpmpp_2m_sde">k_dpmpp_2m_sde</option>
<option value="ddim_v3">ddim_v3</option>
</select>
</label>
<label>
<span>噪声调度</span>
<select id="i2i-noise-schedule">
<option value="">(自动)</option>
<option value="native">native</option>
<option value="karras">karras</option>
<option value="exponential">exponential</option>
<option value="polyexponential">polyexponential</option>
</select>
</label>
<label>
<span>随机种子</span>
<input id="i2i-seed" type="number" step="1" value="-1" />
</label>
<label>
<span>强度</span>
<input id="i2i-strength" type="number" min="0" max="1" step="0.01" value="0.5" />
</label>
<label>
<span>噪声</span>
<input id="i2i-noise" type="number" min="0" max="1" step="0.01" value="0.0" />
</label>
<label class="switch">
<input id="i2i-variety" type="checkbox" />
<span>多样性</span>
</label>
<label class="switch">
<input id="i2i-decrisp" type="checkbox" />
<span>动态阈值</span>
</label>
<label>
<span>CFG 重缩放</span>
<input id="i2i-cfg-rescale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
</div>
<div class="actions">
<button id="btn-i2i" class="primary">生成</button>
</div>
<div class="result">
<img id="i2i-img" alt="生成结果" />
<div class="image-actions" id="i2i-actions" style="display:none;">
<button id="btn-save-i2i" class="save-btn">💾 保存图片</button>
</div>
<div class="image-info" id="i2i-info" style="display:none;">
<div class="image-info-header">
<span class="image-info-title">图片信息</span>
<button class="image-info-toggle" data-target="i2i-info-content">展开 ▼</button>
</div>
<div class="image-info-content" id="i2i-info-content">
<div class="image-info-row">
<span class="image-info-label">模型</span>
<span class="image-info-value" id="i2i-model"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">分辨率</span>
<span class="image-info-value" id="i2i-resolution"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">正面提示词</span>
<span class="image-info-value" id="i2i-prompt-text"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">负面提示词</span>
<span class="image-info-value" id="i2i-negative-text"></span>
</div>
</div>
</div>
<div class="saved-path">
<label>保存路径</label>
<input id="i2i-saved" type="text" readonly />
</div>
</div>
</div>
</section>
<!-- 局部重绘 -->
<section id="tab-inpaint" class="tab">
<h2>局部重绘</h2>
<div class="card">
<div class="form-grid">
<label class="full">
<span>正面提示词</span>
<textarea id="inpaint-positive" rows="2" placeholder="输入正面提示词"></textarea>
</label>
<label class="full">
<span>负面提示词</span>
<textarea id="inpaint-negative" rows="2" placeholder="可留空"></textarea>
</label>
<label class="full">
<span>底图</span>
<input id="inpaint-image" type="file" accept="image/*" />
</label>
<label class="full">
<span>遮罩(白色为重绘区域,黑色保留)</span>
<input id="inpaint-mask" type="file" accept="image/*" />
</label>
<label class="switch">
<input id="inpaint-add-original" type="checkbox" />
<span>叠加原图</span>
</label>
<label>
<span>宽度</span>
<input id="inpaint-width" type="number" min="64" step="64" placeholder="留空=768" />
</label>
<label>
<span>高度</span>
<input id="inpaint-height" type="number" min="64" step="64" placeholder="留空=768" />
</label>
<label>
<span>步数</span>
<input id="inpaint-steps" type="number" min="1" step="1" placeholder="留空=配置默认" />
</label>
<label>
<span>CFG 强度</span>
<input id="inpaint-scale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
<label>
<span>采样器</span>
<select id="inpaint-sampler">
<option value="">(配置默认)</option>
<option value="k_euler">k_euler</option>
<option value="k_euler_ancestral">k_euler_ancestral</option>
<option value="k_dpmpp_2s_ancestral">k_dpmpp_2s_ancestral</option>
<option value="k_dpmpp_2m">k_dpmpp_2m</option>
<option value="k_dpmpp_sde">k_dpmpp_sde</option>
<option value="k_dpmpp_2m_sde">k_dpmpp_2m_sde</option>
<option value="ddim_v3">ddim_v3</option>
</select>
</label>
<label>
<span>噪声调度</span>
<select id="inpaint-noise-schedule">
<option value="">(自动)</option>
<option value="native">native</option>
<option value="karras">karras</option>
<option value="exponential">exponential</option>
<option value="polyexponential">polyexponential</option>
</select>
</label>
<label>
<span>随机种子</span>
<input id="inpaint-seed" type="number" step="1" value="-1" />
</label>
<label>
<span>强度</span>
<input id="inpaint-strength" type="number" min="0" max="1" step="0.01" value="0.5" />
</label>
<label>
<span>噪声</span>
<input id="inpaint-noise-val" type="number" min="0" max="1" step="0.01" value="0.0" />
</label>
<label class="switch">
<input id="inpaint-variety" type="checkbox" />
<span>多样性</span>
</label>
<label class="switch">
<input id="inpaint-decrisp" type="checkbox" />
<span>动态阈值</span>
</label>
<label>
<span>CFG 重缩放</span>
<input id="inpaint-cfg-rescale" type="number" min="0" step="0.1" placeholder="留空=配置默认" />
</label>
</div>
<div class="actions">
<button id="btn-inpaint" class="primary">生成</button>
</div>
<div class="result">
<img id="inpaint-img" alt="生成结果" />
<div class="image-actions" id="inpaint-actions" style="display:none;">
<button id="btn-save-inpaint" class="save-btn">💾 保存图片</button>
</div>
<div class="image-info" id="inpaint-info" style="display:none;">
<div class="image-info-header">
<span class="image-info-title">图片信息</span>
<button class="image-info-toggle" data-target="inpaint-info-content">展开 ▼</button>
</div>
<div class="image-info-content" id="inpaint-info-content">
<div class="image-info-row">
<span class="image-info-label">模型</span>
<span class="image-info-value" id="inpaint-model"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">分辨率</span>
<span class="image-info-value" id="inpaint-resolution"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">正面提示词</span>
<span class="image-info-value" id="inpaint-prompt-text"></span>
</div>
<div class="image-info-row">
<span class="image-info-label">负面提示词</span>
<span class="image-info-value" id="inpaint-negative-text"></span>
</div>
</div>
</div>
<div class="saved-path">
<label>保存路径</label>
<input id="inpaint-saved" type="text" readonly />
</div>
</div>
</div>
</section>
</main>
<div id="toast" class="toast"></div>
<div id="loading" class="loading hidden">
<div class="spinner"></div>
<div class="loading-text">处理中...</div>
</div>
<audio id="sound-player" src="" preload="auto"></audio>
<script src="assets/app.js"></script>
</body>
</html>