Cards

From TimeRO Wiki
Revision as of 19:03, 13 April 2026 by Admin (talk | contribs)
Jump to navigation Jump to search


     TimeRO Wiki
     
     Sistemas
     
     Sistema de Cartas
     ♦ Sistema Arcano
     ✨ 47 Cartas Balanceadas
     📚 50 Cartas Documentadas
     🌟 10 Grupos de Coleção

Sistema de
Cartas Balanceadas

Todas as cartas do TimeRO foram revisadas, rebalanceadas e integradas ao novo Sistema de Coleção — efeitos permanentes para toda a conta ao completar grupos temáticos.

       Cartas alteradas:
       47 / 50
       Grupos de coleção:
       10
       Atualização:
       Mar 2025


       // Como funciona

Sistema de Coleção de Cartas

Um sistema de progressão de conta — bônus permanentes para todos os personagens.

🗡️
PASSO 1
Obter a carta
Derrote o monstro correspondente e colete a carta no loot. Drop rate customizado no TimeRO.
🃏
PASSO 2
Equipar em item
Encaixe a carta no slot correto de um equipamento para ativar o efeito balanceado.
📚
PASSO 3
Adicionar à Coleção
Use o NPC ou comando do servidor para registrar a carta na Coleção da sua conta.
PASSO 4
Bônus Permanente
Complete um grupo e ganhe bônus permanente em todos os personagens da conta para sempre.
       🔒
Irreversível
Uma vez adicionada à coleção, a carta não pode ser removida. O bônus é permanente.
       👥
Toda a conta
Os bônus de coleção se aplicam a todos os personagens da mesma conta, presentes e futuros.
       📊
Grupos Temáticos
Cartas são agrupadas por raça de monstro. Complete cada grupo para desbloquear seu bônus único.


       // 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>
50 cartas
       <button id="cat-all"      onclick="filterCategory('all')"     style="padding:8px 16px;border:none;background:linear-gradient(135deg,rgba(124,106,255,0.22),rgba(124,106,255,0.10));color:#9d8fff;font-size:0.78rem;font-weight:900;cursor:pointer;font-family:inherit;border-right:1px solid rgba(255,255,255,0.07);letter-spacing:0.04em;">Todas</button>
       <button id="cat-weapon"   onclick="filterCategory('weapon')"  style="padding:8px 16px;border:none;background:transparent;color:rgba(255,61,90,0.65);font-size:0.78rem;font-weight:700;cursor:pointer;font-family:inherit;border-right:1px solid rgba(255,255,255,0.07);">⚔️ Armas</button>
       <button id="cat-armor"    onclick="filterCategory('armor')"   style="padding:8px 16px;border:none;background:transparent;color:rgba(0,212,255,0.65);font-size:0.78rem;font-weight:700;cursor:pointer;font-family:inherit;border-right:1px solid rgba(255,255,255,0.07);">🛡 Armaduras</button>
       <button id="cat-misc"     onclick="filterCategory('misc')"    style="padding:8px 16px;border:none;background:transparent;color:rgba(249,168,38,0.65);font-size:0.78rem;font-weight:700;cursor:pointer;font-family:inherit;border-right:1px solid rgba(255,255,255,0.07);">💎 Acessórios</button>
       <button id="cat-headgear" onclick="filterCategory('headgear')" style="padding:8px 16px;border:none;background:transparent;color:rgba(176,108,255,0.65);font-size:0.78rem;font-weight:700;cursor:pointer;font-family:inherit;">🎩 Headgear</button>
ID
Carta / Monstro
Slot
Status


       // Grupos de Coleção

Complete grupos para bônus permanentes

Clique em qualquer grupo para ver as cartas necessárias.

🌿
GRUPO · NOVICE
Iniciantes
3
Cartas
   
   Bônus:
   Lv.1 de todos os personagens da conta ganham +50 EXP base por kill.
Min: 3 cartas
💀
GRUPO · UNDEAD
Mortos-Vivos
9
Cartas
   
   Bônus:
   Resistência a Shadow +5% permanente em toda a conta.
Min: 5 cartas
🌊
GRUPO · AQUA
Aquáticos
5
Cartas
   
   Bônus:
   +3% de drop rate de monstros aquáticos em toda a conta.
Min: 4 cartas
🐾
GRUPO · BRUTE
Brutos
12
Cartas
   
   Bônus:
   AGI +2 permanente em toda a conta ao usar montaria.
Min: 6 cartas
🦟
GRUPO · INSECT
Insetos
9
Cartas
   
   Bônus:
   Dano a Insetos +5% permanente em toda a conta.
Min: 5 cartas
🌸
GRUPO · PLANT
Plantas
6
Cartas
   
   Bônus:
   Regen de HP natural +15% permanente em toda a conta.
Min: 4 cartas
😈
GRUPO · DEMON
Demônios
1
Cartas
   
   Bônus:
   Max SP +5% permanente em toda a conta.
Min: 1 cartas
⚗️
GRUPO · FORMLESS
Sem-Forma
3
Cartas
   
   Bônus:
   MDEF +5 permanente em toda a conta.
Min: 3 cartas
🐟
GRUPO · FISH
Peixes
1
Cartas
   
   Bônus:
   Reflect melee +2% permanente em toda a conta.
Min: 1 cartas
🐺
GRUPO · BEAST
Bestas
1
Cartas
   
   Bônus:
   Lifesteal +3% de todo ataque físico em toda a conta.
Min: 1 cartas


       // Dúvidas

Perguntas Frequentes

         Posso adicionar a mesma carta à coleção mais de uma vez?
         
         O bônus de coleção se aplica ao personagem que coletou ou a toda a conta?
         
         Os efeitos das cartas foram todos aumentados ou podem ter sido reduzidos?
         
         Como adicionar uma carta à coleção in-game?
         
         Os bônus de diferentes grupos se acumulam?
         




<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 += '

' + '
' + '#' + c.id + '
' + '
' + '
' + (gInfo.icon||'♦') + '
' + '
' + '
' + c.name + '
' + '
🐉 ' + c.source + '  ·  ' + (gInfo.label||c.group) + '
' + '
' + '
' + '' + sm.label + ' · ' + c.slot + '
' + '
' + changedBadge + '
' + '
' + '' + (isOpen ? '▲' : '▼') + '
' + '

';

   /* Inline detail panel */
   if (isOpen) {
     var gEff = gInfo.effect || ;

html += '

' + '
'
           /* Old effect */
+ '
' + '
❌ Efeito Antigo
' + '
' + c.old + '
' + '
'
           /* New effect */
+ '
' + '
✅ Novo Efeito (TimeRO)
' + '
' + c.nw + '
' + '
'
           /* Collection bonus */
+ '
' + '
✨ Bônus de Coleção
' + '
' + (gInfo.icon||'♦') + ' ' + (gInfo.label||c.group) + '
' + '
' + gEff + '
' + '
' + '

';

   }
 });
 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>