diff --git a/README.md b/README.md index ce8eb1a..4bca8e8 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ **一款现代化的微信聊天记录查看与分析工具** [](LICENSE) -[](package.json) +[](package.json) []() []() []() diff --git a/package.json b/package.json index 0ef9987..396ef7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ciphertalk", - "version": "2.2.11", + "version": "2.2.12", "description": "密语 - 微信聊天记录查看工具", "author": "ILoveBingLu", "license": "CC-BY-NC-SA-4.0", diff --git a/src/components/Sidebar.scss b/src/components/Sidebar.scss index 78a0fa2..f43c052 100644 --- a/src/components/Sidebar.scss +++ b/src/components/Sidebar.scss @@ -6,6 +6,8 @@ flex-direction: column; padding: 16px 0; transition: width 0.25s ease; + position: relative; + z-index: 100; &.collapsed { width: 64px; diff --git a/src/pages/SettingsPage.scss b/src/pages/SettingsPage.scss index 9f98122..dad9c99 100644 --- a/src/pages/SettingsPage.scss +++ b/src/pages/SettingsPage.scss @@ -711,17 +711,20 @@ padding: 10px 24px; border-radius: 9999px; font-size: 14px; - z-index: 100; + z-index: 10000; animation: slideDown 0.3s ease; + color: white; + backdrop-filter: blur(24px) saturate(180%); + -webkit-backdrop-filter: blur(24px) saturate(180%); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12); &.success { - background: var(--primary); - color: white; + background: rgba(var(--primary-rgb), 0.75); } &.error { - background: var(--danger); - color: white; + background: rgba(239, 68, 68, 0.75); } } @@ -2046,17 +2049,17 @@ to { // 引用样式选择器 .quote-style-options { display: flex; - gap: 12px; + gap: 8px; .radio-label { flex: 1; position: relative; - border-radius: 12px; - padding: 12px; + border-radius: 8px; + padding: 8px; cursor: pointer; display: flex; align-items: flex-start; - gap: 12px; + gap: 8px; overflow: hidden; background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.08) 0%, rgba(var(--primary-rgb), 0.02) 100%); @@ -2107,14 +2110,14 @@ to { flex-direction: row; align-items: flex-start; justify-content: space-between; - gap: 12px; + gap: 8px; width: 100%; .radio-title { font-size: 14px; font-weight: 500; color: var(--text-primary); - margin-top: 16px; + margin-top: 8px; } .radio-desc { @@ -2126,22 +2129,22 @@ to { // 预览组件样式 .style-preview { flex: 1; - min-height: 80px; + min-height: 60px; background: transparent; margin-bottom: 0; display: flex; align-items: flex-start; - justify-content: flex-end; - /* 靠右展示,模拟发送方 */ - padding: 16px 12px; + justify-content: flex-start; + /* 靠左展示,模拟接收方 */ + padding: 10px 8px; border: none; .preview-avatar { - width: 36px; - height: 36px; + width: 28px; + height: 28px; border-radius: 50%; background: var(--bg-tertiary); - margin-left: 10px; + margin-right: 8px; flex-shrink: 0; object-fit: cover; border: 1px solid var(--border-color); @@ -2154,10 +2157,10 @@ to { // 经典模式预览 .preview-bubble.default { background: var(--primary); - /* 使用主色调,模拟发送方 */ + /* 使用主色调,模拟接收方 */ border: none; - border-radius: 12px 12px 2px 12px; - /* 真实气泡圆角 */ + border-radius: 12px 12px 12px 2px; + /* 左下角小圆角,适合左边消息 */ padding: 10px 12px; width: fit-content; max-width: 90%; @@ -2188,12 +2191,12 @@ to { display: flex; flex-direction: column; width: 100%; - align-items: flex-end; - /* 模拟发送方 */ + align-items: flex-start; + /* 模拟接收方 */ .preview-bubble.wechat { background: var(--primary); - border-radius: 12px 12px 2px 12px; + border-radius: 12px 12px 12px 2px; padding: 10px 12px; margin-bottom: 4px; color: white; @@ -2205,7 +2208,7 @@ to { .preview-quote-bubble { background: var(--bg-tertiary); - border-radius: 12px 4px 12px 12px; + border-radius: 4px; padding: 4px 10px; width: fit-content; max-width: 90%; diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx index 8c2c4f0..e12cd6e 100644 --- a/src/pages/SettingsPage.tsx +++ b/src/pages/SettingsPage.tsx @@ -103,6 +103,7 @@ function SettingsPage() { const [message, setMessage] = useState<{ text: string; success: boolean } | null>(null) const [showDecryptKey, setShowDecryptKey] = useState(false) const [showXorKey, setShowXorKey] = useState(false) + const [closeToTray, setCloseToTray] = useState(true) const [showAesKey, setShowAesKey] = useState(false) const [showClearDialog, setShowClearDialog] = useState<{ type: 'images' | 'emojis' | 'databases' | 'all' | 'config' @@ -225,6 +226,10 @@ function SettingsPage() { setAiEnableThinkingState(savedAiEnableThinking) setAiMessageLimitState(savedAiMessageLimit) + // 加载关闭行为配置 + const savedCloseToTray = await configService.getCloseToTray() + setCloseToTray(savedCloseToTray) + } catch (e) { console.error('加载配置失败:', e) } @@ -762,6 +767,9 @@ function SettingsPage() { await configService.setAiEnableThinking(aiEnableThinking) await configService.setAiMessageLimit(aiMessageLimit) + // 保存关闭行为配置 + await configService.setCloseToTray(closeToTray) + // 如果数据库配置完整,尝试设置已连接状态(不进行耗时测试,仅标记) if (decryptKey && dbPath && wxid && decryptKey.length === 64 && isAccountVerified) { setDbConnected(true, dbPath) @@ -806,7 +814,7 @@ function SettingsPage() {