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