chore(release): polish 3.2.0 changes\n\n- Docs: add 3.2.0 release notes to CHANGELOG\n- UI: silence debug logs in production via import.meta.env.DEV\n- CSS: replace pseudo-element Tailwind @apply with explicit selectors to fix minifier warnings
This commit is contained in:
27
CHANGELOG.md
27
CHANGELOG.md
@@ -5,6 +5,33 @@ All notable changes to CC Switch will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [3.2.0] - 2025-09-13
|
||||||
|
|
||||||
|
### ✨ New Features
|
||||||
|
- System tray provider switching with dynamic menu for Claude/Codex
|
||||||
|
- Frontend receives `provider-switched` events and refreshes active app
|
||||||
|
- Built-in update flow via Tauri Updater plugin with dismissible UpdateBadge
|
||||||
|
|
||||||
|
### 🔧 Improvements
|
||||||
|
- Single source of truth for provider configs; no duplicate copy files
|
||||||
|
- One-time migration imports existing copies into `config.json` and archives originals
|
||||||
|
- Duplicate provider de-duplication by name + API key at startup
|
||||||
|
- Atomic writes for Codex `auth.json` + `config.toml` with rollback on failure
|
||||||
|
- Logging standardized (Rust): use `log::{info,warn,error}` instead of stdout prints
|
||||||
|
- Tailwind v4 integration and refined dark mode handling
|
||||||
|
|
||||||
|
### 🐛 Fixes
|
||||||
|
- Remove/minimize debug console logs in production builds
|
||||||
|
- Fix CSS minifier warnings for scrollbar pseudo-elements
|
||||||
|
- Prettier formatting across codebase for consistent style
|
||||||
|
|
||||||
|
### 📦 Dependencies
|
||||||
|
- Tauri: 2.8.x (core, updater, process, opener, log plugins)
|
||||||
|
- React: 18.2.x · TypeScript: 5.3.x · Vite: 5.x
|
||||||
|
|
||||||
|
### 🔄 Notes
|
||||||
|
- `connect-src` CSP remains permissive for compatibility; can be tightened later as needed
|
||||||
|
|
||||||
## [3.1.1] - 2025-09-03
|
## [3.1.1] - 2025-09-03
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
|
|||||||
@@ -44,18 +44,15 @@ export function useDarkMode() {
|
|||||||
try {
|
try {
|
||||||
if (isDarkMode) {
|
if (isDarkMode) {
|
||||||
document.documentElement.classList.add("dark");
|
document.documentElement.classList.add("dark");
|
||||||
if (isDev)
|
if (isDev) console.log("[DarkMode] Added dark class to document");
|
||||||
console.log("[DarkMode] Added dark class to document");
|
|
||||||
} else {
|
} else {
|
||||||
document.documentElement.classList.remove("dark");
|
document.documentElement.classList.remove("dark");
|
||||||
if (isDev)
|
if (isDev) console.log("[DarkMode] Removed dark class from document");
|
||||||
console.log("[DarkMode] Removed dark class from document");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查类名是否已成功应用
|
// 检查类名是否已成功应用
|
||||||
const hasClass = document.documentElement.classList.contains("dark");
|
const hasClass = document.documentElement.classList.contains("dark");
|
||||||
if (isDev)
|
if (isDev) console.log("[DarkMode] Document has dark class:", hasClass);
|
||||||
console.log("[DarkMode] Document has dark class:", hasClass);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[DarkMode] Error applying dark class:", error);
|
console.error("[DarkMode] Error applying dark class:", error);
|
||||||
}
|
}
|
||||||
@@ -70,8 +67,7 @@ export function useDarkMode() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
localStorage.setItem("darkMode", isDarkMode.toString());
|
localStorage.setItem("darkMode", isDarkMode.toString());
|
||||||
if (isDev)
|
if (isDev) console.log("[DarkMode] Saved to localStorage:", isDarkMode);
|
||||||
console.log("[DarkMode] Saved to localStorage:", isDarkMode);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[DarkMode] Error saving preference:", error);
|
console.error("[DarkMode] Error saving preference:", error);
|
||||||
}
|
}
|
||||||
@@ -80,8 +76,7 @@ export function useDarkMode() {
|
|||||||
const toggleDarkMode = () => {
|
const toggleDarkMode = () => {
|
||||||
setIsDarkMode((prev) => {
|
setIsDarkMode((prev) => {
|
||||||
const newValue = !prev;
|
const newValue = !prev;
|
||||||
if (isDev)
|
if (isDev) console.log("[DarkMode] Toggling from", prev, "to", newValue);
|
||||||
console.log("[DarkMode] Toggling from", prev, "to", newValue);
|
|
||||||
return newValue;
|
return newValue;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,13 +26,29 @@ html.dark {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 滚动条样式(避免在伪元素中使用自定义 dark 变体,消除构建警告) */
|
/* 滚动条样式(避免在伪元素中使用自定义 dark 变体,消除构建警告) */
|
||||||
::-webkit-scrollbar { width: 0.375rem; height: 0.375rem; }
|
::-webkit-scrollbar {
|
||||||
::-webkit-scrollbar-track { background-color: #f4f4f5; }
|
width: 0.375rem;
|
||||||
html.dark ::-webkit-scrollbar-track { background-color: #27272a; }
|
height: 0.375rem;
|
||||||
::-webkit-scrollbar-thumb { background-color: #d4d4d8; border-radius: 0.25rem; }
|
}
|
||||||
html.dark ::-webkit-scrollbar-thumb { background-color: #52525b; }
|
::-webkit-scrollbar-track {
|
||||||
::-webkit-scrollbar-thumb:hover { background-color: #a1a1aa; }
|
background-color: #f4f4f5;
|
||||||
html.dark ::-webkit-scrollbar-thumb:hover { background-color: #71717a; }
|
}
|
||||||
|
html.dark ::-webkit-scrollbar-track {
|
||||||
|
background-color: #27272a;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #d4d4d8;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
}
|
||||||
|
html.dark ::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #52525b;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: #a1a1aa;
|
||||||
|
}
|
||||||
|
html.dark ::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: #71717a;
|
||||||
|
}
|
||||||
|
|
||||||
/* 焦点样式 */
|
/* 焦点样式 */
|
||||||
*:focus-visible {
|
*:focus-visible {
|
||||||
|
|||||||
Reference in New Issue
Block a user