All examples

Select states

Placeholder, disabled trigger and open list with a disabled option.

Select states

ui-select-states · texuli/Select

texuli select
Props
  • disabled
  • open
  • placeholder

Live example loads in an isolated same-origin preview frame.

Source (select/SelectStatesDemo.svelte)
<script lang="ts">
import { Select } from 'texuli/select';

const items = [
  { value: 'open', label: 'Open' },
  { value: 'hold', label: 'On hold', disabled: true },
  { value: 'done', label: 'Done' },
];
</script>

<section data-example="ui-select-states" class="demo" aria-label="Select states">
  <h2>States</h2>
  <div class="row">
    <div>
      <h3>Placeholder</h3>
      <Select.Root value="" {items}>
        <Select.Trigger aria-label="Status placeholder">
          <Select.Value placeholder="Pick a status" />
        </Select.Trigger>
        <Select.Portal>
          <Select.Content>
            <Select.Viewport>
              {#each items as item (item.value)}
                <Select.Item value={item.value} label={item.label} disabled={item.disabled}
                  >{item.label}</Select.Item
                >
              {/each}
            </Select.Viewport>
          </Select.Content>
        </Select.Portal>
      </Select.Root>
    </div>
    <div>
      <h3>Disabled</h3>
      <Select.Root value="open" disabled {items}>
        <Select.Trigger aria-label="Status disabled">
          <Select.Value />
        </Select.Trigger>
        <Select.Portal>
          <Select.Content>
            <Select.Viewport>
              {#each items as item (item.value)}
                <Select.Item value={item.value} label={item.label}>{item.label}</Select.Item>
              {/each}
            </Select.Viewport>
          </Select.Content>
        </Select.Portal>
      </Select.Root>
    </div>
    <div>
      <h3>Open with disabled option</h3>
      <Select.Root value="open" open {items}>
        <Select.Trigger aria-label="Status open">
          <Select.Value />
        </Select.Trigger>
        <Select.Portal>
          <Select.Content>
            <Select.Viewport>
              {#each items as item (item.value)}
                <Select.Item value={item.value} label={item.label} disabled={item.disabled}
                  >{item.label}</Select.Item
                >
              {/each}
            </Select.Viewport>
          </Select.Content>
        </Select.Portal>
      </Select.Root>
    </div>
  </div>
</section>

<style>
  .demo {
    display: grid;
    gap: 1rem;
    padding: 1.5rem;
    min-block-size: 16rem;
    color: var(--tx-foreground, CanvasText);
    background: var(--tx-background, Canvas);
  }
  h2,
  h3 {
    margin: 0;
  }
  h3 {
    font-size: 0.875rem;
    margin-block-end: 0.5rem;
    color: var(--tx-muted-foreground, GrayText);
  }
  .row {
    display: flex;
    flex-wrap: wrap;
    gap: 1.75rem;
    align-items: flex-start;
  }
  .demo :global(.tx-select-root) {
    min-inline-size: 12rem;
  }
</style>