Skip to content

🎨 Palette: 악보 λ·°μ–΄ μ ‘κ·Όμ„± 및 툴팁 κ°œμ„  - #697

Closed
seonghobae wants to merge 4 commits into
developfrom
palette/score-viewer-tooltips-7377617624541599206
Closed

🎨 Palette: 악보 λ·°μ–΄ μ ‘κ·Όμ„± 및 툴팁 κ°œμ„ #697
seonghobae wants to merge 4 commits into
developfrom
palette/score-viewer-tooltips-7377617624541599206

Conversation

@seonghobae

Copy link
Copy Markdown
Collaborator

πŸ’‘ What

악보 λ·°μ–΄ ν™”λ©΄μ˜ μ•„μ΄μ½˜ λ²„νŠΌ(ν™•λŒ€/μΆ•μ†Œ, νŽ˜μ΄μ§€ 이동, 악보 μ‚­μ œ λ“±)에 title 속성을 μΆ”κ°€ν•˜κ³  λ„€μ΄ν‹°λΈŒ disabled 속성을 aria-disabled="true"둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

🎯 Why

  • μ•„μ΄μ½˜ μ „μš© λ²„νŠΌμ€ μ‹œκ°μ μΈ 힌트 외에 μ„€λͺ…을 μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 마우슀 μ‚¬μš©μžλ₯Ό μœ„ν•΄ title νˆ΄νŒμ„ μ œκ³΅ν•˜μ—¬ 직관성을 λ†’μ˜€μŠ΅λ‹ˆλ‹€.
  • HTML disabled 속성은 슀크린 λ¦¬λ”μ—μ„œ μš”μ†Œλ₯Ό μ™„μ „νžˆ 숨기고 마우슀 이벀트(ν˜Έλ²„ 툴팁 λ“±)λ₯Ό μ°¨λ‹¨ν•˜λ―€λ‘œ, aria-disabled와 e.preventDefault()λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‚€λ³΄λ“œ 및 슀크린 리더 접근성을 μœ μ§€ν•˜λ©΄μ„œ 툴팁이 μž‘λ™ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

β™Ώ Accessibility

  • μ•„μ΄μ½˜ λ²„νŠΌμ— title 및 aria-label 일치
  • disabled 속성 제거 및 aria-disabled λ„μž…μœΌλ‘œ μ ‘κ·Όμ„± ν–₯상
  • React Testing Library ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό aria-disabled 검증 λ°©μ‹μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜κ³  이벀트 차단 ν…ŒμŠ€νŠΈ μΆ”κ°€

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

μ•„μ΄μ½˜ μ „μš© λ²„νŠΌ(ν™•λŒ€/μΆ•μ†Œ, νŽ˜μ΄μ§€ 이동, μ‚­μ œ λ“±)에 `title` 속성을 μΆ”κ°€ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ νˆ΄νŒμ„ μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ `disabled` 속성을 `aria-disabled`둜 λ³€κ²½ν•˜κ³  클릭 이벀트λ₯Ό μ°¨λ‹¨ν•˜μ—¬ 슀크린 리더 μ‚¬μš©μžμ™€ 마우슀 μ‚¬μš©μž λͺ¨λ‘μ—κ²Œ μΌκ΄€λœ 접근성을 μ œκ³΅ν•©λ‹ˆλ‹€.
@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.

Copilot AI review requested due to automatic review settings July 25, 2026 04:21

Copilot AI 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.

Pull request overview

This PR improves the score viewer’s icon-button accessibility and usability by adding localized tooltips (title) and replacing native disabled with aria-disabled + click prevention so tooltips and assistive tech behaviors remain available.

Changes:

  • Added title attributes to icon-only controls in ScoreViewer (zoom, fit-to-width, prev/next page) and the β€œremove score” action in ScoreView.
  • Replaced native disabled usage with aria-disabled and guarded onClick handlers to prevent actions when β€œdisabled”.
  • Updated React Testing Library assertions to validate aria-disabled and verify click default-prevention at bounds.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
apps/desktop/src/features/score/ScoreViewer.tsx Adds tooltips and converts page navigation buttons from disabled to aria-disabled with guarded click handling.
apps/desktop/src/features/score/ScoreViewer.test.tsx Updates tests to assert aria-disabled and verify default-prevented clicks at page bounds.
apps/desktop/src/features/score/ScoreView.tsx Converts β€œAdd/Open/Remove” score actions to aria-disabled with guarded click handling; adds tooltip for remove action.
apps/desktop/src/features/score/ScoreView.test.tsx Updates tests to assert aria-disabled instead of native disabled state.
Comments suppressed due to low confidence (1)

apps/desktop/src/features/score/ScoreView.tsx:220

  • Because this button no longer uses the native disabled attribute, the hover:bg-rose-400/10 class will still trigger when aria-disabled="true", which can make a disabled destructive action look clickable. Add an aria-disabled:hover:* override to neutralize hover styling in the disabled state.
                      className="size-10 border-rose-300/25 text-rose-200 hover:bg-rose-400/10"

πŸ’‘ Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

aria-disabled={!projectId || isAttaching}
variant="secondary"
className="min-h-11 border border-cyan-300/20 bg-cyan-300/10 font-semibold text-cyan-50 hover:bg-cyan-300/20"
className="min-h-11 border border-cyan-300/20 bg-cyan-300/10 font-semibold text-cyan-50 hover:bg-cyan-300/20 aria-disabled:opacity-50 aria-disabled:cursor-not-allowed"
μ•„μ΄μ½˜ μ „μš© λ²„νŠΌ(ν™•λŒ€/μΆ•μ†Œ, νŽ˜μ΄μ§€ 이동, μ‚­μ œ λ“±)에 `title` 속성을 μΆ”κ°€ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ νˆ΄νŒμ„ μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ `disabled` 속성을 `aria-disabled`둜 λ³€κ²½ν•˜κ³  클릭 이벀트λ₯Ό μ°¨λ‹¨ν•˜μ—¬ 슀크린 리더 μ‚¬μš©μžμ™€ 마우슀 μ‚¬μš©μž λͺ¨λ‘μ—κ²Œ μΌκ΄€λœ 접근성을 μ œκ³΅ν•©λ‹ˆλ‹€.
μ˜μ‘΄μ„± 취약점(npm audit 및 trivy-fs μ—λŸ¬) μˆ˜μ •μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
Copilot AI review requested due to automatic review settings July 25, 2026 04:35

Copilot AI 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.

Pull request overview

Copilot reviewed 4 out of 6 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (1)

apps/desktop/src/features/score/ScoreView.tsx:146

  • aria-disabled is used to simulate a disabled state, but this button still applies the active hover background (hover:bg-cyan-300/20) even when aria-disabled="true". That gives a misleading β€œinteractive” affordance in the disabled state and undermines the accessibility intent of the change. Consider overriding hover styles when aria-disabled is true.
              aria-disabled={!projectId || isAttaching}
              variant="secondary"
              className="min-h-11 border border-cyan-300/20 bg-cyan-300/10 font-semibold text-cyan-50 hover:bg-cyan-300/20 aria-disabled:opacity-50 aria-disabled:cursor-not-allowed"

aria-disabled={!projectId}
aria-label={`${t("scoreRemove")}: ${attachment.fileName}`}
title={`${t("scoreRemove")}: ${attachment.fileName}`}
className="size-10 border-rose-300/25 text-rose-200 hover:bg-rose-400/10"
aria-current={selected?.id === attachment.id ? "true" : undefined}
aria-label={`${t("scoreOpen")}: ${attachment.fileName}`}
className="flex min-h-10 min-w-0 flex-1 items-center gap-2 text-left text-sm font-semibold text-slate-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300 disabled:cursor-not-allowed disabled:opacity-60"
className="flex min-h-10 min-w-0 flex-1 items-center gap-2 text-left text-sm font-semibold text-slate-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300 disabled:cursor-not-allowed disabled:opacity-60 aria-disabled:cursor-not-allowed aria-disabled:opacity-60"
μ•„μ΄μ½˜ μ „μš© λ²„νŠΌ(ν™•λŒ€/μΆ•μ†Œ, νŽ˜μ΄μ§€ 이동, μ‚­μ œ λ“±)에 `title` 속성을 μΆ”κ°€ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ νˆ΄νŒμ„ μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ `disabled` 속성을 `aria-disabled`둜 λ³€κ²½ν•˜κ³  클릭 이벀트λ₯Ό μ°¨λ‹¨ν•˜μ—¬ 슀크린 리더 μ‚¬μš©μžμ™€ 마우슀 μ‚¬μš©μž λͺ¨λ‘μ—κ²Œ μΌκ΄€λœ 접근성을 μ œκ³΅ν•©λ‹ˆλ‹€.
trivy-fs CI μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ setuptools와 yt-dlp의 버전을 uv.lock에 μ—…κ·Έλ ˆμ΄λ“œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
μ•„μ΄μ½˜ μ „μš© λ²„νŠΌ(ν™•λŒ€/μΆ•μ†Œ, νŽ˜μ΄μ§€ 이동, μ‚­μ œ λ“±)에 `title` 속성을 μΆ”κ°€ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ νˆ΄νŒμ„ μ œκ³΅ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ `disabled` 속성을 `aria-disabled`둜 λ³€κ²½ν•˜κ³  클릭 이벀트λ₯Ό μ°¨λ‹¨ν•˜μ—¬ 슀크린 리더 μ‚¬μš©μžμ™€ 마우슀 μ‚¬μš©μž λͺ¨λ‘μ—κ²Œ μΌκ΄€λœ 접근성을 μ œκ³΅ν•©λ‹ˆλ‹€.
trivy-fs CI μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ setuptools 버전을 uv.lock에 83.0.0 으둜 μ—…κ·Έλ ˆμ΄λ“œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
Copilot AI review requested due to automatic review settings July 25, 2026 04:54

Copilot AI 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.

Pull request overview

Copilot reviewed 5 out of 7 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (2)

apps/desktop/src/features/score/ScoreViewer.tsx:323

  • Same as the previous button: prefer omitting aria-disabled when enabled (undefined) to match existing patterns (and avoid emitting aria-disabled="false").
            className="size-14"
            aria-label={t("scoreViewerNextPage")}
            title={t("scoreViewerNextPage")}
            aria-disabled={pageNumber >= pageCount}
            onClick={(e) => {
              if (pageNumber >= pageCount) {
                e.preventDefault();
                return;

apps/desktop/src/features/score/ScoreView.tsx:203

  • This button no longer uses the native disabled attribute, so the disabled:* Tailwind variants in this className will never apply (and can be misleading). Consider removing the disabled:* variants now that aria-disabled is the mechanism in use.
                      aria-disabled={!projectId}
                      aria-current={selected?.id === attachment.id ? "true" : undefined}
                      aria-label={`${t("scoreOpen")}: ${attachment.fileName}`}
                      className="flex min-h-10 min-w-0 flex-1 items-center gap-2 text-left text-sm font-semibold text-slate-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300 disabled:cursor-not-allowed disabled:opacity-60 aria-disabled:cursor-not-allowed aria-disabled:opacity-60"
                    >

Comment thread services/analysis-engine/pyproject.toml
Comment on lines +299 to +304
aria-disabled={pageNumber <= 1}
onClick={(e) => {
if (pageNumber <= 1) {
e.preventDefault();
return;
}
}
void handleAttach(projectId);
}}
aria-disabled={!projectId || isAttaching}
@seonghobae

Copy link
Copy Markdown
Collaborator Author

Closing as closed-obsolete (palette a11y micro-PR storm) by autonomous product-completion loop.

Winner / disposition target: #727

Unique value from this cluster is consolidated there (projectId path guard + npm HIGH CVE pins + Foote novelty kernel sign). Remaining micro-duplicates do not land additional commercial readiness.

@seonghobae

Copy link
Copy Markdown
Collaborator Author

closed-closed-obsolete (palette a11y micro-PR storm) β†’ #727

@seonghobae seonghobae closed this Jul 31, 2026
@google-labs-jules

Copy link
Copy Markdown

Closing as closed-obsolete (palette a11y micro-PR storm) by autonomous product-completion loop.

Winner / disposition target: #727

Unique value from this cluster is consolidated there (projectId path guard + npm HIGH CVE pins + Foote novelty kernel sign). Remaining micro-duplicates do not land additional commercial readiness.

Understood. Acknowledging that this work is now obsolete and stopping work on this task.

@google-labs-jules

Copy link
Copy Markdown

closed-closed-obsolete (palette a11y micro-PR storm) β†’ #727

Understood. Acknowledging that this work is now obsolete and stopping work on this task.

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.

2 participants