Packages

🎨 Gleam UI lustre library by @gleam-br

Current section

Files

Jump to
gbr_ui src gbr@ui@admin@sidebar@menu.erl
Raw

src/gbr@ui@admin@sidebar@menu.erl

-module(gbr@ui@admin@sidebar@menu).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src\\gbr\\ui\\admin\\sidebar\\menu.gleam").
-export([new/1, title/2, icon/2, parent/1, is_menu_group/1, is_menu_child/2, at/2, inner/2, render/3]).
-export_type([u_i_sidebar_menu/0, u_i_sidebar_menu_render/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
"\n"
" Gleam UI sidebar menu super element\n"
"\n"
).
-opaque u_i_sidebar_menu() :: {u_i_sidebar_menu,
binary(),
binary(),
list(u_i_sidebar_menu()),
gleam@option:option(binary()),
gleam@option:option(fun((gbr@ui@svg@core:svg()) -> gbr@ui@svg@core:svg()))}.
-opaque u_i_sidebar_menu_render(QOP) :: {u_i_sidebar_menu_render,
u_i_sidebar_menu(),
fun((binary(), u_i_sidebar_menu()) -> QOP)}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 74).
?DOC(
" New sidebar menu super element\n"
"\n"
" - id: htmlid\n"
).
-spec new(binary()) -> u_i_sidebar_menu().
new(Id) ->
{u_i_sidebar_menu, Id, <<""/utf8>>, [], none, none}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 82).
?DOC(
" Set title menu\n"
"\n"
" - text: Title to menu\n"
).
-spec title(u_i_sidebar_menu(), binary()) -> u_i_sidebar_menu().
title(In, Text) ->
{u_i_sidebar_menu,
erlang:element(2, In),
Text,
erlang:element(4, In),
erlang:element(5, In),
erlang:element(6, In)}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 90).
?DOC(
" Set icon to menu\n"
"\n"
" - svg: Icon to menu\n"
).
-spec icon(
u_i_sidebar_menu(),
fun((gbr@ui@svg@core:svg()) -> gbr@ui@svg@core:svg())
) -> u_i_sidebar_menu().
icon(In, Svg) ->
{u_i_sidebar_menu,
erlang:element(2, In),
erlang:element(3, In),
erlang:element(4, In),
erlang:element(5, In),
{some, Svg}}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 106).
?DOC(" Get parent menu id, if exits\n").
-spec parent(u_i_sidebar_menu()) -> gleam@option:option(binary()).
parent(In) ->
erlang:element(5, In).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 110).
-spec is_menu_group(u_i_sidebar_menu()) -> boolean().
is_menu_group(Menu) ->
not gleam@list:is_empty(erlang:element(4, Menu)).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 118).
-spec is_menu_child_inner(list(u_i_sidebar_menu()), binary()) -> boolean().
is_menu_child_inner(Inner, Id) ->
gleam@list:any(
Inner,
fun(Menu) ->
gleam@bool:guard(
erlang:element(2, Menu) =:= Id,
true,
fun() -> case erlang:element(4, Menu) of
[] ->
false;
Inner@1 ->
is_menu_child_inner(Inner@1, Id)
end end
)
end
).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 114).
-spec is_menu_child(u_i_sidebar_menu(), binary()) -> boolean().
is_menu_child(Menu, Id) ->
is_menu_child_inner(erlang:element(4, Menu), Id).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 131).
?DOC(" New render sidebar menu element\n").
-spec at(u_i_sidebar_menu(), fun((binary(), u_i_sidebar_menu()) -> QOZ)) -> u_i_sidebar_menu_render(QOZ).
at(In, Onclick) ->
{u_i_sidebar_menu_render, In, Onclick}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 195).
-spec render_icon(
gleam@option:option(fun((gbr@ui@svg@core:svg()) -> gbr@ui@svg@core:svg())),
boolean()
) -> lustre@vdom@vnode:element(any()).
render_icon(Svg, Is_selected) ->
case Svg of
none ->
lustre@element:none();
{some, Transform} ->
lustre@element@html:'div'(
[lustre@attribute:classes(
[{<<"[&>*]:fill-brand-500 [&>*]:dark:fill-brand-400"/utf8>>,
Is_selected},
{<<"[&>*]:fill-gray-500 [&>*]:group-hover:fill-gray-700 [&>*]:dark:fill-gray-400 [&>*]:dark:group-hover:fill-gray-300"/utf8>>,
not Is_selected}]
)],
[begin
_pipe = gbr@ui@svg:new(24, 24),
_pipe@1 = Transform(_pipe),
gbr@ui@svg:render(_pipe@1)
end]
)
end.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 214).
-spec set_parent(u_i_sidebar_menu(), list(u_i_sidebar_menu())) -> list(u_i_sidebar_menu()).
set_parent(In, Inner) ->
gleam@list:map(
Inner,
fun(Menu) ->
{u_i_sidebar_menu,
erlang:element(2, Menu),
erlang:element(3, Menu),
erlang:element(4, Menu),
{some, erlang:element(2, In)},
erlang:element(6, Menu)}
end
).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 98).
?DOC(
" Set list of menus inner parent menu\n"
"\n"
" - inner: List of menus inner parent menu\n"
).
-spec inner(u_i_sidebar_menu(), list(u_i_sidebar_menu())) -> u_i_sidebar_menu().
inner(In, Inner) ->
Inner@1 = set_parent(In, Inner),
{u_i_sidebar_menu,
erlang:element(2, In),
erlang:element(3, In),
Inner@1,
erlang:element(5, In),
erlang:element(6, In)}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 315).
?DOC(
" Render menu item\n"
"\n"
" - menu: current menu element\n"
" - text: menu item title\n"
" - selected: menu item is selected\n"
" - onclick: menu item onclick event\n"
).
-spec menu_item(
u_i_sidebar_menu(),
boolean(),
gleam@option:option(binary()),
fun((binary(), u_i_sidebar_menu()) -> QPZ)
) -> {binary(), lustre@vdom@vnode:element(QPZ)}.
menu_item(Menu, Open, Selected, Onclick) ->
{u_i_sidebar_menu, Id, Text, _, _, Svg} = Menu,
Is_selected = case Selected of
{some, Selected@1} ->
Id =:= Selected@1;
none ->
false
end,
{Id,
lustre@element@html:li(
[lustre@attribute:id(Id)],
[lustre@element@html:a(
[lustre@attribute:class(
<<"menu-dropdown-item group cursor-pointer"/utf8>>
),
lustre@attribute:classes(
[{<<"menu-dropdown-item-active"/utf8>>, Is_selected},
{<<"menu-dropdown-item-inactive"/utf8>>,
not Is_selected}]
),
lustre@event:on_click(Onclick(Id, Menu))],
[render_icon(Svg, Is_selected),
lustre@element@html:span(
[lustre@attribute:class(<<"menu-item-text"/utf8>>),
lustre@attribute:classes(
[{<<"lg:hidden"/utf8>>, not Open}]
)],
[lustre@element@html:text(Text)]
)]
)]
)}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 229).
-spec menu_group(
u_i_sidebar_menu(),
boolean(),
gleam@option:option(binary()),
fun((binary(), u_i_sidebar_menu()) -> QPO)
) -> {binary(), lustre@vdom@vnode:element(QPO)}.
menu_group(Menu, Open, Selected, Onclick) ->
{u_i_sidebar_menu, Id, Text, Inner, _, Svg} = Menu,
Is_selected = case Selected of
none ->
false;
{some, Selected@1} ->
(Id =:= Selected@1) orelse is_menu_child(Menu, Selected@1)
end,
{Id,
lustre@element@html:li(
[lustre@attribute:id(Id)],
[lustre@element@html:a(
[lustre@attribute:class(
<<"menu-item group cursor-pointer"/utf8>>
),
lustre@attribute:classes(
[{<<"menu-item-active"/utf8>>, Is_selected},
{<<"menu-item-inactive"/utf8>>, not Is_selected}]
),
lustre@event:on_click(Onclick(Id, Menu))],
[render_icon(Svg, Is_selected),
lustre@element@html:span(
[lustre@attribute:class(<<"menu-item-text"/utf8>>),
lustre@attribute:classes(
[{<<"lg:hidden"/utf8>>, not Open}]
)],
[lustre@element@html:text(Text)]
),
lustre@element@html:'div'(
[lustre@attribute:classes(
[{<<"menu-item-arrow-active"/utf8>>,
Is_selected},
{<<"menu-item-arrow-inactive"/utf8>>,
not Is_selected},
{<<"menu-item-arrow"/utf8>>,
not gleam@list:is_empty(Inner)},
{<<"hidden"/utf8>>,
gleam@list:is_empty(Inner)},
{<<"lg:hidden"/utf8>>, not Open}]
)],
[begin
_pipe = gbr@ui@svg:new(20, 20),
_pipe@1 = gbr@ui@svg@icons:arrow(_pipe),
gbr@ui@svg:render(_pipe@1)
end]
)]
),
lustre@element@html:'div'(
[lustre@attribute:class(
<<"translate transform overflow-hidden"/utf8>>
),
lustre@attribute:classes(
[{<<"block"/utf8>>, Is_selected}]
),
lustre@attribute:classes(
[{<<"hidden"/utf8>>, not Is_selected}]
)],
case Inner of
[] ->
[];
Inner@1 ->
[lustre@element@html:ul(
[lustre@attribute:class(
<<"menu-dropdown mt-2 flex flex-col gap-1 pl-9 cursor-pointer"/utf8>>
),
lustre@attribute:classes(
[{<<"menu-dropdown mt-2 flex flex-col gap-1 pl-9 lg:hidden"/utf8>>,
not Open},
{<<"menu-dropdown mt-2 flex flex-col gap-1 pl-9"/utf8>>,
Open}]
)],
[begin
_pipe@2 = menu_inner(
Inner@1,
Open,
Selected,
Onclick
),
lustre@element@keyed:fragment(
_pipe@2
)
end]
)]
end
)]
)}.
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 220).
-spec menu_inner(
list(u_i_sidebar_menu()),
boolean(),
gleam@option:option(binary()),
fun((binary(), u_i_sidebar_menu()) -> QPO)
) -> list({binary(), lustre@vdom@vnode:element(QPO)}).
menu_inner(Menus, Open, Selected, Onclick) ->
gleam@list:map(Menus, fun(Menu) -> case erlang:element(4, Menu) of
[] ->
menu_item(Menu, Open, Selected, Onclick);
_ ->
menu_group(Menu, Open, Selected, Onclick)
end end).
-file("src\\gbr\\ui\\admin\\sidebar\\menu.gleam", 137).
?DOC(" Render sidebar menu element\n").
-spec render(
u_i_sidebar_menu_render(QPC),
boolean(),
gleam@option:option(binary())
) -> lustre@vdom@vnode:element(QPC).
render(At, Open, Selected) ->
{u_i_sidebar_menu_render, In, Onclick} = At,
{u_i_sidebar_menu, Id, Text, Inner, Parent, _} = In,
gleam@bool:guard(
gleam@option:is_some(Parent),
lustre@element:none(),
fun() -> case Inner of
[] ->
lustre@element:none();
Inner@1 ->
lustre@element@html:'div'(
[],
[lustre@element@html:h3(
[lustre@attribute:class(
<<"mb-4 text-xs uppercase leading-[20px] text-gray-400"/utf8>>
)],
[lustre@element@html:span(
[lustre@attribute:class(
<<"menu-group-title"/utf8>>
),
lustre@attribute:classes(
[{<<"lg:hidden"/utf8>>,
not Open}]
)],
[lustre@element@html:text(Text)]
),
begin
_pipe = gbr@ui@svg:new(24, 24),
_pipe@1 = gbr@ui@svg@icons:reticence(
_pipe
),
_pipe@2 = fun gbr@ui@svg@core:class/2(
_pipe@1,
<<"menu-group-icon mx-auto fill-current sm:hidden "/utf8,
(case Open of
false ->
<<"lg:block hidden"/utf8>>;
true ->
<<"hidden"/utf8>>
end)/binary>>
),
gbr@ui@svg:render(_pipe@2)
end]
),
lustre@element@html:ul(
[lustre@attribute:id(
<<Id/binary, "sidebar-menu"/utf8>>
),
lustre@attribute:class(
<<"mb-6 flex flex-col gap-4"/utf8>>
)],
[begin
_pipe@3 = menu_inner(
Inner@1,
Open,
Selected,
Onclick
),
lustre@element@keyed:fragment(_pipe@3)
end]
)]
)
end end
).