import { useState, useEffect, useRef } from 'preact/hooks'
// Компонент для отображения выпадающего списка
// Переменная состояния для отслеживания состояния открытия выпадающего списка
const [isOpen, setIsOpen] = useState(false)
// Ссылка на элемент выпадающего списка, позволяет отслеживать клики вне элемента
const dropdownRef = useRef(null)
// Константа для управления отступом при прокрутке
const scrollOffset = 80 // Отступ от верхней части окна
// Функция переключения видимости выпадающего списка
const toggleDropdown = () => {
// Функция прокрутки страницы до нужного элемента с учетом отступа
const handleScroll = (e, targetId, offset) => {
e.preventDefault() // Предотвращает стандартное поведение ссылки
const targetElement = document.getElementById(targetId) // Получение целевого элемента по ID
const rect = targetElement.getBoundingClientRect() // Позиция элемента относительно окна
const scrollToPosition = window.scrollY + rect.top - offset // Вычисление позиции прокрутки
window.scrollTo({ top: scrollToPosition, behavior: 'smooth' }) // Плавная прокрутка
setIsOpen(false) // Закрытие выпадающего списка после прокрутки
// Использование эффекта для добавления и удаления слушателя событий
// Закрытие выпадающего списка при клике вне его области
const handleClickOutside = (event) => {
// Проверка, если клик был вне элемента
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
setIsOpen(false) // Закрыть выпадающий список
// Добавление слушателя для отслеживания кликов по документу
document.addEventListener('mousedown', handleClickOutside)
// Удаление слушателя при размонтировании компонента
document.removeEventListener('mousedown', handleClickOutside)
}, []) // Пустой массив зависимостей, эффект выполняется только при монтировании и размонтировании
className="relative inline-block text-left"
className="inline-flex w-full cursor-pointer justify-center rounded-full border border-slate-200 bg-white p-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none"
onClick={toggleDropdown}>
className="hs-collapse-open:hidden shrink-0 size-3.5"
xmlns="http://www.w3.org/2000/svg"
<ul className="ring-opacity-5 absolute right-0 mt-2 w-36 origin-top-right rounded-md bg-white shadow-lg shadow-blue-600/15 focus:outline-none">
className="block px-4 py-2 text-sm text-gray-700 hover:bg-slate-50"
onClick={(e) => handleScroll(e, 'about', scrollOffset)}>
className="block px-4 py-2 text-sm text-gray-700 hover:bg-slate-50"
onClick={(e) => handleScroll(e, 'projects', scrollOffset)}>