Current section

Files

Jump to
moon lib moon parts sidebar slim.ex
Raw

lib/moon/parts/sidebar/slim.ex

defmodule Moon.Parts.Sidebar.Slim do
@moduledoc false
use Moon.StatelessComponent
alias Moon.Parts.Sidebar
@doc "Id attribute for DOM element"
prop(id, :string)
@doc "Data-testid attribute for DOM element"
prop(testid, :string)
@doc "Additional Tailwind classes"
prop(class, :css_class)
@doc "Additional Tailwind classes"
prop(slim_top_class, :css_class)
@doc "Additional Tailwind classes"
prop(slim_bottom_class, :css_class)
@doc "List of links to be rendered when no default slot is given"
prop(links, :list, default: [])
@doc "aria-label HTTP attribute for nav"
prop(aria_label, :string, default: "Sidebar Slim")
@doc "Default slot, menu"
slot(default)
@doc "Bottom slot, footer"
slot(bottom)
@doc "Logo slot"
slot(logo)
def render(assigns) do
~F"""
<nav
{=@id}
data-testid={@testid}
aria-label={@aria_label}
class={merge([
"w-[4.5rem]",
"flex flex-col gap-6 px-3 pt-6 pb-5 lg:overflow-visible overflow-y-scroll",
"h-full gap-4 justify-between",
@class
])}
>
<div class={merge(["flex flex-col gap-4", @slim_top_class])}>
<#slot {@logo} />
<#slot>
<Sidebar.SlimMenuLink
:for={link <- @links}
route={link[:page]}
icon_name={link[:icon]}
tooltip_text={link[:key]}
/>
</#slot>
</div>
<div class={merge(["flex flex-col gap-4 items-center", @slim_bottom_class])}>
<#slot {@bottom} />
</div>
</nav>
"""
end
end