diff --git a/src/lib/components/About.svelte b/src/lib/components/About.svelte new file mode 100644 index 0000000..505b7ab --- /dev/null +++ b/src/lib/components/About.svelte @@ -0,0 +1,148 @@ + + + + + + +{#if open} + +{/if} + + diff --git a/src/lib/components/Hall.svelte b/src/lib/components/Hall.svelte index a244e4c..19985ec 100644 --- a/src/lib/components/Hall.svelte +++ b/src/lib/components/Hall.svelte @@ -4,6 +4,7 @@ // about panel with the rules, the guide and a way to reach the keeper. import { goto } from '$app/navigation'; import { loadFamily, type FamilyGame } from '$lib/family'; + import About from './About.svelte'; import Preferences from './Preferences.svelte'; import { prefs, setPref } from '$lib/prefs.svelte'; import { allSeats, doubtSeat, forgetSeat, rememberSeat, ServerError, trustSeat } from '$lib/net/client'; @@ -27,6 +28,9 @@ let seats = $state(allSeats()); let games = $state | null>>({}); let aboutOpen = $state(false); + $effect(() => { + if (location.hash === '#about') aboutOpen = true; + }); /** The ledgers' tally, fetched when the about panel opens. */ let tally = $state(null); $effect(() => { @@ -261,16 +265,18 @@ {/if} -
- about this game + + {#snippet aboutGame()}

Hnefatafl is the tafl game of the Vikings, carried by them from Scandinavia to Britain, Ireland, Iceland and beyond, and played until chess arrived in the eleventh and twelfth centuries. No rules from that age survive; the game was reconstructed in modern times from a Sámi cousin, Tablut, whose rules the botanist Carl Linnaeus jotted down on his journey through Lapland in 1732.

This table plays Copenhagen, the modern tournament ruleset, on the eleven-by-eleven board, and Tablut on the nine-by-nine one, with the older board showing its age. The rules it follows are on the rules page. The game is in the public domain; the board and pieces here are drawn, not borrowed.

It is free and keeps no accounts. A game between people lives on a small server as an append-only ledger of moves, so it can be replayed from its first move, and each player is shown only what the rules let them see.

-

Send word

-

A rule read wrong, a bug, a game you would like to tell of: write to eric@ericwagoner.com, @kestrelsnest.social on Bluesky, or @eric@toots.kestrelsnest.social on Mastodon. The keeper of this hall roosts at kestrelsnest.social.

+
+ {/snippet} + {#snippet aboutTally()} +
{#if tally} -

The tally

+
{tally.gamesFinished}
{tally.gamesFinished === 1 ? 'game' : 'games'} played to a finish, of {tally.gamesBegun} begun at {tally.tablesOpened} {tally.tablesOpened === 1 ? 'table' : 'tables'}
{tally.namesSeated}
{tally.namesSeated === 1 ? 'name has' : 'names have'} taken a seat
@@ -285,8 +291,13 @@ {#if tally.firstGameAt}The first game began {new Date(tally.firstGameAt).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}.{/if} Names are counted, not people: one player under two names is two here. Table time counts only the minutes between moves, so a game left open overnight adds nothing for the night.

+ {:else} +

Counting…

{/if} - {#if family.length} +
+ {/snippet} + {#snippet aboutFamily()} +
{#if family.length}

More games in {#if hall}Kestrel's Hall{:else}Kestrel's Hall{/if}

    {#each family as g (g.slug)} @@ -300,7 +311,13 @@

    Hnefatafl belongs to everyone; it is a thousand years old. This page was made by Eric and a very enthusiastic AI, 2026.

-
+ {/snippet} + {#snippet aboutWord()} +
+

A rule read wrong, a bug, a game you would like to tell of: write to eric@ericwagoner.com, @kestrelsnest.social on Bluesky, or @eric@toots.kestrelsnest.social on Mastodon. The keeper of this hall roosts at kestrelsnest.social.

+
+ {/snippet} +