# --- Working TopLayout example with HTMX SPA navigation ---
# 1. Shared navbar β blue with large-blur glass effect
def my_navbar():
return NavBar(
A("Dashboard", href="/dashboard"),
A("Settings", href="/settings"),
A("Profile", href="/profile"),
brand=H5("MyApp", cls="bold"),
sticky=True,
blur='large-blur',
hx_swap='outerHTML',
cls="primary"
)
# 2. Helper: center content using a 3-column grid (empty | content | empty)
def centered_page(*content):
"""Wrap content in a 3-col grid so it sits in the center column.
s12 = full-width on mobile, l6 = 6/12 on desktop (centered)."""
return Grid(
GridCell(span="s0 m2 l3"), # left spacer (hidden on small)
GridCell(*content, span="s12 m8 l6"), # center content
GridCell(span="s0 m2 l3"), # right spacer (hidden on small)
)
# 3. Page content functions
def dashboard_content():
"""Full-width β no centering grid, content fills the page."""
return Div(
H3("Analytics Dashboard"),
Div(
P("Full-width content area β stretches edge to edge", cls="center-align"),
cls="primary-container padding round",
style="min-height:60px;"
),
Grid(
Card(H5("Revenue"), P("$12,345"), cls="padding"),
Card(H5("Users"), P("1,234"), cls="padding"),
Card(H5("Orders"), P("567"), cls="padding"),
Card(H5("Conversion"), P("4.2%"), cls="padding"),
cols=4
),
)
def settings_content():
"""Centered β uses the 3-col grid trick for readability."""
return centered_page(
H3("Account Settings"),
P("Update your profile and preferences."),
Card(
LabelInput(label="Display Name", id="name"),
LabelInput(label="Email", id="email", input_type="email"),
Button("Save", cls=ButtonT.primary),
cls="padding"
)
)
def profile_content():
"""Centered β uses the 3-col grid trick for readability."""
return centered_page(
H3("Profile"),
Card(
DivHStacked(
I("person", cls="circle extra primary-container"),
DivVStacked(H5("John Doe"), P("john@example.com", cls="small-text"))
),
cls="padding"
)
)
# 4. Routes β all full-width <main>, centering handled by content itself
@rt("/dashboard")
def get(req):
content = dashboard_content()
if 'HX-Request' in req.headers:
return TopContent(content)
return TopLayout(content, nav_bar=my_navbar())
@rt("/settings")
def get(req):
content = settings_content()
if 'HX-Request' in req.headers:
return TopContent(content)
return TopLayout(content, nav_bar=my_navbar())
@rt("/profile")
def get(req):
content = profile_content()
if 'HX-Request' in req.headers:
return TopContent(content)
return TopLayout(content, nav_bar=my_navbar())
# 5. Preview β full-width dashboard
preview(TopLayout(dashboard_content(), nav_bar=my_navbar()))