Skip to main content

dioxus_docs_kit/
lib.rs

1//! # dioxus-docs-kit
2//!
3//! Reusable documentation site shell for Dioxus applications.
4//!
5//! Provides a complete docs layout with sidebar navigation, search modal,
6//! page navigation, OpenAPI API reference pages, and mobile drawer.
7//!
8//! ## Quick Start
9//!
10//! ```rust,ignore
11//! use dioxus::prelude::*;
12//! use dioxus_docs_kit::{DocsConfig, DocsRegistry, DocsContext, DocsLayout, DocsPageContent};
13//! use std::sync::LazyLock;
14//!
15//! static DOCS: LazyLock<DocsRegistry> = LazyLock::new(|| {
16//!     DocsConfig::new(include_str!("../docs/_nav.json"), doc_content_map())
17//!         .with_openapi("api-reference", include_str!("../docs/api-reference/spec.yaml"))
18//!         // .with_api_group_name("My API Docs")  // must match a group in _nav.json
19//!         .build()
20//! });
21//!
22//! #[component]
23//! fn MyDocsLayout() -> Element {
24//!     let nav = use_navigator();
25//!     let route = use_route::<Route>();
26//!     let current_path = use_memo(move || /* extract path from route */);
27//!     let docs_ctx = DocsContext {
28//!         current_path: current_path.into(),
29//!         base_path: "/docs".into(),
30//!         navigate: Callback::new(move |path: String| { /* push route */ }),
31//!     };
32//!     use_context_provider(|| &*DOCS as &'static DocsRegistry);
33//!     use_context_provider(|| docs_ctx);
34//!     rsx! { DocsLayout {} }
35//! }
36//! ```
37
38pub mod components;
39pub mod config;
40pub mod hooks;
41pub mod registry;
42
43use dioxus::prelude::*;
44
45/// Navigation bridge that decouples library components from the consumer's Route enum.
46///
47/// The consumer creates this in their docs layout wrapper and provides it via `use_context_provider`.
48#[derive(Clone)]
49pub struct DocsContext {
50    /// Current docs page path (e.g. "getting-started/introduction").
51    pub current_path: ReadSignal<String>,
52    /// Base URL path for docs (e.g. "/docs").
53    pub base_path: String,
54    /// Callback to navigate to a docs page by content path.
55    pub navigate: Callback<String>,
56}
57
58// Re-export config and registry
59pub use config::{DocsConfig, ThemeConfig};
60pub use registry::DocsRegistry;
61
62// Re-export types consumers need
63pub use registry::{ApiEndpointEntry, NavConfig, NavGroup, SearchEntry};
64
65// Re-export UI components
66pub use components::{
67    CurrentTheme, DocsLayout, DocsPageContent, DocsPageNav, DocsSidebar, DrawerOpen, LayoutOffsets,
68    MobileDrawer, SearchButton, SearchModal, ThemeToggle,
69};
70
71// Re-export hooks
72pub use hooks::{DocsProviders, use_docs_providers};
73
74// Re-export key dioxus-mdx types that consumers commonly need
75pub use dioxus_mdx::{
76    ApiOperation, ApiTag, DocContent, DocTableOfContents, EndpointPage, HttpMethod, OpenApiSpec,
77    ParsedDoc, extract_headers, highlight_code,
78};
79
80#[cfg(feature = "mermaid")]
81pub use dioxus_mdx::MermaidDiagram;
82
83/// Generates a `doc_content_map()` function that returns a
84/// `HashMap<&'static str, &'static str>` from the build-script output.
85///
86/// Place this at module level in your `main.rs`:
87///
88/// ```rust,ignore
89/// dioxus_docs_kit::doc_content_map!();
90/// ```
91///
92/// Requires `dioxus-docs-kit-build` in `[build-dependencies]` and a `build.rs`
93/// that calls `dioxus_docs_kit_build::generate_content_map("docs/_nav.json")`.
94#[macro_export]
95macro_rules! doc_content_map {
96    () => {
97        fn doc_content_map() -> ::std::collections::HashMap<&'static str, &'static str> {
98            include!(concat!(env!("OUT_DIR"), "/doc_content_generated.rs"))
99        }
100    };
101}