{"id":5422,"date":"2026-10-29T14:41:54","date_gmt":"2026-10-29T17:41:54","guid":{"rendered":"https:\/\/muttstudio.com.br\/games\/mutt-tile-match\/"},"modified":"2026-10-29T15:13:07","modified_gmt":"2026-10-29T18:13:07","slug":"mutt-tile-match","status":"publish","type":"page","link":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/","title":{"rendered":"Mutt Tile Match"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5422\" class=\"elementor elementor-5422 elementor-5338\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e374f28 e-con-full e-flex e-con e-parent\" data-id=\"e374f28\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0b7e5f8 elementor-widget elementor-widget-html\" data-id=\"0b7e5f8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================================\n     MUTT TILE MATCH \u2014 vers\u00e3o web (bloco para WordPress)\n     Cole TUDO isto num bloco \"HTML personalizado\".\n     Configura\u00e7\u00f5es (pasta das imagens, n\u00ba de fases, link da loja)\n     ficam no topo do <script>, em CFG.\n     ============================================================ -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<div id=\"mtm-game\" aria-label=\"Mutt Tile Match\"><\/div>\n\n<style>\n#mtm-game{--primary:#2563EB;--primary-d:#1D4ED8;--green:#22C55E;--orange:#F59E0B;--red:#EF4444;--bg:#F8FAFC;--text:#1E293B;--muted:#64748B;--border:#E2E8F0;--slotbg:#F1F5F9;--slot:56px;\n  position:relative;width:100%;max-width:none;height:min(960px,92vh);min-height:600px;margin:0 auto;border-radius:24px;overflow:hidden;\n  background:var(--bg);color:var(--text);font-family:'Poppins',system-ui,-apple-system,'Segoe UI',sans-serif;font-size:16px;line-height:1.3;\n  -webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;box-shadow:0 12px 40px rgba(30,41,59,.18);text-align:left}\n@supports (height:100svh){#mtm-game{height:min(960px,92svh)}}\n#mtm-game *,#mtm-game *::before,#mtm-game *::after{box-sizing:border-box}\n#mtm-game button{all:unset;box-sizing:border-box;cursor:pointer;font-family:inherit}\n#mtm-game a{text-decoration:none;color:inherit}\n#mtm-game img{display:block;width:100%;height:100%;max-width:none;max-height:none;object-fit:contain;margin:0;padding:0;border:0;box-shadow:none;border-radius:0;pointer-events:none;-webkit-user-drag:none}\n#mtm-game svg{display:block;fill:currentColor}\n#mtm-game p,#mtm-game h2{margin:0;padding:0}\n\n\/* fundo *\/\n#mtm-game .mtm-bg{position:absolute;inset:0;background:var(--bg) center\/cover no-repeat;transition:opacity .4s}\n#mtm-game .mtm-bg.home::after{content:'';position:absolute;inset:0;background:rgba(248,250,252,.72)}\n\n\/* telas *\/\n#mtm-game .mtm-screen{position:absolute;inset:0;display:none;flex-direction:column}\n#mtm-game .mtm-screen.on{display:flex}\n\n\/* bot\u00e3o redondo *\/\n#mtm-game .mtm-round{width:44px;height:44px;flex:0 0 44px;border-radius:50%;background:#fff;display:grid;place-items:center;color:var(--text);box-shadow:0 3px 10px rgba(30,41,59,.18)}\n#mtm-game .mtm-round svg{width:24px;height:24px}\n#mtm-game .mtm-round:active{transform:scale(.94)}\n\n\/* HOME *\/\n#mtm-game .mtm-home{align-items:center;justify-content:space-between;padding:28px 24px 20px}\n#mtm-game .mtm-gear{position:absolute;top:14px;right:14px}\n#mtm-game .mtm-home-in{width:100%;max-width:440px;display:flex;flex-direction:column;align-items:center;margin-top:auto;margin-bottom:auto}\n#mtm-game .mtm-logo{position:relative;width:150px;height:128px;margin-bottom:18px}\n#mtm-game .mtm-brand{font-size:18px;font-weight:500;color:var(--muted)}\n#mtm-game .mtm-title{font-size:32px;font-weight:700;letter-spacing:2px;line-height:1.1;text-align:center}\n#mtm-game .mtm-slogan{font-size:15px;font-weight:500;color:var(--muted);margin-top:8px;text-align:center}\n#mtm-game .mtm-cards{width:100%;margin-top:34px;display:flex;flex-direction:column;gap:14px}\n#mtm-game .mtm-card{display:flex;align-items:center;gap:14px;width:100%;background:#fff;border-radius:20px;padding:18px 18px;box-shadow:0 4px 14px rgba(30,41,59,.12);transition:transform .1s}\n#mtm-game .mtm-card:active{transform:scale(.98)}\n#mtm-game .mtm-ic{width:44px;height:44px;flex:0 0 44px;border-radius:50%;display:grid;place-items:center}\n#mtm-game .mtm-ic svg{width:24px;height:24px}\n#mtm-game .mtm-card-t{flex:1;min-width:0}\n#mtm-game .mtm-card-t b{display:block;font-size:20px;font-weight:700;line-height:1.2}\n#mtm-game .mtm-card-t span{display:block;font-size:14px;color:var(--muted);font-weight:500}\n#mtm-game .mtm-chev{width:24px;height:24px;color:var(--muted)}\n#mtm-game .mtm-foot{font-size:12px;color:var(--muted);text-align:center}\n\n\/* JOGO *\/\n#mtm-game .mtm-head{display:flex;align-items:center;gap:10px;padding:12px 12px 0;position:relative;z-index:5}\n#mtm-game .mtm-stats{flex:1;display:flex;background:#fff;border-radius:18px;padding:7px 4px;box-shadow:0 4px 12px rgba(30,41,59,.15)}\n#mtm-game .mtm-stat{flex:1;text-align:center;min-width:0}\n#mtm-game .mtm-stat+.mtm-stat{border-left:1px solid var(--border)}\n#mtm-game .mtm-stat.wide{flex:2}\n#mtm-game .mtm-stat small{display:block;font-size:10px;font-weight:600;letter-spacing:1.2px;color:var(--muted);line-height:1.4}\n#mtm-game .mtm-stat b{display:inline-flex;align-items:center;gap:2px;font-size:20px;font-weight:700;line-height:1.15;white-space:nowrap}\n#mtm-game .mtm-stat .lv{color:var(--primary)}\n#mtm-game .mtm-stat svg{width:20px;height:20px;color:var(--orange)}\n#mtm-game .mtm-pop{animation:mtm-pop .45s cubic-bezier(.3,1.6,.5,1)}\n@keyframes mtm-pop{0%{transform:scale(1.35)}100%{transform:scale(1)}}\n\n#mtm-game .mtm-board{flex:1;position:relative;min-height:0}\n#mtm-game .mtm-side{display:flex;flex-direction:column;align-items:center}\n#mtm-game .mtm-head{width:100%;max-width:640px;margin:0 auto}\n#mtm-game .mtm-powers{width:100%;max-width:560px}\n\/* DESKTOP \/ tela larga: tabuleiro grande \u00e0 esquerda + painel \u00e0 direita *\/\n#mtm-game.mtm-wide .mtm-play.on{display:grid;grid-template-columns:1fr clamp(440px,40%,540px);grid-template-rows:1fr auto auto 1fr;grid-template-areas:\"board .\" \"board head\" \"board side\" \"board .\"}\n#mtm-game.mtm-wide .mtm-board{grid-area:board;margin:16px 0 16px 16px}\n#mtm-game.mtm-wide .mtm-head{grid-area:head;padding:0 20px 0 8px}\n#mtm-game.mtm-wide .mtm-side{grid-area:side;padding:12px 20px 0 8px}\n#mtm-game.mtm-wide .mtm-traywrap{margin-top:12px;width:calc(var(--slot)*7 + 48px);max-width:100%}\n#mtm-game.mtm-wide .mtm-powers{padding:20px 0 0}\n#mtm-game.mtm-wide .mtm-toast{left:auto;right:20px;transform:translate(0,20px);bottom:24px}\n#mtm-game.mtm-wide .mtm-toast.on{transform:none}\n#mtm-game .mtm-stash{position:relative;height:calc(var(--slot)*1.15 + 10px);display:flex;justify-content:center;gap:8px}\n#mtm-game .mtm-col{position:relative;width:var(--slot);height:100%}\n#mtm-game .mtm-traywrap{width:calc(var(--slot)*7 + 48px);max-width:calc(100% - 32px);margin:8px auto 0;padding:8px;background:#fff;border:2px solid var(--border);border-radius:18px;box-shadow:0 4px 12px rgba(30,41,59,.15)}\n#mtm-game .mtm-tray{position:relative;height:calc(var(--slot)*1.15)}\n#mtm-game .mtm-slot{position:absolute;top:0;width:var(--slot);height:100%;background:var(--slotbg);border-radius:10px}\n#mtm-game .mtm-tray .mtm-tile{transition:left .2s cubic-bezier(.2,.8,.2,1)}\n#mtm-game .mtm-powers{display:flex;gap:12px;padding:20px 16px 16px}\n#mtm-game .mtm-pw{flex:1;position:relative;height:64px;border-radius:14px;background:var(--primary);color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;font-size:13px;font-weight:600;box-shadow:0 3px 0 var(--primary-d);transition:transform .08s}\n#mtm-game .mtm-pw:active{transform:translateY(2px);box-shadow:0 1px 0 var(--primary-d)}\n#mtm-game .mtm-pw svg{width:22px;height:22px}\n#mtm-game .mtm-pw.off{background:rgba(100,116,139,.5);box-shadow:none}\n#mtm-game .mtm-badge{position:absolute;right:-6px;top:-8px;width:24px;height:24px;border-radius:50%;background:var(--red);border:2px solid #fff;color:#fff;font-size:12px;font-weight:700;display:grid;place-items:center;line-height:1}\n#mtm-game .mtm-pw.off .mtm-badge{background:var(--muted)}\n\n\/* PE\u00c7A *\/\n#mtm-game .mtm-tile{position:absolute;left:0;top:0;width:var(--s);height:calc(var(--s)*1.15);cursor:pointer;will-change:transform}\n#mtm-game .mtm-face{position:absolute;left:0;right:0;top:0;height:calc(var(--s)*1.06);background:#fff;border:calc(var(--s)*.028) solid var(--border);border-radius:calc(var(--s)*.2);padding:calc(var(--s)*.1);\n  box-shadow:0 calc(var(--s)*.09) 0 #CBD5E1,0 calc(var(--s)*.09 + 2px) 6px rgba(30,41,59,.2)}\n#mtm-game .mtm-face::after{content:'';position:absolute;inset:-1px;border-radius:inherit;background:rgba(100,116,139,.38);opacity:0;transition:opacity .15s;pointer-events:none}\n#mtm-game .mtm-tile.blocked .mtm-face::after{opacity:1}\n#mtm-game .mtm-board.fx .mtm-tile.blocked .mtm-face::after{opacity:0}\n#mtm-game .mtm-tile.blocked{cursor:default}\n#mtm-game .mtm-fb{width:100%;height:100%;border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:700;font-size:calc(var(--s)*.32)}\n#mtm-game .mtm-in{animation:mtm-in .22s cubic-bezier(.3,1.5,.5,1)}\n@keyframes mtm-in{0%{transform:scale(.4)}100%{transform:scale(1)}}\n\n\/* estouro do trio *\/\n#mtm-game .mtm-burst{position:absolute;width:0;height:0;pointer-events:none;z-index:20}\n#mtm-game .mtm-ring{position:absolute;left:0;top:0;width:calc(var(--slot)*1.2);height:calc(var(--slot)*1.2);margin:calc(var(--slot)*-.6) 0 0 calc(var(--slot)*-.6);border-radius:50%;border:4px solid var(--green);animation:mtm-ring .45s ease-out forwards}\n@keyframes mtm-ring{0%{transform:scale(.4);opacity:.9}100%{transform:scale(1.7);opacity:0}}\n#mtm-game .mtm-part{position:absolute;left:0;top:0;width:9px;height:9px;margin:-4.5px 0 0 -4.5px;border-radius:50%;animation:mtm-part .5s cubic-bezier(.2,.8,.3,1) forwards}\n#mtm-game .mtm-part.sq{border-radius:2px;width:12px;height:6px;margin:-3px 0 0 -6px}\n@keyframes mtm-part{0%{transform:translate(0,0) rotate(0) scale(1);opacity:1}100%{transform:translate(var(--dx),var(--dy)) rotate(var(--r)) scale(.3);opacity:0}}\n#mtm-game .mtm-plus{position:absolute;left:-50px;width:100px;top:calc(var(--slot)*-.9);text-align:center;font-size:26px;font-weight:700;color:var(--green);\n  text-shadow:0 0 6px #fff,0 2px 3px rgba(30,41,59,.4);animation:mtm-plus .75s ease-out forwards}\n@keyframes mtm-plus{0%{transform:translateY(10px) scale(.6);opacity:0}25%{transform:translateY(-6px) scale(1.2);opacity:1}70%{opacity:1}100%{transform:translateY(-34px) scale(1);opacity:0}}\n\n\/* MODAL *\/\n#mtm-game .mtm-modal{position:absolute;inset:0;z-index:50;background:rgba(15,23,42,.45);display:none;align-items:center;justify-content:center;padding:24px}\n#mtm-game .mtm-modal.on{display:flex;animation:mtm-fade .2s}\n@keyframes mtm-fade{from{opacity:0}to{opacity:1}}\n#mtm-game .mtm-dlg{width:100%;max-width:360px;background:#fff;border-radius:28px;padding:24px;text-align:center;animation:mtm-up .25s cubic-bezier(.2,.9,.3,1.2)}\n@keyframes mtm-up{from{transform:translateY(20px) scale(.96);opacity:0}to{transform:none;opacity:1}}\n#mtm-game .mtm-badge-ic{width:64px;height:64px;border-radius:50%;display:grid;place-items:center;margin:0 auto 14px}\n#mtm-game .mtm-badge-ic svg{width:34px;height:34px}\n#mtm-game .mtm-dlg h2{font-size:24px;font-weight:700;color:var(--text);line-height:1.2}\n#mtm-game .mtm-dlg .sub{font-size:15px;color:var(--text);margin-top:4px}\n#mtm-game .mtm-dlg .body{font-size:15px;color:var(--muted);margin-top:10px}\n#mtm-game .mtm-row{display:flex;align-items:center;gap:12px;background:#EEF2F7;border-radius:14px;padding:12px 16px;margin-top:12px;text-align:left}\n#mtm-game .mtm-row svg{width:22px;height:22px;color:var(--primary)}\n#mtm-game .mtm-row span{flex:1;font-size:14px;font-weight:500}\n#mtm-game .mtm-row b{font-size:18px;font-weight:700}\n#mtm-game .mtm-note{margin-top:16px;font-size:15px;font-weight:600;color:var(--primary)}\n#mtm-game .mtm-acts{display:flex;flex-direction:column;gap:6px;margin-top:20px}\n#mtm-game .mtm-btn{display:flex;align-items:center;justify-content:center;gap:8px;height:48px;border-radius:24px;font-size:15px;font-weight:600;color:var(--primary);text-align:center}\n#mtm-game .mtm-btn svg{width:20px;height:20px}\n#mtm-game .mtm-btn.fill{background:var(--primary);color:#fff}\n#mtm-game .mtm-btn.store{background:#1E293B;color:#fff}\n#mtm-game .mtm-btn.danger{background:var(--red);color:#fff}\n#mtm-game .mtm-btn.line{border:1.5px solid #CBD5E1}\n#mtm-game .mtm-btn:active{opacity:.85}\n#mtm-game .mtm-two{display:flex;gap:8px}\n#mtm-game .mtm-two .mtm-btn{flex:1}\n#mtm-game .mtm-big{font-size:52px;font-weight:700;line-height:1.1;margin-top:6px}\n#mtm-game .mtm-prog{height:10px;border-radius:6px;background:var(--border);overflow:hidden;margin-top:12px}\n#mtm-game .mtm-prog i{display:block;height:100%;background:var(--green);border-radius:6px}\n\n\/* switches *\/\n#mtm-game .mtm-sw{display:flex;align-items:center;gap:12px;padding:14px 4px;border-bottom:1px solid var(--border);text-align:left}\n#mtm-game .mtm-sw:last-of-type{border-bottom:0}\n#mtm-game .mtm-sw svg{width:24px;height:24px;color:var(--primary)}\n#mtm-game .mtm-sw span{flex:1;font-weight:600}\n#mtm-game .mtm-tg{width:48px;height:28px;border-radius:14px;background:#CBD5E1;position:relative;transition:background .2s}\n#mtm-game .mtm-tg::after{content:'';position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:transform .2s}\n#mtm-game .mtm-sw.on .mtm-tg{background:var(--green)}\n#mtm-game .mtm-sw.on .mtm-tg::after{transform:translateX(20px)}\n\n\/* aviso *\/\n#mtm-game .mtm-toast{position:absolute;left:50%;bottom:110px;transform:translate(-50%,20px);max-width:86%;background:#1E293B;color:#fff;font-size:14px;padding:10px 16px;border-radius:12px;opacity:0;pointer-events:none;transition:all .25s;z-index:60;text-align:center}\n#mtm-game .mtm-toast.on{opacity:1;transform:translate(-50%,0)}\n<\/style>\n\n<script>\n(function () {\n  'use strict';\n\n  \/* ============================================================\n     CONFIGURA\u00c7\u00c3O \u2014 ajuste aqui\n     ============================================================ *\/\n  var CFG = {\n    \/\/ Pasta onde est\u00e3o as imagens e sons (com barra no final)\n    BASE: 'https:\/\/muttstudio.com.br\/wp-content\/uploads\/2026\/10\/',\n    PREFIX: 'game-mutt-tile-match-',\n\n    \/\/ game-mutt-tile-match-tile-01.webp ... tile-21.webp\n    TILE_COUNT: 21,\n    \/\/ game-mutt-tile-match-bg-01.webp ... bg-10.webp (1 fundo a cada 10 fases)\n    BG_COUNT: 10,\n\n    \/\/ Quantas fases a vers\u00e3o web libera (o app tem 100).\n    \/\/ Ao terminar, o jogo convida a baixar o app. Use 100 para liberar tudo.\n    WEB_MAX_LEVELS: 20,\n\n    PLAY_STORE_URL: 'https:\/\/play.google.com\/store\/apps\/details?id=com.muttgroup.tiles',\n\n    \/\/ Sons (mesma pasta). M\u00fasica toca em loop ap\u00f3s o primeiro toque.\n    SOUNDS: {\n      tap: 'game-mutt-tile-match-tap.mp3',\n      match: 'game-mutt-tile-match-match.mp3',\n      victory: 'game-mutt-tile-match-victory.mp3',\n      error: 'game-mutt-tile-match-error.mp3',\n      music: 'game-mutt-tile-match-music.mp3'\n    }\n  };\n\n  var root = document.getElementById('mtm-game');\n  if (!root || root.dataset.ready) return;\n  root.dataset.ready = '1';\n\n  \/* ============================================================\n     REGRAS\n     ============================================================ *\/\n  var MAX_LEVELS = 100;          \/\/ curva de dificuldade (igual ao app)\n  var MAX_TYPES = 25;\n  var TRAY = 7;                  \/\/ espa\u00e7os da linha\n  var USES = 2;                  \/\/ usos de cada bot\u00e3o por fase\n  var MATCH_PTS = 30;\n  var ASPECT = 1.15;\n  var GAP = 4;\n  var WEB_MAX = Math.min(CFG.WEB_MAX_LEVELS, MAX_LEVELS);\n\n  function pad2(n) { return (n < 10 ? '0' : '') + n; }\n  function tileUrl(t) { return CFG.BASE + CFG.PREFIX + 'tile-' + pad2((t % CFG.TILE_COUNT) + 1) + '.webp'; }\n  function bgUrl(level) { return CFG.BASE + CFG.PREFIX + 'bg-' + pad2((Math.floor((level - 1) \/ 10) % CFG.BG_COUNT) + 1) + '.webp'; }\n\n  \/* ============================================================\n     TEXTOS (PT no navegador em portugu\u00eas, EN nos demais)\n     ============================================================ *\/\n  var PT = \/^pt\/i.test(navigator.language || '');\n  var TX = PT ? {\n    brand: 'Mutt', title: 'TILE MATCH', slogan: 'Junte 3 iguais. Limpe o tabuleiro.',\n    start: 'Come\u00e7ar jogo', startSub: '{n} fases para voc\u00ea dominar',\n    cont: 'Continuar', contSub: 'Fase {n} de ' + WEB_MAX,\n    again: 'Jogar de novo', againSub: 'Voc\u00ea zerou as {n} fases!',\n    score: 'Pontua\u00e7\u00e3o', scoreSub: '{p} pontos \u00b7 Fase {n}',\n    getApp: 'Baixe o app', getAppSub: '100 fases na Google Play',\n    foot: 'Um jogo da Mutt Animation',\n    lvl: 'FASE', pts: 'PONTOS', tiles: 'PE\u00c7AS',\n    shuffle: 'Embaralhar', remove: 'Remover', undo: 'Voltar',\n    noUses: 'Sem usos deste bot\u00e3o nesta fase.', emptyRow: 'A linha est\u00e1 vazia.', nothingUndo: 'Nada para voltar.',\n    congrats: 'Parab\u00e9ns!', lvDone: '\ud83c\udf89 Fase {n} conclu\u00edda!', bonus: 'B\u00f4nus da fase', total: 'Pontua\u00e7\u00e3o total',\n    newScene: '\u2728 Novo cen\u00e1rio desbloqueado!', next: 'Pr\u00f3xima fase', menu: 'Voltar ao menu',\n    webDone: '\ud83c\udfc6 Voc\u00ea zerou a vers\u00e3o web!', webDoneBody: 'Gostou? No app Mutt Tile Match s\u00e3o 100 fases, com cen\u00e1rios novos a cada 10 fases.',\n    allDone: '\ud83c\udfc6 Voc\u00ea zerou o jogo!', store: 'Baixar na Google Play',\n    full: 'Sem espa\u00e7o!', fullBody: 'A linha est\u00e1 cheia. Use um bot\u00e3o ou tente de novo.', retry: 'Tentar de novo',\n    points: 'pontos', curLv: 'Fase atual', cleared: 'Fases conclu\u00eddas', reset: 'Zerar progresso',\n    resetQ: 'Zerar progresso?', resetBody: 'Sua pontua\u00e7\u00e3o e a fase voltam para o in\u00edcio.', cancel: 'Cancelar', resetOk: 'Zerar', close: 'Fechar',\n    settings: 'Configura\u00e7\u00f5es', music: 'M\u00fasica', sound: 'Sons'\n  } : {\n    brand: 'Mutt', title: 'TILE MATCH', slogan: 'Match 3. Clear the board.',\n    start: 'Start game', startSub: '{n} levels to master',\n    cont: 'Continue', contSub: 'Level {n} of ' + WEB_MAX,\n    again: 'Play again', againSub: 'You cleared all {n} levels!',\n    score: 'Score', scoreSub: '{p} points \u00b7 Level {n}',\n    getApp: 'Get the app', getAppSub: '100 levels on Google Play',\n    foot: 'A game by Mutt Animation',\n    lvl: 'LEVEL', pts: 'POINTS', tiles: 'TILES',\n    shuffle: 'Shuffle', remove: 'Remove', undo: 'Undo',\n    noUses: 'No uses left for this button this level.', emptyRow: 'The row is empty.', nothingUndo: 'Nothing to undo.',\n    congrats: 'Congratulations!', lvDone: '\ud83c\udf89 Level {n} complete!', bonus: 'Level bonus', total: 'Total score',\n    newScene: '\u2728 New scene unlocked!', next: 'Next level', menu: 'Back to menu',\n    webDone: '\ud83c\udfc6 You beat the web version!', webDoneBody: 'Liked it? The Mutt Tile Match app has 100 levels, with new scenery every 10 levels.',\n    allDone: '\ud83c\udfc6 You beat the game!', store: 'Get it on Google Play',\n    full: 'Out of space!', fullBody: 'The row is full. Use a power-up or try again.', retry: 'Try again',\n    points: 'points', curLv: 'Current level', cleared: 'Levels cleared', reset: 'Reset progress',\n    resetQ: 'Reset progress?', resetBody: 'Your score and level go back to the start.', cancel: 'Cancel', resetOk: 'Reset', close: 'Close',\n    settings: 'Settings', music: 'Music', sound: 'Sounds'\n  };\n  function tx(k, n, p) { return (TX[k] || k).replace('{n}', n).replace('{p}', p); }\n\n  \/* ============================================================\n     \u00cdCONES\n     ============================================================ *\/\n  var IC = {\n    back: 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z',\n    refresh: 'M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 1 0 7.73 10h-2.08A6 6 0 1 1 12 6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z',\n    play: 'M8 5v14l11-7z',\n    trophy: 'M19 5h-2V3H7v2H5c-1.1 0-2 .9-2 2v1c0 2.55 1.92 4.63 4.39 4.94A5.01 5.01 0 0 0 11 15.9V19H7v2h10v-2h-4v-3.1a5.01 5.01 0 0 0 3.61-2.96C19.08 12.63 21 10.55 21 8V7c0-1.1-.9-2-2-2zM5 8V7h2v3.82C5.84 10.4 5 9.3 5 8zm14 0c0 1.3-.84 2.4-2 2.82V7h2v1z',\n    gear: 'M19.14 12.94c.04-.3.06-.61.06-.94s-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.48.48 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96a.49.49 0 0 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6a3.6 3.6 0 1 1 0-7.2 3.6 3.6 0 0 1 0 7.2z',\n    shuffle: 'M10.59 9.17 5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z',\n    upload: 'M5 20h14v-2H5v2zm0-10h4v6h6v-6h4l-7-7-7 7z',\n    undo: 'M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z',\n    star: 'M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z',\n    chev: 'M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n    music: 'M12 3v10.55A4 4 0 1 0 14 17V7h4V3h-6z',\n    vol: 'M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06a7 7 0 0 1 0 13.42v2.06A9 9 0 0 0 14 3.23z',\n    plus: 'M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z',\n    flag: 'M14.4 6 14 4H5v17h2v-7h5.6l.4 2h7V6z',\n    check: 'M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n    block: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9A7.9 7.9 0 0 1 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1A7.9 7.9 0 0 1 20 12c0 4.42-3.58 8-8 8z',\n    android: 'M3.6 2.4 13.8 12 3.6 21.6c-.4-.2-.6-.6-.6-1.1V3.5c0-.5.2-.9.6-1.1zm11.6 8.2 2.6-2.6 3.2 1.8c.9.5.9 1.8 0 2.4l-3.2 1.8-2.6-2.6-.7-.7.7-.1zM5 2.2l10.1 5.8-2.2 2.2L5 2.2zm7.9 11.6 2.2 2.2L5 21.8l7.9-8z'\n  };\n  function svg(name) { return '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"' + IC[name] + '\"\/><\/svg>'; }\n\n  \/* ============================================================\n     SAVE (localStorage \u2014 com prote\u00e7\u00e3o se o navegador bloquear)\n     ============================================================ *\/\n  var KEY = 'mutt_tile_match_web_v1';\n  var save = { level: 1, score: 0, finished: false, session: null, music: true, sound: true };\n  try {\n    var raw = localStorage.getItem(KEY);\n    if (raw) { var o = JSON.parse(raw); for (var k in o) if (o.hasOwnProperty(k)) save[k] = o[k]; }\n  } catch (e) {}\n  if (save.level > WEB_MAX) { save.level = WEB_MAX; }\n  function persist() { try { localStorage.setItem(KEY, JSON.stringify(save)); } catch (e) {} }\n\n  \/* ============================================================\n     \u00c1UDIO\n     ============================================================ *\/\n  var sfxCache = {};\n  var music = null;\n  function sndUrl(n) { return CFG.BASE + CFG.SOUNDS[n]; }\n  function sfx(n) {\n    if (!save.sound) return;\n    try {\n      var base = sfxCache[n] || (sfxCache[n] = new Audio(sndUrl(n)));\n      var a = base.cloneNode();\n      a.volume = 0.8;\n      var p = a.play(); if (p && p.catch) p.catch(function () {});\n    } catch (e) {}\n  }\n  function startMusic() {\n    if (!save.music) return;\n    try {\n      if (!music) { music = new Audio(sndUrl('music')); music.loop = true; music.volume = 0.35; }\n      if (music.paused) { var p = music.play(); if (p && p.catch) p.catch(function () {}); }\n    } catch (e) {}\n  }\n  function stopMusic() { if (music) music.pause(); }\n  document.addEventListener('visibilitychange', function () {\n    if (document.hidden) stopMusic(); else if (musicStarted) startMusic();\n  });\n  var musicStarted = false;\n  function vibrate(ms) { try { if (navigator.vibrate) navigator.vibrate(ms); } catch (e) {} }\n\n  \/* ============================================================\n     GERADOR DE FASES (mesma l\u00f3gica do app)\n     ============================================================ *\/\n  function mulberry32(a) {\n    return function () {\n      a |= 0; a = a + 0x6D2B79F5 | 0;\n      var t = Math.imul(a ^ a >>> 15, 1 | a);\n      t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;\n      return ((t ^ t >>> 14) >>> 0) \/ 4294967296;\n    };\n  }\n  function overlaps(a, b) { return Math.abs(a.x - b.x) < 2 && Math.abs(a.y - b.y) < 2; }\n  function shuffleArr(arr) {\n    for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var t = arr[i]; arr[i] = arr[j]; arr[j] = t; }\n    return arr;\n  }\n  function levelConfig(level, avail) {\n    var lv = Math.min(Math.max(level, 1), MAX_LEVELS);\n    var tiles = lv <= 30 ? 18 + (lv - 1) * 3 : 105 + 3 * Math.floor((lv - 30) * 25 \/ 70);\n    var layers = lv <= 60 ? Math.min(1 + Math.floor((lv + 2) \/ 5), 6) : 7;\n    var wanted = 5 + Math.floor((lv + 1) \/ 2);\n    var types = Math.max(1, Math.min(wanted, MAX_TYPES, avail));\n    return { tiles: tiles, layers: layers, types: types };\n  }\n  function fillLayer(l, want, placed, rnd) {\n    if (want <= 0) return 0;\n    var odd = l % 2 === 1;\n    var xs = odd ? [1, 3, 5, 7, 9, 11] : [0, 2, 4, 6, 8, 10, 12];\n    var ys = odd ? [1, 3, 5, 7, 9, 11, 13] : [0, 2, 4, 6, 8, 10, 12, 14];\n    var groups = {}, order = [];\n    ys.forEach(function (y) {\n      xs.forEach(function (x) {\n        if (placed.some(function (p) { return p.l === l && p.x === x && p.y === y; })) return;\n        if (l > 0 && !placed.some(function (p) { return p.l === l - 1 && Math.abs(p.x - x) < 2 && Math.abs(p.y - y) < 2; })) return;\n        var key = Math.min(x, 12 - x) + '_' + y;\n        if (!groups[key]) { groups[key] = []; order.push(key); }\n        groups[key].push([x, y]);\n      });\n    });\n    var ranked = order.map(function (k) {\n      var g = groups[k];\n      return { g: g, v: Math.abs(g[0][0] - 6) + Math.abs(g[0][1] - 7) * 0.85 + rnd() * 2.2 };\n    }).sort(function (a, b) { return a.v - b.v; });\n    var added = 0;\n    for (var i = 0; i < ranked.length && added < want; i++) {\n      var g = ranked[i].g;\n      for (var j = 0; j < g.length && added < want; j++) { placed.push({ x: g[j][0], y: g[j][1], l: l }); added++; }\n    }\n    return added;\n  }\n  function generateLevel(level) {\n    var cfg = levelConfig(level, CFG.TILE_COUNT);\n    var rnd = mulberry32(level * 7919 + 17);\n    var placed = [];\n    var weights = [], wsum = 0, l;\n    for (l = 0; l < cfg.layers; l++) { weights.push(cfg.layers - l); wsum += cfg.layers - l; }\n    var quotas = weights.map(function (w) { return Math.floor(cfg.tiles * w \/ wsum); });\n    var diff = cfg.tiles - quotas.reduce(function (a, b) { return a + b; }, 0), qi = 0;\n    while (diff > 0) { quotas[qi % cfg.layers]++; diff--; qi++; }\n    var carry = 0;\n    for (l = 0; l < cfg.layers; l++) { var want = quotas[l] + carry; carry = want - fillLayer(l, want, placed, rnd); }\n    for (l = 0; l < cfg.layers && carry > 0; l++) carry -= fillLayer(l, carry, placed, rnd);\n    while (placed.length % 3 !== 0) placed.pop();\n\n    var tiles = placed.map(function (p, i) { return { id: i, t: -1, x: p.x, y: p.y, l: p.l }; });\n\n    \/\/ ordem real de retirada \u2192 solu\u00e7\u00e3o garantida\n    var remaining = tiles.slice(), order = [];\n    while (remaining.length) {\n      var free = remaining.filter(function (t) { return !remaining.some(function (o) { return o.l > t.l && overlaps(o, t); }); });\n      var pick = free[Math.floor(Math.random() * free.length)];\n      remaining.splice(remaining.indexOf(pick), 1);\n      order.push(pick);\n    }\n    var all = []; for (var a = 0; a < Math.max(1, CFG.TILE_COUNT); a++) all.push(a);\n    var pool = shuffleArr(all).slice(0, cfg.types);\n    var triples = order.length \/ 3, tt = [];\n    for (var k = 0; k < triples; k++) tt.push(pool[k % pool.length]);\n    shuffleArr(tt);\n    for (k = 0; k < triples; k++) for (var j = 0; j < 3; j++) order[k * 3 + j].t = tt[k];\n    return tiles;\n  }\n\n  \/* ============================================================\n     ESTADO DA PARTIDA\n     ============================================================ *\/\n  var G = null;\n  function extentOf(tiles) {\n    var e = [Infinity, Infinity, -Infinity, -Infinity, 0];\n    tiles.forEach(function (t) {\n      e[0] = Math.min(e[0], t.x); e[1] = Math.min(e[1], t.y);\n      e[2] = Math.max(e[2], t.x); e[3] = Math.max(e[3], t.y); e[4] = Math.max(e[4], t.l);\n    });\n    return e;\n  }\n  function newGame(level, score) {\n    var tiles = generateLevel(level);\n    G = { level: level, board: tiles, tray: [], stash: [[], [], []], score: score, start: score,\n          uses: { shuffle: USES, remove: USES, undo: USES }, ext: extentOf(tiles), hist: [] };\n    saveSession();\n  }\n  function saveSession() {\n    if (!G) return;\n    save.session = { level: G.level, board: G.board, tray: G.tray, stash: G.stash, score: G.score, start: G.start, uses: G.uses, ext: G.ext };\n    persist();\n  }\n  function loadSession(s) {\n    G = { level: s.level, board: s.board, tray: s.tray, stash: s.stash, score: s.score, start: s.start, uses: s.uses, ext: s.ext, hist: [] };\n  }\n  function isFree(t) { return !G.board.some(function (o) { return o.l > t.l && overlaps(o, t); }); }\n  function remainingTiles() { return G.board.length + G.tray.length + G.stash[0].length + G.stash[1].length + G.stash[2].length; }\n  function snapshot() {\n    G.hist.push(JSON.stringify({ b: G.board, t: G.tray, s: G.stash, sc: G.score }));\n    if (G.hist.length > 60) G.hist.shift();\n  }\n  function insertTray(t) {\n    var idx = -1;\n    for (var i = G.tray.length - 1; i >= 0; i--) if (G.tray[i].t === t.t) { idx = i; break; }\n    if (idx >= 0) G.tray.splice(idx + 1, 0, t); else G.tray.push(t);\n  }\n  function findMatch() {\n    var c = {};\n    for (var i = 0; i < G.tray.length; i++) {\n      var ty = G.tray[i].t; c[ty] = (c[ty] || 0) + 1;\n      if (c[ty] >= 3) return G.tray.filter(function (x) { return x.t === ty; }).slice(0, 3);\n    }\n    return [];\n  }\n  function trayFull() { return G.tray.length >= TRAY; }\n  function isWon() { return remainingTiles() === 0; }\n  function isLost() { return trayFull() && findMatch().length === 0; }\n\n  \/* ============================================================\n     DOM\n     ============================================================ *\/\n  root.innerHTML =\n    '<div class=\"mtm-bg\"><\/div>' +\n    '<section class=\"mtm-screen mtm-home\">' +\n      '<button class=\"mtm-round mtm-gear\" data-act=\"settings\" aria-label=\"' + TX.settings + '\">' + svg('gear') + '<\/button>' +\n      '<div class=\"mtm-home-in\">' +\n        '<div class=\"mtm-logo\"><\/div>' +\n        '<div class=\"mtm-brand\">' + TX.brand + '<\/div>' +\n        '<div class=\"mtm-title\">' + TX.title + '<\/div>' +\n        '<p class=\"mtm-slogan\">' + TX.slogan + '<\/p>' +\n        '<div class=\"mtm-cards\"><\/div>' +\n      '<\/div>' +\n      '<div class=\"mtm-foot\">' + TX.foot + '<\/div>' +\n    '<\/section>' +\n    '<section class=\"mtm-screen mtm-play\">' +\n      '<div class=\"mtm-head\">' +\n        '<button class=\"mtm-round\" data-act=\"home\" aria-label=\"' + TX.menu + '\">' + svg('back') + '<\/button>' +\n        '<div class=\"mtm-stats\">' +\n          '<div class=\"mtm-stat\"><small>' + TX.lvl + '<\/small><b class=\"lv\" data-v=\"lv\">1<\/b><\/div>' +\n          '<div class=\"mtm-stat wide\"><small>' + TX.pts + '<\/small><b data-v=\"pts\">' + svg('star') + '<span>0<\/span><\/b><\/div>' +\n          '<div class=\"mtm-stat\"><small>' + TX.tiles + '<\/small><b data-v=\"tiles\">0<\/b><\/div>' +\n        '<\/div>' +\n        '<button class=\"mtm-round\" data-act=\"restart\" aria-label=\"' + TX.retry + '\">' + svg('refresh') + '<\/button>' +\n      '<\/div>' +\n      '<div class=\"mtm-board\"><\/div>' +\n      '<div class=\"mtm-side\"><div class=\"mtm-stash\"><div class=\"mtm-col\"><\/div><div class=\"mtm-col\"><\/div><div class=\"mtm-col\"><\/div><\/div>' +\n      '<div class=\"mtm-traywrap\"><div class=\"mtm-tray\"><\/div><\/div>' +\n      '<div class=\"mtm-powers\">' +\n        '<button class=\"mtm-pw\" data-act=\"shuffle\">' + svg('shuffle') + '<span>' + TX.shuffle + '<\/span><i class=\"mtm-badge\"><\/i><\/button>' +\n        '<button class=\"mtm-pw\" data-act=\"remove\">' + svg('upload') + '<span>' + TX.remove + '<\/span><i class=\"mtm-badge\"><\/i><\/button>' +\n        '<button class=\"mtm-pw\" data-act=\"undo\">' + svg('undo') + '<span>' + TX.undo + '<\/span><i class=\"mtm-badge\"><\/i><\/button>' +\n      '<\/div><\/div>' +\n    '<\/section>' +\n    '<div class=\"mtm-modal\"><div class=\"mtm-dlg\"><\/div><\/div>' +\n    '<div class=\"mtm-toast\"><\/div>';\n\n  function $(sel) { return root.querySelector(sel); }\n  var bgEl = $('.mtm-bg'), homeEl = $('.mtm-home'), playEl = $('.mtm-play');\n  var boardEl = $('.mtm-board'), trayEl = $('.mtm-tray'), cols = root.querySelectorAll('.mtm-col');\n  var modalEl = $('.mtm-modal'), dlgEl = $('.mtm-dlg'), toastEl = $('.mtm-toast');\n\n  var slot = 56;\n  var busy = false, fxMode = null;\n  var boardEls = {}; \/\/ id -> {el, hx, hy}\n  var trayEls = {};  \/\/ id -> el\n  var geom = null;\n\n  var FB_COLORS = ['#EF4444', '#22C55E', '#F59E0B', '#8B5CF6', '#2563EB', '#14B8A6', '#EC4899', '#84CC16'];\n\n  function makeTile(type, size) {\n    var el = document.createElement('div');\n    el.className = 'mtm-tile';\n    el.style.setProperty('--s', size + 'px');\n    var face = document.createElement('div');\n    face.className = 'mtm-face';\n    el.appendChild(face);\n    setTileType(el, type);\n    return el;\n  }\n  function setTileType(el, type) {\n    var face = el.firstChild;\n    face.innerHTML = '';\n    var img = new Image();\n    img.alt = '';\n    img.draggable = false;\n    img.onerror = function () {\n      face.innerHTML = '<div class=\"mtm-fb\" style=\"background:' + FB_COLORS[type % FB_COLORS.length] + '\">' + (type + 1) + '<\/div>';\n    };\n    img.src = tileUrl(type);\n    face.appendChild(img);\n  }\n\n  \/* ---------- medidas ---------- *\/\n  var WIDE_MIN = 860; \/\/ a partir desta largura (e na horizontal) usa o layout desktop\n  function measure() {\n    var W = root.clientWidth, H = root.clientHeight;\n    var wide = W >= WIDE_MIN && W > H;\n    root.classList.toggle('mtm-wide', wide);\n    var avail = wide ? Math.max(440, Math.min(540, W * 0.40)) - 28 + 32 : W;\n    slot = Math.max(30, Math.min(64, (avail - 32 - 20 - GAP * TRAY) \/ TRAY));\n    root.style.setProperty('--slot', slot + 'px');\n  }\n  function slotLeft(i) { return i * (slot + GAP) + GAP \/ 2; }\n\n  function computeGeom() {\n    var w = boardEl.clientWidth, h = boardEl.clientHeight, e = G.ext;\n    var cols_ = (e[2] - e[0]) \/ 2 + 1, rows = (e[3] - e[1]) \/ 2 + 1, maxL = e[4];\n    var dk = 0.06, pad = root.classList.contains('mtm-wide') ? 8 : 4;\n    var s = Math.min((w - pad * 2) \/ (cols_ + maxL * dk), (h - pad * 2) \/ (rows * ASPECT + maxL * dk));\n    s = Math.max(12, Math.min(s, 120));\n    var d = s * dk, th = s * ASPECT;\n    var bw = cols_ * s + maxL * d, bh = rows * th + maxL * d;\n    return { w: w, h: h, s: s, d: d, th: th, minX: e[0], minY: e[1],\n             ox: (w - bw) \/ 2 + maxL * d, oy: (h - bh) \/ 2 + maxL * d };\n  }\n\n  \/* ---------- render ---------- *\/\n  function renderBoard() {\n    geom = computeGeom();\n    boardEl.innerHTML = '';\n    boardEls = {};\n    var tiles = G.board.slice().sort(function (a, b) { return a.l - b.l || a.y - b.y || a.x - b.x; });\n    tiles.forEach(function (t) {\n      var el = makeTile(t.t, geom.s);\n      var hx = geom.ox + (t.x - geom.minX) \/ 2 * geom.s - t.l * geom.d;\n      var hy = geom.oy + (t.y - geom.minY) \/ 2 * geom.th - t.l * geom.d;\n      el.style.left = hx + 'px';\n      el.style.top = hy + 'px';\n      if (!isFree(t)) el.classList.add('blocked');\n      el.addEventListener('click', function () { tapBoard(t.id); });\n      boardEl.appendChild(el);\n      boardEls[t.id] = { el: el, hx: hx, hy: hy, t: t };\n    });\n  }\n  function refreshBlocked() {\n    G.board.forEach(function (t) {\n      var e = boardEls[t.id];\n      if (e) e.el.classList.toggle('blocked', !isFree(t));\n    });\n  }\n\n  function renderStash() {\n    for (var c = 0; c < 3; c++) {\n      var col = cols[c], stack = G.stash[c];\n      col.innerHTML = '';\n      var vis = stack.slice(-3);\n      vis.forEach(function (t, i) {\n        var el = makeTile(t.t, slot);\n        el.style.top = (10 - (vis.length - 1 - i) * 5) + 'px';\n        if (i === vis.length - 1) {\n          (function (cc) { el.addEventListener('click', function () { tapStash(cc); }); })(c);\n        } else el.classList.add('blocked');\n        col.appendChild(el);\n      });\n    }\n  }\n\n  function renderTraySlots() {\n    trayEl.innerHTML = '';\n    trayEls = {};\n    for (var i = 0; i < TRAY; i++) {\n      var s = document.createElement('div');\n      s.className = 'mtm-slot';\n      s.style.left = slotLeft(i) + 'px';\n      trayEl.appendChild(s);\n    }\n  }\n  function renderTray() {\n    var keep = {};\n    G.tray.forEach(function (t, i) {\n      var el = trayEls[t.id];\n      if (!el) {\n        el = makeTile(t.t, slot);\n        el.classList.add('mtm-in');\n        el.style.left = slotLeft(i) + 'px';\n        trayEl.appendChild(el);\n        trayEls[t.id] = el;\n      } else {\n        el.style.setProperty('--s', slot + 'px');\n        el.style.left = slotLeft(i) + 'px';\n      }\n      keep[t.id] = 1;\n    });\n    Object.keys(trayEls).forEach(function (id) {\n      if (!keep[id]) { trayEls[id].remove(); delete trayEls[id]; }\n    });\n  }\n\n  var shownScore = 0, scoreRaf = 0;\n  function renderHeader(pop) {\n    $('[data-v=\"lv\"]').textContent = G.level;\n    $('[data-v=\"tiles\"]').textContent = remainingTiles();\n    var b = $('[data-v=\"pts\"]'), span = b.querySelector('span');\n    var from = shownScore, to = G.score, t0 = performance.now();\n    cancelAnimationFrame(scoreRaf);\n    if (from === to) { span.textContent = to; }\n    else {\n      (function step(now) {\n        var p = Math.min(1, (now - t0) \/ 500);\n        var v = Math.round(from + (to - from) * (1 - Math.pow(1 - p, 3)));\n        span.textContent = v;\n        if (p < 1) scoreRaf = requestAnimationFrame(step);\n      })(t0);\n    }\n    shownScore = to;\n    if (pop) { b.classList.remove('mtm-pop'); void b.offsetWidth; b.classList.add('mtm-pop'); }\n    var pws = root.querySelectorAll('.mtm-pw');\n    ['shuffle', 'remove', 'undo'].forEach(function (k, i) {\n      var u = G.uses[k];\n      pws[i].classList.toggle('off', u <= 0);\n      pws[i].querySelector('.mtm-badge').textContent = u > 0 ? u : '0';\n    });\n  }\n\n  function renderAll() {\n    measure();\n    renderBoard();\n    renderStash();\n    renderTraySlots();\n    renderTray();\n    renderHeader(false);\n  }\n\n  \/* ---------- anima\u00e7\u00e3o em c\u00edrculo (entrada \/ embaralhar) ---------- *\/\n  function ease(t) { return 1 - Math.pow(1 - t, 3); }\n  function easeInOut(t) { return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) \/ 2; }\n\n  function circleFx(mode, onMid) {\n    return new Promise(function (resolve) {\n      fxMode = mode;\n      boardEl.classList.add('fx');\n      var list = G.board.slice().sort(function (a, b) { return a.l - b.l || a.y - b.y || a.x - b.x; })\n        .map(function (t) { return boardEls[t.id]; }).filter(Boolean);\n      var n = list.length, dur = 1500, t0 = performance.now(), midDone = false;\n      var cx = geom.w \/ 2 - geom.s \/ 2, cy = geom.h \/ 2 - geom.th \/ 2, R = Math.min(geom.w, geom.h) * 0.30;\n      function frame(now) {\n        var t = Math.min(1, (now - t0) \/ dur), rot = t * Math.PI * 2;\n        for (var i = 0; i < n; i++) {\n          var e = list[i];\n          var ring = 0.75 + 0.25 * ((i % 3) \/ 2);\n          var a = 2 * Math.PI * i \/ Math.max(n, 1) + rot;\n          var rx = cx + Math.cos(a) * R * ring, ry = cy + Math.sin(a) * R * ring;\n          var x = e.hx, y = e.hy, sc = 1, p;\n          if (mode === 'start') {\n            if (t < 0.3) { x = rx; y = ry; sc = 1 - Math.pow(1 - t \/ 0.3, 2); }\n            else { p = ease((t - 0.3) \/ 0.7); x = rx + (e.hx - rx) * p; y = ry + (e.hy - ry) * p; }\n          } else {\n            if (t < 0.35) { p = easeInOut(t \/ 0.35); x = e.hx + (rx - e.hx) * p; y = e.hy + (ry - e.hy) * p; }\n            else if (t < 0.6) { x = rx; y = ry; }\n            else { p = ease((t - 0.6) \/ 0.4); x = rx + (e.hx - rx) * p; y = ry + (e.hy - ry) * p; }\n          }\n          e.el.style.transform = 'translate(' + (x - e.hx) + 'px,' + (y - e.hy) + 'px) scale(' + sc + ')';\n        }\n        if (mode === 'shuffle' && !midDone && t >= 0.45) { midDone = true; if (onMid) onMid(list); }\n        if (t < 1) requestAnimationFrame(frame);\n        else {\n          list.forEach(function (e) { e.el.style.transform = ''; });\n          boardEl.classList.remove('fx');\n          fxMode = null;\n          resolve();\n        }\n      }\n      requestAnimationFrame(frame);\n    });\n  }\n\n  \/* ---------- telas ---------- *\/\n  function showHome() {\n    playEl.classList.remove('on');\n    homeEl.classList.add('on');\n    bgEl.className = 'mtm-bg home';\n    bgEl.style.backgroundImage = 'url(\"' + bgUrl(save.level) + '\")';\n    renderHome();\n  }\n\n  function renderHome() {\n    \/\/ logo: 3 pe\u00e7as empilhadas\n    var logo = $('.mtm-logo');\n    logo.innerHTML = '';\n    [[8, 40, 0], [78, 40, 1], [43, 0, 2]].forEach(function (p) {\n      var el = makeTile(p[2], 64);\n      el.style.left = p[0] + 'px'; el.style.top = p[1] + 'px';\n      el.style.cursor = 'default';\n      logo.appendChild(el);\n    });\n\n    var hasProgress = save.level > 1 || save.score > 0 || !!save.session;\n    var title, sub;\n    if (save.finished) { title = TX.again; sub = tx('againSub', WEB_MAX); }\n    else if (hasProgress) { title = TX.cont; sub = tx('contSub', save.level); }\n    else { title = TX.start; sub = tx('startSub', WEB_MAX); }\n    var pts = save.session ? save.session.score : save.score;\n\n    var html =\n      card('play', 'play', 'var(--green)', title, sub) +\n      card('score', 'trophy', 'var(--orange)', TX.score, tx('scoreSub', save.level, pts));\n    if (save.finished && WEB_MAX < MAX_LEVELS) {\n      html += '<a class=\"mtm-card\" href=\"' + CFG.PLAY_STORE_URL + '\" target=\"_blank\" rel=\"noopener\">' +\n        icon('android', 'var(--primary)') + '<div class=\"mtm-card-t\"><b>' + TX.getApp + '<\/b><span>' + TX.getAppSub + '<\/span><\/div>' +\n        '<span class=\"mtm-chev\">' + svg('chev') + '<\/span><\/a>';\n    }\n    $('.mtm-cards').innerHTML = html;\n  }\n  function icon(name, color) {\n    return '<span class=\"mtm-ic\" style=\"background:color-mix(in srgb,' + color + ' 14%,transparent);color:' + color + '\">' + svg(name) + '<\/span>';\n  }\n  function card(act, ic, color, title, sub) {\n    return '<button class=\"mtm-card\" data-act=\"' + act + '\">' + icon(ic, color) +\n      '<div class=\"mtm-card-t\"><b>' + title + '<\/b><span>' + sub + '<\/span><\/div>' +\n      '<span class=\"mtm-chev\">' + svg('chev') + '<\/span><\/button>';\n  }\n\n  function openLevel(fresh) {\n    homeEl.classList.remove('on');\n    playEl.classList.add('on');\n    bgEl.className = 'mtm-bg';\n    bgEl.style.backgroundImage = 'url(\"' + bgUrl(G.level) + '\")';\n    shownScore = G.score;\n    busy = true;\n    requestAnimationFrame(function () {\n      renderAll();\n      circleFx('start').then(function () { busy = false; refreshBlocked(); });\n    });\n  }\n\n  function play() {\n    musicStarted = true;\n    startMusic();\n    if (save.finished) {\n      save.level = 1; save.score = 0; save.finished = false; save.session = null; persist();\n    }\n    if (save.session && save.session.level === save.level) loadSession(save.session);\n    else newGame(save.level, save.score);\n    openLevel();\n  }\n\n  \/* ---------- a\u00e7\u00f5es ---------- *\/\n  function locked() { return busy || fxMode !== null; }\n\n  function flyFrom(el, fromRect) {\n    if (!fromRect || !el.animate) return;\n    var to = el.getBoundingClientRect();\n    if (!to.width) return;\n    var dx = fromRect.left - to.left, dy = fromRect.top - to.top, k = fromRect.width \/ to.width;\n    el.classList.remove('mtm-in');\n    el.animate([\n      { transform: 'translate(' + dx + 'px,' + dy + 'px) scale(' + k + ')' },\n      { transform: 'translate(0,0) scale(1)' }\n    ], { duration: 220, easing: 'cubic-bezier(.2,.8,.2,1)' });\n  }\n\n  function tapBoard(id) {\n    if (locked() || trayFull()) return;\n    var t = null;\n    for (var i = 0; i < G.board.length; i++) if (G.board[i].id === id) { t = G.board[i]; break; }\n    if (!t || !isFree(t)) return;\n    sfx('tap'); vibrate(8);\n    var e = boardEls[id], from = e ? e.el.getBoundingClientRect() : null;\n    snapshot();\n    G.board.splice(G.board.indexOf(t), 1);\n    insertTray(t);\n    if (e) { e.el.remove(); delete boardEls[id]; }\n    refreshBlocked();\n    renderTray();\n    flyFrom(trayEls[t.id], from);\n    renderHeader(false);\n    resolveMove();\n  }\n\n  function tapStash(c) {\n    if (locked() || trayFull() || !G.stash[c].length) return;\n    sfx('tap'); vibrate(8);\n    var col = cols[c], last = col.lastChild, from = last ? last.getBoundingClientRect() : null;\n    snapshot();\n    var t = G.stash[c].pop();\n    insertTray(t);\n    renderStash();\n    renderTray();\n    flyFrom(trayEls[t.id], from);\n    renderHeader(false);\n    resolveMove();\n  }\n\n  function sleep(ms) { return new Promise(function (r) { setTimeout(r, ms); }); }\n\n  function resolveMove() {\n    var m = findMatch();\n    var chain = Promise.resolve();\n    if (m.length) {\n      busy = true;\n      chain = sleep(200).then(function () { return animateMatch(m); }).then(function () {\n        var ids = {}; m.forEach(function (t) { ids[t.id] = 1; });\n        G.tray = G.tray.filter(function (t) { return !ids[t.id]; });\n        G.score += MATCH_PTS;\n        m.forEach(function (t) { if (trayEls[t.id]) { trayEls[t.id].remove(); delete trayEls[t.id]; } });\n        renderTray();\n        renderHeader(true);\n        busy = false;\n      });\n    }\n    chain.then(function () {\n      saveSession();\n      if (isWon()) onWin();\n      else if (isLost()) onLose();\n    });\n  }\n\n  function animateMatch(m) {\n    var pos = m.map(function (t) { return G.tray.indexOf(t); }).sort(function (a, b) { return a - b; });\n    var mid = pos[1];\n    sfx('match'); vibrate(30);\n    var glow0 = 'drop-shadow(0 0 0 rgba(34,197,94,0))', glow = 'drop-shadow(0 0 9px rgba(34,197,94,.95))';\n    var anims = m.map(function (t) {\n      var el = trayEls[t.id];\n      if (!el || !el.animate) return sleep(700);\n      var d = (mid - G.tray.indexOf(t)) * (slot + GAP);\n      el.classList.remove('mtm-in');\n      el.style.zIndex = 5;\n      return el.animate([\n        { transform: 'translate(0,0) scale(1)', filter: glow0, opacity: 1, offset: 0 },\n        { transform: 'translate(0,-8px) scale(1.18)', filter: glow, opacity: 1, offset: 0.15 },\n        { transform: 'translate(0,0) scale(1)', filter: glow, opacity: 1, offset: 0.30, easing: 'ease-in-out' },\n        { transform: 'translate(' + d + 'px,0) scale(1.08)', filter: glow, opacity: 1, offset: 0.58, easing: 'ease-in' },\n        { transform: 'translate(' + d + 'px,0) scale(1.55)', filter: glow0, opacity: 0, offset: 1 }\n      ], { duration: 700, fill: 'forwards' }).finished;\n    });\n    setTimeout(function () { burst(mid); }, 400);\n    return Promise.all(anims);\n  }\n\n  function burst(mid) {\n    var b = document.createElement('div');\n    b.className = 'mtm-burst';\n    b.style.left = (slotLeft(mid) + slot \/ 2) + 'px';\n    b.style.top = (slot * ASPECT \/ 2) + 'px';\n    var html = '<div class=\"mtm-ring\"><\/div>';\n    var colors = ['#22C55E', '#F59E0B', '#2563EB', '#EF4444', '#8B5CF6'];\n    for (var i = 0; i < 16; i++) {\n      var a = 2 * Math.PI * i \/ 16 + Math.random() * 0.4;\n      var dist = slot * (0.9 + Math.random() * 0.9);\n      html += '<i class=\"mtm-part' + (i % 2 ? ' sq' : '') + '\" style=\"background:' + colors[i % colors.length] +\n        ';--dx:' + (Math.cos(a) * dist).toFixed(1) + 'px;--dy:' + (Math.sin(a) * dist + 14).toFixed(1) + 'px;--r:' + Math.round(Math.random() * 540) + 'deg\"><\/i>';\n    }\n    html += '<div class=\"mtm-plus\">+' + MATCH_PTS + '<\/div>';\n    b.innerHTML = html;\n    trayEl.appendChild(b);\n    setTimeout(function () { b.remove(); }, 900);\n  }\n\n  function onShuffle() {\n    if (locked()) return;\n    if (G.uses.shuffle <= 0) return noUses();\n    if (G.board.length < 2) return;\n    sfx('tap');\n    snapshot();\n    busy = true;\n    circleFx('shuffle', function (list) {\n      var types = shuffleArr(G.board.map(function (t) { return t.t; }));\n      G.board.forEach(function (t, i) { t.t = types[i]; });\n      list.forEach(function (e) { setTileType(e.el, e.t.t); });\n      G.uses.shuffle--;\n      renderHeader(false);\n    }).then(function () { busy = false; refreshBlocked(); saveSession(); });\n  }\n\n  function onRemove() {\n    if (locked()) return;\n    if (G.uses.remove <= 0) return noUses();\n    if (!G.tray.length) return toast(TX.emptyRow);\n    sfx('tap');\n    snapshot();\n    var take = G.tray.splice(0, 3);\n    take.forEach(function (t, i) { G.stash[i].push(t); });\n    G.uses.remove--;\n    renderTray(); renderStash(); renderHeader(false);\n    saveSession();\n  }\n\n  function onUndo() {\n    if (locked()) return;\n    if (G.uses.undo <= 0) return noUses();\n    if (!G.hist.length) return toast(TX.nothingUndo);\n    sfx('tap');\n    var s = JSON.parse(G.hist.pop());\n    G.board = s.b; G.tray = s.t; G.stash = s.s; G.score = s.sc;\n    G.uses.undo--;\n    \/\/ recria refer\u00eancias do tabuleiro\n    renderBoard(); renderStash(); renderTraySlots(); renderTray(); renderHeader(false);\n    saveSession();\n  }\n\n  function noUses() { sfx('error'); toast(TX.noUses); }\n\n  var toastT = 0;\n  function toast(msg) {\n    toastEl.textContent = msg;\n    toastEl.classList.add('on');\n    clearTimeout(toastT);\n    toastT = setTimeout(function () { toastEl.classList.remove('on'); }, 2000);\n  }\n\n  function restartLevel() {\n    if (locked()) return;\n    newGame(G.level, G.start);\n    openLevel();\n  }\n\n  \/* ---------- di\u00e1logos ---------- *\/\n  var modalResolve = null;\n  function modal(html) {\n    dlgEl.innerHTML = html;\n    modalEl.classList.add('on');\n    return new Promise(function (r) { modalResolve = r; });\n  }\n  function closeModal(v) {\n    modalEl.classList.remove('on');\n    var r = modalResolve; modalResolve = null;\n    if (r) r(v);\n  }\n  function badgeIc(name, color) {\n    return '<div class=\"mtm-badge-ic\" style=\"background:color-mix(in srgb,' + color + ' 14%,transparent);color:' + color + '\">' + svg(name) + '<\/div>';\n  }\n  function row(ic, label, value) { return '<div class=\"mtm-row\">' + svg(ic) + '<span>' + label + '<\/span><b>' + value + '<\/b><\/div>'; }\n  function btn(act, label, cls, ic) { return '<button class=\"mtm-btn ' + (cls || '') + '\" data-m=\"' + act + '\">' + (ic ? svg(ic) : '') + label + '<\/button>'; }\n  function storeBtn() { return '<a class=\"mtm-btn store\" href=\"' + CFG.PLAY_STORE_URL + '\" target=\"_blank\" rel=\"noopener\">' + svg('android') + TX.store + '<\/a>'; }\n\n  function onWin() {\n    sfx('victory'); vibrate(40);\n    var bonus = 100 + G.level * 10;\n    G.score += bonus;\n    renderHeader(true);\n    var lv = G.level, last = lv >= WEB_MAX;\n    save.score = G.score; save.session = null;\n    if (last) { save.finished = true; save.level = lv; } else { save.level = lv + 1; }\n    persist();\n\n    var html = badgeIc('trophy', 'var(--primary)') + '<h2>' + TX.congrats + '<\/h2>';\n    if (last) {\n      html += '<p class=\"sub\">' + (WEB_MAX < MAX_LEVELS ? TX.webDone : TX.allDone) + '<\/p>' +\n        row('plus', TX.bonus, '+' + bonus) + row('star', TX.total, G.score);\n      if (WEB_MAX < MAX_LEVELS) html += '<p class=\"body\">' + TX.webDoneBody + '<\/p>';\n      html += '<div class=\"mtm-acts\">' + (WEB_MAX < MAX_LEVELS ? storeBtn() : '') + btn('menu', TX.menu) + '<\/div>';\n    } else {\n      html += '<p class=\"sub\">' + tx('lvDone', lv) + '<\/p>' + row('plus', TX.bonus, '+' + bonus) + row('star', TX.total, G.score) +\n        (lv % 10 === 0 ? '<p class=\"mtm-note\">' + TX.newScene + '<\/p>' : '') +\n        '<div class=\"mtm-acts\">' + btn('next', TX.next, 'fill', 'chev') + btn('menu', TX.menu) + '<\/div>';\n    }\n    setTimeout(function () {\n      modal(html).then(function (v) {\n        if (v === 'next') { newGame(save.level, save.score); openLevel(); }\n        else showHome();\n      });\n    }, 350);\n  }\n\n  function onLose() {\n    sfx('error'); vibrate([30, 40, 30]);\n    var canUndo = G.uses.undo > 0 && G.hist.length > 0, canRemove = G.uses.remove > 0;\n    var html = badgeIc('block', 'var(--red)') + '<h2>' + TX.full + '<\/h2><p class=\"body\">' + TX.fullBody + '<\/p><div class=\"mtm-acts\">';\n    if (canUndo || canRemove) {\n      html += '<div class=\"mtm-two\">' + (canUndo ? btn('undo', TX.undo, 'line', 'undo') : '') + (canRemove ? btn('remove', TX.remove, 'line', 'upload') : '') + '<\/div>';\n    }\n    html += btn('retry', TX.retry, 'fill', 'refresh') + btn('menu', TX.menu) + '<\/div>';\n    modal(html).then(function (v) {\n      if (v === 'undo') onUndo();\n      else if (v === 'remove') onRemove();\n      else if (v === 'retry') restartLevel();\n      else showHome();\n    });\n  }\n\n  function openScore() {\n    var cleared = save.finished ? WEB_MAX : save.level - 1;\n    var pts = save.session ? save.session.score : save.score;\n    var html = badgeIc('trophy', 'var(--orange)') + '<h2>' + TX.score + '<\/h2>' +\n      '<div class=\"mtm-big\">' + pts + '<\/div><p class=\"body\" style=\"margin-top:0\">' + TX.points + '<\/p>' +\n      row('flag', TX.curLv, save.level + ' \/ ' + WEB_MAX) + row('check', TX.cleared, cleared + ' \/ ' + WEB_MAX) +\n      '<div class=\"mtm-prog\"><i style=\"width:' + (cleared \/ WEB_MAX * 100) + '%\"><\/i><\/div>' +\n      '<div class=\"mtm-acts\">' + btn('close', TX.close, 'fill') + btn('reset', TX.reset) + '<\/div>';\n    modal(html).then(function (v) {\n      if (v !== 'reset') return;\n      modal('<h2>' + TX.resetQ + '<\/h2><p class=\"body\">' + TX.resetBody + '<\/p><div class=\"mtm-acts\">' +\n        btn('ok', TX.resetOk, 'danger') + btn('no', TX.cancel) + '<\/div>').then(function (r) {\n        if (r === 'ok') { save.level = 1; save.score = 0; save.finished = false; save.session = null; persist(); }\n        showHome();\n      });\n    });\n  }\n\n  function openSettings() {\n    function sw(key, ic, label) { return '<button class=\"mtm-sw' + (save[key] ? ' on' : '') + '\" data-sw=\"' + key + '\">' + svg(ic) + '<span>' + label + '<\/span><i class=\"mtm-tg\"><\/i><\/button>'; }\n    modal('<h2>' + TX.settings + '<\/h2><div style=\"margin-top:12px\">' + sw('music', 'music', TX.music) + sw('sound', 'vol', TX.sound) + '<\/div>' +\n      '<div class=\"mtm-acts\">' + btn('close', TX.close, 'fill') + '<\/div>');\n  }\n\n  \/* ---------- eventos ---------- *\/\n  root.addEventListener('click', function (ev) {\n    var swEl = ev.target.closest('[data-sw]');\n    if (swEl) {\n      var k = swEl.getAttribute('data-sw');\n      save[k] = !save[k]; persist();\n      swEl.classList.toggle('on', save[k]);\n      if (k === 'music') { if (save.music) { musicStarted = true; startMusic(); } else stopMusic(); }\n      return;\n    }\n    var m = ev.target.closest('[data-m]');\n    if (m) { closeModal(m.getAttribute('data-m')); return; }\n    var a = ev.target.closest('[data-act]');\n    if (!a) return;\n    switch (a.getAttribute('data-act')) {\n      case 'play': play(); break;\n      case 'score': openScore(); break;\n      case 'settings': openSettings(); break;\n      case 'home': if (!locked()) { saveSession(); showHome(); } break;\n      case 'restart': restartLevel(); break;\n      case 'shuffle': onShuffle(); break;\n      case 'remove': onRemove(); break;\n      case 'undo': onUndo(); break;\n    }\n  });\n\n  \/\/ redimensionar (girar celular, janela)\n  var rzT = 0;\n  function onResize() {\n    clearTimeout(rzT);\n    rzT = setTimeout(function () {\n      if (!G || !playEl.classList.contains('on') || fxMode) return;\n      measure(); renderBoard(); renderStash(); renderTraySlots(); renderTray();\n    }, 120);\n  }\n  if (window.ResizeObserver) new ResizeObserver(onResize).observe(root);\n  else window.addEventListener('resize', onResize);\n\n  \/\/ pr\u00e9-carrega as imagens das pe\u00e7as\n  for (var p = 0; p < CFG.TILE_COUNT; p++) { var im = new Image(); im.src = tileUrl(p); }\n\n  measure();\n  showHome();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\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":3,"featured_media":0,"parent":5279,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-5422","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mutt Tile Match - Mutt Studio<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mutt Tile Match - Mutt Studio\" \/>\n<meta property=\"og:url\" content=\"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/\" \/>\n<meta property=\"og:site_name\" content=\"Mutt Studio\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/muttstudio\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-29T18:13:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@muttstudio\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/mutt-tile-match\\\/\",\"url\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/mutt-tile-match\\\/\",\"name\":\"Mutt Tile Match - Mutt Studio\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#website\"},\"datePublished\":\"2026-10-29T17:41:54+00:00\",\"dateModified\":\"2026-10-29T18:13:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/mutt-tile-match\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/mutt-tile-match\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/mutt-tile-match\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Games\",\"item\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/games\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Mutt Tile Match\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/\",\"name\":\"Mutt Studio\",\"description\":\"Resolvemos problemas com design e tecnologia.\",\"publisher\":{\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#organization\",\"name\":\"Mutt Studio\",\"url\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/muttstudio.com.br\\\/wp-content\\\/uploads\\\/2022\\\/11\\\/logo-muttstudio-oficial-sem-fundo.svg\",\"contentUrl\":\"https:\\\/\\\/muttstudio.com.br\\\/wp-content\\\/uploads\\\/2022\\\/11\\\/logo-muttstudio-oficial-sem-fundo.svg\",\"caption\":\"Mutt Studio\"},\"image\":{\"@id\":\"https:\\\/\\\/muttstudio.com.br\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/muttstudio\",\"https:\\\/\\\/x.com\\\/muttstudio\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/muttstudio\",\"https:\\\/\\\/www.behance.net\\\/MuttStudio\",\"https:\\\/\\\/www.youtube.com\\\/@muttstudio\",\"https:\\\/\\\/www.instagram.com\\\/muttstudio\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mutt Tile Match - Mutt Studio","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/","og_locale":"en_US","og_type":"article","og_title":"Mutt Tile Match - Mutt Studio","og_url":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/","og_site_name":"Mutt Studio","article_publisher":"https:\/\/www.facebook.com\/muttstudio","article_modified_time":"2026-10-29T18:13:07+00:00","twitter_card":"summary_large_image","twitter_site":"@muttstudio","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/","url":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/","name":"Mutt Tile Match - Mutt Studio","isPartOf":{"@id":"https:\/\/muttstudio.com.br\/en\/#website"},"datePublished":"2026-10-29T17:41:54+00:00","dateModified":"2026-10-29T18:13:07+00:00","breadcrumb":{"@id":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/muttstudio.com.br\/en\/games\/mutt-tile-match\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/muttstudio.com.br\/en\/"},{"@type":"ListItem","position":2,"name":"Games","item":"https:\/\/muttstudio.com.br\/en\/games\/"},{"@type":"ListItem","position":3,"name":"Mutt Tile Match"}]},{"@type":"WebSite","@id":"https:\/\/muttstudio.com.br\/en\/#website","url":"https:\/\/muttstudio.com.br\/en\/","name":"Mutt Studio","description":"Resolvemos problemas com design e tecnologia.","publisher":{"@id":"https:\/\/muttstudio.com.br\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/muttstudio.com.br\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/muttstudio.com.br\/en\/#organization","name":"Mutt Studio","url":"https:\/\/muttstudio.com.br\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/muttstudio.com.br\/en\/#\/schema\/logo\/image\/","url":"https:\/\/muttstudio.com.br\/wp-content\/uploads\/2022\/11\/logo-muttstudio-oficial-sem-fundo.svg","contentUrl":"https:\/\/muttstudio.com.br\/wp-content\/uploads\/2022\/11\/logo-muttstudio-oficial-sem-fundo.svg","caption":"Mutt Studio"},"image":{"@id":"https:\/\/muttstudio.com.br\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/muttstudio","https:\/\/x.com\/muttstudio","https:\/\/www.linkedin.com\/company\/muttstudio","https:\/\/www.behance.net\/MuttStudio","https:\/\/www.youtube.com\/@muttstudio","https:\/\/www.instagram.com\/muttstudio\/"]}]}},"_links":{"self":[{"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/pages\/5422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/comments?post=5422"}],"version-history":[{"count":3,"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/pages\/5422\/revisions"}],"predecessor-version":[{"id":5425,"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/pages\/5422\/revisions\/5425"}],"up":[{"embeddable":true,"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/pages\/5279"}],"wp:attachment":[{"href":"https:\/\/muttstudio.com.br\/en\/wp-json\/wp\/v2\/media?parent=5422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}