<script lang="ts" module>
export interface AutocompleteItem {
label: string;
description?: string;
icon?: string;
}
</script>
<script lang="ts">
let {
items,
visible,
selectedIndex = 0,
onselect
}: {
items: AutocompleteItem[];
visible: boolean;
selectedIndex?: number;
onselect: (item: AutocompleteItem) => void;
} = $props();
</script>
{#if visible && items.length > 0}
<div class="autocomplete-popup" role="listbox" aria-label="Suggestions">
{#each items as item, i}
<div
class="autocomplete-item"
class:selected={i === selectedIndex}
onclick={() => onselect(item)}
onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') onselect(item); }}
role="option"
aria-selected={i === selectedIndex}
tabindex="-1"
>
{#if item.icon}<span class="item-icon">{item.icon}</span>{/if}
<span class="item-label">{item.label}</span>
{#if item.description}<span class="item-desc">{item.description}</span>{/if}
</div>
{/each}
</div>
{/if}
<style>
.autocomplete-popup {
position: absolute;
bottom: 100%;
left: 0;
right: 0;
background: var(--bg-elevated);
border: 1px solid var(--border);
max-height: 300px;
overflow-y: auto;
z-index: 50;
font-family: var(--font-mono);
font-size: 0.875rem;
}
.autocomplete-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.375rem 0.75rem;
cursor: pointer;
color: var(--fg);
}
.autocomplete-item:hover,
.autocomplete-item.selected {
background: var(--accent);
color: var(--bg);
}
.item-icon {
flex-shrink: 0;
}
.item-label {
flex: 1;
}
.item-desc {
color: var(--fg-dim);
font-size: 0.75rem;
}
.autocomplete-item.selected .item-desc,
.autocomplete-item:hover .item-desc {
color: inherit;
opacity: 0.7;
}
</style>