(function () { 'use strict'; var METAS_URL = 'https://raw.githubusercontent.com/FNTDUG/characters.json/refs/heads/main/metas.json'; var UNITS_URL = 'https://raw.githubusercontent.com/FNTDUG/characters.json/refs/heads/main/json'; if (!document.getElementById('metaGFonts')) { var lnk = document.createElement('link'); lnk.id = 'metaGFonts'; lnk.rel = 'stylesheet'; lnk.href = 'https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'; (document.head || document.documentElement).appendChild(lnk); } if (!document.querySelector('meta[name="viewport"]')) { var vpm = document.createElement('meta'); vpm.name = 'viewport'; vpm.content = 'width=device-width, initial-scale=1'; (document.head || document.documentElement).appendChild(vpm); } if (!document.getElementById('metaCSS')) { var CSS = [ '@keyframes metaShiny{0%{background-position:0% 50%}100%{background-position:200% 50%}}', '.metaRoot{width:100vw;position:relative;left:50%;transform:translateX(-50%);' + 'background-size:cover;background-position:center;background-repeat:no-repeat;' + 'color:#fff;font-family:"Press Start 2P",monospace;box-sizing:border-box;' + 'padding:clamp(14px,2.5vw,28px) clamp(8px,1.5vw,16px) clamp(18px,3vw,36px);' + 'border:1px solid rgba(246,155,85,1);margin-bottom:15px}', '.metaRoot *{box-sizing:border-box}', '.metaTitle{font-family:"Press Start 2P",monospace;font-size:clamp(14px,3vw,36px);' + 'color:#fff;text-align:center;margin:0 0 clamp(8px,1.5vw,16px);padding:4px 8px;' + 'line-height:1.35;word-break:break-word;' + 'text-shadow:0 2px 10px rgba(0,0,0,0.95),0 0 2px rgba(0,0,0,1)}', '.metaControls{display:flex;justify-content:flex-end;margin-bottom:6px}', '.metaRow{display:grid;grid-template-columns:repeat(6,1fr);' + 'gap:clamp(4px,1.2vw,10px);padding:4px 0}', '.metaFooter{display:flex;flex-direction:column;align-items:center;' + 'gap:clamp(6px,1vw,10px);margin-top:clamp(10px,2vw,26px)}', '.metaLogo{width:clamp(40px,5vw,64px);height:clamp(40px,5vw,64px);' + 'border-radius:50%;object-fit:cover;display:block}', '.metaSiteUrl{font-family:"Press Start 2P",monospace;font-size:clamp(8px,1.1vw,13px);' + 'color:#fff;text-align:center;text-shadow:0 1px 6px rgba(0,0,0,0.95)}', /* seamless — ~30% smaller than the original values */ '.seamlessRoot{width:100vw;position:relative;left:50%;transform:translateX(-50%);' + 'background-size:cover;background-position:center;background-repeat:no-repeat;' + 'color:#fff;font-family:"Press Start 2P",monospace;box-sizing:border-box;' + 'padding:clamp(8px,1.4vw,17px) 0 clamp(10px,1.75vw,20px);' + 'border:1px solid rgba(246,155,85,1);margin-bottom:5px;overflow:hidden}', '.seamlessRoot *{box-sizing:border-box}', '.seamlessHeader{display:flex;align-items:center;justify-content:center;' + 'gap:clamp(6px,1vw,14px);' + 'padding:0 clamp(6px,1.05vw,11px);margin-bottom:3px;' + 'min-height:clamp(32px,4.9vw,56px)}', '.seamlessLogo{flex-shrink:0;' + 'width:clamp(38px,5.8vw,70px);height:clamp(38px,5.8vw,70px);' + 'border-radius:50%;object-fit:cover}', '.seamlessSiteName{font-family:"Press Start 2P",monospace;' + 'font-size:clamp(16px,3.5vw,48px);color:#fff;line-height:1.2;text-align:center;' + 'text-shadow:0 2px 10px rgba(0,0,0,0.95)}', '.seamlessSiteUrl{font-family:"Press Start 2P",monospace;' + 'font-size:clamp(7px,1.1vw,13px);color:#fff;text-align:center;' + 'padding:0 clamp(6px,1.05vw,11px);' + 'margin-bottom:clamp(4px,0.7vw,8px);text-shadow:0 1px 4px rgba(0,0,0,0.9)}', '.seamlessPageTitle{font-family:"Press Start 2P",monospace;' + 'font-size:clamp(11px,2.24vw,28px);color:#00e5ff;text-align:center;' + 'background:rgba(0,180,230,0.12);' + 'padding:clamp(4px,0.7vw,8px) clamp(6px,1.05vw,11px);' + 'margin:0 0 clamp(2px,0.4vw,4px);' + 'text-shadow:0 0 18px rgba(0,220,255,0.55),0 2px 8px rgba(0,0,0,0.8)}', '.seamlessSection{padding:0 clamp(6px,1.05vw,11px);margin-top:clamp(2px,0.3vw,4px)}', '.seamlessSectionTitle{font-family:"Press Start 2P",monospace;' + 'font-size:clamp(10px,1.82vw,24px);color:#fff;text-align:center;' + 'margin:0 0 clamp(3px,0.56vw,7px);' + 'text-shadow:0 2px 10px rgba(0,0,0,0.95),0 0 2px rgba(0,0,0,1)}', '.seamlessControls{display:flex;justify-content:center;' + 'padding:clamp(3px,0.56vw,6px) clamp(6px,1.05vw,11px) clamp(4px,0.7vw,7px)}', '.seamlessControls .meta-clutter-btn{font-size:clamp(5px,0.7vw,8px);' + 'padding:clamp(3px,0.42vw,6px) clamp(6px,0.84vw,11px)}', /* page switcher tabs — only rendered when pages.length > 1 */ '.seamlessPageTabBar{display:flex;flex-wrap:wrap;justify-content:center;gap:5px;' + 'padding:clamp(3px,0.5vw,6px) clamp(6px,1.05vw,11px) clamp(5px,0.8vw,9px)}', '.seamlessPageTab{font-family:"Press Start 2P",monospace;font-size:clamp(5px,0.8vw,9px);' + 'padding:clamp(3px,0.5vw,6px) clamp(7px,1vw,12px);' + 'background:rgba(0,0,0,0.5);border:1px solid rgba(246,155,85,0.35);' + 'color:rgba(255,255,255,0.4);border-radius:4px;cursor:pointer;' + 'transition:all .15s;user-select:none}', '.seamlessPageTab:hover{background:rgba(246,155,85,0.1);border-color:rgba(246,155,85,0.7);color:rgba(255,255,255,0.8)}', '.seamlessPageTab.seamlessPageTabActive{background:rgba(246,155,85,0.18);border-color:rgba(246,155,85,1);color:#ffa45b}', '.meta-card{width:100%;aspect-ratio:1/1;' + 'border-radius:12px;padding:3px;position:relative;cursor:default}', '.meta-card.meta-shiny{background-size:200% 200%;animation:metaShiny 6s linear infinite}', '.meta-card-inner{position:relative;width:100%;height:100%;' + 'border-radius:9px;overflow:hidden;background:rgba(34,34,34,0.85)}', '.meta-card-img{width:100%;height:100%;object-fit:cover;object-position:center top;' + 'display:block;pointer-events:none}', '.meta-byte{position:absolute;top:2px;right:2px;z-index:2;aspect-ratio:1/1;' + 'width:clamp(16px,28%,54px);border-radius:9px;padding:2px;pointer-events:none}', '.meta-byte.meta-shiny{background-size:200% 200%;animation:metaShiny 6s linear infinite}', '.meta-byte-inner{width:100%;height:100%;border-radius:7px;overflow:hidden;background:rgba(34,34,34,0.85)}', '.meta-byte-inner img{width:100%;height:100%;object-fit:cover;display:block}', '.meta-enchant{position:absolute;top:2px;left:2px;z-index:2;aspect-ratio:1/1;' + 'width:clamp(14px,24%,48px);border-radius:8px;padding:2px;pointer-events:none}', '.meta-enchant-inner{width:100%;height:100%;border-radius:6px;overflow:hidden;background:rgba(34,34,34,0.85)}', '.meta-enchant-inner img{width:100%;height:100%;object-fit:cover;display:block}', '.meta-replacement{position:absolute;bottom:2px;right:2px;z-index:2;aspect-ratio:1/1;' + 'width:clamp(16px,28%,54px);border-radius:9px;padding:2px;pointer-events:none}', '.meta-replacement.meta-shiny{background-size:200% 200%;animation:metaShiny 6s linear infinite}', '.meta-replacement-inner{width:100%;height:100%;border-radius:7px;overflow:hidden;background:rgba(34,34,34,0.85)}', '.meta-replacement-inner img{width:100%;height:100%;object-fit:cover;object-position:center top;display:block}', '.meta-label{position:absolute;bottom:2px;left:2px;padding:2px;' + 'border-radius:5px;pointer-events:none;z-index:2}', '.meta-label-inner{background:rgba(0,0,0,0.88);color:#39ff14;' + 'font-family:"Press Start 2P",monospace;' + 'font-size:clamp(5px,0.9vw,9px);padding:3px 6px;border-radius:3px;display:block}', '.meta-slot{display:flex;flex-direction:column;align-items:center;gap:clamp(3px,0.6vw,7px)}', '.meta-caption{font-family:"Press Start 2P",monospace;font-size:clamp(5px,0.85vw,10px);' + 'color:#fff;text-align:center;width:100%;line-height:1.5;' + 'word-break:break-word;text-shadow:0 1px 4px rgba(0,0,0,0.9);user-select:none}', '.metaControls{display:flex;justify-content:flex-end;margin-bottom:6px}', '.meta-clutter-btn{font-family:"Press Start 2P",monospace;font-size:7px;' + 'padding:4px 8px;background:rgba(0,0,0,0.65);' + 'border:1px solid rgba(246,155,85,0.75);color:#ffa45b;' + 'border-radius:4px;cursor:pointer;user-select:none;transition:opacity .15s,border-color .15s,color .15s}', '.meta-clutter-btn:hover{background:rgba(246,155,85,0.12)}', '.meta-clutter-btn.cltr-off{border-color:rgba(255,255,255,0.2);color:rgba(255,255,255,0.3)}', '.meta-clutter-off .meta-byte,' + '.meta-clutter-off .meta-enchant,' + '.meta-clutter-off .meta-replacement,' + '.meta-clutter-off .meta-label{display:none!important}', '#metaTip{position:fixed;pointer-events:none;opacity:0;transition:opacity .18s;' + 'z-index:10000;display:none;padding:2px;border-radius:8px}', '#metaTipInner{font-family:"Press Start 2P",monospace;font-size:10px;line-height:1.8;' + 'background:rgba(6,3,18,0.97);color:#fff;padding:14px 18px;border-radius:8px;' + 'text-align:left;max-width:300px;word-break:normal;overflow-wrap:break-word}', '.mt-name{font-size:13px;color:#fff;text-align:center;display:block;margin-bottom:6px}', '.mt-sep{border:none;border-top:1px solid rgba(255,255,255,0.18);margin:7px 0}', '.mt-row{display:flex;align-items:center;gap:9px;margin-top:7px}', '.mt-icon{width:36px;height:36px;border-radius:6px;padding:2px;flex-shrink:0}', '.mt-icon.meta-shiny{background-size:200% 200%;animation:metaShiny 6s linear infinite}', '.mt-icon-in{width:100%;height:100%;border-radius:4px;overflow:hidden;background:rgba(34,34,34,0.85)}', '.mt-icon-in img{width:100%;height:100%;object-fit:cover;display:block}', '.mt-text{font-size:9.5px;opacity:0.9;line-height:1.5;white-space:pre-line}', '@media(min-width:901px){' + '.seamlessRoot{padding:clamp(5px,0.9vw,11px) 0 clamp(6px,1.12vw,13px)}' + '.seamlessHeader{gap:clamp(4px,0.64vw,9px);padding:0 clamp(4px,0.67vw,7px);min-height:clamp(21px,3.12vw,36px);margin-bottom:1px}' + '.seamlessLogo{width:clamp(24px,3.68vw,45px);height:clamp(24px,3.68vw,45px)}' + '.seamlessSiteName{font-size:clamp(10px,2.24vw,30px)}' + '.seamlessSiteUrl{font-size:clamp(5px,0.7vw,8px);padding:0 clamp(4px,0.67vw,7px);margin-bottom:clamp(2px,0.45vw,5px)}' + '.seamlessPageTitle{font-size:clamp(7px,1.43vw,18px);padding:clamp(2px,0.45vw,5px) clamp(4px,0.67vw,7px);margin:0 0 2px}' + '.seamlessSection{padding:0 clamp(8px,1.5vw,16px);margin-top:2px}' + '.seamlessSectionTitle{font-size:clamp(6px,1.17vw,15px);margin:0 0 clamp(2px,0.36vw,5px)}' + '.seamlessControls{padding:clamp(2px,0.36vw,4px) clamp(4px,0.67vw,7px) clamp(2px,0.45vw,5px)}' + '.seamlessControls .meta-clutter-btn{font-size:clamp(5px,0.7vw,8px);padding:clamp(3px,0.42vw,6px) clamp(6px,0.84vw,11px)}' + '.seamlessPageTabBar{gap:5px;padding:clamp(3px,0.5vw,6px) clamp(6px,1.05vw,11px) clamp(5px,0.8vw,9px)}' + '.seamlessPageTab{font-size:clamp(5px,0.8vw,9px);padding:clamp(3px,0.5vw,6px) clamp(7px,1vw,12px)}' + '}', '@media(max-width:900px){' + '.metaRoot{padding-left:4px;padding-right:4px}' + '.metaRow{gap:3px}' + '.seamlessSection .metaRow{gap:3px}' + '.seamlessControls .meta-clutter-btn{font-size:7px;padding:4px 8px}' + '.seamlessHeader{min-height:clamp(30px,5vw,46px);margin-bottom:2px}' + '.seamlessLogo{width:clamp(30px,5vw,46px);height:clamp(30px,5vw,46px)}' + '.seamlessSiteName{font-size:clamp(20px,4.5vw,42px)}' + '.seamlessSiteUrl{margin-bottom:3px}' + '.meta-card{padding:2px;border-radius:8px}' + '.meta-card-inner{border-radius:6px}' + '.meta-byte{top:2px;right:2px;padding:1px;border-radius:6px}' + '.meta-byte-inner{border-radius:5px}' + '.meta-enchant{top:2px;left:2px;padding:1px;border-radius:6px}' + '.meta-enchant-inner{border-radius:5px}' + '.meta-replacement{bottom:2px;right:2px;padding:1px;border-radius:6px}' + '.meta-replacement-inner{border-radius:5px}' + '.meta-label{bottom:2px;left:2px;padding:1px}' + '.meta-label-inner{border-radius:2px}' + '}', '@media(max-width:600px){' + '#metaTipInner{font-size:7px;padding:7px 9px;max-width:190px}' + '.mt-name{font-size:8px;margin-bottom:4px}' + '.mt-sep{margin:4px 0}' + '.mt-row{gap:5px;margin-top:4px}' + '.mt-icon{width:20px;height:20px}' + '.mt-text{font-size:6px}' + '.meta-label-inner{font-size:5px;padding:2px 4px}' + '}' ].join(''); var styleEl = document.createElement('style'); styleEl.id = 'metaCSS'; styleEl.textContent = CSS; (document.head || document.documentElement).appendChild(styleEl); } var tip, tipInner; if (!document.getElementById('metaTip')) { tip = document.createElement('div'); tip.id = 'metaTip'; tipInner = document.createElement('div'); tipInner.id = 'metaTipInner'; tip.appendChild(tipInner); document.body.appendChild(tip); } else { tip = document.getElementById('metaTip'); tipInner = document.getElementById('metaTipInner'); } var RARITY = { uncommon: 'linear-gradient(90deg,#5CFF4D,#3FFF8F)', rare: 'linear-gradient(90deg,#58A6FF,#1C3AA0)', epic: 'linear-gradient(90deg,#FF35FF,#87009F)', mythic: 'linear-gradient(90deg,#FFB81F,#FFFF00)', exclusive: 'linear-gradient(180deg,rgb(140,255,203) 0%,rgb(20,115,91) 25.1%,rgb(51,231,255) 50%,rgb(20,68,112) 68%,rgb(21,74,118) 74.6%,rgb(79,164,255) 100%)', secret: 'linear-gradient(90deg,#FF8800,#FF0C0C)', nightmare: 'linear-gradient(90deg,#492590,#2A1E42)', apex: 'linear-gradient(90deg,#9D0078,#0063F8)', hero: 'linear-gradient(90deg,#FFCD19,#353815,#FFFB85)', radiant: 'linear-gradient(90deg,#FF6600,#FFCC33)' }; var SHINY = { 'Astral Bonnie': 'linear-gradient(90deg,#ffeb3b,#ff9800,#f44336,#9c27b0,#2196f3,#4caf50,#ffeb3b)', 'Frozen King Foxy': 'linear-gradient(90deg,#ff85a2,#ffc107,#e91e63,#9c27b0,#ff85a2)', 'Dragon Endo 01': 'linear-gradient(90deg,#4a00e0,#6e25ff,#1e0066,#6e25ff,#4a00e0)', 'Kronos Endo Freddy': 'linear-gradient(90deg,#00ffff,#17a2b8,#000,#17a2b8,#00ffff)', 'Headless Horseman Mangle':'linear-gradient(90deg,#50f2d0,#42a2f8,#1c734d,#8b5cf6,#000,#1c734d,#50f2d0)', 'Hacker King RWQFSFASXC': 'linear-gradient(90deg,#000,#ff3131,#000,#ff3131,#000)', 'Scooped Michael': 'linear-gradient(90deg,#a020f0,#6a0dad,#000,#bf00ff,#7d26cd)', 'Yeti Oni Bonnie': 'linear-gradient(90deg,#5bb9ff,#fff,#2b70d9,#000,#2b70d9,#5bb9ff)', 'Plushtrap': 'linear-gradient(90deg,#000,#555,#aaa,#555,#000)' }; var SHINY_DEF = 'linear-gradient(90deg,red,orange,yellow,lime,cyan,blue,magenta,red)'; function getRarityBg(name, rar) { if (rar === 'shiny') return SHINY[name] || SHINY_DEF; return RARITY[rar] || '#888888'; } var unitMap = {}; var unitMapReady = false; function showTip(card, unitCfg, u, META_CFG) { var rar = (u.rarity || '').toLowerCase(), sh = rar === 'shiny'; tip.style.background = getRarityBg(unitCfg.name, rar); tip.style.backgroundSize = sh ? '200% 200%' : ''; tip.style.animation = sh ? 'metaShiny 6s linear infinite' : ''; tipInner.innerHTML = ''; var nameEl = document.createElement('span'); nameEl.className = 'mt-name'; nameEl.textContent = unitCfg.name; tipInner.appendChild(nameEl); var sep = document.createElement('hr'); sep.className = 'mt-sep'; tipInner.appendChild(sep); function tipRow(iconBg, iconSh, iconSrc, label) { var row = document.createElement('div'); row.className = 'mt-row'; var ic = document.createElement('div'); ic.className = 'mt-icon' + (iconSh ? ' meta-shiny' : ''); ic.style.background = iconBg; if (iconSh) ic.style.backgroundSize = '200% 200%'; var inn = document.createElement('div'); inn.className = 'mt-icon-in'; var im = document.createElement('img'); im.src = iconSrc; im.alt = ''; inn.appendChild(im); ic.appendChild(inn); var tx = document.createElement('div'); tx.className = 'mt-text'; tx.textContent = label; row.appendChild(ic); row.appendChild(tx); return row; } var byteData = META_CFG.bytes[unitCfg.byte]; if (byteData) { var bR = (byteData.rarity || '').toLowerCase(); tipInner.appendChild(tipRow(getRarityBg(unitCfg.byte, bR), bR === 'shiny', byteData.url, 'Byte: ' + unitCfg.byte + (byteData.note ? '\n' + byteData.note : ''))); } var enchData = META_CFG.enchants[unitCfg.enchant]; if (enchData) { tipInner.appendChild(tipRow(enchData.color, false, enchData.url, 'Enchant: ' + unitCfg.enchant)); } var role = u.role || u.type || ''; if (role) { var rRow = document.createElement('div'); rRow.className = 'mt-row'; var rTx = document.createElement('div'); rTx.className = 'mt-text'; rTx.textContent = 'Role: ' + role; rRow.appendChild(rTx); tipInner.appendChild(rRow); } if (unitCfg.replacement) { var rrU = unitMap[unitCfg.replacement] || {}; var rrR = (rrU.rarity || '').toLowerCase(); tipInner.appendChild(tipRow(getRarityBg(unitCfg.replacement, rrR), rrR === 'shiny', rrU.img || '', 'Alt: ' + unitCfg.replacement)); } tip.style.display = 'block'; tip.style.opacity = '0'; var r = card.getBoundingClientRect(); var tw = tip.offsetWidth, th = tip.offsetHeight; var left = Math.max(4, Math.min(r.left + r.width / 2 - tw / 2, window.innerWidth - tw - 4)); var top = r.bottom + 6; if (top + th > window.innerHeight - 4) top = r.top - th - 6; tip.style.left = left + 'px'; tip.style.top = top + 'px'; tip.style.opacity = '1'; } function hideTip() { tip.style.opacity = '0'; tip.style.display = 'none'; } function makeClutterBtn(container) { var on = true; var btn = document.createElement('button'); btn.className = 'meta-clutter-btn'; btn.textContent = 'ICONS'; btn.addEventListener('click', function () { on = !on; container.classList.toggle('meta-clutter-off', !on); btn.classList.toggle('cltr-off', !on); }); return btn; } function buildCardRow(row, META_CFG) { function renderCards() { row.innerHTML = ''; META_CFG.units.forEach(function (unitCfg) { var u = unitMap[unitCfg.name] || {}; var rar = (u.rarity || '').toLowerCase(), isShiny = rar === 'shiny'; var bg = getRarityBg(unitCfg.name, rar); var card = document.createElement('div'); card.className = 'meta-card' + (isShiny ? ' meta-shiny' : ''); card.style.background = bg; var inner = document.createElement('div'); inner.className = 'meta-card-inner'; var img = document.createElement('img'); img.className = 'meta-card-img'; img.src = u.img || ''; img.alt = unitCfg.name; img.draggable = false; img.loading = 'lazy'; img.onerror = function () { this.style.cssText = 'width:100%;height:100%;display:block'; this.removeAttribute('src'); }; inner.appendChild(img); var enchData = META_CFG.enchants[unitCfg.enchant]; if (enchData) { var eW = document.createElement('div'); eW.className = 'meta-enchant'; eW.style.background = enchData.color; var eI = document.createElement('div'); eI.className = 'meta-enchant-inner'; var eM = document.createElement('img'); eM.src = enchData.url; eM.alt = unitCfg.enchant; eI.appendChild(eM); eW.appendChild(eI); inner.appendChild(eW); } var byteData = META_CFG.bytes[unitCfg.byte]; if (byteData) { var bR = (byteData.rarity || '').toLowerCase(), bSh = bR === 'shiny'; var bW = document.createElement('div'); bW.className = 'meta-byte' + (bSh ? ' meta-shiny' : ''); bW.style.background = getRarityBg(unitCfg.byte, bR); if (bSh) bW.style.backgroundSize = '200% 200%'; var bI = document.createElement('div'); bI.className = 'meta-byte-inner'; var bM = document.createElement('img'); bM.src = byteData.url; bM.alt = unitCfg.byte; bI.appendChild(bM); bW.appendChild(bI); inner.appendChild(bW); } if (unitCfg.replacement) { var rU = unitMap[unitCfg.replacement] || {}, rR = (rU.rarity || '').toLowerCase(), rSh = rR === 'shiny'; var rW = document.createElement('div'); rW.className = 'meta-replacement' + (rSh ? ' meta-shiny' : ''); rW.style.background = getRarityBg(unitCfg.replacement, rR); if (rSh) rW.style.backgroundSize = '200% 200%'; var rI = document.createElement('div'); rI.className = 'meta-replacement-inner'; var rM = document.createElement('img'); rM.src = rU.img || ''; rM.alt = unitCfg.replacement; rM.draggable = false; rM.loading = 'lazy'; rI.appendChild(rM); rW.appendChild(rI); inner.appendChild(rW); } if (unitCfg.label) { var lO = document.createElement('div'); lO.className = 'meta-label' + (isShiny ? ' meta-shiny' : ''); lO.style.background = bg; if (isShiny) lO.style.backgroundSize = '200% 200%'; var lI = document.createElement('div'); lI.className = 'meta-label-inner'; lI.textContent = unitCfg.label; lO.appendChild(lI); inner.appendChild(lO); } card.appendChild(inner); (function (c, cfg, data) { c.addEventListener('mouseenter', function () { showTip(c, cfg, data, META_CFG); }); c.addEventListener('mouseleave', hideTip); }(card, unitCfg, u)); var slot = document.createElement('div'); slot.className = 'meta-slot'; slot.appendChild(card); if (unitCfg.caption) { var cap = document.createElement('div'); cap.className = 'meta-caption'; cap.textContent = unitCfg.caption; slot.appendChild(cap); } row.appendChild(slot); }); } renderCards(); return renderCards; } function renderMeta(mountEl, META_CFG) { var root = document.createElement('div'); root.className = 'metaRoot'; root.style.backgroundImage = 'url(' + META_CFG.background + ')'; var titleEl = document.createElement('div'); titleEl.className = 'metaTitle'; titleEl.textContent = META_CFG.title; root.appendChild(titleEl); var controls = document.createElement('div'); controls.className = 'metaControls'; controls.appendChild(makeClutterBtn(root)); root.appendChild(controls); var row = document.createElement('div'); row.className = 'metaRow'; root.appendChild(row); var footer = document.createElement('div'); footer.className = 'metaFooter'; if (META_CFG.logoUrl) { var logoEl = document.createElement('img'); logoEl.className = 'metaLogo'; logoEl.src = META_CFG.logoUrl; logoEl.alt = ''; footer.appendChild(logoEl); } var siteEl = document.createElement('div'); siteEl.className = 'metaSiteUrl'; siteEl.textContent = META_CFG.siteUrl; footer.appendChild(siteEl); root.appendChild(footer); mountEl.appendChild(root); return buildCardRow(row, META_CFG); } function renderSeamless(mountEl, metasData) { var shared = metasData.shared || {}; var seamCfg = metasData.seamless || {}; if (seamCfg === true) seamCfg = {}; /* support old format (single pageTitle+order) and new format (pages array) */ var pages = seamCfg.pages; if (!pages || !pages.length) { pages = [{ pageTitle: seamCfg.pageTitle, pageNote: seamCfg.pageNote, order: seamCfg.order }]; } var root = document.createElement('div'); root.className = 'seamlessRoot'; root.style.backgroundImage = 'url(' + (shared.background || '') + ')'; /* ── fixed header ── */ var header = document.createElement('div'); header.className = 'seamlessHeader'; if (shared.logoUrl) { var logo = document.createElement('img'); logo.className = 'seamlessLogo'; logo.src = shared.logoUrl; logo.alt = ''; header.appendChild(logo); } var siteName = document.createElement('div'); siteName.className = 'seamlessSiteName'; siteName.textContent = seamCfg.siteName || 'FNTD USER GUIDE'; header.appendChild(siteName); root.appendChild(header); if (shared.siteUrl) { var siteUrlEl = document.createElement('div'); siteUrlEl.className = 'seamlessSiteUrl'; siteUrlEl.textContent = shared.siteUrl; root.appendChild(siteUrlEl); } var controls = document.createElement('div'); controls.className = 'seamlessControls'; controls.appendChild(makeClutterBtn(root)); root.appendChild(controls); /* ── page-switcher tab bar (only when multiple pages) ── */ var tabBar = null; var pageWrappers = []; var reRenders = []; if (pages.length > 1) { tabBar = document.createElement('div'); tabBar.className = 'seamlessPageTabBar'; root.appendChild(tabBar); } pages.forEach(function (page, pageIdx) { /* wrapper holds the pageTitle + all sections for this page */ var wrap = document.createElement('div'); if (pageIdx > 0) wrap.style.display = 'none'; pageWrappers.push(wrap); if (page.pageTitle) { var ptEl = document.createElement('div'); ptEl.className = 'seamlessPageTitle'; ptEl.textContent = page.pageTitle; wrap.appendChild(ptEl); } if (page.pageNote) { var pnEl = document.createElement('div'); pnEl.className = 'seamlessPageNote'; pnEl.textContent = page.pageNote; wrap.appendChild(pnEl); } var order = page.order || Object.keys(metasData.metas || {}); order.forEach(function (metaName) { var cfg = metasData.metas && metasData.metas[metaName]; if (!cfg) return; var section = document.createElement('div'); section.className = 'seamlessSection'; var titleEl = document.createElement('div'); titleEl.className = 'seamlessSectionTitle'; titleEl.textContent = metaName; section.appendChild(titleEl); var row = document.createElement('div'); row.className = 'metaRow'; section.appendChild(row); wrap.appendChild(section); var META_CFG = { title: metaName, logoUrl: '', siteUrl: '', background: '', bytes: shared.bytes || {}, enchants: shared.enchants || {}, units: cfg.units || [] }; reRenders.push(buildCardRow(row, META_CFG)); }); root.appendChild(wrap); /* build the tab button for this page */ if (tabBar) { var tab = document.createElement('button'); tab.className = 'seamlessPageTab' + (pageIdx === 0 ? ' seamlessPageTabActive' : ''); tab.textContent = page.pageTitle || ('List ' + (pageIdx + 1)); (function (i) { tab.addEventListener('click', function () { pageWrappers.forEach(function (w, j) { w.style.display = j === i ? '' : 'none'; }); var tabs = tabBar.querySelectorAll('.seamlessPageTab'); for (var k = 0; k < tabs.length; k++) tabs[k].classList.toggle('seamlessPageTabActive', k === i); }); }(pageIdx)); tabBar.appendChild(tab); } }); mountEl.appendChild(root); return reRenders; } var metasData = null; var activeReRenders = []; function renderAllMounts() { var mounts = Array.prototype.slice.call( document.querySelectorAll('.metaMount[data-meta], .metaMount[data-seamless], #tlMount[data-meta]') ); mounts.forEach(function (mountEl) { if (mountEl.getAttribute('data-rendered')) return; mountEl.setAttribute('data-rendered', '1'); if (mountEl.hasAttribute('data-seamless')) { var rrs = renderSeamless(mountEl, metasData || { shared: {}, metas: {}, seamless: {} }); rrs.forEach(function (fn) { activeReRenders.push(fn); if (unitMapReady) fn(); }); return; } var name = mountEl.getAttribute('data-meta'); var cfg = metasData && metasData.metas && metasData.metas[name]; if (!cfg) { var err = document.createElement('div'); err.style.cssText = 'color:#ffa45b;font-family:monospace;padding:10px;font-size:12px'; err.textContent = 'Meta "' + name + '" not found in metas.json'; mountEl.appendChild(err); return; } var shared = (metasData && metasData.shared) || {}; var META_CFG = { title: name, logoUrl: shared.logoUrl || '', siteUrl: shared.siteUrl || '', background: shared.background || '', bytes: shared.bytes || {}, enchants: shared.enchants || {}, units: cfg.units || [] }; var rr = renderMeta(mountEl, META_CFG); activeReRenders.push(rr); if (unitMapReady) rr(); }); } var xM = new XMLHttpRequest(); xM.open('GET', METAS_URL, true); xM.onload = function () { try { metasData = JSON.parse(xM.responseText); } catch (e) { metasData = { shared: {}, metas: {} }; } renderAllMounts(); }; xM.onerror = function () { metasData = { shared: {}, metas: {} }; renderAllMounts(); }; xM.send(); var xC = new XMLHttpRequest(); xC.open('GET', UNITS_URL, true); xC.onload = function () { try { JSON.parse(xC.responseText).forEach(function (u) { unitMap[u.name] = { img: u.imgNormal || '', rarity: u.rarity || '', role: u.role || u.type || '' }; }); } catch (e) {} unitMapReady = true; activeReRenders.forEach(function (fn) { fn(); }); }; xC.send(); }());