케이스 이어하기 UI와 공통 탭·이미지 복구를 반영

This commit is contained in:
Yun Chan 2026-09-01 11:45:23 +09:00
parent 72353ecd82
commit f1b80676c1
38 changed files with 3581 additions and 455 deletions

View file

@ -20,17 +20,23 @@ function countRawColors(source) {
const shellPath = "src/components/shell/shell.css";
const surfacePath = "src/components/ui/ui.css";
const tabsPath = "src/components/ui/Tabs.tsx";
const settingsPath = "src/pages/settings/settings.css";
const sessionPath = "src/pages/Session.tsx";
const learnerHomePath = "src/pages/LearnerHome.tsx";
const adminPath = "src/pages/Admin.tsx";
const personaStudioPath = "src/pages/PersonaStudio.tsx";
const personaViewModelPath = "src/lib/personaViewModel.ts";
const appPath = "src/App.tsx";
const designDocPath = "../../docs/DESIGN_CONCEPT.md";
const shell = await read(shellPath);
const surface = await read(surfacePath);
const tabs = await read(tabsPath);
const settings = await read(settingsPath);
const session = await read(sessionPath);
const learnerHome = await read(learnerHomePath);
const admin = await read(adminPath);
const personaStudio = await read(personaStudioPath);
const personaViewModel = await read(personaViewModelPath);
const app = await read(appPath);
const designDoc = await read(designDocPath);
@ -95,6 +101,26 @@ forbid(
/#[0-9a-f]{3,8}|rgba?\(/i,
"공통 UI 색은 tokens.css 의미 토큰으로만 표현해야 합니다",
);
forbid(
tabsPath,
tabs,
/surfaceClassName|vg-surface/,
"Tabs behavior primitive는 콘텐츠 Surface를 만들면 안 됩니다",
);
for (const required of [
'role="tablist"',
'role="tab"',
"aria-controls",
"aria-labelledby",
"tabIndex",
'"ArrowRight"',
'"Home"',
'"End"',
]) {
if (!tabs.includes(required)) {
failures.push(`${tabsPath}: Tabs 접근성 계약 누락 (${required})`);
}
}
forbid(
shellPath,
shell,
@ -113,6 +139,21 @@ forbid(
/#[0-9a-f]{3,8}|rgba?\(/i,
"학습자 화면의 아바타 팔레트는 personaViewModel SSOT를 우회하면 안 됩니다",
);
for (const [relativePath, source, className, owner] of [
[adminPath, admin, "vgops-tabs", "관리자 탭 목록"],
[personaStudioPath, personaStudio, "ps-tabs", "페르소나 제작 탭 목록"],
[adminPath, admin, "vgops-approval", "가입 승인 연속 목록 행"],
[adminPath, admin, "vgops-ticket", "지원 티켓 연속 목록 행"],
]) {
forbid(
relativePath,
source,
new RegExp(
`surfaceClassName\\(["'](?:[^"']*\\s)?${className}(?:\\s[^"']*)?["']`,
),
`${owner}은 콘텐츠 Surface가 아니라 공통 컨트롤 또는 외곽 목록 프레임이 소유해야 합니다`,
);
}
forbid(
settingsPath,
settings,