fix(workspace): explain practice-progress limits with accessible tooltips - #1226
seonghobae wants to merge 19 commits into
Conversation
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueNo actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough
Changes연습 진행 버튼 툴팁
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~5 minutes Change: Feature Merge Risk: ⚪ Minimal · up to No actionable regression remains from this tooltip migration. The change is ready to merge after normal checks. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
|
@cwl-noema-review Please review exact head |
요청하신 대로, |
|
@opencode-agent review exact head |
코드 리뷰 봇의 요청에 따라 |
… add UI Interaction Tests
|
Queued @cwl-noema-review for PR #1226 at head |
|
Queued @opencode-agent for PR #1226 at head |
Buyer-visible outcome
Practice Progress keeps the +/- controls keyboard-focusable at the 0% and 100% boundaries, preserves the action as each button's accessible name, explains the boundary as a separate description, and keeps all three pointer controls at a 44 CSS px target envelope while the visual slider track stays thin. Hover/focus users receive the same action plus boundary explanation through the shared Base UI tooltip instead of a native
title.This is a Workspace/UI accessibility slice only. It does not change practice-progress persistence, rehearsal decision logic, MIR, Active Player, or shared identity contracts.
Exact current identity
develop@314ddeae7b775a4957594b599358c8255617eb2e.palette-tooltips-3326814127791485331.d2cf8db5762c4aa583026aeb758b27a3722e67fb.PracticeProgress.tsx, focused test, EN locale, KO locale.08e96300a0058bd981b2e4c31cab9dee86df0e39, the current head is ahead by ordinary history but has zero file delta.Boundary explanation repair
The generated predecessor
1ea990539bb7823489fe6abea0c9177a780c67e8replaced nativetitlewith the shared tooltip but repeated only the action label. It also overstated the cause:aria-disableddoes not itself suppress pointer events or remove a control from accessibility APIs. The practical gap was that boundary-state users still were not told why the action was unavailable.A previously closed Jules PR, #1156, contained a valid semantic delta: localized 0% / 100% boundary reasons and regressions. Its approach replaced the button's accessible action name with the reason and kept native
title; this successor preserves the valid reason semantics without losing the control identity.9ae805542f41f628c7512b34aec65669f24566f4: each boundary button must keep its action name, omit nativetitle, and reference a persistent boundary explanation witharia-describedby.591461886d6ee76f72cc6128e08df1e8fd4eaa7f: stable per-instance description ids viauseId, action-preservingaria-label, persistent screen-reader reason, and boundary-aware tooltip copy.d345e93d6ad3fb8a788e375780fbc5a93b82edcc/ KO20e7dea77f6f6c45af0a3c10b244935ef7526b71: explicit 0% / 100% reasons.a627d0bc34570c1eeb1936266d1d78b58f34a575: boundary tooltip text remainsAction: reason; AT description contains the additional reason only.Target-size RED → repair
A later ordinary descendant improved only the slider pointer envelope from the original 12 px visual track to 32 px (
63b12f1...→1dbf9f8...). That is above WCAG 2.2 SC 2.5.8's 24×24 CSS px Level-AA minimum, but it left the +/- buttons at 32×32 and did not meet the stricter 44×44 target-size objective used for this buyer-facing touch control.e3547dcc14f9fb1146d6e49bfade2c156953d50c: require the decrease button, slider pointer envelope, and increase button to expose 44 CSS px class-level targets while preserving the 12 px visual track.08e96300a0058bd981b2e4c31cab9dee86df0e39: both buttons usesize-11; the slider pointer envelope usesh-11; the visible track remains centered ath-3; the invisible native range input fills the full 44 px envelope.Authority: WCAG 2.2 SC 2.5.8 requires at least 24×24 CSS px at Level AA and SC 2.5.5 defines 44×44 CSS px at Level AAA. https://www.w3.org/TR/WCAG22/#target-size-minimum and https://www.w3.org/TR/WCAG22/#target-size-enhanced
The target-size RED is source-level TDD evidence; no separately hosted failing run is claimed. Class/jsdom evidence is not promoted to browser geometry proof.
Intervening-delta repair — 2026-09-17
A later ordinary head
240d0c5bd954af9fa67f2ca02ee286102e93fa78again erased the validated boundary descriptions, EN/KO reason strings and 44 px target contract, while reintroducing the unrelatedservices/analysis-engine/tests/test_supply_chain_policy.pyformatter delta owned by #1176. The change was treated as an intervening delta to inspect and repair, not as a race.ec05189b5cc4d601dea627c4941492508f79dbec: restore the focused regression first, requiring persistent 0%/100% descriptions and 44 CSS px source targets against the still-regressed production component.fd48704a8af27abb9610e3e16be2ca424d2b7400: restoreuseId,aria-describedby, boundary-aware tooltip text,size-11buttons and theh-11slider interaction envelope while keeping the visual track ath-3.78440c57972ede54a9389597514c76a36be98fd3/ KOc600ed71866f92915e5d3b9a16c62a3360087fc9: restore localized minimum/maximum reasons.d2cf8db5762c4aa583026aeb758b27a3722e67fb: restoretest_supply_chain_policy.pyexactly to protecteddevelop's blob and release formatter ownership back to repair(ci): format consolidated supply-chain policy test #1176.The final tree is byte-equivalent to
08e96300...for the full repository diff (08e96300... → d2cf8db...: files = 0), while retaining the ordinary descendant history. Against protecteddevelop, the visible semantic delta is again exactly the 4 Workspace-owned files.Accessibility / interaction boundary
aria-disabledremains paired with click guards; it is not treated as behavioral disabling by itself.Verification gate
Every source movement invalidates predecessor hosted evidence. Exact
d2cf8db5762c4aa583026aeb758b27a3722e67fbmust obtain its own focused PracticeProgress tests plus applicable repository/central CI, build, security, SAST, SBOM, supply-chain, coverage and review evidence. No predecessor workflow result or approval transfers.Keep Draft until the unchanged exact head has all applicable gates terminal-success, zero valid unresolved findings, and qualifying independent non-author current-head approval. Browser evidence still needs keyboard focus, hover popup/dismissal/persistence, pointer/touch behavior, boundary click suppression, exact accessible-name/description inspection, 44 px effective target geometry, responsive/400% zoom and Narrator/VoiceOver checks on the mounted Workspace.
The protected central agent mention router remains review-dispatch only. Mention-only activity is not source repair or approval; do not repeat the same mention merely to manufacture progress.
Do not self-approve, force-push, destructively rebase, weaken protection, synthesize statuses, create no-op retry commits, or merge on predecessor evidence.