diff --git a/packages/web-ui/src/components/SettingsClient.tsx b/packages/web-ui/src/components/SettingsClient.tsx
index 2f6bf3e8..f3de0d7b 100644
--- a/packages/web-ui/src/components/SettingsClient.tsx
+++ b/packages/web-ui/src/components/SettingsClient.tsx
@@ -2355,7 +2355,7 @@ function modelCardBrand(model: ModelCatalogEntryInfo['model']): ModelBrand {
return { id: 'recraft', label: 'Recraft', src: '/brand/models/recraft.svg' };
}
if (/(clash mock|mock image|mock text)/.test(identity)) {
- return { id: 'clash', label: 'Clash', src: '/brand/logo-c.svg' };
+ return { id: 'clash', label: 'Clash', src: '/brand/logo-mark.svg' };
}
if (/(nano-banana|gemini|veo|google)/.test(identity)) {
return { id: 'google', label: 'Google', src: '/brand/providers/google.svg' };
@@ -2392,7 +2392,7 @@ function modelCardBrand(model: ModelCatalogEntryInfo['model']): ModelBrand {
}
if (/(local|mlx|whisper|kokoro|piper)/.test(identity)) {
if (/(local agent)/.test(identity)) {
- return { id: 'clash', label: 'Clash', src: '/brand/logo-c.svg' };
+ return { id: 'clash', label: 'Clash', src: '/brand/logo-mark.svg' };
}
return { id: 'local', label: 'Local' };
}
diff --git a/packages/web-ui/src/components/TopNavigation.desktop.test.tsx b/packages/web-ui/src/components/TopNavigation.desktop.test.tsx
index 10baf8f1..fa23a92b 100644
--- a/packages/web-ui/src/components/TopNavigation.desktop.test.tsx
+++ b/packages/web-ui/src/components/TopNavigation.desktop.test.tsx
@@ -177,7 +177,7 @@ describe("TopNavigation desktop chrome", () => {
const home = await screen.findByRole("button", { name: "Clash home" });
const logos = Array.from(home.querySelectorAll("img"));
expect(logos.map((logo) => logo.getAttribute("src"))).toEqual(
- expect.arrayContaining(["/brand/logo-c.svg"]),
+ expect.arrayContaining(["/icon-192.png", "/brand/logo-mark-dark.svg"]),
);
expect(logos.some((logo) => logo.className.includes("dark:block"))).toBe(true);
expect(logos.every((logo) => !logo.className.includes("dark:grayscale"))).toBe(true);
diff --git a/packages/web-ui/src/components/TopNavigation.tsx b/packages/web-ui/src/components/TopNavigation.tsx
index c7e554b6..849fd6d9 100644
--- a/packages/web-ui/src/components/TopNavigation.tsx
+++ b/packages/web-ui/src/components/TopNavigation.tsx
@@ -347,13 +347,13 @@ export default function TopNavigation() {
icon={
-
- C
-
-
- lash
-
+
+
+ Clash
);
}
diff --git a/packages/web-ui/src/components/landing/LandingNav.test.tsx b/packages/web-ui/src/components/landing/LandingNav.test.tsx
index 0cbd4830..98f1bd40 100644
--- a/packages/web-ui/src/components/landing/LandingNav.test.tsx
+++ b/packages/web-ui/src/components/landing/LandingNav.test.tsx
@@ -32,17 +32,16 @@ describe("LandingNav", () => {
expect(headerSurface?.className).toContain("clash-control-surface");
});
- it("uses the Clash wordmark with a brand-colored C", () => {
+ it("uses the current Clash agent logo", () => {
const { container, getByLabelText } = render();
expect(getByLabelText("Clash")).toBeTruthy();
- const c = container.querySelector(".clash-wordmark-c");
- expect(c).toBeTruthy();
- expect(c?.className).toContain("text-brand");
- expect(c?.textContent).toBe("C");
- expect(container.querySelector(".clash-wordmark-rest")?.textContent).toBe(
- "lash",
- );
- expect(container.querySelector('img[src*="/brand/logo-mark"]')).toBeNull();
+ expect(
+ container.querySelector('img[src="/brand/logo-mark.svg"]'),
+ ).toBeTruthy();
+ expect(
+ container.querySelector('img[src="/brand/logo-mark-dark.svg"]'),
+ ).toBeTruthy();
+ expect(container.querySelector(".clash-wordmark-slash")).toBeNull();
});
});
diff --git a/packages/web-ui/src/components/visualLanguage.test.tsx b/packages/web-ui/src/components/visualLanguage.test.tsx
index 9c65f5a1..21be1ba5 100644
--- a/packages/web-ui/src/components/visualLanguage.test.tsx
+++ b/packages/web-ui/src/components/visualLanguage.test.tsx
@@ -284,6 +284,14 @@ describe("visual language surfaces", () => {
expect(source).toMatch(/clash-node-badge-draft/);
});
+ it("uses the transparent Clash mark for the browser tab favicon", () => {
+ const favicon = readFileSync(join(process.cwd(), "apps/web/public/favicon.svg"), "utf8");
+ const mark = readFileSync(join(process.cwd(), "apps/web/public/brand/logo-mark.svg"), "utf8");
+
+ expect(favicon).toBe(mark);
+ expect(favicon).not.toMatch(/ {
const source = [
"packages/web-ui/src/components/nodes/TextNode.tsx",
@@ -509,7 +517,7 @@ describe("visual language surfaces", () => {
expect(source).toMatch(/clash-hero-stage/);
expect(source).toMatch(/clash-hero-prompt/);
expect(source).not.toMatch(/lg:pl-(12|16)|xl:pl-(12|16)/);
- expect(source).toMatch(/\/brand\/logo-c-animated\.svg/);
+ expect(source).toMatch(/\/brand\/logo-mark-animated\.svg/);
expect(source).toMatch(/clash-dashboard-shell/);
expect(source).toMatch(/clash-projects-empty-workbench/);
expect(source).toMatch(/clash-projects-empty-canvas/);
@@ -715,7 +723,7 @@ describe("visual language surfaces", () => {
expect(source).toMatch(/error\.code/);
expect(source).toMatch(/Reload/);
expect(source).toMatch(/Go home/);
- expect(source).toMatch(/\/brand\/logo-c-error\.svg/);
+ expect(source).toMatch(/\/brand\/logo-mark-error\.svg/);
expect(errorMark).toMatch(/aria-label="Clash error logo"/);
expect(errorMark.match(/stroke-linecap="round"/g)?.length).toBeGreaterThanOrEqual(5);
});