fe-a11y
1
总安装量
1
周安装量
#42620
全站排名
安装命令
npx skills add https://github.com/ingpdw/pdw-fe-dev-tool --skill fe-a11y
Agent 安装分布
mcpjam
1
claude-code
1
replit
1
junie
1
zencoder
1
Skill 文档
FE Accessibility Audit
$ARGUMENTSë¡ ì ë¬ë íì¼ì ì ê·¼ì±ì WCAG 2.1 AA 기ì¤ì¼ë¡ ê²ì¬íë¤.
ê²ì¬ ì ì°¨
- ëì íì¼ ì½ê¸°: ì»´í¬ëí¸ ì½ë를 ë¶ìíë¤
- ì²´í¬ë¦¬ì¤í¸ ê¸°ë° ê²ì¬: 8ê° ì¹´í ê³ ë¦¬ì ëí´ ê²ì¬íë¤
- 리í¬í¸ ìì±: ìë° ì¬íê³¼ ìì ì½ë를 ì ìíë¤
ê²ì¬ ì²´í¬ë¦¬ì¤í¸
1. ìë§¨í± HTML
<div>/<span>ë¨ì© ëì ì ì í ìë§¨í± íê·¸ ì¬ì©<nav>,<main>,<aside>,<header>,<footer>,<section>,<article><button>(í´ë¦ ê°ë¥ ìì),<a>(ë¤ë¹ê²ì´ì )<ul>/<ol>(목ë¡),<table>(íí ë°ì´í°)
- í¤ë© ê³ì¸µ ìì (
h1âh2âh3, ê±´ëë°ê¸° ê¸ì§) <img>,<svg>ì ëì²´ í ì¤í¸
// Bad
<div onClick={handleClick}>Submit</div>
// Good
<button onClick={handleClick}>Submit</button>
2. ARIA ìì±
- ì¸í°ëí°ë¸ 커ì¤í ìì ¯ì ì ì í role + ARIA ìì±
aria-label,aria-labelledbyâ ìê°ì ë ì´ë¸ì´ ìë ììaria-describedbyâ ì¶ê° ì¤ëª ì´ íìí ììaria-expanded,aria-haspopupâ ëë¡ë¤ì´/모ë¬aria-liveâ ëì ì½í ì¸ ì ë°ì´í¸ ì림aria-hidden="true"â ì¥ìì© ìì
// í ì¤í¸ ì림
<div role="alert" aria-live="polite">
{message}
</div>
// ìì´ì½ ë²í¼
<button aria-label="Close dialog">
<XIcon aria-hidden="true" />
</button>
3. í¤ë³´ë ë¤ë¹ê²ì´ì
- 모ë ì¸í°ëí°ë¸ ììê° Tabì¼ë¡ ì ê·¼ ê°ë¥
- 커ì¤í
ìì ¯ì í¤ë³´ë í¸ë¤ë¬ (
Enter,Space,Escape, íì´íí¤) - í¬ì»¤ì¤ í¸ë© â 모ë¬/ë¤ì´ì¼ë¡ê·¸ ë´ í¬ì»¤ì¤ ìí
- Skip navigation ë§í¬ (ë©ì¸ ì½í ì¸ ë¡ ë°ë¡ ì´ë)
- ë
¼ë¦¬ì ì¸ í ìì (
tabIndexììê° ì¬ì© ê¸ì§)
// ëª¨ë¬ í¬ì»¤ì¤ í¸ë© (shadcn/ui Dialogë ìë ì§ì)
<Dialog>
<DialogContent>
{/* Tab í¤ê° ì´ ìììë§ ìí */}
</DialogContent>
</Dialog>
4. ìì & ëë¹
- í ì¤í¸ ëë¹ì¨ ìµì 4.5:1 (ì¼ë°), 3:1 (í° í ì¤í¸ 18px+)
- ììë§ì¼ë¡ ì 보를 ì ë¬íì§ ìì (ìì´ì½, í ì¤í¸ ë³í)
- ë¤í¬ 모ëììë ëë¹ì¨ 충족
- í¬ì»¤ì¤ íì (outline) ì ê±° ê¸ì§ â
focus-visibleì¬ì©
// Bad â ììë§ì¼ë¡ ìí íí
<span className={isError ? "text-red-500" : "text-green-500"}>
{status}
</span>
// Good â ìì´ì½ + í
ì¤í¸ ë³í
<span className={isError ? "text-red-500" : "text-green-500"}>
{isError ? <AlertIcon aria-hidden="true" /> : <CheckIcon aria-hidden="true" />}
{isError ? "Error: " : "Success: "}{status}
</span>
5. í¼ ì ê·¼ì±
<label>+htmlForë¡ ì ë ¥ íëì ì°ê²°- ìë¬ ë©ìì§ë¥¼
aria-describedbyë¡ ì°ê²° - íì íëì
aria-required="true"ëërequired - ìëìì±:
autoCompleteìì± ì ì í ì¤ì - ì í¨ì± ê²ì¬ 결과를 ì¤í¬ë¦°ë¦¬ëì ì ë¬
// shadcn/ui Formì ìëì¼ë¡ ì ê·¼ì± ì²ë¦¬
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input {...field} autoComplete="email" />
</FormControl>
<FormDescription>We'll never share your email.</FormDescription>
<FormMessage /> {/* aria-describedby ìë ì°ê²° */}
</FormItem>
)}
/>
6. ì´ë¯¸ì§ & 미ëì´
- ì 보를 ì ë¬íë ì´ë¯¸ì§: ì미 ìë
altí ì¤í¸ - ì¥ìì© ì´ë¯¸ì§:
alt=""ëëaria-hidden="true" - ë³µì¡í ì´ë¯¸ì§ (ì°¨í¸, ê·¸ëí): ìì¸ ì¤ëª ì ê³µ
- Next.js
<Image>ì»´í¬ëí¸ìaltíì
// ì ë³´ ì ë¬ ì´ë¯¸ì§
<Image src="/chart.png" alt="2024ë
ë§¤ì¶ ì¶ì´: 1ë¶ê¸° 100ìµ, 2ë¶ê¸° 150ìµ" />
// ì¥ìì© ì´ë¯¸ì§
<Image src="/bg-pattern.png" alt="" aria-hidden="true" />
7. ëì ì½í ì¸
- ë¡ë© ìí:
aria-busy="true", ë¡ë© ìë´ í ì¤í¸ - íì´ì§ ì í: í¬ì»¤ì¤ë¥¼ ì ì½í ì¸ ë¡ ì´ë
- 무í ì¤í¬ë¡¤: ëì ë¤ë¹ê²ì´ì ì ê³µ (íì´ì§ë¤ì´ì )
- í ì¤í¸/ì림:
role="alert"ëëaria-live="polite"
8. shadcn/ui ì ê·¼ì± í¨í´
shadcn/uië Radix UI 기ë°ì¼ë¡ ëë¶ë¶ì ì ê·¼ì±ì´ ë´ì¥ëì´ ìì§ë§, íì¸í´ì¼ í ì¬í:
Dialog:DialogTitle+DialogDescriptioníìDropdownMenu: í¸ë¦¬ê±° ë²í¼ì ëª íí ë ì´ë¸Toast:aria-liveìì ì¤ì Tooltip: í¤ë³´ë í¬ì»¤ì¤ë¡ íì ê°ë¥Tabs: íì´í í¤ ë¤ë¹ê²ì´ì ëì íì¸Sheet: í¬ì»¤ì¤ í¸ë© + ESCë¡ ë«ê¸°
리í¬í¸ íì
# Accessibility Audit: [íì¼ëª
]
## ìì½
- WCAG 2.1 AA ì¤ìì¨: [N]%
- ìë°: Nê° (Critical: N, Major: N, Minor: N)
## Critical (WCAG A ìë°)
### [A1] ì´ì ì 목
- **기ì¤**: WCAG [ë²í¸] [ì´ë¦]
- **ìì¹**: `íì¼:ë¼ì¸`
- **문ì **: ì¤ëª
- **ìì ì**: ì½ë
## Major (WCAG AA ìë°)
...
## Minor (ê°ì ê¶ì¥)
...
## íµê³¼ í목
- ...
ì¤í ê·ì¹
- ì¸ìê° ìì¼ë©´ ì¬ì©ììê² ê²ì¬ ëìì ì§ë¬¸íë¤
- shadcn/ui ì»´í¬ëí¸ ì¬ì© ì¬ë¶ë¥¼ íì¸íê³ , ë´ì¥ ì ê·¼ì± ê¸°ë¥ì ê³ ë ¤íë¤
- ìì ììë íì 구체ì ì¸ ì½ë를 í¬í¨íë¤
- ìë í ì¤í¸ë¡ ì¡ì ì ìë ìë ê²ì¦ í목ë ìë´íë¤