Merge pull request '添加计时器,麦克风,摄像头开关' (#45) from develop-frontend8 into develop 33分钟前 #46

Merged
huanghaosheng merged 60 commits from develop into main 2026-06-13 20:43:07 +08:00
3 changed files with 158 additions and 63 deletions
Showing only changes of commit f17c3c24a7 - Show all commits

View File

@@ -140,7 +140,7 @@ body {
/* ---- 左侧视频面板 ---- */
.video-panel {
width: 340px;
width: 400px;
flex-shrink: 0;
display: flex;
flex-direction: column;
@@ -392,44 +392,107 @@ body {
border: 1px solid rgba(245, 158, 11, 0.2);
}
/* ---- Config Panel ---- */
/* ---- Drawer (Config Panel) ---- */
.config-panel {
.drawer-overlay {
position: fixed;
inset: 0;
z-index: 100;
background: rgba(0, 0, 0, 0.4);
backdrop-filter: blur(2px);
animation: fadeIn 0.2s ease;
}
.drawer {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 320px;
background: var(--color-surface);
border-bottom: 1px solid var(--color-border);
padding: 16px 24px;
border-left: 1px solid var(--color-border);
display: flex;
flex-direction: column;
animation: slideInRight 0.25s ease;
box-shadow: -8px 0 24px rgba(0, 0, 0, 0.3);
}
.drawer__header {
display: flex;
align-items: center;
gap: 24px;
justify-content: space-between;
padding: 14px 16px;
border-bottom: 1px solid var(--color-border);
flex-shrink: 0;
}
.config-panel__header {
display: flex;
align-items: center;
gap: 8px;
.drawer__title {
font-weight: 600;
font-size: 0.85rem;
font-size: 0.9rem;
}
.config-panel__close {
.drawer__close {
background: none;
border: none;
color: var(--color-text-muted);
cursor: pointer;
font-size: 0.9rem;
padding: 2px 6px;
font-size: 1rem;
padding: 4px 8px;
border-radius: var(--radius-sm);
transition: all 0.15s;
}
.config-panel__close:hover {
.drawer__close:hover {
background: var(--color-surface-2);
color: var(--color-text);
}
.drawer__body {
flex: 1;
overflow-y: auto;
padding: 16px;
}
/* ---- Config Group ---- */
.config-group {
margin-bottom: 20px;
}
.config-group__title {
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--color-text-muted);
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid var(--color-border);
}
.config-row {
display: flex;
align-items: center;
gap: 8px;
justify-content: space-between;
padding: 10px 0;
font-size: 0.82rem;
color: var(--color-text);
cursor: pointer;
}
.config-row__info {
display: flex;
flex-direction: column;
gap: 2px;
}
.config-row__label {
font-weight: 500;
color: var(--color-text);
}
.config-row__desc {
font-size: 0.72rem;
color: var(--color-text-muted);
}
@@ -439,8 +502,15 @@ body {
color: var(--color-text);
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
padding: 4px 8px;
padding: 5px 10px;
font-size: 0.8rem;
cursor: pointer;
}
.config-row input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
}
/* ---- Toast ---- */
@@ -559,6 +629,16 @@ body {
to { opacity: 1; transform: translateX(0); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideInRight {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
/* ---- Scrollbar ---- */
::-webkit-scrollbar {

View File

@@ -54,15 +54,13 @@ function App() {
<span className={`badge badge--${connectionStatus}`}>
{isConnected ? "已连接" : connectionStatus === "connecting" ? "连接中..." : "未连接"}
</span>
{isConnected && (
<button
className="btn-icon"
onClick={() => setShowConfig((v) => !v)}
title="设置"
>
</button>
)}
<button
className="btn-icon"
onClick={() => setShowConfig((v) => !v)}
title="设置"
>
</button>
</div>
</header>

View File

@@ -1,5 +1,5 @@
// ============================================================
// ConfigPanel — 会话配置面板
// ConfigPanel — 右侧抽屉式配置面板
// 职责TTS 开关、detail level 切换、语言选择
// ============================================================
@@ -13,43 +13,60 @@ interface ConfigPanelProps {
export function ConfigPanel({ config, onUpdate, onClose }: ConfigPanelProps) {
return (
<div className="config-panel">
<div className="config-panel__header">
<span></span>
<button className="config-panel__close" onClick={onClose}></button>
<div className="drawer-overlay" onClick={onClose}>
<div className="drawer" onClick={(e) => e.stopPropagation()}>
<div className="drawer__header">
<span className="drawer__title"></span>
<button className="drawer__close" onClick={onClose}></button>
</div>
<div className="drawer__body">
<div className="config-group">
<div className="config-group__title"></div>
<label className="config-row">
<div className="config-row__info">
<span className="config-row__label"></span>
<span className="config-row__desc">AI </span>
</div>
<input
type="checkbox"
checked={config.ttsEnabled}
onChange={(e) => onUpdate({ ttsEnabled: e.target.checked })}
/>
</label>
<label className="config-row">
<div className="config-row__info">
<span className="config-row__label"></span>
<span className="config-row__desc"></span>
</div>
<select
value={config.detailLevel}
onChange={(e) => onUpdate({ detailLevel: e.target.value as "low" | "high" })}
>
<option value="low"></option>
<option value="high"></option>
</select>
</label>
<label className="config-row">
<div className="config-row__info">
<span className="config-row__label"></span>
<span className="config-row__desc"></span>
</div>
<select
value={config.language}
onChange={(e) => onUpdate({ language: e.target.value })}
>
<option value="zh-CN"></option>
<option value="en-US">English</option>
<option value="ja-JP"></option>
</select>
</label>
</div>
</div>
</div>
<label className="config-row">
<span></span>
<input
type="checkbox"
checked={config.ttsEnabled}
onChange={(e) => onUpdate({ ttsEnabled: e.target.checked })}
/>
</label>
<label className="config-row">
<span></span>
<select
value={config.detailLevel}
onChange={(e) => onUpdate({ detailLevel: e.target.value as "low" | "high" })}
>
<option value="low"></option>
<option value="high"></option>
</select>
</label>
<label className="config-row">
<span></span>
<select
value={config.language}
onChange={(e) => onUpdate({ language: e.target.value })}
>
<option value="zh-CN"></option>
<option value="en-US">English</option>
<option value="ja-JP"></option>
</select>
</label>
</div>
);
}