use api::http::Html; use i18n::{UiLocale, catalog}; use maud::html; use crate::share::account::types::AgreementDoc; use super::common; pub fn page_agreement(doc: &AgreementDoc, html_content: &str, locale: UiLocale) -> Html { let body = html! { div class="max-w-3xl mx-auto px-6 py-12" { div class="mb-8" { h1 class="text-3xl font-bold tracking-tight" { (doc.title) } p class="mt-2 text-sm text-gray-500" { (catalog::agreement_version(locale, &doc.version)) } } article class="prose prose-lg max-w-none" { (maud::PreEscaped(html_content)) } footer class="mt-12 border-t pt-6 text-sm text-gray-500" { (catalog::agreement_footer(locale)) } } }; common::page_shell(&doc.title, body, locale) } pub fn page_verify_result(ok: bool, locale: UiLocale) -> Html { let title = if ok { catalog::email_verified_title(locale) } else { catalog::verification_failed_title(locale) }; let message = if ok { catalog::email_verified_body(locale) } else { catalog::verification_failed_body(locale) }; let (bg, title_color) = if ok { ("bg-green-50", "text-green-800") } else { ("bg-red-50", "text-red-800") }; let box_classes = format!("{bg} rounded-xl py-10 px-8"); let heading_classes = format!("{title_color} text-2xl font-bold"); let body = html! { div class="max-w-md mx-auto px-6 py-20 text-center" { div class=(box_classes) { h1 class=(heading_classes) { (title) } p class="mt-4 text-gray-600" { (message) } } } }; common::page_shell(title, body, locale) } pub fn page_message(ok: bool, title: &str, message: &str, locale: UiLocale) -> Html { let bg = if ok { "bg-green-50" } else { "bg-blue-50" }; let title_color = if ok { "text-green-800" } else { "text-gray-900" }; let box_classes = format!("{bg} rounded-xl py-10 px-8"); let heading_classes = format!("{title_color} text-2xl font-bold"); let body = html! { div class="max-w-md mx-auto px-6 py-20 text-center" { div class=(box_classes) { h1 class=(heading_classes) { (title) } p class="mt-4 text-gray-600" { (message) } } } }; common::page_shell(title, body, locale) } pub fn render_markdown(input: &str) -> String { use pulldown_cmark::{Options, Parser, html}; let mut options = Options::empty(); options.insert(Options::ENABLE_TABLES); options.insert(Options::ENABLE_STRIKETHROUGH); let parser = Parser::new_ext(input, options); let mut output = String::new(); html::push_html(&mut output, parser); output }