diff --git a/lexicons/boo.sky.go.action.json b/lexicons/boo.sky.go.action.json
new file mode 100644
index 0000000..138d3cd
--- /dev/null
+++ b/lexicons/boo.sky.go.action.json
@@ -0,0 +1,40 @@
+{
+ "lexicon": 1,
+ "id": "boo.sky.go.action",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": ["game", "player", "action", "createdAt"],
+ "properties": {
+ "game": {
+ "type": "string",
+ "description": "AT URI of the game this action belongs to"
+ },
+ "player": {
+ "type": "string",
+ "format": "did",
+ "description": "DID of the player performing this action"
+ },
+ "action": {
+ "type": "string",
+ "enum": ["join", "pass", "resign"],
+ "description": "Type of action being performed"
+ },
+ "reason": {
+ "type": "string",
+ "maxLength": 500,
+ "description": "Optional reason for the action (e.g., resignation reason)"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime",
+ "description": "Timestamp when this action was created"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/lib/components/ProverbBanner.svelte b/src/lib/components/ProverbBanner.svelte
new file mode 100644
index 0000000..cbd0976
--- /dev/null
+++ b/src/lib/components/ProverbBanner.svelte
@@ -0,0 +1,272 @@
+
+
+{#if proverb && !isDismissed}
+
+{/if}
+
+
diff --git a/src/lib/go-proverbs.json b/src/lib/go-proverbs.json
new file mode 100644
index 0000000..1b1eb85
--- /dev/null
+++ b/src/lib/go-proverbs.json
@@ -0,0 +1,512 @@
+[
+ {
+ "text": "The enemy's key point is yours",
+ "url": "https://senseis.xmp.net/?TheEnemysKeyPointIsYours",
+ "category": "All Situations"
+ },
+ {
+ "text": "Play on the point of symmetry",
+ "url": "https://senseis.xmp.net/?PlayOnThePointOfSymmetry",
+ "category": "All Situations"
+ },
+ {
+ "text": "Sente gains nothing",
+ "url": "https://senseis.xmp.net/?SenteGainsNothing",
+ "category": "All Situations"
+ },
+ {
+ "text": "Beware of going back to patch up",
+ "url": "https://senseis.xmp.net/?BewareOfGoingBackToPatchUp",
+ "category": "All Situations"
+ },
+ {
+ "text": "When in doubt, Tenuki",
+ "url": "https://senseis.xmp.net/?WhenInDoubtTenuki",
+ "category": "All Situations"
+ },
+ {
+ "text": "People in glass houses shouldn't throw stones",
+ "url": "https://senseis.xmp.net/?PeopleInGlassHousesShouldntThrowStones",
+ "category": "All Situations"
+ },
+ {
+ "text": "There is death in the hane",
+ "url": "https://senseis.xmp.net/?ThereIsDeathInTheHane",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Hane, Cut, Placement",
+ "url": "https://senseis.xmp.net/?HaneCutPlacement",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Learn the eyestealing tesuji",
+ "url": "https://senseis.xmp.net/?LearnTheEyestealingTesuji",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Capture three to get an eye",
+ "url": "https://senseis.xmp.net/?CaptureThreeToGetAnEye",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Six die but eight live",
+ "url": "https://senseis.xmp.net/?SixDieButEightLive",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Four die but six live",
+ "url": "https://senseis.xmp.net/?FourDieButSixLive",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Four is five and five is eight and six is twelve",
+ "url": "https://senseis.xmp.net/?FourIsFiveAndFiveIsEightAndSixIsTwelve",
+ "category": "Life and Death"
+ },
+ {
+ "text": "The carpenter's square becomes ko",
+ "url": "https://senseis.xmp.net/?CarpentersSquare",
+ "category": "Life and Death"
+ },
+ {
+ "text": "The L group is dead",
+ "url": "https://senseis.xmp.net/?LGroup",
+ "category": "Life and Death"
+ },
+ {
+ "text": "The door group is dead",
+ "url": "https://senseis.xmp.net/?DoorGroup",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Strange things happen at the one two point",
+ "url": "https://senseis.xmp.net/?StrangeThingsHappenAtTheOneTwoPoint",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Eyes win semeais",
+ "url": "https://senseis.xmp.net/?EyesWinSemeais",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Check escape routes first",
+ "url": "https://senseis.xmp.net/?CheckEscapeRoutesFirst",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Only enclosed groups can be killed",
+ "url": "https://senseis.xmp.net/?OnlyEnclosedGroupsCanBeKilled",
+ "category": "Life and Death"
+ },
+ {
+ "text": "A three-move approach ko is not a ko",
+ "url": "https://senseis.xmp.net/?ApproachKo",
+ "category": "Life and Death"
+ },
+ {
+ "text": "Respond to attachment with hane",
+ "url": "https://senseis.xmp.net/?RespondToAttachmentWithHane",
+ "category": "Tactics"
+ },
+ {
+ "text": "Hane at the Head of Two Stones",
+ "url": "https://senseis.xmp.net/?HaneAtTheHeadOfTwoStones",
+ "category": "Tactics"
+ },
+ {
+ "text": "Crosscut then extend",
+ "url": "https://senseis.xmp.net/?CrosscutThenExtend",
+ "category": "Tactics"
+ },
+ {
+ "text": "Capture the cutting stones",
+ "url": "https://senseis.xmp.net/?CaptureTheCuttingStones",
+ "category": "Tactics"
+ },
+ {
+ "text": "Beginners play atari",
+ "url": "https://senseis.xmp.net/?BeginnersPlayAtari",
+ "category": "Tactics"
+ },
+ {
+ "text": "The empty triangle is bad",
+ "url": "https://senseis.xmp.net/?TheEmptyTriangleIsBad",
+ "category": "Tactics"
+ },
+ {
+ "text": "The one-point jump is never bad",
+ "url": "https://senseis.xmp.net/?IkkenTobiIsNeverWrong",
+ "category": "Tactics"
+ },
+ {
+ "text": "Don't try to cut the one-point jump",
+ "url": "https://senseis.xmp.net/?DontTryToCutTheOnePointJump",
+ "category": "Tactics"
+ },
+ {
+ "text": "From one, two. From two, three",
+ "url": "https://senseis.xmp.net/?ExtensionFromAWall",
+ "category": "Tactics"
+ },
+ {
+ "text": "Strike at the waist of the keima",
+ "url": "https://senseis.xmp.net/?StrikeAtTheWaistOfTheKeima",
+ "category": "Tactics"
+ },
+ {
+ "text": "Cutting right through a knight's move is very big",
+ "url": "https://senseis.xmp.net/?CuttingRightThroughAKnightsMoveIsVeryBig",
+ "category": "Tactics"
+ },
+ {
+ "text": "Do not peep at cutting points",
+ "url": "https://senseis.xmp.net/?DoNotPeepAtCuttingPoints",
+ "category": "Tactics"
+ },
+ {
+ "text": "Even a moron connects against a peep",
+ "url": "https://senseis.xmp.net/?EvenAMoronConnectsAgainstAPeep",
+ "category": "Tactics"
+ },
+ {
+ "text": "Add a second stone and sacrifice both",
+ "url": "https://senseis.xmp.net/?AddASecondStoneAndSacrificeBoth",
+ "category": "Tactics"
+ },
+ {
+ "text": "Use contact moves for defence",
+ "url": "https://senseis.xmp.net/?UseContactMovesForDefence",
+ "category": "Tactics"
+ },
+ {
+ "text": "Never ignore a shoulder hit",
+ "url": "https://senseis.xmp.net/?NeverIgnoreAShoulderHit",
+ "category": "Tactics"
+ },
+ {
+ "text": "The bamboo joint may be short of liberties",
+ "url": "https://senseis.xmp.net/?TheBambooJointMayBeShortOfLiberties",
+ "category": "Tactics"
+ },
+ {
+ "text": "Nets are better than ladders",
+ "url": "https://senseis.xmp.net/?NetsAreBetterThanLadders",
+ "category": "Tactics"
+ },
+ {
+ "text": "Answer the capping play with a knight's move",
+ "url": "https://senseis.xmp.net/?AnswerTheCappingPlayWithAKnightsMove",
+ "category": "Tactics"
+ },
+ {
+ "text": "Approach from the wider side",
+ "url": "https://senseis.xmp.net/?ApproachFromTheWiderSide",
+ "category": "Tactics"
+ },
+ {
+ "text": "Block on the wider side",
+ "url": "https://senseis.xmp.net/?BlockOnTheWiderSide",
+ "category": "Tactics"
+ },
+ {
+ "text": "Play at the centre of three stones",
+ "url": "https://senseis.xmp.net/?PlayAtTheCentreOfThreeStones",
+ "category": "Tactics"
+ },
+ {
+ "text": "Answer keima with kosumi",
+ "url": "https://senseis.xmp.net/?AnswerKeimaWithKosumi",
+ "category": "Tactics"
+ },
+ {
+ "text": "Five liberties for tactical stability",
+ "url": "https://senseis.xmp.net/?FiveLibertiesForTacticalStability",
+ "category": "Tactics"
+ },
+ {
+ "text": "Capture stones caught in a ladder at the earliest opportunity",
+ "url": "https://senseis.xmp.net/?CaptureStonesCaughtInALadderAtTheEarliestOpportunity",
+ "category": "Tactics"
+ },
+ {
+ "text": "Two hanes gain a liberty",
+ "url": "https://senseis.xmp.net/?TwoHanesGainALiberty",
+ "category": "Tactics"
+ },
+ {
+ "text": "The strong player plays straight, the weak plays diagonal",
+ "url": "https://senseis.xmp.net/?TheStrongPlayerPlaysStraightTheWeakPlaysDiagonal",
+ "category": "Tactics"
+ },
+ {
+ "text": "There is no connection in the carpenter's triangle",
+ "url": "https://senseis.xmp.net/?ThereIsNoConnectionInTheCarpentersTriangle",
+ "category": "Tactics"
+ },
+ {
+ "text": "Play double sente early",
+ "url": "https://senseis.xmp.net/?PlayDoubleSenteEarly",
+ "category": "Tactics"
+ },
+ {
+ "text": "Remove mutual ko threats before the ko",
+ "url": "https://senseis.xmp.net/?RemoveDoubleThreatsBeforeYouFirstCaptureTheKo",
+ "category": "Tactics"
+ },
+ {
+ "text": "Urgent points before big points",
+ "url": "https://senseis.xmp.net/?UrgentPointsBeforeBigPoints",
+ "category": "Strategy"
+ },
+ {
+ "text": "Play away from thickness",
+ "url": "https://senseis.xmp.net/?PlayAwayFromThickness",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't use thickness to make territory",
+ "url": "https://senseis.xmp.net/?DontUseThicknessToMakeTerritory",
+ "category": "Strategy"
+ },
+ {
+ "text": "Make territory while attacking",
+ "url": "https://senseis.xmp.net/?MakeTerritoryWhileAttacking",
+ "category": "Strategy"
+ },
+ {
+ "text": "A ponnuki is worth thirty points",
+ "url": "https://senseis.xmp.net/?APonnukiIsWorthThirtyPoints",
+ "category": "Strategy"
+ },
+ {
+ "text": "Make a fist before striking",
+ "url": "https://senseis.xmp.net/?MakeAFistBeforeStriking",
+ "category": "Strategy"
+ },
+ {
+ "text": "Do not defend territories open on two sides",
+ "url": "https://senseis.xmp.net/?DoNotDefendTerritoriesOpenOnTwoSides",
+ "category": "Strategy"
+ },
+ {
+ "text": "Attach to the stronger stone in a pincer",
+ "url": "https://senseis.xmp.net/?AttachToTheStrongerStoneInAPincer",
+ "category": "Strategy"
+ },
+ {
+ "text": "Make a feint to the east while attacking in the west",
+ "url": "https://senseis.xmp.net/?MakeAFeintToTheEastWhileAttackingInTheWest",
+ "category": "Strategy"
+ },
+ {
+ "text": "A rich man should not pick quarrels",
+ "url": "https://senseis.xmp.net/?ARichManShouldNotPickQuarrels",
+ "category": "Strategy"
+ },
+ {
+ "text": "Play kikashi before living",
+ "url": "https://senseis.xmp.net/?PlayKikashiBeforeLiving",
+ "category": "Strategy"
+ },
+ {
+ "text": "Reduction Is Worth As Much As An Invasion",
+ "url": "https://senseis.xmp.net/?ReductionIsWorthAsMuchAsAnInvasion",
+ "category": "Strategy"
+ },
+ {
+ "text": "Invade a moyo one move before it becomes territory",
+ "url": "https://senseis.xmp.net/?InvadeAMoyoOneMoveBeforeItBecomesTerritory",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't attach when attacking",
+ "url": "https://senseis.xmp.net/?DontAttachWhenAttacking",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't touch weak stones",
+ "url": "https://senseis.xmp.net/?DontTouchWeakStones",
+ "category": "Strategy"
+ },
+ {
+ "text": "Make weak walk along with weak",
+ "url": "https://senseis.xmp.net/?MakeWeakWalkAlongWithWeak",
+ "category": "Strategy"
+ },
+ {
+ "text": "Five groups might live but the sixth will die",
+ "url": "https://senseis.xmp.net/?FiveGroupsMightLiveButTheSixthWillDie",
+ "category": "Strategy"
+ },
+ {
+ "text": "Big dragons never die",
+ "url": "https://senseis.xmp.net/?BigDragonsNeverDie",
+ "category": "Strategy"
+ },
+ {
+ "text": "Grab the shape points in kikashi",
+ "url": "https://senseis.xmp.net/?GrabTheShapePointsInKikashi",
+ "category": "Strategy"
+ },
+ {
+ "text": "Give your opponent what he wants",
+ "url": "https://senseis.xmp.net/?GiveYourOpponentWhatHeWants",
+ "category": "Strategy"
+ },
+ {
+ "text": "Avoid ippoji",
+ "url": "https://senseis.xmp.net/?AvoidIppoji",
+ "category": "Strategy"
+ },
+ {
+ "text": "Sacrifice plums for peaches",
+ "url": "https://senseis.xmp.net/?SacrificePlumsForPeaches",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't trade a dollar for a penny",
+ "url": "https://senseis.xmp.net/?DontTradeADollarForAPenny",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't throw an egg at a wall",
+ "url": "https://senseis.xmp.net/?DontThrowAnEggAtAWall",
+ "category": "Strategy"
+ },
+ {
+ "text": "There are no ko threats in the opening",
+ "url": "https://senseis.xmp.net/?ThereAreNoKoThreatsInTheOpening",
+ "category": "Strategy"
+ },
+ {
+ "text": "Strengthening your own weak group makes your opponent's weaker",
+ "url": "https://senseis.xmp.net/?StrengtheningYourOwnWeakGroupMakesYourOpponentsWeaker",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't go fishing while your house is on fire",
+ "url": "https://senseis.xmp.net/?DontGoFishingWhileYourHouseIsOnFire",
+ "category": "Strategy"
+ },
+ {
+ "text": "Never upset your star-point stones",
+ "url": "https://senseis.xmp.net/?NeverUpsetYourStarPointStones",
+ "category": "Strategy"
+ },
+ {
+ "text": "Greed for the win takes the win away",
+ "url": "https://senseis.xmp.net/?GreedForTheWinTakesTheWinAway",
+ "category": "Strategy"
+ },
+ {
+ "text": "High move (4th line) for influence, low move (3rd line) for territory",
+ "url": "https://senseis.xmp.net/?HighAndLowMoves",
+ "category": "Strategy"
+ },
+ {
+ "text": "If you have lost four corners, resign",
+ "url": "https://senseis.xmp.net/?IfYouHaveLostFourCornersResign",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't push from behind",
+ "url": "https://senseis.xmp.net/?DontPushFromBehind",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't push along the second line",
+ "url": "https://senseis.xmp.net/?TheSecondLineIsTheRouteToDefeat",
+ "category": "Strategy"
+ },
+ {
+ "text": "Riding the tiger it is difficult to get off",
+ "url": "https://senseis.xmp.net/?RidingTheTigerItIsDifficultToGetOff",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't push if you're not going to cut",
+ "url": "https://senseis.xmp.net/?DontPushIfYoureNotGoingToCut",
+ "category": "Strategy"
+ },
+ {
+ "text": "Don't follow proverbs blindly",
+ "url": "https://senseis.xmp.net/?DontFollowProverbsBlindly",
+ "category": "Meta"
+ },
+ {
+ "text": "Proverbs do not apply to White",
+ "url": "https://senseis.xmp.net/?ProverbsDoNotApplyToWhite",
+ "category": "Meta"
+ },
+ {
+ "text": "If It Has a Name Know It",
+ "url": "https://senseis.xmp.net/?IfItHasANameKnowIt",
+ "category": "Meta"
+ },
+ {
+ "text": "Use Go to meet friends",
+ "url": "https://senseis.xmp.net/?UseGoToMeetFriends",
+ "category": "Meta"
+ },
+ {
+ "text": "Learning Joseki loses two stones strength",
+ "url": "https://senseis.xmp.net/?LearningJosekiLosesTwoStonesStrength",
+ "category": "Meta"
+ },
+ {
+ "text": "Black should resign if one player has four corners",
+ "url": "https://senseis.xmp.net/?BlackShouldResignIfOnePlayerHasFourCorners",
+ "category": "Meta"
+ },
+ {
+ "text": "If you don't know ladders, don't play go",
+ "url": "https://senseis.xmp.net/?IfYouDontKnowLaddersDontPlayGo",
+ "category": "Meta"
+ },
+ {
+ "text": "You can play Go but don't let Go play you",
+ "url": "https://senseis.xmp.net/?YouCanPlayGoButDontLetGoPlayYou",
+ "category": "Meta"
+ },
+ {
+ "text": "If you don't like Ko don't Play Go",
+ "url": "https://senseis.xmp.net/?IfYouDontLikeKoDontPlayGo",
+ "category": "Meta"
+ },
+ {
+ "text": "Lose Your First 50 Games as Quickly as Possible",
+ "url": "https://senseis.xmp.net/?LoseYourFirst50GamesAsQuicklyAsPossible",
+ "category": "Meta"
+ },
+ {
+ "text": "The Threat Is Stronger Than Its Execution",
+ "url": "https://senseis.xmp.net/?TheThreatIsStrongerThanItsExecution",
+ "category": "Meta"
+ },
+ {
+ "text": "Only after the 10th punch will you see the fist",
+ "url": "https://senseis.xmp.net/?OnlyAfterThe10thPunchWillYouSeeTheFist",
+ "category": "Meta"
+ },
+ {
+ "text": "Kill two birds with one stone",
+ "url": "https://senseis.xmp.net/?KillTwoBirdsWithOneStone",
+ "category": "Modern"
+ },
+ {
+ "text": "You need half the points + 1",
+ "url": "https://senseis.xmp.net/?YouNeedHalfThePoints1",
+ "category": "Modern"
+ },
+ {
+ "text": "Never wrestle with a pig",
+ "url": "https://senseis.xmp.net/?NeverWrestleWithAPig",
+ "category": "Modern"
+ },
+ {
+ "text": "A bird in the hand is worth two in the bush",
+ "url": "https://senseis.xmp.net/?BirdInTheHand",
+ "category": "Modern"
+ }
+]
diff --git a/src/lib/notifications.ts b/src/lib/notifications.ts
new file mode 100644
index 0000000..a8b82eb
--- /dev/null
+++ b/src/lib/notifications.ts
@@ -0,0 +1,163 @@
+import { browser } from '$app/environment';
+
+export class GameNotifications {
+ private originalTitle: string;
+ private titleInterval: ReturnType | null = null;
+ private notificationPermission: NotificationPermission = 'default';
+
+ constructor() {
+ if (browser) {
+ this.originalTitle = document.title;
+ // iOS Safari doesn't support the Notification API
+ this.notificationPermission = ('Notification' in window) ? Notification.permission : 'denied';
+ } else {
+ this.originalTitle = '';
+ }
+ }
+
+ /**
+ * Request notification permission from the user
+ */
+ async requestPermission(): Promise {
+ if (!browser || !('Notification' in window)) {
+ return false;
+ }
+
+ if (Notification.permission === 'granted') {
+ this.notificationPermission = 'granted';
+ return true;
+ }
+
+ if (Notification.permission !== 'denied') {
+ const permission = await Notification.requestPermission();
+ this.notificationPermission = permission;
+ return permission === 'granted';
+ }
+
+ return false;
+ }
+
+ /**
+ * Start flashing the page title to get attention
+ */
+ startTitleFlash(message: string) {
+ if (!browser) return;
+
+ this.stopTitleFlash(); // Clear any existing flash
+ this.originalTitle = document.title;
+
+ let isOriginal = true;
+ this.titleInterval = setInterval(() => {
+ document.title = isOriginal ? message : this.originalTitle;
+ isOriginal = !isOriginal;
+ }, 1000);
+ }
+
+ /**
+ * Stop flashing the title and restore the original
+ */
+ stopTitleFlash() {
+ if (!browser) return;
+
+ if (this.titleInterval) {
+ clearInterval(this.titleInterval);
+ this.titleInterval = null;
+ }
+ document.title = this.originalTitle;
+ }
+
+ /**
+ * Show a browser push notification
+ */
+ async showNotification(title: string, options?: NotificationOptions) {
+ if (!browser || !('Notification' in window)) {
+ return;
+ }
+
+ // Auto-request permission if not denied
+ if (this.notificationPermission === 'default') {
+ await this.requestPermission();
+ }
+
+ if (this.notificationPermission === 'granted') {
+ try {
+ const notification = new Notification(title, {
+ icon: '/favicon.png',
+ badge: '/favicon.png',
+ ...options
+ });
+
+ // Auto-close after 5 seconds
+ setTimeout(() => notification.close(), 5000);
+
+ return notification;
+ } catch (err) {
+ console.error('Failed to show notification:', err);
+ }
+ }
+ }
+
+ /**
+ * Notify user of their turn with both title flash and push notification
+ */
+ notifyYourTurn(opponentHandle?: string) {
+ const message = opponentHandle
+ ? `Your turn vs ${opponentHandle}!`
+ : 'Your turn!';
+
+ this.startTitleFlash(`⚫ ${message}`);
+ this.showNotification('Cloud Go - Your Turn', {
+ body: message,
+ tag: 'your-turn',
+ requireInteraction: false
+ });
+ }
+
+ /**
+ * Notify user of a new move in the game they're watching
+ */
+ notifyNewMove(playerHandle?: string) {
+ const message = playerHandle
+ ? `${playerHandle} played a move`
+ : 'New move played';
+
+ this.startTitleFlash(`🔄 ${message}`);
+ this.showNotification('Cloud Go - New Move', {
+ body: message,
+ tag: 'new-move',
+ requireInteraction: false
+ });
+ }
+
+ /**
+ * Clean up when component unmounts
+ */
+ cleanup() {
+ this.stopTitleFlash();
+ }
+}
+
+/**
+ * Check if the page is currently visible/focused
+ */
+export function isPageVisible(): boolean {
+ if (!browser) return false;
+ return document.visibilityState === 'visible';
+}
+
+/**
+ * Listen for visibility changes
+ */
+export function onVisibilityChange(callback: (visible: boolean) => void): () => void {
+ if (!browser) return () => {};
+
+ const handler = () => {
+ callback(document.visibilityState === 'visible');
+ };
+
+ document.addEventListener('visibilitychange', handler);
+
+ return () => {
+ document.removeEventListener('visibilitychange', handler);
+ };
+}
diff --git a/src/lib/sound-manager.ts b/src/lib/sound-manager.ts
new file mode 100644
index 0000000..65b989a
--- /dev/null
+++ b/src/lib/sound-manager.ts
@@ -0,0 +1,105 @@
+import { browser } from '$app/environment';
+
+export type SoundEffect =
+ | 'capture' // When you capture opponent's stones
+ | 'captured' // When your stones get captured
+ | 'move_made' // When someone makes a move in your game (homepage notification)
+ | 'opened_game' // When you open/load a game
+ | 'played_stone'; // When placing a stone on the board
+
+export class SoundManager {
+ private sounds: Map = new Map();
+ private enabled: boolean = true;
+
+ constructor() {
+ if (!browser) return;
+
+ // Load SFX preference from cookie
+ this.enabled = this.getSfxEnabled();
+
+ // Preload all sound effects
+ this.preloadSound('capture', '/sfx/capture.wav');
+ this.preloadSound('captured', '/sfx/captured.wav');
+ this.preloadSound('move_made', '/sfx/move_made.wav');
+ this.preloadSound('opened_game', '/sfx/opened_game.wav');
+ this.preloadSound('played_stone', '/sfx/played_stone.wav');
+ }
+
+ private preloadSound(name: SoundEffect, path: string) {
+ if (!browser) return;
+
+ const audio = new Audio(path);
+ audio.preload = 'auto';
+ audio.volume = 0.5; // Default volume at 50%
+ this.sounds.set(name, audio);
+ }
+
+ play(sound: SoundEffect) {
+ if (!browser || !this.enabled) return;
+
+ const audio = this.sounds.get(sound);
+ if (audio) {
+ // Clone the audio to allow overlapping sounds
+ const clone = audio.cloneNode() as HTMLAudioElement;
+ clone.volume = audio.volume;
+ clone.play().catch(err => {
+ console.warn('Failed to play sound:', sound, err);
+ });
+ }
+ }
+
+ setEnabled(enabled: boolean) {
+ this.enabled = enabled;
+ this.setSfxCookie(enabled);
+ }
+
+ isEnabled(): boolean {
+ return this.enabled;
+ }
+
+ setVolume(volume: number) {
+ if (!browser) return;
+
+ // Clamp volume between 0 and 1
+ volume = Math.max(0, Math.min(1, volume));
+
+ for (const audio of this.sounds.values()) {
+ audio.volume = volume;
+ }
+ }
+
+ private getSfxEnabled(): boolean {
+ if (!browser) return true;
+
+ const value = this.getCookie('sfx-enabled');
+ if (value === null) return true; // Default to enabled
+ return value === 'true';
+ }
+
+ private setSfxCookie(enabled: boolean) {
+ if (!browser) return;
+
+ const expires = new Date();
+ expires.setFullYear(expires.getFullYear() + 1); // Expire in 1 year
+ document.cookie = `sfx-enabled=${enabled};expires=${expires.toUTCString()};path=/`;
+ }
+
+ private getCookie(name: string): string | null {
+ if (!browser) return null;
+
+ const value = `; ${document.cookie}`;
+ const parts = value.split(`; ${name}=`);
+ if (parts.length === 2) return parts.pop()?.split(';').shift() || null;
+ return null;
+ }
+}
+
+// Global sound manager instance
+let soundManager: SoundManager | null = null;
+
+export function getSoundManager(): SoundManager {
+ if (!soundManager) {
+ soundManager = new SoundManager();
+ }
+ return soundManager;
+}
diff --git a/static/reaction-template.png b/static/reaction-template.png
new file mode 100644
index 0000000000000000000000000000000000000000..13df47f0ef379dad06b2f163924989eb9e6f8332
GIT binary patch
literal 247127
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