diff --git a/apps/desktop/src/features/score/ScoreView.tsx b/apps/desktop/src/features/score/ScoreView.tsx
index 72732450..729f6056 100644
--- a/apps/desktop/src/features/score/ScoreView.tsx
+++ b/apps/desktop/src/features/score/ScoreView.tsx
@@ -197,6 +197,7 @@ export function ScoreView({ song, projectId, onSongUpdate }: ScoreViewProps) {
size="icon"
onClick={projectId ? () => void handleRemove(projectId, attachment) : undefined}
disabled={!projectId}
+ title={`${t("scoreRemove")}: ${attachment.fileName}`}
aria-label={`${t("scoreRemove")}: ${attachment.fileName}`}
className="size-10 border-rose-300/25 text-rose-200 hover:bg-rose-400/10"
>
diff --git a/apps/desktop/src/features/score/ScoreViewer.test.tsx b/apps/desktop/src/features/score/ScoreViewer.test.tsx
index 3ac2dd60..acd19f65 100644
--- a/apps/desktop/src/features/score/ScoreViewer.test.tsx
+++ b/apps/desktop/src/features/score/ScoreViewer.test.tsx
@@ -120,8 +120,8 @@ describe("ScoreViewer", () => {
expect(page.render).toHaveBeenCalled();
});
expect(page.getViewport).toHaveBeenCalledWith({ scale: 1 });
- expect(screen.getByRole("button", { name: "Previous page" })).toBeDisabled();
- expect(screen.getByRole("button", { name: "Next page" })).toBeEnabled();
+ expect(screen.getByRole("button", { name: "Previous page" })).toHaveAttribute("aria-disabled", "true");
+ expect(screen.getByRole("button", { name: "Next page" })).toHaveAttribute("aria-disabled", "false");
});
it("shows the file name when provided", async () => {
@@ -174,14 +174,14 @@ describe("ScoreViewer", () => {
expect(await screen.findByText("Page 1 of 3")).toBeInTheDocument();
const previousButton = screen.getByRole("button", { name: "Previous page" });
const nextButton = screen.getByRole("button", { name: "Next page" });
- expect(previousButton).toBeDisabled();
+ expect(previousButton).toHaveAttribute("aria-disabled", "true");
fireEvent.click(nextButton);
expect(screen.getByText("Page 2 of 3")).toBeInTheDocument();
fireEvent.click(nextButton);
expect(screen.getByText("Page 3 of 3")).toBeInTheDocument();
- expect(nextButton).toBeDisabled();
+ expect(nextButton).toHaveAttribute("aria-disabled", "true");
await waitFor(() => {
expect(doc.getPage).toHaveBeenCalledWith(3);
diff --git a/apps/desktop/src/features/score/ScoreViewer.tsx b/apps/desktop/src/features/score/ScoreViewer.tsx
index 82692469..abd518f2 100644
--- a/apps/desktop/src/features/score/ScoreViewer.tsx
+++ b/apps/desktop/src/features/score/ScoreViewer.tsx
@@ -257,6 +257,7 @@ export function ScoreViewer({ data, fileName, onStatusChange }: ScoreViewerProps
variant="outline"
size="icon-lg"
className="size-12"
+ title={t("scoreViewerZoomOut")}
aria-label={t("scoreViewerZoomOut")}
onClick={zoomOut}
>
@@ -266,6 +267,7 @@ export function ScoreViewer({ data, fileName, onStatusChange }: ScoreViewerProps
variant="outline"
size="icon-lg"
className="size-12"
+ title={t("scoreViewerZoomIn")}
aria-label={t("scoreViewerZoomIn")}
onClick={zoomIn}
>
@@ -291,9 +293,11 @@ export function ScoreViewer({ data, fileName, onStatusChange }: ScoreViewerProps
variant="outline"
size="icon-lg"
className="size-14"
+ title={t("scoreViewerPrevPage")}
aria-label={t("scoreViewerPrevPage")}
- disabled={pageNumber <= 1}
- onClick={goToPreviousPage}
+ aria-disabled={pageNumber <= 1}
+ tabIndex={0}
+ onClick={pageNumber <= 1 ? undefined : goToPreviousPage}
>
@@ -304,9 +308,11 @@ export function ScoreViewer({ data, fileName, onStatusChange }: ScoreViewerProps
variant="outline"
size="icon-lg"
className="size-14"
+ title={t("scoreViewerNextPage")}
aria-label={t("scoreViewerNextPage")}
- disabled={pageNumber >= pageCount}
- onClick={goToNextPage}
+ aria-disabled={pageNumber >= pageCount}
+ tabIndex={0}
+ onClick={pageNumber >= pageCount ? undefined : goToNextPage}
>