UNPKG

shelving

Version:

Toolkit for using data in JavaScript.

39 lines (38 loc) 3.76 kB
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { queryElements } from "../../util/element.js"; import { Section } from "../block/Block.js"; import { Definition, Definitions } from "../block/Definitions.js"; import { Heading } from "../block/Heading.js"; import { Preformatted } from "../block/Preformatted.js"; import { Prose } from "../block/Prose.js"; import { Title } from "../block/Title.js"; import { Code } from "../inline/Code.js"; import { Markup } from "../misc/Markup.js"; import { Page } from "../page/Page.js"; import { Flex } from "../style/Flex.js"; import { TreeCards } from "../tree/TreeCards.js"; import { DocumentationKind } from "./DocumentationKind.js"; const DEFAULT_TYPE = "unknown"; /** Documentation `kind`s grouped into card sections, in display order — pluralised, sentence-case headings. */ const KIND_SECTIONS = [ ["function", "Functions"], ["class", "Classes"], ["interface", "Interfaces"], ["type", "Types"], ["constant", "Constants"], ["method", "Methods"], ["property", "Properties"], ]; /** * Page renderer for a `tree-documentation` element (also used for `tree-file` elements, whose props are a compatible subset). * - Renders title, signatures (one per overload), content, parameters, returns, throws, and examples. * - Child symbols are grouped by `kind` into card sections (Functions, Classes, Methods, Properties, …), each under its own heading. * - All sections are conditional — only render when they have entries. */ export function DocumentationPage({ path, title, name, kind, description, content, signatures, params, returns, throws, examples, children, }) { return (_jsxs(Page, { title: title ?? name, description: description, children: [_jsx(Title, { children: _jsxs(Flex, { left: true, wrap: true, children: [title ?? name, kind && _jsx(DocumentationKind, { kind: kind })] }) }), signatures?.map(sig => (_jsx(Preformatted, { children: sig }, sig))), content && (_jsx(Prose, { children: _jsx(Markup, { children: content }) })), params?.length && (_jsxs(Section, { children: [_jsx(Heading, { children: "Parameters" }), _jsx(Definitions, { row: true, children: params.map(({ name, type = DEFAULT_TYPE, description = "", optional }) => (_jsx(Definition, { term: _jsxs(_Fragment, { children: [_jsx(Code, { children: name }), ": ", _jsx(Code, { children: type }), optional && _jsx(_Fragment, { children: " (optional)" })] }), children: description }, `${name}-${type}-${description}`))) })] })), returns?.length && (_jsxs(Section, { children: [_jsx(Heading, { children: "Returns" }), _jsx(Definitions, { row: true, children: returns.map(({ type = DEFAULT_TYPE, description = "" }) => (_jsx(Definition, { term: _jsx(Code, { children: type }), children: description }, `${type}-${description}`))) })] })), throws?.length && (_jsxs(Section, { children: [_jsx(Heading, { children: "Throws" }), _jsx(Definitions, { row: true, children: throws.map(({ type = DEFAULT_TYPE, description = "" }) => (_jsx(Definition, { term: _jsx(Code, { children: type }), children: description }, `${type}-${description}`))) })] })), examples?.length && (_jsxs(Section, { children: [_jsx(Heading, { children: "Examples" }), examples.map(({ description }) => (_jsx(Preformatted, { children: description }, description)))] })), KIND_SECTIONS.map(([kind, label]) => { // Pre-filter the children for this kind; only render the section when it has cards. const group = Array.from(queryElements(children, { "props.kind": kind })); return group.length ? (_jsxs(Section, { children: [_jsx(Heading, { children: label }), _jsx(TreeCards, { path: path, children: group })] }, kind)) : null; })] })); }