// AI 对话页面 - 简约大气风格 .ai-chat-page { display: flex; height: 100%; width: 100%; background: var(--bg-gradient); color: var(--text-primary); overflow: hidden; .chat-container { flex: 1; display: flex; flex-direction: column; max-width: 1200px; margin: 0 auto; width: 100%; } // ========== 顶部 Header - 已移除 ========== // 模型选择器现已集成到输入框 // ========== 聊天区域 ========== .chat-main { flex: 1; display: flex; flex-direction: column; background: var(--bg-secondary); position: relative; overflow: hidden; // 空状态 .empty-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; .icon { width: 80px; height: 80px; border-radius: 50%; background: var(--primary-light); display: flex; align-items: center; justify-content: center; margin-bottom: 24px; svg { width: 40px; height: 40px; color: var(--primary); } } h2 { font-size: 20px; font-weight: 600; color: var(--text-primary); margin: 0 0 8px; } p { font-size: 14px; color: var(--text-tertiary); margin: 0; } } // 消息列表 .messages-list { flex: 1; overflow-y: auto; padding: 24px 32px; display: flex; flex-direction: column; gap: 20px; &::-webkit-scrollbar { width: 6px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 3px; } .message-row { display: flex; gap: 12px; max-width: 80%; animation: messageIn 0.3s ease-out; // 用户消息 &.user { align-self: flex-end; flex-direction: row-reverse; .avatar { background: var(--primary-light); color: var(--primary); } .bubble { background: var(--primary-gradient); color: white; border-radius: 18px 18px 4px 18px; box-shadow: 0 2px 10px color-mix(in srgb, var(--primary) 20%, transparent); .content { color: white; } } } // AI 消息 &.ai { align-self: flex-start; .avatar { background: var(--bg-tertiary); color: var(--text-secondary); } .bubble { background: var(--card-bg); border: 1px solid var(--border-color); border-radius: 18px 18px 18px 4px; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); } } .avatar { flex-shrink: 0; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .bubble { padding: 12px 16px; flex: 1; min-width: 0; .content, .markdown-content { font-size: 14px; line-height: 1.6; color: var(--text-primary); word-wrap: break-word; overflow-wrap: break-word; } // Markdown 样式 .markdown-content { p { margin: 0 0 0.8em; &:last-child { margin-bottom: 0; } } h1, h2, h3, h4, h5, h6 { margin: 1em 0 0.5em; font-weight: 600; line-height: 1.3; color: var(--text-primary); &:first-child { margin-top: 0; } } h1 { font-size: 1.5em; } h2 { font-size: 1.3em; } h3 { font-size: 1.1em; } ul, ol { margin: 0.5em 0; padding-left: 1.5em; } li { margin: 0.3em 0; } code { background: var(--bg-tertiary); padding: 2px 6px; border-radius: 4px; font-family: 'Consolas', 'Monaco', monospace; font-size: 0.9em; } pre { background: var(--bg-tertiary); padding: 12px; border-radius: 8px; overflow-x: auto; margin: 0.8em 0; code { background: none; padding: 0; } } blockquote { border-left: 3px solid var(--primary); padding-left: 12px; margin: 0.8em 0; color: var(--text-secondary); } a { color: var(--primary); text-decoration: none; &:hover { text-decoration: underline; } } strong { font-weight: 600; color: var(--text-primary); } hr { border: none; border-top: 1px solid var(--border-color); margin: 1em 0; } table { border-collapse: collapse; width: 100%; margin: 0.8em 0; th, td { border: 1px solid var(--border-color); padding: 8px 12px; text-align: left; } th { background: var(--bg-tertiary); font-weight: 600; } } } } } .list-spacer { height: 100px; flex-shrink: 0; } } // 输入区域 .input-area { position: absolute; bottom: 24px; left: 50%; transform: translateX(-50%); width: calc(100% - 64px); max-width: 800px; z-index: 10; .input-wrapper { display: flex; align-items: flex-end; gap: 10px; background: var(--card-bg); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 20px; padding: 10px 14px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08); transition: all 0.2s ease; &:focus-within { border-color: var(--primary); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1), 0 0 0 3px color-mix(in srgb, var(--primary) 15%, transparent); } textarea { flex: 1; min-height: 24px; max-height: 120px; padding: 8px 0; background: transparent; border: none; resize: none; color: var(--text-primary); font-size: 14px; font-family: inherit; line-height: 1.5; &:focus { outline: none; } &::placeholder { color: var(--text-tertiary); } &:disabled { cursor: not-allowed; } } .input-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; // 模型选择器 .model-selector { position: relative; .model-btn { display: flex; align-items: center; justify-content: center; gap: 6px; width: auto; height: 36px; padding: 6px 12px; background: transparent; border: 1px solid var(--border-color); border-radius: 10px; cursor: pointer; color: var(--text-secondary); font-size: 12px; font-weight: 500; white-space: nowrap; transition: all 0.2s ease; flex-shrink: 0; svg { flex-shrink: 0; &.spin { animation: spin 1s linear infinite; } } &:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--text-tertiary); color: var(--text-primary); } &.loaded { background: color-mix(in srgb, var(--primary) 15%, transparent); border-color: var(--primary); color: var(--primary); } &.loading { opacity: 0.7; } &.disabled { opacity: 0.5; cursor: not-allowed; } } .model-dropdown { position: absolute; bottom: 100%; right: 0; margin-bottom: 8px; background: var(--card-bg); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid var(--border-color); border-radius: 12px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); z-index: 100; overflow: hidden; animation: dropdownIn 0.2s ease-out; min-width: 140px; .model-option { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; cursor: pointer; font-size: 13px; color: var(--text-primary); transition: background 0.15s ease; white-space: nowrap; &:hover:not(.disabled) { background: var(--bg-hover); } &.active { background: color-mix(in srgb, var(--primary) 20%, transparent); color: var(--primary); font-weight: 600; .check { color: var(--primary); } } .check { margin-left: 8px; color: var(--text-tertiary); font-weight: 600; } } } } .mode-toggle { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: transparent; border: 1px solid var(--border-color); border-radius: 10px; cursor: pointer; color: var(--text-tertiary); transition: all 0.2s ease; flex-shrink: 0; &:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); } &.active { background: color-mix(in srgb, var(--primary) 15%, transparent); border-color: var(--primary); color: var(--primary); } &:disabled { opacity: 0.4; cursor: not-allowed; } } .send-btn { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: var(--primary-gradient); border: none; border-radius: 10px; cursor: pointer; color: white; transition: all 0.2s ease; flex-shrink: 0; box-shadow: 0 2px 8px color-mix(in srgb, var(--primary) 25%, transparent); &:hover:not(:disabled) { transform: scale(1.05); box-shadow: 0 4px 12px color-mix(in srgb, var(--primary) 35%, transparent); } &:active:not(:disabled) { transform: scale(0.98); } &:disabled { background: var(--bg-tertiary); color: var(--text-tertiary); box-shadow: none; cursor: not-allowed; } } } } } } } @keyframes messageIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes dropdownIn { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }