From 4a9030aaf4031415e1401c7287f500f9ff92dd74 Mon Sep 17 00:00:00 2001 From: Alexander Clark Date: Sun, 3 Aug 2025 09:43:27 -0400 Subject: [PATCH] metadata updates --- docs/_static/custom.css | 61 ++++++++++++++++++++ docs/_static/robots.txt | 32 +++++++++++ docs/_templates/layout.html | 107 ++++++++++++++++++++++++++++++++++++ docs/conf.py | 47 +++++++++++++++- docs/docs-requirements.txt | 3 + setup.py | 36 +++++++++++- 6 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 docs/_static/robots.txt create mode 100644 docs/_templates/layout.html diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 2970b40..ddcc568 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -537,4 +537,65 @@ button[title*="theme"], .bd-header .theme-toggle, .pst-navbar-icon { display: none !important; +} + +/* Performance optimizations */ +img { + loading: lazy; /* Lazy load images for better performance */ +} + +/* Optimize font loading */ +@import url('https://fonts.googleapis.com/css2?family=Crimson+Text:ital,wght@0,400;0,600;1,400&family=Montserrat:wght@400;500;600;700&display=swap'); + +/* Critical CSS optimization - ensure above-the-fold content renders quickly */ +.bd-header, .bd-sidebar-primary, .hero-section { + contain: layout style paint; +} + +/* Optimize scrolling performance */ +.bd-sidebar-primary { + will-change: scroll-position; + transform: translateZ(0); /* Force hardware acceleration */ +} + +/* Reduce paint operations */ +.feature-card, .admonition { + will-change: transform; + backface-visibility: hidden; +} + +/* Optimize animations */ +.feature-card:hover { + transform: translate3d(0, -2px, 0); /* Use 3D transforms for GPU acceleration */ +} + +/* SEO improvements for accessibility and screen readers */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Skip link for accessibility and SEO */ +.skip-link { + position: absolute; + top: -40px; + left: 6px; + background: var(--freeride-primary); + color: white; + padding: 8px; + text-decoration: none; + border-radius: 4px; + z-index: 1000; + transition: top 0.3s; +} + +.skip-link:focus { + top: 6px; } \ No newline at end of file diff --git a/docs/_static/robots.txt b/docs/_static/robots.txt new file mode 100644 index 0000000..087d906 --- /dev/null +++ b/docs/_static/robots.txt @@ -0,0 +1,32 @@ +User-agent: * +Allow: / + +# Sitemap location +Sitemap: https://alexanderthclark.github.io/FreeRide/sitemap.xml + +# Disallow crawling of internal Sphinx files +Disallow: /_sources/ +Disallow: /_static/ +Disallow: /searchindex.js +Disallow: /objects.inv + +# Allow important static assets +Allow: /_static/*.css +Allow: /_static/*.js +Allow: /_static/*.png +Allow: /_static/*.svg +Allow: /_static/*.jpg +Allow: /_static/*.jpeg + +# Crawl delay to be respectful +Crawl-delay: 1 + +# Specific instructions for Google +User-agent: Googlebot +Allow: / +Crawl-delay: 1 + +# Specific instructions for Bing +User-agent: Bingbot +Allow: / +Crawl-delay: 1 \ No newline at end of file diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000..1fbf60d --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,107 @@ +{% extends "!layout.html" %} + +{%- block extrahead %} +{{ super() }} + + + + + + + + + + + + + + + + +{%- endblock extrahead %} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 4ede2ad..02b2f5f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,7 +33,12 @@ def get_version(): 'sphinx.ext.autodoc', # Generate docs from docstrings 'sphinx.ext.napoleon', # Support for NumPy and Google style docstrings 'sphinx.ext.mathjax', - 'myst_parser' + 'myst_parser', + 'sphinx.ext.viewcode', # Add source code links + 'sphinx.ext.githubpages', # GitHub Pages optimization + 'sphinx_sitemap', # Generate sitemap.xml for SEO + 'sphinxext.opengraph', # OpenGraph meta tags for social sharing + 'sphinx_copybutton', # Copy button for code blocks (UX improvement) ] source_suffix = ['.rst', '.md'] @@ -103,3 +108,43 @@ def get_version(): # Favicon html_favicon = "_static/favicon.svg" + +# -- SEO Configuration ------------------------------------------------------- + +# Sitemap configuration +sitemap_url_scheme = "{link}" +html_baseurl = "https://alexanderthclark.github.io/FreeRide/" + +# OpenGraph configuration for social media sharing +ogp_site_url = "https://alexanderthclark.github.io/FreeRide/" +ogp_site_name = "FreeRide - Python Package for Microeconomics Education" +ogp_description_length = 160 +ogp_type = "website" +ogp_image = "https://alexanderthclark.github.io/FreeRide/_static/freeride-banner.png" +ogp_image_alt = "FreeRide Economics Package Banner" + +# Additional HTML meta tags for SEO +html_meta = { + 'description': 'FreeRide: Python package for introductory microeconomics education. Create supply/demand curves, analyze market equilibrium, model game theory, and visualize economic concepts.', + 'keywords': 'microeconomics, economics education, python package, supply and demand, market equilibrium, game theory, monopoly analysis, policy analysis, economics python, undergraduate economics, Econ 101, economic modeling, educational software', + 'author': 'Alexander Clark', + 'robots': 'index, follow', + 'googlebot': 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1', + 'viewport': 'width=device-width, initial-scale=1.0', + 'theme-color': '#1a2332', + 'msapplication-TileColor': '#1a2332', + 'apple-mobile-web-app-capable': 'yes', + 'apple-mobile-web-app-status-bar-style': 'default', +} + +# Copy button configuration +copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " +copybutton_prompt_is_regexp = True +copybutton_remove_prompts = True + +# Language and locale for better SEO +language = 'en' +html_search_language = 'en' + +# Last updated information +html_last_updated_fmt = '%Y-%m-%d' diff --git a/docs/docs-requirements.txt b/docs/docs-requirements.txt index 32628a8..ca5c620 100644 --- a/docs/docs-requirements.txt +++ b/docs/docs-requirements.txt @@ -1,3 +1,6 @@ sphinx myst-parser sphinx-book-theme +sphinx-sitemap +sphinxext-opengraph +sphinx-copybutton diff --git a/setup.py b/setup.py index 2ae9cd3..a37983f 100644 --- a/setup.py +++ b/setup.py @@ -12,14 +12,46 @@ def get_version(): setuptools.setup( name='freeride', version=get_version(), - description='A package for undergraduate microeconomics.', + description='Python package for introductory microeconomics education: supply/demand curves, market equilibrium, game theory, and policy analysis.', long_description=long_description, long_description_content_type="text/markdown", url='https://github.com/alexanderthclark/FreeRide', + project_urls={ + "Documentation": "https://alexanderthclark.github.io/FreeRide/", + "Source Code": "https://github.com/alexanderthclark/FreeRide", + "Bug Tracker": "https://github.com/alexanderthclark/FreeRide/issues", + "Tutorials": "https://alexanderthclark.github.io/FreeRide/tutorials/quickstart.html", + }, author='Alexander Clark', - install_requires=['matplotlib', 'numpy', 'IPython', 'bokeh'], author_email='', + maintainer='Alexander Clark', + license='MIT', + install_requires=['matplotlib', 'numpy', 'IPython', 'bokeh'], packages=setuptools.find_packages(), python_requires='>=3.8', zip_safe=False, + classifiers=[ + "Development Status :: 4 - Beta", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "Topic :: Education", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Information Analysis", + "Topic :: Scientific/Engineering :: Visualization", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: OS Independent", + "Natural Language :: English", + ], + keywords=[ + "microeconomics", "economics", "education", "supply-demand", + "market-equilibrium", "game-theory", "monopoly", "policy-analysis", + "economics-education", "undergraduate", "econ-101", "economic-modeling", + "visualization", "matplotlib", "jupyter", "teaching", "learning" + ], )