Files
metajs-customizer/index.html
T
Claude 56cd1d86a4 Enhance search engine optimization
Comprehensive SEO improvements to boost search visibility and social sharing:

Meta Tags & Structured Data:
- Add JSON-LD structured data (Schema.org WebApplication)
- Enhance meta description with actionable keywords
- Expand keywords for better search coverage
- Add robots meta tag with max-snippet directives
- Add generator meta tag
- Add Twitter card type (summary_large_image)
- Add Open Graph image placeholder with alt text
- Update all titles and descriptions consistently

Mobile & Theme Optimization:
- Add theme-color meta tags for light/dark modes
- Add mobile-web-app-capable meta tags
- Add Apple-specific mobile meta tags
- Improve mobile browser integration

Performance:
- Add preload hints for critical CSS and JS resources
- Add dns-prefetch for CDN resources
- Add crossorigin attribute to preconnect hints

Crawler Configuration:
- Create robots.txt with sitemap reference
- Create sitemap.xml with main URLs
- Allow all crawlers with proper directives

These enhancements improve discoverability, social sharing, mobile experience,
and overall search engine ranking potential.
2025-11-12 14:50:39 +00:00

402 lines
14 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Mobile & Theme -->
<meta name="theme-color" content="#6366f1" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#4f46e5" media="(prefers-color-scheme: dark)" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="META.js Customizer" />
<!-- Basic Meta Tags -->
<title>META.js Customizer - Create Custom META.js Configuration | xixu-me</title>
<meta
name="description"
content="Free online META.js customizer tool. Build custom META.js configurations with service rulesets from xixu-me/RFM. Drag-and-drop interface, real-time generation, GitHub integration. Create your META.js in seconds."
/>
<meta
name="keywords"
content="META.js, META.js customizer, META.js generator, META.js configuration, service rulesets, RFM, xixu-me, web development, network routing, proxy configuration, rule generator, JavaScript, GitHub, open source, drag and drop, configuration tool, meta js builder"
/>
<meta name="author" content="xixu-me" />
<meta name="generator" content="META.js Customizer" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://metajs.xi-xu.me" />
<meta
property="og:title"
content="META.js Customizer - Create Custom META.js Configuration | xixu-me"
/>
<meta
property="og:description"
content="Free online META.js customizer tool. Build custom META.js configurations with service rulesets from xixu-me/RFM. Drag-and-drop interface, real-time generation, GitHub integration."
/>
<meta property="og:site_name" content="META.js Customizer" />
<!-- TODO: Add og:image with a screenshot/preview of the application -->
<!-- <meta property="og:image" content="https://metajs.xi-xu.me/assets/preview.png" /> -->
<meta property="og:image:alt" content="META.js Customizer interface screenshot" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://metajs.xi-xu.me" />
<meta
name="twitter:title"
content="META.js Customizer - Create Custom META.js Configuration | xixu-me"
/>
<meta
name="twitter:description"
content="Free online META.js customizer tool. Build custom META.js configurations with service rulesets from xixu-me/RFM. Drag-and-drop interface, real-time generation, GitHub integration."
/>
<meta name="twitter:creator" content="@xixu_me" />
<meta name="twitter:site" content="@xixu_me" />
<!-- Canonical URL -->
<link rel="canonical" href="https://metajs.xi-xu.me" />
<!-- Preload Critical Resources -->
<link rel="preload" href="src/styles/main.css" as="style" />
<link rel="preload" href="src/scripts/app.js" as="script" />
<link rel="preload" href="src/templates/meta-template.js" as="script" />
<!-- Preconnect for Performance -->
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin />
<link rel="preconnect" href="https://api.github.com" />
<link rel="preconnect" href="https://raw.githubusercontent.com" />
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
<!-- Stylesheets -->
<link rel="stylesheet" href="src/styles/main.css" />
<link
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
rel="stylesheet"
/>
<!-- SortableJS for drag-and-drop functionality -->
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
<!-- JSON-LD Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "META.js Customizer",
"url": "https://metajs.xi-xu.me",
"description": "Create your custom META.js with service rulesets from xixu-me/RFM. Easy-to-use web interface for generating META.js configurations.",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Web Browser",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"author": {
"@type": "Person",
"name": "xixu-me",
"url": "https://github.com/xixu-me"
},
"sourceOrganization": {
"@type": "Organization",
"name": "xixu-me",
"url": "https://github.com/xixu-me"
},
"inLanguage": "en",
"browserRequirements": "Requires JavaScript. Requires HTML5.",
"featureList": [
"Service ruleset selection",
"Drag-and-drop ordering",
"Real-time META.js generation",
"GitHub integration",
"Dark/Light theme support",
"Domain preview"
]
}
</script>
</head>
<body>
<!-- Theme Toggle -->
<div class="theme-toggle">
<button id="theme-toggle" aria-label="Toggle theme" title="Theme: Auto">
<i class="fas fa-circle-half-stroke"></i>
</button>
</div>
<!-- Main Container -->
<div class="container">
<!-- Header Section -->
<header class="header">
<h1>
<i class="fas fa-cogs" aria-hidden="true"></i>
META.js Customizer
</h1>
<p class="subtitle">
Create your custom META.js of
<a
href="https://github.com/xixu-me/META"
target="_blank"
rel="noopener"
>
<i class="fab fa-github" aria-hidden="true"></i> xixu-me/META
</a>
using service rulesets from
<a
href="https://github.com/xixu-me/RFM"
target="_blank"
rel="noopener"
>
<i class="fab fa-github" aria-hidden="true"></i> xixu-me/RFM
</a>
</p>
</header>
<!-- Services Configuration Section -->
<main>
<section
id="services-container"
class="card"
aria-labelledby="services-heading"
>
<div class="card-header">
<h2 id="services-heading">
<i class="fas fa-list" aria-hidden="true"></i>
Services Configuration
</h2>
</div>
<div class="card-content">
<!-- Routing Priority Information -->
<div
class="routing-priority-reminder"
role="note"
aria-label="Important routing information"
>
<i
class="fas fa-exclamation-triangle warning-icon"
aria-hidden="true"
></i>
<div class="content">
<strong>Routing Priority:</strong>
<span>
Routing rules are matched in order from top to bottom, with
the rule at the top of the list taking precedence over the
rules below it.
</span>
</div>
</div>
<!-- Services Controls -->
<div class="services-controls">
<div class="search-container">
<div class="search-input-wrapper">
<i class="fas fa-search search-icon" aria-hidden="true"></i>
<input
type="text"
id="search-input"
placeholder="Search and add services..."
aria-label="Search for services"
autocomplete="off"
spellcheck="false"
/>
</div>
<div class="services-count" role="status" aria-live="polite">
<i class="fas fa-check-circle" aria-hidden="true"></i>
<span id="selected-count">0 of 0 selected</span>
</div>
</div>
<!-- Search Results Dropdown -->
<div
id="search-results"
class="search-results"
role="listbox"
aria-label="Available services"
aria-hidden="true"
></div>
</div>
<!-- Selected Services List -->
<div
id="selected-services"
role="list"
aria-label="Selected services"
aria-describedby="services-description"
>
<div class="no-services">
<i class="fas fa-inbox" aria-hidden="true"></i>
<h3>No services selected</h3>
<p id="services-description">
Search for services above to get started
</p>
</div>
</div>
</div>
</section>
<!-- Generated Output Section -->
<section
id="output-container"
class="card"
aria-labelledby="output-heading"
>
<div class="card-header">
<h2 id="output-heading">
<i class="fas fa-code" aria-hidden="true"></i>
Generated META.js
</h2>
</div>
<div class="card-content">
<div class="output-actions">
<button
id="copyButton"
class="btn btn-primary"
disabled
aria-describedby="copy-description"
>
<i class="fas fa-copy" aria-hidden="true"></i>
Copy to Clipboard
</button>
<button
id="downloadButton"
class="btn btn-secondary"
disabled
aria-describedby="download-description"
>
<i class="fas fa-download" aria-hidden="true"></i>
Download META.js
</button>
</div>
<div class="sr-only">
<p id="copy-description">
Copy the generated META.js to your clipboard
</p>
<p id="download-description">
Download the generated META.js as a file
</p>
</div>
</div>
</section>
</main>
<!-- Domain Preview Modal -->
<div id="domain-preview-modal" class="modal-overlay" aria-hidden="true">
<div
class="modal-content"
role="dialog"
aria-labelledby="modal-title"
aria-describedby="modal-description"
>
<div class="modal-header">
<h3 id="modal-title">Domain Preview</h3>
<button class="modal-close" aria-label="Close domain preview">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<div class="service-info-header">
<div class="service-icon">
<i class="fas fa-globe"></i>
</div>
<div class="service-details">
<h4 id="modal-service-name">Service Name</h4>
<p id="modal-description">Domain rules for this service</p>
</div>
</div>
<div class="domains-container">
<div class="loading-spinner" id="modal-loading">
<i class="fas fa-spinner fa-spin"></i>
<p>Loading domain list...</p>
</div>
<div
class="domains-list"
id="domains-list"
style="display: none"
></div>
<div class="modal-error" id="modal-error" style="display: none">
<i class="fas fa-exclamation-triangle"></i>
<h4>Failed to Load Domains</h4>
<p id="error-message">Unable to fetch domain information.</p>
</div>
</div>
</div>
</div>
</div>
<!-- Information Section -->
<aside class="info-banner card" aria-labelledby="info-heading">
<div class="card-header">
<h2 id="info-heading">
<i class="fas fa-info-circle" aria-hidden="true"></i>
Icon Configuration Guide
</h2>
</div>
<div class="card-content">
<div class="info-content">
<p>
Service icons are sourced from
<a
href="https://github.com/xixu-me/favicons"
target="_blank"
rel="noopener"
>
<i class="fab fa-github" aria-hidden="true"></i>
xixu-me/favicons</a
>. Auto-generated configurations may require manual adjustments
based on availability.
</p>
<h3>
<i class="fas fa-cog" aria-hidden="true"></i>
Configuration Rules
</h3>
<ul>
<li>
<strong>Icon unavailable:</strong> Uses specific
<code>domain</code>
<span class="example"
>(e.g., "xiaohongshu.com" for rednote)</span
>
</li>
<li>
<strong>Name matches SLD:</strong> Uses only <code>tld</code>
<span class="example"
>(e.g., "github" → <code>tld: "com"</code>)</span
>
</li>
<li>
<strong>Name mismatch:</strong> Adds <code>sld</code>
<span class="example"
>(e.g., "xai" → <code>sld: "x", tld: "ai"</code>)</span
>
</li>
</ul>
</div>
</div>
</aside>
<!-- Footer -->
<footer class="footer">
<p>
<i class="fas fa-code-branch" aria-hidden="true"></i>
This web app is open source at
<a
href="https://github.com/xixu-me/META.js-Customizer"
target="_blank"
rel="noopener"
>
<i class="fab fa-github" aria-hidden="true"></i>
xixu-me/META.js-Customizer
</a>
</p>
</footer>
</div>
<!-- Scripts -->
<script src="src/templates/meta-template.js"></script>
<script type="module" src="src/scripts/app.js"></script>
</body>
</html>