重构工具消息的呈现与更新逻辑,使其与常规消息一同展示并通过视觉状态反映执行进展。 - 为工具消息新增状态指示(执行中/完成/出错)、图标标签及输入摘要 - 实现通过 toolName/toolStatus 字段定位并就地更新已有工具消息而非追加新项 - 从消息列表中移除对 tool 角色的过滤,使其以内联卡片形式嵌入聊天流 - 添加液体填充动画,在工具执行期间提供进度反馈 - 为视频资源预览增加播放按钮遮罩以提示可播放 - 为 .mp4 与 .webm 文件设置正确的 Content-Type 头
127 lines
3.7 KiB
CSS
127 lines
3.7 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
@layer base {
|
|
* {
|
|
@apply border-zinc-200/60;
|
|
}
|
|
body {
|
|
@apply bg-white text-zinc-900 antialiased;
|
|
}
|
|
/* Modern scrollbar */
|
|
::-webkit-scrollbar {
|
|
width: 5px;
|
|
height: 5px;
|
|
}
|
|
::-webkit-scrollbar-track {
|
|
background: transparent;
|
|
}
|
|
::-webkit-scrollbar-thumb {
|
|
background: rgba(161, 161, 170, 0.35);
|
|
border-radius: 10px;
|
|
}
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: rgba(161, 161, 170, 0.6);
|
|
}
|
|
/* Firefox scrollbar */
|
|
* {
|
|
scrollbar-width: thin;
|
|
scrollbar-color: rgba(161, 161, 170, 0.35) transparent;
|
|
}
|
|
}
|
|
|
|
@layer utilities {
|
|
/* Skeleton shimmer animation */
|
|
.skeleton {
|
|
@apply bg-zinc-100 rounded-md animate-pulse;
|
|
}
|
|
}
|
|
|
|
/* Tool card progress - liquid fill animation */
|
|
@keyframes liquid-fill {
|
|
0% { width: 5%; opacity: 0.5; }
|
|
20% { width: 30%; opacity: 0.9; }
|
|
40% { width: 55%; opacity: 1; }
|
|
60% { width: 75%; opacity: 0.95; }
|
|
80% { width: 92%; opacity: 0.85; }
|
|
90% { width: 100%; opacity: 0.7; }
|
|
100% { width: 5%; opacity: 0.5; }
|
|
}
|
|
@keyframes liquid-glow {
|
|
0%, 100% { box-shadow: 0 0 4px rgba(99, 102, 241, 0.3); }
|
|
50% { box-shadow: 0 0 12px rgba(99, 102, 241, 0.5); }
|
|
}
|
|
.tool-shimmer-bar {
|
|
animation: liquid-fill 2.4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
|
|
border-radius: 9999px;
|
|
background: linear-gradient(90deg,
|
|
rgba(99, 102, 241, 0.8),
|
|
rgba(139, 92, 246, 0.9),
|
|
rgba(99, 102, 241, 0.7));
|
|
background-size: 200% 100%;
|
|
}
|
|
.tool-progress-track {
|
|
animation: liquid-glow 2.4s ease-in-out infinite;
|
|
}
|
|
|
|
/* GitHub-style Markdown - light theme */
|
|
@layer components {
|
|
.markdown-body {
|
|
color-scheme: light;
|
|
color: #1f2328;
|
|
}
|
|
.markdown-body h1 { font-size: 1.5em; font-weight: 600; margin: 0.67em 0; padding-bottom: 0.3em; border-bottom: 1px solid #d0d7de; }
|
|
.markdown-body h2 { font-size: 1.25em; font-weight: 600; margin: 0.83em 0; padding-bottom: 0.3em; border-bottom: 1px solid #d0d7de; }
|
|
.markdown-body h3 { font-size: 1.1em; font-weight: 600; margin: 1em 0 0.25em; }
|
|
.markdown-body h4 { font-size: 1em; font-weight: 600; margin: 1em 0 0.25em; }
|
|
.markdown-body p { margin: 0 0 0.75em; }
|
|
.markdown-body p:last-child { margin-bottom: 0; }
|
|
.markdown-body ul, .markdown-body ol { padding-left: 1.5em; margin: 0 0 0.75em; }
|
|
.markdown-body li { margin: 0.15em 0; }
|
|
.markdown-body li > p { margin: 0; }
|
|
.markdown-body ul { list-style-type: disc; }
|
|
.markdown-body ol { list-style-type: decimal; }
|
|
.markdown-body blockquote {
|
|
margin: 0 0 0.75em;
|
|
padding: 0 1em;
|
|
color: #656d76;
|
|
border-left: 3px solid #d0d7de;
|
|
}
|
|
.markdown-body code {
|
|
background: rgba(175,184,193,0.2);
|
|
padding: 0.15em 0.4em;
|
|
border-radius: 4px;
|
|
font-size: 0.875em;
|
|
font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
|
|
}
|
|
.markdown-body pre {
|
|
background: #f6f8fa;
|
|
border: 1px solid #d0d7de;
|
|
border-radius: 6px;
|
|
padding: 12px;
|
|
margin: 0 0 0.75em;
|
|
overflow-x: auto;
|
|
}
|
|
.markdown-body pre code {
|
|
background: none;
|
|
padding: 0;
|
|
font-size: 0.8125em;
|
|
line-height: 1.5;
|
|
color: #1f2328;
|
|
}
|
|
.markdown-body hr {
|
|
border: 0;
|
|
height: 1px;
|
|
background: #d0d7de;
|
|
margin: 1em 0;
|
|
}
|
|
.markdown-body a { color: #0969da; text-decoration: none; }
|
|
.markdown-body a:hover { text-decoration: underline; }
|
|
.markdown-body strong { font-weight: 600; }
|
|
.markdown-body table { border-collapse: collapse; margin: 0 0 0.75em; width: 100%; }
|
|
.markdown-body th, .markdown-body td { border: 1px solid #d0d7de; padding: 6px 13px; text-align: left; }
|
|
.markdown-body th { font-weight: 600; background: #f6f8fa; }
|
|
.markdown-body img { max-width: 100%; border-radius: 6px; }
|
|
}
|