cubing 0.24.1 → 0.24.5

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 (69) hide show
  1. package/README.md +37 -7
  2. package/dist/esm/{2x2x2.sgs.json-2QRQG2UF.js → 2x2x2.sgs.json-EH524KJ3.js} +2 -2
  3. package/dist/esm/{2x2x2.sgs.json-2QRQG2UF.js.map → 2x2x2.sgs.json-EH524KJ3.js.map} +0 -0
  4. package/dist/esm/{3d-dynamic-inside-EQIKTTYZ.js → 3d-dynamic-inside-P5DSR3RN.js} +3 -4
  5. package/dist/esm/{3d-dynamic-inside-EQIKTTYZ.js.map → 3d-dynamic-inside-P5DSR3RN.js.map} +2 -2
  6. package/dist/esm/bluetooth/index.js +1 -1
  7. package/dist/esm/{chunk-42DBDQQX.js → chunk-62T523ZS.js} +2 -2
  8. package/dist/esm/{chunk-42DBDQQX.js.map → chunk-62T523ZS.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-YVHK2LDM.js → chunk-IVWBK3I7.js} +2 -2
  12. package/dist/esm/{chunk-YVHK2LDM.js.map → chunk-IVWBK3I7.js.map} +0 -0
  13. package/dist/esm/{chunk-ZDALYMGF.js → chunk-KRL5KQQK.js} +32 -3
  14. package/dist/esm/chunk-KRL5KQQK.js.map +7 -0
  15. package/dist/esm/{chunk-37CDJ45V.js → chunk-RQWADVHJ.js} +3 -3
  16. package/dist/esm/{chunk-37CDJ45V.js.map → chunk-RQWADVHJ.js.map} +0 -0
  17. package/dist/esm/{chunk-B6IDD5MD.js → chunk-S2IF3HZB.js} +2 -2
  18. package/dist/esm/{chunk-B6IDD5MD.js.map → chunk-S2IF3HZB.js.map} +0 -0
  19. package/dist/esm/{chunk-SLUMTYHP.js → chunk-T3IR6NP3.js} +4 -5
  20. package/dist/esm/chunk-T3IR6NP3.js.map +7 -0
  21. package/dist/esm/{chunk-LR6VCMD2.js → chunk-V5DHYMZ7.js} +2 -2
  22. package/dist/esm/{chunk-LR6VCMD2.js.map → chunk-V5DHYMZ7.js.map} +0 -0
  23. package/dist/esm/{entry-UARUM747.js → entry-5ASY5DZU.js} +14 -14
  24. package/dist/esm/{entry-UARUM747.js.map → entry-5ASY5DZU.js.map} +0 -0
  25. package/dist/esm/{fto.sgs.json-DKPRQRDL.js → fto.sgs.json-ADHMZWSD.js} +2 -2
  26. package/dist/esm/{fto.sgs.json-DKPRQRDL.js.map → fto.sgs.json-ADHMZWSD.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-7NBG44KF.js → module-entry-HW3RWVEP.js} +2 -2
  30. package/dist/esm/{module-entry-7NBG44KF.js.map → module-entry-HW3RWVEP.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-KGPI57MS.js → pyraminx.sgs.json-W4FJVYCV.js} +3 -3
  34. package/dist/esm/{pyraminx.sgs.json-KGPI57MS.js.map → pyraminx.sgs.json-W4FJVYCV.js.map} +0 -0
  35. package/dist/esm/scramble/index.js +3 -3
  36. package/dist/esm/{scramble_444-M3Q3OZN3.js → scramble_444-QBE4UGPU.js} +3 -3
  37. package/dist/esm/{scramble_444-M3Q3OZN3.js.map → scramble_444-QBE4UGPU.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 +301 -251
  42. package/dist/esm/twisty/index.js.map +3 -3
  43. package/dist/esm/{worker-inside-generated-string-6QDQTUCQ.js → worker-inside-generated-string-XYHIVIPG.js} +21 -21
  44. package/dist/esm/worker-inside-generated-string-XYHIVIPG.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/model/TwistyPlayerModel.d.ts +46 -42
  51. package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts +1 -1
  52. package/dist/types/twisty/model/props/puzzle/state/AnchorTransformationProp.d.ts +14 -0
  53. package/dist/types/twisty/model/props/puzzle/state/SetupTransformationProp.d.ts +5 -0
  54. package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts +1 -1
  55. package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts +1 -1
  56. package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts +1 -0
  57. package/dist/types/twisty/views/ManagedCustomElement.d.ts +1 -1
  58. package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts +1 -1
  59. package/dist/types/twisty/views/TwistyPlayer.d.ts +2 -2
  60. package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.css.d.ts → TwistyButtons.css.d.ts} +0 -0
  61. package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.d.ts → TwistyButtons.d.ts} +3 -3
  62. package/dist/types/twisty/views/control-panel/{TwistyScrubberV2.d.ts → TwistyScrubber.d.ts} +1 -1
  63. package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +2 -0
  64. package/package.json +2 -2
  65. package/dist/esm/chunk-SLUMTYHP.js.map +0 -7
  66. package/dist/esm/chunk-ZDALYMGF.js.map +0 -7
  67. package/dist/esm/worker-inside-generated-string-6QDQTUCQ.js.map +0 -7
  68. package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.d.ts +0 -22
  69. 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-42DBDQQX.js";
13
+ } from "../chunk-62T523ZS.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-SLUMTYHP.js";
23
+ } from "../chunk-T3IR6NP3.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;
@@ -1863,7 +1902,7 @@ var ButtonAppearanceProp = class extends TwistyPropDerived {
1863
1902
  title: "Step backward"
1864
1903
  },
1865
1904
  "play-pause": {
1866
- enabled: true,
1905
+ enabled: !(inputs.coarseTimelineInfo.atStart && inputs.coarseTimelineInfo.atEnd),
1867
1906
  icon: inputs.coarseTimelineInfo.playing ? "pause" : "play",
1868
1907
  title: inputs.coarseTimelineInfo.playing ? "Pause" : "Play"
1869
1908
  },
@@ -1888,7 +1927,7 @@ var ButtonAppearanceProp = class extends TwistyPropDerived {
1888
1927
  }
1889
1928
  };
1890
1929
 
1891
- // src/cubing/twisty/views/control-panel/TwistyButtonsV2.ts
1930
+ // src/cubing/twisty/views/control-panel/TwistyButtons.ts
1892
1931
  var buttonCommands = {
1893
1932
  "fullscreen": true,
1894
1933
  "jump-to-start": true,
@@ -1899,7 +1938,7 @@ var buttonCommands = {
1899
1938
  "twizzle-link": true
1900
1939
  };
1901
1940
  var _onCommand, onCommand_fn;
1902
- var TwistyButtonsV2 = class extends ManagedCustomElement {
1941
+ var TwistyButtons = class extends ManagedCustomElement {
1903
1942
  constructor(model, controller, fullscreenElement) {
1904
1943
  super();
1905
1944
  this.model = model;
@@ -1912,13 +1951,13 @@ var TwistyButtonsV2 = class extends ManagedCustomElement {
1912
1951
  this.addCSS(buttonGridCSS);
1913
1952
  const buttons = {};
1914
1953
  for (const command in buttonCommands) {
1915
- const button = new TwistyButtonV2();
1954
+ const button = new TwistyButton();
1916
1955
  buttons[command] = button;
1917
1956
  button.addEventListener("click", () => __privateMethod(this, _onCommand, onCommand_fn).call(this, command));
1918
1957
  this.addElement(button);
1919
1958
  }
1920
1959
  this.buttons = buttons;
1921
- this.model?.buttonAppearanceProp.addFreshListener(this.update.bind(this));
1960
+ this.model?.buttonAppearance.addFreshListener(this.update.bind(this));
1922
1961
  }
1923
1962
  async onFullscreenButton() {
1924
1963
  if (!this.fullscreenElement) {
@@ -1983,9 +2022,9 @@ onCommand_fn = function(command) {
1983
2022
  throw new Error("Missing command");
1984
2023
  }
1985
2024
  };
1986
- customElementsShim.define("twisty-buttons-v2", TwistyButtonsV2);
2025
+ customElementsShim.define("twisty-buttons", TwistyButtons);
1987
2026
  var _iconManager;
1988
- var TwistyButtonV2 = class extends ManagedCustomElement {
2027
+ var TwistyButton = class extends ManagedCustomElement {
1989
2028
  constructor() {
1990
2029
  super(...arguments);
1991
2030
  this.button = document.createElement("button");
@@ -2000,7 +2039,7 @@ var TwistyButtonV2 = class extends ManagedCustomElement {
2000
2039
  }
2001
2040
  };
2002
2041
  _iconManager = new WeakMap();
2003
- customElementsShim.define("twisty-button-v2", TwistyButtonV2);
2042
+ customElementsShim.define("twisty-button", TwistyButton);
2004
2043
 
2005
2044
  // src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts
2006
2045
  var twistyScrubberCSS = new CSSSource(`
@@ -2017,40 +2056,15 @@ var twistyScrubberCSS = new CSSSource(`
2017
2056
  overflow: hidden;
2018
2057
  backdrop-filter: blur(4px);
2019
2058
  -webkit-backdrop-filter: blur(4px);
2059
+ background: rgba(196, 196, 196, 0.75)
2020
2060
  }
2021
2061
 
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);
2062
+ input:not(:disabled) {
2063
+ cursor: ew-resize;
2050
2064
  }
2051
2065
  `);
2052
2066
 
2053
- // src/cubing/twisty/views/control-panel/TwistyScrubberV2.ts
2067
+ // src/cubing/twisty/views/control-panel/TwistyScrubber.ts
2054
2068
  var SLOW_DOWN_SCRUBBING = false;
2055
2069
  var isMouseDown = false;
2056
2070
  globalSafeDocument?.addEventListener("mousedown", function(event) {
@@ -2078,7 +2092,7 @@ var lastPreval = 0;
2078
2092
  var scaling = false;
2079
2093
  var currentClickNum = 0;
2080
2094
  var _inputElem;
2081
- var TwistyScrubberV2 = class extends ManagedCustomElement {
2095
+ var TwistyScrubber = class extends ManagedCustomElement {
2082
2096
  constructor(model) {
2083
2097
  super();
2084
2098
  this.model = model;
@@ -2100,7 +2114,7 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2100
2114
  const elem = document.createElement("input");
2101
2115
  elem.type = "range";
2102
2116
  elem.disabled = true;
2103
- this.model?.detailedTimelineInfoProp.addFreshListener(this.onDetailedTimelineInfo.bind(this));
2117
+ this.model?.detailedTimelineInfo.addFreshListener(this.onDetailedTimelineInfo.bind(this));
2104
2118
  elem.addEventListener("input", this.onInput.bind(this));
2105
2119
  return elem;
2106
2120
  })());
@@ -2112,8 +2126,8 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2112
2126
  const inputElem = await this.inputElem();
2113
2127
  await this.slowDown(e, inputElem);
2114
2128
  const value = parseInt(inputElem.value);
2115
- this.model?.playingInfoProp.set({ playing: false });
2116
- this.model?.timestampRequestProp.set(value);
2129
+ this.model?.playingInfo.set({ playing: false });
2130
+ this.model?.timestampRequest.set(value);
2117
2131
  }
2118
2132
  async slowDown(e, inputElem) {
2119
2133
  if (!SLOW_DOWN_SCRUBBING) {
@@ -2148,7 +2162,7 @@ var TwistyScrubberV2 = class extends ManagedCustomElement {
2148
2162
  }
2149
2163
  };
2150
2164
  _inputElem = new WeakMap();
2151
- customElementsShim.define("twisty-scrubber-v2", TwistyScrubberV2);
2165
+ customElementsShim.define("twisty-scrubber", TwistyScrubber);
2152
2166
 
2153
2167
  // src/cubing/twisty/views/screenshot.ts
2154
2168
  var cachedCamera = null;
@@ -2161,12 +2175,12 @@ async function screenshot(model, options) {
2161
2175
  })());
2162
2176
  const scene = new (await THREEJS).Scene();
2163
2177
  const twisty3DWrapper = new Twisty3DPuzzleWrapper(model, { scheduleRender: () => {
2164
- } }, await model.puzzleLoaderProp.get(), await model.visualizationStrategyProp.get());
2165
- await model.stickeringProp.get();
2178
+ } }, await model.puzzleLoader.get(), await model.visualizationStrategy.get());
2179
+ await model.stickering.get();
2166
2180
  await new Promise((resolve) => setTimeout(resolve, 1e3));
2167
- await model.legacyPositionProp.get();
2181
+ await model.legacyPosition.get();
2168
2182
  scene.add(await twisty3DWrapper.twisty3DPuzzle());
2169
- const orbitCoordinates = await model.orbitCoordinatesProp.get();
2183
+ const orbitCoordinates = await model.orbitCoordinates.get();
2170
2184
  await setCameraFromOrbitCoordinates(camera, orbitCoordinates);
2171
2185
  const renderer = new (await THREEJS).WebGLRenderer({
2172
2186
  antialias: true,
@@ -2185,8 +2199,8 @@ async function screenshot(model, options) {
2185
2199
  }
2186
2200
  async function getDefaultFilename(model) {
2187
2201
  const [puzzleID, algWithIssues] = await Promise.all([
2188
- model.puzzleIDProp.get(),
2189
- model.algProp.get()
2202
+ model.puzzleID.get(),
2203
+ model.alg.get()
2190
2204
  ]);
2191
2205
  return `[${puzzleID}]${algWithIssues.alg.experimentalNumUnits() === 0 ? "" : " " + algWithIssues.alg.toString()}`;
2192
2206
  }
@@ -2211,7 +2225,7 @@ var twistyPlayerCSS = new CSSSource(`
2211
2225
  .wrapper {
2212
2226
  display: grid;
2213
2227
  overflow: hidden;
2214
- grid-template-rows: 7fr 1em 1fr;
2228
+ grid-template-rows: 7fr minmax(1.5em, 0.5fr) minmax(2em, 1fr);
2215
2229
  }
2216
2230
 
2217
2231
  .wrapper > * {
@@ -2226,8 +2240,8 @@ var twistyPlayerCSS = new CSSSource(`
2226
2240
 
2227
2241
  .wrapper.controls-none twisty-scrubber,
2228
2242
  .wrapper.controls-none twisty-control-button-panel ,
2229
- .wrapper.controls-none twisty-scrubber-v2,
2230
- .wrapper.controls-none twisty-buttons-v2 {
2243
+ .wrapper.controls-none twisty-scrubber,
2244
+ .wrapper.controls-none twisty-buttons {
2231
2245
  display: none;
2232
2246
  }
2233
2247
 
@@ -2881,7 +2895,7 @@ function simulMoves(a) {
2881
2895
  return l;
2882
2896
  }
2883
2897
 
2884
- // src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.ts
2898
+ // src/cubing/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.ts
2885
2899
  var demos = {
2886
2900
  "y' y' U' E D R2 r2 F2 B2 U E D' R2 L2' z2 S2 U U D D S2 F2' B2": [
2887
2901
  { animLeaf: new Move("y", -1), start: 0, end: 1e3 },
@@ -2928,7 +2942,7 @@ var demos = {
2928
2942
  { animLeaf: new Move("E"), start: 7e3, end: 8e3 }
2929
2943
  ]
2930
2944
  };
2931
- var SimultaneousMoveIndexerV2 = class {
2945
+ var SimultaneousMoveIndexer = class {
2932
2946
  constructor(kpuzzle, alg) {
2933
2947
  this.kpuzzle = kpuzzle;
2934
2948
  this.animLeaves = demos[alg.toString()] ?? simulMoves(alg);
@@ -3422,7 +3436,7 @@ var IndexerConstructorProp = class extends TwistyPropDerived {
3422
3436
  switch (inputs.indexerConstructorRequest) {
3423
3437
  case "auto":
3424
3438
  if (countMoves(inputs.alg.alg) < 100 && inputs.puzzle === "3x3x3" && inputs.visualizationStrategy === "Cube3D") {
3425
- return SimultaneousMoveIndexerV2;
3439
+ return SimultaneousMoveIndexer;
3426
3440
  } else {
3427
3441
  return TreeAlgIndexer;
3428
3442
  }
@@ -3431,7 +3445,7 @@ var IndexerConstructorProp = class extends TwistyPropDerived {
3431
3445
  case "simple":
3432
3446
  return SimpleAlgIndexer;
3433
3447
  case "simultaneous":
3434
- return SimultaneousMoveIndexerV2;
3448
+ return SimultaneousMoveIndexer;
3435
3449
  default:
3436
3450
  throw new Error("Invalid indexer request!");
3437
3451
  }
@@ -3461,7 +3475,7 @@ var PuzzleAlgProp = class extends TwistyPropDerived {
3461
3475
  // src/cubing/twisty/model/props/puzzle/state/AlgTransformationProp.ts
3462
3476
  var AlgTransformationProp = class extends TwistyPropDerived {
3463
3477
  derive(input) {
3464
- return input.kpuzzle.algToTransformation(input.alg.alg);
3478
+ return input.kpuzzle.algToTransformation(input.setupAlg.alg);
3465
3479
  }
3466
3480
  };
3467
3481
 
@@ -3472,16 +3486,19 @@ var IndexerProp = class extends TwistyPropDerived {
3472
3486
  }
3473
3487
  };
3474
3488
 
3475
- // src/cubing/twisty/model/props/puzzle/state/AnchoredStartProp.ts
3476
- var AnchoredStartProp = class extends TwistyPropDerived {
3489
+ // src/cubing/twisty/model/props/puzzle/state/AnchorTransformationProp.ts
3490
+ var AnchorTransformationProp = class extends TwistyPropDerived {
3477
3491
  derive(inputs) {
3492
+ if (inputs.setupTransformation) {
3493
+ return inputs.setupTransformation;
3494
+ }
3478
3495
  switch (inputs.setupAnchor) {
3479
3496
  case "start":
3480
- return inputs.setupTransformation;
3497
+ return inputs.setupAlgTransformation;
3481
3498
  case "end": {
3482
3499
  const algTransformation = inputs.indexer.transformationAtIndex(inputs.indexer.numAnimatedLeaves());
3483
3500
  const inverseAlgTransformation = algTransformation.invert();
3484
- return inputs.setupTransformation.applyTransformation(inverseAlgTransformation);
3501
+ return inputs.setupAlgTransformation.applyTransformation(inverseAlgTransformation);
3485
3502
  }
3486
3503
  default:
3487
3504
  throw new Error("Unimplemented!");
@@ -3712,116 +3729,125 @@ var FoundationDisplayProp = class extends SimpleTwistyPropSource {
3712
3729
  }
3713
3730
  };
3714
3731
 
3732
+ // src/cubing/twisty/model/props/puzzle/state/SetupTransformationProp.ts
3733
+ var SetupTransformationProp = class extends SimpleTwistyPropSource {
3734
+ getDefaultValue() {
3735
+ return null;
3736
+ }
3737
+ };
3738
+
3715
3739
  // src/cubing/twisty/model/TwistyPlayerModel.ts
3716
3740
  var TwistyPlayerModel = class {
3717
3741
  constructor() {
3718
3742
  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();
3743
+ this.alg = new AlgProp();
3744
+ this.background = new BackgroundProp();
3745
+ this.backView = new BackViewProp();
3746
+ this.controlPanel = new ControlPanelProp();
3747
+ this.catchUpMove = new CatchUpMoveProp();
3748
+ this.foundationDisplay = new FoundationDisplayProp();
3725
3749
  this.foundationStickerSpriteURL = new URLProp();
3726
- this.hintFaceletProp = new HintFaceletProp();
3750
+ this.hintFacelet = new HintFaceletProp();
3727
3751
  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();
3752
+ this.indexerConstructorRequest = new IndexerConstructorRequestProp();
3753
+ this.latitudeLimit = new LatitudeLimitProp();
3754
+ this.movePressInput = new MovePressInputProp();
3755
+ this.orbitCoordinatesRequest = new OrbitCoordinatesRequestProp();
3756
+ this.playingInfo = new PlayingInfoProp();
3757
+ this.puzzleDescriptionRequest = new PGPuzzleDescriptionStringProp();
3758
+ this.puzzleIDRequest = new PuzzleIDRequestProp();
3759
+ this.setupAnchor = new SetupAnchorProp();
3760
+ this.setupAlg = new AlgProp();
3761
+ this.setupTransformation = new SetupTransformationProp();
3762
+ this.stickering = new StickeringProp();
3763
+ this.tempoScale = new TempoScaleProp();
3764
+ this.timestampRequest = new TimestampRequestProp();
3765
+ this.viewerLink = new ViewerLinkProp();
3766
+ this.visualizationFormat = new VisualizationFormatProp();
3742
3767
  this.foundationStickerSprite = new SpriteProp({
3743
3768
  spriteURL: this.foundationStickerSpriteURL
3744
3769
  });
3745
3770
  this.hintStickerSprite = new SpriteProp({
3746
3771
  spriteURL: this.hintStickerSpriteURL
3747
3772
  });
3748
- this.puzzleLoaderProp = new PuzzleLoaderProp({
3749
- puzzleIDRequest: this.puzzleIDRequestProp,
3750
- puzzleDescriptionRequest: this.puzzleDescriptionRequestProp
3773
+ this.puzzleLoader = new PuzzleLoaderProp({
3774
+ puzzleIDRequest: this.puzzleIDRequest,
3775
+ puzzleDescriptionRequest: this.puzzleDescriptionRequest
3751
3776
  }, 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
3777
+ this.kpuzzle = new KPuzzleProp({ puzzleLoader: this.puzzleLoader });
3778
+ this.puzzleID = new PuzzleIDProp({ puzzleLoader: this.puzzleLoader });
3779
+ this.puzzleAlg = new PuzzleAlgProp({
3780
+ algWithIssues: this.alg,
3781
+ kpuzzle: this.kpuzzle
3757
3782
  });
3758
- this.puzzleSetupProp = new PuzzleAlgProp({
3759
- algWithIssues: this.setupProp,
3760
- kpuzzle: this.kpuzzleProp
3783
+ this.puzzleSetupAlg = new PuzzleAlgProp({
3784
+ algWithIssues: this.setupAlg,
3785
+ kpuzzle: this.kpuzzle
3761
3786
  });
3762
- this.visualizationStrategyProp = new VisualizationStrategyProp({
3763
- visualizationRequest: this.visualizationFormatProp,
3764
- puzzleID: this.puzzleIDProp
3787
+ this.visualizationStrategy = new VisualizationStrategyProp({
3788
+ visualizationRequest: this.visualizationFormat,
3789
+ puzzleID: this.puzzleID
3765
3790
  });
3766
- this.indexerConstructorProp = new IndexerConstructorProp({
3767
- alg: this.algProp,
3768
- puzzle: this.puzzleIDProp,
3769
- visualizationStrategy: this.visualizationStrategyProp,
3770
- indexerConstructorRequest: this.indexerConstructorRequestProp
3791
+ this.indexerConstructor = new IndexerConstructorProp({
3792
+ alg: this.alg,
3793
+ puzzle: this.puzzleID,
3794
+ visualizationStrategy: this.visualizationStrategy,
3795
+ indexerConstructorRequest: this.indexerConstructorRequest
3771
3796
  });
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
3797
+ this.moveCount = new NaiveMoveCountProp({ alg: this.puzzleAlg });
3798
+ this.orbitCoordinates = new OrbitCoordinatesProp({
3799
+ orbitCoordinatesRequest: this.orbitCoordinatesRequest,
3800
+ latitudeLimit: this.latitudeLimit,
3801
+ puzzleID: this.puzzleID,
3802
+ strategy: this.visualizationStrategy
3778
3803
  });
3779
- this.setupTransformationProp = new AlgTransformationProp({
3780
- alg: this.puzzleSetupProp,
3781
- kpuzzle: this.kpuzzleProp
3804
+ this.setupAlgTransformation = new AlgTransformationProp({
3805
+ setupAlg: this.puzzleSetupAlg,
3806
+ kpuzzle: this.kpuzzle
3782
3807
  });
3783
- this.indexerProp = new IndexerProp({
3784
- indexerConstructor: this.indexerConstructorProp,
3785
- algWithIssues: this.puzzleAlgProp,
3786
- kpuzzle: this.kpuzzleProp
3808
+ this.indexer = new IndexerProp({
3809
+ indexerConstructor: this.indexerConstructor,
3810
+ algWithIssues: this.puzzleAlg,
3811
+ kpuzzle: this.kpuzzle
3787
3812
  });
3788
- this.anchoredStartProp = new AnchoredStartProp({
3789
- setupAnchor: this.setupAnchorProp,
3790
- setupTransformation: this.setupTransformationProp,
3791
- indexer: this.indexerProp
3813
+ this.anchorTransformation = new AnchorTransformationProp({
3814
+ setupTransformation: this.setupTransformation,
3815
+ setupAnchor: this.setupAnchor,
3816
+ setupAlgTransformation: this.setupAlgTransformation,
3817
+ indexer: this.indexer
3792
3818
  });
3793
- this.timeRangeProp = new TimeRangeProp({
3794
- indexer: this.indexerProp
3819
+ this.timeRange = new TimeRangeProp({
3820
+ indexer: this.indexer
3795
3821
  });
3796
- this.detailedTimelineInfoProp = new DetailedTimelineInfoProp({
3797
- timestampRequest: this.timestampRequestProp,
3798
- timeRange: this.timeRangeProp,
3799
- setupAnchor: this.setupAnchorProp
3822
+ this.detailedTimelineInfo = new DetailedTimelineInfoProp({
3823
+ timestampRequest: this.timestampRequest,
3824
+ timeRange: this.timeRange,
3825
+ setupAnchor: this.setupAnchor
3800
3826
  });
3801
- this.coarseTimelineInfoProp = new CoarseTimelineInfoProp({
3802
- detailedTimelineInfo: this.detailedTimelineInfoProp,
3803
- playingInfo: this.playingInfoProp
3827
+ this.coarseTimelineInfo = new CoarseTimelineInfoProp({
3828
+ detailedTimelineInfo: this.detailedTimelineInfo,
3829
+ playingInfo: this.playingInfo
3804
3830
  });
3805
- this.currentMoveInfoProp = new CurrentMoveInfoProp({
3806
- indexer: this.indexerProp,
3807
- detailedTimelineInfo: this.detailedTimelineInfoProp,
3808
- catchUpMove: this.catchUpMoveProp
3831
+ this.currentMoveInfo = new CurrentMoveInfoProp({
3832
+ indexer: this.indexer,
3833
+ detailedTimelineInfo: this.detailedTimelineInfo,
3834
+ catchUpMove: this.catchUpMove
3809
3835
  });
3810
- this.buttonAppearanceProp = new ButtonAppearanceProp({
3811
- coarseTimelineInfo: this.coarseTimelineInfoProp,
3812
- viewerLink: this.viewerLinkProp
3836
+ this.buttonAppearance = new ButtonAppearanceProp({
3837
+ coarseTimelineInfo: this.coarseTimelineInfo,
3838
+ viewerLink: this.viewerLink
3813
3839
  });
3814
- this.currentLeavesSimplifiedProp = new CurrentLeavesSimplifiedProp({
3815
- currentMoveInfo: this.currentMoveInfoProp
3840
+ this.currentLeavesSimplified = new CurrentLeavesSimplifiedProp({
3841
+ currentMoveInfo: this.currentMoveInfo
3816
3842
  });
3817
- this.currentStateProp = new CurrentStateProp({
3818
- anchoredStart: this.anchoredStartProp,
3819
- currentLeavesSimplified: this.currentLeavesSimplifiedProp,
3820
- indexer: this.indexerProp
3843
+ this.currentState = new CurrentStateProp({
3844
+ anchoredStart: this.anchorTransformation,
3845
+ currentLeavesSimplified: this.currentLeavesSimplified,
3846
+ indexer: this.indexer
3821
3847
  });
3822
- this.legacyPositionProp = new LegacyPositionProp({
3823
- currentMoveInfo: this.currentMoveInfoProp,
3824
- state: this.currentStateProp
3848
+ this.legacyPosition = new LegacyPositionProp({
3849
+ currentMoveInfo: this.currentMoveInfo,
3850
+ state: this.currentState
3825
3851
  });
3826
3852
  }
3827
3853
  async twizzleLink() {
@@ -3834,13 +3860,13 @@ var TwistyPlayerModel = class {
3834
3860
  anchor,
3835
3861
  experimentalStickering
3836
3862
  ] = await Promise.all([
3837
- this.viewerLinkProp.get(),
3838
- this.puzzleIDProp.get(),
3839
- this.puzzleDescriptionRequestProp.get(),
3840
- this.algProp.get(),
3841
- this.setupProp.get(),
3842
- this.setupAnchorProp.get(),
3843
- this.stickeringProp.get()
3863
+ this.viewerLink.get(),
3864
+ this.puzzleID.get(),
3865
+ this.puzzleDescriptionRequest.get(),
3866
+ this.alg.get(),
3867
+ this.setupAlg.get(),
3868
+ this.setupAnchor.get(),
3869
+ this.stickering.get()
3844
3870
  ]);
3845
3871
  const isExplorer = viewerLink === "experimental-twizzle-explorer";
3846
3872
  console.log({ isExplorer, viewerLink });
@@ -3867,19 +3893,23 @@ var TwistyPlayerModel = class {
3867
3893
  experimentalAddMove(flexibleMove, options = {}) {
3868
3894
  const move = typeof flexibleMove === "string" ? new Move(flexibleMove) : flexibleMove;
3869
3895
  (async () => {
3870
- const alg = (await this.algProp.get()).alg;
3896
+ const alg = (await this.alg.get()).alg;
3871
3897
  const newAlg = experimentalAppendMove(alg, move, {
3872
3898
  coalesce: options?.coalesce,
3873
3899
  mod: options?.mod
3874
3900
  });
3875
- this.algProp.set(newAlg);
3876
- this.timestampRequestProp.set("end");
3877
- this.catchUpMoveProp.set({
3901
+ this.alg.set(newAlg);
3902
+ this.timestampRequest.set("end");
3903
+ this.catchUpMove.set({
3878
3904
  move,
3879
3905
  amount: 0
3880
3906
  });
3881
3907
  })();
3882
3908
  }
3909
+ get playingInfoProp() {
3910
+ console.warn("Using deprecated prop: `playingInfoProp`. Please switch to: `playingInfo`");
3911
+ return this.playingInfo;
3912
+ }
3883
3913
  };
3884
3914
 
3885
3915
  // src/cubing/twisty/views/TwistyPlayerSettable.ts
@@ -3893,121 +3923,121 @@ var TwistyPlayerSettable = class extends ManagedCustomElement {
3893
3923
  this.experimentalGet = new ExperimentalGetters(this.experimentalModel);
3894
3924
  }
3895
3925
  set alg(newAlg) {
3896
- this.experimentalModel.algProp.set(newAlg);
3926
+ this.experimentalModel.alg.set(newAlg);
3897
3927
  }
3898
3928
  get alg() {
3899
3929
  throw err("alg");
3900
3930
  }
3901
3931
  set experimentalSetupAlg(newSetup) {
3902
- this.experimentalModel.setupProp.set(newSetup);
3932
+ this.experimentalModel.setupAlg.set(newSetup);
3903
3933
  }
3904
3934
  get experimentalSetupAlg() {
3905
3935
  throw err("setup");
3906
3936
  }
3907
3937
  set experimentalSetupAnchor(anchor) {
3908
- this.experimentalModel.setupAnchorProp.set(anchor);
3938
+ this.experimentalModel.setupAnchor.set(anchor);
3909
3939
  }
3910
3940
  get experimentalSetupAnchor() {
3911
3941
  throw err("anchor");
3912
3942
  }
3913
3943
  set puzzle(puzzleID) {
3914
- this.experimentalModel.puzzleIDRequestProp.set(puzzleID);
3944
+ this.experimentalModel.puzzleIDRequest.set(puzzleID);
3915
3945
  }
3916
3946
  get puzzle() {
3917
3947
  throw err("puzzle");
3918
3948
  }
3919
3949
  set experimentalPuzzleDescription(puzzleDescription) {
3920
- this.experimentalModel.puzzleDescriptionRequestProp.set(puzzleDescription);
3950
+ this.experimentalModel.puzzleDescriptionRequest.set(puzzleDescription);
3921
3951
  }
3922
3952
  get experimentalPuzzleDescription() {
3923
3953
  throw err("experimentalPuzzleDescription");
3924
3954
  }
3925
3955
  set timestamp(timestamp) {
3926
- this.experimentalModel.timestampRequestProp.set(timestamp);
3956
+ this.experimentalModel.timestampRequest.set(timestamp);
3927
3957
  }
3928
3958
  get timestamp() {
3929
3959
  throw err("timestamp");
3930
3960
  }
3931
3961
  set hintFacelets(hintFaceletStyle) {
3932
- this.experimentalModel.hintFaceletProp.set(hintFaceletStyle);
3962
+ this.experimentalModel.hintFacelet.set(hintFaceletStyle);
3933
3963
  }
3934
3964
  get hintFacelets() {
3935
3965
  throw err("hintFacelets");
3936
3966
  }
3937
3967
  set experimentalStickering(stickering) {
3938
- this.experimentalModel.stickeringProp.set(stickering);
3968
+ this.experimentalModel.stickering.set(stickering);
3939
3969
  }
3940
3970
  get experimentalStickering() {
3941
3971
  throw err("stickering");
3942
3972
  }
3943
3973
  set backView(backView) {
3944
- this.experimentalModel.backViewProp.set(backView);
3974
+ this.experimentalModel.backView.set(backView);
3945
3975
  }
3946
3976
  get backView() {
3947
3977
  throw err("backView");
3948
3978
  }
3949
3979
  set background(backgroundTheme) {
3950
- this.experimentalModel.backgroundProp.set(backgroundTheme);
3980
+ this.experimentalModel.background.set(backgroundTheme);
3951
3981
  }
3952
3982
  get background() {
3953
3983
  throw err("background");
3954
3984
  }
3955
3985
  set controlPanel(newControlPanel) {
3956
- this.experimentalModel.controlPanelProp.set(newControlPanel);
3986
+ this.experimentalModel.controlPanel.set(newControlPanel);
3957
3987
  }
3958
3988
  get controlPanel() {
3959
3989
  throw err("controlPanel");
3960
3990
  }
3961
3991
  set visualization(visualizationFormat) {
3962
- this.experimentalModel.visualizationFormatProp.set(visualizationFormat);
3992
+ this.experimentalModel.visualizationFormat.set(visualizationFormat);
3963
3993
  }
3964
3994
  get visualization() {
3965
3995
  throw err("visualization");
3966
3996
  }
3967
3997
  set viewerLink(viewerLinkPage) {
3968
- this.experimentalModel.viewerLinkProp.set(viewerLinkPage);
3998
+ this.experimentalModel.viewerLink.set(viewerLinkPage);
3969
3999
  }
3970
4000
  get viewerLink() {
3971
4001
  throw err("viewerLink");
3972
4002
  }
3973
4003
  set experimentalMovePressInput(movePressInput) {
3974
- this.experimentalModel.movePressInputProp.set(movePressInput);
4004
+ this.experimentalModel.movePressInput.set(movePressInput);
3975
4005
  }
3976
4006
  get experimentalMovePressInput() {
3977
4007
  throw err("experimentalMovePressInput");
3978
4008
  }
3979
4009
  set cameraLatitude(latitude) {
3980
- this.experimentalModel.orbitCoordinatesRequestProp.set({ latitude });
4010
+ this.experimentalModel.orbitCoordinatesRequest.set({ latitude });
3981
4011
  }
3982
4012
  get cameraLatitude() {
3983
4013
  throw err("cameraLatitude");
3984
4014
  }
3985
4015
  set cameraLongitude(longitude) {
3986
- this.experimentalModel.orbitCoordinatesRequestProp.set({ longitude });
4016
+ this.experimentalModel.orbitCoordinatesRequest.set({ longitude });
3987
4017
  }
3988
4018
  get cameraLongitude() {
3989
4019
  throw err("cameraLongitude");
3990
4020
  }
3991
4021
  set cameraDistance(distance) {
3992
- this.experimentalModel.orbitCoordinatesRequestProp.set({ distance });
4022
+ this.experimentalModel.orbitCoordinatesRequest.set({ distance });
3993
4023
  }
3994
4024
  get cameraDistance() {
3995
4025
  throw err("cameraDistance");
3996
4026
  }
3997
4027
  set cameraLatitudeLimit(latitudeLimit) {
3998
- this.experimentalModel.latitudeLimitProp.set(latitudeLimit);
4028
+ this.experimentalModel.latitudeLimit.set(latitudeLimit);
3999
4029
  }
4000
4030
  get cameraLatitudeLimit() {
4001
4031
  throw err("cameraLatitudeLimit");
4002
4032
  }
4003
4033
  set indexer(indexer) {
4004
- this.experimentalModel.indexerConstructorRequestProp.set(indexer);
4034
+ this.experimentalModel.indexerConstructorRequest.set(indexer);
4005
4035
  }
4006
4036
  get indexer() {
4007
4037
  throw err("indexer");
4008
4038
  }
4009
4039
  set tempoScale(newTempoScale) {
4010
- this.experimentalModel.tempoScaleProp.set(newTempoScale);
4040
+ this.experimentalModel.tempoScale.set(newTempoScale);
4011
4041
  }
4012
4042
  get tempoScale() {
4013
4043
  throw err("tempoScale");
@@ -4030,16 +4060,16 @@ var ExperimentalGetters = class {
4030
4060
  this.model = model;
4031
4061
  }
4032
4062
  async alg() {
4033
- return (await this.model.algProp.get()).alg;
4063
+ return (await this.model.alg.get()).alg;
4034
4064
  }
4035
4065
  async setupAlg() {
4036
- return (await this.model.setupProp.get()).alg;
4066
+ return (await this.model.setupAlg.get()).alg;
4037
4067
  }
4038
4068
  puzzleID() {
4039
- return this.model.puzzleIDProp.get();
4069
+ return this.model.puzzleID.get();
4040
4070
  }
4041
4071
  async timestamp() {
4042
- return (await this.model.detailedTimelineInfoProp.get()).timestamp;
4072
+ return (await this.model.detailedTimelineInfo.get()).timestamp;
4043
4073
  }
4044
4074
  };
4045
4075
 
@@ -4105,18 +4135,18 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4105
4135
  __privateGet(this, _errorElem).textContent = errorString;
4106
4136
  }
4107
4137
  });
4108
- const scrubber = new TwistyScrubberV2(this.experimentalModel);
4138
+ const scrubber = new TwistyScrubber(this.experimentalModel);
4109
4139
  this.contentWrapper.appendChild(scrubber);
4110
- this.buttons = new TwistyButtonsV2(this.experimentalModel, this.controller, this);
4140
+ this.buttons = new TwistyButtons(this.experimentalModel, this.controller, this);
4111
4141
  this.contentWrapper.appendChild(this.buttons);
4112
- this.experimentalModel.backgroundProp.addFreshListener((backgroundTheme) => {
4142
+ this.experimentalModel.background.addFreshListener((backgroundTheme) => {
4113
4143
  this.contentWrapper.classList.toggle("checkered", backgroundTheme !== "none");
4114
4144
  });
4115
- this.experimentalModel.controlPanelProp.addFreshListener((controlPanel) => {
4145
+ this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
4116
4146
  __privateGet(this, _controlsManager).setValue(controlPanel);
4117
4147
  });
4118
- this.experimentalModel.visualizationStrategyProp.addFreshListener(__privateMethod(this, _setVisualizationWrapper, setVisualizationWrapper_fn).bind(this));
4119
- this.experimentalModel.puzzleIDProp.addFreshListener(this.flash.bind(this));
4148
+ this.experimentalModel.visualizationStrategy.addFreshListener(__privateMethod(this, _setVisualizationWrapper, setVisualizationWrapper_fn).bind(this));
4149
+ this.experimentalModel.puzzleID.addFreshListener(this.flash.bind(this));
4120
4150
  }
4121
4151
  flash() {
4122
4152
  __privateGet(this, _visualizationWrapper)?.animate([{ opacity: 0.25 }, { opacity: 1 }], {
@@ -4175,7 +4205,7 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4175
4205
  return (await screenshot(this.experimentalModel, options)).dataURL;
4176
4206
  }
4177
4207
  async experimentalDownloadScreenshot(filename) {
4178
- if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategyProp.get())) {
4208
+ if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategy.get())) {
4179
4209
  const wrapper2D = __privateGet(this, _visualizationWrapper);
4180
4210
  const twisty2DPuzzle = await wrapper2D.currentTwisty2DPuzzleWrapper().twisty2DPuzzle();
4181
4211
  const str = new XMLSerializer().serializeToString(twisty2DPuzzle.svg.element);
@@ -4489,13 +4519,13 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4489
4519
  return;
4490
4520
  }
4491
4521
  this.twistyPlayer = twistyPlayer;
4492
- this.twistyPlayer.experimentalModel.algProp.addFreshListener((algWithIssues) => {
4522
+ this.twistyPlayer.experimentalModel.alg.addFreshListener((algWithIssues) => {
4493
4523
  this.setAlg(algWithIssues.alg);
4494
4524
  });
4495
- const sourceAlg = (await this.twistyPlayer.experimentalModel.algProp.get()).alg;
4525
+ const sourceAlg = (await this.twistyPlayer.experimentalModel.alg.get()).alg;
4496
4526
  const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
4497
4527
  this.setAlg(parsedAlg);
4498
- twistyPlayer.experimentalModel.currentMoveInfoProp.addFreshListener((currentMoveInfo) => {
4528
+ twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener((currentMoveInfo) => {
4499
4529
  let moveInfo = currentMoveInfo.currentMoves[0];
4500
4530
  moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4501
4531
  moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
@@ -4506,7 +4536,7 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4506
4536
  this.highlighter.set(mainCurrentMove);
4507
4537
  }
4508
4538
  });
4509
- twistyPlayer.experimentalModel.detailedTimelineInfoProp.addFreshListener((detailedTimelineInfo) => {
4539
+ twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener((detailedTimelineInfo) => {
4510
4540
  if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4511
4541
  this.lastClickTimestamp = null;
4512
4542
  }
@@ -4517,11 +4547,11 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4517
4547
  if (twistyPlayer) {
4518
4548
  twistyPlayer.pause();
4519
4549
  const timestampPromise = (async () => {
4520
- const indexer = await twistyPlayer.experimentalModel.indexerProp.get();
4550
+ const indexer = await twistyPlayer.experimentalModel.indexer.get();
4521
4551
  const offset = offsetIntoMove ? DEFAULT_OFFSET_MS : 0;
4522
4552
  return (indexer.indexToMoveStartTimestamp(index) ?? -offset) + offset;
4523
4553
  })();
4524
- twistyPlayer.experimentalModel.timestampRequestProp.set(await timestampPromise);
4554
+ twistyPlayer.experimentalModel.timestampRequest.set(await timestampPromise);
4525
4555
  if (this.lastClickTimestamp === await timestampPromise) {
4526
4556
  twistyPlayer.play();
4527
4557
  this.lastClickTimestamp = null;
@@ -4840,8 +4870,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4840
4870
  if (options?.twistyPlayer) {
4841
4871
  this.twistyPlayer = options.twistyPlayer;
4842
4872
  }
4843
- __privateSet(this, _twistyPlayerProp, options?.twistyPlayerProp ?? "algProp");
4844
- if (options?.twistyPlayerProp === "algProp") {
4873
+ __privateSet(this, _twistyPlayerProp, options?.twistyPlayerProp ?? "alg");
4874
+ if (options?.twistyPlayerProp === "alg") {
4845
4875
  this.model.leafToHighlight.addFreshListener((highlightInfo) => {
4846
4876
  if (highlightInfo) {
4847
4877
  this.highlightLeaf(highlightInfo.leafInfo.leaf);
@@ -4870,7 +4900,7 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4870
4900
  if (document.activeElement !== this || this.shadow.activeElement !== __privateGet(this, _textarea)) {
4871
4901
  return;
4872
4902
  }
4873
- if (__privateGet(this, _twistyPlayerProp) !== "algProp") {
4903
+ if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4874
4904
  return;
4875
4905
  }
4876
4906
  const { selectionStart, selectionEnd } = __privateGet(this, _textarea);
@@ -4885,7 +4915,7 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4885
4915
  __privateGet(this, _textareaClassListValidForPuzzleManager).setValue(issues);
4886
4916
  }
4887
4917
  highlightLeaf(leaf) {
4888
- if (__privateGet(this, _twistyPlayerProp) !== "algProp") {
4918
+ if (__privateGet(this, _twistyPlayerProp) !== "alg") {
4889
4919
  return;
4890
4920
  }
4891
4921
  if (leaf === null) {
@@ -4918,8 +4948,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4918
4948
  (async () => {
4919
4949
  this.algString = __privateGet(this, _algProp, algProp_get) ? (await __privateGet(this, _algProp, algProp_get).get()).alg.toString() : "";
4920
4950
  })();
4921
- if (__privateGet(this, _twistyPlayerProp) === "algProp") {
4922
- __privateGet(this, _twistyPlayer)?.experimentalModel.puzzleAlgProp.addFreshListener((algWithIssues) => {
4951
+ if (__privateGet(this, _twistyPlayerProp) === "alg") {
4952
+ __privateGet(this, _twistyPlayer)?.experimentalModel.puzzleAlg.addFreshListener((algWithIssues) => {
4923
4953
  if (algWithIssues.issues.errors.length === 0) {
4924
4954
  this.setAlgIssueClassForPuzzle(algWithIssues.issues.warnings.length === 0 ? "none" : "warning");
4925
4955
  const newAlg = algWithIssues.alg;
@@ -4938,8 +4968,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4938
4968
  return;
4939
4969
  }
4940
4970
  const [indexer, timestampRequest] = await Promise.all([
4941
- await twistyPlayer.experimentalModel.indexerProp.get(),
4942
- await twistyPlayer.experimentalModel.timestampRequestProp.get()
4971
+ await twistyPlayer.experimentalModel.indexer.get(),
4972
+ await twistyPlayer.experimentalModel.timestampRequest.get()
4943
4973
  ]);
4944
4974
  if (timestampRequest === "opposite-anchor" && !__privateGet(this, _onInputHasFired)) {
4945
4975
  return;
@@ -4964,11 +4994,11 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4964
4994
  throw new Error("Invalid where!");
4965
4995
  }
4966
4996
  if (!this.debugNeverRequestTimestamp) {
4967
- twistyPlayer.experimentalModel.timestampRequestProp.set(newTimestamp);
4997
+ twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4968
4998
  }
4969
4999
  });
4970
- twistyPlayer.experimentalModel.currentLeavesSimplifiedProp.addFreshListener(async (currentLeavesSimplified) => {
4971
- const indexer = await twistyPlayer.experimentalModel.indexerProp.get();
5000
+ twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(async (currentLeavesSimplified) => {
5001
+ const indexer = await twistyPlayer.experimentalModel.indexer.get();
4972
5002
  const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
4973
5003
  this.highlightLeaf(leaf);
4974
5004
  });
@@ -5054,6 +5084,8 @@ var twizzleLinkCSS = new CSSSource(`
5054
5084
 
5055
5085
  twisty-player {
5056
5086
  width: 100%;
5087
+ resize: vertical;
5088
+ overflow-y: hidden;
5057
5089
  }
5058
5090
 
5059
5091
  twisty-player + .heading {
@@ -5070,12 +5102,12 @@ var URLParamUpdater = class {
5070
5102
  constructor(model, options) {
5071
5103
  __privateAdd(this, _prefix, void 0);
5072
5104
  __privateSet(this, _prefix, options?.prefix ?? "");
5073
- this.listenToAlgProp(model.algProp, "alg");
5074
- this.listenToAlgProp(model.setupProp, "setup-alg");
5075
- this.listenToStringSourceProp(model.stickeringProp, "stickering");
5076
- this.listenToStringSourceProp(model.setupAnchorProp, "setup-anchor");
5077
- this.listenToStringOrNoValueProp(model.puzzleIDRequestProp, "puzzle", NO_VALUE);
5078
- this.listenToStringOrNoValueProp(model.puzzleDescriptionRequestProp, "puzzle-description", NO_VALUE);
5105
+ this.listenToAlgProp(model.alg, "alg");
5106
+ this.listenToAlgProp(model.setupAlg, "setup-alg");
5107
+ this.listenToStringSourceProp(model.stickering, "stickering");
5108
+ this.listenToStringSourceProp(model.setupAnchor, "setup-anchor");
5109
+ this.listenToStringOrNoValueProp(model.puzzleIDRequest, "puzzle", NO_VALUE);
5110
+ this.listenToStringOrNoValueProp(model.puzzleDescriptionRequest, "puzzle-description", NO_VALUE);
5079
5111
  }
5080
5112
  setURLParam(unprefixedKey, value, defaultString) {
5081
5113
  const prefixedKey = __privateGet(this, _prefix) + unprefixedKey;
@@ -5134,14 +5166,28 @@ function getConfigFromURL(prefix = "", url = location.href) {
5134
5166
  }
5135
5167
 
5136
5168
  // src/cubing/twisty/views/twizzle/TwizzleLink.ts
5169
+ var _cssElem;
5137
5170
  var TwizzleLink = class extends ManagedCustomElement {
5138
5171
  constructor() {
5139
5172
  super({ mode: "open" });
5140
5173
  this.twistyPlayer = null;
5141
5174
  this.a = null;
5175
+ __privateAdd(this, _cssElem, void 0);
5176
+ }
5177
+ fallback() {
5178
+ this.contentWrapper.textContent = "";
5179
+ if (this.a) {
5180
+ const span = this.contentWrapper.appendChild(document.createElement("span"));
5181
+ span.textContent = "\u2757\uFE0F";
5182
+ span.title = "Could not show a player for link";
5183
+ this.addElement(this.a);
5184
+ }
5185
+ if (__privateGet(this, _cssElem)) {
5186
+ __privateGet(this, _cssElem).remove();
5187
+ }
5142
5188
  }
5143
5189
  async connectedCallback() {
5144
- this.addCSS(twizzleLinkCSS);
5190
+ __privateSet(this, _cssElem, this.addCSS(twizzleLinkCSS));
5145
5191
  this.a = this.querySelector("a");
5146
5192
  if (!this.a) {
5147
5193
  return;
@@ -5150,6 +5196,7 @@ var TwizzleLink = class extends ManagedCustomElement {
5150
5196
  const href = this.a?.href;
5151
5197
  const { hostname, pathname } = new URL(href);
5152
5198
  if (hostname !== "alpha.twizzle.net") {
5199
+ this.fallback();
5153
5200
  return;
5154
5201
  }
5155
5202
  if (["/edit/", "/explore/"].includes(pathname)) {
@@ -5172,6 +5219,8 @@ var TwizzleLink = class extends ManagedCustomElement {
5172
5219
  this.addHeading("Moves");
5173
5220
  const twistyAlgViewer = this.addElement(new TwistyAlgViewer({ twistyPlayer: this.twistyPlayer }));
5174
5221
  twistyAlgViewer.part.add("twisty-alg-viewer");
5222
+ } else {
5223
+ this.fallback();
5175
5224
  }
5176
5225
  }
5177
5226
  addHeading(text) {
@@ -5180,6 +5229,7 @@ var TwizzleLink = class extends ManagedCustomElement {
5180
5229
  headingDiv.textContent = text;
5181
5230
  }
5182
5231
  };
5232
+ _cssElem = new WeakMap();
5183
5233
  customElementsShim.define("twizzle-link", TwizzleLink);
5184
5234
  export {
5185
5235
  NO_VALUE as EXPERIMENTAL_PROP_NO_VALUE,