From 22128f0171b03e507c4cc8e7b1ac0f8ad4f065cc Mon Sep 17 00:00:00 2001 From: yanweidong Date: Mon, 20 Jul 2026 11:43:02 +0800 Subject: [PATCH] Show online status as inline dot --- .../scripts/visual-check.mjs | 8 +++++ apps/senlinai-acro-react/src/App.css | 20 +++++++---- .../src/pages/projects/project-statusbar.tsx | 36 ++++++++++++++++--- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/apps/senlinai-acro-react/scripts/visual-check.mjs b/apps/senlinai-acro-react/scripts/visual-check.mjs index 63d85b3..9401190 100644 --- a/apps/senlinai-acro-react/scripts/visual-check.mjs +++ b/apps/senlinai-acro-react/scripts/visual-check.mjs @@ -32,6 +32,8 @@ await page.screenshot({ path: 'test-results/workbench-react-acro-dark.png', full const metrics = await page.evaluate(() => { const statusbar = document.querySelector('.statusbar') + const statusName = document.querySelector('.status-name') + const statusOnlineDot = document.querySelector('.status-online-dot') const search = document.querySelector('.global-search') const main = document.querySelector('.workbench-main') const workspacePage = document.querySelector('.workspace-page') @@ -73,6 +75,8 @@ const metrics = await page.evaluate(() => { return { statusbarHeight: statusbar?.getBoundingClientRect().height, + statusName: rect(statusName), + statusOnlineDot: rect(statusOnlineDot), searchHeight: search?.getBoundingClientRect().height, workbenchMain: rect(main), hasWorkspacePage: Boolean(workspacePage), @@ -106,6 +110,10 @@ console.log(JSON.stringify({ metrics, errors }, null, 2)) const failures = [] if (errors.length) failures.push(`console errors: ${errors.join('; ')}`) if (metrics.statusbarHeight !== 32) failures.push(`expected statusbar height 32, got ${metrics.statusbarHeight}`) +if (!metrics.statusOnlineDot) failures.push('expected online status to render as an icon dot') +if (metrics.statusName && metrics.statusOnlineDot && Math.abs(metrics.statusName.top - metrics.statusOnlineDot.top) > 6) { + failures.push(`expected online dot to sit beside username, got name=${JSON.stringify(metrics.statusName)}, dot=${JSON.stringify(metrics.statusOnlineDot)}`) +} if (metrics.searchHeight !== 42) failures.push(`expected search height 42, got ${metrics.searchHeight}`) if (metrics.overflowX) failures.push('expected no horizontal overflow') if (!metrics.workbenchMain) failures.push('missing workbench main') diff --git a/apps/senlinai-acro-react/src/App.css b/apps/senlinai-acro-react/src/App.css index a7d8a26..b69b3f8 100644 --- a/apps/senlinai-acro-react/src/App.css +++ b/apps/senlinai-acro-react/src/App.css @@ -661,17 +661,25 @@ } .status-name { - display: block; + display: inline-flex; font-size: 12px; font-weight: 700; line-height: 1; } -.status-online { - display: block; - color: #7be188 !important; - font-size: 11px; - line-height: 1; +.status-identity { + display: inline-flex; + align-items: center; + gap: 5px; +} + +.status-online-dot { + width: 7px; + height: 7px; + display: inline-block; + border-radius: 50%; + background: #7be188; + box-shadow: 0 0 0 2px rgba(123, 225, 136, 0.16); } .status-system b { diff --git a/apps/senlinai-acro-react/src/pages/projects/project-statusbar.tsx b/apps/senlinai-acro-react/src/pages/projects/project-statusbar.tsx index 5969f5d..e00a464 100644 --- a/apps/senlinai-acro-react/src/pages/projects/project-statusbar.tsx +++ b/apps/senlinai-acro-react/src/pages/projects/project-statusbar.tsx @@ -1,5 +1,15 @@ import { Avatar, Button, Layout, Space, Typography } from '@arco-design/web-react' -import { IconApps, IconCalendar, IconCheckCircleFill, IconMessage, IconRobot, IconSettings, IconStorage, IconThunderbolt, IconUserGroup } from '@arco-design/web-react/icon' +import { + IconApps, + IconCalendar, + IconCheckCircleFill, + IconMessage, + IconRobot, + IconSettings, + IconStorage, + IconThunderbolt, + IconUserGroup, +} from '@arco-design/web-react/icon' const { Footer } = Layout const { Text } = Typography @@ -7,9 +17,27 @@ const { Text } = Typography export function ProjectStatusbar() { return ( ) }