v5: Network footer linking all 8 sibling sites, author personas for every vertical
This commit is contained in:
@@ -134,6 +134,17 @@ IDENTITIES = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NETWORK_SITES = [
|
||||||
|
{"name": "AI Insights", "domain": "ai.thetempleofdoom.com", "desc": "Machine learning & AI"},
|
||||||
|
{"name": "Tech Frontier", "domain": "tech.thetempleofdoom.com", "desc": "Software & infrastructure"},
|
||||||
|
{"name": "Science Decoded", "domain": "science.thetempleofdoom.com", "desc": "Physics, biology, space"},
|
||||||
|
{"name": "Crypto Compass", "domain": "crypto.thetempleofdoom.com", "desc": "Blockchain & DeFi"},
|
||||||
|
{"name": "Linux Lab", "domain": "linux.thetempleofdoom.com", "desc": "Open source & systems"},
|
||||||
|
{"name": "Game Layer", "domain": "gaming.thetempleofdoom.com", "desc": "Games & culture"},
|
||||||
|
{"name": "Maker Forge", "domain": "diy.thetempleofdoom.com", "desc": "3D printing & making"},
|
||||||
|
{"name": "Practical Guides", "domain": "guides.thetempleofdoom.com", "desc": "Tutorials & how-tos"},
|
||||||
|
]
|
||||||
|
|
||||||
IDENTITY = IDENTITIES.get(VERTICAL, IDENTITIES["guides"])
|
IDENTITY = IDENTITIES.get(VERTICAL, IDENTITIES["guides"])
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@@ -392,7 +403,8 @@ def home():
|
|||||||
record_view("/")
|
record_view("/")
|
||||||
return render_template_string(HOME_TEMPLATE, **IDENTITY,
|
return render_template_string(HOME_TEMPLATE, **IDENTITY,
|
||||||
articles=articles, popular=popular, total=total, total_views=total_views,
|
articles=articles, popular=popular, total=total, total_views=total_views,
|
||||||
domain=DOMAIN, vertical=VERTICAL, json_ld=json.dumps(build_json_ld()))
|
domain=DOMAIN, vertical=VERTICAL, json_ld=json.dumps(build_json_ld()),
|
||||||
|
network_sites=[s for s in NETWORK_SITES if s["domain"] != DOMAIN])
|
||||||
|
|
||||||
|
|
||||||
@app.route("/articles/<slug>")
|
@app.route("/articles/<slug>")
|
||||||
@@ -408,7 +420,8 @@ def article(slug):
|
|||||||
|
|
||||||
return render_template_string(ARTICLE_TEMPLATE, **IDENTITY,
|
return render_template_string(ARTICLE_TEMPLATE, **IDENTITY,
|
||||||
article=article, related=related, domain=DOMAIN, vertical=VERTICAL,
|
article=article, related=related, domain=DOMAIN, vertical=VERTICAL,
|
||||||
json_ld=json.dumps(build_json_ld(article)))
|
json_ld=json.dumps(build_json_ld(article)),
|
||||||
|
network_sites=[s for s in NETWORK_SITES if s["domain"] != DOMAIN])
|
||||||
|
|
||||||
|
|
||||||
@app.route("/search")
|
@app.route("/search")
|
||||||
@@ -835,12 +848,22 @@ HOME_TEMPLATE = """<!DOCTYPE html>
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<span>© {{ domain }}</span>
|
<div class="footer-network">
|
||||||
<nav>
|
<h4>Around the Network</h4>
|
||||||
<a href="/rss.xml">RSS</a>
|
<div class="network-grid">
|
||||||
<a href="/sitemap.xml">Sitemap</a>
|
{% for s in network_sites %}
|
||||||
<a href="/search">Search</a>
|
<a href="https://{{ s.domain }}" class="network-link">{{ s.name }}<span>{{ s.desc }}</span></a>
|
||||||
</nav>
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer-bottom">
|
||||||
|
<span>© {{ domain }}</span>
|
||||||
|
<nav>
|
||||||
|
<a href="/rss.xml">RSS</a>
|
||||||
|
<a href="/sitemap.xml">Sitemap</a>
|
||||||
|
<a href="/search">Search</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
<img src="/a/ping?p=/" alt="" width="1" height="1" style="display:none">
|
<img src="/a/ping?p=/" alt="" width="1" height="1" style="display:none">
|
||||||
</body>
|
</body>
|
||||||
@@ -991,6 +1014,16 @@ ARTICLE_TEMPLATE = """<!DOCTYPE html>
|
|||||||
.site-footer{border-top:1px solid var(--border);padding:2.5rem 1.5rem;max-width:1000px;margin:0 auto}
|
.site-footer{border-top:1px solid var(--border);padding:2.5rem 1.5rem;max-width:1000px;margin:0 auto}
|
||||||
.footer-main{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;color:var(--text-muted);font-size:0.8rem}
|
.footer-main{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;color:var(--text-muted);font-size:0.8rem}
|
||||||
.footer-main a{color:var(--text-muted);text-decoration:none}
|
.footer-main a{color:var(--text-muted);text-decoration:none}
|
||||||
|
|
||||||
|
/* Network Footer */
|
||||||
|
.footer-network{border-bottom:1px solid var(--border);padding-bottom:1.5rem;margin-bottom:1.5rem}
|
||||||
|
.footer-network h4{font-family:var(--font-heading);font-size:0.85rem;color:var(--text-muted);margin-bottom:0.75rem;text-transform:uppercase;letter-spacing:0.05em}
|
||||||
|
.network-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:0.5rem}
|
||||||
|
.network-link{display:block;background:var(--card-bg);border:1px solid var(--border);border-radius:6px;padding:0.5rem 0.75rem;text-decoration:none;color:var(--text);font-size:0.8rem;font-weight:500;transition:border-color 0.2s}
|
||||||
|
.network-link:hover{border-color:var(--primary)}
|
||||||
|
.network-link span{display:block;color:var(--text-muted);font-size:0.7rem;font-weight:400;margin-top:0.1rem}
|
||||||
|
.footer-bottom{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem;color:var(--text-muted);font-size:0.8rem}
|
||||||
|
.footer-bottom a{color:var(--text-muted);text-decoration:none}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -1060,7 +1093,15 @@ ARTICLE_TEMPLATE = """<!DOCTYPE html>
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer class="site-footer">
|
<footer class="site-footer">
|
||||||
<div class="footer-main">
|
<div class="footer-network">
|
||||||
|
<h4>Around the Network</h4>
|
||||||
|
<div class="network-grid">
|
||||||
|
{% for s in network_sites %}
|
||||||
|
<a href="https://{{ s.domain }}" class="network-link">{{ s.name }}<span>{{ s.desc }}</span></a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer-bottom">
|
||||||
<span>© {{ domain }}</span>
|
<span>© {{ domain }}</span>
|
||||||
<nav>
|
<nav>
|
||||||
<a href="/rss.xml">RSS</a>
|
<a href="/rss.xml">RSS</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user