@puzzmo/sdk 1.0.29 → 1.0.31

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-GzKfEQWQ.cjs} +127 -29
  4. package/dist/createSimulator-GzKfEQWQ.cjs.map +1 -0
  5. package/dist/{createSimulator-CWwSv8gh.js → createSimulator-xa9RclNq.js} +546 -330
  6. package/dist/createSimulator-xa9RclNq.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 +86 -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
package/dist/index.js CHANGED
@@ -1,58 +1,173 @@
1
- import { t as e } from "./asyncToGenerator-CPSNHDFw.js";
2
- import { t } from "./objectSpread2-vLYiAtaU.js";
3
- function n(e) {
1
+ import { t as e } from "./objectSpread2-COovHPnD.js";
2
+ import { t } from "./asyncToGenerator-Dn36a-ch.js";
3
+ var n = function() {
4
+ var n = t(function* (t, n, r, i) {
5
+ try {
6
+ let a = e(e({}, t), {}, {
7
+ eventType: n,
8
+ elapsedTimeOnComplete: i,
9
+ metadata: r
10
+ }), o = yield fetch(`${t.apiRoot}events`, {
11
+ method: "POST",
12
+ headers: { "Content-Type": "application/json" },
13
+ body: JSON.stringify(a),
14
+ keepalive: !0
15
+ });
16
+ o.ok || console.warn(`Analytics event failed: ${n} - ${o.status} ${o.statusText}`);
17
+ } catch (e) {
18
+ console.warn(`Analytics event error: ${n}`, e);
19
+ }
20
+ });
21
+ return function(e, t, r, i) {
22
+ return n.apply(this, arguments);
23
+ };
24
+ }();
25
+ const r = (e) => {
26
+ let t = {
27
+ context: e,
28
+ updateCount: 0,
29
+ startTime: /* @__PURE__ */ new Date(),
30
+ tracked: {
31
+ pageView: !1,
32
+ gameplayActive: !1,
33
+ active30s: !1,
34
+ completed: !1
35
+ }
36
+ };
37
+ return {
38
+ trackEvent: (e, r) => {
39
+ let i = ((/* @__PURE__ */ new Date()).getTime() - t.startTime.getTime()) / 1e3;
40
+ switch (e) {
41
+ case "READY_GAME_LOADED":
42
+ t.tracked.pageView || (n(t.context, "page_view"), t.tracked.pageView = !0);
43
+ break;
44
+ case "UPLOAD_NEW_GAME_STATE":
45
+ t.updateCount++, t.updateCount > 2 && !t.tracked.gameplayActive && (n(t.context, "gameplay_active"), t.tracked.gameplayActive = !0), i > 30 && !t.tracked.active30s && (n(t.context, "active_30s"), t.tracked.active30s = !0);
46
+ break;
47
+ case "GAME_COMPLETED":
48
+ !t.tracked.completed && r != null && r.input && (n(t.context, "completed", {}, r.input.elapsedTimeSecs), t.tracked.completed = !0);
49
+ break;
50
+ }
51
+ },
52
+ trackLinkClick: (e) => {
53
+ n(t.context, "link_click", e);
54
+ }
55
+ };
56
+ }, i = (e) => {
57
+ if (!u(e)) return null;
58
+ let t = o();
59
+ if (!t.enabled) return null;
60
+ let n = s(e, t.apiRoot);
61
+ return n ? r(n) : null;
62
+ }, a = (e) => {
63
+ if (typeof document > "u") return () => {};
64
+ let t = (t) => {
65
+ var n, r;
66
+ let i = t.target;
67
+ if (!(i instanceof Element)) return;
68
+ let a = i.closest("a[href]");
69
+ a instanceof HTMLAnchorElement && e({
70
+ href: a.href,
71
+ text: (n = (r = a.textContent) == null ? void 0 : r.trim()) == null ? "" : n,
72
+ target: a.target
73
+ });
74
+ };
75
+ return document.addEventListener("click", t), () => document.removeEventListener("click", t);
76
+ };
77
+ /** Picks the events endpoint, and disables analytics entirely on localhost (dev + simulator). */
78
+ var o = () => {
79
+ if (typeof window > "u" || !window.location) return {
80
+ apiRoot: "",
81
+ enabled: !1
82
+ };
83
+ let e = window.location.hostname;
84
+ return e === "localhost" || e === "127.0.0.1" || e === "0.0.0.0" || e === "[::1]" || e.endsWith(".localhost") ? {
85
+ apiRoot: "",
86
+ enabled: !1
87
+ } : {
88
+ apiRoot: e.includes("staging") ? "https://api-staging.puzzmo.com/" : "https://api.puzzmo.com/",
89
+ enabled: !0
90
+ };
91
+ }, s = (e, t) => {
92
+ var n, r, i, a, o, s, l, u, f, p, m;
93
+ let h = e == null || (n = e.startOrFindGameplay) == null ? void 0 : n.gamePlayed;
94
+ if (!h) return null;
95
+ let g = h.puzzle, _ = (r = e == null ? void 0 : e.hostContext) == null ? [] : r;
96
+ return {
97
+ gameSlug: (i = (a = g.game) == null ? void 0 : a.slug) == null ? "unknown" : i,
98
+ puzzleID: g.id,
99
+ gameplayOwnerID: h.ownerID || (e == null || (o = e.userState) == null ? void 0 : o.id) || "unknown",
100
+ apiRoot: t,
101
+ userType: c(e == null || (s = e.currentUser) == null ? void 0 : s.type),
102
+ runtimeType: d(_),
103
+ userID: e == null || (l = e.currentUser) == null ? void 0 : l.id,
104
+ teamSlug: ((u = g.team) == null ? void 0 : u.slug) || void 0,
105
+ partnerSlug: ((f = _.find((e) => (e == null ? void 0 : e.type) === "embed")) == null || (f = f.partner) == null ? void 0 : f.slug) || void 0,
106
+ dailyDateKey: (p = g.mostRecentDaily) == null || (p = p.daily) == null ? void 0 : p.dateKey,
107
+ embedID: ((m = _.find((e) => (e == null ? void 0 : e.type) === "embed")) == null ? void 0 : m.embedID) || void 0
108
+ };
109
+ }, c = (e) => !e || e === "Unverified" ? "anon" : e === "Paid" ? "paid" : "user", l = 512, u = (e) => {
110
+ var t, n;
111
+ let r = e == null || (t = e.startOrFindGameplay) == null || (t = t.gamePlayed) == null || (t = t.puzzle) == null ? void 0 : t.game, i = r == null ? void 0 : r.flagsArr;
112
+ return ((Array.isArray(i) ? (n = i[0]) == null ? 0 : n : typeof i == "number" ? i : 0) & l) === l;
113
+ }, d = (e) => {
114
+ if (e.find((e) => (e == null ? void 0 : e.type) === "embed")) return "iframe";
115
+ let t = e.find((e) => (e == null ? void 0 : e.type) === "app");
116
+ return (t == null ? void 0 : t.host) === "__embed" ? "simple_embed" : (t == null ? void 0 : t.host) === "app-embed" ? "app_embed" : (t == null ? void 0 : t.host) === "ios-app" ? "ios_native" : "puzzmo_com";
117
+ };
118
+ function f(e) {
4
119
  let t = e >= 3600 * 1e3;
5
120
  return new Date(e).toISOString().slice(t ? 11 : 14, -1).split(".")[0];
6
121
  }
7
- function r(e = 0, t = 0) {
8
- let r = e, i = t, a = 0, o, s, c, l = () => {
122
+ function p(e = 0, t = 0) {
123
+ let n = e, r = t, i = 0, a, o, s, c = () => {
9
124
  var e;
10
- if (s === void 0) return r + i;
11
- if (o !== void 0) return o;
12
- let t = ((e = c) == null ? performance.now() : e) - s - a;
13
- return r + i + t;
125
+ if (o === void 0) return n + r;
126
+ if (a !== void 0) return a;
127
+ let t = ((e = s) == null ? performance.now() : e) - o - i;
128
+ return n + r + t;
14
129
  };
15
130
  return {
16
131
  _init: () => {
17
- s === void 0 && (s = performance.now(), c = void 0);
132
+ o === void 0 && (o = performance.now(), s = void 0);
18
133
  },
19
134
  _pause: () => {
20
- c !== void 0 || s === void 0 || (c = performance.now());
135
+ s !== void 0 || o === void 0 || (s = performance.now());
21
136
  },
22
137
  _resume: () => {
23
- c !== void 0 && (a += performance.now() - c, c = void 0);
138
+ s !== void 0 && (i += performance.now() - s, s = void 0);
24
139
  },
25
140
  _reset: (e = 0, t = 0) => {
26
- r = e, i = t, a = 0, o = void 0, s = void 0, c = void 0;
141
+ n = e, r = t, i = 0, a = void 0, o = void 0, s = void 0;
27
142
  },
28
143
  _conclude: () => {
29
- if (c !== void 0) {
30
- o = l();
144
+ if (s !== void 0) {
145
+ a = c();
31
146
  return;
32
147
  }
33
- if (s === void 0) {
34
- o = r + i;
148
+ if (o === void 0) {
149
+ a = n + r;
35
150
  return;
36
151
  }
37
- o = l();
152
+ a = c();
38
153
  },
39
- timeMs: () => l(),
40
- timeSecs: () => l() / 1e3,
41
- addedTimeMs: () => i,
42
- addedTimeSecs: () => i / 1e3,
43
- timeWithoutPenaltySecs: () => (l() - i) / 1e3,
154
+ timeMs: () => c(),
155
+ timeSecs: () => c() / 1e3,
156
+ addedTimeMs: () => r,
157
+ addedTimeSecs: () => r / 1e3,
158
+ timeWithoutPenaltySecs: () => (c() - r) / 1e3,
44
159
  addPenalty: (e) => {
45
- i += e;
160
+ r += e;
46
161
  },
47
- isPaused: () => c !== void 0 || s === void 0,
48
- isRunning: () => s !== void 0 && c === void 0,
162
+ isPaused: () => s !== void 0 || o === void 0,
163
+ isRunning: () => o !== void 0 && s === void 0,
49
164
  display: () => {
50
- let e = l() - i;
51
- return [n(Math.max(0, e)), i === 0 ? "" : n(i)];
165
+ let e = c() - r;
166
+ return [f(Math.max(0, e)), r === 0 ? "" : f(r)];
52
167
  }
53
168
  };
54
169
  }
55
- function i() {
170
+ function m() {
56
171
  let e = /* @__PURE__ */ new Map();
57
172
  return typeof window < "u" && window.addEventListener("message", (t) => {
58
173
  var n;
@@ -81,12 +196,12 @@ function i() {
81
196
  })
82
197
  };
83
198
  }
84
- var a = i();
199
+ var h = m();
85
200
  /** Creates a Puzzmo SDK instance for communicating with the Puzzmo host */
86
- const o = (n = {}) => {
87
- let i = null, o = null, s = () => {
201
+ const g = (n = {}) => {
202
+ let r = null, o = null, s = () => {
88
203
  var e;
89
- return i == null || (e = i.startOrFindGameplay) == null ? void 0 : e.gamePlayed;
204
+ return r == null || (e = r.startOrFindGameplay) == null ? void 0 : e.gamePlayed;
90
205
  }, c = () => {
91
206
  var e, t;
92
207
  return (e = (t = s()) == null ? void 0 : t.id) == null ? null : e;
@@ -98,59 +213,67 @@ const o = (n = {}) => {
98
213
  return (e = (t = s()) == null ? void 0 : t.boardState) == null ? null : e;
99
214
  }, d = () => {
100
215
  var e;
101
- return (e = i == null ? void 0 : i.theme) == null ? null : e;
216
+ return (e = r == null ? void 0 : r.theme) == null ? null : e;
102
217
  }, f = () => {
103
218
  var e, t;
104
219
  return (e = (t = s()) == null ? void 0 : t.completed) == null ? !1 : e;
105
- }, p = /* @__PURE__ */ new Map(), m = r(), h = null, g = null, _ = () => {
106
- h || (h = setInterval(() => {
107
- if (m.isPaused()) return;
108
- let [e, t] = m.display();
109
- a.sendMessage("TIMER_TICK", { display: [e, t] });
110
- }, 500), g = setInterval(() => {
111
- m.isPaused() || a.sendMessage("TIMER_SYNC", Math.floor(m.timeWithoutPenaltySecs()));
220
+ }, m = /* @__PURE__ */ new Map(), g = null, v = null, y = !1, b = (e, t) => {
221
+ y || v == null || v.trackEvent(e, t);
222
+ }, x = p(), S = null, C = null, w = () => {
223
+ S || (S = setInterval(() => {
224
+ if (x.isPaused()) return;
225
+ let [e, t] = x.display();
226
+ h.sendMessage("TIMER_TICK", { display: [e, t] });
227
+ }, 500), C = setInterval(() => {
228
+ x.isPaused() || h.sendMessage("TIMER_SYNC", Math.floor(x.timeWithoutPenaltySecs()));
112
229
  }, 1e4));
113
- }, v = () => {
114
- h && (clearInterval(h), h = null), g && (clearInterval(g), g = null);
115
- }, y = (e, t) => {
116
- let n = p.get(e);
230
+ }, T = () => {
231
+ S && (clearInterval(S), S = null), C && (clearInterval(C), C = null);
232
+ }, E = (e, t) => {
233
+ let n = m.get(e);
117
234
  n && n.forEach((e) => e(t));
118
235
  };
119
- return a.onMessage("START_GAME", () => {
120
- m._init(), _(), y("start");
121
- }), a.onMessage("PAUSE_GAME", () => {
122
- m._pause(), y("pause");
123
- }), a.onMessage("RESUME_GAME", () => {
124
- m._resume(), y("resume");
125
- }), a.onMessage("SETTINGS_UPDATE", (e) => y("settingsUpdate", e)), a.onMessage("KEYBOARD_KEY_PRESS", (e) => y("keyboardKeyPress", e)), a.onMessage("KEYBOARD_CURSOR_CHANGE", (e) => y("keyboardCursorChange", e)), a.onMessage("KEYBOARD_CURSOR_END", () => y("keyboardCursorEnd")), a.onMessage("RETRY_PUZZLE", () => {
126
- m._reset(), v(), y("retry");
127
- }), a.onMessage("READY_DATA", (e) => {
128
- var t;
129
- let n = e;
130
- i = n;
131
- let r = (t = n.startOrFindGameplay) == null ? void 0 : t.gamePlayed;
132
- if (r) {
133
- var a, s;
134
- let e = ((a = r.elapsedTimeSecs) == null ? 0 : a) * 1e3, t = ((s = r.additionalTimeAddedSecs) == null ? 0 : s) * 1e3;
135
- m._reset(e, t);
236
+ return h.onMessage("START_GAME", () => {
237
+ x._init(), w(), E("start");
238
+ }), h.onMessage("PAUSE_GAME", () => {
239
+ x._pause(), E("pause");
240
+ }), h.onMessage("RESUME_GAME", () => {
241
+ x._resume(), E("resume");
242
+ }), h.onMessage("SETTINGS_UPDATE", (t) => {
243
+ g = e(e({}, g), t), E("settingsUpdate", g);
244
+ }), h.onMessage("KEYBOARD_KEY_PRESS", (e) => E("keyboardKeyPress", e)), h.onMessage("KEYBOARD_CURSOR_CHANGE", (e) => E("keyboardCursorChange", e)), h.onMessage("KEYBOARD_CURSOR_END", () => E("keyboardCursorEnd")), h.onMessage("RETRY_PUZZLE", () => {
245
+ x._reset(), T(), E("retry");
246
+ }), h.onMessage("READY_DATA", (e) => {
247
+ var t, n, s;
248
+ let c = e;
249
+ r = c, g === null && (g = (t = (n = c.userState) == null ? void 0 : n.gameSettings) == null ? {} : t);
250
+ let l = (s = c.startOrFindGameplay) == null ? void 0 : s.gamePlayed;
251
+ if (l) {
252
+ var u, d;
253
+ let e = ((u = l.elapsedTimeSecs) == null ? 0 : u) * 1e3, t = ((d = l.additionalTimeAddedSecs) == null ? 0 : d) * 1e3;
254
+ x._reset(e, t);
136
255
  }
137
- o && (o(n), o = null);
256
+ if (!v) {
257
+ var f;
258
+ v = i(c), y = (f = l == null ? void 0 : l.completed) == null ? !1 : f, v && a((e) => v.trackLinkClick(e));
259
+ }
260
+ o && (o(c), o = null);
138
261
  }), {
139
262
  timer: {
140
- timeMs: () => m.timeMs(),
141
- timeSecs: () => m.timeSecs(),
142
- addedTimeMs: () => m.addedTimeMs(),
143
- addedTimeSecs: () => m.addedTimeSecs(),
144
- timeWithoutPenaltySecs: () => m.timeWithoutPenaltySecs(),
145
- display: () => m.display(),
146
- addPenalty: (e) => m.addPenalty(e),
147
- isPaused: () => m.isPaused(),
148
- isRunning: () => m.isRunning()
263
+ timeMs: () => x.timeMs(),
264
+ timeSecs: () => x.timeSecs(),
265
+ addedTimeMs: () => x.addedTimeMs(),
266
+ addedTimeSecs: () => x.addedTimeSecs(),
267
+ timeWithoutPenaltySecs: () => x.timeWithoutPenaltySecs(),
268
+ display: () => x.display(),
269
+ addPenalty: (e) => x.addPenalty(e),
270
+ isPaused: () => x.isPaused(),
271
+ isRunning: () => x.isRunning()
149
272
  },
150
273
  gameReady: function() {
151
- var t = e(function* () {
274
+ var e = t(function* () {
152
275
  var e;
153
- if (a.sendMessage("READY", {}), l()) {
276
+ if (h.sendMessage("READY", {}), l()) {
154
277
  let e = u();
155
278
  return {
156
279
  puzzleString: l(),
@@ -158,7 +281,7 @@ const o = (n = {}) => {
158
281
  boardState: e,
159
282
  theme: d(),
160
283
  completed: f(),
161
- readyData: i
284
+ readyData: r
162
285
  };
163
286
  }
164
287
  let t = (e = n.timeout) == null ? 5e3 : e;
@@ -167,73 +290,73 @@ const o = (n = {}) => {
167
290
  o && (o = null, n(/* @__PURE__ */ Error(`Timeout waiting for READY_DATA after ${t}ms`)));
168
291
  }, t);
169
292
  });
170
- let r = l();
171
- if (!r) throw Error("READY_DATA received but no puzzle data found");
172
- let s = u();
293
+ let i = l();
294
+ if (!i) throw Error("READY_DATA received but no puzzle data found");
295
+ let a = u();
173
296
  return {
174
- puzzleString: r,
175
- inputString: s,
176
- boardState: s,
297
+ puzzleString: i,
298
+ inputString: a,
299
+ boardState: a,
177
300
  theme: d(),
178
301
  completed: f(),
179
- readyData: i
302
+ readyData: r
180
303
  };
181
304
  });
182
305
  return function() {
183
- return t.apply(this, arguments);
306
+ return e.apply(this, arguments);
184
307
  };
185
308
  }(),
186
309
  gameLoaded: (e = {}) => {
187
- a.sendMessage("READY_GAME_LOADED", {
310
+ h.sendMessage("READY_GAME_LOADED", {
188
311
  state: e,
189
312
  gameRuntimeContract: "1.0",
190
313
  embedRuntimeContract: "1.0"
191
- });
314
+ }), b("READY_GAME_LOADED");
192
315
  },
193
- on: (e, t) => (p.has(e) || p.set(e, /* @__PURE__ */ new Set()), p.get(e).add(t), () => {
316
+ on: (e, t) => (m.has(e) || m.set(e, /* @__PURE__ */ new Set()), m.get(e).add(t), () => {
194
317
  var n;
195
- (n = p.get(e)) == null || n.delete(t);
318
+ (n = m.get(e)) == null || n.delete(t);
196
319
  }),
197
320
  off: (e, t) => {
198
321
  var n;
199
- (n = p.get(e)) == null || n.delete(t);
322
+ (n = m.get(e)) == null || n.delete(t);
200
323
  },
201
324
  updateGameState: (e, t) => {
202
325
  var n, r;
203
326
  let i = c();
204
- i && a.sendMessage("UPLOAD_NEW_GAME_STATE", {
327
+ i && (h.sendMessage("UPLOAD_NEW_GAME_STATE", {
205
328
  id: i,
206
329
  input: {
207
330
  boardState: e,
208
- elapsedTimeSecs: (n = t == null ? void 0 : t.elapsedTimeSecs) == null ? m.timeWithoutPenaltySecs() : n,
209
- additionalTimeAddedSecs: (r = t == null ? void 0 : t.additionalTimeAddedSecs) == null ? m.addedTimeSecs() : r,
331
+ elapsedTimeSecs: (n = t == null ? void 0 : t.elapsedTimeSecs) == null ? x.timeWithoutPenaltySecs() : n,
332
+ additionalTimeAddedSecs: (r = t == null ? void 0 : t.additionalTimeAddedSecs) == null ? x.addedTimeSecs() : r,
210
333
  collabUserReferences: []
211
334
  }
212
- });
335
+ }), b("UPLOAD_NEW_GAME_STATE"));
213
336
  },
214
- gameCompleted: (e, n) => {
215
- var r, i, o, s, l;
216
- m._conclude(), v();
217
- let u = t(t({}, e), {}, {
218
- elapsedTimeSecs: (r = e.elapsedTimeSecs) == null ? m.timeWithoutPenaltySecs() : r,
219
- additionalTimeAddedSecs: (i = e.additionalTimeAddedSecs) == null ? m.addedTimeSecs() : i
220
- }), d = (o = n == null ? void 0 : n.deeds) == null ? [] : o;
221
- d.push({
337
+ gameCompleted: (t, n) => {
338
+ var r, i, a, o, s;
339
+ x._conclude(), T();
340
+ let l = e(e({}, t), {}, {
341
+ elapsedTimeSecs: (r = t.elapsedTimeSecs) == null ? x.timeWithoutPenaltySecs() : r,
342
+ additionalTimeAddedSecs: (i = t.additionalTimeAddedSecs) == null ? x.addedTimeSecs() : i
343
+ }), u = (a = n == null ? void 0 : n.deeds) == null ? [] : a;
344
+ u.push({
222
345
  id: "points",
223
- value: e.pointsAwarded
224
- }), d.push({
346
+ value: t.pointsAwarded
347
+ }), u.push({
225
348
  id: "time",
226
- value: Math.round((s = u.elapsedTimeSecs) == null ? 0 : s) + Math.round((l = u.additionalTimeAddedSecs) == null ? 0 : l)
349
+ value: Math.round((o = l.elapsedTimeSecs) == null ? 0 : o) + Math.round((s = l.additionalTimeAddedSecs) == null ? 0 : s)
227
350
  });
228
- let f = c();
229
- f && a.sendMessage("GAME_COMPLETED", {
230
- id: f,
231
- input: u,
351
+ let d = c();
352
+ d && (h.sendMessage("GAME_COMPLETED", {
353
+ id: d,
354
+ input: l,
232
355
  config: n
233
- });
356
+ }), b("GAME_COMPLETED", { input: l }));
234
357
  },
235
358
  showCompletionScreen: (e, t, n = !0) => {
236
- a.sendMessage("SHOW_GAME_COMPLETE_SCREEN", {
359
+ h.sendMessage("SHOW_GAME_COMPLETE_SCREEN", {
237
360
  results: e,
238
361
  showRetry: n,
239
362
  gameplay: t
@@ -242,26 +365,37 @@ const o = (n = {}) => {
242
365
  hitCheckpoint: (e, t, n) => {
243
366
  var r;
244
367
  if (!c()) return;
245
- let i = (r = u()) == null ? "" : r, o = {
246
- elapsedTimeSecs: m.timeWithoutPenaltySecs(),
247
- additionalTimeAddedSecs: m.addedTimeSecs()
368
+ let i = (r = u()) == null ? "" : r, a = {
369
+ elapsedTimeSecs: x.timeWithoutPenaltySecs(),
370
+ additionalTimeAddedSecs: x.addedTimeSecs()
248
371
  };
249
- a.sendMessage("HIT_CHECKPOINT", {
372
+ h.sendMessage("HIT_CHECKPOINT", {
250
373
  checkpointName: e,
251
374
  gameplay: {
252
375
  inputStr: i,
253
- play: o
376
+ play: a
254
377
  },
255
378
  checkpointConfig: t,
256
379
  augConfig: n == null ? {} : n
257
380
  });
258
381
  },
382
+ settings: {
383
+ initialize: (t) => (g = e(e({}, _(t)), g), h.sendMessage("INITIALIZE_SETTINGS", {
384
+ components: t,
385
+ settings: g
386
+ }), g),
387
+ get: () => {
388
+ var e;
389
+ return (e = g) == null ? {} : e;
390
+ },
391
+ update: (t) => (g = e(e({}, g), t), h.sendMessage("UPDATE_SETTINGS_FROM_EMBED", { settings: g }), g)
392
+ },
259
393
  keyboard: {
260
394
  show: (e) => {
261
- a.sendMessage("KEYBOARD_UPDATE_CONFIG", e);
395
+ h.sendMessage("KEYBOARD_UPDATE_CONFIG", e);
262
396
  },
263
397
  hide: () => {
264
- a.sendMessage("KEYBOARD_UPDATE_CONFIG", {
398
+ h.sendMessage("KEYBOARD_UPDATE_CONFIG", {
265
399
  layout: [],
266
400
  symbols: {},
267
401
  highlight: [],
@@ -272,9 +406,28 @@ const o = (n = {}) => {
272
406
  });
273
407
  }
274
408
  },
275
- _hostAPI: a
409
+ _hostAPI: h
276
410
  };
277
- }, s = {
411
+ };
412
+ /** Walks settings UI components (recursing into split groups) collecting name → defaultValue pairs */
413
+ function _(e) {
414
+ let t = {};
415
+ for (let n of e) n.type === "split" ? Object.assign(t, _(n.content)) : "name" in n && (t[n.name] = n.defaultValue);
416
+ return t;
417
+ }
418
+ /**
419
+ * A standard QWERTY layout with Enter and Backspace — a reasonable default for
420
+ * any game that needs text input. Customize from here by spreading and overriding.
421
+ *
422
+ * @example
423
+ * // Use as-is
424
+ * sdk.keyboard.show(defaultKeyboardConfig)
425
+ *
426
+ * @example
427
+ * // Extend with dynamic disabled letters
428
+ * sdk.keyboard.show({ ...defaultKeyboardConfig, disabled: usedLetters })
429
+ */
430
+ const v = {
278
431
  layout: [
279
432
  "qwertyuiop",
280
433
  "asdfghjkl",
@@ -292,11 +445,11 @@ const o = (n = {}) => {
292
445
  supportsDragCursor: !1
293
446
  };
294
447
  /** Custom error class for workshop import failures */
295
- var c = class extends Error {
448
+ var y = class extends Error {
296
449
  constructor(e, t, n) {
297
450
  super(t), this.type = e, this.originalError = n, this.name = "EditorImportError";
298
451
  }
299
452
  };
300
- export { c as EditorImportError, o as createPuzzmoSDK, s as defaultKeyboardConfig };
453
+ export { y as EditorImportError, g as createPuzzmoSDK, v as defaultKeyboardConfig };
301
454
 
302
455
  //# sourceMappingURL=index.js.map