┌─ ASTRO ────────────────────────────────────────────────────────────────────┐
│ --- │
│ // ItemDatabase.astro - Handles item display, reforging, and Wowhead integration │
│ --- │
│ │
│ <script> │
│ // Reforging data mapping │
│ const reforgeData = { │
│ "113": { id: 113, i1: 6, s1: "spi", i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "114": { id: 114, i1: 6, s1: "spi", i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "115": { id: 115, i1: 6, s1: "spi", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "116": { id: 116, i1: 6, s1: "spi", i2: 32, s2: "critstrkrtng", v: 0.4 }, │
│ "117": { id: 117, i1: 6, s1: "spi", i2: 36, s2: "hastertng", v: 0.4 }, │
│ "118": { id: 118, i1: 6, s1: "spi", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "119": { id: 119, i1: 6, s1: "spi", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "120": { id: 120, i1: 13, s1: "dodgertng", i2: 6, s2: "spi", v: 0.4 }, │
│ "121": { │
│ id: 121, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "122": { id: 122, i1: 13, s1: "dodgertng", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "123": { │
│ id: 123, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "124": { │
│ id: 124, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "125": { id: 125, i1: 13, s1: "dodgertng", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "126": { id: 126, i1: 13, s1: "dodgertng", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "127": { id: 127, i1: 14, s1: "parryrtng", i2: 6, s2: "spi", v: 0.4 }, │
│ "128": { │
│ id: 128, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "129": { id: 129, i1: 14, s1: "parryrtng", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "130": { │
│ id: 130, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "131": { │
│ id: 131, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "132": { id: 132, i1: 14, s1: "parryrtng", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "133": { id: 133, i1: 14, s1: "parryrtng", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "134": { id: 134, i1: 31, s1: "hitrtng", i2: 6, s2: "spi", v: 0.4 }, │
│ "135": { id: 135, i1: 31, s1: "hitrtng", i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "136": { id: 136, i1: 31, s1: "hitrtng", i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "137": { │
│ id: 137, │
│ i1: 31, │
│ s1: "hitrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "138": { id: 138, i1: 31, s1: "hitrtng", i2: 36, s2: "hastertng", v: 0.4 }, │
│ "139": { id: 139, i1: 31, s1: "hitrtng", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "140": { id: 140, i1: 31, s1: "hitrtng", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "141": { id: 141, i1: 32, s1: "critstrkrtng", i2: 6, s2: "spi", v: 0.4 }, │
│ "142": { │
│ id: 142, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "143": { │
│ id: 143, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "144": { │
│ id: 144, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 31, │
│ s2: "hitrtng", │
│ v: 0.4, │
│ }, │
│ "145": { │
│ id: 145, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "146": { │
│ id: 146, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 37, │
│ s2: "exprtng", │
│ v: 0.4, │
│ }, │
│ "147": { │
│ id: 147, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 49, │
│ s2: "mastrtng", │
│ v: 0.4, │
│ }, │
│ "148": { id: 148, i1: 36, s1: "hastertng", i2: 6, s2: "spi", v: 0.4 }, │
│ "149": { │
│ id: 149, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "150": { │
│ id: 150, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "151": { id: 151, i1: 36, s1: "hastertng", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "152": { │
│ id: 152, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "153": { id: 153, i1: 36, s1: "hastertng", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "154": { id: 154, i1: 36, s1: "hastertng", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "155": { id: 155, i1: 37, s1: "exprtng", i2: 6, s2: "spi", v: 0.4 }, │
│ "156": { id: 156, i1: 37, s1: "exprtng", i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "157": { id: 157, i1: 37, s1: "exprtng", i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "158": { id: 158, i1: 37, s1: "exprtng", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "159": { │
│ id: 159, │
│ i1: 37, │
│ s1: "exprtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "160": { id: 160, i1: 37, s1: "exprtng", i2: 36, s2: "hastertng", v: 0.4 }, │
│ "161": { id: 161, i1: 37, s1: "exprtng", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "162": { id: 162, i1: 49, s1: "mastrtng", i2: 6, s2: "spi", v: 0.4 }, │
│ "163": { id: 163, i1: 49, s1: "mastrtng", i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "164": { id: 164, i1: 49, s1: "mastrtng", i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "165": { id: 165, i1: 49, s1: "mastrtng", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "166": { │
│ id: 166, │
│ i1: 49, │
│ s1: "mastrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "167": { id: 167, i1: 49, s1: "mastrtng", i2: 36, s2: "hastertng", v: 0.4 }, │
│ "168": { id: 168, i1: 49, s1: "mastrtng", i2: 37, s2: "exprtng", v: 0.4 }, │
│ }; │
│ │
│ // Stat name mappings │
│ const statNames = { │
│ spi: "Spirit", │
│ dodgertng: "Dodge", │
│ parryrtng: "Parry", │
│ hitrtng: "Hit", │
│ critstrkrtng: "Crit", │
│ hastertng: "Haste", │
│ exprtng: "Expertise", │
│ mastrtng: "Mastery", │
│ }; │
│ │
│ // Global functions for item database functionality │
│ (window as any).ItemDatabase = { │
│ // Helper function to format reforging │
│ formatReforge: (reforgeId: any) => { │
│ if (!reforgeId || reforgeId === 0) return ""; │
│ const reforge = │
│ reforgeData[reforgeId.toString() as keyof typeof reforgeData]; │
│ if (!reforge) return ` [R:${reforgeId}]`; │
│ │
│ const fromStat = │
│ statNames[reforge.s1 as keyof typeof statNames] || reforge.s1; │
│ const toStat = │
│ statNames[reforge.s2 as keyof typeof statNames] || reforge.s2; │
│ return ` [${fromStat} -> ${toStat}]`; │
│ }, │
│ │
│ // Generate Wowhead URL for items │
│ getWowheadUrl: (itemId: any) => { │
│ return `https://www.wowhead.com/mop-classic/item=${itemId}`; │
│ }, │
│ │
│ // Format equipment item with all details - uses enriched data from backend │
│ formatEquipmentItem: (item: any) => { │
│ if (!item || !item.id) return null; │
│ │
│ // Use enriched name if available, otherwise fallback to ID │
│ const itemName = item.name || `Item ${item.id}`; │
│ const wowheadUrl = (window as any).ItemDatabase.getWowheadUrl(item.id); │
│ const iconUrl = item.icon │
│ ? `https://wow.zamimg.com/images/wow/icons/large/${item.icon}.jpg` │
│ : null; │
│ │
│ // Build details array with specific layout structure │
│ const details = []; │
│ │
│ // Item Level (white text) │
│ if (item.stats && item.stats.ilvl) { │
│ details.push( │
│ `<div class="item-level">Item Level ${item.stats.ilvl}</div>`, │
│ ); │
│ } │
│ │
│ // Slot (determine from item type - this might need enhancement) │
│ // For now, we'll skip slot since it's shown in the header already │
│ │
│ // Reforged (green text) │
│ if (item.reforging && item.reforging.description) { │
│ details.push( │
│ `<div class="item-reforge">Reforged ${item.reforging.description}</div>` │
│ , │
│ ); │
│ } else if (item.reforging && typeof item.reforging === "number") { │
│ // Fallback to manual reforge lookup if not enriched │
│ const reforge = │
│ reforgeData[item.reforging.toString() as keyof typeof reforgeData]; │
│ if (reforge) { │
│ const fromStat = │
│ statNames[reforge.s1 as keyof typeof statNames] || reforge.s1; │
│ const toStat = │
│ statNames[reforge.s2 as keyof typeof statNames] || reforge.s2; │
│ details.push( │
│ `<div class="item-reforge">Reforged ${fromStat} -> ${toStat}</div>`, │
│ ); │
│ } │
│ } │
│ │
│ // Gems - each gem on separate line with icon and white stats │
│ if (item.gems && item.gems.length > 0) { │
│ item.gems.forEach((gem: any) => { │
│ if (gem && gem.name) { │
│ const gemIcon = gem.icon │
│ ? `<img src="https://wow.zamimg.com/images/wow/icons/small/${gem.ico │
│ n}.jpg" alt="${gem.name}" class="gem-icon-inline" />` │
│ : ""; │
│ const gemStats = │
│ gem.stats && gem.stats.length > 0 │
│ ? gem.stats.join(", ") │
│ : gem.name; │
│ details.push( │
│ `<div class="gem-line">${gemIcon}<span class="gem-stats-white">${gem │
│ Stats}</span></div>`, │
│ ); │
│ } else if (gem && typeof gem === "number") { │
│ // Fallback for non-enriched gem IDs │
│ details.push(`<div class="gem-line">Gem ${gem}</div>`); │
│ } │
│ }); │
│ } │
│ │
│ // Enchant (green text) │
│ if (item.enchant && item.enchant.name) { │
│ details.push(`<div class="item-enchant">${item.enchant.name}</div>`); │
│ } else if (item.enchant && typeof item.enchant === "number") { │
│ details.push(`<div class="item-enchant">Enchant ${item.enchant}</div>`); │
│ } │
│ │
│ // Tinker (not enriched yet, but prepared for future) │
│ if (item.tinker) { │
│ details.push(`Tinker ${item.tinker}`); │
│ } │
│ │
│ return { │
│ itemId: item.id, │
│ itemName: itemName, │
│ itemDetails: details, │
│ wowheadUrl: wowheadUrl, │
│ iconUrl: iconUrl, │
│ quality: item.quality || null, │
│ }; │
│ }, │
│ │
│ // Format gem information │
│ formatGems: (gems: any) => { │
│ if (!gems || gems.length === 0) return ""; │
│ const activeGems = gems.filter((g: any) => g && g !== 0); │
│ if (activeGems.length === 0) return ""; │
│ │
│ return activeGems.map((gemId: any) => `Gem ${gemId}`).join(", "); │
│ }, │
│ }; │
│ </script> │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ ASTRO ──────────────────────────────┐
│ --- │
│ // ItemDatabase.astro - Handles item display │
│ , reforging, and Wowhead integration │
│ --- │
│ │
│ <script> │
│ // Reforging data mapping │
│ const reforgeData = { │
│ "113": { id: 113, i1: 6, s1: "spi", i2: │
│ 13, s2: "dodgertng", v: 0.4 }, │
│ "114": { id: 114, i1: 6, s1: "spi", i2: │
│ 14, s2: "parryrtng", v: 0.4 }, │
│ "115": { id: 115, i1: 6, s1: "spi", i2: │
│ 31, s2: "hitrtng", v: 0.4 }, │
│ "116": { id: 116, i1: 6, s1: "spi", i2: │
│ 32, s2: "critstrkrtng", v: 0.4 }, │
│ "117": { id: 117, i1: 6, s1: "spi", i2: │
│ 36, s2: "hastertng", v: 0.4 }, │
│ "118": { id: 118, i1: 6, s1: "spi", i2: │
│ 37, s2: "exprtng", v: 0.4 }, │
│ "119": { id: 119, i1: 6, s1: "spi", i2: │
│ 49, s2: "mastrtng", v: 0.4 }, │
│ "120": { id: 120, i1: 13, s1: "dodgertng │
│ ", i2: 6, s2: "spi", v: 0.4 }, │
│ "121": { │
│ id: 121, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "122": { id: 122, i1: 13, s1: "dodgertng │
│ ", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "123": { │
│ id: 123, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "124": { │
│ id: 124, │
│ i1: 13, │
│ s1: "dodgertng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "125": { id: 125, i1: 13, s1: "dodgertng │
│ ", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "126": { id: 126, i1: 13, s1: "dodgertng │
│ ", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "127": { id: 127, i1: 14, s1: "parryrtng │
│ ", i2: 6, s2: "spi", v: 0.4 }, │
│ "128": { │
│ id: 128, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "129": { id: 129, i1: 14, s1: "parryrtng │
│ ", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "130": { │
│ id: 130, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "131": { │
│ id: 131, │
│ i1: 14, │
│ s1: "parryrtng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "132": { id: 132, i1: 14, s1: "parryrtng │
│ ", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "133": { id: 133, i1: 14, s1: "parryrtng │
│ ", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "134": { id: 134, i1: 31, s1: "hitrtng", │
│ i2: 6, s2: "spi", v: 0.4 }, │
│ "135": { id: 135, i1: 31, s1: "hitrtng", │
│ i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "136": { id: 136, i1: 31, s1: "hitrtng", │
│ i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "137": { │
│ id: 137, │
│ i1: 31, │
│ s1: "hitrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "138": { id: 138, i1: 31, s1: "hitrtng", │
│ i2: 36, s2: "hastertng", v: 0.4 }, │
│ "139": { id: 139, i1: 31, s1: "hitrtng", │
│ i2: 37, s2: "exprtng", v: 0.4 }, │
│ "140": { id: 140, i1: 31, s1: "hitrtng", │
│ i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "141": { id: 141, i1: 32, s1: "critstrkr │
│ tng", i2: 6, s2: "spi", v: 0.4 }, │
│ "142": { │
│ id: 142, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "143": { │
│ id: 143, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "144": { │
│ id: 144, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 31, │
│ s2: "hitrtng", │
│ v: 0.4, │
│ }, │
│ "145": { │
│ id: 145, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 36, │
│ s2: "hastertng", │
│ v: 0.4, │
│ }, │
│ "146": { │
│ id: 146, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 37, │
│ s2: "exprtng", │
│ v: 0.4, │
│ }, │
│ "147": { │
│ id: 147, │
│ i1: 32, │
│ s1: "critstrkrtng", │
│ i2: 49, │
│ s2: "mastrtng", │
│ v: 0.4, │
│ }, │
│ "148": { id: 148, i1: 36, s1: "hastertng │
│ ", i2: 6, s2: "spi", v: 0.4 }, │
│ "149": { │
│ id: 149, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 13, │
│ s2: "dodgertng", │
│ v: 0.4, │
│ }, │
│ "150": { │
│ id: 150, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 14, │
│ s2: "parryrtng", │
│ v: 0.4, │
│ }, │
│ "151": { id: 151, i1: 36, s1: "hastertng │
│ ", i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "152": { │
│ id: 152, │
│ i1: 36, │
│ s1: "hastertng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "153": { id: 153, i1: 36, s1: "hastertng │
│ ", i2: 37, s2: "exprtng", v: 0.4 }, │
│ "154": { id: 154, i1: 36, s1: "hastertng │
│ ", i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "155": { id: 155, i1: 37, s1: "exprtng", │
│ i2: 6, s2: "spi", v: 0.4 }, │
│ "156": { id: 156, i1: 37, s1: "exprtng", │
│ i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "157": { id: 157, i1: 37, s1: "exprtng", │
│ i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "158": { id: 158, i1: 37, s1: "exprtng", │
│ i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "159": { │
│ id: 159, │
│ i1: 37, │
│ s1: "exprtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "160": { id: 160, i1: 37, s1: "exprtng", │
│ i2: 36, s2: "hastertng", v: 0.4 }, │
│ "161": { id: 161, i1: 37, s1: "exprtng", │
│ i2: 49, s2: "mastrtng", v: 0.4 }, │
│ "162": { id: 162, i1: 49, s1: "mastrtng" │
│ , i2: 6, s2: "spi", v: 0.4 }, │
│ "163": { id: 163, i1: 49, s1: "mastrtng" │
│ , i2: 13, s2: "dodgertng", v: 0.4 }, │
│ "164": { id: 164, i1: 49, s1: "mastrtng" │
│ , i2: 14, s2: "parryrtng", v: 0.4 }, │
│ "165": { id: 165, i1: 49, s1: "mastrtng" │
│ , i2: 31, s2: "hitrtng", v: 0.4 }, │
│ "166": { │
│ id: 166, │
│ i1: 49, │
│ s1: "mastrtng", │
│ i2: 32, │
│ s2: "critstrkrtng", │
│ v: 0.4, │
│ }, │
│ "167": { id: 167, i1: 49, s1: "mastrtng" │
│ , i2: 36, s2: "hastertng", v: 0.4 }, │
│ "168": { id: 168, i1: 49, s1: "mastrtng" │
│ , i2: 37, s2: "exprtng", v: 0.4 }, │
│ }; │
│ │
│ // Stat name mappings │
│ const statNames = { │
│ spi: "Spirit", │
│ dodgertng: "Dodge", │
│ parryrtng: "Parry", │
│ hitrtng: "Hit", │
│ critstrkrtng: "Crit", │
│ hastertng: "Haste", │
│ exprtng: "Expertise", │
│ mastrtng: "Mastery", │
│ }; │
│ │
│ // Global functions for item database func │
│ tionality │
│ (window as any).ItemDatabase = { │
│ // Helper function to format reforging │
│ formatReforge: (reforgeId: any) => { │
│ if (!reforgeId || reforgeId === 0) ret │
│ urn ""; │
│ const reforge = │
│ reforgeData[reforgeId.toString() as │
│ keyof typeof reforgeData]; │
│ if (!reforge) return ` [R:${reforgeId} │
│ ]`; │
│ │
│ const fromStat = │
│ statNames[reforge.s1 as keyof typeof │
│ statNames] || reforge.s1; │
│ const toStat = │
│ statNames[reforge.s2 as keyof typeof │
│ statNames] || reforge.s2; │
│ return ` [${fromStat} -> ${toStat}]`; │
│ }, │
│ │
│ // Generate Wowhead URL for items │
│ getWowheadUrl: (itemId: any) => { │
│ return `https://www.wowhead.com/mop-cl │
│ assic/item=${itemId}`; │
│ }, │
│ │
│ // Format equipment item with all detail │
│ s - uses enriched data from backend │
│ formatEquipmentItem: (item: any) => { │
│ if (!item || !item.id) return null; │
│ │
│ // Use enriched name if available, oth │
│ erwise fallback to ID │
│ const itemName = item.name || `Item ${ │
│ item.id}`; │
│ const wowheadUrl = (window as any).Ite │
│ mDatabase.getWowheadUrl(item.id); │
│ const iconUrl = item.icon │
│ ? `https://wow.zamimg.com/images/wow │
│ /icons/large/${item.icon}.jpg` │
│ : null; │
│ │
│ // Build details array with specific l │
│ ayout structure │
│ const details = []; │
│ │
│ // Item Level (white text) │
│ if (item.stats && item.stats.ilvl) { │
│ details.push( │
│ `<div class="item-level">Item Leve │
│ l ${item.stats.ilvl}</div>`, │
│ ); │
│ } │
│ │
│ // Slot (determine from item type - th │
│ is might need enhancement) │
│ // For now, we'll skip slot since it's │
│ shown in the header already │
│ │
│ // Reforged (green text) │
│ if (item.reforging && item.reforging.d │
│ escription) { │
│ details.push( │
│ `<div class="item-reforge">Reforge │
│ d ${item.reforging.description}</div>`, │
│ ); │
│ } else if (item.reforging && typeof it │
│ em.reforging === "number") { │
│ // Fallback to manual reforge lookup │
│ if not enriched │
│ const reforge = │
│ reforgeData[item.reforging.toStrin │
│ g() as keyof typeof reforgeData]; │
│ if (reforge) { │
│ const fromStat = │
│ statNames[reforge.s1 as keyof ty │
│ peof statNames] || reforge.s1; │
│ const toStat = │
│ statNames[reforge.s2 as keyof ty │
│ peof statNames] || reforge.s2; │
│ details.push( │
│ `<div class="item-reforge">Refor │
│ ged ${fromStat} -> ${toStat}</div>`, │
│ ); │
│ } │
│ } │
│ │
│ // Gems - each gem on separate line wi │
│ th icon and white stats │
│ if (item.gems && item.gems.length > 0) │
│ { │
│ item.gems.forEach((gem: any) => { │
│ if (gem && gem.name) { │
│ const gemIcon = gem.icon │
│ ? `<img src="https://wow.zamim │
│ g.com/images/wow/icons/small/${gem.icon}.jpg │
│ " alt="${gem.name}" class="gem-icon-inline" │
│ />` │
│ : ""; │
│ const gemStats = │
│ gem.stats && gem.stats.length │
│ > 0 │
│ ? gem.stats.join(", ") │
│ : gem.name; │
│ details.push( │
│ `<div class="gem-line">${gemIc │
│ on}<span class="gem-stats-white">${gemStats} │
│ </span></div>`, │
│ ); │
│ } else if (gem && typeof gem === " │
│ number") { │
│ // Fallback for non-enriched gem │
│ IDs │
│ details.push(`<div class="gem-li │
│ ne">Gem ${gem}</div>`); │
│ } │
│ }); │
│ } │
│ │
│ // Enchant (green text) │
│ if (item.enchant && item.enchant.name) │
│ { │
│ details.push(`<div class="item-encha │
│ nt">${item.enchant.name}</div>`); │
│ } else if (item.enchant && typeof item │
│ .enchant === "number") { │
│ details.push(`<div class="item-encha │
│ nt">Enchant ${item.enchant}</div>`); │
│ } │
│ │
│ // Tinker (not enriched yet, but prepa │
│ red for future) │
│ if (item.tinker) { │
│ details.push(`Tinker ${item.tinker}` │
│ ); │
│ } │
│ │
│ return { │
│ itemId: item.id, │
│ itemName: itemName, │
│ itemDetails: details, │
│ wowheadUrl: wowheadUrl, │
│ iconUrl: iconUrl, │
│ quality: item.quality || null, │
│ }; │
│ }, │
│ │
│ // Format gem information │
│ formatGems: (gems: any) => { │
│ if (!gems || gems.length === 0) return │
│ ""; │
│ const activeGems = gems.filter((g: any │
│ ) => g && g !== 0); │
│ if (activeGems.length === 0) return "" │
│ ; │
│ │
│ return activeGems.map((gemId: any) => │
│ `Gem ${gemId}`).join(", "); │
│ }, │
│ }; │
│ </script> │
└──────────────────────────────────────────────┘