cubing 0.28.0 → 0.28.4

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 (107) hide show
  1. package/README.md +3 -1
  2. package/dist/esm/alg/index.js +4 -4
  3. package/dist/esm/bluetooth/index.js +222 -86
  4. package/dist/esm/bluetooth/index.js.map +3 -3
  5. package/dist/esm/{chunk-F4WWCPVE.js → chunk-2IZUSAXQ.js} +2 -2
  6. package/dist/esm/{chunk-F4WWCPVE.js.map → chunk-2IZUSAXQ.js.map} +1 -1
  7. package/dist/esm/{chunk-KBOIUBUE.js → chunk-DGJ3VGQO.js} +28 -12
  8. package/dist/esm/{chunk-KBOIUBUE.js.map → chunk-DGJ3VGQO.js.map} +1 -1
  9. package/dist/esm/{chunk-NJPSC7SH.js → chunk-GW4FGG42.js} +8 -4
  10. package/dist/esm/{chunk-NJPSC7SH.js.map → chunk-GW4FGG42.js.map} +1 -1
  11. package/dist/esm/{chunk-4KIZAW2Z.js → chunk-LSCTPPWV.js} +22 -8
  12. package/dist/esm/{chunk-4KIZAW2Z.js.map → chunk-LSCTPPWV.js.map} +1 -1
  13. package/dist/esm/{chunk-GXZIBFSN.js → chunk-NI7U4XAZ.js} +380 -242
  14. package/dist/esm/chunk-NI7U4XAZ.js.map +7 -0
  15. package/dist/esm/{chunk-GVPTO3OF.js → chunk-OX6O2ZO5.js} +1 -1
  16. package/dist/esm/{chunk-GVPTO3OF.js.map → chunk-OX6O2ZO5.js.map} +1 -1
  17. package/dist/esm/{chunk-LTPPXK6F.js → chunk-PYWGREIP.js} +44 -13
  18. package/dist/esm/chunk-PYWGREIP.js.map +7 -0
  19. package/dist/esm/{chunk-JAGHV77R.js → chunk-QDVCP6G7.js} +179 -76
  20. package/dist/esm/chunk-QDVCP6G7.js.map +7 -0
  21. package/dist/esm/chunk-RQGVI4ZL.js +1137 -0
  22. package/dist/esm/chunk-RQGVI4ZL.js.map +7 -0
  23. package/dist/esm/{chunk-MGJA5U5O.js → chunk-SBZRVSPK.js} +1 -12
  24. package/dist/esm/{chunk-MGJA5U5O.js.map → chunk-SBZRVSPK.js.map} +0 -0
  25. package/dist/esm/{chunk-V55YSWJY.js → chunk-WXCNEGW3.js} +10 -4
  26. package/dist/esm/{chunk-V55YSWJY.js.map → chunk-WXCNEGW3.js.map} +1 -1
  27. package/dist/esm/{chunk-UP6RBLG2.js → chunk-XU5ILFX5.js} +137 -66
  28. package/dist/esm/{chunk-UP6RBLG2.js.map → chunk-XU5ILFX5.js.map} +3 -3
  29. package/dist/esm/{chunk-4V4RM3YJ.js → chunk-Y22I7F7D.js} +21 -12
  30. package/dist/esm/{chunk-4V4RM3YJ.js.map → chunk-Y22I7F7D.js.map} +2 -2
  31. package/dist/esm/{chunk-ALBEW4DJ.js → chunk-ZB3P5AZN.js} +1 -1
  32. package/dist/esm/{chunk-ALBEW4DJ.js.map → chunk-ZB3P5AZN.js.map} +1 -1
  33. package/dist/esm/{chunk-47SWOA3X.js → chunk-ZNAYJGVL.js} +2 -2
  34. package/dist/esm/{chunk-47SWOA3X.js.map → chunk-ZNAYJGVL.js.map} +1 -1
  35. package/dist/esm/kpuzzle/index.js +3 -3
  36. package/dist/esm/notation/index.js +3 -3
  37. package/dist/esm/protocol/index.js +5 -5
  38. package/dist/esm/puzzle-geometry/index.js +4570 -15
  39. package/dist/esm/puzzle-geometry/index.js.map +4 -4
  40. package/dist/esm/puzzles/index.js +5 -5
  41. package/dist/esm/{puzzles-dynamic-3x3x3-NB2PEZTV.js → puzzles-dynamic-3x3x3-KIG5A6QR.js} +2 -2
  42. package/dist/esm/{puzzles-dynamic-3x3x3-NB2PEZTV.js.map → puzzles-dynamic-3x3x3-KIG5A6QR.js.map} +0 -0
  43. package/dist/esm/puzzles-dynamic-4x4x4-PEDAPUZK.js +126 -0
  44. package/dist/esm/puzzles-dynamic-4x4x4-PEDAPUZK.js.map +7 -0
  45. package/dist/esm/{puzzles-dynamic-side-events-WZI4Y3N6.js → puzzles-dynamic-side-events-5C7LMBWX.js} +2 -2
  46. package/dist/esm/{puzzles-dynamic-side-events-WZI4Y3N6.js.map → puzzles-dynamic-side-events-5C7LMBWX.js.map} +0 -0
  47. package/dist/esm/{puzzles-dynamic-unofficial-FUG3JBMH.js → puzzles-dynamic-unofficial-WWJ4NJMX.js} +2 -2
  48. package/dist/esm/{puzzles-dynamic-unofficial-FUG3JBMH.js.map → puzzles-dynamic-unofficial-WWJ4NJMX.js.map} +0 -0
  49. package/dist/esm/scramble/index.js +5 -5
  50. package/dist/esm/search/index.js +10 -10
  51. package/dist/esm/{search-dynamic-sgs-side-events-ZTOWSMQT.js → search-dynamic-sgs-side-events-MZN22QGN.js} +37 -21
  52. package/dist/esm/search-dynamic-sgs-side-events-MZN22QGN.js.map +7 -0
  53. package/dist/esm/{search-dynamic-sgs-unofficial-V6HZTLGM.js → search-dynamic-sgs-unofficial-AHPCH5XJ.js} +35 -14
  54. package/dist/esm/{search-dynamic-sgs-unofficial-V6HZTLGM.js.map → search-dynamic-sgs-unofficial-AHPCH5XJ.js.map} +2 -2
  55. package/dist/esm/{search-dynamic-solve-3x3x3-K42IWMQV.js → search-dynamic-solve-3x3x3-7XZTYQMO.js} +795 -142
  56. package/dist/esm/{search-dynamic-solve-3x3x3-K42IWMQV.js.map → search-dynamic-solve-3x3x3-7XZTYQMO.js.map} +1 -1
  57. package/dist/esm/{search-dynamic-solve-4x4x4-YH6SB2WB.js → search-dynamic-solve-4x4x4-IBS66QTP.js} +135 -29
  58. package/dist/esm/{search-dynamic-solve-4x4x4-YH6SB2WB.js.map → search-dynamic-solve-4x4x4-IBS66QTP.js.map} +1 -1
  59. package/dist/esm/{search-dynamic-solve-fto-O6UXF7EC.js → search-dynamic-solve-fto-4LI23P6K.js} +253 -69
  60. package/dist/esm/{search-dynamic-solve-fto-O6UXF7EC.js.map → search-dynamic-solve-fto-4LI23P6K.js.map} +2 -2
  61. package/dist/esm/{search-dynamic-solve-kilominx-ZPEOK4DY.js → search-dynamic-solve-kilominx-3HEVQ4MC.js} +32 -8
  62. package/dist/esm/{search-dynamic-solve-kilominx-ZPEOK4DY.js.map → search-dynamic-solve-kilominx-3HEVQ4MC.js.map} +2 -2
  63. package/dist/esm/{search-dynamic-solve-master_tetraminx-3RKD3IAN.js → search-dynamic-solve-master_tetraminx-UB32C7MM.js} +111 -42
  64. package/dist/esm/{search-dynamic-solve-master_tetraminx-3RKD3IAN.js.map → search-dynamic-solve-master_tetraminx-UB32C7MM.js.map} +2 -2
  65. package/dist/esm/{search-dynamic-solve-sq1-WIJEGVLP.js → search-dynamic-solve-sq1-HA72TYF2.js} +54 -9
  66. package/dist/esm/{search-dynamic-solve-sq1-WIJEGVLP.js.map → search-dynamic-solve-sq1-HA72TYF2.js.map} +2 -2
  67. package/dist/esm/search-worker-inside-generated-string-AMEXYCKK.js +3886 -0
  68. package/dist/esm/search-worker-inside-generated-string-AMEXYCKK.js.map +7 -0
  69. package/dist/esm/{search-worker-js-entry-3VKCL3RX.js → search-worker-js-entry-HUD3PWTB.js} +147 -53
  70. package/dist/esm/{search-worker-js-entry-3VKCL3RX.js.map → search-worker-js-entry-HUD3PWTB.js.map} +2 -2
  71. package/dist/esm/{search-worker-ts-entry-J3TDBCMV.js → search-worker-ts-entry-HER6WT5D.js} +5 -5
  72. package/dist/esm/{search-worker-ts-entry-J3TDBCMV.js.map → search-worker-ts-entry-HER6WT5D.js.map} +1 -1
  73. package/dist/esm/stream/index.js +12 -8
  74. package/dist/esm/stream/index.js.map +1 -1
  75. package/dist/esm/twisty/index.js +1164 -1513
  76. package/dist/esm/twisty/index.js.map +4 -4
  77. package/dist/esm/{twisty-dynamic-3d-UQJETF7O.js → twisty-dynamic-3d-NJUXK7KI.js} +358 -146
  78. package/dist/esm/twisty-dynamic-3d-NJUXK7KI.js.map +7 -0
  79. package/dist/types/{Alg-e2a80975.d.ts → Alg-137fb0d5.d.ts} +19 -16
  80. package/dist/types/{KState-a2f0e651.d.ts → KState-a73111d7.d.ts} +1 -9
  81. package/dist/types/{TwizzleLink-cd0fa192.d.ts → TwizzleLink-bef52ecd.d.ts} +47 -13
  82. package/dist/types/alg/index.d.ts +7 -6
  83. package/dist/types/bluetooth/index.d.ts +4 -4
  84. package/dist/types/{bluetooth-puzzle-3670a6a1.d.ts → bluetooth-puzzle-8a678993.d.ts} +9 -9
  85. package/dist/types/kpuzzle/index.d.ts +2 -2
  86. package/dist/types/notation/index.d.ts +1 -1
  87. package/dist/types/{outside-0ce1b145.d.ts → outside-e55f28a0.d.ts} +2 -2
  88. package/dist/types/{parse-ec97687c.d.ts → parseAlg-a28f7568.d.ts} +1 -1
  89. package/dist/types/protocol/index.d.ts +2 -2
  90. package/dist/types/puzzle-geometry/index.d.ts +3 -3
  91. package/dist/types/puzzles/index.d.ts +5 -5
  92. package/dist/types/scramble/index.d.ts +3 -3
  93. package/dist/types/search/index.d.ts +3 -3
  94. package/dist/types/stream/index.d.ts +5 -5
  95. package/dist/types/twisty/index.d.ts +13 -6
  96. package/package.json +43 -40
  97. package/dist/esm/chunk-7BLWQDZX.js +0 -342
  98. package/dist/esm/chunk-7BLWQDZX.js.map +0 -7
  99. package/dist/esm/chunk-GXZIBFSN.js.map +0 -7
  100. package/dist/esm/chunk-JAGHV77R.js.map +0 -7
  101. package/dist/esm/chunk-LTPPXK6F.js.map +0 -7
  102. package/dist/esm/chunk-ROGN5SXC.js +0 -4386
  103. package/dist/esm/chunk-ROGN5SXC.js.map +0 -7
  104. package/dist/esm/search-dynamic-sgs-side-events-ZTOWSMQT.js.map +0 -7
  105. package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js +0 -3768
  106. package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js.map +0 -7
  107. package/dist/esm/twisty-dynamic-3d-UQJETF7O.js.map +0 -7
@@ -1,28 +1,36 @@
1
1
  import {
2
+ CSSSource,
2
3
  DEGREES_PER_RADIAN,
3
4
  FreshListenerManager,
5
+ HTMLElementShim,
4
6
  HintFaceletProp,
7
+ ManagedCustomElement,
5
8
  NO_VALUE,
9
+ RenderScheduler,
6
10
  SimpleTwistyPropSource,
7
11
  StaleDropper,
8
12
  THREEJS,
13
+ Twisty3DVantage,
9
14
  TwistyPropDerived,
10
15
  TwistyPropSource,
11
- proxy3D
12
- } from "../chunk-7BLWQDZX.js";
13
- import "../chunk-GVPTO3OF.js";
16
+ customElementsShim,
17
+ proxy3D,
18
+ setCameraFromOrbitCoordinates,
19
+ setTwistyDebug
20
+ } from "../chunk-RQGVI4ZL.js";
21
+ import "../chunk-OX6O2ZO5.js";
14
22
  import {
15
23
  countAnimatedLeaves,
16
24
  countMoves
17
- } from "../chunk-47SWOA3X.js";
25
+ } from "../chunk-ZNAYJGVL.js";
18
26
  import {
19
27
  cube3x3x3,
20
28
  puzzles
21
- } from "../chunk-JAGHV77R.js";
29
+ } from "../chunk-QDVCP6G7.js";
22
30
  import {
23
31
  customPGPuzzleLoader
24
- } from "../chunk-LTPPXK6F.js";
25
- import "../chunk-UP6RBLG2.js";
32
+ } from "../chunk-PYWGREIP.js";
33
+ import "../chunk-XU5ILFX5.js";
26
34
  import {
27
35
  Alg,
28
36
  AlgBuilder,
@@ -35,40 +43,8 @@ import {
35
43
  direct,
36
44
  directedGenerator,
37
45
  experimentalAppendMove
38
- } from "../chunk-GXZIBFSN.js";
39
- import {
40
- __privateAdd,
41
- __privateGet,
42
- __privateMethod,
43
- __privateSet
44
- } from "../chunk-MGJA5U5O.js";
45
-
46
- // src/cubing/twisty/controllers/RenderScheduler.ts
47
- var RenderScheduler = class {
48
- constructor(callback) {
49
- this.callback = callback;
50
- this.animFrameID = null;
51
- this.animFrame = this.animFrameWrapper.bind(this);
52
- }
53
- requestIsPending() {
54
- return !!this.animFrameID;
55
- }
56
- requestAnimFrame() {
57
- if (!this.animFrameID) {
58
- this.animFrameID = requestAnimationFrame(this.animFrame);
59
- }
60
- }
61
- cancelAnimFrame() {
62
- if (this.animFrameID) {
63
- cancelAnimationFrame(this.animFrameID);
64
- this.animFrameID = 0;
65
- }
66
- }
67
- animFrameWrapper(timestamp) {
68
- this.animFrameID = 0;
69
- this.callback(timestamp);
70
- }
71
- };
46
+ } from "../chunk-NI7U4XAZ.js";
47
+ import "../chunk-SBZRVSPK.js";
72
48
 
73
49
  // src/cubing/twisty/controllers/AnimationTypes.ts
74
50
  function directionScalar(direction) {
@@ -117,7 +93,9 @@ var CatchUpHelper = class {
117
93
  this.model = model;
118
94
  this.catchingUp = false;
119
95
  this.pendingFrame = false;
120
- this.scheduler = new RenderScheduler(this.animFrame.bind(this));
96
+ this.scheduler = new RenderScheduler(
97
+ this.animFrame.bind(this)
98
+ );
121
99
  this.catchUpMs = 500;
122
100
  this.lastTimestamp = 0;
123
101
  }
@@ -137,41 +115,43 @@ var CatchUpHelper = class {
137
115
  this.scheduler.requestAnimFrame();
138
116
  const delta = (timestamp - this.lastTimestamp) / this.catchUpMs;
139
117
  this.lastTimestamp = timestamp;
140
- this.model.catchUpMove.set((async () => {
141
- const previousCatchUpMove = await this.model.catchUpMove.get();
142
- if (previousCatchUpMove.move === null) {
143
- return previousCatchUpMove;
144
- }
145
- const amount = previousCatchUpMove.amount + delta;
146
- if (amount >= 1) {
147
- this.pendingFrame = true;
148
- this.stop();
149
- this.model.timestampRequest.set("end");
118
+ this.model.catchUpMove.set(
119
+ (async () => {
120
+ const previousCatchUpMove = await this.model.catchUpMove.get();
121
+ if (previousCatchUpMove.move === null) {
122
+ return previousCatchUpMove;
123
+ }
124
+ const amount = previousCatchUpMove.amount + delta;
125
+ if (amount >= 1) {
126
+ this.pendingFrame = true;
127
+ this.stop();
128
+ this.model.timestampRequest.set("end");
129
+ return {
130
+ move: null,
131
+ amount: 0
132
+ };
133
+ }
134
+ this.pendingFrame = false;
150
135
  return {
151
- move: null,
152
- amount: 0
136
+ move: previousCatchUpMove.move,
137
+ amount
153
138
  };
154
- }
155
- this.pendingFrame = false;
156
- return {
157
- move: previousCatchUpMove.move,
158
- amount
159
- };
160
- })());
139
+ })()
140
+ );
161
141
  }
162
142
  };
163
- var _effectiveTimestampMilliseconds, effectiveTimestampMilliseconds_fn, _animFrameEffectiveTimestampStaleDropper;
164
143
  var TwistyAnimationController = class {
165
144
  constructor(model, delegate) {
166
145
  this.delegate = delegate;
167
- __privateAdd(this, _effectiveTimestampMilliseconds);
168
146
  this.playing = false;
169
147
  this.direction = 1 /* Forwards */;
170
148
  this.lastDatestamp = 0;
171
- this.scheduler = new RenderScheduler(this.animFrame.bind(this));
172
- __privateAdd(this, _animFrameEffectiveTimestampStaleDropper, new StaleDropper());
149
+ this.scheduler = new RenderScheduler(
150
+ this.animFrame.bind(this)
151
+ );
152
+ this.#animFrameEffectiveTimestampStaleDropper = new StaleDropper();
173
153
  this.model = model;
174
- this.lastTimestampPromise = __privateMethod(this, _effectiveTimestampMilliseconds, effectiveTimestampMilliseconds_fn).call(this);
154
+ this.lastTimestampPromise = this.#effectiveTimestampMilliseconds();
175
155
  this.model.playingInfo.addFreshListener(this.onPlayingProp.bind(this));
176
156
  this.catchUpHelper = new CatchUpHelper(this.model);
177
157
  this.model.catchUpMove.addFreshListener(this.onCatchUpMoveProp.bind(this));
@@ -188,6 +168,9 @@ var TwistyAnimationController = class {
188
168
  }
189
169
  this.scheduler.requestAnimFrame();
190
170
  }
171
+ async #effectiveTimestampMilliseconds() {
172
+ return (await this.model.detailedTimelineInfo.get()).timestamp;
173
+ }
191
174
  jumpToStart(options) {
192
175
  this.model.timestampRequest.set("start");
193
176
  this.pause();
@@ -230,7 +213,7 @@ var TwistyAnimationController = class {
230
213
  });
231
214
  this.playing = true;
232
215
  this.lastDatestamp = performance.now();
233
- this.lastTimestampPromise = __privateMethod(this, _effectiveTimestampMilliseconds, effectiveTimestampMilliseconds_fn).call(this);
216
+ this.lastTimestampPromise = this.#effectiveTimestampMilliseconds();
234
217
  this.scheduler.requestAnimFrame();
235
218
  }
236
219
  pause() {
@@ -241,18 +224,21 @@ var TwistyAnimationController = class {
241
224
  untilBoundary: "entire-timeline" /* EntireTimeline */
242
225
  });
243
226
  }
227
+ #animFrameEffectiveTimestampStaleDropper;
244
228
  async animFrame(frameDatestamp) {
245
229
  if (this.playing) {
246
230
  this.scheduler.requestAnimFrame();
247
231
  }
248
232
  const lastDatestamp = this.lastDatestamp;
249
- const freshenerResult = await __privateGet(this, _animFrameEffectiveTimestampStaleDropper).queue(Promise.all([
250
- this.model.playingInfo.get(),
251
- this.lastTimestampPromise,
252
- this.model.timeRange.get(),
253
- this.model.tempoScale.get(),
254
- this.model.currentMoveInfo.get()
255
- ]));
233
+ const freshenerResult = await this.#animFrameEffectiveTimestampStaleDropper.queue(
234
+ Promise.all([
235
+ this.model.playingInfo.get(),
236
+ this.lastTimestampPromise,
237
+ this.model.timeRange.get(),
238
+ this.model.tempoScale.get(),
239
+ this.model.currentMoveInfo.get()
240
+ ])
241
+ );
256
242
  const [playingInfo, lastTimestamp, timeRange, tempoScale, currentMoveInfo] = freshenerResult;
257
243
  if (!playingInfo.playing) {
258
244
  this.playing = false;
@@ -273,7 +259,11 @@ var TwistyAnimationController = class {
273
259
  let newSmartTimestampRequest = null;
274
260
  if (newTimestamp >= end) {
275
261
  if (playingInfo.loop) {
276
- newTimestamp = modIntoRange(newTimestamp, timeRange.start, timeRange.end);
262
+ newTimestamp = modIntoRange(
263
+ newTimestamp,
264
+ timeRange.start,
265
+ timeRange.end
266
+ );
277
267
  } else {
278
268
  if (newTimestamp === timeRange.end) {
279
269
  newSmartTimestampRequest = "end";
@@ -287,7 +277,11 @@ var TwistyAnimationController = class {
287
277
  }
288
278
  } else if (newTimestamp <= start) {
289
279
  if (playingInfo.loop) {
290
- newTimestamp = modIntoRange(newTimestamp, timeRange.start, timeRange.end);
280
+ newTimestamp = modIntoRange(
281
+ newTimestamp,
282
+ timeRange.start,
283
+ timeRange.end
284
+ );
291
285
  } else {
292
286
  if (newTimestamp === timeRange.start) {
293
287
  newSmartTimestampRequest = "start";
@@ -305,11 +299,6 @@ var TwistyAnimationController = class {
305
299
  this.model.timestampRequest.set(newSmartTimestampRequest ?? newTimestamp);
306
300
  }
307
301
  };
308
- _effectiveTimestampMilliseconds = new WeakSet();
309
- effectiveTimestampMilliseconds_fn = async function() {
310
- return (await this.model.detailedTimelineInfo.get()).timestamp;
311
- };
312
- _animFrameEffectiveTimestampStaleDropper = new WeakMap();
313
302
 
314
303
  // src/cubing/twisty/controllers/TwistyPlayerController.ts
315
304
  var TwistyPlayerController = class {
@@ -348,77 +337,6 @@ var ControlPanelProp = class extends SimpleTwistyPropSource {
348
337
  }
349
338
  };
350
339
 
351
- // src/cubing/twisty/views/node-custom-element-shims.ts
352
- var HTMLElementStub = class {
353
- };
354
- var HTMLElementShim;
355
- if (globalThis.HTMLElement) {
356
- HTMLElementShim = HTMLElement;
357
- } else {
358
- HTMLElementShim = HTMLElementStub;
359
- }
360
- var CustomElementsStub = class {
361
- define() {
362
- }
363
- };
364
- var customElementsShim;
365
- if (globalThis.customElements) {
366
- customElementsShim = customElements;
367
- } else {
368
- customElementsShim = new CustomElementsStub();
369
- }
370
-
371
- // src/cubing/twisty/views/ManagedCustomElement.ts
372
- var CSSSource = class {
373
- constructor(sourceText) {
374
- this.sourceText = sourceText;
375
- }
376
- getAsString() {
377
- return this.sourceText;
378
- }
379
- };
380
- var _cssSourceMap;
381
- var ManagedCustomElement = class extends HTMLElementShim {
382
- constructor(options) {
383
- super();
384
- __privateAdd(this, _cssSourceMap, /* @__PURE__ */ new Map());
385
- this.shadow = this.attachShadow({ mode: options?.mode ?? "closed" });
386
- this.contentWrapper = document.createElement("div");
387
- this.contentWrapper.classList.add("wrapper");
388
- this.shadow.appendChild(this.contentWrapper);
389
- }
390
- addCSS(cssSource) {
391
- const existing = __privateGet(this, _cssSourceMap).get(cssSource);
392
- if (existing) {
393
- return existing;
394
- }
395
- const cssElem = document.createElement("style");
396
- cssElem.textContent = cssSource.getAsString();
397
- __privateGet(this, _cssSourceMap).set(cssSource, cssElem);
398
- this.shadow.appendChild(cssElem);
399
- return cssElem;
400
- }
401
- removeCSS(cssSource) {
402
- const cssElem = __privateGet(this, _cssSourceMap).get(cssSource);
403
- if (!cssElem) {
404
- return;
405
- }
406
- this.shadow.removeChild(cssElem);
407
- __privateGet(this, _cssSourceMap).delete(cssSource);
408
- }
409
- addElement(element) {
410
- return this.contentWrapper.appendChild(element);
411
- }
412
- prependElement(element) {
413
- this.contentWrapper.prepend(element);
414
- }
415
- removeElement(element) {
416
- return this.contentWrapper.removeChild(element);
417
- }
418
- };
419
- _cssSourceMap = new WeakMap();
420
- customElementsShim.define("twisty-managed-custom-element", ManagedCustomElement);
421
-
422
340
  // src/cubing/twisty/views/TwistyViewerWrapper.css.ts
423
341
  var twistyViewerWrapperCSS = new CSSSource(`
424
342
  :host {
@@ -617,29 +535,67 @@ var KPuzzleSVGWrapper = class {
617
535
  for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
618
536
  for (let orientation = 0; orientation < orbitDefinition.numOrientations; orientation++) {
619
537
  const id = this.elementID(orbitName, idx, orientation);
620
- const fromCur = this.elementID(orbitName, curTransformationOrbit.permutation[idx], (orbitDefinition.numOrientations - curTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations);
538
+ const fromCur = this.elementID(
539
+ orbitName,
540
+ curTransformationOrbit.permutation[idx],
541
+ (orbitDefinition.numOrientations - curTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations
542
+ );
621
543
  let singleColor = false;
622
544
  if (nextTransformationOrbit) {
623
- const fromNext = this.elementID(orbitName, nextTransformationOrbit.permutation[idx], (orbitDefinition.numOrientations - nextTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations);
545
+ const fromNext = this.elementID(
546
+ orbitName,
547
+ nextTransformationOrbit.permutation[idx],
548
+ (orbitDefinition.numOrientations - nextTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations
549
+ );
624
550
  if (fromCur === fromNext) {
625
551
  singleColor = true;
626
552
  }
627
553
  fraction = fraction || 0;
628
554
  const easedBackwardsPercent = 100 * (1 - fraction * fraction * (2 - fraction * fraction));
629
- this.gradients[id].children[0].setAttribute("stop-color", this.originalColors[fromCur]);
630
- this.gradients[id].children[1].setAttribute("stop-color", this.originalColors[fromCur]);
631
- this.gradients[id].children[1].setAttribute("offset", `${Math.max(easedBackwardsPercent - 5, 0)}%`);
632
- this.gradients[id].children[2].setAttribute("offset", `${Math.max(easedBackwardsPercent - 5, 0)}%`);
633
- this.gradients[id].children[3].setAttribute("offset", `${easedBackwardsPercent}%`);
634
- this.gradients[id].children[4].setAttribute("offset", `${easedBackwardsPercent}%`);
635
- this.gradients[id].children[4].setAttribute("stop-color", this.originalColors[fromNext]);
636
- this.gradients[id].children[5].setAttribute("stop-color", this.originalColors[fromNext]);
555
+ this.gradients[id].children[0].setAttribute(
556
+ "stop-color",
557
+ this.originalColors[fromCur]
558
+ );
559
+ this.gradients[id].children[1].setAttribute(
560
+ "stop-color",
561
+ this.originalColors[fromCur]
562
+ );
563
+ this.gradients[id].children[1].setAttribute(
564
+ "offset",
565
+ `${Math.max(easedBackwardsPercent - 5, 0)}%`
566
+ );
567
+ this.gradients[id].children[2].setAttribute(
568
+ "offset",
569
+ `${Math.max(easedBackwardsPercent - 5, 0)}%`
570
+ );
571
+ this.gradients[id].children[3].setAttribute(
572
+ "offset",
573
+ `${easedBackwardsPercent}%`
574
+ );
575
+ this.gradients[id].children[4].setAttribute(
576
+ "offset",
577
+ `${easedBackwardsPercent}%`
578
+ );
579
+ this.gradients[id].children[4].setAttribute(
580
+ "stop-color",
581
+ this.originalColors[fromNext]
582
+ );
583
+ this.gradients[id].children[5].setAttribute(
584
+ "stop-color",
585
+ this.originalColors[fromNext]
586
+ );
637
587
  } else {
638
588
  singleColor = true;
639
589
  }
640
590
  if (singleColor) {
641
- this.gradients[id].children[0].setAttribute("stop-color", this.originalColors[fromCur]);
642
- this.gradients[id].children[1].setAttribute("stop-color", this.originalColors[fromCur]);
591
+ this.gradients[id].children[0].setAttribute(
592
+ "stop-color",
593
+ this.originalColors[fromCur]
594
+ );
595
+ this.gradients[id].children[1].setAttribute(
596
+ "stop-color",
597
+ this.originalColors[fromCur]
598
+ );
643
599
  this.gradients[id].children[1].setAttribute("offset", `100%`);
644
600
  this.gradients[id].children[2].setAttribute("offset", `100%`);
645
601
  this.gradients[id].children[3].setAttribute("offset", `100%`);
@@ -650,7 +606,10 @@ var KPuzzleSVGWrapper = class {
650
606
  }
651
607
  }
652
608
  newGradient(id, originalColor) {
653
- const grad = document.createElementNS(xmlns, "radialGradient");
609
+ const grad = document.createElementNS(
610
+ xmlns,
611
+ "radialGradient"
612
+ );
654
613
  grad.setAttribute("id", `grad-${this.svgID}-${id}`);
655
614
  grad.setAttribute("r", `70.7107%`);
656
615
  const stopDefs = [
@@ -679,7 +638,6 @@ var KPuzzleSVGWrapper = class {
679
638
  };
680
639
 
681
640
  // src/cubing/twisty/views/2D/Twisty2DPuzzle.ts
682
- var _cachedPosition, _freshListenerManager;
683
641
  var Twisty2DPuzzle = class extends ManagedCustomElement {
684
642
  constructor(model, kpuzzle, svgSource, options, puzzleLoader) {
685
643
  super();
@@ -689,22 +647,30 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
689
647
  this.options = options;
690
648
  this.puzzleLoader = puzzleLoader;
691
649
  this.scheduler = new RenderScheduler(this.render.bind(this));
692
- __privateAdd(this, _cachedPosition, null);
693
- __privateAdd(this, _freshListenerManager, new FreshListenerManager());
650
+ this.#cachedPosition = null;
651
+ this.#freshListenerManager = new FreshListenerManager();
694
652
  this.addCSS(twisty2DSVGCSS);
695
653
  this.resetSVG();
696
- __privateGet(this, _freshListenerManager).addListener(this.model.puzzleID, (puzzleID) => {
697
- if (puzzleLoader?.id !== puzzleID) {
698
- this.disconnect();
654
+ this.#freshListenerManager.addListener(
655
+ this.model.puzzleID,
656
+ (puzzleID) => {
657
+ if (puzzleLoader?.id !== puzzleID) {
658
+ this.disconnect();
659
+ }
699
660
  }
700
- });
701
- __privateGet(this, _freshListenerManager).addListener(this.model.legacyPosition, this.onPositionChange.bind(this));
661
+ );
662
+ this.#freshListenerManager.addListener(
663
+ this.model.legacyPosition,
664
+ this.onPositionChange.bind(this)
665
+ );
702
666
  if (this.options?.experimentalStickering) {
703
667
  this.experimentalSetStickering(this.options.experimentalStickering);
704
668
  }
705
669
  }
670
+ #cachedPosition;
671
+ #freshListenerManager;
706
672
  disconnect() {
707
- __privateGet(this, _freshListenerManager).disconnect();
673
+ this.#freshListenerManager.disconnect();
708
674
  }
709
675
  onPositionChange(position) {
710
676
  try {
@@ -715,13 +681,21 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
715
681
  partialMove = move.invert();
716
682
  }
717
683
  const newState = position.state.applyMove(partialMove);
718
- this.svgWrapper.draw(position.state, newState, position.movesInProgress[0].fraction);
684
+ this.svgWrapper.draw(
685
+ position.state,
686
+ newState,
687
+ position.movesInProgress[0].fraction
688
+ );
719
689
  } else {
720
690
  this.svgWrapper.draw(position.state);
721
- __privateSet(this, _cachedPosition, position);
691
+ this.#cachedPosition = position;
722
692
  }
723
693
  } catch (e) {
724
- console.warn("Bad position (this doesn't necessarily mean something is wrong). Pre-emptively disconnecting:", this.puzzleLoader?.id, e);
694
+ console.warn(
695
+ "Bad position (this doesn't necessarily mean something is wrong). Pre-emptively disconnecting:",
696
+ this.puzzleLoader?.id,
697
+ e
698
+ );
725
699
  this.disconnect();
726
700
  }
727
701
  }
@@ -744,146 +718,153 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
744
718
  if (!this.kpuzzle) {
745
719
  return;
746
720
  }
747
- this.svgWrapper = new KPuzzleSVGWrapper(this.kpuzzle, this.svgSource, appearance);
721
+ this.svgWrapper = new KPuzzleSVGWrapper(
722
+ this.kpuzzle,
723
+ this.svgSource,
724
+ appearance
725
+ );
748
726
  this.addElement(this.svgWrapper.wrapperElement);
749
- if (__privateGet(this, _cachedPosition)) {
750
- this.onPositionChange(__privateGet(this, _cachedPosition));
727
+ if (this.#cachedPosition) {
728
+ this.onPositionChange(this.#cachedPosition);
751
729
  }
752
730
  }
753
731
  render() {
754
732
  }
755
733
  };
756
- _cachedPosition = new WeakMap();
757
- _freshListenerManager = new WeakMap();
758
734
  customElementsShim.define("twisty-2d-puzzle", Twisty2DPuzzle);
759
735
 
760
736
  // src/cubing/twisty/views/2D/Twisty2DPuzzleWrapper.ts
761
- var _freshListenerManager2, _cachedTwisty2DPuzzle;
762
737
  var Twisty2DPuzzleWrapper = class {
763
738
  constructor(model, schedulable, puzzleLoader, effectiveVisualization) {
764
739
  this.model = model;
765
740
  this.schedulable = schedulable;
766
741
  this.puzzleLoader = puzzleLoader;
767
742
  this.effectiveVisualization = effectiveVisualization;
768
- __privateAdd(this, _freshListenerManager2, new FreshListenerManager());
769
- __privateAdd(this, _cachedTwisty2DPuzzle, null);
770
743
  this.twisty2DPuzzle();
771
- __privateGet(this, _freshListenerManager2).addListener(this.model.twistySceneModel.stickering, async (stickering) => {
772
- (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
773
- });
744
+ this.#freshListenerManager.addListener(
745
+ this.model.twistySceneModel.stickering,
746
+ async (stickering) => {
747
+ (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
748
+ }
749
+ );
774
750
  }
751
+ #freshListenerManager = new FreshListenerManager();
775
752
  disconnect() {
776
- __privateGet(this, _freshListenerManager2).disconnect();
753
+ this.#freshListenerManager.disconnect();
777
754
  }
778
755
  scheduleRender() {
779
756
  }
757
+ #cachedTwisty2DPuzzle = null;
780
758
  async twisty2DPuzzle() {
781
- return __privateGet(this, _cachedTwisty2DPuzzle) ?? __privateSet(this, _cachedTwisty2DPuzzle, (async () => {
759
+ return this.#cachedTwisty2DPuzzle ?? (this.#cachedTwisty2DPuzzle = (async () => {
782
760
  const svgPromise = this.effectiveVisualization === "experimental-2D-LL" ? this.puzzleLoader.llSVG() : this.puzzleLoader.svg();
783
- return new Twisty2DPuzzle(this.model, await this.puzzleLoader.kpuzzle(), await svgPromise, {}, this.puzzleLoader);
761
+ return new Twisty2DPuzzle(
762
+ this.model,
763
+ await this.puzzleLoader.kpuzzle(),
764
+ await svgPromise,
765
+ {},
766
+ this.puzzleLoader
767
+ );
784
768
  })());
785
769
  }
786
770
  };
787
- _freshListenerManager2 = new WeakMap();
788
- _cachedTwisty2DPuzzle = new WeakMap();
789
771
 
790
772
  // src/cubing/twisty/views/2D/Twisty2DSceneWrapper.ts
791
- var _freshListenerManager3, _cachedScene, _currentTwisty2DPuzzleWrapper;
792
773
  var Twisty2DSceneWrapper = class extends ManagedCustomElement {
793
774
  constructor(model, effectiveVisualization) {
794
775
  super();
795
776
  this.model = model;
796
777
  this.effectiveVisualization = effectiveVisualization;
797
- __privateAdd(this, _freshListenerManager3, new FreshListenerManager());
798
- __privateAdd(this, _cachedScene, void 0);
799
- __privateAdd(this, _currentTwisty2DPuzzleWrapper, null);
800
778
  }
779
+ #freshListenerManager = new FreshListenerManager();
801
780
  disconnect() {
802
- __privateGet(this, _freshListenerManager3).disconnect();
781
+ this.#freshListenerManager.disconnect();
803
782
  }
804
783
  async connectedCallback() {
805
784
  this.addCSS(twistyViewerWrapperCSS);
806
785
  if (this.model) {
807
- __privateGet(this, _freshListenerManager3).addListener(this.model.twistyPlayerModel.puzzleLoader, this.onPuzzleLoader.bind(this));
786
+ this.#freshListenerManager.addListener(
787
+ this.model.twistyPlayerModel.puzzleLoader,
788
+ this.onPuzzleLoader.bind(this)
789
+ );
808
790
  }
809
791
  }
792
+ #cachedScene;
810
793
  async scene() {
811
- return __privateGet(this, _cachedScene) ?? __privateSet(this, _cachedScene, (async () => new (await THREEJS).Scene())());
794
+ return this.#cachedScene ?? (this.#cachedScene = (async () => new (await THREEJS).Scene())());
812
795
  }
813
796
  scheduleRender() {
814
- __privateGet(this, _currentTwisty2DPuzzleWrapper)?.scheduleRender();
797
+ this.#currentTwisty2DPuzzleWrapper?.scheduleRender();
815
798
  }
799
+ #currentTwisty2DPuzzleWrapper = null;
816
800
  currentTwisty2DPuzzleWrapper() {
817
- return __privateGet(this, _currentTwisty2DPuzzleWrapper);
801
+ return this.#currentTwisty2DPuzzleWrapper;
818
802
  }
819
803
  async setCurrentTwisty2DPuzzleWrapper(twisty2DPuzzleWrapper) {
820
- const old = __privateGet(this, _currentTwisty2DPuzzleWrapper);
821
- __privateSet(this, _currentTwisty2DPuzzleWrapper, twisty2DPuzzleWrapper);
804
+ const old = this.#currentTwisty2DPuzzleWrapper;
805
+ this.#currentTwisty2DPuzzleWrapper = twisty2DPuzzleWrapper;
822
806
  old?.disconnect();
823
807
  const twisty2DPuzzlePromise = twisty2DPuzzleWrapper.twisty2DPuzzle();
824
808
  this.contentWrapper.textContent = "";
825
809
  this.addElement(await twisty2DPuzzlePromise);
826
810
  }
827
811
  async onPuzzleLoader(puzzleLoader) {
828
- __privateGet(this, _currentTwisty2DPuzzleWrapper)?.disconnect();
829
- const twisty2DPuzzleWrapper = new Twisty2DPuzzleWrapper(this.model.twistyPlayerModel, this, puzzleLoader, this.effectiveVisualization);
812
+ this.#currentTwisty2DPuzzleWrapper?.disconnect();
813
+ const twisty2DPuzzleWrapper = new Twisty2DPuzzleWrapper(
814
+ this.model.twistyPlayerModel,
815
+ this,
816
+ puzzleLoader,
817
+ this.effectiveVisualization
818
+ );
830
819
  this.setCurrentTwisty2DPuzzleWrapper(twisty2DPuzzleWrapper);
831
820
  }
832
821
  };
833
- _freshListenerManager3 = new WeakMap();
834
- _cachedScene = new WeakMap();
835
- _currentTwisty2DPuzzleWrapper = new WeakMap();
836
822
  customElementsShim.define("twisty-2d-scene-wrapper", Twisty2DSceneWrapper);
837
823
 
838
824
  // src/cubing/twisty/views/ClassListManager.ts
839
- var _currentClassName;
840
825
  var ClassListManager = class {
841
826
  constructor(elem, prefix, validSuffixes) {
842
827
  this.elem = elem;
843
828
  this.prefix = prefix;
844
829
  this.validSuffixes = validSuffixes;
845
- __privateAdd(this, _currentClassName, null);
846
830
  }
831
+ #currentClassName = null;
847
832
  clearValue() {
848
- if (__privateGet(this, _currentClassName)) {
849
- this.elem.contentWrapper.classList.remove(__privateGet(this, _currentClassName));
833
+ if (this.#currentClassName) {
834
+ this.elem.contentWrapper.classList.remove(this.#currentClassName);
850
835
  }
851
- __privateSet(this, _currentClassName, null);
836
+ this.#currentClassName = null;
852
837
  }
853
838
  setValue(suffix) {
854
839
  if (!this.validSuffixes.includes(suffix)) {
855
840
  throw new Error(`Invalid suffix: ${suffix}`);
856
841
  }
857
842
  const newClassName = `${this.prefix}${suffix}`;
858
- const changed = __privateGet(this, _currentClassName) !== newClassName;
843
+ const changed = this.#currentClassName !== newClassName;
859
844
  if (changed) {
860
845
  this.clearValue();
861
846
  this.elem.contentWrapper.classList.add(newClassName);
862
- __privateSet(this, _currentClassName, newClassName);
847
+ this.#currentClassName = newClassName;
863
848
  }
864
849
  return changed;
865
850
  }
866
851
  };
867
- _currentClassName = new WeakMap();
868
852
 
869
853
  // src/cubing/twisty/views/InitialValueTracker.ts
870
- var _resolve;
871
854
  var InitialValueTracker = class {
872
855
  constructor() {
873
- __privateAdd(this, _resolve, void 0);
874
856
  this.promise = new Promise((resolve, reject) => {
875
- __privateSet(this, _resolve, resolve);
857
+ this.#resolve = resolve;
876
858
  this.reject = reject;
877
859
  });
878
860
  }
861
+ #resolve;
879
862
  handleNewValue(t) {
880
- __privateGet(this, _resolve).call(this, t);
863
+ this.#resolve(t);
881
864
  }
882
865
  };
883
- _resolve = new WeakMap();
884
866
 
885
867
  // src/cubing/twisty/views/3D/Twisty3DPuzzleWrapper.ts
886
- var _freshListenerManager4, _cachedTwisty3DPuzzle;
887
868
  var Twisty3DPuzzleWrapper = class extends EventTarget {
888
869
  constructor(model, schedulable, puzzleLoader, visualizationStrategy) {
889
870
  super();
@@ -891,69 +872,91 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
891
872
  this.schedulable = schedulable;
892
873
  this.puzzleLoader = puzzleLoader;
893
874
  this.visualizationStrategy = visualizationStrategy;
894
- __privateAdd(this, _freshListenerManager4, new FreshListenerManager());
895
- __privateAdd(this, _cachedTwisty3DPuzzle, null);
896
875
  this.twisty3DPuzzle();
897
- __privateGet(this, _freshListenerManager4).addListener(this.model.puzzleLoader, (puzzleLoader2) => {
898
- if (this.puzzleLoader.id !== puzzleLoader2.id) {
899
- this.disconnect();
876
+ this.#freshListenerManager.addListener(
877
+ this.model.puzzleLoader,
878
+ (puzzleLoader2) => {
879
+ if (this.puzzleLoader.id !== puzzleLoader2.id) {
880
+ this.disconnect();
881
+ }
900
882
  }
901
- });
902
- __privateGet(this, _freshListenerManager4).addListener(this.model.legacyPosition, async (position) => {
903
- try {
904
- (await this.twisty3DPuzzle()).onPositionChange(position);
883
+ );
884
+ this.#freshListenerManager.addListener(
885
+ this.model.legacyPosition,
886
+ async (position) => {
887
+ try {
888
+ (await this.twisty3DPuzzle()).onPositionChange(position);
889
+ this.scheduleRender();
890
+ } catch (e) {
891
+ this.disconnect();
892
+ }
893
+ }
894
+ );
895
+ this.#freshListenerManager.addListener(
896
+ this.model.twistySceneModel.hintFacelet,
897
+ async (hintFaceletStyle) => {
898
+ (await this.twisty3DPuzzle()).experimentalUpdateOptions({
899
+ hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
900
+ });
905
901
  this.scheduleRender();
906
- } catch (e) {
907
- this.disconnect();
908
902
  }
909
- });
910
- __privateGet(this, _freshListenerManager4).addListener(this.model.twistySceneModel.hintFacelet, async (hintFaceletStyle) => {
911
- (await this.twisty3DPuzzle()).experimentalUpdateOptions({
912
- hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
913
- });
914
- this.scheduleRender();
915
- });
916
- __privateGet(this, _freshListenerManager4).addListener(this.model.twistySceneModel.foundationDisplay, async (foundationDisplay) => {
917
- (await this.twisty3DPuzzle()).experimentalUpdateOptions({
918
- showFoundation: foundationDisplay !== "none"
919
- });
920
- this.scheduleRender();
921
- });
922
- __privateGet(this, _freshListenerManager4).addListener(this.model.twistySceneModel.stickering, async (stickering) => {
923
- if ("setStickering" in await this.twisty3DPuzzle()) {
924
- (await this.twisty3DPuzzle()).setStickering(stickering);
903
+ );
904
+ this.#freshListenerManager.addListener(
905
+ this.model.twistySceneModel.foundationDisplay,
906
+ async (foundationDisplay) => {
907
+ (await this.twisty3DPuzzle()).experimentalUpdateOptions({
908
+ showFoundation: foundationDisplay !== "none"
909
+ });
925
910
  this.scheduleRender();
926
- } else {
927
- if ("appearance" in this.puzzleLoader) {
928
- const [twisty3D, appearancePromise] = await Promise.all([
929
- this.twisty3DPuzzle(),
930
- this.puzzleLoader.appearance(stickering ?? "full")
931
- ]);
932
- twisty3D.experimentalSetAppearance(appearancePromise);
911
+ }
912
+ );
913
+ this.#freshListenerManager.addListener(
914
+ this.model.twistySceneModel.stickering,
915
+ async (stickering) => {
916
+ if ("setStickering" in await this.twisty3DPuzzle()) {
917
+ (await this.twisty3DPuzzle()).setStickering(stickering);
933
918
  this.scheduleRender();
919
+ } else {
920
+ if ("appearance" in this.puzzleLoader) {
921
+ const [twisty3D, appearancePromise] = await Promise.all([
922
+ this.twisty3DPuzzle(),
923
+ this.puzzleLoader.appearance(stickering ?? "full")
924
+ ]);
925
+ twisty3D.experimentalSetAppearance(appearancePromise);
926
+ this.scheduleRender();
927
+ }
934
928
  }
935
929
  }
936
- });
937
- __privateGet(this, _freshListenerManager4).addMultiListener3([
938
- this.model.twistySceneModel.stickering,
939
- this.model.twistySceneModel.foundationStickerSprite,
940
- this.model.twistySceneModel.hintStickerSprite
941
- ], async (inputs) => {
942
- if ("experimentalUpdateTexture" in await this.twisty3DPuzzle()) {
943
- (await this.twisty3DPuzzle()).experimentalUpdateTexture(inputs[0] === "picture", inputs[1], inputs[2]);
944
- this.scheduleRender();
930
+ );
931
+ this.#freshListenerManager.addMultiListener3(
932
+ [
933
+ this.model.twistySceneModel.stickering,
934
+ this.model.twistySceneModel.foundationStickerSprite,
935
+ this.model.twistySceneModel.hintStickerSprite
936
+ ],
937
+ async (inputs) => {
938
+ if ("experimentalUpdateTexture" in await this.twisty3DPuzzle()) {
939
+ (await this.twisty3DPuzzle()).experimentalUpdateTexture(
940
+ inputs[0] === "picture",
941
+ inputs[1],
942
+ inputs[2]
943
+ );
944
+ this.scheduleRender();
945
+ }
945
946
  }
946
- });
947
+ );
947
948
  }
949
+ #freshListenerManager = new FreshListenerManager();
948
950
  disconnect() {
949
- __privateGet(this, _freshListenerManager4).disconnect();
951
+ this.#freshListenerManager.disconnect();
950
952
  }
951
953
  scheduleRender() {
952
954
  this.schedulable.scheduleRender();
953
955
  this.dispatchEvent(new CustomEvent("render-scheduled"));
954
956
  }
957
+ #cachedTwisty3DPuzzle = null;
955
958
  async twisty3DPuzzle() {
956
- return __privateGet(this, _cachedTwisty3DPuzzle) ?? __privateSet(this, _cachedTwisty3DPuzzle, (async () => {
959
+ return this.#cachedTwisty3DPuzzle ?? (this.#cachedTwisty3DPuzzle = (async () => {
957
960
  const proxyPromise = proxy3D();
958
961
  if (this.puzzleLoader.id === "3x3x3" && this.visualizationStrategy === "Cube3D") {
959
962
  const [foundationSprite, hintSprite, experimentalStickering] = await Promise.all([
@@ -961,19 +964,32 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
961
964
  this.model.twistySceneModel.hintStickerSprite.get(),
962
965
  this.model.twistySceneModel.stickering.get()
963
966
  ]);
964
- return (await proxyPromise).cube3DShim({
965
- foundationSprite,
966
- hintSprite,
967
- experimentalStickering
968
- });
967
+ return (await proxyPromise).cube3DShim(
968
+ () => this.schedulable.scheduleRender(),
969
+ {
970
+ foundationSprite,
971
+ hintSprite,
972
+ experimentalStickering
973
+ }
974
+ );
969
975
  } else {
970
976
  const [hintFacelets, foundationSprite, hintSprite] = await Promise.all([
971
977
  this.model.twistySceneModel.hintFacelet.get(),
972
978
  this.model.twistySceneModel.foundationStickerSprite.get(),
973
979
  this.model.twistySceneModel.hintStickerSprite.get()
974
980
  ]);
975
- const pg3d = (await proxyPromise).pg3dShim(this.puzzleLoader, hintFacelets === "auto" ? "floating" : hintFacelets);
976
- pg3d.then((p) => p.experimentalUpdateTexture(true, foundationSprite ?? void 0, hintSprite ?? void 0));
981
+ const pg3d = (await proxyPromise).pg3dShim(
982
+ () => this.schedulable.scheduleRender(),
983
+ this.puzzleLoader,
984
+ hintFacelets === "auto" ? "floating" : hintFacelets
985
+ );
986
+ pg3d.then(
987
+ (p) => p.experimentalUpdateTexture(
988
+ true,
989
+ foundationSprite ?? void 0,
990
+ hintSprite ?? void 0
991
+ )
992
+ );
977
993
  return pg3d;
978
994
  }
979
995
  })());
@@ -988,7 +1004,10 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
988
1004
  const [raycaster] = await Promise.all([raycasterPromise]);
989
1005
  const intersects = raycaster.intersectObjects(targets);
990
1006
  if (intersects.length > 0) {
991
- const closestMove = puzzle.getClosestMoveToAxis(intersects[0].point, transformations);
1007
+ const closestMove = puzzle.getClosestMoveToAxis(
1008
+ intersects[0].point,
1009
+ transformations
1010
+ );
992
1011
  if (closestMove) {
993
1012
  this.model.experimentalAddMove(closestMove.move, {
994
1013
  coalesce: true,
@@ -1000,708 +1019,56 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
1000
1019
  }
1001
1020
  }
1002
1021
  };
1003
- _freshListenerManager4 = new WeakMap();
1004
- _cachedTwisty3DPuzzle = new WeakMap();
1005
-
1006
- // src/cubing/vendor/three/examples/jsm/libs/stats.modified.module.ts
1007
- var performance2 = globalThis.performance;
1008
- var Stats = class {
1009
- constructor() {
1010
- this.mode = 0;
1011
- this.dom = document.createElement("div");
1012
- this.beginTime = (performance2 || Date).now();
1013
- this.prevTime = this.beginTime;
1014
- this.frames = 0;
1015
- this.fpsPanel = this.addPanel(new StatsPanel("FPS", "#0ff", "#002"));
1016
- this.msPanel = this.addPanel(new StatsPanel("MS", "#0f0", "#020"));
1017
- this.memPanel = performance2?.memory ? this.addPanel(new StatsPanel("MB", "#f08", "#201")) : null;
1018
- this.REVISION = 16;
1019
- this.dom.style.cssText = "position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";
1020
- this.dom.addEventListener("click", (event) => {
1021
- event.preventDefault();
1022
- this.showPanel(++this.mode % this.dom.children.length);
1023
- }, false);
1024
- this.showPanel(0);
1025
- }
1026
- addPanel(panel) {
1027
- this.dom.appendChild(panel.dom);
1028
- return panel;
1029
- }
1030
- showPanel(id) {
1031
- for (let i = 0; i < this.dom.children.length; i++) {
1032
- this.dom.children[i].style.display = i === id ? "block" : "none";
1033
- }
1034
- this.mode = id;
1035
- }
1036
- begin() {
1037
- this.beginTime = (performance2 || Date).now();
1038
- }
1039
- end() {
1040
- this.frames++;
1041
- const time = (performance2 || Date).now();
1042
- this.msPanel.update(time - this.beginTime, 200);
1043
- if (time >= this.prevTime + 1e3) {
1044
- this.fpsPanel.update(this.frames * 1e3 / (time - this.prevTime), 100);
1045
- this.prevTime = time;
1046
- this.frames = 0;
1047
- if (this.memPanel) {
1048
- const memory = performance2.memory;
1049
- this.memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576);
1050
- }
1051
- }
1052
- return time;
1053
- }
1054
- update() {
1055
- this.beginTime = this.end();
1056
- }
1057
- };
1058
- var PR = Math.round(globalThis?.window?.devicePixelRatio ?? 1);
1059
- var WIDTH = 80 * PR;
1060
- var HEIGHT = 48 * PR;
1061
- var TEXT_X = 3 * PR;
1062
- var TEXT_Y = 2 * PR;
1063
- var GRAPH_X = 3 * PR;
1064
- var GRAPH_Y = 15 * PR;
1065
- var GRAPH_WIDTH = 74 * PR;
1066
- var GRAPH_HEIGHT = 30 * PR;
1067
- var StatsPanel = class {
1068
- constructor(name, fg, bg) {
1069
- this.name = name;
1070
- this.fg = fg;
1071
- this.bg = bg;
1072
- this.min = Infinity;
1073
- this.max = 0;
1074
- this.dom = document.createElement("canvas");
1075
- this.context = this.dom.getContext("2d");
1076
- this.dom.width = WIDTH;
1077
- this.dom.height = HEIGHT;
1078
- this.dom.style.cssText = "width:80px;height:48px";
1079
- this.context.font = `bold ${9 * PR}px Helvetica,Arial,sans-serif`;
1080
- this.context.textBaseline = "top";
1081
- this.context.fillStyle = bg;
1082
- this.context.fillRect(0, 0, WIDTH, HEIGHT);
1083
- this.context.fillStyle = fg;
1084
- this.context.fillText(name, TEXT_X, TEXT_Y);
1085
- this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);
1086
- this.context.fillStyle = bg;
1087
- this.context.globalAlpha = 0.9;
1088
- this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);
1089
- }
1090
- update(value, maxValue) {
1091
- this.min = Math.min(this.min, value);
1092
- this.max = Math.max(this.max, value);
1093
- this.context.fillStyle = this.bg;
1094
- this.context.globalAlpha = 1;
1095
- this.context.fillRect(0, 0, WIDTH, GRAPH_Y);
1096
- this.context.fillStyle = this.fg;
1097
- this.context.fillText(Math.round(value) + " " + this.name + " (" + Math.round(this.min) + "-" + Math.round(this.max) + ")", TEXT_X, TEXT_Y);
1098
- this.context.drawImage(this.dom, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT);
1099
- this.context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT);
1100
- this.context.fillStyle = this.bg;
1101
- this.context.globalAlpha = 0.9;
1102
- this.context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, Math.round((1 - value / maxValue) * GRAPH_HEIGHT));
1103
- }
1104
- };
1105
-
1106
- // src/cubing/twisty/views/canvas.ts
1107
- var globalPixelRatioOverride = null;
1108
- function pixelRatio() {
1109
- return globalPixelRatioOverride ?? (devicePixelRatio || 1);
1110
- }
1111
-
1112
- // src/cubing/twisty/views/3D/Twisty3DVantage.css.ts
1113
- var twisty3DVantageCSS = new CSSSource(`
1114
- :host {
1115
- width: 384px;
1116
- height: 256px;
1117
- display: grid;
1118
- }
1119
-
1120
- .wrapper {
1121
- width: 100%;
1122
- height: 100%;
1123
- display: grid;
1124
- overflow: hidden;
1125
- place-content: center;
1126
- contain: strict;
1127
- }
1128
-
1129
- .loading {
1130
- width: 4em;
1131
- height: 4em;
1132
- border-radius: 2.5em;
1133
- border: 0.5em solid rgba(0, 0, 0, 0);
1134
- border-top: 0.5em solid rgba(0, 0, 0, 0.7);
1135
- border-right: 0.5em solid rgba(0, 0, 0, 0.7);
1136
- animation: fade-in-delayed 4s, rotate 1s linear infinite;
1137
- }
1138
-
1139
- @keyframes fade-in-delayed {
1140
- 0% { opacity: 0; }
1141
- 25% {opacity: 0; }
1142
- 100% { opacity: 1; }
1143
- }
1144
-
1145
- @keyframes rotate {
1146
- from { transform: rotate(0deg); }
1147
- to { transform: rotate(360deg); }
1148
- }
1149
-
1150
- /* TODO: This is due to stats hack. Replace with \`canvas\`. */
1151
- .wrapper > canvas {
1152
- max-width: 100%;
1153
- max-height: 100%;
1154
- animation: fade-in 0.25s ease-in;
1155
- }
1156
-
1157
- @keyframes fade-in {
1158
- from { opacity: 0; }
1159
- to { opacity: 1; }
1160
- }
1161
-
1162
- .wrapper.invisible {
1163
- opacity: 0;
1164
- }
1165
-
1166
- .wrapper.drag-input-enabled > canvas {
1167
- cursor: grab;
1168
- }
1169
-
1170
- .wrapper.drag-input-enabled > canvas:active {
1171
- cursor: grabbing;
1172
- }
1173
- `);
1174
-
1175
- // src/cubing/twisty/views/3D/DragTracker.ts
1176
- var MOVEMENT_EPSILON = 0.1;
1177
- var _dragInfoMap, _targetListeners, _lazyListenersRegistered, _registerLazyListeners, registerLazyListeners_fn, _clear, clear_fn, _trackDrag, trackDrag_fn;
1178
- var DragTracker = class extends EventTarget {
1179
- constructor(target) {
1180
- super();
1181
- this.target = target;
1182
- __privateAdd(this, _registerLazyListeners);
1183
- __privateAdd(this, _clear);
1184
- __privateAdd(this, _trackDrag);
1185
- __privateAdd(this, _dragInfoMap, /* @__PURE__ */ new Map());
1186
- __privateAdd(this, _targetListeners, /* @__PURE__ */ new Map());
1187
- __privateAdd(this, _lazyListenersRegistered, false);
1188
- }
1189
- start() {
1190
- this.addTargetListener("pointerdown", this.onPointerDown.bind(this));
1191
- this.addTargetListener("contextmenu", (e) => {
1192
- e.preventDefault();
1193
- });
1194
- this.addTargetListener("touchmove", (e) => e.preventDefault());
1195
- this.addTargetListener("dblclick", (e) => e.preventDefault());
1196
- }
1197
- stop() {
1198
- for (const [eventType, listener] of __privateGet(this, _targetListeners).entries()) {
1199
- this.target.removeEventListener(eventType, listener);
1200
- }
1201
- __privateGet(this, _targetListeners).clear();
1202
- __privateSet(this, _lazyListenersRegistered, false);
1203
- }
1204
- addTargetListener(eventType, listener) {
1205
- if (!__privateGet(this, _targetListeners).has(eventType)) {
1206
- this.target.addEventListener(eventType, listener);
1207
- __privateGet(this, _targetListeners).set(eventType, listener);
1208
- }
1209
- }
1210
- onPointerDown(e) {
1211
- __privateMethod(this, _registerLazyListeners, registerLazyListeners_fn).call(this);
1212
- const newDragInfo = {
1213
- attachedInfo: {},
1214
- hasMoved: false,
1215
- lastClientX: e.clientX,
1216
- lastClientY: e.clientY,
1217
- lastTimeStamp: e.timeStamp
1218
- };
1219
- __privateGet(this, _dragInfoMap).set(e.pointerId, newDragInfo);
1220
- this.target.setPointerCapture(e.pointerId);
1221
- }
1222
- onPointerMove(e) {
1223
- const movementInfo = __privateMethod(this, _trackDrag, trackDrag_fn).call(this, e).movementInfo;
1224
- if (movementInfo) {
1225
- e.preventDefault();
1226
- this.dispatchEvent(new CustomEvent("move", {
1227
- detail: movementInfo
1228
- }));
1229
- }
1230
- }
1231
- onPointerUp(e) {
1232
- const trackDragResult = __privateMethod(this, _trackDrag, trackDrag_fn).call(this, e);
1233
- const existing = __privateGet(this, _dragInfoMap).get(e.pointerId);
1234
- __privateMethod(this, _clear, clear_fn).call(this, e);
1235
- this.target.releasePointerCapture(e.pointerId);
1236
- let event;
1237
- if (trackDragResult.hasMoved) {
1238
- event = new CustomEvent("up", {
1239
- detail: { attachedInfo: existing.attachedInfo }
1240
- });
1241
- } else {
1242
- const { altKey, ctrlKey, metaKey, shiftKey } = e;
1243
- event = new CustomEvent("press", {
1244
- detail: {
1245
- normalizedX: e.offsetX / this.target.offsetWidth * 2 - 1,
1246
- normalizedY: 1 - e.offsetY / this.target.offsetHeight * 2,
1247
- rightClick: !!(e.button & 2),
1248
- keys: {
1249
- altKey,
1250
- ctrlOrMetaKey: ctrlKey || metaKey,
1251
- shiftKey
1252
- }
1253
- }
1254
- });
1255
- }
1256
- this.dispatchEvent(event);
1257
- }
1258
- };
1259
- _dragInfoMap = new WeakMap();
1260
- _targetListeners = new WeakMap();
1261
- _lazyListenersRegistered = new WeakMap();
1262
- _registerLazyListeners = new WeakSet();
1263
- registerLazyListeners_fn = function() {
1264
- if (__privateGet(this, _lazyListenersRegistered)) {
1265
- return;
1266
- }
1267
- this.addTargetListener("pointermove", this.onPointerMove.bind(this));
1268
- this.addTargetListener("pointerup", this.onPointerUp.bind(this));
1269
- __privateSet(this, _lazyListenersRegistered, true);
1270
- };
1271
- _clear = new WeakSet();
1272
- clear_fn = function(e) {
1273
- __privateGet(this, _dragInfoMap).delete(e.pointerId);
1274
- };
1275
- _trackDrag = new WeakSet();
1276
- trackDrag_fn = function(e) {
1277
- const existing = __privateGet(this, _dragInfoMap).get(e.pointerId);
1278
- if (!existing) {
1279
- return { movementInfo: null, hasMoved: false };
1280
- }
1281
- let movementInfo;
1282
- if ((e.movementX ?? 0) !== 0 || (e.movementY ?? 0) !== 0) {
1283
- movementInfo = {
1284
- attachedInfo: existing.attachedInfo,
1285
- movementX: e.movementX,
1286
- movementY: e.movementY,
1287
- elapsedMs: e.timeStamp - existing.lastTimeStamp
1288
- };
1289
- } else {
1290
- movementInfo = {
1291
- attachedInfo: existing.attachedInfo,
1292
- movementX: e.clientX - existing.lastClientX,
1293
- movementY: e.clientY - existing.lastClientY,
1294
- elapsedMs: e.timeStamp - existing.lastTimeStamp
1295
- };
1296
- }
1297
- existing.lastClientX = e.clientX;
1298
- existing.lastClientY = e.clientY;
1299
- existing.lastTimeStamp = e.timeStamp;
1300
- if (Math.abs(movementInfo.movementX) < MOVEMENT_EPSILON && Math.abs(movementInfo.movementY) < MOVEMENT_EPSILON) {
1301
- return { movementInfo: null, hasMoved: existing.hasMoved };
1302
- } else {
1303
- existing.hasMoved = true;
1304
- return { movementInfo, hasMoved: existing.hasMoved };
1305
- }
1306
- };
1307
-
1308
- // src/cubing/twisty/views/3D/RendererPool.ts
1309
- var renderers = [];
1310
- async function renderPooled(width, height, canvas, scene, camera) {
1311
- if (width === 0 || height === 0) {
1312
- return;
1313
- }
1314
- if (renderers.length === 0) {
1315
- renderers.push(newRenderer());
1316
- }
1317
- const renderer = await renderers[0];
1318
- renderer.setSize(width, height);
1319
- renderer.render(scene, camera);
1320
- const context = canvas.getContext("2d");
1321
- context.clearRect(0, 0, canvas.width, canvas.height);
1322
- context.drawImage(renderer.domElement, 0, 0);
1323
- }
1324
- async function newRenderer() {
1325
- const rendererConstructor = (await THREEJS).WebGLRenderer;
1326
- const renderer = new rendererConstructor({
1327
- antialias: true,
1328
- alpha: true
1329
- });
1330
- renderer.setPixelRatio(pixelRatio());
1331
- return renderer;
1332
- }
1333
-
1334
- // src/cubing/twisty/views/3D/TwistyOrbitControls.ts
1335
- var INERTIA_DEFAULT = true;
1336
- var INERTIA_DURATION_MS = 500;
1337
- var INERTIA_TIMEOUT_MS = 50;
1338
- var VERTICAL_MOVEMENT_BASE_SCALE = 0.75;
1339
- function momentumScale(progress) {
1340
- return (Math.exp(1 - progress) - (1 - progress)) / (1 - Math.E) + 1;
1341
- }
1342
- var Inertia = class {
1343
- constructor(startTimestamp, momentumX, momentumY, callback) {
1344
- this.startTimestamp = startTimestamp;
1345
- this.momentumX = momentumX;
1346
- this.momentumY = momentumY;
1347
- this.callback = callback;
1348
- this.scheduler = new RenderScheduler(this.render.bind(this));
1349
- this.scheduler.requestAnimFrame();
1350
- this.lastTimestamp = startTimestamp;
1351
- }
1352
- render(now) {
1353
- const progressBefore = (this.lastTimestamp - this.startTimestamp) / INERTIA_DURATION_MS;
1354
- const progressAfter = Math.min(1, (now - this.startTimestamp) / INERTIA_DURATION_MS);
1355
- if (progressBefore === 0 && progressAfter > INERTIA_TIMEOUT_MS / INERTIA_DURATION_MS) {
1356
- return;
1357
- }
1358
- const delta = momentumScale(progressAfter) - momentumScale(progressBefore);
1359
- this.callback(this.momentumX * delta * 1e3, this.momentumY * delta * 1e3);
1360
- if (progressAfter < 1) {
1361
- this.scheduler.requestAnimFrame();
1362
- }
1363
- this.lastTimestamp = now;
1364
- }
1365
- };
1366
- var TwistyOrbitControls = class {
1367
- constructor(model, mirror, canvas, dragTracker) {
1368
- this.model = model;
1369
- this.mirror = mirror;
1370
- this.canvas = canvas;
1371
- this.dragTracker = dragTracker;
1372
- this.experimentalInertia = INERTIA_DEFAULT;
1373
- this.onMovementBound = this.onMovement.bind(this);
1374
- this.experimentalHasBeenMoved = false;
1375
- this.dragTracker.addEventListener("move", this.onMove.bind(this));
1376
- this.dragTracker.addEventListener("up", this.onUp.bind(this));
1377
- }
1378
- temperMovement(f) {
1379
- return Math.sign(f) * Math.log(Math.abs(f * 10) + 1) / 6;
1380
- }
1381
- onMove(e) {
1382
- var _a;
1383
- (_a = e.detail).attachedInfo ?? (_a.attachedInfo = {});
1384
- const { temperedX, temperedY } = this.onMovement(e.detail.movementX, e.detail.movementY);
1385
- const attachedInfo = e.detail.attachedInfo;
1386
- attachedInfo.lastTemperedX = temperedX * 10;
1387
- attachedInfo.lastTemperedY = temperedY * 10;
1388
- attachedInfo.timestamp = e.timeStamp;
1389
- }
1390
- onMovement(movementX, movementY) {
1391
- const scale = this.mirror ? -1 : 1;
1392
- const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);
1393
- const temperedX = this.temperMovement(movementX / minDim);
1394
- const temperedY = this.temperMovement(movementY / minDim * VERTICAL_MOVEMENT_BASE_SCALE);
1395
- this.model.twistySceneModel.orbitCoordinatesRequest.set((async () => {
1396
- const prevCoords = await this.model.twistySceneModel.orbitCoordinates.get();
1397
- const newCoords = {
1398
- latitude: prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,
1399
- longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN
1400
- };
1401
- return newCoords;
1402
- })());
1403
- return { temperedX, temperedY };
1404
- }
1405
- onUp(e) {
1406
- e.preventDefault();
1407
- if ("lastTemperedX" in e.detail.attachedInfo && "lastTemperedY" in e.detail.attachedInfo && "timestamp" in e.detail.attachedInfo && e.timeStamp - e.detail.attachedInfo.timestamp < 60) {
1408
- new Inertia(e.timeStamp, e.detail.attachedInfo.lastTemperedX, e.detail.attachedInfo.lastTemperedY, this.onMovementBound);
1409
- }
1410
- }
1411
- };
1412
-
1413
- // src/cubing/twisty/views/3D/Twisty3DVantage.ts
1414
- var SHOW_STATS = false;
1415
- function debugShowRenderStats(enable) {
1416
- SHOW_STATS = enable;
1417
- }
1418
- async function setCameraFromOrbitCoordinates(camera, orbitCoordinates, backView = false) {
1419
- const spherical = new (await THREEJS).Spherical(orbitCoordinates.distance, (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN, ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN);
1420
- spherical.makeSafe();
1421
- camera.position.setFromSpherical(spherical);
1422
- camera.lookAt(0, 0, 0);
1423
- }
1424
- var shareAllNewRenderers = null;
1425
- function experimentalForceNewRendererSharing(share) {
1426
- shareAllNewRenderers = share;
1427
- }
1428
- var dedicatedRenderersSoFar = 0;
1429
- var DEFAULT_MAX_DEDICATED_RENDERERS = 2;
1430
- function shareRenderer() {
1431
- if (shareAllNewRenderers !== null) {
1432
- if (!shareAllNewRenderers) {
1433
- dedicatedRenderersSoFar++;
1434
- }
1435
- return shareAllNewRenderers;
1436
- }
1437
- if (dedicatedRenderersSoFar < DEFAULT_MAX_DEDICATED_RENDERERS) {
1438
- dedicatedRenderersSoFar++;
1439
- return false;
1440
- } else {
1441
- return true;
1442
- }
1443
- }
1444
- var _setupBasicPresses, setupBasicPresses_fn, _onResizeStaleDropper, _width, _height, _onResize, onResize_fn, _cachedRenderer, _cachedCanvas, _cachedDragTracker, _dragTracker, dragTracker_fn, _cachedCamera, _cachedOrbitControls, _disconnectionFunctions, _experimentalNextRenderFinishedCallback, _scheduler;
1445
- var Twisty3DVantage = class extends ManagedCustomElement {
1446
- constructor(model, scene, options) {
1447
- super();
1448
- this.model = model;
1449
- this.options = options;
1450
- __privateAdd(this, _setupBasicPresses);
1451
- __privateAdd(this, _onResize);
1452
- __privateAdd(this, _dragTracker);
1453
- this.scene = null;
1454
- this.stats = null;
1455
- this.rendererIsShared = shareRenderer();
1456
- this.loadingElement = null;
1457
- __privateAdd(this, _onResizeStaleDropper, new StaleDropper());
1458
- __privateAdd(this, _width, 0);
1459
- __privateAdd(this, _height, 0);
1460
- __privateAdd(this, _cachedRenderer, null);
1461
- __privateAdd(this, _cachedCanvas, null);
1462
- __privateAdd(this, _cachedDragTracker, null);
1463
- __privateAdd(this, _cachedCamera, null);
1464
- __privateAdd(this, _cachedOrbitControls, null);
1465
- __privateAdd(this, _disconnectionFunctions, []);
1466
- __privateAdd(this, _experimentalNextRenderFinishedCallback, null);
1467
- __privateAdd(this, _scheduler, new RenderScheduler(this.render.bind(this)));
1468
- this.scene = scene ?? null;
1469
- this.loadingElement = this.addElement(document.createElement("div"));
1470
- this.loadingElement.classList.add("loading");
1471
- if (SHOW_STATS) {
1472
- this.stats = new Stats();
1473
- this.stats.dom.style.position = "absolute";
1474
- this.contentWrapper.appendChild(this.stats.dom);
1475
- }
1476
- }
1477
- async connectedCallback() {
1478
- this.addCSS(twisty3DVantageCSS);
1479
- this.addElement((await this.canvasInfo()).canvas);
1480
- __privateMethod(this, _onResize, onResize_fn).call(this);
1481
- const observer = new ResizeObserver(__privateMethod(this, _onResize, onResize_fn).bind(this));
1482
- observer.observe(this.contentWrapper);
1483
- this.orbitControls();
1484
- __privateMethod(this, _setupBasicPresses, setupBasicPresses_fn).call(this);
1485
- this.scheduleRender();
1486
- }
1487
- async clearCanvas() {
1488
- if (this.rendererIsShared) {
1489
- const canvasInfo = await this.canvasInfo();
1490
- canvasInfo.context.clearRect(0, 0, canvasInfo.canvas.width, canvasInfo.canvas.height);
1491
- } else {
1492
- const renderer = await this.renderer();
1493
- const context = renderer.getContext();
1494
- context.clear(context.COLOR_BUFFER_BIT);
1495
- }
1496
- }
1497
- async renderer() {
1498
- if (this.rendererIsShared) {
1499
- throw new Error("renderer expected to be shared.");
1500
- }
1501
- return __privateGet(this, _cachedRenderer) ?? __privateSet(this, _cachedRenderer, newRenderer());
1502
- }
1503
- async canvasInfo() {
1504
- return __privateGet(this, _cachedCanvas) ?? __privateSet(this, _cachedCanvas, (async () => {
1505
- let canvas;
1506
- if (this.rendererIsShared) {
1507
- canvas = this.addElement(document.createElement("canvas"));
1508
- } else {
1509
- const renderer = await this.renderer();
1510
- canvas = this.addElement(renderer.domElement);
1511
- }
1512
- this.loadingElement?.remove();
1513
- const context = canvas.getContext("2d");
1514
- return { canvas, context };
1515
- })());
1516
- }
1517
- async camera() {
1518
- return __privateGet(this, _cachedCamera) ?? __privateSet(this, _cachedCamera, (async () => {
1519
- const camera = new (await THREEJS).PerspectiveCamera(20, 1, 0.1, 20);
1520
- camera.position.copy(new (await THREEJS).Vector3(2, 4, 4).multiplyScalar(this.options?.backView ? -1 : 1));
1521
- camera.lookAt(0, 0, 0);
1522
- return camera;
1523
- })());
1524
- }
1525
- async orbitControls() {
1526
- return __privateGet(this, _cachedOrbitControls) ?? __privateSet(this, _cachedOrbitControls, (async () => {
1527
- const orbitControls = new TwistyOrbitControls(this.model, !!this.options?.backView, (await this.canvasInfo()).canvas, await __privateMethod(this, _dragTracker, dragTracker_fn).call(this));
1528
- if (this.model) {
1529
- this.addListener(this.model.twistySceneModel.orbitCoordinates, async (orbitCoordinates) => {
1530
- const camera = await this.camera();
1531
- setCameraFromOrbitCoordinates(camera, orbitCoordinates, this.options?.backView);
1532
- this.scheduleRender();
1533
- });
1534
- }
1535
- return orbitControls;
1536
- })());
1537
- }
1538
- addListener(prop, listener) {
1539
- prop.addFreshListener(listener);
1540
- __privateGet(this, _disconnectionFunctions).push(() => {
1541
- prop.removeFreshListener(listener);
1542
- });
1543
- }
1544
- disconnect() {
1545
- for (const fn of __privateGet(this, _disconnectionFunctions)) {
1546
- fn();
1547
- }
1548
- __privateSet(this, _disconnectionFunctions, []);
1549
- }
1550
- experimentalNextRenderFinishedCallback(callback) {
1551
- __privateSet(this, _experimentalNextRenderFinishedCallback, callback);
1552
- }
1553
- async render() {
1554
- var _a;
1555
- if (!this.scene) {
1556
- throw new Error("Attempted to render without a scene");
1557
- }
1558
- this.stats?.begin();
1559
- const [scene, camera, canvas] = await Promise.all([
1560
- this.scene.scene(),
1561
- this.camera(),
1562
- this.canvasInfo()
1563
- ]);
1564
- if (this.rendererIsShared) {
1565
- renderPooled(__privateGet(this, _width), __privateGet(this, _height), canvas.canvas, scene, camera);
1566
- } else {
1567
- (await this.renderer()).render(scene, camera);
1568
- }
1569
- this.stats?.end();
1570
- (_a = __privateGet(this, _experimentalNextRenderFinishedCallback)) == null ? void 0 : _a.call(this);
1571
- __privateSet(this, _experimentalNextRenderFinishedCallback, null);
1572
- }
1573
- scheduleRender() {
1574
- __privateGet(this, _scheduler).requestAnimFrame();
1575
- }
1576
- };
1577
- _setupBasicPresses = new WeakSet();
1578
- setupBasicPresses_fn = async function() {
1579
- const dragTracker = await __privateMethod(this, _dragTracker, dragTracker_fn).call(this);
1580
- dragTracker.addEventListener("press", async (e) => {
1581
- const movePressInput = await this.model.twistySceneModel.movePressInput.get();
1582
- if (movePressInput !== "basic") {
1583
- return;
1584
- }
1585
- this.dispatchEvent(new CustomEvent("press", {
1586
- detail: {
1587
- pressInfo: e.detail,
1588
- cameraPromise: this.camera()
1589
- }
1590
- }));
1591
- });
1592
- };
1593
- _onResizeStaleDropper = new WeakMap();
1594
- _width = new WeakMap();
1595
- _height = new WeakMap();
1596
- _onResize = new WeakSet();
1597
- onResize_fn = async function() {
1598
- const camera = await __privateGet(this, _onResizeStaleDropper).queue(this.camera());
1599
- const w = this.contentWrapper.clientWidth;
1600
- const h = this.contentWrapper.clientHeight;
1601
- __privateSet(this, _width, w);
1602
- __privateSet(this, _height, h);
1603
- const off = 0;
1604
- let yoff = 0;
1605
- let excess = 0;
1606
- if (h > w) {
1607
- excess = h - w;
1608
- yoff = -Math.floor(0.5 * excess);
1609
- }
1610
- camera.aspect = w / h;
1611
- camera.setViewOffset(w, h - excess, off, yoff, w, h);
1612
- camera.updateProjectionMatrix();
1613
- this.clearCanvas();
1614
- if (this.rendererIsShared) {
1615
- const canvasInfo = await this.canvasInfo();
1616
- canvasInfo.canvas.width = w * pixelRatio();
1617
- canvasInfo.canvas.height = h * pixelRatio();
1618
- canvasInfo.canvas.style.width = w.toString();
1619
- canvasInfo.canvas.style.height = h.toString();
1620
- } else {
1621
- const renderer = await this.renderer();
1622
- renderer.setSize(w, h, true);
1623
- }
1624
- this.scheduleRender();
1625
- };
1626
- _cachedRenderer = new WeakMap();
1627
- _cachedCanvas = new WeakMap();
1628
- _cachedDragTracker = new WeakMap();
1629
- _dragTracker = new WeakSet();
1630
- dragTracker_fn = async function() {
1631
- return __privateGet(this, _cachedDragTracker) ?? __privateSet(this, _cachedDragTracker, (async () => {
1632
- const dragTracker = new DragTracker((await this.canvasInfo()).canvas);
1633
- this.model?.twistySceneModel.dragInput.addFreshListener((dragInputMode) => {
1634
- let dragInputEnabled = false;
1635
- switch (dragInputMode) {
1636
- case "auto":
1637
- dragTracker.start();
1638
- dragInputEnabled = true;
1639
- break;
1640
- case "none":
1641
- dragTracker.stop();
1642
- break;
1643
- }
1644
- this.contentWrapper.classList.toggle("drag-input-enabled", dragInputEnabled);
1645
- });
1646
- return dragTracker;
1647
- })());
1648
- };
1649
- _cachedCamera = new WeakMap();
1650
- _cachedOrbitControls = new WeakMap();
1651
- _disconnectionFunctions = new WeakMap();
1652
- _experimentalNextRenderFinishedCallback = new WeakMap();
1653
- _scheduler = new WeakMap();
1654
- customElementsShim.define("twisty-3d-vantage", Twisty3DVantage);
1655
1022
 
1656
1023
  // src/cubing/twisty/views/3D/Twisty3DSceneWrapper.ts
1657
- var _backViewClassListManager, _freshListenerManager5, _backViewVantage, _cachedScene2, _vantages, _currentTwisty3DPuzzleWrapper, _initialWrapperTracker, _twisty3DStaleDropper;
1658
1024
  var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1659
1025
  constructor(model) {
1660
1026
  super();
1661
1027
  this.model = model;
1662
- __privateAdd(this, _backViewClassListManager, new ClassListManager(this, "back-view-", [
1663
- "auto",
1664
- "none",
1665
- "side-by-side",
1666
- "top-right"
1667
- ]));
1668
- __privateAdd(this, _freshListenerManager5, new FreshListenerManager());
1669
- __privateAdd(this, _backViewVantage, null);
1670
- __privateAdd(this, _cachedScene2, void 0);
1671
- __privateAdd(this, _vantages, /* @__PURE__ */ new Set());
1672
- __privateAdd(this, _currentTwisty3DPuzzleWrapper, null);
1673
- __privateAdd(this, _initialWrapperTracker, new InitialValueTracker());
1674
- __privateAdd(this, _twisty3DStaleDropper, new StaleDropper());
1675
1028
  }
1029
+ #backViewClassListManager = new ClassListManager(this, "back-view-", [
1030
+ "auto",
1031
+ "none",
1032
+ "side-by-side",
1033
+ "top-right"
1034
+ ]);
1035
+ #freshListenerManager = new FreshListenerManager();
1676
1036
  disconnect() {
1677
- __privateGet(this, _freshListenerManager5).disconnect();
1037
+ this.#freshListenerManager.disconnect();
1678
1038
  }
1679
1039
  async connectedCallback() {
1680
1040
  this.addCSS(twistyViewerWrapperCSS);
1681
1041
  const vantage = new Twisty3DVantage(this.model, this);
1682
1042
  this.addVantage(vantage);
1683
1043
  if (this.model) {
1684
- __privateGet(this, _freshListenerManager5).addMultiListener([this.model.puzzleLoader, this.model.visualizationStrategy], this.onPuzzle.bind(this));
1685
- __privateGet(this, _freshListenerManager5).addListener(this.model.backView, this.onBackView.bind(this));
1044
+ this.#freshListenerManager.addMultiListener(
1045
+ [this.model.puzzleLoader, this.model.visualizationStrategy],
1046
+ this.onPuzzle.bind(this)
1047
+ );
1048
+ this.#freshListenerManager.addListener(
1049
+ this.model.backView,
1050
+ this.onBackView.bind(this)
1051
+ );
1686
1052
  }
1687
1053
  this.scheduleRender();
1688
1054
  }
1055
+ #backViewVantage = null;
1689
1056
  setBackView(backView) {
1690
1057
  const shouldHaveBackView = ["side-by-side", "top-right"].includes(backView);
1691
- const hasBackView = __privateGet(this, _backViewVantage) !== null;
1692
- __privateGet(this, _backViewClassListManager).setValue(backView);
1058
+ const hasBackView = this.#backViewVantage !== null;
1059
+ this.#backViewClassListManager.setValue(backView);
1693
1060
  if (shouldHaveBackView) {
1694
1061
  if (!hasBackView) {
1695
- __privateSet(this, _backViewVantage, new Twisty3DVantage(this.model, this, {
1062
+ this.#backViewVantage = new Twisty3DVantage(this.model, this, {
1696
1063
  backView: true
1697
- }));
1698
- this.addVantage(__privateGet(this, _backViewVantage));
1064
+ });
1065
+ this.addVantage(this.#backViewVantage);
1699
1066
  this.scheduleRender();
1700
1067
  }
1701
1068
  } else {
1702
- if (__privateGet(this, _backViewVantage)) {
1703
- this.removeVantage(__privateGet(this, _backViewVantage));
1704
- __privateSet(this, _backViewVantage, null);
1069
+ if (this.#backViewVantage) {
1070
+ this.removeVantage(this.#backViewVantage);
1071
+ this.#backViewVantage = null;
1705
1072
  }
1706
1073
  }
1707
1074
  }
@@ -1709,7 +1076,7 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1709
1076
  this.setBackView(backView);
1710
1077
  }
1711
1078
  async onPress(e) {
1712
- const twisty3DPuzzleWrapper = __privateGet(this, _currentTwisty3DPuzzleWrapper);
1079
+ const twisty3DPuzzleWrapper = this.#currentTwisty3DPuzzleWrapper;
1713
1080
  if (!twisty3DPuzzleWrapper) {
1714
1081
  console.info("no wrapper; skipping scene wrapper press!");
1715
1082
  return;
@@ -1720,7 +1087,10 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1720
1087
  THREEJS
1721
1088
  ]);
1722
1089
  const raycaster = new three.Raycaster();
1723
- const mouse = new (await THREEJS).Vector2(e.detail.pressInfo.normalizedX, e.detail.pressInfo.normalizedY);
1090
+ const mouse = new (await THREEJS).Vector2(
1091
+ e.detail.pressInfo.normalizedX,
1092
+ e.detail.pressInfo.normalizedY
1093
+ );
1724
1094
  raycaster.setFromCamera(mouse, camera);
1725
1095
  return raycaster;
1726
1096
  })();
@@ -1729,32 +1099,35 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1729
1099
  depth: e.detail.pressInfo.keys.ctrlOrMetaKey ? "rotation" : e.detail.pressInfo.keys.shiftKey ? "secondSlice" : "none"
1730
1100
  });
1731
1101
  }
1102
+ #cachedScene;
1732
1103
  async scene() {
1733
- return __privateGet(this, _cachedScene2) ?? __privateSet(this, _cachedScene2, (async () => new (await THREEJS).Scene())());
1104
+ return this.#cachedScene ?? (this.#cachedScene = (async () => new (await THREEJS).Scene())());
1734
1105
  }
1106
+ #vantages = /* @__PURE__ */ new Set();
1735
1107
  addVantage(vantage) {
1736
1108
  vantage.addEventListener("press", this.onPress.bind(this));
1737
- __privateGet(this, _vantages).add(vantage);
1109
+ this.#vantages.add(vantage);
1738
1110
  this.contentWrapper.appendChild(vantage);
1739
1111
  }
1740
1112
  removeVantage(vantage) {
1741
- __privateGet(this, _vantages).delete(vantage);
1113
+ this.#vantages.delete(vantage);
1742
1114
  vantage.remove();
1743
1115
  vantage.disconnect();
1744
- __privateGet(this, _currentTwisty3DPuzzleWrapper)?.disconnect();
1116
+ this.#currentTwisty3DPuzzleWrapper?.disconnect();
1745
1117
  }
1746
1118
  experimentalVantages() {
1747
- return __privateGet(this, _vantages).values();
1119
+ return this.#vantages.values();
1748
1120
  }
1749
1121
  scheduleRender() {
1750
- for (const vantage of __privateGet(this, _vantages)) {
1122
+ for (const vantage of this.#vantages) {
1751
1123
  vantage.scheduleRender();
1752
1124
  }
1753
1125
  }
1126
+ #currentTwisty3DPuzzleWrapper = null;
1754
1127
  async setCurrentTwisty3DPuzzleWrapper(scene, twisty3DPuzzleWrapper) {
1755
- const old = __privateGet(this, _currentTwisty3DPuzzleWrapper);
1128
+ const old = this.#currentTwisty3DPuzzleWrapper;
1756
1129
  try {
1757
- __privateSet(this, _currentTwisty3DPuzzleWrapper, twisty3DPuzzleWrapper);
1130
+ this.#currentTwisty3DPuzzleWrapper = twisty3DPuzzleWrapper;
1758
1131
  old?.disconnect();
1759
1132
  scene.add(await twisty3DPuzzleWrapper.twisty3DPuzzle());
1760
1133
  } finally {
@@ -1762,31 +1135,27 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1762
1135
  scene.remove(await old.twisty3DPuzzle());
1763
1136
  }
1764
1137
  }
1765
- __privateGet(this, _initialWrapperTracker).handleNewValue(twisty3DPuzzleWrapper);
1138
+ this.#initialWrapperTracker.handleNewValue(twisty3DPuzzleWrapper);
1766
1139
  }
1140
+ #initialWrapperTracker = new InitialValueTracker();
1767
1141
  async experimentalTwisty3DPuzzleWrapper() {
1768
- return __privateGet(this, _currentTwisty3DPuzzleWrapper) || __privateGet(this, _initialWrapperTracker).promise;
1142
+ return this.#currentTwisty3DPuzzleWrapper || this.#initialWrapperTracker.promise;
1769
1143
  }
1144
+ #twisty3DStaleDropper = new StaleDropper();
1770
1145
  async onPuzzle(inputs) {
1771
1146
  if (inputs[1] === "2D") {
1772
1147
  return;
1773
1148
  }
1774
- __privateGet(this, _currentTwisty3DPuzzleWrapper)?.disconnect();
1775
- const [scene, twisty3DPuzzleWrapper] = await __privateGet(this, _twisty3DStaleDropper).queue(Promise.all([
1776
- this.scene(),
1777
- new Twisty3DPuzzleWrapper(this.model, this, inputs[0], inputs[1])
1778
- ]));
1149
+ this.#currentTwisty3DPuzzleWrapper?.disconnect();
1150
+ const [scene, twisty3DPuzzleWrapper] = await this.#twisty3DStaleDropper.queue(
1151
+ Promise.all([
1152
+ this.scene(),
1153
+ new Twisty3DPuzzleWrapper(this.model, this, inputs[0], inputs[1])
1154
+ ])
1155
+ );
1779
1156
  this.setCurrentTwisty3DPuzzleWrapper(scene, twisty3DPuzzleWrapper);
1780
1157
  }
1781
1158
  };
1782
- _backViewClassListManager = new WeakMap();
1783
- _freshListenerManager5 = new WeakMap();
1784
- _backViewVantage = new WeakMap();
1785
- _cachedScene2 = new WeakMap();
1786
- _vantages = new WeakMap();
1787
- _currentTwisty3DPuzzleWrapper = new WeakMap();
1788
- _initialWrapperTracker = new WeakMap();
1789
- _twisty3DStaleDropper = new WeakMap();
1790
1159
  customElementsShim.define("twisty-3d-scene-wrapper", Twisty3DSceneWrapper);
1791
1160
 
1792
1161
  // src/cubing/twisty/views/control-panel/TwistyButtons.css.ts
@@ -2003,14 +1372,12 @@ var buttonCommands = {
2003
1372
  "jump-to-end": true,
2004
1373
  "twizzle-link": true
2005
1374
  };
2006
- var _onCommand, onCommand_fn;
2007
1375
  var TwistyButtons = class extends ManagedCustomElement {
2008
1376
  constructor(model, controller, fullscreenElement) {
2009
1377
  super();
2010
1378
  this.model = model;
2011
1379
  this.controller = controller;
2012
1380
  this.fullscreenElement = fullscreenElement;
2013
- __privateAdd(this, _onCommand);
2014
1381
  this.buttons = null;
2015
1382
  }
2016
1383
  connectedCallback() {
@@ -2019,12 +1386,48 @@ var TwistyButtons = class extends ManagedCustomElement {
2019
1386
  for (const command in buttonCommands) {
2020
1387
  const button = new TwistyButton();
2021
1388
  buttons[command] = button;
2022
- button.htmlButton.addEventListener("click", () => __privateMethod(this, _onCommand, onCommand_fn).call(this, command));
1389
+ button.htmlButton.addEventListener(
1390
+ "click",
1391
+ () => this.#onCommand(command)
1392
+ );
2023
1393
  this.addElement(button);
2024
1394
  }
2025
1395
  this.buttons = buttons;
2026
1396
  this.model?.buttonAppearance.addFreshListener(this.update.bind(this));
2027
1397
  }
1398
+ #onCommand(command) {
1399
+ switch (command) {
1400
+ case "fullscreen":
1401
+ this.onFullscreenButton();
1402
+ break;
1403
+ case "jump-to-start":
1404
+ this.controller?.jumpToStart({ flash: true });
1405
+ break;
1406
+ case "play-step-backwards":
1407
+ this.controller?.animationController.play({
1408
+ direction: -1 /* Backwards */,
1409
+ untilBoundary: "move" /* Move */
1410
+ });
1411
+ break;
1412
+ case "play-pause":
1413
+ this.controller?.togglePlay();
1414
+ break;
1415
+ case "play-step":
1416
+ this.controller?.animationController.play({
1417
+ direction: 1 /* Forwards */,
1418
+ untilBoundary: "move" /* Move */
1419
+ });
1420
+ break;
1421
+ case "jump-to-end":
1422
+ this.controller?.jumpToEnd({ flash: true });
1423
+ break;
1424
+ case "twizzle-link":
1425
+ this.controller?.visitTwizzleLink();
1426
+ break;
1427
+ default:
1428
+ throw new Error("Missing command");
1429
+ }
1430
+ }
2028
1431
  async onFullscreenButton() {
2029
1432
  if (!this.fullscreenElement) {
2030
1433
  throw new Error("Attempted to go fullscreen without an element.");
@@ -2054,57 +1457,26 @@ var TwistyButtons = class extends ManagedCustomElement {
2054
1457
  }
2055
1458
  }
2056
1459
  };
2057
- _onCommand = new WeakSet();
2058
- onCommand_fn = function(command) {
2059
- switch (command) {
2060
- case "fullscreen":
2061
- this.onFullscreenButton();
2062
- break;
2063
- case "jump-to-start":
2064
- this.controller?.jumpToStart({ flash: true });
2065
- break;
2066
- case "play-step-backwards":
2067
- this.controller?.animationController.play({
2068
- direction: -1 /* Backwards */,
2069
- untilBoundary: "move" /* Move */
2070
- });
2071
- break;
2072
- case "play-pause":
2073
- this.controller?.togglePlay();
2074
- break;
2075
- case "play-step":
2076
- this.controller?.animationController.play({
2077
- direction: 1 /* Forwards */,
2078
- untilBoundary: "move" /* Move */
2079
- });
2080
- break;
2081
- case "jump-to-end":
2082
- this.controller?.jumpToEnd({ flash: true });
2083
- break;
2084
- case "twizzle-link":
2085
- this.controller?.visitTwizzleLink();
2086
- break;
2087
- default:
2088
- throw new Error("Missing command");
2089
- }
2090
- };
2091
1460
  customElementsShim.define("twisty-buttons", TwistyButtons);
2092
- var _iconManager;
2093
1461
  var TwistyButton = class extends ManagedCustomElement {
2094
1462
  constructor() {
2095
1463
  super(...arguments);
2096
1464
  this.htmlButton = document.createElement("button");
2097
- __privateAdd(this, _iconManager, new ClassListManager(this, "svg-", buttonIcons));
1465
+ this.#iconManager = new ClassListManager(
1466
+ this,
1467
+ "svg-",
1468
+ buttonIcons
1469
+ );
2098
1470
  }
2099
1471
  connectedCallback() {
2100
1472
  this.addCSS(buttonCSS);
2101
1473
  this.addElement(this.htmlButton);
2102
1474
  }
1475
+ #iconManager;
2103
1476
  setIcon(iconName) {
2104
- __privateGet(this, _iconManager).setValue(iconName);
1477
+ this.#iconManager.setValue(iconName);
2105
1478
  }
2106
1479
  };
2107
- _iconManager = new WeakMap();
2108
1480
  customElementsShim.define("twisty-button", TwistyButton);
2109
1481
 
2110
1482
  // src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts
@@ -2133,21 +1505,33 @@ input:not(:disabled) {
2133
1505
  // src/cubing/twisty/views/control-panel/TwistyScrubber.ts
2134
1506
  var SLOW_DOWN_SCRUBBING = false;
2135
1507
  var isMouseDown = false;
2136
- globalSafeDocument?.addEventListener("mousedown", function(event) {
2137
- if (event.which) {
2138
- isMouseDown = true;
2139
- }
2140
- }, true);
2141
- globalSafeDocument?.addEventListener("mouseup", function(event) {
2142
- if (event.which) {
2143
- isMouseDown = false;
2144
- }
2145
- }, true);
1508
+ globalSafeDocument?.addEventListener(
1509
+ "mousedown",
1510
+ function(event) {
1511
+ if (event.which) {
1512
+ isMouseDown = true;
1513
+ }
1514
+ },
1515
+ true
1516
+ );
1517
+ globalSafeDocument?.addEventListener(
1518
+ "mouseup",
1519
+ function(event) {
1520
+ if (event.which) {
1521
+ isMouseDown = false;
1522
+ }
1523
+ },
1524
+ true
1525
+ );
2146
1526
  var y = 0;
2147
1527
  var clickNum = 0;
2148
- globalSafeDocument?.addEventListener("mousedown", () => {
2149
- clickNum++;
2150
- }, false);
1528
+ globalSafeDocument?.addEventListener(
1529
+ "mousedown",
1530
+ () => {
1531
+ clickNum++;
1532
+ },
1533
+ false
1534
+ );
2151
1535
  globalSafeDocument?.addEventListener("mousemove", onMouseUpdate, false);
2152
1536
  globalSafeDocument?.addEventListener("mouseenter", onMouseUpdate, false);
2153
1537
  function onMouseUpdate(e) {
@@ -2157,12 +1541,10 @@ var lastVal = 0;
2157
1541
  var lastPreval = 0;
2158
1542
  var scaling = false;
2159
1543
  var currentClickNum = 0;
2160
- var _inputElem;
2161
1544
  var TwistyScrubber = class extends ManagedCustomElement {
2162
1545
  constructor(model) {
2163
1546
  super();
2164
1547
  this.model = model;
2165
- __privateAdd(this, _inputElem, null);
2166
1548
  }
2167
1549
  async onDetailedTimelineInfo(detailedTimelineInfo) {
2168
1550
  const inputElem = await this.inputElem();
@@ -2175,12 +1557,15 @@ var TwistyScrubber = class extends ManagedCustomElement {
2175
1557
  this.addCSS(twistyScrubberCSS);
2176
1558
  this.addElement(await this.inputElem());
2177
1559
  }
1560
+ #inputElem = null;
2178
1561
  async inputElem() {
2179
- return __privateGet(this, _inputElem) ?? __privateSet(this, _inputElem, (async () => {
1562
+ return this.#inputElem ?? (this.#inputElem = (async () => {
2180
1563
  const elem = document.createElement("input");
2181
1564
  elem.type = "range";
2182
1565
  elem.disabled = true;
2183
- this.model?.detailedTimelineInfo.addFreshListener(this.onDetailedTimelineInfo.bind(this));
1566
+ this.model?.detailedTimelineInfo.addFreshListener(
1567
+ this.onDetailedTimelineInfo.bind(this)
1568
+ );
2184
1569
  elem.addEventListener("input", this.onInput.bind(this));
2185
1570
  return elem;
2186
1571
  })());
@@ -2227,7 +1612,6 @@ var TwistyScrubber = class extends ManagedCustomElement {
2227
1612
  }
2228
1613
  }
2229
1614
  };
2230
- _inputElem = new WeakMap();
2231
1615
  customElementsShim.define("twisty-scrubber", TwistyScrubber);
2232
1616
 
2233
1617
  // src/cubing/twisty/views/screenshot.ts
@@ -2240,8 +1624,13 @@ async function screenshot(model, options) {
2240
1624
  return new (await THREEJS).PerspectiveCamera(20, aspectRatio, 0.1, 20);
2241
1625
  })());
2242
1626
  const scene = new (await THREEJS).Scene();
2243
- const twisty3DWrapper = new Twisty3DPuzzleWrapper(model, { scheduleRender: () => {
2244
- } }, await model.puzzleLoader.get(), await model.visualizationStrategy.get());
1627
+ const twisty3DWrapper = new Twisty3DPuzzleWrapper(
1628
+ model,
1629
+ { scheduleRender: () => {
1630
+ } },
1631
+ await model.puzzleLoader.get(),
1632
+ await model.visualizationStrategy.get()
1633
+ );
2245
1634
  await model.twistySceneModel.stickering.get();
2246
1635
  await new Promise((resolve) => setTimeout(resolve, 1e3));
2247
1636
  await model.legacyPosition.get();
@@ -2451,9 +1840,13 @@ var AnchorTransformationProp = class extends TwistyPropDerived {
2451
1840
  case "start":
2452
1841
  return inputs.setupAlgTransformation;
2453
1842
  case "end": {
2454
- const algTransformation = inputs.indexer.transformationAtIndex(inputs.indexer.numAnimatedLeaves());
1843
+ const algTransformation = inputs.indexer.transformationAtIndex(
1844
+ inputs.indexer.numAnimatedLeaves()
1845
+ );
2455
1846
  const inverseAlgTransformation = algTransformation.invert();
2456
- return inputs.setupAlgTransformation.applyTransformation(inverseAlgTransformation);
1847
+ return inputs.setupAlgTransformation.applyTransformation(
1848
+ inverseAlgTransformation
1849
+ );
2457
1850
  }
2458
1851
  default:
2459
1852
  throw new Error("Unimplemented!");
@@ -2476,12 +1869,24 @@ var CurrentLeavesSimplifiedProp = class extends TwistyPropDerived {
2476
1869
  derive(inputs) {
2477
1870
  return {
2478
1871
  stateIndex: inputs.currentMoveInfo.stateIndex,
2479
- movesFinishing: inputs.currentMoveInfo.movesFinishing.map((currentMoveInfo) => currentMoveInfo.move),
2480
- movesFinished: inputs.currentMoveInfo.movesFinished.map((currentMoveInfo) => currentMoveInfo.move)
1872
+ movesFinishing: inputs.currentMoveInfo.movesFinishing.map(
1873
+ (currentMoveInfo) => currentMoveInfo.move
1874
+ ),
1875
+ movesFinished: inputs.currentMoveInfo.movesFinished.map(
1876
+ (currentMoveInfo) => currentMoveInfo.move
1877
+ )
2481
1878
  };
2482
1879
  }
2483
1880
  canReuse(v1, v2) {
2484
- return v1.stateIndex === v2.stateIndex && arrayEqualsCompare(v1.movesFinishing, v2.movesFinishing, (m1, m2) => m1.isIdentical(m2)) && arrayEqualsCompare(v1.movesFinished, v2.movesFinished, (m1, m2) => m1.isIdentical(m2));
1881
+ return v1.stateIndex === v2.stateIndex && arrayEqualsCompare(
1882
+ v1.movesFinishing,
1883
+ v2.movesFinishing,
1884
+ (m1, m2) => m1.isIdentical(m2)
1885
+ ) && arrayEqualsCompare(
1886
+ v1.movesFinished,
1887
+ v2.movesFinished,
1888
+ (m1, m2) => m1.isIdentical(m2)
1889
+ );
2485
1890
  }
2486
1891
  };
2487
1892
 
@@ -2501,9 +1906,13 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
2501
1906
  return currentMoveInfo;
2502
1907
  }
2503
1908
  if (inputs.indexer.currentMoveInfo) {
2504
- return addCatchUpMove(inputs.indexer.currentMoveInfo(inputs.detailedTimelineInfo.timestamp));
1909
+ return addCatchUpMove(
1910
+ inputs.indexer.currentMoveInfo(inputs.detailedTimelineInfo.timestamp)
1911
+ );
2505
1912
  } else {
2506
- const idx = inputs.indexer.timestampToIndex(inputs.detailedTimelineInfo.timestamp);
1913
+ const idx = inputs.indexer.timestampToIndex(
1914
+ inputs.detailedTimelineInfo.timestamp
1915
+ );
2507
1916
  const currentMoveInfo = {
2508
1917
  stateIndex: idx,
2509
1918
  currentMoves: [],
@@ -2535,8 +1944,14 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
2535
1944
  currentMoveInfo.movesFinishing.push(currentMove);
2536
1945
  } else {
2537
1946
  currentMoveInfo.currentMoves.push(currentMove);
2538
- currentMoveInfo.latestStart = Math.max(currentMoveInfo.latestStart, start);
2539
- currentMoveInfo.earliestEnd = Math.min(currentMoveInfo.earliestEnd, end);
1947
+ currentMoveInfo.latestStart = Math.max(
1948
+ currentMoveInfo.latestStart,
1949
+ start
1950
+ );
1951
+ currentMoveInfo.earliestEnd = Math.min(
1952
+ currentMoveInfo.earliestEnd,
1953
+ end
1954
+ );
2540
1955
  }
2541
1956
  }
2542
1957
  return addCatchUpMove(currentMoveInfo);
@@ -2547,7 +1962,9 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
2547
1962
  // src/cubing/twisty/model/props/puzzle/state/CurrentStateProp.ts
2548
1963
  var CurrentStateProp = class extends TwistyPropDerived {
2549
1964
  derive(inputs) {
2550
- let transformation = inputs.indexer.transformationAtIndex(inputs.currentLeavesSimplified.stateIndex);
1965
+ let transformation = inputs.indexer.transformationAtIndex(
1966
+ inputs.currentLeavesSimplified.stateIndex
1967
+ );
2551
1968
  transformation = inputs.anchoredStart.applyTransformation(transformation);
2552
1969
  for (const finishingMove of inputs.currentLeavesSimplified.movesFinishing) {
2553
1970
  transformation = transformation.applyMove(finishingMove);
@@ -2611,7 +2028,9 @@ var AlgDuration = class extends TraversalUp {
2611
2028
  var SimpleAlgIndexer = class {
2612
2029
  constructor(kpuzzle, alg) {
2613
2030
  this.kpuzzle = kpuzzle;
2614
- this.durationFn = new AlgDuration(defaultDurationForAmount);
2031
+ this.durationFn = new AlgDuration(
2032
+ defaultDurationForAmount
2033
+ );
2615
2034
  this.moves = new Alg(alg.experimentalExpand());
2616
2035
  }
2617
2036
  getAnimLeaf(index) {
@@ -2696,15 +2115,20 @@ var LocalSimulMoves = class extends TraversalUp {
2696
2115
  return this.traverseAlg(alg);
2697
2116
  }
2698
2117
  }
2699
- maxSimulDur = Math.max(maxSimulDur, defaultDurationForAmount(moves[i].amount));
2118
+ maxSimulDur = Math.max(
2119
+ maxSimulDur,
2120
+ defaultDurationForAmount(moves[i].amount)
2121
+ );
2700
2122
  }
2701
- const localMovesWithRange = moves.map((blockMove) => {
2702
- return {
2703
- animLeafAlgNode: blockMove,
2704
- msUntilNext: 0,
2705
- duration: maxSimulDur
2706
- };
2707
- });
2123
+ const localMovesWithRange = moves.map(
2124
+ (blockMove) => {
2125
+ return {
2126
+ animLeafAlgNode: blockMove,
2127
+ msUntilNext: 0,
2128
+ duration: maxSimulDur
2129
+ };
2130
+ }
2131
+ );
2708
2132
  localMovesWithRange[localMovesWithRange.length - 1].msUntilNext = maxSimulDur;
2709
2133
  return localMovesWithRange;
2710
2134
  }
@@ -2772,18 +2196,22 @@ var LocalSimulMoves = class extends TraversalUp {
2772
2196
  }
2773
2197
  };
2774
2198
  var localSimulMovesInstance = new LocalSimulMoves();
2775
- var localSimulMoves = localSimulMovesInstance.traverseAlg.bind(localSimulMovesInstance);
2199
+ var localSimulMoves = localSimulMovesInstance.traverseAlg.bind(
2200
+ localSimulMovesInstance
2201
+ );
2776
2202
  function simulMoves(a) {
2777
2203
  let timestamp = 0;
2778
- const l = localSimulMoves(a).map((localSimulMove) => {
2779
- const leafWithRange = {
2780
- animLeaf: localSimulMove.animLeafAlgNode,
2781
- start: timestamp,
2782
- end: timestamp + localSimulMove.duration
2783
- };
2784
- timestamp += localSimulMove.msUntilNext;
2785
- return leafWithRange;
2786
- });
2204
+ const l = localSimulMoves(a).map(
2205
+ (localSimulMove) => {
2206
+ const leafWithRange = {
2207
+ animLeaf: localSimulMove.animLeafAlgNode,
2208
+ start: timestamp,
2209
+ end: timestamp + localSimulMove.duration
2210
+ };
2211
+ timestamp += localSimulMove.msUntilNext;
2212
+ return leafWithRange;
2213
+ }
2214
+ );
2787
2215
  return l;
2788
2216
  }
2789
2217
 
@@ -2864,7 +2292,10 @@ var SimultaneousMoveIndexer = class {
2864
2292
  timestampToPosition(timestamp, startState) {
2865
2293
  const currentMoveInfo = this.currentMoveInfo(timestamp);
2866
2294
  let state = startState ?? this.kpuzzle.identityTransformation().toKState();
2867
- for (const leafWithRange of this.animLeaves.slice(0, currentMoveInfo.stateIndex)) {
2295
+ for (const leafWithRange of this.animLeaves.slice(
2296
+ 0,
2297
+ currentMoveInfo.stateIndex
2298
+ )) {
2868
2299
  const move = leafWithRange.animLeaf.as(Move);
2869
2300
  if (move !== null) {
2870
2301
  state = state.applyMove(move);
@@ -2879,7 +2310,10 @@ var SimultaneousMoveIndexer = class {
2879
2310
  let windowEarliestTimestamp = Infinity;
2880
2311
  for (const leafWithRange of this.animLeaves) {
2881
2312
  if (leafWithRange.start <= timestamp && leafWithRange.end >= timestamp) {
2882
- windowEarliestTimestamp = Math.min(windowEarliestTimestamp, leafWithRange.start);
2313
+ windowEarliestTimestamp = Math.min(
2314
+ windowEarliestTimestamp,
2315
+ leafWithRange.start
2316
+ );
2883
2317
  } else if (leafWithRange.start > timestamp) {
2884
2318
  break;
2885
2319
  }
@@ -2992,10 +2426,18 @@ var DecoratorConstructor = class extends TraversalUp {
2992
2426
  constructor(kpuzzle) {
2993
2427
  super();
2994
2428
  this.kpuzzle = kpuzzle;
2995
- this.durationFn = new AlgDuration(defaultDurationForAmount);
2429
+ this.durationFn = new AlgDuration(
2430
+ defaultDurationForAmount
2431
+ );
2996
2432
  this.cache = {};
2997
2433
  this.identity = kpuzzle.identityTransformation();
2998
- this.dummyLeaf = new AlgWalkterDecoration(0, 0, this.identity, this.identity, []);
2434
+ this.dummyLeaf = new AlgWalkterDecoration(
2435
+ 0,
2436
+ 0,
2437
+ this.identity,
2438
+ this.identity,
2439
+ []
2440
+ );
2999
2441
  }
3000
2442
  traverseAlg(alg) {
3001
2443
  let moveCount = 0;
@@ -3013,7 +2455,13 @@ var DecoratorConstructor = class extends TraversalUp {
3013
2455
  }
3014
2456
  child.push(apd);
3015
2457
  }
3016
- return new AlgWalkterDecoration(moveCount, duration, transformation, transformation.invert(), child);
2458
+ return new AlgWalkterDecoration(
2459
+ moveCount,
2460
+ duration,
2461
+ transformation,
2462
+ transformation.invert(),
2463
+ child
2464
+ );
3017
2465
  }
3018
2466
  traverseGrouping(grouping) {
3019
2467
  const dec = this.traverseAlg(grouping.alg);
@@ -3026,7 +2474,12 @@ var DecoratorConstructor = class extends TraversalUp {
3026
2474
  return r;
3027
2475
  }
3028
2476
  const transformation = this.kpuzzle.moveToTransformation(move);
3029
- r = new AlgWalkterDecoration(1, this.durationFn.traverseAlgNode(move), transformation, transformation.invert());
2477
+ r = new AlgWalkterDecoration(
2478
+ 1,
2479
+ this.durationFn.traverseAlgNode(move),
2480
+ transformation,
2481
+ transformation.invert()
2482
+ );
3030
2483
  this.cache[key] = r;
3031
2484
  return r;
3032
2485
  }
@@ -3036,7 +2489,13 @@ var DecoratorConstructor = class extends TraversalUp {
3036
2489
  const AB = decA.forward.applyTransformation(decB.forward);
3037
2490
  const ApBp = decA.backward.applyTransformation(decB.backward);
3038
2491
  const ABApBp = AB.applyTransformation(ApBp);
3039
- const dec = new AlgWalkterDecoration(2 * (decA.moveCount + decB.moveCount), 2 * (decA.duration + decB.duration), ABApBp, ABApBp.invert(), [decA, decB]);
2492
+ const dec = new AlgWalkterDecoration(
2493
+ 2 * (decA.moveCount + decB.moveCount),
2494
+ 2 * (decA.duration + decB.duration),
2495
+ ABApBp,
2496
+ ABApBp.invert(),
2497
+ [decA, decB]
2498
+ );
3040
2499
  return this.mult(dec, 1, [dec, decA, decB]);
3041
2500
  }
3042
2501
  traverseConjugate(conjugate) {
@@ -3044,14 +2503,25 @@ var DecoratorConstructor = class extends TraversalUp {
3044
2503
  const decB = this.traverseAlg(conjugate.B);
3045
2504
  const AB = decA.forward.applyTransformation(decB.forward);
3046
2505
  const ABAp = AB.applyTransformation(decA.backward);
3047
- const dec = new AlgWalkterDecoration(2 * decA.moveCount + decB.moveCount, 2 * decA.duration + decB.duration, ABAp, ABAp.invert(), [decA, decB]);
2506
+ const dec = new AlgWalkterDecoration(
2507
+ 2 * decA.moveCount + decB.moveCount,
2508
+ 2 * decA.duration + decB.duration,
2509
+ ABAp,
2510
+ ABAp.invert(),
2511
+ [decA, decB]
2512
+ );
3048
2513
  return this.mult(dec, 1, [dec, decA, decB]);
3049
2514
  }
3050
2515
  traversePause(pause) {
3051
2516
  if (pause.experimentalNISSGrouping) {
3052
2517
  return this.dummyLeaf;
3053
2518
  }
3054
- return new AlgWalkterDecoration(1, this.durationFn.traverseAlgNode(pause), this.identity, this.identity);
2519
+ return new AlgWalkterDecoration(
2520
+ 1,
2521
+ this.durationFn.traverseAlgNode(pause),
2522
+ this.identity,
2523
+ this.identity
2524
+ );
3055
2525
  }
3056
2526
  traverseNewline(_newline) {
3057
2527
  return this.dummyLeaf;
@@ -3062,7 +2532,13 @@ var DecoratorConstructor = class extends TraversalUp {
3062
2532
  mult(apd, n, child) {
3063
2533
  const absn = Math.abs(n);
3064
2534
  const st = apd.forward.selfMultiply(n);
3065
- return new AlgWalkterDecoration(apd.moveCount * absn, apd.duration * absn, st, st.invert(), child);
2535
+ return new AlgWalkterDecoration(
2536
+ apd.moveCount * absn,
2537
+ apd.duration * absn,
2538
+ st,
2539
+ st.invert(),
2540
+ child
2541
+ );
3066
2542
  }
3067
2543
  };
3068
2544
  var WalkerDown = class {
@@ -3116,8 +2592,14 @@ var AlgWalker = class extends TraversalDownUp {
3116
2592
  return false;
3117
2593
  }
3118
2594
  let i = wd.back ? alg.experimentalNumChildAlgNodes() - 1 : 0;
3119
- for (const algNode of directedGenerator(alg.childAlgNodes(), wd.back ? -1 /* Backwards */ : 1 /* Forwards */)) {
3120
- if (this.traverseAlgNode(algNode, new WalkerDown(wd.apd.children[i], wd.back))) {
2595
+ for (const algNode of directedGenerator(
2596
+ alg.childAlgNodes(),
2597
+ wd.back ? -1 /* Backwards */ : 1 /* Forwards */
2598
+ )) {
2599
+ if (this.traverseAlgNode(
2600
+ algNode,
2601
+ new WalkerDown(wd.apd.children[i], wd.back)
2602
+ )) {
3121
2603
  return true;
3122
2604
  }
3123
2605
  i += wd.back ? -1 : 1;
@@ -3129,7 +2611,10 @@ var AlgWalker = class extends TraversalDownUp {
3129
2611
  return false;
3130
2612
  }
3131
2613
  const back = this.domult(wd, grouping.amount);
3132
- return this.traverseAlg(grouping.alg, new WalkerDown(wd.apd.children[0], back));
2614
+ return this.traverseAlg(
2615
+ grouping.alg,
2616
+ new WalkerDown(wd.apd.children[0], back)
2617
+ );
3133
2618
  }
3134
2619
  traverseMove(move, wd) {
3135
2620
  if (!this.firstcheck(wd)) {
@@ -3146,9 +2631,30 @@ var AlgWalker = class extends TraversalDownUp {
3146
2631
  }
3147
2632
  const back = this.domult(wd, 1);
3148
2633
  if (back) {
3149
- return this.traverseAlg(commutator.B, new WalkerDown(wd.apd.children[2], !back)) || this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], !back)) || this.traverseAlg(commutator.B, new WalkerDown(wd.apd.children[2], back)) || this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], back));
2634
+ return this.traverseAlg(
2635
+ commutator.B,
2636
+ new WalkerDown(wd.apd.children[2], !back)
2637
+ ) || this.traverseAlg(
2638
+ commutator.A,
2639
+ new WalkerDown(wd.apd.children[1], !back)
2640
+ ) || this.traverseAlg(
2641
+ commutator.B,
2642
+ new WalkerDown(wd.apd.children[2], back)
2643
+ ) || this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], back));
3150
2644
  } else {
3151
- return this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], back)) || this.traverseAlg(commutator.B, new WalkerDown(wd.apd.children[2], back)) || this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], !back)) || this.traverseAlg(commutator.B, new WalkerDown(wd.apd.children[2], !back));
2645
+ return this.traverseAlg(
2646
+ commutator.A,
2647
+ new WalkerDown(wd.apd.children[1], back)
2648
+ ) || this.traverseAlg(
2649
+ commutator.B,
2650
+ new WalkerDown(wd.apd.children[2], back)
2651
+ ) || this.traverseAlg(
2652
+ commutator.A,
2653
+ new WalkerDown(wd.apd.children[1], !back)
2654
+ ) || this.traverseAlg(
2655
+ commutator.B,
2656
+ new WalkerDown(wd.apd.children[2], !back)
2657
+ );
3152
2658
  }
3153
2659
  }
3154
2660
  traverseConjugate(conjugate, wd) {
@@ -3157,9 +2663,21 @@ var AlgWalker = class extends TraversalDownUp {
3157
2663
  }
3158
2664
  const back = this.domult(wd, 1);
3159
2665
  if (back) {
3160
- return this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], !back)) || this.traverseAlg(conjugate.B, new WalkerDown(wd.apd.children[2], back)) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], back));
2666
+ return this.traverseAlg(
2667
+ conjugate.A,
2668
+ new WalkerDown(wd.apd.children[1], !back)
2669
+ ) || this.traverseAlg(
2670
+ conjugate.B,
2671
+ new WalkerDown(wd.apd.children[2], back)
2672
+ ) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], back));
3161
2673
  } else {
3162
- return this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], back)) || this.traverseAlg(conjugate.B, new WalkerDown(wd.apd.children[2], back)) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], !back));
2674
+ return this.traverseAlg(
2675
+ conjugate.A,
2676
+ new WalkerDown(wd.apd.children[1], back)
2677
+ ) || this.traverseAlg(
2678
+ conjugate.B,
2679
+ new WalkerDown(wd.apd.children[2], back)
2680
+ ) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], !back));
3163
2681
  }
3164
2682
  }
3165
2683
  traversePause(pause, wd) {
@@ -3193,7 +2711,10 @@ var AlgWalker = class extends TraversalDownUp {
3193
2711
  amount = -amount;
3194
2712
  }
3195
2713
  const base = wd.apd.children[0];
3196
- const full = Math.min(Math.floor((this.goali - this.i) / base.moveCount), Math.ceil((this.goaldur - this.dur) / base.duration - 1));
2714
+ const full = Math.min(
2715
+ Math.floor((this.goali - this.i) / base.moveCount),
2716
+ Math.ceil((this.goaldur - this.dur) / base.duration - 1)
2717
+ );
3197
2718
  if (full > 0) {
3198
2719
  this.keepgoing(new WalkerDown(base, back), full);
3199
2720
  }
@@ -3204,7 +2725,9 @@ var AlgWalker = class extends TraversalDownUp {
3204
2725
  this.dur += mul * wd.apd.duration;
3205
2726
  if (mul !== 1) {
3206
2727
  if (wd.back) {
3207
- this.st = this.st.applyTransformation(wd.apd.backward.selfMultiply(mul));
2728
+ this.st = this.st.applyTransformation(
2729
+ wd.apd.backward.selfMultiply(mul)
2730
+ );
3208
2731
  } else {
3209
2732
  this.st = this.st.applyTransformation(wd.apd.forward.selfMultiply(mul));
3210
2733
  }
@@ -3243,16 +2766,25 @@ var ChunkAlgs = class extends TraversalUp {
3243
2766
  return chunkifyAlg(alg, Math.ceil(Math.sqrt(algLength)));
3244
2767
  }
3245
2768
  traverseGrouping(grouping) {
3246
- return new Grouping(this.traverseAlg(grouping.alg), grouping.amount);
2769
+ return new Grouping(
2770
+ this.traverseAlg(grouping.alg),
2771
+ grouping.amount
2772
+ );
3247
2773
  }
3248
2774
  traverseMove(move) {
3249
2775
  return move;
3250
2776
  }
3251
2777
  traverseCommutator(commutator) {
3252
- return new Conjugate(this.traverseAlg(commutator.A), this.traverseAlg(commutator.B));
2778
+ return new Conjugate(
2779
+ this.traverseAlg(commutator.A),
2780
+ this.traverseAlg(commutator.B)
2781
+ );
3253
2782
  }
3254
2783
  traverseConjugate(conjugate) {
3255
- return new Conjugate(this.traverseAlg(conjugate.A), this.traverseAlg(conjugate.B));
2784
+ return new Conjugate(
2785
+ this.traverseAlg(conjugate.A),
2786
+ this.traverseAlg(conjugate.B)
2787
+ );
3256
2788
  }
3257
2789
  traversePause(pause) {
3258
2790
  return pause;
@@ -3265,7 +2797,9 @@ var ChunkAlgs = class extends TraversalUp {
3265
2797
  }
3266
2798
  };
3267
2799
  var chunkAlgsInstance = new ChunkAlgs();
3268
- var chunkAlgs = chunkAlgsInstance.traverseAlg.bind(chunkAlgsInstance);
2800
+ var chunkAlgs = chunkAlgsInstance.traverseAlg.bind(
2801
+ chunkAlgsInstance
2802
+ );
3269
2803
 
3270
2804
  // src/cubing/twisty/controllers/indexer/tree/TreeAlgIndexer.ts
3271
2805
  var TreeAlgIndexer = class {
@@ -3303,7 +2837,9 @@ var TreeAlgIndexer = class {
3303
2837
  }
3304
2838
  stateAtIndex(index, startState) {
3305
2839
  this.walker.moveByIndex(index);
3306
- return (startState ?? this.kpuzzle.startState()).applyTransformation(this.walker.st);
2840
+ return (startState ?? this.kpuzzle.startState()).applyTransformation(
2841
+ this.walker.st
2842
+ );
3307
2843
  }
3308
2844
  transformationAtIndex(index) {
3309
2845
  this.walker.moveByIndex(index);
@@ -3477,14 +3013,9 @@ var CoarseTimelineInfoProp = class extends TwistyPropDerived {
3477
3013
  };
3478
3014
 
3479
3015
  // src/cubing/twisty/model/props/timeline/DetailedTimelineInfoProp.ts
3480
- var _requestedTimestampToMilliseconds, requestedTimestampToMilliseconds_fn;
3481
3016
  var DetailedTimelineInfoProp = class extends TwistyPropDerived {
3482
- constructor() {
3483
- super(...arguments);
3484
- __privateAdd(this, _requestedTimestampToMilliseconds);
3485
- }
3486
3017
  derive(inputs) {
3487
- let timestamp = __privateMethod(this, _requestedTimestampToMilliseconds, requestedTimestampToMilliseconds_fn).call(this, inputs);
3018
+ let timestamp = this.#requestedTimestampToMilliseconds(inputs);
3488
3019
  let atStart = false;
3489
3020
  let atEnd = false;
3490
3021
  if (timestamp >= inputs.timeRange.end) {
@@ -3502,25 +3033,24 @@ var DetailedTimelineInfoProp = class extends TwistyPropDerived {
3502
3033
  atEnd
3503
3034
  };
3504
3035
  }
3036
+ #requestedTimestampToMilliseconds(inputs) {
3037
+ switch (inputs.timestampRequest) {
3038
+ case "start":
3039
+ return inputs.timeRange.start;
3040
+ case "end":
3041
+ return inputs.timeRange.end;
3042
+ case "anchor":
3043
+ return inputs.setupAnchor === "start" ? inputs.timeRange.start : inputs.timeRange.end;
3044
+ case "opposite-anchor":
3045
+ return inputs.setupAnchor === "start" ? inputs.timeRange.end : inputs.timeRange.start;
3046
+ default:
3047
+ return inputs.timestampRequest;
3048
+ }
3049
+ }
3505
3050
  canReuse(v1, v2) {
3506
3051
  return v1.timestamp === v2.timestamp && v1.timeRange.start === v2.timeRange.start && v1.timeRange.end === v2.timeRange.end && v1.atStart === v2.atStart && v1.atEnd === v2.atEnd;
3507
3052
  }
3508
3053
  };
3509
- _requestedTimestampToMilliseconds = new WeakSet();
3510
- requestedTimestampToMilliseconds_fn = function(inputs) {
3511
- switch (inputs.timestampRequest) {
3512
- case "start":
3513
- return inputs.timeRange.start;
3514
- case "end":
3515
- return inputs.timeRange.end;
3516
- case "anchor":
3517
- return inputs.setupAnchor === "start" ? inputs.timeRange.start : inputs.timeRange.end;
3518
- case "opposite-anchor":
3519
- return inputs.setupAnchor === "start" ? inputs.timeRange.end : inputs.timeRange.start;
3520
- default:
3521
- return inputs.timestampRequest;
3522
- }
3523
- };
3524
3054
 
3525
3055
  // src/cubing/twisty/model/props/timeline/PlayingInfoProp.ts
3526
3056
  var PlayingInfoProp = class extends TwistyPropSource {
@@ -3640,7 +3170,11 @@ var VisualizationStrategyProp = class extends TwistyPropDerived {
3640
3170
  case "3D":
3641
3171
  return "PG3D";
3642
3172
  case "experimental-2D-LL":
3643
- return "2D";
3173
+ if (inputs.puzzleID === "4x4x4") {
3174
+ return "experimental-2D-LL";
3175
+ } else {
3176
+ return "2D";
3177
+ }
3644
3178
  default:
3645
3179
  return inputs.visualizationRequest;
3646
3180
  }
@@ -3672,7 +3206,12 @@ var SpriteProp = class extends TwistyPropDerived {
3672
3206
  resolve(null);
3673
3207
  };
3674
3208
  try {
3675
- (await loader()).load(textureURL.toString(), resolve, onLoadingError, onLoadingError);
3209
+ (await loader()).load(
3210
+ textureURL.toString(),
3211
+ resolve,
3212
+ onLoadingError,
3213
+ onLoadingError
3214
+ );
3676
3215
  } catch (e) {
3677
3216
  onLoadingError();
3678
3217
  }
@@ -3756,7 +3295,13 @@ var OrbitCoordinatesProp = class extends TwistyPropDerived {
3756
3295
  if (inputs.orbitCoordinatesRequest === "auto") {
3757
3296
  return defaultCameraOrbitCoordinates(inputs.puzzleID, inputs.strategy);
3758
3297
  }
3759
- const req = Object.assign(Object.assign({}, defaultCameraOrbitCoordinates(inputs.puzzleID, inputs.strategy), inputs.orbitCoordinatesRequest));
3298
+ const req = Object.assign(
3299
+ Object.assign(
3300
+ {},
3301
+ defaultCameraOrbitCoordinates(inputs.puzzleID, inputs.strategy),
3302
+ inputs.orbitCoordinatesRequest
3303
+ )
3304
+ );
3760
3305
  if (Math.abs(req.latitude) <= inputs.latitudeLimit) {
3761
3306
  return req;
3762
3307
  } else {
@@ -3882,10 +3427,13 @@ var TwistyPlayerModel = class {
3882
3427
  this.title = new ArbitraryStringProp();
3883
3428
  this.videoURL = new URLProp();
3884
3429
  this.competitionID = new ArbitraryStringProp();
3885
- this.puzzleLoader = new PuzzleLoaderProp({
3886
- puzzleIDRequest: this.puzzleIDRequest,
3887
- puzzleDescriptionRequest: this.puzzleDescriptionRequest
3888
- }, this.userVisibleErrorTracker);
3430
+ this.puzzleLoader = new PuzzleLoaderProp(
3431
+ {
3432
+ puzzleIDRequest: this.puzzleIDRequest,
3433
+ puzzleDescriptionRequest: this.puzzleDescriptionRequest
3434
+ },
3435
+ this.userVisibleErrorTracker
3436
+ );
3889
3437
  this.kpuzzle = new KPuzzleProp({ puzzleLoader: this.puzzleLoader });
3890
3438
  this.puzzleID = new PuzzleIDProp({ puzzleLoader: this.puzzleLoader });
3891
3439
  this.puzzleAlg = new PuzzleAlgProp({
@@ -3925,11 +3473,13 @@ var TwistyPlayerModel = class {
3925
3473
  this.timeRange = new TimeRangeProp({
3926
3474
  indexer: this.indexer
3927
3475
  });
3928
- this.detailedTimelineInfo = new DetailedTimelineInfoProp({
3929
- timestampRequest: this.timestampRequest,
3930
- timeRange: this.timeRange,
3931
- setupAnchor: this.setupAnchor
3932
- });
3476
+ this.detailedTimelineInfo = new DetailedTimelineInfoProp(
3477
+ {
3478
+ timestampRequest: this.timestampRequest,
3479
+ timeRange: this.timeRange,
3480
+ setupAnchor: this.setupAnchor
3481
+ }
3482
+ );
3933
3483
  this.coarseTimelineInfo = new CoarseTimelineInfoProp({
3934
3484
  detailedTimelineInfo: this.detailedTimelineInfo,
3935
3485
  playingInfo: this.playingInfo
@@ -3976,7 +3526,9 @@ var TwistyPlayerModel = class {
3976
3526
  this.twistySceneModel.stickering.get()
3977
3527
  ]);
3978
3528
  const isExplorer = viewerLink === "experimental-twizzle-explorer";
3979
- const url = new URL(`https://alpha.twizzle.net/${isExplorer ? "explore" : "edit"}/`);
3529
+ const url = new URL(
3530
+ `https://alpha.twizzle.net/${isExplorer ? "explore" : "edit"}/`
3531
+ );
3980
3532
  if (!alg.alg.experimentalIsEmpty()) {
3981
3533
  url.searchParams.set("alg", alg.alg.toString());
3982
3534
  }
@@ -3996,31 +3548,46 @@ var TwistyPlayerModel = class {
3996
3548
  }
3997
3549
  return url.toString();
3998
3550
  }
3551
+ experimentalAddAlgLeaf(algLeaf, options = {}) {
3552
+ const maybeMove = algLeaf.as(Move);
3553
+ if (maybeMove) {
3554
+ this.experimentalAddMove(maybeMove, options);
3555
+ } else {
3556
+ this.alg.set(
3557
+ (async () => {
3558
+ const alg = (await this.alg.get()).alg;
3559
+ const newAlg = alg.concat(new Alg([algLeaf]));
3560
+ this.timestampRequest.set("end");
3561
+ return newAlg;
3562
+ })()
3563
+ );
3564
+ }
3565
+ }
3999
3566
  experimentalAddMove(flexibleMove, options = {}) {
4000
3567
  const move = typeof flexibleMove === "string" ? new Move(flexibleMove) : flexibleMove;
4001
- (async () => {
4002
- const alg = (await this.alg.get()).alg;
4003
- const newAlg = experimentalAppendMove(alg, move, {
4004
- coalesce: options?.coalesce,
4005
- mod: options?.mod
4006
- });
4007
- this.alg.set(newAlg);
4008
- this.timestampRequest.set("end");
4009
- this.catchUpMove.set({
4010
- move,
4011
- amount: 0
4012
- });
4013
- })();
4014
- }
4015
- get playingInfoProp() {
4016
- console.warn("Using deprecated prop: `playingInfoProp`. Please switch to: `playingInfo`");
4017
- return this.playingInfo;
3568
+ this.alg.set(
3569
+ (async () => {
3570
+ const alg = (await this.alg.get()).alg;
3571
+ const newAlg = experimentalAppendMove(alg, move, {
3572
+ coalesce: options?.coalesce,
3573
+ mod: options?.mod
3574
+ });
3575
+ this.timestampRequest.set("end");
3576
+ this.catchUpMove.set({
3577
+ move,
3578
+ amount: 0
3579
+ });
3580
+ return newAlg;
3581
+ })()
3582
+ );
4018
3583
  }
4019
3584
  };
4020
3585
 
4021
3586
  // src/cubing/twisty/views/TwistyPlayerSettable.ts
4022
3587
  function err(propName) {
4023
- return new Error(`Cannot get \`.${propName}\` directly from a \`TwistyPlayer\`.`);
3588
+ return new Error(
3589
+ `Cannot get \`.${propName}\` directly from a \`TwistyPlayer\`.`
3590
+ );
4024
3591
  }
4025
3592
  var TwistyPlayerSettable = class extends ManagedCustomElement {
4026
3593
  constructor() {
@@ -4231,23 +3798,32 @@ var twistyPlayerAttributeMap = {
4231
3798
  "experimental-sprite": "experimentalSprite",
4232
3799
  "experimental-hint-sprite": "experimentalHintSprite"
4233
3800
  };
4234
- var configKeys = Object.fromEntries(Object.values(twistyPlayerAttributeMap).map((s) => [s, true]));
4235
- var _controlsManager, _visualizationWrapperElem, _errorElem, _alreadyConnected, _flashLevel, _visualizationWrapper, _initial3DVisualizationWrapper, _visualizationStrategy, _setVisualizationWrapper, setVisualizationWrapper_fn;
3801
+ var configKeys = Object.fromEntries(
3802
+ Object.values(twistyPlayerAttributeMap).map((s) => [s, true])
3803
+ );
4236
3804
  var TwistyPlayer = class extends TwistyPlayerSettable {
4237
3805
  constructor(config = {}) {
4238
3806
  super();
4239
- __privateAdd(this, _setVisualizationWrapper);
4240
- this.controller = new TwistyPlayerController(this.experimentalModel, this);
3807
+ this.controller = new TwistyPlayerController(
3808
+ this.experimentalModel,
3809
+ this
3810
+ );
4241
3811
  this.experimentalCanvasClickCallback = () => {
4242
3812
  };
4243
- __privateAdd(this, _controlsManager, new ClassListManager(this, "controls-", ["auto"].concat(Object.keys(controlsLocations))));
4244
- __privateAdd(this, _visualizationWrapperElem, document.createElement("div"));
4245
- __privateAdd(this, _errorElem, document.createElement("div"));
4246
- __privateAdd(this, _alreadyConnected, false);
4247
- __privateAdd(this, _flashLevel, "auto");
4248
- __privateAdd(this, _visualizationWrapper, null);
4249
- __privateAdd(this, _initial3DVisualizationWrapper, new InitialValueTracker());
4250
- __privateAdd(this, _visualizationStrategy, null);
3813
+ this.#controlsManager = new ClassListManager(
3814
+ this,
3815
+ "controls-",
3816
+ ["auto"].concat(
3817
+ Object.keys(controlsLocations)
3818
+ )
3819
+ );
3820
+ this.#visualizationWrapperElem = document.createElement("div");
3821
+ this.#errorElem = document.createElement("div");
3822
+ this.#alreadyConnected = false;
3823
+ this.#flashLevel = "auto";
3824
+ this.#visualizationWrapper = null;
3825
+ this.#initial3DVisualizationWrapper = new InitialValueTracker();
3826
+ this.#visualizationStrategy = null;
4251
3827
  for (const [propName, value] of Object.entries(config)) {
4252
3828
  if (!configKeys[propName]) {
4253
3829
  console.warn(`Invalid config passed to TwistyPlayer: ${propName}`);
@@ -4256,49 +3832,100 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4256
3832
  this[propName] = value;
4257
3833
  }
4258
3834
  }
3835
+ #controlsManager;
3836
+ #visualizationWrapperElem;
3837
+ #errorElem;
3838
+ #alreadyConnected;
4259
3839
  async connectedCallback() {
4260
- if (__privateGet(this, _alreadyConnected)) {
3840
+ if (this.#alreadyConnected) {
4261
3841
  return;
4262
3842
  }
4263
- __privateSet(this, _alreadyConnected, true);
3843
+ this.#alreadyConnected = true;
4264
3844
  this.addCSS(twistyPlayerCSS);
4265
- this.addElement(__privateGet(this, _visualizationWrapperElem)).classList.add("visualization-wrapper");
4266
- this.addElement(__privateGet(this, _errorElem)).classList.add("error-elem");
4267
- __privateGet(this, _errorElem).textContent = "Error";
4268
- this.experimentalModel.userVisibleErrorTracker.addFreshListener((userVisibleError) => {
4269
- const errorString = userVisibleError.errors[0] ?? null;
4270
- this.contentWrapper.classList.toggle("error", !!errorString);
4271
- if (errorString) {
4272
- __privateGet(this, _errorElem).textContent = errorString;
3845
+ this.addElement(this.#visualizationWrapperElem).classList.add(
3846
+ "visualization-wrapper"
3847
+ );
3848
+ this.addElement(this.#errorElem).classList.add("error-elem");
3849
+ this.#errorElem.textContent = "Error";
3850
+ this.experimentalModel.userVisibleErrorTracker.addFreshListener(
3851
+ (userVisibleError) => {
3852
+ const errorString = userVisibleError.errors[0] ?? null;
3853
+ this.contentWrapper.classList.toggle("error", !!errorString);
3854
+ if (errorString) {
3855
+ this.#errorElem.textContent = errorString;
3856
+ }
4273
3857
  }
4274
- });
3858
+ );
4275
3859
  const scrubber = new TwistyScrubber(this.experimentalModel);
4276
3860
  this.contentWrapper.appendChild(scrubber);
4277
- this.buttons = new TwistyButtons(this.experimentalModel, this.controller, this);
3861
+ this.buttons = new TwistyButtons(
3862
+ this.experimentalModel,
3863
+ this.controller,
3864
+ this
3865
+ );
4278
3866
  this.contentWrapper.appendChild(this.buttons);
4279
- this.experimentalModel.twistySceneModel.background.addFreshListener((backgroundTheme) => {
4280
- this.contentWrapper.classList.toggle("checkered", backgroundTheme !== "none");
4281
- });
4282
- this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
4283
- __privateGet(this, _controlsManager).setValue(controlPanel);
4284
- });
4285
- this.experimentalModel.visualizationStrategy.addFreshListener(__privateMethod(this, _setVisualizationWrapper, setVisualizationWrapper_fn).bind(this));
3867
+ this.experimentalModel.twistySceneModel.background.addFreshListener(
3868
+ (backgroundTheme) => {
3869
+ this.contentWrapper.classList.toggle(
3870
+ "checkered",
3871
+ backgroundTheme !== "none"
3872
+ );
3873
+ }
3874
+ );
3875
+ this.experimentalModel.controlPanel.addFreshListener(
3876
+ (controlPanel) => {
3877
+ this.#controlsManager.setValue(controlPanel);
3878
+ }
3879
+ );
3880
+ this.experimentalModel.visualizationStrategy.addFreshListener(
3881
+ this.#setVisualizationWrapper.bind(this)
3882
+ );
4286
3883
  this.experimentalModel.puzzleID.addFreshListener(this.flash.bind(this));
4287
3884
  }
3885
+ #flashLevel;
4288
3886
  experimentalSetFlashLevel(newLevel) {
4289
- __privateSet(this, _flashLevel, newLevel);
3887
+ this.#flashLevel = newLevel;
4290
3888
  }
4291
3889
  flash() {
4292
- if (__privateGet(this, _flashLevel) === "auto") {
4293
- __privateGet(this, _visualizationWrapper)?.animate([{ opacity: 0.25 }, { opacity: 1 }], {
3890
+ if (this.#flashLevel === "auto") {
3891
+ this.#visualizationWrapper?.animate([{ opacity: 0.25 }, { opacity: 1 }], {
4294
3892
  duration: 250,
4295
3893
  easing: "ease-out"
4296
3894
  });
4297
3895
  }
4298
3896
  }
3897
+ #visualizationWrapper;
3898
+ #initial3DVisualizationWrapper;
3899
+ #visualizationStrategy;
3900
+ #setVisualizationWrapper(strategy) {
3901
+ if (strategy !== this.#visualizationStrategy) {
3902
+ this.#visualizationWrapper?.remove();
3903
+ this.#visualizationWrapper?.disconnect();
3904
+ let newWrapper;
3905
+ switch (strategy) {
3906
+ case "2D":
3907
+ case "experimental-2D-LL":
3908
+ newWrapper = new Twisty2DSceneWrapper(
3909
+ this.experimentalModel.twistySceneModel,
3910
+ strategy
3911
+ );
3912
+ break;
3913
+ case "Cube3D":
3914
+ case "PG3D":
3915
+ newWrapper = new Twisty3DSceneWrapper(this.experimentalModel);
3916
+ this.#initial3DVisualizationWrapper.handleNewValue(newWrapper);
3917
+ break;
3918
+ default:
3919
+ throw new Error("Invalid visualization");
3920
+ }
3921
+ this.#visualizationWrapperElem.appendChild(newWrapper);
3922
+ this.#visualizationWrapper = newWrapper;
3923
+ this.#visualizationStrategy = strategy;
3924
+ }
3925
+ }
4299
3926
  async experimentalCurrentVantages() {
4300
3927
  this.connectedCallback();
4301
- const wrapper = __privateGet(this, _visualizationWrapper);
3928
+ const wrapper = this.#visualizationWrapper;
4302
3929
  if (wrapper instanceof Twisty3DSceneWrapper) {
4303
3930
  return wrapper.experimentalVantages();
4304
3931
  }
@@ -4314,7 +3941,7 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4314
3941
  }
4315
3942
  async experimentalCurrentThreeJSPuzzleObject(puzzleChangeCallback) {
4316
3943
  this.connectedCallback();
4317
- const sceneWrapper = await __privateGet(this, _initial3DVisualizationWrapper).promise;
3944
+ const sceneWrapper = await this.#initial3DVisualizationWrapper.promise;
4318
3945
  const puzzleWrapper = await sceneWrapper.experimentalTwisty3DPuzzleWrapper();
4319
3946
  const twisty3DPuzzlePromise = puzzleWrapper.twisty3DPuzzle();
4320
3947
  const safeToCallback = (async () => {
@@ -4352,6 +3979,9 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4352
3979
  experimentalAddMove(flexibleMove, options = {}) {
4353
3980
  this.experimentalModel.experimentalAddMove(flexibleMove, options);
4354
3981
  }
3982
+ experimentalAddAlgLeaf(algLeaf, options = {}) {
3983
+ this.experimentalModel.experimentalAddAlgLeaf(algLeaf, options);
3984
+ }
4355
3985
  static get observedAttributes() {
4356
3986
  const observed = [];
4357
3987
  for (const key of Object.keys(twistyPlayerAttributeMap)) {
@@ -4360,8 +3990,8 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4360
3990
  return observed;
4361
3991
  }
4362
3992
  attributeChangedCallback(attributeName, _oldValue, newValue) {
4363
- if (attributeName.startsWith("data-")) {
4364
- attributeName = attributeName.slice("data-".length);
3993
+ if (attributeName.startsWith(DATA_ATTRIBUTE_PREFIX)) {
3994
+ attributeName = attributeName.slice(DATA_ATTRIBUTE_PREFIX.length);
4365
3995
  }
4366
3996
  const setterName = twistyPlayerAttributeMap[attributeName];
4367
3997
  if (!setterName) {
@@ -4373,49 +4003,25 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4373
4003
  return (await screenshot(this.experimentalModel, options)).dataURL;
4374
4004
  }
4375
4005
  async experimentalDownloadScreenshot(filename) {
4376
- if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategy.get())) {
4377
- const wrapper2D = __privateGet(this, _visualizationWrapper);
4006
+ if (["2D", "experimental-2D-LL"].includes(
4007
+ await this.experimentalModel.visualizationStrategy.get()
4008
+ )) {
4009
+ const wrapper2D = this.#visualizationWrapper;
4378
4010
  const twisty2DPuzzle = await wrapper2D.currentTwisty2DPuzzleWrapper().twisty2DPuzzle();
4379
- const str = new XMLSerializer().serializeToString(twisty2DPuzzle.svgWrapper.svgElement);
4011
+ const str = new XMLSerializer().serializeToString(
4012
+ twisty2DPuzzle.svgWrapper.svgElement
4013
+ );
4380
4014
  const url = URL.createObjectURL(new Blob([str]));
4381
- downloadURL(url, filename ?? await getDefaultFilename(this.experimentalModel), "svg");
4015
+ downloadURL(
4016
+ url,
4017
+ filename ?? await getDefaultFilename(this.experimentalModel),
4018
+ "svg"
4019
+ );
4382
4020
  } else {
4383
4021
  await (await screenshot(this.experimentalModel)).download(filename);
4384
4022
  }
4385
4023
  }
4386
4024
  };
4387
- _controlsManager = new WeakMap();
4388
- _visualizationWrapperElem = new WeakMap();
4389
- _errorElem = new WeakMap();
4390
- _alreadyConnected = new WeakMap();
4391
- _flashLevel = new WeakMap();
4392
- _visualizationWrapper = new WeakMap();
4393
- _initial3DVisualizationWrapper = new WeakMap();
4394
- _visualizationStrategy = new WeakMap();
4395
- _setVisualizationWrapper = new WeakSet();
4396
- setVisualizationWrapper_fn = function(strategy) {
4397
- if (strategy !== __privateGet(this, _visualizationStrategy)) {
4398
- __privateGet(this, _visualizationWrapper)?.remove();
4399
- __privateGet(this, _visualizationWrapper)?.disconnect();
4400
- let newWrapper;
4401
- switch (strategy) {
4402
- case "2D":
4403
- case "experimental-2D-LL":
4404
- newWrapper = new Twisty2DSceneWrapper(this.experimentalModel.twistySceneModel, strategy);
4405
- break;
4406
- case "Cube3D":
4407
- case "PG3D":
4408
- newWrapper = new Twisty3DSceneWrapper(this.experimentalModel);
4409
- __privateGet(this, _initial3DVisualizationWrapper).handleNewValue(newWrapper);
4410
- break;
4411
- default:
4412
- throw new Error("Invalid visualization");
4413
- }
4414
- __privateGet(this, _visualizationWrapperElem).appendChild(newWrapper);
4415
- __privateSet(this, _visualizationWrapper, newWrapper);
4416
- __privateSet(this, _visualizationStrategy, strategy);
4417
- }
4418
- };
4419
4025
  customElementsShim.define("twisty-player", TwistyPlayer);
4420
4026
 
4421
4027
  // src/cubing/twisty/views/TwistyAlgViewer.css.ts
@@ -4456,15 +4062,22 @@ var TwistyAlgLeafElem = class extends ManagedCustomElement {
4456
4062
  this.classList.add(className);
4457
4063
  this.addCSS(twistyAlgViewerCSS);
4458
4064
  if (clickable) {
4459
- const anchor = this.contentWrapper.appendChild(document.createElement("a"));
4065
+ const anchor = this.contentWrapper.appendChild(
4066
+ document.createElement("a")
4067
+ );
4460
4068
  anchor.href = "#";
4461
4069
  anchor.textContent = text;
4462
4070
  anchor.addEventListener("click", (e) => {
4463
4071
  e.preventDefault();
4464
- dataDown.twistyAlgViewer.jumpToIndex(dataDown.earliestMoveIndex, offsetIntoMove);
4072
+ dataDown.twistyAlgViewer.jumpToIndex(
4073
+ dataDown.earliestMoveIndex,
4074
+ offsetIntoMove
4075
+ );
4465
4076
  });
4466
4077
  } else {
4467
- this.contentWrapper.appendChild(document.createElement("span")).textContent = text;
4078
+ this.contentWrapper.appendChild(
4079
+ document.createElement("span")
4080
+ ).textContent = text;
4468
4081
  }
4469
4082
  }
4470
4083
  pathToIndex(_index) {
@@ -4519,7 +4132,10 @@ var AlgToDOMTree = class extends TraversalDownUp {
4519
4132
  let moveCount = 0;
4520
4133
  const element = new TwistyAlgWrapperElem("twisty-alg-alg", alg);
4521
4134
  let first = true;
4522
- for (const algNode of direct(alg.childAlgNodes(), dataDown.direction)) {
4135
+ for (const algNode of direct(
4136
+ alg.childAlgNodes(),
4137
+ dataDown.direction
4138
+ )) {
4523
4139
  if (!first) {
4524
4140
  element.addString(" ");
4525
4141
  }
@@ -4528,11 +4144,13 @@ var AlgToDOMTree = class extends TraversalDownUp {
4528
4144
  element.addString("^(");
4529
4145
  }
4530
4146
  if (!algNode.as(Grouping)?.experimentalNISSPlaceholder) {
4531
- moveCount += element.addElem(this.traverseAlgNode(algNode, {
4532
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4533
- twistyAlgViewer: dataDown.twistyAlgViewer,
4534
- direction: dataDown.direction
4535
- }));
4147
+ moveCount += element.addElem(
4148
+ this.traverseAlgNode(algNode, {
4149
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4150
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4151
+ direction: dataDown.direction
4152
+ })
4153
+ );
4536
4154
  }
4537
4155
  if (algNode.as(Pause)?.experimentalNISSGrouping) {
4538
4156
  element.addString(")");
@@ -4546,26 +4164,45 @@ var AlgToDOMTree = class extends TraversalDownUp {
4546
4164
  }
4547
4165
  traverseGrouping(grouping, dataDown) {
4548
4166
  const square1Tuple = grouping.experimentalAsSquare1Tuple();
4549
- const direction = updateDirectionByAmount(dataDown.direction, grouping.amount);
4167
+ const direction = updateDirectionByAmount(
4168
+ dataDown.direction,
4169
+ grouping.amount
4170
+ );
4550
4171
  let moveCount = 0;
4551
4172
  const element = new TwistyAlgWrapperElem("twisty-alg-grouping", grouping);
4552
4173
  element.addString("(");
4553
4174
  if (square1Tuple) {
4554
4175
  moveCount += element.addElem({
4555
4176
  moveCount: 1,
4556
- element: new TwistyAlgLeafElem("twisty-alg-move", square1Tuple[0].amount.toString(), dataDown, square1Tuple[0], true, true)
4177
+ element: new TwistyAlgLeafElem(
4178
+ "twisty-alg-move",
4179
+ square1Tuple[0].amount.toString(),
4180
+ dataDown,
4181
+ square1Tuple[0],
4182
+ true,
4183
+ true
4184
+ )
4557
4185
  });
4558
4186
  element.addString(", ");
4559
4187
  moveCount += element.addElem({
4560
4188
  moveCount: 1,
4561
- element: new TwistyAlgLeafElem("twisty-alg-move", square1Tuple[1].amount.toString(), dataDown, square1Tuple[1], true, true)
4189
+ element: new TwistyAlgLeafElem(
4190
+ "twisty-alg-move",
4191
+ square1Tuple[1].amount.toString(),
4192
+ dataDown,
4193
+ square1Tuple[1],
4194
+ true,
4195
+ true
4196
+ )
4562
4197
  });
4563
4198
  } else {
4564
- moveCount += element.addElem(this.traverseAlg(grouping.alg, {
4565
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4566
- twistyAlgViewer: dataDown.twistyAlgViewer,
4567
- direction
4568
- }));
4199
+ moveCount += element.addElem(
4200
+ this.traverseAlg(grouping.alg, {
4201
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4202
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4203
+ direction
4204
+ })
4205
+ );
4569
4206
  }
4570
4207
  element.addString(")" + grouping.experimentalRepetitionSuffix);
4571
4208
  element.flushQueue();
@@ -4575,8 +4212,18 @@ var AlgToDOMTree = class extends TraversalDownUp {
4575
4212
  };
4576
4213
  }
4577
4214
  traverseMove(move, dataDown) {
4578
- const element = new TwistyAlgLeafElem("twisty-alg-move", move.toString(), dataDown, move, true, true);
4579
- dataDown.twistyAlgViewer.highlighter.addMove(move.startCharIndex, element);
4215
+ const element = new TwistyAlgLeafElem(
4216
+ "twisty-alg-move",
4217
+ move.toString(),
4218
+ dataDown,
4219
+ move,
4220
+ true,
4221
+ true
4222
+ );
4223
+ dataDown.twistyAlgViewer.highlighter.addMove(
4224
+ move.startCharIndex,
4225
+ element
4226
+ );
4580
4227
  return {
4581
4228
  moveCount: 1,
4582
4229
  element
@@ -4584,21 +4231,31 @@ var AlgToDOMTree = class extends TraversalDownUp {
4584
4231
  }
4585
4232
  traverseCommutator(commutator, dataDown) {
4586
4233
  let moveCount = 0;
4587
- const element = new TwistyAlgWrapperElem("twisty-alg-commutator", commutator);
4234
+ const element = new TwistyAlgWrapperElem(
4235
+ "twisty-alg-commutator",
4236
+ commutator
4237
+ );
4588
4238
  element.addString("[");
4589
4239
  element.flushQueue();
4590
- const [first, second] = maybeReverseList([commutator.A, commutator.B], dataDown.direction);
4591
- moveCount += element.addElem(this.traverseAlg(first, {
4592
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4593
- twistyAlgViewer: dataDown.twistyAlgViewer,
4594
- direction: dataDown.direction
4595
- }));
4240
+ const [first, second] = maybeReverseList(
4241
+ [commutator.A, commutator.B],
4242
+ dataDown.direction
4243
+ );
4244
+ moveCount += element.addElem(
4245
+ this.traverseAlg(first, {
4246
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4247
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4248
+ direction: dataDown.direction
4249
+ })
4250
+ );
4596
4251
  element.addString(", ");
4597
- moveCount += element.addElem(this.traverseAlg(second, {
4598
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4599
- twistyAlgViewer: dataDown.twistyAlgViewer,
4600
- direction: dataDown.direction
4601
- }));
4252
+ moveCount += element.addElem(
4253
+ this.traverseAlg(second, {
4254
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4255
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4256
+ direction: dataDown.direction
4257
+ })
4258
+ );
4602
4259
  element.flushQueue(dataDown.direction);
4603
4260
  element.addString("]");
4604
4261
  element.flushQueue();
@@ -4611,18 +4268,22 @@ var AlgToDOMTree = class extends TraversalDownUp {
4611
4268
  let moveCount = 0;
4612
4269
  const element = new TwistyAlgWrapperElem("twisty-alg-conjugate", conjugate);
4613
4270
  element.addString("[");
4614
- const aLen = element.addElem(this.traverseAlg(conjugate.A, {
4615
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4616
- twistyAlgViewer: dataDown.twistyAlgViewer,
4617
- direction: dataDown.direction
4618
- }));
4271
+ const aLen = element.addElem(
4272
+ this.traverseAlg(conjugate.A, {
4273
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4274
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4275
+ direction: dataDown.direction
4276
+ })
4277
+ );
4619
4278
  moveCount += aLen;
4620
4279
  element.addString(": ");
4621
- moveCount += element.addElem(this.traverseAlg(conjugate.B, {
4622
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4623
- twistyAlgViewer: dataDown.twistyAlgViewer,
4624
- direction: dataDown.direction
4625
- }));
4280
+ moveCount += element.addElem(
4281
+ this.traverseAlg(conjugate.B, {
4282
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4283
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4284
+ direction: dataDown.direction
4285
+ })
4286
+ );
4626
4287
  element.addString("]");
4627
4288
  element.flushQueue();
4628
4289
  return {
@@ -4636,7 +4297,14 @@ var AlgToDOMTree = class extends TraversalDownUp {
4636
4297
  }
4637
4298
  return {
4638
4299
  moveCount: 1,
4639
- element: new TwistyAlgLeafElem("twisty-alg-pause", ".", dataDown, pause, true, true)
4300
+ element: new TwistyAlgLeafElem(
4301
+ "twisty-alg-pause",
4302
+ ".",
4303
+ dataDown,
4304
+ pause,
4305
+ true,
4306
+ true
4307
+ )
4640
4308
  };
4641
4309
  }
4642
4310
  traverseNewline(newline, _dataDown) {
@@ -4650,12 +4318,21 @@ var AlgToDOMTree = class extends TraversalDownUp {
4650
4318
  traverseLineComment(lineComment, dataDown) {
4651
4319
  return {
4652
4320
  moveCount: 0,
4653
- element: new TwistyAlgLeafElem("twisty-alg-line-comment", `//${lineComment.text}`, dataDown, lineComment, false, false)
4321
+ element: new TwistyAlgLeafElem(
4322
+ "twisty-alg-line-comment",
4323
+ `//${lineComment.text}`,
4324
+ dataDown,
4325
+ lineComment,
4326
+ false,
4327
+ false
4328
+ )
4654
4329
  };
4655
4330
  }
4656
4331
  };
4657
4332
  var algToDOMTreeInstance = new AlgToDOMTree();
4658
- var algToDOMTree = algToDOMTreeInstance.traverseAlg.bind(algToDOMTreeInstance);
4333
+ var algToDOMTree = algToDOMTreeInstance.traverseAlg.bind(
4334
+ algToDOMTreeInstance
4335
+ );
4659
4336
  var MoveHighlighter = class {
4660
4337
  constructor() {
4661
4338
  this.moveCharIndexMap = /* @__PURE__ */ new Map();
@@ -4676,38 +4353,75 @@ var MoveHighlighter = class {
4676
4353
  this.currentElem = newElem;
4677
4354
  }
4678
4355
  };
4679
- var _domTree, _twistyPlayer, _setTwistyPlayer, setTwistyPlayer_fn;
4680
4356
  var TwistyAlgViewer = class extends HTMLElementShim {
4681
4357
  constructor(options) {
4682
4358
  super();
4683
- __privateAdd(this, _setTwistyPlayer);
4684
4359
  this.highlighter = new MoveHighlighter();
4685
- __privateAdd(this, _domTree, void 0);
4686
- __privateAdd(this, _twistyPlayer, null);
4360
+ this.#twistyPlayer = null;
4687
4361
  this.lastClickTimestamp = null;
4688
4362
  if (options?.twistyPlayer) {
4689
4363
  this.twistyPlayer = options?.twistyPlayer;
4690
4364
  }
4691
4365
  }
4366
+ #domTree;
4367
+ #twistyPlayer;
4692
4368
  connectedCallback() {
4693
4369
  }
4694
4370
  setAlg(alg) {
4695
- __privateSet(this, _domTree, algToDOMTree(alg, {
4371
+ this.#domTree = algToDOMTree(alg, {
4696
4372
  earliestMoveIndex: 0,
4697
4373
  twistyAlgViewer: this,
4698
4374
  direction: 1 /* Forwards */
4699
- }).element);
4375
+ }).element;
4700
4376
  this.textContent = "";
4701
- this.appendChild(__privateGet(this, _domTree));
4377
+ this.appendChild(this.#domTree);
4702
4378
  }
4703
4379
  get twistyPlayer() {
4704
- return __privateGet(this, _twistyPlayer);
4380
+ return this.#twistyPlayer;
4705
4381
  }
4706
4382
  set twistyPlayer(twistyPlayer) {
4707
- __privateMethod(this, _setTwistyPlayer, setTwistyPlayer_fn).call(this, twistyPlayer);
4383
+ this.#setTwistyPlayer(twistyPlayer);
4384
+ }
4385
+ async #setTwistyPlayer(twistyPlayer) {
4386
+ if (this.#twistyPlayer) {
4387
+ console.warn("twisty-player reassignment is not supported");
4388
+ return;
4389
+ }
4390
+ if (twistyPlayer === null) {
4391
+ throw new Error("clearing twistyPlayer is not supported");
4392
+ }
4393
+ this.#twistyPlayer = twistyPlayer;
4394
+ this.#twistyPlayer.experimentalModel.alg.addFreshListener(
4395
+ (algWithIssues) => {
4396
+ this.setAlg(algWithIssues.alg);
4397
+ }
4398
+ );
4399
+ const sourceAlg = (await this.#twistyPlayer.experimentalModel.alg.get()).alg;
4400
+ const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
4401
+ this.setAlg(parsedAlg);
4402
+ twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener(
4403
+ (currentMoveInfo) => {
4404
+ let moveInfo = currentMoveInfo.currentMoves[0];
4405
+ moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4406
+ moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
4407
+ if (!moveInfo) {
4408
+ this.highlighter.set(null);
4409
+ } else {
4410
+ const mainCurrentMove = moveInfo.move;
4411
+ this.highlighter.set(mainCurrentMove);
4412
+ }
4413
+ }
4414
+ );
4415
+ twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener(
4416
+ (detailedTimelineInfo) => {
4417
+ if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4418
+ this.lastClickTimestamp = null;
4419
+ }
4420
+ }
4421
+ );
4708
4422
  }
4709
4423
  async jumpToIndex(index, offsetIntoMove) {
4710
- const twistyPlayer = __privateGet(this, _twistyPlayer);
4424
+ const twistyPlayer = this.#twistyPlayer;
4711
4425
  if (twistyPlayer) {
4712
4426
  twistyPlayer.pause();
4713
4427
  const timestampPromise = (async () => {
@@ -4715,7 +4429,9 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4715
4429
  const offset = offsetIntoMove ? DEFAULT_OFFSET_MS : 0;
4716
4430
  return (indexer.indexToMoveStartTimestamp(index) ?? -offset) + offset;
4717
4431
  })();
4718
- twistyPlayer.experimentalModel.timestampRequest.set(await timestampPromise);
4432
+ twistyPlayer.experimentalModel.timestampRequest.set(
4433
+ await timestampPromise
4434
+ );
4719
4435
  if (this.lastClickTimestamp === await timestampPromise) {
4720
4436
  twistyPlayer.play();
4721
4437
  this.lastClickTimestamp = null;
@@ -4743,41 +4459,6 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4743
4459
  return ["for"];
4744
4460
  }
4745
4461
  };
4746
- _domTree = new WeakMap();
4747
- _twistyPlayer = new WeakMap();
4748
- _setTwistyPlayer = new WeakSet();
4749
- setTwistyPlayer_fn = async function(twistyPlayer) {
4750
- if (__privateGet(this, _twistyPlayer)) {
4751
- console.warn("twisty-player reassignment is not supported");
4752
- return;
4753
- }
4754
- if (twistyPlayer === null) {
4755
- throw new Error("clearing twistyPlayer is not supported");
4756
- }
4757
- __privateSet(this, _twistyPlayer, twistyPlayer);
4758
- __privateGet(this, _twistyPlayer).experimentalModel.alg.addFreshListener((algWithIssues) => {
4759
- this.setAlg(algWithIssues.alg);
4760
- });
4761
- const sourceAlg = (await __privateGet(this, _twistyPlayer).experimentalModel.alg.get()).alg;
4762
- const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
4763
- this.setAlg(parsedAlg);
4764
- twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener((currentMoveInfo) => {
4765
- let moveInfo = currentMoveInfo.currentMoves[0];
4766
- moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4767
- moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
4768
- if (!moveInfo) {
4769
- this.highlighter.set(null);
4770
- } else {
4771
- const mainCurrentMove = moveInfo.move;
4772
- this.highlighter.set(mainCurrentMove);
4773
- }
4774
- });
4775
- twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener((detailedTimelineInfo) => {
4776
- if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4777
- this.lastClickTimestamp = null;
4778
- }
4779
- });
4780
- };
4781
4462
  customElementsShim.define("twisty-alg-viewer", TwistyAlgViewer);
4782
4463
 
4783
4464
  // src/cubing/twisty/views/TwistyAlgEditor/LeafTokens.ts
@@ -4850,7 +4531,9 @@ var LeafTokens = class extends TraversalDownUp {
4850
4531
  }
4851
4532
  };
4852
4533
  var leafTokensInstance = new LeafTokens();
4853
- var leafTokens = leafTokensInstance.traverseAlg.bind(leafTokensInstance);
4534
+ var leafTokens = leafTokensInstance.traverseAlg.bind(
4535
+ leafTokensInstance
4536
+ );
4854
4537
 
4855
4538
  // src/cubing/twisty/views/TwistyAlgEditor/model.ts
4856
4539
  var TwistyAlgEditorValueProp = class extends SimpleTwistyPropSource {
@@ -5024,84 +4707,101 @@ textarea {
5024
4707
  var ATTRIBUTE_FOR_TWISTY_PLAYER = "for-twisty-player";
5025
4708
  var ATTRIBUTE_PLACEHOLDER = "placeholder";
5026
4709
  var ATTRIBUTE_TWISTY_PLAYER_PROP = "twisty-player-prop";
5027
- var _textarea, _carbonCopy, _carbonCopyPrefix, _carbonCopyHighlight, _carbonCopySuffix, _textareaClassListValidForPuzzleManager, _twistyPlayer2, _twistyPlayerProp, _algProp, algProp_get, _onInputHasFired, _padSuffix, padSuffix_fn, _highlightedLeaf;
5028
4710
  var TwistyAlgEditor = class extends ManagedCustomElement {
5029
4711
  constructor(options) {
5030
4712
  super();
5031
- __privateAdd(this, _algProp);
5032
- __privateAdd(this, _padSuffix);
5033
4713
  this.model = new TwistyAlgEditorModel();
5034
- __privateAdd(this, _textarea, document.createElement("textarea"));
5035
- __privateAdd(this, _carbonCopy, document.createElement("div"));
5036
- __privateAdd(this, _carbonCopyPrefix, document.createElement("span"));
5037
- __privateAdd(this, _carbonCopyHighlight, document.createElement("span"));
5038
- __privateAdd(this, _carbonCopySuffix, document.createElement("span"));
5039
- __privateAdd(this, _textareaClassListValidForPuzzleManager, new ClassListManager(this, "valid-for-puzzle-", [
4714
+ this.#textarea = document.createElement("textarea");
4715
+ this.#carbonCopy = document.createElement("div");
4716
+ this.#carbonCopyPrefix = document.createElement("span");
4717
+ this.#carbonCopyHighlight = document.createElement("span");
4718
+ this.#carbonCopySuffix = document.createElement("span");
4719
+ this.#textareaClassListValidForPuzzleManager = new ClassListManager(this, "valid-for-puzzle-", [
5040
4720
  "none",
5041
4721
  "warning",
5042
4722
  "error"
5043
- ]));
5044
- __privateAdd(this, _twistyPlayer2, null);
5045
- __privateAdd(this, _twistyPlayerProp, void 0);
4723
+ ]);
4724
+ this.#twistyPlayer = null;
5046
4725
  this.debugNeverRequestTimestamp = false;
5047
- __privateAdd(this, _onInputHasFired, false);
5048
- __privateAdd(this, _highlightedLeaf, null);
5049
- __privateGet(this, _carbonCopy).classList.add("carbon-copy");
5050
- this.addElement(__privateGet(this, _carbonCopy));
5051
- __privateGet(this, _textarea).rows = 1;
5052
- this.addElement(__privateGet(this, _textarea));
5053
- __privateGet(this, _carbonCopyPrefix).classList.add("prefix");
5054
- __privateGet(this, _carbonCopy).appendChild(__privateGet(this, _carbonCopyPrefix));
5055
- __privateGet(this, _carbonCopyHighlight).classList.add("highlight");
5056
- __privateGet(this, _carbonCopy).appendChild(__privateGet(this, _carbonCopyHighlight));
5057
- __privateGet(this, _carbonCopySuffix).classList.add("suffix");
5058
- __privateGet(this, _carbonCopy).appendChild(__privateGet(this, _carbonCopySuffix));
5059
- __privateGet(this, _textarea).placeholder = "Alg";
5060
- __privateGet(this, _textarea).setAttribute("spellcheck", "false");
4726
+ this.#onInputHasFired = false;
4727
+ this.#highlightedLeaf = null;
4728
+ this.#carbonCopy.classList.add("carbon-copy");
4729
+ this.addElement(this.#carbonCopy);
4730
+ this.#textarea.rows = 1;
4731
+ this.addElement(this.#textarea);
4732
+ this.#carbonCopyPrefix.classList.add("prefix");
4733
+ this.#carbonCopy.appendChild(this.#carbonCopyPrefix);
4734
+ this.#carbonCopyHighlight.classList.add("highlight");
4735
+ this.#carbonCopy.appendChild(this.#carbonCopyHighlight);
4736
+ this.#carbonCopySuffix.classList.add("suffix");
4737
+ this.#carbonCopy.appendChild(this.#carbonCopySuffix);
4738
+ this.#textarea.placeholder = "Alg";
4739
+ this.#textarea.setAttribute("spellcheck", "false");
5061
4740
  this.addCSS(twistyAlgEditorCSS);
5062
- __privateGet(this, _textarea).addEventListener("input", () => {
5063
- __privateSet(this, _onInputHasFired, true);
4741
+ this.#textarea.addEventListener("input", () => {
4742
+ this.#onInputHasFired = true;
5064
4743
  this.onInput();
5065
4744
  });
5066
- __privateGet(this, _textarea).addEventListener("blur", () => this.onBlur());
5067
- document.addEventListener("selectionchange", () => this.onSelectionChange());
4745
+ this.#textarea.addEventListener("blur", () => this.onBlur());
4746
+ document.addEventListener(
4747
+ "selectionchange",
4748
+ () => this.onSelectionChange()
4749
+ );
5068
4750
  if (options?.twistyPlayer) {
5069
4751
  this.twistyPlayer = options.twistyPlayer;
5070
4752
  }
5071
- __privateSet(this, _twistyPlayerProp, options?.twistyPlayerProp ?? "alg");
4753
+ this.#twistyPlayerProp = options?.twistyPlayerProp ?? "alg";
5072
4754
  if (options?.twistyPlayerProp === "alg") {
5073
- this.model.leafToHighlight.addFreshListener((highlightInfo) => {
5074
- if (highlightInfo) {
5075
- this.highlightLeaf(highlightInfo.leafInfo.leaf);
4755
+ this.model.leafToHighlight.addFreshListener(
4756
+ (highlightInfo) => {
4757
+ if (highlightInfo) {
4758
+ this.highlightLeaf(highlightInfo.leafInfo.leaf);
4759
+ }
5076
4760
  }
5077
- });
4761
+ );
4762
+ }
4763
+ }
4764
+ #textarea;
4765
+ #carbonCopy;
4766
+ #carbonCopyPrefix;
4767
+ #carbonCopyHighlight;
4768
+ #carbonCopySuffix;
4769
+ #textareaClassListValidForPuzzleManager;
4770
+ #twistyPlayer;
4771
+ #twistyPlayerProp;
4772
+ get #algProp() {
4773
+ if (this.#twistyPlayer === null) {
4774
+ return null;
4775
+ } else {
4776
+ return this.#twistyPlayer.experimentalModel[this.#twistyPlayerProp];
5078
4777
  }
5079
4778
  }
5080
4779
  set algString(s) {
5081
- __privateGet(this, _textarea).value = s;
4780
+ this.#textarea.value = s;
5082
4781
  this.onInput();
5083
4782
  }
5084
4783
  get algString() {
5085
- return __privateGet(this, _textarea).value;
4784
+ return this.#textarea.value;
5086
4785
  }
5087
4786
  set placeholder(placeholderText) {
5088
- __privateGet(this, _textarea).placeholder = placeholderText;
4787
+ this.#textarea.placeholder = placeholderText;
5089
4788
  }
4789
+ #onInputHasFired;
5090
4790
  onInput() {
5091
- __privateGet(this, _carbonCopyHighlight).hidden = true;
4791
+ this.#carbonCopyHighlight.hidden = true;
5092
4792
  this.highlightLeaf(null);
5093
- const endTrimmed = __privateGet(this, _textarea).value.trimEnd();
4793
+ const endTrimmed = this.#textarea.value.trimEnd();
5094
4794
  this.model.valueProp.set(endTrimmed);
5095
- __privateGet(this, _algProp, algProp_get)?.set(endTrimmed);
4795
+ this.#algProp?.set(endTrimmed);
5096
4796
  }
5097
4797
  async onSelectionChange() {
5098
- if (document.activeElement !== this || this.shadow.activeElement !== __privateGet(this, _textarea)) {
4798
+ if (document.activeElement !== this || this.shadow.activeElement !== this.#textarea) {
5099
4799
  return;
5100
4800
  }
5101
- if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4801
+ if (this.#twistyPlayerProp !== "alg") {
5102
4802
  return;
5103
4803
  }
5104
- const { selectionStart, selectionEnd } = __privateGet(this, _textarea);
4804
+ const { selectionStart, selectionEnd } = this.#textarea;
5105
4805
  this.model.selectionProp.set({
5106
4806
  selectionStart,
5107
4807
  selectionEnd
@@ -5110,96 +4810,120 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
5110
4810
  async onBlur() {
5111
4811
  }
5112
4812
  setAlgIssueClassForPuzzle(issues) {
5113
- __privateGet(this, _textareaClassListValidForPuzzleManager).setValue(issues);
4813
+ this.#textareaClassListValidForPuzzleManager.setValue(issues);
5114
4814
  }
4815
+ #padSuffix(s) {
4816
+ return s.endsWith("\n") ? s + " " : s;
4817
+ }
4818
+ #highlightedLeaf;
5115
4819
  highlightLeaf(leaf) {
5116
- if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4820
+ if (this.#twistyPlayerProp !== "alg") {
5117
4821
  return;
5118
4822
  }
5119
4823
  if (leaf === null) {
5120
- __privateGet(this, _carbonCopyPrefix).textContent = "";
5121
- __privateGet(this, _carbonCopyHighlight).textContent = "";
5122
- __privateGet(this, _carbonCopySuffix).textContent = __privateMethod(this, _padSuffix, padSuffix_fn).call(this, __privateGet(this, _textarea).value);
4824
+ this.#carbonCopyPrefix.textContent = "";
4825
+ this.#carbonCopyHighlight.textContent = "";
4826
+ this.#carbonCopySuffix.textContent = this.#padSuffix(
4827
+ this.#textarea.value
4828
+ );
5123
4829
  return;
5124
4830
  }
5125
- if (leaf === __privateGet(this, _highlightedLeaf)) {
4831
+ if (leaf === this.#highlightedLeaf) {
5126
4832
  return;
5127
4833
  }
5128
- __privateSet(this, _highlightedLeaf, leaf);
5129
- __privateGet(this, _carbonCopyPrefix).textContent = __privateGet(this, _textarea).value.slice(0, leaf.startCharIndex);
5130
- __privateGet(this, _carbonCopyHighlight).textContent = __privateGet(this, _textarea).value.slice(leaf.startCharIndex, leaf.endCharIndex);
5131
- __privateGet(this, _carbonCopySuffix).textContent = __privateMethod(this, _padSuffix, padSuffix_fn).call(this, __privateGet(this, _textarea).value.slice(leaf.endCharIndex));
5132
- __privateGet(this, _carbonCopyHighlight).hidden = false;
4834
+ this.#highlightedLeaf = leaf;
4835
+ this.#carbonCopyPrefix.textContent = this.#textarea.value.slice(
4836
+ 0,
4837
+ leaf.startCharIndex
4838
+ );
4839
+ this.#carbonCopyHighlight.textContent = this.#textarea.value.slice(
4840
+ leaf.startCharIndex,
4841
+ leaf.endCharIndex
4842
+ );
4843
+ this.#carbonCopySuffix.textContent = this.#padSuffix(
4844
+ this.#textarea.value.slice(leaf.endCharIndex)
4845
+ );
4846
+ this.#carbonCopyHighlight.hidden = false;
5133
4847
  }
5134
4848
  get twistyPlayer() {
5135
- return __privateGet(this, _twistyPlayer2);
4849
+ return this.#twistyPlayer;
5136
4850
  }
5137
4851
  set twistyPlayer(twistyPlayer) {
5138
- if (__privateGet(this, _twistyPlayer2)) {
4852
+ if (this.#twistyPlayer) {
5139
4853
  console.warn("twisty-player reassignment/clearing is not supported");
5140
4854
  return;
5141
4855
  }
5142
- __privateSet(this, _twistyPlayer2, twistyPlayer);
4856
+ this.#twistyPlayer = twistyPlayer;
5143
4857
  if (!twistyPlayer) {
5144
4858
  return;
5145
4859
  }
5146
4860
  (async () => {
5147
- this.algString = __privateGet(this, _algProp, algProp_get) ? (await __privateGet(this, _algProp, algProp_get).get()).alg.toString() : "";
4861
+ this.algString = this.#algProp ? (await this.#algProp.get()).alg.toString() : "";
5148
4862
  })();
5149
- if (__privateGet(this, _twistyPlayerProp) === "alg") {
5150
- __privateGet(this, _twistyPlayer2)?.experimentalModel.puzzleAlg.addFreshListener((algWithIssues) => {
5151
- if (algWithIssues.issues.errors.length === 0) {
5152
- this.setAlgIssueClassForPuzzle(algWithIssues.issues.warnings.length === 0 ? "none" : "warning");
5153
- const newAlg = algWithIssues.alg;
5154
- const oldAlg = Alg.fromString(this.algString);
5155
- if (!newAlg.isIdentical(oldAlg)) {
5156
- this.algString = newAlg.toString();
5157
- this.onInput();
4863
+ if (this.#twistyPlayerProp === "alg") {
4864
+ this.#twistyPlayer?.experimentalModel.puzzleAlg.addFreshListener(
4865
+ (algWithIssues) => {
4866
+ if (algWithIssues.issues.errors.length === 0) {
4867
+ this.setAlgIssueClassForPuzzle(
4868
+ algWithIssues.issues.warnings.length === 0 ? "none" : "warning"
4869
+ );
4870
+ const newAlg = algWithIssues.alg;
4871
+ const oldAlg = Alg.fromString(this.algString);
4872
+ if (!newAlg.isIdentical(oldAlg)) {
4873
+ this.algString = newAlg.toString();
4874
+ this.onInput();
4875
+ } else {
4876
+ }
5158
4877
  } else {
4878
+ this.setAlgIssueClassForPuzzle("error");
5159
4879
  }
5160
- } else {
5161
- this.setAlgIssueClassForPuzzle("error");
5162
- }
5163
- });
5164
- this.model.leafToHighlight.addFreshListener(async (highlightInfo) => {
5165
- if (highlightInfo === null) {
5166
- return;
5167
4880
  }
5168
- const [indexer, timestampRequest] = await Promise.all([
5169
- await twistyPlayer.experimentalModel.indexer.get(),
5170
- await twistyPlayer.experimentalModel.timestampRequest.get()
5171
- ]);
5172
- if (timestampRequest === "opposite-anchor" && !__privateGet(this, _onInputHasFired)) {
5173
- return;
5174
- }
5175
- const moveStartTimestamp = indexer.indexToMoveStartTimestamp(highlightInfo.leafInfo.idx);
5176
- const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
5177
- let newTimestamp;
5178
- switch (highlightInfo.where) {
5179
- case "before":
5180
- newTimestamp = moveStartTimestamp;
5181
- break;
5182
- case "start":
5183
- case "inside":
5184
- newTimestamp = moveStartTimestamp + duration / 4;
5185
- break;
5186
- case "end":
5187
- case "after":
5188
- newTimestamp = moveStartTimestamp + duration;
5189
- break;
5190
- default:
5191
- console.log("invalid where");
5192
- throw new Error("Invalid where!");
4881
+ );
4882
+ this.model.leafToHighlight.addFreshListener(
4883
+ async (highlightInfo) => {
4884
+ if (highlightInfo === null) {
4885
+ return;
4886
+ }
4887
+ const [indexer, timestampRequest] = await Promise.all([
4888
+ await twistyPlayer.experimentalModel.indexer.get(),
4889
+ await twistyPlayer.experimentalModel.timestampRequest.get()
4890
+ ]);
4891
+ if (timestampRequest === "opposite-anchor" && !this.#onInputHasFired) {
4892
+ return;
4893
+ }
4894
+ const moveStartTimestamp = indexer.indexToMoveStartTimestamp(
4895
+ highlightInfo.leafInfo.idx
4896
+ );
4897
+ const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
4898
+ let newTimestamp;
4899
+ switch (highlightInfo.where) {
4900
+ case "before":
4901
+ newTimestamp = moveStartTimestamp;
4902
+ break;
4903
+ case "start":
4904
+ case "inside":
4905
+ newTimestamp = moveStartTimestamp + duration / 4;
4906
+ break;
4907
+ case "end":
4908
+ case "after":
4909
+ newTimestamp = moveStartTimestamp + duration;
4910
+ break;
4911
+ default:
4912
+ console.log("invalid where");
4913
+ throw new Error("Invalid where!");
4914
+ }
4915
+ if (!this.debugNeverRequestTimestamp) {
4916
+ twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4917
+ }
5193
4918
  }
5194
- if (!this.debugNeverRequestTimestamp) {
5195
- twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4919
+ );
4920
+ twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(
4921
+ async (currentLeavesSimplified) => {
4922
+ const indexer = await twistyPlayer.experimentalModel.indexer.get();
4923
+ const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
4924
+ this.highlightLeaf(leaf);
5196
4925
  }
5197
- });
5198
- twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(async (currentLeavesSimplified) => {
5199
- const indexer = await twistyPlayer.experimentalModel.indexer.get();
5200
- const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
5201
- this.highlightLeaf(leaf);
5202
- });
4926
+ );
5203
4927
  }
5204
4928
  }
5205
4929
  attributeChangedCallback(attributeName, _oldValue, newValue) {
@@ -5221,11 +4945,11 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
5221
4945
  this.placeholder = newValue;
5222
4946
  return;
5223
4947
  case ATTRIBUTE_TWISTY_PLAYER_PROP:
5224
- if (__privateGet(this, _twistyPlayer2)) {
4948
+ if (this.#twistyPlayer) {
5225
4949
  console.log("cannot set prop");
5226
4950
  throw new Error("cannot set prop after twisty player");
5227
4951
  }
5228
- __privateSet(this, _twistyPlayerProp, newValue);
4952
+ this.#twistyPlayerProp = newValue;
5229
4953
  return;
5230
4954
  }
5231
4955
  }
@@ -5237,28 +4961,6 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
5237
4961
  ];
5238
4962
  }
5239
4963
  };
5240
- _textarea = new WeakMap();
5241
- _carbonCopy = new WeakMap();
5242
- _carbonCopyPrefix = new WeakMap();
5243
- _carbonCopyHighlight = new WeakMap();
5244
- _carbonCopySuffix = new WeakMap();
5245
- _textareaClassListValidForPuzzleManager = new WeakMap();
5246
- _twistyPlayer2 = new WeakMap();
5247
- _twistyPlayerProp = new WeakMap();
5248
- _algProp = new WeakSet();
5249
- algProp_get = function() {
5250
- if (__privateGet(this, _twistyPlayer2) === null) {
5251
- return null;
5252
- } else {
5253
- return __privateGet(this, _twistyPlayer2).experimentalModel[__privateGet(this, _twistyPlayerProp)];
5254
- }
5255
- };
5256
- _onInputHasFired = new WeakMap();
5257
- _padSuffix = new WeakSet();
5258
- padSuffix_fn = function(s) {
5259
- return s.endsWith("\n") ? s + " " : s;
5260
- };
5261
- _highlightedLeaf = new WeakMap();
5262
4964
  customElementsShim.define("twisty-alg-editor", TwistyAlgEditor);
5263
4965
 
5264
4966
  // src/cubing/twisty/views/twizzle/TwizzleLink.css.ts
@@ -5298,62 +5000,6 @@ twisty-player + .heading {
5298
5000
  `);
5299
5001
 
5300
5002
  // src/cubing/twisty/views/twizzle/url-params.ts
5301
- function updateURL(url) {
5302
- window.history.replaceState("", "", url.toString());
5303
- }
5304
- var _prefix;
5305
- var URLParamUpdater = class {
5306
- constructor(model, options) {
5307
- __privateAdd(this, _prefix, void 0);
5308
- __privateSet(this, _prefix, options?.prefix ?? "");
5309
- this.listenToAlgProp(model.alg, "alg");
5310
- this.listenToAlgProp(model.setupAlg, "setup-alg");
5311
- this.listenToStringSourceProp(model.twistySceneModel.stickering, "stickering");
5312
- this.listenToStringSourceProp(model.setupAnchor, "setup-anchor");
5313
- this.listenToStringOrNullProp(model.title, "title");
5314
- this.listenToStringOrNoValueProp(model.puzzleIDRequest, "puzzle", NO_VALUE);
5315
- this.listenToStringOrNoValueProp(model.puzzleDescriptionRequest, "puzzle-description", NO_VALUE);
5316
- }
5317
- setURLParam(unprefixedKey, value, defaultString) {
5318
- const prefixedKey = __privateGet(this, _prefix) + unprefixedKey;
5319
- const url = new URL(location.href);
5320
- if (value === defaultString) {
5321
- url.searchParams.delete(prefixedKey);
5322
- } else {
5323
- url.searchParams.set(prefixedKey, value);
5324
- }
5325
- updateURL(url);
5326
- }
5327
- async listenToStringSourceProp(prop, key, defaultString) {
5328
- const actualDefaultString = defaultString ?? await prop.getDefaultValue();
5329
- prop.addFreshListener((s) => {
5330
- this.setURLParam(key, s, actualDefaultString);
5331
- });
5332
- }
5333
- async listenToStringOrNullProp(prop, key, defaultString = "") {
5334
- prop.addFreshListener((s) => {
5335
- this.setURLParam(key, s ?? defaultString, defaultString);
5336
- });
5337
- }
5338
- async listenToStringOrNoValueProp(prop, key, defaultString) {
5339
- prop.addFreshListener((s) => {
5340
- if (s === NO_VALUE) {
5341
- s = defaultString;
5342
- }
5343
- if (s === NO_VALUE) {
5344
- this.setURLParam(key, "", "");
5345
- } else {
5346
- this.setURLParam(key, s, "");
5347
- }
5348
- });
5349
- }
5350
- listenToAlgProp(prop, key) {
5351
- prop.addFreshListener((algWithIssues) => {
5352
- this.setURLParam(key, algWithIssues.alg.toString(), "");
5353
- });
5354
- }
5355
- };
5356
- _prefix = new WeakMap();
5357
5003
  function getConfigFromURL(prefix = "", url = location.href) {
5358
5004
  const paramMapping = {
5359
5005
  "alg": "alg",
@@ -5379,28 +5025,29 @@ function getConfigFromURL(prefix = "", url = location.href) {
5379
5025
  }
5380
5026
 
5381
5027
  // src/cubing/twisty/views/twizzle/TwizzleLink.ts
5382
- var _cssElem;
5383
5028
  var TwizzleLink = class extends ManagedCustomElement {
5384
5029
  constructor() {
5385
5030
  super({ mode: "open" });
5386
5031
  this.twistyPlayer = null;
5387
5032
  this.a = null;
5388
- __privateAdd(this, _cssElem, void 0);
5389
5033
  }
5390
5034
  fallback() {
5391
5035
  this.contentWrapper.textContent = "";
5392
5036
  if (this.a) {
5393
- const span = this.contentWrapper.appendChild(document.createElement("span"));
5037
+ const span = this.contentWrapper.appendChild(
5038
+ document.createElement("span")
5039
+ );
5394
5040
  span.textContent = "\u2757\uFE0F";
5395
5041
  span.title = "Could not show a player for link";
5396
5042
  this.addElement(this.a);
5397
5043
  }
5398
- if (__privateGet(this, _cssElem)) {
5399
- __privateGet(this, _cssElem).remove();
5044
+ if (this.#cssElem) {
5045
+ this.#cssElem.remove();
5400
5046
  }
5401
5047
  }
5048
+ #cssElem;
5402
5049
  async connectedCallback() {
5403
- __privateSet(this, _cssElem, this.addCSS(twizzleLinkCSS));
5050
+ this.#cssElem = this.addCSS(twizzleLinkCSS);
5404
5051
  this.a = this.querySelector("a");
5405
5052
  if (!this.a) {
5406
5053
  return;
@@ -5419,10 +5066,12 @@ var TwizzleLink = class extends ManagedCustomElement {
5419
5066
  delete config.puzzle;
5420
5067
  config.experimentalPuzzleDescription = puzzleDescription;
5421
5068
  }
5422
- this.twistyPlayer = this.addElement(new TwistyPlayer({
5423
- ...config,
5424
- viewerLink: isExplorer ? "experimental-twizzle-explorer" : "auto"
5425
- }));
5069
+ this.twistyPlayer = this.addElement(
5070
+ new TwistyPlayer({
5071
+ ...config,
5072
+ viewerLink: isExplorer ? "experimental-twizzle-explorer" : "auto"
5073
+ })
5074
+ );
5426
5075
  if (config.experimentalTitle) {
5427
5076
  this.addHeading(config.experimentalTitle).classList.add("title");
5428
5077
  }
@@ -5430,10 +5079,14 @@ var TwizzleLink = class extends ManagedCustomElement {
5430
5079
  this.addHeading("Setup");
5431
5080
  const setupAlgDiv = this.addElement(document.createElement("div"));
5432
5081
  setupAlgDiv.classList.add("setup-alg");
5433
- setupAlgDiv.textContent = new Alg(config.experimentalSetupAlg).toString();
5082
+ setupAlgDiv.textContent = new Alg(
5083
+ config.experimentalSetupAlg
5084
+ ).toString();
5434
5085
  }
5435
5086
  this.addHeading("Moves");
5436
- const twistyAlgViewer = this.addElement(new TwistyAlgViewer({ twistyPlayer: this.twistyPlayer }));
5087
+ const twistyAlgViewer = this.addElement(
5088
+ new TwistyAlgViewer({ twistyPlayer: this.twistyPlayer })
5089
+ );
5437
5090
  twistyAlgViewer.part.add("twisty-alg-viewer");
5438
5091
  } else {
5439
5092
  this.fallback();
@@ -5446,7 +5099,6 @@ var TwizzleLink = class extends ManagedCustomElement {
5446
5099
  return headingDiv;
5447
5100
  }
5448
5101
  };
5449
- _cssElem = new WeakMap();
5450
5102
  customElementsShim.define("twizzle-link", TwizzleLink);
5451
5103
  export {
5452
5104
  NO_VALUE as EXPERIMENTAL_PROP_NO_VALUE,
@@ -5458,7 +5110,6 @@ export {
5458
5110
  TwistyPlayer,
5459
5111
  TwizzleLink,
5460
5112
  backViewLayouts,
5461
- debugShowRenderStats as experimentalDebugShowRenderStats,
5462
- experimentalForceNewRendererSharing
5113
+ setTwistyDebug
5463
5114
  };
5464
5115
  //# sourceMappingURL=index.js.map