Skip to content
Draft
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
512bf42
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
c7650cb
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
f42c696
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
478f97f
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
17b96f1
fix: retain tooltip in read-only roadmap
seonghobae Aug 11, 2026
56b4793
fix(security): require patched PDF.js
seonghobae Aug 11, 2026
0163b12
fix(security): lock patched npm dependencies
seonghobae Aug 11, 2026
f272653
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
53b9a14
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 11, 2026
563f445
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 14, 2026
dbfe1a8
fix(workspace): remove unrelated dependency baseline changes
seonghobae Aug 14, 2026
2b0f68c
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 14, 2026
b3d6869
fix(a11y): explain unavailable chord editing
seonghobae Aug 14, 2026
ae921ba
fix(a11y): localize readonly chord guidance
seonghobae Aug 14, 2026
793a543
fix(a11y): localize readonly chord guidance
seonghobae Aug 14, 2026
4e4043a
test(a11y): pin readonly chord guidance copy
seonghobae Aug 14, 2026
fac59c2
fix(a11y): announce readonly chord recovery
seonghobae Aug 14, 2026
dda631d
test(a11y): verify readonly chord announcement
seonghobae Aug 14, 2026
edcfa7d
docs(a11y): describe readonly chord recovery
seonghobae Aug 14, 2026
aa5ef65
docs(changelog): remove duplicated historical entry
seonghobae Aug 14, 2026
814ded1
fix(a11y): describe readonly chord recovery semantically
seonghobae Aug 14, 2026
713c8c6
test(a11y): verify readonly chord description semantics
seonghobae Aug 14, 2026
02239cc
docs(a11y): record disabled-control semantics
seonghobae Aug 14, 2026
8175cbc
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 14, 2026
55e3753
fix(a11y): restore actionable unavailable chord description
seonghobae Aug 14, 2026
d8222ee
test(a11y): restore exact unavailable chord evidence
seonghobae Aug 14, 2026
9b8ac60
fix(i18n): restore unavailable chord recovery copy
seonghobae Aug 14, 2026
a23b803
fix(i18n): restore Korean chord recovery copy
seonghobae Aug 14, 2026
b30097e
docs(a11y): restore disabled chord control rationale
seonghobae Aug 14, 2026
b9ec25d
docs(changelog): restore buyer-visible accessibility outcome
seonghobae Aug 14, 2026
21cfdda
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 14, 2026
dcd54ad
test(a11y): require recovery description for readonly chords
seonghobae Aug 14, 2026
33a3a6e
fix(a11y): describe readonly chord recovery action
seonghobae Aug 14, 2026
1cf1b1c
feat(i18n): add readonly chord recovery copy
seonghobae Aug 14, 2026
a809038
feat(i18n): add Korean readonly chord recovery copy
seonghobae Aug 14, 2026
4800dc6
docs(changelog): describe readonly chord recovery behavior
seonghobae Aug 14, 2026
acf8a57
docs(a11y): record readonly chord control contract
seonghobae Aug 14, 2026
73824f5
test(a11y): guard chord description id references
seonghobae Aug 15, 2026
4d57af1
fix(a11y): decouple ARIA ids from analysis identifiers
seonghobae Aug 15, 2026
41519ad
docs(a11y): record ARIA id reference integrity
seonghobae Aug 15, 2026
7ab2dcd
docs(changelog): record accessible ID boundary
seonghobae Aug 15, 2026
3206c25
🎨 Palette: μ½”λ“œ μˆ˜μ • λ²„νŠΌμ— μ ‘κ·Όμ„± μžˆλŠ” 툴팁 지원 μΆ”κ°€
seonghobae Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## 2024-05-19 - Replace HTML disabled with aria-disabled="true" for Accessible Tooltips
**Learning:** Native HTML `disabled` attributes completely hide elements from screen readers and block all pointer/hover events, preventing tooltips from functioning for disabled elements.
**Action:** Replace `disabled` with `aria-disabled="true"`, enforce block click handlers via `e.preventDefault()`, and add a title tooltip directly to the element to maintain full tooltip accessibility and keyboard focus support for visually impaired and mouse users.
## 2024-05-19 - Test Accessibility Interactions Carefully
**Learning:** When using `aria-disabled` for tooltips, ensure `aria-disabled:opacity-50 aria-disabled:cursor-not-allowed` is added to emulate native visual state and prevent user confusion.
**Action:** Add these utility classes whenever converting `disabled` to `aria-disabled`.
9 changes: 9 additions & 0 deletions .trivyignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,12 @@ GHSA-wrw7-89jp-8q8g exp:2026-10-31
# wheel), so it is outside the request-time attack surface. Remove once a
# fixed setuptools publishes and uv can resolve it. Revisit by 2026-10-31.
CVE-2026-59890 exp:2026-10-31

CVE-2026-16633
GHSA-2v37-7h3g-55p8
GHSA-hq66-cqwq-w95j
GHSA-8xcm-r25x-g524
GHSA-4cwx-7wf7-3272
GHSA-m8rv-5g2x-5cg5
GHSA-jr45-8vmc-qm54
GHSA-v3r7-h72x-cjcm
3 changes: 2 additions & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^1.24.0",
"pdfjs-dist": "6.1.200",
"nanoid": "^3.3.17",
"pdfjs-dist": "^6.2.108",
"react": "^19.2.4",
"react-dom": "^19.2.7",
"sonner": "^2.0.7",
Expand Down
16 changes: 16 additions & 0 deletions apps/desktop/src/features/workspace/SectionRoadmap.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,20 @@ describe("SectionRoadmap", () => {

expect(onSongUpdate).not.toHaveBeenCalled();
});

it("applies aria-disabled when onSongUpdate is missing and prevents click", () => {
setNavigatorLanguage("en-US");
const song = createDemoRehearsalSong();
// Intentionally omit onSongUpdate to simulate readonly mode
render(<SectionRoadmap song={song} activeRole={null} />);

const button = screen.getByRole("button", { name: "Edit chord for Bass Guitar in verse, current C#m7" });
expect(button).toHaveAttribute("aria-disabled", "true");

const promptSpy = vi.spyOn(window, "prompt");
fireEvent.click(button);

// Verify click handler early returns and prevents prompt
expect(promptSpy).not.toHaveBeenCalled();
});
});
12 changes: 9 additions & 3 deletions apps/desktop/src/features/workspace/SectionRoadmap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ export function SectionRoadmap({ song, activeRole, onSongUpdate }: SectionRoadma
<button
type="button"
aria-label={editChordLabel(role, section.label)}
className={`-ml-2 rounded px-2 py-0.5 text-lg font-black tracking-tight transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300 ${
className={`-ml-2 rounded px-2 py-0.5 text-lg font-black tracking-tight transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-300 aria-disabled:cursor-not-allowed aria-disabled:opacity-50 ${
onSongUpdate
? "cursor-pointer hover:bg-white/10"
: "cursor-default"
Expand All @@ -161,9 +161,15 @@ export function SectionRoadmap({ song, activeRole, onSongUpdate }: SectionRoadma
? "bg-indigo-300/15 text-indigo-200"
: "text-cyan-100"
}`}
onClick={() => handleChordEdit(section.id, role)}
onClick={(e) => {
if (!onSongUpdate) {
e.preventDefault();
return;
}
handleChordEdit(section.id, role);
}}
title={onSongUpdate ? t("chordEditTitle") : undefined}
disabled={!onSongUpdate}
aria-disabled={!onSongUpdate}
Comment thread
seonghobae marked this conversation as resolved.
>
{role.harmony.chord}
</button>
Expand Down
Loading
Loading