refactor(components): 全局组件适配暗色主题

- 聊天页面 header 和输入区域背景色使用 CSS 变量
- ChatInput 输入框背景色适配
- ModelSelector/ToolsDropdown 下拉菜单背景色适配
- QuickActions 按钮背景色适配
- Sidebar 侧边栏及下拉菜单背景色适配
- UserMenu 悬停效果颜色适配
This commit is contained in:
gaoziman 2025-12-19 15:58:15 +08:00
parent 0b5b67174f
commit aa469438c2
7 changed files with 15 additions and 10 deletions

View File

@ -207,7 +207,7 @@ export default function ChatPage({ params }: PageProps) {
)} )}
> >
{/* 固定顶部 Header */} {/* 固定顶部 Header */}
<header className="h-[var(--header-height)] px-4 flex items-center justify-between border-b border-[var(--color-border)] bg-white sticky top-0 z-10"> <header className="h-[var(--header-height)] px-4 flex items-center justify-between border-b border-[var(--color-border)] bg-[var(--color-bg-primary)] sticky top-0 z-10">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<SidebarToggle onClick={() => setSidebarOpen(!sidebarOpen)} /> <SidebarToggle onClick={() => setSidebarOpen(!sidebarOpen)} />
<h1 className="text-base font-medium text-[var(--color-text-primary)] truncate max-w-[300px]"> <h1 className="text-base font-medium text-[var(--color-text-primary)] truncate max-w-[300px]">
@ -280,7 +280,12 @@ export default function ChatPage({ params }: PageProps) {
</div> </div>
{/* 固定底部输入框 */} {/* 固定底部输入框 */}
<div className="sticky bottom-0 bg-gradient-to-t from-white via-white to-transparent pt-4"> <div
className="sticky bottom-0 pt-4"
style={{
background: `linear-gradient(to top, var(--color-bg-secondary) 0%, var(--color-bg-secondary) 80%, transparent 100%)`
}}
>
<div className="max-w-[900px] mx-auto px-4 pb-4"> <div className="max-w-[900px] mx-auto px-4 pb-4">
{isStreaming && ( {isStreaming && (
<div className="flex justify-center mb-3"> <div className="flex justify-center mb-3">

View File

@ -52,7 +52,7 @@ export function ChatInput({
<div className={cn('w-full max-w-[var(--input-max-width)] mx-auto', className)}> <div className={cn('w-full max-w-[var(--input-max-width)] mx-auto', className)}>
<div <div
className={cn( className={cn(
'flex flex-col bg-white border border-[var(--color-border)] rounded-[18px] p-4 shadow-[var(--shadow-input)]', 'flex flex-col bg-[var(--color-bg-primary)] border border-[var(--color-border)] rounded-[18px] p-4 shadow-[var(--shadow-input)]',
'transition-all duration-150', 'transition-all duration-150',
'focus-within:border-[var(--color-border-focus)] focus-within:shadow-[var(--shadow-input-focus)]' 'focus-within:border-[var(--color-border-focus)] focus-within:shadow-[var(--shadow-input-focus)]'
)} )}

View File

@ -44,7 +44,7 @@ export function ModelSelector({ models, selectedModel, onSelect }: ModelSelector
{/* 下拉菜单 */} {/* 下拉菜单 */}
<div <div
className={cn( className={cn(
'absolute bottom-full right-0 mb-2 min-w-[160px] bg-white border border-[var(--color-border)] rounded-xl shadow-lg p-1 z-50', 'absolute bottom-full right-0 mb-2 min-w-[160px] bg-[var(--color-bg-primary)] border border-[var(--color-border)] rounded-xl shadow-lg p-1 z-50',
'transition-all duration-150', 'transition-all duration-150',
isOpen isOpen
? 'opacity-100 visible translate-y-0' ? 'opacity-100 visible translate-y-0'

View File

@ -29,7 +29,7 @@ export function QuickActions({ actions, onSelect, className }: QuickActionsProps
onClick={() => onSelect(action)} onClick={() => onSelect(action)}
className={cn( className={cn(
'flex items-center gap-2 px-4 py-2', 'flex items-center gap-2 px-4 py-2',
'bg-white border border-[var(--color-border)] rounded-full', 'bg-[var(--color-bg-primary)] border border-[var(--color-border)] rounded-full',
'text-sm text-[var(--color-text-secondary)]', 'text-sm text-[var(--color-text-secondary)]',
'hover:bg-[var(--color-bg-tertiary)] hover:text-[var(--color-text-primary)]', 'hover:bg-[var(--color-bg-tertiary)] hover:text-[var(--color-text-primary)]',
'transition-all duration-150' 'transition-all duration-150'

View File

@ -63,7 +63,7 @@ export function ToolsDropdown({ tools, onToolToggle, onEnableAllToggle }: ToolsD
{/* 下拉菜单 */} {/* 下拉菜单 */}
<div <div
className={cn( className={cn(
'absolute bottom-full left-0 mb-2 min-w-[220px] bg-white border border-[var(--color-border)] rounded-xl shadow-lg p-2 z-50', 'absolute bottom-full left-0 mb-2 min-w-[220px] bg-[var(--color-bg-primary)] border border-[var(--color-border)] rounded-xl shadow-lg p-2 z-50',
'transition-all duration-150', 'transition-all duration-150',
isOpen isOpen
? 'opacity-100 visible translate-y-0' ? 'opacity-100 visible translate-y-0'

View File

@ -69,7 +69,7 @@ export function Sidebar({ user, isOpen = true }: SidebarProps) {
{/* 侧边栏 */} {/* 侧边栏 */}
<aside <aside
className={cn( className={cn(
'fixed top-0 left-0 bottom-0 z-50 bg-white border-r border-[var(--color-border-light)] flex flex-col transition-all duration-300 ease-in-out overflow-hidden', 'fixed top-0 left-0 bottom-0 z-50 bg-[var(--color-bg-primary)] border-r border-[var(--color-border-light)] flex flex-col transition-all duration-300 ease-in-out overflow-hidden',
isOpen ? 'w-[var(--sidebar-width)]' : 'w-0 border-r-0' isOpen ? 'w-[var(--sidebar-width)]' : 'w-0 border-r-0'
)} )}
> >
@ -146,10 +146,10 @@ export function Sidebar({ user, isOpen = true }: SidebarProps) {
{/* 下拉菜单 */} {/* 下拉菜单 */}
{menuOpen === conversation.conversationId && ( {menuOpen === conversation.conversationId && (
<div className="absolute right-0 top-full mt-1 bg-white border border-[var(--color-border)] rounded-lg shadow-lg py-1 z-10 min-w-[120px]"> <div className="absolute right-0 top-full mt-1 bg-[var(--color-bg-primary)] border border-[var(--color-border)] rounded-lg shadow-lg py-1 z-10 min-w-[120px]">
<button <button
onClick={(e) => handleDeleteConversation(conversation.conversationId, e)} onClick={(e) => handleDeleteConversation(conversation.conversationId, e)}
className="w-full px-3 py-2 text-left text-sm text-red-600 hover:bg-red-50 flex items-center gap-2" className="w-full px-3 py-2 text-left text-sm text-red-500 hover:bg-[var(--color-bg-hover)] flex items-center gap-2"
> >
<Trash2 size={14} /> <Trash2 size={14} />

View File

@ -168,7 +168,7 @@ export function UserMenu({ user }: UserMenuProps) {
className={cn( className={cn(
'flex items-center gap-3 w-full px-4 py-3', 'flex items-center gap-3 w-full px-4 py-3',
'text-sm text-red-500', 'text-sm text-red-500',
'hover:bg-red-50 transition-colors' 'hover:bg-[var(--color-bg-hover)] transition-colors'
)} )}
role="menuitem" role="menuitem"
> >