defmodule Phoenix.UI.Components.Dropdown do
@moduledoc """
Provides dropdown component.
"""
import Phoenix.UI.Components.Menu
use Phoenix.UI, :component
@default_variant "elevated"
@doc """
Renders dropdown component.
## Examples
```
<.dropdown id="basic_dropdown">
<:toggle>
Toggle Dropdown
content
```
"""
@spec dropdown(Socket.assigns()) :: Rendered.t()
def dropdown(raw_assigns) do
assigns = assign_new(raw_assigns, :variant, fn -> @default_variant end)
~H"""
<%= render_slot(@toggle) %>
<.menu extend_class="dropdown-menu hidden absolute right-0 mt-2 z-20">
<%= render_slot(@inner_block) %>
"""
end
#############################################################################################
### Actions
#############################################################################################
@doc """
Closes dropdown matching selector.
## Examples
iex> hide_drawer(selector)
%JS{}
iex> hide_drawer(js, selector)
%JS{}
"""
@spec close_dropdown(String.t()) :: struct()
def close_dropdown(id), do: JS.hide(%JS{}, to: "##{id} .dropdown-menu")
@doc """
Toggles dropdown matching selector.
## Examples
iex> hide_drawer(selector)
%JS{}
iex> hide_drawer(js, selector)
%JS{}
"""
@spec toggle_dropdown(String.t()) :: struct()
def toggle_dropdown(id), do: JS.toggle(%JS{}, to: "##{id} .dropdown-menu")
end