Skip to content
Navigation

Combobox

Added 14 October 2026

React

Codecomponents/react/combobox-demo.tsx
import {
    Combobox,
    ComboboxChip,
    ComboboxChips,
    ComboboxChipsInput,
    ComboboxContent,
    ComboboxEmpty,
    ComboboxInput,
    ComboboxItem,
    ComboboxList,
    ComboboxValue,
    Label,
} from '@stroeer-labs/design-library/react';

const frameworks = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'];

export function ComboboxDemo() {
    return (
        <div className="space-y-6">
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Default</p>
                <div className="grid gap-1.5">
                    <Label htmlFor="combobox-default">Framework</Label>
                    <Combobox items={frameworks}>
                        <ComboboxInput id="combobox-default" placeholder="Select a framework..." className="w-56" />
                        <ComboboxContent>
                            <ComboboxEmpty>No framework found.</ComboboxEmpty>
                            <ComboboxList>
                                {(item: string) => (
                                    <ComboboxItem key={item} value={item}>
                                        {item}
                                    </ComboboxItem>
                                )}
                            </ComboboxList>
                        </ComboboxContent>
                    </Combobox>
                </div>
            </div>

            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Multiple</p>
                <div className="grid gap-1.5">
                    <Label htmlFor="combobox-multiple">Frameworks</Label>
                    <Combobox items={frameworks} multiple>
                        <ComboboxChips className="w-72">
                            <ComboboxValue>
                                {(value: Array<string>) => (
                                    <>
                                        {value.map((item) => (
                                            <ComboboxChip key={item} aria-label={item}>
                                                {item}
                                            </ComboboxChip>
                                        ))}
                                        <ComboboxChipsInput id="combobox-multiple" placeholder={value.length > 0 ? '' : 'Select frameworks...'} />
                                    </>
                                )}
                            </ComboboxValue>
                        </ComboboxChips>
                        <ComboboxContent>
                            <ComboboxEmpty>No framework found.</ComboboxEmpty>
                            <ComboboxList>
                                {(item: string) => (
                                    <ComboboxItem key={item} value={item}>
                                        {item}
                                    </ComboboxItem>
                                )}
                            </ComboboxList>
                        </ComboboxContent>
                    </Combobox>
                </div>
            </div>

            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">With clear button</p>
                <div className="grid gap-1.5">
                    <Label htmlFor="combobox-clear">Framework</Label>
                    <Combobox items={frameworks}>
                        <ComboboxInput id="combobox-clear" placeholder="Select a framework..." className="w-56" showClear />
                        <ComboboxContent>
                            <ComboboxEmpty>No framework found.</ComboboxEmpty>
                            <ComboboxList>
                                {(item: string) => (
                                    <ComboboxItem key={item} value={item}>
                                        {item}
                                    </ComboboxItem>
                                )}
                            </ComboboxList>
                        </ComboboxContent>
                    </Combobox>
                </div>
            </div>

            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Disabled</p>
                <div className="grid gap-1.5">
                    <Label htmlFor="combobox-disabled">Framework</Label>
                    <Combobox items={frameworks} disabled>
                        <ComboboxInput id="combobox-disabled" placeholder="Select a framework..." className="w-56" disabled />
                        <ComboboxContent>
                            <ComboboxEmpty>No framework found.</ComboboxEmpty>
                            <ComboboxList>
                                {(item: string) => (
                                    <ComboboxItem key={item} value={item}>
                                        {item}
                                    </ComboboxItem>
                                )}
                            </ComboboxList>
                        </ComboboxContent>
                    </Combobox>
                </div>
            </div>
        </div>
    );
}

Angular

Codecomponents/angular/combobox-demo.ts
import {Component} from '@angular/core';
import {HlmComboboxImports, HlmLabel} from '@stroeer-labs/design-library/angular';

@Component({
    selector: 'dl-combobox-demo',
    standalone: true,
    imports: [HlmComboboxImports, HlmLabel],
    template: `
    <div class="space-y-6">
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Default</p>
        <div class="grid gap-1.5">
          <label hlmLabel for="combobox-default">Framework</label>
          <hlm-combobox>
            <hlm-combobox-input inputId="combobox-default" placeholder="Select a framework..." class="w-56" />
            <hlm-combobox-content *hlmComboboxPortal>
              <hlm-combobox-empty>No framework found.</hlm-combobox-empty>
              <div hlmComboboxList>
                @for (framework of frameworks; track $index) {
                  <hlm-combobox-item [value]="framework">{{ framework }}</hlm-combobox-item>
                }
              </div>
            </hlm-combobox-content>
          </hlm-combobox>
        </div>
      </div>

      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Multiple</p>
        <div class="grid gap-1.5">
          <label hlmLabel for="combobox-multiple">Frameworks</label>
          <hlm-combobox-multiple [(value)]="values">
            <hlm-combobox-chips class="w-72">
              <ng-template hlmComboboxValues let-selected>
                @for (item of selected; track $index) {
                  <hlm-combobox-chip [value]="item">{{ item }}</hlm-combobox-chip>
                }
              </ng-template>
              <input hlmComboboxChipInput id="combobox-multiple" [placeholder]="values.length > 0 ? '' : 'Select frameworks...'" />
            </hlm-combobox-chips>
            <hlm-combobox-content *hlmComboboxPortal>
              <hlm-combobox-empty>No framework found.</hlm-combobox-empty>
              <div hlmComboboxList>
                @for (framework of frameworks; track $index) {
                  <hlm-combobox-item [value]="framework">{{ framework }}</hlm-combobox-item>
                }
              </div>
            </hlm-combobox-content>
          </hlm-combobox-multiple>
        </div>
      </div>

      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">With clear button</p>
        <div class="grid gap-1.5">
          <label hlmLabel for="combobox-clear">Framework</label>
          <hlm-combobox>
            <hlm-combobox-input inputId="combobox-clear" placeholder="Select a framework..." class="w-56" showClear />
            <hlm-combobox-content *hlmComboboxPortal>
              <hlm-combobox-empty>No framework found.</hlm-combobox-empty>
              <div hlmComboboxList>
                @for (framework of frameworks; track $index) {
                  <hlm-combobox-item [value]="framework">{{ framework }}</hlm-combobox-item>
                }
              </div>
            </hlm-combobox-content>
          </hlm-combobox>
        </div>
      </div>

      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Disabled</p>
        <div class="grid gap-1.5">
          <label hlmLabel for="combobox-disabled">Framework</label>
          <hlm-combobox disabled>
            <hlm-combobox-input inputId="combobox-disabled" placeholder="Select a framework..." class="w-56" />
            <hlm-combobox-content *hlmComboboxPortal>
              <hlm-combobox-empty>No framework found.</hlm-combobox-empty>
              <div hlmComboboxList>
                @for (framework of frameworks; track $index) {
                  <hlm-combobox-item [value]="framework">{{ framework }}</hlm-combobox-item>
                }
              </div>
            </hlm-combobox-content>
          </hlm-combobox>
        </div>
      </div>
    </div>
  `,
})
export class ComboboxDemoComponent {
    readonly frameworks = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'];
    values: Array<string> = [];
}