mirror of
https://github.com/Wx-2025/ST-Amily2-Chat-Optimisation.git
synced 2026-06-06 03:25:51 +00:00
ci: auto build & obfuscate [2026-04-06 00:50:28] (Jenkins #7)
This commit is contained in:
@@ -1,287 +1,287 @@
|
||||
<div class="amily2-header">
|
||||
<div class="additional-features-title">
|
||||
<i class="fas fa-feather-alt"></i> 记忆管理
|
||||
</div>
|
||||
<button id="amily2_back_to_main_from_optimization" class="menu_button secondary small_button interactable">
|
||||
返回主殿 <i class="fas fa-arrow-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<hr class="header-divider" style="margin-top: 5px; margin-bottom: 10px;">
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-cogs"></i> 通用设置</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_enabled"><strong>记忆管理开关</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_ejs_enabled">EJS 预处理 <small style="color: #ffc107;">功能友情提供:Ducker</small></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_ejs_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="sinan-navigation-deck">
|
||||
<button class="sinan-nav-item active" data-tab="api-settings"><i class="fas fa-bolt"></i> API 设置</button>
|
||||
<button class="sinan-nav-item" data-tab="prompt-settings"><i class="fas fa-edit"></i> 提示词指令</button>
|
||||
<button class="sinan-nav-item" data-tab="context-settings"><i class="fas fa-book-open"></i> 上下文设置</button>
|
||||
</div>
|
||||
|
||||
<div class="sinan-content-wrapper">
|
||||
<!-- API Settings Tab -->
|
||||
<div id="sinan-api-settings-tab" class="sinan-tab-pane active">
|
||||
<fieldset class="settings-group">
|
||||
<legend>Jqyh API</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_jqyh_enabled"><strong>启用 Jqyh API</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_jqyh_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_jqyh_content" style="display: none;" class="inline-settings-grid">
|
||||
<label for="amily2_jqyh_api_mode">API 模式</label>
|
||||
<select id="amily2_jqyh_api_mode" class="text_pole">
|
||||
<option value="openai_test">全兼容模式</option>
|
||||
<option value="sillytavern_preset">SillyTavern 预设</option>
|
||||
</select>
|
||||
|
||||
<div id="amily2_jqyh_compatible_config" class="inline-settings-grid" style="grid-column: 1 / -1;">
|
||||
<label for="amily2_jqyh_api_url">API URL</label>
|
||||
<input type="text" id="amily2_jqyh_api_url" class="text_pole" placeholder="例如: https://api.openai.com/v1">
|
||||
<label for="amily2_jqyh_api_key">API Key</label>
|
||||
<input type="password" id="amily2_jqyh_api_key" class="text_pole" placeholder="请输入您的 API Key">
|
||||
<label for="amily2_jqyh_model">模型</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<input type="text" id="amily2_jqyh_model" class="text_pole" placeholder="请先获取模型列表或手动输入">
|
||||
<select id="amily2_jqyh_model_select" class="text_pole" style="display: none;"></select>
|
||||
</div>
|
||||
<div class="jqyh-button-row" style="grid-column: 1 / -1;">
|
||||
<button id="amily2_jqyh_fetch_models" class="menu_button secondary" title="获取模型列表"><i class="fas fa-sync-alt"></i> 获取模型</button>
|
||||
<button id="amily2_jqyh_test_connection" class="menu_button primary"><i class="fas fa-plug"></i> 测试连接</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="amily2_jqyh_preset_config" class="inline-settings-grid" style="display: none; grid-column: 1 / -1;">
|
||||
<label for="amily2_jqyh_tavern_profile">选择酒馆预设</label>
|
||||
<select id="amily2_jqyh_tavern_profile" class="text_pole"></select>
|
||||
</div>
|
||||
|
||||
<label for="amily2_jqyh_max_tokens">最大 Tokens: <span id="amily2_jqyh_max_tokens_value">4000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_jqyh_max_tokens" min="100" max="100000" value="4000">
|
||||
<label for="amily2_jqyh_temperature">温度: <span id="amily2_jqyh_temperature_value">0.7</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_jqyh_temperature" min="0" max="2" value="0.7">
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发 API (第二个LLM)</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_plotOpt_concurrentEnabled"><strong>启用并发调用</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_plotOpt_concurrentEnabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_concurrent_content" style="display: none;" class="inline-settings-grid">
|
||||
<label for="amily2_plotOpt_concurrentApiProvider">API 模式</label>
|
||||
<select id="amily2_plotOpt_concurrentApiProvider" class="text_pole">
|
||||
<option value="openai_test">全兼容模式</option>
|
||||
<option value="openai">OpenAI 兼容</option>
|
||||
</select>
|
||||
<label for="amily2_plotOpt_concurrentApiUrl">API URL</label>
|
||||
<input type="text" id="amily2_plotOpt_concurrentApiUrl" class="text_pole" placeholder="例如: https://api.openai.com/v1">
|
||||
<label for="amily2_plotOpt_concurrentApiKey">API Key</label>
|
||||
<input type="password" id="amily2_plotOpt_concurrentApiKey" class="text_pole" placeholder="请输入您的 API Key">
|
||||
<label for="amily2_plotOpt_concurrentModel">模型</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<input type="text" id="amily2_plotOpt_concurrentModel" class="text_pole" placeholder="请先获取模型列表或手动输入">
|
||||
<select id="amily2_plotOpt_concurrentModel_select" class="text_pole" style="display: none;"></select>
|
||||
</div>
|
||||
<label for="amily2_plotOpt_concurrentMaxTokens">最大 Tokens: <span id="amily2_plotOpt_concurrentMaxTokens_value">8100</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_plotOpt_concurrentMaxTokens" min="100" max="100000" value="8100">
|
||||
<div class="jqyh-button-row" style="grid-column: 1 / -1;">
|
||||
<button id="amily2_plotOpt_concurrent_fetch_models" class="menu_button secondary" title="获取模型列表"><i class="fas fa-sync-alt"></i> 获取模型</button>
|
||||
<button id="amily2_plotOpt_concurrent_test_connection" class="menu_button primary"><i class="fas fa-plug"></i> 测试连接</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发 API 世界书</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_plotOpt_concurrentWorldbookEnabled">启用世界书</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_plotOpt_concurrentWorldbookEnabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_concurrent_worldbook_content" style="display: none;">
|
||||
<div class="control-block-with-switch">
|
||||
<label>世界书来源</label>
|
||||
<div class="radio-group">
|
||||
<input type="radio" id="amily2_plotOpt_concurrentWorldbook_source_character" name="amily2_plotOpt_concurrentWorldbook_source" value="character" checked>
|
||||
<label for="amily2_plotOpt_concurrentWorldbook_source_character">角色</label>
|
||||
<input type="radio" id="amily2_plotOpt_concurrentWorldbook_source_manual" name="amily2_plotOpt_concurrentWorldbook_source" value="manual">
|
||||
<label for="amily2_plotOpt_concurrentWorldbook_source_manual">自定</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_plotOpt_concurrent_worldbook_select_wrapper" style="display: none;">
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_button_wrapper">
|
||||
<label>选择世界书</label>
|
||||
<button id="amily2_plotOpt_concurrent_refresh_worldbooks" class="menu_button" title="刷新世界书列表"><i class="fa-solid fa-sync"></i></button>
|
||||
</div>
|
||||
<div id="amily2_plotOpt_concurrent_worldbook_checkbox_list" class="scrollable-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_plotOpt_concurrentWorldbookCharLimit">世界书最大字符数: <span id="amily2_plotOpt_concurrentWorldbookCharLimit_value">60000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_plotOpt_concurrentWorldbookCharLimit" min="1000" max="200000" value="60000">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- Prompt Settings Tab -->
|
||||
<div id="sinan-prompt-settings-tab" class="sinan-tab-pane">
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发API提示词</legend>
|
||||
<div class="unified-prompt-editor">
|
||||
<label for="amily2_concurrent_prompt_selector">选择编辑的提示词:</label>
|
||||
<select id="amily2_concurrent_prompt_selector" class="text_pole">
|
||||
<option value="main">主系统提示词 (并发)</option>
|
||||
<option value="system">拦截任务详细指令 (并发)</option>
|
||||
</select>
|
||||
<textarea id="amily2_concurrent_prompt_editor" class="text_pole" rows="6"></textarea>
|
||||
<div class="prompt-editor-buttons">
|
||||
<button id="amily2_opt_reset_concurrent_prompt" class="menu_button secondary">恢复当前并发提示词为默认</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>提示词管理</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_prompt_preset_select">加载预设</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<select id="amily2_opt_prompt_preset_select" class="text_pole">
|
||||
<option value="">-- 选择一个预设 --</option>
|
||||
</select>
|
||||
<button id="amily2_opt_import_prompt_presets" class="menu_button" title="导入预设"><i class="fa-solid fa-download"></i></button>
|
||||
<button id="amily2_opt_export_prompt_presets" class="menu_button" title="导出预设"><i class="fa-solid fa-upload"></i></button>
|
||||
<button id="amily2_opt_save_prompt_preset" class="menu_button" title="保存当前提示词为预设"><i class="fa-solid fa-save"></i></button>
|
||||
<button id="amily2_opt_delete_prompt_preset" class="menu_button" title="删除当前选中的预设" style="display: none;"><i class="fa-solid fa-trash-alt"></i></button>
|
||||
<input type="file" id="amily2_opt_preset_file_input" style="display: none;" accept=".json">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>指令编辑</legend>
|
||||
<div class="unified-prompt-editor">
|
||||
<label for="amily2_opt_prompt_selector">选择编辑的提示词:</label>
|
||||
<select id="amily2_opt_prompt_selector" class="text_pole">
|
||||
<option value="main">主系统提示词 (主LLM)</option>
|
||||
<option value="system">拦截任务详细指令 (主LLM)</option>
|
||||
<option value="final_system">最终注入指令</option>
|
||||
</select>
|
||||
<textarea id="amily2_opt_prompt_editor" class="text_pole" rows="8"></textarea>
|
||||
<div class="prompt-editor-buttons">
|
||||
<button id="amily2_opt_reset_main_prompt" class="menu_button secondary">恢复主提示词</button>
|
||||
<button id="amily2_opt_reset_system_prompt" class="menu_button secondary">恢复拦截任务</button>
|
||||
<button id="amily2_opt_reset_final_system_directive" class="menu_button secondary">恢复注入指令</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>匹配替换 (sulv)</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_rate_main">主线剧情 (sulv1)</label>
|
||||
<input id="amily2_opt_rate_main" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_personal">个人线 (sulv2)</label>
|
||||
<input id="amily2_opt_rate_personal" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_erotic">留空 (sulv3)</label>
|
||||
<input id="amily2_opt_rate_erotic" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_cuckold">留空 (sulv4)</label>
|
||||
<input id="amily2_opt_rate_cuckold" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- Context Settings Tab -->
|
||||
<div id="sinan-context-settings-tab" class="sinan-tab-pane">
|
||||
<fieldset class="settings-group">
|
||||
<legend>内容源</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_worldbook_enabled">启用世界书</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_worldbook_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_table_enabled">表格发送目标</label>
|
||||
<select id="amily2_opt_table_enabled" class="text_pole">
|
||||
<option value="disabled">不发送</option>
|
||||
<option value="main">发送给主API</option>
|
||||
<option value="concurrent">发送给并发API</option>
|
||||
</select>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>上下文参数</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_context_limit">上下文条数: <span id="amily2_opt_context_limit_value">10</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_opt_context_limit" min="1" max="50" value="10">
|
||||
<label for="amily2_opt_worldbook_char_limit">世界书最大字符数: <span id="amily2_opt_worldbook_char_limit_value">60000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_opt_worldbook_char_limit" min="1000" max="200000" value="60000">
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>世界书管理</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_new_memory_logic_enabled">启用新记忆逻辑</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_new_memory_logic_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label>世界书来源</label>
|
||||
<div class="radio-group">
|
||||
<input type="radio" id="amily2_opt_worldbook_source_character" name="amily2_opt_worldbook_source" value="character" checked>
|
||||
<label for="amily2_opt_worldbook_source_character">角色</label>
|
||||
<input type="radio" id="amily2_opt_worldbook_source_manual" name="amily2_opt_worldbook_source" value="manual">
|
||||
<label for="amily2_opt_worldbook_source_manual">自定</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_select_wrapper" style="display: none;">
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_button_wrapper">
|
||||
<label>选择世界书</label>
|
||||
<button id="amily2_opt_refresh_worldbooks" class="menu_button" title="刷新世界书列表"><i class="fa-solid fa-sync"></i></button>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_checkbox_list" class="scrollable-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_controls_wrapper">
|
||||
<label>启用的世界书条目</label>
|
||||
<div id="amily2_opt_worldbook_entry_controls">
|
||||
<span id="amily2_opt_worldbook_entry_count"></span>
|
||||
<button id="amily2_opt_worldbook_entry_select_all" class="menu_button">全选</button>
|
||||
<button id="amily2_opt_worldbook_entry_deselect_all" class="menu_button">不选</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_entry_list_container" class="scrollable-container"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="amily2_opt_footer">
|
||||
</div>
|
||||
<div class="amily2-header">
|
||||
<div class="additional-features-title">
|
||||
<i class="fas fa-feather-alt"></i> 记忆管理
|
||||
</div>
|
||||
<button id="amily2_back_to_main_from_optimization" class="menu_button secondary small_button interactable">
|
||||
返回主殿 <i class="fas fa-arrow-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<hr class="header-divider" style="margin-top: 5px; margin-bottom: 10px;">
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-cogs"></i> 通用设置</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_enabled"><strong>记忆管理开关</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_ejs_enabled">EJS 预处理 <small style="color: #ffc107;">功能友情提供:Ducker</small></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_ejs_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="sinan-navigation-deck">
|
||||
<button class="sinan-nav-item active" data-tab="api-settings"><i class="fas fa-bolt"></i> API 设置</button>
|
||||
<button class="sinan-nav-item" data-tab="prompt-settings"><i class="fas fa-edit"></i> 提示词指令</button>
|
||||
<button class="sinan-nav-item" data-tab="context-settings"><i class="fas fa-book-open"></i> 上下文设置</button>
|
||||
</div>
|
||||
|
||||
<div class="sinan-content-wrapper">
|
||||
<!-- API Settings Tab -->
|
||||
<div id="sinan-api-settings-tab" class="sinan-tab-pane active">
|
||||
<fieldset class="settings-group">
|
||||
<legend>Jqyh API</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_jqyh_enabled"><strong>启用 Jqyh API</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_jqyh_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_jqyh_content" style="display: none;" class="inline-settings-grid">
|
||||
<label for="amily2_jqyh_api_mode">API 模式</label>
|
||||
<select id="amily2_jqyh_api_mode" class="text_pole">
|
||||
<option value="openai_test">全兼容模式</option>
|
||||
<option value="sillytavern_preset">SillyTavern 预设</option>
|
||||
</select>
|
||||
|
||||
<div id="amily2_jqyh_compatible_config" class="inline-settings-grid" style="grid-column: 1 / -1;">
|
||||
<label for="amily2_jqyh_api_url">API URL</label>
|
||||
<input type="text" id="amily2_jqyh_api_url" class="text_pole" placeholder="例如: https://api.openai.com/v1">
|
||||
<label for="amily2_jqyh_api_key">API Key</label>
|
||||
<input type="password" id="amily2_jqyh_api_key" class="text_pole" placeholder="请输入您的 API Key">
|
||||
<label for="amily2_jqyh_model">模型</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<input type="text" id="amily2_jqyh_model" class="text_pole" placeholder="请先获取模型列表或手动输入">
|
||||
<select id="amily2_jqyh_model_select" class="text_pole" style="display: none;"></select>
|
||||
</div>
|
||||
<div class="jqyh-button-row" style="grid-column: 1 / -1;">
|
||||
<button id="amily2_jqyh_fetch_models" class="menu_button secondary" title="获取模型列表"><i class="fas fa-sync-alt"></i> 获取模型</button>
|
||||
<button id="amily2_jqyh_test_connection" class="menu_button primary"><i class="fas fa-plug"></i> 测试连接</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="amily2_jqyh_preset_config" class="inline-settings-grid" style="display: none; grid-column: 1 / -1;">
|
||||
<label for="amily2_jqyh_tavern_profile">选择酒馆预设</label>
|
||||
<select id="amily2_jqyh_tavern_profile" class="text_pole"></select>
|
||||
</div>
|
||||
|
||||
<label for="amily2_jqyh_max_tokens">最大 Tokens: <span id="amily2_jqyh_max_tokens_value">4000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_jqyh_max_tokens" min="100" max="100000" value="4000">
|
||||
<label for="amily2_jqyh_temperature">温度: <span id="amily2_jqyh_temperature_value">0.7</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_jqyh_temperature" min="0" max="2" value="0.7">
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发 API (第二个LLM)</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_plotOpt_concurrentEnabled"><strong>启用并发调用</strong></label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_plotOpt_concurrentEnabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_concurrent_content" style="display: none;" class="inline-settings-grid">
|
||||
<label for="amily2_plotOpt_concurrentApiProvider">API 模式</label>
|
||||
<select id="amily2_plotOpt_concurrentApiProvider" class="text_pole">
|
||||
<option value="openai_test">全兼容模式</option>
|
||||
<option value="openai">OpenAI 兼容</option>
|
||||
</select>
|
||||
<label for="amily2_plotOpt_concurrentApiUrl">API URL</label>
|
||||
<input type="text" id="amily2_plotOpt_concurrentApiUrl" class="text_pole" placeholder="例如: https://api.openai.com/v1">
|
||||
<label for="amily2_plotOpt_concurrentApiKey">API Key</label>
|
||||
<input type="password" id="amily2_plotOpt_concurrentApiKey" class="text_pole" placeholder="请输入您的 API Key">
|
||||
<label for="amily2_plotOpt_concurrentModel">模型</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<input type="text" id="amily2_plotOpt_concurrentModel" class="text_pole" placeholder="请先获取模型列表或手动输入">
|
||||
<select id="amily2_plotOpt_concurrentModel_select" class="text_pole" style="display: none;"></select>
|
||||
</div>
|
||||
<label for="amily2_plotOpt_concurrentMaxTokens">最大 Tokens: <span id="amily2_plotOpt_concurrentMaxTokens_value">8100</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_plotOpt_concurrentMaxTokens" min="100" max="100000" value="8100">
|
||||
<div class="jqyh-button-row" style="grid-column: 1 / -1;">
|
||||
<button id="amily2_plotOpt_concurrent_fetch_models" class="menu_button secondary" title="获取模型列表"><i class="fas fa-sync-alt"></i> 获取模型</button>
|
||||
<button id="amily2_plotOpt_concurrent_test_connection" class="menu_button primary"><i class="fas fa-plug"></i> 测试连接</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发 API 世界书</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_plotOpt_concurrentWorldbookEnabled">启用世界书</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_plotOpt_concurrentWorldbookEnabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div id="amily2_concurrent_worldbook_content" style="display: none;">
|
||||
<div class="control-block-with-switch">
|
||||
<label>世界书来源</label>
|
||||
<div class="radio-group">
|
||||
<input type="radio" id="amily2_plotOpt_concurrentWorldbook_source_character" name="amily2_plotOpt_concurrentWorldbook_source" value="character" checked>
|
||||
<label for="amily2_plotOpt_concurrentWorldbook_source_character">角色</label>
|
||||
<input type="radio" id="amily2_plotOpt_concurrentWorldbook_source_manual" name="amily2_plotOpt_concurrentWorldbook_source" value="manual">
|
||||
<label for="amily2_plotOpt_concurrentWorldbook_source_manual">自定</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_plotOpt_concurrent_worldbook_select_wrapper" style="display: none;">
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_button_wrapper">
|
||||
<label>选择世界书</label>
|
||||
<button id="amily2_plotOpt_concurrent_refresh_worldbooks" class="menu_button" title="刷新世界书列表"><i class="fa-solid fa-sync"></i></button>
|
||||
</div>
|
||||
<div id="amily2_plotOpt_concurrent_worldbook_checkbox_list" class="scrollable-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_plotOpt_concurrentWorldbookCharLimit">世界书最大字符数: <span id="amily2_plotOpt_concurrentWorldbookCharLimit_value">60000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_plotOpt_concurrentWorldbookCharLimit" min="1000" max="200000" value="60000">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- Prompt Settings Tab -->
|
||||
<div id="sinan-prompt-settings-tab" class="sinan-tab-pane">
|
||||
<fieldset class="settings-group">
|
||||
<legend>并发API提示词</legend>
|
||||
<div class="unified-prompt-editor">
|
||||
<label for="amily2_concurrent_prompt_selector">选择编辑的提示词:</label>
|
||||
<select id="amily2_concurrent_prompt_selector" class="text_pole">
|
||||
<option value="main">主系统提示词 (并发)</option>
|
||||
<option value="system">拦截任务详细指令 (并发)</option>
|
||||
</select>
|
||||
<textarea id="amily2_concurrent_prompt_editor" class="text_pole" rows="6"></textarea>
|
||||
<div class="prompt-editor-buttons">
|
||||
<button id="amily2_opt_reset_concurrent_prompt" class="menu_button secondary">恢复当前并发提示词为默认</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>提示词管理</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_prompt_preset_select">加载预设</label>
|
||||
<div class="amily2_opt_preset_selector_wrapper">
|
||||
<select id="amily2_opt_prompt_preset_select" class="text_pole">
|
||||
<option value="">-- 选择一个预设 --</option>
|
||||
</select>
|
||||
<button id="amily2_opt_import_prompt_presets" class="menu_button" title="导入预设"><i class="fa-solid fa-download"></i></button>
|
||||
<button id="amily2_opt_export_prompt_presets" class="menu_button" title="导出预设"><i class="fa-solid fa-upload"></i></button>
|
||||
<button id="amily2_opt_save_prompt_preset" class="menu_button" title="保存当前提示词为预设"><i class="fa-solid fa-save"></i></button>
|
||||
<button id="amily2_opt_delete_prompt_preset" class="menu_button" title="删除当前选中的预设" style="display: none;"><i class="fa-solid fa-trash-alt"></i></button>
|
||||
<input type="file" id="amily2_opt_preset_file_input" style="display: none;" accept=".json">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>指令编辑</legend>
|
||||
<div class="unified-prompt-editor">
|
||||
<label for="amily2_opt_prompt_selector">选择编辑的提示词:</label>
|
||||
<select id="amily2_opt_prompt_selector" class="text_pole">
|
||||
<option value="main">主系统提示词 (主LLM)</option>
|
||||
<option value="system">拦截任务详细指令 (主LLM)</option>
|
||||
<option value="final_system">最终注入指令</option>
|
||||
</select>
|
||||
<textarea id="amily2_opt_prompt_editor" class="text_pole" rows="8"></textarea>
|
||||
<div class="prompt-editor-buttons">
|
||||
<button id="amily2_opt_reset_main_prompt" class="menu_button secondary">恢复主提示词</button>
|
||||
<button id="amily2_opt_reset_system_prompt" class="menu_button secondary">恢复拦截任务</button>
|
||||
<button id="amily2_opt_reset_final_system_directive" class="menu_button secondary">恢复注入指令</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>匹配替换 (sulv)</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_rate_main">主线剧情 (sulv1)</label>
|
||||
<input id="amily2_opt_rate_main" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_personal">个人线 (sulv2)</label>
|
||||
<input id="amily2_opt_rate_personal" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_erotic">留空 (sulv3)</label>
|
||||
<input id="amily2_opt_rate_erotic" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
<label for="amily2_opt_rate_cuckold">留空 (sulv4)</label>
|
||||
<input id="amily2_opt_rate_cuckold" type="number" class="text_pole" step="0.05" value="1.0">
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- Context Settings Tab -->
|
||||
<div id="sinan-context-settings-tab" class="sinan-tab-pane">
|
||||
<fieldset class="settings-group">
|
||||
<legend>内容源</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_worldbook_enabled">启用世界书</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_worldbook_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_table_enabled">表格发送目标</label>
|
||||
<select id="amily2_opt_table_enabled" class="text_pole">
|
||||
<option value="disabled">不发送</option>
|
||||
<option value="main">发送给主API</option>
|
||||
<option value="concurrent">发送给并发API</option>
|
||||
</select>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>上下文参数</legend>
|
||||
<div class="inline-settings-grid">
|
||||
<label for="amily2_opt_context_limit">上下文条数: <span id="amily2_opt_context_limit_value">10</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_opt_context_limit" min="1" max="50" value="10">
|
||||
<label for="amily2_opt_worldbook_char_limit">世界书最大字符数: <span id="amily2_opt_worldbook_char_limit_value">60000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_opt_worldbook_char_limit" min="1000" max="200000" value="60000">
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend>世界书管理</legend>
|
||||
<div class="control-block-with-switch">
|
||||
<label for="amily2_opt_new_memory_logic_enabled">启用新记忆逻辑</label>
|
||||
<label class="toggle-switch">
|
||||
<input id="amily2_opt_new_memory_logic_enabled" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-block-with-switch">
|
||||
<label>世界书来源</label>
|
||||
<div class="radio-group">
|
||||
<input type="radio" id="amily2_opt_worldbook_source_character" name="amily2_opt_worldbook_source" value="character" checked>
|
||||
<label for="amily2_opt_worldbook_source_character">角色</label>
|
||||
<input type="radio" id="amily2_opt_worldbook_source_manual" name="amily2_opt_worldbook_source" value="manual">
|
||||
<label for="amily2_opt_worldbook_source_manual">自定</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_select_wrapper" style="display: none;">
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_button_wrapper">
|
||||
<label>选择世界书</label>
|
||||
<button id="amily2_opt_refresh_worldbooks" class="menu_button" title="刷新世界书列表"><i class="fa-solid fa-sync"></i></button>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_checkbox_list" class="scrollable-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="worldbook-column">
|
||||
<div class="amily2_opt_label_with_controls_wrapper">
|
||||
<label>启用的世界书条目</label>
|
||||
<div id="amily2_opt_worldbook_entry_controls">
|
||||
<span id="amily2_opt_worldbook_entry_count"></span>
|
||||
<button id="amily2_opt_worldbook_entry_select_all" class="menu_button">全选</button>
|
||||
<button id="amily2_opt_worldbook_entry_deselect_all" class="menu_button">不选</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="amily2_opt_worldbook_entry_list_container" class="scrollable-container"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="amily2_opt_footer">
|
||||
</div>
|
||||
|
||||
@@ -181,15 +181,6 @@
|
||||
</div>
|
||||
|
||||
<!-- 通用参数配置 -->
|
||||
<div class="control-group">
|
||||
<label for="amily2_ngms_max_tokens">最大令牌数:<span id="amily2_ngms_max_tokens_value">4000</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_ngms_max_tokens" min="100" max="100000" value="4000" />
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="amily2_ngms_temperature">温度:<span id="amily2_ngms_temperature_value">0.7</span></label>
|
||||
<input type="number" class="text_pole" id="amily2_ngms_temperature" min="0" max="2" value="0.7" />
|
||||
</div>
|
||||
|
||||
<div class="control-group" style="display: flex; align-items: center; gap: 10px;">
|
||||
<label for="amily2_ngms_fakestream_enabled" style="margin-bottom: 0;">启用流式支持 (防超时)</label>
|
||||
<input type="checkbox" id="amily2_ngms_fakestream_enabled" style="width: auto;" />
|
||||
@@ -315,6 +306,11 @@
|
||||
<label for="historiography_retention_count" title="保留最近的对话层数不参与自动总结。">保留层数:</label>
|
||||
<input id="historiography_retention_count" type="number" min="0" class="text_pole" style="width: 70px;" placeholder="5">
|
||||
</div>
|
||||
|
||||
<div class="auto-control-pair">
|
||||
<label for="historiography_max_retries" title="总结失败时的自动重试次数。">重试次数:</label>
|
||||
<input id="historiography_max_retries" type="number" min="0" max="10" class="text_pole" style="width: 70px;" placeholder="2">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -243,6 +243,13 @@
|
||||
<input type="number" id="secondary-filler-buffer" min="0" max="10" step="1" value="0" class="text_pole" style="width: 80px; margin-top: 5px;">
|
||||
<small class="notes" style="margin-top: 5px; display: block;">始终保留不填表的最新消息数量 (缓冲防抖)。</small>
|
||||
</div>
|
||||
|
||||
<!-- 最大重试次数 -->
|
||||
<div class="control-block-with-switch" style="margin-bottom: 10px; flex-direction: column; align-items: flex-start;">
|
||||
<label for="secondary-filler-max-retries">最大重试次数</label>
|
||||
<input type="number" id="secondary-filler-max-retries" min="0" max="10" step="1" value="2" class="text_pole" style="width: 80px; margin-top: 5px;">
|
||||
<small class="notes" style="margin-top: 5px; display: block;">分步填表失败时的自动重试次数 (0 = 不重试)。</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="table-independent-rules-container" class="control-block-with-switch" style="margin-bottom: 10px; display: none; flex-direction: column; align-items: flex-start; gap: 8px;">
|
||||
@@ -326,15 +333,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="amily2_opt_settings_block" style="margin-bottom: 10px;">
|
||||
<label for="nccs-max-tokens">最大Token数: <span id="nccs-max-tokens-value">2000</span></label>
|
||||
<input type="number" class="text_pole" id="nccs-max-tokens" min="100" max="100000" value="2000">
|
||||
</div>
|
||||
|
||||
<div class="amily2_opt_settings_block" style="margin-bottom: 10px;">
|
||||
<label for="nccs-temperature">Temperature: <span id="nccs-temperature-value">0.7</span></label>
|
||||
<input type="number" class="text_pole" id="nccs-temperature" min="0" max="2" value="0.7">
|
||||
</div>
|
||||
|
||||
<div class="amily2_opt_settings_block" style="margin-bottom: 10px;">
|
||||
<label for="nccs-api-fakestream-enabled">启用流式支持: </label>
|
||||
|
||||
@@ -1,327 +1,334 @@
|
||||
<style>
|
||||
.amily2-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
.header-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.header-column.center {
|
||||
gap: 0px;
|
||||
}
|
||||
.side-button {
|
||||
writing-mode: vertical-rl; /* 【V59.0】恢复垂直模式 */
|
||||
text-orientation: mixed;
|
||||
height: 140px;
|
||||
width: 50px;
|
||||
padding: 10px 5px;
|
||||
text-align: center;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.side-button > i {
|
||||
writing-mode: horizontal-tb;
|
||||
display: block;
|
||||
margin: 0 auto 10px auto;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
#amily2_open_tutorial, #amily2_update_button_new {
|
||||
writing-mode: horizontal-tb !important;
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
padding: 5px 10px !important;
|
||||
line-height: normal !important;
|
||||
}
|
||||
#amily2_update_button_new {
|
||||
display: none;
|
||||
background-color: #4CAF50 !important;
|
||||
}
|
||||
|
||||
.version-info-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px 12px;
|
||||
background-color: rgba(255, 255, 255, 0.03);
|
||||
border-radius: 5px;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.version-info-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
color: #adb6e6;
|
||||
}
|
||||
|
||||
.version-label {
|
||||
font-size: 10px;
|
||||
opacity: 0.7;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.version-number {
|
||||
font-weight: bold;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.version-current .version-number {
|
||||
color: #68b7ff;
|
||||
}
|
||||
|
||||
.version-latest .version-number {
|
||||
color: #4CAF50;
|
||||
}
|
||||
|
||||
.version-latest.has-update .version-number {
|
||||
color: #ff6b6b;
|
||||
animation: glow 2s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes glow {
|
||||
from { text-shadow: 0 0 5px rgba(255, 107, 107, 0.5); }
|
||||
to { text-shadow: 0 0 10px rgba(255, 107, 107, 0.8), 0 0 15px rgba(255, 107, 107, 0.3); }
|
||||
}
|
||||
|
||||
.collapsible-legend {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
.collapsible-legend:hover {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
.collapse-icon {
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
.collapsible-content {
|
||||
padding-top: 10px;
|
||||
}
|
||||
.disclaimer-box {
|
||||
margin-top: 15px;
|
||||
padding: 12px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.disclaimer-emo {
|
||||
font-style: italic;
|
||||
color: #adb6e6;
|
||||
text-align: center;
|
||||
margin-bottom: 10px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.disclaimer-text {
|
||||
font-size: 12px;
|
||||
color: #c0c0c0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.disclaimer-text strong {
|
||||
color: #ffc107;
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
</style>
|
||||
<div class="flex-container">
|
||||
<div id="amily2_chat_optimiser">
|
||||
|
||||
<div id="auth_panel" style="display: none;">
|
||||
<div class="auth-header">
|
||||
<div class="auth-title"><i class="fas fa-crown"></i> Amily2号优化助手 - 授权验证</div>
|
||||
<div class="auth-subtitle">解锁完整功能 享受智能优化体验</div>
|
||||
<div id="expiry_info"></div>
|
||||
</div>
|
||||
<div class="auth-code-input">
|
||||
<input type="password" id="amily2_auth_code" placeholder="输入授权码..."><button id="auth_submit">验证</button>
|
||||
</div>
|
||||
<div class="auth-daily-code">
|
||||
<span>今日授权码:</span>
|
||||
<span id="amily2_daily_code_display" class="daily-code">正在生成...</span>
|
||||
<button id="amily2_copy_daily_code" class="copy-button" title="复制授权码"><i class="fas fa-copy"></i></button>
|
||||
</div>
|
||||
<div class="auth-footer">声明:完全免费,禁止商用。仅供娱乐,严禁用于任何违法行为,且任何使用行为与作者无关。</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="plugin-features" style="display: none;">
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
|
||||
<span><i class="fas fa-cog"></i> Amily中枢</span>
|
||||
|
||||
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<button id="amily2_reset_auth" class="menu_button small_button interactable" title="清除授权">
|
||||
<i class="fas fa-sign-out-alt"></i>
|
||||
</button>
|
||||
<button id="amily2_open_tutorial" class="menu_button small_button interactable" title="查看使用教程">
|
||||
教程
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="disclaimer-box">
|
||||
<p class="disclaimer-emo">“我也想过琴棋书画诗酒花,奈何生活只有柴米油盐酱醋茶。”</p>
|
||||
<p class="disclaimer-text">
|
||||
<strong>免责声明:</strong>本插件仅供个人学习与技术交流使用,严禁用于任何商业目的或非法活动。使用者需自行承担因使用本插件而产生的一切风险与法律责任,开发者对此不承担任何责任。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-bullhorn"></i> 作者留言</legend>
|
||||
<div id="amily2_message_board" style="display: flex; justify-content: center; align-items: center; padding: 8px; background-color: rgba(255, 255, 255, 0.05); border-radius: 5px; min-height: 40px;">
|
||||
<div id="amily2_message_content" style="color: #adb6e6; font-size: 13px; line-height: 1.5; text-align: center;"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-code-branch"></i> 版本信息</legend>
|
||||
<div class="version-info-container">
|
||||
<div class="version-info-item version-current">
|
||||
<div class="version-label">当前版本</div>
|
||||
<div id="amily2_current_version" class="version-number">加载中...</div>
|
||||
</div>
|
||||
<div class="version-info-item version-center" style="display: flex; flex-direction: column; align-items: center; gap: 5px;">
|
||||
<div style="position: relative;">
|
||||
<button id="amily2_update_button" class="menu_button small_button interactable" title="查看更新日志">
|
||||
<i class="fas fa-bell"></i>
|
||||
</button>
|
||||
<div id="amily2_update_indicator" class="update-indicator" style="display: none;"></div>
|
||||
</div>
|
||||
<button id="amily2_update_button_new" class="menu_button small_button interactable" title="查看更新日志">更新</button>
|
||||
</div>
|
||||
<div class="version-info-item version-latest">
|
||||
<div class="version-label">最新版本</div>
|
||||
<div id="amily2_latest_version" class="version-number">检查中...</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-plus-circle"></i> 记忆增强</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_additional_features" class="menu_button wide_button"><i class="fas fa-landmark-dome"></i> 总结模块</button>
|
||||
<button id="amily2_open_rag_palace" class="menu_button wide_button"><i class="fas fa-brain"></i> 向量模块</button>
|
||||
<button id="amily2_open_memorisation_forms" class="menu_button wide_button"><i class="fas fa-table"></i> 表格模块</button>
|
||||
<button id="amily2_open_character_world_book" class="menu_button wide_button"><i class="fa-solid fa-book-atlas"></i> 角色世界</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-puzzle-piece"></i> 附加功能</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_plot_optimization" class="menu_button wide_button"><i class="fas fa-feather-alt"></i> 记忆管理</button>
|
||||
<button id="amily2_open_text_optimization" class="menu_button wide_button"><i class="fas fa-cogs"></i> 正文优化</button>
|
||||
<button id="amily2_open_world_editor" class="menu_button wide_button"><i class="fas fa-globe"></i> 世界编辑</button>
|
||||
<button id="amily2_open_glossary" class="menu_button wide_button"><i class="fas fa-book"></i> 术语表单</button>
|
||||
<button id="amily2_open_renderer" class="menu_button wide_button"><i class="fas fa-paint-brush"></i> 前端渲染</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-flask"></i> 内测功能</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_super_memory" class="menu_button wide_button"><i class="fas fa-brain"></i> 超级记忆</button>
|
||||
<button id="amily2_open_auto_char_card" class="menu_button wide_button"><i class="fas fa-robot"></i> 一键生卡</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<hr class="header-divider">
|
||||
|
||||
|
||||
|
||||
<fieldset class="settings-group collapsible">
|
||||
<legend class="collapsible-legend"><i class="fas fa-palette"></i> 界面定制 <i class="fas fa-chevron-down collapse-icon"></i></legend>
|
||||
<div class="collapsible-content">
|
||||
<div class="amily2_settings_block">
|
||||
<label>帝国徽记位置:</label>
|
||||
<div class="radio-toggle-group">
|
||||
<input type="radio" id="amily2_icon_location_topbar" name="amily2_icon_location" value="topbar">
|
||||
<label for="amily2_icon_location_topbar">驻扎顶栏</label>
|
||||
<input type="radio" id="amily2_icon_location_extensions" name="amily2_icon_location" value="extensions">
|
||||
<label for="amily2_icon_location_extensions">收归扩展</label>
|
||||
</div>
|
||||
<small class="notes">为解决部分移动端UI溢出问题。更改后将立即生效。</small>
|
||||
</div>
|
||||
<div class="amily2_settings_block color-controls-container">
|
||||
<div class="color-picker-group">
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_bg_color">背景色:</label>
|
||||
<input type="color" id="amily2_bg_color" value="#1e1e1e">
|
||||
</div>
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_button_color">按钮色:</label>
|
||||
<input type="color" id="amily2_button_color" value="#4a4a4a">
|
||||
</div>
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_text_color">文字颜色:</label>
|
||||
<input type="color" id="amily2_text_color" value="#ffffff">
|
||||
</div>
|
||||
</div>
|
||||
<button id="amily2_restore_colors" class="menu_button small_button">默认</button>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_bg_opacity">背景透明度: <span id="amily2_bg_opacity_value">0</span></label>
|
||||
<input type="range" id="amily2_bg_opacity" min="0" max="1" step="0.01" value="0">
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label>自定义背景图:</label>
|
||||
<div style="display: flex; gap: 10px; align-items: center;">
|
||||
<label for="amily2_custom_bg_image" class="menu_button wide_button" style="cursor: pointer; text-align: center; flex-grow: 1;">
|
||||
<i class="fas fa-upload"></i> 上传图片
|
||||
</label>
|
||||
<input type="file" id="amily2_custom_bg_image" accept="image/*" style="display: none;">
|
||||
<button id="amily2_restore_bg_image" class="menu_button small_button">默认</button>
|
||||
<small class="notes">选择一张图片作为背景。推荐使用小于5MB的图片。</small>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<legend><i class="fas fa-tools"></i> 诊断与操作</legend>
|
||||
<div class="amily2_settings_block button-pair">
|
||||
<button class="menu_button primary interactable" id="amily2_test"><i class="fas fa-search"></i> 测试检查</button>
|
||||
<button class="menu_button accent interactable" id="amily2_fix_now"><i class="fas fa-magic"></i> 立即修复</button>
|
||||
</div>
|
||||
<div class="amily2_settings_block" style="display: flex; flex-direction: row; gap: 10px; align-items: center; margin-top: 10px; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 15px;">
|
||||
<div style="position: relative; flex-shrink: 0;">
|
||||
<input type="number" id="amily2_jump_to_message_id" class="text_pole" placeholder="楼层" style="width: 100px !important; padding-left: 30px;">
|
||||
<i class="fas fa-hashtag" style="position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: rgba(255,255,255,0.5);"></i>
|
||||
</div>
|
||||
<button id="amily2_jump_to_message_btn" class="menu_button interactable" style="flex-grow: 1; white-space: nowrap; display: flex; align-items: center; justify-content: center; gap: 8px;">
|
||||
<i class="fas fa-share"></i> <span>跳转到楼层</span>
|
||||
</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div id="amily2_hidden_prompts" style="display:none;">
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_main_prompt" class="text_pole" rows="6"></textarea>
|
||||
<button id="save_main_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_system_prompt" class="text_pole" rows="8"></textarea>
|
||||
<button id="save_system_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_output_format_prompt" class="text_pole" rows="4"></textarea>
|
||||
<button id="save_output_format_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
.amily2-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
.header-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
.header-column.center {
|
||||
gap: 0px;
|
||||
}
|
||||
.side-button {
|
||||
writing-mode: vertical-rl; /* 【V59.0】恢复垂直模式 */
|
||||
text-orientation: mixed;
|
||||
height: 140px;
|
||||
width: 50px;
|
||||
padding: 10px 5px;
|
||||
text-align: center;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.side-button > i {
|
||||
writing-mode: horizontal-tb;
|
||||
display: block;
|
||||
margin: 0 auto 10px auto;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
#amily2_open_tutorial, #amily2_update_button_new {
|
||||
writing-mode: horizontal-tb !important;
|
||||
height: auto !important;
|
||||
width: auto !important;
|
||||
padding: 5px 10px !important;
|
||||
line-height: normal !important;
|
||||
}
|
||||
#amily2_update_button_new {
|
||||
display: none;
|
||||
background-color: #4CAF50 !important;
|
||||
}
|
||||
|
||||
.version-info-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px 12px;
|
||||
background-color: rgba(255, 255, 255, 0.03);
|
||||
border-radius: 5px;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.version-info-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
color: #adb6e6;
|
||||
}
|
||||
|
||||
.version-label {
|
||||
font-size: 10px;
|
||||
opacity: 0.7;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.version-number {
|
||||
font-weight: bold;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.version-current .version-number {
|
||||
color: #68b7ff;
|
||||
}
|
||||
|
||||
.version-latest .version-number {
|
||||
color: #4CAF50;
|
||||
}
|
||||
|
||||
.version-latest.has-update .version-number {
|
||||
color: #ff6b6b;
|
||||
animation: glow 2s ease-in-out infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes glow {
|
||||
from { text-shadow: 0 0 5px rgba(255, 107, 107, 0.5); }
|
||||
to { text-shadow: 0 0 10px rgba(255, 107, 107, 0.8), 0 0 15px rgba(255, 107, 107, 0.3); }
|
||||
}
|
||||
|
||||
.collapsible-legend {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
.collapsible-legend:hover {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
.collapse-icon {
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
.collapsible-content {
|
||||
padding-top: 10px;
|
||||
}
|
||||
.disclaimer-box {
|
||||
margin-top: 15px;
|
||||
padding: 12px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.disclaimer-emo {
|
||||
font-style: italic;
|
||||
color: #adb6e6;
|
||||
text-align: center;
|
||||
margin-bottom: 10px;
|
||||
font-size: 13px;
|
||||
}
|
||||
.disclaimer-text {
|
||||
font-size: 12px;
|
||||
color: #c0c0c0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.disclaimer-text strong {
|
||||
color: #ffc107;
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
</style>
|
||||
<div class="flex-container">
|
||||
<div id="amily2_chat_optimiser">
|
||||
|
||||
<div id="auth_panel" style="display: none;">
|
||||
<div class="auth-header">
|
||||
<div class="auth-title"><i class="fas fa-crown"></i> Amily2号优化助手 - 授权验证</div>
|
||||
<div class="auth-subtitle">解锁完整功能 享受智能优化体验</div>
|
||||
<div id="expiry_info"></div>
|
||||
</div>
|
||||
<div class="auth-code-input">
|
||||
<input type="password" id="amily2_auth_code" placeholder="输入授权码..."><button id="auth_submit">验证</button>
|
||||
</div>
|
||||
<div class="auth-daily-code">
|
||||
<span>今日授权码:</span>
|
||||
<span id="amily2_daily_code_display" class="daily-code">正在生成...</span>
|
||||
<button id="amily2_copy_daily_code" class="copy-button" title="复制授权码"><i class="fas fa-copy"></i></button>
|
||||
</div>
|
||||
<div class="auth-footer">声明:完全免费,禁止商用。仅供娱乐,严禁用于任何违法行为,且任何使用行为与作者无关。</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="plugin-features" style="display: none;">
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
|
||||
<span><i class="fas fa-cog"></i> Amily中枢</span>
|
||||
|
||||
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<button id="amily2_reset_auth" class="menu_button small_button interactable" title="清除授权">
|
||||
<i class="fas fa-sign-out-alt"></i>
|
||||
</button>
|
||||
<button id="amily2_open_tutorial" class="menu_button small_button interactable" title="查看使用教程">
|
||||
教程
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</legend>
|
||||
</fieldset>
|
||||
|
||||
<div class="disclaimer-box">
|
||||
<p class="disclaimer-emo">“我也想过琴棋书画诗酒花,奈何生活只有柴米油盐酱醋茶。”</p>
|
||||
<p class="disclaimer-text">
|
||||
<strong>免责声明:</strong>本插件仅供个人学习与技术交流使用,严禁用于任何商业目的或非法活动。使用者需自行承担因使用本插件而产生的一切风险与法律责任,开发者对此不承担任何责任。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-bullhorn"></i> 作者留言</legend>
|
||||
<div id="amily2_message_board" style="display: flex; justify-content: center; align-items: center; padding: 8px; background-color: rgba(255, 255, 255, 0.05); border-radius: 5px; min-height: 40px;">
|
||||
<div id="amily2_message_content" style="color: #adb6e6; font-size: 13px; line-height: 1.5; text-align: center;"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-code-branch"></i> 版本信息</legend>
|
||||
<div class="version-info-container">
|
||||
<div class="version-info-item version-current">
|
||||
<div class="version-label">当前版本</div>
|
||||
<div id="amily2_current_version" class="version-number">加载中...</div>
|
||||
</div>
|
||||
<div class="version-info-item version-center" style="display: flex; flex-direction: column; align-items: center; gap: 5px;">
|
||||
<div style="position: relative;">
|
||||
<button id="amily2_update_button" class="menu_button small_button interactable" title="查看更新日志">
|
||||
<i class="fas fa-bell"></i>
|
||||
</button>
|
||||
<div id="amily2_update_indicator" class="update-indicator" style="display: none;"></div>
|
||||
</div>
|
||||
<button id="amily2_update_button_new" class="menu_button small_button interactable" title="查看更新日志">更新</button>
|
||||
</div>
|
||||
<div class="version-info-item version-latest">
|
||||
<div class="version-label">最新版本</div>
|
||||
<div id="amily2_latest_version" class="version-number">检查中...</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-plus-circle"></i> 记忆增强</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_additional_features" class="menu_button wide_button"><i class="fas fa-landmark-dome"></i> 总结模块</button>
|
||||
<button id="amily2_open_rag_palace" class="menu_button wide_button"><i class="fas fa-brain"></i> 向量模块</button>
|
||||
<button id="amily2_open_memorisation_forms" class="menu_button wide_button"><i class="fas fa-table"></i> 表格模块</button>
|
||||
<button id="amily2_open_character_world_book" class="menu_button wide_button"><i class="fa-solid fa-book-atlas"></i> 角色世界</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-puzzle-piece"></i> 附加功能</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_plot_optimization" class="menu_button wide_button"><i class="fas fa-feather-alt"></i> 记忆管理</button>
|
||||
<button id="amily2_open_text_optimization" class="menu_button wide_button"><i class="fas fa-cogs"></i> 正文优化</button>
|
||||
<button id="amily2_open_world_editor" class="menu_button wide_button"><i class="fas fa-globe"></i> 世界编辑</button>
|
||||
<button id="amily2_open_glossary" class="menu_button wide_button"><i class="fas fa-book"></i> 术语表单</button>
|
||||
<button id="amily2_open_renderer" class="menu_button wide_button"><i class="fas fa-paint-brush"></i> 前端渲染</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-flask"></i> 内测功能</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_super_memory" class="menu_button wide_button"><i class="fas fa-brain"></i> 超级记忆</button>
|
||||
<button id="amily2_open_auto_char_card" class="menu_button wide_button"><i class="fas fa-robot"></i> 一键生卡</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-shield-alt"></i> 系统配置</legend>
|
||||
<div class="button-group" style="display: flex; justify-content: space-between; gap: 8px;">
|
||||
<button id="amily2_open_api_config" class="menu_button wide_button"><i class="fas fa-key"></i> API 连接配置</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<hr class="header-divider">
|
||||
|
||||
|
||||
|
||||
<fieldset class="settings-group collapsible">
|
||||
<legend class="collapsible-legend"><i class="fas fa-palette"></i> 界面定制 <i class="fas fa-chevron-down collapse-icon"></i></legend>
|
||||
<div class="collapsible-content">
|
||||
<div class="amily2_settings_block">
|
||||
<label>帝国徽记位置:</label>
|
||||
<div class="radio-toggle-group">
|
||||
<input type="radio" id="amily2_icon_location_topbar" name="amily2_icon_location" value="topbar">
|
||||
<label for="amily2_icon_location_topbar">驻扎顶栏</label>
|
||||
<input type="radio" id="amily2_icon_location_extensions" name="amily2_icon_location" value="extensions">
|
||||
<label for="amily2_icon_location_extensions">收归扩展</label>
|
||||
</div>
|
||||
<small class="notes">为解决部分移动端UI溢出问题。更改后将立即生效。</small>
|
||||
</div>
|
||||
<div class="amily2_settings_block color-controls-container">
|
||||
<div class="color-picker-group">
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_bg_color">背景色:</label>
|
||||
<input type="color" id="amily2_bg_color" value="#1e1e1e">
|
||||
</div>
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_button_color">按钮色:</label>
|
||||
<input type="color" id="amily2_button_color" value="#4a4a4a">
|
||||
</div>
|
||||
<div class="color-picker-item">
|
||||
<label for="amily2_text_color">文字颜色:</label>
|
||||
<input type="color" id="amily2_text_color" value="#ffffff">
|
||||
</div>
|
||||
</div>
|
||||
<button id="amily2_restore_colors" class="menu_button small_button">默认</button>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_bg_opacity">背景透明度: <span id="amily2_bg_opacity_value">0</span></label>
|
||||
<input type="range" id="amily2_bg_opacity" min="0" max="1" step="0.01" value="0">
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label>自定义背景图:</label>
|
||||
<div style="display: flex; gap: 10px; align-items: center;">
|
||||
<label for="amily2_custom_bg_image" class="menu_button wide_button" style="cursor: pointer; text-align: center; flex-grow: 1;">
|
||||
<i class="fas fa-upload"></i> 上传图片
|
||||
</label>
|
||||
<input type="file" id="amily2_custom_bg_image" accept="image/*" style="display: none;">
|
||||
<button id="amily2_restore_bg_image" class="menu_button small_button">默认</button>
|
||||
<small class="notes">选择一张图片作为背景。推荐使用小于5MB的图片。</small>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<legend><i class="fas fa-tools"></i> 诊断与操作</legend>
|
||||
<div class="amily2_settings_block button-pair">
|
||||
<button class="menu_button primary interactable" id="amily2_test"><i class="fas fa-search"></i> 测试检查</button>
|
||||
<button class="menu_button accent interactable" id="amily2_fix_now"><i class="fas fa-magic"></i> 立即修复</button>
|
||||
</div>
|
||||
<div class="amily2_settings_block" style="display: flex; flex-direction: row; gap: 10px; align-items: center; margin-top: 10px; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 15px;">
|
||||
<div style="position: relative; flex-shrink: 0;">
|
||||
<input type="number" id="amily2_jump_to_message_id" class="text_pole" placeholder="楼层" style="width: 100px !important; padding-left: 30px;">
|
||||
<i class="fas fa-hashtag" style="position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: rgba(255,255,255,0.5);"></i>
|
||||
</div>
|
||||
<button id="amily2_jump_to_message_btn" class="menu_button interactable" style="flex-grow: 1; white-space: nowrap; display: flex; align-items: center; justify-content: center; gap: 8px;">
|
||||
<i class="fas fa-share"></i> <span>跳转到楼层</span>
|
||||
</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div id="amily2_hidden_prompts" style="display:none;">
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_main_prompt" class="text_pole" rows="6"></textarea>
|
||||
<button id="save_main_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_system_prompt" class="text_pole" rows="8"></textarea>
|
||||
<button id="save_system_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<div class="prompt-container">
|
||||
<textarea id="amily2_output_format_prompt" class="text_pole" rows="4"></textarea>
|
||||
<button id="save_output_format_prompt" class="menu_button small_button interactable"><i class="fas fa-save"></i> 保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
219
assets/api-config-panel.html
Normal file
219
assets/api-config-panel.html
Normal file
@@ -0,0 +1,219 @@
|
||||
<div class="amily2-header">
|
||||
<div class="additional-features-title">
|
||||
<i class="fas fa-key"></i> API 连接配置
|
||||
</div>
|
||||
<button id="amily2_back_to_main_from_api_config" class="menu_button secondary small_button interactable">
|
||||
返回主殿 <i class="fas fa-arrow-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<hr class="header-divider" style="margin-top: 5px; margin-bottom: 10px;">
|
||||
|
||||
<!-- 存储模式 -->
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-shield-alt"></i> 密钥存储模式</legend>
|
||||
<div class="control-pair-container" style="align-items: center; gap: 12px;">
|
||||
<div class="amily2_settings_block" style="flex: 1;">
|
||||
<label for="amily2_keystore_mode">存储方式</label>
|
||||
<select id="amily2_keystore_mode" class="text_pole">
|
||||
<option value="local">本地存储(推荐)</option>
|
||||
<option value="cloud">加密云同步</option>
|
||||
</select>
|
||||
<small class="notes" id="amily2_keystore_mode_note">
|
||||
本地存储:API Key 仅存于本设备浏览器,绝不上传。换设备需重新填写。
|
||||
</small>
|
||||
</div>
|
||||
<div class="amily2_settings_block" id="amily2_cloud_key_section" style="display:none; flex: 1;">
|
||||
<label>当前密钥对指纹</label>
|
||||
<div style="display:flex; gap:6px; align-items:center;">
|
||||
<code id="amily2_keypair_fingerprint" style="flex:1; padding:4px 8px; background:var(--black30a); border-radius:4px; font-size:0.85em;">(未生成)</code>
|
||||
<button id="amily2_generate_keypair" class="menu_button interactable small_button" title="生成新密钥对(会清除所有已加密的 Key)">
|
||||
<i class="fas fa-sync-alt"></i> 重新生成
|
||||
</button>
|
||||
</div>
|
||||
<small class="notes" style="color: var(--warning-color);">
|
||||
⚠️ 重新生成密钥对后,所有已加密存储的 API Key 将失效,需重新输入。
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- Profile 列表 -->
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-server"></i> 连接配置列表</legend>
|
||||
|
||||
<div style="display:flex; gap:6px; margin-bottom:10px; flex-wrap:wrap;">
|
||||
<button class="menu_button small_button amily2_profile_type_filter active" data-type="all">全部</button>
|
||||
<button class="menu_button small_button amily2_profile_type_filter" data-type="chat">
|
||||
<i class="fas fa-comments"></i> 对话模型
|
||||
</button>
|
||||
<button class="menu_button small_button amily2_profile_type_filter" data-type="embedding">
|
||||
<i class="fas fa-project-diagram"></i> 向量嵌入
|
||||
</button>
|
||||
<button class="menu_button small_button amily2_profile_type_filter" data-type="rerank">
|
||||
<i class="fas fa-sort-amount-down"></i> 重排序
|
||||
</button>
|
||||
<button id="amily2_add_profile" class="menu_button small_button interactable" style="margin-left:auto;">
|
||||
<i class="fas fa-plus"></i> 新建配置
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="amily2_profile_list" style="display:flex; flex-direction:column; gap:8px;">
|
||||
<div class="amily2_profile_empty" style="color:var(--SmartThemeQuoteColor); text-align:center; padding:20px;">
|
||||
暂无连接配置,点击「新建配置」添加。
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- 功能槽分配 -->
|
||||
<fieldset class="settings-group">
|
||||
<legend><i class="fas fa-plug"></i> 功能分配</legend>
|
||||
<small class="notes" style="display:block; margin-bottom:10px;">
|
||||
为每个系统功能指定使用的连接配置。选单只会显示类型匹配的配置。
|
||||
</small>
|
||||
<div id="amily2_slot_assignments" style="display:flex; flex-direction:column; gap:6px;">
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- 新建/编辑 Profile 弹窗 -->
|
||||
<div id="amily2_profile_modal" style="display:none; position:fixed; inset:0; background:rgba(0,0,0,0.6); z-index:9999; align-items:center; justify-content:center;">
|
||||
<div style="background:var(--SmartThemeBlurTintColor); border:1px solid var(--SmartThemeBorderColor); border-radius:8px; padding:20px; width:min(500px,94vw); max-height:88vh; overflow-y:auto;">
|
||||
|
||||
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:14px;">
|
||||
<strong id="amily2_profile_modal_title"><i class="fas fa-key"></i> 新建连接配置</strong>
|
||||
<button id="amily2_profile_modal_close" class="menu_button small_button secondary interactable">✕</button>
|
||||
</div>
|
||||
|
||||
<!-- 类型选择 -->
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_type">配置类型</label>
|
||||
<select id="amily2_pf_type" class="text_pole">
|
||||
<option value="chat">对话模型(Chat)</option>
|
||||
<option value="embedding">向量嵌入(Embedding)</option>
|
||||
<option value="rerank">重排序(Rerank)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_name">配置名称</label>
|
||||
<input id="amily2_pf_name" type="text" class="text_pole" placeholder="例如:我的 DeepSeek" />
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_provider">接口类型</label>
|
||||
<select id="amily2_pf_provider" class="text_pole">
|
||||
<option value="openai">OpenAI / 兼容接口(推荐)</option>
|
||||
<option value="google">Google Gemini 直连</option>
|
||||
<option value="sillytavern_backend">SillyTavern 后端代理</option>
|
||||
<option value="sillytavern_preset">SillyTavern 预设转发</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="amily2_settings_block" id="amily2_pf_url_row">
|
||||
<label for="amily2_pf_url">API 地址</label>
|
||||
<input id="amily2_pf_url" type="text" class="text_pole" placeholder="https://api.example.com/v1" />
|
||||
</div>
|
||||
<!-- Google 专属提示(选 Google 时显示) -->
|
||||
<div id="amily2_pf_google_note" style="display:none; margin-bottom:8px;">
|
||||
<small class="notes" style="display:block; padding:6px 10px; background:var(--black10a); border-radius:4px; border-left:3px solid #4285f4;">
|
||||
<i class="fas fa-info-circle" style="color:#4285f4;"></i>
|
||||
Google AI Studio — 接口地址已自动配置,只需填写 API Key 即可。
|
||||
在 <a href="https://aistudio.google.com/apikey" target="_blank" rel="noopener" style="color:#4285f4;">aistudio.google.com</a> 生成密钥。
|
||||
</small>
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_key">API Key <span style="color:var(--SmartThemeQuoteColor); font-size:0.85em;">(加密存储)</span></label>
|
||||
<input id="amily2_pf_key" type="password" class="text_pole" placeholder="sk-..." autocomplete="off" />
|
||||
<small class="notes">留空则不修改现有 Key。</small>
|
||||
</div>
|
||||
|
||||
<!-- 模型选择(带获取按钮) -->
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_model">模型</label>
|
||||
<div style="display:flex; gap:6px; align-items:stretch;">
|
||||
<input id="amily2_pf_model" type="text" class="text_pole"
|
||||
list="amily2_pf_model_list"
|
||||
placeholder="手动填写或点击「获取」"
|
||||
style="flex:1;" />
|
||||
<datalist id="amily2_pf_model_list"></datalist>
|
||||
<button id="amily2_pf_fetch_models" class="menu_button small_button interactable" type="button" title="从 API 获取可用模型列表(需先填写地址和 Key)">
|
||||
<i class="fas fa-list"></i> 获取
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 测试连接 -->
|
||||
<div style="display:flex; align-items:center; gap:10px; margin-bottom:10px;">
|
||||
<button id="amily2_pf_test_conn" class="menu_button small_button interactable" type="button">
|
||||
<i class="fas fa-plug"></i> 测试连接
|
||||
</button>
|
||||
<span id="amily2_pf_test_result" style="font-size:0.85em;"></span>
|
||||
</div>
|
||||
|
||||
<!-- Chat 高级参数(折叠) -->
|
||||
<div id="amily2_pf_chat_params">
|
||||
<details class="amily2_advanced_section" style="margin-top:4px;">
|
||||
<summary style="cursor:pointer; font-size:0.88em; color:var(--SmartThemeQuoteColor); user-select:none; padding:4px 0;">
|
||||
<i class="fas fa-sliders-h"></i> 高级参数
|
||||
</summary>
|
||||
<div style="padding-top:8px;">
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_max_tokens">最大 Token 数</label>
|
||||
<input id="amily2_pf_max_tokens" type="number" class="text_pole" min="100" max="200000" value="65500" />
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_temperature">温度(Temperature)</label>
|
||||
<input id="amily2_pf_temperature" type="number" class="text_pole" min="0" max="2" step="0.1" value="1.0" />
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- Embedding 高级参数(折叠) -->
|
||||
<div id="amily2_pf_embedding_params" style="display:none;">
|
||||
<details class="amily2_advanced_section" style="margin-top:4px;">
|
||||
<summary style="cursor:pointer; font-size:0.88em; color:var(--SmartThemeQuoteColor); user-select:none; padding:4px 0;">
|
||||
<i class="fas fa-sliders-h"></i> 高级参数
|
||||
</summary>
|
||||
<div style="padding-top:8px;">
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_dimensions">输出维度 <span style="color:var(--SmartThemeQuoteColor); font-size:0.85em;">(留空 = 模型默认)</span></label>
|
||||
<input id="amily2_pf_dimensions" type="number" class="text_pole" min="1" placeholder="例如:1536" />
|
||||
</div>
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_encoding_format">编码格式</label>
|
||||
<select id="amily2_pf_encoding_format" class="text_pole">
|
||||
<option value="float">float(默认)</option>
|
||||
<option value="base64">base64</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- Rerank 参数 -->
|
||||
<div id="amily2_pf_rerank_params" style="display:none;">
|
||||
<div class="amily2_settings_block">
|
||||
<label for="amily2_pf_top_n">返回结果数量(Top N)</label>
|
||||
<input id="amily2_pf_top_n" type="number" class="text_pole" min="1" max="100" value="5" />
|
||||
</div>
|
||||
<details class="amily2_advanced_section" style="margin-top:4px;">
|
||||
<summary style="cursor:pointer; font-size:0.88em; color:var(--SmartThemeQuoteColor); user-select:none; padding:4px 0;">
|
||||
<i class="fas fa-sliders-h"></i> 高级参数
|
||||
</summary>
|
||||
<div style="padding-top:8px;">
|
||||
<div class="amily2_settings_block" style="flex-direction:row; align-items:center; gap:8px;">
|
||||
<input id="amily2_pf_return_documents" type="checkbox" />
|
||||
<label for="amily2_pf_return_documents">返回原始文档内容</label>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div style="display:flex; gap:8px; margin-top:16px; justify-content:flex-end;">
|
||||
<button id="amily2_profile_modal_cancel" class="menu_button secondary interactable">取消</button>
|
||||
<button id="amily2_profile_modal_save" class="menu_button interactable">
|
||||
<i class="fas fa-save"></i> 保存
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,173 +1,185 @@
|
||||
<div id="acc-window" class="acc-window">
|
||||
<!-- 顶部栏 -->
|
||||
<div class="acc-header">
|
||||
<div class="acc-header-left">
|
||||
<i class="fas fa-robot acc-logo"></i>
|
||||
<span class="acc-title">Amily2 自动构建器</span>
|
||||
<span id="acc-status-indicator" class="acc-status-badge status-idle">空闲</span>
|
||||
</div>
|
||||
<div class="acc-header-controls">
|
||||
<button id="acc-minimize-btn" class="acc-control-btn" title="最小化"><i class="fas fa-window-minimize"></i></button>
|
||||
<button id="acc-maximize-btn" class="acc-control-btn" title="全屏/还原"><i class="fas fa-expand"></i></button>
|
||||
<button id="acc-close-btn" class="acc-control-btn" title="关闭"><i class="fas fa-times"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 主体内容 (三栏布局) -->
|
||||
<div class="acc-body">
|
||||
<!-- 左栏:工作区设置 -->
|
||||
<div class="acc-column acc-left-panel">
|
||||
<div class="acc-panel-header">
|
||||
<i class="fas fa-cog"></i> 工作区设置
|
||||
</div>
|
||||
<div class="acc-panel-content">
|
||||
<div class="acc-form-group">
|
||||
<label>目标角色卡</label>
|
||||
<select id="acc-target-char" class="acc-select">
|
||||
<option value="">-- 请选择或新建 --</option>
|
||||
<option value="new">新建空白角色</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>关联世界书</label>
|
||||
<select id="acc-target-world" class="acc-select">
|
||||
<option value="">-- 请选择或新建 --</option>
|
||||
<option value="new">新建世界书</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-section-title">当前任务</div>
|
||||
<div id="acc-task-list" class="acc-task-list">
|
||||
<div class="acc-task-item pending">等待指令...</div>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-panel-header" style="cursor: pointer;" id="acc-rules-toggle">
|
||||
<i class="fas fa-book"></i> 动态规则 <i class="fas fa-chevron-down" style="float: right;"></i>
|
||||
</div>
|
||||
<div id="acc-rules-content" style="display: none; padding-top: 10px;">
|
||||
<div class="acc-form-group">
|
||||
<label>添加新规则 (格式: 关键词|规则内容)</label>
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<input type="text" id="acc-new-rule-input" class="acc-input" placeholder="例如: 魔法|描写魔法时必须包含咒语">
|
||||
<button id="acc-add-rule-btn" class="acc-btn-secondary"><i class="fas fa-plus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="acc-rules-list" class="acc-rules-list">
|
||||
<!-- Rules will be added here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-panel-header" style="cursor: pointer;" id="acc-api-settings-toggle">
|
||||
<i class="fas fa-network-wired"></i> API 配置 <i class="fas fa-chevron-down" style="float: right;"></i>
|
||||
</div>
|
||||
<div id="acc-api-settings-content" style="display: none; padding-top: 10px;">
|
||||
<div id="acc-api-executor" class="acc-api-group">
|
||||
<div class="acc-form-group">
|
||||
<label>API URL</label>
|
||||
<input type="text" id="acc-executor-url" class="acc-input" placeholder="http://localhost:3000/v1">
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>API Key</label>
|
||||
<input type="password" id="acc-executor-key" class="acc-input" placeholder="sk-...">
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>Model</label>
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<select id="acc-executor-model" class="acc-select" style="flex: 1;">
|
||||
<option value="">请刷新获取模型</option>
|
||||
</select>
|
||||
<button id="acc-executor-refresh-models" class="acc-btn-secondary" title="刷新模型列表"><i class="fas fa-sync-alt"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>Max Tokens</label>
|
||||
<input type="number" id="acc-executor-max-tokens" class="acc-input" placeholder="4000" value="4000">
|
||||
</div>
|
||||
<button id="acc-executor-test" class="acc-btn-secondary" style="width: 100%;">测试连接</button>
|
||||
</div>
|
||||
|
||||
<button id="acc-save-api" class="acc-btn-primary" style="width: 100%; margin-top: 10px;">保存配置</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 中栏:互动区域 -->
|
||||
<div class="acc-column acc-center-panel">
|
||||
<div class="acc-panel-header">
|
||||
<i class="fas fa-comments"></i> 交互控制台
|
||||
</div>
|
||||
<div id="acc-chat-stream" class="acc-chat-stream">
|
||||
<div class="acc-message system">
|
||||
<div class="acc-message-content">
|
||||
欢迎使用 Amily2 自动构建器。<br>
|
||||
请在左侧配置工作区,然后在下方输入您的需求。<br>
|
||||
当使用时,最好不要进入所选的角色卡中,以便后台执行即时生效。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-input-area">
|
||||
<div class="acc-input-wrapper">
|
||||
<textarea id="acc-user-input" placeholder="描述您的需求,例如:创建一个赛博朋克风格的黑客少女..." rows="2"></textarea>
|
||||
<button id="acc-send-btn" class="acc-send-btn"><i class="fas fa-paper-plane"></i></button>
|
||||
</div>
|
||||
<div class="acc-input-controls">
|
||||
<label class="acc-checkbox-label" title="开启后,每次工具调用前都需要您确认">
|
||||
<input type="checkbox" id="acc-require-approval"> 需要确认
|
||||
</label>
|
||||
<button id="acc-stop-btn" class="acc-btn-danger" style="display: none;"><i class="fas fa-stop"></i> 停止生成</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 右栏:实时预览/Diff -->
|
||||
<div class="acc-column acc-right-panel">
|
||||
<div class="acc-panel-header" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<div style="display: flex; align-items: center; gap: 5px; flex: 1; min-width: 0;">
|
||||
<i class="fas fa-eye" style="flex-shrink: 0;"></i>
|
||||
<select id="acc-file-selector" class="acc-select" style="height: 24px; padding: 0 5px; font-size: 12px; width: auto; flex: 1; min-width: 100px;">
|
||||
<option value="">-- 选择文件 --</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="acc-preview-tabs" style="display: flex; gap: 2px; overflow-x: auto; max-width: 60%;">
|
||||
<!-- Tabs will be injected here -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-panel-content" id="acc-preview-container">
|
||||
<!-- 预览内容将动态插入这里 -->
|
||||
<div class="acc-empty-state">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
<p>暂无修改内容</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 移动端底部导航栏 -->
|
||||
<div class="acc-mobile-nav">
|
||||
<button class="acc-nav-btn" data-target="acc-left-panel">
|
||||
<i class="fas fa-cog"></i>
|
||||
<span>设置</span>
|
||||
</button>
|
||||
<button class="acc-nav-btn active" data-target="acc-center-panel">
|
||||
<i class="fas fa-comments"></i>
|
||||
<span>聊天</span>
|
||||
</button>
|
||||
<button class="acc-nav-btn" data-target="acc-right-panel">
|
||||
<i class="fas fa-eye"></i>
|
||||
<span>预览</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 最小化后的图标 -->
|
||||
<div id="acc-minimized-icon" class="acc-minimized-icon" style="display: none;">
|
||||
<i class="fas fa-robot"></i>
|
||||
<span class="acc-notification-dot" style="display: none;"></span>
|
||||
</div>
|
||||
<div id="acc-window" class="acc-window">
|
||||
<!-- 顶部栏 -->
|
||||
<div class="acc-header">
|
||||
<div class="acc-header-left">
|
||||
<i class="fas fa-robot acc-logo"></i>
|
||||
<span class="acc-title">Amily2 自动构建器</span>
|
||||
<span id="acc-status-indicator" class="acc-status-badge status-idle">空闲</span>
|
||||
</div>
|
||||
<div class="acc-header-controls">
|
||||
<button id="acc-minimize-btn" class="acc-control-btn" title="最小化"><i class="fas fa-window-minimize"></i></button>
|
||||
<button id="acc-maximize-btn" class="acc-control-btn" title="全屏/还原"><i class="fas fa-expand"></i></button>
|
||||
<button id="acc-close-btn" class="acc-control-btn" title="关闭"><i class="fas fa-times"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 主体内容 (三栏布局) -->
|
||||
<div class="acc-body">
|
||||
<!-- 左栏:工作区设置 -->
|
||||
<div class="acc-column acc-left-panel">
|
||||
<div class="acc-panel-header">
|
||||
<i class="fas fa-cog"></i> 工作区设置
|
||||
</div>
|
||||
<div class="acc-panel-content">
|
||||
<div class="acc-form-group">
|
||||
<label>目标角色卡</label>
|
||||
<select id="acc-target-char" class="acc-select">
|
||||
<option value="">-- 请选择或新建 --</option>
|
||||
<option value="new">新建空白角色</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>关联世界书</label>
|
||||
<select id="acc-target-world" class="acc-select">
|
||||
<option value="">-- 请选择或新建 --</option>
|
||||
<option value="new">新建世界书</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-panel-header" style="cursor: pointer;" id="acc-sessions-toggle">
|
||||
<i class="fas fa-history"></i> 历史会话 <i class="fas fa-chevron-down" style="float: right;"></i>
|
||||
</div>
|
||||
<div id="acc-sessions-content" style="display: none; padding-top: 10px;">
|
||||
<button id="acc-new-session-btn" class="acc-btn-primary" style="width: 100%; margin-bottom: 10px;"><i class="fas fa-plus"></i> 新建会话</button>
|
||||
<div id="acc-sessions-list" class="acc-sessions-list" style="max-height: 150px; overflow-y: auto;">
|
||||
<!-- Sessions will be added here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-section-title">当前任务</div>
|
||||
<div id="acc-task-list" class="acc-task-list">
|
||||
<div class="acc-task-item pending">等待指令...</div>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-panel-header" style="cursor: pointer;" id="acc-rules-toggle">
|
||||
<i class="fas fa-book"></i> 动态规则 <i class="fas fa-chevron-down" style="float: right;"></i>
|
||||
</div>
|
||||
<div id="acc-rules-content" style="display: none; padding-top: 10px;">
|
||||
<div class="acc-form-group">
|
||||
<label>添加新规则 (格式: 关键词|规则内容)</label>
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<input type="text" id="acc-new-rule-input" class="acc-input" placeholder="例如: 魔法|描写魔法时必须包含咒语">
|
||||
<button id="acc-add-rule-btn" class="acc-btn-secondary"><i class="fas fa-plus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="acc-rules-list" class="acc-rules-list">
|
||||
<!-- Rules will be added here -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="acc-divider"></div>
|
||||
|
||||
<div class="acc-panel-header" style="cursor: pointer;" id="acc-api-settings-toggle">
|
||||
<i class="fas fa-network-wired"></i> API 配置 <i class="fas fa-chevron-down" style="float: right;"></i>
|
||||
</div>
|
||||
<div id="acc-api-settings-content" style="display: none; padding-top: 10px;">
|
||||
<div id="acc-api-executor" class="acc-api-group">
|
||||
<div class="acc-form-group">
|
||||
<label>API URL</label>
|
||||
<input type="text" id="acc-executor-url" class="acc-input" placeholder="http://localhost:3000/v1">
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>API Key</label>
|
||||
<input type="password" id="acc-executor-key" class="acc-input" placeholder="sk-...">
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>Model</label>
|
||||
<div style="display: flex; gap: 5px;">
|
||||
<select id="acc-executor-model" class="acc-select" style="flex: 1;">
|
||||
<option value="">请刷新获取模型</option>
|
||||
</select>
|
||||
<button id="acc-executor-refresh-models" class="acc-btn-secondary" title="刷新模型列表"><i class="fas fa-sync-alt"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-form-group">
|
||||
<label>Max Tokens</label>
|
||||
<input type="number" id="acc-executor-max-tokens" class="acc-input" placeholder="4000" value="4000">
|
||||
</div>
|
||||
<button id="acc-executor-test" class="acc-btn-secondary" style="width: 100%;">测试连接</button>
|
||||
</div>
|
||||
|
||||
<button id="acc-save-api" class="acc-btn-primary" style="width: 100%; margin-top: 10px;">保存配置</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 中栏:互动区域 -->
|
||||
<div class="acc-column acc-center-panel">
|
||||
<div class="acc-panel-header">
|
||||
<i class="fas fa-comments"></i> 交互控制台
|
||||
</div>
|
||||
<div id="acc-chat-stream" class="acc-chat-stream">
|
||||
<div class="acc-message system">
|
||||
<div class="acc-message-content">
|
||||
欢迎使用 Amily2 自动构建器。<br>
|
||||
请在左侧配置工作区,然后在下方输入您的需求。<br>
|
||||
当使用时,最好不要进入所选的角色卡中,以便后台执行即时生效。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-input-area">
|
||||
<div class="acc-input-wrapper">
|
||||
<textarea id="acc-user-input" placeholder="描述您的需求,例如:创建一个赛博朋克风格的黑客少女..." rows="2"></textarea>
|
||||
<button id="acc-send-btn" class="acc-send-btn"><i class="fas fa-paper-plane"></i></button>
|
||||
</div>
|
||||
<div class="acc-input-controls">
|
||||
<label class="acc-checkbox-label" title="开启后,每次工具调用前都需要您确认">
|
||||
<input type="checkbox" id="acc-require-approval"> 需要确认
|
||||
</label>
|
||||
<button id="acc-stop-btn" class="acc-btn-danger" style="display: none;"><i class="fas fa-stop"></i> 停止生成</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 右栏:实时预览/Diff -->
|
||||
<div class="acc-column acc-right-panel">
|
||||
<div class="acc-panel-header" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<div style="display: flex; align-items: center; gap: 5px; flex: 1; min-width: 0;">
|
||||
<i class="fas fa-eye" style="flex-shrink: 0;"></i>
|
||||
<select id="acc-file-selector" class="acc-select" style="height: 24px; padding: 0 5px; font-size: 12px; width: auto; flex: 1; min-width: 100px;">
|
||||
<option value="">-- 选择文件 --</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="acc-preview-tabs" style="display: flex; gap: 2px; overflow-x: auto; max-width: 60%;">
|
||||
<!-- Tabs will be injected here -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="acc-panel-content" id="acc-preview-container">
|
||||
<!-- 预览内容将动态插入这里 -->
|
||||
<div class="acc-empty-state">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
<p>暂无修改内容</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 移动端底部导航栏 -->
|
||||
<div class="acc-mobile-nav">
|
||||
<button class="acc-nav-btn" data-target="acc-left-panel">
|
||||
<i class="fas fa-cog"></i>
|
||||
<span>设置</span>
|
||||
</button>
|
||||
<button class="acc-nav-btn active" data-target="acc-center-panel">
|
||||
<i class="fas fa-comments"></i>
|
||||
<span>聊天</span>
|
||||
</button>
|
||||
<button class="acc-nav-btn" data-target="acc-right-panel">
|
||||
<i class="fas fa-eye"></i>
|
||||
<span>预览</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 最小化后的图标 -->
|
||||
<div id="acc-minimized-icon" class="acc-minimized-icon" style="display: none;">
|
||||
<i class="fas fa-robot"></i>
|
||||
<span class="acc-notification-dot" style="display: none;"></span>
|
||||
</div>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,436 +1,436 @@
|
||||
:root {
|
||||
--amily2-bg-color: #2C2C2C;
|
||||
--amily2-button-color: #4A4A4A;
|
||||
--amily2-text-color: #E0E0E0;
|
||||
}
|
||||
|
||||
.manual-command-block {
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
|
||||
.manual-command-block .manual-input {
|
||||
flex: 1 1 60px;
|
||||
width: 80px;
|
||||
padding: 6px;
|
||||
text-align: center;
|
||||
border: 1px solid var(--border_color);
|
||||
background-color: var(--amily2-bg-color);
|
||||
color: var(--amily2-text-color);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.manual-command-block .menu_button {
|
||||
flex: 2 1 90px;
|
||||
flex-grow: 1;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.manual-command-block label {
|
||||
flex-shrink: 0;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.manual-command-block .manual-command-divider {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-controls-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 6px;
|
||||
padding: 12px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .manual-command-block {
|
||||
flex-wrap: wrap;
|
||||
gap: 5px; /* 减小间距以适应换行 */
|
||||
}
|
||||
#amily2_manual_historiography_bureau .manual-command-block .manual-input {
|
||||
flex: 1 1 50px; /* 弹性伸缩 */
|
||||
}
|
||||
#amily2_manual_historiography_bureau .manual-command-block .menu_button {
|
||||
flex: 2 1 80px; /* 按钮占据更多空间 */
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .accent {
|
||||
background: linear-gradient(to right, #FF5722, #E64A19);
|
||||
border: 1px solid #D84315;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .accent:hover {
|
||||
box-shadow: 0 0 8px rgba(255, 87, 34, 0.7);
|
||||
transform: scale(1.03);
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .secondary {
|
||||
background: linear-gradient(to right, #ffb300, #fb8c00);
|
||||
border: 1px solid #f57c00;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .secondary:hover {
|
||||
box-shadow: 0 0 8px rgba(255, 179, 0, 0.7);
|
||||
transform: scale(1.03);
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-selector-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-selector-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
gap: 5px;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .mhb-selector-group > label {
|
||||
width: auto;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .auto-command-block {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
flex-wrap: wrap; /* 允许换行 */
|
||||
gap: 15px;
|
||||
margin-top: 15px;
|
||||
padding: 10px;
|
||||
border: 1px solid var(--secondary-border);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .auto-control-pair {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute {
|
||||
width: auto;
|
||||
flex-grow: 0;
|
||||
}
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute {
|
||||
background: linear-gradient(135deg, #8e44ad, #6a1b9a);
|
||||
border: 1px solid #4a148c;
|
||||
color: white;
|
||||
text-shadow: 0 0 2px rgba(0,0,0,0.3);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute:hover {
|
||||
background: linear-gradient(135deg, #9b59b6, #8e44ad);
|
||||
box-shadow: 0 0 10px rgba(142, 68, 173, 0.7);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_manual_execute {
|
||||
background: linear-gradient(135deg, #ff8a65, #ff5722);
|
||||
border: 1px solid #e64a19;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_manual_execute:hover {
|
||||
background: linear-gradient(135deg, #ff7043, #f4511e);
|
||||
box-shadow: 0 0 10px rgba(255, 87, 34, 0.6);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .danger {
|
||||
background: linear-gradient(135deg, #e74c3c, #c0392b);
|
||||
border: 1px solid #a93226;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .danger:hover {
|
||||
background: linear-gradient(135deg, #ec7063, #e74c3c);
|
||||
box-shadow: 0 0 10px rgba(231, 76, 60, 0.7);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .success {
|
||||
background: linear-gradient(135deg, #2ecc71, #27ae60);
|
||||
color: white;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .success:hover {
|
||||
background: linear-gradient(135deg, #58d68d, #2ecc71);
|
||||
box-shadow: 0 0 10px rgba(46, 204, 113, 0.7);
|
||||
}
|
||||
|
||||
.prompt-editor-area {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
}
|
||||
.prompt-editor-area textarea {
|
||||
flex-grow: 1;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.editor-buttons-panel {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 10px;
|
||||
}
|
||||
.editor-buttons-panel .menu_button {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.editor_maximize {
|
||||
color: #ccc;
|
||||
cursor: pointer;
|
||||
padding: 4px;
|
||||
border-radius: 4px;
|
||||
transition: background-color 0.2s, color 0.2s;
|
||||
}
|
||||
.editor_maximize:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.label-with-button {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 2px;
|
||||
background: linear-gradient(135deg, #28a745, #20c997);
|
||||
border: 1px solid #198754;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 0 2px rgba(0,0,0,0.3);
|
||||
transition: all 0.3s ease;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button:hover {
|
||||
background: linear-gradient(135deg, #20c997, #28a745);
|
||||
box-shadow: 0 0 10px rgba(40, 167, 69, 0.7);
|
||||
transform: translateY(-2px);
|
||||
border-color: #1a9c5c;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button {
|
||||
font-size: 13px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button i {
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
#amily2_unhide_all_button span {
|
||||
font-size: 9px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.amily2-panel-visible {
|
||||
display: flex !important;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.opt-exclusion-rule-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.opt-exclusion-rule-row input[type="text"] {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.delete-rule-btn.danger_button {
|
||||
background: linear-gradient(135deg, #e74c3c, #c0392b);
|
||||
border: 1px solid #a93226;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.delete-rule-btn.danger_button:hover {
|
||||
background: linear-gradient(135deg, #ec7063, #e74c3c);
|
||||
box-shadow: 0 0 8px rgba(231, 76, 60, 0.7);
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.amily2-add-rule-btn {
|
||||
width: auto;
|
||||
padding: 8px 16px;
|
||||
background: linear-gradient(135deg, #2ecc71, #27ae60);
|
||||
border: 1px solid #229954;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.amily2-add-rule-btn:hover {
|
||||
background: linear-gradient(135deg, #58d68d, #2ecc71);
|
||||
box-shadow: 0 0 10px rgba(46, 204, 113, 0.7);
|
||||
}
|
||||
|
||||
/* Styles moved from hanlinyuan.css that are required by the Historiographer panel */
|
||||
|
||||
.hly-control-block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.hly-imperial-brush {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid #555;
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
color: #f0f0f0;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.hly-imperial-brush:focus {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
border-color: #7e57c2;
|
||||
box-shadow: 0 0 10px rgba(126, 87, 194, 0.5);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Combined rule for all toggle switches in this panel */
|
||||
.toggle-switch,
|
||||
.hly-toggle-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 26px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.toggle-switch input,
|
||||
.hly-toggle-switch input { opacity: 0; width: 0; height: 0; }
|
||||
|
||||
.toggle-switch .slider,
|
||||
.hly-toggle-switch .slider {
|
||||
position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-color: #333; border-radius: 26px; transition: .4s;
|
||||
border: 1px solid #555;
|
||||
}
|
||||
.toggle-switch .slider:before,
|
||||
.hly-toggle-switch .slider:before {
|
||||
position: absolute; content: ""; height: 20px; width: 20px; left: 2px; bottom: 2px;
|
||||
background-color: white; border-radius: 50%; transition: .4s;
|
||||
}
|
||||
.toggle-switch input:checked + .slider,
|
||||
.hly-toggle-switch input:checked + .slider {
|
||||
background: linear-gradient(to right, #7e57c2, #5e35b1);
|
||||
box-shadow: 0 0 8px rgba(126, 87, 194, 0.7);
|
||||
}
|
||||
.toggle-switch input:checked + .slider:before,
|
||||
.hly-toggle-switch input:checked + .slider:before { transform: translateX(24px); }
|
||||
|
||||
|
||||
.hly-action-button {
|
||||
padding: 8px 15px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
transition: all 0.3s ease;
|
||||
background-color: var(--amily2-button-color);
|
||||
color: var(--amily2-text-color);
|
||||
border-color: #666;
|
||||
}
|
||||
.hly-action-button:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.hly-button-group {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
/* Ngms API 按钮样式 - 水平扁平按钮 */
|
||||
.ngms-button-row {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button {
|
||||
min-width: 120px;
|
||||
height: 35px;
|
||||
padding: 8px 16px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
text-transform: none;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.primary {
|
||||
background: linear-gradient(135deg, #4CAF50, #45a049);
|
||||
border: 1px solid #388e3c;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.primary:hover {
|
||||
background: linear-gradient(135deg, #5CBF60, #4CAF50);
|
||||
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.secondary {
|
||||
background: linear-gradient(135deg, #2196F3, #1976D2);
|
||||
border: 1px solid #1565C0;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.secondary:hover {
|
||||
background: linear-gradient(135deg, #42A5F5, #2196F3);
|
||||
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button i {
|
||||
font-size: 14px;
|
||||
}
|
||||
:root {
|
||||
--amily2-bg-color: #2C2C2C;
|
||||
--amily2-button-color: #4A4A4A;
|
||||
--amily2-text-color: #E0E0E0;
|
||||
}
|
||||
|
||||
.manual-command-block {
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
|
||||
.manual-command-block .manual-input {
|
||||
flex: 1 1 60px;
|
||||
width: 80px;
|
||||
padding: 6px;
|
||||
text-align: center;
|
||||
border: 1px solid var(--border_color);
|
||||
background-color: var(--amily2-bg-color);
|
||||
color: var(--amily2-text-color);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.manual-command-block .menu_button {
|
||||
flex: 2 1 90px;
|
||||
flex-grow: 1;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.manual-command-block label {
|
||||
flex-shrink: 0;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.manual-command-block .manual-command-divider {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-controls-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 6px;
|
||||
padding: 12px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .manual-command-block {
|
||||
flex-wrap: wrap;
|
||||
gap: 5px; /* 减小间距以适应换行 */
|
||||
}
|
||||
#amily2_manual_historiography_bureau .manual-command-block .manual-input {
|
||||
flex: 1 1 50px; /* 弹性伸缩 */
|
||||
}
|
||||
#amily2_manual_historiography_bureau .manual-command-block .menu_button {
|
||||
flex: 2 1 80px; /* 按钮占据更多空间 */
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .accent {
|
||||
background: linear-gradient(to right, #FF5722, #E64A19);
|
||||
border: 1px solid #D84315;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .accent:hover {
|
||||
box-shadow: 0 0 8px rgba(255, 87, 34, 0.7);
|
||||
transform: scale(1.03);
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .secondary {
|
||||
background: linear-gradient(to right, #ffb300, #fb8c00);
|
||||
border: 1px solid #f57c00;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .editor-buttons-panel .secondary:hover {
|
||||
box-shadow: 0 0 8px rgba(255, 179, 0, 0.7);
|
||||
transform: scale(1.03);
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-selector-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .mhb-selector-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
gap: 5px;
|
||||
}
|
||||
#amily2_manual_historiography_bureau .mhb-selector-group > label {
|
||||
width: auto;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .auto-command-block {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
flex-wrap: wrap; /* 允许换行 */
|
||||
gap: 15px;
|
||||
margin-top: 15px;
|
||||
padding: 10px;
|
||||
border: 1px solid var(--secondary-border);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau .auto-control-pair {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute {
|
||||
width: auto;
|
||||
flex-grow: 0;
|
||||
}
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute {
|
||||
background: linear-gradient(135deg, #8e44ad, #6a1b9a);
|
||||
border: 1px solid #4a148c;
|
||||
color: white;
|
||||
text-shadow: 0 0 2px rgba(0,0,0,0.3);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_expedition_execute:hover {
|
||||
background: linear-gradient(135deg, #9b59b6, #8e44ad);
|
||||
box-shadow: 0 0 10px rgba(142, 68, 173, 0.7);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_manual_execute {
|
||||
background: linear-gradient(135deg, #ff8a65, #ff5722);
|
||||
border: 1px solid #e64a19;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau #amily2_mhb_small_manual_execute:hover {
|
||||
background: linear-gradient(135deg, #ff7043, #f4511e);
|
||||
box-shadow: 0 0 10px rgba(255, 87, 34, 0.6);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .danger {
|
||||
background: linear-gradient(135deg, #e74c3c, #c0392b);
|
||||
border: 1px solid #a93226;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .danger:hover {
|
||||
background: linear-gradient(135deg, #ec7063, #e74c3c);
|
||||
box-shadow: 0 0 10px rgba(231, 76, 60, 0.7);
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .success {
|
||||
background: linear-gradient(135deg, #2ecc71, #27ae60);
|
||||
color: white;
|
||||
}
|
||||
|
||||
#amily2_manual_historiography_bureau .success:hover {
|
||||
background: linear-gradient(135deg, #58d68d, #2ecc71);
|
||||
box-shadow: 0 0 10px rgba(46, 204, 113, 0.7);
|
||||
}
|
||||
|
||||
.prompt-editor-area {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
}
|
||||
.prompt-editor-area textarea {
|
||||
flex-grow: 1;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.editor-buttons-panel {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 10px;
|
||||
}
|
||||
.editor-buttons-panel .menu_button {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.editor_maximize {
|
||||
color: #ccc;
|
||||
cursor: pointer;
|
||||
padding: 4px;
|
||||
border-radius: 4px;
|
||||
transition: background-color 0.2s, color 0.2s;
|
||||
}
|
||||
.editor_maximize:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.label-with-button {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 2px;
|
||||
background: linear-gradient(135deg, #28a745, #20c997);
|
||||
border: 1px solid #198754;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 0 2px rgba(0,0,0,0.3);
|
||||
transition: all 0.3s ease;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button:hover {
|
||||
background: linear-gradient(135deg, #20c997, #28a745);
|
||||
box-shadow: 0 0 10px rgba(40, 167, 69, 0.7);
|
||||
transform: translateY(-2px);
|
||||
border-color: #1a9c5c;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button {
|
||||
font-size: 13px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
#amily2_unhide_all_button i {
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
#amily2_unhide_all_button span {
|
||||
font-size: 9px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.amily2-panel-visible {
|
||||
display: flex !important;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.opt-exclusion-rule-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.opt-exclusion-rule-row input[type="text"] {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.delete-rule-btn.danger_button {
|
||||
background: linear-gradient(135deg, #e74c3c, #c0392b);
|
||||
border: 1px solid #a93226;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.delete-rule-btn.danger_button:hover {
|
||||
background: linear-gradient(135deg, #ec7063, #e74c3c);
|
||||
box-shadow: 0 0 8px rgba(231, 76, 60, 0.7);
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.amily2-add-rule-btn {
|
||||
width: auto;
|
||||
padding: 8px 16px;
|
||||
background: linear-gradient(135deg, #2ecc71, #27ae60);
|
||||
border: 1px solid #229954;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.amily2-add-rule-btn:hover {
|
||||
background: linear-gradient(135deg, #58d68d, #2ecc71);
|
||||
box-shadow: 0 0 10px rgba(46, 204, 113, 0.7);
|
||||
}
|
||||
|
||||
/* Styles moved from hanlinyuan.css that are required by the Historiographer panel */
|
||||
|
||||
.hly-control-block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.hly-imperial-brush {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid #555;
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
color: #f0f0f0;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.hly-imperial-brush:focus {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
border-color: #7e57c2;
|
||||
box-shadow: 0 0 10px rgba(126, 87, 194, 0.5);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Combined rule for all toggle switches in this panel */
|
||||
.toggle-switch,
|
||||
.hly-toggle-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 26px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.toggle-switch input,
|
||||
.hly-toggle-switch input { opacity: 0; width: 0; height: 0; }
|
||||
|
||||
.toggle-switch .slider,
|
||||
.hly-toggle-switch .slider {
|
||||
position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-color: #333; border-radius: 26px; transition: .4s;
|
||||
border: 1px solid #555;
|
||||
}
|
||||
.toggle-switch .slider:before,
|
||||
.hly-toggle-switch .slider:before {
|
||||
position: absolute; content: ""; height: 20px; width: 20px; left: 2px; bottom: 2px;
|
||||
background-color: white; border-radius: 50%; transition: .4s;
|
||||
}
|
||||
.toggle-switch input:checked + .slider,
|
||||
.hly-toggle-switch input:checked + .slider {
|
||||
background: linear-gradient(to right, #7e57c2, #5e35b1);
|
||||
box-shadow: 0 0 8px rgba(126, 87, 194, 0.7);
|
||||
}
|
||||
.toggle-switch input:checked + .slider:before,
|
||||
.hly-toggle-switch input:checked + .slider:before { transform: translateX(24px); }
|
||||
|
||||
|
||||
.hly-action-button {
|
||||
padding: 8px 15px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
transition: all 0.3s ease;
|
||||
background-color: var(--amily2-button-color);
|
||||
color: var(--amily2-text-color);
|
||||
border-color: #666;
|
||||
}
|
||||
.hly-action-button:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.hly-button-group {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
/* Ngms API 按钮样式 - 水平扁平按钮 */
|
||||
.ngms-button-row {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button {
|
||||
min-width: 120px;
|
||||
height: 35px;
|
||||
padding: 8px 16px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
text-transform: none;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.primary {
|
||||
background: linear-gradient(135deg, #4CAF50, #45a049);
|
||||
border: 1px solid #388e3c;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.primary:hover {
|
||||
background: linear-gradient(135deg, #5CBF60, #4CAF50);
|
||||
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.secondary {
|
||||
background: linear-gradient(135deg, #2196F3, #1976D2);
|
||||
border: 1px solid #1565C0;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button.secondary:hover {
|
||||
background: linear-gradient(135deg, #42A5F5, #2196F3);
|
||||
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.ngms-button-row .menu_button i {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
@@ -1,274 +1,274 @@
|
||||
#amily2_plot_optimization_panel .settings-group {
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
border-radius: 12px;
|
||||
padding: 12px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
:root {
|
||||
--amily2-bg-color: #2C2C2C;
|
||||
--amily2-button-color: #4A4A4A;
|
||||
--amily2-text-color: #E0E0E0;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .settings-group > legend {
|
||||
color: var(--amily2-text-color);
|
||||
font-weight: bold;
|
||||
padding: 0 10px;
|
||||
margin-left: 10px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .settings-group > legend > i {
|
||||
margin-right: 8px;
|
||||
color: #9e8aff;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-navigation-deck {
|
||||
display: flex;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item {
|
||||
padding: 10px 20px;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
color: var(--amily2-text-color);
|
||||
font-size: 1em;
|
||||
border-bottom: 3px solid transparent;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item:hover {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item.active {
|
||||
color: #9e8aff;
|
||||
border-bottom-color: #9e8aff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item i {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-content-wrapper {
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-tab-pane {
|
||||
display: none;
|
||||
animation: fadeIn 0.5s;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-tab-pane.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .control-block-with-switch {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
border-radius: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .control-block-with-switch label {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: 8px 12px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid label {
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid .text_pole,
|
||||
#amily2_plot_optimization_panel .inline-settings-grid input[type="range"],
|
||||
#amily2_plot_optimization_panel .inline-settings-grid .amily2_opt_preset_selector_wrapper {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-area {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-area > label {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .editor-with-button {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .editor-with-button textarea {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_reset_button {
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .scrollable-container {
|
||||
border: 1px solid #444;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
height: 150px;
|
||||
overflow-y: auto;
|
||||
background-color: var(--amily2-bg-color);
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .worldbook-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_label_with_button_wrapper,
|
||||
#amily2_plot_optimization_panel .amily2_opt_label_with_controls_wrapper {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .radio-group {
|
||||
display: flex;
|
||||
border: 1px solid #555;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
#amily2_plot_optimization_panel .radio-group input[type="radio"] { display: none; }
|
||||
#amily2_plot_optimization_panel .radio-group label {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: 8px 10px;
|
||||
cursor: pointer;
|
||||
background-color: var(--amily2-bg-color);
|
||||
color: var(--amily2-text-color);
|
||||
transition: all 0.3s ease;
|
||||
border-left: 1px solid #555;
|
||||
margin: 0 !important;
|
||||
font-weight: normal !important;
|
||||
}
|
||||
#amily2_plot_optimization_panel .radio-group label:first-of-type { border-left: none; }
|
||||
#amily2_plot_optimization_panel .radio-group input[type="radio"]:checked + label {
|
||||
background-color: #7e57c2;
|
||||
color: white;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
|
||||
/* Horizontal wrapping for button groups */
|
||||
#amily2_plot_optimization_panel .amily2_opt_preset_selector_wrapper,
|
||||
#amily2_plot_optimization_panel #amily2_opt_worldbook_entry_controls {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_preset_selector_wrapper > .text_pole {
|
||||
flex-grow: 1; /* Allow select to take available space */
|
||||
}
|
||||
|
||||
/* Jqyh API button styles */
|
||||
#amily2_plot_optimization_panel .jqyh-button-row {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button {
|
||||
min-width: 120px;
|
||||
height: 35px;
|
||||
padding: 8px 16px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
text-transform: none;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.primary {
|
||||
background: linear-gradient(135deg, #4CAF50, #45a049);
|
||||
border: 1px solid #388e3c;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.primary:hover {
|
||||
background: linear-gradient(135deg, #5CBF60, #4CAF50);
|
||||
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.secondary {
|
||||
background: linear-gradient(135deg, #2196F3, #1976D2);
|
||||
border: 1px solid #1565C0;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.secondary:hover {
|
||||
background: linear-gradient(135deg, #42A5F5, #2196F3);
|
||||
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button i {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Unified Prompt Editor Styles */
|
||||
#amily2_plot_optimization_panel .unified-prompt-editor {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-buttons {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
gap: 10px;
|
||||
margin-top: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-buttons .menu_button {
|
||||
min-width: 120px;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
#amily2_plot_optimization_panel .settings-group {
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
border-radius: 12px;
|
||||
padding: 12px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
:root {
|
||||
--amily2-bg-color: #2C2C2C;
|
||||
--amily2-button-color: #4A4A4A;
|
||||
--amily2-text-color: #E0E0E0;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .settings-group > legend {
|
||||
color: var(--amily2-text-color);
|
||||
font-weight: bold;
|
||||
padding: 0 10px;
|
||||
margin-left: 10px;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .settings-group > legend > i {
|
||||
margin-right: 8px;
|
||||
color: #9e8aff;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-navigation-deck {
|
||||
display: flex;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item {
|
||||
padding: 10px 20px;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
color: var(--amily2-text-color);
|
||||
font-size: 1em;
|
||||
border-bottom: 3px solid transparent;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item:hover {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item.active {
|
||||
color: #9e8aff;
|
||||
border-bottom-color: #9e8aff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-nav-item i {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-content-wrapper {
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-tab-pane {
|
||||
display: none;
|
||||
animation: fadeIn 0.5s;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .sinan-tab-pane.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .control-block-with-switch {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
border-radius: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .control-block-with-switch label {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: 8px 12px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid label {
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
color: var(--amily2-text-color);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .inline-settings-grid .text_pole,
|
||||
#amily2_plot_optimization_panel .inline-settings-grid input[type="range"],
|
||||
#amily2_plot_optimization_panel .inline-settings-grid .amily2_opt_preset_selector_wrapper {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-area {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-area > label {
|
||||
font-weight: bold;
|
||||
color: var(--amily2-text-color);
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .editor-with-button {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .editor-with-button textarea {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_reset_button {
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .scrollable-container {
|
||||
border: 1px solid #444;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
height: 150px;
|
||||
overflow-y: auto;
|
||||
background-color: var(--amily2-bg-color);
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .worldbook-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_label_with_button_wrapper,
|
||||
#amily2_plot_optimization_panel .amily2_opt_label_with_controls_wrapper {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .radio-group {
|
||||
display: flex;
|
||||
border: 1px solid #555;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
#amily2_plot_optimization_panel .radio-group input[type="radio"] { display: none; }
|
||||
#amily2_plot_optimization_panel .radio-group label {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: 8px 10px;
|
||||
cursor: pointer;
|
||||
background-color: var(--amily2-bg-color);
|
||||
color: var(--amily2-text-color);
|
||||
transition: all 0.3s ease;
|
||||
border-left: 1px solid #555;
|
||||
margin: 0 !important;
|
||||
font-weight: normal !important;
|
||||
}
|
||||
#amily2_plot_optimization_panel .radio-group label:first-of-type { border-left: none; }
|
||||
#amily2_plot_optimization_panel .radio-group input[type="radio"]:checked + label {
|
||||
background-color: #7e57c2;
|
||||
color: white;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
|
||||
/* Horizontal wrapping for button groups */
|
||||
#amily2_plot_optimization_panel .amily2_opt_preset_selector_wrapper,
|
||||
#amily2_plot_optimization_panel #amily2_opt_worldbook_entry_controls {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .amily2_opt_preset_selector_wrapper > .text_pole {
|
||||
flex-grow: 1; /* Allow select to take available space */
|
||||
}
|
||||
|
||||
/* Jqyh API button styles */
|
||||
#amily2_plot_optimization_panel .jqyh-button-row {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button {
|
||||
min-width: 120px;
|
||||
height: 35px;
|
||||
padding: 8px 16px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
border-radius: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: all 0.3s ease;
|
||||
text-transform: none;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.primary {
|
||||
background: linear-gradient(135deg, #4CAF50, #45a049);
|
||||
border: 1px solid #388e3c;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.primary:hover {
|
||||
background: linear-gradient(135deg, #5CBF60, #4CAF50);
|
||||
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.secondary {
|
||||
background: linear-gradient(135deg, #2196F3, #1976D2);
|
||||
border: 1px solid #1565C0;
|
||||
color: white;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button.secondary:hover {
|
||||
background: linear-gradient(135deg, #42A5F5, #2196F3);
|
||||
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.4);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .jqyh-button-row .menu_button i {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Unified Prompt Editor Styles */
|
||||
#amily2_plot_optimization_panel .unified-prompt-editor {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-buttons {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
gap: 10px;
|
||||
margin-top: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
#amily2_plot_optimization_panel .prompt-editor-buttons .menu_button {
|
||||
min-width: 120px;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
1506
assets/style.css
1506
assets/style.css
File diff suppressed because it is too large
Load Diff
@@ -1,194 +1,194 @@
|
||||
#sm-modal-container {
|
||||
color: #e0e0e0;
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
padding: 10px;
|
||||
height: calc(100% - 60px); /* Adjust based on header height */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.sm-intro-box {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.sm-intro-box h3 {
|
||||
margin-top: 0;
|
||||
color: #05c3f3; /* Amily Blue */
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.sm-navigation-deck {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.sm-nav-item {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: #888;
|
||||
padding: 8px 15px;
|
||||
cursor: pointer;
|
||||
border-radius: 5px 5px 0 0;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.sm-nav-item:hover {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.sm-nav-item.active {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: #05c3f3;
|
||||
border-bottom: 2px solid #05c3f3;
|
||||
}
|
||||
|
||||
.sm-scroll {
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.sm-tab-pane {
|
||||
display: none;
|
||||
animation: fadeIn 0.3s ease;
|
||||
}
|
||||
|
||||
.sm-tab-pane.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(5px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
.sm-settings-group {
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.sm-settings-group legend {
|
||||
color: #05c3f3;
|
||||
font-weight: bold;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.sm-control-block {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px 0;
|
||||
border-bottom: 1px dashed rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.sm-control-block:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.sm-input {
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
color: #fff;
|
||||
padding: 5px 8px;
|
||||
border-radius: 4px;
|
||||
width: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sm-button-group {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.sm-action-button {
|
||||
flex: 1;
|
||||
padding: 8px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
transition: background 0.2s;
|
||||
background: #4a4a4a;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.sm-action-button.success {
|
||||
background: #28a745;
|
||||
}
|
||||
|
||||
.sm-action-button.success:hover {
|
||||
background: #218838;
|
||||
}
|
||||
|
||||
.sm-action-button.danger {
|
||||
background: #dc3545;
|
||||
}
|
||||
|
||||
.sm-action-button.danger:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
.sm-status-indicator {
|
||||
font-weight: bold;
|
||||
color: #ffc107; /* Warning yellow */
|
||||
}
|
||||
|
||||
/* Toggle Switch */
|
||||
.sm-toggle-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.sm-toggle-switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.sm-slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #ccc;
|
||||
transition: .4s;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.sm-slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
left: 2px;
|
||||
bottom: 2px;
|
||||
background-color: white;
|
||||
transition: .4s;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
input:checked + .sm-slider {
|
||||
background-color: #05c3f3;
|
||||
}
|
||||
|
||||
input:checked + .sm-slider:before {
|
||||
transform: translateX(20px);
|
||||
}
|
||||
#sm-modal-container {
|
||||
color: #e0e0e0;
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
padding: 10px;
|
||||
height: calc(100% - 60px); /* Adjust based on header height */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.sm-intro-box {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.sm-intro-box h3 {
|
||||
margin-top: 0;
|
||||
color: #05c3f3; /* Amily Blue */
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.sm-navigation-deck {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.sm-nav-item {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: #888;
|
||||
padding: 8px 15px;
|
||||
cursor: pointer;
|
||||
border-radius: 5px 5px 0 0;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.sm-nav-item:hover {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.sm-nav-item.active {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
color: #05c3f3;
|
||||
border-bottom: 2px solid #05c3f3;
|
||||
}
|
||||
|
||||
.sm-scroll {
|
||||
flex-grow: 1;
|
||||
overflow-y: auto;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.sm-tab-pane {
|
||||
display: none;
|
||||
animation: fadeIn 0.3s ease;
|
||||
}
|
||||
|
||||
.sm-tab-pane.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(5px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
.sm-settings-group {
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.sm-settings-group legend {
|
||||
color: #05c3f3;
|
||||
font-weight: bold;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.sm-control-block {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px 0;
|
||||
border-bottom: 1px dashed rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.sm-control-block:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.sm-input {
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
color: #fff;
|
||||
padding: 5px 8px;
|
||||
border-radius: 4px;
|
||||
width: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.sm-button-group {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.sm-action-button {
|
||||
flex: 1;
|
||||
padding: 8px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
transition: background 0.2s;
|
||||
background: #4a4a4a;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.sm-action-button.success {
|
||||
background: #28a745;
|
||||
}
|
||||
|
||||
.sm-action-button.success:hover {
|
||||
background: #218838;
|
||||
}
|
||||
|
||||
.sm-action-button.danger {
|
||||
background: #dc3545;
|
||||
}
|
||||
|
||||
.sm-action-button.danger:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
.sm-status-indicator {
|
||||
font-weight: bold;
|
||||
color: #ffc107; /* Warning yellow */
|
||||
}
|
||||
|
||||
/* Toggle Switch */
|
||||
.sm-toggle-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.sm-toggle-switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.sm-slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #ccc;
|
||||
transition: .4s;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.sm-slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
left: 2px;
|
||||
bottom: 2px;
|
||||
background-color: white;
|
||||
transition: .4s;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
input:checked + .sm-slider {
|
||||
background-color: #05c3f3;
|
||||
}
|
||||
|
||||
input:checked + .sm-slider:before {
|
||||
transform: translateX(20px);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user