Packages
noora
0.82.2
0.85.0
0.84.1
0.84.0
0.83.2
0.83.1
0.83.0
0.82.7
0.82.6
0.82.5
0.82.4
0.82.3
0.82.2
0.82.1
0.82.0
0.81.4
0.81.3
0.81.2
0.81.1
0.81.0
0.80.1
0.80.0
0.79.1
0.79.0
0.78.1
0.78.0
0.77.4
0.77.3
0.77.2
0.77.1
0.77.0
0.76.0
0.75.0
0.74.0
0.73.0
0.72.0
0.71.0
0.70.0
0.69.1
0.69.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.2
0.64.1
0.64.0
0.63.2
0.63.1
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.0
0.54.0
0.53.1
0.53.0
0.52.1
0.52.0
0.51.0
0.50.1
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.3
0.44.2
0.44.1
0.44.0
0.43.0
0.42.0
0.41.0
0.40.6
0.40.5
0.40.4
0.40.3
0.40.2
0.40.1
0.40.0
0.39.1
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.1
0.32.0
0.31.0
0.30.0
0.29.2
0.29.1
0.29.0
0.28.5
0.28.4
0.28.3
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.0
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.0
0.1.0
0.1.0-rc.2
0.1.0-rc.1
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
A component library for Phoenix LiveView applications
Current section
Files
Jump to
Current section
Files
lib/noora/breadcrumbs.ex
defmodule Noora.Breadcrumbs do
@moduledoc """
Renders a breadcrumbs component with.
## Example
```elixir
<.breadcrumbs style="slash">
<.breadcrumb id="home" label="Home" />
<.breadcrumb id="products" label="Products" />
<.breadcrumb id="category" label="Electronics" />
</.breadcrumbs>
```
"""
use Phoenix.Component
import Noora.Avatar
import Noora.Badge
import Noora.Dropdown
import Noora.Icon
import Noora.Utils
attr(:style, :string, values: ~w(slash arrow), default: "slash", doc: "The separator style between breadcrumbs")
slot(:inner_block, doc: "Breadcrumb items to be rendered")
attr(:rest, :global, doc: "Additional HTML attributes")
def breadcrumbs(assigns) do
~H"""
<div class="noora-breadcrumbs" data-style={@style} {@rest}>
{render_slot(@inner_block)}
</div>
"""
end
attr(:id, :string, required: true, doc: "Unique identifier for the breadcrumb component")
attr(:label, :string, required: true, doc: "Main text displayed in the breadcrumb trigger")
attr(:href, :string, default: nil, doc: "Navigation URL for the breadcrumb label")
attr(:on_open_change, :string, default: nil, doc: "Event handler for when the breadcrumb opens")
attr(:on_highlight_change, :string,
default: nil,
doc: "Event handler for when the highlighted option changes"
)
attr(:on_select, :string, default: nil, doc: "Event handler for when an option is selected")
attr(:on_escape_key_down, :string,
default: nil,
doc: "Event handler for when the escape key is pressed"
)
attr(:on_pointer_down_outside, :string,
default: nil,
doc: "Event handler for when the pointer is pressed outside the breadcrumb"
)
attr(:on_focus_outside, :string,
default: nil,
doc: "Function called when the focus is moved outside the component"
)
attr(:on_interact_outside, :string,
default: nil,
doc: "Function called when an interaction happens outside the component"
)
attr(:show_avatar, :boolean, default: false, doc: "Whether to show the avatar")
attr(:avatar_color, :string,
values: ~w(gray red orange yellow azure blue purple pink),
default: "pink",
doc: "Color of the avatar when avatar is shown"
)
attr(:badge_label, :string, default: nil, doc: "Label for the badge displayed next to the breadcrumb label")
attr(:badge_color, :string,
values: ~w(neutral destructive warning attention success information focus primary secondary),
default: "neutral",
doc: "Color of the badge"
)
slot(:icon, doc: "Breadcrumb icon")
slot(:inner_block, doc: "Content to be rendered inside the breadcrumb menu")
slot(:footer, doc: "Content rendered as a sticky footer below the scrollable items area")
attr(:rest, :global)
def breadcrumb(assigns) do
~H"""
<div
id={@id}
class="noora-breadcrumb"
phx-hook="NooraDropdown"
data-loop-focus
data-close-on-select
data-typeahead
data-on-open-change={@on_open_change}
data-on-highlight-change={@on_highlight_change}
data-on-select={@on_select}
data-on-escape-key-down={@on_escape_key_down}
data-on-pointer-down-outside={@on_pointer_down_outside}
data-on-focus-outside={@on_focus_outside}
data-on-interact-outside={@on_interact_outside}
data-positioning-offset-main-axis={8}
data-positioning-anchor="trigger"
{@rest}
>
<a href={@href} data-part="link">
<.avatar
:if={@show_avatar}
id={@id <> "-avatar"}
name={@label}
color={@avatar_color}
size="2xsmall"
data-part="avatar"
/>
<div :if={has_slot_content?(@icon, assigns) and not @show_avatar} data-part="icon">
{render_slot(@icon)}
</div>
<span data-part="label">{@label}</span>
<.badge :if={@badge_label} label={@badge_label} color={@badge_color} size="small" />
</a>
<button
:if={has_slot_content?(@inner_block, assigns)}
data-part="trigger"
aria-label={"#{@label} menu"}
>
<.icon
id={@id <> "-selector"}
name="selector"
active_name="selector_2"
transition="morph"
active_state="open"
/>
</button>
<div :if={has_slot_content?(@inner_block, assigns)} data-part="positioner">
<div class="noora-dropdown-content" data-part="content">
<div data-part="items">
{render_slot(@inner_block)}
</div>
<div :if={has_slot_content?(@footer, assigns)} data-part="footer">
{render_slot(@footer)}
</div>
</div>
</div>
</div>
<div data-part="slash"><.slash /></div>
<div data-part="arrow"><.chevron_right /></div>
"""
end
attr(:id, :string, required: false)
attr(:label, :string, required: true, doc: "Text displayed as the main content of the item")
attr(:value, :string, required: true, doc: "Value associated with the breadcrumb item")
attr(:selected, :boolean, default: false, doc: "Whether the item is selected")
attr(:href, :string, default: nil, doc: "Standard URL for navigation")
attr(:show_avatar, :boolean, default: false, doc: "Whether to show the avatar")
attr(:icon, :string, default: nil, doc: "Icon to display. Overrides `show_avatar`.")
attr(:avatar_color, :string,
values: ~w(gray red orange yellow azure blue purple pink),
default: "pink",
doc: "Color of the avatar when avatar is shown"
)
attr(:badge_label, :string, default: nil, doc: "Label for the badge displayed next to the item label")
attr(:badge_color, :string,
values: ~w(neutral destructive warning attention success information focus primary secondary),
default: "neutral",
doc: "Color of the badge"
)
def breadcrumb_item(assigns) do
~H"""
<.dropdown_item value={@value} label={@label} href={@href} data-selected={@selected}>
<:left_icon :if={@show_avatar or not is_nil(@icon)}>
<.avatar
:if={@show_avatar and is_nil(@icon)}
id={(@id || @label) <> "-avatar"}
name={@label}
color={@avatar_color}
size="2xsmall"
data-part="avatar"
/>
<.icon :if={not is_nil(@icon)} name={@icon} />
</:left_icon>
<:right_icon :if={@badge_label || @selected}>
<.badge :if={@badge_label} label={@badge_label} color={@badge_color} size="small" />
<div data-part="check"><.icon name="check" /></div>
</:right_icon>
</.dropdown_item>
"""
end
end