-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} )] )] ).