Packages
petal_components
2.9.2
4.7.0
4.6.2
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.2
4.1.1
4.1.0
4.0.12
4.0.11
4.0.10
4.0.6
4.0.5
4.0.4
4.0.3
4.0.1
3.2.2
3.2.1
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
2.9.3
2.9.2
retired
2.9.1
retired
2.9.0
retired
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.4
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.2
2.5.1
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.0
2.2.1
2.2.0
2.1.2
2.1.1
2.1.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.1
1.7.0
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.14
1.2.13
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.14.1
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.0
Shadcn-style Phoenix LiveView components that AI assistants can actually use. Pair with the MCP server so AI coding tools can inspect the real component API.
Retired package: Deprecated - Tailwind introduces breaking changes
Current section
Files
Jump to
Current section
Files
lib/petal_components/link.ex
defmodule PetalComponents.Link do
use Phoenix.Component
attr :class, :any, default: nil, doc: "CSS class for link (either a string or list)"
attr :link_type, :string, default: "a", values: ["a", "live_patch", "live_redirect", "button"]
attr :label, :string, default: nil, doc: "label your link"
attr :to, :string, default: nil, doc: "link path"
attr :disabled, :boolean,
default: false,
doc: "disables the link. This will turn an <a> into a <button> (<a> tags can't be disabled)"
attr :rest, :global, include: ~w(method download)
slot :inner_block, required: false
def a(%{link_type: "button", disabled: true} = assigns) do
assigns = update_in(assigns.rest, &Map.drop(&1, [:"phx-click"]))
~H"""
<button class={@class} disabled={@disabled} {@rest}>
{if @label, do: @label, else: render_slot(@inner_block)}
</button>
"""
end
# Since the <a> tag can't be disabled, we turn it into a disabled button (looks exactly the same and does nothing when clicked)
def a(%{disabled: true, link_type: type} = assigns) when type != "button" do
a(Map.put(assigns, :link_type, "button"))
end
def a(%{link_type: "a"} = assigns) do
~H"""
<.link href={@to} class={@class} {@rest}>
{if(@label, do: @label, else: render_slot(@inner_block))}
</.link>
"""
end
def a(%{link_type: "live_patch"} = assigns) do
~H"""
<.link patch={@to} class={@class} {@rest}>
{if(@label, do: @label, else: render_slot(@inner_block))}
</.link>
"""
end
def a(%{link_type: "live_redirect"} = assigns) do
~H"""
<.link navigate={@to} class={@class} {@rest}>
{if(@label, do: @label, else: render_slot(@inner_block))}
</.link>
"""
end
def a(%{link_type: "button"} = assigns) do
~H"""
<button class={@class} disabled={@disabled} {@rest}>
{if @label, do: @label, else: render_slot(@inner_block)}
</button>
"""
end
end