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