Skip to content

Commit f3a77e5

Browse files
committed
Traffic growth: OG cards, Wordform share, Eclipse 2026/7 SEO
Add per-game OG SVGs and meta tags; improve Wordform share with Web Share API and win prompt; tune Eclipse Predictor for 2026/2027 searches with deep links and FAQ schema.
1 parent 71f4316 commit f3a77e5

17 files changed

Lines changed: 246 additions & 30 deletions

Chess.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@
2525
<meta property="og:url" content="https://boardgaminghub.com/Chess.html">
2626
<meta property="og:title" content="Chess — Free Online Chess">
2727
<meta property="og:description" content="Free in-browser Chess. Single-player vs AI or 2-player local. No signup.">
28-
<meta property="og:image" content="https://boardgaminghub.com/og-image.png">
29-
<meta name="twitter:card" content="summary_large_image">
28+
<meta property="og:image" content="https://boardgaminghub.com/og/chess.svg">
29+
<meta property="og:image:width" content="1200">
30+
<meta property="og:image:height" content="630">
31+
<meta name="twitter:card" content="summary_large_image">
32+
<meta name="twitter:image" content="https://boardgaminghub.com/og/chess.svg">
33+
<meta name="twitter:card" content="summary_large_image">
3034
<meta name="twitter:image" content="https://boardgaminghub.com/og-image.png">
3135
<script type="application/ld+json">
3236
{ "@context": "https://schema.org", "@type": "VideoGame", "name": "Chess",

Drift.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
<meta property="og:url" content="https://boardgaminghub.com/Drift.html">
1515
<meta property="og:title" content="Drift — Daily Word Ladder">
1616
<meta property="og:description" content="Transform start to target one letter at a time. Daily theme. Free, in-browser.">
17-
<meta name="twitter:card" content="summary">
17+
<meta property="og:image" content="https://boardgaminghub.com/og/drift.svg">
18+
<meta property="og:image:width" content="1200">
19+
<meta property="og:image:height" content="630">
20+
<meta name="twitter:card" content="summary_large_image">
21+
<meta name="twitter:image" content="https://boardgaminghub.com/og/drift.svg">
1822
<script type="application/ld+json">
1923
{ "@context": "https://schema.org", "@type": "VideoGame", "name": "Drift",
2024
"description": "Daily word ladder puzzle: transform a 4-letter start word into a 4-letter target word, changing one letter per step, with every intermediate word valid English.",

EclipsePredictor.html

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,26 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
66
<meta name="theme-color" content="#04060E">
7-
<title>Eclipse Predictor &mdash; Solar Eclipse Paths on a 3D Globe | Board Gaming Hub</title>
8-
<meta name="description" content="Step through every solar eclipse from 1900 to 2200. Computed with astronomy-engine (sub-arcsecond accuracy), drawn as paths of totality on a 3D Earth.">
7+
<title>2026 &amp; 2027 Solar Eclipse Path Map — 3D Globe | Board Gaming Hub</title>
8+
<meta name="description" content="Free 3D solar eclipse path map for 2026 (Aug 12 total — Spain, Iceland) and 2027 (Aug 2 — Spain to Egypt, 6+ min totality). Every eclipse 1900–2200, sub-arcsecond astronomy-engine accuracy.">
9+
<meta name="keywords" content="2026 solar eclipse path, 2027 solar eclipse, eclipse map, path of totality, solar eclipse predictor, August 2026 eclipse, August 2027 eclipse">
910
<link rel="canonical" href="https://boardgaminghub.com/EclipsePredictor.html">
1011
<meta property="og:type" content="website">
1112
<meta property="og:url" content="https://boardgaminghub.com/EclipsePredictor.html">
12-
<meta property="og:title" content="Eclipse Predictor &mdash; Solar Eclipse Paths">
13-
<meta property="og:description" content="Click through 21st-century solar eclipses and watch the path of totality sweep across a 3D globe.">
13+
<meta property="og:title" content="2026 &amp; 2027 Solar Eclipse Paths on a 3D Globe">
14+
<meta property="og:description" content="Step through the Aug 12 2026 and Aug 2 2027 total eclipses — paths of totality on a rotatable Earth. Free, no signup.">
15+
<meta property="og:image" content="https://boardgaminghub.com/og/eclipse.svg">
16+
<meta property="og:image:width" content="1200">
17+
<meta property="og:image:height" content="630">
18+
<meta name="twitter:card" content="summary_large_image">
19+
<meta name="twitter:image" content="https://boardgaminghub.com/og/eclipse.svg">
20+
<script type="application/ld+json">
21+
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[
22+
{"@type":"Question","name":"When is the next total solar eclipse?","acceptedAnswer":{"@type":"Answer","text":"The next total solar eclipse is August 12, 2026, visible from Greenland, Iceland, and northern Spain. The following major total eclipse is August 2, 2027 across Spain, North Africa, and the Middle East — up to 6m23s of totality."}},
23+
{"@type":"Question","name":"Where can I see the 2026 solar eclipse?","acceptedAnswer":{"@type":"Answer","text":"The August 12, 2026 total eclipse crosses Greenland, Iceland, and northern Spain. Use Eclipse Predictor to view the exact path of totality on a 3D globe."}},
24+
{"@type":"Question","name":"Where is the 2027 eclipse of the century?","acceptedAnswer":{"@type":"Answer","text":"The August 2, 2027 total eclipse — one of the longest of the century at over 6 minutes — crosses Spain, Morocco, Algeria, Libya, Egypt, and Saudi Arabia."}}
25+
]}
26+
</script>
1427
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>&#127773;</text></svg>">
1528
<style>
1629
* { box-sizing: border-box; margin: 0; padding: 0; }
@@ -1867,6 +1880,18 @@ <h4>LEGEND</h4>
18671880
// Default to 2024-04-08 if present, else most recent
18681881
let idx = ECLIPSES.findIndex(e => e.year === 2024 && e.month === 4 && e.day === 8);
18691882
if (idx < 0) idx = Math.floor(ECLIPSES.length / 2);
1883+
const qs = new URLSearchParams(location.search);
1884+
const dateKey = qs.get('date') || qs.get('eclipse');
1885+
if (dateKey) {
1886+
const di = ECLIPSES.findIndex(e => `${e.year}-${String(e.month).padStart(2,'0')}-${String(e.day).padStart(2,'0')}` === dateKey);
1887+
if (di >= 0) idx = di;
1888+
} else if (qs.get('year') === '2026') {
1889+
const di = ECLIPSES.findIndex(e => e.year === 2026 && e.month === 8 && e.day === 12);
1890+
if (di >= 0) idx = di;
1891+
} else if (qs.get('year') === '2027') {
1892+
const di = ECLIPSES.findIndex(e => e.year === 2027 && e.month === 8 && e.day === 2);
1893+
if (di >= 0) idx = di;
1894+
}
18701895
loadEclipse(idx);
18711896
// Fade out overlay
18721897
loadOverlayEl.style.transition = 'opacity 0.5s';
@@ -1878,11 +1903,17 @@ <h4>LEGEND</h4>
18781903
</script>
18791904

18801905
<section class="seo-content" style="position:relative;z-index:50;background:#0c1016;margin-top:0;padding-bottom:40px;">
1881-
<h2>About Eclipse Predictor</h2>
1882-
<p>Step through every solar eclipse from 1900 to 2200. Paths of totality, annularity, and hybrid eclipses are computed with <strong>astronomy-engine</strong> (sub-arcsecond ephemeris) and drawn on a rotatable 3D Earth.</p>
1906+
<h2>2026 &amp; 2027 Solar Eclipse Paths</h2>
1907+
<p>Step through every solar eclipse from 1900 to 2200. Paths of totality are computed with <strong>astronomy-engine</strong> (sub-arcsecond ephemeris) and drawn on a rotatable 3D Earth.</p>
1908+
<h3>Upcoming total eclipses</h3>
1909+
<ul>
1910+
<li><a href="?date=2026-08-12"><strong>Aug 12, 2026</strong></a> — total: Greenland, Iceland, northern Spain</li>
1911+
<li><a href="?date=2027-08-02"><strong>Aug 2, 2027</strong></a> — total: Spain through Egypt (&ldquo;Eclipse of the Century,&rdquo; 6m+ totality)</li>
1912+
<li><a href="?date=2024-04-08">Apr 8, 2024</a> — Great American Eclipse (replay)</li>
1913+
</ul>
18831914
<h3>What you can explore</h3>
18841915
<ul>
1885-
<li>Click through the catalog or jump by year — e.g. 2024-04-08 North America, 2026-08-12 Europe, 2027-08-02 Africa.</li>
1916+
<li>Deep links: <code>?date=2026-08-12</code> or <code>?year=2027</code> jump straight to the eclipse.</li>
18861917
<li>Toggle coastlines, night shading, penumbra band, and landmark cities along the path.</li>
18871918
<li>Open <strong>Show the Math</strong> for Besselian elements and contact times.</li>
18881919
</ul>

Floodline.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@
1111
<meta property="og:url" content="https://boardgaminghub.com/Floodline.html">
1212
<meta property="og:title" content="Floodline — California Flood Defense Sim">
1313
<meta property="og:description" content="Free flood-defense sim with real California water physics and historical scenarios.">
14-
<meta property="og:image" content="https://boardgaminghub.com/og-image.png">
14+
<meta property="og:image" content="https://boardgaminghub.com/og/floodline.svg">
15+
<meta property="og:image:width" content="1200">
16+
<meta property="og:image:height" content="630">
17+
<meta name="twitter:card" content="summary_large_image">
18+
<meta name="twitter:image" content="https://boardgaminghub.com/og/floodline.svg">
1519
<meta name="twitter:card" content="summary_large_image">
1620
<meta name="twitter:image" content="https://boardgaminghub.com/og-image.png">
1721
<script type="application/ld+json">

Solitaire.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
<meta property="og:url" content="https://boardgaminghub.com/Solitaire.html">
1313
<meta property="og:title" content="Solitaire — Free Online Klondike">
1414
<meta property="og:description" content="The classic single-player card game. Free, in-browser, single-file HTML.">
15-
<meta name="twitter:card" content="summary">
15+
<meta property="og:image" content="https://boardgaminghub.com/og/solitaire.svg">
16+
<meta property="og:image:width" content="1200">
17+
<meta property="og:image:height" content="630">
18+
<meta name="twitter:card" content="summary_large_image">
19+
<meta name="twitter:image" content="https://boardgaminghub.com/og/solitaire.svg">
1620
<script type="application/ld+json">
1721
{ "@context": "https://schema.org", "@type": "VideoGame", "name": "Solitaire (Klondike)",
1822
"description": "Build foundations from Ace to King in each suit, using a tableau of seven columns and a draw stock.",

Sudoku.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
<meta property="og:url" content="https://boardgaminghub.com/Sudoku.html">
1313
<meta property="og:title" content="Sudoku — Free Online Daily Puzzle">
1414
<meta property="og:description" content="Easy to expert puzzles, pencil notes, hint mode, daily seed. Free, in-browser, single-file HTML.">
15-
<meta name="twitter:card" content="summary">
15+
<meta property="og:image" content="https://boardgaminghub.com/og/sudoku.svg">
16+
<meta property="og:image:width" content="1200">
17+
<meta property="og:image:height" content="630">
18+
<meta name="twitter:card" content="summary_large_image">
19+
<meta name="twitter:image" content="https://boardgaminghub.com/og/sudoku.svg">
1620
<script type="application/ld+json">
1721
{ "@context": "https://schema.org", "@type": "VideoGame", "name": "Sudoku",
1822
"description": "Place digits 1–9 so that every row, column, and 3×3 box contains each digit exactly once.",

Wordform.html

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
<meta property="og:url" content="https://boardgaminghub.com/Wordform.html">
1515
<meta property="og:title" content="Wordform — Free Daily Word Puzzle">
1616
<meta property="og:description" content="Six guesses, five letters, one daily word. Free, in-browser, single-file HTML.">
17-
<meta name="twitter:card" content="summary">
17+
<meta property="og:image" content="https://boardgaminghub.com/og/wordform.svg">
18+
<meta property="og:image:width" content="1200">
19+
<meta property="og:image:height" content="630">
20+
<meta name="twitter:card" content="summary_large_image">
21+
<meta name="twitter:image" content="https://boardgaminghub.com/og/wordform.svg">
1822
<script type="application/ld+json">
1923
{ "@context": "https://schema.org", "@type": "VideoGame", "name": "Wordform",
2024
"description": "Guess the 5-letter daily word in six tries, with color-coded letter feedback.",
@@ -93,6 +97,11 @@
9397
.info strong { color: #f0d89c; }
9498
.legend { color: #8a7858; font-size: 0.78em; margin: 8px 0; }
9599
.legend span { display: inline-block; width: 16px; height: 16px; border-radius: 2px; vertical-align: middle; margin: 0 4px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.3), 0 1px 2px rgba(0,0,0,0.4); }
100+
#shareBtn.pulse { animation: sharePulse 1.2s ease-in-out infinite; border-color: #d4a050; color: #ffe8a8; }
101+
@keyframes sharePulse { 0%,100% { box-shadow: 0 0 0 0 rgba(212,160,80,0.5); } 50% { box-shadow: 0 0 0 8px rgba(212,160,80,0); } }
102+
#shareToast { display: none; margin: 12px auto 0; max-width: 340px; padding: 10px 14px; background: #1a1410; border: 1px solid #5a4028; border-radius: 6px; color: #e8d8b8; font-size: 0.82em; line-height: 1.5; }
103+
#shareToast.show { display: block; }
104+
#shareToast button { margin-top: 8px; width: 100%; }
96105
</style>
97106
</head>
98107
<body>
@@ -107,6 +116,7 @@ <h1>WORDFORM</h1>
107116
<div id="board"></div>
108117
<div id="msg"></div>
109118
<div class="stats">STREAK <span id="streak">0</span> · WINS <span id="wins">0</span> · PLAYED <span id="played">0</span></div>
119+
<div id="shareToast"><span id="shareToastText"></span><button type="button" id="shareToastBtn">Share result</button></div>
110120
<div id="kb"></div>
111121
<nav><a href="index.html">All games</a> · <a href="Sudoku.html">Sudoku</a> · <a href="2048.html">2048</a></nav>
112122

@@ -230,22 +240,49 @@ <h2>How to play Wordform</h2>
230240
$('streak').textContent = s.streak; $('wins').textContent = s.wins; $('played').textContent = s.played;
231241
}
232242
function finishMsg() {
233-
if (guesses.length && guesses[guesses.length-1].word === target) msg('SOLVED IN ' + guesses.length);
243+
const won = guesses.length && guesses[guesses.length-1].word === target;
244+
if (won) msg('SOLVED IN ' + guesses.length);
234245
else msg('OUT OF GUESSES — ' + target.toUpperCase());
246+
if (mode === 'daily' && done) promptShare(won);
235247
}
236248
function msg(t) { $('msg').textContent = t; }
249+
const SHARE_URL = 'https://boardgaminghub.com/Wordform.html';
237250
function shareGrid() {
238251
if (!guesses.length) return '';
239-
const head = mode === 'daily' ? 'Wordform #' + dailyIndex() + ' ' + (done && guesses[guesses.length-1].word === target ? guesses.length : 'X') + '/6' : 'Wordform';
252+
const won = done && guesses[guesses.length-1].word === target;
253+
const head = mode === 'daily' ? 'Wordform #' + dailyIndex() + ' ' + (won ? guesses.length : 'X') + '/6' : 'Wordform';
240254
const map = { hit: '🟩', warm: '🟨', miss: '⬛' };
241-
return head + '\n' + guesses.map(g => g.scores.map(s => map[s]).join('')).join('\n') + '\nboardgaminghub.com/Wordform.html';
255+
return head + '\n' + guesses.map(g => g.scores.map(s => map[s]).join('')).join('\n') + '\n' + SHARE_URL;
242256
}
243-
$('dailyBtn').onclick = () => { mode = 'daily'; $('dailyBtn').classList.add('active'); $('randomBtn').classList.remove('active'); target = pickTarget(); load(); };
244-
$('randomBtn').onclick = () => { mode = 'random'; $('randomBtn').classList.add('active'); $('dailyBtn').classList.remove('active'); target = pickTarget(); guesses = []; current = ''; done = false; render(); msg(''); };
245-
$('shareBtn').onclick = async () => {
246-
const g = shareGrid(); if (!g) { msg('NOTHING TO SHARE'); return; }
247-
try { await navigator.clipboard.writeText(g); msg('COPIED'); } catch (e) { msg('COPY FAILED'); }
248-
};
257+
async function doShare() {
258+
const text = shareGrid();
259+
if (!text) { msg('NOTHING TO SHARE'); return; }
260+
if (navigator.share) {
261+
try {
262+
await navigator.share({ title: 'Wordform', text: text, url: SHARE_URL });
263+
msg('SHARED');
264+
return;
265+
} catch (e) { if (e && e.name === 'AbortError') return; }
266+
}
267+
try {
268+
await navigator.clipboard.writeText(text);
269+
msg('COPIED — paste anywhere');
270+
} catch (e) { msg('COPY FAILED'); }
271+
}
272+
function promptShare(won) {
273+
$('shareBtn').classList.add('pulse');
274+
const toast = $('shareToast');
275+
const tbtn = $('shareToastBtn');
276+
$('shareToastText').textContent = won
277+
? 'Nice solve! Share your emoji grid — no spoilers.'
278+
: 'Tough one today. Share your grid anyway?';
279+
toast.classList.add('show');
280+
tbtn.textContent = navigator.share ? 'Share result' : 'Copy result';
281+
tbtn.onclick = () => { doShare(); toast.classList.remove('show'); $('shareBtn').classList.remove('pulse'); };
282+
}
283+
$('dailyBtn').onclick = () => { mode = 'daily'; $('dailyBtn').classList.add('active'); $('randomBtn').classList.remove('active'); target = pickTarget(); $('shareToast').classList.remove('show'); $('shareBtn').classList.remove('pulse'); load(); };
284+
$('randomBtn').onclick = () => { mode = 'random'; $('randomBtn').classList.add('active'); $('dailyBtn').classList.remove('active'); target = pickTarget(); guesses = []; current = ''; done = false; $('shareToast').classList.remove('show'); $('shareBtn').classList.remove('pulse'); render(); msg(''); };
285+
$('shareBtn').onclick = () => doShare();
249286
document.addEventListener('keydown', e => {
250287
if (e.ctrlKey || e.metaKey) return;
251288
if (e.key === 'Enter') submit();

0 commit comments

Comments
 (0)