fix(frontend): stabilize speed tags on inbound and client pages (#5930)

* fix(frontend): add shared stable speed-tag style

Give live up/down rate tags a fixed width, centered layout, nowrap,
and tabular numerals so digit/unit changes cannot reflow the Speed column.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): stabilize InboundSpeedTag and ClientSpeedTag layout

Apply the shared speed-tag class/style to both live rate tags and lock
the behavior with a focused component test for small and large rates.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): align speed columns with stable tag width

Widen inbound/client Speed columns to match the fixed tag and apply the
same stable style to idle dash cells so active/idle swaps do not jitter.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* fix(frontend): scope stable speed tags to table cells and fit content

---------

Co-authored-by: x06579 <x06579@ai-dashboard>
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
H-TTTTT
2026-07-14 19:00:25 +08:00
committed by GitHub
parent 658e6ab3d3
commit f2b17397f4
6 changed files with 131 additions and 10 deletions
@@ -2,6 +2,7 @@ import { Tag } from 'antd';
import { SizeFormatter } from '@/utils';
import type { ClientSpeedEntry } from '@/hooks/useClients';
import { SPEED_TAG_CLASS_NAME, SPEED_TAG_STYLE } from '@/components/utility/speedTagStyle';
export type { ClientSpeedEntry };
@@ -11,11 +12,16 @@ export function isActiveSpeed(speed?: ClientSpeedEntry): speed is ClientSpeedEnt
interface ClientSpeedTagProps {
speed: ClientSpeedEntry;
tableCell?: boolean;
}
export function ClientSpeedTag({ speed }: ClientSpeedTagProps) {
export function ClientSpeedTag({ speed, tableCell = false }: ClientSpeedTagProps) {
return (
<Tag color="blue">
<Tag
color="blue"
className={tableCell ? SPEED_TAG_CLASS_NAME : undefined}
style={tableCell ? SPEED_TAG_STYLE : undefined}
>
{SizeFormatter.speedFormat(speed.up)}
{' / '}
{SizeFormatter.speedFormat(speed.down)}
@@ -0,0 +1,21 @@
import type { CSSProperties } from 'react';
export const SPEED_TAG_CLASS_NAME = 'table-speed-tag' as const;
export const SPEED_TAG_WIDTH = 200 as const;
export const SPEED_TABLE_CELL_INLINE_PADDING = 8 as const;
export const SPEED_TAG_STYLE = {
width: SPEED_TAG_WIDTH,
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
textAlign: 'center',
whiteSpace: 'nowrap',
fontVariantNumeric: 'tabular-nums',
marginInlineEnd: 0,
boxSizing: 'border-box',
overflow: 'hidden',
textOverflow: 'ellipsis',
} as const satisfies CSSProperties;
export const SPEED_COLUMN_WIDTH = SPEED_TAG_WIDTH + SPEED_TABLE_CELL_INLINE_PADDING * 2;