Skip to content

Multi-Select

A custom multi-select dropdown with chip display, validation states, and optional icons.

Alpine.js Required

This component requires Alpine.js to be loaded in your layout for interactive behavior (opening/closing the dropdown, adding/removing chips). See the installation guide for setup instructions.

Basic Usage

blade
<x-basekit-ui::multi-select
    name="tags"
    label="Tags"
    :options="[
        'laravel' => 'Laravel',
        'vue' => 'Vue.js',
        'tailwind' => 'Tailwind CSS',
    ]"
/>

Props

PropTypeDefaultDescription
optionsarray[]Value-label option pairs
valuearray[]Selected values
variantstring'secondary'Visual style: primary, secondary, success, warning, info, ghost
sizestring'md'Control size: sm, md, lg
labelstringnullLabel text
errorstringnullError message shown below the field
hintstringnullHelper text shown below the field
iconstringnullHeroicon name rendered inside the control
placeholderstring'Select options'Placeholder text when nothing is selected
corner-hintstringnullTop-right label row hint
label-stylestring'default'Label placement: default, inset, overlap
control-stylestring'default'Control style: default, pill, underline

Pass name="tags" or name="tags[]"; the component normalizes hidden inputs to array submission format automatically.

Slots

SlotDescription
labelCustom label markup
errorCustom error markup
hintCustom helper text
iconCustom icon markup

Variants

Supported variants: primary, secondary, success, warning, info, ghost.

blade
@php
$options =[
    'active' => 'Active',
    'inactive' => 'Inactive',
];
@endphp

<x-basekit-ui::multi-select name="primary" variant="primary" :options="$options" />
<x-basekit-ui::multi-select name="secondary" variant="secondary" :options="$options" />
<x-basekit-ui::multi-select name="success" variant="success" :options="$options" />
<x-basekit-ui::multi-select name="warning" variant="warning" :options="$options" />
<x-basekit-ui::multi-select name="info" variant="info" :options="$options" />
<x-basekit-ui::multi-select name="ghost" variant="ghost" :options="$options" />

Sizes

Supported sizes: sm,md,lg.

blade
@php
$options =[
    'small' => 'Small',
    'medium' => 'Medium',
    'large' => 'Large',
];
@endphp

<x-basekit-ui::multi-select name="small" size="sm" :options="$options" :value="['small']" />
<x-basekit-ui::multi-select name="medium" size="md" :options="$options" :value="['medium']" />
<x-basekit-ui::multi-select name="large" size="lg" :options="$options" :value="['large']" />

With Icon

With Heroicon

Pass any Heroicon name via the icon prop:

blade
<x-basekit-ui::multi-select
    name="locations"
    label="Locations"
    icon="map-pin"
    :options="[
        'bud' => 'Budapest',
        'vie' => 'Vienna',
        'pra' => 'Prague',
    ]"
/>

Using Icon Slot

blade
@php
$options =[
    'ny' => 'New York',
    'ldn' => 'London',
    'bud' => 'Budapest',
];
@endphp


<x-basekit-ui::multi-select name="custom-icon" label="Custom Icon" :options="$options">
    <x-slot:icon>
        <x-heroicon-o-tag class="w-4 h-4" />
    </x-slot:icon>
</x-basekit-ui::multi-select>

With Selected Values

blade
<x-basekit-ui::multi-select
    name="frameworks"
    :value="['laravel', 'vue']"
    :options="[
        'laravel' => 'Laravel',
        'vue' => 'Vue.js',
        'alpine' => 'Alpine.js',
        'tailwind' => 'Tailwind CSS',
    ]"
/>

Label Styles

blade
@php
$options =[
    'active' => 'Active',
    'inactive' => 'Inactive',
];
@endphp

<x-basekit-ui::multi-select name="status" label="Status" label-style="inset" :options="$options" />
<x-basekit-ui::multi-select name="roles" label="Roles" label-style="overlap" :options="$options" />
<x-basekit-ui::multi-select name="interests" control-style="pill" :options="$options" />
<x-basekit-ui::multi-select name="tiers" label="Tiers" control-style="underline" :options="$options" />

Validation State

blade
@php
$options =[
    'laravel' => 'Laravel',
    'vue' => 'Vue.js',
    'tailwind' => 'Tailwind CSS',
];
@endphp

<x-basekit-ui::multi-select
    name="tags"
    label="Tags"
    error="Please select at least one tag"
    :options="$options"
/>

Disabled State

blade
@php
$options =[
    'laravel' => 'Laravel',
    'vue' => 'Vue.js',
    'tailwind' => 'Tailwind CSS',
];
@endphp

<x-basekit-ui::multi-select
    name="disabled"
    disabled
    placeholder="This field is disabled"
    :options="$options"
/>

Custom Classes

Override or extend styles with the class attribute:

blade
@php
$options =[
    'feature' => 'Feature',
    'bugfix' => 'Bugfix',
    'chore' => 'Chore',
];
@endphp

<x-basekit-ui::multi-select
    name="custom-tags"
    label="Tags"
    :options="$options"
    class="mt-2"
/>

CSS Variables

Customize multi-select appearance via CSS variables:

css
:root {
  /* Multi Select - Base */
  --multiselect-color: var(--color-slate-900);
  --multiselect-placeholder-color: var(--color-slate-400);
  --multiselect-border-color: var(--color-slate-300);
  --multiselect-border-radius: var(--radius-md, 0.375rem);
  --multiselect-bg: var(--surface-base);
  --multiselect-font-family: inherit;
  --multiselect-line-height: 1.5;
  --multiselect-transition:
    border-color var(--transition-fast) ease-in-out,
    box-shadow var(--transition-fast) ease-in-out;

  /* Multi Select -  States */
  --multiselect-hover-border-color: var(--color-slate-400);
  --multiselect-focus-border-color: var(--color-primary-500);
  --multiselect-focus-ring-color: var(--color-primary-100);
  --multiselect-focus-ring-width: 2px;

  --multiselect-disabled-bg: var(--color-slate-50);
  --multiselect-disabled-color: var(--color-slate-500);
  --multiselect-disabled-border-color: var(--color-slate-200);

  --multiselect-error-border-color: var(--color-danger-500);
  --multiselect-error-ring-color: var(--color-danger-100);
  --multiselect-error-color: var(--color-danger-700);

  /* Multi Select - Variants */
  --multiselect-primary-border-color: var(--color-primary-500);
  --multiselect-primary-ring-color: var(--color-primary-100);

  --multiselect-secondary-border-color: var(--color-slate-300);
  --multiselect-secondary-ring-color: var(--color-slate-100);

  --multiselect-success-border-color: var(--color-success-500);
  --multiselect-success-ring-color: var(--color-success-100);

  --multiselect-warning-border-color: var(--color-warning-500);
  --multiselect-warning-ring-color: var(--color-warning-100);

  --multiselect-danger-border-color: var(--color-danger-500);
  --multiselect-danger-ring-color: var(--color-danger-100);

  --multiselect-info-border-color: var(--color-info-500);
  --multiselect-info-ring-color: var(--color-info-100);

  --multiselect-ghost-border-color: transparent;
  --multiselect-ghost-ring-color: var(--color-slate-100);
  --multiselect-ghost-bg: transparent;

  /* Multi Select - Sizes */
  --multiselect-py-sm: 0.375rem;
  --multiselect-px-sm: 0.75rem;
  --multiselect-fs-sm: 0.875rem;

  --multiselect-py-md: 0.5rem;
  --multiselect-px-md: 0.875rem;
  --multiselect-fs-md: 0.9375rem;

  --multiselect-py-lg: 0.75rem;
  --multiselect-px-lg: 1rem;
  --multiselect-fs-lg: 1rem;

  /* Multi Select - Chip */
  --multiselect-chip-bg: var(--color-slate-100);
  --multiselect-chip-text: var(--color-slate-700);
  --multiselect-chip-border: var(--color-slate-200);

  /* Multi Select - Menu */
  --multiselect-menu-bg: var(--surface-base);
  --multiselect-menu-border: var(--color-slate-200);
  --multiselect-menu-shadow: var(--shadow-lg);
  --multiselect-option-hover: var(--color-slate-50);
  --multiselect-option-check-bg: var(--surface-base);
  --multiselect-option-check-inset: var(--surface-base);
}

Configuration

Configure defaults in config/basekit-laravel-ui.php:

php
'multi-select' => [
    'enabled' => true,
    'variants' => ['primary', 'secondary', 'success', 'warning', 'info', 'ghost'],
    'sizes' => ['sm', 'md', 'lg'],
    'default_variant' => 'secondary',
    'default_size' => 'md',
],

Released under the MIT License.