defmodule SaladUI.Popover do
@moduledoc """
Implement Popover component
## Usage
<.popover>
<.popover_trigger target="my-id">
<.button variant="link">
@salad_ui
<.popover_content id="my-id" side="left">
Hover card content
"""
use SaladUI, :component
@doc """
Render popover wrapper
"""
attr :class, :string, default: nil
attr :rest, :global
slot :inner_block, required: true
def popover(assigns) do
~H"""
{render_slot(@inner_block)}
"""
end
@doc """
Render popover trigger
"""
attr :class, :string, default: nil
attr :target, :string,
required: true,
doc: "The id of target element to show popover"
attr :rest, :global
slot :inner_block, required: true
def popover_trigger(assigns) do
~H"""
{render_slot(@inner_block)}
"""
end
@doc """
Render popover content
"""
attr :id, :string,
required: true,
doc: "The id of target element to show popover, this must be the same as the target in popover_trigger"
attr :class, :string, default: nil
attr :side, :string, values: ~w(bottom left right top), default: "top"
attr :align, :string, values: ["start", "center", "end"], default: "center"
attr :open, :boolean, default: false
attr :rest, :global
slot :inner_block, required: true
def popover_content(assigns) do
assigns =
assigns
|> assign(:variant_class, side_variant(assigns.side, assigns.align))
|> assign_new(:state, fn ->
if assigns[:open] in ["true", true] do
"open"
else
"closed"
end
end)
~H"""
{render_slot(@inner_block)}
"""
end
defp toggle_target(id) do
JS.toggle_attribute({"data-state", "open", "closed"}, to: "##{id}")
end
defp hide do
JS.set_attribute({"data-state", "closed"})
end
end