Current section
Files
Jump to
Current section
Files
src/docs/views/page_view.gleam
import gleam/list
import gleam/result
import gleam/option.{None}
import sprocket/context.{Context}
import sprocket/component.{component, render}
import sprocket/html.{body, div, head, html, link, meta, script, title}
import sprocket/html/attributes.{
charset, class, content, crossorigin, href, id, integrity, lang, media, name,
referrerpolicy, rel, src,
}
import sprocket/internal/utils/ordered_map.{KeyedItem}
import docs/components/header.{HeaderProps, MenuItem, header}
import docs/components/responsive_drawer.{
ResponsiveDrawerProps, responsive_drawer,
}
import docs/components/sidebar.{SidebarProps, sidebar}
import docs/components/prev_next_nav.{PrevNextNavProps, prev_next_nav}
import docs/components/pages/introduction.{
IntroductionPageProps, introduction_page,
}
import docs/components/pages/components.{ComponentsPageProps, components_page}
import docs/components/pages/misc.{MiscPageProps, misc_page}
import docs/components/pages/not_found.{NotFoundPageProps, not_found_page}
import docs/components/pages/hooks.{HooksPageProps, hooks_page}
import docs/components/pages/props_and_events.{
PropsAndEventsPageProps, props_and_events_page,
}
import docs/components/pages/effects.{EffectsPageProps, effects_page}
import docs/components/pages/state_management.{
StateManagementPageProps, state_management_page,
}
import docs/components/pages/under_the_hood.{
UnderTheHoodProps, under_the_hood_page,
}
import docs/page_route.{
Components, Effects, Events, Hooks, Introduction, Misc, Page, PageRoute,
StateManagement, UnderTheHood, Unknown,
}
pub type PageViewProps {
PageViewProps(route: PageRoute, path_segments: List(String))
}
pub fn page_view(ctx: Context, props: PageViewProps) {
let PageViewProps(route: route, ..) = props
// TODO: use memoization hook to avoid re-computing this on every render
let pages =
[
Page("Introduction", Introduction),
Page("Components", Components),
Page("Props and Events", Events),
Page("State Management", StateManagement),
Page("Effects", Effects),
Page("Hooks", Hooks),
Page("Under the Hood", UnderTheHood),
Page("Misc.", Misc),
]
|> list.map(fn(page) { KeyedItem(page.route, page) })
|> ordered_map.from_list()
let page_title =
pages
|> ordered_map.get(route)
|> result.map(fn(page) { page.title <> " - Sprocket" })
|> result.unwrap("Sprocket")
render(
ctx,
[
html(
[lang("en")],
[
head(
[],
[
title(page_title),
meta([charset("utf-8")]),
meta([
name("viewport"),
content("width=device-width, initial-scale=1"),
]),
meta([
name("description"),
content(
"Sprocket is a library for building real-time server components in Gleam.",
),
]),
link([rel("stylesheet"), href("/app.css")]),
link([
rel("stylesheet"),
href(
"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css",
),
integrity(
"sha512-MV7K8+y+gLIBoVD59lQIYicR65iaqukzvf/nwasF0nqhPay5w/9lJmVM2hMDcnK1OnMGCdVK+iQrJ7lzPJQd1w==",
),
crossorigin("anonymous"),
referrerpolicy("no-referrer"),
]),
link([
id("syntax-theme"),
rel("stylesheet"),
media("(prefers-color-scheme: dark)"),
href(
"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.8.0/build/styles/atom-one-dark.min.css",
),
]),
link([
id("syntax-theme"),
rel("stylesheet"),
media(
"(prefers-color-scheme: light), (prefers-color-scheme: no-preference)",
),
href(
"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.8.0/build/styles/atom-one-light.min.css",
),
]),
script(
[
src(
"//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.0.1/highlight.min.js",
),
],
None,
),
script(
[src("https://gleam.run/javascript/highlightjs-gleam.js")],
None,
),
],
),
body(
[
class(
"bg-white dark:bg-gray-900 dark:text-white flex flex-col h-screen",
),
],
[
div(
[],
[
component(
header,
HeaderProps(menu_items: [
MenuItem(
"Github",
"https://github.com/eliknebel/sprocket",
),
]),
),
],
),
component(
responsive_drawer,
ResponsiveDrawerProps(
drawer: component(sidebar, SidebarProps(pages, route)),
content: div(
[
class(
"prose dark:prose-invert prose-sm md:prose-base container mx-auto p-12",
),
],
[
case route {
Introduction ->
component(introduction_page, IntroductionPageProps)
Components ->
component(components_page, ComponentsPageProps)
Events ->
component(
props_and_events_page,
PropsAndEventsPageProps,
)
StateManagement ->
component(
state_management_page,
StateManagementPageProps,
)
Effects -> component(effects_page, EffectsPageProps)
Hooks -> component(hooks_page, HooksPageProps)
UnderTheHood ->
component(under_the_hood_page, UnderTheHoodProps)
Misc -> component(misc_page, MiscPageProps)
Unknown -> component(not_found_page, NotFoundPageProps)
},
component(prev_next_nav, PrevNextNavProps(pages, route)),
],
),
),
),
],
),
],
),
],
)
}