use leptos::prelude::*;
mod components;
mod renderer;
pub use components::{
get_code_theme_classes, get_enhanced_prose_classes, CodeBlockTheme, MarkdownClasses,
MarkdownOptions, MarkdownStyles,
};
pub use renderer::MarkdownRenderer;
#[component]
pub fn Markdown(
#[prop(into)]
content: String,
#[prop(optional)]
class: Option<String>,
#[prop(optional)]
options: Option<MarkdownOptions>,
) -> impl IntoView {
let renderer = MarkdownRenderer::new(options.unwrap_or_default());
match renderer.render(&content) {
Ok(rendered_content) => {
let base_classes = get_enhanced_prose_classes();
let wrapper_class = match class {
Some(c) => format!("{} {}", base_classes, c),
None => base_classes.to_string(),
};
view! {
<div class=wrapper_class>
{rendered_content}
</div>
}
.into_any()
}
Err(err) => {
leptos::logging::error!("Failed to render markdown: {}", err);
view! {
<div class="bg-red-50 dark:bg-red-950/30 border border-red-200 dark:border-red-800 rounded-lg p-4 text-red-800 dark:text-red-200">
<p class="font-medium">"Failed to render markdown content"</p>
<p class="text-sm mt-1">{err}</p>
</div>
}.into_any()
}
}
}
pub fn render_markdown_string(content: &str) -> Result<AnyView, String> {
let renderer = MarkdownRenderer::new(MarkdownOptions::default());
renderer.render(content)
}
pub fn render_markdown_with_options(
content: &str,
options: MarkdownOptions,
) -> Result<AnyView, String> {
let renderer = MarkdownRenderer::new(options);
renderer.render(content)
}