diff --git a/src/components/group-badges.tsx b/src/components/group-badges.tsx index c3519de..47efdd9 100644 --- a/src/components/group-badges.tsx +++ b/src/components/group-badges.tsx @@ -1,5 +1,6 @@ "use client"; +import { useCallback, useEffect, useRef, useState } from "react"; import { Badge } from "@/components/ui/badge"; import type { GroupWithCount } from "@/types"; @@ -17,9 +18,37 @@ export function GroupBadges({ groups, isLoading, }: GroupBadgesProps) { + const scrollContainerRef = useRef(null); + const [showLeftFade, setShowLeftFade] = useState(false); + const [showRightFade, setShowRightFade] = useState(false); + + const checkScrollPosition = useCallback(() => { + const container = scrollContainerRef.current; + if (!container) return; + + const { scrollLeft, scrollWidth, clientWidth } = container; + setShowLeftFade(scrollLeft > 0); + setShowRightFade(scrollLeft < scrollWidth - clientWidth - 1); + }, []); + + useEffect(() => { + const container = scrollContainerRef.current; + if (!container) return; + + checkScrollPosition(); + container.addEventListener("scroll", checkScrollPosition); + const resizeObserver = new ResizeObserver(checkScrollPosition); + resizeObserver.observe(container); + + return () => { + container.removeEventListener("scroll", checkScrollPosition); + resizeObserver.disconnect(); + }; + }, [checkScrollPosition]); + if (isLoading && !groups.length) { return ( -
+
Loading groups...
@@ -28,22 +57,36 @@ export function GroupBadges({ } return ( -
- {groups.map((group) => ( - { - onGroupSelect(selectedGroupId === group.id ? "default" : group.id); - }} - > - {group.name} - - {group.count} - - - ))} +
+ {showLeftFade && ( +
+ )} + {showRightFade && ( +
+ )} +
+ {groups.map((group) => ( + { + onGroupSelect( + selectedGroupId === group.id ? "default" : group.id, + ); + }} + > + {group.name} + + {group.count} + + + ))} +
); } diff --git a/src/components/group-management-dialog.tsx b/src/components/group-management-dialog.tsx index 80dd8e1..8f7c197 100644 --- a/src/components/group-management-dialog.tsx +++ b/src/components/group-management-dialog.tsx @@ -17,6 +17,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; +import { ScrollArea } from "@/components/ui/scroll-area"; import { Table, TableBody, @@ -148,41 +149,43 @@ export function GroupManagementDialog({
) : (
- - - - Name - Actions - - - - {groups.map((group) => ( - - - {group.name} - - -
- - -
-
+ +
+ + + Name + Actions - ))} - -
+ + + {groups.map((group) => ( + + + {group.name} + + +
+ + +
+
+
+ ))} +
+ +
)}
diff --git a/src/components/home-header.tsx b/src/components/home-header.tsx index e680764..4d1978b 100644 --- a/src/components/home-header.tsx +++ b/src/components/home-header.tsx @@ -48,7 +48,7 @@ const HomeHeader = ({ window.dispatchEvent(event); }; return ( -
+