/
githubmirror
/
next.js
Обзор
Документация
Войти
/
githubmirror
/
next.js
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
canary
bench/basic-app/app/ui/dropdown.js
50 строк
1 KB
dan
Add more realistic bench fixtures (#95807)
15 июл 2026, 14:46
Не верифицирован
15 июл 2026, 14:46
7ffacec
Код
Авторство
О чём код?
'use client' import { describeUtils } from './vendor-util' import { useState, useRef, useEffect } from 'react' export default function Dropdown({ label, items, align = 'end' }) { const [open, setOpen] = useState(false) const ref = useRef(null) useEffect(() => { if (!open) return const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false) } document.addEventListener('mousedown', onDoc) return () => document.removeEventListener('mousedown', onDoc) }, [open]) return ( <span className="dropdown" ref={ref}> <button type="button" className="dropdown-trigger" aria-haspopup="menu" aria-expanded={open} onClick={() => setOpen(!open)} > {label} </button> {open ? ( <ul className={'dropdown-menu align-' + align} role="menu"> {items.map((item) => typeof item === 'string' ? ( <li key={item} role="menuitem" className="dropdown-item"> {item} </li> ) : ( <li key={item.label} role="menuitem" className="dropdown-item flex items-center gap-2" > {item.icon} {item.label} </li> ) )} </ul> ) : null} </span> ) } export const __layers = [describeUtils].length