|
11 | 11 | from reflex_site_shared.route import Route |
12 | 12 |
|
13 | 13 | from reflex_docs.docgen_pipeline import get_docgen_toc, render_docgen_document |
14 | | -from reflex_docs.pages.docs.component import multi_docs |
| 14 | +from reflex_docs.pages.docs.component import ( |
| 15 | + get_related_from_frontmatter, |
| 16 | + get_seo_from_frontmatter, |
| 17 | + multi_docs, |
| 18 | + related_links_footer, |
| 19 | + seo_kwargs, |
| 20 | +) |
15 | 21 | from reflex_docs.pages.library_previews import components_previews_pages |
16 | 22 | from reflex_docs.templates.docpage import docpage |
17 | 23 | from reflex_docs.whitelist import _check_whitelisted_path |
@@ -182,13 +188,21 @@ def resolve_doc_route(doc: str, title: str) -> ResolvedDoc | None: |
182 | 188 | return ResolvedDoc(route=route, display_title=display_title, category=category) |
183 | 189 |
|
184 | 190 |
|
185 | | -def make_docpage(route: str, title: str, doc_virtual: str, render_fn): |
186 | | - """Wrap a render function as a docpage, setting module metadata.""" |
| 191 | +def make_docpage(route: str, title: str, doc_virtual: str, render_fn, **docpage_kwargs): |
| 192 | + """Wrap a render function as a docpage, setting module metadata. |
| 193 | +
|
| 194 | + Args: |
| 195 | + route: The site route for this page. |
| 196 | + title: The page title. |
| 197 | + doc_virtual: The virtual path used for module metadata. |
| 198 | + render_fn: The function that returns the page component. |
| 199 | + **docpage_kwargs: Extra keyword args forwarded to ``docpage`` (SEO, etc.). |
| 200 | + """ |
187 | 201 | doc_path = Path(doc_virtual) |
188 | 202 | render_fn.__module__ = ".".join(doc_path.parts[:-1]) |
189 | 203 | render_fn.__name__ = doc_path.stem |
190 | 204 | render_fn.__qualname__ = doc_path.stem |
191 | | - return docpage(set_path=route, t=title)(render_fn) |
| 205 | + return docpage(set_path=route, t=title, **docpage_kwargs)(render_fn) |
192 | 206 |
|
193 | 207 |
|
194 | 208 | def handle_library_doc( |
@@ -223,15 +237,27 @@ def get_component_docgen(virtual_doc: str, actual_path: str, title: str): |
223 | 237 | if virtual_doc.startswith("docs/library"): |
224 | 238 | return handle_library_doc(virtual_doc, actual_path, title, resolved) |
225 | 239 |
|
226 | | - def comp(_actual=actual_path, _virtual=virtual_doc): |
| 240 | + seo = get_seo_from_frontmatter(actual_path) |
| 241 | + related = get_related_from_frontmatter(actual_path) |
| 242 | + seo_extras = seo_kwargs(seo, resolved.display_title, resolved.route) |
| 243 | + |
| 244 | + def comp(_actual=actual_path, _virtual=virtual_doc, _related=related): |
227 | 245 | toc = get_docgen_toc(_actual) |
228 | 246 | doc_content = Path(_actual).read_text(encoding="utf-8") |
229 | 247 | rendered = render_docgen_document( |
230 | 248 | virtual_filepath=_virtual, actual_filepath=_actual |
231 | 249 | ) |
232 | | - return ((toc, doc_content), rendered) |
| 250 | + footer = related_links_footer(_related) |
| 251 | + body = ( |
| 252 | + rx.box(rendered, footer, class_name="flex flex-col w-full") |
| 253 | + if _related is not None |
| 254 | + else rendered |
| 255 | + ) |
| 256 | + return ((toc, doc_content), body) |
233 | 257 |
|
234 | | - return make_docpage(resolved.route, resolved.display_title, virtual_doc, comp) |
| 258 | + return make_docpage( |
| 259 | + resolved.route, resolved.display_title, virtual_doc, comp, **seo_extras |
| 260 | + ) |
235 | 261 |
|
236 | 262 |
|
237 | 263 | # Build doc_markdown_sources mapping |
|
0 commit comments