From 05fe93e108ccd197fd89d11bdaf99a358ab32e69 Mon Sep 17 00:00:00 2001 From: RockChinQ Date: Thu, 27 Aug 2026 15:18:34 +0800 Subject: [PATCH] style(agents): animate processor diagram connections --- .../components/ProcessorTypeDiagram.tsx | 51 ++++++++++++++++++- web/tests/e2e/crud-smoke.spec.ts | 9 ++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/web/src/app/home/agents/components/ProcessorTypeDiagram.tsx b/web/src/app/home/agents/components/ProcessorTypeDiagram.tsx index e28ddc6fa..a95f172af 100644 --- a/web/src/app/home/agents/components/ProcessorTypeDiagram.tsx +++ b/web/src/app/home/agents/components/ProcessorTypeDiagram.tsx @@ -5,6 +5,36 @@ import type { AgentKind } from '@/app/infra/entities/api'; const LANGBOT_BLUE = '#2288ee'; const LANGBOT_CYAN = '#19b8c9'; +function DiagramMotionStyles() { + return ( + + ); +} + function ArrowMarker({ id }: { id: string }) { return ( @@ -80,6 +110,7 @@ function AgentDiagram() { > {t('agents.agentDiagramDescription')} + @@ -100,8 +131,12 @@ function AgentDiagram() { fill="none" stroke={LANGBOT_BLUE} strokeWidth="2" + strokeDasharray="4 11" opacity="0.32" markerEnd={`url(#${arrowId})`} + className="processor-line-flow" + data-motion="flow" + style={{ animationDelay: `${index * -0.35}s` }} /> - {outputs.map((item) => ( + {outputs.map((item, index) => ( {t('agents.pipelineDiagramDescription')} + + {steps.map((step, index) => { const x = 40 + index * 142; diff --git a/web/tests/e2e/crud-smoke.spec.ts b/web/tests/e2e/crud-smoke.spec.ts index 201ecec72..c5c0c04c7 100644 --- a/web/tests/e2e/crud-smoke.spec.ts +++ b/web/tests/e2e/crud-smoke.spec.ts @@ -183,11 +183,20 @@ test.describe('frontend CRUD smoke flows', () => { ); await expect(agentTypeCard).toHaveAttribute('aria-checked', 'true'); await expect(page.getByTestId('agent-diagram')).toBeVisible(); + await expect( + page.getByTestId('agent-diagram').locator('[data-motion="flow"]'), + ).toHaveCount(3); + await expect( + page.getByTestId('agent-diagram').locator('[data-motion="relation"]'), + ).toHaveCount(3); await expect(page.getByTestId('pipeline-diagram')).toHaveCount(0); await page.getByRole('radio', { name: /^Pipeline/ }).click(); await expect(pipelineTypeCard).toHaveAttribute('aria-checked', 'true'); await expect(page.getByTestId('pipeline-diagram')).toBeVisible(); + await expect( + page.getByTestId('pipeline-diagram').locator('[data-motion="flow"]'), + ).toHaveCount(1); await expect(page.getByTestId('agent-diagram')).toHaveCount(0); await expect(page.locator('input[name="name"]')).toBeVisible();