Current section

Files

Jump to
sprocket src docs components prev_next_nav.gleam
Raw

src/docs/components/prev_next_nav.gleam

import gleam/option.{Some}
import gleam/result
import sprocket/context.{Context}
import sprocket/component.{component, render}
import sprocket/html.{a, div, hr, i, text}
import sprocket/html/attributes.{class, classes}
import sprocket/internal/utils/ordered_map.{OrderedMap}
import docs/utils/common.{maybe}
import docs/page_route.{Page, PageRoute}
pub type PrevNextNavProps {
PrevNextNavProps(pages: OrderedMap(PageRoute, Page), active: PageRoute)
}
pub fn prev_next_nav(ctx: Context, props) {
let PrevNextNavProps(pages: pages, active: active) = props
let prev_page = ordered_map.find_previous(pages, active)
let next_page = ordered_map.find_next(pages, active)
render(
ctx,
[
hr([class("text-gray-500 my-6")]),
div(
[class("flex flex-row my-6")],
[
component(link, PageLinkProps(prev_page, active, Prev)),
div([class("flex-1")], []),
component(link, PageLinkProps(next_page, active, Next)),
],
),
],
)
}
type NextOrPrev {
Next
Prev
}
type PageLinkProps {
PageLinkProps(
page: Result(Page, Nil),
active: PageRoute,
next_or_prev: NextOrPrev,
)
}
fn link(ctx: Context, props: PageLinkProps) {
let PageLinkProps(page: page, active: active, next_or_prev: next_or_prev) =
props
page
|> result.map(fn(page) {
let title = page.title
let href = page_route.href(page.route)
let is_active = page.route == active
render(
ctx,
[
a(
[
classes([
Some(
"block py-1.5 px-2 text-blue-500 hover:text-blue-600 active:text-blue-700 no-underline hover:!underline",
),
maybe(is_active, "font-bold"),
]),
attributes.href(href),
],
case next_or_prev {
Next -> [text(title), next_or_prev_icon(Next)]
Prev -> [next_or_prev_icon(Prev), text(title)]
},
),
],
)
})
|> result.unwrap(render(ctx, []))
}
fn next_or_prev_icon(next_or_prev: NextOrPrev) {
case next_or_prev {
Next -> i([class("fa-solid fa-arrow-right ml-3")], [])
Prev -> i([class("fa-solid fa-arrow-left mr-3")], [])
}
}