{"id":14,"date":"2026-04-19T21:08:20","date_gmt":"2026-04-19T21:08:20","guid":{"rendered":"https:\/\/fungames.kazverse.com\/?page_id=14"},"modified":"2026-04-19T21:34:39","modified_gmt":"2026-04-19T21:34:39","slug":"word-search","status":"publish","type":"page","link":"https:\/\/fungames.kazverse.com\/","title":{"rendered":"Word Search"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"14\" class=\"elementor elementor-14\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-139ed19 e-con-full e-flex e-con e-parent\" data-id=\"139ed19\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f749e7 elementor-widget elementor-widget-shortcode\" data-id=\"9f749e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <div class=\"kz-word-hunt-wrap\" style=\"width:100%;max-width:100%;overflow:hidden;border-radius:0;\">\r\n            <iframe\r\n                id=\"kz-word-hunt-iframe-1\"\r\n                class=\"kz-word-hunt-iframe\"\r\n                srcdoc=\"&lt;!DOCTYPE html&gt;\r\n&lt;html lang=&quot;en&quot;&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=&quot;UTF-8&quot;&gt;\r\n&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, user-scalable=no&quot;&gt;\r\n&lt;title&gt;Word Hunt \u2014 The Ultimate Word Search&lt;\/title&gt;\r\n&lt;link href=&quot;https:\/\/fonts.googleapis.com\/css2?family=Fredoka:wght@400;500;600;700&amp;family=JetBrains+Mono:wght@400;500;600&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;\r\n&lt;style&gt;\r\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\r\n\r\n:root{\r\n  --bg:#0f0f1a;--bg2:#1a1a2e;--bg3:#242444;--bg4:#2e2e52;\r\n  --text:#e8e8f0;--text2:#a8a8c0;--text3:#6868a0;\r\n  --accent:#ff6b6b;--accent2:#ffd93d;--accent3:#6bcb77;--accent4:#4d96ff;\r\n  --cell-size:42px;--grid-gap:2px;--radius:12px;\r\n  --found-bg:rgba(107,203,119,0.18);--found-border:rgba(107,203,119,0.5);\r\n  --select-bg:rgba(77,150,255,0.3);--select-border:rgba(77,150,255,0.7);\r\n  --wrong-bg:rgba(255,107,107,0.3);\r\n  --font-display:&#039;Fredoka&#039;,sans-serif;--font-mono:&#039;JetBrains Mono&#039;,monospace;\r\n  --shadow:0 4px 24px rgba(0,0,0,0.3);\r\n  --glow:0 0 20px rgba(77,150,255,0.15);\r\n  --transition:0.3s cubic-bezier(0.4,0,0.2,1);\r\n}\r\n[data-theme=&quot;light&quot;]{\r\n  --bg:#f0f0f8;--bg2:#ffffff;--bg3:#e8e8f4;--bg4:#d8d8e8;\r\n  --text:#1a1a2e;--text2:#5a5a80;--text3:#9898b8;\r\n  --shadow:0 4px 24px rgba(0,0,0,0.08);\r\n  --glow:0 0 20px rgba(77,150,255,0.08);\r\n  --found-bg:rgba(107,203,119,0.12);--found-border:rgba(107,203,119,0.4);\r\n  --select-bg:rgba(77,150,255,0.15);--select-border:rgba(77,150,255,0.5);\r\n  --wrong-bg:rgba(255,107,107,0.15);\r\n}\r\n\r\nhtml,body{height:100%;-webkit-tap-highlight-color:transparent}\r\nbody{\r\n  font-family:var(--font-display);background:var(--bg);color:var(--text);\r\n  min-height:100%;overflow-x:hidden;transition:background var(--transition),color var(--transition);\r\n}\r\n\r\n\/* \u2500\u2500\u2500 SCREEN MANAGEMENT \u2500\u2500\u2500 *\/\r\n.screen{display:none;flex-direction:column;align-items:center;justify-content:center;min-height:100%;padding:16px;animation:fadeIn 0.4s ease}\r\n.screen.active{display:flex}\r\n.menu,.setup,.lb-screen,.game{width:100%}\r\n@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\r\n\r\n\/* \u2500\u2500\u2500 MENU SCREEN \u2500\u2500\u2500 *\/\r\n.menu{gap:24px;text-align:center}\r\n.menu-logo{font-size:clamp(2.4rem,6vw,3.6rem);font-weight:700;letter-spacing:-1px;\r\n  background:linear-gradient(135deg,var(--accent),var(--accent2),var(--accent4));\r\n  -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;\r\n  filter:drop-shadow(0 2px 8px rgba(255,107,107,0.3))}\r\n.menu-sub{color:var(--text2);font-size:0.95rem;margin-top:-12px}\r\n.menu-grid{display:flex;flex-direction:column;gap:10px;width:min(100%,360px)}\r\n.menu-btn{\r\n  padding:14px 24px;border:none;border-radius:var(--radius);cursor:pointer;\r\n  font-family:var(--font-display);font-size:1rem;font-weight:600;\r\n  background:var(--bg3);color:var(--text);transition:all var(--transition);\r\n  display:flex;align-items:center;justify-content:center;gap:10px;\r\n}\r\n.menu-btn:hover,.menu-btn:focus-visible{background:var(--bg4);transform:translateY(-2px);box-shadow:var(--glow)}\r\n.menu-btn.primary{background:linear-gradient(135deg,var(--accent),#ff8e53);color:#fff}\r\n.menu-btn.daily{background:linear-gradient(135deg,var(--accent4),#7c5cfc);color:#fff}\r\n.menu-btn .icon{font-size:1.3rem}\r\n.menu-bottom{display:flex;gap:10px;justify-content:center;margin-top:8px}\r\n.menu-sm{padding:10px 18px;font-size:0.85rem;border-radius:10px;background:var(--bg3);\r\n  color:var(--text2);border:none;cursor:pointer;font-family:var(--font-display);font-weight:500;transition:all var(--transition)}\r\n.menu-sm:hover{background:var(--bg4);color:var(--text)}\r\n\r\n.streak-badge{\r\n  display:inline-flex;align-items:center;gap:6px;padding:6px 14px;\r\n  border-radius:20px;background:var(--bg3);font-size:0.85rem;color:var(--accent2);font-weight:600;\r\n}\r\n\r\n\/* \u2500\u2500\u2500 SETUP SCREEN \u2500\u2500\u2500 *\/\r\n.setup{justify-content:center;gap:20px;text-align:center}\r\n.setup-title{font-size:1.6rem;font-weight:700}\r\n.option-group{width:min(100%,380px);text-align:left}\r\n.option-label{font-size:0.8rem;color:var(--text3);text-transform:uppercase;letter-spacing:1px;margin-bottom:6px;font-weight:600}\r\n.option-row{display:flex;gap:6px;flex-wrap:wrap}\r\n.opt-btn{\r\n  flex:1;min-width:80px;padding:10px 8px;border:2px solid var(--bg4);border-radius:10px;\r\n  background:transparent;color:var(--text2);font-family:var(--font-display);font-size:0.85rem;\r\n  font-weight:500;cursor:pointer;transition:all var(--transition);text-align:center;\r\n}\r\n.opt-btn.selected{border-color:var(--accent4);background:rgba(77,150,255,0.12);color:var(--text)}\r\n.opt-btn:hover{border-color:var(--text3)}\r\n\r\n\/* \u2500\u2500\u2500 GAME SCREEN \u2500\u2500\u2500 *\/\r\n.game{gap:12px;padding:10px 8px}\r\n.game-header{\r\n  display:flex;align-items:center;justify-content:space-between;width:100%;max-width:600px;\r\n  padding:8px 4px;gap:8px;flex-wrap:wrap;\r\n}\r\n.game-stat{\r\n  display:flex;flex-direction:column;align-items:center;gap:2px;\r\n  font-size:0.72rem;color:var(--text3);text-transform:uppercase;letter-spacing:0.5px;font-weight:600;\r\n}\r\n.game-stat .val{font-size:1.15rem;color:var(--text);font-family:var(--font-mono);font-weight:600}\r\n.game-actions{display:flex;gap:6px}\r\n.icon-btn{\r\n  width:36px;height:36px;border-radius:10px;border:none;background:var(--bg3);\r\n  color:var(--text2);cursor:pointer;font-size:1rem;display:flex;align-items:center;justify-content:center;\r\n  transition:all var(--transition);\r\n}\r\n.icon-btn:hover{background:var(--bg4);color:var(--text)}\r\n.icon-btn.danger{color:var(--accent)}\r\n\r\n.progress-bar{\r\n  width:100%;max-width:600px;height:6px;border-radius:3px;background:var(--bg3);overflow:hidden;\r\n}\r\n.progress-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--accent4),var(--accent3));transition:width 0.5s ease}\r\n\r\n\/* \u2500\u2500\u2500 GRID \u2500\u2500\u2500 *\/\r\n.grid-wrapper{\r\n  position:relative;touch-action:none;user-select:none;-webkit-user-select:none;\r\n  border-radius:var(--radius);overflow:hidden;background:var(--bg2);\r\n  box-shadow:var(--shadow);border:1px solid var(--bg4);\r\n}\r\n.grid{\r\n  display:grid;gap:var(--grid-gap);padding:var(--grid-gap);\r\n}\r\n.cell{\r\n  width:var(--cell-size);height:var(--cell-size);display:flex;align-items:center;justify-content:center;\r\n  font-family:var(--font-mono);font-size:clamp(0.8rem,2.5vw,1rem);font-weight:600;\r\n  border-radius:6px;background:var(--bg3);color:var(--text);cursor:pointer;\r\n  transition:background 0.2s,transform 0.15s,box-shadow 0.2s;position:relative;\r\n  text-transform:uppercase;\r\n}\r\n.cell.selected{background:var(--select-bg);box-shadow:inset 0 0 0 2px var(--select-border);transform:scale(1.08);z-index:2}\r\n.cell.found{background:var(--found-bg);box-shadow:inset 0 0 0 2px var(--found-border);color:var(--accent3)}\r\n.cell.wrong{background:var(--wrong-bg);animation:shake 0.4s ease}\r\n.cell.hint-cell{animation:hintPulse 1.5s ease infinite}\r\n.cell.bonus-found{background:rgba(255,217,61,0.2);box-shadow:inset 0 0 0 2px rgba(255,217,61,0.5);color:var(--accent2)}\r\n@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-4px)}75%{transform:translateX(4px)}}\r\n@keyframes hintPulse{0%,100%{box-shadow:inset 0 0 0 2px var(--accent2)}50%{box-shadow:inset 0 0 0 2px var(--accent2),0 0 12px rgba(255,217,61,0.4)}}\r\n\r\n\/* \u2500\u2500\u2500 WORD LIST \u2500\u2500\u2500 *\/\r\n.word-list-container{width:100%;max-width:600px}\r\n.word-list-title{font-size:0.75rem;color:var(--text3);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}\r\n.word-list{display:flex;flex-wrap:wrap;gap:6px}\r\n.word-chip{\r\n  padding:6px 12px;border-radius:8px;background:var(--bg3);font-size:0.82rem;\r\n  font-weight:600;color:var(--text);transition:all var(--transition);letter-spacing:0.5px;\r\n}\r\n.word-chip.found{\r\n  background:var(--found-bg);color:var(--accent3);\r\n  text-decoration:line-through;text-decoration-thickness:2px;text-decoration-color:var(--accent3);\r\n}\r\n.word-chip.bonus{display:none;background:rgba(255,217,61,0.15);color:var(--accent2);text-decoration:line-through;text-decoration-thickness:2px}\r\n.word-chip.bonus.found{display:inline-block}\r\n\r\n\/* \u2500\u2500\u2500 WIN \/ RESULT SCREEN \u2500\u2500\u2500 *\/\r\n.win-overlay{\r\n  position:fixed;inset:0;z-index:100;display:none;flex-direction:column;\r\n  align-items:center;justify-content:center;gap:16px;\r\n  background:rgba(15,15,26,0.92);backdrop-filter:blur(12px);animation:fadeIn 0.5s ease;\r\n  padding:24px;\r\n}\r\n.win-overlay.active{display:flex}\r\n.win-title{font-size:clamp(2rem,6vw,3rem);font-weight:700;\r\n  background:linear-gradient(135deg,var(--accent2),var(--accent),var(--accent4));\r\n  -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}\r\n.win-stats{display:flex;gap:20px;flex-wrap:wrap;justify-content:center}\r\n.win-stat{text-align:center}\r\n.win-stat .label{font-size:0.72rem;color:var(--text3);text-transform:uppercase;letter-spacing:1px}\r\n.win-stat .value{font-size:1.5rem;font-weight:700;font-family:var(--font-mono);color:var(--text)}\r\n.win-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:8px}\r\n.win-btn{\r\n  padding:12px 24px;border-radius:var(--radius);border:none;cursor:pointer;\r\n  font-family:var(--font-display);font-size:0.9rem;font-weight:600;transition:all var(--transition);\r\n}\r\n.win-btn.primary{background:linear-gradient(135deg,var(--accent),#ff8e53);color:#fff}\r\n.win-btn.secondary{background:var(--bg3);color:var(--text)}\r\n.win-btn:hover{transform:translateY(-2px);box-shadow:var(--glow)}\r\n.new-best{color:var(--accent2);font-weight:600;font-size:0.9rem;animation:hintPulse 1.5s ease infinite}\r\n\r\n\/* \u2500\u2500\u2500 LEADERBOARD \u2500\u2500\u2500 *\/\r\n.lb-screen{gap:20px;padding-top:0}\r\n.lb-title{font-size:1.5rem;font-weight:700}\r\n.lb-table{width:min(100%,420px);display:flex;flex-direction:column;gap:6px}\r\n.lb-row{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:10px;background:var(--bg2);font-size:0.9rem}\r\n.lb-rank{font-weight:700;color:var(--accent2);width:28px;text-align:center;font-family:var(--font-mono)}\r\n.lb-cat{flex:1;font-weight:500;color:var(--text)}\r\n.lb-time{font-family:var(--font-mono);color:var(--accent4);font-weight:600}\r\n.lb-empty{color:var(--text3);font-size:0.9rem;text-align:center;padding:40px 0}\r\n\r\n\/* \u2500\u2500\u2500 CONFETTI \u2500\u2500\u2500 *\/\r\n.confetti-container{position:fixed;inset:0;pointer-events:none;z-index:200;overflow:hidden}\r\n.confetti-piece{\r\n  position:absolute;width:10px;height:10px;top:-20px;\r\n  animation:confettiFall linear forwards;\r\n}\r\n@keyframes confettiFall{\r\n  0%{transform:translateY(0) rotate(0deg) scale(1);opacity:1}\r\n  100%{transform:translateY(110vh) rotate(720deg) scale(0.3);opacity:0}\r\n}\r\n\r\n\/* \u2500\u2500\u2500 PAUSE OVERLAY \u2500\u2500\u2500 *\/\r\n.pause-overlay{\r\n  position:fixed;inset:0;z-index:90;display:none;flex-direction:column;\r\n  align-items:center;justify-content:center;gap:20px;\r\n  background:rgba(15,15,26,0.95);backdrop-filter:blur(16px);\r\n}\r\n.pause-overlay.active{display:flex}\r\n.pause-title{font-size:2rem;font-weight:700;color:var(--text)}\r\n\r\n\/* \u2500\u2500\u2500 RESPONSIVE \u2500\u2500\u2500 *\/\r\n@media(max-width:480px){\r\n  :root{--cell-size:36px}\r\n  .game{padding:6px 4px}\r\n  .game-header{padding:4px 2px}\r\n}\r\n@media(max-width:360px){\r\n  :root{--cell-size:30px}\r\n}\r\n\r\n\/* \u2500\u2500\u2500 PRINT \u2500\u2500\u2500 *\/\r\n@media print{\r\n  body{background:#fff!important;color:#000!important}\r\n  .game-header,.game-actions,.progress-bar,.word-list-title,.icon-btn{display:none!important}\r\n  .cell{background:#f5f5f5!important;color:#000!important;border:1px solid #ccc!important}\r\n  .grid-wrapper{box-shadow:none!important;border:2px solid #000!important}\r\n  .word-chip{background:#eee!important;color:#000!important;border:1px solid #ccc!important}\r\n  .word-chip.found{text-decoration:none!important}\r\n  .screen:not(.game){display:none!important}\r\n  .game{display:flex!important}\r\n}\r\n\r\n\/* \u2500\u2500\u2500 ACCESSIBILITY \u2500\u2500\u2500 *\/\r\n@media(prefers-reduced-motion:reduce){\r\n  *,*::before,*::after{animation-duration:0.01ms!important;transition-duration:0.01ms!important}\r\n}\r\n.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}\r\n&lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 MENU SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;div class=&quot;screen menu active&quot; id=&quot;menuScreen&quot;&gt;\r\n  &lt;div class=&quot;menu-logo&quot;&gt;Word Hunt&lt;\/div&gt;\r\n  &lt;p class=&quot;menu-sub&quot;&gt;Find every hidden word. Beat the clock.&lt;\/p&gt;\r\n  &lt;div id=&quot;streakBadge&quot; class=&quot;streak-badge&quot; style=&quot;display:none&quot;&gt;&#x1f525; &lt;span id=&quot;streakCount&quot;&gt;0&lt;\/span&gt; day streak&lt;\/div&gt;\r\n  &lt;div class=&quot;menu-grid&quot;&gt;\r\n    &lt;button class=&quot;menu-btn daily&quot; onclick=&quot;startDaily()&quot;&gt;&lt;span class=&quot;icon&quot;&gt;&#x1f4c5;&lt;\/span&gt; Daily Puzzle&lt;\/button&gt;\r\n    &lt;button class=&quot;menu-btn primary&quot; onclick=&quot;showScreen(&#039;setupScreen&#039;)&quot;&gt;&lt;span class=&quot;icon&quot;&gt;&#x1f3ae;&lt;\/span&gt; New Game&lt;\/button&gt;\r\n    &lt;button class=&quot;menu-btn&quot; onclick=&quot;showScreen(&#039;lbScreen&#039;)&quot;&gt;&lt;span class=&quot;icon&quot;&gt;&#x1f3c6;&lt;\/span&gt; Leaderboard&lt;\/button&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;menu-bottom&quot;&gt;\r\n    &lt;button class=&quot;menu-sm&quot; onclick=&quot;toggleTheme()&quot; id=&quot;themeBtn&quot;&gt;&#x2600;&#xfe0f; Light&lt;\/button&gt;\r\n    &lt;button class=&quot;menu-sm&quot; onclick=&quot;showScreen(&#039;howScreen&#039;)&quot;&gt;&#x2753; How to Play&lt;\/button&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 HOW-TO SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;div class=&quot;screen setup&quot; id=&quot;howScreen&quot;&gt;\r\n  &lt;div class=&quot;setup-title&quot;&gt;How to Play&lt;\/div&gt;\r\n  &lt;div style=&quot;width:min(100%,420px);text-align:left;line-height:1.7;color:var(--text2);font-size:0.92rem&quot;&gt;\r\n    &lt;p&gt;&lt;strong style=&quot;color:var(--text)&quot;&gt;1.&lt;\/strong&gt; Find all hidden words in the grid.&lt;\/p&gt;\r\n    &lt;p&gt;&lt;strong style=&quot;color:var(--text)&quot;&gt;2.&lt;\/strong&gt; Drag across letters to select a word (swipe on mobile).&lt;\/p&gt;\r\n    &lt;p&gt;&lt;strong style=&quot;color:var(--text)&quot;&gt;3.&lt;\/strong&gt; Words can go in any direction based on difficulty.&lt;\/p&gt;\r\n    &lt;p&gt;&lt;strong style=&quot;color:var(--text)&quot;&gt;4.&lt;\/strong&gt; Use hints if you&#039;re stuck \u2014 but they cost points!&lt;\/p&gt;\r\n    &lt;p&gt;&lt;strong style=&quot;color:var(--text)&quot;&gt;5.&lt;\/strong&gt; Beat the timer for a higher score. Find the hidden bonus word for extra points!&lt;\/p&gt;\r\n  &lt;\/div&gt;\r\n  &lt;button class=&quot;menu-btn&quot; onclick=&quot;showScreen(&#039;menuScreen&#039;)&quot; style=&quot;width:min(100%,300px)&quot;&gt;\u2190 Back&lt;\/button&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 SETUP SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;div class=&quot;screen setup&quot; id=&quot;setupScreen&quot;&gt;\r\n  &lt;div class=&quot;setup-title&quot;&gt;New Game&lt;\/div&gt;\r\n  &lt;div class=&quot;option-group&quot;&gt;\r\n    &lt;div class=&quot;option-label&quot;&gt;Category&lt;\/div&gt;\r\n    &lt;div class=&quot;option-row&quot; id=&quot;catOptions&quot;&gt;&lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;option-group&quot;&gt;\r\n    &lt;div class=&quot;option-label&quot;&gt;Difficulty&lt;\/div&gt;\r\n    &lt;div class=&quot;option-row&quot; id=&quot;diffOptions&quot;&gt;&lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;option-group&quot;&gt;\r\n    &lt;div class=&quot;option-label&quot;&gt;Mode&lt;\/div&gt;\r\n    &lt;div class=&quot;option-row&quot; id=&quot;modeOptions&quot;&gt;&lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div style=&quot;display:flex;gap:10px;width:min(100%,380px)&quot;&gt;\r\n    &lt;button class=&quot;menu-btn&quot; onclick=&quot;showScreen(&#039;menuScreen&#039;)&quot; style=&quot;flex:1&quot;&gt;\u2190 Back&lt;\/button&gt;\r\n    &lt;button class=&quot;menu-btn primary&quot; onclick=&quot;startGame()&quot; style=&quot;flex:2&quot;&gt;Start Game \u2192&lt;\/button&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 GAME SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;div class=&quot;screen game&quot; id=&quot;gameScreen&quot;&gt;\r\n  &lt;div class=&quot;game-header&quot;&gt;\r\n    &lt;div class=&quot;game-stat&quot;&gt;&lt;span class=&quot;val&quot; id=&quot;timerDisplay&quot;&gt;0:00&lt;\/span&gt;Time&lt;\/div&gt;\r\n    &lt;div class=&quot;game-stat&quot;&gt;&lt;span class=&quot;val&quot; id=&quot;scoreDisplay&quot;&gt;0&lt;\/span&gt;Score&lt;\/div&gt;\r\n    &lt;div class=&quot;game-stat&quot;&gt;&lt;span class=&quot;val&quot; id=&quot;foundDisplay&quot;&gt;0\/0&lt;\/span&gt;Found&lt;\/div&gt;\r\n    &lt;div class=&quot;game-actions&quot;&gt;\r\n      &lt;button class=&quot;icon-btn&quot; onclick=&quot;useHint()&quot; title=&quot;Hint&quot; id=&quot;hintBtn&quot;&gt;&#x1f4a1;&lt;\/button&gt;\r\n      &lt;button class=&quot;icon-btn&quot; onclick=&quot;togglePause()&quot; title=&quot;Pause&quot; id=&quot;pauseBtn&quot;&gt;&#x23f8;&lt;\/button&gt;\r\n      &lt;button class=&quot;icon-btn&quot; onclick=&quot;revealAll()&quot; title=&quot;Reveal All&quot;&gt;&#x1f441;&lt;\/button&gt;\r\n      &lt;button class=&quot;icon-btn&quot; onclick=&quot;printPuzzle()&quot; title=&quot;Print&quot;&gt;&#x1f5a8;&lt;\/button&gt;\r\n      &lt;button class=&quot;icon-btn danger&quot; onclick=&quot;confirmBack()&quot; title=&quot;Quit&quot;&gt;\u2715&lt;\/button&gt;\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;progress-bar&quot;&gt;&lt;div class=&quot;progress-fill&quot; id=&quot;progressFill&quot; style=&quot;width:0%&quot;&gt;&lt;\/div&gt;&lt;\/div&gt;\r\n  &lt;div class=&quot;grid-wrapper&quot; id=&quot;gridWrapper&quot;&gt;\r\n    &lt;div class=&quot;grid&quot; id=&quot;grid&quot; role=&quot;grid&quot; aria-label=&quot;Word search grid&quot;&gt;&lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n  &lt;div class=&quot;word-list-container&quot;&gt;\r\n    &lt;div class=&quot;word-list-title&quot;&gt;Find these words &lt;span id=&quot;hintCount&quot;&gt;&lt;\/span&gt;&lt;\/div&gt;\r\n    &lt;div class=&quot;word-list&quot; id=&quot;wordList&quot;&gt;&lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 LEADERBOARD SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;div class=&quot;screen lb-screen&quot; id=&quot;lbScreen&quot;&gt;\r\n  &lt;div class=&quot;lb-title&quot;&gt;&#x1f3c6; Leaderboard&lt;\/div&gt;\r\n  &lt;div class=&quot;lb-table&quot; id=&quot;lbTable&quot;&gt;&lt;\/div&gt;\r\n  &lt;button class=&quot;menu-btn&quot; onclick=&quot;showScreen(&#039;menuScreen&#039;)&quot; style=&quot;width:min(100%,300px);margin-top:12px&quot;&gt;\u2190 Back&lt;\/button&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 OVERLAYS \u2500\u2500\u2500 --&gt;\r\n&lt;div class=&quot;pause-overlay&quot; id=&quot;pauseOverlay&quot;&gt;\r\n  &lt;div class=&quot;pause-title&quot;&gt;&#x23f8; Paused&lt;\/div&gt;\r\n  &lt;button class=&quot;menu-btn primary&quot; onclick=&quot;togglePause()&quot; style=&quot;width:200px&quot;&gt;Resume&lt;\/button&gt;\r\n  &lt;button class=&quot;menu-btn&quot; onclick=&quot;quitGame()&quot; style=&quot;width:200px&quot;&gt;Quit&lt;\/button&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;div class=&quot;win-overlay&quot; id=&quot;winOverlay&quot;&gt;\r\n  &lt;div class=&quot;win-title&quot; id=&quot;winTitle&quot;&gt;&#x1f389; Complete!&lt;\/div&gt;\r\n  &lt;div class=&quot;win-stats&quot; id=&quot;winStats&quot;&gt;&lt;\/div&gt;\r\n  &lt;div id=&quot;newBestMsg&quot;&gt;&lt;\/div&gt;\r\n  &lt;div class=&quot;win-actions&quot;&gt;\r\n    &lt;button class=&quot;win-btn primary&quot; onclick=&quot;startGame()&quot;&gt;New Puzzle&lt;\/button&gt;\r\n    &lt;button class=&quot;win-btn secondary&quot; onclick=&quot;shareResult()&quot;&gt;&#x1f4e4; Share&lt;\/button&gt;\r\n    &lt;button class=&quot;win-btn secondary&quot; onclick=&quot;quitGame()&quot;&gt;Menu&lt;\/button&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;div class=&quot;confetti-container&quot; id=&quot;confettiContainer&quot;&gt;&lt;\/div&gt;\r\n\r\n&lt;!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550 AUDIO \u2550\u2550\u2550\u2550\u2550\u2550\u2550 --&gt;\r\n&lt;script&gt;\r\nconst AudioCtx=window.AudioContext||window.webkitAudioContext;\r\nlet audioCtx;\r\nfunction ensureAudio(){if(!audioCtx)audioCtx=new AudioCtx()}\r\nfunction playTone(freq,dur,type=&#039;sine&#039;,vol=0.12){\r\n  try{ensureAudio();const o=audioCtx.createOscillator(),g=audioCtx.createGain();\r\n  o.type=type;o.frequency.value=freq;g.gain.value=vol;\r\n  g.gain.exponentialRampToValueAtTime(0.001,audioCtx.currentTime+dur);\r\n  o.connect(g);g.connect(audioCtx.destination);o.start();o.stop(audioCtx.currentTime+dur)}catch(e){}\r\n}\r\nfunction sfxFound(){playTone(523,0.1);setTimeout(()=&gt;playTone(659,0.1),80);setTimeout(()=&gt;playTone(784,0.15),160)}\r\nfunction sfxWrong(){playTone(200,0.2,&#039;square&#039;,0.06)}\r\nfunction sfxWin(){[523,659,784,1047].forEach((f,i)=&gt;setTimeout(()=&gt;playTone(f,0.2,&#039;triangle&#039;,0.1),i*120))}\r\nfunction sfxBonus(){playTone(880,0.1);setTimeout(()=&gt;playTone(1100,0.15),100);setTimeout(()=&gt;playTone(1320,0.2),200)}\r\n&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ WORD LISTS \u2014 multi-category, multilingual\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nconst CATEGORIES = {\r\n  animals: {\r\n    label: &#039;&#x1f43e; Animals&#039;, words: [\r\n      &#039;ELEPHANT&#039;,&#039;GIRAFFE&#039;,&#039;DOLPHIN&#039;,&#039;PENGUIN&#039;,&#039;CHEETAH&#039;,&#039;OCTOPUS&#039;,&#039;PANTHER&#039;,&#039;BUFFALO&#039;,\r\n      &#039;HAMSTER&#039;,&#039;GORILLA&#039;,&#039;LEOPARD&#039;,&#039;SPARROW&#039;,&#039;PELICAN&#039;,&#039;GAZELLE&#039;,&#039;RACCOON&#039;,&#039;LOBSTER&#039;,\r\n      &#039;PARROT&#039;,&#039;FALCON&#039;,&#039;JAGUAR&#039;,&#039;TURTLE&#039;,&#039;RABBIT&#039;,&#039;PYTHON&#039;,&#039;SALMON&#039;,&#039;TOUCAN&#039;,\r\n      &#039;WHALE&#039;,&#039;EAGLE&#039;,&#039;SHARK&#039;,&#039;ZEBRA&#039;,&#039;TIGER&#039;,&#039;KOALA&#039;,&#039;CRANE&#039;,&#039;OTTER&#039;,&#039;PANDA&#039;,&#039;HORSE&#039;\r\n    ]\r\n  },\r\n  countries: {\r\n    label: &#039;&#x1f30d; Countries&#039;, words: [\r\n      &#039;PAKISTAN&#039;,&#039;GERMANY&#039;,&#039;ENGLAND&#039;,&#039;FINLAND&#039;,&#039;ICELAND&#039;,&#039;ROMANIA&#039;,&#039;UKRAINE&#039;,&#039;ALGERIA&#039;,\r\n      &#039;MOROCCO&#039;,&#039;AUSTRIA&#039;,&#039;BELGIUM&#039;,&#039;CROATIA&#039;,&#039;GEORGIA&#039;,&#039;TUNISIA&#039;,&#039;VIETNAM&#039;,&#039;MYANMAR&#039;,\r\n      &#039;TURKEY&#039;,&#039;FRANCE&#039;,&#039;BRAZIL&#039;,&#039;CANADA&#039;,&#039;MEXICO&#039;,&#039;POLAND&#039;,&#039;SWEDEN&#039;,&#039;NORWAY&#039;,\r\n      &#039;JAPAN&#039;,&#039;EGYPT&#039;,&#039;SPAIN&#039;,&#039;ITALY&#039;,&#039;INDIA&#039;,&#039;CHINA&#039;,&#039;CHILE&#039;,&#039;KENYA&#039;,&#039;NEPAL&#039;,&#039;QATAR&#039;\r\n    ]\r\n  },\r\n  islamic: {\r\n    label: &#039;&#x262a;&#xfe0f; Islamic&#039;, words: [\r\n      &#039;BISMILLAH&#039;,&#039;ALHAMDULILLAH&#039;,&#039;RAMADAN&#039;,&#039;UMMAH&#039;,&#039;QURAN&#039;,&#039;SUNNAH&#039;,&#039;HADITH&#039;,\r\n      &#039;MASJID&#039;,&#039;SALAH&#039;,&#039;ZAKAH&#039;,&#039;SAWM&#039;,&#039;HAJJ&#039;,&#039;IMAN&#039;,&#039;IHSAN&#039;,&#039;TAQWA&#039;,&#039;SABR&#039;,\r\n      &#039;SHUKR&#039;,&#039;JANNAH&#039;,&#039;TAWHID&#039;,&#039;SADAQAH&#039;,&#039;KHALIFAH&#039;,&#039;MUADHIN&#039;,&#039;MINARET&#039;,&#039;MIHRAB&#039;,\r\n      &#039;QIBLAH&#039;,&#039;WUDU&#039;,&#039;FAJR&#039;,&#039;ZUHR&#039;,&#039;ASR&#039;,&#039;ISHA&#039;,&#039;DEEN&#039;,&#039;AYAH&#039;,&#039;SURAH&#039;,&#039;DUNYA&#039;\r\n    ]\r\n  },\r\n  kids: {\r\n    label: &#039;&#x1f9d2; Kids&#039;, words: [\r\n      &#039;RAINBOW&#039;,&#039;UNICORN&#039;,&#039;BALLOON&#039;,&#039;BUBBLES&#039;,&#039;MERMAID&#039;,&#039;PIRATE&#039;,&#039;CASTLE&#039;,&#039;DRAGON&#039;,\r\n      &#039;KNIGHT&#039;,&#039;PRINCE&#039;,&#039;PUZZLE&#039;,&#039;ROCKET&#039;,&#039;PLANET&#039;,&#039;COOKIE&#039;,&#039;CRAYON&#039;,&#039;TEDDY&#039;,\r\n      &#039;PUPPY&#039;,&#039;FAIRY&#039;,&#039;CANDY&#039;,&#039;HAPPY&#039;,&#039;SMILE&#039;,&#039;SUNNY&#039;,&#039;CLOUD&#039;,&#039;HEART&#039;,\r\n      &#039;STAR&#039;,&#039;MOON&#039;,&#039;KITE&#039;,&#039;TREE&#039;,&#039;FROG&#039;,&#039;DUCK&#039;,&#039;FISH&#039;,&#039;CAKE&#039;,&#039;HERO&#039;,&#039;GAME&#039;\r\n    ]\r\n  },\r\n  tech: {\r\n    label: &#039;&#x1f4bb; Tech&#039;, words: [\r\n      &#039;ALGORITHM&#039;,&#039;BLOCKCHAIN&#039;,&#039;CYBERSECURITY&#039;,&#039;DATABASE&#039;,&#039;FIRMWARE&#039;,&#039;HARDWARE&#039;,\r\n      &#039;INTERNET&#039;,&#039;JAVASCRIPT&#039;,&#039;KEYBOARD&#039;,&#039;MACHINE&#039;,&#039;NETWORK&#039;,&#039;PROTOCOL&#039;,&#039;QUANTUM&#039;,\r\n      &#039;ROBOTICS&#039;,&#039;SOFTWARE&#039;,&#039;TERMINAL&#039;,&#039;VIRTUAL&#039;,&#039;WIRELESS&#039;,&#039;BROWSER&#039;,&#039;COMPILE&#039;,\r\n      &#039;DIGITAL&#039;,&#039;ENCRYPT&#039;,&#039;GITHUB&#039;,&#039;KERNEL&#039;,&#039;LAMBDA&#039;,&#039;NODEJS&#039;,&#039;PIXEL&#039;,&#039;PYTHON&#039;,\r\n      &#039;REACT&#039;,&#039;CLOUD&#039;,&#039;DEBUG&#039;,&#039;FIBER&#039;,&#039;LINUX&#039;,&#039;STACK&#039;,&#039;CACHE&#039;,&#039;SWIFT&#039;,&#039;BINARY&#039;\r\n    ]\r\n  },\r\n  sports: {\r\n    label: &#039;&#x26bd; Sports&#039;, words: [\r\n      &#039;FOOTBALL&#039;,&#039;BASEBALL&#039;,&#039;SWIMMING&#039;,&#039;WRESTLING&#039;,&#039;ATHLETICS&#039;,&#039;ARCHERY&#039;,&#039;BOWLING&#039;,\r\n      &#039;CRICKET&#039;,&#039;CYCLING&#039;,&#039;FENCING&#039;,&#039;SAILING&#039;,&#039;SURFING&#039;,&#039;TENNIS&#039;,&#039;DIVING&#039;,\r\n      &#039;BOXING&#039;,&#039;HOCKEY&#039;,&#039;KARATE&#039;,&#039;ROWING&#039;,&#039;SOCCER&#039;,&#039;SPRINT&#039;,&#039;SQUASH&#039;,&#039;RUGBY&#039;,\r\n      &#039;GOLF&#039;,&#039;JUDO&#039;,&#039;POLO&#039;,&#039;YOGA&#039;,&#039;RELAY&#039;,&#039;VAULT&#039;,&#039;MEDAL&#039;,&#039;TORCH&#039;,&#039;MATCH&#039;,&#039;COACH&#039;\r\n    ]\r\n  }\r\n};\r\n\r\nconst DIFFICULTIES = {\r\n  easy:   { label:&#039;Easy&#039;,   gridSize:8,  wordCount:6,  directions:[[0,1],[1,0]],  hintLimit:5, timeBonus:300 },\r\n  medium: { label:&#039;Medium&#039;, gridSize:10, wordCount:8,  directions:[[0,1],[1,0],[1,1],[1,-1]], hintLimit:3, timeBonus:240 },\r\n  hard:   { label:&#039;Hard&#039;,   gridSize:12, wordCount:10, directions:[[0,1],[1,0],[1,1],[1,-1],[-1,0],[0,-1],[-1,-1],[-1,1]], hintLimit:2, timeBonus:180 }\r\n};\r\n\r\nconst MODES = {\r\n  challenge: { label:&#039;&#x23f1; Challenge&#039;, timed:true },\r\n  relax:     { label:&#039;&#x1f9d8; Relax&#039;,     timed:false }\r\n};\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ STATE\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nlet state = {\r\n  category:&#039;animals&#039;, difficulty:&#039;easy&#039;, mode:&#039;challenge&#039;,\r\n  grid:[], gridSize:0, words:[], placed:[], bonusWord:null,\r\n  foundWords:new Set(), selectedCells:[], isSelecting:false,\r\n  timer:0, timerInterval:null, isPaused:false, score:0,\r\n  hintsUsed:0, hintLimit:5, isDaily:false, gameActive:false\r\n};\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SCREENS &amp; UI\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction showScreen(id){\r\n  document.querySelectorAll(&#039;.screen&#039;).forEach(s=&gt;s.classList.remove(&#039;active&#039;));\r\n  document.getElementById(id).classList.add(&#039;active&#039;);\r\n  if(id===&#039;lbScreen&#039;)renderLeaderboard();\r\n  if(id===&#039;menuScreen&#039;)updateStreak();\r\n  if(window.kzWordHuntSendHeight){\r\n    setTimeout(window.kzWordHuntSendHeight, 50);\r\n    setTimeout(window.kzWordHuntSendHeight, 200);\r\n  }\r\n}\r\n\r\nfunction buildSetupOptions(){\r\n  const catEl=document.getElementById(&#039;catOptions&#039;);\r\n  catEl.innerHTML=&#039;&#039;;\r\n  Object.entries(CATEGORIES).forEach(([k,v])=&gt;{\r\n    const b=document.createElement(&#039;button&#039;);b.className=&#039;opt-btn&#039;+(state.category===k?&#039; selected&#039;:&#039;&#039;);\r\n    b.textContent=v.label;b.onclick=()=&gt;{state.category=k;buildSetupOptions()};catEl.appendChild(b);\r\n  });\r\n  const diffEl=document.getElementById(&#039;diffOptions&#039;);\r\n  diffEl.innerHTML=&#039;&#039;;\r\n  Object.entries(DIFFICULTIES).forEach(([k,v])=&gt;{\r\n    const b=document.createElement(&#039;button&#039;);b.className=&#039;opt-btn&#039;+(state.difficulty===k?&#039; selected&#039;:&#039;&#039;);\r\n    b.textContent=v.label;b.onclick=()=&gt;{state.difficulty=k;buildSetupOptions()};diffEl.appendChild(b);\r\n  });\r\n  const modeEl=document.getElementById(&#039;modeOptions&#039;);\r\n  modeEl.innerHTML=&#039;&#039;;\r\n  Object.entries(MODES).forEach(([k,v])=&gt;{\r\n    const b=document.createElement(&#039;button&#039;);b.className=&#039;opt-btn&#039;+(state.mode===k?&#039; selected&#039;:&#039;&#039;);\r\n    b.textContent=v.label;b.onclick=()=&gt;{state.mode=k;buildSetupOptions()};modeEl.appendChild(b);\r\n  });\r\n}\r\nbuildSetupOptions();\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ PUZZLE GENERATION\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction seededRandom(seed){\r\n  let s=seed;return()=&gt;{s=(s*16807)%2147483647;return(s-1)\/2147483646}}\r\n\r\nfunction generatePuzzle(category, diff, seed=null){\r\n  const rng=seed!==null?seededRandom(seed):Math.random.bind(Math);\r\n  const d=DIFFICULTIES[diff];\r\n  const allWords=[...CATEGORIES[category].words];\r\n  \/\/ Shuffle\r\n  for(let i=allWords.length-1;i&gt;0;i--){const j=Math.floor(rng()*allWords.length);[allWords[i],allWords[j]]=[allWords[j],allWords[i]]}\r\n  \/\/ Filter words that fit\r\n  const pool=allWords.filter(w=&gt;w.length&lt;=d.gridSize);\r\n  const words=pool.slice(0,d.wordCount);\r\n  \/\/ Bonus word: pick a short word not in main list\r\n  const bonusCandidates=pool.slice(d.wordCount).filter(w=&gt;w.length&lt;=5);\r\n  const bonusWord=bonusCandidates.length&gt;0?bonusCandidates[0]:null;\r\n\r\n  const size=d.gridSize;\r\n  const grid=Array.from({length:size},()=&gt;Array(size).fill(&#039;&#039;));\r\n  const placed=[];\r\n  const dirs=d.directions;\r\n\r\n  function canPlace(word,r,c,dr,dc){\r\n    for(let i=0;i&lt;word.length;i++){\r\n      const nr=r+dr*i,nc=c+dc*i;\r\n      if(nr&lt;0||nr&gt;=size||nc&lt;0||nc&gt;=size)return false;\r\n      if(grid[nr][nc]!==&#039;&#039;&amp;&amp;grid[nr][nc]!==word[i])return false;\r\n    }return true;\r\n  }\r\n  function placeWord(word){\r\n    const attempts=200;\r\n    for(let a=0;a&lt;attempts;a++){\r\n      const di=Math.floor(rng()*dirs.length);\r\n      const [dr,dc]=dirs[di];\r\n      const r=Math.floor(rng()*size),c=Math.floor(rng()*size);\r\n      if(canPlace(word,r,c,dr,dc)){\r\n        const cells=[];\r\n        for(let i=0;i&lt;word.length;i++){\r\n          const nr=r+dr*i,nc=c+dc*i;\r\n          grid[nr][nc]=word[i];cells.push([nr,nc]);\r\n        }\r\n        placed.push({word,cells,dir:[dr,dc],start:[r,c]});return true;\r\n      }\r\n    }return false;\r\n  }\r\n\r\n  const placedWords=[];\r\n  for(const w of words){if(placeWord(w))placedWords.push(w)}\r\n  \/\/ Try bonus\r\n  let placedBonus=null;\r\n  if(bonusWord&amp;&amp;placeWord(bonusWord))placedBonus=bonusWord;\r\n\r\n  \/\/ Fill empty cells\r\n  const letters=&#039;ABCDEFGHIJKLMNOPQRSTUVWXYZ&#039;;\r\n  for(let r=0;r&lt;size;r++)for(let c=0;c&lt;size;c++){\r\n    if(grid[r][c]===&#039;&#039;)grid[r][c]=letters[Math.floor(rng()*26)];\r\n  }\r\n\r\n  return{grid,words:placedWords,placed,bonusWord:placedBonus,gridSize:size};\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ DAILY PUZZLE\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction getDailySeed(){\r\n  const d=new Date();return d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();\r\n}\r\nfunction getDailyKey(){return&#039;wordhunt_daily_&#039;+getDailySeed()}\r\n\r\nfunction startDaily(){\r\n  const seed=getDailySeed();\r\n  const cats=Object.keys(CATEGORIES);\r\n  const catIdx=seed%cats.length;\r\n  state.category=cats[catIdx];\r\n  state.difficulty=&#039;medium&#039;;\r\n  state.mode=&#039;challenge&#039;;\r\n  state.isDaily=true;\r\n\r\n  \/\/ Check if already completed today\r\n  const saved=localStorage.getItem(getDailyKey());\r\n  if(saved){\r\n    alert(&#039;You already completed today\\&#039;s puzzle! Come back tomorrow.&#039;);\r\n    return;\r\n  }\r\n  launchGame(seed);\r\n}\r\n\r\nfunction startGame(){\r\n  state.isDaily=false;\r\n  launchGame(null);\r\n}\r\n\r\nfunction launchGame(seed){\r\n  const d=DIFFICULTIES[state.difficulty];\r\n  const puzzle=generatePuzzle(state.category,state.difficulty,seed);\r\n  state.grid=puzzle.grid;state.gridSize=puzzle.gridSize;\r\n  state.words=puzzle.words;state.placed=puzzle.placed;\r\n  state.bonusWord=puzzle.bonusWord;\r\n  state.foundWords=new Set();state.selectedCells=[];state.isSelecting=false;\r\n  state.timer=0;state.score=0;state.hintsUsed=0;state.hintLimit=d.hintLimit;\r\n  state.isPaused=false;state.gameActive=true;\r\n\r\n  renderGrid();renderWordList();updateHeader();\r\n  showScreen(&#039;gameScreen&#039;);\r\n  startTimer();\r\n  adjustCellSize();\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ RENDERING\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction adjustCellSize(){\r\n  const maxW=Math.min(window.innerWidth-24,600);\r\n  const gap=2;\r\n  const sz=Math.floor((maxW - gap*(state.gridSize+1))\/state.gridSize);\r\n  const clamped=Math.max(26,Math.min(48,sz));\r\n  document.documentElement.style.setProperty(&#039;--cell-size&#039;,clamped+&#039;px&#039;);\r\n}\r\n\r\nfunction renderGrid(){\r\n  const g=document.getElementById(&#039;grid&#039;);\r\n  g.innerHTML=&#039;&#039;;\r\n  g.style.gridTemplateColumns=`repeat(${state.gridSize},var(--cell-size))`;\r\n  for(let r=0;r&lt;state.gridSize;r++){\r\n    for(let c=0;c&lt;state.gridSize;c++){\r\n      const cell=document.createElement(&#039;div&#039;);\r\n      cell.className=&#039;cell&#039;;cell.textContent=state.grid[r][c];\r\n      cell.dataset.row=r;cell.dataset.col=c;\r\n      cell.setAttribute(&#039;role&#039;,&#039;gridcell&#039;);\r\n      cell.setAttribute(&#039;aria-label&#039;,state.grid[r][c]);\r\n      g.appendChild(cell);\r\n    }\r\n  }\r\n}\r\n\r\nfunction renderWordList(){\r\n  const wl=document.getElementById(&#039;wordList&#039;);wl.innerHTML=&#039;&#039;;\r\n  state.words.forEach(w=&gt;{\r\n    const chip=document.createElement(&#039;span&#039;);\r\n    chip.className=&#039;word-chip&#039;+(state.foundWords.has(w)?&#039; found&#039;:&#039;&#039;);\r\n    chip.textContent=w;chip.id=&#039;chip-&#039;+w;wl.appendChild(chip);\r\n  });\r\n  if(state.bonusWord){\r\n    const chip=document.createElement(&#039;span&#039;);\r\n    chip.className=&#039;word-chip bonus&#039;+(state.foundWords.has(state.bonusWord)?&#039; found&#039;:&#039;&#039;);\r\n    chip.textContent=&#039;&#x2b50; &#039;+state.bonusWord;chip.id=&#039;chip-&#039;+state.bonusWord;wl.appendChild(chip);\r\n  }\r\n  document.getElementById(&#039;hintCount&#039;).textContent=`(Hints: ${state.hintLimit-state.hintsUsed})`;\r\n}\r\n\r\nfunction updateHeader(){\r\n  document.getElementById(&#039;scoreDisplay&#039;).textContent=state.score;\r\n  const total=state.words.length+(state.bonusWord?1:0);\r\n  document.getElementById(&#039;foundDisplay&#039;).textContent=`${state.foundWords.size}\/${state.words.length}`;\r\n  const pct=(state.foundWords.size\/state.words.length)*100;\r\n  document.getElementById(&#039;progressFill&#039;).style.width=pct+&#039;%&#039;;\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ TIMER\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction startTimer(){\r\n  clearInterval(state.timerInterval);\r\n  if(!MODES[state.mode].timed){document.getElementById(&#039;timerDisplay&#039;).textContent=&#039;\u221e&#039;;return}\r\n  state.timerInterval=setInterval(()=&gt;{\r\n    if(!state.isPaused&amp;&amp;state.gameActive){state.timer++;updateTimerDisplay()}\r\n  },1000);\r\n}\r\nfunction updateTimerDisplay(){\r\n  const m=Math.floor(state.timer\/60),s=state.timer%60;\r\n  document.getElementById(&#039;timerDisplay&#039;).textContent=`${m}:${s.toString().padStart(2,&#039;0&#039;)}`;\r\n}\r\nfunction togglePause(){\r\n  if(!state.gameActive)return;\r\n  state.isPaused=!state.isPaused;\r\n  document.getElementById(&#039;pauseOverlay&#039;).classList.toggle(&#039;active&#039;,state.isPaused);\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SELECTION \u2014 MOUSE + TOUCH\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction getCellFromEvent(e){\r\n  const t=e.touches?e.touches[0]:e;\r\n  const el=document.elementFromPoint(t.clientX,t.clientY);\r\n  if(el&amp;&amp;el.classList.contains(&#039;cell&#039;))return el;\r\n  return null;\r\n}\r\n\r\nfunction cellKey(r,c){return r+&#039;,&#039;+c}\r\n\r\nfunction selectionStart(e){\r\n  if(state.isPaused||!state.gameActive)return;\r\n  e.preventDefault();\r\n  const cell=getCellFromEvent(e);if(!cell)return;\r\n  state.isSelecting=true;\r\n  state.selectedCells=[cell];\r\n  cell.classList.add(&#039;selected&#039;);\r\n}\r\n\r\nfunction selectionMove(e){\r\n  if(!state.isSelecting)return;\r\n  e.preventDefault();\r\n  const cell=getCellFromEvent(e);\r\n  if(!cell||cell===state.selectedCells[state.selectedCells.length-1])return;\r\n\r\n  const startCell=state.selectedCells[0];\r\n  const sr=+startCell.dataset.row,sc=+startCell.dataset.col;\r\n  const cr=+cell.dataset.row,cc=+cell.dataset.col;\r\n  const dr=Math.sign(cr-sr),dc=Math.sign(cc-sc);\r\n\r\n  \/\/ Must be in a valid line from start\r\n  if(cr!==sr&amp;&amp;cc!==sc&amp;&amp;Math.abs(cr-sr)!==Math.abs(cc-sc))return;\r\n\r\n  \/\/ Build line from start to current\r\n  const newSel=[startCell];\r\n  let r=sr+dr,c=sc+dc;\r\n  while(r!==cr+dr||c!==cc+dc){\r\n    const el=document.querySelector(`.cell[data-row=&quot;${r}&quot;][data-col=&quot;${c}&quot;]`);\r\n    if(el)newSel.push(el);\r\n    r+=dr;c+=dc;\r\n    if(newSel.length&gt;state.gridSize)break;\r\n  }\r\n\r\n  \/\/ Clear old, apply new\r\n  state.selectedCells.forEach(c=&gt;c.classList.remove(&#039;selected&#039;));\r\n  state.selectedCells=newSel;\r\n  newSel.forEach(c=&gt;c.classList.add(&#039;selected&#039;));\r\n}\r\n\r\nfunction selectionEnd(e){\r\n  if(!state.isSelecting)return;\r\n  state.isSelecting=false;\r\n  checkSelection();\r\n  state.selectedCells.forEach(c=&gt;c.classList.remove(&#039;selected&#039;));\r\n  state.selectedCells=[];\r\n}\r\n\r\nconst gw=document.getElementById(&#039;gridWrapper&#039;);\r\ngw.addEventListener(&#039;mousedown&#039;,selectionStart);\r\ngw.addEventListener(&#039;mousemove&#039;,selectionMove);\r\ngw.addEventListener(&#039;mouseup&#039;,selectionEnd);\r\ngw.addEventListener(&#039;mouseleave&#039;,selectionEnd);\r\ngw.addEventListener(&#039;touchstart&#039;,selectionStart,{passive:false});\r\ngw.addEventListener(&#039;touchmove&#039;,selectionMove,{passive:false});\r\ngw.addEventListener(&#039;touchend&#039;,selectionEnd);\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ CHECK SELECTION\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction checkSelection(){\r\n  const selWord=state.selectedCells.map(c=&gt;state.grid[+c.dataset.row][+c.dataset.col]).join(&#039;&#039;);\r\n  const selCoords=state.selectedCells.map(c=&gt;[+c.dataset.row,+c.dataset.col]);\r\n\r\n  \/\/ Check against all placed words (including bonus)\r\n  for(const p of state.placed){\r\n    if(state.foundWords.has(p.word))continue;\r\n    const match=selWord===p.word||selWord===[...p.word].reverse().join(&#039;&#039;);\r\n    if(match&amp;&amp;selCoords.length===p.cells.length){\r\n      \/\/ Verify cells match\r\n      const coordsMatch=p.cells.every(([r,c])=&gt;selCoords.some(([sr,sc])=&gt;sr===r&amp;&amp;sc===c));\r\n      if(coordsMatch){\r\n        foundWord(p);return;\r\n      }\r\n    }\r\n  }\r\n  \/\/ Wrong\r\n  state.selectedCells.forEach(c=&gt;{c.classList.add(&#039;wrong&#039;);setTimeout(()=&gt;c.classList.remove(&#039;wrong&#039;),400)});\r\n  sfxWrong();\r\n}\r\n\r\nfunction foundWord(p){\r\n  state.foundWords.add(p.word);\r\n  const isBonus=p.word===state.bonusWord;\r\n\r\n  \/\/ Mark cells\r\n  p.cells.forEach(([r,c])=&gt;{\r\n    const cell=document.querySelector(`.cell[data-row=&quot;${r}&quot;][data-col=&quot;${c}&quot;]`);\r\n    if(cell)cell.classList.add(isBonus?&#039;bonus-found&#039;:&#039;found&#039;);\r\n  });\r\n\r\n  \/\/ Mark chip\r\n  const chip=document.getElementById(&#039;chip-&#039;+p.word);\r\n  if(chip)chip.classList.add(&#039;found&#039;);\r\n\r\n  \/\/ Score\r\n  const wordScore=p.word.length*10+(isBonus?50:0);\r\n  state.score+=wordScore;\r\n\r\n  if(isBonus)sfxBonus();else sfxFound();\r\n  updateHeader();renderWordList();\r\n\r\n  \/\/ Check win\r\n  const mainFound=state.words.every(w=&gt;state.foundWords.has(w));\r\n  if(mainFound)setTimeout(()=&gt;winGame(),500);\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ HINTS\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction useHint(){\r\n  if(state.hintsUsed&gt;=state.hintLimit||!state.gameActive)return;\r\n  const unfound=state.placed.filter(p=&gt;!state.foundWords.has(p.word)&amp;&amp;p.word!==state.bonusWord);\r\n  if(unfound.length===0)return;\r\n  const target=unfound[Math.floor(Math.random()*unfound.length)];\r\n  const [r,c]=target.cells[0];\r\n  const cell=document.querySelector(`.cell[data-row=&quot;${r}&quot;][data-col=&quot;${c}&quot;]`);\r\n  if(cell){cell.classList.add(&#039;hint-cell&#039;);setTimeout(()=&gt;cell.classList.remove(&#039;hint-cell&#039;),3000)}\r\n  state.hintsUsed++;state.score=Math.max(0,state.score-15);\r\n  updateHeader();renderWordList();\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ WIN\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction winGame(){\r\n  state.gameActive=false;\r\n  clearInterval(state.timerInterval);\r\n\r\n  \/\/ Time bonus\r\n  const d=DIFFICULTIES[state.difficulty];\r\n  const timed=MODES[state.mode].timed;\r\n  if(timed&amp;&amp;state.timer&lt;d.timeBonus){\r\n    state.score+=Math.floor((d.timeBonus-state.timer)\/2);\r\n  }\r\n\r\n  sfxWin();launchConfetti();\r\n\r\n  \/\/ Save score\r\n  let isNewBest=false;\r\n  const key=`wordhunt_best_${state.category}_${state.difficulty}`;\r\n  const prev=localStorage.getItem(key);\r\n  if(!prev||state.score&gt;parseInt(prev)){\r\n    localStorage.setItem(key,state.score);isNewBest=true;\r\n  }\r\n  \/\/ Save time best\r\n  if(timed){\r\n    const tKey=`wordhunt_time_${state.category}_${state.difficulty}`;\r\n    const prevT=localStorage.getItem(tKey);\r\n    if(!prevT||state.timer&lt;parseInt(prevT)){\r\n      localStorage.setItem(tKey,state.timer);\r\n    }\r\n  }\r\n\r\n  \/\/ Daily streak\r\n  if(state.isDaily){\r\n    localStorage.setItem(getDailyKey(),&#039;done&#039;);\r\n    updateDailyStreak();\r\n  }\r\n\r\n  \/\/ Show overlay\r\n  const o=document.getElementById(&#039;winOverlay&#039;);\r\n  const st=document.getElementById(&#039;winStats&#039;);\r\n  const m=Math.floor(state.timer\/60),s=state.timer%60;\r\n  st.innerHTML=`\r\n    &lt;div class=&quot;win-stat&quot;&gt;&lt;div class=&quot;value&quot;&gt;${state.score}&lt;\/div&gt;&lt;div class=&quot;label&quot;&gt;Score&lt;\/div&gt;&lt;\/div&gt;\r\n    ${timed?`&lt;div class=&quot;win-stat&quot;&gt;&lt;div class=&quot;value&quot;&gt;${m}:${s.toString().padStart(2,&#039;0&#039;)}&lt;\/div&gt;&lt;div class=&quot;label&quot;&gt;Time&lt;\/div&gt;&lt;\/div&gt;`:&#039;&#039;}\r\n    &lt;div class=&quot;win-stat&quot;&gt;&lt;div class=&quot;value&quot;&gt;${state.hintsUsed}&lt;\/div&gt;&lt;div class=&quot;label&quot;&gt;Hints Used&lt;\/div&gt;&lt;\/div&gt;\r\n    &lt;div class=&quot;win-stat&quot;&gt;&lt;div class=&quot;value&quot;&gt;${state.foundWords.size}&lt;\/div&gt;&lt;div class=&quot;label&quot;&gt;Words Found&lt;\/div&gt;&lt;\/div&gt;\r\n  `;\r\n  document.getElementById(&#039;newBestMsg&#039;).innerHTML=isNewBest?&#039;&lt;div class=&quot;new-best&quot;&gt;&#x2b50; New Personal Best!&lt;\/div&gt;&#039;:&#039;&#039;;\r\n  document.getElementById(&#039;winTitle&#039;).textContent=state.foundWords.has(state.bonusWord)?&#039;&#x1f31f; Perfect!&#039;:&#039;&#x1f389; Complete!&#039;;\r\n  o.classList.add(&#039;active&#039;);\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ CONFETTI\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction launchConfetti(){\r\n  const c=document.getElementById(&#039;confettiContainer&#039;);c.innerHTML=&#039;&#039;;\r\n  const colors=[&#039;#ff6b6b&#039;,&#039;#ffd93d&#039;,&#039;#6bcb77&#039;,&#039;#4d96ff&#039;,&#039;#ff8e53&#039;,&#039;#a66cff&#039;];\r\n  for(let i=0;i&lt;80;i++){\r\n    const p=document.createElement(&#039;div&#039;);p.className=&#039;confetti-piece&#039;;\r\n    p.style.left=Math.random()*100+&#039;%&#039;;\r\n    p.style.backgroundColor=colors[Math.floor(Math.random()*colors.length)];\r\n    p.style.animationDuration=(1.5+Math.random()*2)+&#039;s&#039;;\r\n    p.style.animationDelay=Math.random()*0.8+&#039;s&#039;;\r\n    const shapes=[&#039;&#039;,&#039;border-radius:50%&#039;,&#039;border-radius:0;transform:rotate(45deg)&#039;];\r\n    p.style.cssText+=shapes[Math.floor(Math.random()*3)];\r\n    c.appendChild(p);\r\n  }\r\n  setTimeout(()=&gt;c.innerHTML=&#039;&#039;,4000);\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ REVEAL, SHARE, PRINT, QUIT\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction revealAll(){\r\n  if(!state.gameActive)return;\r\n  if(!confirm(&#039;Reveal all answers? This will end the game.&#039;))return;\r\n  state.placed.forEach(p=&gt;{\r\n    p.cells.forEach(([r,c])=&gt;{\r\n      const cell=document.querySelector(`.cell[data-row=&quot;${r}&quot;][data-col=&quot;${c}&quot;]`);\r\n      if(cell)cell.classList.add(p.word===state.bonusWord?&#039;bonus-found&#039;:&#039;found&#039;);\r\n    });\r\n    state.foundWords.add(p.word);\r\n    const chip=document.getElementById(&#039;chip-&#039;+p.word);if(chip)chip.classList.add(&#039;found&#039;);\r\n  });\r\n  state.score=0;\r\n  updateHeader();renderWordList();\r\n  setTimeout(()=&gt;{state.gameActive=false;clearInterval(state.timerInterval)},500);\r\n}\r\n\r\nfunction shareResult(){\r\n  const m=Math.floor(state.timer\/60),s=state.timer%60;\r\n  const text=`&#x1f50d; Word Hunt ${state.isDaily?&#039;Daily &#039;:&#039;&#039;}| ${CATEGORIES[state.category].label}\\n` +\r\n    `Score: ${state.score} | Time: ${m}:${s.toString().padStart(2,&#039;0&#039;)}\\n` +\r\n    `Difficulty: ${DIFFICULTIES[state.difficulty].label} | Hints: ${state.hintsUsed}\\n` +\r\n    (state.foundWords.has(state.bonusWord)?&#039;&#x2b50; Found the bonus word!\\n&#039;:&#039;&#039;);\r\n  if(navigator.share){navigator.share({text})}else{navigator.clipboard.writeText(text);alert(&#039;Copied to clipboard!&#039;)}\r\n}\r\n\r\nfunction printPuzzle(){window.print()}\r\n\r\nfunction confirmBack(){\r\n  if(state.gameActive&amp;&amp;state.foundWords.size&gt;0){\r\n    if(!confirm(&#039;Quit current game?&#039;))return;\r\n  }\r\n  quitGame();\r\n}\r\nfunction quitGame(){\r\n  state.gameActive=false;clearInterval(state.timerInterval);\r\n  document.getElementById(&#039;winOverlay&#039;).classList.remove(&#039;active&#039;);\r\n  document.getElementById(&#039;pauseOverlay&#039;).classList.remove(&#039;active&#039;);\r\n  showScreen(&#039;menuScreen&#039;);\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ LEADERBOARD (local only)\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction renderLeaderboard(){\r\n  const t=document.getElementById(&#039;lbTable&#039;);t.innerHTML=&#039;&#039;;\r\n  const entries=[];\r\n  Object.keys(CATEGORIES).forEach(cat=&gt;{\r\n    Object.keys(DIFFICULTIES).forEach(diff=&gt;{\r\n      const sKey=`workhunt_best_${cat}_${diff}`;\r\n      const sKey2=`wordhunt_best_${cat}_${diff}`;\r\n      const tKey=`wordhunt_time_${cat}_${diff}`;\r\n      const score=localStorage.getItem(sKey2);\r\n      const time=localStorage.getItem(tKey);\r\n      if(score)entries.push({cat,diff,score:parseInt(score),time:time?parseInt(time):null});\r\n    });\r\n  });\r\n  if(entries.length===0){t.innerHTML=&#039;&lt;div class=&quot;lb-empty&quot;&gt;No scores yet. Play a game!&lt;\/div&gt;&#039;;return}\r\n  entries.sort((a,b)=&gt;b.score-a.score);\r\n  entries.slice(0,15).forEach((e,i)=&gt;{\r\n    const row=document.createElement(&#039;div&#039;);row.className=&#039;lb-row&#039;;\r\n    const tm=e.time?`${Math.floor(e.time\/60)}:${(e.time%60).toString().padStart(2,&#039;0&#039;)}`:&#039;\u2014&#039;;\r\n    row.innerHTML=`&lt;span class=&quot;lb-rank&quot;&gt;${i+1}&lt;\/span&gt;\r\n      &lt;span class=&quot;lb-cat&quot;&gt;${CATEGORIES[e.cat].label} \u00b7 ${DIFFICULTIES[e.diff].label}&lt;\/span&gt;\r\n      &lt;span class=&quot;lb-time&quot;&gt;${e.score}pts ${tm}&lt;\/span&gt;`;\r\n    t.appendChild(row);\r\n  });\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ DAILY STREAK\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction updateDailyStreak(){\r\n  const today=getDailySeed();\r\n  let streak=parseInt(localStorage.getItem(&#039;wordhunt_streak&#039;)||&#039;0&#039;);\r\n  const lastDay=parseInt(localStorage.getItem(&#039;wordhunt_streak_day&#039;)||&#039;0&#039;);\r\n\r\n  if(localStorage.getItem(getDailyKey())){\r\n    \/\/ Played today\r\n    const yesterday=getDateSeed(-1);\r\n    if(lastDay===yesterday||lastDay===today){\r\n      if(lastDay!==today)streak++;\r\n    }else{streak=1}\r\n    localStorage.setItem(&#039;wordhunt_streak&#039;,streak);\r\n    localStorage.setItem(&#039;wordhunt_streak_day&#039;,today);\r\n  }\r\n  if(streak&gt;0){\r\n    document.getElementById(&#039;streakBadge&#039;).style.display=&#039;inline-flex&#039;;\r\n    document.getElementById(&#039;streakCount&#039;).textContent=streak;\r\n  }\r\n}\r\nfunction getDateSeed(offset=0){\r\n  const d=new Date();d.setDate(d.getDate()+offset);\r\n  return d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();\r\n}\r\nfunction updateStreak(){\r\n  const streak=parseInt(localStorage.getItem(&#039;wordhunt_streak&#039;)||&#039;0&#039;);\r\n  const lastDay=parseInt(localStorage.getItem(&#039;wordhunt_streak_day&#039;)||&#039;0&#039;);\r\n  const yesterday=getDateSeed(-1);\r\n  const today=getDailySeed();\r\n  if(lastDay!==today&amp;&amp;lastDay!==yesterday&amp;&amp;streak&gt;0){\r\n    localStorage.setItem(&#039;wordhunt_streak&#039;,&#039;0&#039;);\r\n  }\r\n  const s=parseInt(localStorage.getItem(&#039;wordhunt_streak&#039;)||&#039;0&#039;);\r\n  if(s&gt;0){\r\n    document.getElementById(&#039;streakBadge&#039;).style.display=&#039;inline-flex&#039;;\r\n    document.getElementById(&#039;streakCount&#039;).textContent=s;\r\n  }else{\r\n    document.getElementById(&#039;streakBadge&#039;).style.display=&#039;none&#039;;\r\n  }\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ THEME\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction toggleTheme(){\r\n  const curr=document.documentElement.getAttribute(&#039;data-theme&#039;);\r\n  const next=curr===&#039;light&#039;?&#039;dark&#039;:&#039;light&#039;;\r\n  document.documentElement.setAttribute(&#039;data-theme&#039;,next===&#039;dark&#039;?&#039;&#039;:&#039;light&#039;);\r\n  document.getElementById(&#039;themeBtn&#039;).textContent=next===&#039;dark&#039;?&#039;&#x2600;&#xfe0f; Light&#039;:&#039;&#x1f319; Dark&#039;;\r\n  localStorage.setItem(&#039;wordhunt_theme&#039;,next);\r\n}\r\n(function initTheme(){\r\n  const saved=localStorage.getItem(&#039;wordhunt_theme&#039;);\r\n  if(saved===&#039;light&#039;){document.documentElement.setAttribute(&#039;data-theme&#039;,&#039;light&#039;);\r\n    document.getElementById(&#039;themeBtn&#039;).textContent=&#039;&#x1f319; Dark&#039;}\r\n})();\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ RESIZE\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nwindow.addEventListener(&#039;resize&#039;,()=&gt;{if(state.gameActive)adjustCellSize()});\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ INIT\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nupdateStreak();\r\n&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\nwindow.kzWordHuntSendHeight = function(){};\r\n&lt;\/script&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n\"\r\n                style=\"width:100%;height:700px;border:0;display:block;border-radius:0;overflow:hidden;background:#0f0f1a;\"\r\n                loading=\"lazy\"\r\n                referrerpolicy=\"no-referrer\"\r\n                allow=\"clipboard-write\"\r\n                title=\"Word Hunt Game\"\r\n            ><\/iframe>\r\n        <\/div>\r\n\r\n        <script>\r\n        (function() {\r\n            var iframeId = \"kz-word-hunt-iframe-1\";\r\n\r\n            function setIframeHeight() {\r\n                var iframe = document.getElementById(iframeId);\r\n                if (!iframe) return;\r\n\r\n                var viewportHeight = window.innerHeight || document.documentElement.clientHeight || 900;\r\n                var newHeight = Math.min(900, Math.max(680, viewportHeight));\r\n                iframe.style.height = newHeight + 'px';\r\n            }\r\n\r\n            window.addEventListener('load', setIframeHeight);\r\n            window.addEventListener('resize', setIframeHeight);\r\n        })();\r\n        <\/script>\r\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-14","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/pages\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14"}],"version-history":[{"count":19,"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/pages\/14\/revisions"}],"predecessor-version":[{"id":43,"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=\/wp\/v2\/pages\/14\/revisions\/43"}],"wp:attachment":[{"href":"https:\/\/fungames.kazverse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}