From 7fdba6cf34bce99bc59867a1882ca488eb0b0cc0 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 21:30:25 +0100 Subject: [PATCH 01/10] fix: improve gallery contrast and keyboard focus --- frontend/src/components/gallery/GalleryCard.tsx | 2 +- frontend/src/components/gallery/GalleryHeader.tsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/gallery/GalleryCard.tsx b/frontend/src/components/gallery/GalleryCard.tsx index 5ba070b..9866b24 100644 --- a/frontend/src/components/gallery/GalleryCard.tsx +++ b/frontend/src/components/gallery/GalleryCard.tsx @@ -16,7 +16,7 @@ export default function GalleryCard({ return ( {imageUrls.length === 0 ? (
diff --git a/frontend/src/components/gallery/GalleryHeader.tsx b/frontend/src/components/gallery/GalleryHeader.tsx index b14de6a..dd1e5a3 100644 --- a/frontend/src/components/gallery/GalleryHeader.tsx +++ b/frontend/src/components/gallery/GalleryHeader.tsx @@ -60,13 +60,13 @@ export default function GalleryHeader({ onChange={(event) => onTitleChange(event.target.value)} required disabled={renaming} - className="min-h-11 w-full rounded border border-gray-300 bg-white px-3 py-2 font-serif text-3xl text-gray-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:opacity-50 dark:border-[#504b46] dark:bg-[#242321] dark:text-[#e6dfd6] sm:text-4xl" + className="min-h-11 w-full rounded border border-gray-300 bg-white px-3 py-2 font-serif text-3xl text-gray-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] disabled:opacity-50 dark:border-[#504b46] dark:bg-[#242321] dark:text-[#e6dfd6] sm:text-4xl" /> @@ -75,7 +75,7 @@ export default function GalleryHeader({ type="button" onClick={onCancelRenaming} disabled={renaming} - className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:opacity-50 dark:hover:bg-[#302e2a]" + className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] disabled:opacity-50 dark:hover:bg-[#302e2a]" > Cancel @@ -92,7 +92,7 @@ export default function GalleryHeader({ onClick={() => onStartRenaming(title)} aria-label="Rename gallery" title="Rename gallery" - className="inline-flex min-h-11 min-w-11 shrink-0 cursor-pointer items-center justify-center rounded-full text-gray-600 hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:text-gray-300 dark:hover:bg-[#302e2a]" + className="inline-flex min-h-11 min-w-11 shrink-0 cursor-pointer items-center justify-center rounded-full text-gray-600 hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] dark:text-gray-300 dark:hover:bg-[#302e2a]" >
-

+

{totalCount} {totalCount === 1 ? "artwork" : "artworks"}

@@ -120,7 +120,7 @@ export default function GalleryHeader({ onClick={onToggleEditing} disabled={renaming} aria-pressed={isEditing} - className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700" + className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] dark:border-[#504b46] dark:text-[#e6dfd6] dark:hover:bg-[#302e2a]" > {isEditing ? "Done" : "Edit gallery"} From 05a2fa1d822f560a80c50d2fe89985dfe1efa265 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 21:31:22 +0100 Subject: [PATCH 02/10] fix: improve artwork card contrast and keyboard focus --- frontend/src/components/artwork/ArtworkCard.css | 4 ++++ frontend/src/components/artwork/ArtworkCard.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/artwork/ArtworkCard.css b/frontend/src/components/artwork/ArtworkCard.css index 437bbf5..6371d3b 100644 --- a/frontend/src/components/artwork/ArtworkCard.css +++ b/frontend/src/components/artwork/ArtworkCard.css @@ -41,3 +41,7 @@ color: #595959; overflow-wrap: anywhere; } + +.dark .artwork-card__artist { + color: #d1d5db; +} diff --git a/frontend/src/components/artwork/ArtworkCard.tsx b/frontend/src/components/artwork/ArtworkCard.tsx index 68da07f..1dd5d75 100644 --- a/frontend/src/components/artwork/ArtworkCard.tsx +++ b/frontend/src/components/artwork/ArtworkCard.tsx @@ -64,7 +64,7 @@ export default function ArtworkCard({
From 158b12d4a64e90a5f12fe08214b2e4592e45cd89 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 21:36:09 +0100 Subject: [PATCH 03/10] fix: improve gallery actions and feedback in dark mode --- frontend/src/pages/GalleryPage.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/pages/GalleryPage.tsx b/frontend/src/pages/GalleryPage.tsx index 2dd36b8..e028846 100644 --- a/frontend/src/pages/GalleryPage.tsx +++ b/frontend/src/pages/GalleryPage.tsx @@ -114,14 +114,14 @@ export default function GalleryPage() { className="pointer-events-none fixed bottom-8 left-4 right-4 z-50 sm:bottom-12 sm:left-auto sm:right-8 sm:w-full sm:max-w-md" > {successMessage && ( -

+

{successMessage}

)}
{removeError && ( -

+

Could not remove artwork: {removeError}

)} @@ -131,7 +131,7 @@ export default function GalleryPage() { Loading gallery...

) : error ? ( -

+

Could not load gallery: {error}

) : !gallery ? ( @@ -167,7 +167,7 @@ export default function GalleryPage() { type="button" onClick={() => setShowDeleteDialog(true)} disabled={renaming || removingId !== null} - className="min-h-11 shrink-0 cursor-pointer self-start rounded border border-red-300 px-4 py-2 text-sm text-red-700 hover:bg-red-50 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-700 disabled:cursor-not-allowed disabled:opacity-50 dark:border-red-800 dark:text-red-400 dark:hover:bg-red-950" + className="min-h-11 shrink-0 cursor-pointer self-start rounded border border-red-300 px-4 py-2 text-sm text-red-700 hover:bg-red-50 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-700 disabled:cursor-not-allowed disabled:opacity-50 dark:border-red-800 dark:text-red-400 dark:hover:bg-red-950 dark:focus-visible:outline-red-400" > Delete gallery @@ -193,7 +193,7 @@ export default function GalleryPage() { disabled={removingId !== null} aria-label={`Remove ${artwork.title} from this gallery`} title="Remove from this gallery" - className="absolute right-3 top-3 z-10 inline-flex min-h-11 min-w-11 cursor-pointer items-center justify-center rounded-full border border-gray-300 bg-white text-gray-600 shadow-sm hover:border-red-300 hover:bg-red-50 hover:text-red-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:cursor-wait disabled:opacity-50" + className="absolute right-3 top-3 z-10 inline-flex min-h-11 min-w-11 cursor-pointer items-center justify-center rounded-full border border-gray-300 bg-white text-gray-600 shadow-sm hover:border-red-300 hover:bg-red-50 hover:text-red-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:cursor-wait disabled:opacity-50 dark:border-[#504b46] dark:bg-[#242321] dark:text-[#e6dfd6] dark:hover:border-red-800 dark:hover:bg-red-950 dark:hover:text-red-300 dark:focus-visible:outline-[#e6dfd6]" > {removingId === artwork.id ? ( Removing... From 61842e62d879008d4161f55ef504bdce274f7ea9 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 21:38:51 +0100 Subject: [PATCH 04/10] fix: improve delete dialog focus in dark mode --- frontend/src/components/gallery/DeleteGalleryDialog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/gallery/DeleteGalleryDialog.tsx b/frontend/src/components/gallery/DeleteGalleryDialog.tsx index 9e7d6f8..6b4bb22 100644 --- a/frontend/src/components/gallery/DeleteGalleryDialog.tsx +++ b/frontend/src/components/gallery/DeleteGalleryDialog.tsx @@ -66,7 +66,7 @@ export default function DeleteGalleryDialog({ type="button" onClick={onCancel} disabled={deleting} - className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:opacity-50 dark:border-[#504b46] dark:hover:bg-[#302e2a]" + className="min-h-11 cursor-pointer rounded border border-gray-300 px-4 py-2 text-sm hover:bg-gray-100 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 disabled:opacity-50 dark:border-[#504b46] dark:hover:bg-[#302e2a] dark:focus-visible:outline-[#e6dfd6]" > Cancel @@ -75,7 +75,7 @@ export default function DeleteGalleryDialog({ type="button" onClick={onConfirm} disabled={deleting} - className="min-h-11 cursor-pointer rounded bg-red-700 px-4 py-2 text-sm text-white hover:bg-red-800 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-700 disabled:cursor-wait disabled:opacity-50" + className="min-h-11 cursor-pointer rounded bg-red-700 px-4 py-2 text-sm text-white hover:bg-red-800 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-700 disabled:cursor-wait disabled:opacity-50 dark:focus-visible:outline-red-400 " > {deleting ? "Deleting..." : "Delete gallery"} From 55cc3eac6885dd4964c5bacacb9003517e7bf7df Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 21:47:11 +0100 Subject: [PATCH 05/10] fix: improve contrast and focus in gallery dialogs --- frontend/src/components/gallery/AddToGalleryModal.tsx | 2 +- frontend/src/components/gallery/CreateGalleryModal.tsx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/gallery/AddToGalleryModal.tsx b/frontend/src/components/gallery/AddToGalleryModal.tsx index c7dd44c..50449c4 100644 --- a/frontend/src/components/gallery/AddToGalleryModal.tsx +++ b/frontend/src/components/gallery/AddToGalleryModal.tsx @@ -174,7 +174,7 @@ export default function AddToGalleryModal({ )} {message && ( -

+

{message}

)} diff --git a/frontend/src/components/gallery/CreateGalleryModal.tsx b/frontend/src/components/gallery/CreateGalleryModal.tsx index cf84f35..892a1ce 100644 --- a/frontend/src/components/gallery/CreateGalleryModal.tsx +++ b/frontend/src/components/gallery/CreateGalleryModal.tsx @@ -75,7 +75,7 @@ export default function CreateGalleryModal({ {error && ( -

+

{error}

)} From a41d9a10474312caa170c099081678b9b467dd46 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 22:02:44 +0100 Subject: [PATCH 06/10] fix: keep keyboard focus in the create gallery dialog --- .../components/gallery/CreateGalleryModal.tsx | 107 ++++++++++-------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/frontend/src/components/gallery/CreateGalleryModal.tsx b/frontend/src/components/gallery/CreateGalleryModal.tsx index 892a1ce..91b2bc9 100644 --- a/frontend/src/components/gallery/CreateGalleryModal.tsx +++ b/frontend/src/components/gallery/CreateGalleryModal.tsx @@ -1,5 +1,5 @@ import { LucideX } from "lucide-react"; -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; import { useAuthStore } from "../../store/authStore"; type CreateGalleryModalProps = { @@ -16,6 +16,15 @@ export default function CreateGalleryModal({ const [error, setError] = useState(""); const token = useAuthStore((state) => state.token); + const dialogRef = useRef(null); + + useEffect(() => { + const dialog = dialogRef.current; + if (!dialog) return; + + dialog.showModal(); + return () => dialog.close(); + }, []); async function handleCreateGallery() { if (!title.trim() || isCreating) return; @@ -70,51 +79,59 @@ export default function CreateGalleryModal({ } return ( -
-
- - -

Create a new gallery

-
-
-
-
-
-
+ { + event.preventDefault(); + onClose(); + }} + className="relative m-auto h-3/4 w-3/4 overflow-y-auto rounded-2xl bg-white p-8 text-center shadow-xl backdrop:bg-black/50 dark:bg-[#242321] dark:text-[#f3f0ea]" + > + + + + +
+
+
+
+
- setTitle(e.target.value)} - placeholder="Enter gallery title" - className="w-full rounded-lg border mt-10 border-gray-300 p-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] dark:border-[#504b46] dark:bg-[#1d1c1a] dark:text-[#f3f0ea] dark:placeholder:text-gray-400" - /> - - {error && ( -

- {error} -

- )}
-
+ setTitle(e.target.value)} + placeholder="Enter gallery title" + className="w-full rounded-lg border mt-10 border-gray-300 p-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:focus-visible:outline-[#e6dfd6] dark:border-[#504b46] dark:bg-[#1d1c1a] dark:text-[#f3f0ea] dark:placeholder:text-gray-400" + /> + + {error && ( +

+ {error} +

+ )} + ); } From d0ef8112c64bca8aed537e02f3b01ba7ad020156 Mon Sep 17 00:00:00 2001 From: Karen Skauge Date: Tue, 10 Nov 2026 22:07:53 +0100 Subject: [PATCH 07/10] fix: unify keyboard focus on gallery plus buttons --- frontend/src/components/artwork/ArtworkCard.tsx | 2 +- frontend/src/pages/ArtworkDetailPage.tsx | 2 +- frontend/src/pages/ProfilePage.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/artwork/ArtworkCard.tsx b/frontend/src/components/artwork/ArtworkCard.tsx index 1dd5d75..84b8d07 100644 --- a/frontend/src/components/artwork/ArtworkCard.tsx +++ b/frontend/src/components/artwork/ArtworkCard.tsx @@ -97,7 +97,7 @@ export default function ArtworkCard({ if (isLoggedIn) setShowGalleryModal(true); else navigate("/login"); }} - className="absolute right-5 top-5 z-10 grid h-10 w-10 cursor-pointer place-items-center rounded-full border border-gray-300 bg-white/95 text-gray-700 shadow-sm transition hover:border-gray-500 hover:bg-white hover:text-black focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:border-[#5b554e] dark:bg-[#292724]/95 dark:text-gray-200 dark:hover:border-gray-400 dark:hover:bg-[#35322e] dark:hover:text-white" + className="absolute right-5 top-5 z-10 grid h-10 w-10 cursor-pointer place-items-center rounded-full border border-gray-300 bg-white/95 text-gray-700 shadow-sm transition-[background-color,border-color,color] hover:border-gray-500 hover:bg-white hover:text-black focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-700 dark:border-[#5b554e] dark:bg-[#292724]/95 dark:text-gray-200 dark:hover:border-gray-400 dark:hover:bg-[#35322e] dark:hover:text-white dark:focus-visible:outline-[#e6dfd6]" >