Skip to content

Latest commit

 

History

History
280 lines (230 loc) · 12 KB

File metadata and controls

280 lines (230 loc) · 12 KB

grok-3-beta | Grok

作为一名专业的前端工程师,我将根据您的请求,在仿Claude风格主题的基础上适当添加一些动态效果,以提升用户体验和交互性。参考材料中提供了部分Ant Design组件的交互样式(如悬停和激活状态),我将结合这些内容并基于之前的CherryStudio-Claude CSS主题代码,添加合适的动态效果。以下是详细的设计方案,结构清晰,并附上必要的代码和说明。


添加动态效果的设计方案

动态效果可以增强用户交互体验,但应避免过度使用以保持Claude风格的简洁和现代感。目标是添加自然、流畅的动画效果,主要集中在按钮、输入框、消息容器等关键交互元素上,同时参考材料中的悬停和激活效果也将被整合到设计中。


设计目标

  1. 自然过渡:为交互元素添加平滑的颜色、阴影和缩放过渡效果。
  2. 交互反馈:增强悬停(hover)、点击(active)和焦点(focus)状态的视觉反馈。
  3. 一致性:确保动态效果与Claude风格的简约设计相符,避免过于花哨。
  4. 性能优化:使用轻量级的CSS动画,避免影响页面加载和渲染速度。

优化后的主题代码(包含动态效果)

以下是基于之前提供的CherryStudio-Claude CSS主题代码,添加动态效果后的CSS实现。动态效果主要集中在消息容器、输入框和Ant Design组件上,同时参考了材料中的交互样式。

/* ======================== 全局主题变量定义 ======================== */
:root {
    --chat-background-white: #F5F4ED;
    --color-border: rgba(120,120,120,0.08) !important;
}

/* 全局样式设置 - 设置基本字体、行高、字母间距和字体粗细 */
* {
    font-family: "霞鹜文楷 GB 屏幕阅读版", system-ui !important;
    line-height: 1.7 !important;
    letter-spacing: 0.018em !important;
    font-weight: 500;
}

/* 确保代码块内的文本使用正确字体 */
pre *, code *, kbd, samp, tt {
    font-family: "Maple Mono NL CN", monospace !important;
}

/* 浅色模式颜色定义 - 采用Claude的色调 */
body[theme-mode='light'] {
    --color-primary: #C96442;
    --color-primary-soft: rgba(201, 100, 66, 0.6);
    --color-primary-mute: rgba(201, 100, 66, 0.2);
    --color-background: #F5F4ED;       /* 侧边栏背景色 */
    --color-background-mute: #F0EFEB;  /* 略深的背景色 */
    --color-background-soft: #F0EEE6;  /* 中浅色背景 */
    --navbar-background: #F5F4ED;      /* 导航栏背景色 */
    --chat-background: #FAF9F5;        /* 聊天区域总体背景 */
    --chat-background-white: #FAF9F5;  /* 聊天背景 */
    --chat-background-user: #F0EEE6;   /* 用户消息气泡背景色 */
    --chat-background-assistant: #FAF9F5; /* AI助手消息气泡背景色 */
    --color-text: #262624;             /* 文字颜色(深色) */
    --color-border: rgba(35, 35, 45, 0.12); /* 边框颜色 */
}

/* 深色模式颜色定义 - 融合Claude深色主题 */
body[theme-mode='dark'] {
    --color-primary: #C96442;          /* 保持主色调一致 */
    --color-primary-soft: rgba(201, 100, 66, 0.6);
    --color-primary-mute: rgba(201, 100, 66, 0.2);
    --color-background: #1F1E1D;       /* Claude深色背景色 */
    --color-background-mute: #2E2E2B;  /* 略浅的背景色 */
    --color-background-soft: #141413;  /* 中等深色 */
    --navbar-background-mac: rgba(35, 35, 45, 0.85); /* Mac导航栏半透明背景 */
    --navbar-background: #262624;      /* 导航栏背景色 */
    --chat-background: #262624;        /* 聊天区域总体背景 */
    --chat-background-white: #262624;  /* 深色背景 */
    --chat-background-user: #141413;   /* 用户消息背景 */
    --chat-background-assistant: #262624; /* AI助手消息背景 */
    --color-border: rgba(239, 239, 241, 0.15); /* 边框颜色 */
    --chat-text-user: #F5F4ED;         /* 用户消息文字颜色 */
    --color-text: #F5F4ED;             /* 全局文字颜色 */
}

/* Claude 样式的消息容器 - 添加动态效果 */
.message-content-container {
    background: var(--chat-background-white) !important;
    margin: 8px 0 !important;
    padding: 10px 10px 0 10px !important;
    transition: transform 0.22s cubic-bezier(0.34,1.56,0.64,1), box-shadow 0.3s ease !important;
    border: 1px solid var(--color-border) !important;
    box-shadow: none !important;
    opacity: 0;
    animation: fadeIn 0.5s ease-out forwards;
}

.message-content-container:hover {
    transform: translateY(-2px); /* 悬停时轻微上移 */
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05) !important; /* 悬停时添加阴影 */
}

@keyframes fadeIn {
    to {
        opacity: 1;
    }
}

.message-user .message-content-container {
    background: var(--chat-background-user) !important;
    box-shadow: 0 8px 32px -12px rgba(0,0,0,0.03) !important;
    border: 1px solid var(--color-border) !important;
    transition: transform 0.22s cubic-bezier(0.34,1.56,0.64,1), box-shadow 0.3s ease !important;
}

.message-user .message-content-container:hover {
    transform: translateY(-2px); /* 悬停时轻微上移 */
    box-shadow: 0 12px 40px -10px rgba(0,0,0,0.05) !important;
}

/* 深色模式下的消息容器 */
body[theme-mode='dark'] .message-content-container {
    background: var(--chat-background-assistant) !important;
    box-shadow: none !important;
    border: none !important;
}

body[theme-mode='dark'] .message-content-container:hover {
    box-shadow: 0 4px 12px rgba(255, 255, 255, 0.05) !important;
}

body[theme-mode='dark'] .message-user .message-content-container {
    background: var(--chat-background-user) !important;
    box-shadow: 0 8px 32px -12px rgba(0,0,0,0.3) !important;
    border: 1px solid var(--color-border) !important;
}

body[theme-mode='dark'] .message-user .message-content-container:hover {
    box-shadow: 0 12px 40px -10px rgba(255,255,255,0.05) !important;
}

/* 输入框样式 - 增强动态效果 */
#inputbar {
    margin: 0px 10px 10px 10px;
    background: #FFFFFF !important; /* 纯白色输入框背景 */
    border: 2px solid var(--color-border) !important;
    border-radius: 20px !important;
    box-shadow: 0 8px 32px -12px rgba(0,0,0,0.03) !important;
    transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
}

#inputbar:hover {
    transform: scale(1.02); /* 悬停时缩放 */
    box-shadow: 0 12px 40px -10px rgba(255, 107, 107, 0.1); /* 增强阴影 */
    border-color: var(--color-primary-mute); /* 边框颜色微变 */
}

#inputbar:focus-within {
    transform: scale(1.01); /* 焦点时略微缩放 */
    box-shadow: 0 8px 24px -8px rgba(201, 100, 66, 0.15); /* 焦点时阴影增强 */
    border-color: var(--color-primary-soft); /* 边框颜色变化 */
}

body[theme-mode='dark'] #inputbar {
    background: #30302E !important; /* 暗色模式下的输入框背景 */
    border: 1px solid var(--color-border) !important;
    box-shadow: 0 8px 32px -12px rgba(0,0,0,0.3) !important;
    backdrop-filter: blur(8px) !important;
}

body[theme-mode='dark'] #inputbar:hover {
    transform: scale(1.02);
    box-shadow: 0 12px 40px -10px rgba(255, 107, 107, 0.1);
    border-color: var(--color-primary-mute);
}

body[theme-mode='dark'] #inputbar:focus-within {
    transform: scale(1.01);
    box-shadow: 0 8px 24px -8px rgba(201, 100, 66, 0.2);
    border-color: var(--color-primary-soft);
}

/* Bug fixes */
.bubble .message-user .message-action-button:hover {
    background-color: var(--color-background-mute); /* 使用背景色变量修复悬停效果 */
    transform: scale(1.1); /* 悬停时轻微放大 */
    transition: transform 0.2s ease, background-color 0.2s ease;
}

/* ======================== Ant Design 组件样式调整 - 添加动态效果 ======================== */
/* 按钮样式 */
.ant-btn-primary {
    background-color: var(--color-primary) !important;
    border-color: var(--color-primary) !important;
    color: #FFFFFF !important;
    transition: background-color 0.3s ease, transform 0.2s ease, box-shadow 0.3s ease;
}

.ant-btn-primary:hover, .ant-btn-primary:focus {
    background-color: var(--color-primary-soft) !important;
    border-color: var(--color-primary-soft) !important;
    color: #FFFFFF !important;
    transform: translateY(-1px); /* 悬停时轻微上移 */
    box-shadow: 0 4px 12px rgba(201, 100, 66, 0.3) !important; /* 悬停时阴影增强 */
}

.ant-btn-primary:active {
    transform: translateY(1px); /* 点击时下沉 */
    box-shadow: 0 2px 6px rgba(201, 100, 66, 0.2) !important;
}

.ant-btn-variant-outlined {
    color: var(--color-primary) !important;
    border-color: var(--color-primary) !important;
    transition: color 0.3s ease, border-color 0.3s ease, transform 0.2s ease;
}

.ant-btn-variant-outlined:hover, .ant-btn-variant-outlined:focus {
    color: var(--color-primary-hover) !important;
    border-color: var(--color-primary-hover) !important;
    transform: translateY(-1px); /* 悬停时轻微上移 */
}

/* 选项卡样式 */
.ant-tabs-tab {
    transition: color 0.3s ease, transform 0.2s ease;
}

.ant-tabs-tab:hover {
    color: var(--color-primary-soft) !important;
    transform: translateY(-1px); /* 悬停时轻微上移 */
}

.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn {
    color: var(--color-primary) !important;
}

/* 滑块样式 - 参考材料中的动态效果 */
:where(.css-r9lahv).ant-slider {
    transition: all 0.3s ease;
}

:where(.css-r9lahv).ant-slider:hover .ant-slider-track {
    background-color: var(--color-primary-soft) !important; /* 悬停时颜色变化 */
}

:where(.css-r9lahv).ant-slider .ant-slider-handle::after {
    box-shadow: 0 0 0 2px var(--color-primary) !important;
    transition: box-shadow 0.3s ease, transform 0.2s ease;
}

:where(.css-r9lahv).ant-slider .ant-slider-handle:hover::after,
:where(.css-r9lahv).ant-slider .ant-slider-handle:focus::after {
    box-shadow: 0 0 0 2.5px var(--color-primary-soft) !important;
    transform: scale(1.1); /* 悬停或焦点时放大 */
}

动态效果说明

  1. 消息容器动态效果:为.message-content-container添加了fadeIn动画效果,使其在加载时逐渐显现,同时在悬停时添加轻微上移和阴影效果,增强交互感。
  2. 输入框动态效果:增强了#inputbar的悬停和焦点效果,包括缩放、阴影和边框颜色变化,提供更明显的视觉反馈。
  3. 按钮动态效果:为.ant-btn-primary.ant-btn-variant-outlined添加了上移(hover)、下沉(active)和阴影变化效果,参考了材料中的按钮交互样式1.
  4. 选项卡和滑块动态效果:为.ant-tabs-tab添加悬停时的轻微上移效果,为滑块(.ant-slider)添加颜色和缩放过渡效果,参考了材料中的滑块样式2.
  5. 性能考虑:所有过渡效果使用easecubic-bezier曲线,确保动画流畅,同时避免对不必要的属性(如opacity)过度使用动画以减少性能负担。

性能与兼容性建议

  • 性能优化:动态效果主要使用CSStransitionanimation,对性能影响较小,但建议在低性能设备上限制动画范围(如禁用transform效果)。
  • 浏览器兼容性backdrop-filter和某些transition属性可能在旧版浏览器中不完全支持,建议为关键效果(如输入框背景)提供备用样式。
  • 用户体验:动态效果的持续时间(如0.3s)和幅度(如translateY(-1px))保持微小,确保不干扰用户操作。

总结

以上代码在仿Claude风格主题的基础上,适当添加了动态效果,包括消息容器的淡入动画、输入框的焦点反馈、按钮的悬停和点击效果,以及选项卡和滑块的交互样式。这些效果增强了用户体验,同时保持了Claude风格的简约和现代感。如果您希望调整动画的强度或添加其他动态效果,我可以进一步优化。


脚注

Footnotes

  1. 按钮的悬停和激活效果参考了参考材料ID 3和ID 6,确保交互反馈自然。

  2. 滑块的动态效果基于参考材料ID 1和ID 4,添加了颜色和缩放过渡。