Select (Attachment)

A custom Select built entirely natively without heavy components. Using the **Builder Pattern** with Svelte 5 @attach, a readonly <input> acts as the trigger and a <ul> popover acts as the menu.

Usage

select-attach.svelte
<script>
  import { buildSelect } from '$lib/attachments/select.svelte';

  const mySelect = buildSelect();
  let selectedValue = $state('Option 1');
</script>

<label class="block">
  <span class="input-label">Custom Select</span>
  <div class="input-group">
    <!-- Trigger -->
    <input
      {@attach mySelect.trigger}
      value={selectedValue}
      class="input-base cursor-pointer"
    />
    <div class="input-icon">
      <ChevronDown size={18} />
    </div>
  </div>
</label>

<!-- Popover Menu -->
<ul {@attach mySelect.popover} class="select-popover">
  <li>
    <button type="button" {@attach mySelect.item} onclick={() => selectedValue = 'Option 1'} class="select-item">
      Option 1
    </button>
  </li>
  <li>
    <button type="button" {@attach mySelect.item} onclick={() => selectedValue = 'Option 2'} class="select-item">
      Option 2
    </button>
  </li>
</ul>