[{"content":"General, framework-agnostic recommendations (adapted from upstream\u0026amp;rsquo;s guidance, which applies just as well here):\nColor contrast — if you override --pst-* color variables (see Styling ), check contrast ratios against WCAG AA, especially for both light and dark mode. Keyboard navigation — the search dialog, theme switcher, and sidebar toggle are all keyboard-operable out of the box; if you add custom partials into any slot, keep them keyboard-accessible too. Logo alt text — always set …","summary":"General, framework-agnostic recommendations (adapted from upstream’s guidance, which applies just as well here):\nColor contrast — if you override --pst-* color variables (see Styling ), check contrast ratios against WCAG AA, especially for both light and dark mode. Keyboard navigation — the search dialog, theme switcher, and sidebar toggle are all keyboard-operable out of the box; if you add custom partials into any slot, keep them keyboard-accessible too. Logo alt text — always set logo.alt_text when using an image logo (see Branding ) rather than relying on the fallback. Sitemaps — Hugo generates a sitemap.xml automatically for every build; no theme configuration or extension (unlike Sphinx’s sphinx_sitemap) is needed. ","tags":[],"title":"Accessibility","url":"/pydata-hugo-theme/misc/accessibility/"},{"content":"announcement shows a dismissible-looking banner above the navbar. Two modes, chosen automatically by the value:\n[params] # Static: rendered as-is (raw HTML allowed) announcement = \u0026amp;#34;See what\u0026amp;#39;s new in \u0026amp;lt;a href=\\\u0026amp;#34;/blog/\\\u0026amp;#34;\u0026amp;gt;the changelog\u0026amp;lt;/a\u0026amp;gt;.\u0026amp;#34; # Remote: any value starting with \u0026amp;#34;http\u0026amp;#34; is treated as a URL to fetch # the banner\u0026amp;#39;s HTML content from at runtime instead announcement = \u0026amp;#39;https://example.com/announcement.html\u0026amp;#39; Leave it unset (the default) to …","summary":"announcement shows a dismissible-looking banner above the navbar. Two modes, chosen automatically by the value:\n[params] # Static: rendered as-is (raw HTML allowed) announcement = \"See what's new in \u003ca href=\\\"/blog/\\\"\u003ethe changelog\u003c/a\u003e.\" # Remote: any value starting with \"http\" is treated as a URL to fetch # the banner's HTML content from at runtime instead announcement = 'https://example.com/announcement.html' Leave it unset (the default) to disable the banner entirely.\n","tags":[],"title":"Announcements","url":"/pydata-hugo-theme/user-interface/announcements/"},{"content":"The FontAwesome and Bootstrap JS mounted via [[module.mounts]] (see Hugo Modules ) are loaded through Hugo Pipes , not referenced as plain static \u0026amp;lt;script src\u0026amp;gt; tags:\n{{- with resources.Get \u0026amp;#34;vendor/fontawesome/all.min.js\u0026amp;#34; }} {{- if hugo.IsDevelopment }} \u0026amp;lt;script src=\u0026amp;#34;{{ .RelPermalink }}\u0026amp;#34; defer\u0026amp;gt;\u0026amp;lt;/script\u0026amp;gt; {{- else }} {{- with . | fingerprint }} \u0026amp;lt;script src=\u0026amp;#34;{{ .RelPermalink }}\u0026amp;#34; integrity=\u0026amp;#34;{{ .Data.Integrity }}\u0026amp;#34; crossorigin=\u0026amp;#34;anonymous\u0026amp;#34; …","summary":"The FontAwesome and Bootstrap JS mounted via [[module.mounts]] (see Hugo Modules ) are loaded through Hugo Pipes , not referenced as plain static \u003cscript src\u003e tags:\n{{- with resources.Get \"vendor/fontawesome/all.min.js\" }} {{- if hugo.IsDevelopment }} \u003cscript src=\"{{ .RelPermalink }}\" defer\u003e\u003c/script\u003e {{- else }} {{- with . | fingerprint }} \u003cscript src=\"{{ .RelPermalink }}\" integrity=\"{{ .Data.Integrity }}\" crossorigin=\"anonymous\" defer\u003e\u003c/script\u003e {{- end }} {{- end }} {{- end }} In development builds, the file is served as-is for fast rebuilds. In production builds (hugo --minify, or whenever hugo.IsDevelopment is false), it’s fingerprinted — Hugo computes a content hash, appends it to the URL for cache-busting, and adds a Subresource Integrity (integrity) attribute the browser verifies before executing the script. Sphinx has no equivalent — static files there are referenced as-is, with no build-time hashing or integrity verification.\n","tags":[],"title":"Asset pipeline","url":"/pydata-hugo-theme/hugo-only/asset-pipeline/"},{"content":" [params] back_to_top_button = true Shows a floating button that scrolls back to the top of the page once you\u0026amp;rsquo;ve scrolled down. Set to false to remove it.\n","summary":" [params] back_to_top_button = true Shows a floating button that scrolls back to the top of the page once you’ve scrolled down. Set to false to remove it.\n","tags":[],"title":"Back to top","url":"/pydata-hugo-theme/user-interface/back-to-top/"},{"content":"Logo [params.logo] text = \u0026amp;#39;My Site\u0026amp;#39; link = \u0026amp;#39;/\u0026amp;#39; # image_light = \u0026amp;#39;images/logo-light.png\u0026amp;#39; # image_dark = \u0026amp;#39;images/logo-dark.png\u0026amp;#39; alt_text = \u0026amp;#39;My Site — Home\u0026amp;#39; With no image_light set, text renders as a plain text brand link (falls back to site.Title if text is unset). With image_light set, the image is used instead; image_dark swaps in for dark mode (falls back to image_light if image_dark is unset). Text still renders alongside the image if text is explicitly …","summary":"Logo [params.logo] text = 'My Site' link = '/' # image_light = 'images/logo-light.png' # image_dark = 'images/logo-dark.png' alt_text = 'My Site — Home' With no image_light set, text renders as a plain text brand link (falls back to site.Title if text is unset). With image_light set, the image is used instead; image_dark swaps in for dark mode (falls back to image_light if image_dark is unset). Text still renders alongside the image if text is explicitly set. alt_text sets the image’s alt attribute (falls back to \"\u003csite title\u003e - Home\"). This documentation site intentionally only sets logo.text and ships no sample logo image at all — this is an unofficial, unaffiliated port, so it deliberately avoids using (or even hotlinking) the original PyData Sphinx Theme’s branding.\n","tags":[],"title":"Branding","url":"/pydata-hugo-theme/theming/branding/"},{"content":"head.html emits a \u0026amp;lt;meta http-equiv=\u0026amp;quot;Content-Security-Policy\u0026amp;quot;\u0026amp;gt; tag on every page, with script-src already covering the CDNs the theme\u0026amp;rsquo;s own search feature needs (cdnjs for FontAwesome, jsdelivr for Fuse.js). If your site embeds a third-party iframe (a calendar widget, a video embed, etc.), extend frame-src via:\n[params] csp_frame_src = [\u0026amp;#39;https://calendar.google.com\u0026amp;#39;] \u0026#39;self\u0026#39; is always included automatically — you only need to list additional origins. Upstream Sphinx …","summary":"head.html emits a \u003cmeta http-equiv=\"Content-Security-Policy\"\u003e tag on every page, with script-src already covering the CDNs the theme’s own search feature needs (cdnjs for FontAwesome, jsdelivr for Fuse.js). If your site embeds a third-party iframe (a calendar widget, a video embed, etc.), extend frame-src via:\n[params] csp_frame_src = ['https://calendar.google.com'] 'self' is always included automatically — you only need to list additional origins. Upstream Sphinx docs don’t ship a CSP meta tag at all; this is engineering specific to this port.\n","tags":[],"title":"Content-Security-Policy","url":"/pydata-hugo-theme/hugo-only/security-csp/"},{"content":"Where this port diverges from the upstream PyData Sphinx Theme user guide — either because a feature has no meaningful Hugo equivalent, or because it\u0026amp;rsquo;s declared but not yet implemented in this port\u0026amp;rsquo;s templates.\nUpstream feature Status here Why Version switcher dropdown (switcher, check_switcher) Not implemented No switcher/version-JSON mechanism exists in this port\u0026amp;rsquo;s params or templates. Version warning banner (show_version_warning_banner) Not implemented Depends on the version …","summary":"Where this port diverges from the upstream PyData Sphinx Theme user guide — either because a feature has no meaningful Hugo equivalent, or because it’s declared but not yet implemented in this port’s templates.\nUpstream feature Status here Why Version switcher dropdown (switcher, check_switcher) Not implemented No switcher/version-JSON mechanism exists in this port’s params or templates. Version warning banner (show_version_warning_banner) Not implemented Depends on the version switcher above. Google Analytics / Plausible injection (analytics) Not implemented No analytics param or script-injection partial exists; add your own via a site-level content_footer_items/footer_end partial if needed. i18n message catalogs (gettext/pybabel) Not applicable Sphinx-specific tooling. Hugo has its own multilingual/i18n system , unrelated to this theme’s params. “Edit this page” / “view source” buttons (use_edit_page_button, html_context) Not implemented No equivalent partial exists yet in this port. Sphinx indices (genindex/modindex/py-modindex) Not applicable These are Sphinx/Python-doc-specific autogenerated indices with no Hugo concept to map to. ABlog / sphinx-design / sphinx-togglebutton integration Not applicable These are Sphinx extensions. Hugo handles equivalent needs (blogging, callouts) through its own content/shortcode mechanisms, outside this theme’s scope. sphinx-copybutton (copy-to-clipboard on code blocks) Implemented Ported natively as a codeblock render hook — every fenced code block gets a copy button automatically, no shortcode needed. MathJax / math roles Not applicable No math rendering integration in this port. Pygments light/dark syntax style (pygments_light_style/pygments_dark_style) Not implemented Hugo’s Chroma highlighter is configured at the site level ([markup.highlight]), not through a theme param — see Styling . show_nav_level Declared, not implemented Present in hugo.toml defaults (carried over from Sphinx’s theme.conf), but no template logic reads it — the sidebar tree always renders fully expanded. navigation_depth Declared, not implemented Same as above. collapse_navigation Declared, not implemented Same as above. icon_links_label Declared, not implemented No template currently renders this label. ReadTheDocs-specific integration (flyout menu, ethical ads sidebar) Not applicable Specific to the ReadTheDocs hosting platform. sphinx-remove-toctrees / stub-page pruning Not applicable Toctree-driven sidebar generation is a Sphinx concept; this port’s sidebar is menu-driven (see Menus ). If you need any of the “not implemented” rows above, contributions are welcome — see the module’s README.md for how to work on this repo locally.\n","tags":[],"title":"Feature parity with upstream","url":"/pydata-hugo-theme/feature-parity/"},{"content":"FontAwesome and Bootstrap\u0026amp;rsquo;s JS are pulled in as build-time npm dependencies and mounted into the asset pipeline via [[module.mounts]] in this module\u0026amp;rsquo;s own hugo.toml — see Asset pipeline for how the mounting/fingerprinting works.\nOverriding the bundled FontAwesome version The pinned version lives in this module\u0026amp;rsquo;s own package.json. A consuming site can override it without forking the theme by mounting its own copy at the same target path — Hugo resolves mounts from the …","summary":"FontAwesome and Bootstrap’s JS are pulled in as build-time npm dependencies and mounted into the asset pipeline via [[module.mounts]] in this module’s own hugo.toml — see Asset pipeline for how the mounting/fingerprinting works.\nOverriding the bundled FontAwesome version The pinned version lives in this module’s own package.json. A consuming site can override it without forking the theme by mounting its own copy at the same target path — Hugo resolves mounts from the site’s own node_modules first:\n","tags":[],"title":"Fonts","url":"/pydata-hugo-theme/theming/fonts/"},{"content":"External link behavior Every content-authored Markdown link and most theme-rendered links pass through link-target-attrs.html, which decides whether a link opens in a new tab based on external_links:\n[params.external_links] new_tab = true exceptions = [\u0026amp;#39;https://docs.example.com/\u0026amp;#39;] A URL is treated as internal (no new tab) if it\u0026amp;rsquo;s not http(s), points back at site.BaseURL, or matches a prefix in exceptions. This is applied automatically to every Markdown-authored link via a render …","summary":"External link behavior Every content-authored Markdown link and most theme-rendered links pass through link-target-attrs.html, which decides whether a link opens in a new tab based on external_links:\n[params.external_links] new_tab = true exceptions = ['https://docs.example.com/'] A URL is treated as internal (no new tab) if it’s not http(s), points back at site.BaseURL, or matches a prefix in exceptions. This is applied automatically to every Markdown-authored link via a render hook — you don’t need to add target=\"_blank\" by hand anywhere in your content.\n","tags":[],"title":"Header links","url":"/pydata-hugo-theme/navigation/header-links/"},{"content":"This is the mechanism the theme itself is distributed through — Sphinx has no equivalent concept (a Sphinx theme is just a Python package with a theme.conf, not a versioned, mountable dependency graph).\nExplicit mounts Adding any [[module.mounts]] entry disables Hugo\u0026amp;rsquo;s implicit default mounts, so this module\u0026amp;rsquo;s hugo.toml re-declares every standard component directory explicitly (content, static, layouts, data, assets, i18n, archetypes), plus two npm-sourced mounts that pull prebuilt …","summary":"This is the mechanism the theme itself is distributed through — Sphinx has no equivalent concept (a Sphinx theme is just a Python package with a theme.conf, not a versioned, mountable dependency graph).\nExplicit mounts Adding any [[module.mounts]] entry disables Hugo’s implicit default mounts, so this module’s hugo.toml re-declares every standard component directory explicitly (content, static, layouts, data, assets, i18n, archetypes), plus two npm-sourced mounts that pull prebuilt JS straight out of node_modules into the asset pipeline:\n","tags":[],"title":"Hugo Modules","url":"/pydata-hugo-theme/hugo-only/hugo-modules/"},{"content":"Add the module to your site\u0026amp;rsquo;s hugo.toml:\n[module] [[module.imports]] path = \u0026amp;#34;github.com/saltstack/pydata-hugo-theme\u0026amp;#34; Then fetch it and its build-time npm dependencies (FontAwesome\u0026amp;rsquo;s JS+SVG icon kit, Bootstrap\u0026amp;rsquo;s JS bundle, mounted via [[module.mounts]]):\nhugo mod get github.com/saltstack/pydata-hugo-theme npm install That\u0026amp;rsquo;s it — hugo server/hugo build will now resolve the theme.\nOffline / reproducible builds By default Hugo resolves the module (and its npm mounts) …","summary":"Add the module to your site’s hugo.toml:\n[module] [[module.imports]] path = \"github.com/saltstack/pydata-hugo-theme\" Then fetch it and its build-time npm dependencies (FontAwesome’s JS+SVG icon kit, Bootstrap’s JS bundle, mounted via [[module.mounts]]):\nhugo mod get github.com/saltstack/pydata-hugo-theme npm install That’s it — hugo server/hugo build will now resolve the theme.\nOffline / reproducible builds By default Hugo resolves the module (and its npm mounts) fresh at build time, which needs Go and network access. If you’d rather commit a fully offline, reproducible copy — no Go toolchain, no npm, no live fetch during CI — run:\n","tags":[],"title":"Install","url":"/pydata-hugo-theme/get-started/install/"},{"content":"The theme renders a page as a set of named \u0026amp;ldquo;slots\u0026amp;rdquo; — each a list of partial names, resolved via site.Params.* — rather than a single fixed template. Override just the slot lists you care about; everything else falls back to the theme\u0026amp;rsquo;s defaults.\nPage title Param Default Effect show_title true Auto-renders \u0026amp;lt;h1\u0026amp;gt;{{ .Title }}\u0026amp;lt;/h1\u0026amp;gt; before the page content Resolved page frontmatter → site.Params → hardcoded default, same as other overridable params. To omit the …","summary":"The theme renders a page as a set of named “slots” — each a list of partial names, resolved via site.Params.* — rather than a single fixed template. Override just the slot lists you care about; everything else falls back to the theme’s defaults.\nPage title Param Default Effect show_title true Auto-renders \u003ch1\u003e{{ .Title }}\u003c/h1\u003e before the page content Resolved page frontmatter → site.Params → hardcoded default, same as other overridable params. To omit the auto-rendered heading on a single page (e.g. because the Markdown body already starts with its own # heading), set show_title: false in that page’s frontmatter. To change the site-wide default, set show_title = false under [params] in hugo.toml.\n","tags":[],"title":"Layout","url":"/pydata-hugo-theme/get-started/layout/"},{"content":" [params] default_mode = \u0026amp;#39;auto\u0026amp;#39; # \u0026amp;#39;light\u0026amp;#39; | \u0026amp;#39;dark\u0026amp;#39; | \u0026amp;#39;auto\u0026amp;#39; auto follows the visitor\u0026amp;rsquo;s OS/browser color-scheme preference. The mode is read/written to localStorage client-side, so a visitor\u0026amp;rsquo;s explicit choice persists across pages and future visits.\nThe theme switcher theme-switcher.html renders a dropdown (light/dark/system) — it\u0026amp;rsquo;s in navbar_end by default. Remove it from your navbar slots to hide the control entirely (visitors then always get …","summary":" [params] default_mode = 'auto' # 'light' | 'dark' | 'auto' auto follows the visitor’s OS/browser color-scheme preference. The mode is read/written to localStorage client-side, so a visitor’s explicit choice persists across pages and future visits.\nThe theme switcher theme-switcher.html renders a dropdown (light/dark/system) — it’s in navbar_end by default. Remove it from your navbar slots to hide the control entirely (visitors then always get whatever default_mode resolves to):\n","tags":[],"title":"Light / dark mode","url":"/pydata-hugo-theme/theming/light-dark/"},{"content":"layouts/_default/_markup/render-link.html is a Hugo render hook — it intercepts every [text](url) link Hugo renders from your Markdown content, site-wide, and applies the same external_links new-tab/exceptions rules (see Header links ) that the theme\u0026amp;rsquo;s own hand-written partials use.\nThe practical effect: you never need to write target=\u0026amp;quot;_blank\u0026amp;quot; rel=\u0026amp;quot;noopener\u0026amp;quot; by hand in a blog post or page — every content-authored link gets consistent external-link behavior …","summary":"layouts/_default/_markup/render-link.html is a Hugo render hook — it intercepts every [text](url) link Hugo renders from your Markdown content, site-wide, and applies the same external_links new-tab/exceptions rules (see Header links ) that the theme’s own hand-written partials use.\nThe practical effect: you never need to write target=\"_blank\" rel=\"noopener\" by hand in a blog post or page — every content-authored link gets consistent external-link behavior automatically, driven by one site-wide config block.\n","tags":[],"title":"Markdown render hooks","url":"/pydata-hugo-theme/hugo-only/render-hooks/"},{"content":"Sphinx derives navigation from the doc tree (toctree directives) — there\u0026amp;rsquo;s no separately configured menu structure. This port instead uses two independent Hugo menus:\nsite.Menus.main — top navbar links (rendered by navbar-nav.html), with automatic overflow into a \u0026amp;ldquo;More\u0026amp;rdquo; dropdown past header_links_before_dropdown entries (see Header links ). site.Menus.sidebar — the left sidebar nav tree (rendered by sidebar-nav.html, see Sidebar navigation ), falling back to site.Menus.main if …","summary":"Sphinx derives navigation from the doc tree (toctree directives) — there’s no separately configured menu structure. This port instead uses two independent Hugo menus:\nsite.Menus.main — top navbar links (rendered by navbar-nav.html), with automatic overflow into a “More” dropdown past header_links_before_dropdown entries (see Header links ). site.Menus.sidebar — the left sidebar nav tree (rendered by sidebar-nav.html, see Sidebar navigation ), falling back to site.Menus.main if you don’t define one. Because they’re independent, your top nav and sidebar nav don’t have to mirror each other — a common pattern (used by this docs site itself) is a short main menu (just “Docs” + “GitHub”) alongside a much deeper sidebar menu for in-page navigation.\n","tags":[],"title":"Menus","url":"/pydata-hugo-theme/hugo-only/menus/"},{"content":"The right sidebar renders secondary_sidebar_items (default [\u0026#39;page-toc\u0026#39;], which renders .TableOfContents from your Markdown headings via page-toc.html).\n[params] secondary_sidebar_items = [\u0026amp;#39;page-toc\u0026amp;#39;] Hiding it on a single page Set show_toc: false in a page\u0026amp;rsquo;s frontmatter to hide the entire right sidebar for that page (it isn\u0026amp;rsquo;t just the TOC — the whole secondary_sidebar_items slot is skipped):\n--- title: A wide page with no right sidebar show_toc: false --- This is a …","summary":"The right sidebar renders secondary_sidebar_items (default ['page-toc'], which renders .TableOfContents from your Markdown headings via page-toc.html).\n[params] secondary_sidebar_items = ['page-toc'] Hiding it on a single page Set show_toc: false in a page’s frontmatter to hide the entire right sidebar for that page (it isn’t just the TOC — the whole secondary_sidebar_items slot is skipped):\n--- title: A wide page with no right sidebar show_toc: false --- This is a Hugo-idiomatic per-page override — see Per-page overrides for how the fallback chain (page → site → hardcoded default) works generally.\n","tags":[],"title":"Page table of contents","url":"/pydata-hugo-theme/navigation/page-toc/"},{"content":"Several slot/behavior params can be overridden on a single page via frontmatter, resolved through a page → site → hardcoded-default fallback chain (.Params.x | default (site.Params.x | default fallback)):\n--- title: A page with no right sidebar show_toc: false --- show_toc (see Page table of contents ) overrides secondary_sidebar_items for just that page, without touching the site-wide default. show_prev_next works the same way, overriding the site-wide show_prev_next param (default true) to …","summary":"Several slot/behavior params can be overridden on a single page via frontmatter, resolved through a page → site → hardcoded-default fallback chain (.Params.x | default (site.Params.x | default fallback)):\n--- title: A page with no right sidebar show_toc: false --- show_toc (see Page table of contents ) overrides secondary_sidebar_items for just that page, without touching the site-wide default. show_prev_next works the same way, overriding the site-wide show_prev_next param (default true) to hide (or show) the prev/next footer links on a single page — useful for standalone pages like an event calendar or an RSS feed list, where “previous/next page in section” links don’t make sense:\n","tags":[],"title":"Per-page overrides","url":"/pydata-hugo-theme/hugo-only/page-overrides/"},{"content":"","summary":"","tags":[],"title":"Search","url":"/pydata-hugo-theme/search/"},{"content":"Search is powered by Fuse.js against a build-time JSON index (layouts/index.json), fetched client-side — not a Sphinx-style server-generated searchindex.js.\nRequired consumer-site setup: the index is only built when the home page\u0026amp;rsquo;s JSON output format is enabled. Add this to your site\u0026amp;rsquo;s hugo.toml (most starter configs don\u0026amp;rsquo;t enable it by default):\n[outputs] home = [\u0026amp;#39;HTML\u0026amp;#39;, \u0026amp;#39;RSS\u0026amp;#39;, \u0026amp;#39;JSON\u0026amp;#39;] section = [\u0026amp;#39;HTML\u0026amp;#39;, \u0026amp;#39;RSS\u0026amp;#39;] page = [\u0026amp;#39;HTML\u0026amp;#39;] …","summary":"Search is powered by Fuse.js against a build-time JSON index (layouts/index.json), fetched client-side — not a Sphinx-style server-generated searchindex.js.\nRequired consumer-site setup: the index is only built when the home page’s JSON output format is enabled. Add this to your site’s hugo.toml (most starter configs don’t enable it by default):\n[outputs] home = ['HTML', 'RSS', 'JSON'] section = ['HTML', 'RSS'] page = ['HTML'] Without this, index.json is never generated and the search box silently returns nothing — there’s no visible error, just no results.\n","tags":[],"title":"Search","url":"/pydata-hugo-theme/user-interface/search/"},{"content":"The left sidebar nav tree is built from site.Menus.sidebar — falling back to site.Menus.main if no sidebar menu is defined — rendered by sidebar-nav.html. This site\u0026amp;rsquo;s own sidebar (see the left of this page) is built exactly this way; its hugo.toml defines [[menus.sidebar]] entries with identifier/parent/weight to create the grouped, collapsible tree you\u0026amp;rsquo;re looking at.\nA top-level entry with an empty url = \u0026#39;\u0026#39; and an identifier renders as an expandable group header; entries that set …","summary":"The left sidebar nav tree is built from site.Menus.sidebar — falling back to site.Menus.main if no sidebar menu is defined — rendered by sidebar-nav.html. This site’s own sidebar (see the left of this page) is built exactly this way; its hugo.toml defines [[menus.sidebar]] entries with identifier/parent/weight to create the grouped, collapsible tree you’re looking at.\nA top-level entry with an empty url = '' and an identifier renders as an expandable group header; entries that set parent = \"\u003cidentifier\u003e\" nest underneath it.\n","tags":[],"title":"Sidebar navigation","url":"/pydata-hugo-theme/navigation/navigation/"},{"content":"If you\u0026amp;rsquo;re coming from Sphinx: this theme\u0026amp;rsquo;s extra_css param (see Styling ) is the direct equivalent of html_css_files. There\u0026amp;rsquo;s no direct equivalent of html_js_files/app.add_js_file as a theme param — for custom JS, use Hugo\u0026amp;rsquo;s own asset pipeline (Hugo Pipes ) at the site level: drop a script in your site\u0026amp;rsquo;s assets/, process/fingerprint it with resources.Get/fingerprint in a site-level partial override, and add that partial to whichever slot you want it in (e.g. …","summary":"If you’re coming from Sphinx: this theme’s extra_css param (see Styling ) is the direct equivalent of html_css_files. There’s no direct equivalent of html_js_files/app.add_js_file as a theme param — for custom JS, use Hugo’s own asset pipeline (Hugo Pipes ) at the site level: drop a script in your site’s assets/, process/fingerprint it with resources.Get/fingerprint in a site-level partial override, and add that partial to whichever slot you want it in (e.g. content_footer_items, footer_end).\n","tags":[],"title":"Static assets","url":"/pydata-hugo-theme/misc/static-assets/"},{"content":"CSS custom properties The vendored static/styles/pydata-sphinx-theme.css exposes the same --pst-* CSS custom properties as the upstream theme (colors, fonts, spacing, sidebar widths, etc.). Override them in your own stylesheet:\n:root { --pst-color-primary: #123456; } Adding your own stylesheet [params] extra_css = [\u0026amp;#39;/css/custom.css\u0026amp;#39;] extra_css is this theme\u0026amp;rsquo;s equivalent of Sphinx\u0026amp;rsquo;s html_css_files — a list of stylesheet paths or full URLs, injected after the theme\u0026amp;rsquo;s own …","summary":"CSS custom properties The vendored static/styles/pydata-sphinx-theme.css exposes the same --pst-* CSS custom properties as the upstream theme (colors, fonts, spacing, sidebar widths, etc.). Override them in your own stylesheet:\n:root { --pst-color-primary: #123456; } Adding your own stylesheet [params] extra_css = ['/css/custom.css'] extra_css is this theme’s equivalent of Sphinx’s html_css_files — a list of stylesheet paths or full URLs, injected after the theme’s own CSS (so your rules can override theme defaults without !important).\n","tags":[],"title":"Styling","url":"/pydata-hugo-theme/theming/styling/"}]