create for series

This commit is contained in:
Nicolas Cantu 2026-01-13 23:46:43 +01:00
parent 8f3f62f7bf
commit 57acb3d9f3
3 changed files with 77 additions and 37 deletions

View File

@ -62,20 +62,62 @@ export function MobileMenu({ children, 'aria-label': ariaLabel }: MobileMenuProp
return ( return (
<> <>
<button <MobileMenuButton
isOpen={isOpen}
onClick={() => setIsOpen(!isOpen)} onClick={() => setIsOpen(!isOpen)}
ariaLabel={ariaLabel ?? 'Toggle menu'}
/>
{isOpen && (
<MobileMenuDrawer
isOpen={isOpen}
onClose={() => setIsOpen(false)}
ariaLabel={ariaLabel ?? 'Mobile menu'}
>
{children}
</MobileMenuDrawer>
)}
</>
)
}
function MobileMenuButton({
isOpen,
onClick,
ariaLabel,
}: {
isOpen: boolean
onClick: () => void
ariaLabel: string
}): React.ReactElement {
return (
<button
onClick={onClick}
className="md:hidden text-cyber-accent hover:text-neon-cyan transition-colors focus:outline-none focus:ring-2 focus:ring-neon-cyan rounded p-2" className="md:hidden text-cyber-accent hover:text-neon-cyan transition-colors focus:outline-none focus:ring-2 focus:ring-neon-cyan rounded p-2"
aria-label={ariaLabel ?? 'Toggle menu'} aria-label={ariaLabel}
aria-expanded={isOpen} aria-expanded={isOpen}
aria-controls="mobile-menu" aria-controls="mobile-menu"
> >
<HamburgerIcon isOpen={isOpen} /> <HamburgerIcon isOpen={isOpen} />
</button> </button>
{isOpen && ( )
}
function MobileMenuDrawer({
isOpen,
onClose,
ariaLabel,
children,
}: {
isOpen: boolean
onClose: () => void
ariaLabel: string
children: ReactNode
}): React.ReactElement {
return (
<> <>
<div <div
className="fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden" className="fixed inset-0 bg-black bg-opacity-50 z-40 md:hidden"
onClick={() => setIsOpen(false)} onClick={onClose}
aria-hidden="true" aria-hidden="true"
/> />
<div <div
@ -83,12 +125,12 @@ export function MobileMenu({ children, 'aria-label': ariaLabel }: MobileMenuProp
className="fixed top-0 right-0 h-full w-80 max-w-[85vw] bg-cyber-dark border-l border-neon-cyan/30 shadow-glow-cyan z-50 transform transition-transform md:hidden overflow-y-auto" className="fixed top-0 right-0 h-full w-80 max-w-[85vw] bg-cyber-dark border-l border-neon-cyan/30 shadow-glow-cyan z-50 transform transition-transform md:hidden overflow-y-auto"
role="dialog" role="dialog"
aria-modal="true" aria-modal="true"
aria-label={ariaLabel ?? 'Mobile menu'} aria-label={ariaLabel}
> >
<div className="p-4"> <div className="p-4">
<div className="flex justify-end mb-4"> <div className="flex justify-end mb-4">
<button <button
onClick={() => setIsOpen(false)} onClick={onClose}
className="text-cyber-accent hover:text-neon-cyan text-2xl transition-colors focus:outline-none focus:ring-2 focus:ring-neon-cyan rounded" className="text-cyber-accent hover:text-neon-cyan text-2xl transition-colors focus:outline-none focus:ring-2 focus:ring-neon-cyan rounded"
aria-label="Close menu" aria-label="Close menu"
> >
@ -99,7 +141,5 @@ export function MobileMenu({ children, 'aria-label': ariaLabel }: MobileMenuProp
</div> </div>
</div> </div>
</> </>
)}
</>
) )
} }