@puzzmo/sdk 1.0.28 → 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.
- package/dist/analytics.d.ts +52 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/{createSimulator-CC0PhepL.cjs → createSimulator-B7x0QRdO.cjs} +119 -29
- package/dist/createSimulator-B7x0QRdO.cjs.map +1 -0
- package/dist/{createSimulator-CWwSv8gh.js → createSimulator-DqF2fN_0.js} +526 -330
- package/dist/createSimulator-DqF2fN_0.js.map +1 -0
- package/dist/editor.d.ts +12 -2
- package/dist/editor.d.ts.map +1 -1
- package/dist/gameTracker.d.ts +16 -0
- package/dist/gameTracker.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +273 -120
- package/dist/index.js.map +1 -1
- package/dist/inputs/index.cjs +1 -1
- package/dist/inputs/index.js +1 -1
- package/dist/sdk.d.ts +18 -4
- package/dist/sdk.d.ts.map +1 -1
- package/dist/settings.spec.d.ts +2 -0
- package/dist/settings.spec.d.ts.map +1 -0
- package/dist/simulator/createSimulator.d.ts.map +1 -1
- package/dist/simulator/index.cjs +1 -1
- package/dist/simulator/index.js +1 -1
- package/dist/simulator/standalone.cjs +1 -1
- package/dist/simulator/standalone.js +1 -1
- package/dist/simulator/state.d.ts +2 -0
- package/dist/simulator/state.d.ts.map +1 -1
- package/dist/simulator/styles.d.ts +1 -1
- package/dist/simulator/styles.d.ts.map +1 -1
- package/dist/simulator/types.d.ts +5 -1
- package/dist/simulator/types.d.ts.map +1 -1
- package/dist/simulator/views/SettingsView.d.ts +8 -0
- package/dist/simulator/views/SettingsView.d.ts.map +1 -0
- package/dist/simulator/views/index.d.ts +1 -0
- package/dist/simulator/views/index.d.ts.map +1 -1
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vite.cjs +2 -2
- package/dist/vite.js +18 -18
- package/package.json +1 -1
- package/dist/createSimulator-CC0PhepL.cjs.map +0 -1
- package/dist/createSimulator-CWwSv8gh.js.map +0 -1
- /package/dist/{asyncToGenerator-BlxRHn40.cjs → asyncToGenerator-DANjdFmB.cjs} +0 -0
- /package/dist/{asyncToGenerator-CPSNHDFw.js → asyncToGenerator-Dn36a-ch.js} +0 -0
- /package/dist/{objectSpread2-vLYiAtaU.js → objectSpread2-COovHPnD.js} +0 -0
- /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(`./
|
|
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
|
|
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=
|
|
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`?
|
|
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">${
|
|
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">${
|
|
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=
|
|
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">${
|
|
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,
|
|
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,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}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,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}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">${
|
|
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
|
|
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
|
|
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
|
|
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`,
|
|
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
|
-
${
|
|
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),
|
|
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> ${
|
|
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`);
|
|
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(
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
|
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(
|
|
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){
|
|
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,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}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="${
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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`),
|
|
1529
|
-
//# sourceMappingURL=createSimulator-
|
|
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
|