@puzzmo/sdk 1.0.29 → 1.0.30

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 (48) hide show
  1. package/dist/analytics.d.ts +52 -0
  2. package/dist/analytics.d.ts.map +1 -0
  3. package/dist/{createSimulator-CC0PhepL.cjs → createSimulator-B7x0QRdO.cjs} +119 -29
  4. package/dist/createSimulator-B7x0QRdO.cjs.map +1 -0
  5. package/dist/{createSimulator-CWwSv8gh.js → createSimulator-DqF2fN_0.js} +526 -330
  6. package/dist/createSimulator-DqF2fN_0.js.map +1 -0
  7. package/dist/editor.d.ts +12 -2
  8. package/dist/editor.d.ts.map +1 -1
  9. package/dist/gameTracker.d.ts +16 -0
  10. package/dist/gameTracker.d.ts.map +1 -0
  11. package/dist/index.cjs +1 -1
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +273 -120
  16. package/dist/index.js.map +1 -1
  17. package/dist/inputs/index.cjs +1 -1
  18. package/dist/inputs/index.js +1 -1
  19. package/dist/sdk.d.ts +18 -4
  20. package/dist/sdk.d.ts.map +1 -1
  21. package/dist/settings.spec.d.ts +2 -0
  22. package/dist/settings.spec.d.ts.map +1 -0
  23. package/dist/simulator/createSimulator.d.ts.map +1 -1
  24. package/dist/simulator/index.cjs +1 -1
  25. package/dist/simulator/index.js +1 -1
  26. package/dist/simulator/standalone.cjs +1 -1
  27. package/dist/simulator/standalone.js +1 -1
  28. package/dist/simulator/state.d.ts +2 -0
  29. package/dist/simulator/state.d.ts.map +1 -1
  30. package/dist/simulator/styles.d.ts +1 -1
  31. package/dist/simulator/styles.d.ts.map +1 -1
  32. package/dist/simulator/types.d.ts +5 -1
  33. package/dist/simulator/types.d.ts.map +1 -1
  34. package/dist/simulator/views/SettingsView.d.ts +8 -0
  35. package/dist/simulator/views/SettingsView.d.ts.map +1 -0
  36. package/dist/simulator/views/index.d.ts +1 -0
  37. package/dist/simulator/views/index.d.ts.map +1 -1
  38. package/dist/types.d.ts +76 -0
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/vite.cjs +2 -2
  41. package/dist/vite.js +18 -18
  42. package/package.json +1 -1
  43. package/dist/createSimulator-CC0PhepL.cjs.map +0 -1
  44. package/dist/createSimulator-CWwSv8gh.js.map +0 -1
  45. /package/dist/{asyncToGenerator-BlxRHn40.cjs → asyncToGenerator-DANjdFmB.cjs} +0 -0
  46. /package/dist/{asyncToGenerator-CPSNHDFw.js → asyncToGenerator-Dn36a-ch.js} +0 -0
  47. /package/dist/{objectSpread2-vLYiAtaU.js → objectSpread2-COovHPnD.js} +0 -0
  48. /package/dist/{objectSpread2-B6tAAMuy.cjs → objectSpread2-CuluYLUL.cjs} +0 -0
@@ -0,0 +1,52 @@
1
+ import type { BootstrapGameData } from "./types";
2
+ /**
3
+ * Game analytics for the SDK.
4
+ *
5
+ * The event-firing logic — which host messages map to which ClickHouse events, the
6
+ * engagement thresholds, the payload, and the /events endpoint — lives in ./gameTracker,
7
+ * a self-contained mirror of the runtime's tracker. It is kept local (rather than imported
8
+ * from @puzzmo-com/clickhouse) so the published SDK pulls in none of the clickhouse package's
9
+ * server deps, and so the public OSS mirror can build the SDK without the private workspace
10
+ * packages present.
11
+ *
12
+ * This file only adds the SDK-specific glue: deciding whether analytics should run,
13
+ * building the context from bootstrap data, and watching for link clicks. Events are
14
+ * never sent from localhost (dev + the SDK simulator).
15
+ */
16
+ export type LinkClickedInfo = {
17
+ href: string;
18
+ text: string;
19
+ target: string;
20
+ };
21
+ type UserType = "anon" | "user" | "paid";
22
+ type RuntimeType = "puzzmo_com" | "iframe" | "simple_embed" | "app_embed" | "ios_native";
23
+ /** Everything the events endpoint needs to attribute an event, mirrors the runtime's context. */
24
+ export type GameAnalyticsContext = {
25
+ gameSlug: string;
26
+ puzzleID: string;
27
+ gameplayOwnerID: string;
28
+ apiRoot: string;
29
+ userType: UserType;
30
+ runtimeType: RuntimeType;
31
+ userID?: string;
32
+ teamSlug?: string;
33
+ partnerSlug?: string;
34
+ dailyDateKey?: string;
35
+ embedID?: string;
36
+ };
37
+ export type GameAnalyticsTracker = {
38
+ /** Map an outgoing host message to its analytics event(s), if any. */
39
+ trackEvent: (type: string, json?: any) => void;
40
+ /** Report an anchor click inside the game. */
41
+ trackLinkClick: (info: LinkClickedInfo) => void;
42
+ };
43
+ /**
44
+ * Build the analytics tracker for a game, or null when analytics shouldn't run
45
+ * (the game doesn't bring its own runtime, no browser, running on localhost, or
46
+ * missing bootstrap data).
47
+ */
48
+ export declare const createGameAnalytics: (readyData: BootstrapGameData | null) => GameAnalyticsTracker | null;
49
+ /** Delegates document clicks to report anchor navigations. Returns a cleanup function. */
50
+ export declare const setupLinkTracking: (onLinkClicked: (info: LinkClickedInfo) => void) => () => void;
51
+ export {};
52
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AACxC,KAAK,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,cAAc,GAAG,WAAW,GAAG,YAAY,CAAA;AAExF,iGAAiG;AACjG,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,sEAAsE;IACtE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC9C,8CAA8C;IAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;CAChD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,sEAW/B,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,gEAkB7B,CAAA"}
@@ -1,4 +1,4 @@
1
- const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6tAAMuy.cjs`),n=[{name:`Puzzmo (light)`,type:`light`,key:`#FFAAAC`,keyFG:`#000000`,keyStrong:`#F7868B`,keyLight:`#FFD2D3`,g_key:`#FFAAAC`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#98B389`,alt2:`#FAC16C`,alt3:`#D298FF`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#FFFFFF`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#F2F2F2`,a_bgAlt:`#ECECEC`,a_puzmo:`#FFC000`,a_headerText:`#000000`,a_table:`#F9F9F9`,a_tableAlt:`#F6F4F4`,a_inlineTag:`#D9D9D9`,a_anchor:`#1F97EE`,a_infoBG:`#FFFFFF`},{name:`Puzzmo (dark)`,type:`dark`,key:`#FFAAAC`,keyFG:`#000000`,keyStrong:`#F7868B`,keyLight:`#FFD2D3`,g_key:`#FFAAAC`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,subBrand:`#FFC000`,subBrandFG:`#000000`,alt1:`#98B389`,alt2:`#FAC16C`,alt3:`#D298FF`,error:`#FF3C3C`,fg:`#ECECEC`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#374351`,g_bgAlt:`#333D49`,g_bgDark:`#2C2F33`,g_textDark:`#F2F2F2`,g_textLight:`#20180E`,g_blank:`#000000`,g_unsolved:`#747474`,g_outline:`#646464`,a_bg:`#141620`,a_bgAlt:`#202433`,a_puzmo:`#FFC000`,a_headerText:`#A1BAD4`,a_table:`#303246`,a_tableAlt:`#393b52`,a_inlineTag:`#ECECEC`,a_anchor:`#1F97EE`,a_infoBG:`#282C3A`},{name:`Foshay`,type:`light`,key:`#98B389`,keyFG:`#313540`,keyStrong:`#87BD69`,keyLight:`#809B77`,g_key:`#98B389`,player:`#3EC0E5`,subBrand:`#FFC000`,subBrandFG:`#000000`,playerFG:`#292B35`,playerLight:`#A8B5D6`,alt1:`#D87DA4`,alt2:`#E3A54F`,alt3:`#D298FF`,error:`#FF3C3C`,fg:`#292B35`,alwaysDark:`#292B35`,alwaysLight:`#D1DBF2`,g_bg:`#949EBA`,g_bgAlt:`#8891AB`,g_bgDark:`#7B839B`,g_textDark:`#292B35`,g_textLight:`#FFFFFF`,g_blank:`#292B35`,g_unsolved:`#B6B7BA`,g_outline:`#676F83`,a_bg:`#828CA3`,a_bgAlt:`#7F889F`,a_puzmo:`#FFC000`,a_headerText:`#292B35`,a_table:`#7A8399`,a_tableAlt:`#767E94`,a_inlineTag:`#ECECEC`,a_anchor:`#56C9E9`,a_infoBG:`#767F95`},{name:`Bright white`,type:`light`,key:`#67ced2`,keyFG:`#000000`,keyStrong:`#26a0a5`,keyLight:`#ade6e9`,g_key:`#67ced2`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#d26767`,alt2:`#fac16c`,alt3:`#7580bd`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#111111`,alwaysLight:`#FFFFFF`,g_bg:`#f6f6f6`,g_bgAlt:`#F4F4F4`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FFFFFF`,a_bgAlt:`#f8fbfc`,a_puzmo:`#FFC000`,a_headerText:`#000000`,a_table:`#EDEDED`,a_tableAlt:`#DBDBDB`,a_inlineTag:`#D9D9D9`,a_anchor:`#1F97EE`,a_infoBG:`#f6f6f6`},{name:`Submersible`,type:`dark`,key:`#CD6DC6`,keyFG:`#031698`,keyStrong:`#FF7ABC`,keyLight:`#B467CB`,g_key:`#CD6DC6`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#4AB1D1`,playerFG:`#071D47`,playerLight:`#3C99D7`,alt1:`#8BA964`,alt2:`#C69A58`,alt3:`#7644B5`,fg:`#FFEBFF`,error:`#FF3C3C`,alwaysDark:`#031698`,alwaysLight:`#FFEBFF`,g_bg:`#043BED`,g_bgAlt:`#0A31CC`,g_bgDark:`#0E2DA8`,g_textDark:`#031698`,g_textLight:`#FFEBFF`,g_blank:`#031698`,g_unsolved:`#3662F1`,g_outline:`#031698`,a_bg:`#043BED`,a_bgAlt:`#0A31CC`,a_puzmo:`#FFC000`,a_headerText:`#FFEBFF`,a_table:`#043BED`,a_tableAlt:`#0A31CC`,a_inlineTag:`#FF7ABC`,a_anchor:`#FF7ABC`,a_infoBG:`#0A31CC`},{name:`Hot Dog (beta)`,type:`light`,key:`#FFFF00`,keyFG:`#000000`,keyStrong:`#FFE600`,keyLight:`#FFEC44`,g_key:`#FFFF00`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#FF7A00`,playerFG:`#000000`,playerLight:`#FFA450`,alt1:`#3ABC5E`,alt2:`#5C3ABC`,alt3:`#BC3AAF`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#EBFF00`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FF0000`,a_bgAlt:`#E50000`,a_puzmo:`#FFC000`,a_headerText:`#FFFFFF`,a_table:`#E50000`,a_tableAlt:`#FF2525`,a_inlineTag:`#000000`,a_anchor:`#000000`,a_infoBG:`#C6C6C6`},{name:`Outlook Hayesy (beta)`,type:`light`,key:`#DAB98C`,keyFG:`#000000`,keyStrong:`#B99368`,keyLight:`#DAB98C`,subBrand:`#FFC000`,subBrandFG:`#000000`,g_key:`#DAB98C`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#5EC386`,alt2:`#5E93C3`,alt3:`#C35E5E`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#5E390F`,alwaysLight:`#FFF3E4`,g_bg:`#FFFFFF`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FEF5E8`,a_bgAlt:`#ffffff`,a_puzmo:`#FAC7CE`,a_headerText:`#000000`,a_table:`#FAE8D3`,a_tableAlt:`#EED7BC`,a_inlineTag:`#D9D9D9`,a_anchor:`#B99368`,a_infoBG:`#FFFFFF`},{name:`Console (beta)`,type:`dark`,key:`#957df9`,keyFG:`#000000`,keyStrong:`#590FF5`,keyLight:`#590FF5`,subBrand:`#FFC000`,subBrandFG:`#000000`,g_key:`#FFFF00`,player:`#ffffff`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#590ff5`,alt2:`#00e200`,alt3:`#ff8a02`,fg:`#00e200`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#00e200`,g_bg:`#101428`,g_bgAlt:`#101428`,g_bgDark:`#00e200`,g_textDark:`#00e200`,g_textLight:`#590ff5`,g_blank:`#00e200`,g_unsolved:`#0000ff`,g_outline:`#00e200`,a_bg:`#000000`,a_bgAlt:`#112211`,a_puzmo:`#ffffff`,a_headerText:`#00e200`,a_table:`#000000`,a_tableAlt:`#002200`,a_inlineTag:`#D9D9D9`,a_anchor:`#957df9`,a_infoBG:`#001900`}];var r={collapsed:`simulator-collapsed`,tab:`simulator-tab`,theme:`simulator-theme`,fixtureCategory:`simulator-fixture-category`,fixturePuzzle:`simulator-fixture-puzzle`,renderHost:`simulator-render-host`,renderContext:`simulator-render-context`};function i(){let e=localStorage.getItem(r.theme);if(e){let t=n.find(t=>t.name===e);if(t)return t}return n[0]}function a(e){var t;let n=localStorage.getItem(r.tab);return n&&e.includes(n)?n:(t=e[0])==null?`ctrl`:t}function o(e){let t=localStorage.getItem(r.collapsed);return t===null?e:t===`true`}function s(){let e=localStorage.getItem(r.renderHost);return e&&[`game`,`app`,`opengraph`].includes(e)?e:`game`}function c(){let e=localStorage.getItem(r.renderContext);if(e&&[`preview`,`share`,`completed`,`timeline`].includes(e))return e}function l(e,t,n){var l,u;let d=localStorage.getItem(r.fixtureCategory),f=localStorage.getItem(r.fixturePuzzle);return{isCollapsed:o((l=e.collapsed)==null?!0:l),isPaused:!1,hasStarted:!1,activeTab:a(n),puzzleData:null,originalPuzzle:``,currentInputStr:``,completionData:null,selectedTheme:i(),selectedCategory:d&&t.includes(d)?d:(u=t[0])==null?null:u,selectedPuzzle:f==null?null:f,renderHost:s(),renderContext:c()}}function u(e){localStorage.setItem(r.collapsed,String(e))}function d(e){localStorage.setItem(r.tab,e)}function f(e){localStorage.setItem(r.theme,e)}function p(e){localStorage.setItem(r.fixtureCategory,e)}function m(e){localStorage.setItem(r.fixturePuzzle,e)}function h(){localStorage.removeItem(r.fixturePuzzle)}function g(e){e?localStorage.setItem(r.renderHost,e):localStorage.removeItem(r.renderHost)}function _(e){e?localStorage.setItem(r.renderContext,e):localStorage.removeItem(r.renderContext)}function ee(e){let t=[];return{log(n,r,i){let a={type:n,data:r,time:new Date().toLocaleTimeString(`en-US`,{hour12:!1,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),direction:i};t.push(a),t.length>100&&t.shift(),e==null||e(a)},clear(){t.length=0},getLog(){return t}}}function te(e,t,n){console.log(`Simulator sending:`,e,t),n==null||n.log(e,t,`out`),window.postMessage({type:e,data:t},`*`)}function ne(e,t){let n=n=>{var r,i,a;if(!(!(n==null||(r=n.data)==null)&&r.type))return;let o=n.data.type,s=(i=(a=n.data.data)==null?n.data.json:a)==null?{}:i;[`TIMER_TICK`,`TIMER_SYNC`].includes(o)||t==null||t.log(o,s,`in`),e(o,s)};return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}function v(e){let t=new Map;console.log(`Simulator: Parsing fixtures`,Object.keys(e));for(let[o,s]of Object.entries(e)){var n,r,i,a;let e=o.split(`/`),c=(n=(r=e.pop())==null?void 0:r.replace(/\.[^.]+$/,``))==null?``:n,l=(i=e.pop())==null?`default`:i;t.has(l)||t.set(l,new Map);let u=(a=s.default)==null?s:a;t.get(l).set(c,u)}return t.forEach((e,n)=>{let r=new Map(Array.from(e.entries()).sort((e,t)=>{var n,r,i,a;return parseInt((n=(r=e[0].match(/\d+/))==null?void 0:r[0])==null?`0`:n)-parseInt((i=(a=t[0].match(/\d+/))==null?void 0:a[0])==null?`0`:i)}));t.set(n,r)}),t}function y(e,t){return e.length===0?``:`
1
+ const e=require(`./objectSpread2-CuluYLUL.cjs`),t=require(`./asyncToGenerator-DANjdFmB.cjs`),n=[{name:`Puzzmo (light)`,type:`light`,key:`#FFAAAC`,keyFG:`#000000`,keyStrong:`#F7868B`,keyLight:`#FFD2D3`,g_key:`#FFAAAC`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#98B389`,alt2:`#FAC16C`,alt3:`#D298FF`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#FFFFFF`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#F2F2F2`,a_bgAlt:`#ECECEC`,a_puzmo:`#FFC000`,a_headerText:`#000000`,a_table:`#F9F9F9`,a_tableAlt:`#F6F4F4`,a_inlineTag:`#D9D9D9`,a_anchor:`#1F97EE`,a_infoBG:`#FFFFFF`},{name:`Puzzmo (dark)`,type:`dark`,key:`#FFAAAC`,keyFG:`#000000`,keyStrong:`#F7868B`,keyLight:`#FFD2D3`,g_key:`#FFAAAC`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,subBrand:`#FFC000`,subBrandFG:`#000000`,alt1:`#98B389`,alt2:`#FAC16C`,alt3:`#D298FF`,error:`#FF3C3C`,fg:`#ECECEC`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#374351`,g_bgAlt:`#333D49`,g_bgDark:`#2C2F33`,g_textDark:`#F2F2F2`,g_textLight:`#20180E`,g_blank:`#000000`,g_unsolved:`#747474`,g_outline:`#646464`,a_bg:`#141620`,a_bgAlt:`#202433`,a_puzmo:`#FFC000`,a_headerText:`#A1BAD4`,a_table:`#303246`,a_tableAlt:`#393b52`,a_inlineTag:`#ECECEC`,a_anchor:`#1F97EE`,a_infoBG:`#282C3A`},{name:`Foshay`,type:`light`,key:`#98B389`,keyFG:`#313540`,keyStrong:`#87BD69`,keyLight:`#809B77`,g_key:`#98B389`,player:`#3EC0E5`,subBrand:`#FFC000`,subBrandFG:`#000000`,playerFG:`#292B35`,playerLight:`#A8B5D6`,alt1:`#D87DA4`,alt2:`#E3A54F`,alt3:`#D298FF`,error:`#FF3C3C`,fg:`#292B35`,alwaysDark:`#292B35`,alwaysLight:`#D1DBF2`,g_bg:`#949EBA`,g_bgAlt:`#8891AB`,g_bgDark:`#7B839B`,g_textDark:`#292B35`,g_textLight:`#FFFFFF`,g_blank:`#292B35`,g_unsolved:`#B6B7BA`,g_outline:`#676F83`,a_bg:`#828CA3`,a_bgAlt:`#7F889F`,a_puzmo:`#FFC000`,a_headerText:`#292B35`,a_table:`#7A8399`,a_tableAlt:`#767E94`,a_inlineTag:`#ECECEC`,a_anchor:`#56C9E9`,a_infoBG:`#767F95`},{name:`Bright white`,type:`light`,key:`#67ced2`,keyFG:`#000000`,keyStrong:`#26a0a5`,keyLight:`#ade6e9`,g_key:`#67ced2`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#d26767`,alt2:`#fac16c`,alt3:`#7580bd`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#111111`,alwaysLight:`#FFFFFF`,g_bg:`#f6f6f6`,g_bgAlt:`#F4F4F4`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FFFFFF`,a_bgAlt:`#f8fbfc`,a_puzmo:`#FFC000`,a_headerText:`#000000`,a_table:`#EDEDED`,a_tableAlt:`#DBDBDB`,a_inlineTag:`#D9D9D9`,a_anchor:`#1F97EE`,a_infoBG:`#f6f6f6`},{name:`Submersible`,type:`dark`,key:`#CD6DC6`,keyFG:`#031698`,keyStrong:`#FF7ABC`,keyLight:`#B467CB`,g_key:`#CD6DC6`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#4AB1D1`,playerFG:`#071D47`,playerLight:`#3C99D7`,alt1:`#8BA964`,alt2:`#C69A58`,alt3:`#7644B5`,fg:`#FFEBFF`,error:`#FF3C3C`,alwaysDark:`#031698`,alwaysLight:`#FFEBFF`,g_bg:`#043BED`,g_bgAlt:`#0A31CC`,g_bgDark:`#0E2DA8`,g_textDark:`#031698`,g_textLight:`#FFEBFF`,g_blank:`#031698`,g_unsolved:`#3662F1`,g_outline:`#031698`,a_bg:`#043BED`,a_bgAlt:`#0A31CC`,a_puzmo:`#FFC000`,a_headerText:`#FFEBFF`,a_table:`#043BED`,a_tableAlt:`#0A31CC`,a_inlineTag:`#FF7ABC`,a_anchor:`#FF7ABC`,a_infoBG:`#0A31CC`},{name:`Hot Dog (beta)`,type:`light`,key:`#FFFF00`,keyFG:`#000000`,keyStrong:`#FFE600`,keyLight:`#FFEC44`,g_key:`#FFFF00`,subBrand:`#FFC000`,subBrandFG:`#000000`,player:`#FF7A00`,playerFG:`#000000`,playerLight:`#FFA450`,alt1:`#3ABC5E`,alt2:`#5C3ABC`,alt3:`#BC3AAF`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#FFFFFF`,g_bg:`#EBFF00`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FF0000`,a_bgAlt:`#E50000`,a_puzmo:`#FFC000`,a_headerText:`#FFFFFF`,a_table:`#E50000`,a_tableAlt:`#FF2525`,a_inlineTag:`#000000`,a_anchor:`#000000`,a_infoBG:`#C6C6C6`},{name:`Outlook Hayesy`,type:`light`,key:`#DAB98C`,keyFG:`#000000`,keyStrong:`#B99368`,keyLight:`#DAB98C`,subBrand:`#FFC000`,subBrandFG:`#000000`,g_key:`#DAB98C`,player:`#5DBAFC`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#5EC386`,alt2:`#5E93C3`,alt3:`#C35E5E`,fg:`#000000`,error:`#FF3C3C`,alwaysDark:`#5E390F`,alwaysLight:`#FFF3E4`,g_bg:`#FFFFFF`,g_bgAlt:`#EBEBEB`,g_bgDark:`#D6D6D6`,g_textDark:`#1B1B28`,g_textLight:`#FFFFFF`,g_blank:`#000000`,g_unsolved:`#C2C2C2`,g_outline:`#1B1D29`,a_bg:`#FEF5E8`,a_bgAlt:`#ffffff`,a_puzmo:`#FAC7CE`,a_headerText:`#000000`,a_table:`#FAE8D3`,a_tableAlt:`#EED7BC`,a_inlineTag:`#D9D9D9`,a_anchor:`#B99368`,a_infoBG:`#FFFFFF`},{name:`Console (beta)`,type:`dark`,key:`#957df9`,keyFG:`#000000`,keyStrong:`#590FF5`,keyLight:`#590FF5`,subBrand:`#FFC000`,subBrandFG:`#000000`,g_key:`#FFFF00`,player:`#ffffff`,playerFG:`#000000`,playerLight:`#9EDDFF`,alt1:`#590ff5`,alt2:`#00e200`,alt3:`#ff8a02`,fg:`#00e200`,error:`#FF3C3C`,alwaysDark:`#1B1D29`,alwaysLight:`#00e200`,g_bg:`#101428`,g_bgAlt:`#101428`,g_bgDark:`#00e200`,g_textDark:`#00e200`,g_textLight:`#590ff5`,g_blank:`#00e200`,g_unsolved:`#0000ff`,g_outline:`#00e200`,a_bg:`#000000`,a_bgAlt:`#112211`,a_puzmo:`#ffffff`,a_headerText:`#00e200`,a_table:`#000000`,a_tableAlt:`#002200`,a_inlineTag:`#D9D9D9`,a_anchor:`#957df9`,a_infoBG:`#001900`}];var r={collapsed:`simulator-collapsed`,tab:`simulator-tab`,theme:`simulator-theme`,fixtureCategory:`simulator-fixture-category`,fixturePuzzle:`simulator-fixture-puzzle`,renderHost:`simulator-render-host`,renderContext:`simulator-render-context`,gameSettings:`simulator-game-settings`};function i(){let e=localStorage.getItem(r.gameSettings);if(!e)return{};try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch(e){}return{}}function a(){let e=localStorage.getItem(r.theme);if(e){let t=n.find(t=>t.name===e);if(t)return t}return n[0]}function o(e){var t;let n=localStorage.getItem(r.tab);return n&&e.includes(n)?n:(t=e[0])==null?`ctrl`:t}function s(e){let t=localStorage.getItem(r.collapsed);return t===null?e:t===`true`}function c(){let e=localStorage.getItem(r.renderHost);return e&&[`game`,`app`,`opengraph`].includes(e)?e:`game`}function l(){let e=localStorage.getItem(r.renderContext);if(e&&[`preview`,`share`,`completed`,`timeline`].includes(e))return e}function u(e,t,n){var u,d;let f=localStorage.getItem(r.fixtureCategory),p=localStorage.getItem(r.fixturePuzzle);return{isCollapsed:s((u=e.collapsed)==null?!0:u),isPaused:!1,hasStarted:!1,activeTab:o(n),puzzleData:null,originalPuzzle:``,currentInputStr:``,completionData:null,selectedTheme:a(),selectedCategory:f&&t.includes(f)?f:(d=t[0])==null?null:d,selectedPuzzle:p==null?null:p,renderHost:c(),renderContext:l(),gameSettings:i(),settingsComponents:null}}function d(e){localStorage.setItem(r.gameSettings,JSON.stringify(e))}function f(){localStorage.removeItem(r.gameSettings)}function p(e){localStorage.setItem(r.collapsed,String(e))}function m(e){localStorage.setItem(r.tab,e)}function h(e){localStorage.setItem(r.theme,e)}function g(e){localStorage.setItem(r.fixtureCategory,e)}function _(e){localStorage.setItem(r.fixturePuzzle,e)}function ee(){localStorage.removeItem(r.fixturePuzzle)}function v(e){e?localStorage.setItem(r.renderHost,e):localStorage.removeItem(r.renderHost)}function y(e){e?localStorage.setItem(r.renderContext,e):localStorage.removeItem(r.renderContext)}function te(e){let t=[];return{log(n,r,i){let a={type:n,data:r,time:new Date().toLocaleTimeString(`en-US`,{hour12:!1,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),direction:i};t.push(a),t.length>100&&t.shift(),e==null||e(a)},clear(){t.length=0},getLog(){return t}}}function ne(e,t,n){console.log(`Simulator sending:`,e,t),n==null||n.log(e,t,`out`),window.postMessage({type:e,data:t},`*`)}function re(e,t){let n=n=>{var r,i,a;if(!(!(n==null||(r=n.data)==null)&&r.type))return;let o=n.data.type,s=(i=(a=n.data.data)==null?n.data.json:a)==null?{}:i;[`TIMER_TICK`,`TIMER_SYNC`].includes(o)||t==null||t.log(o,s,`in`),e(o,s)};return window.addEventListener(`message`,n),()=>window.removeEventListener(`message`,n)}function ie(e){let t=new Map;console.log(`Simulator: Parsing fixtures`,Object.keys(e));for(let[o,s]of Object.entries(e)){var n,r,i,a;let e=o.split(`/`),c=(n=(r=e.pop())==null?void 0:r.replace(/\.[^.]+$/,``))==null?``:n,l=(i=e.pop())==null?`default`:i;t.has(l)||t.set(l,new Map);let u=(a=s.default)==null?s:a;t.get(l).set(c,u)}return t.forEach((e,n)=>{let r=new Map(Array.from(e.entries()).sort((e,t)=>{var n,r,i,a;return parseInt((n=(r=e[0].match(/\d+/))==null?void 0:r[0])==null?`0`:n)-parseInt((i=(a=t[0].match(/\d+/))==null?void 0:a[0])==null?`0`:i)}));t.set(n,r)}),t}function b(e,t){return e.length===0?``:`
2
2
  <div class="simulator-fixtures">
3
3
  <div class="simulator-field">
4
4
  <label class="simulator-label">Category</label>
@@ -11,7 +11,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
11
11
  <select class="simulator-select" id="simulator-fixture-puzzle"></select>
12
12
  </div>
13
13
  </div>
14
- `}function b(e,t,n,r){let i=t.get(n);if(!i)return null;let a=Array.from(i.keys()),o=r;if(!r||!i.has(r)){var s;o=(s=a[0])==null?null:s}return e.innerHTML=a.map(e=>`<option value="${e}" ${e===o?`selected`:``}>${e}</option>`).join(``),o}function x(e,t,n){var r,i;return!t||!n||(r=(i=e.get(t))==null?void 0:i.get(n))==null?null:r}function re(){return{id:`ctrl`,label:`Ctrl`,render(){return`
14
+ `}function x(e,t,n,r){let i=t.get(n);if(!i)return null;let a=Array.from(i.keys()),o=r;if(!r||!i.has(r)){var s;o=(s=a[0])==null?null:s}return e.innerHTML=a.map(e=>`<option value="${e}" ${e===o?`selected`:``}>${e}</option>`).join(``),o}function S(e,t,n){var r,i;return!t||!n||(r=(i=e.get(t))==null?void 0:i.get(n))==null?null:r}function ae(){return{id:`ctrl`,label:`Ctrl`,render(){return`
15
15
  <div id="simulator-fixtures-container"></div>
16
16
  <div id="simulator-status">
17
17
  <span class="indicator waiting"></span>
@@ -24,7 +24,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
24
24
  <div class="simulator-row">
25
25
  <button class="simulator-btn danger" id="simulator-retry" disabled>Retry</button>
26
26
  </div>
27
- `},bind(e){let t=e.getElement(`#simulator-start`),n=e.getElement(`#simulator-pause`),r=e.getElement(`#simulator-retry`),i=e.getElement(`#simulator-fixtures-container`);if(console.log(`Simulator: CtrlView.bind called`,{hasFixtures:!!e.fixtures,categories:e.fixtureCategories,selectedCategory:e.state.selectedCategory,selectedPuzzle:e.state.selectedPuzzle}),e.fixtures&&e.fixtureCategories.length>0&&i){i.innerHTML=y(e.fixtureCategories,e.state.selectedCategory);let t=e.getElement(`#simulator-fixture-category`),n=e.getElement(`#simulator-fixture-puzzle`);if(t&&n&&e.state.selectedCategory){e.state.selectedPuzzle=b(n,e.fixtures,e.state.selectedCategory,e.state.selectedPuzzle);let r=x(e.fixtures,e.state.selectedCategory,e.state.selectedPuzzle);console.log(`Simulator: Loading fixture puzzle`,{category:e.state.selectedCategory,puzzle:e.state.selectedPuzzle,hasPuzzleData:!!r}),r&&(e.state.puzzleData=r,e.state.originalPuzzle=r,e.state.selectedCategory&&p(e.state.selectedCategory),e.state.selectedPuzzle&&m(e.state.selectedPuzzle)),t.addEventListener(`change`,()=>{console.log(`Simulator: Category changed, reloading...`,t.value),p(t.value),h(),window.location.reload()}),n.addEventListener(`change`,()=>{console.log(`Simulator: Puzzle changed, reloading...`,n.value),m(n.value),window.location.reload()})}}t==null||t.addEventListener(`click`,()=>{e.state.isPaused?(e.sendToGame(`RESUME_GAME`,{}),e.state.isPaused=!1,n&&(n.textContent=`Pause`),e.updateStatus(`Running`,`ready`)):(e.sendToGame(`START_GAME`,void 0),e.state.hasStarted=!0,n&&(n.disabled=!1),t&&(t.textContent=`Resume`),e.updateStatus(`Running`,`ready`))}),n==null||n.addEventListener(`click`,()=>{e.state.isPaused?(e.sendToGame(`RESUME_GAME`,{}),e.state.isPaused=!1,n.textContent=`Pause`,e.updateStatus(`Running`,`ready`)):(e.sendToGame(`PAUSE_GAME`,{}),e.state.isPaused=!0,n.textContent=`Resume`,e.updateStatus(`Paused`,`paused`))}),r==null||r.addEventListener(`click`,()=>{e.sendToGame(`RETRY_PUZZLE`,{}),e.state.hasStarted=!1,e.state.isPaused=!1,n&&(n.disabled=!0,n.textContent=`Pause`),t&&(t.textContent=`Start`),e.updateStatus(`Ready to retry`,`ready`)})},onMessage(e,t,n){let r=n.getElement(`#simulator-start`),i=n.getElement(`#simulator-pause`),a=n.getElement(`#simulator-retry`);e===`READY_GAME_LOADED`&&(r&&(r.disabled=!1),a&&(a.disabled=!1),n.updateStatus(`Ready`,`ready`)),e===`GAME_COMPLETED`&&(n.state.hasStarted=!1,i&&(i.disabled=!0),r&&(r.disabled=!0),n.updateStatus(`Completed!`,`complete`))}}}var S=`simulator-saved-states`;function C(){let e=globalThis;for(let t of Object.keys(e))if(t.endsWith(`Thumbnail`)&&typeof e[t]==`function`)return{name:t,fn:e[t]};return null}function w(e,t){let n=C();if(!n)return``;try{var r;let i=(r=e.state.puzzleData)==null?``:r,a={viewerIsOwner:!0,theme:e.state.selectedTheme,strict:!0,renderHost:`game`};return n.fn(i,t,a)}catch(e){return``}}var T=[];function E(e,t=8){let n=14*t+8+4;e.style.height=`auto`;let r=Math.min(Math.max(e.scrollHeight,40),n);e.style.height=`${r}px`}function ie(){let e=``,t=``;return{id:`data`,label:`Data`,render(){return`
27
+ `},bind(e){let t=e.getElement(`#simulator-start`),n=e.getElement(`#simulator-pause`),r=e.getElement(`#simulator-retry`),i=e.getElement(`#simulator-fixtures-container`);if(console.log(`Simulator: CtrlView.bind called`,{hasFixtures:!!e.fixtures,categories:e.fixtureCategories,selectedCategory:e.state.selectedCategory,selectedPuzzle:e.state.selectedPuzzle}),e.fixtures&&e.fixtureCategories.length>0&&i){i.innerHTML=b(e.fixtureCategories,e.state.selectedCategory);let t=e.getElement(`#simulator-fixture-category`),n=e.getElement(`#simulator-fixture-puzzle`);if(t&&n&&e.state.selectedCategory){e.state.selectedPuzzle=x(n,e.fixtures,e.state.selectedCategory,e.state.selectedPuzzle);let r=S(e.fixtures,e.state.selectedCategory,e.state.selectedPuzzle);console.log(`Simulator: Loading fixture puzzle`,{category:e.state.selectedCategory,puzzle:e.state.selectedPuzzle,hasPuzzleData:!!r}),r&&(e.state.puzzleData=r,e.state.originalPuzzle=r,e.state.selectedCategory&&g(e.state.selectedCategory),e.state.selectedPuzzle&&_(e.state.selectedPuzzle)),t.addEventListener(`change`,()=>{console.log(`Simulator: Category changed, reloading...`,t.value),g(t.value),ee(),window.location.reload()}),n.addEventListener(`change`,()=>{console.log(`Simulator: Puzzle changed, reloading...`,n.value),_(n.value),window.location.reload()})}}t==null||t.addEventListener(`click`,()=>{e.state.isPaused?(e.sendToGame(`RESUME_GAME`,{}),e.state.isPaused=!1,n&&(n.textContent=`Pause`),e.updateStatus(`Running`,`ready`)):(e.sendToGame(`START_GAME`,void 0),e.state.hasStarted=!0,n&&(n.disabled=!1),t&&(t.textContent=`Resume`),e.updateStatus(`Running`,`ready`))}),n==null||n.addEventListener(`click`,()=>{e.state.isPaused?(e.sendToGame(`RESUME_GAME`,{}),e.state.isPaused=!1,n.textContent=`Pause`,e.updateStatus(`Running`,`ready`)):(e.sendToGame(`PAUSE_GAME`,{}),e.state.isPaused=!0,n.textContent=`Resume`,e.updateStatus(`Paused`,`paused`))}),r==null||r.addEventListener(`click`,()=>{e.sendToGame(`RETRY_PUZZLE`,{}),e.state.hasStarted=!1,e.state.isPaused=!1,n&&(n.disabled=!0,n.textContent=`Pause`),t&&(t.textContent=`Start`),e.updateStatus(`Ready to retry`,`ready`)})},onMessage(e,t,n){let r=n.getElement(`#simulator-start`),i=n.getElement(`#simulator-pause`),a=n.getElement(`#simulator-retry`);e===`READY_GAME_LOADED`&&(r&&(r.disabled=!1),a&&(a.disabled=!1),n.updateStatus(`Ready`,`ready`)),e===`GAME_COMPLETED`&&(n.state.hasStarted=!1,i&&(i.disabled=!0),r&&(r.disabled=!0),n.updateStatus(`Completed!`,`complete`))}}}var C=`simulator-saved-states`;function w(){let e=globalThis;for(let t of Object.keys(e))if(t.endsWith(`Thumbnail`)&&typeof e[t]==`function`)return{name:t,fn:e[t]};return null}function T(e,t){let n=w();if(!n)return``;try{var r;let i=(r=e.state.puzzleData)==null?``:r,a={viewerIsOwner:!0,theme:e.state.selectedTheme,strict:!0,renderHost:`game`};return n.fn(i,t,a)}catch(e){return``}}var E=[];function D(e,t=8){let n=14*t+8+4;e.style.height=`auto`;let r=Math.min(Math.max(e.scrollHeight,40),n);e.style.height=`${r}px`}function oe(){let e=``,t=``;return{id:`data`,label:`Data`,render(){return`
28
28
  <div class="data-view-container">
29
29
  <div class="data-subtabs">
30
30
  <button class="data-subtab active" data-subtab="edit">Edit</button>
@@ -73,22 +73,22 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
73
73
  </div>
74
74
  </div>
75
75
  </div>
76
- `},bind(n){let r=n.getElement(`.data-subtabs`);r==null||r.querySelectorAll(`.data-subtab`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-subtab`);if(!t)return;r.querySelectorAll(`.data-subtab`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`);let i=n.getElement(`.data-view-container`);i==null||i.querySelectorAll(`.data-subtab-content`).forEach(e=>{e.classList.toggle(`active`,e.id===`data-subtab-${t}`)}),t===`edit`?j(n):t===`history`?O(n):t===`saves`&&k(n)})});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`);setTimeout(()=>{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))},0),i==null||i.addEventListener(`input`,()=>{E(i);let t=i.value!==e;s&&(s.disabled=!t)}),a==null||a.addEventListener(`input`,()=>{E(a);let e=a.value!==t;l&&(l.disabled=!e)}),o==null||o.addEventListener(`click`,()=>{i&&(i.value=n.state.originalPuzzle,e=n.state.originalPuzzle,E(i),s&&(s.disabled=!0))}),s==null||s.addEventListener(`click`,()=>{i&&(n.state.puzzleData=i.value,n.state.originalPuzzle=i.value,e=i.value,n.sendToGame(`RETRY_PUZZLE`,{}),n.state.hasStarted=!1,n.state.isPaused=!1,d&&(d.disabled=!0,d.textContent=`Pause`),u&&(u.textContent=`Start`),n.updateStatus(`Puzzle updated`,`ready`),s.disabled=!0)}),c==null||c.addEventListener(`click`,()=>{a&&(a.value=t,E(a),l&&(l.disabled=!0))}),l==null||l.addEventListener(`click`,()=>{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)});let f=n.getElement(`#simulator-history-clear`);f==null||f.addEventListener(`click`,()=>{T=[],O(n)});let p=n.getElement(`#simulator-save-name`),m=n.getElement(`#simulator-save-btn`);m==null||m.addEventListener(`click`,()=>{if(!p||!p.value.trim())return;let e=D(),t={name:p.value.trim(),puzzleStr:n.state.originalPuzzle,inputStr:n.state.currentInputStr,timestamp:Date.now()};e.push(t),localStorage.setItem(S,JSON.stringify(e)),p.value=``,k(n)}),k(n)},onActivate(n){e=n.state.originalPuzzle,t=n.state.currentInputStr,j(n),O(n)},onMessage(e,n,r){var i,a;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;if(e===`UPLOAD_NEW_GAME_STATE`&&c){if(r.state.currentInputStr=c,T.length===0||T[T.length-1].value!==c){T.push({value:c,timestamp:Date.now()}),T.length>100&&(T=T.slice(-100));let e=r.getElement(`#data-subtab-history`);e!=null&&e.classList.contains(`active`)&&O(r)}o&&(o.value=r.state.currentInputStr,t=r.state.currentInputStr,E(o),s&&(s.disabled=!0))}}}}function D(){try{let e=localStorage.getItem(S);return e?JSON.parse(e):[]}catch(e){return[]}}function O(e){let t=e.getElement(`#simulator-history-list`);if(t){if(t.style.setProperty(`--history-thumb-bg`,e.state.selectedTheme.a_bg),T.length===0){t.innerHTML=`<div class="simulator-empty">No history yet</div>`;return}t.innerHTML=[...T].reverse().map((t,n)=>{let r=T.length-1-n,i=new Date(t.timestamp).toLocaleTimeString(),a=t.value.length>60?t.value.slice(0,60)+`...`:t.value;return`
76
+ `},bind(n){let r=n.getElement(`.data-subtabs`);r==null||r.querySelectorAll(`.data-subtab`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-subtab`);if(!t)return;r.querySelectorAll(`.data-subtab`).forEach(e=>e.classList.remove(`active`)),e.classList.add(`active`);let i=n.getElement(`.data-view-container`);i==null||i.querySelectorAll(`.data-subtab-content`).forEach(e=>{e.classList.toggle(`active`,e.id===`data-subtab-${t}`)}),t===`edit`?M(n):t===`history`?k(n):t===`saves`&&A(n)})});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`);setTimeout(()=>{i&&n.state.originalPuzzle&&(i.value=n.state.originalPuzzle,e=n.state.originalPuzzle,D(i)),a&&n.state.currentInputStr&&(a.value=n.state.currentInputStr,t=n.state.currentInputStr,D(a))},0),i==null||i.addEventListener(`input`,()=>{D(i);let t=i.value!==e;s&&(s.disabled=!t)}),a==null||a.addEventListener(`input`,()=>{D(a);let e=a.value!==t;l&&(l.disabled=!e)}),o==null||o.addEventListener(`click`,()=>{i&&(i.value=n.state.originalPuzzle,e=n.state.originalPuzzle,D(i),s&&(s.disabled=!0))}),s==null||s.addEventListener(`click`,()=>{i&&(n.state.puzzleData=i.value,n.state.originalPuzzle=i.value,e=i.value,n.sendToGame(`RETRY_PUZZLE`,{}),n.state.hasStarted=!1,n.state.isPaused=!1,d&&(d.disabled=!0,d.textContent=`Pause`),u&&(u.textContent=`Start`),n.updateStatus(`Puzzle updated`,`ready`),s.disabled=!0)}),c==null||c.addEventListener(`click`,()=>{a&&(a.value=t,D(a),l&&(l.disabled=!0))}),l==null||l.addEventListener(`click`,()=>{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)});let f=n.getElement(`#simulator-history-clear`);f==null||f.addEventListener(`click`,()=>{E=[],k(n)});let p=n.getElement(`#simulator-save-name`),m=n.getElement(`#simulator-save-btn`);m==null||m.addEventListener(`click`,()=>{if(!p||!p.value.trim())return;let e=O(),t={name:p.value.trim(),puzzleStr:n.state.originalPuzzle,inputStr:n.state.currentInputStr,timestamp:Date.now()};e.push(t),localStorage.setItem(C,JSON.stringify(e)),p.value=``,A(n)}),A(n)},onActivate(n){e=n.state.originalPuzzle,t=n.state.currentInputStr,M(n),k(n)},onMessage(e,n,r){var i,a;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;if(e===`UPLOAD_NEW_GAME_STATE`&&c){if(r.state.currentInputStr=c,E.length===0||E[E.length-1].value!==c){E.push({value:c,timestamp:Date.now()}),E.length>100&&(E=E.slice(-100));let e=r.getElement(`#data-subtab-history`);e!=null&&e.classList.contains(`active`)&&k(r)}o&&(o.value=r.state.currentInputStr,t=r.state.currentInputStr,D(o),s&&(s.disabled=!0))}}}}function O(){try{let e=localStorage.getItem(C);return e?JSON.parse(e):[]}catch(e){return[]}}function k(e){let t=e.getElement(`#simulator-history-list`);if(t){if(t.style.setProperty(`--history-thumb-bg`,e.state.selectedTheme.a_bg),E.length===0){t.innerHTML=`<div class="simulator-empty">No history yet</div>`;return}t.innerHTML=[...E].reverse().map((t,n)=>{let r=E.length-1-n,i=new Date(t.timestamp).toLocaleTimeString(),a=t.value.length>60?t.value.slice(0,60)+`...`:t.value;return`
77
77
  <div class="history-item" data-history-idx="${r}">
78
- <div class="history-item-thumb">${w(e,t.value)}</div>
78
+ <div class="history-item-thumb">${T(e,t.value)}</div>
79
79
  <div class="history-item-content">
80
80
  <div class="history-item-header">
81
81
  <span class="history-item-num">#${r+1}</span>
82
82
  <span class="history-item-time">${i}</span>
83
83
  <button class="simulator-btn tiny history-restore-btn" data-history-idx="${r}">Restore</button>
84
84
  </div>
85
- <div class="history-item-preview">${A(a)}</div>
85
+ <div class="history-item-preview">${j(a)}</div>
86
86
  </div>
87
87
  </div>
88
- `}).join(``),t.querySelectorAll(`.history-restore-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let n=parseInt(t.target.getAttribute(`data-history-idx`)||`0`),r=T[n];if(r){e.state.currentInputStr=r.value;let t=e.getElement(`#simulator-input`);t&&(t.value=r.value,E(t)),e.updateStatus(`Input restored from history`,`ready`);let n=e.getElement(`.data-subtab[data-subtab="edit"]`);n==null||n.click()}})})}}function k(e){let t=e.getElement(`#simulator-saves-list`);if(!t)return;let n=D();if(n.length===0){t.innerHTML=`<div class="simulator-empty">No saved states</div>`;return}t.innerHTML=[...n].reverse().map((e,t)=>{let r=n.length-1-t,i=new Date(e.timestamp).toLocaleDateString(),a=new Date(e.timestamp).toLocaleTimeString();return`
88
+ `}).join(``),t.querySelectorAll(`.history-restore-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let n=parseInt(t.target.getAttribute(`data-history-idx`)||`0`),r=E[n];if(r){e.state.currentInputStr=r.value;let t=e.getElement(`#simulator-input`);t&&(t.value=r.value,D(t)),e.updateStatus(`Input restored from history`,`ready`);let n=e.getElement(`.data-subtab[data-subtab="edit"]`);n==null||n.click()}})})}}function A(e){let t=e.getElement(`#simulator-saves-list`);if(!t)return;let n=O();if(n.length===0){t.innerHTML=`<div class="simulator-empty">No saved states</div>`;return}t.innerHTML=[...n].reverse().map((e,t)=>{let r=n.length-1-t,i=new Date(e.timestamp).toLocaleDateString(),a=new Date(e.timestamp).toLocaleTimeString();return`
89
89
  <div class="save-item">
90
90
  <div class="save-item-header">
91
- <span class="save-item-name">${A(e.name)}</span>
91
+ <span class="save-item-name">${j(e.name)}</span>
92
92
  <span class="save-item-time">${i} ${a}</span>
93
93
  </div>
94
94
  <div class="save-item-actions">
@@ -96,7 +96,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
96
96
  <button class="simulator-btn tiny danger save-delete-btn" data-save-idx="${r}">Delete</button>
97
97
  </div>
98
98
  </div>
99
- `}).join(``),t.querySelectorAll(`.save-load-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let r=n[parseInt(t.target.getAttribute(`data-save-idx`)||`0`)];if(r){e.state.puzzleData=r.puzzleStr,e.state.originalPuzzle=r.puzzleStr,e.state.currentInputStr=r.inputStr;let t=e.getElement(`#simulator-puzzle`),n=e.getElement(`#simulator-input`);t&&(t.value=r.puzzleStr,E(t)),n&&(n.value=r.inputStr,E(n)),e.updateStatus(`Loaded: ${r.name}`,`ready`);let i=e.getElement(`.data-subtab[data-subtab="edit"]`);i==null||i.click()}})}),t.querySelectorAll(`.save-delete-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let r=parseInt(t.target.getAttribute(`data-save-idx`)||`0`),i=n.filter((e,t)=>t!==r);localStorage.setItem(S,JSON.stringify(i)),k(e)})})}function A(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function j(e){let t=e.getElement(`#simulator-puzzle`),n=e.getElement(`#simulator-input`),r=e.getElement(`#simulator-puzzle-apply`),i=e.getElement(`#simulator-input-apply`);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))}function M(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function ae(){let e=0;return{id:`msgs`,label:`Msgs`,render(){return`
99
+ `}).join(``),t.querySelectorAll(`.save-load-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let r=n[parseInt(t.target.getAttribute(`data-save-idx`)||`0`)];if(r){e.state.puzzleData=r.puzzleStr,e.state.originalPuzzle=r.puzzleStr,e.state.currentInputStr=r.inputStr;let t=e.getElement(`#simulator-puzzle`),n=e.getElement(`#simulator-input`);t&&(t.value=r.puzzleStr,D(t)),n&&(n.value=r.inputStr,D(n)),e.updateStatus(`Loaded: ${r.name}`,`ready`);let i=e.getElement(`.data-subtab[data-subtab="edit"]`);i==null||i.click()}})}),t.querySelectorAll(`.save-delete-btn`).forEach(t=>{t.addEventListener(`click`,t=>{let r=parseInt(t.target.getAttribute(`data-save-idx`)||`0`),i=n.filter((e,t)=>t!==r);localStorage.setItem(C,JSON.stringify(i)),A(e)})})}function j(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function M(e){let t=e.getElement(`#simulator-puzzle`),n=e.getElement(`#simulator-input`),r=e.getElement(`#simulator-puzzle-apply`),i=e.getElement(`#simulator-input-apply`);t&&e.state.originalPuzzle&&(t.value=e.state.originalPuzzle,D(t),r&&(r.disabled=!0)),n&&(n.value=e.state.currentInputStr,D(n),i&&(i.disabled=!0))}function N(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function se(){let e=0;return{id:`msgs`,label:`Msgs`,render(){return`
100
100
  <div class="msgs-view-container">
101
101
  <div class="msgs-header">
102
102
  <span class="simulator-label">Message Log</span>
@@ -109,8 +109,8 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
109
109
  <span class="simulator-msg-type">${t.direction===`out`?`→`:`←`} ${t.type}</span>
110
110
  <span class="simulator-msg-time">${t.time}</span>
111
111
  </div>
112
- ${a?`<div class="simulator-msg-data">${M(a)}</div>`:``}
113
- `;let o=i.querySelector(`.simulator-msg-data`);for(o&&o.addEventListener(`click`,()=>{r.querySelectorAll(`.simulator-msg.expanded`).forEach(e=>{e!==i&&e.classList.remove(`expanded`)}),i.classList.toggle(`expanded`)}),r.insertBefore(i,r.firstChild);r.children.length>50;)r.removeChild(r.lastChild)}}}function oe(){return{id:`done`,label:`Done`,render(){return`
112
+ ${a?`<div class="simulator-msg-data">${N(a)}</div>`:``}
113
+ `;let o=i.querySelector(`.simulator-msg-data`);for(o&&o.addEventListener(`click`,()=>{r.querySelectorAll(`.simulator-msg.expanded`).forEach(e=>{e!==i&&e.classList.remove(`expanded`)}),i.classList.toggle(`expanded`)}),r.insertBefore(i,r.firstChild);r.children.length>50;)r.removeChild(r.lastChild)}}}function ce(){return{id:`done`,label:`Done`,render(){return`
114
114
  <div id="simulator-done-empty" class="simulator-empty">Game not completed yet</div>
115
115
  <div id="simulator-done-content" style="display:none;">
116
116
  <div class="simulator-field">
@@ -136,7 +136,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
136
136
  `},bind(e){},onMessage(e,t,n){var r,i;if(e===`SHOW_GAME_COMPLETE_SCREEN`){n.setCollapsed(!1),n.switchTab(`done`);return}if(e!==`GAME_COMPLETED`)return;n.state.completionData=t;let a=n.getElement(`#simulator-done-empty`),o=n.getElement(`#simulator-done-content`),s=n.getElement(`#simulator-done-text`),c=n.getElement(`#simulator-done-input`),l=n.getElement(`#simulator-done-deeds`),u=n.getElement(`#simulator-done-raw`);a&&(a.style.display=`none`),o&&(o.style.display=`block`);let d=((r=t.input)==null?void 0:r.completionText)||t.completionText||`(no completion text)`;s&&(s.textContent=d);let f=((i=t.input)==null?void 0:i.boardState)||t.boardState||n.state.currentInputStr||``;if(c&&(c.value=f),l){var p;l.innerHTML=``;let e=((p=t.config)==null?void 0:p.deeds)||t.deeds;e&&Array.isArray(e)?e.forEach(e=>{let t=document.createElement(`div`);t.className=`simulator-deed`,t.innerHTML=`
137
137
  <span class="simulator-deed-name">${e.id}</span>
138
138
  <span class="simulator-deed-value">${e.value}</span>
139
- `,l.appendChild(t)}):l.innerHTML=`<div class="simulator-empty">No deeds</div>`}u&&(u.value=JSON.stringify(t,null,2))}}}function se(){let e=[],t=()=>new Date().toLocaleTimeString(`en-US`,{hour12:!1}),n=e=>{let{checkpointName:t,augConfig:n,time:r}=e,i=n==null?void 0:n.deeds;return`
139
+ `,l.appendChild(t)}):l.innerHTML=`<div class="simulator-empty">No deeds</div>`}u&&(u.value=JSON.stringify(t,null,2))}}}function le(){let e=[],t=()=>new Date().toLocaleTimeString(`en-US`,{hour12:!1}),n=e=>{let{checkpointName:t,augConfig:n,time:r}=e,i=n==null?void 0:n.deeds;return`
140
140
  <div class="checkpoint-item">
141
141
  <div class="checkpoint-header">
142
142
  <span class="checkpoint-name">${t}</span>
@@ -156,7 +156,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
156
156
  ${r()}
157
157
  </div>
158
158
  </div>
159
- `},bind(t){let n=t.getElement(`#simulator-checkpoints-clear`),i=t.getElement(`#simulator-checkpoints-list`);n==null||n.addEventListener(`click`,()=>{e=[],i&&(i.innerHTML=r()),t.updateBadge(`checkpoints`,0)})},onMessage(n,i,a){if(n!==`HIT_CHECKPOINT`)return;let o={checkpointName:i.checkpointName,augConfig:i.augConfig,time:t()};e.push(o),a.updateBadge(`checkpoints`,e.length);let s=a.getElement(`#simulator-checkpoints-list`);s&&(s.innerHTML=r(),s.scrollTop=s.scrollHeight)}}}function N(){let e=globalThis;for(let t of Object.keys(e))if(t.endsWith(`Thumbnail`)&&typeof e[t]==`function`)return{name:t,fn:e[t]};return null}function ce(){return{id:`thumb`,label:`Thumb`,render(){return`
159
+ `},bind(t){let n=t.getElement(`#simulator-checkpoints-clear`),i=t.getElement(`#simulator-checkpoints-list`);n==null||n.addEventListener(`click`,()=>{e=[],i&&(i.innerHTML=r()),t.updateBadge(`checkpoints`,0)})},onMessage(n,i,a){if(n!==`HIT_CHECKPOINT`)return;let o={checkpointName:i.checkpointName,augConfig:i.augConfig,time:t()};e.push(o),a.updateBadge(`checkpoints`,e.length);let s=a.getElement(`#simulator-checkpoints-list`);s&&(s.innerHTML=r(),s.scrollTop=s.scrollHeight)}}}function P(){let e=globalThis;for(let t of Object.keys(e))if(t.endsWith(`Thumbnail`)&&typeof e[t]==`function`)return{name:t,fn:e[t]};return null}function ue(){return{id:`thumb`,label:`Thumb`,render(){return`
160
160
  <div class="thumb-view-container">
161
161
  <div class="thumb-header">
162
162
  <span class="simulator-label">Thumbnail Preview</span>
@@ -185,7 +185,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
185
185
  </select>
186
186
  </div>
187
187
  </div>
188
- `},bind(e){let t=e.getElement(`#simulator-thumb-refresh`);t==null||t.addEventListener(`click`,()=>e.updateThumbnail());let n=e.getElement(`#simulator-render-host-select`),r=e.getElement(`#simulator-render-context-select`),i=e.getElement(`#simulator-render-context-field`),a=()=>{i&&(i.style.display=e.state.renderHost===`opengraph`?`block`:`none`)};n&&(e.state.renderHost||(e.state.renderHost=`game`,g(e.state.renderHost)),n.value=e.state.renderHost||`game`,n.addEventListener(`change`,()=>{e.state.renderHost=n.value,g(e.state.renderHost),a(),e.updateThumbnail()})),r&&(e.state.renderContext||(e.state.renderContext=`preview`,_(e.state.renderContext)),r.value=e.state.renderContext||`preview`,r.addEventListener(`change`,()=>{e.state.renderContext=r.value,_(e.state.renderContext),e.updateThumbnail()})),a()},onActivate(e){setTimeout(()=>e.updateThumbnail(),0)},updatePreview:e=>{let t=e.getElement(`#simulator-thumb-preview`),n=e.getElement(`#simulator-thumb-fn`);t==null||t.style.setProperty(`--sim-thumb-bg`,e.state.selectedTheme.g_bg);let r=N();if(!r){t&&(t.innerHTML=`<span class="simulator-empty">No thumbnail function found</span>`),n&&(n.textContent=``);return}n&&(n.textContent=`Using: ${r.name}()`);try{var i;let n=(i=e.state.puzzleData)==null?``:i,a={viewerIsOwner:!0,theme:e.state.selectedTheme,strict:!0,renderHost:e.state.renderHost,renderContext:e.state.renderContext},o=r.fn(n,e.state.currentInputStr,a);t&&(t.innerHTML=o)}catch(e){console.error(`Simulator: Thumbnail error`,e),t&&(t.innerHTML=`<span class="simulator-empty">Error: ${e}</span>`)}}}}function P(e){let t=[e.key,e.subBrand,e.player,e.alt1,e.alt2,e.alt3].map(e=>`<div class="simulator-theme-preview-cell" style="background: ${e}"></div>`).join(``);return`<div class="simulator-theme-preview" style="background: ${e.g_bg}">${t}</div>`}function le(){return{id:`theme`,label:`Theme`,render(){return`
188
+ `},bind(e){let t=e.getElement(`#simulator-thumb-refresh`);t==null||t.addEventListener(`click`,()=>e.updateThumbnail());let n=e.getElement(`#simulator-render-host-select`),r=e.getElement(`#simulator-render-context-select`),i=e.getElement(`#simulator-render-context-field`),a=()=>{i&&(i.style.display=e.state.renderHost===`opengraph`?`block`:`none`)};n&&(e.state.renderHost||(e.state.renderHost=`game`,v(e.state.renderHost)),n.value=e.state.renderHost||`game`,n.addEventListener(`change`,()=>{e.state.renderHost=n.value,v(e.state.renderHost),a(),e.updateThumbnail()})),r&&(e.state.renderContext||(e.state.renderContext=`preview`,y(e.state.renderContext)),r.value=e.state.renderContext||`preview`,r.addEventListener(`change`,()=>{e.state.renderContext=r.value,y(e.state.renderContext),e.updateThumbnail()})),a()},onActivate(e){setTimeout(()=>e.updateThumbnail(),0)},updatePreview:e=>{let t=e.getElement(`#simulator-thumb-preview`),n=e.getElement(`#simulator-thumb-fn`);t==null||t.style.setProperty(`--sim-thumb-bg`,e.state.selectedTheme.g_bg);let r=P();if(!r){t&&(t.innerHTML=`<span class="simulator-empty">No thumbnail function found</span>`),n&&(n.textContent=``);return}n&&(n.textContent=`Using: ${r.name}()`);try{var i;let n=(i=e.state.puzzleData)==null?``:i,a={viewerIsOwner:!0,theme:e.state.selectedTheme,strict:!0,renderHost:e.state.renderHost,renderContext:e.state.renderContext},o=r.fn(n,e.state.currentInputStr,a);t&&(t.innerHTML=o)}catch(e){console.error(`Simulator: Thumbnail error`,e),t&&(t.innerHTML=`<span class="simulator-empty">Error: ${e}</span>`)}}}}function F(e){let t=[e.key,e.subBrand,e.player,e.alt1,e.alt2,e.alt3].map(e=>`<div class="simulator-theme-preview-cell" style="background: ${e}"></div>`).join(``);return`<div class="simulator-theme-preview" style="background: ${e.g_bg}">${t}</div>`}function de(){return{id:`theme`,label:`Theme`,render(){return`
189
189
  <div class="theme-view-container">
190
190
  <div class="theme-header">
191
191
  <span class="simulator-label">Select Theme</span>
@@ -193,10 +193,10 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
193
193
  <div id="simulator-themes" class="simulator-themes"></div>
194
194
  </div>
195
195
  `},bind(e){let t=e.getElement(`#simulator-themes`);t&&n.forEach(n=>{let r=document.createElement(`div`);r.className=`simulator-theme-item${n.name===e.state.selectedTheme.name?` selected`:``}`,r.innerHTML=`
196
- ${P(n)}
196
+ ${F(n)}
197
197
  <div class="simulator-theme-name">${n.name}</div>
198
198
  <div class="simulator-theme-type">${n.type}</div>
199
- `,r.addEventListener(`click`,()=>{console.log(`Simulator: Theme changed, reloading...`,n.name),f(n.name),window.location.reload()}),t.appendChild(r)})}}}var F=`puzzmo_sim_api_mode`,I=`http://localhost:8911`,L=`https://api.puzzmo.com`,R=()=>localStorage.getItem(F)===`dev`?`dev`:`prod`,z=e=>{localStorage.setItem(F,e)},B=null,V=function(){var t=e.t(function*(){if(B!==null)return B;try{let e=new AbortController,t=setTimeout(()=>e.abort(),1e3),n=yield fetch(`${I}/healthz`,{signal:e.signal});return clearTimeout(t),B=n.ok,B}catch(e){return B=!1,!1}});return function(){return t.apply(this,arguments)}}(),H=()=>({apiURL:R()===`dev`?I:L,clientID:`protosdk:oauthclient`,redirectUri:`${window.location.origin}/oauth/callback`}),U=()=>{let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)},W=`puzzmo_sim_oauth_token`,G=`puzzmo_sim_oauth_refresh_token`,ue=e=>localStorage.setItem(W,e),de=e=>localStorage.setItem(G,e),K=()=>{let e=localStorage.getItem(W);return e&&`${e.substring(0,20)}`,e},q=()=>localStorage.getItem(G),J=()=>{localStorage.removeItem(W),localStorage.removeItem(G)},fe=()=>{let e=H(),t=U();sessionStorage.setItem(`oauth_state`,t),sessionStorage.setItem(`oauth_return_url`,window.location.href);let n=new URL(`${e.apiURL}/oauth/auth`);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()},pe=e=>{try{let t=e.split(`.`);if(t.length!==3)return!0;let n=JSON.parse(atob(t[1])).exp;return n?Date.now()>=n*1e3-300*1e3:!0}catch(e){return!0}},me=function(){var t=e.t(function*(){let e=q();if(!e)return!1;let t=H();try{let n=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:t.clientID}),r=yield fetch(`${t.apiURL}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n.toString()});if(!r.ok)return r.statusText,!1;let i=yield r.json(),a=i.access_token||i.accessToken;if(!a)return!1;ue(a);let o=i.refresh_token||i.refreshToken;return o&&de(o),!0}catch(e){return!1}});return function(){return t.apply(this,arguments)}}(),he=function(){var t=e.t(function*(e,t){let n=H(),r=sessionStorage.getItem(`oauth_state`);if(!r||r!==t)return null;sessionStorage.removeItem(`oauth_state`);try{let t=new URLSearchParams({grant_type:`authorization_code`,code:e,client_id:n.clientID,redirect_uri:n.redirectUri}),r=yield fetch(`${n.apiURL}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t.toString()});return r.ok?yield r.json():(r.statusText,null)}catch(e){return null}});return function(e,n){return t.apply(this,arguments)}}(),ge=function(){var t=e.t(function*(e,t={}){let n=H(),r=K();if(!r)throw Error(`Not authenticated`);if(pe(r))if(yield me()){if(r=K(),!r)throw Error(`Token refresh succeeded but no token available`)}else throw J(),Error(`Session expired. Please log in again.`);let i=yield fetch(`${n.apiURL}/graphql`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${r}`,"auth-provider":`custom`},body:JSON.stringify({query:e,variables:t})});if(!i.ok)throw Error(`API request failed: ${i.statusText}`);return i.json()});return function(e){return t.apply(this,arguments)}}(),_e=e=>{try{let t=e.split(`.`);return t.length,t.length===3?JSON.parse(atob(t[1])):null}catch(e){return null}};function ve(){let t=!1;return{id:`auth`,label:`Auth`,render(){let e=K(),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>`;if(t){let t=_e(e),n=t!=null&&t.exp?new Date(t.exp*1e3).toLocaleString():`Unknown`,a=!!q(),o=a?_e(q()):null,s=o!=null&&o.exp?new Date(o.exp*1e3).toLocaleString():null;return`
199
+ `,r.addEventListener(`click`,()=>{console.log(`Simulator: Theme changed, reloading...`,n.name),h(n.name),window.location.reload()}),t.appendChild(r)})}}}var I=`puzzmo_sim_api_mode`,L=`http://localhost:8911`,R=`https://api.puzzmo.com`,z=()=>localStorage.getItem(I)===`dev`?`dev`:`prod`,fe=e=>{localStorage.setItem(I,e)},B=null,pe=function(){var e=t.t(function*(){if(B!==null)return B;try{let e=new AbortController,t=setTimeout(()=>e.abort(),1e3),n=yield fetch(`${L}/healthz`,{signal:e.signal});return clearTimeout(t),B=n.ok,B}catch(e){return B=!1,!1}});return function(){return e.apply(this,arguments)}}(),V=()=>({apiURL:z()===`dev`?L:R,clientID:`protosdk:oauthclient`,redirectUri:`${window.location.origin}/oauth/callback`}),me=()=>{let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)},H=`puzzmo_sim_oauth_token`,U=`puzzmo_sim_oauth_refresh_token`,he=e=>localStorage.setItem(H,e),ge=e=>localStorage.setItem(U,e),W=()=>{let e=localStorage.getItem(H);return e&&`${e.substring(0,20)}`,e},G=()=>localStorage.getItem(U),K=()=>{localStorage.removeItem(H),localStorage.removeItem(U)},_e=()=>{let e=V(),t=me();sessionStorage.setItem(`oauth_state`,t),sessionStorage.setItem(`oauth_return_url`,window.location.href);let n=new URL(`${e.apiURL}/oauth/auth`);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()},ve=e=>{try{let t=e.split(`.`);if(t.length!==3)return!0;let n=JSON.parse(atob(t[1])).exp;return n?Date.now()>=n*1e3-300*1e3:!0}catch(e){return!0}},ye=function(){var e=t.t(function*(){let e=G();if(!e)return!1;let t=V();try{let n=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:t.clientID}),r=yield fetch(`${t.apiURL}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n.toString()});if(!r.ok)return r.statusText,!1;let i=yield r.json(),a=i.access_token||i.accessToken;if(!a)return!1;he(a);let o=i.refresh_token||i.refreshToken;return o&&ge(o),!0}catch(e){return!1}});return function(){return e.apply(this,arguments)}}(),be=function(){var e=t.t(function*(e,t){let n=V(),r=sessionStorage.getItem(`oauth_state`);if(!r||r!==t)return null;sessionStorage.removeItem(`oauth_state`);try{let t=new URLSearchParams({grant_type:`authorization_code`,code:e,client_id:n.clientID,redirect_uri:n.redirectUri}),r=yield fetch(`${n.apiURL}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t.toString()});return r.ok?yield r.json():(r.statusText,null)}catch(e){return null}});return function(t,n){return e.apply(this,arguments)}}(),xe=function(){var e=t.t(function*(e,t={}){let n=V(),r=W();if(!r)throw Error(`Not authenticated`);if(ve(r))if(yield ye()){if(r=W(),!r)throw Error(`Token refresh succeeded but no token available`)}else throw K(),Error(`Session expired. Please log in again.`);let i=yield fetch(`${n.apiURL}/graphql`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${r}`,"auth-provider":`custom`},body:JSON.stringify({query:e,variables:t})});if(!i.ok)throw Error(`API request failed: ${i.statusText}`);return i.json()});return function(t){return e.apply(this,arguments)}}(),Se=e=>{try{let t=e.split(`.`);return t.length,t.length===3?JSON.parse(atob(t[1])):null}catch(e){return null}};function Ce(){let e=!1;return{id:`auth`,label:`Auth`,render(){let e=W(),t=!!e,n=z(),r=n===`dev`?L:R,i=`<button class="simulator-btn tiny" id="auth-dev-toggle" style="display: none;">${n===`dev`?`Using Dev`:`Dev`}</button>`;if(t){let t=Se(e),n=t!=null&&t.exp?new Date(t.exp*1e3).toLocaleString():`Unknown`,a=!!G(),o=a?Se(G()):null,s=o!=null&&o.exp?new Date(o.exp*1e3).toLocaleString():null;return`
200
200
  <div class="simulator-section">
201
201
  <div class="simulator-section-title auth-title-row">
202
202
  <span>Puzzmo Authentication</span>
@@ -234,14 +234,14 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
234
234
  </div>
235
235
  <p class="auth-description">
236
236
  Login with your Puzzmo account to make authenticated API requests.
237
- ${n===`dev`?`<br><strong>Using local dev server:</strong> ${I}`:``}
237
+ ${n===`dev`?`<br><strong>Using local dev server:</strong> ${L}`:``}
238
238
  </p>
239
239
  <div class="simulator-row">
240
240
  <button class="simulator-btn primary" id="auth-login">Login with Puzzmo</button>
241
241
  </div>
242
242
  <div id="auth-error" class="auth-error"></div>
243
243
  </div>
244
- `},bind(n){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`);t?B&&c&&(c.style.display=``,R()===`dev`&&c.classList.add(`active`)):(t=!0,V().then(e=>{e&&c&&(c.style.display=``,R()===`dev`&&c.classList.add(`active`))})),c==null||c.addEventListener(`click`,()=>{z(R()===`dev`?`prod`:`dev`),J(),window.location.reload()}),r==null||r.addEventListener(`click`,()=>{fe()}),i==null||i.addEventListener(`click`,()=>{J(),window.location.reload()}),a==null||a.addEventListener(`click`,e.t(function*(){a.disabled=!0,a.textContent=`Refreshing...`,(yield me())?window.location.reload():(a.textContent=`Refresh Failed`,a.disabled=!1)})),o==null||o.addEventListener(`click`,e.t(function*(){if(s){s.innerHTML=`<div class="loading">Loading...</div>`;try{let t=yield ge(`
244
+ `},bind(n){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`);e?B&&c&&(c.style.display=``,z()===`dev`&&c.classList.add(`active`)):(e=!0,pe().then(e=>{e&&c&&(c.style.display=``,z()===`dev`&&c.classList.add(`active`))})),c==null||c.addEventListener(`click`,()=>{fe(z()===`dev`?`prod`:`dev`),K(),window.location.reload()}),r==null||r.addEventListener(`click`,()=>{_e()}),i==null||i.addEventListener(`click`,()=>{K(),window.location.reload()}),a==null||a.addEventListener(`click`,t.t(function*(){a.disabled=!0,a.textContent=`Refreshing...`,(yield ye())?window.location.reload():(a.textContent=`Refresh Failed`,a.disabled=!1)})),o==null||o.addEventListener(`click`,t.t(function*(){if(s){s.innerHTML=`<div class="loading">Loading...</div>`;try{let t=yield xe(`
245
245
  query {
246
246
  currentUser {
247
247
  id
@@ -250,7 +250,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
250
250
  name
251
251
  }
252
252
  }
253
- `);if(t.errors){var e;s.innerHTML=`<div class="error">Error: ${((e=t.errors[0])==null?void 0:e.message)||`Unknown error`}</div>`}else s.innerHTML=`<pre>${JSON.stringify(t.data,null,2)}</pre>`}catch(e){s.innerHTML=`<div class="error">Error: ${e instanceof Error?e.message:`Unknown error`}</div>`}}}))},onActivate(t){return e.t(function*(){let e=new URLSearchParams(window.location.search),n=e.get(`code`),r=e.get(`state`),i=e.get(`error`);if(i){let e=t.getElement(`#auth-error`);e&&(e.innerHTML=`<div class="error">OAuth error: ${i}</div>`),window.history.replaceState({},``,window.location.pathname);return}if(n&&r){let e=t.getElement(`#auth-status`);e&&(e.innerHTML=`<span class="indicator waiting"></span><span>Exchanging code...</span>`);let i=yield he(n,r);if(window.history.replaceState({},``,window.location.pathname),i){let e=i.access_token||i.accessToken;if(e){ue(e);let t=i.refresh_token||i.refreshToken;t&&de(t)}window.location.reload()}else{let e=t.getElement(`#auth-error`);e&&(e.innerHTML=`<div class="error">Failed to exchange code for token</div>`)}}})()}}}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=()=>{localStorage.removeItem(Y),localStorage.removeItem(X)},De=e=>{try{let t=e.split(`.`);if(t.length!==3)return!0;let n=JSON.parse(atob(t[1])).exp;return n?Date.now()>=n*1e3-300*1e3:!0}catch(e){return!0}},Oe=function(){var t=e.t(function*(){let e=Ce();if(!e)return!1;let t=Se()===`dev`?be:xe;try{let n=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:`protosdk:oauthclient`}),r=yield fetch(`${t}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n.toString()});if(!r.ok)return!1;let i=yield r.json(),a=i.access_token||i.accessToken;if(!a)return!1;we(a);let o=i.refresh_token||i.refreshToken;return o&&Te(o),!0}catch(e){return!1}});return function(){return t.apply(this,arguments)}}(),ke=function(){var t=e.t(function*(e,t={}){let n=Se()===`dev`?be:xe,r=Z();if(!r)throw Error(`Not authenticated`);if(De(r))if(yield Oe()){if(r=Z(),!r)throw Error(`Token refresh succeeded but no token available`)}else throw Ee(),Error(`Session expired. Please log in again.`);let i=yield fetch(`${n}/graphql`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${r}`,"auth-provider":`custom`},body:JSON.stringify({query:e,variables:t})});if(!i.ok)throw Error(`API request failed: ${i.statusText}`);return i.json()});return function(e){return t.apply(this,arguments)}}(),Ae=`
253
+ `);if(t.errors){var e;s.innerHTML=`<div class="error">Error: ${((e=t.errors[0])==null?void 0:e.message)||`Unknown error`}</div>`}else s.innerHTML=`<pre>${JSON.stringify(t.data,null,2)}</pre>`}catch(e){s.innerHTML=`<div class="error">Error: ${e instanceof Error?e.message:`Unknown error`}</div>`}}}))},onActivate(e){return t.t(function*(){let t=new URLSearchParams(window.location.search),n=t.get(`code`),r=t.get(`state`),i=t.get(`error`);if(i){let t=e.getElement(`#auth-error`);t&&(t.innerHTML=`<div class="error">OAuth error: ${i}</div>`),window.history.replaceState({},``,window.location.pathname);return}if(n&&r){let t=e.getElement(`#auth-status`);t&&(t.innerHTML=`<span class="indicator waiting"></span><span>Exchanging code...</span>`);let i=yield be(n,r);if(window.history.replaceState({},``,window.location.pathname),i){let e=i.access_token||i.accessToken;if(e){he(e);let t=i.refresh_token||i.refreshToken;t&&ge(t)}window.location.reload()}else{let t=e.getElement(`#auth-error`);t&&(t.innerHTML=`<div class="error">Failed to exchange code for token</div>`)}}})()}}}var we=`puzzmo_sim_api_mode`,Te=`http://localhost:8911`,Ee=`https://api.puzzmo.com`,q=`puzzmo_sim_oauth_token`,J=`puzzmo_sim_oauth_refresh_token`,De=()=>localStorage.getItem(we)===`dev`?`dev`:`prod`,Y=()=>localStorage.getItem(q),Oe=()=>localStorage.getItem(J),ke=e=>localStorage.setItem(q,e),Ae=e=>localStorage.setItem(J,e),je=()=>{localStorage.removeItem(q),localStorage.removeItem(J)},Me=e=>{try{let t=e.split(`.`);if(t.length!==3)return!0;let n=JSON.parse(atob(t[1])).exp;return n?Date.now()>=n*1e3-300*1e3:!0}catch(e){return!0}},Ne=function(){var e=t.t(function*(){let e=Oe();if(!e)return!1;let t=De()===`dev`?Te:Ee;try{let n=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:`protosdk:oauthclient`}),r=yield fetch(`${t}/oauth/token`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n.toString()});if(!r.ok)return!1;let i=yield r.json(),a=i.access_token||i.accessToken;if(!a)return!1;ke(a);let o=i.refresh_token||i.refreshToken;return o&&Ae(o),!0}catch(e){return!1}});return function(){return e.apply(this,arguments)}}(),Pe=function(){var e=t.t(function*(e,t={}){let n=De()===`dev`?Te:Ee,r=Y();if(!r)throw Error(`Not authenticated`);if(Me(r))if(yield Ne()){if(r=Y(),!r)throw Error(`Token refresh succeeded but no token available`)}else throw je(),Error(`Session expired. Please log in again.`);let i=yield fetch(`${n}/graphql`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${r}`,"auth-provider":`custom`},body:JSON.stringify({query:e,variables:t})});if(!i.ok)throw Error(`API request failed: ${i.statusText}`);return i.json()});return function(t){return e.apply(this,arguments)}}(),Fe=`
254
254
  query GameFeaturesQuery($slug: ID!) {
255
255
  game(id: $slug) {
256
256
  id
@@ -268,7 +268,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
268
268
  }
269
269
  }
270
270
  }
271
- `,je=`
271
+ `,Ie=`
272
272
  mutation ToggleFeatureMutation($gameSlug: ID!, $input: UpdateGameInput!) {
273
273
  updateGame(id: $gameSlug, input: $input) {
274
274
  id
@@ -284,7 +284,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
284
284
  }
285
285
  }
286
286
  }
287
- `,Me=(e,t)=>{let n=t-1,r=Math.floor(n/31),i=n%31,a=[...e];for(;a.length<=r;)a.push(0);return a[r]=a[r]^1<<i,a};const Ne=()=>!!Z();function Pe(){let n=null,r=!1,i=null,a=function(){var t=e.t(function*(e){r=!0,i=null;try{var t;let r=yield ke(Ae,{slug:e});if(r.errors){var a;i=((a=r.errors[0])==null?void 0:a.message)||`Unknown error`,n=null}else (t=r.data)!=null&&t.game?n=r.data.game:(i=`Game not found`,n=null)}catch(e){i=e instanceof Error?e.message:`Unknown error`,n=null}finally{r=!1}});return function(e){return t.apply(this,arguments)}}(),o=function(){var r=e.t(function*(e){if(!n)return;let r=Me(n.featuresArr,e);try{var i;let e=yield ke(je,{gameSlug:n.slug,input:{featuresArr:r}});if(e.errors){var a;console.error(`Failed to toggle feature:`,(a=e.errors[0])==null?void 0:a.message)}else (i=e.data)!=null&&i.updateGame&&(n=t.t(t.t({},n),{},{featuresArr:e.data.updateGame.featuresArr,gameFeatures:e.data.updateGame.gameFeatures}))}catch(e){console.error(`Failed to toggle feature:`,e)}});return function(e){return r.apply(this,arguments)}}(),s=()=>{if(r)return`<div class="features-loading">Loading features...</div>`;if(i)return`<div class="features-error">${i}</div>`;if(!n)return`<div class="features-empty">Enter your game slug above to load features</div>`;let e=n.gameFeatures.map(e=>{let t=e.features.map(e=>{let t=e.isEnabled?`enabled`:`disabled`,n=e.isEnabled?`✓`:`✗`;return`
287
+ `,Le=(e,t)=>{let n=t-1,r=Math.floor(n/31),i=n%31,a=[...e];for(;a.length<=r;)a.push(0);return a[r]=a[r]^1<<i,a};const Re=()=>!!Y();function ze(){let n=null,r=!1,i=null,a=function(){var e=t.t(function*(e){r=!0,i=null;try{var t;let r=yield Pe(Fe,{slug:e});if(r.errors){var a;i=((a=r.errors[0])==null?void 0:a.message)||`Unknown error`,n=null}else (t=r.data)!=null&&t.game?n=r.data.game:(i=`Game not found`,n=null)}catch(e){i=e instanceof Error?e.message:`Unknown error`,n=null}finally{r=!1}});return function(t){return e.apply(this,arguments)}}(),o=function(){var r=t.t(function*(t){if(!n)return;let r=Le(n.featuresArr,t);try{var i;let t=yield Pe(Ie,{gameSlug:n.slug,input:{featuresArr:r}});if(t.errors){var a;console.error(`Failed to toggle feature:`,(a=t.errors[0])==null?void 0:a.message)}else (i=t.data)!=null&&i.updateGame&&(n=e.t(e.t({},n),{},{featuresArr:t.data.updateGame.featuresArr,gameFeatures:t.data.updateGame.gameFeatures}))}catch(e){console.error(`Failed to toggle feature:`,e)}});return function(e){return r.apply(this,arguments)}}(),s=()=>{if(r)return`<div class="features-loading">Loading features...</div>`;if(i)return`<div class="features-error">${i}</div>`;if(!n)return`<div class="features-empty">Enter your game slug above to load features</div>`;let e=n.gameFeatures.map(e=>{let t=e.features.map(e=>{let t=e.isEnabled?`enabled`:`disabled`,n=e.isEnabled?`✓`:`✗`;return`
288
288
  <div class="feature-item ${t}" data-feature-id="${e.featureID}">
289
289
  <span class="feature-status">${n}</span>
290
290
  <span class="feature-title">${e.title}</span>
@@ -297,7 +297,7 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
297
297
  `}).join(``);return`
298
298
  <div class="features-game-name">${n.displayName}</div>
299
299
  ${e}
300
- `};return{id:`features`,label:`Features`,render(){return Ne()?`
300
+ `};return{id:`features`,label:`Features`,render(){return Re()?`
301
301
  <div class="features-view-container">
302
302
  <div class="simulator-section">
303
303
  <div class="simulator-section-title">Game Features</div>
@@ -321,13 +321,36 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
321
321
  </div>
322
322
  </div>
323
323
  </div>
324
- `},bind(t){let r=t.getElement(`#features-load-btn`),i=t.getElement(`#features-game-slug`),c=t.getElement(`#features-content`),l=()=>{c&&(c.innerHTML=s(),u())},u=()=>{var n;let r=(n=t.getElement(`#features-content`))==null?void 0:n.querySelectorAll(`.feature-item`);r==null||r.forEach(t=>{t.addEventListener(`click`,e.t(function*(){let e=parseInt(t.getAttribute(`data-feature-id`)||`0`);e>0&&(t.classList.add(`updating`),yield o(e),l())}))})},d=function(){var t=e.t(function*(e){e&&(r&&(r.disabled=!0,r.textContent=`Loading...`),yield a(e),l(),r&&(r.disabled=!1,r.textContent=`Load`))});return function(e){return t.apply(this,arguments)}}();r==null||r.addEventListener(`click`,e.t(function*(){let e=i==null?void 0:i.value.trim();e&&(yield d(e))})),i==null||i.addEventListener(`keypress`,e=>{e.key===`Enter`&&(r==null||r.click())}),console.log(`[FeaturesView] bind called, ctx.gameSlug:`,t.gameSlug,`slugInput:`,i),t.gameSlug&&i&&(i.value=t.gameSlug,Ne()&&!n&&d(t.gameSlug)),u()},onActivate(e){let t=e.getElement(`#simulator-tab-features`);t&&(t.innerHTML=this.render(),this.bind(e))}}}var Fe=(e,t)=>{var n,r;let i=(n=t.symbols[e])==null?e:n,a=t.disabled.includes(e),o=t.highlight.includes(e),s=t.xl.includes(e),c=t.l.includes(e),l=(r=t.flexGrowSymbols)==null?void 0:r.includes(e);return`<button class="${[`sim-kb-key`,a?`disabled`:``,o?`highlight`:``,s?`xl`:``,c?`l`:``,l?`grow`:``].filter(Boolean).join(` `)}" data-key="${e}" ${a?`disabled`:``}>${i}</button>`},Ie=e=>`<div class="sim-kb">${e.layout.filter(e=>e!=null).map(t=>`<div class="sim-kb-row">${[...t].map(t=>Fe(t,e)).join(``)}</div>`).join(``)}</div>`;function Le(){let e=null,t=()=>e?Ie(e):`<div class="sim-kb-empty">No keyboard config received from game yet.<br>The game calls <code>sdk.keyboard.show(config)</code> to display a keyboard.</div>`;return{id:`kbd`,label:`Kbd`,render(){return`
324
+ `},bind(e){let r=e.getElement(`#features-load-btn`),i=e.getElement(`#features-game-slug`),c=e.getElement(`#features-content`),l=()=>{c&&(c.innerHTML=s(),u())},u=()=>{var n;let r=(n=e.getElement(`#features-content`))==null?void 0:n.querySelectorAll(`.feature-item`);r==null||r.forEach(e=>{e.addEventListener(`click`,t.t(function*(){let t=parseInt(e.getAttribute(`data-feature-id`)||`0`);t>0&&(e.classList.add(`updating`),yield o(t),l())}))})},d=function(){var e=t.t(function*(e){e&&(r&&(r.disabled=!0,r.textContent=`Loading...`),yield a(e),l(),r&&(r.disabled=!1,r.textContent=`Load`))});return function(t){return e.apply(this,arguments)}}();r==null||r.addEventListener(`click`,t.t(function*(){let e=i==null?void 0:i.value.trim();e&&(yield d(e))})),i==null||i.addEventListener(`keypress`,e=>{e.key===`Enter`&&(r==null||r.click())}),console.log(`[FeaturesView] bind called, ctx.gameSlug:`,e.gameSlug,`slugInput:`,i),e.gameSlug&&i&&(i.value=e.gameSlug,Re()&&!n&&d(e.gameSlug)),u()},onActivate(e){let t=e.getElement(`#simulator-tab-features`);t&&(t.innerHTML=this.render(),this.bind(e))}}}var Be=(e,t)=>{var n,r;let i=(n=t.symbols[e])==null?e:n,a=t.disabled.includes(e),o=t.highlight.includes(e),s=t.xl.includes(e),c=t.l.includes(e),l=(r=t.flexGrowSymbols)==null?void 0:r.includes(e);return`<button class="${[`sim-kb-key`,a?`disabled`:``,o?`highlight`:``,s?`xl`:``,c?`l`:``,l?`grow`:``].filter(Boolean).join(` `)}" data-key="${e}" ${a?`disabled`:``}>${i}</button>`},Ve=e=>`<div class="sim-kb">${e.layout.filter(e=>e!=null).map(t=>`<div class="sim-kb-row">${[...t].map(t=>Be(t,e)).join(``)}</div>`).join(``)}</div>`;function He(){let e=null,t=()=>e?Ve(e):`<div class="sim-kb-empty">No keyboard config received from game yet.<br>The game calls <code>sdk.keyboard.show(config)</code> to display a keyboard.</div>`;return{id:`kbd`,label:`Kbd`,render(){return`
325
325
  <div class="keyboard-view-container">
326
326
  <div id="sim-kb-content">
327
327
  ${t()}
328
328
  </div>
329
329
  </div>
330
- `},bind(e){Q(e)},onMessage(n,r,i){var a;if(n!==`KEYBOARD_UPDATE_CONFIG`)return;e=!(!(r==null||(a=r.layout)==null)&&a.length)||r.layout.every(e=>!e)?null:r;let o=i.getElement(`#sim-kb-content`);o&&(o.innerHTML=t(),Q(i)),i.updateBadge(`kbd`,void 0)}}}function Q(e){var t;let n=(t=e.getElement(`#sim-kb-content`))==null?void 0:t.querySelectorAll(`.sim-kb-key`);n==null||n.forEach(t=>{t.addEventListener(`click`,()=>{let n=t.getAttribute(`data-key`);n&&e.sendToGame(`KEYBOARD_KEY_PRESS`,{key:n})})})}var $=null;function Re(t={}){var n,r;if(console.log(`[Simulator] createSimulator called with config:`,{slug:t.slug,hasFixtures:!!t.fixtures}),$)return t.fixtures&&(console.log(`[Simulator] Instance already exists, updating fixtures`),$.updateFixtures(t.fixtures)),$;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=[re(),ie(),s,oe(),se(),c,le(),ve(),Pe(),Le()],p=f.map(e=>e.id),m=l(t,o,p),h={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>`,play:`<svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><polygon points="2,1 9,5 2,9"/></svg>`,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>`,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>`,minimize:`<svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><rect x="1" y="4" width="8" height="2"/></svg>`,expand:`<svg width="8" height="8" viewBox="0 0 8 8" fill="currentColor"><polygon points="1,1 7,4 1,7"/></svg>`},g=document.createElement(`div`);g.id=`simulator`,g.innerHTML=`
330
+ `},bind(e){X(e)},onMessage(n,r,i){var a;if(n!==`KEYBOARD_UPDATE_CONFIG`)return;e=!(!(r==null||(a=r.layout)==null)&&a.length)||r.layout.every(e=>!e)?null:r;let o=i.getElement(`#sim-kb-content`);o&&(o.innerHTML=t(),X(i)),i.updateBadge(`kbd`,void 0)}}}function X(e){var t;let n=(t=e.getElement(`#sim-kb-content`))==null?void 0:t.querySelectorAll(`.sim-kb-key`);n==null||n.forEach(t=>{t.addEventListener(`click`,()=>{let n=t.getAttribute(`data-key`);n&&e.sendToGame(`KEYBOARD_KEY_PRESS`,{key:n})})})}function Ue(){let t=e=>{let t=e.state.settingsComponents;return!t||t.length===0?`<div class="sim-settings-empty">No settings registered by the game yet.<br>The game calls <code>sdk.settings.initialize(components)</code> to describe its settings UI.</div>`:`<div class="sim-settings-form">${t.map(t=>We(t,e.state.gameSettings)).join(``)}</div><div class="sim-settings-actions"><button class="simulator-btn tiny" id="sim-settings-reset">Reset to defaults</button></div>`},n=e=>{let n=e.getElement(`#sim-settings-content`);n&&(n.innerHTML=t(e),i(e))},r=e=>{d(e.state.gameSettings),e.sendToGame(`SETTINGS_UPDATE`,e.state.gameSettings)},i=t=>{var i;let a=t.getElement(`#sim-settings-content`);a&&(a.querySelectorAll(`[data-setting]`).forEach(n=>{let i=n.getAttribute(`data-setting`),a=n.getAttribute(`data-setting-type`);n.addEventListener(`change`,()=>{let o;o=n instanceof HTMLInputElement&&n.type===`checkbox`?n.checked:a===`number`?Number(n.value):n.value,t.state.gameSettings=e.t(e.t({},t.state.gameSettings),{},{[i]:o}),r(t)})}),(i=a.querySelector(`#sim-settings-reset`))==null||i.addEventListener(`click`,()=>{var e;f(),t.state.gameSettings=Ge((e=t.state.settingsComponents)==null?[]:e),r(t),n(t)}))};return{id:`settings`,label:`Set`,render(){return`
331
+ <div class="settings-view-container">
332
+ <div id="sim-settings-content"></div>
333
+ </div>
334
+ `},bind(e){n(e)},onMessage(t,r,i){if(t===`INITIALIZE_SETTINGS`){var a;i.state.settingsComponents=(a=r==null?void 0:r.components)==null?[]:a,i.state.gameSettings=e.t(e.t({},r==null?void 0:r.settings),i.state.gameSettings),d(i.state.gameSettings),n(i);return}t===`UPDATE_SETTINGS_FROM_EMBED`&&(i.state.gameSettings=e.t(e.t({},i.state.gameSettings),r==null?void 0:r.settings),d(i.state.gameSettings),n(i))}}}function We(e,t){switch(e.type){case`title`:return`<div class="sim-settings-heading">${Q(e.value)}</div>`;case`subtitle`:return`<div class="sim-settings-subheading">${Q(e.value)}</div>`;case`paragraph`:return`<p class="sim-settings-paragraph">${Q(e.value)}</p>`;case`separator`:return`<div class="simulator-divider"></div>`;case`split`:return`<div class="sim-settings-split">${e.content.map(e=>We(e,t)).join(``)}</div>`;case`boolean`:{var n;let r=((n=t[e.name])==null?e.defaultValue:n)?`checked`:``,i=e.subtitle?`<div class="sim-settings-subtitle">${Q(e.subtitle)}</div>`:``;return`
335
+ <div class="simulator-field">
336
+ <label class="sim-settings-row">
337
+ <input type="checkbox" data-setting="${e.name}" ${r} />
338
+ <span class="simulator-label">${Q(e.title)}</span>
339
+ </label>
340
+ ${i}
341
+ </div>`}case`enum`:{var r;let n=(r=t[e.name])==null?e.defaultValue:r,i=e.values.map((t,r)=>{var i;return`<option value="${Q(t)}" ${t===n?`selected`:``}>${Q((i=e.displays[r])==null?t:i)}</option>`}).join(``);return`
342
+ <div class="simulator-field">
343
+ ${Z(e)}
344
+ <select class="simulator-select" data-setting="${e.name}">${i}</select>
345
+ </div>`}case`number`:{var i;let n=(i=t[e.name])==null?e.defaultValue:i,r=e.values.map(e=>`<option value="${e}" ${e===n?`selected`:``}>${e}</option>`).join(``);return`
346
+ <div class="simulator-field">
347
+ ${Z(e)}
348
+ <select class="simulator-select" data-setting="${e.name}" data-setting-type="number">${r}</select>
349
+ </div>`}case`text`:{var a,o;let n=String((a=(o=t[e.name])==null?e.defaultValue:o)==null?``:a),r=e.textarea?`<textarea class="simulator-textarea" data-setting="${e.name}">${Q(n)}</textarea>`:`<input class="simulator-input" type="text" data-setting="${e.name}" value="${Q(n)}" />`;return`
350
+ <div class="simulator-field">
351
+ ${Z(e)}
352
+ ${r}
353
+ </div>`}default:return`<div class="sim-settings-unsupported">Unsupported component type: ${Q(e.type)}</div>`}}function Z(e){let t=e.subtitle?`<div class="sim-settings-subtitle">${Q(e.subtitle)}</div>`:``;return`<span class="simulator-label">${Q(e.title)}</span>${t}`}function Ge(e){let t={};for(let n of e)n.type===`split`?Object.assign(t,Ge(n.content)):`name`in n&&(t[n.name]=n.defaultValue);return t}function Q(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}var $=null;function Ke(e={}){var n,r;if(console.log(`[Simulator] createSimulator called with config:`,{slug:e.slug,hasFixtures:!!e.fixtures}),$)return e.fixtures&&(console.log(`[Simulator] Instance already exists, updating fixtures`),$.updateFixtures(e.fixtures)),$;let i=(n=e.autoStart)==null?!0:n,a=e.fixtures?ie(e.fixtures):null,o=a?Array.from(a.keys()).sort():[],s=se(),c=ue(),l=[ae(),oe(),s,ce(),le(),c,de(),Ce(),ze(),He(),Ue()],d=l.map(e=>e.id),f=u(e,o,d),h={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>`,play:`<svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><polygon points="2,1 9,5 2,9"/></svg>`,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>`,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>`,minimize:`<svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><rect x="1" y="4" width="8" height="2"/></svg>`,expand:`<svg width="8" height="8" viewBox="0 0 8 8" fill="currentColor"><polygon points="1,1 7,4 1,7"/></svg>`},g=document.createElement(`div`);g.id=`simulator`,g.innerHTML=`
331
354
  <style>
332
355
  :root {
333
356
  --sim-bg: #1a1a2e;
@@ -1496,8 +1519,75 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
1496
1519
  opacity: 0.3;
1497
1520
  cursor: default;
1498
1521
  }
1522
+ /* Settings view styles */
1523
+ .settings-view-container {
1524
+ display: flex;
1525
+ flex-direction: column;
1526
+ height: 100%;
1527
+ overflow-y: auto;
1528
+ }
1529
+ .sim-settings-empty {
1530
+ color: var(--sim-text-dim);
1531
+ font-size: 10px;
1532
+ text-align: center;
1533
+ padding: 20px;
1534
+ line-height: 1.5;
1535
+ }
1536
+ .sim-settings-heading {
1537
+ color: var(--sim-text);
1538
+ font-size: 11px;
1539
+ font-weight: bold;
1540
+ text-transform: uppercase;
1541
+ letter-spacing: 1px;
1542
+ margin: 6px 0 4px;
1543
+ }
1544
+ .sim-settings-subheading {
1545
+ color: var(--sim-text);
1546
+ font-size: 10px;
1547
+ font-weight: bold;
1548
+ margin: 4px 0 2px;
1549
+ }
1550
+ .sim-settings-paragraph {
1551
+ color: var(--sim-text-dim);
1552
+ font-size: 10px;
1553
+ margin: 2px 0 6px;
1554
+ line-height: 1.4;
1555
+ }
1556
+ .sim-settings-subtitle {
1557
+ color: var(--sim-text-dim);
1558
+ font-size: 9px;
1559
+ margin: -2px 0 3px;
1560
+ line-height: 1.3;
1561
+ }
1562
+ .sim-settings-row {
1563
+ display: flex;
1564
+ align-items: baseline;
1565
+ gap: 6px;
1566
+ cursor: pointer;
1567
+ }
1568
+ .sim-settings-row .simulator-label {
1569
+ margin-bottom: 0;
1570
+ }
1571
+ .sim-settings-split {
1572
+ display: flex;
1573
+ gap: 8px;
1574
+ }
1575
+ .sim-settings-split > * {
1576
+ flex: 1;
1577
+ }
1578
+ .sim-settings-unsupported {
1579
+ color: var(--sim-text-dim);
1580
+ font-size: 9px;
1581
+ font-style: italic;
1582
+ margin: 4px 0;
1583
+ }
1584
+ .sim-settings-actions {
1585
+ margin-top: 8px;
1586
+ padding-top: 8px;
1587
+ border-top: 2px solid var(--sim-border);
1588
+ }
1499
1589
  </style>
1500
- <div id="simulator-panel" class="${m.isCollapsed?`collapsed`:``}">
1590
+ <div id="simulator-panel" class="${f.isCollapsed?`collapsed`:``}">
1501
1591
  <div id="simulator-header">
1502
1592
  <span id="simulator-title">PUZZMO SIMULATOR</span>
1503
1593
  <span class="header-sep">|</span>
@@ -1518,12 +1608,12 @@ const e=require(`./asyncToGenerator-BlxRHn40.cjs`),t=require(`./objectSpread2-B6
1518
1608
  </div>
1519
1609
  <div id="simulator-body">
1520
1610
  <div id="simulator-tabs">
1521
- ${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(``)}
1611
+ ${l.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(``)}
1522
1612
  </div>
1523
1613
  <div id="simulator-content" class="hidden">
1524
- ${f.map(e=>`<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join(``)}
1614
+ ${l.map(e=>`<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join(``)}
1525
1615
  </div>
1526
1616
  </div>
1527
1617
  </div>
1528
- `,document.body.appendChild(g);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=>{S.innerHTML=e?h.play:h.pause,S.title=e?`Resume`:`Pause`},j=(e,t)=>{let n=k(`#simulator-status .text`),r=k(`#simulator-status .indicator`),i=t===`complete`?`✓`:``;n&&(n.textContent=e),r&&(r.className=`indicator ${t}`,r.textContent=i),b.className=t,b.textContent=i,x.textContent=e},M=(e,t)=>{t&&t!==`0`?E.innerHTML=`${e}<span class="penalty">+${t}</span>`:E.textContent=e},N=e=>{var t;m.activeTab=e,O.classList.remove(`hidden`),d(e),D.querySelectorAll(`.simulator-tab`).forEach(t=>{t.classList.toggle(`active`,t.getAttribute(`data-tab`)===e)}),g.querySelectorAll(`.simulator-tab-content`).forEach(t=>{t.classList.toggle(`active`,t.id===`simulator-tab-${e}`)}),w.classList.toggle(`active`,e===`auth`);let n=f.find(t=>t.id===e);n==null||(t=n.onActivate)==null||t.call(n,B)},P=e=>{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)},F=()=>{c.updatePreview(B)},I=function(){var t=e.t(function*(){var e,t;if(m.puzzleData)return m.puzzleData;if(!a||a.size===0)throw Error(`No fixtures configured. Add puzzle fixture files (.json or .toml) to a fixtures directory and pass fixturesGlob to the simulator.`);let n=(e=m.selectedCategory)==null?o[0]:e,r=n?a.get(n):void 0;if(!r||r.size===0)throw Error(`No puzzles found in fixture category "${n}"`);let i=(t=m.selectedPuzzle)==null?r.keys().next().value:t,s=i?r.get(i):void 0;if(!s)throw Error(`Puzzle "${i}" not found in category "${n}"`);m.puzzleData=s,console.log(`Simulator: Puzzle loaded from fixtures`,{category:n,puzzle:i}),m.originalPuzzle=s;let c=k(`#simulator-puzzle`);return c&&(c.value=m.originalPuzzle),m.activeTab===`thumb`&&F(),m.puzzleData});return function(){return t.apply(this,arguments)}}(),L=ee(e=>{s.addLogEntry(e,B)}),R=(e,t)=>{te(e,t,L)},z=(e,t)=>{let n=g.querySelector(`[data-badge="${e}"]`);n&&(n.textContent=t&&t>0?String(t):``)},B={state:m,getElement:k,sendToGame:R,logMessage:L.log,loadPuzzle:I,updateStatus:j,updateTimer:M,setCollapsed:P,switchTab:N,updateThumbnail:F,updateBadge:z,fixtures:a,fixtureCategories:o,gameSlug:(r=t.slug)==null?null:r};console.log(`[Simulator] Context created with gameSlug:`,B.gameSlug),f.forEach(e=>e.bind(B)),D.querySelectorAll(`.simulator-tab`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-tab`);N(t),z(t,0)})}),T.addEventListener(`click`,e=>{e.stopPropagation(),P(!0)}),S.addEventListener(`click`,e=>{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`));let t=k(`#simulator-pause`);t&&(t.textContent=m.isPaused?`Resume`:`Pause`)}),C.addEventListener(`click`,e=>{e.stopPropagation(),R(`RETRY_PUZZLE`,{}),m.hasStarted=!1,m.isPaused=!1,A(!1),S.disabled=!0,j(`Ready to retry`,`ready`);let t=k(`#simulator-pause`),n=k(`#simulator-start`);t&&(t.disabled=!0,t.textContent=`Pause`),n&&(n.textContent=`Start`)}),w.addEventListener(`click`,e=>{e.stopPropagation(),m.isCollapsed&&P(!1),N(`auth`)}),y.addEventListener(`click`,e=>{m.isCollapsed&&e.target!==T&&P(!1)}),m.isCollapsed||N(m.activeTab);let V=new URLSearchParams(window.location.search);(V.has(`code`)||V.has(`error`))&&(P(!1),N(`auth`));let H=e=>({userState:{gameSettings:{},id:`simulator-user`,ownerID:`simulator-owner`},currentUser:{id:`simulator-user`,name:`Simulator`,username:`simulator`,usernameID:`0000`,type:`User`,roles:``,nakamaID:null},startOrFindGameplay:{gamePlayed:{additionalTimeAddedSecs:0,boardState:m.currentInputStr,combinedTimeSecs:0,completed:!1,createdAt:new Date().toISOString(),elapsedTimeSecs:0,id:`simulator-gameplay-${Date.now()}`,ownerID:`simulator-owner`,pointsAwarded:0,slug:`simulator-game`,viewerOwnsPuzzle:!0,puzzle:{id:`simulator-puzzle`,name:`Proto Jig Puzzle`,puzzle:e,game:{displayName:`Proto Game`,jsPath:``,slug:`proto-game`},mostRecentDaily:null}}},theme:m.selectedTheme,hostContext:[{type:`app`,layout:`desktop`,host:null}],appRuntimeContract:`1.0`}),U=function(){var t=e.t(function*(){j(`Loading puzzle...`,`waiting`);try{let e=H(yield I());j(`Sending READY_DATA...`,`waiting`),R(`READY_DATA`,e),j(`Waiting for game to load...`,`waiting`)}catch(e){j(`Error: ${e}`,`paused`)}});return function(){return t.apply(this,arguments)}}(),W=()=>{console.log(`Simulator: Game loaded, ready to start`),C.disabled=!1,f.forEach(e=>{var t;return(t=e.onMessage)==null?void 0:t.call(e,`READY_GAME_LOADED`,void 0,B)}),i&&!m.hasStarted&&setTimeout(()=>{let e=k(`#simulator-start`);e==null||e.click(),S.disabled=!1,m.hasStarted=!0,j(`Running`,`ready`)},100)};return ne((e,t)=>{var n,r;if(e===`READY`){console.log(`Simulator: Received READY from game`),U();return}if(e===`INITIALIZE_SETTINGS`){console.log(`Simulator: Game initialized settings`,t);return}if(e===`READY_GAME_LOADED`){W();return}if(e===`TIMER_TICK`){if(t!=null&&t.display){let[e,n]=t.display;M(e,n)}return}if(e===`TIMER_SYNC`)return;if(e===`SIDEBAR_UPDATE`){console.log(`Simulator: Sidebar update`,t);return}f.forEach(n=>{var r;return(r=n.onMessage)==null?void 0:r.call(n,e,t,B)});let i=(n=t==null||(r=t.input)==null?void 0:r.boardState)==null?t==null?void 0:t.boardState:n;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!`,`complete`))},L),console.log(`Simulator initialized`),$={updateFixtures:e=>{a=v(e),o=Array.from(a.keys()).sort(),B.fixtures=a,B.fixtureCategories=o;let t=localStorage.getItem(`simulator-fixture-category`);if(!m.selectedCategory||!o.includes(m.selectedCategory)){var n;m.selectedCategory=t&&o.includes(t)?t:(n=o[0])==null?null:n}let r=f.find(e=>e.id===`ctrl`);r==null||r.bind(B),console.log(`Simulator: Fixtures updated`,{categories:o,selectedCategory:m.selectedCategory})},sendToGame:R,loadPuzzle:I},$}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Re}});
1529
- //# sourceMappingURL=createSimulator-CC0PhepL.cjs.map
1618
+ `,document.body.appendChild(g);let _=g.querySelector(`#simulator-panel`),ee=g.querySelector(`#simulator-header`),v=g.querySelector(`#simulator-header-indicator`),y=g.querySelector(`#simulator-header-status-text`),b=g.querySelector(`#simulator-header-pause`),x=g.querySelector(`#simulator-header-retry`),S=g.querySelector(`#simulator-header-settings`),C=g.querySelector(`#simulator-toggle`),w=g.querySelector(`#simulator-timer`),T=g.querySelector(`#simulator-tabs`),E=g.querySelector(`#simulator-content`),D=e=>g.querySelector(e),O=e=>{b.innerHTML=e?h.play:h.pause,b.title=e?`Resume`:`Pause`},k=(e,t)=>{let n=D(`#simulator-status .text`),r=D(`#simulator-status .indicator`),i=t===`complete`?`✓`:``;n&&(n.textContent=e),r&&(r.className=`indicator ${t}`,r.textContent=i),v.className=t,v.textContent=i,y.textContent=e},A=(e,t)=>{t&&t!==`0`?w.innerHTML=`${e}<span class="penalty">+${t}</span>`:w.textContent=e},j=e=>{var t;f.activeTab=e,E.classList.remove(`hidden`),m(e),T.querySelectorAll(`.simulator-tab`).forEach(t=>{t.classList.toggle(`active`,t.getAttribute(`data-tab`)===e)}),g.querySelectorAll(`.simulator-tab-content`).forEach(t=>{t.classList.toggle(`active`,t.id===`simulator-tab-${e}`)}),S.classList.toggle(`active`,e===`auth`);let n=l.find(t=>t.id===e);n==null||(t=n.onActivate)==null||t.call(n,R)},M=e=>{f.isCollapsed=e,_.classList.toggle(`collapsed`,e),p(e),e?(E.classList.add(`hidden`),T.querySelectorAll(`.simulator-tab`).forEach(e=>e.classList.remove(`active`))):j(f.activeTab)},N=()=>{c.updatePreview(R)},P=function(){var e=t.t(function*(){var e,t;if(f.puzzleData)return f.puzzleData;if(!a||a.size===0)throw Error(`No fixtures configured. Add puzzle fixture files (.json or .toml) to a fixtures directory and pass fixturesGlob to the simulator.`);let n=(e=f.selectedCategory)==null?o[0]:e,r=n?a.get(n):void 0;if(!r||r.size===0)throw Error(`No puzzles found in fixture category "${n}"`);let i=(t=f.selectedPuzzle)==null?r.keys().next().value:t,s=i?r.get(i):void 0;if(!s)throw Error(`Puzzle "${i}" not found in category "${n}"`);f.puzzleData=s,console.log(`Simulator: Puzzle loaded from fixtures`,{category:n,puzzle:i}),f.originalPuzzle=s;let c=D(`#simulator-puzzle`);return c&&(c.value=f.originalPuzzle),f.activeTab===`thumb`&&N(),f.puzzleData});return function(){return e.apply(this,arguments)}}(),F=te(e=>{s.addLogEntry(e,R)}),I=(e,t)=>{ne(e,t,F)},L=(e,t)=>{let n=g.querySelector(`[data-badge="${e}"]`);n&&(n.textContent=t&&t>0?String(t):``)},R={state:f,getElement:D,sendToGame:I,logMessage:F.log,loadPuzzle:P,updateStatus:k,updateTimer:A,setCollapsed:M,switchTab:j,updateThumbnail:N,updateBadge:L,fixtures:a,fixtureCategories:o,gameSlug:(r=e.slug)==null?null:r};console.log(`[Simulator] Context created with gameSlug:`,R.gameSlug),l.forEach(e=>e.bind(R)),T.querySelectorAll(`.simulator-tab`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-tab`);j(t),L(t,0)})}),C.addEventListener(`click`,e=>{e.stopPropagation(),M(!0)}),b.addEventListener(`click`,e=>{e.stopPropagation(),f.isPaused?(I(`RESUME_GAME`,{}),f.isPaused=!1,O(!1),k(`Running`,`ready`)):(I(`PAUSE_GAME`,{}),f.isPaused=!0,O(!0),k(`Paused`,`paused`));let t=D(`#simulator-pause`);t&&(t.textContent=f.isPaused?`Resume`:`Pause`)}),x.addEventListener(`click`,e=>{e.stopPropagation(),I(`RETRY_PUZZLE`,{}),f.hasStarted=!1,f.isPaused=!1,O(!1),b.disabled=!0,k(`Ready to retry`,`ready`);let t=D(`#simulator-pause`),n=D(`#simulator-start`);t&&(t.disabled=!0,t.textContent=`Pause`),n&&(n.textContent=`Start`)}),S.addEventListener(`click`,e=>{e.stopPropagation(),f.isCollapsed&&M(!1),j(`auth`)}),ee.addEventListener(`click`,e=>{f.isCollapsed&&e.target!==C&&M(!1)}),f.isCollapsed||j(f.activeTab);let z=new URLSearchParams(window.location.search);(z.has(`code`)||z.has(`error`))&&(M(!1),j(`auth`));let fe=e=>({userState:{gameSettings:f.gameSettings,id:`simulator-user`,ownerID:`simulator-owner`},currentUser:{id:`simulator-user`,name:`Simulator`,username:`simulator`,usernameID:`0000`,type:`User`,roles:``,nakamaID:null},startOrFindGameplay:{gamePlayed:{additionalTimeAddedSecs:0,boardState:f.currentInputStr,combinedTimeSecs:0,completed:!1,createdAt:new Date().toISOString(),elapsedTimeSecs:0,id:`simulator-gameplay-${Date.now()}`,ownerID:`simulator-owner`,pointsAwarded:0,slug:`simulator-game`,viewerOwnsPuzzle:!0,puzzle:{id:`simulator-puzzle`,name:`Proto Jig Puzzle`,puzzle:e,game:{displayName:`Proto Game`,jsPath:``,slug:`proto-game`},mostRecentDaily:null}}},theme:f.selectedTheme,hostContext:[{type:`app`,layout:`desktop`,host:null}],appRuntimeContract:`1.0`}),B=function(){var e=t.t(function*(){k(`Loading puzzle...`,`waiting`);try{let e=fe(yield P());k(`Sending READY_DATA...`,`waiting`),I(`READY_DATA`,e),k(`Waiting for game to load...`,`waiting`)}catch(e){k(`Error: ${e}`,`paused`)}});return function(){return e.apply(this,arguments)}}(),pe=()=>{console.log(`Simulator: Game loaded, ready to start`),x.disabled=!1,l.forEach(e=>{var t;return(t=e.onMessage)==null?void 0:t.call(e,`READY_GAME_LOADED`,void 0,R)}),i&&!f.hasStarted&&setTimeout(()=>{let e=D(`#simulator-start`);e==null||e.click(),b.disabled=!1,f.hasStarted=!0,k(`Running`,`ready`)},100)};return re((e,t)=>{var n,r;if(e===`READY`){console.log(`Simulator: Received READY from game`),B();return}if(e===`READY_GAME_LOADED`){pe();return}if(e===`TIMER_TICK`){if(t!=null&&t.display){let[e,n]=t.display;A(e,n)}return}if(e===`TIMER_SYNC`)return;if(e===`SIDEBAR_UPDATE`){console.log(`Simulator: Sidebar update`,t);return}l.forEach(n=>{var r;return(r=n.onMessage)==null?void 0:r.call(n,e,t,R)});let i=(n=t==null||(r=t.input)==null?void 0:r.boardState)==null?t==null?void 0:t.boardState:n;e===`UPLOAD_NEW_GAME_STATE`&&i&&(f.currentInputStr=i,f.activeTab===`thumb`&&N(),console.log(`Simulator: Game state uploaded`,t)),e===`GAME_COMPLETED`&&(console.log(`Simulator: Game completed!`,t),b.disabled=!0,f.hasStarted=!1,k(`Completed!`,`complete`))},F),console.log(`Simulator initialized`),$={updateFixtures:e=>{a=ie(e),o=Array.from(a.keys()).sort(),R.fixtures=a,R.fixtureCategories=o;let t=localStorage.getItem(`simulator-fixture-category`);if(!f.selectedCategory||!o.includes(f.selectedCategory)){var n;f.selectedCategory=t&&o.includes(t)?t:(n=o[0])==null?null:n}let r=l.find(e=>e.id===`ctrl`);r==null||r.bind(R),console.log(`Simulator: Fixtures updated`,{categories:o,selectedCategory:f.selectedCategory})},sendToGame:I,loadPuzzle:P},$}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ke}});
1619
+ //# sourceMappingURL=createSimulator-B7x0QRdO.cjs.map