defmodule Shino.UI.Menu do
@moduledoc """
Provides menu related components.
> Wanna `DropdownMenu`? `Popover` + `Menu` = `DropdownMenu`
## Examples
```heex
My Account
Profile
⌘P
Billing
⌘B
Settings
⌘S
Logout
```
## References
* [shadcn/ui - Dropdown Menu](https://ui.shadcn.com/docs/components/dropdown-menu)
* [@radix-ui/primitives - Dropdown Menu](https://www.radix-ui.com/primitives/docs/components/dropdown-menu)
"""
use Shino.UI, :component
@doc """
The root contains all the parts of a menu.
"""
attr :class, :any, default: nil
attr :rest, :global
slot :inner_block, required: true
def root(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu item.
"""
attr :class, :any, default: nil
attr :disabled, :boolean, default: false
attr :rest, :global
slot :inner_block, required: true
def item(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu plain.
"""
attr :class, :any, default: nil
attr :rest, :global, include: ~w(href navigate patch)
slot :inner_block, required: true
def plain(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu anchor.
"""
attr :class, :any, default: nil
attr :rest, :global, include: ~w(href navigate patch method)
slot :inner_block, required: true
def anchor(assigns) do
~H"""
<.link class={mc(["px-2 py-1.5 flex items-center cursor-pointer", @class])} {@rest}>
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu label.
"""
attr :class, :any, default: nil
attr :inset, :boolean, default: false
attr :rest, :global
slot :inner_block, required: true
def label(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
attr :class, :any, default: nil
slot :inner_block, required: true
attr :rest, :global
@doc """
Renders a menu shortcut.
"""
def shortcut(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu separator.
"""
attr :class, :any, default: nil
slot :inner_block
def separator(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
@doc """
Renders a menu group.
"""
attr :class, :any, default: nil
slot :inner_block, required: true
attr :rest, :global
def group(assigns) do
~H"""
<%= render_slot(@inner_block) %>
"""
end
end