From 6a3194725343766645dc76823c32cfdb2dcc9d5f Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sat, 15 Aug 2026 21:17:08 +0000 Subject: [PATCH 01/14] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20[improvement]?= =?UTF-8?q?=20Fix=20radiogroup=20accessibility=20in=20GroupModal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ’ก What: Changed the custom color swatches in GroupModal to use `role="radio"` and `aria-checked` instead of `aria-pressed`. Updated the corresponding test queries. ๐ŸŽฏ Why: Elements inside a `role="radiogroup"` must use `role="radio"` to be properly understood by screen readers as a group of mutually exclusive options. Using generic buttons with `aria-pressed` inside a radiogroup creates mismatched structural semantics. โ™ฟ Accessibility: Improved screen reader navigation and state announcement for the business group color selection. ๐Ÿ“ธ Before/After: Visuals are unchanged; screen readers now announce "radio, checked" instead of "button, pressed". --- .jules/palette.md | 3 +++ frontend/src/components/modals/GroupModal.tsx | 3 ++- frontend/src/components/modals/ModalCoverage.test.tsx | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.jules/palette.md b/.jules/palette.md index bd0f73248..deac28b8a 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -57,3 +57,6 @@ ## 2026-07-30 - Add window.confirm for destructive actions **Learning:** Destructive actions like deleting groups and edge relationships previously occurred immediately without user confirmation. **Action:** Always wrap delete operations with window.confirm() dialogs and ensure corresponding tests successfully mock window.confirm. +## 2026-08-01 - [radiogroup Role Constraints] +**Learning:** `role="radiogroup"`๊ฐ€ ๋ถ€์—ฌ๋œ ๋ถ€๋ชจ ์š”์†Œ ๋‚ด์—์„œ ์ž์‹ ๋ฒ„ํŠผ๋“ค์ด ๋‹จ์ˆœํžˆ `aria-pressed`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ARIA ํŒจํ„ด์ด ์•„๋‹™๋‹ˆ๋‹ค. `radiogroup` ๋‚ด๋ถ€์˜ ์š”์†Œ๋“ค์€ ๋ฐ˜๋“œ์‹œ `role="radio"`๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ์„ ํƒ ์ƒํƒœ๋Š” `aria-pressed`๊ฐ€ ์•„๋‹Œ `aria-checked`๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝํž™๋‹ˆ๋‹ค. +**Action:** ์ปค์Šคํ…€ ๋ผ๋””์˜ค ๊ทธ๋ฃน ๋ทฐ(์ƒ‰์ƒ ์Šค์™€์น˜ ๋“ฑ)๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ์ž์‹ ์š”์†Œ๋“ค์— ๋ช…์‹œ์ ์œผ๋กœ `role="radio"` ๋ฐ `aria-checked` ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์‹œ์—๋„ "button"์ด ์•„๋‹Œ "radio" ์—ญํ• (role)๋กœ ์ฟผ๋ฆฌํ•˜๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. diff --git a/frontend/src/components/modals/GroupModal.tsx b/frontend/src/components/modals/GroupModal.tsx index bd96c21b1..e68be5c79 100644 --- a/frontend/src/components/modals/GroupModal.tsx +++ b/frontend/src/components/modals/GroupModal.tsx @@ -75,8 +75,9 @@ export function GroupModal({ {BUSINESS_GROUP_COLORS.map((color) => (