dioxus_mdx/components/
steps.rs1use dioxus::prelude::*;
4use regex::Regex;
5
6use crate::components::DocNodeRenderer;
7use crate::parser::{DocNode, StepsNode};
8
9#[derive(Props, Clone, PartialEq)]
11pub struct DocStepsProps {
12 pub steps: StepsNode,
14}
15
16#[component]
18pub fn DocSteps(props: DocStepsProps) -> Element {
19 rsx! {
20 div { class: "my-8",
21 div { class: "relative border-l-2 border-primary/20 ml-5 space-y-8",
23 for (i, step) in props.steps.steps.iter().enumerate() {
24 div { key: "{i}", class: "relative pl-10",
25 span {
27 class: "absolute left-0 top-0 -translate-x-1/2 flex items-center justify-center w-7 h-7 bg-primary text-primary-content rounded-full font-semibold text-sm shadow-sm",
28 "{i + 1}"
29 }
30 div {
32 h4 { class: "font-semibold text-base text-base-content mb-2",
34 {clean_step_title(&step.title)}
36 }
37 StepContent { content: step.content.clone() }
39 }
40 }
41 }
42 }
43 }
44 }
45}
46
47fn clean_step_title(title: &str) -> String {
49 let re = Regex::new(r"^Step\s+\d+[:.]\s*").unwrap();
51 re.replace(title, "").trim().to_string()
52}
53
54#[derive(Props, Clone, PartialEq)]
56struct StepContentProps {
57 content: Vec<DocNode>,
58}
59
60#[component]
62fn StepContent(props: StepContentProps) -> Element {
63 rsx! {
64 div { class: "prose prose-sm max-w-none",
65 for (i, node) in props.content.iter().enumerate() {
66 DocNodeRenderer { key: "{i}", node: node.clone() }
67 }
68 }
69 }
70}