/// Landing Page Handler /// /// Generates HTML landing page for the Nostr relay. use crate::config::Config; /// Generate the common base CSS used across all pages fn get_base_css() -> &'static str { r#":root { --brand: #4434FF; --brand-light: #6b5fff; --bg: #0a0a0f; --surface: #12121a; --border: #1e1e2e; --text: #e4e4eb; --text-muted: #a8a8bd; --error: #ff4444; --success: #22c55e; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', sans-serif; line-height: 1.6; background: var(--bg); color: var(--text); min-height: 100vh; } a { color: var(--brand-light); text-decoration: none; } a:hover { text-decoration: underline; } code { background: var(--border); padding: 4px 8px; border-radius: 4px; font-family: 'SF Mono', 'Consolas', monospace; font-size: 0.875rem; color: var(--brand-light); } .footer { margin-top: 48px; padding-top: 24px; border-top: 1px solid var(--border); text-align: center; color: var(--text-muted); font-size: 0.875rem; }"# } /// Generate the HTML landing page pub fn get_html(config: &Config) -> String { format!( include_str!("../../templates/landing.html"), base_css = get_base_css(), relay_name = config.relay_name, relay_description = config.relay_description, ) } /// Generate a generic 404 page for unknown paths /// /// Used for any path that doesn't match a known route pub fn get_generic_404_html(config: &Config, path: &str) -> String { format!( r##" Not Found - {relay_name}
404

Page Not Found

The page you're looking for doesn't exist.

Requested Path
{path}
← Back to {relay_name}
"##, base_css = get_base_css(), relay_name = config.relay_name, path = path, ) } /// Generate a 404 page for a non-existent repository /// /// GRASP-01: "...and a 404 page for repositories it doesn't host" pub fn get_404_html(config: &Config, npub: &str, identifier: &str) -> String { format!( r##" Repository Not Found - {relay_name}
404

Repository Not Found

This repository doesn't exist on this GRASP server.

Owner {npub}
Repository {identifier}
The repository may not have been announced to this server, or the URL may be incorrect.
← Back to {relay_name}
"##, base_css = get_base_css(), relay_name = config.relay_name, npub = npub, identifier = identifier, ) } /// Generate a webpage for an existing repository /// /// GRASP-01: "SHOULD serve a webpage at the same endpoint linking to git nostr client(s) /// to browse the repository" pub fn get_repo_html(config: &Config, npub: &str, identifier: &str) -> String { let clone_url = format!( "http://{}/{}/{}.git", config.domain, npub, identifier ); format!( r##" {identifier} - {relay_name}

{identifier}

Git repository hosted on {relay_name}

Repository Info
Owner {npub}
Identifier {identifier}
Clone
git clone {clone_url}
Browse with Git Nostr Clients
gitworkshop.dev Web-based repository browser
Visit →
ngit Command-line Git + Nostr tool
GitHub →
Documentation
"##, base_css = get_base_css(), relay_name = config.relay_name, npub = npub, identifier = identifier, clone_url = clone_url, ) }