'; } else if (menuContainer.querySelector(".empty-state")) { rebuildMenu(); } focusedIndex = -1; updateFocus(); } function rebuildMenu() { menuContainer.innerHTML = ""; menuItems.forEach(item => { menuContainer.appendChild(item.cloneNode(true)); }); attachMenuItemListeners(); } function updateFocus() { const visibleItems = Array.from(menuItems).filter(item => !item.classList.contains("hidden")); visibleItems.forEach((item, index) => { if (index === focusedIndex) { item.classList.add("focused"); } else { item.classList.remove("focused"); } }); } function selectItem(item) { const value = item.textContent; searchInput.value = value; if (isControlled) { controlledValue = value; updateValueDisplay(); } updateClearButton(); searchInput.focus(); } function updateValueDisplay() { if (isControlled) { const display = document.getElementById("controlled-value"); if (display) { display.textContent = `Current value: ${controlledValue}`; } } } function attachMenuItemListeners() { menuContainer.querySelectorAll(".menu-item").forEach(item => { item.addEventListener("click", () => selectItem(item)); item.addEventListener("mouseenter", () => { const visibleItems = Array.from(menuContainer.querySelectorAll(".menu-item")).filter(i => !i.classList.contains("hidden")); focusedIndex = visibleItems.indexOf(item); updateFocus(); }); }); } searchInput.addEventListener("input", () => { if (isControlled) { controlledValue = searchInput.value; updateValueDisplay(); } updateClearButton(); filterItems(); }); searchInput.addEventListener("keydown", (e) => { const visibleItems = Array.from(menuItems).filter(item => !item.classList.contains("hidden")); switch (e.key) { case "ArrowDown": e.preventDefault(); focusedIndex = Math.min(focusedIndex + 1, visibleItems.length - 1); updateFocus(); break; case "ArrowUp": e.preventDefault(); focusedIndex = Math.max(focusedIndex - 1, -1); updateFocus(); break; case "Enter": e.preventDefault(); if (focusedIndex >= 0 && visibleItems[focusedIndex]) { selectItem(visibleItems[focusedIndex]); } break; case "Escape": focusedIndex = -1; updateFocus(); searchInput.blur(); break; } }); clearButton.addEventListener("click", () => { searchInput.value = ""; if (isControlled) { controlledValue = ""; updateValueDisplay(); } updateClearButton(); filterItems(); searchInput.focus(); }); updateClearButton(); attachMenuItemListeners(); } function createAsyncAutocomplete() { const searchInput = document.getElementById("async-search"); const menuContainer = document.getElementById("async-menu"); const clearButton = document.getElementById("async-clear"); let debounceTimer; let focusedIndex = -1; function updateClearButton() { if (searchInput.value.length > 0) { clearButton.classList.add("visible"); } else { clearButton.classList.remove("visible"); } } async function searchCharacters(query) { if (!query.trim()) { menuContainer.innerHTML = '
Start typing to search...
'; return; } menuContainer.innerHTML = '
Loading...
'; try { const response = await fetch(`https://swapi.py4e.com/api/people/?search=${encodeURIComponent(query)}`); const data = await response.json(); if (data.results.length === 0) { menuContainer.innerHTML = '
No results found
'; } else { menuContainer.innerHTML = data.results.map(character => `` ).join(""); attachAsyncMenuListeners(); } } catch (error) { menuContainer.innerHTML = '
Error loading results
'; } } function attachAsyncMenuListeners() { menuContainer.querySelectorAll(".menu-item").forEach((item, index) => { item.addEventListener("click", () => { searchInput.value = item.textContent; updateClearButton(); searchInput.focus(); }); item.addEventListener("mouseenter", () => { focusedIndex = index; updateAsyncFocus(); }); }); } function updateAsyncFocus() { const items = menuContainer.querySelectorAll(".menu-item"); items.forEach((item, index) => { if (index === focusedIndex) { item.classList.add("focused"); } else { item.classList.remove("focused"); } }); } searchInput.addEventListener("input", () => { updateClearButton(); clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { searchCharacters(searchInput.value); }, 300); }); searchInput.addEventListener("keydown", (e) => { const items = menuContainer.querySelectorAll(".menu-item"); switch (e.key) { case "ArrowDown": e.preventDefault(); focusedIndex = Math.min(focusedIndex + 1, items.length - 1); updateAsyncFocus(); break; case "ArrowUp": e.preventDefault(); focusedIndex = Math.max(focusedIndex - 1, -1); updateAsyncFocus(); break; case "Enter": e.preventDefault(); if (focusedIndex >= 0 && items[focusedIndex]) { searchInput.value = items[focusedIndex].textContent; updateClearButton(); searchInput.focus(); } break; case "Escape": focusedIndex = -1; updateAsyncFocus(); searchInput.blur(); break; } }); clearButton.addEventListener("click", () => { searchInput.value = ""; updateClearButton(); menuContainer.innerHTML = '
Start typing to search...
'; searchInput.focus(); }); updateClearButton(); } createAutocomplete("basic-search", "basic-menu", "basic-clear"); createAutocomplete("uncontrolled-search", "uncontrolled-menu", "uncontrolled-clear", { defaultValue: "Adobe XD" }); createAutocomplete("controlled-search", "controlled-menu", "controlled-clear", { controlled: true, defaultValue: "Adobe XD" }); createAsyncAutocomplete(); ' width="100%" height="1200" frameborder="0" sandbox="allow-scripts allow-same-origin allow-popups">