Basic example
The Select component is most useful for gathering information provided by the user from a list of options. Basic select component allows you to choose from a number of options.
<select data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Hey there 👋 we want to make TW elements a community-driven project. It's open source and free, and we would like it to stay that way. If you enjoy it, help the project grow by sharing it with your peers. Every share counts, thank you!
Multiselect
Add multiple attribute to the select element to activate multiple mode.
<select data-te-select-init multiple>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
</select>
<label data-te-select-label-ref>Example label</label>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Select with label
You can add select label by adding
data-te-select-label-ref
attribute to the label element. Select
and label should be wrapped in a container.
<select data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<label data-te-select-label-ref>Example label</label>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Select with placeholder
Use data-te-select-placeholder
attribute to set placeholder for
select input. The placeholder will be displayed when input is focused and no
option is selected.
<select
data-te-select-init
data-te-select-placeholder="Example placeholder"
multiple>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Size
Change the size of select input by changing the value of
data-te-select-size
attribute.
<!--Select small-->
<select data-te-select-init data-te-select-size="sm">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<label data-te-select-label-ref>Size sm</label>
<!--Select default-->
<select data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<label data-te-select-label-ref>Size default</label>
<!--Select large-->
<select data-te-select-init data-te-select-size="lg">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<label data-te-select-label-ref>Size lg</label>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Disabled select
Add disabled
attribute to the select element to disable select
input.
<select data-te-select-init disabled>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Disabled options
Use disabled
attribute on option element to disable specific
option.
<select data-te-select-init>
<option value="1">One</option>
<option value="2" disabled>Two</option>
<option value="3" disabled>Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Clear button
Set data-te-select-clear-button
option to true to display the
button that will allow to clear current selections.
<select data-te-select-init data-te-select-clear-button="true">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Custom content
A custom content container with a class
data-te-select-custom-content-ref
will be displayed at the end
of the select dropdown.
<select data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<div class="p-4" data-te-select-custom-content-ref>
<button
class="inline-block rounded bg-primary px-4 pb-[5px] pt-[6px] text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
data-te-ripple-init
data-te-ripple-color="white">
Save
</button>
</div>
// Initialization for ES Users
import { Select, Ripple, initTE } from "tw-elements";
initTE({ Select, Ripple });
Visible options
Use data-te-select-visible-options
option to change the number
of options that will be displayed in the select dropdown without scrolling.
<select data-te-select-init data-te-select-visible-options="3">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Secondary text
Add data-te-select-secondary-text
data attribute to the
specific options to display secondary text.
<select data-te-select-init data-te-select-option-height="52">
<option value="1" data-te-select-secondary-text="Secondary text">
One
</option>
<option value="2" data-te-select-secondary-text="Secondary text">
Two
</option>
<option value="3" data-te-select-secondary-text="Secondary text">
Three
</option>
<option value="4" data-te-select-secondary-text="Secondary text">
Four
</option>
<option value="5" data-te-select-secondary-text="Secondary text">
Five
</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Search
Set data-te-select-filter
option to true
to enable
options filtering.
<select data-te-select-init data-te-select-filter="true">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
<option value="9">Nine</option>
<option value="10">Ten</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Select with search inside a modal
Due to a focus trap in modals, it is not possible to focus the outer
elements (like select dropdown). You can use select
data-te-select-container
option to resolve this problem.
The data-te-select-container
accepts selector of the element
inside of wich select dropdown will be rendered. In this case, the selector
should point to the modal container (the element with attribute
data-te-modal-init
). It is important to use a unique selector
to assign select to a specific modal.
Modal title
<!-- Button trigger modal -->
<button
type="button"
class="inline-block rounded bg-primary px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
data-te-toggle="modal"
data-te-target="#exampleModal"
data-te-ripple-init
data-te-ripple-color="light">
Launch demo modal
</button>
<!-- Modal -->
<div
data-te-modal-dialog-ref
class="pointer-events-none relative w-auto translate-y-[-50px] opacity-0 transition-all duration-300 ease-in-out min-[576px]:mx-auto min-[576px]:mt-7 min-[576px]:max-w-[500px]">
<div
class="min-[576px]:shadow-[0_0.5rem_1rem_rgba(#000, 0.15)] pointer-events-auto relative flex w-full flex-col rounded-md border-none bg-white bg-clip-padding text-current shadow-lg outline-none dark:bg-zinc-600">
<div
class="min-[576px]:shadow-[0_0.5rem_1rem_rgba(#000, 0.15)] pointer-events-auto relative flex w-full flex-col rounded-md border-none bg-white bg-clip-padding text-current shadow-lg outline-none dark:bg-neutral-700">
<div
class="flex flex-shrink-0 items-center justify-between rounded-t-md border-b-2 border-neutral-100 border-opacity-100 p-4 dark:border-opacity-50">
<h5
class="text-xl font-medium leading-normal text-neutral-800 dark:text-neutral-200"
id="exampleModalLabel">
Modal title
</h5>
<button
type="button"
class="-my-2 -mr-2 ml-auto box-content h-4 w-4 rounded-none border-none p-2 hover:no-underline hover:opacity-75 focus:opacity-100 focus:shadow-none focus:outline-none"
data-te-modal-dismiss
aria-label="Close">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor">
<path
d="M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z" />
</svg>
</button>
</div>
<div class="relative flex-auto p-4" data-te-modal-body-ref>
<select
data-te-select-init
data-te-container="#exampleModal"
data-te-select-filter="true">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
<option value="9">Nine</option>
<option value="10">Ten</option>
</select>
</div>
<div
class="flex flex-shrink-0 flex-wrap items-center justify-end border-t-2 border-neutral-100 border-opacity-100 p-4 dark:border-opacity-50">
<button
type="button"
class="inline-block rounded bg-primary-100 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-primary-700 transition duration-150 ease-in-out hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200"
data-te-modal-dismiss
data-te-ripple-init
data-te-ripple-color="light">
Close
</button>
<button
type="button"
class="ml-1 inline-block rounded bg-primary px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
data-te-ripple-init
data-te-ripple-color="light">
Save changes
</button>
</div>
</div>
</div>
</div>
// Initialization for ES Users
import { Select, Ripple, Modal, initTE } from "tw-elements";
initTE({ Select, Ripple, Modal });
Option groups
It is possible to group options by using optgroup
element.
<select data-te-select-init>
<optgroup label="Label 1">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</optgroup>
<optgroup label="Label 2">
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
</optgroup>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Select with icons
Add data-te-select-icon
data attribute to the specific options
to display the option icon.
<select data-te-select-init>
<option
value="1"
data-te-select-icon="https://tecdn.b-cdn.net/img/Photos/Avatars/avatar-1.webp">
One
</option>
<option
value="2"
data-te-select-icon="https://tecdn.b-cdn.net/img/Photos/Avatars/avatar-2.webp">
Two
</option>
<option
value="3"
data-te-select-icon="https://tecdn.b-cdn.net/img/Photos/Avatars/avatar-3.webp">
Three
</option>
<option
value="4"
data-te-select-icon="https://tecdn.b-cdn.net/img/Photos/Avatars/avatar-4.webp">
Four
</option>
<option
value="5"
data-te-select-icon="https://tecdn.b-cdn.net/img/Photos/Avatars/avatar-5.webp">
Five
</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Set value
The setValue
method allows to programatically set the component
selections.
Single selection
Add single value string to the arguments list to correctly select option with corresponding value in single selection mode.
<select id="singleSelection" data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
import { Select, initTE } from "tw-elements";
initTE({ Select });
const singleSelect = document.querySelector("#singleSelection");
const singleSelectInstance = Select.getInstance(singleSelect);
singleSelectInstance.setValue("4");
const singleSelect = document.querySelector("#singleSelection");
const singleSelectInstance = te.Select.getInstance(singleSelect);
singleSelectInstance.setValue("4");
Multi selection
Add array of string values to the arguments list to correctly select option with corresponding value in multi selection mode.
<select id="multiSelection" data-te-select-init multiple>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
import { Select, initTE } from "tw-elements";
initTE({ Select });
const multiSelect = document.querySelector("#multiSelection");
const multiSelectInstance = Select.getInstance(multiSelect);
multiSelectInstance.setValue(["3", "4", "5"]);
const multiSelect = document.querySelector("#multiSelection");
const multiSelectInstance = te.Select.getInstance(multiSelect);
multiSelectInstance.setValue(["3", "4", "5"]);
Select with toggle element
If you want to toggle Select via button, you have to add
data-te-select-toggle
attribute to this button with ID of the
Select element.
<select data-te-select-init multiple id="mySelect">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</select>
<button
id="toggleMySelect"
class="mt-4 inline-block rounded bg-primary px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-white shadow-[0_4px_9px_-4px_#3b71ca] transition duration-150 ease-in-out hover:bg-primary-600 hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:bg-primary-600 focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] focus:outline-none focus:ring-0 active:bg-primary-700 active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.3),0_4px_18px_0_rgba(59,113,202,0.2)] dark:shadow-[0_4px_9px_-4px_rgba(59,113,202,0.5)] dark:hover:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:focus:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)] dark:active:shadow-[0_8px_9px_-4px_rgba(59,113,202,0.2),0_4px_18px_0_rgba(59,113,202,0.1)]"
data-te-select-toggle="mySelect">
Toggle Select
</button>
import { Select, initTE } from "tw-elements";
initTE({ Select });
const selectEl = document.getElementById("mySelect");
const select = Select.getInstance(selectEl);
document.getElementById("toggleMySelect").onclick = function () {
select.open();
};
const selectEl = document.getElementById("mySelect");
const select = te.Select.getInstance(selectEl);
document.getElementById("toggleMySelect").onclick = function () {
select.open();
};
Auto select
Set autoSelect
option to
data-te-select-auto-select
to enable selecting on Tab press.
<select data-te-select-init data-te-select-auto-select="true">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
</select>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Hidden selected option
Add the first option with the hidden and selected attributes and an empty value to leave select with no selection.
<select data-te-select-init>
<option value="" hidden selected></option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
</select>
<label data-te-select-label-ref>Example label</label>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });
Select with CSS classes
In order to use select with additional CSS classes you need to place it in
the div
wrapper and use CSS classes on that div.
<div class="mb-3 shadow-xl xl:w-96">
<select data-te-select-init>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
<option value="7">Seven</option>
<option value="8">Eight</option>
</select>
<label data-te-select-label-ref>Example label</label>
</div>
// Initialization for ES Users
import { Select, initTE } from "tw-elements";
initTE({ Select });