']
+
+ for ex in examples:
+ example_doc = f"examples/{ex}"
+ example_uri = builder.get_relative_uri(env.docname, example_doc)
+
+ thumb_path = thumbnail_map.get(ex)
+ if not thumb_path:
+ continue
+
+ thumb_uri = relative_uri(page_uri, f"_images/{Path(thumb_path).name}")
+
+ card_title = Path(ex).name.replace("_", " ").capitalize()
+
+ html_blocks.append(f"""
+
+
+

+
+
+ {card_title}
+
+
+ """)
+
+ html_blocks.append("
")
+
+ section += nodes.raw("", "\n".join(html_blocks), format="html")
+
+ return [section]
+
+
+def setup(app): # noqa: D103
+ app.connect("builder-inited", scan_notebooks)
+ app.connect("builder-inited", build_thumbnail_map)
+
+ app.add_directive("aeon-mini-gallery", AeonMiniGalleryDirective)
+ app.add_css_file("css/aeon_gallery.css")
+
+ return {
+ "version": "1.0",
+ "parallel_read_safe": True,
+ "parallel_write_safe": True,
+ }
diff --git a/docs/_static/css/aeon_gallery.css b/docs/_static/css/aeon_gallery.css
new file mode 100644
index 0000000000..8cff07e755
--- /dev/null
+++ b/docs/_static/css/aeon_gallery.css
@@ -0,0 +1,54 @@
+.aeon-gallery-wrapper {
+ margin-top: 2.5rem;
+}
+
+.aeon-gallery-heading {
+ font-size: 1.9rem;
+ font-weight: 600;
+ margin-bottom: 1.8rem;
+}
+
+.aeon-mini-gallery {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1.8rem;
+}
+
+.aeon-mini-card {
+ display: block;
+ text-decoration: none;
+ background: white;
+ border-radius: 12px;
+ overflow: hidden;
+ border: 1px solid #eaeaea;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);
+ transition: all 0.2s ease;
+}
+
+.aeon-mini-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1);
+}
+
+.aeon-mini-image {
+ aspect-ratio: 4 / 3;
+ background: #f8f9fa;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.aeon-mini-image img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ transition: transform 0.3s ease;
+}
+
+.aeon-mini-title {
+ padding: 0.5rem 0.8rem;
+ font-size: 0.9rem;
+ font-weight: 500;
+ color: #2c2c2c;
+ line-height: 1.1;
+}
diff --git a/docs/_templates/class.rst b/docs/_templates/class.rst
index e129e8a752..1859c4f4c3 100644
--- a/docs/_templates/class.rst
+++ b/docs/_templates/class.rst
@@ -4,3 +4,5 @@
.. currentmodule:: {{ module }}
.. autoclass:: {{ objname }}
+
+.. aeon-mini-gallery:: {{ objname }}
diff --git a/docs/_templates/function.rst b/docs/_templates/function.rst
index f5676ee83c..dc9c8c6fdc 100644
--- a/docs/_templates/function.rst
+++ b/docs/_templates/function.rst
@@ -4,3 +4,5 @@
.. currentmodule:: {{ module }}
.. autofunction:: {{ objname }}
+
+.. aeon-mini-gallery:: {{ objname }}
diff --git a/docs/conf.py b/docs/conf.py
index b2781ffab5..1f3d3590af 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -54,6 +54,7 @@
"myst_parser",
# local extensions (_sphinxext/)
"sphinx_remove_toctrees",
+ "aeon_mini_gallery",
]
# Add any paths that contain templates here, relative to this directory.
@@ -291,7 +292,10 @@
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]
-html_css_files = ["css/custom.css"]
+html_css_files = [
+ "css/custom.css",
+ "css/aeon_gallery.css",
+]
html_show_sourcelink = False