{"id":85,"date":"2025-08-23T00:28:46","date_gmt":"2025-08-23T00:28:46","guid":{"rendered":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/?p=85"},"modified":"2026-06-04T01:58:23","modified_gmt":"2026-06-04T01:58:23","slug":"equipment-database","status":"publish","type":"post","link":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/","title":{"rendered":"EVE Frontier Modules Explorer"},"content":{"rendered":"\r\n<div id=\"evefrontier-modules\" data-json=\"https:\/\/gamingwithdaopa.ellatha.com\/media\/evefrontier\/modules.json\">\r\n  <style>\r\n    \/* === EVE-INSPIRED THEME === *\/\r\n    :root{\r\n      --bg:#0a0c10;\r\n      --panel:#12141b;\r\n      --panel-2:#171a22;\r\n      --ink:#e6edf3;\r\n      --muted:#9aa4b2;\r\n      --accent:#39d0ff;\r\n      --accent-2:#00ffa8;\r\n      --warn:#ffbe55;\r\n      --red:#ff5555;\r\n      --grid:#1f2430;\r\n      --chip:#222635;\r\n      --shadow:0 10px 30px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.03);\r\n      --radius:14px;\r\n    }\r\n    #evefrontier-modules{\r\n      color:var(--ink);\r\n      font:14px\/1.5 Inter, system-ui, -apple-system, Segoe UI, Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\r\n      background:radial-gradient(1200px 600px at 70% -20%,rgba(57,208,255,.05),transparent 60%), var(--bg);\r\n      padding:18px;\r\n      border-radius:var(--radius);\r\n      box-shadow:var(--shadow);\r\n      position:relative;\r\n      overflow:hidden;\r\n    }\r\n    #evefrontier-modules::after{\r\n      content:\"\";\r\n      position:absolute; inset:-2px;\r\n      background:radial-gradient(800px 400px at 110% 20%,rgba(0,255,168,.06),transparent 60%);\r\n      pointer-events:none;\r\n      filter:blur(2px);\r\n    }\r\n    h1,h2,h3{ letter-spacing:.08em; text-transform:uppercase; margin:6px 0 10px }\r\n    h1{ font-size:22px }\r\n    h2{ font-size:16px; color:#fff }\r\n    p.lede{ color:var(--muted); margin:8px 0 16px }\r\n    .shell{\r\n      display:grid;\r\n      grid-template-columns: 300px 1fr;\r\n      gap:16px;\r\n      min-height:520px;\r\n    }\r\n    @media (max-width: 900px){\r\n      .shell{ grid-template-columns:1fr }\r\n    }\r\n    \/* === SIDEBAR LIST (grouped) === *\/\r\n    .sidebar{\r\n      background:linear-gradient(180deg,var(--panel),var(--panel-2));\r\n      border:1px solid #202531;\r\n      border-radius:var(--radius);\r\n      overflow:hidden;\r\n      display:flex; flex-direction:column;\r\n      min-height:480px;\r\n    }\r\n    .toolbar{\r\n      display:grid; gap:8px;\r\n      grid-template-columns:auto 1fr 36px 36px;\r\n      padding:10px;\r\n      border-bottom:1px solid var(--grid);\r\n      background:linear-gradient(180deg,rgba(57,208,255,.04),transparent);\r\n      position:sticky; top:0; z-index:2;\r\n    }\r\n    .search{\r\n      width:100%;\r\n      background:#0e1118; border:1px solid #1e2430; color:#fff;\r\n      border-radius:10px; padding:8px 12px; outline:none;\r\n    }\r\n    .search::placeholder{\r\n      color:var(--muted);\r\n    }\r\n    .search-icon{\r\n      color:#7d8798; display:flex; align-items:center; justify-content:center;\r\n    }\r\n    .sort{\r\n      border:1px solid #1e2430; background:#0e1118; color:var(--ink);\r\n      border-radius:10px; cursor:pointer;\r\n    }\r\n    .toggle-groups{\r\n      border:1px solid #1e2430; background:#0e1118; color:var(--ink);\r\n      border-radius:10px; cursor:pointer;\r\n    }\r\n    .list{\r\n      overflow:auto; flex:1;\r\n      scrollbar-width:thin; scrollbar-color:#2b3242 transparent;\r\n    }\r\n    .group{\r\n      border-bottom:1px solid rgba(255,255,255,.04);\r\n    }\r\n    .group-title{\r\n      width:100%; text-align:left;\r\n      display:flex; align-items:center; justify-content:space-between;\r\n      gap:8px; padding:8px 10px; cursor:pointer;\r\n      background:linear-gradient(180deg,#151924,#121622);\r\n      border-bottom:1px solid rgba(255,255,255,.03);\r\n      font-weight:600;\r\n    }\r\n    .group-title .left{ display:flex; align-items:center; gap:8px }\r\n    .group-title .count{ color:var(--muted); font-weight:500; font-size:12px }\r\n    .group-items{ display:none }\r\n    .group[data-open=\"true\"] .group-items{ display:block }\r\n    .group-title .caret{ transition:transform .15s ease }\r\n    .group[data-open=\"true\"] .group-title .caret{ transform:rotate(180deg) }\r\n    .item{\r\n      display:grid;\r\n      grid-template-columns:42px 1fr auto;\r\n      gap:12px;\r\n      align-items:center;\r\n      padding:10px 12px;\r\n      border-bottom:1px solid rgba(255,255,255,.03);\r\n      background:transparent;\r\n      color:var(--ink);\r\n      cursor:pointer;\r\n      transition:background .15s ease, transform .04s ease;\r\n    }\r\n    .item:hover{ background:rgba(57,208,255,.06) }\r\n    .item.active{\r\n      background:linear-gradient(90deg,rgba(57,208,255,.12),transparent 60%);\r\n      outline:1px solid rgba(57,208,255,.35);\r\n    }\r\n    .item .name{ font-weight:600 }\r\n    .item .minor{ color:var(--muted) }\r\n    .badge{\r\n      display:inline-flex; gap:6px; align-items:center;\r\n      background:var(--chip); border:1px solid #2a3144; color:#b8c0cc;\r\n      padding:3px 8px; border-radius:999px; font-size:11px;\r\n    }\r\n    .item .actions{ display:flex; gap:10px; align-items:center }\r\n    .item .actions .fa{ color:#8a93a7 }\r\n    .item .actions .fa:hover{ color:var(--accent) }\r\n\r\n    \/* === ICON STYLES (consistent with Blueprints & Ships) === *\/\r\n    .bp-icon, .bp-icon-large {\r\n      border-radius:6px;\r\n      border:1px solid #2a3144;\r\n      background:#0e1118;\r\n      object-fit:contain;\r\n      box-shadow:0 2px 8px rgba(0,0,0,.35);\r\n      flex-shrink:0;\r\n      image-rendering: crisp-edges;\r\n    }\r\n    .bp-icon { width:36px; height:36px; }\r\n    .bp-icon-large { width:96px; height:96px; border-width:2px; border-color:#39d0ff; box-shadow:0 0 18px rgba(57,208,255,.4), 0 6px 22px rgba(0,0,0,.5); }\r\n    .icon-frame {\r\n      width:120px; height:120px;\r\n      background:linear-gradient(145deg, #12141b, #0a0c10);\r\n      border:1px solid #263042;\r\n      border-radius:12px;\r\n      display:flex; align-items:center; justify-content:center;\r\n      overflow:hidden;\r\n      box-shadow: inset 0 0 0 1px rgba(255,255,255,.03), 0 6px 24px rgba(0,0,0,.45);\r\n      position:relative;\r\n    }\r\n    .icon-frame::after {\r\n      content:'';\r\n      position:absolute; inset:0;\r\n      background:radial-gradient(circle at 30% 25%, rgba(57,208,255,.12), transparent 60%);\r\n      pointer-events:none;\r\n    }\r\n    .placeholder {\r\n      display:flex; align-items:center; justify-content:center;\r\n      color:#4a5468; background:#0e1118; width:100%; height:100%;\r\n    }\r\n\r\n    \/* === DETAIL PANEL === *\/\r\n    .panel{\r\n      background:linear-gradient(180deg,var(--panel),var(--panel-2));\r\n      border:1px solid #202531;\r\n      border-radius:var(--radius);\r\n      padding:16px;\r\n      min-height:480px;\r\n      position:relative; overflow:hidden;\r\n    }\r\n    .panel-grid{\r\n      display:grid; grid-template-columns: 1.2fr .8fr;\r\n      gap:16px;\r\n    }\r\n    @media (max-width: 1100px){\r\n      .panel-grid{ grid-template-columns:1fr }\r\n    }\r\n    \/* Holo header *\/\r\n    .holo{\r\n      display:grid; grid-template-columns:140px 1fr auto; gap:14px; align-items:center;\r\n      padding:12px; border:1px solid #263042; border-radius:12px;\r\n      background:linear-gradient(180deg,rgba(0,255,168,.06),rgba(57,208,255,.04));\r\n      box-shadow:inset 0 0 0 1px rgba(255,255,255,.02);\r\n    }\r\n    .wire{\r\n      width:100%; aspect-ratio:1\/1; background:radial-gradient(60% 60% at 50% 40%, rgba(57,208,255,.15), transparent 70%);\r\n      border-radius:10px; position:relative; overflow:hidden;\r\n    }\r\n    .wire svg{ position:absolute; inset:0 }\r\n    .wire .glow{\r\n      filter:drop-shadow(0 0 6px rgba(57,208,255,.85)) drop-shadow(0 0 18px rgba(0,255,168,.35));\r\n    }\r\n    @keyframes dash { to { stroke-dashoffset:-1200 } }\r\n    @keyframes ping { 0%{ opacity:.55; transform:scale(1) } 70%{ opacity:.1; transform:scale(1.08) } 100%{ opacity:.55; transform:scale(1) } }\r\n    .title{ display:flex; flex-direction:column; gap:4px }\r\n    .title h2{ margin:0; font-size:18px; letter-spacing:.12em }\r\n    .sub{ color:var(--muted); font-size:12px }\r\n    .chips{ display:flex; gap:8px; flex-wrap:wrap }\r\n    \/* Quick stats row *\/\r\n    .quick{\r\n      display:grid; grid-template-columns:repeat(4,1fr); gap:8px; margin-top:12px;\r\n    }\r\n    @media (max-width: 600px){ .quick{ grid-template-columns:repeat(2,1fr) } }\r\n    .q{\r\n      background:linear-gradient(180deg,#0e1118,#0c0f15);\r\n      border:1px solid #1d2432; border-radius:10px; padding:10px;\r\n    }\r\n    .q div:first-child{ color:var(--muted); font-size:11px; letter-spacing:.08em; text-transform:uppercase }\r\n    .q strong{ font-size:16px }\r\n    \/* Stat grid *\/\r\n    .stats{\r\n      margin-top:14px;\r\n      display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:8px;\r\n    }\r\n    @media (max-width: 900px){ .stats{ grid-template-columns:1fr } }\r\n    .stat{\r\n      background:#0f131b; border:1px solid #1e2431; border-radius:10px; padding:10px;\r\n      display:flex; justify-content:space-between; gap:12px;\r\n    }\r\n    .stat label{ color:var(--muted); font-size:12px }\r\n    .stat span{ font-weight:600 }\r\n    \/* Blueprint *\/\r\n    .bp{\r\n      background:linear-gradient(180deg,rgba(57,208,255,.05),rgba(0,255,168,.04));\r\n      border:1px dashed #284758; border-radius:12px; padding:12px;\r\n    }\r\n    .bp h3{ margin-top:0 }\r\n    .materials{\r\n      display:grid; grid-template-columns: 1fr auto; gap:6px 12px; align-items:center;\r\n      margin-top:8px;\r\n    }\r\n    .tag{\r\n      background:var(--chip); border:1px solid #2a3144; border-radius:999px;\r\n      padding:4px 10px; font-size:12px; color:#c9d3e0; width:max-content;\r\n    }\r\n    .btn-mini{\r\n      display:inline-flex; align-items:center; gap:6px;\r\n      background:#0e1118; border:1px solid #1e2431; color:#d7deea;\r\n      border-radius:999px; padding:6px 10px; cursor:pointer;\r\n    }\r\n    .btn-mini:hover{ border-color:#2b3850; color:#fff }\r\n    \/* Compare panel *\/\r\n    .compare-wrap{\r\n      margin-top:14px;\r\n    }\r\n    .compare-head{\r\n      display:flex; align-items:center; justify-content:space-between; gap:10px;\r\n      margin-bottom:8px;\r\n    }\r\n    .table-scroll{ overflow:auto; border:1px solid #223043; border-radius:10px }\r\n    .compare-table{\r\n      width:100%; border-collapse:separate; border-spacing:0;\r\n      min-width:720px;\r\n    }\r\n    .compare-table th, .compare-table td{\r\n      padding:10px; border-bottom:1px solid #1e2a3c; text-align:left; vertical-align:top;\r\n      background:#0e1219;\r\n    }\r\n    .compare-table thead th{\r\n      position:sticky; top:0; background:#151a24; z-index:1;\r\n    }\r\n    .compare-table tbody tr:nth-child(odd) td{ background:#0d1117 }\r\n    .col-attr{ width:220px; white-space:nowrap }\r\n    .remove-btn{ cursor:pointer; color:#9aa6b2 }\r\n    .remove-btn:hover{ color:#ff8080 }\r\n    \/* Footer status *\/\r\n    .status{\r\n      position:sticky; bottom:0; left:0; right:0;\r\n      margin-top:12px; padding:10px 12px;\r\n      background:linear-gradient(180deg, transparent, rgba(10,12,16,.9));\r\n      border-top:1px solid #1f2532; backdrop-filter:blur(6px);\r\n      display:flex; justify-content:space-between; gap:12px; align-items:center;\r\n      font-size:12px; color:var(--muted);\r\n    }\r\n    \/* Tiny helpers *\/\r\n    .mono{ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace }\r\n    .faint{ color:var(--muted) }\r\n    .sep{ opacity:.35; margin:0 8px }\r\n    \/* New styles for module details panel *\/\r\n    .section-title{ font-size:16px; color:#fff; letter-spacing:.08em; text-transform:uppercase; margin:16px 0 8px; }\r\n    .stat-line{ display:flex; align-items:center; gap:8px; margin-bottom:6px; }\r\n    .stat-line img{ width:32px; height:32px; }\r\n    .stat-line label{ flex:1; color:var(--muted); }\r\n    .stat-line span{ font-weight:600 }\r\n    .resistances{ display:flex; gap:8px; margin-bottom:12px; }\r\n    .res-item{ display:flex; align-items:center; gap:8px; flex:1; }\r\n    .bar-wrap{ flex:1; position:relative; }\r\n    .percent{ position:absolute; top:-18px; left:0; font-size:12px; color:var(--muted); }\r\n    .bar{ height:10px; background:var(--chip); border-radius:4px; }\r\n    .fill{ height:100%; border-radius:4px; }\r\n    .em .fill{ background:var(--accent); }\r\n    .therm .fill{ background:var(--red); }\r\n    .kin .fill{ background:var(--muted); }\r\n    .exp .fill{ background:var(--warn); }\r\n    .sensor-row{ display:flex; gap:12px; margin-top:8px; }\r\n    .sensor{ display:flex; align-items:center; gap:6px; color:var(--muted); font-size:12px; }\r\n    \/* Additional styles for modules page *\/\r\n    table.module-stats, table.build-table, table.compare-table {\r\n      width: 100%; border-collapse: collapse; margin-top: 10px; font-size: 14px;\r\n    }\r\n    table th, table td { border: 1px solid #555; padding: 6px; text-align: left; }\r\n    .compare-controls { margin: 10px 0; }\r\n    .compare-controls button { margin-right: 5px; padding: 6px 10px; background: #0af; border: none; color: white; border-radius: 5px; cursor: pointer; }\r\n    .compare-controls button:hover { background: #08c; }\r\n    .attribute-toggles { margin: 10px 0; }\r\n    .attribute-toggles button { margin: 3px; padding: 5px 8px; border: 1px solid #0af; background: #111; color: #0af; border-radius: 4px; cursor: pointer; font-size: 12px; }\r\n    .attribute-toggles button.active { background: #0af; color: #fff; }\r\n    .attribute-toggles button.unique { border-color: #f0c000; color: #f0c000; }\r\n    .attribute-toggles button.unique.active { background: #f0c000; color: #000; }\r\n    canvas { background: var(--panel); border-radius: 8px; padding: 10px; margin-top: 10px; width: 100%; height: 300px; box-sizing: border-box; }\r\n    #toast {\r\n      visibility: hidden;\r\n      min-width: 220px;\r\n      background: rgba(20,20,20,0.9);\r\n      color: var(--accent);\r\n      text-align: center;\r\n      border: 1px solid var(--accent);\r\n      border-radius: 6px;\r\n      padding: 12px;\r\n      position: fixed;\r\n      z-index: 9999;\r\n      right: 20px;\r\n      bottom: 20px;\r\n      font-size: 14px;\r\n      opacity: 0;\r\n      transform: translateY(20px);\r\n      transition: all 0.5s ease;\r\n      box-shadow: 0 0 12px rgba(0,170,255,0.6);\r\n    }\r\n    #toast.show {\r\n      visibility: visible;\r\n      opacity: 1;\r\n      transform: translateY(0);\r\n    }\r\n  <\/style>\r\n\r\n  <p class=\"lede\">Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint requirements, and configurations \u2014 now with beautiful icons. Compare modules to craft strategies for fitting, combat, or base-building.<\/p>\r\n\r\n  <div class=\"shell\">\r\n    <!-- SIDEBAR -->\r\n    <aside class=\"sidebar\" id=\"module-sidebar\">\r\n      <div class=\"toolbar\">\r\n        <i class=\"fa fa-search search-icon\" aria-hidden=\"true\"><\/i>\r\n        <input class=\"search\" id=\"searchBox\" type=\"search\" placeholder=\"Search module name \/ typeID\u2026\" \/>\r\n        <button class=\"sort\" id=\"sortBtn\" title=\"Toggle sort name A\u21c4Z\" style=\"display: none;\">\r\n          <i class=\"fa fa-sort-alpha-asc\" aria-hidden=\"true\"><\/i>\r\n        <\/button>\r\n        <button class=\"toggle-groups\" id=\"toggleGroups\" title=\"Toggle all groups\">\r\n          <i class=\"fa fa-plus-square\" aria-hidden=\"true\"><\/i>\r\n        <\/button>\r\n      <\/div>\r\n      <div class=\"list\" id=\"module-list\"><\/div>\r\n    <\/aside>\r\n\r\n    <!-- DETAILS -->\r\n    <section class=\"panel\" id=\"module-detail\">\r\n      <div id=\"detail\">\r\n        <!-- Placeholder before selection -->\r\n        <div class=\"holo\" aria-live=\"polite\">\r\n          <div class=\"wire\">\r\n            <svg viewBox=\"0 0 200 200\" role=\"img\" aria-label=\"Holographic placeholder\">\r\n              <defs>\r\n                <linearGradient id=\"grad\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"1\">\r\n                  <stop offset=\"0%\" stop-color=\"#39d0ff\" stop-opacity=\"1\"\/>\r\n                  <stop offset=\"100%\" stop-color=\"#00ffa8\" stop-opacity=\"1\"\/>\r\n                <\/linearGradient>\r\n              <\/defs>\r\n              <polygon points=\"100,18 182,78 156,182 44,182 18,78\"\r\n                fill=\"none\" stroke=\"url(#grad)\" stroke-width=\"2\"\r\n                stroke-dasharray=\"8 6\" style=\"animation:dash 12s linear infinite\"\r\n                class=\"glow\"\/>\r\n              <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"url(#grad)\" stroke-opacity=\".35\" stroke-width=\"1\" style=\"animation:ping 4.5s ease-in-out infinite\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <div class=\"title\">\r\n            <h2>Select a module<\/h2>\r\n            <div class=\"sub\">Use the left sidebar to browse all modules from the current build of EVE Frontier. Icons now live!<\/div>\r\n            <div class=\"chips\">\r\n              <span class=\"badge\"><i class=\"fa fa-plug\"><\/i> Dynamic Data<\/span>\r\n              <span class=\"badge\"><i class=\"fa fa-bolt\"><\/i> Animated SVG<\/span>\r\n              <span class=\"badge\"><i class=\"fa fa-industry\"><\/i> Blueprint View<\/span>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"tag\"><i class=\"fa fa-database\"><\/i> Live: modules.json + icons<\/div>\r\n        <\/div>\r\n        <div class=\"quick\">\r\n          <div class=\"q\"><div>Activation Cost<\/div><strong>\u2014<\/strong><\/div>\r\n          <div class=\"q\"><div>Powergrid<\/div><strong>\u2014<\/strong><\/div>\r\n          <div class=\"q\"><div>CPU<\/div><strong>\u2014<\/strong><\/div>\r\n          <div class=\"q\"><div>Duration<\/div><strong>\u2014<\/strong><\/div>\r\n        <\/div>\r\n        <div class=\"stats\">\r\n          <div class=\"stat\"><label>Nothing selected<\/label><span class=\"faint\">Pick a module to populate stats<\/span><\/div>\r\n        <\/div>\r\n        <div style=\"height:8px\"><\/div>\r\n        <div class=\"bp\">\r\n          <h3><i class=\"fa fa-cogs\"><\/i> Blueprint<\/h3>\r\n          <div class=\"faint\">Materials and build time will appear when a module is selected.<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- COMPARE (under Module Details) -->\r\n      <div id=\"compareWrap\" class=\"compare-wrap\" style=\"display:none;\">\r\n        <div class=\"bp\">\r\n          <div class=\"compare-head\">\r\n            <h3><i class=\"fa fa-balance-scale\"><\/i> Compare<\/h3>\r\n            <button id=\"compareReset\" class=\"btn-mini\" title=\"Clear all\"><i class=\"fa fa-times\"><\/i> Reset<\/button>\r\n          <\/div>\r\n          <div class=\"table-scroll\">\r\n            <table class=\"compare-table\" id=\"compareTable\" aria-live=\"polite\"><\/table>\r\n          <\/div>\r\n          <div id=\"chartSection\"><\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"status\">\r\n        <span id=\"statusText\">Fetching data\u2026<\/span>\r\n        <span><span class=\"sep\">\u2022<\/span> <span id=\"count\">0<\/span> modules loaded<\/span>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n\r\n  <!-- Load local Chart.js -->\r\n  <script src=\"https:\/\/gamingwithdaopa.ellatha.com\/media\/evefrontier\/chart.js\"><\/script>\r\n  <div id=\"toast\"><\/div>\r\n\r\n  <script>\r\n  (async function() {\r\n    const root = document.getElementById('evefrontier-modules');\r\n    const JSON_URL = root.getAttribute('data-json');\r\n    const els = {\r\n      list: document.getElementById('module-list'),\r\n      detail: document.getElementById('detail'),\r\n      search: document.getElementById('searchBox'),\r\n      sortBtn: document.getElementById('sortBtn'),\r\n      toggleGroups: document.getElementById('toggleGroups'),\r\n      status: document.getElementById('statusText'),\r\n      count: document.getElementById('count'),\r\n      compareWrap: document.getElementById('compareWrap'),\r\n      compareTable: document.getElementById('compareTable'),\r\n      compareReset: document.getElementById('compareReset'),\r\n    };\r\n\r\n    \/** Utils **\/\r\n    const fmtNum = (n) => {\r\n      if (n === null || n === undefined || Number.isNaN(n)) return \"\u2014\";\r\n      const x = +n;\r\n      if (Math.abs(x) >= 1000) return x.toLocaleString();\r\n      if (Number.isInteger(x)) return x.toString();\r\n      return x.toLocaleString(undefined, {maximumFractionDigits: 3});\r\n    };\r\n\r\n    const secsToHMS = (s) => {\r\n      if (!Number.isFinite(+s)) return \"\u2014\";\r\n      const d = Math.floor(s\/86400), h = Math.floor((s%86400)\/3600), m = Math.floor((s%3600)\/60);\r\n      const parts = [];\r\n      if (d) parts.push(`${d}d`);\r\n      if (h) parts.push(`${h}h`);\r\n      if (m || (!d && !h)) parts.push(`${m}m`);\r\n      return parts.join(\" \");\r\n    };\r\n\r\n    const prefer = (obj, keys) => {\r\n      for (const k of keys){ if (obj && obj[k]) return obj[k]; }\r\n      return null;\r\n    };\r\n\r\n    const get = (obj, path, d=undefined) => path.split('.').reduce((o,k)=> (o && o[k]!==undefined) ? o[k] : d, obj);\r\n\r\n    \/** Icon helper - same logic as Blueprints & Ships pages **\/\r\n    const ICON_BASE = 'https:\/\/gamingwithdaopa.ellatha.com\/media\/evefrontier\/icons\/';\r\n    function getIconHTML(mod, size = 'small') {\r\n      const cls = size === 'large' ? 'bp-icon-large' : 'bp-icon';\r\n      if (!mod) {\r\n        const phStyle = size === 'large' ? 'width:96px;height:96px;font-size:42px;' : 'width:36px;height:36px;';\r\n        return `<div class=\"${cls} placeholder\" style=\"${phStyle}\"><i class=\"fa fa-cubes\"><\/i><\/div>`;\r\n      }\r\n      let iconFile = null;\r\n      if (mod.iconID) {\r\n        iconFile = `${mod.iconID}.png`;\r\n      } else if (mod.graphicID) {\r\n        iconFile = `g${mod.graphicID}.png`;\r\n      }\r\n      if (iconFile) {\r\n        const safeName = (mod.name || 'Module').replace(\/\"\/g, '&quot;');\r\n        return `<img decoding=\"async\" class=\"${cls}\" src=\"${ICON_BASE}${iconFile}\" alt=\"${safeName} icon\" loading=\"lazy\" \/>`;\r\n      }\r\n      const phStyle = size === 'large' ? 'width:96px;height:96px;font-size:42px;' : 'width:36px;height:36px;';\r\n      return `<div class=\"${cls} placeholder\" style=\"${phStyle}\"><i class=\"fa fa-cubes\"><\/i><\/div>`;\r\n    }\r\n\r\n    \/** Group order **\/\r\n    const GROUP_RANK = {\r\n      \"Other\":99\r\n    };\r\n    const rankGroup = (g) => GROUP_RANK[g] ?? 98;\r\n\r\n    \/** Group to hologram config **\/\r\n    const groupToHolo = {\r\n      \"Rig Targeting\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Salvager\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Sensor Booster\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Shield Booster\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Shield Extender\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Shield Hardener\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Shield Recharger\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Stasis Web\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Survey Probe Launcher\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Survey Scanner\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Target Painter\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Tracking Computer\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Tracking Disruptor\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Warp Disruptor\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Warp Scrambler\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Weapon Upgrades\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} },\r\n      \"Other\": { pnts: \"100,18 182,78 156,182 44,182 18,78\", circle: {cx:100, cy:100, r:70} }\r\n    };\r\n\r\n    \/** State **\/\r\n    let modules = [];\r\n    let sortAsc = true;\r\n    let activeTypeID = null;\r\n    let compareList = [];\r\n    let selectedChartAttributes = [\"CPU usage\", \"Powergrid Usage\"];\r\n    let allOpen = false;\r\n\r\n    \/** Fetch **\/\r\n    async function load(){\r\n      try{\r\n        els.status.textContent = 'Fetching data\u2026';\r\n        const res = await fetch(JSON_URL, {mode:'cors'});\r\n        if(!res.ok) throw new Error(`HTTP ${res.status}`);\r\n        const data = await res.json();\r\n        if(!data || !Array.isArray(data.modules)) throw new Error('Invalid JSON: missing \"modules\" array');\r\n        modules = data.modules;\r\n        els.count.textContent = modules.length;\r\n        els.status.textContent = 'Ready';\r\n        renderList();\r\n        showDashboard();\r\n      }catch(err){\r\n        console.error(err);\r\n        els.status.innerHTML = `Could not fetch <span class=\"mono\">modules.json<\/span>.`;\r\n        els.list.innerHTML = `<div style=\"padding:12px;color:#ff9a9a\">Fetch error: ${err.message}<\/div>`;\r\n      }\r\n    }\r\n\r\n    \/** Build grouped list with icons **\/\r\n    function renderList(){\r\n      const q = els.search.value?.trim().toLowerCase() || '';\r\n      const filtered = modules.filter(s => {\r\n        const name = (s.name||'').toLowerCase();\r\n        const typeID = String(s.typeID||'');\r\n        const groupStr = (s.group || '').toLowerCase();\r\n        return name.includes(q) || typeID.includes(q) || groupStr.includes(q);\r\n      });\r\n\r\n      const map = new Map();\r\n      for (const s of filtered){\r\n        const group = s.group || (s.groupID != null ? `Group ${s.groupID}` : 'Other');\r\n        if (!map.has(group)) map.set(group, []);\r\n        map.get(group).push(s);\r\n      }\r\n\r\n      const groups = Array.from(map.entries())\r\n        .sort(([ga],[gb]) => (rankGroup(ga) - rankGroup(gb)) || ga.localeCompare(gb));\r\n\r\n      els.list.innerHTML = '';\r\n\r\n      for (const [groupName, arr] of groups){\r\n        arr.sort((a,b)=>{\r\n          const A = (a.name||'').toLowerCase();\r\n          const B = (b.name||'').toLowerCase();\r\n          return sortAsc ? A.localeCompare(B) : B.localeCompare(A);\r\n        });\r\n\r\n        const section = document.createElement('div');\r\n        section.className = 'group';\r\n        section.dataset.open = 'false';\r\n\r\n        const title = document.createElement('button');\r\n        title.className = 'group-title';\r\n        title.innerHTML = `\r\n          <span class=\"left\">\r\n            <i class=\"fa fa-folder-o\" aria-hidden=\"true\"><\/i>\r\n            ${groupName}\r\n          <\/span>\r\n          <span>\r\n            <span class=\"count\">${arr.length}<\/span>\r\n            <i class=\"fa fa-caret-down caret\" aria-hidden=\"true\"><\/i>\r\n          <\/span>\r\n        `;\r\n        title.addEventListener('click', ()=>{\r\n          section.dataset.open = section.dataset.open === 'true' ? 'false' : 'true';\r\n          title.querySelector('.left i').className = section.dataset.open === 'true' ? 'fa fa-folder-open-o' : 'fa fa-folder-o';\r\n        });\r\n\r\n        const items = document.createElement('div');\r\n        items.className = 'group-items';\r\n\r\n        for (const s of arr){\r\n          const btn = document.createElement('div');\r\n          btn.className = 'item' + (s.typeID===activeTypeID ? ' active':'');\r\n          const iconHTML = getIconHTML(s);\r\n\r\n          btn.innerHTML = `\r\n            ${iconHTML}\r\n            <div>\r\n              <div class=\"name\">${s.name||'Unnamed Module'}<\/div>\r\n              <div class=\"chips\" style=\"margin-top:6px\">\r\n                <span class=\"badge\" title=\"Group\"><i class=\"fa fa-tags\"><\/i> ${s.group || ('Group '+(s.groupID??'\u2014'))}<\/span>\r\n                ${s.volume!=null? `<span class=\"badge\"><i class=\"fa fa-cube\"><\/i> ${fmtNum(s.volume)} m\u00b3<\/span>`:''}\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"actions\">\r\n              <i class=\"fa fa-plus-circle\" title=\"Add to compare\" aria-hidden=\"true\"><\/i>\r\n              <span class=\"tag\">Select<\/span>\r\n            <\/div>\r\n          `;\r\n\r\n          btn.addEventListener('click', (e)=>{\r\n            if (e.target && e.target.classList.contains('fa-plus-circle')) return;\r\n            selectModule(s.typeID);\r\n          });\r\n          btn.querySelector('.fa-plus-circle').addEventListener('click', (e)=>{\r\n            e.stopPropagation();\r\n            addToCompare(s.typeID);\r\n          });\r\n          items.appendChild(btn);\r\n        }\r\n\r\n        section.appendChild(title);\r\n        section.appendChild(items);\r\n        els.list.appendChild(section);\r\n      }\r\n    }\r\n\r\n    function showDashboard() {\r\n      const totalModules = modules.length;\r\n      const groupMap = {};\r\n      modules.forEach(m => {\r\n        const g = m.group || 'Other';\r\n        groupMap[g] = (groupMap[g] || 0) + 1;\r\n      });\r\n      const groupCounts = Object.entries(groupMap).map(([k,v]) => ({group:k,count:v})).sort((a,b)=>b.count-a.count);\r\n      const random = modules[Math.floor(Math.random()*modules.length)];\r\n      const featIcon = getIconHTML(random);\r\n\r\n      els.detail.innerHTML = `\r\n        <div class=\"holo\" aria-live=\"polite\">\r\n          <div class=\"wire\">\r\n            <svg viewBox=\"0 0 200 200\" role=\"img\" aria-label=\"Holographic placeholder\">\r\n              <defs>\r\n                <linearGradient id=\"grad\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"1\">\r\n                  <stop offset=\"0%\" stop-color=\"#39d0ff\" stop-opacity=\"1\"\/>\r\n                  <stop offset=\"100%\" stop-color=\"#00ffa8\" stop-opacity=\"1\"\/>\r\n                <\/linearGradient>\r\n              <\/defs>\r\n              <polygon points=\"100,18 182,78 156,182 44,182 18,78\"\r\n                fill=\"none\" stroke=\"url(#grad)\" stroke-width=\"2\"\r\n                stroke-dasharray=\"8 6\" style=\"animation:dash 12s linear infinite\"\r\n                class=\"glow\"\/>\r\n              <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"url(#grad)\" stroke-opacity=\".35\" stroke-width=\"1\" style=\"animation:ping 4.5s ease-in-out infinite\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <div class=\"title\">\r\n            <h2>Welcome to the Cycle 5 Module Explorer<\/h2>\r\n            <div class=\"sub\">Discover ${totalModules} modules available in EVE Frontier Cycle 5. Icons now live!<\/div>\r\n            <div class=\"chips\">\r\n              <span class=\"badge\"><i class=\"fa fa-plug\"><\/i> Dynamic Data<\/span>\r\n              <span class=\"badge\"><i class=\"fa fa-bolt\"><\/i> Animated SVG<\/span>\r\n              <span class=\"badge\"><i class=\"fa fa-industry\"><\/i> Blueprint View<\/span>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"tag\"><i class=\"fa fa-database\"><\/i> Live: modules.json + icons<\/div>\r\n        <\/div>\r\n        <canvas id=\"groupChart\" style=\"margin-top:16px;\"><\/canvas>\r\n        <h3 class=\"section-title\">Featured Module<\/h3>\r\n        <div style=\"display:flex; gap:14px; align-items:flex-start; margin:8px 0 4px;\">\r\n          ${featIcon}\r\n          <div style=\"flex:1; min-width:0;\">\r\n            <p style=\"margin:0 0 4px\"><strong>${random.name}<\/strong> <span class=\"faint\">(${random.group})<\/span><\/p>\r\n            ${random.description ? `<p style=\"margin:0; font-size:13px; color:var(--muted); line-height:1.45\">${random.description.length > 180 ? random.description.substring(0,177)+'\u2026' : random.description}<\/p>` : ''}\r\n            ${random.stats?.[\"CPU usage\"]?.value ? `<div style=\"margin-top:6px\"><span class=\"badge\">CPU: ${random.stats[\"CPU usage\"].value} tf<\/span><\/div>` : \"\"}\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n\r\n      const ctx = document.getElementById(\"groupChart\").getContext(\"2d\");\r\n      new Chart(ctx, {\r\n        type: 'bar',\r\n        data: {\r\n          labels: groupCounts.map(g=>g.group),\r\n          datasets: [{ label:'Modules', data:groupCounts.map(g=>g.count), backgroundColor:'rgba(57,208,255,0.6)' }]\r\n        },\r\n        options:{ responsive:true, plugins:{legend:{display:false}} }\r\n      });\r\n    }\r\n\r\n    \/** Detail view with large icon **\/\r\n    function selectModule(typeID){\r\n      activeTypeID = typeID;\r\n      const mod = modules.find(x=>x.typeID===typeID);\r\n      if(!mod) return;\r\n\r\n      const s = mod.stats || {};\r\n      const vAct = prefer(s, ['Activation Cost']);\r\n      const vPG = prefer(s, ['Powergrid Usage']);\r\n      const vCPU = prefer(s, ['CPU usage']);\r\n      const vDur = prefer(s, ['Duration']);\r\n      const bp = mod.build || {};\r\n      const mats = Array.isArray(bp.materials) ? bp.materials : [];\r\n\r\n      const group = mod.group || (mod.groupID != null ? `Group ${mod.groupID}` : 'Other');\r\n      const holo = groupToHolo[group] || groupToHolo[\"Other\"];\r\n      const pnts = holo.pnts;\r\n      const cx = holo.circle.cx;\r\n      const cy = holo.circle.cy;\r\n      const r = holo.circle.r;\r\n\r\n      const getValue = (keys) => prefer(s, keys)?.value ?? null;\r\n      const getUnit = (keys) => prefer(s, keys)?.unit || '';\r\n\r\n      const largeIcon = getIconHTML(mod, 'large');\r\n\r\n      els.detail.innerHTML = `\r\n        <div class=\"holo\">\r\n          <div class=\"icon-frame\">\r\n            ${largeIcon}\r\n          <\/div>\r\n          <div class=\"title\">\r\n            <h2>${mod.name || 'Unnamed Module'}<\/h2>\r\n            <div class=\"sub\">${mod.description || 'No description in data.'}<\/div>\r\n            <div class=\"chips\">\r\n              ${mod.group ? `<span class=\"badge\"><i class=\"fa fa-tags\"><\/i> ${mod.group}<\/span>`:''}\r\n              ${mod.techLevel!=null ? `<span class=\"badge\">Tech: ${mod.techLevel}<\/span>`:''}\r\n              ${mod.metaLevel!=null ? `<span class=\"badge\">Meta: ${mod.metaLevel}<\/span>`:''}\r\n              ${mod.volume!=null ? `<span class=\"badge\" title=\"Volume\"><i class=\"fa fa-cube\"><\/i> ${fmtNum(mod.volume)} m\u00b3<\/span>`:''}\r\n              ${mod.capacity!=null ? `<span class=\"badge\" title=\"Capacity\"><i class=\"fa fa-archive\"><\/i> ${fmtNum(mod.capacity)} m\u00b3<\/span>`:''}\r\n              ${mod.mass!=null && mod.mass !== 0 ? `<span class=\"badge\" title=\"Mass\"><i class=\"fa fa-balance-scale\"><\/i> ${fmtNum(mod.mass)} kg<\/span>`:''}\r\n            <\/div>\r\n          <\/div>\r\n          <div style=\"display:flex; flex-direction:column; gap:6px; align-items:flex-end\">\r\n            <div class=\"tag\"><i class=\"fa fa-id-badge\"><\/i> typeID: <span class=\"mono\">${mod.typeID}<\/span><\/div>\r\n            <button class=\"btn-mini\" id=\"btnAddCompare\"><i class=\"fa fa-plus-circle\"><\/i> Add to Compare<\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"quick\">\r\n          <div class=\"q\"><div>Activation Cost<\/div><strong>${fmtNum(vAct?.value)}<\/strong><\/div>\r\n          <div class=\"q\"><div>Powergrid<\/div><strong>${fmtNum(vPG?.value)}<\/strong><\/div>\r\n          <div class=\"q\"><div>CPU<\/div><strong>${fmtNum(vCPU?.value)}<\/strong><\/div>\r\n          <div class=\"q\"><div>Duration<\/div><strong>${fmtNum(vDur?.value)}<\/strong><\/div>\r\n        <\/div>\r\n\r\n        ${(s && Object.keys(s).length) ? `\r\n          <h3 class=\"section-title\">Stats<\/h3>\r\n          <div class=\"stats\">\r\n            ${Object.entries(s).filter(([k,v]) => v?.value != null && !( (k === 'Mass' || k === 'Mass Addition') && v.value === 0 )).map(([k,v]) => {\r\n              let formattedValue = v.value;\r\n              let formattedUnit = v.unit || \"\";\r\n              if (formattedUnit === \"groupID\" || formattedUnit === \"1=True 0=False\" || formattedUnit === \"1=small 2=medium 3=l\") {\r\n                formattedUnit = \"\";\r\n              }\r\n              if (k === \"Cannot Auto Repeat\") {\r\n                formattedValue = v.value === 1.0 ? \"True\" : \"False\";\r\n              } else if (k === \"Charge size\") {\r\n                let size = \"\";\r\n                if (v.value === 1.0) size = \"Small\";\r\n                else if (v.value === 2.0) size = \"Medium\";\r\n                else if (v.value === 3.0) size = \"Large\";\r\n                formattedValue = size;\r\n              }\r\n              return `<div class=\"stat\"><label>${k}<\/label><span>${formattedValue} ${formattedUnit}<\/span><\/div>`;\r\n            }).join(\"\")}\r\n          <\/div>` : \"\"}\r\n\r\n        <div style=\"height:8px\"><\/div>\r\n\r\n        <div class=\"bp\">\r\n          <h3><i class=\"fa fa-cogs\"><\/i> Blueprint & Build<\/h3>\r\n          <div style=\"display:flex; gap:10px; flex-wrap:wrap\">\r\n            ${bp.blueprintTypeID!=null? `<span class=\"tag\">Blueprint ID: <span class=\"mono\">${bp.blueprintTypeID}<\/span><\/span>`:''}\r\n            ${bp.time!=null? `<span class=\"tag\">Build Time: ${secsToHMS(bp.time)}<\/span>`:''}\r\n            ${mod.basePrice!=null? `<span class=\"tag\">Base Price: ${fmtNum(mod.basePrice)} ISK<\/span>`:''}\r\n          <\/div>\r\n          <div style=\"height:8px\"><\/div>\r\n          ${mats.length\r\n            ? `<div class=\"materials\">\r\n                <div class=\"faint\">Material<\/div><div class=\"faint\" style=\"text-align:right\">Qty<\/div>\r\n                ${mats.map(m=>`\r\n                  <div>${m.name ?? m.typeID ?? 'Unknown'}<\/div>\r\n                  <div style=\"text-align:right\">${fmtNum(m.quantity ?? 0)}<\/div>\r\n                `).join('')}\r\n              <\/div>`\r\n            : `<div class=\"faint\">No materials listed for this module.<\/div>`\r\n          }\r\n        <\/div>\r\n      `;\r\n\r\n      const btnAdd = document.getElementById('btnAddCompare');\r\n      if (btnAdd){\r\n        btnAdd.addEventListener('click', ()=> addToCompare(typeID));\r\n      }\r\n\r\n      \/\/ refresh active highlight\r\n      for (const el of document.querySelectorAll('.item')) el.classList.remove('active');\r\n      const activeBtn = els.list.querySelector(`.item.active`);\r\n      \/\/ simple re-apply if needed\r\n      if (activeBtn) activeBtn.classList.add('active');\r\n\r\n      els.detail.parentElement.scrollTo({top:0, behavior:'smooth'});\r\n    }\r\n\r\n    \/** Compare helpers **\/\r\n    function addToCompare(typeID){\r\n      if (!compareList.includes(typeID)){\r\n        if (compareList.length >= 3){\r\n          showToast('You can compare up to 3 modules.');\r\n          return;\r\n        }\r\n        compareList.push(typeID);\r\n        renderCompare();\r\n        showToast(\"Module added to compare!\");\r\n      } else showToast(\"Already in compare list.\");\r\n    }\r\n\r\n    function removeFromCompare(typeID){\r\n      compareList = compareList.filter(id=>id!==typeID);\r\n      renderCompare();\r\n    }\r\n\r\n    function formatStat(k, v) {\r\n      let formattedValue = v.value;\r\n      let formattedUnit = v.unit || \"\";\r\n      if (formattedUnit === \"groupID\" || formattedUnit === \"1=True 0=False\" || formattedUnit === \"1=small 2=medium 3=l\") {\r\n        formattedUnit = \"\";\r\n      }\r\n      if (k === \"Cannot Auto Repeat\") {\r\n        formattedValue = v.value === 1.0 ? \"True\" : \"False\";\r\n      } else if (k === \"Charge size\") {\r\n        let size = \"\";\r\n        if (v.value === 1.0) size = \"Small\";\r\n        else if (v.value === 2.0) size = \"Medium\";\r\n        else if (v.value === 3.0) size = \"Large\";\r\n        formattedValue = size;\r\n      }\r\n      return {value: formattedValue, unit: formattedUnit};\r\n    }\r\n\r\n    function renderCompare(){\r\n      if (!compareList.length){\r\n        els.compareWrap.style.display = 'none';\r\n        els.compareTable.innerHTML = '';\r\n        return;\r\n      }\r\n      els.compareWrap.style.display = 'block';\r\n\r\n      const compared = compareList.map(id => modules.find(s=>s.typeID===id)).filter(Boolean);\r\n\r\n      const statKeys = new Set();\r\n      compared.forEach(m => Object.entries(m.stats || {}).forEach(([k,v]) => { if(v?.value!=null) statKeys.add(k); }));\r\n\r\n      \/\/ Header with icons\r\n      let html = '<thead><tr><th class=\"col-attr\">Attribute<\/th>';\r\n      for (const s of compared){\r\n        const cIcon = getIconHTML(s);\r\n        html += `<th>\r\n          <div style=\"display:flex; align-items:center; justify-content:space-between; gap:8px\">\r\n            <div style=\"display:flex; align-items:center; gap:8px;\">\r\n              ${cIcon}\r\n              <span style=\"font-weight:600;\">${s.name || '\u2014'}<\/span>\r\n            <\/div>\r\n            <span class=\"remove-btn\" title=\"Remove\" data-typeid=\"${s.typeID}\"><i class=\"fa fa-times\"><\/i><\/span>\r\n          <\/div>\r\n          <div class=\"faint mono\">typeID: ${s.typeID}<\/div>\r\n        <\/th>`;\r\n      }\r\n      html += '<\/tr><\/thead>';\r\n\r\n      const rows = [\r\n        { label:'Name', get:(s)=> s.name || '\u2014' },\r\n        { label:'Group', get:(s)=> s.group || (s.groupID!=null? 'Group '+s.groupID : '\u2014') },\r\n        { label:'Mass (kg)', get:(s)=> fmtNum(s.mass) },\r\n        { label:'Volume (m\u00b3)', get:(s)=> fmtNum(s.volume) },\r\n        { label:'Capacity (m\u00b3)', get:(s)=> fmtNum(s.capacity) },\r\n        { label:'Tech Level', get:(s)=> s.techLevel || '\u2014' },\r\n        { label:'Meta Level', get:(s)=> s.metaLevel || '\u2014' },\r\n        { label:'Powergrid Usage', get:(s)=> {\r\n            const v = prefer(s.stats || {}, ['Powergrid Usage']);\r\n            return v ? (fmtNum(v.value) + ' ' + (v.unit||'')) : '\u2014';\r\n          } },\r\n        { label:'CPU Usage', get:(s)=> {\r\n            const v = prefer(s.stats || {}, ['CPU usage']);\r\n            return v ? fmtNum(v.value) : '\u2014';\r\n          } },\r\n        { label:'Activation Cost', get:(s)=> {\r\n            const v = prefer(s.stats || {}, ['Activation Cost']);\r\n            return v ? fmtNum(v.value) : '\u2014';\r\n          } },\r\n        { label:'Duration', get:(s)=> {\r\n            const v = prefer(s.stats || {}, ['Duration']);\r\n            return v ? (fmtNum(v.value) + ' ' + (v.unit||'')) : '\u2014';\r\n          } },\r\n        { label:'Base Price (ISK)', get:(s)=> s.basePrice!=null? fmtNum(s.basePrice) : '\u2014' },\r\n        { label:'Build Time', get:(s)=> s.build && s.build.time!=null ? secsToHMS(s.build.time) : '\u2014' },\r\n      ];\r\n\r\n      html += '<tbody>';\r\n      for (const r of rows){\r\n        const values = compared.map(s => r.get(s));\r\n        if (values.every(v => v === '0' || v === '\u2014')) continue;\r\n        html += `<tr><td class=\"col-attr\">${r.label}<\/td>`;\r\n        for (const v of values){\r\n          html += `<td>${v}<\/td>`;\r\n        }\r\n        html += '<\/tr>';\r\n      }\r\n\r\n      \/\/ Dynamic stats\r\n      statKeys.forEach(k => {\r\n        const rowValues = compared.map(m => {\r\n          const v = m.stats?.[k];\r\n          if (!v) return \"\u2014\";\r\n          const {value: fv, unit: fu} = formatStat(k, v);\r\n          return `${fv} ${fu}`;\r\n        });\r\n        if(rowValues.every(v=>v===\"\u2014\")) return;\r\n        html += `<tr><td class=\"col-attr\">${k}<\/td>${rowValues.map(v=>`<td>${v}<\/td>`).join(\"\")}<\/tr>`;\r\n      });\r\n      html += '<\/tbody>';\r\n\r\n      els.compareTable.innerHTML = html;\r\n\r\n      els.compareTable.querySelectorAll('.remove-btn').forEach(btn=>{\r\n        btn.addEventListener('click', ()=>{\r\n          const id = Number(btn.getAttribute('data-typeid'));\r\n          removeFromCompare(id);\r\n        });\r\n      });\r\n\r\n      \/\/ Chart section\r\n      const chartSection = document.getElementById('chartSection');\r\n      chartSection.innerHTML = `\r\n        <div class=\"attribute-toggles\">\r\n          ${[...statKeys].filter(attr => compared.every(m => typeof (m.stats?.[attr]?.value) === 'number' && !((attr === 'Mass' || attr === 'Mass Addition') && m.stats?.[attr]?.value === 0))).map(attr=>`<button class=\"${selectedChartAttributes.includes(attr)?\"active\":\"\"} ${ (compared.filter(m=>m.stats?.[attr]?.value!=null).length === 1) ?\"unique\":\"\"}\">${attr}<\/button>`).join(\"\")}\r\n        <\/div>\r\n        <canvas id=\"compareChart\"><\/canvas>\r\n      `;\r\n\r\n      buildCompareChart(compared, selectedChartAttributes.filter(a => statKeys.has(a)));\r\n\r\n      chartSection.querySelectorAll('.attribute-toggles button').forEach(btn => {\r\n        btn.addEventListener('click', ()=>toggleAttribute(btn.textContent));\r\n      });\r\n    }\r\n\r\n    function buildCompareChart(selected, attributes) {\r\n      const ctx = document.getElementById(\"compareChart\").getContext(\"2d\");\r\n      const datasets = attributes.map(attr => ({\r\n        label: attr,\r\n        data: selected.map(m => m.stats?.[attr]?.value || 0),\r\n        backgroundColor: `hsl(${Math.random()*360},70%,50%)`\r\n      }));\r\n      if(window.compareChartInstance) window.compareChartInstance.destroy();\r\n      window.compareChartInstance = new Chart(ctx, {\r\n        type: 'bar',\r\n        data: {\r\n          labels: selected.map(m => m.name),\r\n          datasets: datasets\r\n        },\r\n        options: { responsive:true, plugins:{legend:{position:'bottom'}} }\r\n      });\r\n    }\r\n\r\n    const toggleAttribute = attr => {\r\n      selectedChartAttributes = selectedChartAttributes.includes(attr)\r\n        ? selectedChartAttributes.filter(a=>a!==attr)\r\n        : [...selectedChartAttributes, attr];\r\n      renderCompare();\r\n    };\r\n\r\n    function showToast(message) {\r\n      const toast = document.getElementById(\"toast\");\r\n      toast.textContent = message;\r\n      toast.className = \"show\";\r\n      setTimeout(() => toast.className = toast.className.replace(\"show\", \"\"), 2500);\r\n    }\r\n\r\n    \/** Events **\/\r\n    els.search.addEventListener('input', () => renderList());\r\n    els.sortBtn.addEventListener('click', ()=>{\r\n      sortAsc = !sortAsc;\r\n      els.sortBtn.innerHTML = sortAsc\r\n        ? '<i class=\"fa fa-sort-alpha-asc\" aria-hidden=\"true\"><\/i>'\r\n        : '<i class=\"fa fa-sort-alpha-desc\" aria-hidden=\"true\"><\/i>';\r\n      renderList();\r\n    });\r\n    els.toggleGroups.addEventListener('click', () => {\r\n      allOpen = !allOpen;\r\n      document.querySelectorAll('.group').forEach(g => {\r\n        g.dataset.open = allOpen ? 'true' : 'false';\r\n        g.querySelector('.left i').className = allOpen ? 'fa fa-folder-open-o' : 'fa fa-folder-o';\r\n      });\r\n      els.toggleGroups.innerHTML = allOpen ? '<i class=\"fa fa-minus-square\" aria-hidden=\"true\"><\/i>' : '<i class=\"fa fa-plus-square\" aria-hidden=\"true\"><\/i>';\r\n    });\r\n    els.compareReset.addEventListener('click', ()=>{\r\n      compareList = [];\r\n      renderCompare();\r\n      showToast(\"Compare list reset.\");\r\n    });\r\n\r\n    \/\/ Deep link support\r\n    window.addEventListener('hashchange', ()=>{\r\n      const m = location.hash.match(\/typeID-(\\d+)\/);\r\n      if(m) selectModule(Number(m[1]));\r\n    });\r\n\r\n    \/\/ Kick off\r\n    load().then(()=>{\r\n      const m = location.hash.match(\/typeID-(\\d+)\/);\r\n      if(m) selectModule(Number(m[1]));\r\n    });\r\n  })();\r\n  <\/script>\r\n<\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint requirements, and configurations \u2014 now with beautiful icons. Compare modules to craft strategies for fitting, combat, or base-building. Select a module Use the left sidebar to browse all modules from the current [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":106,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-85","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools"],"yoast_head":"<!-- Meta Tags -->\r\n<title>EVE Frontier Modules Explorer<\/title>\r\n<meta name=\"description\" content=\"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"EVE Frontier Modules Explorer\" \/>\r\n<meta property=\"og:description\" content=\"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\" \/>\r\n<meta property=\"og:site_name\" content=\"EVE Frontier\" \/>\r\n<meta property=\"article:publisher\" content=\"facebook.com\/gamingwithdaopa\/\" \/>\r\n<meta property=\"article:author\" content=\"facebook.com\/gamingwithdaopa\/\" \/>\r\n<meta property=\"article:published_time\" content=\"2025-08-23T00:28:46+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2026-06-04T01:58:23+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg\" \/>\r\n\t<meta property=\"og:image:width\" content=\"400\" \/>\r\n\t<meta property=\"og:image:height\" content=\"263\" \/>\r\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\r\n<meta name=\"author\" content=\"daopa\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:creator\" content=\"@gamingwithdaopa\" \/>\r\n<meta name=\"twitter:site\" content=\"@gamingwithdaopa\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"daopa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\"},\"author\":{\"name\":\"daopa\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"headline\":\"EVE Frontier Modules Explorer\",\"datePublished\":\"2025-08-23T00:28:46+00:00\",\"dateModified\":\"2026-06-04T01:58:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\"},\"wordCount\":105,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"image\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg\",\"articleSection\":[\"Tools\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\",\"name\":\"EVE Frontier Modules Explorer\",\"isPartOf\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg\",\"datePublished\":\"2025-08-23T00:28:46+00:00\",\"dateModified\":\"2026-06-04T01:58:23+00:00\",\"description\":\"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint\",\"breadcrumb\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg\",\"contentUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg\",\"width\":400,\"height\":263,\"caption\":\"eve frontier module explorer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EVE Frontier Modules Explorer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#website\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/\",\"name\":\"EVE Frontier\",\"description\":\"DaOpa&#039;s EVE Frontier Fansite - Guides, tools, databases, and lists to empower the EVE Frontier community in exploring the stars.\",\"publisher\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\"},\"alternateName\":\"evefrontier\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638\",\"name\":\"daopa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/90-90-Logo.png\",\"contentUrl\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/90-90-Logo.png\",\"width\":90,\"height\":90,\"caption\":\"daopa\"},\"logo\":{\"@id\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/image\/\"},\"description\":\"DaOpa has been variety streamer since 2009 with game focuses on primarily MMOs, Sandbox, RPG and FPS genres. For inquires comment in the comments sections. This channel is syndicated across various micro niche gaming related blogs operated by DaOpa. He creates fansites, guides, tools for gamers\",\"sameAs\":[\"https:\/\/gamingwithdaopa.ellatha.com\",\"facebook.com\/gamingwithdaopa\/\",\"https:\/\/x.com\/gamingwithdaopa\",\"youtube.com\/@daopa\"],\"url\":\"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/author\/daopa\/\"}]}<\/script>","yoast_head_json":{"title":"EVE Frontier Modules Explorer","description":"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/","og_locale":"en_US","og_type":"article","og_title":"EVE Frontier Modules Explorer","og_description":"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint","og_url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/","og_site_name":"EVE Frontier","article_publisher":"facebook.com\/gamingwithdaopa\/","article_author":"facebook.com\/gamingwithdaopa\/","article_published_time":"2025-08-23T00:28:46+00:00","article_modified_time":"2026-06-04T01:58:23+00:00","og_image":[{"width":400,"height":263,"url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg","type":"image\/jpeg"}],"author":"daopa","twitter_card":"summary_large_image","twitter_creator":"@gamingwithdaopa","twitter_site":"@gamingwithdaopa","twitter_misc":{"Written by":"daopa","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#article","isPartOf":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/"},"author":{"name":"daopa","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"headline":"EVE Frontier Modules Explorer","datePublished":"2025-08-23T00:28:46+00:00","dateModified":"2026-06-04T01:58:23+00:00","mainEntityOfPage":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/"},"wordCount":105,"commentCount":1,"publisher":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"image":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage"},"thumbnailUrl":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg","articleSection":["Tools"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/","url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/","name":"EVE Frontier Modules Explorer","isPartOf":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage"},"image":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage"},"thumbnailUrl":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg","datePublished":"2025-08-23T00:28:46+00:00","dateModified":"2026-06-04T01:58:23+00:00","description":"Plunge into the uncharted void of EVE Frontier Cycle 5 with our definitive Module Database! Select any module to uncover its stats, blueprint","breadcrumb":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#primaryimage","url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg","contentUrl":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/eve-frontier-module-explorer.jpg","width":400,"height":263,"caption":"eve frontier module explorer"},{"@type":"BreadcrumbList","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/equipment-database\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/"},{"@type":"ListItem","position":2,"name":"EVE Frontier Modules Explorer"}]},{"@type":"WebSite","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#website","url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/","name":"EVE Frontier","description":"DaOpa&#039;s EVE Frontier Fansite - Guides, tools, databases, and lists to empower the EVE Frontier community in exploring the stars.","publisher":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638"},"alternateName":"evefrontier","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/fb03a927907d90f409fac550ba375638","name":"daopa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/image\/","url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/90-90-Logo.png","contentUrl":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-content\/uploads\/sites\/40\/2025\/08\/90-90-Logo.png","width":90,"height":90,"caption":"daopa"},"logo":{"@id":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/#\/schema\/person\/image\/"},"description":"DaOpa has been variety streamer since 2009 with game focuses on primarily MMOs, Sandbox, RPG and FPS genres. For inquires comment in the comments sections. This channel is syndicated across various micro niche gaming related blogs operated by DaOpa. He creates fansites, guides, tools for gamers","sameAs":["https:\/\/gamingwithdaopa.ellatha.com","facebook.com\/gamingwithdaopa\/","https:\/\/x.com\/gamingwithdaopa","youtube.com\/@daopa"],"url":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/author\/daopa\/"}]}},"_links":{"self":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/posts\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":3,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":222,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/posts\/85\/revisions\/222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/media\/106"}],"wp:attachment":[{"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gamingwithdaopa.ellatha.com\/evefrontier\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}