Current section
Files
Jump to
Current section
Files
src/docs@components@prev_next_nav.erl
-module(docs@components@prev_next_nav).
-compile([no_auto_import, nowarn_unused_vars]).
-export([prev_next_nav/2]).
-export_type([prev_next_nav_props/0, next_or_prev/0, page_link_props/0]).
-type prev_next_nav_props() :: {prev_next_nav_props,
sprocket@internal@utils@ordered_map:ordered_map(docs@page_route:page_route(), docs@page_route:page()),
docs@page_route:page_route()}.
-type next_or_prev() :: next | prev.
-type page_link_props() :: {page_link_props,
{ok, docs@page_route:page()} | {error, nil},
docs@page_route:page_route(),
next_or_prev()}.
-spec next_or_prev_icon(next_or_prev()) -> sprocket@element:element().
next_or_prev_icon(Next_or_prev) ->
case Next_or_prev of
next ->
sprocket@html:i(
[sprocket@html@attributes:class(
<<"fa-solid fa-arrow-right ml-3"/utf8>>
)],
[]
);
prev ->
sprocket@html:i(
[sprocket@html@attributes:class(
<<"fa-solid fa-arrow-left mr-3"/utf8>>
)],
[]
)
end.
-spec link(sprocket@socket:socket(), page_link_props()) -> {sprocket@socket:socket(),
list(sprocket@element:element())}.
link(Socket, Props) ->
{page_link_props, Page, Active, Next_or_prev} = Props,
_pipe = Page,
_pipe@1 = gleam@result:map(
_pipe,
fun(Page@1) ->
Title = erlang:element(2, Page@1),
Href = docs@page_route:href(erlang:element(3, Page@1)),
Is_active = erlang:element(3, Page@1) =:= Active,
sprocket@component:render(
Socket,
[sprocket@html:a(
[sprocket@html@attributes:classes(
[{some,
<<"block py-1.5 px-2 text-blue-500 hover:text-blue-600 active:text-blue-700 no-underline hover:!underline"/utf8>>},
docs@utils@common:maybe(
Is_active,
<<"font-bold"/utf8>>
)]
),
sprocket@html@attributes:href(Href)],
case Next_or_prev of
next ->
[sprocket@html:text(Title),
next_or_prev_icon(next)];
prev ->
[next_or_prev_icon(prev),
sprocket@html:text(Title)]
end
)]
)
end
),
gleam@result:unwrap(_pipe@1, sprocket@component:render(Socket, [])).
-spec prev_next_nav(sprocket@socket:socket(), prev_next_nav_props()) -> {sprocket@socket:socket(),
list(sprocket@element:element())}.
prev_next_nav(Socket, Props) ->
{prev_next_nav_props, Pages, Active} = Props,
Prev_page = sprocket@internal@utils@ordered_map:find_previous(Pages, Active),
Next_page = sprocket@internal@utils@ordered_map:find_next(Pages, Active),
sprocket@component:render(
Socket,
[sprocket@html:hr(
[sprocket@html@attributes:class(<<"text-gray-500 my-6"/utf8>>)]
),
sprocket@html:'div'(
[sprocket@html@attributes:class(<<"flex flex-row my-6"/utf8>>)],
[sprocket@component:component(
fun link/2,
{page_link_props, Prev_page, Active, prev}
),
sprocket@html:'div'(
[sprocket@html@attributes:class(<<"flex-1"/utf8>>)],
[]
),
sprocket@component:component(
fun link/2,
{page_link_props, Next_page, Active, next}
)]
)]
).