/* 聊天容器整体布局,保证聊天区可见并支持上下滚动 */ .chat-container { --chat-surface-color: var(--surface-panel); --chat-rail-max: 900px; --chat-rail-fluid: 94%; --chat-scrollbar-width: 8px; --chat-rail-width: min(var(--chat-rail-max), var(--chat-rail-fluid)); --chat-message-rail-width: min( var(--chat-rail-max), calc(var(--chat-rail-fluid) + (var(--chat-scrollbar-width) * 0.94)) ); --chat-content-x: 0px; --composer-base-height: calc(90px + var(--app-bottom-inset)); --composer-reserved-height: var(--composer-base-height); --composer-growth-height: 0px; flex: 1; display: flex; flex-direction: column; background: var(--chat-surface-color); min-width: 0; height: var(--app-viewport); overflow: hidden; position: relative; backdrop-filter: blur(6px); } .conversation-ribbon { position: absolute; inset: 0 0 auto 0; height: 44px; padding: 8px 16px; display: flex; align-items: center; justify-content: space-between; color: var(--text-primary); background: var(--chat-surface-color); /* 与对话区域保持一致且不透明 */ box-shadow: none; pointer-events: auto; user-select: none; backdrop-filter: none; z-index: 40; gap: 12px; } .conversation-ribbon::after { content: ''; position: absolute; left: 0; right: 0; bottom: -8px; height: 16px; background: var(--chat-surface-color); mask-image: linear-gradient( 180deg, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0.6) 55%, rgba(0, 0, 0, 0) 100% ); -webkit-mask-image: linear-gradient( 180deg, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0.6) 55%, rgba(0, 0, 0, 0) 100% ); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); pointer-events: none; } .conversation-ribbon__text { font-weight: 700; font-size: 15px; line-height: 1.4; letter-spacing: 0.02em; font-family: 'Iowan Old Style', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; max-width: 60%; color: var(--text-primary); text-shadow: 0 1px 6px var(--shadow-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .chat-container.has-title-ribbon .messages-area { padding-top: 54px; } .chat-container--monitor .virtual-monitor-surface { flex: 1; } /* 核心聊天区样式,确保对话内容在主面板中可见 */ .messages-area { flex: 1; overflow-y: auto; overflow-x: hidden; overflow-anchor: none; padding: 24px; padding-top: 30px; padding-bottom: 20px; min-height: 0; position: relative; contain: layout style; } .messages-area.messages-area--stick { overflow-anchor: none; } .messages-area.messages-area--render-pending .messages-flow, .messages-area.messages-area--render-pending .messages-bottom-spacer { visibility: hidden; } .messages-flow { position: relative; left: calc(var(--chat-scrollbar-width) / 2); width: var(--chat-message-rail-width); margin: 0 auto; display: flex; flex-direction: column; contain: layout style; } .messages-flow > .message-block.message-block--last { margin-bottom: 0; } .messages-bottom-spacer { width: 1px; height: var(--composer-growth-height, 0px); min-height: var(--composer-growth-height, 0px); pointer-events: none; user-select: none; } .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: var(--text-muted); border-radius: 8px; } .scroll-lock-toggle { position: fixed; right: 8px; bottom: 100px; z-index: 25; display: flex; align-items: center; justify-content: flex-end; } .scroll-to-bottom-fade-enter-active, .scroll-to-bottom-fade-leave-active { transition: opacity 0.2s ease, transform 0.2s ease; } .scroll-to-bottom-fade-enter-from, .scroll-to-bottom-fade-leave-to { opacity: 0; transform: translateY(8px); } .chat-container--immersive .scroll-lock-toggle { right: 8px; } .chat-container--mobile { --chat-rail-fluid: 100%; padding-top: 52px; } .chat-container--mobile.chat-container--app-shell { --chat-scrollbar-width: 0px !important; --chat-message-rail-width: var(--chat-rail-width) !important; } @media (max-width: 768px) { .chat-container { --chat-rail-fluid: 100%; --composer-base-height: calc(90px + var(--app-bottom-inset)); --composer-reserved-height: var(--composer-base-height); } .chat-container--mobile { padding-top: 44px; } .messages-area { padding-top: 8px; padding-left: 12px !important; padding-right: 12px !important; } .message-block:first-child { margin-top: 0; } .user-message .message-text { max-width: 80% !important; } .assistant-message .message-text { padding: 16px 8px !important; } } /* 额外的手机端样式,不依赖 mobile 类 */ @media (max-width: 768px) { .messages-flow { left: 0; padding-left: 0; padding-right: 0; } } .conversation-ribbon__selector { pointer-events: auto; display: inline-flex; align-items: center; gap: 6px; padding: 0; border-radius: 0; border: none; background: transparent; box-shadow: none; color: var(--text-primary); font-weight: 600; font-size: 15px; line-height: 1.35; font-family: 'Iowan Old Style', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; cursor: pointer; transition: color 0.15s ease; } .conversation-ribbon__selector:hover { color: var(--text-primary); } .conversation-ribbon__selector:disabled { opacity: 0.6; cursor: not-allowed; } .conversation-ribbon__selector.open { color: var(--text-primary); } .selector-label { display: inline-flex; align-items: center; gap: 6px; } .selector-model { font-weight: 700; } .selector-sep { opacity: 0.6; } .selector-mode { font-weight: 500; color: var(--text-secondary); } .selector-caret { width: 14px; height: 14px; stroke: currentColor; } .model-mode-dropdown { position: absolute; top: 48px; left: 16px; display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(160px, 0.65fr); gap: 12px; padding: 12px; border-radius: 14px; background: var(--surface-soft); box-shadow: none; pointer-events: auto; width: min(640px, calc(100vw - 32px)); max-width: calc(100vw - 32px); z-index: 50; } .model-mode-dropdown--mobile { position: fixed; top: 52px; left: 12px; right: auto; width: min(480px, calc(100vw - 24px)); min-width: 0; max-width: min(480px, calc(100vw - 24px)); grid-template-columns: 1fr 1fr; gap: 8px; z-index: 1600; } .model-mode-dropdown--mobile .dropdown-item { grid-template-columns: 1fr auto; } .model-mode-dropdown--mobile .item-desc { display: none; } .dropdown-column { display: flex; flex-direction: column; gap: 6px; } .dropdown-list { display: flex; flex-direction: column; gap: 6px; } .dropdown-list--models { max-height: 320px; /* 最多显示约 5 个模型 */ overflow-y: auto; -ms-overflow-style: none; scrollbar-width: none; } .dropdown-list--models::-webkit-scrollbar { width: 0; height: 0; } .model-mode-dropdown--mobile .dropdown-list--models { max-height: 260px; } .dropdown-title { font-size: 12px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-secondary); padding: 2px 12px; } .dropdown-item { text-align: left; background: transparent; border: 1px solid transparent; border-radius: 12px; padding: 10px 12px; display: grid; grid-template-columns: 1fr auto; gap: 6px; cursor: pointer; transition: all 0.18s ease; color: var(--text-primary); } .dropdown-item:hover:not(.disabled) { background: var(--hover-bg); } .dropdown-item.disabled { opacity: 0.55; cursor: not-allowed; } .item-label { font-weight: 700; font-size: 14px; } .item-desc { grid-column: 1 / 2; font-size: 12px; color: var(--text-secondary); } .item-check { align-self: center; font-weight: 800; color: var(--text-primary); } .header-menu-enter-active, .header-menu-leave-active { transition: all 0.16s ease, opacity 0.16s ease; transform-origin: top left; } .header-menu-enter-from, .header-menu-leave-to { opacity: 0; transform: translateY(-6px) scale(0.98); } .scroll-lock-btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--claude-border); background: var(--surface-soft); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; box-shadow: none; } .scroll-lock-btn:hover { transform: translateY(-2px); box-shadow: none; } .scroll-lock-toggle.locked .scroll-lock-btn { border-color: var(--claude-accent); box-shadow: none; } .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; min-width: 0; } .message-block.message-block--sub-agent-notice { margin-bottom: 8px; } .message-block.message-block--before-sub-agent-notice { margin-bottom: 8px; } .message-block.message-block--before-sub-agent-notice .minimal-blocks-container { margin-bottom: 8px; } .message-block.message-block--before-sub-agent-notice .minimal-blocks-container > :last-child { margin-bottom: 0; } .message-block.message-block--sub-agent-notice .minimal-blocks-container { margin: 0; } .user-message { display: flex; flex-direction: column; align-items: flex-end; /* 靠右对齐 */ } /* 多智能体消息:左侧对话气泡,内部渲染 Markdown */ .user-message.user-message--multi-agent { align-items: flex-start; } .message-block.message-block--multi-agent { margin-bottom: 12px; } .user-message.user-message--multi-agent .message-header { align-self: flex-start; } .user-message.user-message--multi-agent .message-header.message-header--hidden { display: none; } .user-message.user-message--multi-agent .message-text { align-self: flex-start; } .user-message.user-message--multi-agent .message-text.user-bubble-text .bubble-text { white-space: normal; word-break: normal; } /* 首尾元素贴合气泡内边距,避免 XML 内容换行导致的空段落撑开间距 */ .user-message.user-message--multi-agent .bubble-text .markdown-text-segment > *:first-child { margin-top: 0; } .user-message.user-message--multi-agent .bubble-text .markdown-text-segment > *:last-child { margin-bottom: 0; } .user-message.user-message--multi-agent .bubble-text p:empty { display: none; } .user-message.user-message--multi-agent .bubble-text h1, .user-message.user-message--multi-agent .bubble-text h2, .user-message.user-message--multi-agent .bubble-text h3, .user-message.user-message--multi-agent .bubble-text h4, .user-message.user-message--multi-agent .bubble-text h5, .user-message.user-message--multi-agent .bubble-text h6 { margin: 14px 0 6px; font-weight: 600; line-height: 1.3; color: var(--claude-text); } .user-message.user-message--multi-agent .bubble-text h1 { font-size: 1.5em; } .user-message.user-message--multi-agent .bubble-text h2 { font-size: 1.3em; } .user-message.user-message--multi-agent .bubble-text h3 { font-size: 1.15em; } .user-message.user-message--multi-agent .bubble-text h4, .user-message.user-message--multi-agent .bubble-text h5, .user-message.user-message--multi-agent .bubble-text h6 { font-size: 1em; } .user-message.user-message--multi-agent .bubble-text p { margin: 6px 0; } .user-message.user-message--multi-agent .bubble-text strong, .user-message.user-message--multi-agent .bubble-text b { font-weight: 700; } .user-message.user-message--multi-agent .bubble-text em, .user-message.user-message--multi-agent .bubble-text i { font-style: italic; } .user-message.user-message--multi-agent .bubble-text ul, .user-message.user-message--multi-agent .bubble-text ol { margin: 6px 0; padding-left: 1.4em; } .user-message.user-message--multi-agent .bubble-text li { margin: 3px 0; } .user-message.user-message--multi-agent .bubble-text blockquote { margin: 10px 0; padding: 4px 12px; border-left: 3px solid var(--claude-border); color: var(--claude-text-secondary); } .user-message.user-message--multi-agent .bubble-text hr { margin: 14px 0; border: none; border-top: 1px solid var(--claude-border); } /* 代码/表格底色基于气泡色 chip-bg 派生,避免与气泡背景融为一体 */ .user-message.user-message--multi-agent .bubble-text code { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace; background: color-mix(in srgb, var(--claude-text) 7%, var(--chip-bg)); padding: 2px 5px; border-radius: 4px; font-size: 0.9em; } .user-message.user-message--multi-agent .bubble-text pre { background: color-mix(in srgb, var(--claude-text) 5%, var(--chip-bg)); padding: 10px 12px; border-radius: 8px; overflow-x: auto; margin: 10px 0; } .user-message.user-message--multi-agent .bubble-text pre code { background: transparent; padding: 0; } .user-message.user-message--multi-agent .bubble-text table { width: 100%; border-collapse: collapse; margin: 10px 0; background: transparent; } .user-message.user-message--multi-agent .bubble-text .md-table-scroll, .user-message.user-message--multi-agent .bubble-text [data-md-table-scroll='1'] { display: block; width: auto; max-width: none; margin: 10px 0; overflow-x: auto; overflow-y: hidden; border: 1px solid var(--claude-border); border-radius: 8px; background: color-mix(in srgb, var(--claude-text) 4%, var(--chip-bg)); } .user-message.user-message--multi-agent .bubble-text .md-table-scroll > table, .user-message.user-message--multi-agent .bubble-text [data-md-table-scroll='1'] > table { margin: 0; } .user-message.user-message--multi-agent .bubble-text th, .user-message.user-message--multi-agent .bubble-text td { border: 1px solid var(--claude-border); padding: 6px 10px; text-align: left; vertical-align: middle; font-size: 14px; } .user-message.user-message--multi-agent .bubble-text th { font-weight: 600; background: color-mix(in srgb, var(--claude-text) 7%, var(--chip-bg)); } .message-block--last .user-message:not(.user-message--compact):not(.user-message--brief):not( .user-message--multi-agent ) { position: relative; } .message-block--last .user-message:not(.user-message--compact):not(.user-message--brief):not( .user-message--multi-agent ) .user-bubble-actions { position: absolute; right: 0; top: 100%; margin-top: 4px; z-index: 1; } .message-block--last .assistant-message .text-output { margin-top: 0; margin-bottom: 0; } .message-block--last .assistant-message .text-content > :last-child, .message-block--last .assistant-message .markdown-renderer > :last-child, .message-block--last .assistant-message .markdown-text-segment > :last-child, .message-block--last .assistant-message .md-table-scroll:last-child, .message-block--last .assistant-message [data-md-table-scroll='1']:last-child, .message-block--last .assistant-message .chat-inline-card:last-child, .message-block--last .assistant-message .chat-inline-card--image:last-child, .message-block--last .assistant-message .show-file-card:last-child, .message-block--last .assistant-message .show-file-card-root:last-child { margin-bottom: 0 !important; } .user-message.user-message--compact { align-items: center; } .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; } .assistant-work-status { margin-left: 8px; font-size: 12px; font-weight: 500; color: var(--claude-text-secondary); } .assistant-generating-placeholder { display: inline-flex; align-items: center; color: var(--claude-text-secondary); font-size: 14px; font-weight: 500; letter-spacing: 0.05em; } .assistant-generating-letter { display: inline-block; opacity: 0.42; transform: translateY(0); animation: assistant-generating-letter-wave 1.6s ease-in-out infinite; } @keyframes assistant-generating-letter-wave { 0%, 100% { opacity: 0.42; transform: translateY(0); } 20% { opacity: 1; transform: translateY(-3px); } 42% { opacity: 0.68; transform: translateY(0); } } .user-message .message-text, .assistant-message .message-text { padding: 16px 20px; border-radius: 18px; font-size: 15px; line-height: 1.6; box-shadow: none; color: var(--claude-text); white-space: pre-wrap; word-break: break-all; overflow-wrap: normal; } .user-message .message-text { background: var(--chip-bg); display: flex; flex-direction: column; gap: 10px; max-width: 60%; /* 最大宽度 60% */ width: fit-content; /* 根据内容自适应宽度 */ align-self: flex-end; /* 确保靠右 */ } .user-message.user-message--compact .message-text { max-width: min(760px, 88%); align-self: center; padding: 10px 14px; border-radius: 14px; font-size: 13px; color: var(--claude-text-secondary); background: var(--theme-surface-card); border: 1px solid var(--theme-control-border); } /* 简略信息:以横跨显示区域的横线包裹一行概要文字(类似 markdown 的 --- 分隔线)。 */ .user-message.user-message--brief { align-items: stretch; width: 100%; } .user-message.user-message--brief .compact-brief-line { display: flex; align-items: center; gap: 14px; width: 100%; margin: 2px auto; color: var(--claude-text-secondary); user-select: none; } .user-message.user-message--brief .compact-brief-line::before, .user-message.user-message--brief .compact-brief-line::after { content: ''; flex: 1 1 auto; height: 0; border-top: 1px solid var(--theme-control-border); } .user-message.user-message--brief .compact-brief-text { flex: 0 0 auto; font-size: 12.5px; letter-spacing: 0.04em; white-space: nowrap; opacity: 0.9; } .user-message .message-text .user-skill-link, .user-message .message-text .user-file-link { color: var(--state-info); font-weight: 600; display: inline-block; margin: 0 0.25em; } /* 用户输入气泡:超长折叠、展开动画与悬停操作按钮 */ .user-message .message-text.user-bubble-text .bubble-text { overflow: hidden; transition: max-height 300ms cubic-bezier(0.4, 0, 0.2, 1); max-height: var(--bubble-full-height, 9999px); white-space: pre-wrap; word-break: break-all; position: relative; } .user-message .message-text.user-bubble-text.is-history-loading .bubble-text { transition: none !important; } /* 可折叠气泡容器 */ .user-message .message-text.user-bubble-text.is-expandable { position: relative; } /* 可折叠气泡:多显示一行,底部竖直渐变淡出 */ .user-message .message-text.user-bubble-text.is-expandable .bubble-text:not(.is-expanded) { max-height: calc(var(--bubble-fold-height, 240px) + 1.6em); } .user-message .message-text.user-bubble-text.is-expandable .bubble-text::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1.6em; background: linear-gradient(to bottom, transparent, var(--chip-bg)); pointer-events: none; opacity: 1; transition: opacity 300ms cubic-bezier(0.4, 0, 0.2, 1); } .user-message .message-text.user-bubble-text.is-expandable .bubble-text.is-expanded::after { opacity: 0; } /* 展开/收起按钮: - 折叠时:向上浮到 bubble-text 底部,与最后一行文字同处一行,带水平渐变 - 展开时:margin-top 恢复为 0,单独一行在内容下方 */ .user-bubble-expand-row { display: flex; align-items: center; justify-content: flex-end; margin-top: 0; margin-bottom: 0; opacity: 1; transform: none; pointer-events: auto; align-self: flex-end; width: 100%; min-height: 22px; transition: margin-top 300ms cubic-bezier(0.4, 0, 0.2, 1), background 300ms cubic-bezier(0.4, 0, 0.2, 1); } .user-message .message-text.user-bubble-text.is-expandable .bubble-text:not(.is-expanded) ~ .user-bubble-expand-row { margin-top: -1.6em; min-height: 1.6em; align-items: flex-end; background: linear-gradient(to right, transparent 0%, transparent 50%, var(--chip-bg) 100%); border-bottom-right-radius: 18px; } .user-message .message-text.user-bubble-text.is-expandable .bubble-text.is-expanded ~ .user-bubble-expand-row { margin-top: 0; background: transparent; border-bottom-right-radius: 0; } .user-bubble-expand-row .user-bubble-expand-btn { width: 22px; height: 22px; margin: 0; padding: 0; opacity: 1; transform: none; pointer-events: auto; background: transparent; color: var(--claude-text-tertiary); border-radius: 4px; transition: color 140ms ease; } .user-bubble-expand-row .user-bubble-expand-btn:hover { background: transparent; color: var(--claude-text); } .user-bubble-actions { display: flex; align-items: center; justify-content: flex-start; gap: 4px; margin-top: 6px; opacity: 0; transform: translateY(4px); pointer-events: none; transition: opacity 180ms ease, transform 180ms ease; white-space: normal; align-self: flex-end; } .user-bubble-time { font-size: 12px; color: var(--claude-text-secondary); margin-left: auto; padding-left: 8px; line-height: 20px; user-select: none; } .user-message:not(.user-message--compact):not(.user-message--brief):hover .user-bubble-actions, .user-message:not(.user-message--compact):not(.user-message--brief):focus-within .user-bubble-actions { opacity: 1; transform: translateY(0); pointer-events: auto; } .user-bubble-action-btn { width: 20px; height: 20px; border: none; border-radius: 6px; padding: 0; background: transparent; color: var(--claude-text-secondary); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: background-color 140ms ease, color 140ms ease; flex-shrink: 0; } .user-bubble-action-btn:hover { background-color: var(--theme-tab-active); color: var(--claude-text); } .user-bubble-action-btn::before { content: ''; width: 14px; height: 14px; display: block; background: currentColor; mask: center / contain no-repeat; -webkit-mask: center / contain no-repeat; } .user-bubble-action-btn.copy::before { mask-image: url('/static/icons/copy.svg'); -webkit-mask-image: url('/static/icons/copy.svg'); } .user-bubble-action-btn.copy.copied::before { mask-image: url('/static/icons/check.svg'); -webkit-mask-image: url('/static/icons/check.svg'); } .user-bubble-action-btn.branch::before { mask-image: url('/static/icons/git-fork.svg'); -webkit-mask-image: url('/static/icons/git-fork.svg'); } .user-bubble-action-btn.user-bubble-expand-btn::before { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); transition: transform 260ms cubic-bezier(0.4, 0, 0.2, 1); } .user-bubble-action-btn.user-bubble-expand-btn.expanded::before { transform: rotate(180deg); } .assistant-message .message-text { background: var(--claude-highlight); border-left: 4px solid var(--claude-accent); } .user-message .message-text.user-bubble-text .image-inline-row { display: flex; flex-wrap: wrap; gap: 10px; line-height: 1.4; padding-bottom: 2px; } .user-message .message-text.user-bubble-text .image-thumbnail-wrapper { position: relative; width: 60px; height: 60px; border-radius: 6px; overflow: hidden; cursor: pointer; border: 1px solid var(--border-default); } .user-message .message-text.user-bubble-text .image-thumbnail { width: 100%; height: 100%; object-fit: cover; display: block; } .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: transparent; 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: none; } .collapsible-header { padding: 9px 13px; cursor: pointer; display: flex; align-items: center; gap: 8px; user-select: none; background: transparent; transition: background-color 0.2s ease; position: relative; min-height: 36px; max-height: 36px; overflow: hidden; } .collapsible-header:hover { background: var(--claude-highlight); } /* 深色模式下块 hover 对齐对话列表 hover 颜色 */ body[data-theme='dark'] .collapsible-header:hover { background: var(--hover-bg) !important; } .arrow { width: 16px; min-width: 16px; height: 16px; flex: 0 0 16px; background-color: currentColor; mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M13.5 10L19 16L13.5 22' stroke='%23000' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cpath d='M13.5 10L19 16L13.5 22' stroke='%23000' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); mask-size: contain; -webkit-mask-size: contain; mask-repeat: no-repeat; -webkit-mask-repeat: no-repeat; mask-position: center; -webkit-mask-position: center; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); color: var(--claude-text-secondary); } /* 移除旧的 ::before 箭头 */ .arrow::before { content: none; } .collapsible-block.expanded .arrow { transform: rotate(90deg); } .status-icon { width: 20px; min-width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 20px; } .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 260ms cubic-bezier(0.4, 0, 0.2, 1), opacity 220ms cubic-bezier(0.4, 0, 0.2, 1); /* 始终隐藏滚动条,避免堆叠模式展开时闪现 */ scrollbar-width: none; -ms-overflow-style: none; will-change: max-height, opacity; } .collapsible-content::-webkit-scrollbar { display: none; } .collapsible-block.expanded .collapsible-content { max-height: var(--collapse-max, 600px); overflow-y: auto; opacity: 1; } .content-inner { padding: 13px 13px 13px 37px; font-size: 13px; 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.no-entry-animation { animation: none !important; } .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: none; overflow: hidden; min-height: 0; } .stacked-inner { position: relative; width: 100%; } .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-shell--no-borders .stacked-item { 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; } body[data-theme='dark'] .more-icon { filter: brightness(0) invert(1); } .more-copy { display: flex; flex-direction: column; gap: 2px; user-select: none; -webkit-user-select: none; } .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 260ms cubic-bezier(0.4, 0, 0.2, 1), opacity 220ms cubic-bezier(0.4, 0, 0.2, 1); } .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; white-space: nowrap; flex-shrink: 0; } .collapsible-block.processing .status-text { color: var(--claude-text-secondary); } .tool-desc { color: var(--claude-text-secondary); font-size: 12px; margin-left: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; } @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; } .chat-inline-card { display: block; max-width: 100%; margin: 14px auto; border: 1px solid var(--claude-border); border-radius: 12px; overflow: hidden; background: transparent; box-shadow: none; } .chat-inline-card__body { display: block; width: 100%; overflow: hidden; border: 0; background: transparent; } .chat-inline-card--pending { display: flex; align-items: center; justify-content: center; } .chat-inline-card__pending-tip { font-size: 13px; color: var(--claude-text-secondary); } .chat-inline-card__error { font-size: 12px; color: var(--claude-text-secondary); text-align: center; } .chat-inline-card__caption { font-size: 12px; color: var(--claude-text-secondary); text-align: center; line-height: 1.4; padding: 0 8px; } .chat-inline-card--image { display: flex; flex-direction: column; align-items: center; gap: 6px; margin: 14px 0; border: 0; box-shadow: none; } .chat-inline-card--image img { display: block; width: auto; min-width: 160px; max-width: 80%; max-height: 720px; object-fit: contain; border-radius: 12px; border: 1px solid var(--claude-border); box-shadow: none; background: var(--claude-card); } .chat-inline-card--error { border: 1px dashed var(--claude-accent); padding: 6px 10px; border-radius: 12px; background: var(--claude-highlight); } .chat-inline-card--html { display: block; position: relative; } .chat-inline-card__toolbar { position: absolute; top: 8px; right: 8px; z-index: 4; display: flex; align-items: center; gap: 6px; pointer-events: none; } .chat-inline-card__refresh-btn { pointer-events: auto; width: 26px; height: 26px; border-radius: 999px; border: 1px solid var(--claude-border); background: color-mix(in srgb, var(--claude-card) 78%, transparent); color: var(--claude-text-secondary); display: inline-flex; align-items: center; justify-content: center; font-size: 15px; line-height: 1; cursor: pointer; transition: color 0.18s ease, border-color 0.18s ease, background 0.18s ease; } .chat-inline-card__refresh-btn:hover { color: var(--claude-text); border-color: var(--claude-accent); background: color-mix(in srgb, var(--claude-highlight) 72%, transparent); } .chat-inline-card__refresh-btn.is-refreshing { animation: chat-inline-refresh-spin 0.6s linear 1; } @keyframes chat-inline-refresh-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .chat-inline-html__host--pending { display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 12px 14px; } .chat-inline-html__pending-tip { font-size: 13px; color: var(--claude-text-secondary); } .chat-inline-html__iframe { display: block; width: 100%; height: 100%; border: 0; background: transparent; } /* 兼容旧类名(可逐步移除) */ .chat-inline-image__error { @extend .chat-inline-card__error; } .chat-inline-image figcaption { @extend .chat-inline-card__caption; } /* show_html 在 streaming 重建期间会短暂回到原始标签,需提供稳定占位避免 scrollHeight 抖动 */ show_html:not([data-rendered='1']), show-html:not([data-rendered='1']) { display: block; width: 100%; max-width: 100%; min-height: 220px; margin: 14px auto; box-sizing: border-box; overflow: hidden; border: 1px solid var(--claude-border); border-radius: 12px; background: transparent; box-shadow: none; } show_html:not([data-rendered='1'])[ratio='1:1'], show-html:not([data-rendered='1'])[ratio='1:1'] { aspect-ratio: 1 / 1; } show_html:not([data-rendered='1'])[ratio='16:9'], show-html:not([data-rendered='1'])[ratio='16:9'] { aspect-ratio: 16 / 9; } show_html:not([data-rendered='1'])[ratio='9:16'], show-html:not([data-rendered='1'])[ratio='9:16'] { aspect-ratio: 9 / 16; } show_html:not([data-rendered='1'])[ratio='4:3'], show-html:not([data-rendered='1'])[ratio='4:3'] { aspect-ratio: 4 / 3; } show_html:not([data-rendered='1'])[ratio='3:4'], show-html:not([data-rendered='1'])[ratio='3:4'] { aspect-ratio: 3 / 4; } .text-output .text-content { padding: 0 var(--chat-content-x); max-width: 100%; min-width: 0; overflow-x: hidden; } /* Markdown 行内代码与加粗:在对话区域背景下给出明确对比 */ .text-output .text-content :not(pre) > code { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace; background: var(--surface-muted); color: var(--text-primary); padding: 2px 5px; border-radius: 4px; font-size: 0.9em; } .text-output .text-content strong, .text-output .text-content b { font-weight: 700; color: var(--text-primary); } .text-output .text-content .code-block-wrapper { margin-right: calc(var(--chat-content-x) * -1); margin-left: calc(var(--chat-content-x) * -1); } .text-output pre { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace !important; font-variant-ligatures: none; font-feature-settings: 'liga' 0, 'calt' 0; line-height: 1.55; overflow-x: auto; max-width: 100%; scrollbar-gutter: stable; box-sizing: border-box; } .text-output pre code { font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace !important; font-variant-ligatures: none; font-feature-settings: 'liga' 0, 'calt' 0; line-height: 1.55; text-shadow: none; animation: none !important; /* 防止外部动画样式影响代码块,导致视觉抖动 */ } .text-output .text-content table { width: max-content; min-width: 100%; border-collapse: collapse; margin: 0; background: var(--theme-surface-soft); } .text-output .text-content .md-table-scroll, .text-output .text-content [data-md-table-scroll='1'] { display: block; width: auto; max-width: none; margin: 16px calc(var(--chat-content-x) * -1); overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; border: 1px solid var(--claude-border); border-radius: 12px; background: var(--theme-surface-soft); box-shadow: none; } .text-output .text-content .md-table-scroll > table, .text-output .text-content [data-md-table-scroll='1'] > table { margin: 0; } .text-output .text-content .md-table-scroll::-webkit-scrollbar, .text-output .text-content [data-md-table-scroll='1']::-webkit-scrollbar { height: 10px; } .text-output .text-content .md-table-scroll::-webkit-scrollbar-track, .text-output .text-content [data-md-table-scroll='1']::-webkit-scrollbar-track { background: color-mix(in srgb, var(--theme-surface-muted) 70%, transparent); border-radius: 999px; margin: 0 8px 6px; } .text-output .text-content .md-table-scroll::-webkit-scrollbar-thumb, .text-output .text-content [data-md-table-scroll='1']::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent); border-radius: 999px; } .text-output .text-content .md-table-scroll, .text-output .text-content [data-md-table-scroll='1'] { scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent) color-mix(in srgb, var(--theme-surface-muted) 70%, transparent); scrollbar-width: thin; } .text-output .text-content thead { background: var(--theme-chip-bg); } .text-output .text-content th, .text-output .text-content td { border: 1px solid var(--claude-border); padding: 10px 14px; text-align: left; vertical-align: middle; font-size: 14px; } .text-output .text-content th { font-weight: 600; color: var(--claude-text); } .text-output .text-content hr { margin: 32px calc(var(--chat-content-x) * -1); border: none; border-top: 1px solid var(--claude-border); } .system-action { margin: 12px 0; padding: 10px 14px; border-radius: 8px; background: linear-gradient(135deg, color-mix(in srgb, var(--state-info) 8%, transparent), color-mix(in srgb, var(--state-info) 8%, transparent)); border-left: 4px solid var(--state-info); color: var(--claude-text); font-size: 14px; line-height: 1.5; } .system-action-content { display: flex; align-items: flex-start; gap: 8px; } .sub-agent-system-summary-line { padding: 0 20px 0 15px; margin: 0; font-size: 15px; line-height: 1.7; color: var(--claude-text-secondary); } .append-block, .append-placeholder { margin: 12px 0; padding: 12px 16px; border-radius: 10px; background: var(--theme-surface-soft); border-left: 4px solid var(--claude-accent); box-shadow: none; display: flex; flex-direction: column; gap: 8px; color: var(--claude-text); } .append-block.append-error, .append-placeholder.append-error { background: color-mix(in srgb, var(--state-danger) 8%, var(--surface-soft)); border-left-color: color-mix(in srgb, var(--state-danger) 40%, transparent); } .append-header { display: flex; align-items: center; gap: 10px; font-weight: 600; } .code-block-wrapper { border: 1px solid var(--claude-border); border-radius: 20px; overflow: hidden; margin: 16px 0; background: var(--theme-surface-strong); min-height: 80px; box-shadow: none; } .code-block-wrapper[data-streaming='1'] { min-height: 92px; } .code-block-header { min-height: 44px; background: var(--theme-surface-strong); padding: 0 12px 0 18px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--claude-border); } .code-language { color: var(--claude-text-secondary); font-size: 14px; line-height: 1; letter-spacing: -0.01em; font-family: inherit; font-weight: 500; } .copy-code-btn { width: 32px; height: 32px; border: none; padding: 0; border-radius: 10px; background-color: transparent; color: var(--claude-text-secondary); cursor: pointer; opacity: 0.9; transition: background-color 140ms ease, color 140ms ease; position: relative; } .copy-code-btn::before { content: ''; width: 18px; height: 18px; display: block; margin: auto; background: currentColor; mask: url('/static/icons/copy.svg') center / contain no-repeat; -webkit-mask: url('/static/icons/copy.svg') center / contain no-repeat; } .copy-code-btn:hover { background-color: var(--theme-tab-active); color: var(--claude-text); } .copy-code-btn.copied::before { mask-image: url('/static/icons/check.svg'); -webkit-mask-image: url('/static/icons/check.svg'); } .code-block-wrapper pre { background: var(--theme-surface-strong) !important; padding: 18px 20px 22px !important; margin: 0 !important; border-radius: 0 !important; border: none !important; font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace !important; font-variant-ligatures: none; font-feature-settings: 'liga' 0, 'calt' 0; font-size: 15px; line-height: 1.64; overflow-x: auto; max-width: 100%; scrollbar-gutter: stable; box-sizing: border-box; } .code-block-wrapper[data-streaming='1'] pre { min-height: 40px; } .code-block-wrapper pre code { background: transparent !important; padding: 0 !important; border: 0 !important; box-shadow: none !important; color: var(--claude-text); font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace !important; font-variant-ligatures: none; font-feature-settings: 'liga' 0, 'calt' 0; line-height: 1.64; text-shadow: none; animation: none !important; /* 避免被其他动画样式污染导致行距抖动 */ } :root[data-theme='dark'] .code-block-wrapper pre, :root[data-theme='dark'] .code-block-wrapper pre code, :root[data-theme='dark'] .code-block-wrapper pre code span { background: transparent !important; border: 0 !important; box-shadow: none !important; outline: 0 !important; text-shadow: none !important; } :root[data-theme='dark'] .code-block-wrapper pre { background: var(--theme-surface-strong) !important; } .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; } } // ===== show_file 预览卡片外层容器 ===== // 实际样式由 ShowFileCard.vue 的 scoped style 控制, // 这里只保留对 .show-file-card-root 的最小兜底 .show-file-card-root { max-width: 100%; } // ===== download:// 链接样式 ===== a.md-download-link { color: var(--accent-primary); text-decoration: underline; cursor: pointer; transition: opacity 0.15s; &:hover { opacity: 0.8; } } // ===== 数学公式样式 ===== .math-block { display: block; margin: 16px 0; overflow-x: auto; overflow-y: hidden; text-align: center; scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent) transparent; &::-webkit-scrollbar { height: 6px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent); border-radius: 999px; } .katex-display { display: inline-block; margin: 0; text-align: initial; } } .math-inline { display: inline-block; vertical-align: middle; line-height: 1; }