Files
gemini-banlancer/web/templates/chat.html

171 lines
12 KiB
HTML

{% extends "base.html" %}
{% block title %}Web Chat - GEMINI BALANCER{% endblock %}
{% block content %}
<!-- [核心] 聊天界面的主容器,使用 flex 布局撑满整个可用空间 -->
<div class="w-full h-full flex overflow-hidden rounded-lg border border-border" data-page-id="chat">
<!-- =================================================================== -->
<!-- 1. 左侧栏: 会话列表 -->
<!-- =================================================================== -->
<!-- =================================================================== -->
<!-- 1. 左侧栏: 会话列表 (包含新的设置面板) -->
<!-- =================================================================== -->
<aside class="w-[280px] h-full flex flex-col border-r border-border bg-muted/50 shrink-0">
<!-- 侧边栏头部 -->
<div class="p-4 border-b border-border shrink-0">
<div class="flex items-center justify-between">
<h2 class="text-xl font-bold tracking-tight">会话</h2>
<button id="new-session-btn" class="btn btn-ghost btn-icon btn-sm" aria-label="新建会话">
<i class="fas fa-plus"></i>
</button>
</div>
<div class="relative mt-4">
<i class="fas fa-search absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"></i>
<input id="session-search-input" class="input h-9 pl-10" placeholder="搜索会话...">
</div>
</div>
<!-- 会话列表 (可滚动) -->
<div id="session-list-container" class="flex-grow overflow-y-auto main-content-scroll p-2">
<!-- Session items will be dynamically inserted here by JavaScript -->
</div>
<!-- 设置面板区域: 相对定位上下文 -->
<div class="shrink-0 p-2 border-t border-border relative">
<!-- 快速设置面板: 绝对定位 -->
<div id="quick-settings-panel"
class="absolute bottom-full left-2 right-2 mb-2 p-3 bg-background border border-border rounded-lg shadow-lg grid grid-rows-[0] transition-all duration-300 ease-in-out overflow-hidden invisible data-[expanded=true]:visible data-[expanded=true]:grid-rows-[1]">
<div class="min-h-0 space-y-4">
<div class="space-y-2"><label class="text-sm font-medium">路由模式</label><div class="btn-group grid grid-cols-2 gap-px rounded-md border border-border overflow-hidden"><button data-group="routing-mode" data-value="smart" class="btn-group-item px-3 py-1.5 text-sm bg-background hover:bg-muted focus:relative data-[active=true]:bg-primary data-[active=true]:text-primary-foreground" data-active="true">智能聚合</button><button data-group="routing-mode" data-value="direct" class="btn-group-item px-3 py-1.5 text-sm bg-background hover:bg-muted focus:relative data-[active=true]:bg-primary data-[active=true]:text-primary-foreground">精准路由</button></div></div>
<div id="direct-routing-options" class="hidden space-y-2">
<label class="text-sm font-medium">选择群组</label>
<div id="group-select-container" class="custom-select-v2">
<!-- 1. The trigger button -->
<button class="custom-select-trigger btn btn-secondary btn-sm w-full justify-between">
<span></span> <!-- Text will be populated by JS -->
<i class="fas fa-chevron-down text-xs"></i>
</button>
<!-- 2. The hidden native select for state management -->
<select id="group-select" class="hidden">
<option value="group-a">默认群组</option>
<option value="group-b">测试群组</option>
</select>
<!-- 3. The template for the dropdown panel -->
<template class="custom-select-panel-template">
<div class="custom-select-panel z-50 w-[var(--radix-popper-anchor-width)] bg-background border border-border rounded-md shadow-lg p-1">
<!-- Options will be populated by JS -->
</div>
</template>
</div>
</div>
<div class="space-y-2"><label class="text-sm font-medium">接口方式</label><div class="btn-group grid grid-cols-2 gap-px rounded-md border border-border overflow-hidden"><button data-group="api-interface" data-value="gemini" class="btn-group-item px-3 py-1.5 text-sm bg-background hover:bg-muted focus:relative data-[active=true]:bg-primary data-[active=true]:text-primary-foreground" data-active="true">Gemini</button><button data-group-api-interface="api-interface" data-value="openai" class="btn-group-item px-3 py-1.5 text-sm bg-background hover:bg-muted focus:relative data-[active=true]:bg-primary data-[active=true]:text-primary-foreground">OpenAI</button></div></div>
<div class="space-y-2">
<label class="text-sm font-medium">模型选择</label>
<div id="model-select-container" class="custom-select-v2">
<button id="model-select-btn" class="custom-select-trigger btn btn-secondary btn-sm w-full justify-between">
<span>gemini-1.5-flash</span>
<i class="fas fa-chevron-down text-xs"></i>
</button>
<select id="model-select" class="hidden">
<!-- Options to be added later -->
</select>
<template class="custom-select-panel-template">
<div class="custom-select-panel z-50 w-[var(--radix-popper-anchor-width)] bg-background border border-border rounded-md shadow-lg p-1"></div>
</template>
</div>
</div>
</div>
</div>
<!-- 会话参数面板: 绝对定位 -->
<div id="session-params-panel"
class="absolute bottom-full left-2 right-2 mb-2 p-3 bg-background border border-border rounded-lg shadow-lg grid grid-rows-[0] transition-all duration-300 ease-in-out overflow-hidden invisible data-[expanded=true]:visible data-[expanded=true]:grid-rows-[1]">
<div class="min-h-0 space-y-4">
<!-- [MODIFIED] Replaced switches with a pure Tailwind CSS component -->
<div class="flex items-center justify-between">
<label for="streaming-toggle" class="text-sm font-medium">流式输出</label>
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" id="streaming-toggle" class="sr-only peer" checked>
<div class="w-11 h-6 bg-muted rounded-full peer peer-focus:ring-2 peer-focus:ring-primary/50 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:border-border after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-primary"></div>
</label>
</div>
<div class="flex items-center justify-between">
<label for="thinking-toggle" class="text-sm font-medium">模型思考</label>
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" id="thinking-toggle" class="sr-only peer" checked>
<div class="w-11 h-6 bg-muted rounded-full peer peer-focus:ring-2 peer-focus:ring-primary/50 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:border-border after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-primary"></div>
</label>
</div>
<div class="space-y-2">
<div class="flex justify-between items-center">
<label for="temperature-slider" class="text-sm font-medium">温度</label>
<span id="temperature-value" class="text-sm font-mono text-muted-foreground">0.7</span>
</div>
<input id="temperature-slider" type="range" min="0" max="2" value="0.7" step="0.1" class="slider w-full">
</div>
<div class="space-y-2">
<div class="flex justify-between items-center">
<label for="context-slider" class="text-sm font-medium">上下文</label>
<span id="context-value" class="text-sm font-mono text-muted-foreground">5k</span>
</div>
<input id="context-slider" type="range" min="0" max="25" value="5" step="1" class="slider w-full">
</div>
</div>
</div>
<!-- 底部触发按钮 -->
<div class="flex items-center justify-center gap-2 mt-2">
<button id="toggle-quick-settings" class="btn btn-ghost btn-icon data-[active=true]:bg-muted data-[active=true]:text-accent-foreground" title="快速设置"><i class="fas fa-cog"></i></button>
<button id="toggle-session-params" class="btn btn-ghost btn-icon data-[active=true]:bg-muted data-[active=true]:text-accent-foreground" title="会话参数"><i class="fas fa-sliders-h"></i></button>
</div>
</div>
</aside>
<!-- =================================================================== -->
<!-- 2. 右侧主区域: 聊天窗口 -->
<!-- =================================================================== -->
<main class="flex-1 flex flex-col h-full">
<!-- 聊天窗口头部 -->
<div class="flex items-center p-4 border-b border-border shrink-0">
<h3 class="text-lg font-semibold chat-header-title">新会话</h3>
<div class="ml-auto flex items-center gap-2">
<button id="clear-session-btn" class="btn btn-ghost btn-icon btn-sm" aria-label="清除会话">
<i class="fas fa-eraser"></i>
</button>
<button class="btn btn-ghost btn-icon btn-sm" aria-label="更多选项">
<i class="fas fa-ellipsis-v"></i>
</button>
</div>
</div>
<!-- 消息区域 (可滚动) -->
<div class="flex-grow p-6 overflow-y-auto main-content-scroll" id="chat-scroll-container">
<div class="space-y-6" id="chat-messages-container">
<!--fill with js -->
</div>
</div>
<!-- 输入区域 -->
<div class="p-4 border-t border-border shrink-0 bg-background">
<form id="message-form" class="relative">
<textarea id="message-input" placeholder="输入消息..." class="input w-full min-h-14 pr-24 resize-none overflow-y-hidden" rows="1"></textarea>
<div class="absolute bottom-2 right-2 flex items-center gap-2">
<button type="button" class="btn btn-ghost btn-icon btn-sm" aria-label="附加文件" title="此功能将在未来版本中提供">
<i class="fas fa-paperclip text-muted-foreground/60"></i>
</button>
<button type="submit" id="send-btn" class="btn btn-primary btn-icon w-9 h-9 shrink-0 rounded-full bg-green-500 hover:bg-green-600 dark:bg-green-600 dark:hover:bg-green-700 disabled:bg-green-500/50">
<i class="fas fa-arrow-up text-white dark:text-black"></i>
</button>
</div>
</form>
</div>
</main>
</div>
{% endblock %}
{% block page_scripts %}
{% endblock page_scripts %}