@puzzmo/sdk 1.0.7 → 1.0.9

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