AuthCard export·prop 사용 현황 조사
1. 조사 대상
조사 기준은 feat/antd-phase-2-components 브랜치이며, main과 동일한 Phase 0·1 병합 결과 및 Phase 2 기준선 문서를 포함한다. 저장소 전체에서 AuthCard, 인증 입력, submit callback, password 관련 심볼과 CSS selector를 검색했다.
2. 실제 export 경로
AuthCard는 별도 파일이 아니라 packages/ui-react/src/index.tsx에 직접 구현되어 있다.
export type AuthCardProps = { ... };
export function AuthCard(props: AuthCardProps) { ... }packages/ui-react/package.json의 package export는 다음과 같다.
{
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"./styles.css": "./dist/styles.css"
}따라서 소비 포털의 공개 사용 경로는 다음과 같다.
import { AuthCard, type AuthCardProps } from "@hohyun94/portal-foundation";현재 저장소에는 AuthCard를 다른 source 파일이나 테스트에서 import해 사용하는 코드가 없다. 검색 결과는 구현부, Phase 계획 문서, 기준선 문서와 AuthCard CSS 정의에 한정된다. 따라서 현재 저장소에서 확인 가능한 소비 계약은 타입 선언과 구현 동작이며, 실제 Process Center·Guide Center·Document Library 소비 코드는 이 저장소 외부에 있을 가능성이 있다.
3. 현재 AuthCardProps
| Prop | 타입 | 필수 여부 | 현재 동작 |
|---|---|---|---|
eyebrow | string | 필수 | BrandMark label의 기본값과 eyebrow 텍스트로 사용 |
title | ReactNode | 필수 | h1#portal-auth-title로 렌더링 |
description | ReactNode | 필수 | 설명 paragraph로 렌더링 |
actionLabel | string | 필수 | action button/link의 label |
actionIcon | ReactNode | 선택 | 아이콘이 있으면 렌더링, 없으면 → 표시 |
continueHref | string | 선택 | 있으면 <a> action으로 렌더링 |
onContinue | () => void | 선택 | continueHref가 없을 때 button callback |
notice | ReactNode | 선택 | notice 영역에 렌더링 |
error | ReactNode | 선택 | role="alert" 오류 paragraph로 렌더링 |
footerLeft | ReactNode | 선택 | footer 왼쪽 영역 |
footerRight | ReactNode | 선택 | footer 오른쪽 영역 |
brandLabel | string | 선택 | BrandMark의 accessible label, 기본값은 eyebrow |
disabled | boolean | 선택 | 기본값 false; action 비활성화 |
children | ReactNode | 선택 | divider와 action 사이의 사용자 제공 콘텐츠 |
4. 현재 렌더링 계약
현재 markup 순서는 다음과 같다.
section.pf-auth-card[aria-labelledby="portal-auth-title"]
├── BrandMark
├── p.pf-auth-card__eyebrow
├── h1#portal-auth-title.pf-auth-card__title
├── p.pf-auth-card__description
├── div.pf-auth-card__divider
├── children
├── a/button.pf-auth-card__action
├── div.pf-auth-card__notice?
├── p.pf-auth-card__error[role="alert"]?
└── footer.pf-auth-card__footer?Action 분기
continueHref가 있으면 anchor가 렌더링된다.
href={continueHref}aria-disabled={disabled || undefined}- disabled 상태에서 click event의 기본 동작을 차단
disabledHTML attribute는 사용하지 않음
continueHref가 없으면 button이 렌더링된다.
type="button"disabled={disabled}onClick={onContinue}
현재 타입은 continueHref와 onContinue의 상호 배타성을 강제하지 않는다. 두 값이 모두 없거나 모두 있어도 타입 단계에서 막지 않는다.
5. CSS selector 계약
packages/ui-react/styles/styles.css에 다음 selector가 존재한다.
| Selector | 역할 |
|---|---|
.pf-auth-card | 카드 외곽, 폭, border, surface, shadow |
.pf-auth-card__eyebrow | eyebrow 텍스트 |
.pf-auth-card__title | 제목 |
.pf-auth-card__description | 설명 |
.pf-auth-card__divider | divider |
.pf-auth-card__action | 공통 action link/button |
.pf-auth-card__action-icon | 제공된 action icon |
.pf-auth-card__arrow | 기본 arrow |
.pf-auth-card__notice | 안내 영역 |
.pf-auth-card__error | 오류 영역 |
.pf-auth-card__footer | footer 영역 |
Action focus selector는 다음과 같이 공통 focus ring을 제공한다.
.pf-auth-card__action:focus-visible {
outline: 2px solid var(--pf-accent);
outline-offset: 3px;
}Disabled anchor는 다음 selector로 시각 처리된다.
.pf-auth-card__action[aria-disabled="true"] {
cursor: not-allowed;
opacity: .6;
}6. 접근성 계약
현재 구현에서 확인된 접근성 동작은 다음과 같다.
- 최상위 영역은
section이다. section은aria-labelledby="portal-auth-title"를 가진다.- 제목은
h1#portal-auth-title이다. - 오류는
p[role="alert"]로 렌더링된다. - BrandMark는
role="img"와aria-label을 가진다. - action icon과 기본 arrow는
aria-hidden="true"다. - disabled link는
aria-disabled="true"를 사용한다. - disabled button은 native
disabledattribute를 사용한다.
Phase 2.1 전환 시 Card와 Form을 도입하더라도 이 semantic heading, alert, focus, disabled 계약을 유지해야 한다.
현재 구현의 주의점은 id="portal-auth-title"가 고정되어 있다는 것이다. 한 화면에 AuthCard가 둘 이상 렌더링되면 duplicate id와 잘못된 aria-labelledby 연결이 발생할 수 있으므로, Ant Design 전환 시 useId() 또는 안정적인 id prop 도입을 검토한다.
7. 실제 사용 현황 결론
저장소 내부의 실제 사용처는 확인되지 않았다.
| 구분 | 결과 |
|---|---|
| 구현 | packages/ui-react/src/index.tsx 1곳 |
| 공개 타입 | AuthCardProps 직접 export |
| package export | @hohyun94/portal-foundation root export를 통해 노출 |
| 테스트 사용 | 현재 전용 AuthCard 테스트 없음 |
| 소비 포털 import | 이 저장소 검색 범위에서는 없음 |
| 관련 문서 | Ant Design adoption plan 및 Phase 2 기준선 문서 |
| CSS | packages/ui-react/styles/styles.css에 전용 selector 13개 |
8. Phase 2.1 구현 권고
- 기존
AuthCardProps이름과 필수 prop을 우선 유지한다. AuthCard전용 테스트를 추가해 현재 markup과 callback 동작을 먼저 고정한다.continueHref와onContinue의 상호 배타성 또는 우선순위를 명시한다.- fixed
portal-auth-titleid를useId()기반으로 변경하되, 기존 selector와 heading semantics는 유지한다. Card,Form,Input,Alert,Button은 내부 구현으로만 사용하고 Ant Design 타입을 public API에 직접 노출하지 않는다.children위치를 유지해 소비 포털의 인증 입력·OAuth 위젯 삽입 호환성을 보장한다.- link action의
aria-disabled및 click 차단과 button action의 native disabled를 각각 테스트한다. - 기존
.pf-auth-card*class를 유지하거나, 제거가 필요하면 compatibility class를 함께 렌더링한다. - 외부 소비 포털 코드가 저장소에 없으므로, 실제 migration 전에는 소비 포털 저장소에서
AuthCardimport와 prop 사용을 별도로 검색해야 한다.
9. 권장 Phase 2.1 테스트 케이스
- 필수 prop과 기본 markup 렌더링
children이 divider와 action 사이에 렌더링되는지 확인continueHref가 있으면 anchor action이 생성되는지 확인continueHref가 없으면 button action과onContinue가 동작하는지 확인- link disabled 상태에서 navigation이 차단되는지 확인
- button disabled 상태에서 callback이 호출되지 않는지 확인
notice와error표시- error의
role="alert"유지 - action icon과 arrow의
aria-hidden유지 brandLabelfallback 동작- unique heading id와
aria-labelledby연결 - light/dark Provider 아래에서 token 및 class 계약 유지