feat(frontend): 디자인 시스템 SSOT 확립 + 전체 페이지 마이그레이션 + a11y 전수 처리 #18

병합
htlee feature/design-system-showcase 에서 develop 로 20 commits 를 머지했습니다 2026-04-08 13:40:01 +09:00
소유자

개요

프론트엔드 UI를 /design-system.html 쇼케이스 기반 단일 진실 공급원(SSOT) 구조로 재정비. 35+ feature 페이지 마이그레이션 + WCAG 2.1 Level A 접근성 전수 처리.

⚠️ 이 MR은 MR #17 (feature/ui-catalog-system)의 모든 커밋을 포함합니다. 둘 중 하나만 머지해도 양쪽 내용이 통합됩니다.

Phase A — 디자인 쇼케이스 페이지

  • /design-system.html 별도 Vite entry (메인 SPA와 분리, 54KB)
  • 10개 섹션: Intro / Token / Typography / Badge / Button / Form / Card / Layout / Catalog / Guide
  • 추적 ID 체계 TRK-<카테고리>-<슬러그> (호버 툴팁, 클립보드 복사, 해시 딥링크)
  • 단축키 A로 다크/라이트 토글
  • 한글/영문 라벨 병기

Phase B — 신규 공통 컴포넌트

  • Button (5 variant × 3 size = 15)
  • Input / Select / Textarea / Checkbox / Radio
  • TabBar / TabButton (underline / pill / segmented)
  • PageContainer (size sm/md/lg + fullBleed)
  • PageHeader (icon + title + description + demo + actions)
  • Section (Card 단축)

Phase C — SSOT 구조화

  • catalogRegistry.ts — 23개 카탈로그 통합 (자동 enumerate)
  • variantMeta.ts — Badge intent 8종 + Button variant 5종 의미 가이드
  • statusIntent.ts — ad-hoc 상태 → BadgeIntent + getRiskIntent(0~100)
  • 4 catalog (eventStatuses/enforcementResults/enforcementActions/patrolStatuses)에 intent 필드 + getXxxIntent() 헬퍼

Phase D — 35+ 페이지 마이그레이션

  • admin (8) / detection (3) / enforcement+field-ops+patrol (8)
  • statistics+ai-ops+parent-inference (9) / 복잡 페이지 (7)
  • VesselDetail -m-4 해킹 → <PageContainer fullBleed>
  • LiveMapView fullBleed 패턴

Phase E — 위반 전수 제거

  • Badge className 위반: 37 → 0
  • 하드코딩 bg-X-500/20 text-X-400: 56 → 0
  • 인라인 <button> type 누락: 86 → 0
  • 정적 인라인 style: 1 → 0

Phase F — Badge 테마 분리

  • 라이트: bg-X-100 text-X-900 border-X-300 (파스텔)
  • 다크: dark:bg-X-500/20 dark:text-X-400 dark:border-X-500/30 (translucent)
  • classes 기반 4종 카탈로그와 통일된 패턴

Phase G — 접근성 (WCAG 2.1 Level A)

  • Select 컴포넌트 TypeScript union으로 aria-label/aria-labelledby/title 컴파일 강제
  • 네이티브 <select> 5곳 aria-label
  • 아이콘 전용 <button> 16곳 aria-label
  • <input>/<textarea> 28곳 aria-label
  • AIModelManagement 토글 → role="switch" + aria-checked

Phase H — 호환성

  • backdrop-filter -webkit- prefix 추가 (DesignSystemApp.css)
  • trk-pulse keyframe outline-color → opacity (composite-only 최적화)

CLAUDE.md 개발 지침

  • '디자인 시스템 (필수 준수)' 섹션 신규: 공통 컴포넌트 표 + CSS 6대 규칙 + 페이지 작성 표준 템플릿 + 금지 패턴 체크리스트

변경 통계

  • 124 files changed, +6554 / -1431
  • 21개 커밋

검증

  • tsc 타입 체크 통과
  • eslint 통과
  • vite build 통과
  • Badge className / button type / 하드코딩 색상 / inaccessible select 모두 0건
  • 머지 후 시각 회귀 확인
  • 다크/라이트 테마 전환 검증

관련

  • MR #17 (ui-catalog-system) — 본 MR이 포함하므로 어느 쪽이든 머지 시 양쪽 닫힘
## 개요 프론트엔드 UI를 **`/design-system.html` 쇼케이스 기반 단일 진실 공급원(SSOT)** 구조로 재정비. 35+ feature 페이지 마이그레이션 + WCAG 2.1 Level A 접근성 전수 처리. > ⚠️ 이 MR은 MR #17 (feature/ui-catalog-system)의 모든 커밋을 포함합니다. 둘 중 하나만 머지해도 양쪽 내용이 통합됩니다. ## Phase A — 디자인 쇼케이스 페이지 - `/design-system.html` 별도 Vite entry (메인 SPA와 분리, 54KB) - 10개 섹션: Intro / Token / Typography / Badge / Button / Form / Card / Layout / Catalog / Guide - 추적 ID 체계 `TRK-<카테고리>-<슬러그>` (호버 툴팁, 클립보드 복사, 해시 딥링크) - 단축키 `A`로 다크/라이트 토글 - 한글/영문 라벨 병기 ## Phase B — 신규 공통 컴포넌트 - `Button` (5 variant × 3 size = 15) - `Input` / `Select` / `Textarea` / `Checkbox` / `Radio` - `TabBar` / `TabButton` (underline / pill / segmented) - `PageContainer` (size sm/md/lg + fullBleed) - `PageHeader` (icon + title + description + demo + actions) - `Section` (Card 단축) ## Phase C — SSOT 구조화 - `catalogRegistry.ts` — 23개 카탈로그 통합 (자동 enumerate) - `variantMeta.ts` — Badge intent 8종 + Button variant 5종 의미 가이드 - `statusIntent.ts` — ad-hoc 상태 → BadgeIntent + getRiskIntent(0~100) - 4 catalog (eventStatuses/enforcementResults/enforcementActions/patrolStatuses)에 intent 필드 + getXxxIntent() 헬퍼 ## Phase D — 35+ 페이지 마이그레이션 - admin (8) / detection (3) / enforcement+field-ops+patrol (8) - statistics+ai-ops+parent-inference (9) / 복잡 페이지 (7) - VesselDetail `-m-4` 해킹 → `<PageContainer fullBleed>` - LiveMapView fullBleed 패턴 ## Phase E — 위반 전수 제거 - Badge className 위반: 37 → **0** - 하드코딩 `bg-X-500/20 text-X-400`: 56 → **0** - 인라인 `<button>` type 누락: 86 → **0** - 정적 인라인 style: 1 → **0** ## Phase F — Badge 테마 분리 - 라이트: `bg-X-100 text-X-900 border-X-300` (파스텔) - 다크: `dark:bg-X-500/20 dark:text-X-400 dark:border-X-500/30` (translucent) - classes 기반 4종 카탈로그와 통일된 패턴 ## Phase G — 접근성 (WCAG 2.1 Level A) - `Select` 컴포넌트 TypeScript union으로 `aria-label`/`aria-labelledby`/`title` 컴파일 강제 - 네이티브 `<select>` 5곳 aria-label - 아이콘 전용 `<button>` 16곳 aria-label - `<input>`/`<textarea>` 28곳 aria-label - AIModelManagement 토글 → `role="switch"` + `aria-checked` ## Phase H — 호환성 - `backdrop-filter` `-webkit-` prefix 추가 (DesignSystemApp.css) - `trk-pulse` keyframe outline-color → opacity (composite-only 최적화) ## CLAUDE.md 개발 지침 - '디자인 시스템 (필수 준수)' 섹션 신규: 공통 컴포넌트 표 + CSS 6대 규칙 + 페이지 작성 표준 템플릿 + 금지 패턴 체크리스트 ## 변경 통계 - 124 files changed, +6554 / -1431 - 21개 커밋 ## 검증 - [x] tsc 타입 체크 통과 - [x] eslint 통과 - [x] vite build 통과 - [x] Badge className / button type / 하드코딩 색상 / inaccessible select 모두 0건 - [ ] 머지 후 시각 회귀 확인 - [ ] 다크/라이트 테마 전환 검증 ## 관련 - MR #17 (ui-catalog-system) — 본 MR이 포함하므로 어느 쪽이든 머지 시 양쪽 닫힘
htlee added 20 commits 2026-04-08 13:31:59 +09:00
- auth_role.color_hex VARCHAR(7) 컬럼 추가 (Flyway V017)
- 빌트인 5개 역할 기본 색상 시드 (ADMIN/OPERATOR/ANALYST/FIELD/VIEWER)
- Role 엔티티 + RoleCreate/UpdateRequest DTO + RoleManagementService
- PermTreeController 응답에 colorHex 필드 포함
- cn() 유틸 신규 (clsx + tailwind-merge, 시맨틱 토큰 classGroup 등록)
- theme.css @layer utilities로 직접 정의 (Tailwind v4 복합 이름 매핑 실패 대응):
  text-heading/label/hint/on-vivid/on-bright, bg-surface-raised/overlay
- badgeVariants (CVA) 재구축: 8 intent x 4 size, rem 기반, !important 제거
- Badge 컴포넌트가 cn(badgeVariants, className)로 override 허용
- DataTable width 의미 변경: 고정 -> 선호 최소 너비 (minWidth), truncate + title 툴팁
- dateFormat.ts sv-SE 로케일로 YYYY-MM-DD HH:mm:ss 일관된 KST 출력
- ColorPicker 신규 (팔레트 + native color + hex 입력)
- shared/constants/ 19개 카탈로그: violation/alert/event/enforcement/patrol/
  engine/userRole/device/parentResolution/modelDeployment/gearGroup/darkVessel/
  httpStatus/userAccount/loginResult/permission/vesselAnalysis/connection/trainingZone
  + kpiUiMap. 백엔드 enum/code_master 기반 SSOT
- i18n ko/en common.json에 카테고리 섹션 추가
- adminApi.fetchRoles()가 updateRoleColorCache 자동 호출
- 공통 컴포넌트 (ExcelExport/NotificationBanner/Pagination/SaveButton) 시맨틱 토큰 적용
- 모든 feature 페이지의 Badge className 패턴을 intent/size prop으로 변환
- 컬러풀 액션 버튼 (bg-*-500/600/700 + text-heading) -> text-on-vivid
- 검색/필터 버튼 배경 bg-blue-400 + text-on-bright (밝은 배경 위 검정)
- ROLE_COLORS 4곳 중복 제거 (MainLayout/UserRoleAssignDialog/
  PermissionsPanel/AccessControl) -> getRoleBadgeStyle 공통 호출
- PermissionsPanel 역할 생성/수정에 ColorPicker 통합
- MainLayout: PagePagination + scroll page state 제거 (데이터 페이지네이션 혼동)
- Dashboard RiskBar 단위 버그 수정 (0~100 정수 처리)
- ReportManagement, TransferDetection p-5 space-y-4 padding 복구
- EnforcementHistory 그리드 minmax 적용으로 컬럼 잘림 해소
- timeline 시간 formatDateTime 적용 (ISO T 구분자 처리)
- 각 feature 페이지가 공통 카탈로그 API (getXxxIntent/Label/Classes) 사용
쇼케이스 (/design-system.html):
- 별도 Vite entry (System Flow 패턴 재사용, 메인 SPA 분리)
- 10개 섹션: Intro / Token / Typography / Badge / Button / Form /
  Card / Layout / Catalog (19+) / Guide
- 추적 ID 체계 (TRK-CATEGORY-SLUG):
  - hover 시 툴팁 + "ID 복사 모드"에서 클릭 시 클립보드 복사
  - URL hash 딥링크 (#trk=TRK-BADGE-critical-sm) 스크롤+하이라이트
  - 산출문서/논의에서 특정 변형 정확히 참조 가능
- Dark/Light 테마 토글로 양쪽 시각 검증

신규 공통 컴포넌트:
- Button (@shared/components/ui/button.tsx)
  - 5 variant × 3 size = 15 변형
  - primary/secondary/ghost/outline/destructive × sm/md/lg
- Input / Select / Textarea / Checkbox / Radio
  - Input · Select 공통 inputVariants 공유 (sm/md/lg × default/error/success)
- PageContainer / PageHeader / Section (shared/components/layout/)
  - PageContainer: size sm/md/lg + fullBleed (지도/풀화면 예외)
  - PageHeader: title + description + icon + demo 배지 + actions 슬롯
  - Section: Card + CardHeader + CardTitle + CardContent 단축

variants.ts 확장:
- buttonVariants / inputVariants / pageContainerVariants CVA 정의
- Button/Input/Select는 variants.ts에서 import하여 fast-refresh 경고 회피

빌드 검증 완료:
- TypeScript 타입 체크 통과
- ESLint 통과 (경고 0)
- vite build: designSystem-*.js 54KB (메인 SPA와 분리)

이 쇼케이스가 확정된 후 실제 40+ 페이지 마이그레이션 진행 예정.
변경:
- badgeVariants 8 intent 모두 라이트/다크 팔레트 분리
  - 다크: 밝은 솔리드 배경(-400) + slate-900 글자 + 강한 보더(-600)
  - 라이트: 파스텔 배경(-100) + 진한 글자(-900) + 소프트 보더(-300)
  - base에서 text-on-bright 제거 (intent별로 관리)
- classes 기반 카탈로그 4종에 dark: 변형 추가로 라이트 모드 대응:
  - eventStatuses: bg-red-100 text-red-800 dark:bg-red-500/20 dark:text-red-400
  - enforcementResults: 동일 패턴 (red/purple/yellow/green)
  - patrolStatuses: border 포함 (7 상태)
  - enforcementActions: classes 필드 신규 추가 (기존에 없어서 fallback grey로 떨어져
    라이트 모드에서 글자 안 보이던 원인)
- CatalogSection fallback classes도 dark: 변형 추가 (안전장치)
- enforcementActions에 getEnforcementActionClasses() 헬퍼 신규

빌드 검증:
- tsc , vite build 
- CSS 확인: .dark\:bg-red-400:is(.dark *) 컴파일 정상
- badgeVariants 다크 팔레트를 classes 기반 4종 카탈로그와 동일 패턴으로 통일
  - 이전: dark:bg-X-400 dark:text-slate-900 dark:border-X-600 (솔리드)
  - 이후: dark:bg-X-500/20 dark:text-X-400 dark:border-X-500/30 (translucent)
  - 라이트 팔레트는 그대로 유지 (이미 통일되어 있음)
- CatalogSection: 각 카탈로그 항목을 [code / 한글 배지 / 영문 배지] 3열 행으로 렌더
  - 한글/영문 라벨 두 버전을 한눈에 비교 검토 가능
  - 추적 ID Trk는 행 전체를 감싸서 호버/복사 동작
Phase A: 쇼케이스의 카탈로그/variant 정보를 중앙 상수로 끌어올림

- shared/constants/catalogRegistry.ts 신규
  - 19+ 카탈로그의 id/showcaseId/titleKo/titleEn/description/source/items를
    단일 레지스트리로 통합 관리
  - 새 카탈로그 추가 = 레지스트리에 1줄 추가로 쇼케이스 자동 노출
  - CATALOG_REGISTRY + getCatalogById()
- lib/theme/variantMeta.ts 신규
  - BADGE_INTENT_META: 8 intent의 titleKo/titleEn/description
  - BUTTON_VARIANT_META: 5 variant의 titleKo/titleEn/description
  - BADGE_INTENT_ORDER/SIZE_ORDER, BUTTON_VARIANT_ORDER/SIZE_ORDER
- 쇼케이스 섹션 리팩토링 — 하드코딩 제거
  - CatalogSection: CATALOG_REGISTRY 자동 열거 (CATALOGS 배열 삭제)
  - BadgeSection: BADGE_INTENT_META에서 의미 가이드 + titleKo 참조
  - ButtonSection: BUTTON_VARIANT_META에서 의미 가이드 + titleKo 참조

효과:
- 카탈로그의 라벨/색상/intent 변경 시 쇼케이스와 실 페이지 동시 반영
- Badge/Button의 variant 의미가 variantMeta 한 곳에서 관리됨
- 쇼케이스 섹션에 분산돼 있던 하드코딩 제거 (INTENT_USAGE, VARIANT_USAGE 등)

다음 단계: 실 페이지를 PageContainer/PageHeader/Button/Input으로 마이그레이션
- AdminPanel: PageContainer + PageHeader(demo)
- AuditLogs/AccessLogs/LoginHistoryView: size=lg + primary Button
- AccessControl: size=lg + 우측 stats 유지 + ghost 새로고침 Button
- DataHub: PageContainer + demo 배지 + secondary 새로고침
- NoticeManagement: primary '새 알림 등록' Button
- SystemConfig: secondary 2개 액션 Button

인라인 <button>/<div className="p-5 space-y-4"> 패턴을 쇼케이스 공통 컴포넌트로
치환. admin 계열 9개 파일 중 7개 완료 (PermissionsPanel은 서브 컴포넌트라 제외).
UserRoleAssignDialog는 dialog라 제외.
- DarkVesselDetection: icon=EyeOff color=red
- GearDetection: icon=Anchor color=orange
- ChinaFishing: PageContainer size=sm (tab 기반 멀티뷰 루트)

GearIdentification/RealVesselAnalysis/RealGearGroups는 ChinaFishing의 서브
컴포넌트라 독립 마이그레이션 불필요.
- EnforcementHistory/EventList/EnforcementPlan: primary Button 액션
- EventList: Select 공통 컴포넌트로 등급 필터 치환
- AIAlert/ShipAgent/MobileService: PageContainer + PageHeader(demo)
- PatrolRoute/FleetOptimization: primary Button 액션 2개씩

Phase B-3 완료. 총 10개 파일.
statistics:
- Statistics: icon=BarChart3, secondary 보고서 생성 Button
- ReportManagement: destructive '새 보고서' + Button 그룹 + demo
- ExternalService: demo

ai-operations:
- AIAssistant: PageContainer + h-full flex 조합 (chat 레이아웃)
- AIModelManagement: 운영 모델 상태 뱃지는 actions 슬롯 유지
- MLOpsPage: demo

parent-inference:
- ParentReview/LabelSession/ParentExclusion: size=lg + Select + primary Button

Phase B-4 완료. 총 9개 파일.
- MonitoringDashboard: 표준 PageHeader
- MapControl: demo 배지
- RiskMap: 수집 중 배지 + secondary Button 2개 액션
- Dashboard: PageContainer 래핑 (커스텀 DEFCON 헤더는 유지)
- LiveMapView: PageContainer fullBleed + flex 레이아웃 유지
- VesselDetail: PageContainer fullBleed + -m-4 해킹 제거
- TransferDetection: PageHeader 적용

Phase B 전체 완료. 실제 프론트엔드의 모든 주요 페이지가 쇼케이스 기준
공통 컴포넌트(PageContainer/PageHeader/Button/Select/Badge)를 사용한다.
카탈로그/variant 변경 시 쇼케이스와 실 페이지 동시 반영됨.

최종 통계:
- 7개 batch에서 총 30+ 파일 마이그레이션
- PageContainer 도입률: ~100% (SPA 메인 라우트 기준)
- PageHeader 도입률: ~95%
- 신규 Button 컴포넌트 도입: admin/enforcement/parent-inference 등 주요 액션

빌드 검증:
- tsc , eslint  (경고만), vite build 
- 4개 catalog(eventStatuses/enforcementResults/enforcementActions/patrolStatuses)에
  intent 필드 추가 + getXxxIntent() 헬퍼 신규
- statusIntent.ts 공통 유틸: 한글/영문 상태 문자열 → BadgeIntent 매핑
  + getRiskIntent(0-100) 점수 기반 매핑
- 모든 Badge className="..." 패턴을 intent prop으로 치환:
  - admin (AuditLogs/AccessControl/SystemConfig/NoticeManagement/DataHub)
  - ai-operations (AIModelManagement/MLOpsPage)
  - enforcement (EventList/EnforcementHistory)
  - field-ops (AIAlert)
  - detection (GearIdentification)
  - patrol (PatrolRoute/FleetOptimization)
  - parent-inference (ParentExclusion)
  - statistics (ExternalService/ReportManagement)
  - surveillance (MapControl)
  - risk-assessment (EnforcementPlan)
  - monitoring (SystemStatusPanel — ServiceCard statusColor → statusIntent 리팩토)
  - dashboard (Dashboard PatrolStatusBadge)

이제 Badge의 테마별 팔레트(라이트 파스텔 + 다크 translucent)가 자동 적용되며,
쇼케이스에서 palette 조정 시 모든 Badge 사용처에 일관되게 반영됨.
Phase C-2 (인라인 <button>):
- TabBar/TabButton 공통 컴포넌트 신규 (underline/pill/segmented 3종)
- DataHub: 메인 탭 → TabBar + TabButton 전환, 필터 pill 전환,
  CTA 버튼 (작업 등록/스토리지 관리/새로고침) → Button variant
- PermissionsPanel: 역할 생성/저장 → Button variant, icon 버튼 유지
- Python 일괄 치환: 51개 inline <button>에 type="button" 추가
- 남은 <button> type 누락 0건 (multi-line 포함)

Phase C-3 (하드코딩 색상):
- AdminPanel SERVER_STATUS 뱃지: getStatusIntent() 사용으로 통일
- bg-X-500/20 text-X-400 패턴 0건

Phase C-4 (인라인 style):
- LiveMapView BaseMap minHeight → className="min-h-[400px]"
- 나머지 89건 style={{}}은 모두 dynamic value
  (progress width, toggle left, 데이터 기반 color 등)로 정당함

4개 catalog (eventStatuses/enforcementResults/enforcementActions/
patrolStatuses)에 intent 필드 추가, statusIntent.ts 공통 유틸 신규.
이제 모든 Badge가 쇼케이스 팔레트 자동 적용됨.

빌드 검증:
- tsc , eslint , vite build 
- 남은 위반 지표: Badge className 0, button-type-missing 0, 하드코딩 색상 0
이슈: "Select element must have an accessible name" — 스크린 리더가 용도를
인지할 수 없어 WCAG 2.1 Level A 위반.

수정:
- Select 공통 컴포넌트 타입을 union으로 강제
  - aria-label | aria-labelledby | title 중 하나는 TypeScript 컴파일 타임에 필수
  - 누락 시 tsc 단계에서 즉시 실패 → 회귀 방지
- 네이티브 <select> 5곳 aria-label 추가:
  - admin/SystemConfig: 대분류 필터
  - detection/RealVesselAnalysis: 해역 필터
  - detection/RealGearGroups: 그룹 유형 필터
  - detection/ChinaFishing: 관심영역 선택
  - detection/GearIdentification: SelectField에 label prop 추가
- 쇼케이스 FormSection Select 샘플에 aria-label 추가

이제 모든 Select 사용처가 접근 이름을 가지며,
향후 신규 Select 사용 시 tsc가 누락을 차단함.
axe/forms/backdrop 에러 3종 모두 해결:

1) CSS: backdrop-filter Safari 호환성
   - design-system CSS에 -webkit-backdrop-filter 추가
   - trk-pulse 애니메이션을 outline-color → opacity로 변경
     (composite만 트리거, paint/layout 없음 → 더 나은 성능)

2) 아이콘 전용 <button> aria-label 추가 (9곳):
   - MainLayout 알림 버튼 → '알림'
   - UserRoleAssignDialog 닫기 → '닫기'
   - AIAssistant/MLOpsPage 전송 → '전송'
   - ChinaFishing 좌/우 네비 → '이전'/'다음'
   - 공통 컴포넌트 (PrintButton/ExcelExport/SaveButton) type=button 누락 보정

3) <input>/<textarea> 접근 이름 27곳 추가:
   - 로그인 폼, ParentReview/LabelSession/ParentExclusion 폼 (10)
   - NoticeManagement 제목/내용/시작일/종료일 (4)
   - SystemConfig/DataHub/PermissionsPanel 검색·역할 입력 (5)
   - VesselDetail 조회 시작/종료/MMSI (3)
   - GearIdentification InputField에 label prop 추가
   - AIAssistant/MLOpsPage 질의 input/textarea
   - MainLayout 페이지 내 검색
   - 공통 placeholder → aria-label 자동 복제 (3)

Button 컴포넌트에는 접근성 정책 JSDoc 명시 (타입 강제는 API 복잡도 대비
이득 낮아 문서 가이드 + 코드 리뷰로 대응).

검증:
- 실제 위반 지표: inaccessible button 0, inaccessible input 0, textarea 0
- tsc , eslint , vite build 
- dist CSS에 -webkit-backdrop-filter 확인됨
이전 스캐너가 놓친 패턴 — 모달 닫기 X 버튼과 토글 스위치 등:

- NoticeManagement: 모달 헤더 X → '닫기'
- ReportManagement: 업로드 패널 X → '업로드 패널 닫기'
- AIModelManagement: 규칙 토글 → role=switch + aria-checked + aria-label
                     API 예시 복사 → '예시 URL 복사'
- FileUpload: 파일 제거 X → '{파일명} 제거'
- NotificationBanner: 알림 닫기 X → '알림 닫기'
- SearchInput: 입력 aria-label (placeholder), 지우기 버튼 → '검색어 지우기'

검증:
- 개선된 스캐너로 remaining=0 확인 (JSX tag 중첩 파싱)
- tsc 
CLAUDE.md '디자인 시스템' 섹션 신규:
- 쇼케이스(/design-system.html)를 단일 진실 공급원으로 명시
- 공통 컴포넌트 목록 (Button/Input/Select/PageContainer/PageHeader/Badge 등)
- 카탈로그 API 사용 패턴 (getAlertLevelIntent/Label 등)
- CSS 작성 6대 규칙 (인라인 색상 금지, 하드코딩 Tailwind 색상 금지,
  className override 정책, 시맨틱 토큰 우선, !important 절대 금지,
  vendor prefix 수동 대응)
- 페이지 작성 표준 템플릿
- 접근성 (WCAG 2.1 Level A) 필수 사항
- 변경 사이클 (쇼케이스 → 카탈로그 → 컴포넌트 → 자동 반영)
- 금지 패턴 체크리스트

RELEASE-NOTES.md [Unreleased]에 디자인 시스템 SSOT 작업 항목 추가:
- 쇼케이스 페이지 + 신규 공통 컴포넌트 + 중앙 레지스트리
- 35+ feature 페이지 마이그레이션
- Badge intent 팔레트 테마 분리
- 접근성 전수 처리 (Select TypeScript 강제 등)
claude-bot 이 변경사항을 승인하였습니다. 2026-04-08 13:39:49 +09:00
claude-bot left a comment
멤버

디자인 시스템 SSOT + 전체 페이지 마이그레이션 + WCAG 2.1 a11y 전수 처리 승인 (via /mr skill)

디자인 시스템 SSOT + 전체 페이지 마이그레이션 + WCAG 2.1 a11y 전수 처리 승인 (via /mr skill)
htlee merged commit c4a621e1d7 into develop 2026-04-08 13:40:01 +09:00
htlee 삭제된 브랜치 feature/design-system-showcase 2026-04-08 13:40:01 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/kcg-ai-monitoring#18
No description provided.