ComponentsP3 본문

IconButton

아이콘 전용 버튼 — aria-label 필수. sm(시각 32px)은 ::after로 44px 히트 영역을 확보하고, 높이는 control 토큰으로 Button과 같은 줄에 정렬됩니다.

마지막 업데이트 2026-06-14

한눈에#

아이콘만으로 자명한 반복 행동을 압축한 컨트롤. 텍스트 라벨이 없는 대신 aria-label이 필수입니다.

  • 3 변형
  • 2 크기
  • WCAG 2.5.5 · 44px
  • aria-label 필수

ghost · subtle · solid — 시각 위계 3단

사용 시점#

아이콘만으로 의미가 분명할 때만 — 모호하면 텍스트 버튼이나 링크를 실물로 비교합니다.

권장 — 이렇게 쓰세요

지양 — 이러지 마세요

쓴다아이콘만으로 자명한 반복 행동 — 검색·닫기·더보기(툴바)

대신 Button의미가 라벨을 요구하는 주요 행동

대신 Link페이지 이동·외부 링크

해부#

정사각 컨트롤 — 텍스트 패딩이 없고 아이콘이 중앙 정렬됩니다.

md · variant ghost — 정사각, 아이콘 중앙
height
44pxcontrol.height-md
width
44px정사각
radius
10pxradius-control
border
0
hit-area
≥44pxWCAG 2.5.5

크기#

높이는 control.height-* 토큰 — Button·Input과 같은 줄에 정렬됩니다. sm은 시각 32px이지만 ::after 오버레이로 히트 영역 44px을 보장합니다.

sm · md — 시각 크기 vs 히트 영역
sizeboxhit arearadiussm32px44px10pxmd44px44px10px

변형#

3단 위계. 색은 이름이 아니라 실제 스와치와 측정된 대비로 확인하세요.

ghost
bg
transparent
fg
text-muted
라이트 · AA 7.6:1
subtle
bg
surface-muted
fg
text-muted
라이트 · AA 6.9:1
solid
bg
primary-strong
fg
on-primary
라이트 · AA 7.3:1
  • ghost — 배경 없음(기본). 툴바·반복 행동
  • subtle — 옅은 표면 채움. 보조 행동을 시각적으로 묶을 때
  • solid — Button primary와 동일한 primary-strong 채움(DD-6 AA)

상태#

Hover·Active·Focus는 의사클래스라 정적 문서에선 잘 안 보입니다 — 매트릭스는 실제 IconButton에 동일 토큰을 적용해 모든 상태를 한 번에 보여줍니다.

변형 × 상태 — :focus-visible 2px primary 링
defaulthoveractivefocusdisabledloadingghost
subtle
solid

셀은 실제 컴포넌트를 렌더하고 hover·active·focus를 동일 토큰으로 정적 재현 — 색 드리프트 0

loading은 아이콘을 Spinner로 대체하고 비활성화하며 aria-busy="true"를 부여합니다.

플레이그라운드#

컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.

IconButton를 직접 조작해 보세요

속성·테마·토큰을 바꾸고 React·Flutter 코드를 확인하는 풀스크린 빌더로 엽니다.

빌더 열기

플레이그라운드는 넓은 작업 영역이 필요해 웹·태블릿에서 편집할 수 있어요.

사용 지침#

권장 — 이렇게 쓰세요

지양 — 이러지 마세요

권장툴바에서 반복 행동을 아이콘으로 압축(ghost·subtle)

지양주요 단일 CTA를 아이콘만으로 — 의미 모호. 텍스트 Button 권장

Props#

Prop타입기본값설명
iconReactNode아이콘 노드 — @wds /ui-web icons 권장 (자체 크기 보유)
aria-labelstring접근성 필수 — 아이콘의 의미를 설명한다
variant'ghost' | 'subtle' | 'solid' | 'ink'ghost시각 위계. solid는 Button primary와 동일 채움
size'sm' | 'md'md32/44px — control.height 토큰과 동기. sm은 44px 히트 영역
shape'square' | 'round'square모양 — square(기본) · round(완전 원형). AI 컴포저 액션은 round 권장(ChatGPT 정합).
loadingbooleanfalse로딩 중 — 아이콘을 Spinner로 대체하고 비활성화 (불리언 prop 무접두, COMPONENT_API §1)
refRef<HTMLButtonElement>네이티브 <button>으로 전달되는 ref (React 19 ref-as-prop)

접근성#

  • aria-label타입 레벨 필수 — 아이콘만으로는 보조기술에 의미가 전달되지 않습니다
  • 아이콘 노드는 aria-hidden 래퍼로 감싸 중복 낭독을 차단합니다
  • loadingaria-busy="true" + 비활성화 — 중복 제출을 막습니다
  • 시각 32px(sm)에도 히트 영역은 44px — WCAG 2.5.5 Target Size 충족
  • :focus-visible에 2px primary 아웃라인 링

토큰#

component 토큰 없이 semantic을 직접 소비합니다(신설 기준 §4 미충족).

속성토큰
크기control.height-sm/md · radius.control
ghost/subtlecolor.text-muted → hover color.text + color.surface-hover → active color.surface-pressed · subtle 바탕 color.surface-muted
solidcolor.primary-strong(-hover/-active) + color.on-primary (DD-6 AA 채움)
disabledcolor.disabled-bg + color.disabled-fg
포커스 링color.focus-ring 2px 아웃라인
모션duration.fast + ease.standard (배경·잉크·transform)
히트 영역space.3 / 2 네거티브 inset — 32 + 12 = 44px