Corex. ToggleGroup
(Corex v0.1.1)
View Source
Phoenix implementation of Zag.js Toggle Group.
Anatomy
Minimal
<.toggle_group class="toggle-group">
<:item value="lorem">Lorem</:item>
<:item value="duis">Duis</:item>
<:item value="donec">Donec</:item>
</.toggle_group>With indicator
<.toggle_group class="toggle-group">
<:item value="bold">
<.heroicon name="hero-bold" />
Bold
</:item>
</.toggle_group>
<.toggle_group class="toggle-group">
<:item value="bold" aria_label="Bold">
<.heroicon name="hero-bold" />
<span class="sr-only">Bold</span>
</:item>
</.toggle_group>Single selection
Set multiple={false} so only one item can be selected at a time.
<.toggle_group
class="toggle-group"
multiple={false}
value={["duis"]}
>
<:item value="lorem">Lorem</:item>
<:item value="duis">Duis</:item>
<:item value="donec">Donec</:item>
</.toggle_group>API
Requires a stable id on <.toggle_group>.
| Function | Action | Returns |
|---|---|---|
set_value/2 | Set selected values (client) | %Phoenix.LiveView.JS{} |
set_value/3 | Set selected values (server) | socket |
Events
Pick an event name and pass it to on_* on <.toggle_group>.
Server events
| Event | When | Payload |
|---|---|---|
on_value_change="toggle_group_changed" | Selected values change | %{"id" => id, "value" => values} — list of selected item value strings |
on_value_change
<.toggle_group
class="toggle-group"
on_value_change="toggle_group_changed"
multiple
>
<:item value="lorem">Lorem</:item>
<:item value="duis">Duis</:item>
<:item value="donec">Donec</:item>
</.toggle_group>def handle_event("toggle_group_changed", %{"id" => id, "value" => value}, socket) do
{:noreply, assign(socket, :toggle_group_value, value)}
endClient events
| Event | When | event.detail |
|---|---|---|
on_value_change_client="toggle-group-changed" | Selected values change | id, value |
on_value_change_client
<.toggle_group
id="toggle-group-events-client"
class="toggle-group"
on_value_change_client="toggle-group-changed"
multiple
>
<:item value="lorem">Lorem</:item>
<:item value="duis">Duis</:item>
<:item value="donec">Donec</:item>
</.toggle_group>const el = document.getElementById("toggle-group-events-client");
el?.addEventListener("toggle-group-changed", (event) => console.log(event.detail));Patterns
Controlled
For server-owned selection, set controlled, bind value, and handle on_value_change in LiveView.
<.toggle_group
class="toggle-group"
value={@value}
multiple
controlled
on_value_change="toggle_group_pattern"
>
<:item value="lorem">Lorem</:item>
<:item value="duis">Duis</:item>
<:item value="donec">Donec</:item>
</.toggle_group>def mount(_params, _session, socket) do
{:ok, assign(socket, :value, ["lorem"])}
end
def handle_event("toggle_group_pattern", %{"value" => v}, socket) do
{:noreply, assign(socket, :value, v || [])}
endStyle
Target parts with data-scope and data-part, or use Corex Design: import tokens and toggle-group.css, then set class="toggle-group" on <.toggle_group>.
[data-scope="toggle-group"][data-part="root"] {}
[data-scope="toggle-group"][data-part="item"] {}@import "../corex/main.css";
@import "../corex/tokens/themes/neo/light.css";
@import "../corex/components/toggle-group.css";Stack modifiers on the host (class on <.toggle_group>).
Color
| Modifier | Classes |
|---|---|
| Default | toggle-group |
| Accent | toggle-group toggle-group--accent |
| Brand | toggle-group toggle-group--brand |
| Alert | toggle-group toggle-group--alert |
| Info | toggle-group toggle-group--info |
| Success | toggle-group toggle-group--success |
Size
| Modifier | Classes |
|---|---|
| SM | toggle-group toggle-group--sm |
| MD | toggle-group toggle-group--md |
| LG | toggle-group toggle-group--lg |
| XL | toggle-group toggle-group--xl |
Rounded
| Modifier | Classes |
|---|---|
| None | toggle-group toggle-group--rounded-none |
| SM | toggle-group toggle-group--rounded-sm |
| MD | toggle-group toggle-group--rounded-md |
| LG | toggle-group toggle-group--rounded-lg |
| XL | toggle-group toggle-group--rounded-xl |
| Full | toggle-group toggle-group--rounded-full |
Summary
Components
Renders a toggle group component.
API
Set selected values from a control (phx-click). Pass a list of item value strings (or compatible input validated by the component).
Set selected values from handle_event.
Components
Renders a toggle group component.
Attributes
id(:string) - The id of the toggle group, useful for API to identify the toggle group.value(:list) - The initial value or the controlled value of the toggle group, must be a list of strings. Defaults to[].controlled(:boolean) - Whether the toggle group is controlled. Defaults tofalse.deselectable(:boolean) - Whether the toggle group is deselectable. Defaults tofalse.loopFocus(:boolean) - Whether the toggle group is loopFocus. Defaults totrue.rovingFocus(:boolean) - Whether the toggle group is rovingFocus. Defaults totrue.disabled(:boolean) - Whether the toggle group is disabled. Defaults tofalse.multiple(:boolean) - Whether the toggle group allows multiple items to be selected. Defaults totrue.orientation(:string) - The orientation of the toggle group. Defaults to"horizontal". Must be one of"horizontal", or"vertical".dir(:string) - The direction of the toggle group. When nil, derived from document (html lang + config :rtl_locales). Defaults tonil. Must be one ofnil,"ltr", or"rtl".on_value_change(:string) - The server event name when the value change. Defaults tonil.on_value_change_client(:string) - The client event name when the value change. Defaults tonil.- Global attributes are accepted.
Slots
label- Optional visible or screen-reader label for the group. Accepts attributes:class(:string)
item(required) - Accepts attributes:value(:string) - The value of the item, useful in controlled mode and for API to identify the item.disabled(:boolean) - Whether the item is disabled.class(:string) - The class of the item.aria_label(:string) - Accessibility label for the item button. If not provided, the value will be used as a fallback.
API
Set selected values from a control (phx-click). Pass a list of item value strings (or compatible input validated by the component).
<.action phx-click={Corex.ToggleGroup.set_value("my-toggle-group", ["a"])}>Pick A</.action>
<.toggle_group id="my-toggle-group" class="toggle-group" multiple={false} value={[]}>
<:item value="a">A</:item>
<:item value="b">B</:item>
</.toggle_group>document.getElementById("my-toggle-group")?.dispatchEvent(
new CustomEvent("corex:toggle-group:set-value", {
detail: { value: ["a"] },
})
);
Set selected values from handle_event.
<.action phx-click="pick_a">Pick A</.action>
<.toggle_group id="my-toggle-group" class="toggle-group" multiple={false} value={[]}>
<:item value="a">A</:item>
<:item value="b">B</:item>
</.toggle_group>def handle_event("pick_a", _, socket) do
{:noreply, Corex.ToggleGroup.set_value(socket, "my-toggle-group", ["a"])}
end