From 4ba7d843b1b8bf7657b1f9651afa88aea4c9c989 Mon Sep 17 00:00:00 2001 From: cynarAI <155274210+cynarAI@users.noreply.github.com> Date: Sun, 4 Oct 2026 04:00:43 +0200 Subject: [PATCH 1/4] test: fix journey 5c lookup and chart-links warmup (#126) Look up the home main conversation by spaceId in journey 5c, and warm the chart-links E2E so the first Observable Plot import is not a 20s timeout. --- apps/web/e2e/chart-links.spec.ts | 4 ++++ packages/testkit/src/journeys.test.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/web/e2e/chart-links.spec.ts b/apps/web/e2e/chart-links.spec.ts index c6e1133..81f6950 100644 --- a/apps/web/e2e/chart-links.spec.ts +++ b/apps/web/e2e/chart-links.spec.ts @@ -4,6 +4,10 @@ import { captureScreenshot } from "./helpers"; const fixture = "/e2e/fixtures/chart-links.html"; test("chart links cannot execute script when clicked or expanded", async ({ page }, testInfo) => { + test.setTimeout(120_000); + // ChartCanvas lazy-loads Observable Plot; pay the import cost once before the matrix below. + await page.goto(`${fixture}?${new URLSearchParams({ href: "#details", inspect: "0" })}`); + await expect(page.locator("svg circle").first()).toBeVisible({ timeout: 90_000 }); for (const inspect of ["0", "1"]) { for (const href of [ 'javascript:void(document.body.dataset.plotExecuted="yes")', diff --git a/packages/testkit/src/journeys.test.ts b/packages/testkit/src/journeys.test.ts index f5ae027..d6d8d98 100644 --- a/packages/testkit/src/journeys.test.ts +++ b/packages/testkit/src/journeys.test.ts @@ -1301,8 +1301,9 @@ describeJourneys("required product journeys", () => { }); await joinMainConversation(prisma, { userId: me.userId, botIds: [writer.id] }); + // Lab has a main conversation of its own; the home one is where Writer joined. const conversation = await prisma.chatGroup.findFirstOrThrow({ - where: { userId: me.userId, kind: "main" }, + where: { userId: me.userId, spaceId: main.spaceId, kind: "main" }, include: { thread: true }, }); const inMain = await scheduleAndWake("Writer", "main-digest"); From c4c5ce3c2da028aa1a2aed54dacdef4744625add Mon Sep 17 00:00:00 2001 From: cynarAI <155274210+cynarAI@users.noreply.github.com> Date: Sun, 4 Oct 2026 04:37:24 +0200 Subject: [PATCH 2/4] fix(ui): polish the light palette, center the stage bloom (#108) * fix(ui): make the light theme a real light theme The web shell hardcoded dark surfaces (panel hex, white/black alphas, white text), so switching to light left the sidebar, chat, composer and side panel dark with ink text on top. Shell surfaces now use the shared tokens: light gets a warm paper frame with white panels, hairline borders and short soft shadows; dark keeps its look via dark: variants. - Light palette: visible borders (border was equal to muted), white primary-foreground, lighter user bubble, readable warning/success. - Selected sidebar row lives in one place (roster-row-style). - Markdown, inline code, code blocks, quotes and scrollbars follow tokens. - cn() now knows the text-ui-* scale is a font size; tailwind-merge treated it as a color and dropped labels' color on resized buttons (sign-up submit rendered ink on ink). - Stage bloom was offset left by a double translateX. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016or6oqCqP8wbNafvhnbLQT * refactor(ui-web): leave the cn() fix to #115 #115 fixes the same tailwind-merge bug more completely (text, control, icon and spacing scales, guarded against styles.css) and adds the same two files, so this branch drops its narrower copy to avoid the overlap. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016or6oqCqP8wbNafvhnbLQT --------- Co-authored-by: Claude --- apps/web/e2e/ui-appearance.spec.ts | 3 ++ apps/web/index.html | 2 +- .../onboarding/OnboardingScanProgress.tsx | 4 +-- apps/web/src/components/stage/StageHero.tsx | 18 +++++----- .../src/components/stage/TextStageCanvas.tsx | 2 +- apps/web/src/pages/shell/message-cards.tsx | 8 ++--- apps/web/src/pages/shell/roster-row-style.ts | 2 +- packages/ui-tokens/src/index.ts | 34 +++++++++---------- packages/ui-tokens/src/tokens.css | 34 +++++++++---------- packages/ui-web/src/bot-avatar.tsx | 4 +-- packages/ui-web/src/evoo-brand.tsx | 2 +- 11 files changed, 58 insertions(+), 55 deletions(-) diff --git a/apps/web/e2e/ui-appearance.spec.ts b/apps/web/e2e/ui-appearance.spec.ts index e72d12e..6bda945 100644 --- a/apps/web/e2e/ui-appearance.spec.ts +++ b/apps/web/e2e/ui-appearance.spec.ts @@ -67,6 +67,9 @@ test("account settings appearance control switches to light mode", async ({ page await settings.getByRole("button", { name: "Close user settings" }).click(); await expect(settings).toBeHidden(); await expect(page.locator("html")).toHaveAttribute("data-theme", "light"); + // Light surfaces stay light: no dark panel or white-on-paper text survives the switch. + await expect(page.locator("main").first()).toHaveCSS("background-color", "rgb(255, 255, 255)"); + await expect(page.locator("aside").first()).toHaveCSS("background-color", "rgb(245, 245, 242)"); await captureScreenshot(page, testInfo, "ui-appearance-light-shell"); await captureSidebarSearchSelected(page, testInfo, "sidebar-search-selected-light"); diff --git a/apps/web/index.html b/apps/web/index.html index c626fbd..3d2749a 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -26,7 +26,7 @@ document.documentElement.dataset.theme = theme; document.documentElement.style.colorScheme = theme; const meta = document.querySelector('meta[name="theme-color"]'); - if (meta) meta.setAttribute("content", theme === "light" ? "#fafaf8" : "#07080a"); + if (meta) meta.setAttribute("content", theme === "light" ? "#ffffff" : "#07080a"); })();