diff --git a/fancy-wordle-modern.html b/fancy-wordle-modern.html
index b9e3fc0..f8b253c 100644
--- a/fancy-wordle-modern.html
+++ b/fancy-wordle-modern.html
@@ -10,7 +10,7 @@
-
+
diff --git a/index.html b/index.html
index be5daea..33e9fc7 100644
--- a/index.html
+++ b/index.html
@@ -10,7 +10,7 @@
-
+
diff --git a/script.js b/script.js
index af46684..68f934d 100644
--- a/script.js
+++ b/script.js
@@ -29,6 +29,7 @@ const STATS_KEY = "fancy-wordle-stats-v2"
const LOCAL_ROUND_KEY = "fancy-wordle-hourly-round-v1"
const PLAY_INTERVAL_MS = 60 * 60 * 1000
const GUESS_TIMEOUT_MS = 10000
+const INTRO_SEEN_KEY = "fancy-wordle-intro-seen-v1"
const INTRO_DURATION_MS = 5200
const INTRO_LETTER_SETS = [
["D", "E", "S", "I", "G", "N"],
@@ -168,6 +169,14 @@ function initializeIntro() {
if (introOverlay.dataset.initialized) return
introOverlay.dataset.initialized = "true"
+
+ if (hasSeenIntro()) {
+ introDismissed = true
+ introOverlay.hidden = true
+ document.body.classList.remove("intro-active")
+ return
+ }
+
introDismissed = false
document.body.classList.add("intro-active")
introSkipButton?.addEventListener("click", dismissIntro)
@@ -187,6 +196,22 @@ function prefersReducedMotion() {
return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches
}
+function hasSeenIntro() {
+ try {
+ return sessionStorage.getItem(INTRO_SEEN_KEY) === "true"
+ } catch {
+ return false
+ }
+}
+
+function rememberIntroSeen() {
+ try {
+ sessionStorage.setItem(INTRO_SEEN_KEY, "true")
+ } catch {
+ // If storage is unavailable, the intro still dismisses for the current page load.
+ }
+}
+
function setIntroTile(tile, letter, status) {
const letterElement = tile.querySelector(".intro-letter")
tile.dataset.status = status
@@ -248,6 +273,7 @@ function dismissIntro() {
if (introDismissed) return
introDismissed = true
+ rememberIntroSeen()
clearIntroTimers()
setIntroFrame(INTRO_LETTER_SETS.length - 1, false)
introTileRow?.classList.add("is-solved", "is-logo")