logo dile-components dile-components

dile-selector-overlay

Web Component to create a selector interface, like dile-selector, but hidden behind a capsule-shaped trigger button that opens the options in an overlay menu instead of showing them inline.

Internally it's built by combining three existing components:

Installation

npm i @dile/ui

Usage

Import the component.

import '@dile/ui/components/selector/selector-overlay.js';
import '@dile/ui/components/selector/selector-item.js';

Use the component. Its children must be <dile-selector-item> elements, exactly like dile-selector.

<dile-selector-overlay selected="1">
  <dile-selector-item>One</dile-selector-item>
  <dile-selector-item>Two</dile-selector-item>
  <dile-selector-item>Three</dile-selector-item>
</dile-selector-overlay>

Properties

Inherited from the dile-selector-mixin (DileSelectable), same as dile-selector:

Specific to dile-selector-overlay:

If you set icon to a value other than the default "ellipsis-vertical", make sure the corresponding icon module is imported somewhere in your app, e.g. import '@dile/iconlib/lucide-icons/star.js';, so the custom element for that icon gets registered.

Methods

Custom Events

{
  selected: this.selected,
  selectorId: this.selectorId,
  initializationEvent,
}

Selecting an option always closes the overlay.

Styling

dile-selector-overlay doesn't define any CSS custom property of its own. To customize its appearance, use the CSS custom properties already exposed by the components it's built from:

dile-selector-overlay demos

Icon only trigger

Without a label, the trigger only shows the rounded ellipsis-vertical icon.

One Two Three Four
<script type="module">
import '@dile/ui/components/selector/selector-overlay.js';
import '@dile/ui/components/selector/selector-item.js';
</script>
<dile-selector-overlay selected="1">
  <dile-selector-item>One</dile-selector-item>
  <dile-selector-item>Two</dile-selector-item>
  <dile-selector-item>Three</dile-selector-item>
  <dile-selector-item>Four</dile-selector-item>
</dile-selector-overlay>

Fixed trigger label

By default the label stays constant (e.g. "Menu"), regardless of which option gets selected.

Users Posts Articles FAQ
<dile-selector-overlay label="Menu" selected="posts" attrForSelected="name">
  <dile-selector-item icon="star" name="users">Users</dile-selector-item>
  <dile-selector-item icon="star" name="posts">Posts</dile-selector-item>
  <dile-selector-item icon="star" name="articles">Articles</dile-selector-item>
  <dile-selector-item icon="star" name="faq">FAQ</dile-selector-item>
</dile-selector-overlay>

Trigger label follows the selection

Set dynamicLabel so the trigger label automatically shows the text of the selected option, with no extra wiring needed. Try selecting a different option.

Users Posts Articles FAQ
<dile-selector-overlay dynamicLabel selected="posts" attrForSelected="name">
  <dile-selector-item icon="star" name="users">Users</dile-selector-item>
  <dile-selector-item icon="star" name="posts">Posts</dile-selector-item>
  <dile-selector-item icon="star" name="articles">Articles</dile-selector-item>
  <dile-selector-item icon="star" name="faq">FAQ</dile-selector-item>
</dile-selector-overlay>

Custom icon

The default ellipsis-vertical icon is always included. If you want to use a different icon, import its module and set it through the icon property.

One Two Three
<script type="module">
import '@dile/iconlib/lucide-icons/star.js';
</script>
<dile-selector-overlay icon="star">
  <dile-selector-item>One</dile-selector-item>
  <dile-selector-item>Two</dile-selector-item>
  <dile-selector-item>Three</dile-selector-item>
</dile-selector-overlay>

Custom position

One Two Three
<div style="text-align: right;">
  <dile-selector-overlay horizontalAlign="left" verticalAlign="center">
    <dile-selector-item>One</dile-selector-item>
    <dile-selector-item>Two</dile-selector-item>
    <dile-selector-item>Three</dile-selector-item>
  </dile-selector-overlay>
</div>