Cards: Difference between revisions
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
__NOTOC__ | |||
__NOEDITSECTION__ | |||
<!-- TimeRO Wiki — Sistema de Cartas Balanceadas + Coleção --> | |||
<!-- Design: "Arcane Codex" — encyclopedia/database hybrid --> | |||
<!-- Unique: live search, column sort, inline row detail, collection groups, changed-only filter --> | |||
< | <div id="card-system-root" style="margin:-1em -1.5em;font-family:'Segoe UI',system-ui,sans-serif;background:#030408;min-height:100vh;color:#e8eef8;"> | ||
< | <!-- ═══ HERO ═══════════════════════════════════════════════ --> | ||
<div style="position:relative;background:linear-gradient(160deg,#020307 0%,#06040e 40%,#0b061a 65%,#040210 100%);padding:56px 64px 48px;overflow:hidden;border-bottom:1px solid rgba(124,106,255,0.18);"> | |||
< | <!-- Arcane grid — violet tint --> | ||
< | <div style="position:absolute;inset:0;background-image:linear-gradient(rgba(124,106,255,0.030) 1px,transparent 1px),linear-gradient(90deg,rgba(124,106,255,0.030) 1px,transparent 1px);background-size:48px 48px;pointer-events:none;mask-image:radial-gradient(ellipse 80% 70% at 50% 50%,black 10%,transparent 80%);"></div> | ||
<!-- Rune circle decoration --> | |||
<div style="position:absolute;top:-80px;right:6%;width:460px;height:460px;border-radius:50%;border:1px solid rgba(124,106,255,0.08);pointer-events:none;"></div> | |||
<div style="position:absolute;top:-40px;right:9%;width:340px;height:340px;border-radius:50%;border:1px solid rgba(249,197,0,0.06);pointer-events:none;"></div> | |||
<div style="position:absolute;top:0;right:11.5%;width:220px;height:220px;border-radius:50%;border:1px solid rgba(124,106,255,0.05);display:flex;align-items:center;justify-content:center;font-size:4rem;opacity:0.06;pointer-events:none;">♦</div> | |||
<div style="position:absolute;bottom:-60px;left:5%;width:380px;height:380px;border-radius:50%;background:radial-gradient(circle,rgba(124,106,255,0.07),transparent 65%);pointer-events:none;"></div> | |||
<div style="position:relative;z-index:1;max-width:900px;"> | |||
--- | <!-- Breadcrumb --> | ||
<div style="display:flex;align-items:center;gap:8px;margin-bottom:20px;font-size:0.78rem;color:rgba(122,144,176,0.60);"> | |||
[[Main_Page|<span style="color:rgba(124,106,255,0.70);">TimeRO Wiki</span>]] | |||
<span style="opacity:0.4;">›</span> | |||
[[Systems|<span style="color:rgba(122,144,176,0.60);">Sistemas</span>]] | |||
<span style="opacity:0.4;">›</span> | |||
<span style="color:#e8eef8;">Sistema de Cartas</span> | |||
</div> | |||
<!-- Category pills --> | |||
<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:22px;"> | |||
<span style="display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:4px;background:rgba(124,106,255,0.16);border:1px solid rgba(124,106,255,0.38);font-size:0.66rem;letter-spacing:0.18em;text-transform:uppercase;color:#9d8fff;font-weight:900;">♦ Sistema Arcano</span> | |||
<span style="display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:4px;background:rgba(249,197,0,0.10);border:1px solid rgba(249,197,0,0.28);font-size:0.66rem;letter-spacing:0.14em;text-transform:uppercase;color:#f9c500;font-weight:700;">✨ 47 Cartas Balanceadas</span> | |||
<span style="display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:4px;background:rgba(0,212,255,0.08);border:1px solid rgba(0,212,255,0.22);font-size:0.66rem;letter-spacing:0.14em;text-transform:uppercase;color:#00d4ff;font-weight:700;">📚 50 Cartas Documentadas</span> | |||
<span style="display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:4px;background:rgba(0,255,136,0.08);border:1px solid rgba(0,255,136,0.22);font-size:0.66rem;letter-spacing:0.14em;text-transform:uppercase;color:#00ff88;font-weight:700;">🌟 10 Grupos de Coleção</span> | |||
</div> | |||
<!-- Title --> | |||
<h1 style="font-size:clamp(2.2rem,5.5vw,4.2rem);font-weight:900;line-height:0.92;letter-spacing:-0.02em;color:#fff;margin:0 0 16px;"> | |||
Sistema de<br> | |||
<span style="background:linear-gradient(90deg,#7c6aff,#b06cff,#f9c500);-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 0 28px rgba(124,106,255,0.30));">Cartas Balanceadas</span> | |||
</h1> | |||
<p style="font-size:1.05rem;color:rgba(176,192,224,0.75);line-height:1.75;max-width:680px;margin:0 0 28px;">Todas as cartas do TimeRO foram revisadas, rebalanceadas e integradas ao novo <strong style="color:#f9c500;">Sistema de Coleção</strong> — efeitos permanentes para toda a conta ao completar grupos temáticos.</p> | |||
<!-- Quick stats --> | |||
<div style="display:flex;gap:14px;flex-wrap:wrap;"> | |||
<div style="padding:10px 18px;border-radius:10px;background:rgba(0,0,0,0.35);border:1px solid rgba(124,106,255,0.16);display:flex;align-items:center;gap:10px;"> | |||
<span style="font-size:0.65rem;letter-spacing:0.12em;text-transform:uppercase;color:rgba(122,144,176,0.55);font-weight:700;">Cartas alteradas:</span> | |||
<span style="font-size:1rem;font-weight:900;color:#7c6aff;">47 / 50</span> | |||
</div> | |||
<div style="padding:10px 18px;border-radius:10px;background:rgba(0,0,0,0.35);border:1px solid rgba(249,197,0,0.14);display:flex;align-items:center;gap:10px;"> | |||
<span style="font-size:0.65rem;letter-spacing:0.12em;text-transform:uppercase;color:rgba(122,144,176,0.55);font-weight:700;">Grupos de coleção:</span> | |||
<span style="font-size:1rem;font-weight:900;color:#f9c500;">10</span> | |||
</div> | |||
<div style="padding:10px 18px;border-radius:10px;background:rgba(0,0,0,0.35);border:1px solid rgba(0,212,255,0.12);display:flex;align-items:center;gap:10px;"> | |||
<span style="font-size:0.65rem;letter-spacing:0.12em;text-transform:uppercase;color:rgba(122,144,176,0.55);font-weight:700;">Atualização:</span> | |||
<span style="font-size:1rem;font-weight:900;color:#00d4ff;">Mar 2025</span> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<!-- /HERO --> | |||
<!-- ═══ SYSTEM EXPLAINER — HOW COLLECTION WORKS ═══════════ --> | |||
<div style="background:#05060e;padding:52px 64px;border-bottom:1px solid rgba(255,255,255,0.05);"> | |||
<div style="max-width: | |||
Revision as of 19:03, 13 April 2026
// Como funciona
Sistema de Coleção de Cartas
Um sistema de progressão de conta — bônus permanentes para todos os personagens.
🔒
👥
📊
// Banco de Dados
Todas as Cartas Balanceadas
Clique em qualquer carta para ver efeito antigo vs novo e bônus de coleção.
🔍
<input id="card-search" type="text" oninput="searchCards()" placeholder="Buscar por nome, ID ou monstro..." style="width:100%;padding:10px 12px 10px 36px;border-radius:10px;background:rgba(0,0,0,0.40);border:1px solid rgba(255,255,255,0.09);color:#e8eef8;font-size:0.90rem;font-family:inherit;outline:none;transition:border-color 0.18s;">
<label style="display:inline-flex;align-items:center;gap:9px;cursor:pointer;padding:9px 16px;border-radius:10px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);font-size:0.82rem;font-weight:700;color:rgba(122,144,176,0.70);user-select:none;white-space:nowrap;" for="changed-toggle">
<input type="checkbox" id="changed-toggle" onchange="toggleChangedOnly()" style="accent-color:#7c6aff;width:16px;height:16px;">
⚡ Apenas alteradas
</label>
// Grupos de Coleção
Complete grupos para bônus permanentes
Clique em qualquer grupo para ver as cartas necessárias.
// Dúvidas
Perguntas Frequentes
<script>
/* ════════════════════════════════════════════════════════════
CARD SYSTEM PAGE — All-new JavaScript
Functions: searchCards, filterCategory, sortTable,
openCardDetail, toggleChangedOnly,
toggleGroup, toggleFaqEntry, renderTable
════════════════════════════════════════════════════════════ */
/* ── Card data ──────────────────────────────────────────── */ var CARDS = [
{id:4001,name:'Poring Card',source:'Poring',slot:'Accessory',cat:'misc',old:'+5 LUK',nw:'+7 LUK, +3% Zeny from monsters',changed:true,group:'novice'},
{id:4002,name:'Lunatic Card',source:'Lunatic',slot:'Accessory',cat:'misc',old:'+10 Critical',nw:'+12 Critical, +2% Critical damage',changed:true,group:'novice'},
{id:4003,name:'Spore Card',source:'Spore',slot:'Armor',cat:'armor',old:'+1 VIT',nw:'+2 VIT, +50 MaxHP',changed:true,group:'novice'},
{id:4004,name:'Zombie Card',source:'Zombie',slot:'Armor',cat:'armor',old:'+10% Max HP',nw:'+12% Max HP, Undead resist +5%',changed:true,group:'undead'},
{id:4005,name:'Archer Skeleton Card',source:'Archer Skeleton',slot:'Weapon',cat:'weapon',old:'+10% ranged damage',nw:'+12% ranged damage, +1 DEX',changed:true,group:'undead'},
{id:4006,name:'Mummy Card',source:'Mummy',slot:'Weapon',cat:'weapon',old:'+15 Attack Speed (Haste)',nw:'+15 Haste, +5% damage vs Medium enemies',changed:true,group:'undead'},
{id:4007,name:'Skeleton Card',source:'Skeleton',slot:'Weapon',cat:'weapon',old:'+20% damage vs Medium',nw:'+22% damage vs Medium, +1 STR',changed:true,group:'undead'},
{id:4008,name:'Skel-Worker Card',source:'Skel-Worker',slot:'Weapon',cat:'weapon',old:'+15% damage vs Medium/Large',nw:'+15% damage vs Medium/Large, +15 ATK',changed:true,group:'undead'},
{id:4009,name:'Drainliar Card',source:'Drainliar',slot:'Weapon',cat:'weapon',old:'+20% damage vs Small',nw:'+20% damage vs Small, +5% lifesteal',changed:true,group:'beast'},
{id:4010,name:'Thara Frog Card',source:'Thara Frog',slot:'Shield',cat:'armor',old:'-30% damage from Demi-Human',nw:'-30% dmg Demi-Human, +1% reflect',changed:false,group:'aqua'},
{id:4011,name:'Hydra Card',source:'Hydra',slot:'Weapon',cat:'weapon',old:'+20% damage vs Demi-Human',nw:'+20% damage vs Demi-Human (unchanged)',changed:false,group:'aqua'},
{id:4012,name:'Orc Warrior Card',source:'Orc Warrior',slot:'Weapon',cat:'weapon',old:'+3 STR',nw:'+4 STR, +10 ATK',changed:true,group:'brute'},
{id:4013,name:'Orc Zombie Card',source:'Orc Zombie',slot:'Headgear',cat:'headgear',old:'INT +2, MDEF +5',nw:'INT +3, MDEF +7, SP Regen +5%',changed:true,group:'undead'},
{id:4014,name:'Orc Skeleton Card',source:'Orc Skeleton',slot:'Weapon',cat:'weapon',old:'+3% Critical chance',nw:'+5% Critical chance, Ignore DEF 5%',changed:true,group:'undead'},
{id:4015,name:'Andre Card',source:'Andre',slot:'Weapon',cat:'weapon',old:'+15 ATK',nw:'+18 ATK, +2% damage to Brute',changed:true,group:'insect'},
{id:4016,name:'Deniro Card',source:'Deniro',slot:'Weapon',cat:'weapon',old:'+5% damage vs Insect',nw:'+8% damage vs Insect, +1 DEX',changed:true,group:'insect'},
{id:4017,name:'Vitata Card',source:'Vitata',slot:'Accessory',cat:'misc',old:'Heal +15%',nw:'Heal +18%, SP cost -3%',changed:true,group:'insect'},
{id:4018,name:'Creamy Card',source:'Creamy',slot:'Accessory',cat:'misc',old:'Teleport Lv1 usable',nw:'Teleport Lv2 usable, Flee +5',changed:true,group:'insect'},
{id:4019,name:'Poporing Card',source:'Poporing',slot:'Armor',cat:'armor',old:'Poison resist +30%',nw:'Poison resist +40%, Neutral resist +2%',changed:true,group:'plant'},
{id:4020,name:'Marina Card',source:'Marina',slot:'Weapon',cat:'weapon',old:'Freeze chance +5%',nw:'Freeze chance +7%, Water damage +3%',changed:true,group:'aqua'},
{id:4021,name:'Magnolia Card',source:'Magnolia',slot:'Accessory',cat:'misc',old:'Curse resist +50%',nw:'Curse resist +70%, LUK +2',changed:true,group:'aqua'},
{id:4022,name:'Cornutus Card',source:'Cornutus',slot:'Shield',cat:'armor',old:'Melee reflect 5%',nw:'Melee reflect 7%, DEF +3',changed:true,group:'fish'},
{id:4023,name:'Marin Card',source:'Marin',slot:'Armor',cat:'armor',old:'Freeze resist +50%',nw:'Freeze resist +65%, Cold resist +10%',changed:true,group:'aqua'},
{id:4024,name:'Drops Card',source:'Drops',slot:'Headgear',cat:'headgear',old:'DEX +2',nw:'DEX +3, Ranged ATK +2%',changed:true,group:'plant'},
{id:4025,name:'Elder Willow Card',source:'Elder Willow',slot:'Weapon',cat:'weapon',old:'INT +2',nw:'INT +3, MATK +10',changed:true,group:'plant'},
{id:4026,name:'Caramel Card',source:'Caramel',slot:'Footgear',cat:'armor',old:'AGI +1',nw:'AGI +2, Movement Speed +3%',changed:true,group:'brute'},
{id:4027,name:'Flora Card',source:'Flora',slot:'Weapon',cat:'weapon',old:'+5% damage vs Insect/Fish',nw:'+7% damage vs Insect/Fish, +5 ATK',changed:true,group:'plant'},
{id:4028,name:'Myst Case Card',source:'Myst Case',slot:'Headgear',cat:'headgear',old:'DEX +1, INT +1',nw:'DEX +2, INT +2, SP +30',changed:true,group:'formless'},
{id:4029,name:'Cookie Card',source:'Cookie',slot:'Headgear',cat:'headgear',old:'MDEF +1',nw:'MDEF +2, INT +1',changed:true,group:'formless'},
{id:4030,name:'Hode Card',source:'Hode',slot:'Armor',cat:'armor',old:'Earth resist +20%',nw:'Earth resist +25%, DEF vs Earth +5',changed:true,group:'brute'},
{id:4031,name:'Desert Wolf Babe Card',source:'Desert Wolf Baby',slot:'Weapon',cat:'weapon',old:'+7% damage vs Small',nw:'+10% damage vs Small, +1 AGI',changed:true,group:'brute'},
{id:4032,name:'Scorpion Card',source:'Scorpion',slot:'Weapon',cat:'weapon',old:'+3% damage vs Insect/Fish',nw:'+5% damage vs Insect/Fish, Poison+3%',changed:true,group:'insect'},
{id:4033,name:'Verit Card',source:'Verit',slot:'Footgear',cat:'armor',old:'Max HP +8%, Max SP +8%',nw:'Max HP +10%, Max SP +10%',changed:true,group:'undead'},
{id:4034,name:'Hunter Fly Card',source:'Hunter Fly',slot:'Weapon',cat:'weapon',old:'3% chance drain 5% HP on hit',nw:'5% chance drain 7% HP on hit',changed:true,group:'insect'},
{id:4035,name:'Hornet Card',source:'Hornet',slot:'Weapon',cat:'weapon',old:'ATK +3',nw:'ATK +5, +2% damage vs non-boss',changed:true,group:'insect'},
{id:4036,name:'Wormtail Card',source:'Wormtail',slot:'Accessory',cat:'misc',old:'Perfect Dodge +2',nw:'Perfect Dodge +3, Flee +5',changed:true,group:'insect'},
{id:4037,name:'Anacondaq Card',source:'Anacondaq',slot:'Weapon',cat:'weapon',old:'Poison chance +3%',nw:'Poison chance +5%, Poison dmg +10%',changed:true,group:'brute'},
{id:4038,name:'Savage Card',source:'Savage',slot:'Armor',cat:'armor',old:'VIT +3',nw:'VIT +4, MaxHP +80',changed:true,group:'brute'},
{id:4039,name:'Wild Rose Card',source:'Wild Rose',slot:'Footgear',cat:'armor',old:'AGI +2, Perfect Dodge +1',nw:'AGI +3, Perfect Dodge +2',changed:true,group:'brute'},
{id:4040,name:'Peco Peco Egg Card',source:'Peco Peco Egg',slot:'Armor',cat:'armor',old:'VIT +1',nw:'VIT +2, Knockback resist +5%',changed:true,group:'brute'},
{id:4041,name:'Condor Card',source:'Condor',slot:'Headgear',cat:'headgear',old:'Flee +10',nw:'Flee +12, Perfect Dodge +1',changed:true,group:'brute'},
{id:4042,name:'Rocker Card',source:'Rocker',slot:'Armor',cat:'armor',old:'DEF +1',nw:'DEF +2, Neutral resist +2%',changed:true,group:'insect'},
{id:4043,name:'Smokie Card',source:'Smokie',slot:'Accessory',cat:'misc',old:'Cloaking Lv1 usable',nw:'Cloaking Lv2 usable, AGI +1',changed:true,group:'brute'},
{id:4044,name:'Familiar Card',source:'Familiar',slot:'Weapon',cat:'weapon',old:'+2% damage at night',nw:'+5% damage at night, Dark resist +5%',changed:true,group:'brute'},
{id:4045,name:'Poison Spore Card',source:'Poison Spore',slot:'Weapon',cat:'weapon',old:'Poison chance +5%',nw:'Poison chance +7%, INT +1',changed:true,group:'plant'},
{id:4046,name:'Geographer Card',source:'Geographer',slot:'Armor',cat:'armor',old:'HP Regen +50%',nw:'HP Regen +65%, Natural heal +10%',changed:true,group:'plant'},
{id:4047,name:'Coco Card',source:'Coco',slot:'Accessory',cat:'misc',old:'AGI +2',nw:'AGI +3, Flee +3',changed:true,group:'brute'},
{id:4048,name:'Jakk Card',source:'Jakk',slot:'Weapon',cat:'weapon',old:'Fire property +20%',nw:'Fire property +22%, Fire MATK +5%',changed:true,group:'formless'},
{id:4049,name:'Bathory Card',source:'Bathory',slot:'Armor',cat:'armor',old:'Shadow element armor',nw:'Shadow element, Dark resist +10%',changed:false,group:'undead'},
{id:4050,name:'Succubus Card',source:'Succubus',slot:'Accessory',cat:'misc',old:'Max SP +12%',nw:'Max SP +15%, SP drain +2% on kill',changed:true,group:'demon'},
];
/* ── Group data ─────────────────────────────────────────── */ var GROUPS = {
novice:{label:'Iniciantes',icon:'🌿',color:'#00ff88',count:3,min:3,effect:'Lv.1 de todos os personagens da conta ganham +50 EXP base por kill.'},
undead:{label:'Mortos-Vivos',icon:'💀',color:'#a0a0c0',count:9,min:5,effect:'Resistência a Shadow +5% permanente em toda a conta.'},
aqua:{label:'Aquáticos',icon:'🌊',color:'#00d4ff',count:5,min:4,effect:'+3% de drop rate de monstros aquáticos em toda a conta.'},
brute:{label:'Brutos',icon:'🐾',color:'#f9a826',count:12,min:6,effect:'AGI +2 permanente em toda a conta ao usar montaria.'},
insect:{label:'Insetos',icon:'🦟',color:'#a8d800',count:9,min:5,effect:'Dano a Insetos +5% permanente em toda a conta.'},
plant:{label:'Plantas',icon:'🌸',color:'#ff8aad',count:6,min:4,effect:'Regen de HP natural +15% permanente em toda a conta.'},
demon:{label:'Demônios',icon:'😈',color:'#ff3d5a',count:1,min:1,effect:'Max SP +5% permanente em toda a conta.'},
formless:{label:'Sem-Forma',icon:'⚗️',color:'#b06cff',count:3,min:3,effect:'MDEF +5 permanente em toda a conta.'},
fish:{label:'Peixes',icon:'🐟',color:'#5ee8ff',count:1,min:1,effect:'Reflect melee +2% permanente em toda a conta.'},
beast:{label:'Bestas',icon:'🐺',color:'#ffb347',count:1,min:1,effect:'Lifesteal +3% de todo ataque físico em toda a conta.'},
};
/* ── State ───────────────────────────────────────────────── */ var state = {
query: , category: 'all', changedOnly: false, sortCol: 'id', sortDir: 'asc', openDetailId: null
};
/* Slot → display label + color */ var slotMeta = {
weapon: {label:'Arma', color:'#ff3d5a', bg:'rgba(255,61,90,0.09)'},
armor: {label:'Armadura', color:'#00d4ff', bg:'rgba(0,212,255,0.08)'},
misc: {label:'Acessório', color:'#f9a826', bg:'rgba(249,168,38,0.09)'},
headgear: {label:'Headgear', color:'#b06cff', bg:'rgba(176,108,255,0.09)'},
};
/* ── Filter + render ────────────────────────────────────── */ function getFiltered() {
var q = state.query.toLowerCase();
return CARDS.filter(function(c) {
if (state.changedOnly && !c.changed) return false;
if (state.category !== 'all' && c.cat !== state.category) return false;
if (q && !(
c.name.toLowerCase().includes(q) ||
String(c.id).includes(q) ||
c.source.toLowerCase().includes(q)
)) return false;
return true;
}).sort(function(a, b) {
var av, bv;
if (state.sortCol === 'id') { av = a.id; bv = b.id; }
else if (state.sortCol === 'name') { av = a.name; bv = b.name; }
else if (state.sortCol === 'slot') { av = a.slot; bv = b.slot; }
else { av = a.id; bv = b.id; }
if (av < bv) return state.sortDir === 'asc' ? -1 : 1;
if (av > bv) return state.sortDir === 'asc' ? 1 : -1;
return 0;
});
}
function renderTable() {
var filtered = getFiltered();
var body = document.getElementById('card-table-body');
var empty = document.getElementById('table-empty');
var badge = document.getElementById('card-count-badge');
if (badge) badge.textContent = filtered.length + ' carta' + (filtered.length !== 1 ? 's' : );
if (!body) return;
if (filtered.length === 0) {
body.innerHTML = ;
if (empty) empty.style.display = 'block';
return;
}
if (empty) empty.style.display = 'none';
var html = ;
filtered.forEach(function(c, idx) {
var sm = slotMeta[c.cat] || {label: c.slot, color:'#e8eef8', bg:'rgba(255,255,255,0.06)'};
var gInfo = GROUPS[c.group] || {};
var gColor = gInfo.color || '#7c6aff';
var changedBadge = c.changed
? '⚡ Alterada'
: 'Igual';
var isOpen = state.openDetailId === c.id;
var rowBg = isOpen ? 'rgba(124,106,255,0.06)' : (idx%2===0 ? 'rgba(0,0,0,0)' : 'rgba(255,255,255,0.018)');
html += '
';
/* Inline detail panel */
if (isOpen) {
var gEff = gInfo.effect || ;
html += '
/* Old effect */+ '
/* New effect */+ '
/* Collection bonus */+ '
';
} }); body.innerHTML = html;
}
/* ── Search + Filters ───────────────────────────────────── */ function searchCards() {
state.query = (document.getElementById('card-search')||{}).value || ;
state.openDetailId = null;
renderTable();
}
function filterCategory(cat) {
state.category = cat; state.openDetailId = null;
/* Update tab styles */
['all','weapon','armor','misc','headgear'].forEach(function(k) {
var btn = document.getElementById('cat-' + k);
if (!btn) return;
if (k === cat) {
btn.style.background = 'linear-gradient(135deg,rgba(124,106,255,0.22),rgba(124,106,255,0.10))';
btn.style.color = '#9d8fff';
btn.style.fontWeight = '900';
} else {
btn.style.background = 'transparent';
btn.style.fontWeight = '700';
}
});
renderTable();
}
function toggleChangedOnly() {
var cb = document.getElementById('changed-toggle');
state.changedOnly = cb ? cb.checked : false;
state.openDetailId = null;
renderTable();
}
/* ── Column sort ────────────────────────────────────────── */ function sortTable(col) {
if (state.sortCol === col) {
state.sortDir = state.sortDir === 'asc' ? 'desc' : 'asc';
} else {
state.sortCol = col;
state.sortDir = 'asc';
}
/* Update sort indicators */
['id','name','slot'].forEach(function(k) {
var el = document.getElementById('si-' + k);
if (!el) return;
if (k === col) {
el.textContent = state.sortDir === 'asc' ? '↑' : '↓';
el.style.color = '#9d8fff';
} else {
el.textContent = '↕';
el.style.color = 'rgba(122,144,176,0.35)';
}
});
/* Update header colors */
document.querySelectorAll('.th-cell.sortable').forEach(function(th) {
th.style.color = th.dataset.col === col ? '#9d8fff' : 'rgba(122,144,176,0.55)';
});
renderTable();
}
/* ── Inline row detail ──────────────────────────────────── */ function openCardDetail(id) {
state.openDetailId = state.openDetailId === id ? null : id;
renderTable();
if (state.openDetailId) {
setTimeout(function() {
var rows = document.querySelectorAll('.card-row');
rows.forEach(function(r) {
if (parseInt(r.dataset.id) === id) {
r.scrollIntoView({behavior:'smooth', block:'nearest'});
}
});
}, 60);
}
}
/* ── Collection group expand ────────────────────────────── */ function toggleGroup(card) {
var detail = card.querySelector('.cg-detail');
var chevron = card.querySelector('.cg-chevron');
if (!detail) return;
var open = detail.style.display !== 'none';
detail.style.display = open ? 'none' : 'block';
if (chevron) chevron.style.transform = open ? : 'rotate(180deg)';
}
/* ── FAQ ────────────────────────────────────────────────── */ function toggleFaqEntry(entry) {
var body = entry.querySelector('.faq-body');
var chevron = entry.querySelector('.faq-chev');
if (!body) return;
var open = body.style.display !== 'none';
body.style.display = open ? 'none' : 'block';
if (chevron) chevron.style.transform = open ? : 'rotate(180deg)';
}
/* ── Init ────────────────────────────────────────────────── */ document.addEventListener('DOMContentLoaded', function() {
var sb = document.getElementById('settingsButton'), sm = document.getElementById('settingsMenu');
if (sb && sm) sb.addEventListener('click', function() { sm.style.right = sm.style.right === '20px' ? '-300px' : '20px'; });
/* Initial render */ renderTable();
/* Search focus style */
var si = document.getElementById('card-search');
if (si) {
si.addEventListener('focus', function() { this.style.borderColor = 'rgba(124,106,255,0.40)'; this.style.boxShadow = '0 0 0 3px rgba(124,106,255,0.10)'; });
si.addEventListener('blur', function() { this.style.borderColor = 'rgba(255,255,255,0.09)'; this.style.boxShadow = ; });
}
/* Mobile padding */
if (window.innerWidth < 900) {
document.querySelectorAll('[style*="padding:52px 64px"],[style*="padding:48px 64px"],[style*="padding:56px 64px"]').forEach(function(el) {
el.style.paddingLeft = '16px';
el.style.paddingRight = '16px';
});
}
}); </script>