☰ GDG /
Docstrings (001–005)
#001 gdtest_minimal #003 gdtest_sphinx #002 gdtest_google #004 gdtest_nodocs #005 gdtest_mixed_docs
Layouts (006–013)
#007 gdtest_python_layout #006 gdtest_src_layout #008 gdtest_lib_layout #009 gdtest_hatch #010 gdtest_setuptools_find #011 gdtest_setup_cfg #012 gdtest_setup_py #013 gdtest_auto_discover
Exports (014–017)
#014 gdtest_no_all #016 gdtest_config_exclude #015 gdtest_all_concat #017 gdtest_auto_exclude
Object Types (018–027)
#018 gdtest_small_class #020 gdtest_dataclasses #019 gdtest_big_class #021 gdtest_enums #022 gdtest_typed_containers #023 gdtest_protocols #024 gdtest_descriptors #026 gdtest_nested_class #025 gdtest_dunders #027 gdtest_constants
Directives (028–032)
#028 gdtest_seealso #029 gdtest_nodoc #030 gdtest_user_guide_auto #031 gdtest_user_guide_sections #032 gdtest_user_guide_subdirs
User Guide (033–038)
#033 gdtest_user_guide_explicit #034 gdtest_user_guide_custom_dir
#037 gdtest_index_qmd FAIL
#036 gdtest_readme_rst #035 gdtest_user_guide_hyphen #038 gdtest_index_md
Landing Pages (039–043)
#041 gdtest_index_frontmatter FAIL
#039 gdtest_no_readme #040 gdtest_index_wins #043 gdtest_github_contrib #042 gdtest_full_extras
Extras & Config (044–050)
#044 gdtest_cli_click #045 gdtest_cli_nested #047 gdtest_explicit_ref #046 gdtest_cli_typer #049 gdtest_name_mismatch #048 gdtest_kitchen_sink #050 gdtest_src_big_class
Cross-Dimension (051–065)
#051 gdtest_google_big_class #052 gdtest_user_guide_cli #053 gdtest_explicit_big_class #054 gdtest_src_no_all #056 gdtest_google_seealso #055 gdtest_extras_guide #057 gdtest_setup_cfg_src #058 gdtest_exclude_cli #059 gdtest_src_explicit_ref #060 gdtest_async_funcs #061 gdtest_generators #063 gdtest_abstract_props #062 gdtest_overloads #064 gdtest_multi_inherit #065 gdtest_slots_class
API Patterns (066–077)
#066 gdtest_frozen_dc #067 gdtest_generics #068 gdtest_context_mgr #069 gdtest_decorators #071 gdtest_reexports #070 gdtest_exceptions #073 gdtest_deep_nesting #072 gdtest_many_exports #074 gdtest_long_docs #075 gdtest_many_guides #077 gdtest_flit #076 gdtest_many_big_classes
Scale & Stress (078–082)
#078 gdtest_pdm #079 gdtest_namespace #080 gdtest_monorepo #081 gdtest_multi_module #082 gdtest_src_legacy
Build Systems (083–088)
#083 gdtest_empty_module #084 gdtest_all_private #085 gdtest_duplicate_all #086 gdtest_badge_readme #087 gdtest_math_docs #088 gdtest_mixed_guide_ext
Edge Cases (089–095)
#089 gdtest_unicode_docs #090 gdtest_config_all_on #091 gdtest_config_display #092 gdtest_config_minimal #093 gdtest_config_parser #094 gdtest_config_extra_keys #095 gdtest_github_icon
Config Matrix (096–100)
#096 gdtest_source_branch #097 gdtest_source_path #098 gdtest_source_title #099 gdtest_source_disabled #100 gdtest_sidebar_disabled
Config Options (101–125)
#101 gdtest_sidebar_min_items #103 gdtest_cli_name #104 gdtest_dynamic_false #102 gdtest_sidebar_float #105 gdtest_parser_google #106 gdtest_parser_sphinx #107 gdtest_display_name #108 gdtest_funding #109 gdtest_authors_multi #110 gdtest_no_darkmode #111 gdtest_exclude_list #112 gdtest_jupyter_kernel #113 gdtest_config_sections #114 gdtest_config_ug_string #115 gdtest_config_ug_list #116 gdtest_config_changelog #117 gdtest_config_reference #118 gdtest_config_combo_a
#122 gdtest_config_combo_e FAIL
#119 gdtest_config_combo_b #120 gdtest_config_combo_c #121 gdtest_config_combo_d #123 gdtest_config_combo_f #124 gdtest_attribution_on #125 gdtest_attribution_off
Docstring Richness (126–150)
#126 gdtest_rst_versionadded #127 gdtest_rst_deprecated #128 gdtest_rst_note #129 gdtest_rst_warning #130 gdtest_rst_tip #131 gdtest_rst_caution #132 gdtest_rst_danger #133 gdtest_rst_important #134 gdtest_rst_mixed_dirs #135 gdtest_directives #136 gdtest_sphinx_func_role #137 gdtest_sphinx_class_role #138 gdtest_sphinx_exc_role #139 gdtest_sphinx_meth_role #140 gdtest_sphinx_mixed_roles #141 gdtest_numpy_rich #142 gdtest_google_rich #143 gdtest_sphinx_rich #144 gdtest_docstring_examples #145 gdtest_examples_rst_repro #146 gdtest_docstring_notes #147 gdtest_docstring_warnings #148 gdtest_docstring_references #149 gdtest_docstring_seealso #150 gdtest_docstring_math
UG Variations (151–165)
#151 gdtest_docstring_tables #152 gdtest_docstring_combo #153 gdtest_ug_auto #154 gdtest_ug_numbered #155 gdtest_ug_sections_fm #156 gdtest_ug_subdirs #157 gdtest_ug_custom_dir #158 gdtest_ug_deep_nest #159 gdtest_ug_mixed_ext #161 gdtest_ug_explicit_order #160 gdtest_ug_many_pages #162 gdtest_ug_single_page #163 gdtest_ug_no_frontmatter
#164 gdtest_ug_with_code FAIL
#165 gdtest_ug_with_images
Custom Sections (166–175)
#166 gdtest_ug_hyphen_dir #167 gdtest_ug_combo #168 gdtest_sec_examples #169 gdtest_sec_tutorials #170 gdtest_sec_recipes #171 gdtest_sec_blog #172 gdtest_sec_faq #173 gdtest_sec_multi #174 gdtest_sec_navbar_after #175 gdtest_sec_with_ug
Reference Config (176–185)
#176 gdtest_sec_with_ref #177 gdtest_sec_deep #178 gdtest_sec_index_opt #181 gdtest_custom_passthrough_navbar #180 gdtest_sec_sidebar_single #179 gdtest_sec_index_hero #182 gdtest_custom_raw_navbar_after #185 gdtest_custom_basename_output #183 gdtest_custom_mixed_modes #184 gdtest_custom_nested_combo
Site Theming (186–195)
#186 gdtest_custom_nested_output #187 gdtest_custom_missing_dir_combo #189 gdtest_ref_members_false #188 gdtest_ref_explicit #190 gdtest_ref_mixed #191 gdtest_ref_reorder #193 gdtest_ref_single_section #192 gdtest_ref_sectioned #194 gdtest_ref_module_expand #195 gdtest_ref_big_class
Stress Tests (196–200)
#196 gdtest_ref_multi_big #197 gdtest_ref_title #198 gdtest_theme_cosmo #199 gdtest_theme_lumen #200 gdtest_theme_cerulean #201 gdtest_toc_disabled #202 gdtest_toc_depth #203 gdtest_toc_title #204 gdtest_site_combo #205 gdtest_display_badges #206 gdtest_display_authors #207 gdtest_display_funding #208 gdtest_stress_all_config #209 gdtest_stress_all_docstr #210 gdtest_stress_all_ug #211 gdtest_stress_all_sections #213 gdtest_src_google_seealso #212 gdtest_stress_everything #214 gdtest_hatch_nodoc #215 gdtest_pdm_big_class #216 gdtest_flit_enums #217 gdtest_namespace_ug #218 gdtest_ug_subdir_numbered #219 gdtest_homepage_ug #221 gdtest_logo #222 gdtest_hero_basic #223 gdtest_hero_readme_badges #224 gdtest_hero_disabled #220 gdtest_long_names #225 gdtest_hero_custom #226 gdtest_hero_wordmark #227 gdtest_hero_no_logo #228 gdtest_hero_explicit_badges #229 gdtest_hero_index_qmd #230 gdtest_hero_auto_logo #231 gdtest_md_disabled #232 gdtest_md_no_widget #233 gdtest_announce_simple #234 gdtest_announce_dict #235 gdtest_announce_disabled #236 gdtest_gradient_sky #237 gdtest_gradient_peach #238 gdtest_gradient_prism #239 gdtest_gradient_lilac #240 gdtest_gradient_slate #241 gdtest_gradient_honey #242 gdtest_gradient_dusk #243 gdtest_gradient_mint #244 gdtest_gradient_navbar #245 gdtest_gradient_both #246 gdtest_gradient_mixed #247 gdtest_gradient_no_dismiss #248 gdtest_header_text #249 gdtest_header_list #250 gdtest_header_file #252 gdtest_navbar_color_light #251 gdtest_navbar_color #253 gdtest_navbar_color_dark #254 gdtest_navbar_color_same #255 gdtest_navbar_color_split #256 gdtest_kitchen_sink_q #257 gdtest_stress_everything_q #258 gdtest_seealso_desc #259 gdtest_numpy_seealso_desc #260 gdtest_interlinks #261 gdtest_autolink #262 gdtest_skill_default #263 gdtest_skill_curated #265 gdtest_skill_disabled #264 gdtest_skill_config #266 gdtest_skill_rich #267 gdtest_skill_combo
#269 gdtest_i18n_french FAIL
#268 gdtest_skill_complex
#270 gdtest_i18n_japanese FAIL
#272 gdtest_code_cells FAIL
#271 gdtest_i18n_arabic FAIL
#274 gdtest_page_tags #276 gdtest_tag_location #275 gdtest_page_status #273 gdtest_nav_icons
#279 gdtest_gt_tables FAIL
#280 gdtest_scale_to_fit FAIL
#281 gdtest_scale_min_scale FAIL
#278 gdtest_homepage_ug_subdirs #277 gdtest_icon_shortcode #282 gdtest_homepage_wide #283 gdtest_code_span_headings #286 gdtest_namespace_src #284 gdtest_sec_blog_user_index #285 gdtest_sec_dir_titles #287 gdtest_auto_include #288 gdtest_no_auto_exclude
#289 gdtest_tbl_preview FAIL
#290 gdtest_tbl_shortcode
#291 gdtest_tbl_explorer FAIL
#292 gdtest_hr_shortcode #293 gdtest_accent_color #294 gdtest_keys_shortcode #295 gdtest_inline_methods #296 gdtest_inline_always #297 gdtest_inline_never #299 gdtest_ref_inherited_explicit #300 gdtest_ref_include_inherited #298 gdtest_inline_threshold
#301 gdtest_mock_code FAIL
#305 gdtest_hero_no_name #304 gdtest_lightbox #302 gdtest_details_shortcode #303 gdtest_termshow #306 gdtest_sec_nested_tags #307 gdtest_sec_xref_subdirs #309 gdtest_bibliography_csl #308 gdtest_bibliography #311 gdtest_go_cli #310 gdtest_custom_css #312 gdtest_ug_dark_assets #313 gdtest_code_include #314 gdtest_ug_mixed_subdir_order #315 gdtest_type_aliases #317 gdtest_marimo #316 gdtest_complete_docstrings #318 gdtest_no_breadcrumbs #321 gdtest_ref_section_order #319 gdtest_mcp #320 gdtest_d2_diagrams
307/321 built ⏱ 42.3s 🧪 19/19

gdtest-abstract-props

Tests ABC with abstract properties and concrete subclass.

ABC with abstract methods and @property decorators. Shape class has abstract area (property) and perimeter (property), plus concrete describe(). Circle subclass implements them. On the Reference page you should see both classes with property markers on the abstract properties.

Source files
📁 gdtest_abstract_props/
📄 __init__.py
"""Package with abstract properties."""

from abc import ABC, abstractmethod
import math

__version__ = "0.1.0"
__all__ = ["Shape", "Circle"]


class Shape(ABC):
    """
    Abstract base class for geometric shapes.

    All shapes must implement area and perimeter properties.
    """

    @property
    @abstractmethod
    def area(self) -> float:
        """
        The area of the shape.

        Returns
        -------
        float
            Area value.
        """
        ...

    @property
    @abstractmethod
    def perimeter(self) -> float:
        """
        The perimeter of the shape.

        Returns
        -------
        float
            Perimeter value.
        """
        ...

    def describe(self) -> str:
        """
        Describe the shape.

        Returns
        -------
        str
            Human-readable description.
        """
        return f"Shape with area={self.area:.2f}, perimeter={self.perimeter:.2f}"


class Circle(Shape):
    """
    A circle shape.

    Parameters
    ----------
    radius
        The radius of the circle.
    """

    def __init__(self, radius: float):
        self.radius = radius

    @property
    def area(self) -> float:
        """
        Area of the circle (pi * r^2).

        Returns
        -------
        float
            Area value.
        """
        return math.pi * self.radius ** 2

    @property
    def perimeter(self) -> float:
        """
        Perimeter (circumference) of the circle (2 * pi * r).

        Returns
        -------
        float
            Perimeter value.
        """
        return 2 * math.pi * self.radius
📄 README.md
# gdtest-abstract-props

Tests ABC with abstract properties and concrete subclass.
📄 great-docs.yml generated
# Great Docs Configuration
# See https://posit-dev.github.io/great-docs/user-guide/configuration.html
#
# Every option appears below at its default value, with the values it accepts
# documented above it. Set only what you want to change: an option you leave
# out or commented out keeps its default.

# Module Name
# -----------
# Importable module name, when it differs from the project name
# (e.g. project 'py-yaml12' imports as 'yaml12').
# : null - (default) auto-detect
# : type(str) - the module name
# module: null

# Display Name
# ------------
# Display name for your package in the site navbar/title. Use this for a
# marketing/presentation name (e.g. 'My Package').
# : null - (default) the actual package name (e.g. 'my_package' or 'my-package')
# : type(str) - the name to display
# display_name: null

# Project Type
# ------------
# Primary ecosystem(s) the project belongs to. Controls which
# ecosystem-specific links and features are active by default.
# : python - (default) Python package; enables the PyPI link
# : go - Go CLI/library; disables the PyPI link by default
# : rust - Rust CLI/library; disables the PyPI link by default
# : type(list) - mixed project, e.g. [python, go]
# project_type: python

# Docstring Parser
# ----------------
# The docstring format used in your package. Auto-detected during
# initialization, but can be overridden here.
# : numpy - (default) numpydoc style
# : google - Google style
# : sphinx - Sphinx/reStructuredText style
parser: numpy

# Interlinks
# ----------
# Other documentation sites your prose can link to. Each entry under `sources`
# names a project, where its documentation lives, and optionally the module
# aliases your prose uses for it. The inventory is read from
# `<url>/objects.inv`, where every project publishes it, and links are written
# against `<url>`. A url may name a directory on disk, which works when that
# path is also the path the project is served from.
# interlinks:
#   sources:
#     numpy:
#       url: https://numpy.org/doc/stable/
#       aliases: [np]
# interlinks:
#   sources: {} # Projects to link to; none by default
#   # A link to a function or method shows a trailing "()", as `decode()` rather
#   # than `decode`. Links to classes never show one.
#   add_function_parentheses: true

# Callable Signatures
# -------------------
# How the signature of a function, method or class is written.
# style: the markup carrying it
# : highlighted - (default) a highlighted code block
# : plain - inline markup
# wrap: where it breaks across lines
# : per_parameter - (default) one parameter per line
# : width - break only when the signature is long
# callable_signatures:
#   style: highlighted
#   wrap: per_parameter

# Dynamic Introspection
# ---------------------
# How the renderer inspects your package. Auto-detected during initialization
# based on what works for your package, but can be overridden here.
# : true - (default) runtime introspection; more accurate for complex packages
# : false - static analysis only; better for packages with cyclic aliases
dynamic: true

# Jupyter Kernel
# --------------
# Jupyter kernel to use for executing code cells in .qmd files.
# This is set at the project level so it applies to all pages, including
# auto-generated API reference pages. Can be overridden in individual .qmd
# file frontmatter if needed for special cases.
# jupyter: python3

# Exclusions
# ----------
# Items to exclude from auto-documentation (affects 'init' and 'scan')
# exclude:
#   - InternalClass
#   - helper_function
# exclude: []

# Names to force-include even if they match AUTO_EXCLUDE
# auto_include: []

# Bypass the built-in AUTO_EXCLUDE list entirely
# no_auto_exclude: false

# PyPI Link
# ---------
# : null - (default) link to pypi.org for Python projects, no link otherwise
# : true - auto-detect the package name and link to pypi.org
# : false - disable the PyPI link
# : type(str) - a custom package index URL
# pypi: https://artifactory.example.com/pkg
# pypi: null

# GitHub Integration
# ------------------
# GitHub repository URL override (e.g. "https://github.com/owner/repo").
# repo: null

# GitHub link style
# : widget - (default) a widget showing the stars count
# : icon - a simple icon
# github_style: widget

# Site URL
# --------
# Canonical address of the deployed docs site. Used for skills-page install
# commands, .well-known/ discovery, sitemaps, and subdirectory deployments;
# also sets website.site-url in _quarto.yml.
# site_url: null

# Source Link Configuration
# -------------------------
# source:
#   enabled: true # Enable/disable source links (default: true)
#   branch: null # Git branch/tag to link to (default: auto-detect)
#   path: null # Custom source path for monorepos (default: auto-detect)
#   placement: usage # Where to place the link: "usage" (default) or "title"

# Sidebar Filter
# --------------
# sidebar_filter:
#   enabled: true # Enable/disable filter (default: true)
#   min_items: 20 # Minimum items before showing filter (default: 20)

# Marimo Notebooks
# ----------------
# Embed interactive WASM notebooks via marimo islands. `marimo: true` is
# shorthand for `enabled: true`.
# marimo:
#   enabled: false # Enable marimo island notebooks
#   version: null # @marimo-team/islands CDN version; defaults to the installed marimo version

# CLI Documentation
# -----------------
# Documents Python CLIs built with Click or Typer.
# cli:
#   enabled: false # Enable CLI documentation
#   module: null # e.g. my_package.cli; auto-detected
#   name: null # Click command / Typer app variable; auto-detected
#   title: null # Optional index page + sidebar title
#   desc: null # Optional intro paragraph atop the index page
#   # sections: explicit grouping/ordering (omit = auto by code order). Example:
#   #   sections:
#   #     - title: "Project setup"
#   #       desc: "Create and configure a project."
#   #       contents: [init, config]
#   #     - title: Building
#   #       contents: [build, preview]
#   sections: []

# Go CLI Documentation
# --------------------
# Builds the Go binary and extracts its command tree via --help. Works with any
# Go CLI (Cobra, urfave/cli, ...) whose subcommands support --help.
# go_cli:
#   enabled: false # Enable Go CLI documentation (default: false)

# Rust CLI Documentation
# ----------------------
# Builds the Rust binary via cargo and extracts its command tree via --help.
# Works with any Rust CLI (clap, structopt, argh, ...) whose subcommands
# support --help.
# rust_cli:
#   enabled: false # Enable Rust CLI documentation (default: false)

# MCP Server Documentation
# ------------------------
# Auto-generates reference pages from an MCP server's tool/resource/prompt
# definitions.
# mcp:
#   enabled: true # Enable MCP server documentation
#   module: null # Importable module path (e.g. "sweet.mcp")
#   server_var: null # Variable name of the Server instance; auto-detected when null
#   name: null # Display name override; defaults to the server name
#   # Manual tool categories (grouping on the index page). Example:
#   #   categories:
#   #     "Data tools": [load, save]
#   categories: {}

# Reference Section Order
# -----------------------
# Controls the display order of API subsections (the switcher tabs) in the
# Reference area. Valid values: "api", "cli", "mcp". Sections listed here
# that don't exist in the project are silently ignored. When empty or omitted,
# the default order is: api, cli, mcp.
# ref_section_order: []

# Dark Mode Toggle
# ----------------
# Enable/disable the dark mode toggle in navbar (default: true)
# dark_mode_toggle: true

# Author Information
# ------------------
# Author metadata for display in the landing page sidebar and page attribution
# authors:
#   - name: "Your Name"
#     email: you@example.com
#     role: "Lead Developer"
#     affiliation: Organization
#     github: yourusername
#     homepage: https://yoursite.com
#     orcid: 0000-0002-1234-5678
#     image: https://github.com/yourusername.png  # Avatar (GitHub URL or local path)
# authors: []

# Funding
# -------
# Funding organization (copyright holder / funder).
# funding:
#   name: "Posit Software, PBC"
#   roles: ["Copyright holder", "funder"]
#   ror: https://ror.org/03wc8by49
# funding: null

# Site Settings
# -------------
# Forwarded to _quarto.yml (format.html). `site` is a Quarto passthrough:
# its subtree is merged into `format.html`, so most valid `format.html` keys
# work here (e.g. `toc-title: "On this page"`). Reserved keys that great-docs
# manages itself and always overrides: `css` (copied and referenced by
# basename separately), `code-copy` (disabled — great-docs supplies its own
# copy-code widget), `html-table-processing` (disabled — required for GT
# table styling), and `mermaid` (fixed to the light theme — dark mode is
# handled via a CSS container). The great-docs page/UI settings that used to
# live here (language, show_dates, date_format, show_author, show_security)
# are top-level keys below; setting them under `site` still works and is
# lifted automatically.
# site:
#   theme: flatly # Quarto theme
#   toc: true # Show table of contents
#   toc-depth: 2 # TOC heading depth
#   html-math-method: katex # HTML math renderer (e.g. mathjax)

# Page Metadata
# -------------
# Language for UI text (BCP 47 code, e.g., "en", "fr", "de", "ja", "zh-Hans")
# Translates navbar labels, widget text, tooltips, and accessibility labels
# language: en

# Show page timestamps in footer
# show_dates: false

# Date format (Python strftime)
# date_format: "%B %d, %Y"

# Show author attribution with dates
# show_author: true

# Show security policy page (from SECURITY.md)
# show_security: true

# Team Author
# -----------
# Optional catch-all author for auto-generated pages (reference, changelog, etc.)
# team_author:
#   name: "Project Team"
#   image: assets/team-avatar.png
#   url: https://github.com/org/project
# team_author: null

# Changelog (GitHub Releases)
# ---------------------------
# Auto-generate a Changelog page from GitHub Releases.
# changelog:
#   enabled: true # Enable/disable changelog (default: true)
#   max_releases: 50 # Max releases to include (default: 50)

# Custom Sections
# ---------------
# Add custom page groups (examples, tutorials, blog, etc.) to the site.
# Each section gets a navbar link and a sidebar. An auto-generated
# card-based index page is created only when `index: true` is set;
# otherwise the navbar links directly to the first page in the section.
# If you provide your own index.qmd in the directory it is always used.
#
# sections:
#   - title: Examples            # Navbar link text
#     dir: examples              # Source directory (relative to project root)
#     index: true                # Generate card-based index page (default: false)
#     index_columns: 2           # Columns for image cards: 1 or 2 (default: 2)
#     navbar_after: "User Guide" # Place after this navbar item (optional)
#   - title: Tutorials
#     dir: tutorials             # No index — navbar links to first page
#   - title: Blog                # Blog section using Quarto's listing directive
#     dir: blog
#     type: blog                 # "blog" for Quarto listing, omit for card grid
# sections: []

# Custom Static Pages
# -------------------
# Add hand-written HTML pages that Great Docs should either wrap with the site
# shell (layout: passthrough) or copy through unchanged (layout: raw).
#
# : null - (default) discover the conventional `custom/` directory
# : false - disable discovery
# : type(str) - a single directory, e.g. marketing
# : type(list) - one entry per directory:
# custom_pages:
#   - dir: marketing             # Source directory (relative to project root)
#     output: py                 # URL/output prefix (optional; defaults to dir basename)
#   - dir: playgrounds
#     output: demos
# custom_pages: null

# Homepage
# --------
# : index - (default) separate homepage from the README / index source
# : user_guide - the first user-guide page becomes the landing page
# homepage: index

# User Guide
# ----------
# Where the User Guide .qmd files live, and optionally how they are ordered.
# : null - (default) look for user_guide/ in the project root
# : type(str) - a custom directory (relative to project root), e.g. docs/guides
# : type(list) - explicit section ordering and grouping:
# user_guide:
#   - section: "Get Started"
#     contents:
#       - text: Welcome
#         href: index.qmd
#       - quickstart.qmd
#       - installation.qmd
#   - section: "Advanced Topics"
#     contents:
#       - advanced-config.qmd
#       - extending.qmd
#
# File paths are relative to the user guide directory (no user_guide/ prefix).
# When using explicit ordering, numeric filename prefixes are preserved as-is.
# user_guide: null

# Bibliography & Citations
# ------------------------
# Project-level bibliography for [@citation-key] syntax. Paths are relative to
# the project root; the file(s) are copied into the build directory and wired
# into _quarto.yml so every page can cite without per-page frontmatter.
# : [] - (default) no bibliography
# : type(str) - a single file, e.g. docs/references.bib
# : type(list) - several files:
# bibliography:
#   - docs/references.bib
#   - docs/software.bib
# bibliography: []
# csl: docs/nature.csl                    # optional citation style
# csl: null

# API Reference Structure
# -----------------------
# Explicit control over API reference sections. If not provided, sections are
# auto-generated from discovered exports. Each section has a title, description,
# and list of contents.
#
# For classes, use `members: true` (default) to document methods inline on the
# class page, or `members: false` to exclude methods (you can place them
# explicitly elsewhere in the reference if needed).
#
# reference:
#   - title: "Core Classes"
#     desc: "Main classes for working with the package"
#     contents:
#       - name: MyClass
#         members: false       # Don't document methods here
#       - SimpleClass          # Methods documented inline (default)
#
#   - title: "Utility Functions"
#     desc: "Helper functions for common tasks"
#     contents:
#       - helper_func
#       - another_func
reference:
  - title: Classes
    desc: Main classes provided by the package
    contents:
      - Circle

  - title: Abstract Classes
    desc: Abstract base classes
    contents:
      - Shape  # 1 method(s)

# Inline Methods
# --------------
# Whether class methods get their own pages or stay inline.
# : 5 - (default) inline up to 5 methods, split above that
# : true - always inline
# : false - always split
# : type(int) - inline up to N methods, split above N
# inline_methods: 5

# Logo & Favicon
# --------------
# A logo replaces the text title in the navbar.
# : type(str) - a single file used in both light and dark mode
# : type(map) - (default) light/dark variants, as below
# logo:
#   light: null # null = no logo
#   dark: null # dark-mode variant; falls back to `light` when null
#   show_title: false # keep the text title alongside the logo

# Favicon.
# : null - (default) auto-generate from the logo, else skip
# : type(str) - a single file, e.g. assets/favicon.png
# : type(map) - one file per purpose:
# favicon:
#   icon: assets/icon.png
#   apple_touch: assets/apple-touch-icon.png
#   og_image: assets/og-image.png
# favicon: null

# Hero Section
# ------------
# Landing-page hero.
# : true - force enable
# : false - force disable
# : type(map) - (default) set the fields explicitly, as below
# hero:
#   enabled: null # null = auto (on when a logo is set)
#   logo: null # hero-specific logo; falls back to the navbar logo
#   logo_height: 200px # max-height CSS value
#   name: null # defaults to display_name; false hides it
#   tagline: null # false hides it
#   badges: auto # "auto" (from README), a list, or false
#   starfield: false # interactive starfield animation

# Markdown Pages
# --------------
# Generate .md companions for every HTML page and show a copy/view-as-Markdown
# widget on each page.
# : false - disable both
# : type(map) - (default) set the fields explicitly, as below
# markdown_pages:
#   enabled: true # Generate .md companions for every HTML page (default: true)
#   widget: true # Show the copy/view-as-Markdown widget (requires enabled)

# Announcement Banner
# -------------------
# Site-wide banner above or below the navbar. Setting `content` enables it.
# : type(str) - the banner text (sets `content`)
# : type(map) - (default) set the fields explicitly, as below
# announcement:
#   content: null # null = no banner; else the banner text (supports basic Markdown)
#   type: info # "info" | "warning" | "success" | "danger"
#   dismissable: true # Allow visitors to dismiss the banner
#   url: null # Optional link the banner text points to
#   style: null # Optional gradient preset (same names as navbar_style)
#   position: above-navbar # "above-navbar" (default) | "below-navbar"

# Versioning
# ----------
# Multi-version documentation; disabled when empty. Newest first.
# : [] - (default) single-version site
# : type(list) - tags only, e.g. ["0.3", "0.2", "0.1"], or a map per version:
# versions:
#   - tag: "0.3"
#     label: "0.3.0"
#     latest: true
# versions: []

# Version selector widget (enabled automatically when `versions` is non-empty).
# version_selector:
#   enabled: true # Master switch for the widget
#   placement: navbar-right # "navbar-right" | "navbar-left" | "sidebar-top"
#   show_eol: true # Include end-of-life versions in the dropdown
#   warning_banner: true # Show a banner on non-latest versions

# Floating version aliases.
# version_aliases:
#   latest: true # /v/latest/ -> latest stable version
#   stable: true # /v/stable/ -> same as latest
#   dev: true # /v/dev/ -> prerelease version, if any

# Badge "new" expiry
# -----------------
# How long a page keeps its "new" status badge before it is considered old.
# : null - (default) no expiry; the badge persists
# : type(str) - a duration understood by parse_badge_expiry
#               (see user_guide/30-multi-version-docs.qmd)
# new_is_old: null

# Colors & Navbar
# ---------------
# Site-wide accent color; sets --gd-accent.
# : null - (default) the theme's own accent color
# : type(str) - any CSS color, used in both modes, e.g. "#3b82f6"
# : type(map) - per-mode:
# accent_color:
#   light: "#3b82f6"
#   dark: "#60a5fa"
# accent_color: null

# Navbar gradient preset.
# : null - (default) no gradient
# : type(str) - a preset name, e.g. sky, peach, lilac
# navbar_style: null

# Navbar solid background color. Text color is chosen automatically for
# contrast (APCA). Overridden when navbar_style is set.
# : null - (default) the theme's own navbar color
# : type(str) - any CSS color, used in both modes, e.g. "#3b82f6"
# : type(map) - per-mode:
# navbar_color:
#   light: "#3b82f6"
#   dark: "#60a5fa"
# navbar_color: null

# Explicit ordering of navbar items by their display text. Items not listed
# are appended after the listed ones, preserving their original order.
# : null - (default) items appear in the order they are added during build
# : type(list) - ordered list of navbar labels, e.g.:
# navbar_order:
#   - User Guide
#   - Reference
#   - Demos
#   - Changelog
# navbar_order: null

# Content-area gradient preset (same preset names as navbar_style); adds a
# subtle radial glow at the top of the content area.
# : type(str) - a preset name (sets `preset`)
# : type(map) - (default) set the fields explicitly, as below
# content_style:
#   preset: null # null = disabled; else a gradient preset name
#   pages: all # "all" or "homepage"

# Scale to Fit
# ------------
# Auto-shrink wide HTML output to the content width. The matched element's
# nearest output wrapper is scaled down (never up).
# : null - (default) disabled
# : false - disabled
# : type(list) - CSS selectors to auto-scale, e.g. ["#pb_tbl"]
# Per-page override: `scale-to-fit: ["#pb_tbl"]`
# scale_to_fit: null

# Minimum scale for scale-to-fit; below it, content is shown full size with
# horizontal scrolling instead.
# : null - (default) no minimum
# : false - no minimum
# : type(float) - minimum scale factor, 0-1 (e.g. 0.4 = don't shrink below 40%)
# : mobile - disable scaling at viewports ≤ 576px
# : tablet - disable scaling at viewports ≤ 768px
# : desktop - disable scaling at viewports ≤ 992px
# Per-page override: `scale-to-fit-min-scale: "tablet"`
# scale_to_fit_min_scale: null

# Navigation Icons
# ----------------
# Lucide icons prepended to sidebar/navbar entries.
# : {} - (default) no icons
# : false - disabled
# : type(map) - an icon per navbar/sidebar entry:
# nav_icons:
#   navbar:
#     "User Guide": book-open
#   sidebar:
#     Reference: code
# nav_icons: {}

# UI Features
# -----------
# Keyboard shortcuts and help overlay.
# keyboard_nav: true

# Auto-generated package-info page (dependency details), linked from homepage Meta.
# package_info_page: true

# Back-to-top floating button.
# back_to_top: true

# Footer attribution ("Site created with Great Docs").
# attribution: true

# Custom Head HTML
# ----------------
# Injected into <head> of every page.
# : [] - (default) nothing injected
# : type(str) - inline HTML, e.g. '<link rel="preconnect" href="https://example.com">'
# : type(list) - several entries, mixing inline HTML and `text:`/`file:` maps:
# include_in_header:
#   - '<script defer src="/analytics.js"></script>'
#   - file: partials/head.html
# include_in_header: []

# Freeze (Execution Caching)
# --------------------------
# Whether computational documents re-run during builds. A scalar shorthand
# sets `mode` (e.g. `freeze: false`).
# mode:
#   : auto - (default) re-render only when the source changes
#   : true - never re-render during project render
#   : false - execute every document on every build
#   : null - as false
# pre_render: script(s) to run before render (e.g. copy _freeze/ into the build dir)
# freeze:
#   mode: auto
#   pre_render: []

# Pre-render Scripts
# ------------------
# Quarto's native pre-render hook (alternative to freeze.pre_render). Copied
# into the build directory and wired into _quarto.yml. Paths are relative to
# root.
# : [] - (default) no scripts
# : type(str) - a single script, e.g. scripts/before-render.py
# : type(list) - several, e.g. [scripts/before-render.py, scripts/other.py]
# pre_render: []

# Agent Skills
# ------------
# Emits a SKILL.md conforming to the Agent Skills spec (https://agentskills.io/)
# so coding agents can learn the package.
# skill:
#   enabled: true # Emit a SKILL.md for this package (default: true)
#   file: null # Path to a hand-written SKILL.md (overrides auto-generation)
#   well_known: true # Also serve at /.well-known/agent-skills/{name}/SKILL.md + index.json
#   # Strings for the Gotchas section.
#   gotchas: []
#   # Strings for the Best Practices section.
#   best_practices: []
#   # Manual decision-table rows. Example:
#   #   decision_table:
#   #     - need: "Parse a file"
#   #       use: read_yaml()
#   decision_table: []
#   extra_body: null # Path to extra Markdown appended to the generated body
#   # Multiple named skills (overrides 'file' when set):
#   # skills:
#   #   - name: my-package
#   #     file: skills/my-package/SKILL.md
#   #   - name: authoring-pages
#   #     file: skills/authoring-pages/SKILL.md
#   skills: []

# Social Cards & Open Graph
# -------------------------
# Auto-generate <meta> tags for social media previews (LinkedIn, Discord, Slack,
# Bluesky, Mastodon, X/Twitter, and other platforms). Enabled by default.
#
# Fine-grained control:
# social_cards:
#   enabled: true
#   image: assets/social-card.png   # Default og:image for all pages
#   twitter_site: "@myhandle"       # Twitter/X site @handle
#   twitter_card: summary_large_image  # "summary" or "summary_large_image"
# social_cards:
#   enabled: true # Auto-generate social preview meta tags (default: true)
#   image: null # Default og:image for all pages; omitted from meta tags when null
#   twitter_card: null # "summary" or "summary_large_image"
#   twitter_site: null # Twitter/X site @handle (e.g. "@myhandle")

# Page Status Badges
# ------------------
# Lifecycle indicators in sidebar navigation. Pages opt in via frontmatter
# (`status: new`, `deprecated`, ...).
# page_status:
#   enabled: false # Master switch for page status badges
#   show_in_sidebar: true # Show badges next to sidebar navigation links
#   show_on_pages: true # Show a status indicator below page titles (like tags)
#   # Built-in status definitions (extend or override).
#   statuses:
#     new:
#       label: New
#       icon: sparkles
#       color: "#10b981"
#       description: Recently added
#     updated:
#       label: Updated
#       icon: refresh-cw
#       color: "#3b82f6"
#       description: Recently updated
#     beta:
#       label: Beta
#       icon: flask-conical
#       color: "#f59e0b"
#       description: Beta feature
#     deprecated:
#       label: Deprecated
#       icon: triangle-alert
#       color: "#ef4444"
#       description: May be removed in a future release
#     experimental:
#       label: Experimental
#       icon: beaker
#       color: "#8b5cf6"
#       description: API may change without notice
#     upcoming:
#       label: Upcoming
#       icon: rocket
#       color: "#e63946"
#       description: Coming in a future release

# Page Tags
# ---------
# Categorize pages for discoverability via frontmatter
# (`tags: [Python, Testing, API]`).
# tags:
#   enabled: false # Master switch for page tags
#   index_page: true # Auto-generate a tags index page listing all tags and their pages
#   show_on_pages: true # Render tag pills above page titles, linked to the tag index
#   hierarchical: true # Support hierarchical tags with "/" (e.g. "Python/Testing")
#   # Optional tag icons (tag name -> Lucide icon). Example:
#   #   icons:
#   #     Python: code
#   icons: {}
#   # Shadow tags: names hidden from public view (internal organization only).
#   # Shadow-tagged pages are indexed but their tags are not rendered.
#   shadow: []
#   scoped: false # Show a tag cloud scoped to the section on section pages
#   location: top # Default tag pill placement: "top" or "bottom"

# SEO
# ---
# Generates sitemap.xml, robots.txt, and discoverability metadata.
# seo:
#   enabled: true # Master switch for all SEO features
#   sitemap:
#     enabled: true # Generate sitemap.xml
#     # Change frequency by page type (always|hourly|daily|weekly|monthly|yearly|never).
#     changefreq:
#       homepage: weekly
#       reference: monthly
#       user_guide: monthly
#       changelog: weekly
#       default: monthly
#     # Priority by page type (0.0-1.0).
#     priority:
#       homepage: 1.0
#       reference: 0.8
#       user_guide: 0.9
#       changelog: 0.6
#       default: 0.5
#   robots:
#     enabled: true # Generate robots.txt
#     allow_all: true # Allow all crawlers by default
#     disallow: [] # Paths to disallow, e.g. ["/drafts/", "/_internal/"]
#     crawl_delay: null # Optional crawl delay in seconds
#     extra_rules: [] # Extra raw lines, e.g. ["User-agent: GPTBot", "Disallow: /"]
#   canonical:
#     enabled: true # Add canonical URLs to pages
#     # Base URL (e.g. "https://example.github.io/pkg/"); auto-detected from
#     # GitHub Pages when null.
#     base_url: null
#   # Requires {page_title}; {site_name} is optional. Omit {site_name} to remove the
#   # site-name component from titled pages. Untitled pages, including the home
#   # page, show only the site name.
#   title_template: "{page_title} | {site_name}"
#   structured_data:
#     enabled: true # Add JSON-LD to pages
#     type: SoftwareSourceCode # Schema.org type
#   default_description: null # Falls back to the package description when null