(null);
+ const badgeRefs = useRef<(HTMLButtonElement | null)[]>([]);
+
+ // Keyboard navigation
+ useKeyboardNavigation({
+ enabled: true,
+ containerRef: containerRef,
+ currentIndex: focusedIndex,
+ itemCount: sources.length,
+ orientation: 'horizontal',
+ onNavigate: useCallback((index: number) => {
+ setFocusedIndex(index);
+ badgeRefs.current[index]?.focus();
+ // Scroll into view for mobile
+ badgeRefs.current[index]?.scrollIntoView({
+ behavior: 'smooth',
+ block: 'nearest',
+ inline: 'center',
+ });
+ }, []),
+ onSelect: useCallback((index: number) => {
+ onToggleSource(sources[index].id);
+ }, [sources, onToggleSource]),
+ });
+
+ return (
+ <>
+ {/* Desktop: Expandable Grid */}
+
+
+ {sources.map((source, index) => (
+ onToggleSource(source.id)}
+ isFocused={focusedIndex === index}
+ onFocus={() => setFocusedIndex(index)}
+ innerRef={(el: HTMLButtonElement | null) => { badgeRefs.current[index] = el; }}
+ />
+ ))}
+
+
+ {sources.length > 5 && (
+
+ )}
+
+
+ {/* Mobile & Tablet: Horizontal Scroll */}
+
+
+ {sources.map((source, index) => (
+ onToggleSource(source.id)}
+ isFocused={focusedIndex === index}
+ onFocus={() => setFocusedIndex(index)}
+ innerRef={(el: HTMLButtonElement | null) => { badgeRefs.current[index] = el; }}
+ />
+ ))}
+
+
+ >
+ );
+}
diff --git a/components/search/SourceBadges.tsx b/components/search/SourceBadges.tsx
index d7497a7..8282db6 100644
--- a/components/search/SourceBadges.tsx
+++ b/components/search/SourceBadges.tsx
@@ -2,15 +2,15 @@
* SourceBadges - Clickable video source badges with filtering
* Shows available video sources with counts
* Click to filter videos by source
- * Similar functionality to TypeBadges
+ * Responsive: Desktop shows expand/collapse, Mobile shows horizontal scroll
*/
'use client';
import { memo } from 'react';
import { Card } from '@/components/ui/Card';
-import { Badge } from '@/components/ui/Badge';
import { Icons } from '@/components/ui/Icon';
+import { SourceBadgeList } from './SourceBadgeList';
interface Source {
id: string;
@@ -52,43 +52,11 @@ export const SourceBadges = memo(function SourceBadges({
-
- {sources.map((source) => {
- const isSelected = selectedSources.has(source.id);
-
- return (
-
- );
- })}
-
+
{selectedSources.size > 0 && (
diff --git a/components/search/TypeBadgeList.tsx b/components/search/TypeBadgeList.tsx
index 3ec86aa..ed176d3 100644
--- a/components/search/TypeBadgeList.tsx
+++ b/components/search/TypeBadgeList.tsx
@@ -93,13 +93,13 @@ export function TypeBadgeList({ badges, selectedTypes, onToggleType }: TypeBadge
{/* Mobile & Tablet: Horizontal Scroll */}
{badges.map((badge, index) => (