diff --git a/src-tauri/src/browsers.rs b/src-tauri/src/browsers.rs index 07e800d..35be00d 100644 --- a/src-tauri/src/browsers.rs +++ b/src-tauri/src/browsers.rs @@ -73,6 +73,35 @@ pub fn browser_definitions() -> Vec { ]), ], }, + BrowserDefinition { + id: "vivaldi", + name: "Vivaldi", + local_app_data_segments: &["Vivaldi", "User Data"], + executable_candidates: &[ + ExecutableCandidate::LocalAppData(&["Vivaldi", "Application", "vivaldi.exe"]), + ExecutableCandidate::ProgramFiles(&["Vivaldi", "Application", "vivaldi.exe"]), + ], + }, + BrowserDefinition { + id: "yandex", + name: "Yandex Browser", + local_app_data_segments: &["Yandex", "YandexBrowser", "User Data"], + executable_candidates: &[ExecutableCandidate::LocalAppData(&[ + "Yandex", + "YandexBrowser", + "Application", + "browser.exe", + ])], + }, + BrowserDefinition { + id: "chromium", + name: "Chromium", + local_app_data_segments: &["Chromium", "User Data"], + executable_candidates: &[ + ExecutableCandidate::LocalAppData(&["Chromium", "Application", "chrome.exe"]), + ExecutableCandidate::ProgramFiles(&["Chromium", "Application", "chrome.exe"]), + ], + }, ] } diff --git a/src-tauri/src/config_store.rs b/src-tauri/src/config_store.rs index 4fb929b..997dfd1 100644 --- a/src-tauri/src/config_store.rs +++ b/src-tauri/src/config_store.rs @@ -205,6 +205,9 @@ fn infer_browser_family_id(icon_key: Option<&str>) -> Option { Some("chrome") => Some("chrome".to_string()), Some("edge") => Some("edge".to_string()), Some("brave") => Some("brave".to_string()), + Some("vivaldi") => Some("vivaldi".to_string()), + Some("yandex") => Some("yandex".to_string()), + Some("chromium") => Some("chromium".to_string()), _ => None, } } diff --git a/src/assets/chromium.png b/src/assets/chromium.png new file mode 100644 index 0000000..48365d1 Binary files /dev/null and b/src/assets/chromium.png differ diff --git a/src/composables/useBrowserManager.ts b/src/composables/useBrowserManager.ts index c015411..cf60b57 100644 --- a/src/composables/useBrowserManager.ts +++ b/src/composables/useBrowserManager.ts @@ -229,6 +229,9 @@ export function useBrowserManager() { if (iconKey === "chrome") return "CH"; if (iconKey === "edge") return "ED"; if (iconKey === "brave") return "BR"; + if (iconKey === "vivaldi") return "VI"; + if (iconKey === "yandex") return "YA"; + if (iconKey === "chromium") return "CR"; const name = current?.browserName?.trim() ?? ""; if (name) { @@ -248,6 +251,9 @@ export function useBrowserManager() { if (iconKey === "chrome") return "CH"; if (iconKey === "edge") return "ED"; if (iconKey === "brave") return "BR"; + if (iconKey === "vivaldi") return "VI"; + if (iconKey === "yandex") return "YA"; + if (iconKey === "chromium") return "CR"; const letters = config.name .trim() diff --git a/src/utils/icons.ts b/src/utils/icons.ts index a4f5796..870ae87 100644 --- a/src/utils/icons.ts +++ b/src/utils/icons.ts @@ -1,7 +1,10 @@ import braveIcon from "../assets/brave.png"; +import chromiumIcon from "../assets/chromium.png"; import chromeIcon from "../assets/google-chrome.png"; import edgeIcon from "../assets/microsoft-edge.png"; import settingsIcon from "../assets/settings.png"; +import vivaldiIcon from "../assets/vivaldi.png"; +import yandexIcon from "../assets/yandex.png"; import type { AssociatedProfileSummary, BookmarkAssociatedProfileSummary, @@ -12,6 +15,9 @@ export const browserIconOptions = [ { key: "chrome", label: "Google Chrome", src: chromeIcon }, { key: "edge", label: "Microsoft Edge", src: edgeIcon }, { key: "brave", label: "Brave", src: braveIcon }, + { key: "vivaldi", label: "Vivaldi", src: vivaldiIcon }, + { key: "yandex", label: "Yandex Browser", src: yandexIcon }, + { key: "chromium", label: "Chromium", src: chromiumIcon }, ] as const; export function browserIconSrc(iconKey: string | null | undefined) { @@ -83,15 +89,16 @@ export function profileAvatarSrc( return profile.avatarDataUrl; } + const avatarFamilyId = resolveAvatarFamilyId(browserFamilyId); const avatarKey = normalizeAvatarIcon(profile.avatarIcon); if (avatarKey) { - const familyMap = browserFamilyId ? avatarMap[browserFamilyId] : undefined; + const familyMap = avatarFamilyId ? avatarMap[avatarFamilyId] : undefined; if (familyMap?.[avatarKey]) { return familyMap[avatarKey]; } } - if (browserFamilyId === "chrome") { + if (avatarFamilyId === "chrome") { return createChromeGeneratedAvatar( profile.defaultAvatarFillColor, profile.defaultAvatarStrokeColor, @@ -110,6 +117,14 @@ function normalizeAvatarIcon(value: string | null | undefined) { return lastSegment.replace(/\.png$/i, ""); } +function resolveAvatarFamilyId(browserFamilyId: string | null | undefined) { + if (browserFamilyId === "chromium") { + return "chrome"; + } + + return browserFamilyId ?? null; +} + function createChromeGeneratedAvatar( backgroundArgb: number | null | undefined, foregroundArgb: number | null | undefined,