Skip to content

🎨 Palette: λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± κ°œμ„  - #481

Closed
seonghobae wants to merge 5 commits into
developfrom
palette-a11y-tooltip-focus-8476983301548473241
Closed

🎨 Palette: λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± κ°œμ„ #481
seonghobae wants to merge 5 commits into
developfrom
palette-a11y-tooltip-focus-8476983301548473241

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

πŸ’‘ 무엇을

  • index.html 내에 μžˆλŠ” λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ .meta-value-card 3κ°œμ— tabindex="0"κ³Ό role="note" 속성을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
  • styles.css에 .meta-value-card:focus-visible 클래슀λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀 μƒνƒœμΌ λ•Œ κΈ°μ‘΄ μΈν„°λž™ν‹°λΈŒ μš”μ†Œλ“€κ³Ό λ™μΌν•œ 포컀슀 링이 보이도둝 μŠ€νƒ€μΌμ„ μ μš©ν–ˆμŠ΅λ‹ˆλ‹€.

🎯 μ™œ

.meta-value-card μš”μ†Œλ“€μ€ ν”„λ‘œμ νŠΈ μš”μ•½ 정보(예: κ³„νšμ§„μ²™λ₯ , 싀적진척λ₯ )와 ν•¨κ»˜ title 속성을 톡해 ꡬ체적인 μ„€λͺ…을 툴팁으둜 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ div와 같은 λΉ„μƒν˜Έμž‘μš© μš”μ†ŒλŠ” 기본적으둜 포컀슀λ₯Ό 받을 수 μ—†κΈ° λ•Œλ¬Έμ— ν‚€λ³΄λ“œλ§ŒμœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ‚¬μš©μžμ™€ 슀크린 리더 μ‚¬μš©μžλŠ” 이 μœ μš©ν•œ 툴팁 정보에 μ „ν˜€ μ ‘κ·Όν•  수 μ—†λŠ” μ ‘κ·Όμ„± λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 포컀슀 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κ³  의미둠적인 역할을 λΆ€μ—¬ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“Έ λ³€κ²½ μ „/ν›„

  • λ³€κ²½ μ „: ν‚€λ³΄λ“œμ˜ Tab ν‚€λ‘œ 이동 μ‹œ, μš”μ•½ 정보 μΉ΄λ“œ(.meta-value-card)λ₯Ό κ±΄λ„ˆλ›°λ©°, 슀크린 리더도 ν•΄λ‹Ή μΉ΄λ“œμ˜ title 정보λ₯Ό 읽지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
  • λ³€κ²½ ν›„: Tab ν‚€λ‘œ 이동 μ‹œ μš”μ•½ 정보 μΉ΄λ“œκ°€ 포컀슀λ₯Ό λ°›μœΌλ©° νŒŒλž€μƒ‰ 링이 ν‘œμ‹œλ©λ‹ˆλ‹€. 슀크린 리더 μ‚¬μš©μžμ—κ²ŒλŠ” note μ—­ν• κ³Ό ν•¨κ»˜ μΉ΄λ“œμ˜ μ„€λͺ…(title)이 μ˜¬λ°”λ₯΄κ²Œ μ „λ‹¬λ©λ‹ˆλ‹€.

β™Ώ μ ‘κ·Όμ„±

λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ— 툴팁 정보가 담겨 μžˆμ„ λ•Œ μ‹œκ°μž₯애인(슀크린 리더 μ‚¬μš©μž) 및 μš΄λ™μž₯애인(ν‚€λ³΄λ“œ μ „μš© μ‚¬μš©μž)도 λ™μΌν•œ 정보λ₯Ό νšλ“ν•  수 μžˆλ„λ‘ ν‚€λ³΄λ“œ 초점 지원(tabindex="0"), 의미둠적 정보 제곡(role="note"), 그리고 κ°€μ‹œμ μΈ 초점 ν‘œμ‹œ(:focus-visible)λ₯Ό μΆ”κ°€ν•˜μ—¬ 접근성을 λŒ€ν­ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.


PR created automatically by Jules for task 8476983301548473241 started by @seonghobae

Summary by CodeRabbit

  • μ ‘κ·Όμ„± κ°œμ„ 
    • μš”μ•½ μΉ΄λ“œμ— ν‚€λ³΄λ“œ ν¬μ»€μŠ€μ™€ μ μ ˆν•œ ARIA 역할을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
    • μΉ΄λ“œ μ„€λͺ…을 더 κ΅¬μ²΄ν™”ν•˜κ³ , ν‚€λ³΄λ“œλ‘œ ν¬μ»€μŠ€ν•  λ•Œ μ‹œκ°μ  ν‘œμ‹œκ°€ λ‚˜νƒ€λ‚˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
    • λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± 지침을 λ³΄μ™„ν–ˆμŠ΅λ‹ˆλ‹€.

λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ `div`(`.meta-value-card`)에 마우슀 ν˜Έλ²„ μ‹œμ—λ§Œ λ³΄μ΄λŠ” 툴팁(`title` 속성)이 제곡되고 μžˆμ–΄ 슀크린 리더와 ν‚€λ³΄λ“œ μ‚¬μš©μžλŠ” ν•΄λ‹Ή 정보λ₯Ό 인지할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
이에 `tabindex="0"`κ³Ό `role="note"`λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀λ₯Ό 받을 수 있게 ν•˜κ³  슀크린 리더가 μ˜¬λ°”λ₯΄κ²Œ λ§₯락을 읽을 수 μžˆλ„λ‘ ν•˜μ˜€μœΌλ©°, `.meta-value-card:focus-visible`λ₯Ό μΆ”κ°€ν•˜μ—¬ ν‚€λ³΄λ“œ 탐색 μ‹œ μ‹œκ°μ μΈ 포컀슀 인디케이터λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
@google-labs-jules

Copy link
Copy Markdown

πŸ‘‹ 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 @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

πŸ“ Walkthrough

Walkthrough

μš”μ•½ μΉ΄λ“œκ°€ ν‚€λ³΄λ“œ 포컀슀λ₯Ό 받을 수 μžˆλ„λ‘ tabindex와 role="note"λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. μΉ΄λ“œμ˜ title μ„€λͺ…κ³Ό :focus-visible μŠ€νƒ€μΌμ„ κ°±μ‹ ν–ˆμŠ΅λ‹ˆλ‹€. λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± 지침도 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

Changes

μ ‘κ·Όμ„± κ°œμ„ 

Layer / File(s) Summary
ν‚€λ³΄λ“œ 포컀슀 및 툴팁 μ ‘κ·Όμ„±
.jules/palette.md, index.html, styles.css
μš”μ•½ μΉ΄λ“œμ— tabindex="0"κ³Ό role="note"λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. title μ„€λͺ…을 κΈ°κ°„ κ°€μ€‘μΉ˜ 기반 λ‚΄μš©μœΌλ‘œ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. .meta-value-card에 κΈ°μ‘΄ 포컀슀 아웃라인 μŠ€νƒ€μΌμ„ μ μš©ν–ˆμŠ΅λ‹ˆλ‹€. λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ— tabindex, ARIA μ—­ν• , :focus-visible μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜λ„λ‘ 지침을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

Estimated code review effort: 1 (맀우 간단) | ~3λΆ„

πŸš₯ Pre-merge checks | βœ… 5
βœ… Passed checks (5 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed 제λͺ©μ€ λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± κ°œμ„ μ΄λΌλŠ” PR의 μ£Όμš” λ³€κ²½ 사항을 μ •ν™•ν•˜κ³  κ°„κ²°ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€.
Docstring Coverage βœ… Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check βœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check βœ… Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch palette-a11y-tooltip-focus-8476983301548473241

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.

λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ `div`(`.meta-value-card`)에 마우슀 ν˜Έλ²„ μ‹œμ—λ§Œ λ³΄μ΄λŠ” 툴팁(`title` 속성)이 제곡되고 μžˆμ–΄ 슀크린 리더와 ν‚€λ³΄λ“œ μ‚¬μš©μžλŠ” ν•΄λ‹Ή 정보λ₯Ό 인지할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
이에 `tabindex="0"`κ³Ό `role="note"`λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀λ₯Ό 받을 수 있게 ν•˜κ³  슀크린 리더가 μ˜¬λ°”λ₯΄κ²Œ λ§₯락을 읽을 수 μžˆλ„λ‘ ν•˜μ˜€μœΌλ©°, `.meta-value-card:focus-visible`λ₯Ό μΆ”κ°€ν•˜μ—¬ ν‚€λ³΄λ“œ 탐색 μ‹œ μ‹œκ°μ μΈ 포컀슀 인디케이터λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 (2)
index.html (1)

31-42: πŸ“ Maintainability & Code Quality | πŸ”΅ Trivial | ⚑ Quick win

μΆ”κ°€λœ μ ‘κ·Όμ„± 속성을 E2E ν…ŒμŠ€νŠΈλ‘œ κ²€μ¦ν•˜μ„Έμš”.

tests/e2e/scopeweave.spec.js:1293-1335λŠ” μΉ΄λ“œμ˜ title만 κ²€μ¦ν•©λ‹ˆλ‹€. tabindex="0", role="note", μ‹€μ œ ν‚€λ³΄λ“œ 포컀슀 μƒνƒœλŠ” κ²€μ¦ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„Έ μΉ΄λ“œμ˜ 속성과 ν‚€λ³΄λ“œ 포컀슀λ₯Ό ν…ŒμŠ€νŠΈμ— μΆ”κ°€ν•˜μ„Έμš”.

πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@index.html` around lines 31 - 42, Update the E2E coverage around the existing
card assertions in scopeweave.spec.js to verify all three cards have
tabindex="0" and role="note", in addition to their titles. Add keyboard-focus
checks that move focus to each card and confirm it becomes the active element,
covering the total-days, planned-progress, and actual-progress cards.
.jules/palette.md (1)

118-120: πŸ“ Maintainability & Code Quality | πŸ”΅ Trivial | ⚑ Quick win

이 지침을 λͺ¨λ“  λΉ„μƒν˜Έμž‘μš© μš”μ†Œμ— κ°•μ œν•˜μ§€ λ§ˆμ„Έμš”.

tabindex="0"은 정적 μ½˜ν…μΈ μ—λ„ νƒ­ μ •λ₯˜μž₯을 μΆ”κ°€ν•©λ‹ˆλ‹€. role="note"λŠ” tooltip 역할이 μ•„λ‹™λ‹ˆλ‹€. 이 쑰합은 λΆˆν•„μš”ν•œ νƒ­ μ •λ₯˜μž₯을 λ§Œλ“€κ³  title의 μ œν•œμ„ ν•΄κ²°ν•˜μ§€ λͺ»ν•  수 μžˆμŠ΅λ‹ˆλ‹€. WAI-ARIAλŠ” noteλ₯Ό λΆ€κ°€ 정보에 μ‚¬μš©ν•˜κ³ , tooltip은 포컀슀 λŒ€μƒκ³Ό aria-describedbyλ₯Ό μ—°κ²°ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ •μ˜ν•©λ‹ˆλ‹€. (w3.org)

지침을 μ‘°κ±΄λΆ€λ‘œ λ³€κ²½ν•˜μ„Έμš”. ν‚€λ³΄λ“œ ν¬μ»€μŠ€κ°€ ν•„μš”ν•œ μš”μ†Œμ—λ§Œ tabindex="0"을 μ‚¬μš©ν•˜μ„Έμš”. μ„€λͺ…은 λͺ…μ‹œμ μΈ DOM μ½˜ν…μΈ μ™€ aria-describedby둜 μ œκ³΅ν•˜μ„Έμš”. μ‹€μ œ tooltip이 ν•„μš”ν•˜λ©΄ ν¬μ»€μŠ€μ™€ hoverλ₯Ό λͺ¨λ‘ μ²˜λ¦¬ν•˜λŠ” tooltip νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ„Έμš”.

As per coding guidelines, static hosting ν™˜κ²½μ—μ„œλŠ” λΈŒλΌμš°μ € κΈ°λ³Έ APIλ₯Ό μš°μ„ ν•˜κ³  λΆˆν•„μš”ν•œ λŸ°νƒ€μž„ λ™μž‘μ„ μΆ”κ°€ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.jules/palette.md around lines 118 - 120, Revise the β€œλΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± κ°œμ„ β€
guidance to be conditional rather than requiring tabindex="0" and role="note"
for every non-interactive element. Recommend tabindex="0" only when keyboard
focus is genuinely needed, use explicit DOM descriptions with aria-describedby,
and reserve tooltip patterns for cases supporting both focus and hover; avoid
implying unnecessary runtime behavior in static hosting environments.

Source: Coding guidelines

πŸ€– Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@index.html`:
- Around line 31-42: Replace the inaccessible title-only tooltips on all three
meta-value-card elements in index.html with explicit description elements
connected via aria-describedby, and implement showing and hiding those
descriptions on focus and mouse interaction while preserving the existing
meta-value-card:focus-visible styling. Update related E2E tests to verify
accessible descriptions and interactions. In .jules/palette.md lines 118-120,
apply tabindex="0" and role="note" only where the documented accessibility
behavior requires them; update the guidance to match the new pattern.

---

Nitpick comments:
In @.jules/palette.md:
- Around line 118-120: Revise the β€œλΉ„μƒν˜Έμž‘μš© μš”μ†Œμ˜ 툴팁 μ ‘κ·Όμ„± κ°œμ„ β€ guidance to be
conditional rather than requiring tabindex="0" and role="note" for every
non-interactive element. Recommend tabindex="0" only when keyboard focus is
genuinely needed, use explicit DOM descriptions with aria-describedby, and
reserve tooltip patterns for cases supporting both focus and hover; avoid
implying unnecessary runtime behavior in static hosting environments.

In `@index.html`:
- Around line 31-42: Update the E2E coverage around the existing card assertions
in scopeweave.spec.js to verify all three cards have tabindex="0" and
role="note", in addition to their titles. Add keyboard-focus checks that move
focus to each card and confirm it becomes the active element, covering the
total-days, planned-progress, and actual-progress cards.
πŸͺ„ Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
βš™οΈ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f1b8e466-259f-445a-8481-7fda20d9280b

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 74a5e99 and d56a12d.

πŸ“’ Files selected for processing (3)
  • .jules/palette.md
  • index.html
  • styles.css

Comment thread index.html
Comment on lines +31 to +42
<div class="meta-value-card" title="ν”„λ‘œμ νŠΈμ˜ μž‘μ—… κΈ°κ°„(일수) ν•©κ³„μž…λ‹ˆλ‹€." tabindex="0" role="note">
<span class="meta-label">μ „μ²΄μΌμˆ˜</span>
<strong data-testid="summary-total-days" id="summary-total-days">0일</strong>
</div>
</div>

<div class="meta-grid meta-grid-secondary">
<div class="meta-value-card accent-card plan-card" title="κΈ°κ°„(일수) κ°€μ€‘μΉ˜κ°€ 반영된 ν”„λ‘œμ νŠΈ 전체 κ³„νš μ§„μ²™λ₯ μž…λ‹ˆλ‹€.">
<div class="meta-value-card accent-card plan-card" title="κΈ°κ°„(일수) κ°€μ€‘μΉ˜κ°€ 반영된 ν”„λ‘œμ νŠΈ 전체 κ³„νš μ§„μ²™λ₯ μž…λ‹ˆλ‹€." tabindex="0" role="note">
<span class="meta-label">κ³„νšμ§„μ²™λ₯ (λˆ„μ )</span>
<strong data-testid="summary-planned-progress" id="summary-planned-progress">0.00%</strong>
</div>
<div class="meta-value-card accent-card actual-card" title="κΈ°κ°„(일수) κ°€μ€‘μΉ˜κ°€ 반영된 ν”„λ‘œμ νŠΈ 전체 싀적 μ§„μ²™λ₯ μž…λ‹ˆλ‹€.">
<div class="meta-value-card accent-card actual-card" title="κΈ°κ°„(일수) κ°€μ€‘μΉ˜κ°€ 반영된 ν”„λ‘œμ νŠΈ 전체 싀적 μ§„μ²™λ₯ μž…λ‹ˆλ‹€." tabindex="0" role="note">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | πŸ—οΈ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- index.html target and script order ---'
nl -ba index.html | sed -n '1,65p'
printf '%s\n' '--- palette learning ---'
nl -ba .jules/palette.md | sed -n '105,130p'
printf '%s\n' '--- related tooltip/focus/description patterns ---'
rg -n -i 'tooltip|aria-describedby|role="tooltip"|role="note"|focus-visible|tabindex="0"|meta-value-card|summary-total-days|summary-planned-progress' --glob '!node_modules/**' .

Repository: ContextualWisdomLab/scopeweave

Length of output: 2761


🌐 Web query:

W3C WAI ARIA APG tooltip role note title attribute keyboard focus aria-describedby tooltip guidance

πŸ’‘ Result:

To create an accessible tooltip, the W3C WAI ARIA Authoring Practices Guide (APG) provides specific guidance to ensure compatibility with screen readers and keyboard navigation [1][2]. Key requirements for an accessible tooltip include: Role and Association: Use role="tooltip" on the tooltip container element [1][3]. The triggering element must reference the tooltip container using the aria-describedby attribute [1][4]. Keyboard Focus: Tooltips do not receive focus themselves [1][3]. Focus remains on the triggering element while the tooltip is visible [1][5]. The tooltip must appear when the trigger receives focus and disappear when the trigger loses focus (onBlur) [1][6]. Dismissal: The Escape key should be implemented to dismiss the tooltip [1][3][7]. If triggered by hover, it should disappear on mouse-out [1][3]. To meet WCAG 1.4.13 requirements, tooltips must be dismissible without moving the pointer, and if triggered by hover, they should remain visible when the pointer moves from the trigger to the tooltip itself [3][7]. Avoid the title Attribute: You should avoid using the HTML title attribute for tooltips [8][5]. It is not reliably accessible, cannot be styled, is often not triggered by keyboard focus, and is frequently ignored by screen readers [3][8]. Implementation Note: The tooltip pattern is considered a work in progress by the WAI, and developers are encouraged to follow the latest APG recommendations for specific keyboard and focus management [1]. For content that is complex or interactive, consider using a different pattern, such as a popover or modal dialog, as tooltips are intended for short, non-interactive contextual information [1][3].

Citations:


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- index.html target ---'
awk '{printf "%5d %s\n", NR, $0}' index.html | sed -n '25,55p'

printf '%s\n' '--- focus styles ---'
awk '{printf "%5d %s\n", NR, $0}' styles.css | sed -n '110,180p;340,375p'

printf '%s\n' '--- tooltip-related test ---'
awk '{printf "%5d %s\n", NR, $0}' tests/e2e/scopeweave.spec.js | sed -n '1280,1325p'

printf '%s\n' '--- all title attributes and note roles ---'
rg -n 'title=|role="note"|aria-describedby|role="tooltip"' --glob '*.html' --glob '*.js' --glob '*.css' --glob '*.md' .

Repository: ContextualWisdomLab/scopeweave

Length of output: 7917


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- relevant architecture and learning guidance files ---'
git ls-files 'ARCHITECTURE.md' 'AGENTS.md' '.jules/*.md'
printf '%s\n' '--- palette file size and surrounding guidance ---'
wc -l .jules/palette.md
awk '{printf "%5d %s\n", NR, $0}' .jules/palette.md | sed -n '105,125p'

Repository: ContextualWisdomLab/scopeweave

Length of output: 2726


🏁 Script executed:

#!/bin/bash
set -eu

python3 - <<'PY'
from html.parser import HTMLParser
from pathlib import Path

class CardParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.cards = []
        self.in_card = False
        self.current = None

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        classes = set((attrs.get("class") or "").split())
        if tag == "div" and "meta-value-card" in classes:
            self.in_card = True
            self.current = {"attrs": attrs}
            self.cards.append(self.current)

    def handle_endtag(self, tag):
        if tag == "div" and self.in_card:
            self.in_card = False
            self.current = None

parser = CardParser()
parser.feed(Path("index.html").read_text())
print(f"meta-value-card count: {len(parser.cards)}")
for i, card in enumerate(parser.cards, 1):
    attrs = card["attrs"]
    print(i, {k: attrs.get(k) for k in ("title", "tabindex", "role", "aria-describedby", "id")})

palette = Path(".jules/palette.md").read_text()
print("palette forces tabindex=0:", '항상 tabindex="0"' in palette)
print("palette forces role=note:", 'role="note"' in palette)
print("focus-visible selector exists:",
      ".meta-value-card:focus-visible" in Path("styles.css").read_text())
PY

Repository: ContextualWisdomLab/scopeweave

Length of output: 643


title을 μ ‘κ·Ό κ°€λŠ₯ν•œ 툴팁으둜 μ‚¬μš©ν•˜μ§€ λ§ˆμ„Έμš”.

μ„Έ 개의 .meta-value-card λͺ¨λ‘ titleκ³Ό role="note"만 μ‚¬μš©ν•˜λ©° aria-describedby 연결이 μ—†μŠ΅λ‹ˆλ‹€. λͺ…μ‹œμ  μ„€λͺ… μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ , 포컀슀·마우슀 λ™μž‘κ³Ό μ„€λͺ… ν‘œμ‹œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”. κΈ°μ‘΄ .meta-value-card:focus-visible μŠ€νƒ€μΌμ€ μœ μ§€ν•˜μ„Έμš”. .jules/palette.md의 tabindex="0" 및 role="note" μ μš©λ„ ν•„μš”ν•œ 경우둜 μ œν•œν•˜μ„Έμš”. κ΄€λ ¨ E2E ν…ŒμŠ€νŠΈμ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ μ„€λͺ…κ³Ό λ™μž‘μ„ κ²€μ¦ν•˜μ„Έμš”.

πŸ“ Affects 2 files
  • index.html#L31-L42 (this comment)
  • .jules/palette.md#L118-L120
πŸ€– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@index.html` around lines 31 - 42, Replace the inaccessible title-only
tooltips on all three meta-value-card elements in index.html with explicit
description elements connected via aria-describedby, and implement showing and
hiding those descriptions on focus and mouse interaction while preserving the
existing meta-value-card:focus-visible styling. Update related E2E tests to
verify accessible descriptions and interactions. In .jules/palette.md lines
118-120, apply tabindex="0" and role="note" only where the documented
accessibility behavior requires them; update the guidance to match the new
pattern.

Source: Coding guidelines

λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ `div`(`.meta-value-card`)에 마우슀 ν˜Έλ²„ μ‹œμ—λ§Œ λ³΄μ΄λŠ” 툴팁(`title` 속성)이 제곡되고 μžˆμ–΄ 슀크린 리더와 ν‚€λ³΄λ“œ μ‚¬μš©μžλŠ” ν•΄λ‹Ή 정보λ₯Ό 인지할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
이에 `tabindex="0"`κ³Ό `role="note"`λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀λ₯Ό 받을 수 있게 ν•˜κ³  슀크린 리더가 μ˜¬λ°”λ₯΄κ²Œ λ§₯락을 읽을 수 μžˆλ„λ‘ ν•˜μ˜€μœΌλ©°, `.meta-value-card:focus-visible`λ₯Ό μΆ”κ°€ν•˜μ—¬ ν‚€λ³΄λ“œ 탐색 μ‹œ μ‹œκ°μ μΈ 포컀슀 인디케이터λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ `div`(`.meta-value-card`)에 마우슀 ν˜Έλ²„ μ‹œμ—λ§Œ λ³΄μ΄λŠ” 툴팁(`title` 속성)이 제곡되고 μžˆμ–΄ 슀크린 리더와 ν‚€λ³΄λ“œ μ‚¬μš©μžλŠ” ν•΄λ‹Ή 정보λ₯Ό 인지할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
이에 `tabindex="0"`κ³Ό `role="note"`λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀λ₯Ό 받을 수 있게 ν•˜κ³  슀크린 리더가 μ˜¬λ°”λ₯΄κ²Œ λ§₯락을 읽을 수 μžˆλ„λ‘ ν•˜μ˜€μœΌλ©°, `.meta-value-card:focus-visible`λ₯Ό μΆ”κ°€ν•˜μ—¬ ν‚€λ³΄λ“œ 탐색 μ‹œ μ‹œκ°μ μΈ 포컀슀 인디케이터λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λΉ„μƒν˜Έμž‘μš© μš”μ†ŒμΈ `div`(`.meta-value-card`)에 마우슀 ν˜Έλ²„ μ‹œμ—λ§Œ λ³΄μ΄λŠ” 툴팁(`title` 속성)이 제곡되고 μžˆμ–΄ 슀크린 리더와 ν‚€λ³΄λ“œ μ‚¬μš©μžλŠ” ν•΄λ‹Ή 정보λ₯Ό 인지할 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
이에 `tabindex="0"`κ³Ό `role="note"`λ₯Ό μΆ”κ°€ν•˜μ—¬ 포컀슀λ₯Ό 받을 수 있게 ν•˜κ³  슀크린 리더가 μ˜¬λ°”λ₯΄κ²Œ λ§₯락을 읽을 수 μžˆλ„λ‘ ν•˜μ˜€μœΌλ©°, `.meta-value-card:focus-visible`λ₯Ό μΆ”κ°€ν•˜μ—¬ ν‚€λ³΄λ“œ 탐색 μ‹œ μ‹œκ°μ μΈ 포컀슀 인디케이터λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

Copy link
Copy Markdown
Contributor Author

Closing this duplicate accessibility approach because adding static cards to the sequential tab order is not equivalent to making their information accessible.

tabindex="0" on every summary card creates extra keyboard stops, while role="note" does not make a browser title tooltip reliably available across assistive technologies. The PR has no browser/axe/screen-reader contract proving announced name, description, focus order, or touch behavior.

#445 and #485 propose the same pattern. A replacement should expose the explanatory text directly through visible or programmatically associated content without forcing every non-interactive metric into the tab sequence.

@google-labs-jules

Copy link
Copy Markdown

Closing this duplicate accessibility approach because adding static cards to the sequential tab order is not equivalent to making their information accessible.

tabindex="0" on every summary card creates extra keyboard stops, while role="note" does not make a browser title tooltip reliably available across assistive technologies. The PR has no browser/axe/screen-reader contract proving announced name, description, focus order, or touch behavior.

#445 and #485 propose the same pattern. A replacement should expose the explanatory text directly through visible or programmatically associated content without forcing every non-interactive metric into the tab sequence.

Understood. Acknowledging that this approach is being closed as obsolete because adding tabindex="0" to static cards creates unnecessary keyboard stops and role="note" with title is not a reliable accessibility pattern. I will stop work on this PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant