@puzzmo/sdk 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{createSimulator-BZYymqOG.js → createSimulator-D4oY1VzY.js} +236 -233
- package/dist/{createSimulator-BZYymqOG.js.map → createSimulator-D4oY1VzY.js.map} +1 -1
- package/dist/{createSimulator-Ctg-fdCI.cjs → createSimulator-_TBV3Yo7.cjs} +30 -30
- package/dist/{createSimulator-Ctg-fdCI.cjs.map → createSimulator-_TBV3Yo7.cjs.map} +1 -1
- package/dist/simulator/createSimulator.d.ts +8 -7
- package/dist/simulator/createSimulator.d.ts.map +1 -1
- package/dist/simulator/index.cjs +1 -1
- package/dist/simulator/index.js +1 -1
- package/dist/simulator/standalone.cjs +1 -1
- package/dist/simulator/standalone.cjs.map +1 -1
- package/dist/simulator/standalone.js +4 -4
- package/dist/simulator/standalone.js.map +1 -1
- package/dist/simulator/types.d.ts +0 -2
- package/dist/simulator/types.d.ts.map +1 -1
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.ts +0 -2
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
|
@@ -541,7 +541,7 @@ var S = "simulator-saved-states";
|
|
|
541
541
|
/**
|
|
542
542
|
* Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
|
|
543
543
|
*/
|
|
544
|
-
function
|
|
544
|
+
function C() {
|
|
545
545
|
let e = globalThis;
|
|
546
546
|
for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
|
|
547
547
|
name: t,
|
|
@@ -552,8 +552,8 @@ function ie() {
|
|
|
552
552
|
/**
|
|
553
553
|
* Generate a small thumbnail SVG for a given input string
|
|
554
554
|
*/
|
|
555
|
-
function
|
|
556
|
-
let n =
|
|
555
|
+
function w(e, t) {
|
|
556
|
+
let n = C();
|
|
557
557
|
if (!n) return "";
|
|
558
558
|
try {
|
|
559
559
|
let r = e.state.puzzleData ? JSON.stringify(e.state.puzzleData) : "", i = {
|
|
@@ -567,14 +567,14 @@ function C(e, t) {
|
|
|
567
567
|
return "";
|
|
568
568
|
}
|
|
569
569
|
}
|
|
570
|
-
var
|
|
571
|
-
function
|
|
570
|
+
var T = [];
|
|
571
|
+
function E(e, t = 8) {
|
|
572
572
|
let n = 14 * t + 8 + 4;
|
|
573
573
|
e.style.height = "auto";
|
|
574
574
|
let r = Math.min(Math.max(e.scrollHeight, 40), n);
|
|
575
575
|
e.style.height = `${r}px`;
|
|
576
576
|
}
|
|
577
|
-
function
|
|
577
|
+
function ie() {
|
|
578
578
|
let e = "", t = "";
|
|
579
579
|
return {
|
|
580
580
|
id: "data",
|
|
@@ -592,22 +592,22 @@ function ae() {
|
|
|
592
592
|
let i = n.getElement(".data-view-container");
|
|
593
593
|
i == null || i.querySelectorAll(".data-subtab-content").forEach((e) => {
|
|
594
594
|
e.classList.toggle("active", e.id === `data-subtab-${t}`);
|
|
595
|
-
}), t === "edit" ?
|
|
595
|
+
}), t === "edit" ? j(n) : t === "history" ? O(n) : t === "saves" && k(n);
|
|
596
596
|
});
|
|
597
597
|
});
|
|
598
598
|
let i = n.getElement("#simulator-puzzle"), a = n.getElement("#simulator-input"), o = n.getElement("#simulator-puzzle-reset"), s = n.getElement("#simulator-puzzle-apply"), c = n.getElement("#simulator-input-reset"), l = n.getElement("#simulator-input-apply"), u = n.getElement("#simulator-start"), d = n.getElement("#simulator-pause");
|
|
599
599
|
setTimeout(() => {
|
|
600
|
-
i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle,
|
|
600
|
+
i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i)), a && n.state.currentInputStr && (a.value = n.state.currentInputStr, t = n.state.currentInputStr, E(a));
|
|
601
601
|
}, 0), i == null || i.addEventListener("input", () => {
|
|
602
|
-
|
|
602
|
+
E(i);
|
|
603
603
|
let t = i.value !== e;
|
|
604
604
|
s && (s.disabled = !t);
|
|
605
605
|
}), a == null || a.addEventListener("input", () => {
|
|
606
|
-
|
|
606
|
+
E(a);
|
|
607
607
|
let e = a.value !== t;
|
|
608
608
|
l && (l.disabled = !e);
|
|
609
609
|
}), o == null || o.addEventListener("click", () => {
|
|
610
|
-
i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle,
|
|
610
|
+
i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i), s && (s.disabled = !0));
|
|
611
611
|
}), s == null || s.addEventListener("click", () => {
|
|
612
612
|
if (i) try {
|
|
613
613
|
let t = JSON.parse(i.value);
|
|
@@ -616,47 +616,47 @@ function ae() {
|
|
|
616
616
|
console.error("Simulator: Invalid puzzle JSON", e), n.updateStatus("Invalid JSON", "paused");
|
|
617
617
|
}
|
|
618
618
|
}), c == null || c.addEventListener("click", () => {
|
|
619
|
-
a && (a.value = t,
|
|
619
|
+
a && (a.value = t, E(a), l && (l.disabled = !0));
|
|
620
620
|
}), l == null || l.addEventListener("click", () => {
|
|
621
621
|
a && (n.state.currentInputStr = a.value, t = a.value, console.log("Simulator: Input string updated (game restart required to apply)"), n.updateStatus("Input stored", "ready"), l.disabled = !0);
|
|
622
622
|
});
|
|
623
623
|
let f = n.getElement("#simulator-history-clear");
|
|
624
624
|
f == null || f.addEventListener("click", () => {
|
|
625
|
-
|
|
625
|
+
T = [], O(n);
|
|
626
626
|
});
|
|
627
627
|
let p = n.getElement("#simulator-save-name"), m = n.getElement("#simulator-save-btn");
|
|
628
628
|
m == null || m.addEventListener("click", () => {
|
|
629
629
|
if (!p || !p.value.trim()) return;
|
|
630
|
-
let e =
|
|
630
|
+
let e = D(), t = {
|
|
631
631
|
name: p.value.trim(),
|
|
632
632
|
puzzleStr: n.state.originalPuzzle,
|
|
633
633
|
inputStr: n.state.currentInputStr,
|
|
634
634
|
timestamp: Date.now()
|
|
635
635
|
};
|
|
636
|
-
e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "",
|
|
637
|
-
}),
|
|
636
|
+
e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "", k(n);
|
|
637
|
+
}), k(n);
|
|
638
638
|
},
|
|
639
639
|
onActivate(n) {
|
|
640
|
-
e = n.state.originalPuzzle, t = n.state.currentInputStr,
|
|
640
|
+
e = n.state.originalPuzzle, t = n.state.currentInputStr, j(n), O(n);
|
|
641
641
|
},
|
|
642
642
|
onMessage(e, n, r) {
|
|
643
643
|
var i, a;
|
|
644
644
|
let o = r.getElement("#simulator-input"), s = r.getElement("#simulator-input-apply"), c = (i = n == null || (a = n.input) == null ? void 0 : a.boardState) == null ? n == null ? void 0 : n.boardState : i;
|
|
645
645
|
if (e === "UPLOAD_NEW_GAME_STATE" && c) {
|
|
646
|
-
if (r.state.currentInputStr = c,
|
|
647
|
-
|
|
646
|
+
if (r.state.currentInputStr = c, T.length === 0 || T[T.length - 1].value !== c) {
|
|
647
|
+
T.push({
|
|
648
648
|
value: c,
|
|
649
649
|
timestamp: Date.now()
|
|
650
|
-
}),
|
|
650
|
+
}), T.length > 100 && (T = T.slice(-100));
|
|
651
651
|
let e = r.getElement("#data-subtab-history");
|
|
652
|
-
e != null && e.classList.contains("active") &&
|
|
652
|
+
e != null && e.classList.contains("active") && O(r);
|
|
653
653
|
}
|
|
654
|
-
o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr,
|
|
654
|
+
o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr, E(o), s && (s.disabled = !0));
|
|
655
655
|
}
|
|
656
656
|
}
|
|
657
657
|
};
|
|
658
658
|
}
|
|
659
|
-
function
|
|
659
|
+
function D() {
|
|
660
660
|
try {
|
|
661
661
|
let e = localStorage.getItem(S);
|
|
662
662
|
return e ? JSON.parse(e) : [];
|
|
@@ -664,35 +664,35 @@ function E() {
|
|
|
664
664
|
return [];
|
|
665
665
|
}
|
|
666
666
|
}
|
|
667
|
-
function
|
|
667
|
+
function O(e) {
|
|
668
668
|
let t = e.getElement("#simulator-history-list");
|
|
669
669
|
if (t) {
|
|
670
|
-
if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg),
|
|
670
|
+
if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg), T.length === 0) {
|
|
671
671
|
t.innerHTML = "<div class=\"simulator-empty\">No history yet</div>";
|
|
672
672
|
return;
|
|
673
673
|
}
|
|
674
|
-
t.innerHTML = [...
|
|
675
|
-
let r =
|
|
674
|
+
t.innerHTML = [...T].reverse().map((t, n) => {
|
|
675
|
+
let r = T.length - 1 - n, i = new Date(t.timestamp).toLocaleTimeString(), a = t.value.length > 60 ? t.value.slice(0, 60) + "..." : t.value;
|
|
676
676
|
return `
|
|
677
677
|
<div class="history-item" data-history-idx="${r}">
|
|
678
|
-
<div class="history-item-thumb">${
|
|
678
|
+
<div class="history-item-thumb">${w(e, t.value)}</div>
|
|
679
679
|
<div class="history-item-content">
|
|
680
680
|
<div class="history-item-header">
|
|
681
681
|
<span class="history-item-num">#${r + 1}</span>
|
|
682
682
|
<span class="history-item-time">${i}</span>
|
|
683
683
|
<button class="simulator-btn tiny history-restore-btn" data-history-idx="${r}">Restore</button>
|
|
684
684
|
</div>
|
|
685
|
-
<div class="history-item-preview">${
|
|
685
|
+
<div class="history-item-preview">${A(a)}</div>
|
|
686
686
|
</div>
|
|
687
687
|
</div>
|
|
688
688
|
`;
|
|
689
689
|
}).join(""), t.querySelectorAll(".history-restore-btn").forEach((t) => {
|
|
690
690
|
t.addEventListener("click", (t) => {
|
|
691
|
-
let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r =
|
|
691
|
+
let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r = T[n];
|
|
692
692
|
if (r) {
|
|
693
693
|
e.state.currentInputStr = r.value;
|
|
694
694
|
let t = e.getElement("#simulator-input");
|
|
695
|
-
t && (t.value = r.value,
|
|
695
|
+
t && (t.value = r.value, E(t)), e.updateStatus("Input restored from history", "ready");
|
|
696
696
|
let n = e.getElement(".data-subtab[data-subtab=\"edit\"]");
|
|
697
697
|
n == null || n.click();
|
|
698
698
|
}
|
|
@@ -700,10 +700,10 @@ function D(e) {
|
|
|
700
700
|
});
|
|
701
701
|
}
|
|
702
702
|
}
|
|
703
|
-
function
|
|
703
|
+
function k(e) {
|
|
704
704
|
let t = e.getElement("#simulator-saves-list");
|
|
705
705
|
if (!t) return;
|
|
706
|
-
let n =
|
|
706
|
+
let n = D();
|
|
707
707
|
if (n.length === 0) {
|
|
708
708
|
t.innerHTML = "<div class=\"simulator-empty\">No saved states</div>";
|
|
709
709
|
return;
|
|
@@ -713,7 +713,7 @@ function O(e) {
|
|
|
713
713
|
return `
|
|
714
714
|
<div class="save-item">
|
|
715
715
|
<div class="save-item-header">
|
|
716
|
-
<span class="save-item-name">${
|
|
716
|
+
<span class="save-item-name">${A(e.name)}</span>
|
|
717
717
|
<span class="save-item-time">${i} ${a}</span>
|
|
718
718
|
</div>
|
|
719
719
|
<div class="save-item-actions">
|
|
@@ -733,7 +733,7 @@ function O(e) {
|
|
|
733
733
|
}
|
|
734
734
|
e.state.currentInputStr = r.inputStr;
|
|
735
735
|
let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input");
|
|
736
|
-
t && (t.value = r.puzzleStr,
|
|
736
|
+
t && (t.value = r.puzzleStr, E(t)), n && (n.value = r.inputStr, E(n)), e.updateStatus(`Loaded: ${r.name}`, "ready");
|
|
737
737
|
let i = e.getElement(".data-subtab[data-subtab=\"edit\"]");
|
|
738
738
|
i == null || i.click();
|
|
739
739
|
}
|
|
@@ -741,21 +741,21 @@ function O(e) {
|
|
|
741
741
|
}), t.querySelectorAll(".save-delete-btn").forEach((t) => {
|
|
742
742
|
t.addEventListener("click", (t) => {
|
|
743
743
|
let r = parseInt(t.target.getAttribute("data-save-idx") || "0"), i = n.filter((e, t) => t !== r);
|
|
744
|
-
localStorage.setItem(S, JSON.stringify(i)),
|
|
744
|
+
localStorage.setItem(S, JSON.stringify(i)), k(e);
|
|
745
745
|
});
|
|
746
746
|
});
|
|
747
747
|
}
|
|
748
|
-
function
|
|
748
|
+
function A(e) {
|
|
749
749
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
750
750
|
}
|
|
751
|
-
function
|
|
751
|
+
function j(e) {
|
|
752
752
|
let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input"), r = e.getElement("#simulator-puzzle-apply"), i = e.getElement("#simulator-input-apply");
|
|
753
|
-
t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle,
|
|
753
|
+
t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle, E(t), r && (r.disabled = !0)), n && (n.value = e.state.currentInputStr, E(n), i && (i.disabled = !0));
|
|
754
754
|
}
|
|
755
|
-
function
|
|
755
|
+
function M(e) {
|
|
756
756
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
757
757
|
}
|
|
758
|
-
function
|
|
758
|
+
function ae() {
|
|
759
759
|
let e = 0;
|
|
760
760
|
return {
|
|
761
761
|
id: "msgs",
|
|
@@ -782,7 +782,7 @@ function oe() {
|
|
|
782
782
|
<span class="simulator-msg-type">${t.direction === "out" ? "→" : "←"} ${t.type}</span>
|
|
783
783
|
<span class="simulator-msg-time">${t.time}</span>
|
|
784
784
|
</div>
|
|
785
|
-
${a ? `<div class="simulator-msg-data">${
|
|
785
|
+
${a ? `<div class="simulator-msg-data">${M(a)}</div>` : ""}
|
|
786
786
|
`;
|
|
787
787
|
let o = i.querySelector(".simulator-msg-data");
|
|
788
788
|
for (o && o.addEventListener("click", () => {
|
|
@@ -793,7 +793,7 @@ function oe() {
|
|
|
793
793
|
}
|
|
794
794
|
};
|
|
795
795
|
}
|
|
796
|
-
function
|
|
796
|
+
function oe() {
|
|
797
797
|
return {
|
|
798
798
|
id: "done",
|
|
799
799
|
label: "Done",
|
|
@@ -826,7 +826,7 @@ function se() {
|
|
|
826
826
|
}
|
|
827
827
|
};
|
|
828
828
|
}
|
|
829
|
-
function
|
|
829
|
+
function se() {
|
|
830
830
|
let e = [], t = () => (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: !1 }), n = (e) => {
|
|
831
831
|
let { checkpointName: t, augConfig: n, time: r } = e, i = n == null ? void 0 : n.deeds;
|
|
832
832
|
return `
|
|
@@ -879,7 +879,7 @@ function ce() {
|
|
|
879
879
|
/**
|
|
880
880
|
* Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
|
|
881
881
|
*/
|
|
882
|
-
function
|
|
882
|
+
function N() {
|
|
883
883
|
let e = globalThis;
|
|
884
884
|
for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
|
|
885
885
|
name: t,
|
|
@@ -887,7 +887,7 @@ function M() {
|
|
|
887
887
|
};
|
|
888
888
|
return null;
|
|
889
889
|
}
|
|
890
|
-
function
|
|
890
|
+
function ce() {
|
|
891
891
|
return {
|
|
892
892
|
id: "thumb",
|
|
893
893
|
label: "Thumb",
|
|
@@ -912,7 +912,7 @@ function le() {
|
|
|
912
912
|
updatePreview: (e) => {
|
|
913
913
|
let t = e.getElement("#simulator-thumb-preview"), n = e.getElement("#simulator-thumb-fn");
|
|
914
914
|
t == null || t.style.setProperty("--sim-thumb-bg", e.state.selectedTheme.g_bg);
|
|
915
|
-
let r =
|
|
915
|
+
let r = N();
|
|
916
916
|
if (!r) {
|
|
917
917
|
t && (t.innerHTML = "<span class=\"simulator-empty\">No thumbnail function found</span>"), n && (n.textContent = "");
|
|
918
918
|
return;
|
|
@@ -936,7 +936,7 @@ function le() {
|
|
|
936
936
|
/**
|
|
937
937
|
* Generate theme preview HTML showing key colors
|
|
938
938
|
*/
|
|
939
|
-
function
|
|
939
|
+
function P(e) {
|
|
940
940
|
let t = [
|
|
941
941
|
e.key,
|
|
942
942
|
e.subBrand,
|
|
@@ -947,7 +947,7 @@ function N(e) {
|
|
|
947
947
|
].map((e) => `<div class="simulator-theme-preview-cell" style="background: ${e}"></div>`).join("");
|
|
948
948
|
return `<div class="simulator-theme-preview" style="background: ${e.g_bg}">${t}</div>`;
|
|
949
949
|
}
|
|
950
|
-
function
|
|
950
|
+
function le() {
|
|
951
951
|
return {
|
|
952
952
|
id: "theme",
|
|
953
953
|
label: "Theme",
|
|
@@ -959,7 +959,7 @@ function ue() {
|
|
|
959
959
|
t && n.forEach((n) => {
|
|
960
960
|
let r = document.createElement("div");
|
|
961
961
|
r.className = `simulator-theme-item${n.name === e.state.selectedTheme.name ? " selected" : ""}`, r.innerHTML = `
|
|
962
|
-
${
|
|
962
|
+
${P(n)}
|
|
963
963
|
<div class="simulator-theme-name">${n.name}</div>
|
|
964
964
|
<div class="simulator-theme-type">${n.type}</div>
|
|
965
965
|
`, r.addEventListener("click", () => {
|
|
@@ -969,42 +969,42 @@ function ue() {
|
|
|
969
969
|
}
|
|
970
970
|
};
|
|
971
971
|
}
|
|
972
|
-
var
|
|
973
|
-
localStorage.setItem(
|
|
974
|
-
},
|
|
972
|
+
var F = "puzzmo_sim_api_mode", I = "http://localhost:8911", L = "https://api.puzzmo.com", R = () => localStorage.getItem(F) === "dev" ? "dev" : "prod", z = (e) => {
|
|
973
|
+
localStorage.setItem(F, e);
|
|
974
|
+
}, B = null, V = function() {
|
|
975
975
|
var t = e(function* () {
|
|
976
|
-
if (
|
|
976
|
+
if (B !== null) return B;
|
|
977
977
|
try {
|
|
978
|
-
let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${
|
|
979
|
-
return clearTimeout(t),
|
|
978
|
+
let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${I}/healthz`, { signal: e.signal });
|
|
979
|
+
return clearTimeout(t), B = n.ok, B;
|
|
980
980
|
} catch (e) {
|
|
981
|
-
return
|
|
981
|
+
return B = !1, !1;
|
|
982
982
|
}
|
|
983
983
|
});
|
|
984
984
|
return function() {
|
|
985
985
|
return t.apply(this, arguments);
|
|
986
986
|
};
|
|
987
|
-
}(),
|
|
988
|
-
apiURL:
|
|
987
|
+
}(), H = () => ({
|
|
988
|
+
apiURL: R() === "dev" ? I : L,
|
|
989
989
|
clientID: "protosdk:oauthclient",
|
|
990
990
|
redirectUri: `${window.location.origin}/oauth/callback`
|
|
991
|
-
}),
|
|
991
|
+
}), U = () => {
|
|
992
992
|
let e = new Uint8Array(32);
|
|
993
993
|
return crypto.getRandomValues(e), Array.from(e, (e) => e.toString(16).padStart(2, "0")).join("");
|
|
994
|
-
},
|
|
995
|
-
let e = localStorage.getItem(
|
|
994
|
+
}, W = "puzzmo_sim_oauth_token", G = "puzzmo_sim_oauth_refresh_token", K = (e) => localStorage.setItem(W, e), ue = (e) => localStorage.setItem(G, e), q = () => {
|
|
995
|
+
let e = localStorage.getItem(W);
|
|
996
996
|
return console.log("[AuthView] getAccessToken:", {
|
|
997
|
-
TOKEN_KEY:
|
|
997
|
+
TOKEN_KEY: W,
|
|
998
998
|
token: e ? `${e.substring(0, 20)}...` : null
|
|
999
999
|
}), e;
|
|
1000
|
-
},
|
|
1001
|
-
localStorage.removeItem(
|
|
1002
|
-
},
|
|
1003
|
-
let e =
|
|
1000
|
+
}, J = () => localStorage.getItem(G), Y = () => {
|
|
1001
|
+
localStorage.removeItem(W), localStorage.removeItem(G);
|
|
1002
|
+
}, de = () => {
|
|
1003
|
+
let e = H(), t = U();
|
|
1004
1004
|
sessionStorage.setItem("oauth_state", t), sessionStorage.setItem("oauth_return_url", window.location.href);
|
|
1005
1005
|
let n = new URL(`${e.apiURL}/oauth/auth`);
|
|
1006
1006
|
n.searchParams.set("client_id", e.clientID), n.searchParams.set("response_type", "code"), n.searchParams.set("redirect_uri", e.redirectUri), n.searchParams.set("state", t), window.location.href = n.toString();
|
|
1007
|
-
},
|
|
1007
|
+
}, fe = (e) => {
|
|
1008
1008
|
try {
|
|
1009
1009
|
let t = e.split(".");
|
|
1010
1010
|
if (t.length !== 3) return !0;
|
|
@@ -1013,11 +1013,11 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1013
1013
|
} catch (e) {
|
|
1014
1014
|
return !0;
|
|
1015
1015
|
}
|
|
1016
|
-
},
|
|
1016
|
+
}, pe = function() {
|
|
1017
1017
|
var t = e(function* () {
|
|
1018
|
-
let e =
|
|
1018
|
+
let e = J();
|
|
1019
1019
|
if (!e) return console.log("[AuthView] No refresh token available"), !1;
|
|
1020
|
-
let t =
|
|
1020
|
+
let t = H();
|
|
1021
1021
|
try {
|
|
1022
1022
|
let n = new URLSearchParams({
|
|
1023
1023
|
grant_type: "refresh_token",
|
|
@@ -1031,9 +1031,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1031
1031
|
if (!r.ok) return console.error("[AuthView] Failed to refresh token:", r.statusText), !1;
|
|
1032
1032
|
let i = yield r.json(), a = i.access_token || i.accessToken;
|
|
1033
1033
|
if (!a) return console.error("[AuthView] No access token in refresh response"), !1;
|
|
1034
|
-
|
|
1034
|
+
K(a);
|
|
1035
1035
|
let o = i.refresh_token || i.refreshToken;
|
|
1036
|
-
return o &&
|
|
1036
|
+
return o && ue(o), console.log("[AuthView] Successfully refreshed access token"), !0;
|
|
1037
1037
|
} catch (e) {
|
|
1038
1038
|
return console.error("[AuthView] Error refreshing token:", e), !1;
|
|
1039
1039
|
}
|
|
@@ -1041,9 +1041,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1041
1041
|
return function() {
|
|
1042
1042
|
return t.apply(this, arguments);
|
|
1043
1043
|
};
|
|
1044
|
-
}(),
|
|
1044
|
+
}(), me = function() {
|
|
1045
1045
|
var t = e(function* (e, t) {
|
|
1046
|
-
let n =
|
|
1046
|
+
let n = H(), r = sessionStorage.getItem("oauth_state");
|
|
1047
1047
|
if (!r || r !== t) return console.error("OAuth state mismatch - possible CSRF attack"), null;
|
|
1048
1048
|
sessionStorage.removeItem("oauth_state");
|
|
1049
1049
|
try {
|
|
@@ -1065,13 +1065,13 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1065
1065
|
return function(e, n) {
|
|
1066
1066
|
return t.apply(this, arguments);
|
|
1067
1067
|
};
|
|
1068
|
-
}(),
|
|
1068
|
+
}(), he = function() {
|
|
1069
1069
|
var t = e(function* (e, t = {}) {
|
|
1070
|
-
let n =
|
|
1070
|
+
let n = H(), r = q();
|
|
1071
1071
|
if (!r) throw Error("Not authenticated");
|
|
1072
|
-
if (
|
|
1073
|
-
if (r =
|
|
1074
|
-
} else throw
|
|
1072
|
+
if (fe(r)) if (console.log("[AuthView] Access token expired, attempting refresh..."), yield pe()) {
|
|
1073
|
+
if (r = q(), !r) throw Error("Token refresh succeeded but no token available");
|
|
1074
|
+
} else throw Y(), Error("Session expired. Please log in again.");
|
|
1075
1075
|
let i = yield fetch(`${n.apiURL}/graphql`, {
|
|
1076
1076
|
method: "POST",
|
|
1077
1077
|
headers: {
|
|
@@ -1090,7 +1090,7 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1090
1090
|
return function(e) {
|
|
1091
1091
|
return t.apply(this, arguments);
|
|
1092
1092
|
};
|
|
1093
|
-
}(),
|
|
1093
|
+
}(), ge = (e) => {
|
|
1094
1094
|
try {
|
|
1095
1095
|
console.log("[AuthView] decodeJWT input:", e);
|
|
1096
1096
|
let t = e.split(".");
|
|
@@ -1101,15 +1101,15 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1101
1101
|
return console.error("[AuthView] decodeJWT error:", e), null;
|
|
1102
1102
|
}
|
|
1103
1103
|
};
|
|
1104
|
-
function
|
|
1104
|
+
function _e() {
|
|
1105
1105
|
let t = !1;
|
|
1106
1106
|
return {
|
|
1107
1107
|
id: "auth",
|
|
1108
1108
|
label: "Auth",
|
|
1109
1109
|
render() {
|
|
1110
|
-
let e =
|
|
1110
|
+
let e = q(), t = !!e, n = R(), r = n === "dev" ? I : L, i = `<button class="simulator-btn tiny" id="auth-dev-toggle" style="display: none;">${n === "dev" ? "Using Dev" : "Dev"}</button>`;
|
|
1111
1111
|
if (t) {
|
|
1112
|
-
let t =
|
|
1112
|
+
let t = ge(e), n = t != null && t.exp ? (/* @__PURE__ */ new Date(t.exp * 1e3)).toLocaleString() : "Unknown", a = !!J(), o = a ? ge(J()) : null, s = o != null && o.exp ? (/* @__PURE__ */ new Date(o.exp * 1e3)).toLocaleString() : null;
|
|
1113
1113
|
return console.log({ decoded: t }), `
|
|
1114
1114
|
<div class="simulator-section">
|
|
1115
1115
|
<div class="simulator-section-title auth-title-row">
|
|
@@ -1150,7 +1150,7 @@ function ve() {
|
|
|
1150
1150
|
</div>
|
|
1151
1151
|
<p class="auth-description">
|
|
1152
1152
|
Login with your Puzzmo account to make authenticated API requests.
|
|
1153
|
-
${n === "dev" ? `<br><strong>Using local dev server:</strong> ${
|
|
1153
|
+
${n === "dev" ? `<br><strong>Using local dev server:</strong> ${I}` : ""}
|
|
1154
1154
|
</p>
|
|
1155
1155
|
<div class="simulator-row">
|
|
1156
1156
|
<button class="simulator-btn primary" id="auth-login">Login with Puzzmo</button>
|
|
@@ -1161,21 +1161,21 @@ function ve() {
|
|
|
1161
1161
|
},
|
|
1162
1162
|
bind(n) {
|
|
1163
1163
|
let r = n.getElement("#auth-login"), i = n.getElement("#auth-logout"), a = n.getElement("#auth-refresh"), o = n.getElement("#auth-test-api"), s = n.getElement("#auth-api-result"), c = n.getElement("#auth-dev-toggle");
|
|
1164
|
-
t ?
|
|
1165
|
-
e && c && (c.style.display = "",
|
|
1164
|
+
t ? B && c && (c.style.display = "", R() === "dev" && c.classList.add("active")) : (t = !0, V().then((e) => {
|
|
1165
|
+
e && c && (c.style.display = "", R() === "dev" && c.classList.add("active"));
|
|
1166
1166
|
})), c == null || c.addEventListener("click", () => {
|
|
1167
|
-
R(
|
|
1167
|
+
z(R() === "dev" ? "prod" : "dev"), Y(), window.location.reload();
|
|
1168
1168
|
}), r == null || r.addEventListener("click", () => {
|
|
1169
|
-
|
|
1169
|
+
de();
|
|
1170
1170
|
}), i == null || i.addEventListener("click", () => {
|
|
1171
|
-
|
|
1171
|
+
Y(), window.location.reload();
|
|
1172
1172
|
}), a == null || a.addEventListener("click", e(function* () {
|
|
1173
|
-
a.disabled = !0, a.textContent = "Refreshing...", (yield
|
|
1173
|
+
a.disabled = !0, a.textContent = "Refreshing...", (yield pe()) ? window.location.reload() : (a.textContent = "Refresh Failed", a.disabled = !1);
|
|
1174
1174
|
})), o == null || o.addEventListener("click", e(function* () {
|
|
1175
1175
|
if (s) {
|
|
1176
1176
|
s.innerHTML = "<div class=\"loading\">Loading...</div>";
|
|
1177
1177
|
try {
|
|
1178
|
-
let t = yield
|
|
1178
|
+
let t = yield he("\n query {\n currentUser {\n id\n username\n usernameID\n name\n }\n }\n ");
|
|
1179
1179
|
if (t.errors) {
|
|
1180
1180
|
var e;
|
|
1181
1181
|
s.innerHTML = `<div class="error">Error: ${((e = t.errors[0]) == null ? void 0 : e.message) || "Unknown error"}</div>`;
|
|
@@ -1197,13 +1197,13 @@ function ve() {
|
|
|
1197
1197
|
if (n && r) {
|
|
1198
1198
|
let e = t.getElement("#auth-status");
|
|
1199
1199
|
e && (e.innerHTML = "<span class=\"indicator waiting\"></span><span>Exchanging code...</span>");
|
|
1200
|
-
let i = yield
|
|
1200
|
+
let i = yield me(n, r);
|
|
1201
1201
|
if (window.history.replaceState({}, "", window.location.pathname), i) {
|
|
1202
1202
|
let e = i.access_token || i.accessToken;
|
|
1203
1203
|
if (e) {
|
|
1204
|
-
|
|
1204
|
+
K(e);
|
|
1205
1205
|
let t = i.refresh_token || i.refreshToken;
|
|
1206
|
-
t &&
|
|
1206
|
+
t && ue(t);
|
|
1207
1207
|
}
|
|
1208
1208
|
window.location.reload();
|
|
1209
1209
|
} else {
|
|
@@ -1215,9 +1215,9 @@ function ve() {
|
|
|
1215
1215
|
}
|
|
1216
1216
|
};
|
|
1217
1217
|
}
|
|
1218
|
-
var
|
|
1219
|
-
localStorage.removeItem(
|
|
1220
|
-
},
|
|
1218
|
+
var ve = "puzzmo_sim_api_mode", ye = "http://localhost:8911", be = "https://api.puzzmo.com", X = "puzzmo_sim_oauth_token", Z = "puzzmo_sim_oauth_refresh_token", xe = () => localStorage.getItem(ve) === "dev" ? "dev" : "prod", Q = () => localStorage.getItem(X), Se = () => localStorage.getItem(Z), Ce = (e) => localStorage.setItem(X, e), we = (e) => localStorage.setItem(Z, e), Te = () => {
|
|
1219
|
+
localStorage.removeItem(X), localStorage.removeItem(Z);
|
|
1220
|
+
}, Ee = (e) => {
|
|
1221
1221
|
try {
|
|
1222
1222
|
let t = e.split(".");
|
|
1223
1223
|
if (t.length !== 3) return !0;
|
|
@@ -1226,11 +1226,11 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1226
1226
|
} catch (e) {
|
|
1227
1227
|
return !0;
|
|
1228
1228
|
}
|
|
1229
|
-
},
|
|
1229
|
+
}, De = function() {
|
|
1230
1230
|
var t = e(function* () {
|
|
1231
|
-
let e =
|
|
1231
|
+
let e = Se();
|
|
1232
1232
|
if (!e) return !1;
|
|
1233
|
-
let t =
|
|
1233
|
+
let t = xe() === "dev" ? ye : be;
|
|
1234
1234
|
try {
|
|
1235
1235
|
let n = new URLSearchParams({
|
|
1236
1236
|
grant_type: "refresh_token",
|
|
@@ -1244,9 +1244,9 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1244
1244
|
if (!r.ok) return !1;
|
|
1245
1245
|
let i = yield r.json(), a = i.access_token || i.accessToken;
|
|
1246
1246
|
if (!a) return !1;
|
|
1247
|
-
|
|
1247
|
+
Ce(a);
|
|
1248
1248
|
let o = i.refresh_token || i.refreshToken;
|
|
1249
|
-
return o &&
|
|
1249
|
+
return o && we(o), !0;
|
|
1250
1250
|
} catch (e) {
|
|
1251
1251
|
return !1;
|
|
1252
1252
|
}
|
|
@@ -1254,13 +1254,13 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1254
1254
|
return function() {
|
|
1255
1255
|
return t.apply(this, arguments);
|
|
1256
1256
|
};
|
|
1257
|
-
}(),
|
|
1257
|
+
}(), Oe = function() {
|
|
1258
1258
|
var t = e(function* (e, t = {}) {
|
|
1259
|
-
let n =
|
|
1259
|
+
let n = xe() === "dev" ? ye : be, r = Q();
|
|
1260
1260
|
if (!r) throw Error("Not authenticated");
|
|
1261
|
-
if (
|
|
1262
|
-
if (r =
|
|
1263
|
-
} else throw
|
|
1261
|
+
if (Ee(r)) if (yield De()) {
|
|
1262
|
+
if (r = Q(), !r) throw Error("Token refresh succeeded but no token available");
|
|
1263
|
+
} else throw Te(), Error("Session expired. Please log in again.");
|
|
1264
1264
|
let i = yield fetch(`${n}/graphql`, {
|
|
1265
1265
|
method: "POST",
|
|
1266
1266
|
headers: {
|
|
@@ -1279,19 +1279,19 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1279
1279
|
return function(e) {
|
|
1280
1280
|
return t.apply(this, arguments);
|
|
1281
1281
|
};
|
|
1282
|
-
}(),
|
|
1282
|
+
}(), ke = "\n query GameFeaturesQuery($slug: ID!) {\n game(id: $slug) {\n id\n slug\n displayName\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", Ae = "\n mutation ToggleFeatureMutation($gameSlug: ID!, $input: UpdateGameInput!) {\n updateGame(id: $gameSlug, input: $input) {\n id\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", je = (e, t) => {
|
|
1283
1283
|
let n = t - 1, r = Math.floor(n / 31), i = n % 31, a = [...e];
|
|
1284
1284
|
for (; a.length <= r;) a.push(0);
|
|
1285
1285
|
return a[r] = a[r] ^ 1 << i, a;
|
|
1286
1286
|
};
|
|
1287
|
-
const
|
|
1287
|
+
const Me = () => !!Q();
|
|
1288
1288
|
function Ne() {
|
|
1289
1289
|
let n = null, r = !1, i = null, a = function() {
|
|
1290
1290
|
var t = e(function* (e) {
|
|
1291
1291
|
r = !0, i = null;
|
|
1292
1292
|
try {
|
|
1293
1293
|
var t;
|
|
1294
|
-
let r = yield ke
|
|
1294
|
+
let r = yield Oe(ke, { slug: e });
|
|
1295
1295
|
if (r.errors) {
|
|
1296
1296
|
var a;
|
|
1297
1297
|
i = ((a = r.errors[0]) == null ? void 0 : a.message) || "Unknown error", n = null;
|
|
@@ -1308,10 +1308,10 @@ function Ne() {
|
|
|
1308
1308
|
}(), o = function() {
|
|
1309
1309
|
var r = e(function* (e) {
|
|
1310
1310
|
if (!n) return;
|
|
1311
|
-
let r =
|
|
1311
|
+
let r = je(n.featuresArr, e);
|
|
1312
1312
|
try {
|
|
1313
1313
|
var i;
|
|
1314
|
-
let e = yield
|
|
1314
|
+
let e = yield Oe(Ae, {
|
|
1315
1315
|
gameSlug: n.slug,
|
|
1316
1316
|
input: { featuresArr: r }
|
|
1317
1317
|
});
|
|
@@ -1359,7 +1359,7 @@ function Ne() {
|
|
|
1359
1359
|
id: "features",
|
|
1360
1360
|
label: "Features",
|
|
1361
1361
|
render() {
|
|
1362
|
-
return
|
|
1362
|
+
return Me() ? `
|
|
1363
1363
|
<div class="features-view-container">
|
|
1364
1364
|
<div class="simulator-section">
|
|
1365
1365
|
<div class="simulator-section-title">Game Features</div>
|
|
@@ -1400,7 +1400,7 @@ function Ne() {
|
|
|
1400
1400
|
e && (yield d(e));
|
|
1401
1401
|
})), i == null || i.addEventListener("keypress", (e) => {
|
|
1402
1402
|
e.key === "Enter" && (r == null || r.click());
|
|
1403
|
-
}), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug,
|
|
1403
|
+
}), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug, Me() && !n && d(t.gameSlug)), u();
|
|
1404
1404
|
},
|
|
1405
1405
|
onActivate(e) {
|
|
1406
1406
|
let t = e.getElement("#simulator-tab-features");
|
|
@@ -1408,36 +1408,36 @@ function Ne() {
|
|
|
1408
1408
|
}
|
|
1409
1409
|
};
|
|
1410
1410
|
}
|
|
1411
|
-
var
|
|
1411
|
+
var $ = null;
|
|
1412
1412
|
/**
|
|
1413
1413
|
* Creates the Simulator UI and message handling.
|
|
1414
1414
|
* If called multiple times, updates the existing instance with new settings (e.g., fixtures).
|
|
1415
1415
|
*/
|
|
1416
|
-
function
|
|
1417
|
-
var n, r
|
|
1416
|
+
function Pe(t = {}) {
|
|
1417
|
+
var n, r;
|
|
1418
1418
|
if (console.log("[Simulator] createSimulator called with config:", {
|
|
1419
1419
|
slug: t.slug,
|
|
1420
1420
|
hasFixtures: !!t.fixtures
|
|
1421
1421
|
}), $) return t.fixtures && (console.log("[Simulator] Instance already exists, updating fixtures"), $.updateFixtures(t.fixtures)), $;
|
|
1422
|
-
let
|
|
1422
|
+
let i = (n = t.autoStart) == null ? !0 : n, a = t.fixtures ? v(t.fixtures) : null, o = a ? Array.from(a.keys()).sort() : [], s = ae(), c = ce(), f = [
|
|
1423
1423
|
re(),
|
|
1424
|
-
|
|
1425
|
-
|
|
1424
|
+
ie(),
|
|
1425
|
+
s,
|
|
1426
|
+
oe(),
|
|
1426
1427
|
se(),
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
ve(),
|
|
1428
|
+
c,
|
|
1429
|
+
le(),
|
|
1430
|
+
_e(),
|
|
1431
1431
|
Ne()
|
|
1432
|
-
],
|
|
1432
|
+
], p = f.map((e) => e.id), m = l(t, o, p), h = {
|
|
1433
1433
|
pause: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"1\" width=\"3\" height=\"8\"/><rect x=\"6\" y=\"1\" width=\"3\" height=\"8\"/></svg>",
|
|
1434
1434
|
play: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><polygon points=\"2,1 9,5 2,9\"/></svg>",
|
|
1435
1435
|
retry: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M5 1C2.8 1 1 2.8 1 5s1.8 4 4 4c1.8 0 3.3-1.2 3.8-2.8H7.5c-.4.9-1.3 1.5-2.5 1.5-1.5 0-2.7-1.2-2.7-2.7S3.5 2.3 5 2.3c.7 0 1.4.3 1.9.8L5.5 4.5H9V1L7.6 2.4C6.9 1.5 5.9 1 5 1z\"/></svg>",
|
|
1436
1436
|
cog: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M9.5 5.8l-.8-.5c0-.2.1-.5.1-.8s0-.5-.1-.8l.8-.5c.1-.1.2-.2.1-.4l-.8-1.4c-.1-.1-.2-.2-.4-.1l-1 .3c-.3-.3-.7-.5-1.1-.6L6.1.2C6.1.1 6 0 5.8 0H4.2c-.2 0-.3.1-.3.2l-.2 1c-.4.1-.7.3-1.1.6l-1-.3c-.2 0-.3 0-.4.1l-.8 1.4c-.1.2 0 .3.1.4l.8.5c0 .2-.1.5-.1.8s0 .5.1.8l-.8.5c-.1.1-.2.2-.1.4l.8 1.4c.1.1.2.2.4.1l1-.3c.3.3.7.5 1.1.6l.2 1c0 .1.1.2.3.2h1.6c.2 0 .3-.1.3-.2l.2-1c.4-.1.7-.3 1.1-.6l1 .3c.2 0 .3 0 .4-.1l.8-1.4c.1-.2 0-.3-.1-.4zM5 6.5c-.8 0-1.5-.7-1.5-1.5S4.2 3.5 5 3.5 6.5 4.2 6.5 5 5.8 6.5 5 6.5z\"/></svg>",
|
|
1437
1437
|
minimize: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"4\" width=\"8\" height=\"2\"/></svg>",
|
|
1438
1438
|
expand: "<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\"><polygon points=\"1,1 7,4 1,7\"/></svg>"
|
|
1439
|
-
},
|
|
1440
|
-
|
|
1439
|
+
}, g = document.createElement("div");
|
|
1440
|
+
g.id = "simulator", g.innerHTML = `
|
|
1441
1441
|
<style>
|
|
1442
1442
|
:root {
|
|
1443
1443
|
--sim-bg: #1a1a2e;
|
|
@@ -2512,15 +2512,15 @@ function Fe(t = {}) {
|
|
|
2512
2512
|
font-size: 9px;
|
|
2513
2513
|
}
|
|
2514
2514
|
</style>
|
|
2515
|
-
<div id="simulator-panel" class="${
|
|
2515
|
+
<div id="simulator-panel" class="${m.isCollapsed ? "collapsed" : ""}">
|
|
2516
2516
|
<div id="simulator-header">
|
|
2517
2517
|
<span id="simulator-title">PUZZMO SIMULATOR</span>
|
|
2518
2518
|
<span class="header-sep">|</span>
|
|
2519
2519
|
<div id="simulator-timer">--:--</div>
|
|
2520
2520
|
<span class="header-sep">|</span>
|
|
2521
2521
|
<div id="simulator-header-controls">
|
|
2522
|
-
<button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${
|
|
2523
|
-
<button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${
|
|
2522
|
+
<button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${h.pause}</button>
|
|
2523
|
+
<button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${h.retry}</button>
|
|
2524
2524
|
</div>
|
|
2525
2525
|
<span class="header-sep">|</span>
|
|
2526
2526
|
<div id="simulator-header-status">
|
|
@@ -2528,101 +2528,104 @@ function Fe(t = {}) {
|
|
|
2528
2528
|
<span id="simulator-header-status-text">Waiting...</span>
|
|
2529
2529
|
</div>
|
|
2530
2530
|
<span class="header-spacer"></span>
|
|
2531
|
-
<button id="simulator-header-settings" class="header-icon-btn" title="Settings">${
|
|
2532
|
-
<button id="simulator-toggle" class="header-icon-btn" title="Minimize">${
|
|
2531
|
+
<button id="simulator-header-settings" class="header-icon-btn" title="Settings">${h.cog}</button>
|
|
2532
|
+
<button id="simulator-toggle" class="header-icon-btn" title="Minimize">${h.minimize}</button>
|
|
2533
2533
|
</div>
|
|
2534
2534
|
<div id="simulator-body">
|
|
2535
2535
|
<div id="simulator-tabs">
|
|
2536
|
-
${
|
|
2536
|
+
${f.filter((e) => e.id !== "auth").map((e) => `<button class="simulator-tab" data-tab="${e.id}">${e.label}<span class="simulator-tab-badge" data-badge="${e.id}"></span></button>`).join("")}
|
|
2537
2537
|
</div>
|
|
2538
2538
|
<div id="simulator-content" class="hidden">
|
|
2539
|
-
${
|
|
2539
|
+
${f.map((e) => `<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join("")}
|
|
2540
2540
|
</div>
|
|
2541
2541
|
</div>
|
|
2542
2542
|
</div>
|
|
2543
|
-
`, document.body.appendChild(
|
|
2544
|
-
let
|
|
2545
|
-
|
|
2543
|
+
`, document.body.appendChild(g);
|
|
2544
|
+
let _ = g.querySelector("#simulator-panel"), y = g.querySelector("#simulator-header"), b = g.querySelector("#simulator-header-indicator"), x = g.querySelector("#simulator-header-status-text"), S = g.querySelector("#simulator-header-pause"), C = g.querySelector("#simulator-header-retry"), w = g.querySelector("#simulator-header-settings"), T = g.querySelector("#simulator-toggle"), E = g.querySelector("#simulator-timer"), D = g.querySelector("#simulator-tabs"), O = g.querySelector("#simulator-content"), k = (e) => g.querySelector(e), A = (e) => {
|
|
2545
|
+
S.innerHTML = e ? h.play : h.pause, S.title = e ? "Resume" : "Pause";
|
|
2546
|
+
}, j = (e, t) => {
|
|
2547
|
+
let n = k("#simulator-status .text"), r = k("#simulator-status .indicator");
|
|
2548
|
+
n && (n.textContent = e), r && (r.className = `indicator ${t}`), b.className = t, x.textContent = e;
|
|
2546
2549
|
}, M = (e, t) => {
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
}, N = (e, t) => {
|
|
2550
|
-
t && t !== "0" ? D.innerHTML = `${e}<span class="penalty">+${t}</span>` : D.textContent = e;
|
|
2551
|
-
}, P = (e) => {
|
|
2550
|
+
t && t !== "0" ? E.innerHTML = `${e}<span class="penalty">+${t}</span>` : E.textContent = e;
|
|
2551
|
+
}, N = (e) => {
|
|
2552
2552
|
var t;
|
|
2553
|
-
|
|
2553
|
+
m.activeTab = e, O.classList.remove("hidden"), d(e), D.querySelectorAll(".simulator-tab").forEach((t) => {
|
|
2554
2554
|
t.classList.toggle("active", t.getAttribute("data-tab") === e);
|
|
2555
|
-
}),
|
|
2555
|
+
}), g.querySelectorAll(".simulator-tab-content").forEach((t) => {
|
|
2556
2556
|
t.classList.toggle("active", t.id === `simulator-tab-${e}`);
|
|
2557
|
-
}),
|
|
2558
|
-
let n =
|
|
2559
|
-
n == null || (t = n.onActivate) == null || t.call(n,
|
|
2560
|
-
},
|
|
2561
|
-
|
|
2562
|
-
},
|
|
2563
|
-
|
|
2564
|
-
},
|
|
2557
|
+
}), w.classList.toggle("active", e === "auth");
|
|
2558
|
+
let n = f.find((t) => t.id === e);
|
|
2559
|
+
n == null || (t = n.onActivate) == null || t.call(n, B);
|
|
2560
|
+
}, P = (e) => {
|
|
2561
|
+
m.isCollapsed = e, _.classList.toggle("collapsed", e), u(e), e ? (O.classList.add("hidden"), D.querySelectorAll(".simulator-tab").forEach((e) => e.classList.remove("active"))) : N(m.activeTab);
|
|
2562
|
+
}, F = () => {
|
|
2563
|
+
c.updatePreview(B);
|
|
2564
|
+
}, I = function() {
|
|
2565
2565
|
var t = e(function* () {
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2566
|
+
var e, t;
|
|
2567
|
+
if (m.puzzleData) return m.puzzleData;
|
|
2568
|
+
if (!a || a.size === 0) throw Error("No fixtures configured. Add puzzle JSON files to a fixtures directory and pass fixturesGlob to the simulator.");
|
|
2569
|
+
let n = (e = m.selectedCategory) == null ? o[0] : e, r = n ? a.get(n) : void 0;
|
|
2570
|
+
if (!r || r.size === 0) throw Error(`No puzzles found in fixture category "${n}"`);
|
|
2571
|
+
let i = (t = m.selectedPuzzle) == null ? r.keys().next().value : t, s = i ? r.get(i) : void 0;
|
|
2572
|
+
if (!s) throw Error(`Puzzle "${i}" not found in category "${n}"`);
|
|
2573
|
+
m.puzzleData = s, console.log("Simulator: Puzzle loaded from fixtures", {
|
|
2574
|
+
category: n,
|
|
2575
|
+
puzzle: i
|
|
2576
|
+
}), m.originalPuzzle = JSON.stringify(m.puzzleData, null, 2);
|
|
2577
|
+
let c = k("#simulator-puzzle");
|
|
2578
|
+
return c && (c.value = m.originalPuzzle), m.activeTab === "thumb" && F(), m.puzzleData;
|
|
2576
2579
|
});
|
|
2577
2580
|
return function() {
|
|
2578
2581
|
return t.apply(this, arguments);
|
|
2579
2582
|
};
|
|
2580
|
-
}(),
|
|
2581
|
-
|
|
2582
|
-
}),
|
|
2583
|
-
te(e, t,
|
|
2584
|
-
},
|
|
2585
|
-
let n =
|
|
2583
|
+
}(), L = ee((e) => {
|
|
2584
|
+
s.addLogEntry(e, B);
|
|
2585
|
+
}), R = (e, t) => {
|
|
2586
|
+
te(e, t, L);
|
|
2587
|
+
}, z = (e, t) => {
|
|
2588
|
+
let n = g.querySelector(`[data-badge="${e}"]`);
|
|
2586
2589
|
n && (n.textContent = t && t > 0 ? String(t) : "");
|
|
2587
|
-
},
|
|
2588
|
-
state:
|
|
2589
|
-
getElement:
|
|
2590
|
-
sendToGame:
|
|
2591
|
-
logMessage:
|
|
2592
|
-
loadPuzzle:
|
|
2593
|
-
updateStatus:
|
|
2594
|
-
updateTimer:
|
|
2595
|
-
setCollapsed:
|
|
2596
|
-
switchTab:
|
|
2597
|
-
updateThumbnail:
|
|
2598
|
-
updateBadge:
|
|
2599
|
-
fixtures:
|
|
2600
|
-
fixtureCategories:
|
|
2601
|
-
gameSlug: (
|
|
2590
|
+
}, B = {
|
|
2591
|
+
state: m,
|
|
2592
|
+
getElement: k,
|
|
2593
|
+
sendToGame: R,
|
|
2594
|
+
logMessage: L.log,
|
|
2595
|
+
loadPuzzle: I,
|
|
2596
|
+
updateStatus: j,
|
|
2597
|
+
updateTimer: M,
|
|
2598
|
+
setCollapsed: P,
|
|
2599
|
+
switchTab: N,
|
|
2600
|
+
updateThumbnail: F,
|
|
2601
|
+
updateBadge: z,
|
|
2602
|
+
fixtures: a,
|
|
2603
|
+
fixtureCategories: o,
|
|
2604
|
+
gameSlug: (r = t.slug) == null ? null : r
|
|
2602
2605
|
};
|
|
2603
|
-
console.log("[Simulator] Context created with gameSlug:",
|
|
2606
|
+
console.log("[Simulator] Context created with gameSlug:", B.gameSlug), f.forEach((e) => e.bind(B)), D.querySelectorAll(".simulator-tab").forEach((e) => {
|
|
2604
2607
|
e.addEventListener("click", () => {
|
|
2605
2608
|
let t = e.getAttribute("data-tab");
|
|
2606
|
-
|
|
2609
|
+
N(t), z(t, 0);
|
|
2607
2610
|
});
|
|
2608
|
-
}),
|
|
2609
|
-
e.stopPropagation(),
|
|
2611
|
+
}), T.addEventListener("click", (e) => {
|
|
2612
|
+
e.stopPropagation(), P(!0);
|
|
2613
|
+
}), S.addEventListener("click", (e) => {
|
|
2614
|
+
e.stopPropagation(), m.isPaused ? (R("RESUME_GAME", {}), m.isPaused = !1, A(!1), j("Running", "ready")) : (R("PAUSE_GAME", {}), m.isPaused = !0, A(!0), j("Paused", "paused"));
|
|
2615
|
+
let t = k("#simulator-pause");
|
|
2616
|
+
t && (t.textContent = m.isPaused ? "Resume" : "Pause");
|
|
2610
2617
|
}), C.addEventListener("click", (e) => {
|
|
2611
|
-
e.stopPropagation(),
|
|
2612
|
-
let t =
|
|
2613
|
-
t && (t.textContent = g.isPaused ? "Resume" : "Pause");
|
|
2614
|
-
}), w.addEventListener("click", (e) => {
|
|
2615
|
-
e.stopPropagation(), z("RETRY_PUZZLE", {}), g.hasStarted = !1, g.isPaused = !1, j(!1), C.disabled = !0, M("Ready to retry", "ready");
|
|
2616
|
-
let t = A("#simulator-pause"), n = A("#simulator-start");
|
|
2618
|
+
e.stopPropagation(), R("RETRY_PUZZLE", {}), m.hasStarted = !1, m.isPaused = !1, A(!1), S.disabled = !0, j("Ready to retry", "ready");
|
|
2619
|
+
let t = k("#simulator-pause"), n = k("#simulator-start");
|
|
2617
2620
|
t && (t.disabled = !0, t.textContent = "Pause"), n && (n.textContent = "Start");
|
|
2618
|
-
}),
|
|
2619
|
-
e.stopPropagation(),
|
|
2620
|
-
}),
|
|
2621
|
-
|
|
2622
|
-
}),
|
|
2623
|
-
let
|
|
2624
|
-
(
|
|
2625
|
-
let
|
|
2621
|
+
}), w.addEventListener("click", (e) => {
|
|
2622
|
+
e.stopPropagation(), m.isCollapsed && P(!1), N("auth");
|
|
2623
|
+
}), y.addEventListener("click", (e) => {
|
|
2624
|
+
m.isCollapsed && e.target !== T && P(!1);
|
|
2625
|
+
}), m.isCollapsed || N(m.activeTab);
|
|
2626
|
+
let V = new URLSearchParams(window.location.search);
|
|
2627
|
+
(V.has("code") || V.has("error")) && (P(!1), N("auth"));
|
|
2628
|
+
let H = (e) => ({
|
|
2626
2629
|
userState: {
|
|
2627
2630
|
gameSettings: {},
|
|
2628
2631
|
id: "simulator-user",
|
|
@@ -2632,7 +2635,7 @@ function Fe(t = {}) {
|
|
|
2632
2635
|
currentUser: null,
|
|
2633
2636
|
startOrFindGameplay: { gamePlayed: {
|
|
2634
2637
|
additionalTimeAddedSecs: 0,
|
|
2635
|
-
boardState:
|
|
2638
|
+
boardState: m.currentInputStr,
|
|
2636
2639
|
cheatsUsed: 0,
|
|
2637
2640
|
combinedTimeSecs: 0,
|
|
2638
2641
|
completed: !1,
|
|
@@ -2665,36 +2668,36 @@ function Fe(t = {}) {
|
|
|
2665
2668
|
}
|
|
2666
2669
|
}
|
|
2667
2670
|
} },
|
|
2668
|
-
theme:
|
|
2671
|
+
theme: m.selectedTheme,
|
|
2669
2672
|
hostFlags: [],
|
|
2670
2673
|
hostContext: [],
|
|
2671
2674
|
appRuntimeContract: "1.0"
|
|
2672
|
-
}),
|
|
2675
|
+
}), U = function() {
|
|
2673
2676
|
var t = e(function* () {
|
|
2674
|
-
|
|
2677
|
+
j("Loading puzzle...", "waiting");
|
|
2675
2678
|
try {
|
|
2676
|
-
let e =
|
|
2677
|
-
|
|
2679
|
+
let e = H(yield I());
|
|
2680
|
+
j("Sending READY_DATA...", "waiting"), R("READY_DATA", e), j("Waiting for game to load...", "waiting");
|
|
2678
2681
|
} catch (e) {
|
|
2679
|
-
|
|
2682
|
+
j(`Error: ${e}`, "paused");
|
|
2680
2683
|
}
|
|
2681
2684
|
});
|
|
2682
2685
|
return function() {
|
|
2683
2686
|
return t.apply(this, arguments);
|
|
2684
2687
|
};
|
|
2685
|
-
}(),
|
|
2686
|
-
console.log("Simulator: Game loaded, ready to start"),
|
|
2688
|
+
}(), W = () => {
|
|
2689
|
+
console.log("Simulator: Game loaded, ready to start"), C.disabled = !1, f.forEach((e) => {
|
|
2687
2690
|
var t;
|
|
2688
|
-
return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0,
|
|
2689
|
-
}),
|
|
2690
|
-
let e =
|
|
2691
|
-
e == null || e.click(),
|
|
2691
|
+
return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0, B);
|
|
2692
|
+
}), i && !m.hasStarted && setTimeout(() => {
|
|
2693
|
+
let e = k("#simulator-start");
|
|
2694
|
+
e == null || e.click(), S.disabled = !1, m.hasStarted = !0, j("Running", "ready");
|
|
2692
2695
|
}, 100);
|
|
2693
2696
|
};
|
|
2694
2697
|
return ne((e, t) => {
|
|
2695
2698
|
var n, r;
|
|
2696
2699
|
if (e === "READY") {
|
|
2697
|
-
console.log("Simulator: Received READY from game"),
|
|
2700
|
+
console.log("Simulator: Received READY from game"), U();
|
|
2698
2701
|
return;
|
|
2699
2702
|
}
|
|
2700
2703
|
if (e === "INITIALIZE_SETTINGS") {
|
|
@@ -2702,13 +2705,13 @@ function Fe(t = {}) {
|
|
|
2702
2705
|
return;
|
|
2703
2706
|
}
|
|
2704
2707
|
if (e === "READY_GAME_LOADED") {
|
|
2705
|
-
|
|
2708
|
+
W();
|
|
2706
2709
|
return;
|
|
2707
2710
|
}
|
|
2708
2711
|
if (e === "TIMER_TICK") {
|
|
2709
2712
|
if (t != null && t.display) {
|
|
2710
2713
|
let [e, n] = t.display;
|
|
2711
|
-
|
|
2714
|
+
M(e, n);
|
|
2712
2715
|
}
|
|
2713
2716
|
return;
|
|
2714
2717
|
}
|
|
@@ -2721,30 +2724,30 @@ function Fe(t = {}) {
|
|
|
2721
2724
|
console.log("Simulator: Sidebar update", t);
|
|
2722
2725
|
return;
|
|
2723
2726
|
}
|
|
2724
|
-
|
|
2727
|
+
f.forEach((n) => {
|
|
2725
2728
|
var r;
|
|
2726
|
-
return (r = n.onMessage) == null ? void 0 : r.call(n, e, t,
|
|
2729
|
+
return (r = n.onMessage) == null ? void 0 : r.call(n, e, t, B);
|
|
2727
2730
|
});
|
|
2728
2731
|
let i = (n = t == null || (r = t.input) == null ? void 0 : r.boardState) == null ? t == null ? void 0 : t.boardState : n;
|
|
2729
|
-
e === "UPLOAD_NEW_GAME_STATE" && i && (
|
|
2730
|
-
},
|
|
2732
|
+
e === "UPLOAD_NEW_GAME_STATE" && i && (m.currentInputStr = i, m.activeTab === "thumb" && F(), console.log("Simulator: Game state uploaded", t)), e === "GAME_COMPLETED" && (console.log("Simulator: Game completed!", t), S.disabled = !0, m.hasStarted = !1, j("Completed!", "ready"));
|
|
2733
|
+
}, L), console.log("Simulator initialized"), $ = {
|
|
2731
2734
|
updateFixtures: (e) => {
|
|
2732
|
-
|
|
2735
|
+
a = v(e), o = Array.from(a.keys()).sort(), B.fixtures = a, B.fixtureCategories = o;
|
|
2733
2736
|
let t = localStorage.getItem("simulator-fixture-category");
|
|
2734
|
-
if (!
|
|
2737
|
+
if (!m.selectedCategory || !o.includes(m.selectedCategory)) {
|
|
2735
2738
|
var n;
|
|
2736
|
-
|
|
2739
|
+
m.selectedCategory = t && o.includes(t) ? t : (n = o[0]) == null ? null : n;
|
|
2737
2740
|
}
|
|
2738
|
-
let r =
|
|
2739
|
-
r == null || r.bind(
|
|
2740
|
-
categories:
|
|
2741
|
-
selectedCategory:
|
|
2741
|
+
let r = f.find((e) => e.id === "ctrl");
|
|
2742
|
+
r == null || r.bind(B), console.log("Simulator: Fixtures updated", {
|
|
2743
|
+
categories: o,
|
|
2744
|
+
selectedCategory: m.selectedCategory
|
|
2742
2745
|
});
|
|
2743
2746
|
},
|
|
2744
|
-
sendToGame:
|
|
2745
|
-
loadPuzzle:
|
|
2747
|
+
sendToGame: R,
|
|
2748
|
+
loadPuzzle: I
|
|
2746
2749
|
}, $;
|
|
2747
2750
|
}
|
|
2748
|
-
export {
|
|
2751
|
+
export { Pe as t };
|
|
2749
2752
|
|
|
2750
|
-
//# sourceMappingURL=createSimulator-
|
|
2753
|
+
//# sourceMappingURL=createSimulator-D4oY1VzY.js.map
|