收口前端平台组件库能力

新增 PlatformUiKit 通用弹窗、按钮、状态、空态、媒体、表单和标签等公共组件
迁移结果页、创作工作台、认证入口、RPG 暗色面板和运行态弹窗的重复 UI chrome
补充组件测试、页面回归测试、技术文档和 Hermes 共享决策记录
This commit is contained in:
2026-06-10 10:24:18 +08:00
parent a4ee6ff698
commit 1ad25e30f8
226 changed files with 23364 additions and 7825 deletions

View File

@@ -0,0 +1,150 @@
/* @vitest-environment jsdom */
import { render, screen } from '@testing-library/react';
import { expect, test } from 'vitest';
import { PlatformStatusMessage } from './PlatformStatusMessage';
test('renders platform error status with shared tone classes', () => {
render(
<PlatformStatusMessage tone="error" className="mt-4">
</PlatformStatusMessage>,
);
const message = screen.getByText('保存失败');
expect(message.className).toContain('platform-status-message');
expect(message.className).toContain('border-rose-200');
expect(message.className).toContain('bg-rose-50');
expect(message.className).toContain('mt-4');
});
test('renders success, info, warning, and neutral status tones', () => {
const { rerender } = render(
<PlatformStatusMessage tone="success"></PlatformStatusMessage>,
);
expect(screen.getByText('已保存').className).toContain('border-emerald-200');
rerender(<PlatformStatusMessage tone="info"></PlatformStatusMessage>);
expect(screen.getByText('处理中').className).toContain(
'border-[var(--platform-cool-border)]',
);
rerender(
<PlatformStatusMessage tone="warning"></PlatformStatusMessage>,
);
expect(screen.getByText('请确认').className).toContain('border-amber-200');
rerender(
<PlatformStatusMessage tone="neutral"></PlatformStatusMessage>,
);
expect(screen.getByText('暂无内容').className).toContain(
'border-[var(--platform-subpanel-border)]',
);
});
test('supports tinted surface and medium spacing for dark platform areas', () => {
render(
<PlatformStatusMessage tone="error" surface="tinted" size="md">
</PlatformStatusMessage>,
);
const message = screen.getByText('暗色区域错误');
expect(message.className).toContain('border-rose-400/20');
expect(message.className).toContain('bg-rose-500/10');
expect(message.className).toContain('px-4');
expect(message.className).toContain('leading-6');
});
test('supports platform surface tokens for result pages', () => {
const { rerender } = render(
<PlatformStatusMessage tone="warning" surface="platform">
</PlatformStatusMessage>,
);
expect(screen.getByText('发布阻断').className).toContain(
'border-[var(--platform-warm-border)]',
);
expect(screen.getByText('发布阻断').className).toContain(
'bg-[var(--platform-warm-bg)]',
);
rerender(
<PlatformStatusMessage tone="success" surface="platform">
</PlatformStatusMessage>,
);
expect(screen.getByText('已满足发布条件').className).toContain(
'border-[var(--platform-success-border)]',
);
});
test('supports profile surface tokens for account modals', () => {
const { rerender } = render(
<PlatformStatusMessage tone="error" surface="profile" size="xs">
</PlatformStatusMessage>,
);
expect(screen.getByText('充值失败').className).toContain(
'border-[var(--platform-button-danger-border)]',
);
expect(screen.getByText('充值失败').className).toContain(
'bg-[var(--platform-button-danger-fill)]',
);
expect(screen.getByText('充值失败').className).toContain('text-xs');
rerender(
<PlatformStatusMessage tone="success" surface="profile" size="xs">
</PlatformStatusMessage>,
);
expect(screen.getByText('已到账').className).toContain(
'border-[var(--platform-success-border)]',
);
expect(screen.getByText('已到账').className).toContain(
'text-[var(--platform-success-text)]',
);
});
test('supports editor dark surface for RPG panels', () => {
const { rerender } = render(
<PlatformStatusMessage tone="warning" surface="editorDark" size="xs">
QA
</PlatformStatusMessage>,
);
expect(screen.getByText('QA 提示').className).toContain(
'border-amber-300/15',
);
expect(screen.getByText('QA 提示').className).toContain('bg-amber-500/10');
expect(screen.getByText('QA 提示').className).toContain('text-amber-50/90');
rerender(
<PlatformStatusMessage tone="neutral" surface="editorDark" size="xs">
</PlatformStatusMessage>,
);
expect(screen.getByText('暗色中性').className).toContain('border-white/10');
expect(screen.getByText('暗色中性').className).toContain('bg-black/20');
});
test('supports platform remap surface wrapper class', () => {
render(
<PlatformStatusMessage tone="info" surface="platform" remapSurface>
</PlatformStatusMessage>,
);
expect(screen.getByText('正在处理').className).toContain(
'platform-remap-surface',
);
});