cubing 0.24.0 → 0.24.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 (71) hide show
  1. package/README.md +37 -7
  2. package/dist/esm/{2x2x2.sgs.json-TASFAQNY.js → 2x2x2.sgs.json-FGJMEY7L.js} +2 -2
  3. package/dist/esm/{2x2x2.sgs.json-TASFAQNY.js.map → 2x2x2.sgs.json-FGJMEY7L.js.map} +0 -0
  4. package/dist/esm/{3d-dynamic-inside-RSDMFS4G.js → 3d-dynamic-inside-OI3KFE53.js} +3 -4
  5. package/dist/esm/{3d-dynamic-inside-RSDMFS4G.js.map → 3d-dynamic-inside-OI3KFE53.js.map} +2 -2
  6. package/dist/esm/bluetooth/index.js +1 -1
  7. package/dist/esm/{chunk-SPTKCRT5.js → chunk-2DZQQRAX.js} +2 -2
  8. package/dist/esm/{chunk-SPTKCRT5.js.map → chunk-2DZQQRAX.js.map} +0 -0
  9. package/dist/esm/{chunk-BBEJTW6Z.js → chunk-63M53ZZ5.js} +2 -2
  10. package/dist/esm/{chunk-BBEJTW6Z.js.map → chunk-63M53ZZ5.js.map} +0 -0
  11. package/dist/esm/{chunk-EA4KWT7Z.js → chunk-ARBPSZE4.js} +3 -3
  12. package/dist/esm/{chunk-EA4KWT7Z.js.map → chunk-ARBPSZE4.js.map} +0 -0
  13. package/dist/esm/{chunk-54HT7B4M.js → chunk-IS5V7Y6I.js} +5 -7
  14. package/dist/esm/chunk-IS5V7Y6I.js.map +7 -0
  15. package/dist/esm/{chunk-ZDALYMGF.js → chunk-KRL5KQQK.js} +32 -3
  16. package/dist/esm/chunk-KRL5KQQK.js.map +7 -0
  17. package/dist/esm/{chunk-3SURT6S2.js → chunk-PJXFSZFG.js} +2 -2
  18. package/dist/esm/{chunk-3SURT6S2.js.map → chunk-PJXFSZFG.js.map} +0 -0
  19. package/dist/esm/{chunk-LR6VCMD2.js → chunk-V5DHYMZ7.js} +2 -2
  20. package/dist/esm/{chunk-LR6VCMD2.js.map → chunk-V5DHYMZ7.js.map} +0 -0
  21. package/dist/esm/{chunk-27MCV5LC.js → chunk-ZA7DHVIG.js} +2 -2
  22. package/dist/esm/{chunk-27MCV5LC.js.map → chunk-ZA7DHVIG.js.map} +0 -0
  23. package/dist/esm/{entry-VNBE3GIX.js → entry-35P24GUC.js} +14 -14
  24. package/dist/esm/{entry-VNBE3GIX.js.map → entry-35P24GUC.js.map} +0 -0
  25. package/dist/esm/{fto.sgs.json-RZ2BQGRG.js → fto.sgs.json-5DLOFNGP.js} +2 -2
  26. package/dist/esm/{fto.sgs.json-RZ2BQGRG.js.map → fto.sgs.json-5DLOFNGP.js.map} +0 -0
  27. package/dist/esm/{megaminx.sgs.json-3UELYHNZ.js → megaminx.sgs.json-6QTJOWQY.js} +3 -3
  28. package/dist/esm/{megaminx.sgs.json-3UELYHNZ.js.map → megaminx.sgs.json-6QTJOWQY.js.map} +0 -0
  29. package/dist/esm/{module-entry-MKJ6SWPL.js → module-entry-EAI3JQ2N.js} +2 -2
  30. package/dist/esm/{module-entry-MKJ6SWPL.js.map → module-entry-EAI3JQ2N.js.map} +0 -0
  31. package/dist/esm/puzzle-geometry/index.js +1 -1
  32. package/dist/esm/puzzles/index.js +1 -1
  33. package/dist/esm/{pyraminx.sgs.json-6KZV2YF7.js → pyraminx.sgs.json-P7ND22JU.js} +3 -3
  34. package/dist/esm/{pyraminx.sgs.json-6KZV2YF7.js.map → pyraminx.sgs.json-P7ND22JU.js.map} +0 -0
  35. package/dist/esm/scramble/index.js +3 -3
  36. package/dist/esm/{scramble_444-WHAZBEON.js → scramble_444-Q22ZMCV5.js} +3 -3
  37. package/dist/esm/{scramble_444-WHAZBEON.js.map → scramble_444-Q22ZMCV5.js.map} +0 -0
  38. package/dist/esm/search/index.js +3 -3
  39. package/dist/esm/{skewb.sgs.json-QVGBEYZV.js → skewb.sgs.json-PE7DQP2D.js} +3 -3
  40. package/dist/esm/{skewb.sgs.json-QVGBEYZV.js.map → skewb.sgs.json-PE7DQP2D.js.map} +0 -0
  41. package/dist/esm/twisty/index.js +339 -258
  42. package/dist/esm/twisty/index.js.map +3 -3
  43. package/dist/esm/{worker-inside-generated-string-K4NE6VX5.js → worker-inside-generated-string-4JQKOQND.js} +21 -21
  44. package/dist/esm/worker-inside-generated-string-4JQKOQND.js.map +7 -0
  45. package/dist/types/puzzle-geometry/FaceNameSwizzler.d.ts +1 -0
  46. package/dist/types/puzzle-geometry/PermOriSet.d.ts +2 -1
  47. package/dist/types/puzzle-geometry/PuzzleGeometry.d.ts +1 -0
  48. package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
  49. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.d.ts +5 -4
  50. package/dist/types/twisty/index.d.ts +1 -1
  51. package/dist/types/twisty/model/TwistyPlayerModel.d.ts +46 -42
  52. package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts +1 -1
  53. package/dist/types/twisty/model/props/puzzle/state/AnchorTransformationProp.d.ts +14 -0
  54. package/dist/types/twisty/model/props/puzzle/state/SetupTransformationProp.d.ts +5 -0
  55. package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts +1 -1
  56. package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts +1 -1
  57. package/dist/types/twisty/model/props/viewer/ViewerLinkProp.d.ts +1 -0
  58. package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts +1 -0
  59. package/dist/types/twisty/views/ManagedCustomElement.d.ts +1 -1
  60. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts +1 -1
  61. package/dist/types/twisty/views/TwistyPlayer.d.ts +2 -2
  62. package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.css.d.ts → TwistyButtons.css.d.ts} +0 -0
  63. package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.d.ts → TwistyButtons.d.ts} +3 -3
  64. package/dist/types/twisty/views/control-panel/{TwistyScrubberV2.d.ts → TwistyScrubber.d.ts} +1 -1
  65. package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +3 -1
  66. package/package.json +2 -2
  67. package/dist/esm/chunk-54HT7B4M.js.map +0 -7
  68. package/dist/esm/chunk-ZDALYMGF.js.map +0 -7
  69. package/dist/esm/worker-inside-generated-string-K4NE6VX5.js.map +0 -7
  70. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.d.ts +0 -22
  71. package/dist/types/twisty/model/props/puzzle/state/AnchoredStartProp.d.ts +0 -13
@@ -10,7 +10,7 @@ import {
10
10
  TwistyPropDerived,
11
11
  TwistyPropSource,
12
12
  proxy3D
13
- } from "../chunk-27MCV5LC.js";
13
+ } from "../chunk-ZA7DHVIG.js";
14
14
  import {
15
15
  countAnimatedLeaves,
16
16
  countMoves
@@ -20,7 +20,7 @@ import {
20
20
  cubeAppearance,
21
21
  customPGPuzzleLoader,
22
22
  puzzles
23
- } from "../chunk-54HT7B4M.js";
23
+ } from "../chunk-IS5V7Y6I.js";
24
24
  import "../chunk-B27E6KTE.js";
25
25
  import {
26
26
  Alg,
@@ -144,8 +144,8 @@ var CatchUpHelper = class {
144
144
  this.scheduler.requestAnimFrame();
145
145
  const delta = (timestamp - this.lastTimestamp) / this.catchUpMs;
146
146
  this.lastTimestamp = timestamp;
147
- this.model.catchUpMoveProp.set((async () => {
148
- const previousCatchUpMove = await this.model.catchUpMoveProp.get();
147
+ this.model.catchUpMove.set((async () => {
148
+ const previousCatchUpMove = await this.model.catchUpMove.get();
149
149
  if (previousCatchUpMove.move === null) {
150
150
  return previousCatchUpMove;
151
151
  }
@@ -153,7 +153,7 @@ var CatchUpHelper = class {
153
153
  if (amount >= 1) {
154
154
  this.pendingFrame = true;
155
155
  this.stop();
156
- this.model.timestampRequestProp.set("end");
156
+ this.model.timestampRequest.set("end");
157
157
  return {
158
158
  move: null,
159
159
  amount: 0
@@ -179,9 +179,9 @@ var TwistyAnimationController = class {
179
179
  __privateAdd(this, _animFrameEffectiveTimestampStaleDropper, new StaleDropper());
180
180
  this.model = model;
181
181
  this.lastTimestampPromise = __privateMethod(this, _effectiveTimestampMilliseconds, effectiveTimestampMilliseconds_fn).call(this);
182
- this.model.playingInfoProp.addFreshListener(this.onPlayingProp.bind(this));
182
+ this.model.playingInfo.addFreshListener(this.onPlayingProp.bind(this));
183
183
  this.catchUpHelper = new CatchUpHelper(this.model);
184
- this.model.catchUpMoveProp.addFreshListener(this.onCatchUpMoveProp.bind(this));
184
+ this.model.catchUpMove.addFreshListener(this.onCatchUpMoveProp.bind(this));
185
185
  }
186
186
  async onPlayingProp(playingInfo) {
187
187
  if (playingInfo.playing !== this.playing) {
@@ -196,14 +196,14 @@ var TwistyAnimationController = class {
196
196
  this.scheduler.requestAnimFrame();
197
197
  }
198
198
  jumpToStart(options) {
199
- this.model.timestampRequestProp.set("start");
199
+ this.model.timestampRequest.set("start");
200
200
  this.pause();
201
201
  if (options?.flash) {
202
202
  this.delegate.flash();
203
203
  }
204
204
  }
205
205
  jumpToEnd(options) {
206
- this.model.timestampRequestProp.set("end");
206
+ this.model.timestampRequest.set("end");
207
207
  this.pause();
208
208
  if (options?.flash) {
209
209
  this.delegate.flash();
@@ -218,18 +218,18 @@ var TwistyAnimationController = class {
218
218
  }
219
219
  async play(options) {
220
220
  const direction = options?.direction ?? Direction.Forwards;
221
- const coarseTimelineInfo = await this.model.coarseTimelineInfoProp.get();
221
+ const coarseTimelineInfo = await this.model.coarseTimelineInfo.get();
222
222
  if (options?.autoSkipToOtherEndIfStartingAtBoundary ?? true) {
223
223
  if (direction === Direction.Forwards && coarseTimelineInfo.atEnd) {
224
- this.model.timestampRequestProp.set("start");
224
+ this.model.timestampRequest.set("start");
225
225
  this.delegate.flash();
226
226
  }
227
227
  if (direction === Direction.Backwards && coarseTimelineInfo.atStart) {
228
- this.model.timestampRequestProp.set("end");
228
+ this.model.timestampRequest.set("end");
229
229
  this.delegate.flash();
230
230
  }
231
231
  }
232
- this.model.playingInfoProp.set({
232
+ this.model.playingInfo.set({
233
233
  playing: true,
234
234
  direction,
235
235
  untilBoundary: options?.untilBoundary ?? BoundaryType.EntireTimeline,
@@ -243,7 +243,7 @@ var TwistyAnimationController = class {
243
243
  pause() {
244
244
  this.playing = false;
245
245
  this.scheduler.cancelAnimFrame();
246
- this.model.playingInfoProp.set({
246
+ this.model.playingInfo.set({
247
247
  playing: false,
248
248
  untilBoundary: BoundaryType.EntireTimeline
249
249
  });
@@ -254,11 +254,11 @@ var TwistyAnimationController = class {
254
254
  }
255
255
  const lastDatestamp = this.lastDatestamp;
256
256
  const freshenerResult = await __privateGet(this, _animFrameEffectiveTimestampStaleDropper).queue(Promise.all([
257
- this.model.playingInfoProp.get(),
257
+ this.model.playingInfo.get(),
258
258
  this.lastTimestampPromise,
259
- this.model.timeRangeProp.get(),
260
- this.model.tempoScaleProp.get(),
261
- this.model.currentMoveInfoProp.get()
259
+ this.model.timeRange.get(),
260
+ this.model.tempoScale.get(),
261
+ this.model.currentMoveInfo.get()
262
262
  ]));
263
263
  const [playingInfo, lastTimestamp, timeRange, tempoScale, currentMoveInfo] = freshenerResult;
264
264
  if (!playingInfo.playing) {
@@ -288,7 +288,7 @@ var TwistyAnimationController = class {
288
288
  newTimestamp = end;
289
289
  }
290
290
  this.playing = false;
291
- this.model.playingInfoProp.set({
291
+ this.model.playingInfo.set({
292
292
  playing: false
293
293
  });
294
294
  }
@@ -302,19 +302,19 @@ var TwistyAnimationController = class {
302
302
  newTimestamp = start;
303
303
  }
304
304
  this.playing = false;
305
- this.model.playingInfoProp.set({
305
+ this.model.playingInfo.set({
306
306
  playing: false
307
307
  });
308
308
  }
309
309
  }
310
310
  this.lastDatestamp = frameDatestamp;
311
311
  this.lastTimestampPromise = Promise.resolve(newTimestamp);
312
- this.model.timestampRequestProp.set(newSmartTimestampRequest ?? newTimestamp);
312
+ this.model.timestampRequest.set(newSmartTimestampRequest ?? newTimestamp);
313
313
  }
314
314
  };
315
315
  _effectiveTimestampMilliseconds = new WeakSet();
316
316
  effectiveTimestampMilliseconds_fn = async function() {
317
- return (await this.model.detailedTimelineInfoProp.get()).timestamp;
317
+ return (await this.model.detailedTimelineInfo.get()).timestamp;
318
318
  };
319
319
  _animFrameEffectiveTimestampStaleDropper = new WeakMap();
320
320
 
@@ -395,13 +395,15 @@ var ManagedCustomElement = class extends HTMLElementShim {
395
395
  this.shadow.appendChild(this.contentWrapper);
396
396
  }
397
397
  addCSS(cssSource) {
398
- if (__privateGet(this, _cssSourceMap).get(cssSource)) {
399
- return;
398
+ const existing = __privateGet(this, _cssSourceMap).get(cssSource);
399
+ if (existing) {
400
+ return existing;
400
401
  }
401
402
  const cssElem = document.createElement("style");
402
403
  cssElem.textContent = cssSource.getAsString();
403
404
  __privateGet(this, _cssSourceMap).set(cssSource, cssElem);
404
405
  this.shadow.appendChild(cssElem);
406
+ return cssElem;
405
407
  }
406
408
  removeCSS(cssSource) {
407
409
  const cssElem = __privateGet(this, _cssSourceMap).get(cssSource);
@@ -688,12 +690,12 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
688
690
  __privateAdd(this, _freshListenerManager, new FreshListenerManager());
689
691
  this.addCSS(twisty2DSVGCSS);
690
692
  this.resetSVG();
691
- __privateGet(this, _freshListenerManager).addListener(this.model.puzzleIDProp, (puzzleID) => {
693
+ __privateGet(this, _freshListenerManager).addListener(this.model.puzzleID, (puzzleID) => {
692
694
  if (puzzleLoader?.id !== puzzleID) {
693
695
  this.disconnect();
694
696
  }
695
697
  });
696
- __privateGet(this, _freshListenerManager).addListener(this.model.legacyPositionProp, this.onPositionChange.bind(this));
698
+ __privateGet(this, _freshListenerManager).addListener(this.model.legacyPosition, this.onPositionChange.bind(this));
697
699
  if (this.options?.experimentalStickering) {
698
700
  this.experimentalSetStickering(this.options.experimentalStickering);
699
701
  }
@@ -763,7 +765,7 @@ var Twisty2DPuzzleWrapper = class {
763
765
  __privateAdd(this, _freshListenerManager2, new FreshListenerManager());
764
766
  __privateAdd(this, _cachedTwisty2DPuzzle, null);
765
767
  this.twisty2DPuzzle();
766
- __privateGet(this, _freshListenerManager2).addListener(this.model.stickeringProp, async (stickering) => {
768
+ __privateGet(this, _freshListenerManager2).addListener(this.model.stickering, async (stickering) => {
767
769
  (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
768
770
  });
769
771
  }
@@ -799,7 +801,7 @@ var Twisty2DSceneWrapper = class extends ManagedCustomElement {
799
801
  async connectedCallback() {
800
802
  this.addCSS(twistyViewerWrapperCSS);
801
803
  if (this.model) {
802
- __privateGet(this, _freshListenerManager3).addListener(this.model.puzzleLoaderProp, this.onPuzzleLoader.bind(this));
804
+ __privateGet(this, _freshListenerManager3).addListener(this.model.puzzleLoader, this.onPuzzleLoader.bind(this));
803
805
  }
804
806
  }
805
807
  async scene() {
@@ -872,12 +874,12 @@ var Twisty3DPuzzleWrapper = class {
872
874
  __privateAdd(this, _freshListenerManager4, new FreshListenerManager());
873
875
  __privateAdd(this, _cachedTwisty3DPuzzle, null);
874
876
  this.twisty3DPuzzle();
875
- __privateGet(this, _freshListenerManager4).addListener(this.model.puzzleLoaderProp, (puzzleLoader2) => {
877
+ __privateGet(this, _freshListenerManager4).addListener(this.model.puzzleLoader, (puzzleLoader2) => {
876
878
  if (this.puzzleLoader.id !== puzzleLoader2.id) {
877
879
  this.disconnect();
878
880
  }
879
881
  });
880
- __privateGet(this, _freshListenerManager4).addListener(this.model.legacyPositionProp, async (position) => {
882
+ __privateGet(this, _freshListenerManager4).addListener(this.model.legacyPosition, async (position) => {
881
883
  try {
882
884
  (await this.twisty3DPuzzle()).onPositionChange(position);
883
885
  this.scheduleRender();
@@ -885,19 +887,19 @@ var Twisty3DPuzzleWrapper = class {
885
887
  this.disconnect();
886
888
  }
887
889
  });
888
- __privateGet(this, _freshListenerManager4).addListener(this.model.hintFaceletProp, async (hintFaceletStyle) => {
890
+ __privateGet(this, _freshListenerManager4).addListener(this.model.hintFacelet, async (hintFaceletStyle) => {
889
891
  (await this.twisty3DPuzzle()).experimentalUpdateOptions({
890
892
  hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
891
893
  });
892
894
  this.scheduleRender();
893
895
  });
894
- __privateGet(this, _freshListenerManager4).addListener(this.model.foundationDisplayProp, async (foundationDisplay) => {
896
+ __privateGet(this, _freshListenerManager4).addListener(this.model.foundationDisplay, async (foundationDisplay) => {
895
897
  (await this.twisty3DPuzzle()).experimentalUpdateOptions({
896
898
  showFoundation: foundationDisplay !== "none"
897
899
  });
898
900
  this.scheduleRender();
899
901
  });
900
- __privateGet(this, _freshListenerManager4).addListener(this.model.stickeringProp, async (stickering) => {
902
+ __privateGet(this, _freshListenerManager4).addListener(this.model.stickering, async (stickering) => {
901
903
  if ("setStickering" in await this.twisty3DPuzzle()) {
902
904
  (await this.twisty3DPuzzle()).setStickering(stickering);
903
905
  this.scheduleRender();
@@ -941,7 +943,7 @@ var Twisty3DPuzzleWrapper = class {
941
943
  const [foundationSprite, hintSprite, experimentalStickering] = await Promise.all([
942
944
  this.model.foundationStickerSprite.get(),
943
945
  this.model.hintStickerSprite.get(),
944
- this.model.stickeringProp.get()
946
+ this.model.stickering.get()
945
947
  ]);
946
948
  return (await proxyPromise).cube3DShim({
947
949
  foundationSprite,
@@ -950,7 +952,7 @@ var Twisty3DPuzzleWrapper = class {
950
952
  });
951
953
  } else {
952
954
  const [hintFacelets, foundationSprite, hintSprite] = await Promise.all([
953
- this.model.hintFaceletProp.get(),
955
+ this.model.hintFacelet.get(),
954
956
  this.model.foundationStickerSprite.get(),
955
957
  this.model.hintStickerSprite.get()
956
958
  ]);
@@ -1104,12 +1106,45 @@ var twisty3DVantageCSS = new CSSSource(`
1104
1106
  height: 100%;
1105
1107
  display: grid;
1106
1108
  overflow: hidden;
1109
+ place-content: center;
1110
+ }
1111
+
1112
+ .loading {
1113
+ width: 4em;
1114
+ height: 4em;
1115
+ border-radius: 2.5em;
1116
+ border: 0.5em solid rgba(0, 0, 0, 0);
1117
+ border-top: 0.5em solid rgba(0, 0, 0, 0.7);
1118
+ border-right: 0.5em solid rgba(0, 0, 0, 0.7);
1119
+ animation: fade-in-delayed 4s, rotate 1s linear infinite;
1120
+ }
1121
+
1122
+ @keyframes fade-in-delayed {
1123
+ 0% { opacity: 0; }
1124
+ 25% {opacity: 0; }
1125
+ 100% { opacity: 1; }
1126
+ }
1127
+
1128
+ @keyframes rotate {
1129
+ from { transform: rotate(0deg); }
1130
+ to { transform: rotate(360deg); }
1107
1131
  }
1108
1132
 
1109
1133
  /* TODO: This is due to stats hack. Replace with \`canvas\`. */
1110
1134
  .wrapper > canvas {
1111
1135
  max-width: 100%;
1112
1136
  max-height: 100%;
1137
+ cursor: grab;
1138
+ animation: fade-in 0.25s ease-in;
1139
+ }
1140
+
1141
+ @keyframes fade-in {
1142
+ from { opacity: 0; }
1143
+ to { opacity: 1; }
1144
+ }
1145
+
1146
+ .wrapper > canvas:active {
1147
+ cursor: grabbing;
1113
1148
  }
1114
1149
 
1115
1150
  .wrapper.invisible {
@@ -1322,8 +1357,8 @@ var TwistyOrbitControls = class {
1322
1357
  const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);
1323
1358
  const temperedX = this.temperMovement(movementX / minDim);
1324
1359
  const temperedY = this.temperMovement(movementY / minDim * VERTICAL_MOVEMENT_BASE_SCALE);
1325
- this.model.orbitCoordinatesRequestProp.set((async () => {
1326
- const prevCoords = await this.model.orbitCoordinatesProp.get();
1360
+ this.model.orbitCoordinatesRequest.set((async () => {
1361
+ const prevCoords = await this.model.orbitCoordinates.get();
1327
1362
  const newCoords = {
1328
1363
  latitude: prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,
1329
1364
  longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN
@@ -1383,6 +1418,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1383
1418
  this.scene = null;
1384
1419
  this.stats = null;
1385
1420
  this.rendererIsShared = shareRenderer();
1421
+ this.loadingElement = null;
1386
1422
  __privateAdd(this, _onResizeStaleDropper, new StaleDropper());
1387
1423
  __privateAdd(this, _width, 0);
1388
1424
  __privateAdd(this, _height, 0);
@@ -1394,6 +1430,8 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1394
1430
  __privateAdd(this, _disconnectionFunctions, []);
1395
1431
  __privateAdd(this, _scheduler, new RenderScheduler(this.render.bind(this)));
1396
1432
  this.scene = scene ?? null;
1433
+ this.loadingElement = this.addElement(document.createElement("div"));
1434
+ this.loadingElement.classList.add("loading");
1397
1435
  if (SHOW_STATS) {
1398
1436
  this.stats = new Stats();
1399
1437
  this.stats.dom.style.position = "absolute";
@@ -1435,6 +1473,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1435
1473
  const renderer = await this.renderer();
1436
1474
  canvas = this.addElement(renderer.domElement);
1437
1475
  }
1476
+ this.loadingElement?.remove();
1438
1477
  const context = canvas.getContext("2d");
1439
1478
  return { canvas, context };
1440
1479
  })());
@@ -1451,7 +1490,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1451
1490
  return __privateGet(this, _cachedOrbitControls) ?? __privateSet(this, _cachedOrbitControls, (async () => {
1452
1491
  const orbitControls = new TwistyOrbitControls(this.model, !!this.options?.backView, (await this.canvasInfo()).canvas, await __privateMethod(this, _dragTracker, dragTracker_fn).call(this));
1453
1492
  if (this.model) {
1454
- this.addListener(this.model.orbitCoordinatesProp, async (orbitCoordinates) => {
1493
+ this.addListener(this.model.orbitCoordinates, async (orbitCoordinates) => {
1455
1494
  const camera = await this.camera();
1456
1495
  setCameraFromOrbitCoordinates(camera, orbitCoordinates, this.options?.backView);
1457
1496
  this.scheduleRender();
@@ -1497,7 +1536,7 @@ _setupBasicPresses = new WeakSet();
1497
1536
  setupBasicPresses_fn = async function() {
1498
1537
  const dragTracker = await __privateMethod(this, _dragTracker, dragTracker_fn).call(this);
1499
1538
  dragTracker.addEventListener("press", async (e) => {
1500
- const movePressInput = await this.model.movePressInputProp.get();
1539
+ const movePressInput = await this.model.movePressInput.get();
1501
1540
  if (movePressInput !== "basic") {
1502
1541
  return;
1503
1542
  }
@@ -1584,8 +1623,8 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1584
1623
  const vantage = new Twisty3DVantage(this.model, this);
1585
1624
  this.addVantage(vantage);
1586
1625
  if (this.model) {
1587
- __privateGet(this, _freshListenerManager5).addMultiListener([this.model.puzzleLoaderProp, this.model.visualizationStrategyProp], this.onPuzzle.bind(this));
1588
- __privateGet(this, _freshListenerManager5).addListener(this.model.backViewProp, this.onBackView.bind(this));
1626
+ __privateGet(this, _freshListenerManager5).addMultiListener([this.model.puzzleLoader, this.model.visualizationStrategy], this.onPuzzle.bind(this));
1627
+ __privateGet(this, _freshListenerManager5).addListener(this.model.backView, this.onBackView.bind(this));
1589
1628
  }
1590
1629
  this.scheduleRender();
1591
1630
  }
@@ -1684,7 +1723,7 @@ _currentTwisty3DPuzzleWrapper = new WeakMap();
1684
1723
  _twisty3DStaleDropper = new WeakMap();
1685
1724
  customElementsShim.define("twisty-3d-scene-wrapper", Twisty3DSceneWrapper);
1686
1725
 
1687
- // src/cubing/twisty/views/control-panel/TwistyButtonsV2.css.ts
1726
+ // src/cubing/twisty/views/control-panel/TwistyButtons.css.ts
1688
1727
  var buttonGridCSS = new CSSSource(`
1689
1728
  :host {
1690
1729
  width: 384px;
@@ -1709,7 +1748,7 @@ var buttonGridCSS = new CSSSource(`
1709
1748
  display: none;
1710
1749
  }
1711
1750
 
1712
- .wrapper twisty-button-v2,
1751
+ .wrapper twisty-button,
1713
1752
  .wrapper twisty-control-button {
1714
1753
  width: inherit;
1715
1754
  height: inherit;
@@ -1846,6 +1885,7 @@ var buttonIcons = [
1846
1885
  ];
1847
1886
  var ButtonAppearanceProp = class extends TwistyPropDerived {
1848
1887
  derive(inputs) {
1888
+ console.log(inputs.coarseTimelineInfo);
1849
1889
  const buttonAppearances = {
1850
1890
  "fullscreen": {
1851
1891
  enabled: fullscreenEnabled,
@@ -1863,7 +1903,7 @@ var ButtonAppearanceProp = class extends TwistyPropDerived {
1863
1903
  title: "Step backward"
1864
1904
  },
1865
1905
  "play-pause": {
1866
- enabled: true,
1906
+ enabled: !(inputs.coarseTimelineInfo.atStart && inputs.coarseTimelineInfo.atEnd),
1867
1907
  icon: inputs.coarseTimelineInfo.playing ? "pause" : "play",
1868
1908
  title: inputs.coarseTimelineInfo.playing ? "Pause" : "Play"
1869
1909
  },
@@ -1888,7 +1928,7 @@ var ButtonAppearanceProp = class extends TwistyPropDerived {
1888
1928
  }
1889
1929
  };
1890
1930
 
1891
- // src/cubing/twisty/views/control-panel/TwistyButtonsV2.ts
1931
+ // src/cubing/twisty/views/control-panel/TwistyButtons.ts
1892
1932
  var buttonCommands = {
1893
1933
  "fullscreen": true,
1894
1934
  "jump-to-start": true,
@@ -1899,7 +1939,7 @@ var buttonCommands = {
1899
1939
  "twizzle-link": true
1900
1940
  };
1901
1941
  var _onCommand, onCommand_fn;
1902
- var TwistyButtonsV2 = class extends ManagedCustomElement {
1942
+ var TwistyButtons = class extends ManagedCustomElement {
1903
1943
  constructor(model, controller, fullscreenElement) {
1904
1944
  super();
1905
1945
  this.model = model;
@@ -1912,13 +1952,13 @@ var TwistyButtonsV2 = class extends ManagedCustomElement {
1912
1952
  this.addCSS(buttonGridCSS);
1913
1953
  const buttons = {};
1914
1954
  for (const command in buttonCommands) {
1915
- const button = new TwistyButtonV2();
1955
+ const button = new TwistyButton();
1916
1956
  buttons[command] = button;
1917
1957
  button.addEventListener("click", () => __privateMethod(this, _onCommand, onCommand_fn).call(this, command));
1918
1958
  this.addElement(button);
1919
1959
  }
1920
1960
  this.buttons = buttons;
1921
- this.model?.buttonAppearanceProp.addFreshListener(this.update.bind(this));
1961
+ this.model?.buttonAppearance.addFreshListener(this.update.bind(this));
1922
1962
  }
1923
1963
  async onFullscreenButton() {
1924
1964
  if (!this.fullscreenElement) {
@@ -1983,9 +2023,9 @@ onCommand_fn = function(command) {
1983
2023
  throw new Error("Missing command");
1984
2024
  }
1985
2025
  };
1986
- customElementsShim.define("twisty-buttons-v2", TwistyButtonsV2);
2026
+ customElementsShim.define("twisty-buttons", TwistyButtons);
1987
2027
  var _iconManager;
1988
- var TwistyButtonV2 = class extends ManagedCustomElement {
2028
+ var TwistyButton = class extends ManagedCustomElement {
1989
2029
  constructor() {
1990
2030
  super(...arguments);
1991
2031
  this.button = document.createElement("button");
@@ -2000,7 +2040,7 @@ var TwistyButtonV2 = class extends ManagedCustomElement {
2000
2040
  }
2001
2041
  };
2002
2042
  _iconManager = new WeakMap();
2003
- customElementsShim.define("twisty-button-v2", TwistyButtonV2);
2043
+ customElementsShim.define("twisty-button", TwistyButton);
2004
2044
 
2005
2045
  // src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts
2006
2046
  var twistyScrubberCSS = new CSSSource(`
@@ -2017,40 +2057,15 @@ var twistyScrubberCSS = new CSSSource(`
2017
2057
  overflow: hidden;
2018
2058
  backdrop-filter: blur(4px);
2019
2059
  -webkit-backdrop-filter: blur(4px);
2060
+ background: rgba(196, 196, 196, 0.75)
2020
2061
  }
2021
2062
 
2022
- input {
2023
- margin: 0; width: 100%;
2024
- }
2025
-
2026
- input {
2027
- background: none;
2028
- }
2029
-
2030
- ::-moz-range-track {
2031
- background: rgba(0, 0, 0, 0.25);
2032
- height: 50%;
2033
- border: 1px solid rgba(0, 0, 0, 0.1);
2034
- }
2035
-
2036
- ::-webkit-slider-runnable-track {
2037
- background: rgba(0, 0, 0, 0.05);
2038
- }
2039
-
2040
- ::-moz-range-progress {
2041
- background: #3273F6;
2042
- height: 50%;
2043
- border: 1px solid rgba(0, 0, 0, 0.1);
2044
- }
2045
-
2046
- ::-ms-fill-lower {
2047
- background: #3273F6;
2048
- height: 50%;
2049
- border: 1px solid rgba(0, 0, 0, 0.1);
2063
+ input:not(:disabled) {
2064
+ cursor: ew-resize;
2050
2065
  }
2051
2066
  `);
2052
2067
 
2053
- // src/cubing/twisty/views/control-panel/TwistyScrubberV2.ts
2068
+ // src/cubing/twisty/views/control-panel/TwistyScrubber.ts
2054
2069
  var SLOW_DOWN_SCRUBBING = false;
2055
2070
  var isMouseDown = false;
2056
2071
  globalSafeDocument?.addEventListener("mousedown", function(event) {
@@ -2078,7 +2093,7 @@ var lastPreval = 0;
2078
2093
  var scaling = false;
2079
2094
  var currentClickNum = 0;
2080
2095
  var _inputElem;
2081
- var TwistyScrubberV2 = class extends ManagedCustomElement {
2096
+ var TwistyScrubber = class extends ManagedCustomElement {
2082
2097
  constructor(model) {
2083
2098
  super();
2084
2099
  this.model = model;
@@ -2100,7 +2115,7 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2100
2115
  const elem = document.createElement("input");
2101
2116
  elem.type = "range";
2102
2117
  elem.disabled = true;
2103
- this.model?.detailedTimelineInfoProp.addFreshListener(this.onDetailedTimelineInfo.bind(this));
2118
+ this.model?.detailedTimelineInfo.addFreshListener(this.onDetailedTimelineInfo.bind(this));
2104
2119
  elem.addEventListener("input", this.onInput.bind(this));
2105
2120
  return elem;
2106
2121
  })());
@@ -2112,8 +2127,8 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2112
2127
  const inputElem = await this.inputElem();
2113
2128
  await this.slowDown(e, inputElem);
2114
2129
  const value = parseInt(inputElem.value);
2115
- this.model?.playingInfoProp.set({ playing: false });
2116
- this.model?.timestampRequestProp.set(value);
2130
+ this.model?.playingInfo.set({ playing: false });
2131
+ this.model?.timestampRequest.set(value);
2117
2132
  }
2118
2133
  async slowDown(e, inputElem) {
2119
2134
  if (!SLOW_DOWN_SCRUBBING) {
@@ -2148,7 +2163,7 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2148
2163
  }
2149
2164
  };
2150
2165
  _inputElem = new WeakMap();
2151
- customElementsShim.define("twisty-scrubber-v2", TwistyScrubberV2);
2166
+ customElementsShim.define("twisty-scrubber", TwistyScrubber);
2152
2167
 
2153
2168
  // src/cubing/twisty/views/screenshot.ts
2154
2169
  var cachedCamera = null;
@@ -2161,12 +2176,12 @@ async function screenshot(model, options) {
2161
2176
  })());
2162
2177
  const scene = new (await THREEJS).Scene();
2163
2178
  const twisty3DWrapper = new Twisty3DPuzzleWrapper(model, { scheduleRender: () => {
2164
- } }, await model.puzzleLoaderProp.get(), await model.visualizationStrategyProp.get());
2165
- await model.stickeringProp.get();
2179
+ } }, await model.puzzleLoader.get(), await model.visualizationStrategy.get());
2180
+ await model.stickering.get();
2166
2181
  await new Promise((resolve) => setTimeout(resolve, 1e3));
2167
- await model.legacyPositionProp.get();
2182
+ await model.legacyPosition.get();
2168
2183
  scene.add(await twisty3DWrapper.twisty3DPuzzle());
2169
- const orbitCoordinates = await model.orbitCoordinatesProp.get();
2184
+ const orbitCoordinates = await model.orbitCoordinates.get();
2170
2185
  await setCameraFromOrbitCoordinates(camera, orbitCoordinates);
2171
2186
  const renderer = new (await THREEJS).WebGLRenderer({
2172
2187
  antialias: true,
@@ -2185,8 +2200,8 @@ async function screenshot(model, options) {
2185
2200
  }
2186
2201
  async function getDefaultFilename(model) {
2187
2202
  const [puzzleID, algWithIssues] = await Promise.all([
2188
- model.puzzleIDProp.get(),
2189
- model.algProp.get()
2203
+ model.puzzleID.get(),
2204
+ model.alg.get()
2190
2205
  ]);
2191
2206
  return `[${puzzleID}]${algWithIssues.alg.experimentalNumUnits() === 0 ? "" : " " + algWithIssues.alg.toString()}`;
2192
2207
  }
@@ -2211,7 +2226,7 @@ var twistyPlayerCSS = new CSSSource(`
2211
2226
  .wrapper {
2212
2227
  display: grid;
2213
2228
  overflow: hidden;
2214
- grid-template-rows: 7fr 1em 1fr;
2229
+ grid-template-rows: 7fr minmax(1.5em, 0.5fr) minmax(2em, 1fr);
2215
2230
  }
2216
2231
 
2217
2232
  .wrapper > * {
@@ -2226,8 +2241,8 @@ var twistyPlayerCSS = new CSSSource(`
2226
2241
 
2227
2242
  .wrapper.controls-none twisty-scrubber,
2228
2243
  .wrapper.controls-none twisty-control-button-panel ,
2229
- .wrapper.controls-none twisty-scrubber-v2,
2230
- .wrapper.controls-none twisty-buttons-v2 {
2244
+ .wrapper.controls-none twisty-scrubber,
2245
+ .wrapper.controls-none twisty-buttons {
2231
2246
  display: none;
2232
2247
  }
2233
2248
 
@@ -2881,7 +2896,7 @@ function simulMoves(a) {
2881
2896
  return l;
2882
2897
  }
2883
2898
 
2884
- // src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.ts
2899
+ // src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.ts
2885
2900
  var demos = {
2886
2901
  "y' y' U' E D R2 r2 F2 B2 U E D' R2 L2' z2 S2 U U D D S2 F2' B2": [
2887
2902
  { animLeaf: new Move("y", -1), start: 0, end: 1e3 },
@@ -2928,7 +2943,7 @@ var demos = {
2928
2943
  { animLeaf: new Move("E"), start: 7e3, end: 8e3 }
2929
2944
  ]
2930
2945
  };
2931
- var SimultaneousMoveIndexerV2 = class {
2946
+ var SimultaneousMoveIndexer = class {
2932
2947
  constructor(kpuzzle, alg) {
2933
2948
  this.kpuzzle = kpuzzle;
2934
2949
  this.animLeaves = demos[alg.toString()] ?? simulMoves(alg);
@@ -3422,7 +3437,7 @@ var IndexerConstructorProp = class extends TwistyPropDerived {
3422
3437
  switch (inputs.indexerConstructorRequest) {
3423
3438
  case "auto":
3424
3439
  if (countMoves(inputs.alg.alg) < 100 && inputs.puzzle === "3x3x3" && inputs.visualizationStrategy === "Cube3D") {
3425
- return SimultaneousMoveIndexerV2;
3440
+ return SimultaneousMoveIndexer;
3426
3441
  } else {
3427
3442
  return TreeAlgIndexer;
3428
3443
  }
@@ -3431,7 +3446,7 @@ var IndexerConstructorProp = class extends TwistyPropDerived {
3431
3446
  case "simple":
3432
3447
  return SimpleAlgIndexer;
3433
3448
  case "simultaneous":
3434
- return SimultaneousMoveIndexerV2;
3449
+ return SimultaneousMoveIndexer;
3435
3450
  default:
3436
3451
  throw new Error("Invalid indexer request!");
3437
3452
  }
@@ -3461,7 +3476,7 @@ var PuzzleAlgProp = class extends TwistyPropDerived {
3461
3476
  // src/cubing/twisty/model/props/puzzle/state/AlgTransformationProp.ts
3462
3477
  var AlgTransformationProp = class extends TwistyPropDerived {
3463
3478
  derive(input) {
3464
- return input.kpuzzle.algToTransformation(input.alg.alg);
3479
+ return input.kpuzzle.algToTransformation(input.setupAlg.alg);
3465
3480
  }
3466
3481
  };
3467
3482
 
@@ -3472,16 +3487,19 @@ var IndexerProp = class extends TwistyPropDerived {
3472
3487
  }
3473
3488
  };
3474
3489
 
3475
- // src/cubing/twisty/model/props/puzzle/state/AnchoredStartProp.ts
3476
- var AnchoredStartProp = class extends TwistyPropDerived {
3490
+ // src/cubing/twisty/model/props/puzzle/state/AnchorTransformationProp.ts
3491
+ var AnchorTransformationProp = class extends TwistyPropDerived {
3477
3492
  derive(inputs) {
3493
+ if (inputs.setupTransformation) {
3494
+ return inputs.setupTransformation;
3495
+ }
3478
3496
  switch (inputs.setupAnchor) {
3479
3497
  case "start":
3480
- return inputs.setupTransformation;
3498
+ return inputs.setupAlgTransformation;
3481
3499
  case "end": {
3482
3500
  const algTransformation = inputs.indexer.transformationAtIndex(inputs.indexer.numAnimatedLeaves());
3483
3501
  const inverseAlgTransformation = algTransformation.invert();
3484
- return inputs.setupTransformation.applyTransformation(inverseAlgTransformation);
3502
+ return inputs.setupAlgTransformation.applyTransformation(inverseAlgTransformation);
3485
3503
  }
3486
3504
  default:
3487
3505
  throw new Error("Unimplemented!");
@@ -3712,127 +3730,148 @@ var FoundationDisplayProp = class extends SimpleTwistyPropSource {
3712
3730
  }
3713
3731
  };
3714
3732
 
3733
+ // src/cubing/twisty/model/props/puzzle/state/SetupTransformationProp.ts
3734
+ var SetupTransformationProp = class extends SimpleTwistyPropSource {
3735
+ getDefaultValue() {
3736
+ return null;
3737
+ }
3738
+ };
3739
+
3715
3740
  // src/cubing/twisty/model/TwistyPlayerModel.ts
3716
3741
  var TwistyPlayerModel = class {
3717
3742
  constructor() {
3718
3743
  this.userVisibleErrorTracker = new UserVisibleErrorTracker();
3719
- this.algProp = new AlgProp();
3720
- this.backgroundProp = new BackgroundProp();
3721
- this.backViewProp = new BackViewProp();
3722
- this.controlPanelProp = new ControlPanelProp();
3723
- this.catchUpMoveProp = new CatchUpMoveProp();
3724
- this.foundationDisplayProp = new FoundationDisplayProp();
3744
+ this.alg = new AlgProp();
3745
+ this.background = new BackgroundProp();
3746
+ this.backView = new BackViewProp();
3747
+ this.controlPanel = new ControlPanelProp();
3748
+ this.catchUpMove = new CatchUpMoveProp();
3749
+ this.foundationDisplay = new FoundationDisplayProp();
3725
3750
  this.foundationStickerSpriteURL = new URLProp();
3726
- this.hintFaceletProp = new HintFaceletProp();
3751
+ this.hintFacelet = new HintFaceletProp();
3727
3752
  this.hintStickerSpriteURL = new URLProp();
3728
- this.indexerConstructorRequestProp = new IndexerConstructorRequestProp();
3729
- this.latitudeLimitProp = new LatitudeLimitProp();
3730
- this.movePressInputProp = new MovePressInputProp();
3731
- this.orbitCoordinatesRequestProp = new OrbitCoordinatesRequestProp();
3732
- this.playingInfoProp = new PlayingInfoProp();
3733
- this.puzzleDescriptionRequestProp = new PGPuzzleDescriptionStringProp();
3734
- this.puzzleIDRequestProp = new PuzzleIDRequestProp();
3735
- this.setupAnchorProp = new SetupAnchorProp();
3736
- this.setupProp = new AlgProp();
3737
- this.stickeringProp = new StickeringProp();
3738
- this.tempoScaleProp = new TempoScaleProp();
3739
- this.timestampRequestProp = new TimestampRequestProp();
3740
- this.viewerLinkProp = new ViewerLinkProp();
3741
- this.visualizationFormatProp = new VisualizationFormatProp();
3753
+ this.indexerConstructorRequest = new IndexerConstructorRequestProp();
3754
+ this.latitudeLimit = new LatitudeLimitProp();
3755
+ this.movePressInput = new MovePressInputProp();
3756
+ this.orbitCoordinatesRequest = new OrbitCoordinatesRequestProp();
3757
+ this.playingInfo = new PlayingInfoProp();
3758
+ this.puzzleDescriptionRequest = new PGPuzzleDescriptionStringProp();
3759
+ this.puzzleIDRequest = new PuzzleIDRequestProp();
3760
+ this.setupAnchor = new SetupAnchorProp();
3761
+ this.setupAlg = new AlgProp();
3762
+ this.setupTransformation = new SetupTransformationProp();
3763
+ this.stickering = new StickeringProp();
3764
+ this.tempoScale = new TempoScaleProp();
3765
+ this.timestampRequest = new TimestampRequestProp();
3766
+ this.viewerLink = new ViewerLinkProp();
3767
+ this.visualizationFormat = new VisualizationFormatProp();
3742
3768
  this.foundationStickerSprite = new SpriteProp({
3743
3769
  spriteURL: this.foundationStickerSpriteURL
3744
3770
  });
3745
3771
  this.hintStickerSprite = new SpriteProp({
3746
3772
  spriteURL: this.hintStickerSpriteURL
3747
3773
  });
3748
- this.puzzleLoaderProp = new PuzzleLoaderProp({
3749
- puzzleIDRequest: this.puzzleIDRequestProp,
3750
- puzzleDescriptionRequest: this.puzzleDescriptionRequestProp
3774
+ this.puzzleLoader = new PuzzleLoaderProp({
3775
+ puzzleIDRequest: this.puzzleIDRequest,
3776
+ puzzleDescriptionRequest: this.puzzleDescriptionRequest
3751
3777
  }, this.userVisibleErrorTracker);
3752
- this.kpuzzleProp = new KPuzzleProp({ puzzleLoader: this.puzzleLoaderProp });
3753
- this.puzzleIDProp = new PuzzleIDProp({ puzzleLoader: this.puzzleLoaderProp });
3754
- this.puzzleAlgProp = new PuzzleAlgProp({
3755
- algWithIssues: this.algProp,
3756
- kpuzzle: this.kpuzzleProp
3778
+ this.kpuzzle = new KPuzzleProp({ puzzleLoader: this.puzzleLoader });
3779
+ this.puzzleID = new PuzzleIDProp({ puzzleLoader: this.puzzleLoader });
3780
+ this.puzzleAlg = new PuzzleAlgProp({
3781
+ algWithIssues: this.alg,
3782
+ kpuzzle: this.kpuzzle
3757
3783
  });
3758
- this.puzzleSetupProp = new PuzzleAlgProp({
3759
- algWithIssues: this.setupProp,
3760
- kpuzzle: this.kpuzzleProp
3784
+ this.puzzleSetupAlg = new PuzzleAlgProp({
3785
+ algWithIssues: this.setupAlg,
3786
+ kpuzzle: this.kpuzzle
3761
3787
  });
3762
- this.visualizationStrategyProp = new VisualizationStrategyProp({
3763
- visualizationRequest: this.visualizationFormatProp,
3764
- puzzleID: this.puzzleIDProp
3788
+ this.visualizationStrategy = new VisualizationStrategyProp({
3789
+ visualizationRequest: this.visualizationFormat,
3790
+ puzzleID: this.puzzleID
3765
3791
  });
3766
- this.indexerConstructorProp = new IndexerConstructorProp({
3767
- alg: this.algProp,
3768
- puzzle: this.puzzleIDProp,
3769
- visualizationStrategy: this.visualizationStrategyProp,
3770
- indexerConstructorRequest: this.indexerConstructorRequestProp
3792
+ this.indexerConstructor = new IndexerConstructorProp({
3793
+ alg: this.alg,
3794
+ puzzle: this.puzzleID,
3795
+ visualizationStrategy: this.visualizationStrategy,
3796
+ indexerConstructorRequest: this.indexerConstructorRequest
3771
3797
  });
3772
- this.moveCountProp = new NaiveMoveCountProp({ alg: this.puzzleAlgProp });
3773
- this.orbitCoordinatesProp = new OrbitCoordinatesProp({
3774
- orbitCoordinatesRequest: this.orbitCoordinatesRequestProp,
3775
- latitudeLimit: this.latitudeLimitProp,
3776
- puzzleID: this.puzzleIDProp,
3777
- strategy: this.visualizationStrategyProp
3798
+ this.moveCount = new NaiveMoveCountProp({ alg: this.puzzleAlg });
3799
+ this.orbitCoordinates = new OrbitCoordinatesProp({
3800
+ orbitCoordinatesRequest: this.orbitCoordinatesRequest,
3801
+ latitudeLimit: this.latitudeLimit,
3802
+ puzzleID: this.puzzleID,
3803
+ strategy: this.visualizationStrategy
3778
3804
  });
3779
- this.setupTransformationProp = new AlgTransformationProp({
3780
- alg: this.puzzleSetupProp,
3781
- kpuzzle: this.kpuzzleProp
3805
+ this.setupAlgTransformation = new AlgTransformationProp({
3806
+ setupAlg: this.puzzleSetupAlg,
3807
+ kpuzzle: this.kpuzzle
3782
3808
  });
3783
- this.indexerProp = new IndexerProp({
3784
- indexerConstructor: this.indexerConstructorProp,
3785
- algWithIssues: this.puzzleAlgProp,
3786
- kpuzzle: this.kpuzzleProp
3809
+ this.indexer = new IndexerProp({
3810
+ indexerConstructor: this.indexerConstructor,
3811
+ algWithIssues: this.puzzleAlg,
3812
+ kpuzzle: this.kpuzzle
3787
3813
  });
3788
- this.anchoredStartProp = new AnchoredStartProp({
3789
- setupAnchor: this.setupAnchorProp,
3790
- setupTransformation: this.setupTransformationProp,
3791
- indexer: this.indexerProp
3814
+ this.anchorTransformation = new AnchorTransformationProp({
3815
+ setupTransformation: this.setupTransformation,
3816
+ setupAnchor: this.setupAnchor,
3817
+ setupAlgTransformation: this.setupAlgTransformation,
3818
+ indexer: this.indexer
3792
3819
  });
3793
- this.timeRangeProp = new TimeRangeProp({
3794
- indexer: this.indexerProp
3820
+ this.timeRange = new TimeRangeProp({
3821
+ indexer: this.indexer
3795
3822
  });
3796
- this.detailedTimelineInfoProp = new DetailedTimelineInfoProp({
3797
- timestampRequest: this.timestampRequestProp,
3798
- timeRange: this.timeRangeProp,
3799
- setupAnchor: this.setupAnchorProp
3823
+ this.detailedTimelineInfo = new DetailedTimelineInfoProp({
3824
+ timestampRequest: this.timestampRequest,
3825
+ timeRange: this.timeRange,
3826
+ setupAnchor: this.setupAnchor
3800
3827
  });
3801
- this.coarseTimelineInfoProp = new CoarseTimelineInfoProp({
3802
- detailedTimelineInfo: this.detailedTimelineInfoProp,
3803
- playingInfo: this.playingInfoProp
3828
+ this.coarseTimelineInfo = new CoarseTimelineInfoProp({
3829
+ detailedTimelineInfo: this.detailedTimelineInfo,
3830
+ playingInfo: this.playingInfo
3804
3831
  });
3805
- this.currentMoveInfoProp = new CurrentMoveInfoProp({
3806
- indexer: this.indexerProp,
3807
- detailedTimelineInfo: this.detailedTimelineInfoProp,
3808
- catchUpMove: this.catchUpMoveProp
3832
+ this.currentMoveInfo = new CurrentMoveInfoProp({
3833
+ indexer: this.indexer,
3834
+ detailedTimelineInfo: this.detailedTimelineInfo,
3835
+ catchUpMove: this.catchUpMove
3809
3836
  });
3810
- this.buttonAppearanceProp = new ButtonAppearanceProp({
3811
- coarseTimelineInfo: this.coarseTimelineInfoProp,
3812
- viewerLink: this.viewerLinkProp
3837
+ this.buttonAppearance = new ButtonAppearanceProp({
3838
+ coarseTimelineInfo: this.coarseTimelineInfo,
3839
+ viewerLink: this.viewerLink
3813
3840
  });
3814
- this.currentLeavesSimplifiedProp = new CurrentLeavesSimplifiedProp({
3815
- currentMoveInfo: this.currentMoveInfoProp
3841
+ this.currentLeavesSimplified = new CurrentLeavesSimplifiedProp({
3842
+ currentMoveInfo: this.currentMoveInfo
3816
3843
  });
3817
- this.currentStateProp = new CurrentStateProp({
3818
- anchoredStart: this.anchoredStartProp,
3819
- currentLeavesSimplified: this.currentLeavesSimplifiedProp,
3820
- indexer: this.indexerProp
3844
+ this.currentState = new CurrentStateProp({
3845
+ anchoredStart: this.anchorTransformation,
3846
+ currentLeavesSimplified: this.currentLeavesSimplified,
3847
+ indexer: this.indexer
3821
3848
  });
3822
- this.legacyPositionProp = new LegacyPositionProp({
3823
- currentMoveInfo: this.currentMoveInfoProp,
3824
- state: this.currentStateProp
3849
+ this.legacyPosition = new LegacyPositionProp({
3850
+ currentMoveInfo: this.currentMoveInfo,
3851
+ state: this.currentState
3825
3852
  });
3826
3853
  }
3827
3854
  async twizzleLink() {
3828
- const url = new URL("https://alpha.twizzle.net/edit/");
3829
- const [puzzle, alg, setup, anchor, experimentalStickering] = await Promise.all([
3830
- this.puzzleIDProp.get(),
3831
- this.algProp.get(),
3832
- this.setupProp.get(),
3833
- this.setupAnchorProp.get(),
3834
- this.stickeringProp.get()
3855
+ const [
3856
+ viewerLink,
3857
+ puzzleID,
3858
+ puzzleDescription,
3859
+ alg,
3860
+ setup,
3861
+ anchor,
3862
+ experimentalStickering
3863
+ ] = await Promise.all([
3864
+ this.viewerLink.get(),
3865
+ this.puzzleID.get(),
3866
+ this.puzzleDescriptionRequest.get(),
3867
+ this.alg.get(),
3868
+ this.setupAlg.get(),
3869
+ this.setupAnchor.get(),
3870
+ this.stickering.get()
3835
3871
  ]);
3872
+ const isExplorer = viewerLink === "experimental-twizzle-explorer";
3873
+ console.log({ isExplorer, viewerLink });
3874
+ const url = new URL(`https://alpha.twizzle.net/${isExplorer ? "explore" : "edit"}/`);
3836
3875
  if (!alg.alg.experimentalIsEmpty()) {
3837
3876
  url.searchParams.set("alg", alg.alg.toString());
3838
3877
  }
@@ -3845,27 +3884,33 @@ var TwistyPlayerModel = class {
3845
3884
  if (experimentalStickering !== "full") {
3846
3885
  url.searchParams.set("experimental-stickering", experimentalStickering);
3847
3886
  }
3848
- if (puzzle !== "3x3x3") {
3849
- url.searchParams.set("puzzle", puzzle);
3887
+ if (isExplorer && puzzleDescription !== NO_VALUE) {
3888
+ url.searchParams.set("puzzle-description", puzzleDescription);
3889
+ } else if (puzzleID !== "3x3x3") {
3890
+ url.searchParams.set("puzzle", puzzleID);
3850
3891
  }
3851
3892
  return url.toString();
3852
3893
  }
3853
3894
  experimentalAddMove(flexibleMove, options = {}) {
3854
3895
  const move = typeof flexibleMove === "string" ? new Move(flexibleMove) : flexibleMove;
3855
3896
  (async () => {
3856
- const alg = (await this.algProp.get()).alg;
3897
+ const alg = (await this.alg.get()).alg;
3857
3898
  const newAlg = experimentalAppendMove(alg, move, {
3858
3899
  coalesce: options?.coalesce,
3859
3900
  mod: options?.mod
3860
3901
  });
3861
- this.algProp.set(newAlg);
3862
- this.timestampRequestProp.set("end");
3863
- this.catchUpMoveProp.set({
3902
+ this.alg.set(newAlg);
3903
+ this.timestampRequest.set("end");
3904
+ this.catchUpMove.set({
3864
3905
  move,
3865
3906
  amount: 0
3866
3907
  });
3867
3908
  })();
3868
3909
  }
3910
+ get playingInfoProp() {
3911
+ console.warn("Using deprecated prop: `playingInfoProp`. Please switch to: `playingInfo`");
3912
+ return this.playingInfo;
3913
+ }
3869
3914
  };
3870
3915
 
3871
3916
  // src/cubing/twisty/views/TwistyPlayerSettable.ts
@@ -3879,121 +3924,121 @@ var TwistyPlayerSettable = class extends ManagedCustomElement {
3879
3924
  this.experimentalGet = new ExperimentalGetters(this.experimentalModel);
3880
3925
  }
3881
3926
  set alg(newAlg) {
3882
- this.experimentalModel.algProp.set(newAlg);
3927
+ this.experimentalModel.alg.set(newAlg);
3883
3928
  }
3884
3929
  get alg() {
3885
3930
  throw err("alg");
3886
3931
  }
3887
3932
  set experimentalSetupAlg(newSetup) {
3888
- this.experimentalModel.setupProp.set(newSetup);
3933
+ this.experimentalModel.setupAlg.set(newSetup);
3889
3934
  }
3890
3935
  get experimentalSetupAlg() {
3891
3936
  throw err("setup");
3892
3937
  }
3893
3938
  set experimentalSetupAnchor(anchor) {
3894
- this.experimentalModel.setupAnchorProp.set(anchor);
3939
+ this.experimentalModel.setupAnchor.set(anchor);
3895
3940
  }
3896
3941
  get experimentalSetupAnchor() {
3897
3942
  throw err("anchor");
3898
3943
  }
3899
3944
  set puzzle(puzzleID) {
3900
- this.experimentalModel.puzzleIDRequestProp.set(puzzleID);
3945
+ this.experimentalModel.puzzleIDRequest.set(puzzleID);
3901
3946
  }
3902
3947
  get puzzle() {
3903
3948
  throw err("puzzle");
3904
3949
  }
3905
3950
  set experimentalPuzzleDescription(puzzleDescription) {
3906
- this.experimentalModel.puzzleDescriptionRequestProp.set(puzzleDescription);
3951
+ this.experimentalModel.puzzleDescriptionRequest.set(puzzleDescription);
3907
3952
  }
3908
3953
  get experimentalPuzzleDescription() {
3909
3954
  throw err("experimentalPuzzleDescription");
3910
3955
  }
3911
3956
  set timestamp(timestamp) {
3912
- this.experimentalModel.timestampRequestProp.set(timestamp);
3957
+ this.experimentalModel.timestampRequest.set(timestamp);
3913
3958
  }
3914
3959
  get timestamp() {
3915
3960
  throw err("timestamp");
3916
3961
  }
3917
3962
  set hintFacelets(hintFaceletStyle) {
3918
- this.experimentalModel.hintFaceletProp.set(hintFaceletStyle);
3963
+ this.experimentalModel.hintFacelet.set(hintFaceletStyle);
3919
3964
  }
3920
3965
  get hintFacelets() {
3921
3966
  throw err("hintFacelets");
3922
3967
  }
3923
3968
  set experimentalStickering(stickering) {
3924
- this.experimentalModel.stickeringProp.set(stickering);
3969
+ this.experimentalModel.stickering.set(stickering);
3925
3970
  }
3926
3971
  get experimentalStickering() {
3927
3972
  throw err("stickering");
3928
3973
  }
3929
3974
  set backView(backView) {
3930
- this.experimentalModel.backViewProp.set(backView);
3975
+ this.experimentalModel.backView.set(backView);
3931
3976
  }
3932
3977
  get backView() {
3933
3978
  throw err("backView");
3934
3979
  }
3935
3980
  set background(backgroundTheme) {
3936
- this.experimentalModel.backgroundProp.set(backgroundTheme);
3981
+ this.experimentalModel.background.set(backgroundTheme);
3937
3982
  }
3938
3983
  get background() {
3939
3984
  throw err("background");
3940
3985
  }
3941
3986
  set controlPanel(newControlPanel) {
3942
- this.experimentalModel.controlPanelProp.set(newControlPanel);
3987
+ this.experimentalModel.controlPanel.set(newControlPanel);
3943
3988
  }
3944
3989
  get controlPanel() {
3945
3990
  throw err("controlPanel");
3946
3991
  }
3947
3992
  set visualization(visualizationFormat) {
3948
- this.experimentalModel.visualizationFormatProp.set(visualizationFormat);
3993
+ this.experimentalModel.visualizationFormat.set(visualizationFormat);
3949
3994
  }
3950
3995
  get visualization() {
3951
3996
  throw err("visualization");
3952
3997
  }
3953
3998
  set viewerLink(viewerLinkPage) {
3954
- this.experimentalModel.viewerLinkProp.set(viewerLinkPage);
3999
+ this.experimentalModel.viewerLink.set(viewerLinkPage);
3955
4000
  }
3956
4001
  get viewerLink() {
3957
4002
  throw err("viewerLink");
3958
4003
  }
3959
4004
  set experimentalMovePressInput(movePressInput) {
3960
- this.experimentalModel.movePressInputProp.set(movePressInput);
4005
+ this.experimentalModel.movePressInput.set(movePressInput);
3961
4006
  }
3962
4007
  get experimentalMovePressInput() {
3963
4008
  throw err("experimentalMovePressInput");
3964
4009
  }
3965
4010
  set cameraLatitude(latitude) {
3966
- this.experimentalModel.orbitCoordinatesRequestProp.set({ latitude });
4011
+ this.experimentalModel.orbitCoordinatesRequest.set({ latitude });
3967
4012
  }
3968
4013
  get cameraLatitude() {
3969
4014
  throw err("cameraLatitude");
3970
4015
  }
3971
4016
  set cameraLongitude(longitude) {
3972
- this.experimentalModel.orbitCoordinatesRequestProp.set({ longitude });
4017
+ this.experimentalModel.orbitCoordinatesRequest.set({ longitude });
3973
4018
  }
3974
4019
  get cameraLongitude() {
3975
4020
  throw err("cameraLongitude");
3976
4021
  }
3977
4022
  set cameraDistance(distance) {
3978
- this.experimentalModel.orbitCoordinatesRequestProp.set({ distance });
4023
+ this.experimentalModel.orbitCoordinatesRequest.set({ distance });
3979
4024
  }
3980
4025
  get cameraDistance() {
3981
4026
  throw err("cameraDistance");
3982
4027
  }
3983
4028
  set cameraLatitudeLimit(latitudeLimit) {
3984
- this.experimentalModel.latitudeLimitProp.set(latitudeLimit);
4029
+ this.experimentalModel.latitudeLimit.set(latitudeLimit);
3985
4030
  }
3986
4031
  get cameraLatitudeLimit() {
3987
4032
  throw err("cameraLatitudeLimit");
3988
4033
  }
3989
4034
  set indexer(indexer) {
3990
- this.experimentalModel.indexerConstructorRequestProp.set(indexer);
4035
+ this.experimentalModel.indexerConstructorRequest.set(indexer);
3991
4036
  }
3992
4037
  get indexer() {
3993
4038
  throw err("indexer");
3994
4039
  }
3995
4040
  set tempoScale(newTempoScale) {
3996
- this.experimentalModel.tempoScaleProp.set(newTempoScale);
4041
+ this.experimentalModel.tempoScale.set(newTempoScale);
3997
4042
  }
3998
4043
  get tempoScale() {
3999
4044
  throw err("tempoScale");
@@ -4016,16 +4061,16 @@ var ExperimentalGetters = class {
4016
4061
  this.model = model;
4017
4062
  }
4018
4063
  async alg() {
4019
- return (await this.model.algProp.get()).alg;
4064
+ return (await this.model.alg.get()).alg;
4020
4065
  }
4021
4066
  async setupAlg() {
4022
- return (await this.model.setupProp.get()).alg;
4067
+ return (await this.model.setupAlg.get()).alg;
4023
4068
  }
4024
4069
  puzzleID() {
4025
- return this.model.puzzleIDProp.get();
4070
+ return this.model.puzzleID.get();
4026
4071
  }
4027
4072
  async timestamp() {
4028
- return (await this.model.detailedTimelineInfoProp.get()).timestamp;
4073
+ return (await this.model.detailedTimelineInfo.get()).timestamp;
4029
4074
  }
4030
4075
  };
4031
4076
 
@@ -4091,18 +4136,18 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4091
4136
  __privateGet(this, _errorElem).textContent = errorString;
4092
4137
  }
4093
4138
  });
4094
- const scrubber = new TwistyScrubberV2(this.experimentalModel);
4139
+ const scrubber = new TwistyScrubber(this.experimentalModel);
4095
4140
  this.contentWrapper.appendChild(scrubber);
4096
- this.buttons = new TwistyButtonsV2(this.experimentalModel, this.controller, this);
4141
+ this.buttons = new TwistyButtons(this.experimentalModel, this.controller, this);
4097
4142
  this.contentWrapper.appendChild(this.buttons);
4098
- this.experimentalModel.backgroundProp.addFreshListener((backgroundTheme) => {
4143
+ this.experimentalModel.background.addFreshListener((backgroundTheme) => {
4099
4144
  this.contentWrapper.classList.toggle("checkered", backgroundTheme !== "none");
4100
4145
  });
4101
- this.experimentalModel.controlPanelProp.addFreshListener((controlPanel) => {
4146
+ this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
4102
4147
  __privateGet(this, _controlsManager).setValue(controlPanel);
4103
4148
  });
4104
- this.experimentalModel.visualizationStrategyProp.addFreshListener(__privateMethod(this, _setVisualizationWrapper, setVisualizationWrapper_fn).bind(this));
4105
- this.experimentalModel.puzzleIDProp.addFreshListener(this.flash.bind(this));
4149
+ this.experimentalModel.visualizationStrategy.addFreshListener(__privateMethod(this, _setVisualizationWrapper, setVisualizationWrapper_fn).bind(this));
4150
+ this.experimentalModel.puzzleID.addFreshListener(this.flash.bind(this));
4106
4151
  }
4107
4152
  flash() {
4108
4153
  __privateGet(this, _visualizationWrapper)?.animate([{ opacity: 0.25 }, { opacity: 1 }], {
@@ -4161,7 +4206,7 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4161
4206
  return (await screenshot(this.experimentalModel, options)).dataURL;
4162
4207
  }
4163
4208
  async experimentalDownloadScreenshot(filename) {
4164
- if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategyProp.get())) {
4209
+ if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategy.get())) {
4165
4210
  const wrapper2D = __privateGet(this, _visualizationWrapper);
4166
4211
  const twisty2DPuzzle = await wrapper2D.currentTwisty2DPuzzleWrapper().twisty2DPuzzle();
4167
4212
  const str = new XMLSerializer().serializeToString(twisty2DPuzzle.svg.element);
@@ -4475,13 +4520,13 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4475
4520
  return;
4476
4521
  }
4477
4522
  this.twistyPlayer = twistyPlayer;
4478
- this.twistyPlayer.experimentalModel.algProp.addFreshListener((algWithIssues) => {
4523
+ this.twistyPlayer.experimentalModel.alg.addFreshListener((algWithIssues) => {
4479
4524
  this.setAlg(algWithIssues.alg);
4480
4525
  });
4481
- const sourceAlg = (await this.twistyPlayer.experimentalModel.algProp.get()).alg;
4526
+ const sourceAlg = (await this.twistyPlayer.experimentalModel.alg.get()).alg;
4482
4527
  const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
4483
4528
  this.setAlg(parsedAlg);
4484
- twistyPlayer.experimentalModel.currentMoveInfoProp.addFreshListener((currentMoveInfo) => {
4529
+ twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener((currentMoveInfo) => {
4485
4530
  let moveInfo = currentMoveInfo.currentMoves[0];
4486
4531
  moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4487
4532
  moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
@@ -4492,7 +4537,7 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4492
4537
  this.highlighter.set(mainCurrentMove);
4493
4538
  }
4494
4539
  });
4495
- twistyPlayer.experimentalModel.detailedTimelineInfoProp.addFreshListener((detailedTimelineInfo) => {
4540
+ twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener((detailedTimelineInfo) => {
4496
4541
  if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4497
4542
  this.lastClickTimestamp = null;
4498
4543
  }
@@ -4503,11 +4548,11 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4503
4548
  if (twistyPlayer) {
4504
4549
  twistyPlayer.pause();
4505
4550
  const timestampPromise = (async () => {
4506
- const indexer = await twistyPlayer.experimentalModel.indexerProp.get();
4551
+ const indexer = await twistyPlayer.experimentalModel.indexer.get();
4507
4552
  const offset = offsetIntoMove ? DEFAULT_OFFSET_MS : 0;
4508
4553
  return (indexer.indexToMoveStartTimestamp(index) ?? -offset) + offset;
4509
4554
  })();
4510
- twistyPlayer.experimentalModel.timestampRequestProp.set(await timestampPromise);
4555
+ twistyPlayer.experimentalModel.timestampRequest.set(await timestampPromise);
4511
4556
  if (this.lastClickTimestamp === await timestampPromise) {
4512
4557
  twistyPlayer.play();
4513
4558
  this.lastClickTimestamp = null;
@@ -4826,8 +4871,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4826
4871
  if (options?.twistyPlayer) {
4827
4872
  this.twistyPlayer = options.twistyPlayer;
4828
4873
  }
4829
- __privateSet(this, _twistyPlayerProp, options?.twistyPlayerProp ?? "algProp");
4830
- if (options?.twistyPlayerProp === "algProp") {
4874
+ __privateSet(this, _twistyPlayerProp, options?.twistyPlayerProp ?? "alg");
4875
+ if (options?.twistyPlayerProp === "alg") {
4831
4876
  this.model.leafToHighlight.addFreshListener((highlightInfo) => {
4832
4877
  if (highlightInfo) {
4833
4878
  this.highlightLeaf(highlightInfo.leafInfo.leaf);
@@ -4856,7 +4901,7 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4856
4901
  if (document.activeElement !== this || this.shadow.activeElement !== __privateGet(this, _textarea)) {
4857
4902
  return;
4858
4903
  }
4859
- if (__privateGet(this, _twistyPlayerProp) !== "algProp") {
4904
+ if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4860
4905
  return;
4861
4906
  }
4862
4907
  const { selectionStart, selectionEnd } = __privateGet(this, _textarea);
@@ -4871,7 +4916,7 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4871
4916
  __privateGet(this, _textareaClassListValidForPuzzleManager).setValue(issues);
4872
4917
  }
4873
4918
  highlightLeaf(leaf) {
4874
- if (__privateGet(this, _twistyPlayerProp) !== "algProp") {
4919
+ if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4875
4920
  return;
4876
4921
  }
4877
4922
  if (leaf === null) {
@@ -4904,8 +4949,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4904
4949
  (async () => {
4905
4950
  this.algString = __privateGet(this, _algProp, algProp_get) ? (await __privateGet(this, _algProp, algProp_get).get()).alg.toString() : "";
4906
4951
  })();
4907
- if (__privateGet(this, _twistyPlayerProp) === "algProp") {
4908
- __privateGet(this, _twistyPlayer)?.experimentalModel.puzzleAlgProp.addFreshListener((algWithIssues) => {
4952
+ if (__privateGet(this, _twistyPlayerProp) === "alg") {
4953
+ __privateGet(this, _twistyPlayer)?.experimentalModel.puzzleAlg.addFreshListener((algWithIssues) => {
4909
4954
  if (algWithIssues.issues.errors.length === 0) {
4910
4955
  this.setAlgIssueClassForPuzzle(algWithIssues.issues.warnings.length === 0 ? "none" : "warning");
4911
4956
  const newAlg = algWithIssues.alg;
@@ -4924,8 +4969,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4924
4969
  return;
4925
4970
  }
4926
4971
  const [indexer, timestampRequest] = await Promise.all([
4927
- await twistyPlayer.experimentalModel.indexerProp.get(),
4928
- await twistyPlayer.experimentalModel.timestampRequestProp.get()
4972
+ await twistyPlayer.experimentalModel.indexer.get(),
4973
+ await twistyPlayer.experimentalModel.timestampRequest.get()
4929
4974
  ]);
4930
4975
  if (timestampRequest === "opposite-anchor" && !__privateGet(this, _onInputHasFired)) {
4931
4976
  return;
@@ -4950,11 +4995,11 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4950
4995
  throw new Error("Invalid where!");
4951
4996
  }
4952
4997
  if (!this.debugNeverRequestTimestamp) {
4953
- twistyPlayer.experimentalModel.timestampRequestProp.set(newTimestamp);
4998
+ twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4954
4999
  }
4955
5000
  });
4956
- twistyPlayer.experimentalModel.currentLeavesSimplifiedProp.addFreshListener(async (currentLeavesSimplified) => {
4957
- const indexer = await twistyPlayer.experimentalModel.indexerProp.get();
5001
+ twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(async (currentLeavesSimplified) => {
5002
+ const indexer = await twistyPlayer.experimentalModel.indexer.get();
4958
5003
  const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
4959
5004
  this.highlightLeaf(leaf);
4960
5005
  });
@@ -5040,6 +5085,8 @@ var twizzleLinkCSS = new CSSSource(`
5040
5085
 
5041
5086
  twisty-player {
5042
5087
  width: 100%;
5088
+ resize: vertical;
5089
+ overflow-y: hidden;
5043
5090
  }
5044
5091
 
5045
5092
  twisty-player + .heading {
@@ -5056,12 +5103,12 @@ var URLParamUpdater = class {
5056
5103
  constructor(model, options) {
5057
5104
  __privateAdd(this, _prefix, void 0);
5058
5105
  __privateSet(this, _prefix, options?.prefix ?? "");
5059
- this.listenToAlgProp(model.algProp, "alg");
5060
- this.listenToAlgProp(model.setupProp, "setup-alg");
5061
- this.listenToStringSourceProp(model.stickeringProp, "stickering");
5062
- this.listenToStringSourceProp(model.setupAnchorProp, "setup-anchor");
5063
- this.listenToStringOrNoValueProp(model.puzzleIDRequestProp, "puzzle", NO_VALUE);
5064
- this.listenToStringOrNoValueProp(model.puzzleDescriptionRequestProp, "puzzle-description", NO_VALUE);
5106
+ this.listenToAlgProp(model.alg, "alg");
5107
+ this.listenToAlgProp(model.setupAlg, "setup-alg");
5108
+ this.listenToStringSourceProp(model.stickering, "stickering");
5109
+ this.listenToStringSourceProp(model.setupAnchor, "setup-anchor");
5110
+ this.listenToStringOrNoValueProp(model.puzzleIDRequest, "puzzle", NO_VALUE);
5111
+ this.listenToStringOrNoValueProp(model.puzzleDescriptionRequest, "puzzle-description", NO_VALUE);
5065
5112
  }
5066
5113
  setURLParam(unprefixedKey, value, defaultString) {
5067
5114
  const prefixedKey = __privateGet(this, _prefix) + unprefixedKey;
@@ -5109,7 +5156,6 @@ function getConfigFromURL(prefix = "", url = location.href) {
5109
5156
  };
5110
5157
  const params = new URL(url).searchParams;
5111
5158
  const config = {};
5112
- console.log(paramMapping);
5113
5159
  for (const [ourParam, twistyPlayerParam] of Object.entries(paramMapping)) {
5114
5160
  const paramValue = params.get(prefix + ourParam);
5115
5161
  if (paramValue !== null) {
@@ -5121,18 +5167,50 @@ function getConfigFromURL(prefix = "", url = location.href) {
5121
5167
  }
5122
5168
 
5123
5169
  // src/cubing/twisty/views/twizzle/TwizzleLink.ts
5170
+ var _cssElem;
5124
5171
  var TwizzleLink = class extends ManagedCustomElement {
5125
5172
  constructor() {
5126
5173
  super({ mode: "open" });
5127
5174
  this.twistyPlayer = null;
5128
5175
  this.a = null;
5176
+ __privateAdd(this, _cssElem, void 0);
5129
5177
  }
5130
- connectedCallback() {
5131
- this.addCSS(twizzleLinkCSS);
5132
- this.a = this.querySelector("a");
5178
+ fallback() {
5179
+ this.contentWrapper.textContent = "";
5133
5180
  if (this.a) {
5134
- const config = getConfigFromURL("", this.a.href);
5135
- this.twistyPlayer = this.addElement(new TwistyPlayer(config));
5181
+ const span = this.contentWrapper.appendChild(document.createElement("span"));
5182
+ span.textContent = "\u2757\uFE0F";
5183
+ span.title = "Could not show a player for link";
5184
+ this.addElement(this.a);
5185
+ }
5186
+ if (__privateGet(this, _cssElem)) {
5187
+ __privateGet(this, _cssElem).remove();
5188
+ }
5189
+ }
5190
+ async connectedCallback() {
5191
+ __privateSet(this, _cssElem, this.addCSS(twizzleLinkCSS));
5192
+ this.a = this.querySelector("a");
5193
+ if (!this.a) {
5194
+ return;
5195
+ }
5196
+ const config = getConfigFromURL("", this.a.href);
5197
+ const href = this.a?.href;
5198
+ const { hostname, pathname } = new URL(href);
5199
+ if (hostname !== "alpha.twizzle.net") {
5200
+ this.fallback();
5201
+ return;
5202
+ }
5203
+ if (["/edit/", "/explore/"].includes(pathname)) {
5204
+ const isExplorer = pathname === "/explore/";
5205
+ if (config.puzzle && !(config.puzzle in puzzles)) {
5206
+ const puzzleDescription = (await import("../puzzle-geometry/index.js")).getPuzzleDescriptionString(config.puzzle);
5207
+ delete config.puzzle;
5208
+ config.experimentalPuzzleDescription = puzzleDescription;
5209
+ }
5210
+ this.twistyPlayer = this.addElement(new TwistyPlayer({
5211
+ ...config,
5212
+ viewerLink: isExplorer ? "experimental-twizzle-explorer" : "auto"
5213
+ }));
5136
5214
  if (config.experimentalSetupAlg) {
5137
5215
  this.addHeading("Setup");
5138
5216
  const setupAlgDiv = this.addElement(document.createElement("div"));
@@ -5142,6 +5220,8 @@ var TwizzleLink = class extends ManagedCustomElement {
5142
5220
  this.addHeading("Moves");
5143
5221
  const twistyAlgViewer = this.addElement(new TwistyAlgViewer({ twistyPlayer: this.twistyPlayer }));
5144
5222
  twistyAlgViewer.part.add("twisty-alg-viewer");
5223
+ } else {
5224
+ this.fallback();
5145
5225
  }
5146
5226
  }
5147
5227
  addHeading(text) {
@@ -5150,6 +5230,7 @@ var TwizzleLink = class extends ManagedCustomElement {
5150
5230
  headingDiv.textContent = text;
5151
5231
  }
5152
5232
  };
5233
+ _cssElem = new WeakMap();
5153
5234
  customElementsShim.define("twizzle-link", TwizzleLink);
5154
5235
  export {
5155
5236
  NO_VALUE as EXPERIMENTAL_PROP_NO_VALUE,