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"
+ ],
)