Market addon using mwi-moonitoring library for WebSocket events
// ==UserScript==
// @name @mwm/addon
// @name:en MWI Market Addon
// @name:zh-CN MWI 市场插件
// @namespace https://milkyway.market/
// @version 1.12.1
// @author mathewcst
// @description:en Sync character data between MWI game and MilkyWay Market
// @description:zh-CN 同步 MWI 游戏和 MilkyWay Market 之间的角色数据
// @license MIT
// @icon https://www.google.com/s2/favicons?sz=64&domain=milkywayidle.com
// @match https://www.milkywayidle.com/*
// @match https://milkywayidle.com/*
// @match https://test.milkywayidle.com/*
// @match https://milkyway.market/*
// @match https://www.milkyway.market/*
// @connect milkyway.market
// @grant GM_addStyle
// @grant GM_addValueChangeListener
// @grant GM_getValue
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @description Market addon using mwi-moonitoring library for WebSocket events
// ==/UserScript==
(function() {
var d = new Set();
var _virtual_monkey_css_side_effects_default = async (e) => {
d.has(e) || (d.add(e), ((t) => {
typeof GM_addStyle == "function" ? GM_addStyle(t) : (document.head || document.documentElement).appendChild(document.createElement("style")).append(t);
})(e));
};
var _GM_addValueChangeListener = typeof GM_addValueChangeListener != "undefined" ? GM_addValueChangeListener : void 0;
var _GM_getValue = typeof GM_getValue != "undefined" ? GM_getValue : void 0;
var _GM_setClipboard = typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0;
var _GM_setValue = typeof GM_setValue != "undefined" ? GM_setValue : void 0;
var _GM_xmlhttpRequest = typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0, n$1, l$3, u$3, t$2, i$3, r$2, o$3, e$2, f$3, c$2, s$2, a$2, p$3 = {}, v$2 = [], y$3 = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i, d$3 = Array.isArray;
function w$3(n, l) {
for (var u in l) n[u] = l[u];
return n;
}
function g$2(n) {
n && n.parentNode && n.parentNode.removeChild(n);
}
function _$2(l, u, t) {
var i, r, o, e = {};
for (o in u) "key" == o ? i = u[o] : "ref" == o ? r = u[o] : e[o] = u[o];
if (arguments.length > 2 && (e.children = arguments.length > 3 ? n$1.call(arguments, 2) : t), "function" == typeof l && null != l.defaultProps) for (o in l.defaultProps) void 0 === e[o] && (e[o] = l.defaultProps[o]);
return m$3(l, e, i, r, null);
}
function m$3(n, t, i, r, o) {
var e = {
type: n,
props: t,
key: i,
ref: r,
__k: null,
__: null,
__b: 0,
__e: null,
__c: null,
constructor: void 0,
__v: null == o ? ++u$3 : o,
__i: -1,
__u: 0
};
return null == o && null != l$3.vnode && l$3.vnode(e), e;
}
function k$2(n) {
return n.children;
}
function x$2(n, l) {
this.props = n, this.context = l;
}
function S$1(n, l) {
if (null == l) return n.__ ? S$1(n.__, n.__i + 1) : null;
for (var u; l < n.__k.length; l++) if (null != (u = n.__k[l]) && null != u.__e) return u.__e;
return "function" == typeof n.type ? S$1(n) : null;
}
function C$2(n) {
if (n.__P && n.__d) {
var u = n.__v, t = u.__e, i = [], r = [], o = w$3({}, u);
o.__v = u.__v + 1, l$3.vnode && l$3.vnode(o), z$1(n.__P, o, u, n.__n, n.__P.namespaceURI, 32 & u.__u ? [t] : null, i, null == t ? S$1(u) : t, !!(32 & u.__u), r), o.__v = u.__v, o.__.__k[o.__i] = o, V(i, o, r), u.__e = u.__ = null, o.__e != t && M(o);
}
}
function M(n) {
if (null != (n = n.__) && null != n.__c) return n.__e = n.__c.base = null, n.__k.some(function(l) {
if (null != l && null != l.__e) return n.__e = n.__c.base = l.__e;
}), M(n);
}
function $(n) {
(!n.__d && (n.__d = !0) && i$3.push(n) && !I.__r++ || r$2 != l$3.debounceRendering) && ((r$2 = l$3.debounceRendering) || o$3)(I);
}
function I() {
try {
for (var n, l = 1; i$3.length;) i$3.length > l && i$3.sort(e$2), n = i$3.shift(), l = i$3.length, C$2(n);
} finally {
i$3.length = I.__r = 0;
}
}
function P(n, l, u, t, i, r, o, e, f, c, s) {
var a, h, y, d, w, g, _, m = t && t.__k || v$2, b = l.length;
for (f = A$1(u, l, m, f, b), a = 0; a < b; a++) null != (y = u.__k[a]) && (h = -1 != y.__i && m[y.__i] || p$3, y.__i = a, g = z$1(n, y, h, i, r, o, e, f, c, s), d = y.__e, y.ref && h.ref != y.ref && (h.ref && D$1(h.ref, null, y), s.push(y.ref, y.__c || d, y)), null == w && null != d && (w = d), (_ = !!(4 & y.__u)) || h.__k === y.__k ? f = H(y, f, n, _) : "function" == typeof y.type && void 0 !== g ? f = g : d && (f = d.nextSibling), y.__u &= -7);
return u.__e = w, f;
}
function A$1(n, l, u, t, i) {
var r, o, e, f, c, s = u.length, a = s, h = 0;
for (n.__k = new Array(i), r = 0; r < i; r++) null != (o = l[r]) && "boolean" != typeof o && "function" != typeof o ? ("string" == typeof o || "number" == typeof o || "bigint" == typeof o || o.constructor == String ? o = n.__k[r] = m$3(null, o, null, null, null) : d$3(o) ? o = n.__k[r] = m$3(k$2, { children: o }, null, null, null) : void 0 === o.constructor && o.__b > 0 ? o = n.__k[r] = m$3(o.type, o.props, o.key, o.ref ? o.ref : null, o.__v) : n.__k[r] = o, f = r + h, o.__ = n, o.__b = n.__b + 1, e = null, -1 != (c = o.__i = T$1(o, u, f, a)) && (a--, (e = u[c]) && (e.__u |= 2)), null == e || null == e.__v ? (-1 == c && (i > s ? h-- : i < s && h++), "function" != typeof o.type && (o.__u |= 4)) : c != f && (c == f - 1 ? h-- : c == f + 1 ? h++ : (c > f ? h-- : h++, o.__u |= 4))) : n.__k[r] = null;
if (a) for (r = 0; r < s; r++) null != (e = u[r]) && 0 == (2 & e.__u) && (e.__e == t && (t = S$1(e)), E$1(e, e));
return t;
}
function H(n, l, u, t) {
var i, r;
if ("function" == typeof n.type) {
for (i = n.__k, r = 0; i && r < i.length; r++) i[r] && (i[r].__ = n, l = H(i[r], l, u, t));
return l;
}
n.__e != l && (t && (l && n.type && !l.parentNode && (l = S$1(n)), u.insertBefore(n.__e, l || null)), l = n.__e);
do
l = l && l.nextSibling;
while (null != l && 8 == l.nodeType);
return l;
}
function T$1(n, l, u, t) {
var i, r, o, e = n.key, f = n.type, c = l[u], s = null != c && 0 == (2 & c.__u);
if (null === c && null == e || s && e == c.key && f == c.type) return u;
if (t > (s ? 1 : 0)) {
for (i = u - 1, r = u + 1; i >= 0 || r < l.length;) if (null != (c = l[o = i >= 0 ? i-- : r++]) && 0 == (2 & c.__u) && e == c.key && f == c.type) return o;
}
return -1;
}
function j$1(n, l, u) {
"-" == l[0] ? n.setProperty(l, null == u ? "" : u) : n[l] = null == u ? "" : "number" != typeof u || y$3.test(l) ? u : u + "px";
}
function F$1(n, l, u, t, i) {
var r, o;
n: if ("style" == l) if ("string" == typeof u) n.style.cssText = u;
else {
if ("string" == typeof t && (n.style.cssText = t = ""), t) for (l in t) u && l in u || j$1(n.style, l, "");
if (u) for (l in u) t && u[l] == t[l] || j$1(n.style, l, u[l]);
}
else if ("o" == l[0] && "n" == l[1]) r = l != (l = l.replace(f$3, "$1")), o = l.toLowerCase(), l = o in n || "onFocusOut" == l || "onFocusIn" == l ? o.slice(2) : l.slice(2), n.l || (n.l = {}), n.l[l + r] = u, u ? t ? u.u = t.u : (u.u = c$2, n.addEventListener(l, r ? a$2 : s$2, r)) : n.removeEventListener(l, r ? a$2 : s$2, r);
else {
if ("http://www.w3.org/2000/svg" == i) l = l.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
else if ("width" != l && "height" != l && "href" != l && "list" != l && "form" != l && "tabIndex" != l && "download" != l && "rowSpan" != l && "colSpan" != l && "role" != l && "popover" != l && l in n) try {
n[l] = null == u ? "" : u;
break n;
} catch (n) {}
"function" == typeof u || (null == u || !1 === u && "-" != l[4] ? n.removeAttribute(l) : n.setAttribute(l, "popover" == l && 1 == u ? "" : u));
}
}
function O(n) {
return function(u) {
if (this.l) {
var t = this.l[u.type + n];
if (null == u.t) u.t = c$2++;
else if (u.t < t.u) return;
return t(l$3.event ? l$3.event(u) : u);
}
};
}
function z$1(n, u, t, i, r, o, e, f, c, s) {
var a, h, p, y, _, m, b, S, C, M, $, I, A, H, L, T = u.type;
if (void 0 !== u.constructor) return null;
128 & t.__u && (c = !!(32 & t.__u), o = [f = u.__e = t.__e]), (a = l$3.__b) && a(u);
n: if ("function" == typeof T) try {
if (S = u.props, C = T.prototype && T.prototype.render, M = (a = T.contextType) && i[a.__c], $ = a ? M ? M.props.value : a.__ : i, t.__c ? b = (h = u.__c = t.__c).__ = h.__E : (C ? u.__c = h = new T(S, $) : (u.__c = h = new x$2(S, $), h.constructor = T, h.render = G), M && M.sub(h), h.state || (h.state = {}), h.__n = i, p = h.__d = !0, h.__h = [], h._sb = []), C && null == h.__s && (h.__s = h.state), C && null != T.getDerivedStateFromProps && (h.__s == h.state && (h.__s = w$3({}, h.__s)), w$3(h.__s, T.getDerivedStateFromProps(S, h.__s))), y = h.props, _ = h.state, h.__v = u, p) C && null == T.getDerivedStateFromProps && null != h.componentWillMount && h.componentWillMount(), C && null != h.componentDidMount && h.__h.push(h.componentDidMount);
else {
if (C && null == T.getDerivedStateFromProps && S !== y && null != h.componentWillReceiveProps && h.componentWillReceiveProps(S, $), u.__v == t.__v || !h.__e && null != h.shouldComponentUpdate && !1 === h.shouldComponentUpdate(S, h.__s, $)) {
u.__v != t.__v && (h.props = S, h.state = h.__s, h.__d = !1), u.__e = t.__e, u.__k = t.__k, u.__k.some(function(n) {
n && (n.__ = u);
}), v$2.push.apply(h.__h, h._sb), h._sb = [], h.__h.length && e.push(h);
break n;
}
null != h.componentWillUpdate && h.componentWillUpdate(S, h.__s, $), C && null != h.componentDidUpdate && h.__h.push(function() {
h.componentDidUpdate(y, _, m);
});
}
if (h.context = $, h.props = S, h.__P = n, h.__e = !1, I = l$3.__r, A = 0, C) h.state = h.__s, h.__d = !1, I && I(u), a = h.render(h.props, h.state, h.context), v$2.push.apply(h.__h, h._sb), h._sb = [];
else do
h.__d = !1, I && I(u), a = h.render(h.props, h.state, h.context), h.state = h.__s;
while (h.__d && ++A < 25);
h.state = h.__s, null != h.getChildContext && (i = w$3(w$3({}, i), h.getChildContext())), C && !p && null != h.getSnapshotBeforeUpdate && (m = h.getSnapshotBeforeUpdate(y, _)), H = null != a && a.type === k$2 && null == a.key ? q$2(a.props.children) : a, f = P(n, d$3(H) ? H : [H], u, t, i, r, o, e, f, c, s), h.base = u.__e, u.__u &= -161, h.__h.length && e.push(h), b && (h.__E = h.__ = null);
} catch (n) {
if (u.__v = null, c || null != o) if (n.then) {
for (u.__u |= c ? 160 : 128; f && 8 == f.nodeType && f.nextSibling;) f = f.nextSibling;
o[o.indexOf(f)] = null, u.__e = f;
} else {
for (L = o.length; L--;) g$2(o[L]);
N(u);
}
else u.__e = t.__e, u.__k = t.__k, n.then || N(u);
l$3.__e(n, u, t);
}
else null == o && u.__v == t.__v ? (u.__k = t.__k, u.__e = t.__e) : f = u.__e = B$1(t.__e, u, t, i, r, o, e, c, s);
return (a = l$3.diffed) && a(u), 128 & u.__u ? void 0 : f;
}
function N(n) {
n && (n.__c && (n.__c.__e = !0), n.__k && n.__k.some(N));
}
function V(n, u, t) {
for (var i = 0; i < t.length; i++) D$1(t[i], t[++i], t[++i]);
l$3.__c && l$3.__c(u, n), n.some(function(u) {
try {
n = u.__h, u.__h = [], n.some(function(n) {
n.call(u);
});
} catch (n) {
l$3.__e(n, u.__v);
}
});
}
function q$2(n) {
return "object" != typeof n || null == n || n.__b > 0 ? n : d$3(n) ? n.map(q$2) : w$3({}, n);
}
function B$1(u, t, i, r, o, e, f, c, s) {
var a, h, v, y, w, _, m, b = i.props || p$3, k = t.props, x = t.type;
if ("svg" == x ? o = "http://www.w3.org/2000/svg" : "math" == x ? o = "http://www.w3.org/1998/Math/MathML" : o || (o = "http://www.w3.org/1999/xhtml"), null != e) {
for (a = 0; a < e.length; a++) if ((w = e[a]) && "setAttribute" in w == !!x && (x ? w.localName == x : 3 == w.nodeType)) {
u = w, e[a] = null;
break;
}
}
if (null == u) {
if (null == x) return document.createTextNode(k);
u = document.createElementNS(o, x, k.is && k), c && (l$3.__m && l$3.__m(t, e), c = !1), e = null;
}
if (null == x) b === k || c && u.data == k || (u.data = k);
else {
if (e = e && n$1.call(u.childNodes), !c && null != e) for (b = {}, a = 0; a < u.attributes.length; a++) b[(w = u.attributes[a]).name] = w.value;
for (a in b) w = b[a], "dangerouslySetInnerHTML" == a ? v = w : "children" == a || a in k || "value" == a && "defaultValue" in k || "checked" == a && "defaultChecked" in k || F$1(u, a, null, w, o);
for (a in k) w = k[a], "children" == a ? y = w : "dangerouslySetInnerHTML" == a ? h = w : "value" == a ? _ = w : "checked" == a ? m = w : c && "function" != typeof w || b[a] === w || F$1(u, a, w, b[a], o);
if (h) c || v && (h.__html == v.__html || h.__html == u.innerHTML) || (u.innerHTML = h.__html), t.__k = [];
else if (v && (u.innerHTML = ""), P("template" == t.type ? u.content : u, d$3(y) ? y : [y], t, i, r, "foreignObject" == x ? "http://www.w3.org/1999/xhtml" : o, e, f, e ? e[0] : i.__k && S$1(i, 0), c, s), null != e) for (a = e.length; a--;) g$2(e[a]);
c || (a = "value", "progress" == x && null == _ ? u.removeAttribute("value") : null != _ && (_ !== u[a] || "progress" == x && !_ || "option" == x && _ != b[a]) && F$1(u, a, _, b[a], o), a = "checked", null != m && m != u[a] && F$1(u, a, m, b[a], o));
}
return u;
}
function D$1(n, u, t) {
try {
if ("function" == typeof n) {
var i = "function" == typeof n.__u;
i && n.__u(), i && null == u || (n.__u = n(u));
} else n.current = u;
} catch (n) {
l$3.__e(n, t);
}
}
function E$1(n, u, t) {
var i, r;
if (l$3.unmount && l$3.unmount(n), (i = n.ref) && (i.current && i.current != n.__e || D$1(i, null, u)), null != (i = n.__c)) {
if (i.componentWillUnmount) try {
i.componentWillUnmount();
} catch (n) {
l$3.__e(n, u);
}
i.base = i.__P = null;
}
if (i = n.__k) for (r = 0; r < i.length; r++) i[r] && E$1(i[r], u, t || "function" != typeof n.type);
t || g$2(n.__e), n.__c = n.__ = n.__e = void 0;
}
function G(n, l, u) {
return this.constructor(n, u);
}
function J(u, t, i) {
var r, o, e, f;
t == document && (t = document.documentElement), l$3.__ && l$3.__(u, t), o = (r = "function" == typeof i) ? null : i && i.__k || t.__k, e = [], f = [], z$1(t, u = (!r && i || t).__k = _$2(k$2, null, [u]), o || p$3, p$3, t.namespaceURI, !r && i ? [i] : o ? null : t.firstChild ? n$1.call(t.childNodes) : null, e, !r && i ? i : o ? o.__e : t.firstChild, r, f), V(e, u, f);
}
n$1 = v$2.slice, l$3 = { __e: function(n, l, u, t) {
for (var i, r, o; l = l.__;) if ((i = l.__c) && !i.__) try {
if ((r = i.constructor) && null != r.getDerivedStateFromError && (i.setState(r.getDerivedStateFromError(n)), o = i.__d), null != i.componentDidCatch && (i.componentDidCatch(n, t || {}), o = i.__d), o) return i.__E = i;
} catch (l) {
n = l;
}
throw n;
} }, u$3 = 0, t$2 = function(n) {
return null != n && void 0 === n.constructor;
}, x$2.prototype.setState = function(n, l) {
var u = null != this.__s && this.__s != this.state ? this.__s : this.__s = w$3({}, this.state);
"function" == typeof n && (n = n(w$3({}, u), this.props)), n && w$3(u, n), null != n && this.__v && (l && this._sb.push(l), $(this));
}, x$2.prototype.forceUpdate = function(n) {
this.__v && (this.__e = !0, n && this.__h.push(n), $(this));
}, x$2.prototype.render = k$2, i$3 = [], o$3 = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, e$2 = function(n, l) {
return n.__v.__b - l.__v.__b;
}, I.__r = 0, f$3 = /(PointerCapture)$|Capture$/i, c$2 = 0, s$2 = O(!1), a$2 = O(!0);
var t$1, r$1, u$2, i$2, o$2 = 0, f$2 = [], c$1 = l$3, e$1 = c$1.__b, a$1 = c$1.__r, v$1 = c$1.diffed, l$2 = c$1.__c, m$2 = c$1.unmount, s$1 = c$1.__;
function p$2(n, t) {
c$1.__h && c$1.__h(r$1, n, o$2 || t), o$2 = 0;
var u = r$1.__H || (r$1.__H = {
__: [],
__h: []
});
return n >= u.__.length && u.__.push({}), u.__[n];
}
function d$2(n) {
return o$2 = 1, h$2(D, n);
}
function h$2(n, u, i) {
var o = p$2(t$1++, 2);
if (o.t = n, !o.__c && (o.__ = [i ? i(u) : D(void 0, u), function(n) {
var t = o.__N ? o.__N[0] : o.__[0], r = o.t(t, n);
t !== r && (o.__N = [r, o.__[1]], o.__c.setState({}));
}], o.__c = r$1, !r$1.__f)) {
var f = function(n, t, r) {
if (!o.__c.__H) return !0;
var u = o.__c.__H.__.filter(function(n) {
return n.__c;
});
if (u.every(function(n) {
return !n.__N;
})) return !c || c.call(this, n, t, r);
var i = o.__c.props !== n;
return u.some(function(n) {
if (n.__N) {
var t = n.__[0];
n.__ = n.__N, n.__N = void 0, t !== n.__[0] && (i = !0);
}
}), c && c.call(this, n, t, r) || i;
};
r$1.__f = !0;
var c = r$1.shouldComponentUpdate, e = r$1.componentWillUpdate;
r$1.componentWillUpdate = function(n, t, r) {
if (this.__e) {
var u = c;
c = void 0, f(n, t, r), c = u;
}
e && e.call(this, n, t, r);
}, r$1.shouldComponentUpdate = f;
}
return o.__N || o.__;
}
function y$2(n, u) {
var i = p$2(t$1++, 3);
!c$1.__s && C$1(i.__H, u) && (i.__ = n, i.u = u, r$1.__H.__h.push(i));
}
function A(n) {
return o$2 = 5, T(function() {
return { current: n };
}, []);
}
function T(n, r) {
var u = p$2(t$1++, 7);
return C$1(u.__H, r) && (u.__ = n(), u.__H = r, u.__h = n), u.__;
}
function q$1(n, t) {
return o$2 = 8, T(function() {
return n;
}, t);
}
function j() {
for (var n; n = f$2.shift();) {
var t = n.__H;
if (n.__P && t) try {
t.__h.some(z), t.__h.some(B), t.__h = [];
} catch (r) {
t.__h = [], c$1.__e(r, n.__v);
}
}
}
c$1.__b = function(n) {
r$1 = null, e$1 && e$1(n);
}, c$1.__ = function(n, t) {
n && t.__k && t.__k.__m && (n.__m = t.__k.__m), s$1 && s$1(n, t);
}, c$1.__r = function(n) {
a$1 && a$1(n), t$1 = 0;
var i = (r$1 = n.__c).__H;
i && (u$2 === r$1 ? (i.__h = [], r$1.__h = [], i.__.some(function(n) {
n.__N && (n.__ = n.__N), n.u = n.__N = void 0;
})) : (i.__h.some(z), i.__h.some(B), i.__h = [], t$1 = 0)), u$2 = r$1;
}, c$1.diffed = function(n) {
v$1 && v$1(n);
var t = n.__c;
t && t.__H && (t.__H.__h.length && (1 !== f$2.push(t) && i$2 === c$1.requestAnimationFrame || ((i$2 = c$1.requestAnimationFrame) || w$2)(j)), t.__H.__.some(function(n) {
n.u && (n.__H = n.u), n.u = void 0;
})), u$2 = r$1 = null;
}, c$1.__c = function(n, t) {
t.some(function(n) {
try {
n.__h.some(z), n.__h = n.__h.filter(function(n) {
return !n.__ || B(n);
});
} catch (r) {
t.some(function(n) {
n.__h && (n.__h = []);
}), t = [], c$1.__e(r, n.__v);
}
}), l$2 && l$2(n, t);
}, c$1.unmount = function(n) {
m$2 && m$2(n);
var t, r = n.__c;
r && r.__H && (r.__H.__.some(function(n) {
try {
z(n);
} catch (n) {
t = n;
}
}), r.__H = void 0, t && c$1.__e(t, r.__v));
};
var k$1 = "function" == typeof requestAnimationFrame;
function w$2(n) {
var t, r = function() {
clearTimeout(u), k$1 && cancelAnimationFrame(t), setTimeout(n);
}, u = setTimeout(r, 35);
k$1 && (t = requestAnimationFrame(r));
}
function z(n) {
var t = r$1, u = n.__c;
"function" == typeof u && (n.__c = void 0, u()), r$1 = t;
}
function B(n) {
var t = r$1;
n.__c = n.__(), r$1 = t;
}
function C$1(n, t) {
return !n || n.length !== t.length || t.some(function(t, r) {
return t !== n[r];
});
}
function D(n, t) {
return "function" == typeof t ? t(n) : t;
}
var i$1 = Symbol.for("preact-signals");
function t() {
if (!(s > 1)) {
var i, t = !1;
(function() {
var i = d$1;
d$1 = void 0;
while (void 0 !== i) {
if (i.S.v === i.v) i.S.i = i.i;
i = i.o;
}
})();
while (void 0 !== h$1) {
var n = h$1;
h$1 = void 0;
v++;
while (void 0 !== n) {
var r = n.u;
n.u = void 0;
n.f &= -3;
if (!(8 & n.f) && w$1(n)) try {
n.c();
} catch (n) {
if (!t) {
i = n;
t = !0;
}
}
n = r;
}
}
v = 0;
s--;
if (t) throw i;
} else s--;
}
function n(i) {
if (s > 0) return i();
e = ++u$1;
s++;
try {
return i();
} finally {
t();
}
}
var r = void 0;
function o$1(i) {
var t = r;
r = void 0;
try {
return i();
} finally {
r = t;
}
}
var f$1, h$1 = void 0, s = 0, v = 0, u$1 = 0, e = 0, d$1 = void 0, c = 0;
function a(i) {
if (void 0 !== r) {
var t = i.n;
if (void 0 === t || t.t !== r) {
t = {
i: 0,
S: i,
p: r.s,
n: void 0,
t: r,
e: void 0,
x: void 0,
r: t
};
if (void 0 !== r.s) r.s.n = t;
r.s = t;
i.n = t;
if (32 & r.f) i.S(t);
return t;
} else if (-1 === t.i) {
t.i = 0;
if (void 0 !== t.n) {
t.n.p = t.p;
if (void 0 !== t.p) t.p.n = t.n;
t.p = r.s;
t.n = void 0;
r.s.n = t;
r.s = t;
}
return t;
}
}
}
function l$1(i, t) {
this.v = i;
this.i = 0;
this.n = void 0;
this.t = void 0;
this.l = 0;
this.W = null == t ? void 0 : t.watched;
this.Z = null == t ? void 0 : t.unwatched;
this.name = null == t ? void 0 : t.name;
}
l$1.prototype.brand = i$1;
l$1.prototype.h = function() {
return !0;
};
l$1.prototype.S = function(i) {
var t = this, n = this.t;
if (n !== i && void 0 === i.e) {
i.x = n;
this.t = i;
if (void 0 !== n) n.e = i;
else o$1(function() {
var i;
null == (i = t.W) || i.call(t);
});
}
};
l$1.prototype.U = function(i) {
var t = this;
if (void 0 !== this.t) {
var n = i.e, r = i.x;
if (void 0 !== n) {
n.x = r;
i.e = void 0;
}
if (void 0 !== r) {
r.e = n;
i.x = void 0;
}
if (i === this.t) {
this.t = r;
if (void 0 === r) o$1(function() {
var i;
null == (i = t.Z) || i.call(t);
});
}
}
};
l$1.prototype.subscribe = function(i) {
var t = this;
return C(function() {
var n = t.value, o = r;
r = void 0;
try {
i(n);
} finally {
r = o;
}
}, { name: "sub" });
};
l$1.prototype.valueOf = function() {
return this.value;
};
l$1.prototype.toString = function() {
return this.value + "";
};
l$1.prototype.toJSON = function() {
return this.value;
};
l$1.prototype.peek = function() {
var i = r;
r = void 0;
try {
return this.value;
} finally {
r = i;
}
};
Object.defineProperty(l$1.prototype, "value", {
get: function() {
var i = a(this);
if (void 0 !== i) i.i = this.i;
return this.v;
},
set: function(i) {
if (i !== this.v) {
if (v > 100) throw new Error("Cycle detected");
(function(i) {
if (0 !== s && 0 === v) {
if (i.l !== e) {
i.l = e;
d$1 = {
S: i,
v: i.v,
i: i.i,
o: d$1
};
}
}
})(this);
this.v = i;
this.i++;
c++;
s++;
try {
for (var n = this.t; void 0 !== n; n = n.x) n.t.N();
} finally {
t();
}
}
}
});
function y$1(i, t) {
return new l$1(i, t);
}
function w$1(i) {
for (var t = i.s; void 0 !== t; t = t.n) if (t.S.i !== t.i || !t.S.h() || t.S.i !== t.i) return !0;
return !1;
}
function _$1(i) {
for (var t = i.s; void 0 !== t; t = t.n) {
var n = t.S.n;
if (void 0 !== n) t.r = n;
t.S.n = t;
t.i = -1;
if (void 0 === t.n) {
i.s = t;
break;
}
}
}
function b$1(i) {
var t = i.s, n = void 0;
while (void 0 !== t) {
var r = t.p;
if (-1 === t.i) {
t.S.U(t);
if (void 0 !== r) r.n = t.n;
if (void 0 !== t.n) t.n.p = r;
} else n = t;
t.S.n = t.r;
if (void 0 !== t.r) t.r = void 0;
t = r;
}
i.s = n;
}
function p$1(i, t) {
l$1.call(this, void 0);
this.x = i;
this.s = void 0;
this.g = c - 1;
this.f = 4;
this.W = null == t ? void 0 : t.watched;
this.Z = null == t ? void 0 : t.unwatched;
this.name = null == t ? void 0 : t.name;
}
p$1.prototype = new l$1();
p$1.prototype.h = function() {
this.f &= -3;
if (1 & this.f) return !1;
if (32 == (36 & this.f)) return !0;
this.f &= -5;
if (this.g === c) return !0;
this.g = c;
this.f |= 1;
if (this.i > 0 && !w$1(this)) {
this.f &= -2;
return !0;
}
var i = r;
try {
_$1(this);
r = this;
var t = this.x();
if (16 & this.f || this.v !== t || 0 === this.i) {
this.v = t;
this.f &= -17;
this.i++;
}
} catch (i) {
this.v = i;
this.f |= 16;
this.i++;
}
r = i;
b$1(this);
this.f &= -2;
return !0;
};
p$1.prototype.S = function(i) {
if (void 0 === this.t) {
this.f |= 36;
for (var t = this.s; void 0 !== t; t = t.n) t.S.S(t);
}
l$1.prototype.S.call(this, i);
};
p$1.prototype.U = function(i) {
if (void 0 !== this.t) {
l$1.prototype.U.call(this, i);
if (void 0 === this.t) {
this.f &= -33;
for (var t = this.s; void 0 !== t; t = t.n) t.S.U(t);
}
}
};
p$1.prototype.N = function() {
if (!(2 & this.f)) {
this.f |= 6;
for (var i = this.t; void 0 !== i; i = i.x) i.t.N();
}
};
Object.defineProperty(p$1.prototype, "value", { get: function() {
if (1 & this.f) throw new Error("Cycle detected");
var i = a(this);
this.h();
if (void 0 !== i) i.i = this.i;
if (16 & this.f) throw this.v;
return this.v;
} });
function g$1(i, t) {
return new p$1(i, t);
}
function S(i) {
var n = i.m;
i.m = void 0;
if ("function" == typeof n) {
s++;
var o = r;
r = void 0;
try {
n();
} catch (t) {
i.f &= -2;
i.f |= 8;
m$1(i);
throw t;
} finally {
r = o;
t();
}
}
}
function m$1(i) {
for (var t = i.s; void 0 !== t; t = t.n) t.S.U(t);
i.x = void 0;
i.s = void 0;
S(i);
}
function x$1(i) {
if (r !== this) throw new Error("Out-of-order effect");
b$1(this);
r = i;
this.f &= -2;
if (8 & this.f) m$1(this);
t();
}
function E(i, t) {
this.x = i;
this.m = void 0;
this.s = void 0;
this.u = void 0;
this.f = 32;
this.name = null == t ? void 0 : t.name;
if (f$1) f$1.push(this);
}
E.prototype.c = function() {
var i = this.S();
try {
if (8 & this.f) return;
if (void 0 === this.x) return;
var t = this.x();
if ("function" == typeof t) this.m = t;
} finally {
i();
}
};
E.prototype.S = function() {
if (1 & this.f) throw new Error("Cycle detected");
this.f |= 1;
this.f &= -9;
S(this);
_$1(this);
s++;
var i = r;
r = this;
return x$1.bind(this, i);
};
E.prototype.N = function() {
if (!(2 & this.f)) {
this.f |= 2;
this.u = h$1;
h$1 = this;
}
};
E.prototype.d = function() {
this.f |= 8;
if (!(1 & this.f)) m$1(this);
};
E.prototype.dispose = function() {
this.d();
};
function C(i, t) {
var n = new E(i, t);
try {
n.c();
} catch (i) {
n.d();
throw i;
}
var r = n.d.bind(n);
r[Symbol.dispose] = r;
return r;
}
var l, h, p = "undefined" != typeof window && !!window.__PREACT_SIGNALS_DEVTOOLS__, _ = [];
C(function() {
l = this.N;
})();
function g(i, r) {
l$3[i] = r.bind(null, l$3[i] || function() {});
}
function b(i) {
if (h) {
var n = h;
h = void 0;
n();
}
h = i && i.S();
}
function y(i) {
var n = this, t = i.data, e = useSignal(t);
e.value = t;
var f = T(function() {
var i = n, t = n.__v;
while (t = t.__) if (t.__c) {
t.__c.__$f |= 4;
break;
}
var o = g$1(function() {
var i = e.value.value;
return 0 === i ? 0 : !0 === i ? "" : i || "";
}), f = g$1(function() {
return !Array.isArray(o.value) && !t$2(o.value);
}), a = C(function() {
this.N = F;
if (f.value) {
var n = o.value;
if (i.__v && i.__v.__e && 3 === i.__v.__e.nodeType) i.__v.__e.data = n;
}
}), v = n.__$u.d;
n.__$u.d = function() {
a();
v.call(this);
};
return [f, o];
}, []), a = f[0], v = f[1];
return a.value ? v.peek() : v.value;
}
y.displayName = "ReactiveTextNode";
Object.defineProperties(l$1.prototype, {
constructor: {
configurable: !0,
value: void 0
},
type: {
configurable: !0,
value: y
},
props: {
configurable: !0,
get: function() {
var i = this;
return { data: { get value() {
return i.value;
} } };
}
},
__b: {
configurable: !0,
value: 1
}
});
g("__b", function(i, n) {
if ("string" == typeof n.type) {
var r, t = n.props;
for (var o in t) if ("children" !== o) {
var e = t[o];
if (e instanceof l$1) {
if (!r) n.__np = r = {};
r[o] = e;
t[o] = e.peek();
}
}
}
i(n);
});
g("__r", function(i, n) {
i(n);
if (n.type !== k$2) {
b();
var r, o = n.__c;
if (o) {
o.__$f &= -2;
if (void 0 === (r = o.__$u)) o.__$u = r = function(i, n) {
var r;
C(function() {
r = this;
}, { name: n });
r.c = i;
return r;
}(function() {
var i;
if (p) null == (i = r.y) || i.call(r);
o.__$f |= 1;
o.setState({});
}, "function" == typeof n.type ? n.type.displayName || n.type.name : "");
}
b(r);
}
});
g("__e", function(i, n, r, t) {
b();
i(n, r, t);
});
g("diffed", function(i, n) {
b();
var r;
if ("string" == typeof n.type && (r = n.__e)) {
var t = n.__np, o = n.props;
if (t) {
var e = r.U;
if (e) for (var f in e) {
var u = e[f];
if (void 0 !== u && !(f in t)) {
u.d();
e[f] = void 0;
}
}
else {
e = {};
r.U = e;
}
for (var a in t) {
var c = e[a], v = t[a];
if (void 0 === c) {
c = w(r, a, v);
e[a] = c;
} else c.o(v, o);
}
for (var s in t) o[s] = t[s];
}
}
i(n);
});
function w(i, n, r, t) {
var o = n in i && void 0 === i.ownerSVGElement, e = y$1(r), f = r.peek();
return {
o: function(i, n) {
e.value = i;
f = i.peek();
},
d: C(function() {
this.N = F;
var r = e.value.value;
if (f !== r) {
f = void 0;
if (o) i[n] = r;
else if (null != r && (!1 !== r || "-" === n[4])) i.setAttribute(n, r);
else i.removeAttribute(n);
} else f = void 0;
})
};
}
g("unmount", function(i, n) {
if ("string" == typeof n.type) {
var r = n.__e;
if (r) {
var t = r.U;
if (t) {
r.U = void 0;
for (var o in t) {
var e = t[o];
if (e) e.d();
}
}
}
n.__np = void 0;
} else {
var f = n.__c;
if (f) {
var u = f.__$u;
if (u) {
f.__$u = void 0;
u.d();
}
}
}
i(n);
});
g("__h", function(i, n, r, t) {
if (t < 3 || 9 === t) n.__$f |= 2;
i(n, r, t);
});
x$2.prototype.shouldComponentUpdate = function(i, n) {
if (this.__R) return !0;
var r = this.__$u, t = r && void 0 !== r.s;
for (var o in n) return !0;
if (this.__f || "boolean" == typeof this.u && !0 === this.u) {
var e = 2 & this.__$f;
if (!(t || e || 4 & this.__$f)) return !0;
if (1 & this.__$f) return !0;
} else {
if (!(t || 4 & this.__$f)) return !0;
if (3 & this.__$f) return !0;
}
for (var f in i) if ("__source" !== f && i[f] !== this.props[f]) return !0;
for (var u in this.props) if (!(u in i)) return !0;
return !1;
};
function useSignal(i, n) {
return T(function() {
return y$1(i, n);
}, []);
}
var q = function(i) {
queueMicrotask(function() {
queueMicrotask(i);
});
};
function x() {
n(function() {
var i;
while (i = _.shift()) l.call(i);
});
}
function F() {
if (1 === _.push(this)) (l$3.requestAnimationFrame || q)(x);
}
var VERSION = "1.12.1";
var STORAGE_KEY$1 = "@mwm/character-data";
var WS_ENDPOINTS = ["api.milkywayidle.com/ws", "api-test.milkywayidle.com/ws"];
var MARKET_API = "https://milkyway.market/api";
var EVENTS = {
REQUEST: "mwi-request-character-data",
RESPONSE: "mwi-character-data-response",
UPDATED: "mwi-character-data-updated",
ADDON_READY: "mwm-addon-ready",
PING: "mwm-ping",
PONG: "mwm-pong"
};
var isGameSite = location.hostname.includes("milkywayidle.com");
var isMarketSite = location.hostname.includes("milkyway.market") || location.hostname.includes("localhost"), f = 0;
Array.isArray;
function u(e, t, n, o, i, u) {
t || (t = {});
var a, c, p = t;
if ("ref" in p) for (c in p = {}, t) "ref" == c ? a = t[c] : p[c] = t[c];
var l = {
type: e,
props: p,
key: n,
ref: a,
__k: null,
__: null,
__b: 0,
__e: null,
__c: null,
constructor: void 0,
__v: --f,
__i: -1,
__u: 0,
__source: i,
__self: u
};
if ("function" == typeof e && (a = e.defaultProps)) for (c in a) void 0 === p[c] && (p[c] = a[c]);
return l$3.vnode && l$3.vnode(l), l;
}
var GREASYFORK_URL = "https://greasyfork.org/en/scripts/540058-mwi-market-addon";
function UpdateBanner({ expectedVersion, onDismiss }) {
return u("div", {
class: "mwm-root mwm:fixed mwm:top-0 mwm:left-0 mwm:right-0 mwm:z-[999999] mwm:bg-gradient-to-r mwm:from-[rgba(220,38,38,0.95)] mwm:to-[rgba(185,28,28,0.95)] mwm:shadow-[0_4px_20px_rgba(0,0,0,0.3),0_0_40px_rgba(220,38,38,0.2)] mwm:animate-[mwm-slide-down_0.3s_ease-out]",
children: u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:gap-3 mwm:px-4 mwm:py-2.5 mwm:max-w-full",
children: [
u("span", {
class: "mwm:text-lg mwm:shrink-0",
children: "⚠️"
}),
u("span", {
class: "mwm:font-mono mwm:text-xs mwm:font-medium mwm:text-white mwm:tracking-[0.02em]",
children: [
"MWM Addon update required: v",
VERSION,
" → v",
expectedVersion
]
}),
u("a", {
href: GREASYFORK_URL,
target: "_blank",
rel: "noopener",
onClick: onDismiss,
class: "mwm:inline-flex mwm:items-center mwm:gap-1 mwm:px-3.5 mwm:py-1.5 mwm:bg-[rgba(255,255,255,0.2)] mwm:border mwm:border-[rgba(255,255,255,0.3)] mwm:rounded mwm:text-white mwm:font-mono mwm:text-[11px] mwm:font-semibold mwm:no-underline mwm:uppercase mwm:tracking-[0.05em] mwm:transition-all mwm:shrink-0 mwm:hover:bg-[rgba(255,255,255,0.3)] mwm:hover:border-[rgba(255,255,255,0.5)] mwm:hover:-translate-y-px",
children: "Update Now"
}),
u("button", {
onClick: onDismiss,
"aria-label": "Dismiss",
class: "mwm:w-6 mwm:h-6 mwm:flex mwm:items-center mwm:justify-center mwm:border-none mwm:bg-[rgba(255,255,255,0.1)] mwm:text-[rgba(255,255,255,0.7)] mwm:cursor-pointer mwm:rounded mwm:text-lg mwm:leading-none mwm:transition-all mwm:shrink-0 mwm:ml-2 mwm:hover:bg-[rgba(255,255,255,0.2)] mwm:hover:text-white",
children: "×"
})
]
})
});
}
var ADDON_COLOR = "#8B5CF6";
var WARN_COLOR = "#F59E0B";
var formatMessage = (msg) => {
const prefix = `%c[MWM] [Addon v${VERSION}]%c`;
const prefixStyle = `color: ${ADDON_COLOR}; font-weight: bold;`;
return [
`${prefix} ${msg}`,
prefixStyle,
"color: inherit; padding-left: 4px;"
];
};
var formatWarnMessage = (msg) => {
const prefix = `%c[MWM] [Addon v${VERSION}]%c`;
const prefixStyle = `color: ${WARN_COLOR}; font-weight: bold;`;
return [
`${prefix} ${msg}`,
prefixStyle,
"color: inherit; padding-left: 4px;"
];
};
var log = (msg, ...args) => {
const [formatted, style1, style2] = formatMessage(msg);
console.log(formatted, style1, style2, ...args);
};
var warn = (msg, ...args) => {
const [formatted, style1, style2] = formatWarnMessage(msg);
console.warn(formatted, style1, style2, ...args);
};
var MAX_ERRORS = 10;
var STALE_THRESHOLD_MS = 36e5;
var errors = [];
var checkpoints = [
{
id: "script_loaded",
label: "Script Loaded",
status: "pending"
},
{
id: "ws_hooked",
label: "WebSocket Hooked",
status: "pending"
},
{
id: "character_received",
label: "Character Received",
status: "pending"
},
{
id: "storage_synced",
label: "Storage Synced",
status: "pending"
},
{
id: "cross_tab",
label: "Cross-tab Listener",
status: "pending"
}
];
function markCheckpoint(id, status, detail) {
const cp = checkpoints.find((c) => c.id === id);
if (!cp) return;
cp.status = status;
cp.detail = detail;
cp.timestamp = Date.now();
log(`Checkpoint [${id}]: ${status}${detail ? ` — ${detail}` : ""}`);
refreshStatus();
}
function getCheckpoints() {
return checkpoints.map((cp) => ({ ...cp }));
}
var addonStatus = y$1({
version: VERSION,
status: "WS_DISCONNECTED",
characterName: null,
lastSyncTimestamp: null,
errors: [],
checkpoints: getCheckpoints()
});
function reportError(code, message) {
errors.push({
code,
message,
timestamp: Date.now()
});
if (errors.length > MAX_ERRORS) errors.shift();
log(`Error reported: ${code} — ${message}`);
}
var _deps = null;
function getStatus(deps) {
if (errors.some((e) => e.code === "CONFLICT_DETECTED")) return "CONFLICT_DETECTED";
if (errors.some((e) => e.code === "WS_HOOK_FAILED")) return "WS_HOOK_FAILED";
if (errors.some((e) => e.code === "STORAGE_ERROR")) return "STORAGE_ERROR";
const data = deps.getCharacterData();
if (isMarketSite && !data) return "NO_CHARACTER_DATA";
if (isGameSite && !data) return "WS_DISCONNECTED";
try {
const stored = _GM_getValue(STORAGE_KEY$1, null);
if (stored?.timestamp && Date.now() - stored.timestamp > STALE_THRESHOLD_MS) return "STALE_DATA";
} catch {}
return "ADDON_OK";
}
function buildPong(deps) {
const data = deps.getCharacterData();
let lastSyncTimestamp = null;
try {
lastSyncTimestamp = _GM_getValue("@mwm/character-data", null)?.timestamp ?? null;
} catch {}
return {
version: VERSION,
protocolVersion: 2,
status: getStatus(deps),
site: isGameSite ? "game" : "market",
gameConnected: data !== null,
characterName: data?.character?.name ?? null,
lastSyncTimestamp,
errors: [...errors],
checkpoints: getCheckpoints()
};
}
function refreshStatus() {
if (!_deps) return;
const data = _deps.getCharacterData();
let lastSyncTimestamp = null;
try {
lastSyncTimestamp = _GM_getValue("@mwm/character-data", null)?.timestamp ?? null;
} catch {}
addonStatus.value = {
version: VERSION,
status: getStatus(_deps),
characterName: data?.character?.name ?? null,
lastSyncTimestamp,
errors: [...errors],
checkpoints: getCheckpoints()
};
}
function initHealthCheck(deps) {
_deps = deps;
window.addEventListener(EVENTS.PING, () => {
const pong = buildPong(deps);
log("Ping received, responding with pong:", pong.status);
window.dispatchEvent(new CustomEvent(EVENTS.PONG, { detail: pong }));
});
refreshStatus();
log("Health check initialized");
}
var SETTINGS_STORAGE_KEY = "@mwm/settings";
var DEFAULT_SETTINGS = {
tooltipGraphEnabled: true,
marketGraphEnabled: true,
fetchDelayMs: 2e3,
statusPillStyle: "pill",
syncIntervalMs: 3e4
};
function readFromStorage() {
try {
const stored = localStorage.getItem(SETTINGS_STORAGE_KEY);
if (stored) {
const parsed = JSON.parse(stored);
return {
...DEFAULT_SETTINGS,
...parsed,
fetchDelayMs: Math.max(2e3, parsed.fetchDelayMs ?? DEFAULT_SETTINGS.fetchDelayMs),
syncIntervalMs: Math.min(3e5, Math.max(3e4, parsed.syncIntervalMs ?? DEFAULT_SETTINGS.syncIntervalMs)),
statusPillStyle: parsed.statusPillStyle === "icon" ? "icon" : "pill"
};
}
} catch {}
return { ...DEFAULT_SETTINGS };
}
var settings = y$1(readFromStorage());
C(() => {
try {
localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(settings.value));
log("Settings saved:", settings.value);
} catch {}
});
function loadSettings() {
settings.value = readFromStorage();
}
function updateSetting(key, value) {
settings.value = {
...settings.value,
[key]: value
};
}
function getSettings() {
return settings.value;
}
var lastSyncTime = 0;
function mergeItems(target, newItems) {
if (!newItems?.length) return;
const itemMap = new Map();
if (target.characterItems) for (const item of target.characterItems) {
const key = `${item.itemHrid}:${item.enhancementLevel || 0}:${item.itemLocationHrid || ""}`;
itemMap.set(key, item);
}
for (const item of newItems) {
const key = `${item.itemHrid}:${item.enhancementLevel || 0}:${item.itemLocationHrid || ""}`;
if (item.count > 0) itemMap.set(key, item);
else itemMap.delete(key);
}
target.characterItems = Array.from(itemMap.values());
}
function mergeSkills(target, newSkills) {
if (!newSkills?.length) return;
const skillMap = new Map();
if (target.characterSkills) for (const skill of target.characterSkills) skillMap.set(skill.skillHrid, skill);
for (const skill of newSkills) skillMap.set(skill.skillHrid, skill);
target.characterSkills = Array.from(skillMap.values());
}
function syncToStorage(characterData, force = false) {
if (!characterData) return;
const now = Date.now();
if (!force && now - lastSyncTime < getSettings().syncIntervalMs) return;
lastSyncTime = now;
characterData.currentTimestamp = ( new Date()).toISOString();
const storedData = {
data: characterData,
timestamp: now
};
try {
_GM_setValue("characterId", characterData.character?.id);
_GM_setValue("characterName", characterData.character?.name);
_GM_setValue(STORAGE_KEY$1, storedData);
log("Synced:", characterData.character?.name);
markCheckpoint("storage_synced", "ok", characterData.character?.name);
refreshStatus();
} catch (err) {
markCheckpoint("storage_synced", "failed", err instanceof Error ? err.message : "GM_setValue failed");
reportError("STORAGE_ERROR", err instanceof Error ? err.message : "GM_setValue failed");
}
}
function loadFromStorage() {
try {
const stored = _GM_getValue(STORAGE_KEY$1, null);
if (stored?.data) {
log("Loaded from storage:", stored.data.character?.name);
return stored.data;
}
return null;
} catch (err) {
reportError("STORAGE_ERROR", err instanceof Error ? err.message : "GM_getValue failed");
return null;
}
}
function cls(prefix) {
return `[class*="${prefix}"]`;
}
function qcls(root, prefix) {
return root.querySelector(cls(prefix));
}
function hasCls(el, prefix) {
for (const c of el.classList) if (c.startsWith(prefix)) return true;
return false;
}
var DOMObserver = class {
observer = null;
handlers = [];
isObserving = false;
start() {
if (this.isObserving) return;
this.observer = new MutationObserver((mutations) => {
for (const mutation of mutations) for (const node of mutation.addedNodes) {
if (!(node instanceof Element)) continue;
this.processNode(node);
}
});
this.observer.observe(document.body, {
childList: true,
subtree: true
});
this.isObserving = true;
log("DOM observer started");
}
stop() {
if (this.observer) {
this.observer.disconnect();
this.observer = null;
}
this.isObserving = false;
log("DOM observer stopped");
}
onClass(name, classPrefix, callback) {
const handler = {
name,
classPrefix,
callback
};
this.handlers.push(handler);
return () => {
const index = this.handlers.indexOf(handler);
if (index > -1) this.handlers.splice(index, 1);
};
}
processNode(node) {
for (const handler of this.handlers) {
if (hasCls(node, handler.classPrefix)) try {
handler.callback(node);
} catch (err) {
console.error(`[MWM] Handler error (${handler.name}):`, err);
}
const matches = node.querySelectorAll(cls(handler.classPrefix));
for (const match of matches) try {
handler.callback(match);
} catch (err) {
console.error(`[MWM] Handler error (${handler.name}):`, err);
}
}
}
};
var domObserver = new DOMObserver();
var NON_TRADEABLE_ITEMS = new Set([
"coin",
"cowbell",
"task_token",
"chimerical_token",
"sinister_token",
"enchanted_token",
"pirate_token",
"purples_gift",
"small_meteorite_cache",
"medium_meteorite_cache",
"large_meteorite_cache",
"small_artisans_crate",
"medium_artisans_crate",
"large_artisans_crate",
"small_treasure_chest",
"medium_treasure_chest",
"large_treasure_chest",
"chimerical_chest",
"chimerical_refinement_chest",
"sinister_chest",
"sinister_refinement_chest",
"enchanted_chest",
"enchanted_refinement_chest",
"pirate_chest",
"pirate_refinement_chest",
"sinister_cape",
"sinister_cape_refined",
"chimerical_quiver",
"chimerical_quiver_refined",
"enchanted_cloak",
"enchanted_cloak_refined",
"trainee_milking_charm",
"trainee_foraging_charm",
"trainee_woodcutting_charm",
"trainee_cheesesmithing_charm",
"trainee_crafting_charm",
"trainee_tailoring_charm",
"trainee_cooking_charm",
"trainee_brewing_charm",
"trainee_alchemy_charm",
"trainee_enhancing_charm",
"trainee_stamina_charm",
"trainee_intelligence_charm",
"trainee_attack_charm",
"trainee_defense_charm",
"trainee_melee_charm",
"trainee_ranged_charm",
"trainee_magic_charm",
"basic_task_badge",
"advanced_task_badge",
"expert_task_badge",
"task_crystal"
]);
function isNonTradeable(itemHrid) {
return NON_TRADEABLE_ITEMS.has(itemHrid.toLowerCase());
}
var needsUpdate = y$1(null);
function getCacheKey(itemHrid, enhancement) {
return `${itemHrid}:${enhancement}`;
}
var priceCache = new Map();
var CACHE_TTL = 300 * 1e3;
setInterval(() => {
const now = Date.now();
for (const [key, entry] of priceCache) if (entry.expires <= now) priceCache.delete(key);
}, CACHE_TTL);
async function fetchPriceChart(itemHrid, enhancement = 0) {
if (isNonTradeable(itemHrid)) return [];
const cacheKey = getCacheKey(itemHrid, enhancement);
const cached = priceCache.get(cacheKey);
if (cached && cached.expires > Date.now()) {
log(`Cache hit for ${itemHrid} +${enhancement}`);
return cached.data;
}
const characterId = _GM_getValue("characterId", null);
const characterName = _GM_getValue("characterName", null);
const url = enhancement > 0 ? `${MARKET_API}/addon/prices/${itemHrid}?enhancement=${enhancement}` : `${MARKET_API}/addon/prices/${itemHrid}`;
return new Promise((resolve, reject) => {
_GM_xmlhttpRequest({
method: "GET",
url,
headers: {
"Content-Type": "application/json",
"X-MWM-Addon": VERSION,
...characterId != null && { "X-MWM-Character-Id": String(characterId) },
...characterName != null && { "X-MWM-Character-Name": characterName }
},
onload: (response) => {
if (response.status === 426) {
try {
const errorData = JSON.parse(response.responseText);
needsUpdate.value = /Expected ([^\s,]+)/.exec(errorData.error?.message)?.[1] || "latest";
} catch {
needsUpdate.value = "latest";
}
resolve([]);
return;
}
try {
const parsed = JSON.parse(response.responseText);
if (parsed.success) {
log(`Loaded ${parsed.data.length} price points for ${itemHrid} +${enhancement}`);
priceCache.set(cacheKey, {
data: parsed.data,
expires: Date.now() + CACHE_TTL
});
resolve(parsed.data);
} else {
warn(`API error for ${itemHrid} +${enhancement}`);
resolve([]);
}
} catch (err) {
warn(`Parse error for ${itemHrid} +${enhancement}:`, err);
reject(err);
}
},
onerror: (err) => {
warn(`Network error for ${itemHrid} +${enhancement}:`, err);
reject(err);
}
});
});
}
function usePriceData({ itemHrid, enhancement = 0, enabled = true, delayMs = 0, guardEl }) {
const [state, setState] = d$2(enabled ? { status: "loading" } : { status: "idle" });
y$2(() => {
if (!enabled) {
setState({ status: "idle" });
return;
}
let cancelled = false;
setState({ status: "loading" });
async function load() {
if (delayMs > 0) await new Promise((r) => setTimeout(r, delayMs));
if (cancelled) return;
if (guardEl && !document.body.contains(guardEl)) return;
try {
const data = await fetchPriceChart(itemHrid, enhancement);
if (cancelled) return;
if (guardEl && !document.body.contains(guardEl)) return;
setState(data.length > 0 ? {
status: "data",
data
} : { status: "empty" });
} catch {
if (!cancelled) setState({ status: "error" });
}
}
load();
return () => {
cancelled = true;
};
}, [
itemHrid,
enhancement,
enabled,
delayMs,
guardEl
]);
return state;
}
function formatPrice(price) {
if (price === null) return "—";
if (price >= 1e6) return `${(price / 1e6).toFixed(1)}M`;
if (price >= 1e3) return `${(price / 1e3).toFixed(1)}K`;
return price.toLocaleString();
}
function formatDate(timestamp) {
return new Date(timestamp).toLocaleDateString("en-US", {
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit"
});
}
function calculateStats(data) {
const bidPrices = data.map((d) => d.bidPrice).filter((p) => p !== null);
const askPrices = data.map((d) => d.askPrice).filter((p) => p !== null);
const currentBid = bidPrices[bidPrices.length - 1] ?? null;
const currentAsk = askPrices[askPrices.length - 1] ?? null;
const highBid = bidPrices.length > 0 ? Math.max(...bidPrices) : null;
const lowBid = bidPrices.length > 0 ? Math.min(...bidPrices) : null;
let change = 0;
if (bidPrices.length >= 2) {
const first = bidPrices[0];
change = (bidPrices[bidPrices.length - 1] - first) / first * 100;
}
return {
currentBid,
currentAsk,
highBid,
lowBid,
change
};
}
function calculateChange(data) {
const bidPrices = data.map((d) => d.bidPrice).filter((p) => p !== null);
if (bidPrices.length < 2) return 0;
const first = bidPrices[0];
return (bidPrices[bidPrices.length - 1] - first) / first * 100;
}
function nameToHrid(name) {
return name.toLowerCase().replace(/['\u2019]/g, "").replace(/\s+/g, "_").replace(/[^a-z0-9_]/g, "");
}
function hridToName(hrid) {
return hrid.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
}
var COLORS = {
bid: "#c084fc",
ask: "#5ee9c5",
grid: "rgba(59, 89, 152, 0.15)",
label: "rgba(226, 232, 240, 0.4)",
empty: "rgba(226, 232, 240, 0.4)"
};
function PriceChart({ data, height = 180, reverseX = false }) {
const canvasRef = A(null);
const tooltipRef = A(null);
const stateRef = A(null);
y$2(() => {
const canvas = canvasRef.current;
const tooltipEl = tooltipRef.current;
if (!canvas || !tooltipEl || data.length < 2) return;
const state = createChartState(canvas, data, tooltipEl, reverseX);
stateRef.current = state;
state.render();
const onMouseMove = (e) => {
const bounds = canvas.getBoundingClientRect();
const mouseX = e.clientX - bounds.left;
state.handleHover(mouseX);
};
const onMouseLeave = () => state.handleLeave();
canvas.addEventListener("mousemove", onMouseMove);
canvas.addEventListener("mouseleave", onMouseLeave);
const ro = new ResizeObserver(() => {
state.resize();
state.render();
});
ro.observe(canvas.parentElement ?? canvas);
return () => {
canvas.removeEventListener("mousemove", onMouseMove);
canvas.removeEventListener("mouseleave", onMouseLeave);
ro.disconnect();
stateRef.current = null;
};
}, [data, reverseX]);
return u("div", {
class: "mwm:relative mwm:bg-mwm-bg-surface mwm:rounded mwm:border mwm:border-mwm-border",
children: [ u("canvas", {
ref: canvasRef,
class: "mwm:block mwm:w-full mwm:cursor-crosshair",
style: { height: `${height}px` }
}), u("div", {
ref: tooltipRef,
class: "mwm:absolute mwm:bg-mwm-bg-panel mwm:border mwm:border-mwm-border mwm:rounded-lg mwm:px-3 mwm:py-2.5 mwm:pointer-events-none mwm:transition-opacity mwm:z-10 mwm:shadow-[0_4px_12px_rgba(0,0,0,0.3)]",
style: {
top: "8px",
right: "8px",
opacity: 0
},
children: [
u("div", { class: "mwm-tooltip-date mwm:text-[10px] mwm:text-mwm-text-muted mwm:mb-1.5 mwm:font-semibold" }),
u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-1",
children: [ u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:gap-4",
children: [ u("span", {
class: "mwm:flex mwm:items-center mwm:gap-1.5",
children: [ u("span", { class: "mwm:w-2 mwm:h-2 mwm:rounded-full mwm:bg-mwm-ask" }), u("span", {
class: "mwm:text-[10px] mwm:text-mwm-text-muted",
children: "Ask"
})]
}), u("span", { class: "mwm-tooltip-price ask mwm:text-[11px] mwm:text-mwm-ask mwm:font-medium" })]
}), u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:gap-4",
children: [ u("span", {
class: "mwm:flex mwm:items-center mwm:gap-1.5",
children: [ u("span", { class: "mwm:w-2 mwm:h-2 mwm:rounded-full mwm:bg-mwm-bid" }), u("span", {
class: "mwm:text-[10px] mwm:text-mwm-text-muted",
children: "Bid"
})]
}), u("span", { class: "mwm-tooltip-price bid mwm:text-[11px] mwm:text-mwm-bid mwm:font-medium" })]
})]
}),
u("div", { class: "mwm-tooltip-spread mwm:mt-1.5 mwm:pt-1.5 mwm:border-t mwm:border-mwm-border mwm:text-[10px] mwm:text-mwm-text-muted" })
]
})]
});
}
function createChartState(canvas, data, tooltipEl, reverseX) {
let hoverIndex = null;
let width = 0;
let height = 0;
let chartWidth = 0;
let chartHeight = 0;
const padding = {
top: 15,
right: 10,
bottom: 20,
left: 45
};
function resize() {
const rect = canvas.getBoundingClientRect();
const dpr = window.devicePixelRatio || 1;
width = rect.width;
height = rect.height;
canvas.width = width * dpr;
canvas.height = height * dpr;
chartWidth = width - padding.left - padding.right;
chartHeight = height - padding.top - padding.bottom;
const ctx = canvas.getContext("2d");
if (ctx) ctx.scale(dpr, dpr);
}
function getX(i) {
return reverseX ? padding.left + (data.length - 1 - i) / (data.length - 1) * chartWidth : padding.left + i / (data.length - 1) * chartWidth;
}
function render() {
const ctx = canvas.getContext("2d");
if (!ctx || width === 0) {
resize();
const c = canvas.getContext("2d");
if (!c) return;
renderFrame(c);
} else {
ctx.setTransform(1, 0, 0, 1, 0, 0);
const dpr = window.devicePixelRatio || 1;
ctx.scale(dpr, dpr);
renderFrame(ctx);
}
}
function renderFrame(ctx) {
ctx.clearRect(0, 0, width, height);
if (data.length < 2) {
ctx.fillStyle = COLORS.empty;
ctx.font = "11px sans-serif";
ctx.textAlign = "center";
ctx.fillText("No data available", width / 2, height / 2);
return;
}
const bidPrices = data.map((d) => d.bidPrice).filter((p) => p !== null);
const askPrices = data.map((d) => d.askPrice).filter((p) => p !== null);
const allPrices = [...bidPrices, ...askPrices];
const minPrice = Math.min(...allPrices);
const maxPrice = Math.max(...allPrices);
const priceRange = maxPrice - minPrice || 1;
const getY = (price) => padding.top + chartHeight - (price - minPrice) / priceRange * chartHeight;
ctx.strokeStyle = COLORS.grid;
ctx.lineWidth = 1;
ctx.setLineDash([3, 3]);
for (let i = 0; i <= 4; i++) {
const y = padding.top + i / 4 * chartHeight;
ctx.beginPath();
ctx.moveTo(padding.left, y);
ctx.lineTo(width - padding.right, y);
ctx.stroke();
const price = maxPrice - i / 4 * priceRange;
ctx.fillStyle = COLORS.label;
ctx.font = "9px sans-serif";
ctx.textAlign = "right";
ctx.fillText(formatPrice(price), padding.left - 6, y + 3);
}
ctx.setLineDash([]);
if (reverseX) {
const dateCount = Math.min(5, data.length);
ctx.fillStyle = COLORS.label;
ctx.font = "10px sans-serif";
ctx.textAlign = "center";
for (let i = 0; i < dateCount; i++) {
const dataIdx = dateCount === 1 ? 0 : Math.round((dateCount - 1 - i) / (dateCount - 1) * (data.length - 1));
const x = getX(dataIdx);
const point = data[dataIdx];
if (!point) continue;
const date = new Date(point.timestamp);
const label = `${(date.getMonth() + 1).toString().padStart(2, "0")}/${date.getDate().toString().padStart(2, "0")}`;
ctx.fillText(label, x, height - 4);
}
}
drawAreaLine(ctx, data, "askPrice", COLORS.ask, getX, getY, chartHeight, padding.top);
drawAreaLine(ctx, data, "bidPrice", COLORS.bid, getX, getY, chartHeight, padding.top);
if (hoverIndex !== null && hoverIndex >= 0 && hoverIndex < data.length) {
const point = data[hoverIndex];
if (!point) return;
const x = getX(hoverIndex);
ctx.strokeStyle = "rgba(226, 232, 240, 0.15)";
ctx.lineWidth = 1;
ctx.setLineDash([2, 2]);
ctx.beginPath();
ctx.moveTo(x, padding.top);
ctx.lineTo(x, padding.top + chartHeight);
ctx.stroke();
ctx.setLineDash([]);
if (point.askPrice !== null) drawDot(ctx, x, getY(point.askPrice), COLORS.ask);
if (point.bidPrice !== null) drawDot(ctx, x, getY(point.bidPrice), COLORS.bid);
}
}
function handleHover(mouseX) {
const dataIndex = reverseX ? Math.round((1 - (mouseX - padding.left) / chartWidth) * (data.length - 1)) : Math.round((mouseX - padding.left) / chartWidth * (data.length - 1));
if (dataIndex < 0 || dataIndex >= data.length) return;
const point = data[dataIndex];
if (!point) return;
hoverIndex = dataIndex;
render();
const dateEl = tooltipEl.querySelector(".mwm-tooltip-date");
const bidEl = tooltipEl.querySelector(".mwm-tooltip-price.bid");
const askEl = tooltipEl.querySelector(".mwm-tooltip-price.ask");
const spreadEl = tooltipEl.querySelector(".mwm-tooltip-spread");
if (dateEl) dateEl.textContent = formatDate(point.timestamp);
if (bidEl) bidEl.textContent = formatPrice(point.bidPrice);
if (askEl) askEl.textContent = formatPrice(point.askPrice);
if (spreadEl) if (point.askPrice !== null && point.bidPrice !== null && point.bidPrice > 0) {
const spreadAbs = point.askPrice - point.bidPrice;
const spreadPct = spreadAbs / point.bidPrice * 100;
spreadEl.textContent = `Spread: ${formatPrice(spreadAbs)} (${spreadPct.toFixed(1)}%)`;
spreadEl.style.display = "";
} else spreadEl.style.display = "none";
const tooltipWidth = tooltipEl.offsetWidth;
const containerWidth = canvas.parentElement?.offsetWidth ?? width;
let left = mouseX + 12;
if (left + tooltipWidth > containerWidth - 8) left = mouseX - tooltipWidth - 12;
tooltipEl.style.left = `${Math.max(4, left)}px`;
tooltipEl.style.top = "8px";
tooltipEl.style.right = "auto";
tooltipEl.style.opacity = "1";
}
function handleLeave() {
hoverIndex = null;
render();
tooltipEl.style.opacity = "0";
}
resize();
return {
render,
resize,
handleHover,
handleLeave
};
}
function drawAreaLine(ctx, data, key, color, getX, getY, chartHeight, topPadding) {
const points = [];
for (let i = 0; i < data.length; i++) {
const price = data[i][key];
if (price !== null) points.push({
x: getX(i),
y: getY(price)
});
}
if (points.length < 2) return;
const bottomY = topPadding + chartHeight;
ctx.beginPath();
ctx.moveTo(points[0].x, bottomY);
for (const p of points) ctx.lineTo(p.x, p.y);
ctx.lineTo(points[points.length - 1].x, bottomY);
ctx.closePath();
const gradient = ctx.createLinearGradient(0, topPadding, 0, bottomY);
gradient.addColorStop(0, hexToRgba$1(color, .2));
gradient.addColorStop(1, hexToRgba$1(color, 0));
ctx.fillStyle = gradient;
ctx.fill();
ctx.beginPath();
ctx.moveTo(points[0].x, points[0].y);
for (let i = 1; i < points.length; i++) ctx.lineTo(points[i].x, points[i].y);
ctx.strokeStyle = color;
ctx.lineWidth = 2;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke();
}
function drawDot(ctx, x, y, color) {
ctx.beginPath();
ctx.arc(x, y, 3.5, 0, Math.PI * 2);
ctx.fillStyle = color;
ctx.fill();
ctx.strokeStyle = "rgba(255, 255, 255, 0.6)";
ctx.lineWidth = 1.5;
ctx.stroke();
}
function hexToRgba$1(hex, alpha) {
return `rgba(${parseInt(hex.slice(1, 3), 16)}, ${parseInt(hex.slice(3, 5), 16)}, ${parseInt(hex.slice(5, 7), 16)}, ${alpha})`;
}
function Legend() {
return u("div", {
class: "mwm:flex mwm:gap-4 mwm:mt-2 mwm:justify-center",
children: [ u("div", {
class: "mwm:flex mwm:items-center mwm:gap-1.5 mwm:text-[9px] mwm:text-mwm-text-muted",
children: [ u("span", { class: "mwm:w-2 mwm:h-2 mwm:rounded-full mwm:bg-mwm-bid" }), u("span", { children: "Bid" })]
}), u("div", {
class: "mwm:flex mwm:items-center mwm:gap-1.5 mwm:text-[9px] mwm:text-mwm-text-muted",
children: [ u("span", { class: "mwm:w-2 mwm:h-2 mwm:rounded-full mwm:bg-mwm-ask" }), u("span", { children: "Ask" })]
})]
});
}
function Loading({ text = "Loading prices..." }) {
return u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:gap-2 mwm:py-3 mwm:text-mwm-text-muted mwm:text-[10px]",
children: [ u("div", { class: "mwm:w-3 mwm:h-3 mwm:border-2 mwm:border-mwm-border mwm:border-t-mwm-accent-purple mwm:rounded-full mwm:animate-spin" }), u("span", { children: text })]
});
}
function StatItem({ label, value, colorClass, compact }) {
return u("div", {
class: `mwm:bg-mwm-bg-surface mwm:rounded mwm:border mwm:border-mwm-border mwm:text-center ${compact ? "mwm:py-1 mwm:px-1" : "mwm:py-2 mwm:px-2"}`,
children: [ u("div", {
class: `mwm:uppercase mwm:tracking-wider mwm:text-mwm-text-muted ${compact ? "mwm:text-[7px] mwm:mb-0.5" : "mwm:text-[8px] mwm:mb-1"}`,
children: label
}), u("div", {
class: `mwm:font-semibold mwm:text-mwm-text-primary ${colorClass ?? ""} ${compact ? "mwm:text-[11px]" : "mwm:text-[13px]"}`,
children: formatPrice(value)
})]
});
}
function StatsRow({ bid, ask, high, low, compact }) {
return u("div", {
class: `mwm:grid mwm:grid-cols-4 ${compact ? "mwm:gap-1.5 mwm:mb-2" : "mwm:gap-2 mwm:mb-3"}`,
children: [
u(StatItem, {
label: "Bid",
value: bid,
colorClass: "mwm:text-mwm-bid",
compact
}),
u(StatItem, {
label: "Ask",
value: ask,
colorClass: "mwm:text-mwm-ask",
compact
}),
u(StatItem, {
label: "High",
value: high,
compact
}),
u(StatItem, {
label: "Low",
value: low,
compact
})
]
});
}
function itemUrl$1(itemHrid, enhancement) {
const base = `https://milkyway.market/items/${itemHrid}`;
return enhancement > 0 ? `${base}?enhancement=${enhancement}` : base;
}
function ItemModalPanel({ itemHrid, itemName, enhancement }) {
const state = usePriceData({
itemHrid,
enhancement
});
const stats = state.status === "data" ? calculateStats(state.data) : null;
return u("div", {
class: "mwm-root mwm:my-3 mwm:rounded-lg mwm:border mwm:border-mwm-border mwm:bg-mwm-bg-panel",
children: [
u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:px-3.5 mwm:py-2.5 mwm:border-b mwm:border-mwm-border",
children: u("span", {
class: "mwm:text-sm mwm:font-medium mwm:text-mwm-text-primary",
children: `${itemName}${enhancement > 0 ? ` +${enhancement}` : ""} (14d)`
})
}),
u("div", {
class: "mwm:p-3.5",
children: [
state.status === "loading" && u(Loading, { text: "Loading market data..." }),
state.status === "data" && stats && u(k$2, { children: [
u(StatsRow, {
bid: stats.currentBid,
ask: stats.currentAsk,
high: stats.highBid,
low: stats.lowBid
}),
u(PriceChart, {
data: state.data,
height: 140
}),
u(Legend, {})
] }),
state.status === "empty" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-5 mwm:text-mwm-text-muted mwm:text-[11px] mwm:text-center",
children: "No market data available"
}),
state.status === "error" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-3 mwm:text-mwm-text-muted mwm:text-[10px]",
children: "Failed to load market data"
})
]
}),
u("div", {
class: "mwm:px-3.5 mwm:py-2.5 mwm:border-t mwm:border-mwm-border mwm:flex mwm:items-center mwm:justify-between",
children: [ u("a", {
href: itemUrl$1(itemHrid, enhancement),
target: "_blank",
rel: "noopener",
class: "mwm:text-[10px] mwm:text-mwm-accent-purple mwm:no-underline mwm:hover:opacity-80 mwm:transition-opacity",
children: "View on MilkyWay Market →"
}), u("span", {
class: "mwm:text-[9px] mwm:text-mwm-text-muted",
children: "MWM"
})]
})
]
});
}
var GAME = {
tooltip: {
popper: "MuiTooltip-popper",
name: "ItemTooltipText_name",
content: "ItemTooltipText_itemTooltipText"
},
itemModal: {
content: "ItemDictionary_modalContent",
title: "ItemDictionary_title"
},
marketplace: {
currentItem: "MarketplacePanel_currentItem",
orderBooks: "MarketplacePanel_orderBooksContainer",
infoContainer: "MarketplacePanel_infoContainer",
tabPanels: "TabsComponent_tabPanelsContainer"
},
mainPanel: {
subPanelContainer: "MainPanel_subPanelContainer",
hidden: "MainPanel_hidden",
marketplaceModal: "MainPanel_marketplaceModal"
},
header: {
characterInfo: "Header_characterInfo",
communityBuffs: "Header_communityBuffs"
},
settings: { profileTab: "SettingsPanel_profileTab" },
items: {
name: "Item_name",
enhancement: "Item_enhancementLevel"
}
};
var ROOT_CLASS = "mwm-root";
function injectComponent(parent, vnode, options) {
const { id, position = "append", ref, contain } = options ?? {};
if (id && parent.querySelector(`#${id}`)) return () => {};
const host = document.createElement("div");
host.className = ROOT_CLASS;
if (id) host.id = id;
if (contain) {
host.style.overflow = "hidden";
host.style.maxWidth = "100%";
}
switch (position) {
case "prepend":
parent.prepend(host);
break;
case "before":
(ref ?? parent).insertAdjacentElement("beforebegin", host);
break;
case "after":
(ref ?? parent).insertAdjacentElement("afterend", host);
break;
default: parent.appendChild(host);
}
J(vnode, host);
return () => {
J(null, host);
host.remove();
};
}
function registerInjection(config) {
log(`Registering injection: ${config.name}`);
return domObserver.onClass(config.name, config.watchPrefix, (detected) => {
if (config.enabled && !config.enabled()) return;
const target = config.resolve(detected);
if (!target) return;
if (target.parent.querySelector(`#${config.id}`)) return;
const props = config.extract(detected);
if (!props) return;
injectComponent(target.parent, config.render(props), {
id: config.id,
position: target.position,
ref: target.ref,
contain: config.contain
});
});
}
function initItemModal() {
log("Initializing item modal prices");
return registerInjection({
id: "mwm-modal-panel",
name: "item-modal-prices",
watchPrefix: GAME.itemModal.content,
resolve(modalContent) {
const titleEl = qcls(modalContent, GAME.itemModal.title);
if (!titleEl) return null;
return {
parent: modalContent,
position: "after",
ref: titleEl.parentElement || modalContent
};
},
extract(modalContent) {
const rawName = qcls(modalContent, GAME.itemModal.title)?.textContent?.trim();
if (!rawName) return null;
const enhMatch = /\s*\+(\d+)$/.exec(rawName);
const enhancement = enhMatch ? parseInt(enhMatch[1], 10) : 0;
const itemName = rawName.replace(/\s*\+\d+$/, "");
const itemHrid = nameToHrid(itemName);
log(`Item modal detected: ${rawName} -> ${itemHrid}`);
return {
itemHrid,
itemName,
enhancement
};
},
render: (props) => u(ItemModalPanel, {
itemHrid: props.itemHrid,
itemName: props.itemName,
enhancement: props.enhancement
})
});
}
var STORAGE_KEY = "@mwm/panel-visible";
function getPanelVisible() {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored === null) return false;
return stored === "true";
} catch {
return false;
}
}
function setPanelVisible(visible) {
try {
localStorage.setItem(STORAGE_KEY, String(visible));
} catch {}
}
function itemUrl(itemHrid, enhancement) {
const base = `https://milkyway.market/items/${itemHrid}`;
return enhancement > 0 ? `${base}?enhancement=${enhancement}` : base;
}
function MarketplacePanel({ itemHrid, itemName, enhancement }) {
const [expanded, setExpanded] = d$2(getPanelVisible);
const state = usePriceData({
itemHrid,
enhancement,
enabled: expanded
});
const stats = state.status === "data" ? calculateStats(state.data) : null;
const title = `${itemName}${enhancement > 0 ? ` +${enhancement}` : ""} (14d)`;
function togglePanel() {
const next = !expanded;
setExpanded(next);
setPanelVisible(next);
}
return u("div", {
class: "mwm-root mwm:my-2 mwm:rounded-lg mwm:border mwm:border-mwm-border mwm:bg-mwm-bg-panel mwm:w-full",
children: [ u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:px-3 mwm:py-2",
children: [ u("span", {
class: "mwm:text-[11px] mwm:font-medium mwm:text-mwm-text-primary",
children: title
}), u("button", {
onClick: togglePanel,
title: expanded ? "Hide panel" : "Show panel",
class: "mwm:w-5 mwm:h-5 mwm:flex mwm:items-center mwm:justify-center mwm:border mwm:border-mwm-border mwm:bg-mwm-bg-surface mwm:text-mwm-text-muted mwm:cursor-pointer mwm:rounded mwm:text-xs mwm:leading-none mwm:transition-colors mwm:hover:bg-[rgba(255,255,255,0.08)] mwm:hover:text-mwm-text-primary",
children: expanded ? "−" : "+"
})]
}), expanded && u(k$2, { children: [ u("div", {
class: "mwm:px-3 mwm:pb-3",
children: [
state.status === "loading" && u(Loading, { text: "Loading market data..." }),
state.status === "data" && stats && u(k$2, { children: [
u(StatsRow, {
bid: stats.currentBid,
ask: stats.currentAsk,
high: stats.highBid,
low: stats.lowBid,
compact: true
}),
u(PriceChart, {
data: state.data,
height: 120,
reverseX: true
}),
u(Legend, {})
] }),
state.status === "empty" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-4 mwm:text-mwm-text-muted mwm:text-[11px] mwm:text-center",
children: "No market data available"
}),
state.status === "error" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-3 mwm:text-mwm-text-muted mwm:text-[10px]",
children: "Failed to load market data"
})
]
}), u("div", {
class: "mwm:px-3 mwm:py-2 mwm:border-t mwm:border-mwm-border mwm:flex mwm:items-center mwm:justify-between",
children: [ u("a", {
href: itemUrl(itemHrid, enhancement),
target: "_blank",
rel: "noopener",
class: "mwm:text-[9px] mwm:text-mwm-accent-purple mwm:no-underline mwm:hover:opacity-80 mwm:transition-opacity",
children: "View on MilkyWay Market →"
}), u("span", {
class: "mwm:text-[8px] mwm:text-mwm-text-muted",
children: "MWM"
})]
})] })]
});
}
var INJECT_ID = "mwm-marketplace-panel";
var currentItemKey = "";
var cleanupPanel = null;
function isMarketplaceActive() {
const panel = document.querySelector(`${cls(GAME.mainPanel.subPanelContainer)}${cls(GAME.mainPanel.marketplaceModal)}`);
if (!panel) return false;
return !hasCls(panel, GAME.mainPanel.hidden);
}
function initMarketplacePrices() {
log("Initializing marketplace prices");
return domObserver.onClass("marketplace-prices", GAME.marketplace.currentItem, handleMarketplaceItem);
}
function removePanel() {
if (cleanupPanel) {
cleanupPanel();
cleanupPanel = null;
currentItemKey = "";
}
}
function extractItemHrid(currentItemEl) {
const useElement = currentItemEl.querySelector("use");
if (useElement?.href?.baseVal) {
const itemId = useElement.href.baseVal.split("#")[1];
if (itemId) return itemId;
}
return null;
}
function extractEnhancementLevel(infoContainer) {
const enhancementEl = infoContainer.querySelector(cls(GAME.items.enhancement));
if (!enhancementEl) return 0;
return parseInt(enhancementEl.textContent ?? "0", 10);
}
function handleMarketplaceItem(currentItemEl) {
if (!getSettings().marketGraphEnabled) {
removePanel();
return;
}
const infoContainer = currentItemEl.closest(cls(GAME.marketplace.infoContainer));
if (!infoContainer) {
warn("Could not find marketplace info container");
return;
}
const itemHrid = extractItemHrid(currentItemEl);
if (!itemHrid) {
warn("Could not extract item HRID from marketplace");
return;
}
const enhancement = extractEnhancementLevel(infoContainer);
const cacheKey = `${itemHrid}:${enhancement}`;
if (isNonTradeable(itemHrid)) {
log(`Skipping non-tradeable item: ${itemHrid}`);
removePanel();
return;
}
if (cacheKey === currentItemKey && cleanupPanel) return;
removePanel();
currentItemKey = cacheKey;
const itemName = hridToName(itemHrid);
cleanupPanel = injectComponent(infoContainer.parentElement ?? infoContainer, u(MarketplacePanel, {
itemHrid,
itemName,
enhancement
}), {
id: INJECT_ID,
position: "after",
ref: infoContainer
});
}
var reportModalOpen = y$1(false);
var REPORT_NAME_KEY = "@mwm/report-name";
var REPORT_DISCORD_KEY = "@mwm/report-discord";
function getReportName() {
return _GM_getValue(REPORT_NAME_KEY, "");
}
function getReportDiscord() {
return _GM_getValue(REPORT_DISCORD_KEY, "");
}
function setReportName(value) {
_GM_setValue(REPORT_NAME_KEY, value);
}
function setReportDiscord(value) {
_GM_setValue(REPORT_DISCORD_KEY, value);
}
async function sendReport(opts) {
const payload = { ...addonStatus.value };
const body = JSON.stringify({
name: opts.name || void 0,
discordHandle: opts.discordHandle || void 0,
description: opts.description || void 0,
payload,
userAgent: navigator.userAgent
});
try {
_GM_setClipboard(JSON.stringify(payload, null, 2), "text");
log("Diagnostic JSON copied to clipboard");
} catch {
warn("Failed to copy to clipboard");
}
return new Promise((resolve) => {
_GM_xmlhttpRequest({
method: "POST",
url: `${MARKET_API}/addon/report`,
headers: {
"Content-Type": "application/json",
"X-MWM-Addon": VERSION
},
data: body,
timeout: 15e3,
ontimeout: () => {
warn("Report request timed out");
resolve({
success: false,
error: "timeout"
});
},
onload: (response) => {
try {
const parsed = JSON.parse(response.responseText);
if (parsed.success) {
log("Bug report sent successfully");
resolve({ success: true });
} else if (parsed.error === "rate_limited") {
log(`Rate limited, retry after ${parsed.retryAfter}s`);
resolve({
success: false,
retryAfter: parsed.retryAfter,
error: "rate_limited"
});
} else {
warn("Report failed:", parsed.error);
resolve({
success: false,
error: parsed.error
});
}
} catch {
warn("Failed to parse report response");
resolve({
success: false,
error: "parse_error"
});
}
},
onerror: (err) => {
warn("Report network error:", err);
resolve({
success: false,
error: "network_error"
});
}
});
});
}
var SYNC_PRESETS$1 = [
{
label: "30s",
value: 3e4
},
{
label: "60s",
value: 6e4
},
{
label: "2m",
value: 12e4
},
{
label: "5m",
value: 3e5
}
];
function SettingsPanel() {
const s = settings.value;
return u("div", {
class: "mwm-root",
id: "mwm-settings",
children: u("div", {
class: "mwm:mt-5 mwm:mb-5 mwm:px-6 mwm:py-4 mwm:rounded-lg mwm:border mwm:border-mwm-border mwm:bg-mwm-bg-panel mwm:w-full",
children: [ u("div", {
class: "mwm:flex mwm:items-center mwm:gap-2 mwm:mb-4 mwm:pb-3 mwm:border-b mwm:border-mwm-border",
children: [ u("span", {
class: "mwm:text-[13px] mwm:font-semibold mwm:text-mwm-accent-purple mwm:uppercase mwm:tracking-wider mwm:flex mwm:items-center mwm:gap-2",
children: [ u("span", { class: "mwm:w-1.5 mwm:h-1.5 mwm:bg-mwm-accent-purple mwm:rounded-full mwm:animate-pulse" }), "MWM Addon Settings"]
}), u("span", {
class: "mwm:text-[9px] mwm:text-mwm-text-muted",
children: "(changes apply immediately)"
})]
}), u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-3",
children: [
u("label", {
class: "mwm:flex mwm:items-center mwm:gap-2.5 mwm:cursor-pointer",
children: [ u("input", {
type: "checkbox",
checked: s.tooltipGraphEnabled,
onChange: (e) => updateSetting("tooltipGraphEnabled", e.target.checked),
class: "mwm:appearance-none mwm:w-[18px] mwm:h-[18px] mwm:border-2 mwm:border-mwm-border mwm:rounded mwm:bg-mwm-bg-surface mwm:cursor-pointer mwm:relative mwm:shrink-0 mwm:transition-all mwm:hover:border-mwm-accent-purple mwm:hover:bg-[rgba(139,92,246,0.1)] mwm:checked:bg-mwm-accent-purple mwm:checked:border-mwm-accent-purple"
}), u("span", {
class: "mwm:text-[11px] mwm:text-mwm-text-primary",
children: "Show prices in tooltips"
})]
}),
u("label", {
class: "mwm:flex mwm:items-center mwm:gap-2.5 mwm:cursor-pointer",
children: [ u("input", {
type: "checkbox",
checked: s.marketGraphEnabled,
onChange: (e) => updateSetting("marketGraphEnabled", e.target.checked),
class: "mwm:appearance-none mwm:w-[18px] mwm:h-[18px] mwm:border-2 mwm:border-mwm-border mwm:rounded mwm:bg-mwm-bg-surface mwm:cursor-pointer mwm:relative mwm:shrink-0 mwm:transition-all mwm:hover:border-mwm-accent-purple mwm:hover:bg-[rgba(139,92,246,0.1)] mwm:checked:bg-mwm-accent-purple mwm:checked:border-mwm-accent-purple"
}), u("span", {
class: "mwm:text-[11px] mwm:text-mwm-text-primary",
children: "Show price chart in marketplace"
})]
}),
u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-1.5",
children: [ u("label", {
class: "mwm:flex mwm:items-center mwm:gap-2.5 mwm:cursor-pointer",
children: [ u("span", {
class: "mwm:text-[11px] mwm:text-mwm-text-primary",
children: "Fetch delay (seconds):"
}), u("input", {
type: "number",
value: s.fetchDelayMs / 1e3,
min: "2",
step: "0.5",
onInput: (e) => {
const val = parseFloat(e.target.value);
updateSetting("fetchDelayMs", isNaN(val) ? 2e3 : Math.max(2e3, val * 1e3));
},
class: "mwm:w-20 mwm:px-2.5 mwm:py-1.5 mwm:bg-mwm-bg-surface mwm:border mwm:border-mwm-border mwm:rounded mwm:text-mwm-text-primary mwm:text-[11px] mwm:transition-all mwm:hover:border-mwm-accent-purple mwm:focus:border-mwm-accent-purple mwm:focus:outline-none"
})]
}), u("span", {
class: "mwm:text-[9px] mwm:text-mwm-text-muted",
children: "Minimum 2s. Higher = fewer API calls on rapid hovers"
})]
}),
u("div", {
class: "mwm:border-t mwm:border-mwm-border mwm:mt-1 mwm:pt-3",
children: u("span", {
class: "mwm:text-[10px] mwm:text-mwm-text-muted mwm:uppercase mwm:tracking-wider",
children: "Status Indicator"
})
}),
u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-1.5",
children: [ u("span", {
class: "mwm:text-[11px] mwm:text-mwm-text-primary",
children: "Appearance:"
}), u("div", {
class: "mwm:flex mwm:gap-1.5",
children: [ u("button", {
onClick: () => updateSetting("statusPillStyle", "pill"),
class: `mwm:px-3 mwm:py-1.5 mwm:rounded mwm:text-[10px] mwm:font-medium mwm:transition-all mwm:border ${s.statusPillStyle === "pill" ? "mwm:bg-mwm-accent-purple mwm:border-mwm-accent-purple mwm:text-white" : "mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-primary mwm:hover:border-mwm-accent-purple"}`,
children: "Pill with text"
}), u("button", {
onClick: () => updateSetting("statusPillStyle", "icon"),
class: `mwm:px-3 mwm:py-1.5 mwm:rounded mwm:text-[10px] mwm:font-medium mwm:transition-all mwm:border ${s.statusPillStyle === "icon" ? "mwm:bg-mwm-accent-purple mwm:border-mwm-accent-purple mwm:text-white" : "mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-primary mwm:hover:border-mwm-accent-purple"}`,
children: "Icon only"
})]
})]
}),
u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-1.5",
children: [
u("span", {
class: "mwm:text-[11px] mwm:text-mwm-text-primary",
children: "Sync frequency:"
}),
u("div", {
class: "mwm:flex mwm:gap-1.5",
children: SYNC_PRESETS$1.map((preset) => u("button", {
onClick: () => updateSetting("syncIntervalMs", preset.value),
class: `mwm:px-3 mwm:py-1.5 mwm:rounded mwm:text-[10px] mwm:font-medium mwm:transition-all mwm:border ${s.syncIntervalMs === preset.value ? "mwm:bg-mwm-accent-purple mwm:border-mwm-accent-purple mwm:text-white" : "mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-primary mwm:hover:border-mwm-accent-purple"}`,
children: preset.label
}, preset.value))
}),
u("span", {
class: "mwm:text-[9px] mwm:text-mwm-text-muted",
children: "How often character data syncs to storage"
})
]
}),
u("div", {
class: "mwm:border-t mwm:border-mwm-border mwm:mt-1 mwm:pt-3",
children: u("span", {
class: "mwm:text-[10px] mwm:text-mwm-text-muted mwm:uppercase mwm:tracking-wider",
children: "Troubleshooting"
})
}),
u("div", {
class: "mwm:flex mwm:gap-1.5",
children: [ u("button", {
onClick: () => location.reload(),
class: "mwm:px-3 mwm:py-1.5 mwm:rounded mwm:text-[10px] mwm:font-medium mwm:transition-all mwm:border mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-primary mwm:hover:border-mwm-accent-purple",
children: "Reload Page"
}), u("button", {
onClick: () => {
reportModalOpen.value = true;
},
class: "mwm:px-3 mwm:py-1.5 mwm:rounded mwm:text-[10px] mwm:font-medium mwm:transition-all mwm:border mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-primary mwm:hover:border-mwm-accent-purple",
children: "Report a Problem"
})]
})
]
})]
})
});
}
function initSettings() {
loadSettings();
log("Settings initialized");
return registerInjection({
id: "mwm-settings",
name: "settings-panel",
watchPrefix: GAME.settings.profileTab,
resolve: (settingsPanel) => ({
parent: settingsPanel,
position: "append"
}),
extract: () => ({}),
render: () => u(SettingsPanel, {})
});
}
function PriceDisplay({ bid, ask, change }) {
const changeClass = change !== void 0 && change > 0 ? "mwm:text-mwm-bid mwm:bg-[rgba(192,132,252,0.15)]" : change !== void 0 && change < 0 ? "mwm:text-mwm-ask mwm:bg-[rgba(94,233,197,0.15)]" : "mwm:text-mwm-text-muted mwm:bg-mwm-bg-surface";
const changeText = change !== void 0 ? change > 0 ? `+${change.toFixed(1)}%` : `${change.toFixed(1)}%` : null;
return u("div", {
class: "mwm:relative mwm:z-[1]",
children: [changeText !== null && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:mb-1.5",
children: [ u("span", {
class: "mwm:text-[9px] mwm:font-medium mwm:tracking-wider mwm:uppercase mwm:text-mwm-accent-purple mwm:flex mwm:items-center mwm:gap-1.5",
children: [ u("span", { class: "mwm:w-1.5 mwm:h-1.5 mwm:bg-mwm-accent-purple mwm:rounded-full mwm:animate-pulse" }), "MWM Prices"]
}), u("span", {
class: `mwm:text-[10px] mwm:px-1.5 mwm:py-0.5 mwm:rounded ${changeClass}`,
children: changeText
})]
}), u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between mwm:gap-3",
children: [ u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-0.5",
children: [ u("span", {
class: "mwm:text-[8px] mwm:uppercase mwm:tracking-wider mwm:text-mwm-bid",
children: "Bid"
}), u("span", {
class: "mwm:text-[13px] mwm:font-semibold mwm:text-mwm-text-primary",
children: formatPrice(bid)
})]
}), u("div", {
class: "mwm:flex mwm:flex-col mwm:gap-0.5",
children: [ u("span", {
class: "mwm:text-[8px] mwm:uppercase mwm:tracking-wider mwm:text-mwm-ask",
children: "Ask"
}), u("span", {
class: "mwm:text-[13px] mwm:font-semibold mwm:text-mwm-text-primary",
children: formatPrice(ask)
})]
})]
})]
});
}
var DEFAULT_OPTIONS = {
height: 36,
bidColor: "#c084fc",
askColor: "#5ee9c5",
fillOpacity: .15,
lineWidth: 1.5
};
function renderSparkline(canvas, data, options) {
const opts = {
...DEFAULT_OPTIONS,
...options
};
const ctx = canvas.getContext("2d");
if (!ctx) return;
const dpr = window.devicePixelRatio || 1;
canvas.width = opts.width * dpr;
canvas.height = opts.height * dpr;
canvas.style.width = `${opts.width}px`;
canvas.style.height = `${opts.height}px`;
ctx.scale(dpr, dpr);
ctx.clearRect(0, 0, opts.width, opts.height);
if (data.length < 2) return;
const bidPrices = data.map((d) => d.bidPrice).filter((p) => p !== null);
const askPrices = data.map((d) => d.askPrice).filter((p) => p !== null);
const allPrices = [...bidPrices, ...askPrices];
const minPrice = Math.min(...allPrices);
const priceRange = Math.max(...allPrices) - minPrice || 1;
const normalizeY = (price) => {
const padding = 2;
const height = opts.height - padding * 2;
return padding + height - (price - minPrice) / priceRange * height;
};
const getX = (index, total) => {
return index / (total - 1) * opts.width;
};
if (askPrices.length >= 2) drawLine(ctx, data, "askPrice", opts.askColor, opts, normalizeY, getX);
if (bidPrices.length >= 2) drawLine(ctx, data, "bidPrice", opts.bidColor, opts, normalizeY, getX);
}
function drawLine(ctx, data, priceKey, color, opts, normalizeY, getX) {
const points = [];
for (let i = 0; i < data.length; i++) {
const price = data[i][priceKey];
if (price !== null) points.push({
x: getX(i, data.length),
y: normalizeY(price)
});
}
if (points.length < 2) return;
ctx.beginPath();
ctx.moveTo(points[0].x, opts.height);
for (const point of points) ctx.lineTo(point.x, point.y);
ctx.lineTo(points[points.length - 1].x, opts.height);
ctx.closePath();
const gradient = ctx.createLinearGradient(0, 0, 0, opts.height);
gradient.addColorStop(0, hexToRgba(color, opts.fillOpacity));
gradient.addColorStop(1, hexToRgba(color, 0));
ctx.fillStyle = gradient;
ctx.fill();
ctx.beginPath();
ctx.moveTo(points[0].x, points[0].y);
for (let i = 1; i < points.length; i++) ctx.lineTo(points[i].x, points[i].y);
ctx.strokeStyle = color;
ctx.lineWidth = opts.lineWidth;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke();
}
function hexToRgba(hex, alpha) {
return `rgba(${parseInt(hex.slice(1, 3), 16)}, ${parseInt(hex.slice(3, 5), 16)}, ${parseInt(hex.slice(5, 7), 16)}, ${alpha})`;
}
function createSparklineCanvas() {
const canvas = document.createElement("canvas");
canvas.className = "mwm-sparkline";
canvas.style.width = "100%";
canvas.style.display = "block";
return canvas;
}
function Sparkline({ data, options }) {
const containerRef = A(null);
const canvasRef = A(null);
const draw = q$1(() => {
const container = containerRef.current;
if (!container || data.length < 2) return;
if (!canvasRef.current) {
canvasRef.current = createSparklineCanvas();
container.innerHTML = "";
container.appendChild(canvasRef.current);
}
const width = container.clientWidth;
if (width > 0) renderSparkline(canvasRef.current, data, {
...options,
width
});
}, [data, options]);
y$2(() => {
const container = containerRef.current;
if (!container) return;
canvasRef.current = null;
draw();
const ro = new ResizeObserver(() => draw());
ro.observe(container);
return () => {
ro.disconnect();
if (container) container.innerHTML = "";
canvasRef.current = null;
};
}, [draw]);
return u("div", {
ref: containerRef,
class: "mwm:w-full mwm:h-8 mwm:rounded mwm:bg-mwm-bg-surface mwm:relative mwm:z-[1]"
});
}
function TooltipPrice({ itemHrid, enhancement, tooltipEl }) {
const state = usePriceData({
itemHrid,
enhancement,
delayMs: getSettings().fetchDelayMs,
guardEl: tooltipEl
});
return u("div", {
class: "mwm-root mwm:mt-2 mwm:px-2.5 mwm:py-2 mwm:rounded-md mwm:border mwm:border-mwm-border mwm:bg-mwm-bg-panel mwm:overflow-hidden",
children: [
state.status === "loading" && u(Loading, {}),
state.status === "data" && u(k$2, { children: [ u(PriceDisplay, {
bid: state.data[state.data.length - 1]?.bidPrice ?? null,
ask: state.data[state.data.length - 1]?.askPrice ?? null,
change: calculateChange(state.data)
}), u("div", {
class: "mwm:mt-1.5",
children: u(Sparkline, { data: state.data })
})] }),
state.status === "empty" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-1.5 mwm:text-mwm-text-muted mwm:text-[9px]",
children: "No market data available"
}),
state.status === "error" && u("div", {
class: "mwm:flex mwm:items-center mwm:justify-center mwm:py-1.5 mwm:text-mwm-text-muted mwm:text-[9px]",
children: "Failed to load prices"
})
]
});
}
function initTooltipPrices() {
log("Initializing tooltip prices");
return registerInjection({
id: "mwm-tooltip-price",
name: "tooltip-prices",
watchPrefix: GAME.tooltip.popper,
contain: true,
enabled: () => getSettings().tooltipGraphEnabled && !isMarketplaceActive(),
resolve(tooltip) {
const content = qcls(tooltip, GAME.tooltip.content);
if (!content || content.querySelector(".mwm-root")) return null;
return {
parent: content,
position: "append"
};
},
extract(tooltip) {
const itemName = qcls(tooltip, GAME.tooltip.name)?.textContent?.trim();
if (!itemName) return null;
const enhMatch = /\s*\+(\d+)$/.exec(itemName);
const enhancement = enhMatch ? parseInt(enhMatch[1], 10) : 0;
const itemHrid = nameToHrid(itemName.replace(/\s*\+\d+$/, ""));
if (isNonTradeable(itemHrid)) return null;
return {
itemHrid,
enhancement,
tooltipEl: tooltip
};
},
render: (props) => u(TooltipPrice, {
itemHrid: props.itemHrid,
enhancement: props.enhancement,
tooltipEl: props.tooltipEl
})
});
}
function hookWebSocket(onMessage) {
const dataDesc = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data");
if (!dataDesc?.get) {
warn("Cannot hook WebSocket - MessageEvent.prototype.data not found");
reportError("WS_HOOK_FAILED", "MessageEvent.prototype.data getter not found");
markCheckpoint("ws_hooked", "failed", "data getter not found");
return;
}
const originalGet = dataDesc.get;
dataDesc.get = function hookedGet() {
const socket = this.currentTarget;
if (!(socket instanceof WebSocket)) return originalGet.call(this);
if (!WS_ENDPOINTS.some((ep) => socket.url?.includes(ep))) return originalGet.call(this);
const message = originalGet.call(this);
Object.defineProperty(this, "data", { value: message });
if (typeof message === "string") try {
const data = JSON.parse(message);
if (data?.type) setTimeout(() => onMessage(data.type, data), 0);
} catch {}
return message;
};
Object.defineProperty(MessageEvent.prototype, "data", dataDesc);
markCheckpoint("ws_hooked", "ok");
log("WebSocket hook installed");
}
function ReportModal() {
const isOpen = reportModalOpen.value;
const [status, setStatus] = d$2("idle");
const [countdown, setCountdown] = d$2(0);
const [name, setName] = d$2("");
const [discord, setDiscord] = d$2("");
const [message, setMessage] = d$2("");
const backdropRef = A(null);
const countdownRef = A(null);
y$2(() => {
if (isOpen) {
setName(getReportName());
setDiscord(getReportDiscord());
setMessage("");
setStatus("idle");
}
}, [isOpen]);
y$2(() => {
if (status === "rate_limited" && countdown > 0) {
countdownRef.current = setInterval(() => {
setCountdown((prev) => {
if (prev <= 1) {
if (countdownRef.current) clearInterval(countdownRef.current);
setStatus("idle");
return 0;
}
return prev - 1;
});
}, 1e3);
return () => {
if (countdownRef.current) clearInterval(countdownRef.current);
};
}
}, [status, countdown]);
const close = q$1(() => {
reportModalOpen.value = false;
}, []);
y$2(() => {
if (status === "success") {
const timer = setTimeout(close, 2e3);
return () => clearTimeout(timer);
}
}, [status, close]);
y$2(() => {
if (!isOpen) return;
const handler = (e) => {
if (e.key === "Escape") close();
};
window.addEventListener("keydown", handler);
return () => window.removeEventListener("keydown", handler);
}, [isOpen, close]);
const handleSubmit = async () => {
setStatus("sending");
setReportName(name);
setReportDiscord(discord);
const result = await sendReport({
name: name || void 0,
discordHandle: discord || void 0,
description: message || void 0
});
if (result.success) setStatus("success");
else if (result.error === "rate_limited" && result.retryAfter) {
setCountdown(result.retryAfter);
setStatus("rate_limited");
} else {
setStatus("error");
setTimeout(() => setStatus("idle"), 3e3);
}
};
const handleBackdropClick = (e) => {
if (e.target === backdropRef.current) close();
};
if (!isOpen) return null;
const formatCountdown = (s) => {
return `${Math.floor(s / 60)}:${(s % 60).toString().padStart(2, "0")}`;
};
const isDisabled = status === "sending" || status === "rate_limited";
return u("div", {
ref: backdropRef,
onClick: handleBackdropClick,
style: {
position: "fixed",
inset: 0,
zIndex: 99999,
display: "flex",
alignItems: "center",
justifyContent: "center",
backgroundColor: "rgba(0, 0, 0, 0.5)"
},
children: u("div", {
style: {
width: "320px",
backgroundColor: "var(--mwm-bg-panel, #1a1a2e)",
border: "1px solid var(--mwm-border, #2a2a4a)",
borderRadius: "8px",
padding: "16px",
fontFamily: "system-ui, sans-serif"
},
children: [
u("div", {
style: {
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginBottom: "12px"
},
children: [ u("span", {
style: {
fontSize: "13px",
fontWeight: 600,
color: "var(--mwm-accent-purple, #8b5cf6)"
},
children: "Report a Problem"
}), u("button", {
onClick: close,
style: {
background: "none",
border: "none",
color: "var(--mwm-text-muted, #888)",
cursor: "pointer",
fontSize: "16px",
padding: "0 4px",
lineHeight: 1
},
children: "×"
})]
}),
u("div", {
style: {
display: "flex",
flexDirection: "column",
gap: "8px"
},
children: [
u("div", { children: [ u("input", {
type: "text",
placeholder: "Your name",
value: name,
onInput: (e) => setName(e.target.value),
maxLength: 100,
disabled: isDisabled,
style: {
width: "100%",
boxSizing: "border-box",
padding: "6px 8px",
fontSize: "11px",
backgroundColor: "var(--mwm-bg-surface, #16162a)",
border: "1px solid var(--mwm-border, #2a2a4a)",
borderRadius: "4px",
color: "var(--mwm-text-primary, #e0e0e0)",
outline: "none"
}
}), u("span", {
style: {
fontSize: "9px",
color: "var(--mwm-text-muted, #888)",
marginTop: "2px",
display: "block"
},
children: "Helps us contact you for more details"
})] }),
u("input", {
type: "text",
placeholder: "Discord handle (optional)",
value: discord,
onInput: (e) => setDiscord(e.target.value),
maxLength: 100,
disabled: isDisabled,
style: {
width: "100%",
boxSizing: "border-box",
padding: "6px 8px",
fontSize: "11px",
backgroundColor: "var(--mwm-bg-surface, #16162a)",
border: "1px solid var(--mwm-border, #2a2a4a)",
borderRadius: "4px",
color: "var(--mwm-text-primary, #e0e0e0)",
outline: "none"
}
}),
u("textarea", {
placeholder: "Briefly describe the issue (optional)",
value: message,
onInput: (e) => setMessage(e.target.value),
maxLength: 240,
disabled: isDisabled,
rows: 3,
style: {
width: "100%",
boxSizing: "border-box",
padding: "6px 8px",
fontSize: "11px",
backgroundColor: "var(--mwm-bg-surface, #16162a)",
border: "1px solid var(--mwm-border, #2a2a4a)",
borderRadius: "4px",
color: "var(--mwm-text-primary, #e0e0e0)",
outline: "none",
resize: "none",
fontFamily: "inherit"
}
}),
u("div", {
style: {
fontSize: "9px",
color: "var(--mwm-text-muted, #888)",
textAlign: "right"
},
children: [message.length, "/240"]
})
]
}),
u("div", {
style: {
marginTop: "12px",
display: "flex",
gap: "8px"
},
children: [ u("button", {
onClick: close,
style: {
flex: 1,
padding: "6px",
fontSize: "10px",
fontWeight: 500,
backgroundColor: "var(--mwm-bg-surface, #16162a)",
border: "1px solid var(--mwm-border, #2a2a4a)",
borderRadius: "4px",
color: "var(--mwm-text-primary, #e0e0e0)",
cursor: "pointer"
},
children: "Cancel"
}), u("button", {
onClick: handleSubmit,
disabled: isDisabled,
style: {
flex: 1,
padding: "6px",
fontSize: "10px",
fontWeight: 500,
backgroundColor: isDisabled ? "var(--mwm-bg-surface, #16162a)" : "var(--mwm-accent-purple, #8b5cf6)",
border: `1px solid ${isDisabled ? "var(--mwm-border, #2a2a4a)" : "var(--mwm-accent-purple, #8b5cf6)"}`,
borderRadius: "4px",
color: isDisabled ? "var(--mwm-text-muted, #888)" : "#fff",
cursor: isDisabled ? "not-allowed" : "pointer",
opacity: isDisabled ? .6 : 1
},
children: [
status === "idle" && "Send Report",
status === "sending" && "Sending...",
status === "success" && "Sent! Copied to clipboard",
status === "rate_limited" && `Sent! ${formatCountdown(countdown)}`,
status === "error" && "Failed — copied to clipboard"
]
})]
}),
u("div", {
style: {
marginTop: "8px",
fontSize: "9px",
color: "var(--mwm-text-muted, #888)",
textAlign: "center"
},
children: "Diagnostic data will be sent alongside your report"
})
]
})
});
}
function initReportModal() {
injectComponent(document.body, _$2(ReportModal, null), { id: "mwm-report-modal" });
}
var STATUS_LABELS = {
ADDON_OK: "Connected",
WS_DISCONNECTED: "Game Disconnected",
WS_HOOK_FAILED: "WebSocket Hook Failed",
STORAGE_ERROR: "Storage Error",
NO_CHARACTER_DATA: "No Character Data",
STALE_DATA: "Data is Stale",
CONFLICT_DETECTED: "Conflict Detected"
};
var SEVERITY_DOT = {
ok: "mwm:bg-emerald-400",
warn: "mwm:bg-amber-400",
error: "mwm:bg-red-400"
};
function statusSeverity(code) {
if (code === "ADDON_OK") return "ok";
if (code === "STALE_DATA" || code === "NO_CHARACTER_DATA") return "warn";
return "error";
}
var SYNC_PRESETS = [
{
label: "30s",
value: 3e4
},
{
label: "60s",
value: 6e4
},
{
label: "2m",
value: 12e4
},
{
label: "5m",
value: 3e5
}
];
var CP_DOT = {
ok: "mwm:bg-emerald-400",
failed: "mwm:bg-red-400",
pending: "mwm:bg-amber-400 mwm:animate-pulse",
skipped: "mwm:bg-mwm-text-muted"
};
function CheckpointRow({ cp }) {
return u("div", {
class: "mwm:flex mwm:justify-between mwm:items-start mwm:gap-2",
children: [ u("div", {
class: "mwm:flex mwm:items-center mwm:gap-2",
children: [ u("span", {
class: `mwm:rounded-full mwm:shrink-0 ${CP_DOT[cp.status]}`,
style: {
width: "4px",
height: "4px"
}
}), u("span", {
class: "mwm:text-mwm-text-primary mwm:flex-1 mwm:text-xs",
children: cp.label
})]
}), cp.detail && cp.status !== "skipped" && u("span", {
class: "mwm:text-mwm-text-muted mwm:text-xs",
children: cp.detail
})]
});
}
function StatusDetails({ info, version }) {
const currentInterval = settings.value.syncIntervalMs;
const severity = statusSeverity(info.status);
const dotColor = SEVERITY_DOT[severity];
const visibleCheckpoints = info.checkpoints.filter((cp) => cp.status !== "skipped");
return u("div", {
class: "mwm:absolute mwm:top-full mwm:right-0 mwm:rounded-lg mwm:bg-mwm-bg-panel mwm:z-50 mwm:overflow-hidden ",
style: {
marginTop: "6px",
width: "200px"
},
children: [
u("div", {
class: "mwm:p-2 ",
children: u("div", {
class: "mwm:flex mwm:items-center mwm:justify-between",
children: [ u("p", {
class: "mwm:text-mwm-accent-purple mwm:font-semibold mwm:flex mwm:items-center mwm:gap-2 mwm:text-xs",
children: ["MWM Addon", u("span", {
class: "mwm:text-mwm-text-muted mwm:text-xs",
children: ["v", version]
})]
}), u("span", { class: `mwm:rounded-full mwm:shrink-0 ${dotColor} mwm:size-2` })]
})
}),
visibleCheckpoints.length > 0 && u("div", {
class: "mwm:border-b mwm:border-mwm-border mwm:p-2",
children: visibleCheckpoints.map((cp) => u(CheckpointRow, { cp }, cp.id))
}),
info.errors.length > 0 && u("div", {
style: { padding: "6px 10px" },
class: "mwm:border-b mwm:border-mwm-border",
children: info.errors.slice(-3).map((err, i) => u("div", {
class: "mwm:flex mwm:items-center mwm:gap-[6px]",
style: { padding: "2px 0" },
children: [ u("span", {
class: "mwm:rounded-full mwm:shrink-0 mwm:bg-red-400",
style: {
width: "4px",
height: "4px"
}
}), u("span", {
class: "mwm:text-red-400",
style: { fontSize: "10px" },
children: STATUS_LABELS[err.code]
})]
}, i))
}),
u("div", {
style: { padding: "7px 10px 8px" },
children: [ u("div", {
class: "mwm:text-mwm-text-muted mwm:uppercase",
style: {
fontSize: "8px",
letterSpacing: "0.08em",
marginBottom: "5px"
},
children: "Sync interval"
}), u("div", {
class: "mwm:grid mwm:grid-cols-4 mwm:gap-[3px]",
children: SYNC_PRESETS.map((preset) => {
return u("button", {
onClick: () => updateSetting("syncIntervalMs", preset.value),
class: `mwm:rounded mwm:border mwm:text-center mwm:cursor-pointer mwm:transition-colors ${currentInterval === preset.value ? "mwm:bg-mwm-accent-purple/20 mwm:border-mwm-accent-purple/50 mwm:text-mwm-accent-purple" : "mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-muted mwm:hover:text-mwm-text-primary mwm:hover:border-mwm-accent-purple/30"}`,
style: {
fontSize: "9px",
padding: "3px 0",
fontWeight: 500
},
children: preset.label
}, preset.value);
})
})]
}),
severity !== "ok" && u("div", {
style: { padding: "7px 10px 8px" },
class: "mwm:border-t mwm:border-mwm-border",
children: u("div", {
class: "mwm:grid mwm:grid-cols-2 mwm:gap-[3px]",
children: [ u("button", {
onClick: () => location.reload(),
class: "mwm:rounded mwm:border mwm:text-center mwm:cursor-pointer mwm:transition-colors mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-muted mwm:hover:text-mwm-text-primary mwm:hover:border-mwm-accent-purple/30",
style: {
fontSize: "9px",
padding: "3px 0",
fontWeight: 500
},
children: "Reload"
}), u("button", {
onClick: () => {
reportModalOpen.value = true;
},
class: "mwm:rounded mwm:border mwm:text-center mwm:cursor-pointer mwm:transition-colors mwm:bg-mwm-bg-surface mwm:border-mwm-border mwm:text-mwm-text-muted mwm:hover:text-mwm-text-primary mwm:hover:border-mwm-accent-purple/30",
style: {
fontSize: "9px",
padding: "3px 0",
fontWeight: 500
},
children: "Report"
})]
})
})
]
});
}
function MwmLogo({ class: cls, style: s }) {
return u("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 2589 1596",
class: cls,
style: {
fillRule: "evenodd",
clipRule: "evenodd",
strokeLinejoin: "round",
strokeMiterlimit: 2,
...s
},
children: [
u("path", {
d: "M4 14h32v25H4z",
style: {
fill: "#fefefe",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M32.5 1H7l-6 9.756v6.342C1.5 18.398 2.7 21 5.5 21s4.667-2.602 5-3.902c.333 1.3 2.2 3.902 5 3.902s4.167-2.602 4.5-3.902c.333 1.3 1.7 3.902 4.5 3.902s4.667-2.602 5-3.902c.333 1.3 1.8 3.902 5 3.902s4-2.602 4.5-3.902v-6.342L32.5 1Z",
style: {
fill: "#ce4317",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M32.5 1H7l-6 9.756v6.342C1.5 18.398 2.7 21 5.5 21s4.667-2.602 5-3.902c.333 1.3 2.2 3.902 5 3.902s4.167-2.602 4.5-3.902c.333 1.3 1.7 3.902 4.5 3.902s4.667-2.602 5-3.902c.333 1.3 1.8 3.902 5 3.902s4-2.602 4.5-3.902v-6.342L32.5 1Z",
style: {
fill: "#fff",
fillOpacity: ".3",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M1 10.5 7 1h25.5l6.5 9.5H1Z",
style: {
fill: "#898989",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M1 10.5 7 1h25.5l6.5 9.5H1Z",
style: {
fill: "#fff",
fillOpacity: ".6",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M12 26h7v13h-7z",
style: {
fill: "#546ddb",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M12 26h7v13h-7z",
style: {
fill: "#fff",
fillOpacity: ".4",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M21 26h7v13h-7z",
style: {
fill: "#546ddb",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M21 26h7v13h-7z",
style: {
fill: "#fff",
fillOpacity: ".4",
fillRule: "nonzero"
},
transform: "matrix(41.98128 0 0 41.98128 514.587063 -41.936769)"
}),
u("path", {
d: "M12.552 22.61c2.528.016 7.039-.036 10.047.486l-.451 2.865-.057-.002c-3.875-.113-10.565-.322-11.408 2.968-.848 3.306 11.945 10.75 27.121 14.776 15.176 4.028 29.99 4.563 31.197.342.805-2.813-3.063-6.238-6.094-7.647l.377-2.457c1.972.8 4.027 1.991 5.997 3.128 2.304 1.328 10.624 6.003 9.595 10.018-1.12 4.37-15.07 6.45-41.858-.313C13.062 40.725-.668 31.547.633 26.469c.817-3.188 8.407-3.88 11.92-3.859h-.001Z",
style: {
fill: "#faa21e",
fillRule: "nonzero"
},
transform: "rotate(-9.0668 1557.8701 1099.178805) scale(32.14441)"
}),
u("path", {
d: "M12.552 22.61c2.528.016 7.107-.047 10.115.475l-.519 2.876-.057-.002c-3.875-.113-10.565-.322-11.408 2.968-.848 3.306 11.945 10.75 27.121 14.776 15.176 4.028 29.99 4.563 31.197.342.805-2.813-3.04-6.207-6.071-7.616l.299-2.497c1.972.8 4.082 2 6.052 3.137 2.304 1.328 10.624 6.003 9.595 10.018-1.12 4.37-15.07 6.45-41.858-.313C13.062 40.725-.668 31.547.633 26.469c.817-3.188 8.407-3.88 11.92-3.859h-.001Z",
style: {
fill: "#fff",
fillOpacity: ".2",
fillRule: "nonzero"
},
transform: "rotate(-9.0668 1557.8701 1099.178805) scale(32.14441)"
})
]
});
}
function getDisplay(status, hasData) {
if (status === "ADDON_OK" && hasData) return {
label: "Connected",
dotColor: "mwm:bg-emerald-400",
borderColor: "mwm:border-emerald-500"
};
if (status === "ADDON_OK" && !hasData) return {
label: "Connecting",
dotColor: "mwm:bg-amber-400",
borderColor: "mwm:border-amber-500",
pulse: true
};
if (["STALE_DATA", "NO_CHARACTER_DATA"].includes(status)) return {
label: {
STALE_DATA: "Stale",
NO_CHARACTER_DATA: "No Data"
}[status] ?? status,
dotColor: "mwm:bg-amber-400",
borderColor: "mwm:border-amber-500/30"
};
return {
label: {
WS_DISCONNECTED: "Offline",
WS_HOOK_FAILED: "Error",
STORAGE_ERROR: "Error",
CONFLICT_DETECTED: "Conflict"
}[status] ?? status,
dotColor: "mwm:bg-red-400",
borderColor: "mwm:border-red-500/30"
};
}
function StatusPill() {
const info = addonStatus.value;
const style = settings.value.statusPillStyle;
const hasData = info.characterName !== null;
const display = getDisplay(info.status, hasData);
const [hovered, setHovered] = d$2(false);
const hideTimerRef = A(null);
const showPanel = q$1(() => {
if (hideTimerRef.current) {
clearTimeout(hideTimerRef.current);
hideTimerRef.current = null;
}
setHovered(true);
}, []);
const hidePanel = q$1(() => {
hideTimerRef.current = setTimeout(() => setHovered(false), 200);
}, []);
y$2(() => {
return () => {
if (hideTimerRef.current) clearTimeout(hideTimerRef.current);
};
}, []);
const isPill = style === "pill";
return u("div", {
class: ` mwm:z-50 ${isPill ? "mwm:absolute mwm:-top-8 mwm:right-0" : ""}`,
onMouseEnter: showPanel,
onMouseLeave: hidePanel,
children: [isPill ? u("div", {
class: `mwm:flex mwm:items-center mwm:justify-between mwm:gap-2 mwm:rounded mwm:border mwm:border-mwm-accent-purple ${display.borderColor} mwm:bg-mwm-bg-surface mwm:px-2 mwm:py-1 mwm:cursor-default `,
children: [
u(MwmLogo, { class: "mwm:size-4 " }),
u("span", {
class: "mwm:text-mwm-text-primary mwm:font-medium mwm:text-xs mwm:leading-0.5",
children: display.label
}),
u("span", { class: `mwm:rounded-full ${display.dotColor} ${display.pulse ? "mwm:animate-pulse" : ""} mwm:size-2 mwm:shrink-0` })
]
}) : u("div", {
class: `mwm:inline-flex mwm:items-center mwm:justify-center mwm:rounded mwm:border-2 ${display.borderColor} mwm:cursor-default mwm:relative mwm:size-10`,
title: `Milky Way Market: ${display.label}`,
children: [ u(MwmLogo, { class: "mwm:size-5 mwm:shrink-0" }), u("span", { class: `mwm:rounded-full ${display.dotColor} ${display.pulse ? "mwm:animate-pulse" : ""} mwm:size-2 mwm:absolute mwm:bottom-0.5 mwm:right-0.5` })]
}), hovered && u(StatusDetails, {
info,
version: VERSION
})]
});
}
function inject(communityBuffs) {
if (communityBuffs.querySelector("#mwm-status-pill")) return;
const el = communityBuffs;
if (getComputedStyle(el).position === "static") el.style.position = "relative";
injectComponent(communityBuffs, u(StatusPill, {}), {
id: "mwm-status-pill",
position: "append"
});
log("Status pill injected");
}
function initStatusPill() {
log("Initializing status pill");
const existing = document.querySelector(cls(GAME.header.communityBuffs));
if (existing) inject(existing);
return domObserver.onClass("status-pill", GAME.header.communityBuffs, (el) => {
inject(el);
});
}
_virtual_monkey_css_side_effects_default("/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--mwm-font-sans:ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";--mwm-color-red-400:oklch(70.4% .191 22.216);--mwm-color-red-500:oklch(63.7% .237 25.331);--mwm-color-amber-400:oklch(82.8% .189 84.429);--mwm-color-amber-500:oklch(76.9% .188 70.08);--mwm-color-emerald-400:oklch(76.5% .177 163.223);--mwm-color-emerald-500:oklch(69.6% .17 162.48);--mwm-color-white:#fff;--mwm-spacing:.25rem;--mwm-text-xs:.75rem;--mwm-text-xs--line-height:calc(1 / .75);--mwm-text-sm:.875rem;--mwm-text-sm--line-height:calc(1.25 / .875);--mwm-text-lg:1.125rem;--mwm-text-lg--line-height:calc(1.75 / 1.125);--mwm-font-weight-medium:500;--mwm-font-weight-semibold:600;--mwm-tracking-wider:.05em;--mwm-radius-md:.375rem;--mwm-radius-lg:.5rem;--mwm-animate-spin:spin 1s linear infinite;--mwm-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--mwm-default-transition-duration:.15s;--mwm-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--mwm-default-font-family:var(--mwm-font-sans);--mwm-default-mono-font-family:\"SF Mono\", \"Fira Code\", Consolas, Monaco, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--mwm-default-font-family,ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");font-feature-settings:var(--mwm-default-font-feature-settings,normal);font-variation-settings:var(--mwm-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--mwm-default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-feature-settings:var(--mwm-default-mono-font-feature-settings,normal);font-variation-settings:var(--mwm-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mwm\\:pointer-events-none{pointer-events:none!important}.mwm\\:absolute{position:absolute!important}.mwm\\:fixed{position:fixed!important}.mwm\\:relative{position:relative!important}.mwm\\:-top-8{top:calc(var(--mwm-spacing) * -8)!important}.mwm\\:top-0{top:calc(var(--mwm-spacing) * 0)!important}.mwm\\:top-full{top:100%!important}.mwm\\:right-0{right:calc(var(--mwm-spacing) * 0)!important}.mwm\\:right-0\\.5{right:calc(var(--mwm-spacing) * .5)!important}.mwm\\:bottom-0\\.5{bottom:calc(var(--mwm-spacing) * .5)!important}.mwm\\:left-0{left:calc(var(--mwm-spacing) * 0)!important}.mwm\\:z-10{z-index:10!important}.mwm\\:z-50{z-index:50!important}.mwm\\:z-\\[1\\]{z-index:1!important}.mwm\\:z-\\[999999\\]{z-index:999999!important}.mwm\\:my-2{margin-block:calc(var(--mwm-spacing) * 2)!important}.mwm\\:my-3{margin-block:calc(var(--mwm-spacing) * 3)!important}.mwm\\:mt-1{margin-top:calc(var(--mwm-spacing) * 1)!important}.mwm\\:mt-1\\.5{margin-top:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:mt-2{margin-top:calc(var(--mwm-spacing) * 2)!important}.mwm\\:mt-5{margin-top:calc(var(--mwm-spacing) * 5)!important}.mwm\\:mb-0\\.5{margin-bottom:calc(var(--mwm-spacing) * .5)!important}.mwm\\:mb-1{margin-bottom:calc(var(--mwm-spacing) * 1)!important}.mwm\\:mb-1\\.5{margin-bottom:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:mb-2{margin-bottom:calc(var(--mwm-spacing) * 2)!important}.mwm\\:mb-3{margin-bottom:calc(var(--mwm-spacing) * 3)!important}.mwm\\:mb-4{margin-bottom:calc(var(--mwm-spacing) * 4)!important}.mwm\\:mb-5{margin-bottom:calc(var(--mwm-spacing) * 5)!important}.mwm\\:ml-2{margin-left:calc(var(--mwm-spacing) * 2)!important}.mwm\\:block{display:block!important}.mwm\\:flex{display:flex!important}.mwm\\:grid{display:grid!important}.mwm\\:inline-flex{display:inline-flex!important}.mwm\\:size-2{width:calc(var(--mwm-spacing) * 2)!important;height:calc(var(--mwm-spacing) * 2)!important}.mwm\\:size-4{width:calc(var(--mwm-spacing) * 4)!important;height:calc(var(--mwm-spacing) * 4)!important}.mwm\\:size-5{width:calc(var(--mwm-spacing) * 5)!important;height:calc(var(--mwm-spacing) * 5)!important}.mwm\\:size-10{width:calc(var(--mwm-spacing) * 10)!important;height:calc(var(--mwm-spacing) * 10)!important}.mwm\\:h-1\\.5{height:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:h-2{height:calc(var(--mwm-spacing) * 2)!important}.mwm\\:h-3{height:calc(var(--mwm-spacing) * 3)!important}.mwm\\:h-5{height:calc(var(--mwm-spacing) * 5)!important}.mwm\\:h-6{height:calc(var(--mwm-spacing) * 6)!important}.mwm\\:h-8{height:calc(var(--mwm-spacing) * 8)!important}.mwm\\:h-\\[18px\\]{height:18px!important}.mwm\\:w-1\\.5{width:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:w-2{width:calc(var(--mwm-spacing) * 2)!important}.mwm\\:w-3{width:calc(var(--mwm-spacing) * 3)!important}.mwm\\:w-5{width:calc(var(--mwm-spacing) * 5)!important}.mwm\\:w-6{width:calc(var(--mwm-spacing) * 6)!important}.mwm\\:w-20{width:calc(var(--mwm-spacing) * 20)!important}.mwm\\:w-\\[18px\\]{width:18px!important}.mwm\\:w-full{width:100%!important}.mwm\\:max-w-full{max-width:100%!important}.mwm\\:flex-1{flex:1!important}.mwm\\:shrink-0{flex-shrink:0!important}.mwm\\:animate-\\[mwm-slide-down_0\\.3s_ease-out\\]{animation:.3s ease-out mwm-slide-down!important}.mwm\\:animate-pulse{animation:var(--mwm-animate-pulse)!important}.mwm\\:animate-spin{animation:var(--mwm-animate-spin)!important}.mwm\\:cursor-crosshair{cursor:crosshair!important}.mwm\\:cursor-default{cursor:default!important}.mwm\\:cursor-pointer{cursor:pointer!important}.mwm\\:appearance-none{appearance:none!important}.mwm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.mwm\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.mwm\\:flex-col{flex-direction:column!important}.mwm\\:items-center{align-items:center!important}.mwm\\:items-start{align-items:flex-start!important}.mwm\\:justify-between{justify-content:space-between!important}.mwm\\:justify-center{justify-content:center!important}.mwm\\:gap-0\\.5{gap:calc(var(--mwm-spacing) * .5)!important}.mwm\\:gap-1{gap:calc(var(--mwm-spacing) * 1)!important}.mwm\\:gap-1\\.5{gap:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:gap-2{gap:calc(var(--mwm-spacing) * 2)!important}.mwm\\:gap-2\\.5{gap:calc(var(--mwm-spacing) * 2.5)!important}.mwm\\:gap-3{gap:calc(var(--mwm-spacing) * 3)!important}.mwm\\:gap-4{gap:calc(var(--mwm-spacing) * 4)!important}.mwm\\:gap-\\[3px\\]{gap:3px!important}.mwm\\:gap-\\[6px\\]{gap:6px!important}.mwm\\:overflow-hidden{overflow:hidden!important}.mwm\\:rounded{border-radius:.25rem!important}.mwm\\:rounded-full{border-radius:3.40282e38px!important}.mwm\\:rounded-lg{border-radius:var(--mwm-radius-lg)!important}.mwm\\:rounded-md{border-radius:var(--mwm-radius-md)!important}.mwm\\:border{border-style:var(--tw-border-style)!important;border-width:1px!important}.mwm\\:border-2{border-style:var(--tw-border-style)!important;border-width:2px!important}.mwm\\:border-t{border-top-style:var(--tw-border-style)!important;border-top-width:1px!important}.mwm\\:border-b{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:1px!important}.mwm\\:border-none{--tw-border-style:none!important;border-style:none!important}.mwm\\:border-\\[rgba\\(255\\,255\\,255\\,0\\.3\\)\\]{border-color:#ffffff4d!important}.mwm\\:border-amber-500,.mwm\\:border-amber-500\\/30{border-color:var(--mwm-color-amber-500)!important}@supports (color:color-mix(in lab, red, red)){.mwm\\:border-amber-500\\/30{border-color:color-mix(in oklab, var(--mwm-color-amber-500) 30%, transparent)!important}}.mwm\\:border-emerald-500{border-color:var(--mwm-color-emerald-500)!important}.mwm\\:border-mwm-accent-purple{border-color:#8b5cf6!important}.mwm\\:border-mwm-accent-purple\\/50{border-color:oklab(60.5631% .0845415 -.201932/.5)!important}.mwm\\:border-mwm-border{border-color:#3b599840!important}.mwm\\:border-red-500\\/30{border-color:var(--mwm-color-red-500)!important}@supports (color:color-mix(in lab, red, red)){.mwm\\:border-red-500\\/30{border-color:color-mix(in oklab, var(--mwm-color-red-500) 30%, transparent)!important}}.mwm\\:border-t-mwm-accent-purple{border-top-color:#8b5cf6!important}.mwm\\:bg-\\[rgba\\(94\\,233\\,197\\,0\\.15\\)\\]{background-color:#5ee9c526!important}.mwm\\:bg-\\[rgba\\(192\\,132\\,252\\,0\\.15\\)\\]{background-color:#c084fc26!important}.mwm\\:bg-\\[rgba\\(255\\,255\\,255\\,0\\.1\\)\\]{background-color:#ffffff1a!important}.mwm\\:bg-\\[rgba\\(255\\,255\\,255\\,0\\.2\\)\\]{background-color:#fff3!important}.mwm\\:bg-amber-400{background-color:var(--mwm-color-amber-400)!important}.mwm\\:bg-emerald-400{background-color:var(--mwm-color-emerald-400)!important}.mwm\\:bg-mwm-accent-purple{background-color:#8b5cf6!important}.mwm\\:bg-mwm-accent-purple\\/20{background-color:oklab(60.5631% .0845415 -.201932/.2)!important}.mwm\\:bg-mwm-ask{background-color:#5ee9c5!important}.mwm\\:bg-mwm-bg-panel{background-color:#12162af2!important}.mwm\\:bg-mwm-bg-surface{background-color:#1e243c99!important}.mwm\\:bg-mwm-bid{background-color:#c084fc!important}.mwm\\:bg-mwm-text-muted{background-color:#e2e8f080!important}.mwm\\:bg-red-400{background-color:var(--mwm-color-red-400)!important}.mwm\\:bg-gradient-to-r{--tw-gradient-position:to right in oklab!important;background-image:linear-gradient(var(--tw-gradient-stops))!important}.mwm\\:from-\\[rgba\\(220\\,38\\,38\\,0\\.95\\)\\]{--tw-gradient-from:#dc2626f2!important;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))!important}.mwm\\:to-\\[rgba\\(185\\,28\\,28\\,0\\.95\\)\\]{--tw-gradient-to:#b91c1cf2!important;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))!important}.mwm\\:p-2{padding:calc(var(--mwm-spacing) * 2)!important}.mwm\\:p-3\\.5{padding:calc(var(--mwm-spacing) * 3.5)!important}.mwm\\:px-1{padding-inline:calc(var(--mwm-spacing) * 1)!important}.mwm\\:px-1\\.5{padding-inline:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:px-2{padding-inline:calc(var(--mwm-spacing) * 2)!important}.mwm\\:px-2\\.5{padding-inline:calc(var(--mwm-spacing) * 2.5)!important}.mwm\\:px-3{padding-inline:calc(var(--mwm-spacing) * 3)!important}.mwm\\:px-3\\.5{padding-inline:calc(var(--mwm-spacing) * 3.5)!important}.mwm\\:px-4{padding-inline:calc(var(--mwm-spacing) * 4)!important}.mwm\\:px-6{padding-inline:calc(var(--mwm-spacing) * 6)!important}.mwm\\:py-0\\.5{padding-block:calc(var(--mwm-spacing) * .5)!important}.mwm\\:py-1{padding-block:calc(var(--mwm-spacing) * 1)!important}.mwm\\:py-1\\.5{padding-block:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:py-2{padding-block:calc(var(--mwm-spacing) * 2)!important}.mwm\\:py-2\\.5{padding-block:calc(var(--mwm-spacing) * 2.5)!important}.mwm\\:py-3{padding-block:calc(var(--mwm-spacing) * 3)!important}.mwm\\:py-4{padding-block:calc(var(--mwm-spacing) * 4)!important}.mwm\\:py-5{padding-block:calc(var(--mwm-spacing) * 5)!important}.mwm\\:pt-1\\.5{padding-top:calc(var(--mwm-spacing) * 1.5)!important}.mwm\\:pt-3{padding-top:calc(var(--mwm-spacing) * 3)!important}.mwm\\:pb-3{padding-bottom:calc(var(--mwm-spacing) * 3)!important}.mwm\\:text-center{text-align:center!important}.mwm\\:font-mono{font-family:SF Mono,Fira Code,Consolas,Monaco,monospace!important}.mwm\\:text-lg{font-size:var(--mwm-text-lg)!important;line-height:var(--tw-leading,var(--mwm-text-lg--line-height))!important}.mwm\\:text-sm{font-size:var(--mwm-text-sm)!important;line-height:var(--tw-leading,var(--mwm-text-sm--line-height))!important}.mwm\\:text-xs{font-size:var(--mwm-text-xs)!important;line-height:var(--tw-leading,var(--mwm-text-xs--line-height))!important}.mwm\\:text-\\[7px\\]{font-size:7px!important}.mwm\\:text-\\[8px\\]{font-size:8px!important}.mwm\\:text-\\[9px\\]{font-size:9px!important}.mwm\\:text-\\[10px\\]{font-size:10px!important}.mwm\\:text-\\[11px\\]{font-size:11px!important}.mwm\\:text-\\[13px\\]{font-size:13px!important}.mwm\\:leading-0\\.5{--tw-leading:calc(var(--mwm-spacing) * .5)!important;line-height:calc(var(--mwm-spacing) * .5)!important}.mwm\\:leading-none{--tw-leading:1!important;line-height:1!important}.mwm\\:font-medium{--tw-font-weight:var(--mwm-font-weight-medium)!important;font-weight:var(--mwm-font-weight-medium)!important}.mwm\\:font-semibold{--tw-font-weight:var(--mwm-font-weight-semibold)!important;font-weight:var(--mwm-font-weight-semibold)!important}.mwm\\:tracking-\\[0\\.02em\\]{--tw-tracking:.02em!important;letter-spacing:.02em!important}.mwm\\:tracking-\\[0\\.05em\\]{--tw-tracking:.05em!important;letter-spacing:.05em!important}.mwm\\:tracking-wider{--tw-tracking:var(--mwm-tracking-wider)!important;letter-spacing:var(--mwm-tracking-wider)!important}.mwm\\:text-\\[rgba\\(255\\,255\\,255\\,0\\.7\\)\\]{color:#ffffffb3!important}.mwm\\:text-mwm-accent-purple{color:#8b5cf6!important}.mwm\\:text-mwm-ask{color:#5ee9c5!important}.mwm\\:text-mwm-bid{color:#c084fc!important}.mwm\\:text-mwm-text-muted{color:#e2e8f080!important}.mwm\\:text-mwm-text-primary{color:#e2e8f0!important}.mwm\\:text-red-400{color:var(--mwm-color-red-400)!important}.mwm\\:text-white{color:var(--mwm-color-white)!important}.mwm\\:uppercase{text-transform:uppercase!important}.mwm\\:no-underline{text-decoration-line:none!important}.mwm\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000004d)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.mwm\\:shadow-\\[0_4px_20px_rgba\\(0\\,0\\,0\\,0\\.3\\)\\,0_0_40px_rgba\\(220\\,38\\,38\\,0\\.2\\)\\]{--tw-shadow:0 4px 20px var(--tw-shadow-color,#0000004d), 0 0 40px var(--tw-shadow-color,#dc262633)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.mwm\\:transition-all{transition-property:all!important;transition-timing-function:var(--tw-ease,var(--mwm-default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--mwm-default-transition-duration))!important}.mwm\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to!important;transition-timing-function:var(--tw-ease,var(--mwm-default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--mwm-default-transition-duration))!important}.mwm\\:transition-opacity{transition-property:opacity!important;transition-timing-function:var(--tw-ease,var(--mwm-default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--mwm-default-transition-duration))!important}.mwm\\:checked\\:border-mwm-accent-purple:checked{border-color:#8b5cf6!important}.mwm\\:checked\\:bg-mwm-accent-purple:checked{background-color:#8b5cf6!important}@media (hover:hover){.mwm\\:hover\\:-translate-y-px:hover{--tw-translate-y:-1px!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.mwm\\:hover\\:border-\\[rgba\\(255\\,255\\,255\\,0\\.5\\)\\]:hover{border-color:#ffffff80!important}.mwm\\:hover\\:border-mwm-accent-purple:hover{border-color:#8b5cf6!important}.mwm\\:hover\\:border-mwm-accent-purple\\/30:hover{border-color:oklab(60.5631% .0845415 -.201932/.3)!important}.mwm\\:hover\\:bg-\\[rgba\\(139\\,92\\,246\\,0\\.1\\)\\]:hover{background-color:#8b5cf61a!important}.mwm\\:hover\\:bg-\\[rgba\\(255\\,255\\,255\\,0\\.2\\)\\]:hover{background-color:#fff3!important}.mwm\\:hover\\:bg-\\[rgba\\(255\\,255\\,255\\,0\\.3\\)\\]:hover{background-color:#ffffff4d!important}.mwm\\:hover\\:bg-\\[rgba\\(255\\,255\\,255\\,0\\.08\\)\\]:hover{background-color:#ffffff14!important}.mwm\\:hover\\:bg-red-500:hover{background-color:var(--mwm-color-red-500)!important}.mwm\\:hover\\:text-mwm-text-primary:hover{color:#e2e8f0!important}.mwm\\:hover\\:text-white:hover{color:var(--mwm-color-white)!important}.mwm\\:hover\\:opacity-80:hover{opacity:.8!important}}.mwm\\:focus\\:border-mwm-accent-purple:focus{border-color:#8b5cf6!important}.mwm\\:focus\\:outline-none:focus{--tw-outline-style:none!important;outline-style:none!important}}@keyframes mwm-slide-down{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}#mwm-status-pill{align-items:center!important;margin:0!important;padding:0!important;display:inline-flex!important}.mwm-sparkline{width:100%;display:block}.mwm-root input[type=checkbox]:checked:after{content:\"✓\";color:#fff;font-size:11px;font-weight:700;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:\"*\";inherits:false}@property --tw-gradient-from{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:\"<color>\";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:\"*\";inherits:false}@property --tw-gradient-via-stops{syntax:\"*\";inherits:false}@property --tw-gradient-from-position{syntax:\"<length-percentage>\";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:\"<length-percentage>\";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:\"<length-percentage>\";inherits:false;initial-value:100%}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-tracking{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}");
C(() => {
const expectedVersion = needsUpdate.value;
if (!expectedVersion) return;
if (document.getElementById("mwm-update-banner")) return;
const host = document.createElement("div");
host.className = "mwm-root";
host.id = "mwm-update-banner";
document.body.appendChild(host);
const dismiss = () => {
J(null, host);
host.remove();
};
J(_$2(UpdateBanner, {
expectedVersion,
onDismiss: dismiss
}), host);
warn(`Update required: v${VERSION} → v${expectedVersion}`);
});
function signalPresence() {
const existing = window.__MWM_ADDON__;
if (existing && existing !== VERSION) reportError("CONFLICT_DETECTED", `Another addon version detected: ${existing}`);
window.__MWM_ADDON__ = VERSION;
window.dispatchEvent(new CustomEvent(EVENTS.ADDON_READY, { detail: { version: VERSION } }));
log("Addon ready");
}
var characterData = null;
async function initGameSite() {
markCheckpoint("cross_tab", "skipped", "game site");
hookWebSocket((type, data) => {
switch (type) {
case "init_character_data":
characterData = data;
log("Character initialized:", characterData.character?.name);
markCheckpoint("character_received", "ok", characterData.character?.name);
syncToStorage(characterData, true);
refreshStatus();
break;
case "items_updated": {
if (!characterData) return;
const itemsData = data;
const items = itemsData.characterItems || itemsData.items;
if (items) mergeItems(characterData, items);
syncToStorage(characterData);
break;
}
case "action_completed": {
if (!characterData) return;
const actionData = data;
const items = actionData.characterItems || actionData.endCharacterItems;
const skills = actionData.characterSkills || actionData.endCharacterSkills;
if (items) mergeItems(characterData, items);
if (skills) mergeSkills(characterData, skills);
syncToStorage(characterData);
break;
}
}
});
window.addEventListener(EVENTS.REQUEST, (event) => {
log("Data request received");
const customEvent = event;
if (characterData) {
syncToStorage(characterData, true);
const detail = {
requestId: customEvent.detail?.requestId,
data: characterData,
source: "game_site"
};
window.dispatchEvent(new CustomEvent(EVENTS.RESPONSE, { detail }));
} else warn("No character data available");
});
domObserver.start();
initSettings();
initStatusPill();
initReportModal();
initTooltipPrices();
initItemModal();
initMarketplacePrices();
log("Game site initialized");
}
function initMarketSite() {
markCheckpoint("ws_hooked", "skipped", "market site");
markCheckpoint("character_received", "skipped", "market site");
characterData = loadFromStorage();
if (!characterData) reportError("NO_CHARACTER_DATA", "No character data in GM storage");
try {
_GM_addValueChangeListener(STORAGE_KEY$1, (_name, _oldValue, newValue, remote) => {
if (!remote || !newValue?.data) return;
const storedData = newValue;
characterData = storedData.data;
log("Cross-tab update:", characterData.character?.name);
const detail = {
data: characterData,
source: "cross_tab",
timestamp: storedData.timestamp
};
window.dispatchEvent(new CustomEvent(EVENTS.UPDATED, { detail }));
});
markCheckpoint("cross_tab", "ok");
} catch (err) {
markCheckpoint("cross_tab", "failed", err instanceof Error ? err.message : "GM_addValueChangeListener failed");
}
window.addEventListener(EVENTS.REQUEST, (event) => {
log("Pull request received");
const customEvent = event;
if (characterData) {
const detail = {
requestId: customEvent.detail?.requestId,
data: characterData,
source: "storage"
};
window.dispatchEvent(new CustomEvent(EVENTS.RESPONSE, { detail }));
} else warn("No character data in storage");
});
if (characterData) setTimeout(() => {
const detail = {
data: characterData,
source: "initial_load",
timestamp: Date.now()
};
window.dispatchEvent(new CustomEvent(EVENTS.UPDATED, { detail }));
}, 100);
log("Market site initialized");
}
function init() {
markCheckpoint("script_loaded", "ok", VERSION);
signalPresence();
initHealthCheck({ getCharacterData: () => characterData });
if (isGameSite) initGameSite();
else if (isMarketSite) initMarketSite();
}
init();
})();