From 1d7ce83894254b7bb288c15b9c0e82c0f0fe3e5e Mon Sep 17 00:00:00 2001 From: ZiyaZhang <199893125+ZiyaZhang@users.noreply.github.com> Date: Tue, 11 Aug 2026 07:41:51 -0700 Subject: [PATCH 1/2] style(web): use black hero whale with hover motion --- .../src/client/skeleton/HeroShell.module.css | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css b/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css index 3d9281b96b..0b95619f92 100644 --- a/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css +++ b/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css @@ -61,11 +61,33 @@ white-space: nowrap; } -/* figma fish fill rides business blue. */ +/* Keep the hero mark in the same primary ink as its headline. */ .fish { grid-row: 1; grid-column: 1; - color: var(--dsw-alias-state-business-primary); + color: var(--dsw-alias-label-primary); + transform-box: fill-box; + transform-origin: 50% 60%; +} + +@keyframes hero-fish-swim { + 0%, 100% { + transform: translate(0, 0) rotate(0deg); + } + + 35% { + transform: translate(-1px, -1px) rotate(-5deg); + } + + 70% { + transform: translate(1px, 0) rotate(3deg); + } +} + +@media (hover: hover) and (prefers-reduced-motion: no-preference) { + .fish:hover { + animation: hero-fish-swim 560ms cubic-bezier(0.2, 0.8, 0.2, 1); + } } /* Workspace row sits 12px above the input card (figma y80 → y112). The blue From d5820df03bf69eeca3a3d61ef1ceb7bef0dc93a5 Mon Sep 17 00:00:00 2001 From: ZiyaZhang <199893125+ZiyaZhang@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:53:39 -0700 Subject: [PATCH 2/2] fix(web): stabilize hero whale hover --- apps/web/tests/startup-auto-selection.e2e.ts | 7 +++++++ .../src/client/skeleton/EmptyHero.tsx | 4 +++- .../src/client/skeleton/HeroShell.module.css | 16 +++++++++++----- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/apps/web/tests/startup-auto-selection.e2e.ts b/apps/web/tests/startup-auto-selection.e2e.ts index bbb064c119..178b3f875c 100644 --- a/apps/web/tests/startup-auto-selection.e2e.ts +++ b/apps/web/tests/startup-auto-selection.e2e.ts @@ -68,6 +68,13 @@ describe('web e2e: startup auto-selection', () => { it('keeps the resident Hero and composer nodes when the first Workspace session appears', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-first-workspace-stable-tree')) await page.locator(`${ROOT_PHASE}[data-phase="hero"]`).waitFor({ timeout: 15_000 }) + const headline = page.getByText('Into the Unknown', { exact: true }) + const fish = headline.locator('xpath=preceding-sibling::span[1]/*[name()="svg"]') + const fishHitbox = fish.locator('..') + expect(await fish.evaluate(node => getComputedStyle(node).color)) + .toBe(await headline.evaluate(node => getComputedStyle(node).color)) + await fishHitbox.hover() + expect(await fish.evaluate(node => getComputedStyle(node).animationName)).not.toBe('none') await page.evaluate(() => { const refs = { root: document.querySelector('div[data-phase="hero"]'), diff --git a/packages/client/ui-conversation/src/client/skeleton/EmptyHero.tsx b/packages/client/ui-conversation/src/client/skeleton/EmptyHero.tsx index 62ebdd93b4..4865ceecfa 100644 --- a/packages/client/ui-conversation/src/client/skeleton/EmptyHero.tsx +++ b/packages/client/ui-conversation/src/client/skeleton/EmptyHero.tsx @@ -118,7 +118,9 @@ export function HeroShell({ t, children }: HeroShellProps) {