/** * Component: Section Toolbar * Documentation: Responsive toolbar that shows inline controls on sm+ and collapses to popover on mobile */ 'use client'; import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useSmartDropdownPosition } from '@/hooks/useSmartDropdownPosition'; import { HideAvailableToggle } from '@/components/ui/HideAvailableToggle'; import { SquareCoversToggle } from '@/components/ui/SquareCoversToggle'; import { CardSizeControls } from '@/components/ui/CardSizeControls'; interface SectionToolbarProps { hideAvailable: boolean; onToggleHideAvailable: (v: boolean) => void; squareCovers: boolean; onToggleSquareCovers: (v: boolean) => void; cardSize: number; onCardSizeChange: (v: number) => void; } export function SectionToolbar({ hideAvailable, onToggleHideAvailable, squareCovers, onToggleSquareCovers, cardSize, onCardSizeChange, }: SectionToolbarProps) { const [isOpen, setIsOpen] = useState(false); const { containerRef, dropdownRef, style } = useSmartDropdownPosition(isOpen); // Close on Escape useEffect(() => { if (!isOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') setIsOpen(false); }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [isOpen]); // Close on click outside useEffect(() => { if (!isOpen) return; const handleMouseDown = (e: MouseEvent) => { const target = e.target as Node; if ( containerRef.current && !containerRef.current.contains(target) && dropdownRef.current && !dropdownRef.current.contains(target) ) { setIsOpen(false); } }; document.addEventListener('mousedown', handleMouseDown); return () => document.removeEventListener('mousedown', handleMouseDown); }, [isOpen, containerRef, dropdownRef]); return (