Files
haopengzhan f52b3fe9e4 feat(migration): complete WordPress migration and UX refinements
- Migrate historical posts, localized assets, and 103 comments
- Colocate media into posts/<slug>/images/ and remove wp-content
- Add native bilingual support for ai-can-change post (English default, /zh variant)
- Support clean taxonomy routing (/category/:category and /tag/:tag)
- Dynamically populate categories and tags in sitemap.xml
- Fix header scroll padding/margin offsets for anchor and reference links
- Constrain image and media widths to prevent content overflow
- Redesign homepage recent posts to 4 compact editorial cards
- Restore valid binary favicon.ico and high-res icon assets
- Remove placeholder content and sample test comments
2026-09-16 23:09:09 -07:00

71 lines
3.0 KiB
Plaintext

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= typeof title !== 'undefined' ? `${title} - ${site.title}` : site.title %></title>
<meta name="description" content="<%= (seo && seo.description) || site.tagline %>">
<link rel="canonical" href="<%= (seo && seo.canonicalUrl) || site.url %>">
<!-- Open Graph / Social Media -->
<meta property="og:site_name" content="<%= site.title %>">
<meta property="og:title" content="<%= (seo && seo.title) || site.title %>">
<meta property="og:description" content="<%= (seo && seo.description) || site.tagline %>">
<meta property="og:type" content="<%= (seo && seo.type) || 'website' %>">
<meta property="og:url" content="<%= (seo && seo.canonicalUrl) || site.url %>">
<% if (seo && seo.ogImage) { %>
<meta property="og:image" content="<%= seo.ogImage %>">
<% } %>
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="<%= (seo && seo.title) || site.title %>">
<meta name="twitter:description" content="<%= (seo && seo.description) || site.tagline %>">
<% if (seo && seo.ogImage) { %>
<meta name="twitter:image" content="<%= seo.ogImage %>">
<% } %>
<!-- JSON-LD Structured Data -->
<% if (typeof getJsonLd === 'function') { %>
<script type="application/ld+json">
<%- getJsonLd() %>
</script>
<% } %>
<!-- Site Icons & Favicons -->
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="shortcut icon" href="/favicon.ico">
<!-- RSS Link -->
<link rel="alternate" type="application/rss+xml" title="<%= site.title %> RSS Feed" href="/feed">
<!-- Google Fonts: Cardo (Twenty Twenty-Four Typography) & Inter -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cardo:ital,wght@0,400;0,700;1,400&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Core Stylesheets -->
<link rel="stylesheet" href="/css/fonts.css">
<link rel="stylesheet" href="/css/base.css">
<link rel="stylesheet" href="/css/components.css">
<link rel="stylesheet" href="/css/prism-okaidia.css">
<!-- Custom CSS overrides from PV if provided -->
<link rel="stylesheet" href="/css/custom/custom.css" onerror="this.remove()">
<!-- Plugin head injection -->
<%- pluginHook('injectHead', { pageType: typeof pageType !== 'undefined' ? pageType : 'default' }) %>
</head>
<body>
<%- pluginHook('injectBodyStart', { pageType: typeof pageType !== 'undefined' ? pageType : 'default' }) %>
<%- include('./header') %>
<main class="site-main">
<div class="container">