Skip to content

๐Ÿ› ๏ธ Refactor: ์›น ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™” (ARIA ์†์„ฑ ๋ฐ ์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ ๊ฐœ์„ )#99

Merged
skyblue1232 merged 3 commits intodevelopfrom
refactor/#95/web-accessibility
Nov 9, 2025

Conversation

@skyblue1232
Copy link
Copy Markdown
Contributor

@skyblue1232 skyblue1232 commented Nov 9, 2025

๐Ÿ”ฅ ์ž‘์—… ๋‚ด์šฉ

  • aria-label, role, aria-describedby ๋“ฑ ์‹œ๋งจํ‹ฑ ์ ‘๊ทผ์„ฑ ์†์„ฑ ์ถ”๊ฐ€
  • ์‹œ๊ฐ์ ์œผ๋กœ ์ˆจ๊ธฐ๋˜ ์Šคํฌ๋ฆฐ๋ฆฌ๋”์—๋งŒ ๋…ธ์ถœ๋˜๋Š” sr-only ํด๋ž˜์Šค ํ™œ์šฉ
    โ†’ ๋ณ„๋„ ์Šคํƒ€์ผ๋ง ๋ถˆํ•„์š” (Tailwind ๊ธฐ๋ณธ ๋‚ด์žฅ ์Šคํƒ€์ผ ์‚ฌ์šฉ)
  • ์ฃผ์š” ํผ ์˜์—ญ ๋ฐ ๋ฆฌ์ŠคํŠธ ์˜์—ญ์— aria-live ์ถ”๊ฐ€๋กœ ๋™์  ์ฝ˜ํ…์ธ  ๋Œ€์‘
  • role="group", aria-labelledby ๊ตฌ์กฐ๋กœ ํผยท๋ฒ„ํŠผ ๊ด€๊ณ„ ๋ช…ํ™•ํ™”
  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๋‚ด ์ ‘๊ทผ์„ฑ ์ค‘๋ณต ์ œ๊ฑฐ (์ƒ์œ„ ๋‹จ์—์„œ ์—ญํ•  ์ œ์–ด)

๋ฆฌํŒฉํ† ๋ง ๋ชฉ์ 

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ์ ‘๊ทผ์„ฑ(Accessibility) ๊ฐ•ํ™”
  • ์ฝ”๋“œ ์ผ๊ด€์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง
  • ๋ถˆํ•„์š”ํ•œ ์Šคํƒ€์ผ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ์‹œ๋งจํ‹ฑ ๋งˆํฌ์—… ์ •๋ฆฌ

โš™๏ธ ๊ธฐ์ˆ  ํฌ์ธํŠธ

  • React + Next.js + TypeScript ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์„ฑ ๋ฆฌํŒฉํ† ๋ง
  • TailwindCSS + sr-only ์ ‘๊ทผ์„ฑ ์Šคํƒ€์ผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ™œ์šฉ
  • WAI-ARIA ํ‘œ์ค€ ์ค€์ˆ˜ ๋ฐ ์Šคํฌ๋ฆฐ๋ฆฌ๋” ๋Œ€์‘ ๋กœ์ง ์ถ”๊ฐ€
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ํ™•๋ฆฝ (ARIA role ์ƒ์œ„ ์œ„์ž„ ๋ฐฉ์‹)

๐Ÿค” ์ถ”ํ›„ ์ž‘์—… ์‚ฌํ•ญ

  • ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ์ด๋™ ์‹œ outline ์ปค์Šคํ…€ ๋ฐ focus-visible ์ƒํƒœ ๊ฐœ์„ 
  • Lighthouse ์ ‘๊ทผ์„ฑ ์ง€ํ‘œ ๊ธฐ๋ฐ˜ ์ƒ์„ธ ๊ฒ€์ˆ˜ ๋ฐ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
  • ํ–ฅํ›„ ๊ณตํ†ต Button / Input ์ปดํฌ๋„ŒํŠธ์— aria-flow ํ™•์žฅ ์˜ˆ์ •

๐Ÿ”— ๊ด€๋ จ ์ด์Šˆ

PR Point (To Reviewer)

  • aria-* ์†์„ฑ ์ ์šฉ ์‹œ, UI๋‚˜ ์ธํ„ฐ๋ž™์…˜์— ์˜ํ–ฅ์ด ์—†๋Š”์ง€ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • sr-only ์ ์šฉ๋œ ๋ถ€๋ถ„์˜ ์˜๋„(์Šคํฌ๋ฆฐ๋ฆฌ๋”์šฉ ์„ค๋ช…) ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๋‚ด role ๋ถ€์—ฌ ๋ฒ”์œ„๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ ์ ˆํ•œ์ง€ ๊ฒ€ํ†  ๋ฐ”๋ž๋‹ˆ๋‹ค.

๐Ÿ“ธ ํ”ผ๊ทธ๋งˆ ์Šคํฌ๋ฆฐ์ƒท or ๊ธฐ๋Šฅ GIF

Summary by CodeRabbit

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

    • ํ‚ค๋ณด๋“œ๋กœ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ปจํŠธ๋กค ํ™•๋Œ€(Enter/Space๋กœ ์•ก์…˜ ํŠธ๋ฆฌ๊ฑฐ)
  • ๊ฐœ์„ ์‚ฌํ•ญ

    • ์•ฑ ์ „๋ฐ˜์— ๊ฑธ์ณ ์Šคํฌ๋ฆฐ๋ฆฌ๋”์šฉ ARIA ๋ ˆ์ด๋ธ” ๋ฐ ์—ญํ•  ๋Œ€ํญ ์ถ”๊ฐ€
    • ๋Œ€ํ™”ํ˜• ์š”์†Œ(์•„์ด์ฝ˜ยท๋ฒ„ํŠผยทํ† ๊ธ€ยท์นด๋“œ)์˜ ์ ‘๊ทผ์„ฑยท์ƒํƒœ ํ‘œํ˜„ ๊ฐœ์„ 
    • ์ด๋ฏธ์ง€, ๋กœ๋”ฉ, ๋นˆ ์ƒํƒœ ๋“ฑ์— ์ ์ ˆํ•œ ๋Œ€์ฒด ํ…์ŠคํŠธ/์—ญํ•  ์ถ”๊ฐ€
    • ๋‚ ์งœ ์„ ํƒ ์ปดํฌ๋„ŒํŠธ์— ๋ช…์‹œ์  ๋ ˆ์ด๋ธ” ์ง€์› ์ถ”๊ฐ€

@skyblue1232 skyblue1232 self-assigned this Nov 9, 2025
@skyblue1232 skyblue1232 added the refactor ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์—…, QA ๋ฐ˜์˜ label Nov 9, 2025
@vercel
Copy link
Copy Markdown

vercel bot commented Nov 9, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
af-fe Ready Ready Preview Comment Nov 9, 2025 7:05pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Nov 9, 2025

Walkthrough

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ARIA ์†์„ฑ๊ณผ ์‹œ๋งจํ‹ฑ ๋งˆํฌ์—…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ์— ํ‚ค๋ณด๋“œ ์ƒํ˜ธ์ž‘์šฉ(Enter/Space)๊ณผ ์•„์ด์ฝ˜์˜ ์ƒํ˜ธ์ž‘์šฉ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ž‘ ๋กœ์ง์€ ์œ ์ง€๋œ ์ฑ„ ์ ‘๊ทผ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํ‚ค๋ณด๋“œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Changes

Cohort / File(s) ๋ณ€๊ฒฝ ์š”์•ฝ
์ธ์ฆ/๋กœ๋”ฉ
src/pages/auth/index.tsx, src/pages/loading/index.tsx
SVG์— aria-hidden/focusable ์ถ”๊ฐ€; ๋กœ๋”ฉ ์ปจํ…Œ์ด๋„ˆ์— role="status", aria-live ๋“ฑ ์ ‘๊ทผ์„ฑ ์†์„ฑ ์ถ”๊ฐ€
์ฑ„ํŒ…
src/pages/chatbot/index.tsx, src/pages/chatbot/components/ChattingBubble.tsx, src/pages/chatbot/components/ChattingInput.tsx
์ฑ„ํŒ… ๋กœ๊ทธยท๋ฒ„๋ธ”ยท์ž…๋ ฅยท์ „์†ก ๋ฒ„ํŠผ์— role, aria-live, aria-label ๋“ฑ ARIA ์†์„ฑ ์ถ”๊ฐ€
์ด๋ฒคํŠธ ๊ด€๋ จ
src/pages/events/index.tsx, src/pages/events/[id].tsx, src/pages/events/components/DateTag.tsx
๋‚ ์งœ/์ด๋ฏธ์ง€/์ •๋ณด/๋ชฉ๋ก์— aria-label ์ถ”๊ฐ€; DateTag์— ๋‚ ์งœ ๋ฒ”์œ„ ์„ค๋ช…์šฉ aria-label ์ถ”๊ฐ€
๋ฉ”์ธ/๋ณด๋“œ/์Šคํƒฌํ”„/๋น„๋””์˜ค
src/pages/main/index.tsx, src/pages/main/Board.tsx, src/pages/main/HiddenReward.tsx, src/pages/main/Node.tsx, src/pages/main/PostCard.tsx, src/pages/main/components/board/Boardgame.tsx, src/pages/main/components/stampBoard/Progress.tsx, src/pages/main/components/stampBoard/Stamp.tsx, src/pages/main/components/video/VideoPlayer.tsx
์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— role="main"/aria-label ์ถ”๊ฐ€; Boardgame์— handleCellClick๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ค‘์•™ํ™”, ํ™œ์„ฑ ์…€์— role="button", tabIndex, Enter/Space ์ง€์›; Progress/Stamp์— ARIA ์†์„ฑ; VideoPlayer ์ผ๋ถ€ aria ์ œ๊ฑฐ
์ง€๋„ / ๊ฒฐ๊ณผ / ํƒœ๊ทธ
src/pages/map/result/Map.tsx, src/pages/map/result/components/ResultMap.tsx, src/pages/map/result/components/TagGroup.tsx, src/pages/map/components/CourseSelectSection.tsx
๋ฃจํŠธ๋ฅผ main์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ role="main" ์ถ”๊ฐ€; ResultMap์—์„œ aria-labelledby ์ œ๊ฑฐ; TagGroup์— aria-pressed/aria-label ์ถ”๊ฐ€; CourseSelectSection ํ•ญ๋ชฉ์„ role="listitem"๋กœ ๋ž˜ํ•‘
๋งˆ์ดํŽ˜์ด์ง€ / ํ”„๋กœํ•„
src/pages/mypage/index.tsx, src/pages/mypage/events/[id].tsx, src/pages/mypage/postcard/[id].tsx, src/pages/mypage/components/ProfilePhoto.tsx
ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์— role="main"/aria-label ์ถ”๊ฐ€; ์„น์…˜๋ณ„ aria-label ์ถ”๊ฐ€; ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์— alt ์ถ”๊ฐ€
๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ: ์•„์ด์ฝ˜/์นด๋“œ/ํ”Œ๋ฆฝ/ํƒญ/DatePicker
src/shared/icons/components/icon.tsx, src/shared/components/container/EventCard.tsx, src/shared/components/flipCard/FlipCard.tsx, src/shared/components/tab/BottomNav.tsx, src/shared/components/datePicker/DatePicker.tsx
Icon์— isInteractive/pressed props ์ถ”๊ฐ€ ๋ฐ ํ‚ค๋ณด๋“œ(onKeyDown) ๋™์ž‘ ๋„์ž…; EventCard Heart ์•„์ด์ฝ˜์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ์œผ๋กœ ๋ณ€๊ฒฝ(aria-label ํ† ๊ธ€); FlipCard์— role="button", tabIndex, aria-pressed, Enter/Space ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€; BottomNav aria-label ํ…์ŠคํŠธ ๋ณ€๊ฒฝ; DatePicker์— ariaLabel prop ์ถ”๊ฐ€

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant FlipCard
  participant Icon
  participant Boardgame
  participant Router

  rect `#E6F7FF`
    Note over User,FlipCard: FlipCard์— ํ‚ค๋ณด๋“œ ํ™œ์„ฑํ™” ์ถ”๊ฐ€
    User->>FlipCard: press Enter/Space
    FlipCard->>FlipCard: toggle flip state (aria-pressed ์—…๋ฐ์ดํŠธ)
  end

  rect `#FFF4E6`
    Note over User,Icon: Icon์˜ interactive ๋ชจ๋“œ (isInteractive)
    User->>Icon: click / press Enter/Space
    Icon->>Icon: handleKeyDown โ†’ ํ˜ธ์ถœ๋œ onClick ์‹คํ–‰ (aria-pressed ๋ฐ˜์˜)
  end

  rect `#F0FFF4`
    Note over User,Boardgame: Boardgame ๋„ค๋น„๊ฒŒ์ด์…˜ ์ค‘์•™ํ™”
    User->>Boardgame: click or press Enter/Space on active cell
    Boardgame->>Boardgame: handleCellClick(label)
    Boardgame->>Router: router.push(`/main/Node?label=${label}`)
  end
Loading

Estimated code review effort

๐ŸŽฏ 3 (Moderate) | โฑ๏ธ ~25 minutes

  • ์ฃผ์˜ ๊ฒ€ํ†  ํฌ์ธํŠธ:
    • src/shared/icons/components/icon.tsx: isInteractive/pressed ์ถ”๊ฐ€๋กœ ๊ธฐ์กด ์‚ฌ์šฉ์ฒ˜์—์„œ props ๋ฏธ์ „๋‹ฌ ์‹œ ๋™์ž‘ ๊ฒ€์ฆ ๋ฐ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ํฌ์›Œ๋”ฉ ์—ฌ๋ถ€ ํ™•์ธ
    • src/pages/main/components/board/Boardgame.tsx: handleCellClick ์ง‘์•ฝ ํ›„ ๋ผ์šฐํŒ… ์ธ์žยทํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ(Enter/Space) ๋ฐ aria-label ์ผ๊ด€์„ฑ ํ™•์ธ
    • src/shared/components/flipCard/FlipCard.tsx: ํ‚ค๋ณด๋“œ ํ† ๊ธ€ ์‹œ ์ƒํƒœ์™€ aria-pressed ๋™๊ธฐํ™” ํ™•์ธ
    • src/shared/components/container/EventCard.tsx: Heart ์•„์ด์ฝ˜์˜ pressed/์ƒ‰์ƒ ๋ฐ aria-label ํ† ๊ธ€์˜ ์ผ๊ด€์„ฑ ํ™•์ธ

Possibly related PRs

Suggested reviewers

  • KongMezu
  • jjangminii

Poem

๐Ÿฐ ๊นก์ด๊นก์ด ํ‚ค๋ฅผ ๋‘๋“œ๋ฆฌ๋ฉฐ,
aria๋ฅผ ์‹ฌ๊ณ  ๊ธธ์„ ์—ด์—ˆ๋„ค,
Enter์™€ Space๋กœ ๋Œ€๋‹ตํ•˜๋ฉฐ,
ํ™”๋ฉด ๋„ˆ๋จธ ๋ชฉ์†Œ๋ฆฌ๋„ ๋“ค๋ฆฌ๋„ค โ€”
์ž‘์€ ๋‹น๊ทผ ์ถ•ํ•˜ ํ•œ ์ž… ๐Ÿฅ•

Pre-merge checks and finishing touches

โœ… Passed checks (5 passed)
Check name Status Explanation
Title check โœ… Passed PR ์ œ๋ชฉ์€ ์›น ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™”์™€ ARIA ์†์„ฑ ๋ฐ ์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ ๊ฐœ์„ ์„ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์ฃผ์š” ๋ชฉ์ ์„ ์ž˜ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
Description check โœ… Passed PR ์„ค๋ช…์€ ํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ ์ž‘์—… ๋‚ด์šฉ, ๋ฆฌํŒฉํ† ๋ง ๋ชฉ์ , ๊ธฐ์ˆ  ํฌ์ธํŠธ, ์ถ”ํ›„ ์ž‘์—…, ์ด์Šˆ ๋งํฌ, ๊ฒ€ํ†  ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
Linked Issues check โœ… Passed PR์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ(aria-label, role, sr-only ์ถ”๊ฐ€, ์ปดํฌ๋„ŒํŠธ ์ ‘๊ทผ์„ฑ ๊ฐœ์„ )์ด ์ด์Šˆ #95์˜ ์›น ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ๋ชฉํ‘œ๋ฅผ ์ถฉ์กฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Out of Scope Changes check โœ… Passed ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์›น ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ARIA ์†์„ฑ ๋ฐ ์‹œ๋งจํ‹ฑ ๋งˆํฌ์—… ์ถ”๊ฐ€์—๋งŒ ์ดˆ์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ, ๊ธฐ๋Šฅ ๋กœ์ง์ด๋‚˜ UI ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Docstring Coverage โœ… Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
โœจ Finishing touches
  • ๐Ÿ“ Generate docstrings
๐Ÿงช Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#95/web-accessibility

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

โค๏ธ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added the comment ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ label Nov 9, 2025
@github-actions
Copy link
Copy Markdown

github-actions bot commented Nov 9, 2025

๐Ÿท๏ธ Labeler has automatically applied labels based on your PR title, branch name, or commit message.
Please verify that they are correct before merging.

@skyblue1232 skyblue1232 changed the title ๐Ÿ› ๏ธ Refactor: ์›น ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™” (aria ์ ์šฉ ๋“ฑ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”) ๐Ÿ› ๏ธ Refactor: ์›น ์ ‘๊ทผ์„ฑ ๊ฐ•ํ™” (ARIA ์†์„ฑ ๋ฐ ์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ ๊ฐœ์„ ) Nov 9, 2025
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

Caution

Some comments are outside the diff and canโ€™t be posted inline due to platform limitations.

โš ๏ธ Outside diff range comments (4)
src/pages/map/result/components/TagGroup.tsx (1)

26-37: Tag ์ปดํฌ๋„ŒํŠธ๊ฐ€ ARIA ์†์„ฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Tag ์ปดํฌ๋„ŒํŠธ์˜ Props ์ธํ„ฐํŽ˜์ด์Šค์— aria-pressed์™€ aria-label์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„๋ถ€์—์„œ๋„ rest props๋ฅผ ํ•˜์œ„ button ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ:

  1. TypeScript ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค
  2. ์ด ARIA ์†์„ฑ๋“ค์ด ์‹ค์ œ DOM์— ์ ์šฉ๋˜์ง€ ์•Š์•„ ์ ‘๊ทผ์„ฑ ๊ฐœ์„  ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

Tag ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

src/shared/components/tag/Tag.tsx ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ •:

interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  label: string;
  icon?: IconName;
  className?: string;
  onClick?: () => void;
  variant?: VariantProps<typeof tagStyle>['variant'];
}

src/shared/components/tag/Tag.tsx ๊ตฌํ˜„๋ถ€ ์ˆ˜์ •:

-({ label, icon, variant, className, onClick }: Props) => {
+({ label, icon, variant, className, onClick, ...rest }: Props) => {
   return (
     <button
       type='button'
       className={cn(tagStyle({ variant }), className)}
       onClick={onClick}
+      {...rest}
     >
       {icon && <Icon name={icon} size={14} color='gray-50' />}
       <span>{label}</span>
     </button>
   );
 }
src/pages/main/HiddenReward.tsx (1)

10-24: ๊ตฌ์กฐ์  role์„ interactive ์š”์†Œ์— ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

role="main"์€ ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ (landmark) ์—ญํ• ์ž…๋‹ˆ๋‹ค. ํด๋ฆญ ๊ฐ€๋Šฅํ•œ div์— ์ด๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ARIA ๋ช…์„ธ๋ฅผ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ํด๋ฆญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ์ธก๋ฉด์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ์ž๊ฐ€ Enter/Space๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
  • ํฌ์ปค์Šค ํ‘œ์‹œ๊ฐ€ ์—†์–ด ํ˜„์žฌ ์œ„์น˜๋ฅผ ์•Œ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋ง์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

-    <div
+    <main
       className='
         relative w-full h-[100vh]
         bg-gradient-to-b from-mint-500 to-white
         flex flex-col justify-center items-center text-center
         overflow-hidden
-        cursor-pointer
       '
-      role="main"
       aria-label="ํžˆ๋“  ๋ฆฌ์›Œ๋“œ ํš๋“ ํŽ˜์ด์ง€"
-      onClick={() =>
-        router.push({
-          pathname: '/main/PostCard',
-        })
-      }
     >
       <div className='absolute inset-0 z-0 pointer-events-none mt-0'>
         <Lottie
           animationData={Confetti_revised}
           loop
           autoplay
           className='w-full h-full object-cover'
         />
       </div>

       <div className='relative z-10 flex flex-col items-center justify-center'>
         <h1 className='text-black mb-[4.5rem] text-headline-lg-serif'>
           Congrats!
         </h1>

         <p className='text-title-sm text-black mb-[6rem]'>
           ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! <br />
           ํžˆ๋“  ๋ฆฌ์›Œ๋“œ๋ฅผ ํš๋“ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
         </p>

         <Lottie
           animationData={Logo_sliver}
           loop
           autoplay
           className='w-[18rem] h-[18rem] mb-[6rem]'
         />

         <p className='text-label-md text-black mb-[7rem]'>
           ๊ฐ€ํ†จ๋ฆญ๋Œ€ ์ „์„ค์˜ ํฌ์ผ“๋ชฌ <br />
           '๋‚˜๋ฌด๋ฅผ ์ˆ˜ํ˜ธํ•˜๋Š” ์ข…์ฒ ์”จ'๋ฅผ <br />
           ํš๋“ํ•˜์…จ์Šต๋‹ˆ๋‹ค!
         </p>

-        <p className='text-label-serif text-mint-500'>click!</p>
+        <button
+          type="button"
+          onClick={() =>
+            router.push({
+              pathname: '/main/PostCard',
+            })
+          }
+          className='text-label-serif text-mint-500 bg-transparent border-none cursor-pointer'
+          aria-label="์—ฝ์„œ ํŽ˜์ด์ง€๋กœ ์ด๋™"
+        >
+          click!
+        </button>
       </div>
-    </div>
+    </main>
src/pages/main/index.tsx (1)

34-41: ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

role="button"๊ณผ tabIndex={0}์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ํ‚ค๋ณด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ์œ„ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. onKeyDown ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Enter ๋˜๋Š” Space ํ‚ค๋กœ๋„ ๋™์ผํ•œ ๋™์ž‘์ด ์ˆ˜ํ–‰๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

         <section
           role="button"
           tabIndex={0}
           aria-label="๋ณด๋“œํŒ์œผ๋กœ ์ด๋™"
           onClick={() => {
             router.push('/main/Board');
           }}
+          onKeyDown={(e) => {
+            if (e.key === 'Enter' || e.key === ' ') {
+              e.preventDefault();
+              router.push('/main/Board');
+            }
+          }}
         >
src/shared/components/container/EventCard.tsx (1)

96-105: ์ค‘๊ฐ„ ํฌ๊ธฐ ์นด๋“œ์—๋„ ์ ‘๊ทผ์„ฑ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๋Œ€ํ˜• ์นด๋“œ์˜ ํ•˜ํŠธ ์•„์ด์ฝ˜์—๋Š” isInteractive, pressed, aria-label ์†์„ฑ์ด ์žˆ์ง€๋งŒ ์ค‘๊ฐ„ ํฌ๊ธฐ ์นด๋“œ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ์ค‘๊ฐ„ ํฌ๊ธฐ ์นด๋“œ์—๋„ ๋™์ผํ•œ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

             <Icon
               name='HeartStraight'
               size={20}
               color={
                 liked ? 'red-400' : variant === 'mint' ? 'mint-400' : 'gray-300'
               }
               fillColor={liked ? 'red-300' : undefined}
               onClick={handleLikeClick}
+              isInteractive
+              pressed={liked}
+              aria-label={liked ? '์ข‹์•„์š” ์ทจ์†Œ' : '์ข‹์•„์š”'}
               className='cursor-pointer'
             />
๐Ÿงน Nitpick comments (12)
src/pages/events/[id].tsx (3)

36-38: semantic HTML ์š”์†Œ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

ํ˜„์žฌ aria-label="ํ–‰์‚ฌ ๊ธฐ๊ฐ„"์„ ๊ฐ€์ง„ wrapper๊ฐ€ DateTag๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DateTag ์ž์ฒด๋„ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ผ๋ถ€ ์ค‘๋ณต์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

generic div ๋Œ€์‹  <section> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์  ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

-        <div aria-label="ํ–‰์‚ฌ ๊ธฐ๊ฐ„" className={cn('flex justify-center w-[18.4rem] mt-[1.3rem]')}>
+        <section aria-labelledby="event-period" className={cn('flex justify-center w-[18.4rem] mt-[1.3rem]')}>
+          <h2 id="event-period" className="sr-only">ํ–‰์‚ฌ ๊ธฐ๊ฐ„</h2>
          <DateTag startDate={startDate} endDate={endDate} />
-        </div>
+        </section>

66-80: semantic HTML ์š”์†Œ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

aria-label="ํ–‰์‚ฌ ์ •๋ณด"๋ฅผ ๊ฐ€์ง„ wrapper๋Š” ์ฃผ์š” ์ •๋ณด ์„น์…˜์„ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <section> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

-        <div
+        <section
          aria-label="ํ–‰์‚ฌ ์ •๋ณด"
          className={cn(
            'flex flex-col items-center w-full gap-[0.8rem]',
            'mt-[0.8rem]'
          )}
        >
          {/* ... */}
-        </div>
+        </section>

82-107: ๊ด€๋ จ ํ–‰์‚ฌ ๋ชฉ๋ก์— semantic HTML ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

"๊ด€๋ จ ํ–‰์‚ฌ ๋ชฉ๋ก"์€ navigation ๋˜๋Š” ๋ณ„๋„ ์„น์…˜์œผ๋กœ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ <section> ๋˜๋Š” <nav> ์š”์†Œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

-          <div
+          <section
            aria-label="๊ด€๋ จ ํ–‰์‚ฌ ๋ชฉ๋ก"
            className={cn(
              'grid grid-cols-2 gap-[1.2rem] justify-items-center w-full max-w-[35.4rem]'
            )}
          >
            {/* ... */}
-          </div>
+          </section>

์ฐธ๊ณ : ํ˜„์žฌ ํ•˜๋“œ์ฝ”๋”ฉ๋œ "๊ด€๋ จ ํ–‰์‚ฌ" ๋ฐ์ดํ„ฐ๋Š” placeholder๋กœ ๋ณด์ด๋ฉฐ, ํ–ฅํ›„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ๊ต์ฒด๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

src/pages/mypage/postcard/[id].tsx (1)

24-26: role="main"์€ <main> ์š”์†Œ์—์„œ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.

HTML5์˜ ์‹œ๋งจํ‹ฑ <main> ์š”์†Œ๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ main ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. WAI-ARIA ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด, ์‹œ๋งจํ‹ฑ HTML ์š”์†Œ์— ๋ช…์‹œ์ ์œผ๋กœ ๋™์ผํ•œ role์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๋ฉฐ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

aria-label์€ ์œ ์ง€ํ•˜๋˜ role ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

       <main
-        role="main"
         aria-label="์ €์žฅํ•œ ์—ฝ์„œ ์ƒ์„ธ ํŽ˜์ด์ง€"
         className={cn(
src/pages/mypage/events/[id].tsx (1)

25-27: role="main"์€ <main> ์š”์†Œ์—์„œ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.

HTML5์˜ ์‹œ๋งจํ‹ฑ <main> ์š”์†Œ๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ main ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ๋™์ผํ•œ role์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

aria-label์€ ์œ ์ง€ํ•˜๋˜ role ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

       <main
-        role="main"
         aria-label="์ €์žฅํ•œ ํ–‰์‚ฌ ์ƒ์„ธ ํŽ˜์ด์ง€"
         className={cn(
src/pages/mypage/index.tsx (1)

15-19: role="main"์€ <main> ์š”์†Œ์—์„œ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.

HTML5์˜ ์‹œ๋งจํ‹ฑ <main> ์š”์†Œ๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ main ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

aria-label์€ ์œ ์ง€ํ•˜๋˜ role ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

     <main 
       className='w-full min-h-screen bg-white flex flex-col items-center'
-      role="main"
       aria-label="๋งˆ์ด ํŽ˜์ด์ง€"
     >
src/pages/map/result/Map.tsx (1)

9-13: ์‹œ๋งจํ‹ฑ HTML ์‚ฌ์šฉ์€ ์ข‹์ง€๋งŒ role="main"์€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.

div๋ฅผ <main>์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์‹œ๋งจํ‹ฑ HTML ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ํ›Œ๋ฅญํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ <main> ์š”์†Œ๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ main ์—ญํ• ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ช…์‹œ์ ์ธ role ์†์„ฑ์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

aria-label์€ ์œ ์ง€ํ•˜๋˜ role ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

     <main
       className="w-full h-[100vh] bg-mint-300 overflow-hidden"
-      role="main"
       aria-label="์ฝ”์Šค ์ถ”์ฒœ ์ง€๋„ ํŽ˜์ด์ง€"
     >
src/pages/main/components/stampBoard/Stamp.tsx (1)

26-34: ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด role="img"๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

ํš๋“ํ•œ ์Šคํƒฌํ”„์—๋Š” role="img"๊ฐ€ ์žˆ์ง€๋งŒ ๋ฏธํš๋“ ์Šคํƒฌํ”„์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ์ ‘๊ทผ์„ฑ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ๋ฏธํš๋“ ์Šคํƒฌํ”„์˜ ์ปจํ…Œ์ด๋„ˆ์—๋„ ๋™์ผํ•œ ์—ญํ• ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์„ธ์š”:

   return (
     <div
+      role="img"
       className={cn(
         'rounded-full bg-pink-100 w-[2.8rem] h-[2.8rem]',
         className,
       )}
       aria-label={`${index + 1}๋ฒˆ์งธ ์Šคํƒฌํ”„ ๋ฏธํš๋“`}
     />
   );
src/pages/chatbot/index.tsx (1)

53-58: aria-live ์†์„ฑ์ด ์ค‘๋ณต์ž…๋‹ˆ๋‹ค.

role="log"๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ aria-live="polite"๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ๋ช…์‹œ์ ์œผ๋กœ aria-live="polite"๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์—ฌ ์ค‘๋ณต ์†์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

      <main 
        role="log"
        aria-label="์ฑ„ํŒ… ๋‚ด์šฉ"
-       aria-live="polite"
        className={cn(mainStyle())}
      >
src/pages/loading/index.tsx (1)

7-12: aria-live ์†์„ฑ์ด ์ค‘๋ณต์ž…๋‹ˆ๋‹ค.

role="status"๋Š” ์ด๋ฏธ ์•”๋ฌต์ ์œผ๋กœ aria-live="polite"๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ diff๋ฅผ ์ ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    <div 
      className='flex flex-col items-center justify-between h-[100vh] bg-white'
      role='status'
-     aria-live='polite'
      aria-label='ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘์ž…๋‹ˆ๋‹ค'  
    >
src/shared/icons/components/icon.tsx (1)

108-110: aria-pressed ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

aria-pressed๋Š” ํ† ๊ธ€ ๋ฒ„ํŠผ(on/off ์ƒํƒœ)์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์•„์ด์ฝ˜์ด ํ† ๊ธ€์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, pressed prop์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์™€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ€์ž… ์ œ์•ฝ์ด๋‚˜ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

interface IconProps extends React.SVGProps<SVGSVGElement> {
  name: IconName;
+ /** Makes icon keyboard-accessible as a button. Use with onClick handler. */
  isInteractive?: boolean;
+ /** For toggle buttons only. Indicates pressed state (true/false/undefined). */
  pressed?: boolean;
  size?: number | string;
  // ... rest of props
}
src/pages/main/components/board/Boardgame.tsx (1)

24-31: alt=""์™€ aria-hidden="true"๊ฐ€ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค.

์žฅ์‹์šฉ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ alt=""๋งŒ์œผ๋กœ๋„ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. aria-hidden="true"๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ค‘๋ณต์ด์ง€๋งŒ ํ•ด๋กญ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค:

      <Image
        src="/assets/background_.svg"
        alt=""
        width={402}
        height={755}
        className="w-full h-full object-cover"
        priority
-       aria-hidden="true"   
      />
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 526cfdf and 1207dca.

๐Ÿ“’ Files selected for processing (29)
  • src/pages/auth/index.tsx (1 hunks)
  • src/pages/chatbot/components/ChattingBubble.tsx (1 hunks)
  • src/pages/chatbot/components/ChattingInput.tsx (1 hunks)
  • src/pages/chatbot/index.tsx (1 hunks)
  • src/pages/events/[id].tsx (3 hunks)
  • src/pages/events/components/DateTag.tsx (1 hunks)
  • src/pages/events/index.tsx (2 hunks)
  • src/pages/loading/index.tsx (2 hunks)
  • src/pages/main/Board.tsx (1 hunks)
  • src/pages/main/HiddenReward.tsx (1 hunks)
  • src/pages/main/Node.tsx (3 hunks)
  • src/pages/main/PostCard.tsx (2 hunks)
  • src/pages/main/components/board/Boardgame.tsx (1 hunks)
  • src/pages/main/components/stampBoard/Progress.tsx (1 hunks)
  • src/pages/main/components/stampBoard/Stamp.tsx (1 hunks)
  • src/pages/main/components/video/VideoPlayer.tsx (0 hunks)
  • src/pages/main/index.tsx (2 hunks)
  • src/pages/map/components/CourseSelectSection.tsx (1 hunks)
  • src/pages/map/result/Map.tsx (1 hunks)
  • src/pages/map/result/components/ResultMap.tsx (0 hunks)
  • src/pages/map/result/components/TagGroup.tsx (1 hunks)
  • src/pages/mypage/components/ProfilePhoto.tsx (1 hunks)
  • src/pages/mypage/events/[id].tsx (1 hunks)
  • src/pages/mypage/index.tsx (2 hunks)
  • src/pages/mypage/postcard/[id].tsx (1 hunks)
  • src/shared/components/container/EventCard.tsx (2 hunks)
  • src/shared/components/flipCard/FlipCard.tsx (1 hunks)
  • src/shared/components/tab/BottomNav.tsx (1 hunks)
  • src/shared/icons/components/icon.tsx (3 hunks)
๐Ÿ’ค Files with no reviewable changes (2)
  • src/pages/map/result/components/ResultMap.tsx
  • src/pages/main/components/video/VideoPlayer.tsx
๐Ÿงฐ Additional context used
๐Ÿง  Learnings (1)
๐Ÿ“š Learning: 2025-10-31T17:34:04.352Z
Learnt from: jjangminii
Repo: geulDa/FE PR: 64
File: src/pages/map/result/components/ResultMap.tsx:3-3
Timestamp: 2025-10-31T17:34:04.352Z
Learning: The geulDa/FE project uses Next.js Pages Router (not App Router), so components should import useRouter from 'next/router' and should not use the 'use client' directive.

Applied to files:

  • src/pages/map/result/Map.tsx
๐Ÿงฌ Code graph analysis (8)
src/pages/main/PostCard.tsx (2)
src/shared/icons/components/icon.tsx (1)
  • Icon (57-117)
src/shared/utils/postcardActions.ts (1)
  • handleShare (2-12)
src/pages/map/result/components/TagGroup.tsx (1)
src/shared/components/tag/Tag.tsx (2)
  • Props (27-38)
  • Props (6-12)
src/pages/mypage/index.tsx (1)
src/pages/mypage/components/ProfilePhoto.tsx (1)
  • ProfilePhoto (11-35)
src/pages/map/result/Map.tsx (1)
src/pages/map/result/components/FullMap.tsx (1)
  • FullMap (7-19)
src/pages/chatbot/components/ChattingBubble.tsx (1)
src/shared/lib/utils.ts (1)
  • cn (71-73)
src/pages/chatbot/index.tsx (2)
src/shared/lib/utils.ts (1)
  • cn (71-73)
src/pages/chatbot/components/ChattingBubble.tsx (1)
  • Chatting (32-43)
src/pages/events/components/DateTag.tsx (1)
src/shared/lib/utils.ts (1)
  • cn (71-73)
src/pages/events/[id].tsx (2)
src/shared/lib/utils.ts (1)
  • cn (71-73)
src/pages/events/components/DateTag.tsx (1)
  • DateTag (24-45)
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build-and-deploy
๐Ÿ”‡ Additional comments (26)
src/shared/components/tab/BottomNav.tsx (1)

34-34: โœ“ aria-label ์ถ”๊ฐ€ ์Šน์ธ

<nav> ์š”์†Œ์— ํ•œ๊ตญ์–ด aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด aria-current ์†์„ฑ(45๋ฒˆ ์ค„)๊ณผ ํ•จ๊ป˜ WAI-ARIA ํ‘œ์ค€์— ๋งž๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

src/pages/main/components/stampBoard/Progress.tsx (1)

27-28: ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Radix Progress๋Š” role="progressbar"์™€ aria-valuemin, aria-valuemax, aria-valuenow๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•œ aria-label๊ณผ aria-valuetext๋Š” ๊ธฐ๋ณธ ARIA ์†์„ฑ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ ‘๊ทผ์„ฑ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์  ๊ฐœ์„  ์ œ์•ˆ:

aria-label="์ง„ํ–‰๋ฅ "์„ aria-label="์Šคํƒฌํ”„ ์ง„ํ–‰๋ฅ "๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๊ตฌ์ฒด์ ์ธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src/pages/map/result/components/TagGroup.tsx (1)

32-36: aria-label ํ…์ŠคํŠธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํƒœ์™€ ์ˆ˜ํ–‰ํ•  ์•ก์…˜์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ํ•œ๊ตญ์–ด aria-label์ด ์ž˜ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : aria-label์ด ์„ค์ •๋˜๋ฉด ์‹œ๊ฐ์  ๋ ˆ์ด๋ธ”(label prop)์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฏ€๋กœ, ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋Š” ๋” ์ž์„ธํ•œ ์„ค๋ช…์„ ๋“ฃ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฒˆ ๊ฒฝ์šฐ์— ์˜๋„๋œ ๋™์ž‘์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

src/pages/events/[id].tsx (1)

59-60: ์ด๋ฏธ์ง€ placeholder์— ๋Œ€ํ•œ ์šฐ์ˆ˜ํ•œ ์ ‘๊ทผ์„ฑ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ role="img"์™€ ์„ค๋ช…์ ์ธ aria-label์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ WCAG ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ž˜ ๋”ฐ๋ฅด๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

src/pages/events/index.tsx (2)

57-80: ์ด๋ฒคํŠธ ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.

<section>์— aria-label="์ด๋ฒคํŠธ ๋ชฉ๋ก"์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. semantic HTML๊ณผ ARIA ์†์„ฑ์˜ ์กฐํ•ฉ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.


82-96: ๋™์  ์ฝ˜ํ…์ธ  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์šฐ์ˆ˜ํ•œ ์ ‘๊ทผ์„ฑ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

empty state์— role="status"์™€ aria-live="polite"๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‚ ์งœ ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์ด ์ „๋‹ฌ๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” WCAG 2.1์˜ ๋™์  ์ฝ˜ํ…์ธ  ์—…๋ฐ์ดํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ž˜ ๋”ฐ๋ฅด๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

src/pages/mypage/components/ProfilePhoto.tsx (1)

27-27: ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์ด ์ž˜ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์— ๋ช…ํ™•ํ•œ ๋Œ€์ฒด ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€์˜ ๋ชฉ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

src/pages/chatbot/components/ChattingInput.tsx (2)

44-44: ์ž…๋ ฅ ํ•„๋“œ์— ์ ์ ˆํ•œ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ”์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

placeholder๋งŒ์œผ๋กœ๋Š” ๋ถˆ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


52-52: ์•„์ด์ฝ˜ ๋ฒ„ํŠผ์— ์ ์ ˆํ•œ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ”์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

ํ…์ŠคํŠธ๊ฐ€ ์—†๋Š” ์•„์ด์ฝ˜ ๋ฒ„ํŠผ์— aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฒ„ํŠผ์˜ ๊ธฐ๋Šฅ์„ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

src/pages/auth/index.tsx (1)

22-23: ์žฅ์‹์šฉ SVG์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

aria-hidden="true"์™€ focusable="false"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์‹ ๋ชฉ์ ์˜ SVG๋ฅผ ๋ณด์กฐ ๊ธฐ์ˆ ์—์„œ ์ ์ ˆํžˆ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” WAI-ARIA ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ž˜ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

src/pages/mypage/index.tsx (1)

22-22: ์„น์…˜๋ณ„ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ”์ด ์ž˜ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

๊ฐ ์„น์…˜์— ๋ช…ํ™•ํ•œ aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 28-28, 51-51

src/pages/main/index.tsx (1)

26-27: ์ ์ ˆํ•œ ์žฅ์‹ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€๋ฅผ alt=""์™€ aria-hidden="true"๋กœ ๋งˆํฌ์—…ํ•œ ๊ฒƒ์€ ์žฅ์‹ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

src/pages/main/Board.tsx (1)

11-15: ์ ์ ˆํ•œ ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ์ž…๋‹ˆ๋‹ค.

<main> ์š”์†Œ์— role="main"๊ณผ aria-label์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋งจํ‹ฑ HTML ์š”์†Œ์—๋Š” ์•”์‹œ์  ์—ญํ• ์ด ์žˆ์œผ๋ฏ€๋กœ role="main"์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ค‘๋ณต์ด์ง€๋งŒ, ์ผ๋ถ€ ์˜ค๋ž˜๋œ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋กญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. aria-label์€ ํŽ˜์ด์ง€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

src/pages/main/PostCard.tsx (2)

10-11: ์ ์ ˆํ•œ ๋žœ๋“œ๋งˆํฌ ์—ญํ•  ์ง€์ •์ž…๋‹ˆ๋‹ค.

๋ฃจํŠธ ์ปจํ…Œ์ด๋„ˆ์— role="main"๊ณผ aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.


32-46: ๋ฒ„ํŠผ ์ ‘๊ทผ์„ฑ์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฒ„ํŠผ์— ๋ช…ํ™•ํ•œ aria-label์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„์ด์ฝ˜์„ aria-hidden="true"๋กœ ํ‘œ์‹œํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์žฅ์‹์  ์š”์†Œ๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ ‘๊ทผ์„ฑ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋ถ€ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

src/shared/components/flipCard/FlipCard.tsx (1)

22-26: ํ›Œ๋ฅญํ•œ ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

role="button", tabIndex={0}, ๋™์  aria-label, aria-pressed๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์™„์ „ํ•œ ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ† ๊ธ€ ๋ฒ„ํŠผ์œผ๋กœ์„œ ์ ์ ˆํ•œ ์˜๋ฏธ๋ก ์  ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

src/pages/chatbot/components/ChattingBubble.tsx (1)

35-40: ๋ฉ”์‹œ์ง€ ์ ‘๊ทผ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ฒ„๋ธ”์— aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€์˜ ๋ฐœ์‹ ์ž๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์Šคํƒ€์ผ๋ง์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ ‘๊ทผ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

src/pages/main/Node.tsx (2)

20-24: ํŽ˜์ด์ง€ ๊ตฌ์กฐ๊ฐ€ ์ ‘๊ทผ์„ฑ ๋ฉด์—์„œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

<main> ์š”์†Œ์— role="main"๊ณผ ๋™์  aria-label์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์ฝ˜ํ…์ธ  ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.


37-60: ์Šคํƒฌํ”„ ๋ฒ„ํŠผ์˜ ์ ‘๊ทผ์„ฑ์ด ์ž˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋Š” aria-label๊ณผ ์žฅ์‹์  ์•„์ด์ฝ˜์— ๋Œ€ํ•œ aria-hidden="true" ์„ค์ •์œผ๋กœ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์˜ ๋ชฉ์ ๊ณผ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

src/shared/components/container/EventCard.tsx (1)

131-147: ๋Œ€ํ˜• ์นด๋“œ์˜ ์ ‘๊ทผ์„ฑ ๊ตฌํ˜„์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜ํŠธ ์•„์ด์ฝ˜์— isInteractive, pressed, aria-label ์†์„ฑ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ๊ณผ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ง€์›์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ ‘๊ทผ์„ฑ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

src/pages/chatbot/index.tsx (2)

62-65: LGTM!

์žฅ์‹์šฉ ์š”์†Œ์— aria-hidden="true"๋ฅผ ์ ์šฉํ•œ ๊ฒƒ์€ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์—์„œ ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ˆจ๊ธฐ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.


86-86: LGTM!

์Šคํฌ๋กค ์•ต์ปค ์š”์†Œ๋ฅผ aria-hidden="true"๋กœ ํ‘œ์‹œํ•œ ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.

src/pages/loading/index.tsx (1)

13-16: LGTM!

์žฅ์‹์šฉ SVG์™€ Lottie ์• ๋‹ˆ๋ฉ”์ด์…˜์— aria-hidden="true"๋ฅผ ์ ์šฉํ•œ ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค.

Also applies to: 39-39

src/shared/icons/components/icon.tsx (1)

42-45: LGTM!

isInteractive์™€ pressed prop ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ํƒ€์ž… ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 57-60

src/pages/main/components/board/Boardgame.tsx (2)

9-15: LGTM!

๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ handleCellClick์œผ๋กœ ์ค‘์•™ํ™”ํ•œ ๊ฒƒ์€ ์ข‹์€ ๋ฆฌํŒฉํ† ๋ง์ž…๋‹ˆ๋‹ค. TODO ์ฃผ์„์ด ์žˆ์œผ๋‹ˆ ๋กœ๊ทธ์ธ ์ฒดํฌ ๊ตฌํ˜„์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.


48-71: LGTM!

๋น„ํ™œ์„ฑ ์…€์„ aria-hidden์œผ๋กœ ์ˆจ๊ธฐ๊ณ , ํ™œ์„ฑ ์…€์— role="button", ํ‚ค๋ณด๋“œ ํ•ธ๋“ค๋Ÿฌ(Enter/Space), ๊ทธ๋ฆฌ๊ณ  ์„ค๋ช…์ ์ธ aria-label์„ ์ œ๊ณตํ•œ ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ์ ‘๊ทผ์„ฑ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

Comment on lines 48 to 52
{/* ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ โ€œ๋‚ ์งœ ์„ ํƒโ€์œผ๋กœ ์ฝํžˆ๋„๋ก ์ถ”๊ฐ€ */}
<label htmlFor="event-date" className="sr-only">
ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ
</label>
<DatePicker value={date} onChange={setDate} />
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿ› ๏ธ Refactor suggestion | ๐ŸŸ  Major

๐Ÿงฉ Analysis chain

label์˜ htmlFor ์†์„ฑ์ด DatePicker์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

htmlFor="event-date"๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, DatePicker ์ปดํฌ๋„ŒํŠธ์— ํ•ด๋‹น id๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DatePicker๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ id="event-date"๋ฅผ ๊ฐ€์ง„ input์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด label๊ณผ input์˜ ์—ฐ๊ฒฐ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ์ ‘๊ทผ์„ฑ์ด ์†์ƒ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋กœ DatePicker ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌํ˜„์„ ํ™•์ธํ•˜์„ธ์š”:

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

Option 1: DatePicker์— id prop ์ „๋‹ฌ

-          <label htmlFor="event-date" className="sr-only">
+          <label htmlFor="event-date-picker" className="sr-only">
            ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ
          </label>
-          <DatePicker value={date} onChange={setDate} />
+          <DatePicker id="event-date-picker" value={date} onChange={setDate} />

Option 2: htmlFor ์ œ๊ฑฐํ•˜๊ณ  aria-label ์‚ฌ์šฉ

-          <label htmlFor="event-date" className="sr-only">
-            ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ
-          </label>
-          <DatePicker value={date} onChange={setDate} />
+          <div aria-label="ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ">
+            <DatePicker value={date} onChange={setDate} />
+          </div>

๐Ÿ Script executed:

#!/bin/bash
# Description: DatePicker ์ปดํฌ๋„ŒํŠธ๊ฐ€ id prop์„ ๋ฐ›๋Š”์ง€ ํ™•์ธ

# DatePicker ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ์ฐพ๊ธฐ
ast-grep --pattern $'export default function DatePicker($$$) {
  $$$
}'

# ๋˜๋Š” ํŒŒ์ผ ์ฐพ๊ธฐ ๋ฐ ๋‚ด์šฉ ํ™•์ธ
fd DatePicker.tsx --exec cat {}

Length of output: 2620


DatePicker๊ฐ€ ํ‘œ์ค€ input์ด ์•„๋‹ˆ๋ฏ€๋กœ label์˜ htmlFor ์†์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DatePicker๋Š” Button ๊ธฐ๋ฐ˜์˜ Popover ์ปดํฌ๋„ŒํŠธ๋กœ, id prop์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ htmlFor="event-date"๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์—ฐ๊ฒฐํ•  input์ด ์—†์–ด label์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

DatePicker ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ aria-label prop์„ ์ง€์›ํ•˜๋„๋ก ๋ณ€๊ฒฝ:

interface DatePickerProps {
  value?: Date;
  onChange?: (date: Date) => void;
  defaultValue?: Date;
  className?: string;
+ aria-label?: string;
}
export function DatePicker({
  value,
  onChange,
  defaultValue,
  className,
+ 'aria-label': ariaLabel,
  ...calendarProps
}: DatePickerProps) {
  // ...
  return (
    <div className={cn('flex flex-col gap-3', className)}>
      <Popover open={open} onOpenChange={setOpen}>
        <PopoverTrigger asChild>
-          <Button className='w-[16rem] h-[4rem] justify-between rounded-[500px] text-label-lg text-pink-300 bg-pink-50 border border-pink-100'>
+          <Button aria-label={ariaLabel} className='w-[16rem] h-[4rem] justify-between rounded-[500px] text-label-lg text-pink-300 bg-pink-50 border border-pink-100'>

๊ทธ ํ›„ ์‚ฌ์šฉ ์‹œ:

-          <label htmlFor="event-date" className="sr-only">
-            ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ
-          </label>
-          <DatePicker value={date} onChange={setDate} />
+          <DatePicker aria-label="ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ" value={date} onChange={setDate} />

Committable suggestion skipped: line range outside the PR's diff.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

๐Ÿงน Nitpick comments (3)
src/pages/map/result/components/TagGroup.tsx (1)

31-36: aria-label ๊ตฌํ˜„์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ, aria-pressed๋Š” ์ œ๊ฑฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ aria-pressed ๋กœ์ง์„ ์ˆ˜์ •ํ•ด์ฃผ์‹  ์  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ผ ๋ทฐ ์ „ํ™˜ ๋ฒ„ํŠผ์—์„œ aria-pressed ์‚ฌ์šฉ์€ ์—ฌ์ „ํžˆ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • aria-pressed๋Š” ์ฃผ๋กœ ์ง€์†์ ์ธ on/off ๊ธฐ๋Šฅ(์˜ˆ: ํ…์ŠคํŠธ ์—๋””ํ„ฐ์˜ ๊ตต๊ฒŒ ๋ฒ„ํŠผ, ์•Œ๋ฆผ ํ† ๊ธ€)์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ทฐ ์ „ํ™˜ ๋ฒ„ํŠผ, ํŠนํžˆ "๋‹ค์Œ ์•ก์…˜"์„ ํ‘œ์‹œํ•˜๋Š” ๋‹จ์ผ ๋ฒ„ํŠผ์˜ ๊ฒฝ์šฐ, pressed ์ƒํƒœ๊ฐ€ "ํ˜„์žฌ ํ™œ์„ฑ ๋ทฐ"๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ "๋ฒ„ํŠผ์ด ์ œ์–ดํ•˜๋Š” ๊ธฐ๋Šฅ"์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ aria-label์€ ์ด๋ฏธ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ํ˜„์žฌ ์ƒํƒœ("ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค")
  • ์ „ํ™˜ ์•ก์…˜("์ง€๋„๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š”")
  • ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ ์ œ๊ณต

๋‹ค์Œ๊ณผ ๊ฐ™์ด aria-pressed๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

       <Tag
         label={viewMode === 'list' ? '์ง€๋„๋กœ ๋ณด๊ธฐ' : '๋ฆฌ์ŠคํŠธ๋กœ ๋ณด๊ธฐ'}
         icon={viewMode === 'list' ? 'MapPin_' : 'ListButton'}
         variant="toggle"
         onClick={onToggleView}
-        aria-pressed={viewMode === 'list'}
         aria-label={
           viewMode === 'list'
             ? 'ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค. ์ง€๋„๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š”.'
             : 'ํ˜„์žฌ ์ง€๋„ ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜์„ธ์š”.'
         }
       />

์ฐธ๊ณ : WAI-ARIA Authoring Practices์—์„œ ๋ทฐ ์ „ํ™˜์˜ ๊ฒฝ์šฐ ๋ช…ํ™•ํ•œ aria-label๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

src/pages/map/components/CourseSelectSection.tsx (1)

44-51: ์ด์ „ ๋ฆฌ๋ทฐ์—์„œ ์ง€์ ๋œ aria-label ์ค‘๋ณต ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

aria-label ์†์„ฑ์ด ์ œ๊ฑฐ๋˜์–ด CommonButton์˜ ๋„ค์ดํ‹ฐ๋ธŒ ํ…์ŠคํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. aria-pressed ์†์„ฑ๋„ ์ ์ ˆํžˆ ์ ์šฉ๋˜์–ด ํ† ๊ธ€ ๋ฒ„ํŠผ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์„ ํƒ์  ๊ฐœ์„  ์‚ฌํ•ญ:
์˜๋ฏธ๋ก ์  HTML์„ ์œ„ํ•ด div[role="listitem"] ๋Œ€์‹  ๋„ค์ดํ‹ฐ๋ธŒ <li> ์š”์†Œ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”. ARIA ์—ญํ• ๋ณด๋‹ค ์‹œ๋งจํ‹ฑ HTML์ด ์šฐ์„ ์‹œ๋˜๋Š” ๊ฒƒ์ด ์›น ํ‘œ์ค€ ๊ถŒ์žฅ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

-          {Array.isArray(options) &&
-            options.map(({ id, label }) => (
-              <div role="listitem" key={id}>
+          {Array.isArray(options) &&
+            options.map(({ id, label }) => (
+              <li key={id}>
                <CommonButton
                  label={label}
                  aria-pressed={selected === id}
                  variant={selected === id ? 'active' : 'default'}
                  onClick={() => onSelect(selected === id ? null : id)}
                />
-              </div>
+              </li>
          ))}

๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ๋ฅผ <ul>๋กœ ๋ณ€๊ฒฝ:

-        <div
-          className="flex justify-center gap-[0.8rem] min-w-max"
-          style={{ WebkitOverflowScrolling: 'touch' }}
-          role="list"
-        >
+        <ul
+          className="flex justify-center gap-[0.8rem] min-w-max list-none"
+          style={{ WebkitOverflowScrolling: 'touch' }}
+        >
src/pages/events/index.tsx (1)

49-52: ์ค‘๋ณต๋œ ์ ‘๊ทผ์„ฑ ๋ ˆ์ด๋ธ”์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

<label htmlFor="event-date">์™€ DatePicker์˜ ariaLabel ์†์„ฑ์ด ๋ชจ๋‘ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. DatePicker๋Š” ๋„ค์ดํ‹ฐ๋ธŒ input์ด ์•„๋‹Œ Button ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ์ด๋ฏ€๋กœ htmlFor๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ariaLabel๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋ฏ€๋กœ <label> ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

-          {/* ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ "๋‚ ์งœ ์„ ํƒ"์œผ๋กœ ์ฝํžˆ๋„๋ก ์ถ”๊ฐ€ */}
-          <label htmlFor="event-date" className="sr-only">
-            ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ
-          </label>
           <DatePicker ariaLabel="ํ–‰์‚ฌ ๋‚ ์งœ ์„ ํƒ" value={date} onChange={setDate} />
๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 1207dca and a6c4179.

๐Ÿ“’ Files selected for processing (11)
  • src/pages/chatbot/index.tsx (2 hunks)
  • src/pages/events/components/DateTag.tsx (1 hunks)
  • src/pages/events/index.tsx (2 hunks)
  • src/pages/loading/index.tsx (2 hunks)
  • src/pages/main/components/board/Boardgame.tsx (1 hunks)
  • src/pages/main/components/stampBoard/Stamp.tsx (2 hunks)
  • src/pages/map/components/CourseSelectSection.tsx (1 hunks)
  • src/pages/map/result/components/TagGroup.tsx (1 hunks)
  • src/shared/components/datePicker/DatePicker.tsx (2 hunks)
  • src/shared/components/flipCard/FlipCard.tsx (1 hunks)
  • src/shared/icons/components/icon.tsx (5 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (5)
  • src/pages/chatbot/index.tsx
  • src/pages/main/components/stampBoard/Stamp.tsx
  • src/pages/events/components/DateTag.tsx
  • src/shared/components/flipCard/FlipCard.tsx
  • src/pages/main/components/board/Boardgame.tsx
๐Ÿงฐ Additional context used
๐Ÿงฌ Code graph analysis (1)
src/pages/events/index.tsx (1)
src/shared/components/datePicker/DatePicker.tsx (1)
  • DatePicker (17-92)
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build-and-deploy
๐Ÿ”‡ Additional comments (6)
src/pages/loading/index.tsx (2)

7-12: ์ด์ „ ๋ฆฌ๋ทฐ ์ง€์ ์‚ฌํ•ญ์ด ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

role="status"์™€ aria-live="polite" ์ถ”๊ฐ€๋กœ aria-label์ด ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“  ํ›Œ๋ฅญํ•œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค.


13-16: ์žฅ์‹์šฉ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

SVG ๋ฐฐ๊ฒฝ๊ณผ Lottie ์• ๋‹ˆ๋ฉ”์ด์…˜์— aria-hidden="true"๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์žฅ์‹์šฉ ์š”์†Œ๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜๋ฏธ ์žˆ๋Š” ํ…์ŠคํŠธ ์ •๋ณด๋Š” aria-label์„ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋ฏ€๋กœ ์ ์ ˆํ•œ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

Also applies to: 36-36

src/shared/icons/components/icon.tsx (1)

45-46: ์ด์ „ ๋ฆฌ๋ทฐ์˜ ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ์ด์Šˆ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

isInteractive ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • Enter์™€ Space ํ‚ค๋กœ ์•„์ด์ฝ˜์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • Space ํ‚ค์˜ preventDefault()๋กœ ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • role="button", tabIndex={0}, aria-pressed ์†์„ฑ์ด ์กฐ๊ฑด๋ถ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
  • WAI-ARIA ๋ฒ„ํŠผ ํŒจํ„ด์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ œ ๋งˆ์šฐ์Šค ์‚ฌ์šฉ์ž์™€ ๋™์ผํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Also applies to: 60-61, 79-85, 119-124

src/shared/components/datePicker/DatePicker.tsx (1)

14-14: DatePicker์— ariaLabel prop ์ถ”๊ฐ€๋กœ ์ ‘๊ทผ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ ์งœ ์„ ํƒ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด๋ธ”์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ด ๊น”๋”ํ•˜๊ณ  ์„ ํƒ์  prop์œผ๋กœ ๊ธฐ์กด ์‚ฌ์šฉ์ฒ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Also applies to: 22-22, 66-68

src/pages/events/index.tsx (2)

57-63: ์ด๋ฒคํŠธ ๋ชฉ๋ก ์„น์…˜์— aria-label ์ถ”๊ฐ€๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

<section aria-label="์ด๋ฒคํŠธ ๋ชฉ๋ก">์œผ๋กœ ์„น์…˜์˜ ๋ชฉ์ ์ด ๋ช…ํ™•ํ•ด์ ธ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์˜ ํƒ์ƒ‰์ด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.


82-86: ๋นˆ ์ƒํƒœ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค.

role="status"์™€ aria-live="polite"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํžˆ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋™์  ์ฝ˜ํ…์ธ  ์—…๋ฐ์ดํŠธ ์‹œ ๋น„์นจ์ž…์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

๐Ÿงน Nitpick comments (1)
src/shared/components/datePicker/DatePicker.tsx (1)

48-54: ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง

์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ๋ช…์‹œ์ ์ธ if/else ๋ธ”๋ก์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋กœ์ง์˜ ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ๋™์ผํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between a6c4179 and 80874f9.

๐Ÿ“’ Files selected for processing (2)
  • src/shared/components/datePicker/DatePicker.tsx (3 hunks)
  • src/shared/icons/components/icon.tsx (4 hunks)
๐Ÿšง Files skipped from review as they are similar to previous changes (1)
  • src/shared/icons/components/icon.tsx
โฐ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build-and-deploy
๐Ÿ”‡ Additional comments (1)
src/shared/components/datePicker/DatePicker.tsx (1)

14-14: ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์„ ์œ„ํ•œ ariaLabel ์†์„ฑ ์ถ”๊ฐ€ ์Šน์ธ

ariaLabel ์˜ต์…˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  Button ์ปดํฌ๋„ŒํŠธ์— aria-label๋กœ ์ „๋‹ฌํ•œ ๊ฒƒ์€ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋ช…ํ™•ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ์†์„ฑ์ด๋ฏ€๋กœ ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ๋„ ์œ ์ง€๋˜๋ฉฐ, React๋Š” undefined ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์†์„ฑ์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Also applies to: 22-22, 70-72

Copy link
Copy Markdown
Contributor

@KongMezu KongMezu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aria ๊ตฌ์กฐ ์ž˜ ์ ์šฉํ•˜์‹ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๋งŽ์€ ์–‘์ด์—ˆ์„ ํ…๋ฐ.. ์ฝ”๋“œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค! ํฐ ๋ฆฌ๋ทฐ๋Š” ์—†์–ด์„œ ๋ฐ”๋กœ approve ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์—ฌ๊ธฐ ariaLabel?: string; ๋„ ๋„ฃ์–ด์„œ ์•„์ด์ฝ˜ ํ•˜๋‚˜ํ•˜๋‚˜๋„ ์Šคํฌ๋ฆฐ๋ฆฌ๋” ์ ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด ๋ถ€๋ถ„์€ ์ถ”๊ฐ€๋กœ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comment ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ refactor ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์—…, QA ๋ฐ˜์˜

Projects

None yet

2 participants