/* 聊天容器整体布局,保证聊天区可见并支持上下滚动 */ .chat-container { flex: 1; display: flex; flex-direction: column; background: rgba(255, 255, 255, 0.78); min-width: 0; height: var(--app-viewport, 100vh); overflow: hidden; position: relative; backdrop-filter: blur(6px); } .chat-container--monitor .virtual-monitor-surface { flex: 1; } /* 核心聊天区样式,确保对话内容在主面板中可见 */ .messages-area { flex: 1; overflow-y: auto; padding: 24px; padding-top: 30px; padding-bottom: calc(100px + var(--app-bottom-inset, 0px)); min-height: 0; position: relative; } .messages-flow { width: min(960px, 100%); margin: 0 auto; display: flex; flex-direction: column; } .chat-container .input-area { position: absolute; left: 0; right: 0; bottom: 32px; } .messages-area::-webkit-scrollbar, .sidebar::-webkit-scrollbar, .conversation-list::-webkit-scrollbar { width: 8px; } .messages-area::-webkit-scrollbar-track, .sidebar::-webkit-scrollbar-track, .conversation-list::-webkit-scrollbar-track { background: transparent; } .messages-area::-webkit-scrollbar-thumb, .sidebar::-webkit-scrollbar-thumb, .conversation-list::-webkit-scrollbar-thumb { background: rgba(121, 109, 94, 0.4); border-radius: 8px; } .scroll-lock-toggle { position: absolute; right: 28px; bottom: 140px; z-index: 25; display: flex; align-items: center; justify-content: flex-end; } .chat-container--immersive .messages-flow { width: min(900px, 100%); } .chat-container--immersive .scroll-lock-toggle { right: calc((100% - min(900px, 100%)) / 2 + 24px); } .chat-container--mobile { padding-top: 68px; } .scroll-lock-btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--claude-border); background: rgba(255, 255, 255, 0.92); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; box-shadow: 0 6px 16px rgba(61, 57, 41, 0.08); } .scroll-lock-btn:hover { transform: translateY(-2px); box-shadow: 0 9px 20px rgba(61, 57, 41, 0.12); } .scroll-lock-toggle.locked .scroll-lock-btn { border-color: rgba(218, 119, 86, 0.32); box-shadow: 0 0 10px rgba(218, 119, 86, 0.28); } .scroll-lock-btn svg { width: 18px; height: 18px; stroke: var(--claude-text); stroke-width: 1.8; fill: none; transition: stroke 0.2s ease; } .scroll-lock-toggle.locked .scroll-lock-btn svg { stroke: var(--claude-accent); } .message-block { margin-bottom: 24px; } .user-message .message-header, .assistant-message .message-header { font-size: 14px; font-weight: 600; color: var(--claude-text); margin-bottom: 10px; letter-spacing: 0.02em; } .user-message .message-text, .assistant-message .message-text { padding: 16px 20px; border-radius: 18px; font-size: 15px; line-height: 1.6; box-shadow: 0 12px 28px rgba(61, 57, 41, 0.08); color: var(--claude-text); white-space: pre-wrap; } .user-message .message-text { background: rgba(255, 255, 255, 0.88); } .assistant-message .message-text { background: rgba(218, 119, 86, 0.12); border-left: 4px solid var(--claude-accent); } .assistant-generating-block { width: 100%; } .text-content.assistant-generating-placeholder { display: flex; width: 100%; align-items: center; gap: 0.08em; padding: 8px 0 16px; margin: 0; font-size: 15px; font-weight: 600; color: var(--claude-text); letter-spacing: 0.08em; background: transparent; border: none; box-shadow: none; } .assistant-generating-letter { display: inline-block; opacity: 0.35; transform: translateY(0); animation: assistant-generating-wave 1.6s ease-in-out infinite; } @keyframes assistant-generating-wave { 0%, 100% { opacity: 0.35; transform: translateY(0); } 20% { opacity: 1; transform: translateY(-3px) scale(1.05); } 40% { opacity: 0.65; transform: translateY(0); } } .thinking-content { white-space: pre-wrap; word-wrap: break-word; font-family: 'SF Mono', 'Monaco', 'Consolas', monospace; font-size: 13px; line-height: 1.6; color: var(--claude-text-secondary); scrollbar-width: none; } .thinking-content::-webkit-scrollbar { display: none; } .collapsible-block { background: rgba(255, 255, 255, 0.78); border-radius: 12px; margin-bottom: 12px; overflow: hidden; border: 1px solid var(--claude-border); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 12px 28px rgba(61, 57, 41, 0.08); } .collapsible-header { padding: 14px 20px; cursor: pointer; display: flex; align-items: center; gap: 12px; user-select: none; background: rgba(255, 255, 255, 0.72); transition: background-color 0.2s ease; position: relative; } .collapsible-header:hover { background: rgba(218, 119, 86, 0.07); } .arrow { width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); color: var(--claude-text-secondary); } .arrow::before { content: '›'; font-size: 18px; } .collapsible-block.expanded .arrow { transform: rotate(90deg); } .captured-status { display: flex; align-items: center; gap: 6px; font-size: 14px; color: var(--claude-text); } .collapsible-content { max-height: 0; overflow: hidden; opacity: 0; transition: max-height 0.26s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.26s cubic-bezier(0.4, 0, 0.2, 1); } .collapsible-block.expanded .collapsible-content { max-height: 600px; overflow-y: auto; opacity: 1; } .content-inner { padding: 20px 20px 20px 56px; font-size: 14px; line-height: 1.6; color: var(--claude-text-secondary); scrollbar-width: none; } .content-inner::-webkit-scrollbar { display: none; } .action-item { animation: slideInFade 0.6s cubic-bezier(0.4, 0, 0.2, 1) both; } .action-item.streaming-content, .action-item.immediate-show { animation: quickFadeIn 0.2s ease-out both; } .action-item.completed-tool { animation: slideInFade 0.4s cubic-bezier(0.4, 0, 0.2, 1) both; animation-delay: 100ms; } .action-item.thinking-finished { animation: none; } .stacked-blocks-wrapper { margin: 12px 0 8px; } .stacked-shell { position: relative; border: 1px solid var(--claude-border); border-radius: 16px; background: var(--claude-card); box-shadow: var(--claude-shadow); overflow: hidden; transition: height 280ms cubic-bezier(0.25, 0.9, 0.3, 1), padding-top 280ms cubic-bezier(0.25, 0.9, 0.3, 1); min-height: 0; } .stacked-inner { position: relative; width: 100%; transition: transform 280ms cubic-bezier(0.25, 0.9, 0.3, 1); } .stacked-viewport { overflow: hidden; position: relative; width: 100%; } .stacked-item { border-bottom: 1px solid var(--claude-border); } .stacked-item:last-child { border-bottom: none; } .stacked-block { margin: 0; border: none; border-radius: 0; box-shadow: none; background: transparent; } .stacked-more-block { position: absolute; inset: 0 0 auto 0; background: var(--claude-card); border-bottom: 0 solid var(--claude-border); display: flex; align-items: center; gap: 10px; padding: 0 22px; height: 0; opacity: 0; overflow: hidden; cursor: pointer; z-index: 2; transition: height 280ms cubic-bezier(0.25, 0.9, 0.3, 1), padding 280ms cubic-bezier(0.25, 0.9, 0.3, 1), border-bottom-width 280ms cubic-bezier(0.25, 0.9, 0.3, 1), opacity 160ms ease; } .stacked-more-block.visible { opacity: 1; padding: 14px 22px; border-bottom-width: 1px; } .more-icon { width: 18px; height: 18px; display: inline-block; object-fit: contain; } .more-copy { display: flex; flex-direction: column; gap: 2px; } .more-title { font-weight: 700; color: var(--claude-text); } .more-desc { color: var(--claude-text-secondary); font-size: 12px; } .stacked-enter-from { opacity: 0; transform: translateY(14px); } .stacked-enter-active, .stacked-appear-active { transition: all 220ms cubic-bezier(0.4, 0, 0.2, 1); transition-delay: 120ms; } .stacked-leave-active { position: absolute; width: 100%; transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); } .stacked-leave-to { opacity: 0; transform: translateY(-12px); } .stacked-appear-from { opacity: 0; transform: translateY(14px); } .stacked-move { transition: transform 220ms cubic-bezier(0.4, 0, 0.2, 1); } .stacked-block .collapsible-content { transition: max-height 280ms cubic-bezier(0.25, 0.9, 0.3, 1), opacity 220ms ease; } .progress-indicator { position: absolute; bottom: 0; left: 0; height: 2px; background: var(--claude-accent); animation: progress-bar 2s ease-in-out infinite; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } .collapsible-block.processing .progress-indicator { opacity: 1; } @keyframes progress-bar { 0% { width: 0%; left: 0%; } 50% { width: 40%; left: 30%; } 100% { width: 0%; left: 100%; } } .status-text { font-size: 14px; color: var(--claude-text); font-weight: 500; } .collapsible-block.processing .status-text { color: var(--claude-text-secondary); } .tool-desc { color: var(--claude-text-secondary); font-size: 12px; margin-left: 8px; } @keyframes slideInFade { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes quickFadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } } .text-output { margin: 16px 0; color: var(--claude-text); font-size: 15px; line-height: 1.7; } .text-output .text-content { padding: 0 20px 0 15px; } .text-output .text-content table { width: 100%; border-collapse: collapse; margin: 16px 0; background: rgba(255, 255, 255, 0.92); border-radius: 12px; overflow: hidden; box-shadow: 0 8px 20px rgba(61, 57, 41, 0.06); } .text-output .text-content thead { background: rgba(218, 119, 86, 0.1); } .text-output .text-content th, .text-output .text-content td { border: 1px solid rgba(118, 103, 84, 0.18); padding: 10px 14px; text-align: left; vertical-align: middle; font-size: 14px; } .text-output .text-content th { font-weight: 600; color: var(--claude-text); } .system-action { margin: 12px 0; padding: 10px 14px; border-radius: 8px; background: linear-gradient(135deg, rgba(99, 102, 241, 0.08), rgba(59, 130, 246, 0.08)); border-left: 4px solid rgba(79, 70, 229, 0.6); color: var(--claude-text); font-size: 14px; line-height: 1.5; } .system-action-content { display: flex; align-items: flex-start; gap: 8px; } .append-block, .append-placeholder { margin: 12px 0; padding: 12px 16px; border-radius: 10px; background: rgba(255, 255, 255, 0.82); border-left: 4px solid rgba(218, 119, 86, 0.32); box-shadow: inset 0 0 0 1px rgba(218, 119, 86, 0.05); display: flex; flex-direction: column; gap: 8px; color: var(--claude-text); } .append-block.append-error, .append-placeholder.append-error { background: rgba(255, 244, 242, 0.85); border-left-color: rgba(216, 90, 66, 0.38); } .append-header { display: flex; align-items: center; gap: 10px; font-weight: 600; } .code-block-wrapper { border: 2px solid rgba(118, 103, 84, 0.25); border-radius: 12px; overflow: hidden; margin: 16px 0; background: rgba(255, 255, 255, 0.78); min-height: 80px; } .code-block-header { background: rgba(218, 119, 86, 0.08); padding: 10px 16px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(118, 103, 84, 0.25); } .code-language { color: var(--claude-text-secondary); font-size: 13px; font-family: 'SF Mono', 'Monaco', 'Consolas', monospace; font-weight: 500; } .copy-code-btn { width: 32px; height: 32px; border: none; padding: 0; border-radius: 50%; background-color: transparent; background-image: url('/static/icons/copy.svg'); background-repeat: no-repeat; background-position: center; background-size: 20px; cursor: pointer; transition: opacity 0.2s ease; } .copy-code-btn:hover { opacity: 0.7; } .copy-code-btn.copied { opacity: 0.35; } .code-block-wrapper pre { background: #ffffff !important; padding: 16px !important; margin: 0 !important; border-radius: 0 !important; border: none !important; } .code-block-wrapper pre code { background: transparent !important; padding: 0 !important; color: #000000; } .streaming-text { display: block; } .cursor-blink { animation: blink 1s steps(1) infinite; color: var(--claude-accent); } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }