@ts-for-gir/typedoc-theme 4.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +45 -0
- package/src/context.ts +78 -0
- package/src/index.ts +6 -0
- package/src/partials/footer.ts +4 -0
- package/src/partials/header.ts +153 -0
- package/src/partials/layout.ts +123 -0
- package/src/partials/module-reflection.ts +385 -0
- package/src/partials/navigation.ts +26 -0
- package/src/partials/page-navigation.ts +88 -0
- package/src/partials/page-sidebar.ts +10 -0
- package/src/partials/sidebar.ts +256 -0
- package/src/partials/toolbar.ts +19 -0
- package/src/static/favicon/apple-touch-icon.png +0 -0
- package/src/static/favicon/favicon-96x96.png +0 -0
- package/src/static/favicon/favicon.ico +0 -0
- package/src/static/favicon/web-app-manifest-192x192.png +0 -0
- package/src/static/favicon/web-app-manifest-512x512.png +0 -0
- package/src/static/gi-docgen-inherited.js +55 -0
- package/src/static/logo.png +0 -0
- package/src/static/logo_x4.png +0 -0
- package/src/static/style.css +995 -0
- package/src/templates/reflection.ts +211 -0
- package/src/theme.ts +82 -0
- package/src/utils.ts +265 -0
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ts-for-gir/typedoc-theme",
|
|
3
|
+
"version": "4.0.0-beta.41",
|
|
4
|
+
"description": "Custom TypeDoc theme inspired by gi-docgen for ts-for-gir",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"module": "src/index.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=18"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"check": "tsc --noEmit"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/gjsify/ts-for-gir.git"
|
|
17
|
+
},
|
|
18
|
+
"author": "Pascal Garber <pascal@mailfreun.de>",
|
|
19
|
+
"files": [
|
|
20
|
+
"src"
|
|
21
|
+
],
|
|
22
|
+
"license": "Apache-2.0",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/gjsify/ts-for-gir/issues"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/gjsify/ts-for-gir#readme",
|
|
27
|
+
"keywords": [
|
|
28
|
+
"typedoc",
|
|
29
|
+
"theme",
|
|
30
|
+
"gi-docgen",
|
|
31
|
+
"gir",
|
|
32
|
+
"documentation"
|
|
33
|
+
],
|
|
34
|
+
"exports": {
|
|
35
|
+
".": "./src/index.ts"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@ts-for-gir/tsconfig": "^4.0.0-beta.41",
|
|
39
|
+
"@types/node": "^24.12.0",
|
|
40
|
+
"typescript": "^5.9.3"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"typedoc": "^0.28.17"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/context.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Options, PageEvent, ProjectReflection, Reflection, Router } from "typedoc";
|
|
2
|
+
import { DefaultThemeRenderContext, JSX } from "typedoc";
|
|
3
|
+
import { giDocgenFooter } from "./partials/footer.ts";
|
|
4
|
+
import { giDocgenHeader } from "./partials/header.ts";
|
|
5
|
+
import { giDocgenLayout } from "./partials/layout.ts";
|
|
6
|
+
import {
|
|
7
|
+
giDocgenModuleMemberSummary,
|
|
8
|
+
giDocgenModuleReflection,
|
|
9
|
+
renderCategorizedProject,
|
|
10
|
+
} from "./partials/module-reflection.ts";
|
|
11
|
+
import { giDocgenNavigation } from "./partials/navigation.ts";
|
|
12
|
+
import { giDocgenPageNavigation } from "./partials/page-navigation.ts";
|
|
13
|
+
import { giDocgenPageSidebar } from "./partials/page-sidebar.ts";
|
|
14
|
+
import { giDocgenSidebar } from "./partials/sidebar.ts";
|
|
15
|
+
import { giDocgenToolbar } from "./partials/toolbar.ts";
|
|
16
|
+
import { giDocgenReflectionTemplate } from "./templates/reflection.ts";
|
|
17
|
+
import type { GiDocgenTheme } from "./theme.ts";
|
|
18
|
+
import { girMemberBadgesFromReflection } from "./utils.ts";
|
|
19
|
+
|
|
20
|
+
function bind<F, L extends unknown[], R>(fn: (f: F, ...a: L) => R, first: F) {
|
|
21
|
+
return (...r: L) => fn(first, ...r);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class GiDocgenThemeRenderContext extends DefaultThemeRenderContext {
|
|
25
|
+
constructor(router: Router, theme: GiDocgenTheme, page: PageEvent<Reflection>, options: Options) {
|
|
26
|
+
super(router, theme, page, options);
|
|
27
|
+
|
|
28
|
+
this.defaultLayout = bind(giDocgenLayout, this);
|
|
29
|
+
this.navigation = bind(giDocgenNavigation, this);
|
|
30
|
+
this.sidebar = bind(giDocgenSidebar, this);
|
|
31
|
+
this.toolbar = bind(giDocgenToolbar, this);
|
|
32
|
+
this.footer = bind(giDocgenFooter, this);
|
|
33
|
+
this.header = bind(giDocgenHeader, this);
|
|
34
|
+
this.pageNavigation = bind(giDocgenPageNavigation, this);
|
|
35
|
+
this.pageSidebar = bind(giDocgenPageSidebar, this);
|
|
36
|
+
this.moduleReflection = bind(giDocgenModuleReflection, this);
|
|
37
|
+
this.moduleMemberSummary = bind(giDocgenModuleMemberSummary, this);
|
|
38
|
+
this.reflectionTemplate = bind(giDocgenReflectionTemplate, this);
|
|
39
|
+
|
|
40
|
+
// Override indexTemplate to render README + categorized module list on index.html
|
|
41
|
+
this.indexTemplate = (props: PageEvent<ProjectReflection>) => {
|
|
42
|
+
const children = props.model.children ?? [];
|
|
43
|
+
return JSX.createElement(
|
|
44
|
+
JSX.Fragment,
|
|
45
|
+
null,
|
|
46
|
+
// README content
|
|
47
|
+
JSX.createElement(
|
|
48
|
+
"div",
|
|
49
|
+
{ class: "tsd-panel tsd-typography" },
|
|
50
|
+
JSX.createElement(JSX.Raw, { html: this.markdown(props.model.readme || []) }),
|
|
51
|
+
),
|
|
52
|
+
// Categorized module sections
|
|
53
|
+
renderCategorizedProject(this, props.model, children),
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Remove kind icons (V, F, C, T, etc.) — not needed in the gi-docgen theme.
|
|
58
|
+
this.reflectionIcon = () => JSX.createElement(JSX.Fragment, null);
|
|
59
|
+
|
|
60
|
+
// Extend reflectionFlags to add GIR badges (signal, virtual, property flags, deprecated, since).
|
|
61
|
+
// Only on the member heading, not on its signature (avoids duplicate badges).
|
|
62
|
+
const parentFlags = this.reflectionFlags.bind(this);
|
|
63
|
+
this.reflectionFlags = (props: Reflection) => {
|
|
64
|
+
const base = parentFlags(props);
|
|
65
|
+
if (props.isSignature()) return base;
|
|
66
|
+
const badges = girMemberBadgesFromReflection(props);
|
|
67
|
+
if (badges.length === 0) return base;
|
|
68
|
+
return JSX.createElement(
|
|
69
|
+
JSX.Fragment,
|
|
70
|
+
null,
|
|
71
|
+
base,
|
|
72
|
+
...badges.map((b) =>
|
|
73
|
+
JSX.createElement("code", { class: `tsd-tag tsd-tag-gir tsd-tag-gir-${b.cssModifier}` }, b.label),
|
|
74
|
+
),
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { PageEvent, Reflection } from "typedoc";
|
|
2
|
+
import { JSX, ReflectionKind } from "typedoc";
|
|
3
|
+
import type { GiDocgenThemeRenderContext } from "../context.ts";
|
|
4
|
+
import {
|
|
5
|
+
type GirNamespaceMetadata,
|
|
6
|
+
getGirNamespaceMetadata,
|
|
7
|
+
getGirTypeFromComment,
|
|
8
|
+
girKindInfoFromTag,
|
|
9
|
+
} from "../utils.ts";
|
|
10
|
+
|
|
11
|
+
/** Helper: create a table row with label and value. */
|
|
12
|
+
function metaRow(label: string, value: JSX.Element | string): JSX.Element {
|
|
13
|
+
return JSX.createElement(
|
|
14
|
+
"tr",
|
|
15
|
+
null,
|
|
16
|
+
JSX.createElement("td", null, JSX.createElement("em", null, label)),
|
|
17
|
+
JSX.createElement("td", null, value),
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Helper: create a linked table row. */
|
|
22
|
+
function metaLinkRow(label: string, url: string): JSX.Element {
|
|
23
|
+
return metaRow(label, JSX.createElement("a", { href: url, target: "_blank" }, url));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Render metadata info block for module pages, consistent with sidebar and gi-docgen style. */
|
|
27
|
+
function renderModuleMetadata(
|
|
28
|
+
context: GiDocgenThemeRenderContext,
|
|
29
|
+
nsMeta: GirNamespaceMetadata,
|
|
30
|
+
packageVersion?: string,
|
|
31
|
+
): JSX.Element {
|
|
32
|
+
const tableRows: JSX.Element[] = [];
|
|
33
|
+
if (nsMeta.version) tableRows.push(metaRow("API Version", nsMeta.version));
|
|
34
|
+
if (nsMeta.libraryVersion) tableRows.push(metaRow("Library Version", nsMeta.libraryVersion));
|
|
35
|
+
if (packageVersion && packageVersion !== nsMeta.libraryVersion) {
|
|
36
|
+
tableRows.push(metaRow("Package Version", packageVersion));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (nsMeta.license) tableRows.push(metaRow("License", nsMeta.license));
|
|
40
|
+
if (nsMeta.websiteUrl) tableRows.push(metaLinkRow("Website", nsMeta.websiteUrl));
|
|
41
|
+
if (nsMeta.cDocsUrl) tableRows.push(metaLinkRow("Original Docs", nsMeta.cDocsUrl));
|
|
42
|
+
|
|
43
|
+
// Dependencies — as comma-separated links in a single table row
|
|
44
|
+
if (nsMeta.dependencies.length > 0) {
|
|
45
|
+
const depElements = nsMeta.dependencies.map((dep, i) => {
|
|
46
|
+
const depName = `${dep.namespace}-${dep.version}`;
|
|
47
|
+
const depMod = context.page.project.children?.find(
|
|
48
|
+
(c) => c.name === depName || c.name === `@girs/${depName.toLowerCase()}`,
|
|
49
|
+
);
|
|
50
|
+
const link = depMod
|
|
51
|
+
? JSX.createElement("a", { href: context.urlTo(depMod) }, `${dep.namespace} ${dep.version}`)
|
|
52
|
+
: JSX.createElement(JSX.Fragment, null, `${dep.namespace} ${dep.version}`);
|
|
53
|
+
return JSX.createElement(JSX.Fragment, null, i > 0 && ", ", link);
|
|
54
|
+
});
|
|
55
|
+
tableRows.push(metaRow("Dependencies", JSX.createElement(JSX.Fragment, null, ...depElements)));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return JSX.createElement(
|
|
59
|
+
"div",
|
|
60
|
+
{ class: "gi-docgen-module-metadata" },
|
|
61
|
+
nsMeta.description && JSX.createElement("p", { class: "gi-docgen-meta-description" }, nsMeta.description),
|
|
62
|
+
JSX.createElement("table", null, JSX.createElement("tbody", null, ...tableRows)),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Strip NPM scope prefix from a package name, e.g. "@girs/glib-2.0" → "glib-2.0". */
|
|
67
|
+
function stripScope(name: string): string {
|
|
68
|
+
return name.replace(/^@[^/]+\//, "");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Render a reflection's display name (scope prefix stripped if requested). */
|
|
72
|
+
function renderReflName(refl: Reflection, stripScopePrefix = false): JSX.Element {
|
|
73
|
+
let name = refl.name === "default" ? "default" : refl.name;
|
|
74
|
+
if (stripScopePrefix && name.startsWith("@")) name = stripScope(name);
|
|
75
|
+
return JSX.createElement(JSX.Fragment, null, name);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export const giDocgenHeader = (context: GiDocgenThemeRenderContext, props: PageEvent<Reflection>) => {
|
|
79
|
+
const isSpecialPage = props.url === "index.html" || props.url === "hierarchy.html";
|
|
80
|
+
|
|
81
|
+
let kindString = "";
|
|
82
|
+
let renderTitle = true;
|
|
83
|
+
|
|
84
|
+
const headings = context.options.getValue("headings") as { readme: boolean; document: boolean };
|
|
85
|
+
|
|
86
|
+
if (props.model.isProject()) {
|
|
87
|
+
if (props.url === "index.html" && "readme" in props.model && props.model.readme) {
|
|
88
|
+
renderTitle = headings.readme;
|
|
89
|
+
}
|
|
90
|
+
} else if (props.model.isDocument()) {
|
|
91
|
+
renderTitle = headings.document;
|
|
92
|
+
} else {
|
|
93
|
+
kindString = ReflectionKind.singularString(props.model.kind);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Append GIR kind in parentheses, e.g. "Class (GI Struct)" or "Namespace (GI Enum)".
|
|
97
|
+
// Always shown when a @gir-type tag is present.
|
|
98
|
+
if (kindString) {
|
|
99
|
+
const girType = getGirTypeFromComment(props.model);
|
|
100
|
+
if (girType) {
|
|
101
|
+
const girInfo = girKindInfoFromTag(girType);
|
|
102
|
+
if (girInfo) {
|
|
103
|
+
kindString = `${kindString} (GI ${girInfo.label})`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Build full breadcrumb path (same as TypeDoc's breadcrumb: walk up until no parent, exclude root project)
|
|
109
|
+
const path: Reflection[] = [];
|
|
110
|
+
let refl: Reflection = props.model;
|
|
111
|
+
while (refl.parent) {
|
|
112
|
+
path.push(refl);
|
|
113
|
+
refl = refl.parent;
|
|
114
|
+
}
|
|
115
|
+
path.reverse(); // now [topModule, ..., currentItem]
|
|
116
|
+
|
|
117
|
+
// Show metadata info block on module pages (between header and README)
|
|
118
|
+
const isModulePage =
|
|
119
|
+
!props.model.isProject() && props.model.kindOf(ReflectionKind.Module) && !props.model.parent?.parent;
|
|
120
|
+
const nsMeta = isModulePage ? getGirNamespaceMetadata(props.model) : undefined;
|
|
121
|
+
|
|
122
|
+
return JSX.createElement(
|
|
123
|
+
"div",
|
|
124
|
+
{ class: "gi-docgen-page-title" },
|
|
125
|
+
kindString && JSX.createElement("span", { class: "gi-docgen-object-type" }, kindString),
|
|
126
|
+
renderTitle &&
|
|
127
|
+
JSX.createElement(
|
|
128
|
+
"h1",
|
|
129
|
+
null,
|
|
130
|
+
!isSpecialPage && path.length > 1
|
|
131
|
+
? path.map((r, i) => {
|
|
132
|
+
const isLast = i === path.length - 1;
|
|
133
|
+
const url = context.urlTo(r);
|
|
134
|
+
return JSX.createElement(
|
|
135
|
+
JSX.Fragment,
|
|
136
|
+
null,
|
|
137
|
+
i > 0 && JSX.createElement("span", { class: "gi-docgen-breadcrumb-sep" }, " ▶ "),
|
|
138
|
+
isLast || !url
|
|
139
|
+
? renderReflName(r, true)
|
|
140
|
+
: JSX.createElement("a", { href: url }, renderReflName(r, true)),
|
|
141
|
+
);
|
|
142
|
+
})
|
|
143
|
+
: renderReflName(props.model),
|
|
144
|
+
context.reflectionFlags(props.model),
|
|
145
|
+
),
|
|
146
|
+
nsMeta &&
|
|
147
|
+
renderModuleMetadata(
|
|
148
|
+
context,
|
|
149
|
+
nsMeta,
|
|
150
|
+
(props.model as unknown as { packageVersion?: string }).packageVersion || nsMeta.packageVersion,
|
|
151
|
+
),
|
|
152
|
+
);
|
|
153
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { PageEvent, Reflection, RenderTemplate } from "typedoc";
|
|
2
|
+
import { JSX } from "typedoc";
|
|
3
|
+
import type { GiDocgenThemeRenderContext } from "../context.ts";
|
|
4
|
+
import { getDisplayName, getHierarchyRoots } from "../utils.ts";
|
|
5
|
+
|
|
6
|
+
export const giDocgenLayout = (
|
|
7
|
+
context: GiDocgenThemeRenderContext,
|
|
8
|
+
template: RenderTemplate<PageEvent<Reflection>>,
|
|
9
|
+
props: PageEvent<Reflection>,
|
|
10
|
+
) =>
|
|
11
|
+
JSX.createElement(
|
|
12
|
+
"html",
|
|
13
|
+
{ class: "default", lang: context.options.getValue("lang"), "data-base": context.relativeURL("./") },
|
|
14
|
+
JSX.createElement(
|
|
15
|
+
"head",
|
|
16
|
+
null,
|
|
17
|
+
JSX.createElement("meta", { charset: "utf-8" }),
|
|
18
|
+
context.hook("head.begin", context),
|
|
19
|
+
JSX.createElement("meta", { "http-equiv": "x-ua-compatible", content: "IE=edge" }),
|
|
20
|
+
JSX.createElement(
|
|
21
|
+
"title",
|
|
22
|
+
null,
|
|
23
|
+
props.model.isProject()
|
|
24
|
+
? getDisplayName(props.model)
|
|
25
|
+
: `${getDisplayName(props.model)} | ${getDisplayName(props.project)}`,
|
|
26
|
+
),
|
|
27
|
+
JSX.createElement("meta", { name: "description", content: `Documentation for ${props.project.name}` }),
|
|
28
|
+
JSX.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
|
|
29
|
+
|
|
30
|
+
JSX.createElement("link", {
|
|
31
|
+
rel: "icon",
|
|
32
|
+
type: "image/png",
|
|
33
|
+
href: context.relativeURL("assets/favicon-96x96.png", true),
|
|
34
|
+
sizes: "96x96",
|
|
35
|
+
}),
|
|
36
|
+
JSX.createElement("link", {
|
|
37
|
+
rel: "shortcut icon",
|
|
38
|
+
href: context.relativeURL("assets/favicon.ico", true),
|
|
39
|
+
}),
|
|
40
|
+
JSX.createElement("link", {
|
|
41
|
+
rel: "apple-touch-icon",
|
|
42
|
+
sizes: "180x180",
|
|
43
|
+
href: context.relativeURL("assets/apple-touch-icon.png", true),
|
|
44
|
+
}),
|
|
45
|
+
JSX.createElement("meta", { name: "apple-mobile-web-app-title", content: props.project.name || "TS for GIR" }),
|
|
46
|
+
JSX.createElement("link", {
|
|
47
|
+
rel: "manifest",
|
|
48
|
+
href: context.relativeURL("assets/site.webmanifest", true),
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
JSX.createElement("link", { rel: "stylesheet", href: context.relativeURL("assets/style.css", true) }),
|
|
52
|
+
JSX.createElement("link", { rel: "stylesheet", href: context.relativeURL("assets/highlight.css", true) }),
|
|
53
|
+
JSX.createElement("link", { rel: "stylesheet", href: context.relativeURL("assets/gi-docgen.css", true) }),
|
|
54
|
+
context.options.getValue("customCss") &&
|
|
55
|
+
JSX.createElement("link", { rel: "stylesheet", href: context.relativeURL("assets/custom.css", true) }),
|
|
56
|
+
JSX.createElement("script", { defer: true, src: context.relativeURL("assets/main.js", true) }),
|
|
57
|
+
JSX.createElement("script", { defer: true, src: context.relativeURL("assets/gi-docgen-inherited.js", true) }),
|
|
58
|
+
context.options.getValue("customJs") &&
|
|
59
|
+
JSX.createElement("script", { defer: true, src: context.relativeURL("assets/custom.js", true) }),
|
|
60
|
+
JSX.createElement("script", {
|
|
61
|
+
async: true,
|
|
62
|
+
src: context.relativeURL("assets/icons.js", true),
|
|
63
|
+
id: "tsd-icons-script",
|
|
64
|
+
}),
|
|
65
|
+
JSX.createElement("script", {
|
|
66
|
+
async: true,
|
|
67
|
+
src: context.relativeURL("assets/search.js", true),
|
|
68
|
+
id: "tsd-search-script",
|
|
69
|
+
}),
|
|
70
|
+
JSX.createElement("script", {
|
|
71
|
+
async: true,
|
|
72
|
+
src: context.relativeURL("assets/navigation.js", true),
|
|
73
|
+
id: "tsd-nav-script",
|
|
74
|
+
}),
|
|
75
|
+
!!getHierarchyRoots(props.project).length &&
|
|
76
|
+
JSX.createElement("script", {
|
|
77
|
+
async: true,
|
|
78
|
+
src: context.relativeURL("assets/hierarchy.js", true),
|
|
79
|
+
id: "tsd-hierarchy-script",
|
|
80
|
+
}),
|
|
81
|
+
context.hook("head.end", context),
|
|
82
|
+
),
|
|
83
|
+
JSX.createElement(
|
|
84
|
+
"body",
|
|
85
|
+
null,
|
|
86
|
+
context.hook("body.begin", context),
|
|
87
|
+
JSX.createElement(
|
|
88
|
+
"script",
|
|
89
|
+
null,
|
|
90
|
+
JSX.createElement(JSX.Raw, {
|
|
91
|
+
html: 'document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";',
|
|
92
|
+
}),
|
|
93
|
+
JSX.createElement(JSX.Raw, { html: 'document.body.style.display="none";' }),
|
|
94
|
+
JSX.createElement(JSX.Raw, {
|
|
95
|
+
html: 'setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)',
|
|
96
|
+
}),
|
|
97
|
+
),
|
|
98
|
+
|
|
99
|
+
JSX.createElement(
|
|
100
|
+
"div",
|
|
101
|
+
{ id: "gi-docgen-body-wrapper" },
|
|
102
|
+
JSX.createElement("nav", { id: "gi-docgen-sidebar" }, context.sidebar(props)),
|
|
103
|
+
JSX.createElement(
|
|
104
|
+
"section",
|
|
105
|
+
{ id: "gi-docgen-main" },
|
|
106
|
+
JSX.createElement(
|
|
107
|
+
"div",
|
|
108
|
+
{ class: "gi-docgen-content" },
|
|
109
|
+
context.toolbar(props),
|
|
110
|
+
context.hook("content.begin", context),
|
|
111
|
+
context.header(props),
|
|
112
|
+
template(props),
|
|
113
|
+
context.hook("content.end", context),
|
|
114
|
+
context.footer(),
|
|
115
|
+
),
|
|
116
|
+
),
|
|
117
|
+
JSX.createElement("nav", { id: "gi-docgen-toc" }, context.pageSidebar(props)),
|
|
118
|
+
),
|
|
119
|
+
|
|
120
|
+
JSX.createElement("div", { class: "overlay" }),
|
|
121
|
+
context.hook("body.end", context),
|
|
122
|
+
),
|
|
123
|
+
);
|