--- layout: layouts/page.njk title: Select description: Displays a list of options for the user to pick from—triggered by a button. toc: - label: Usage id: usage children: - label: HTML id: usage-html - label: HTML + JavaScript id: usage-html-js children: - label: "Step 1: Include the JavaScript files" id: usage-html-js-1 - label: "Step 2: Add your select HTML" id: usage-html-js-2 - label: HTML structure id: usage-html-js-3 - label: JavaScript events id: usage-html-js-4 - label: JavaScript methods id: usage-html-js-5 - label: Jinja and Nunjucks id: usage-macro - label: Examples id: examples children: - label: Scrollable id: example-scrollable - label: Disabled id: example-disabled - label: With icon id: example-with-icon --- {% from "macros/code_preview.njk" import code_preview %} {% from "macros/code_block.njk" import code_block %} {% from "select.njk" import select %} {% set code_native %}{% endset %} {{ code_preview("select-native", code_native) }} {% set code_html %} {{ select( trigger_attrs={"class": "w-[180px]"}, is_combobox=true, items=[ { type: "group", label: "Fruits", items: [ { type: "item", value: "apple", label: "Apple", attrs: {"data-force": "true"} }, { type: "item", value: "banana", label: "Banana", attrs: {"data-keywords": "bread"} }, { type: "item", value: "blueberry", label: "Blueberry" }, { type: "item", value: "pineapple", label: "Grapes" }, { type: "item", value: "pineapple", label: "Pineapple" } ] } ] ) }} {% endset %} {% set code_script %} {% endset %} {{ code_preview("select", code_script | prettyHtml ~ code_html | prettyHtml) }}
If you use a <select> element, just add the select class to it or have a parent with the form class (read more about form).
You can either include the JavaScript file for all the components, or just the one for this component by adding this to the <head> of your page:
<div class="select"><button type="button" popovertarget="{ POPOVER_ID }">The trigger to open the popover, can also have the following attributes:
id="{BUTTON_ID}": linked to by the aria-labelledby attribute of the listbox.aria-haspopup="listbox": indicates that the button opens a listbox.aria-controls="{ LISTBOX_ID }": points to the listbox's id.aria-expanded="false": tracks the popover's state.aria-activedescendant="{ OPTION_ID }": points to the active option's id.<div popover class="popover" id="{ POPOVER_ID }">data-side and data-align attributes.
<div role="listbox">id="{ LISTBOX_ID }": refered to by the aria-controls attribute of the trigger.aria-labelledby="{ BUTTON_ID }": linked to by the button's id attribute.<div role="option" data-value="{ VALUE }">aria-activedescendant attribute on the trigger.<hr role="separator"> Optional<div role="group"> Optionalaria-labelledby attribute to link to a heading.<span role="heading">id attribute if you use the aria-labelledby attribute on the group.<input type="hidden" name="{ NAME }" value="{ VALUE }"> Optionalbasecoat:initializedbasecoat:initialized event on itself.basecoat:popoverbasecoat:popover event on document. Other popover components (Combobox, Dropdown Menu, Popover and Select) listen for this to close any open popovers.changechange event on itself, with the selected value in event.detail (e.g. { detail: { value: "something" }}).selectByValueYou can call this method on the component after it is initialized to select an option by value (i.e. the option with the matching data-value attribute):
You can use the select() Nunjucks or Jinja macro for this component.