"""Layout components for page structure."""
import gradio as gr
from typing import Callable
def PageHeader(
title: str,
description: str | None = None,
github_url: str | None = None,
studio_url: str | None = None,
readme_url: str | None = None,
) -> None:
"""
Render page header with title and action links.
Args:
title: App title
description: Optional description
github_url: GitHub repo URL
studio_url: Lyzr Studio blueprint URL
readme_url: Readme/docs URL
"""
with gr.Row(elem_classes=["page-header"]):
with gr.Column(scale=3):
gr.Markdown(f"# {title}")
if description:
gr.Markdown(f"*{description}*")
with gr.Column(scale=1, min_width=300):
links_html = '
'
gr.HTML(links_html)
def Section(title: str, build_fn: Callable[[], None]) -> None:
"""
Render a titled section.
Args:
title: Section title
build_fn: Function that builds section content
"""
gr.Markdown(f"### {title}")
build_fn()
def Sidebar(
items: list[dict],
on_navigate: Callable[[str], None] | None = None,
) -> gr.Column:
"""
Render sidebar navigation.
Args:
items: List of {"label": str, "path": str, "icon": str}
on_navigate: Callback when item is clicked
Returns:
gr.Column containing sidebar
"""
with gr.Column(scale=1, min_width=200, elem_classes=["sidebar"]) as sidebar:
for item in items:
icon = item.get("icon", "")
label = item.get("label", "")
path = item.get("path", "/")
btn = gr.Button(
f"{icon} {label}".strip(),
variant="secondary",
size="sm",
elem_classes=["sidebar-item"],
)
if on_navigate:
btn.click(fn=lambda p=path: on_navigate(p), inputs=[], outputs=[])
return sidebar