Skip to content

Aadv1k/react-documenter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

87fc3f5 · Oct 17, 2023

History

19 Commits
Oct 17, 2023
Oct 17, 2023
Oct 17, 2023
Oct 16, 2023
Oct 16, 2023
Oct 17, 2023
Oct 17, 2023
Oct 17, 2023
Oct 17, 2023
Oct 17, 2023
Oct 16, 2023
Oct 17, 2023

Repository files navigation

React Documenter

Untyled React Components for Building Documentation

  • Don't Use This If: You need a fast, concise, or fun documentation solution. Static Site Generators (SSGs) are more suitable for such cases.
  • Use This If: You require your documentation to share the same global state as your UI (eg shifting api keys if the user is registered)

a previe of what the library can do

Quickstart

npm install --save react-documenter

Here is a small example with mock data. See a more extensive example down below

import { Menu, mockData, DocumentStore } from "react-documenter"

// ideally this should be in a useEffect hook
const store = new DocumentStore();
mockData.forEach(store.set);

export default function Example() {
    return (
      <Menu store={store} />
    )
}

Components

Menu

A Nestable Sidebar Menu

  • collapsible: (Boolean) Defines if clicking on a parent entry collapses its children.
  • store: (DocumentStore) Defines the content for the menu to render.
  • linkAs: (String or React Node) Pass a component or a tag to be used as the link, e.g., a or <Link />.
  • linkHrefProp: (String) The prop representing the "href" on the link component, e.g., href or to.
  • onLinkClick: (Function: (url: string) => void) Defines what to do when a link is clicked.

Viewer

The Viewer Component with Adjacent Neighbor Navigation

  • pages: (Array) An array of { url: string, content: string }.
  • currentPage: (FlatPage) The current page, used to determine neighbor navigation.
  • onPrevClick: (Function: (url: string) => void) Invoked when clicking the "previous page."
  • onNextClick: (Function: (url: string) => void) Invoked when clicking the "next page."

DocumentStore

(Not a Component) - A Class Used to Store Content

  • DocumentStore.get(): Returns an Array<Page>.
  • DocumentStore.getNormalized(): Flattens all Page and their children into a 1D array of FlatPage.
  • DocumentStore.set(Page): Sets a page with its corresponding URL into the map.

Additionally, mockData is also exported, this is an Array<Page> where Page is

interface Page {
  title: string;
  url: string;
  content: string;
  children: Array<Page>;
}

Styling

Check out example/src/App.css for a reference.

Here is a visual representation of all of the CSS classes and what they correspond to

CSS Guide

Example

Here is an example of how you would use this with react-router.

You can also check this as a working example with styles in example/src/App.tsx.

import { useEffect, useState } from "react";
import { useNavigate, Routes, Route } from "react-router";

import { Menu, DocumentStore, Viewer, mockData } from "react-documenter";

import "./App.css"

export default function App() {
  const navigate = useNavigate();
  const [store, setStore] = useState(null);

  useEffect(() => {
    const newStore = new DocumentStore();
    mockData.forEach((page) => newStore.set(page));
    setStore(newStore);
  }, []);

  return (
    <>
      <Menu
        collapsible={false}
        store={store}
        linkAs="a"
        linkHrefProp="href"
        onLinkClick={navigate}
      />
      <Routes>
        {store.getNormalized().map((page, index) => (
          <Route
            key={index}
            path={page.url}
            element={
              <Viewer
                pages={store.getNormalized()}
                currentPage={page}
                onPrevClick={navigate}
                onNextClick={navigate}
              />
            }
          />
        ))}
      </Routes>
    </>
  );
}