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.
- package/README.md +37 -7
- package/dist/esm/{2x2x2.sgs.json-TASFAQNY.js → 2x2x2.sgs.json-FGJMEY7L.js} +2 -2
- package/dist/esm/{2x2x2.sgs.json-TASFAQNY.js.map → 2x2x2.sgs.json-FGJMEY7L.js.map} +0 -0
- package/dist/esm/{3d-dynamic-inside-RSDMFS4G.js → 3d-dynamic-inside-OI3KFE53.js} +3 -4
- package/dist/esm/{3d-dynamic-inside-RSDMFS4G.js.map → 3d-dynamic-inside-OI3KFE53.js.map} +2 -2
- package/dist/esm/bluetooth/index.js +1 -1
- package/dist/esm/{chunk-SPTKCRT5.js → chunk-2DZQQRAX.js} +2 -2
- package/dist/esm/{chunk-SPTKCRT5.js.map → chunk-2DZQQRAX.js.map} +0 -0
- package/dist/esm/{chunk-BBEJTW6Z.js → chunk-63M53ZZ5.js} +2 -2
- package/dist/esm/{chunk-BBEJTW6Z.js.map → chunk-63M53ZZ5.js.map} +0 -0
- package/dist/esm/{chunk-EA4KWT7Z.js → chunk-ARBPSZE4.js} +3 -3
- package/dist/esm/{chunk-EA4KWT7Z.js.map → chunk-ARBPSZE4.js.map} +0 -0
- package/dist/esm/{chunk-54HT7B4M.js → chunk-IS5V7Y6I.js} +5 -7
- package/dist/esm/chunk-IS5V7Y6I.js.map +7 -0
- package/dist/esm/{chunk-ZDALYMGF.js → chunk-KRL5KQQK.js} +32 -3
- package/dist/esm/chunk-KRL5KQQK.js.map +7 -0
- package/dist/esm/{chunk-3SURT6S2.js → chunk-PJXFSZFG.js} +2 -2
- package/dist/esm/{chunk-3SURT6S2.js.map → chunk-PJXFSZFG.js.map} +0 -0
- package/dist/esm/{chunk-LR6VCMD2.js → chunk-V5DHYMZ7.js} +2 -2
- package/dist/esm/{chunk-LR6VCMD2.js.map → chunk-V5DHYMZ7.js.map} +0 -0
- package/dist/esm/{chunk-27MCV5LC.js → chunk-ZA7DHVIG.js} +2 -2
- package/dist/esm/{chunk-27MCV5LC.js.map → chunk-ZA7DHVIG.js.map} +0 -0
- package/dist/esm/{entry-VNBE3GIX.js → entry-35P24GUC.js} +14 -14
- package/dist/esm/{entry-VNBE3GIX.js.map → entry-35P24GUC.js.map} +0 -0
- package/dist/esm/{fto.sgs.json-RZ2BQGRG.js → fto.sgs.json-5DLOFNGP.js} +2 -2
- package/dist/esm/{fto.sgs.json-RZ2BQGRG.js.map → fto.sgs.json-5DLOFNGP.js.map} +0 -0
- package/dist/esm/{megaminx.sgs.json-3UELYHNZ.js → megaminx.sgs.json-6QTJOWQY.js} +3 -3
- package/dist/esm/{megaminx.sgs.json-3UELYHNZ.js.map → megaminx.sgs.json-6QTJOWQY.js.map} +0 -0
- package/dist/esm/{module-entry-MKJ6SWPL.js → module-entry-EAI3JQ2N.js} +2 -2
- package/dist/esm/{module-entry-MKJ6SWPL.js.map → module-entry-EAI3JQ2N.js.map} +0 -0
- package/dist/esm/puzzle-geometry/index.js +1 -1
- package/dist/esm/puzzles/index.js +1 -1
- package/dist/esm/{pyraminx.sgs.json-6KZV2YF7.js → pyraminx.sgs.json-P7ND22JU.js} +3 -3
- package/dist/esm/{pyraminx.sgs.json-6KZV2YF7.js.map → pyraminx.sgs.json-P7ND22JU.js.map} +0 -0
- package/dist/esm/scramble/index.js +3 -3
- package/dist/esm/{scramble_444-WHAZBEON.js → scramble_444-Q22ZMCV5.js} +3 -3
- package/dist/esm/{scramble_444-WHAZBEON.js.map → scramble_444-Q22ZMCV5.js.map} +0 -0
- package/dist/esm/search/index.js +3 -3
- package/dist/esm/{skewb.sgs.json-QVGBEYZV.js → skewb.sgs.json-PE7DQP2D.js} +3 -3
- package/dist/esm/{skewb.sgs.json-QVGBEYZV.js.map → skewb.sgs.json-PE7DQP2D.js.map} +0 -0
- package/dist/esm/twisty/index.js +339 -258
- package/dist/esm/twisty/index.js.map +3 -3
- package/dist/esm/{worker-inside-generated-string-K4NE6VX5.js → worker-inside-generated-string-4JQKOQND.js} +21 -21
- package/dist/esm/worker-inside-generated-string-4JQKOQND.js.map +7 -0
- package/dist/types/puzzle-geometry/FaceNameSwizzler.d.ts +1 -0
- package/dist/types/puzzle-geometry/PermOriSet.d.ts +2 -1
- package/dist/types/puzzle-geometry/PuzzleGeometry.d.ts +1 -0
- package/dist/types/search/worker-inside-generated-string.d.ts +1 -1
- package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexer.d.ts +5 -4
- package/dist/types/twisty/index.d.ts +1 -1
- package/dist/types/twisty/model/TwistyPlayerModel.d.ts +46 -42
- package/dist/types/twisty/model/props/puzzle/state/AlgTransformationProp.d.ts +1 -1
- package/dist/types/twisty/model/props/puzzle/state/AnchorTransformationProp.d.ts +14 -0
- package/dist/types/twisty/model/props/puzzle/state/SetupTransformationProp.d.ts +5 -0
- package/dist/types/twisty/model/props/timeline/CoarseTimelineInfoProp.d.ts +1 -1
- package/dist/types/twisty/model/props/viewer/ButtonAppearanceProp.d.ts +1 -1
- package/dist/types/twisty/model/props/viewer/ViewerLinkProp.d.ts +1 -0
- package/dist/types/twisty/views/3D/Twisty3DVantage.d.ts +1 -0
- package/dist/types/twisty/views/ManagedCustomElement.d.ts +1 -1
- package/dist/types/twisty/views/TwistyAlgEditor/TwistyAlgEditor.d.ts +1 -1
- package/dist/types/twisty/views/TwistyPlayer.d.ts +2 -2
- package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.css.d.ts → TwistyButtons.css.d.ts} +0 -0
- package/dist/types/twisty/views/control-panel/{TwistyButtonsV2.d.ts → TwistyButtons.d.ts} +3 -3
- package/dist/types/twisty/views/control-panel/{TwistyScrubberV2.d.ts → TwistyScrubber.d.ts} +1 -1
- package/dist/types/twisty/views/twizzle/TwizzleLink.d.ts +3 -1
- package/package.json +2 -2
- package/dist/esm/chunk-54HT7B4M.js.map +0 -7
- package/dist/esm/chunk-ZDALYMGF.js.map +0 -7
- package/dist/esm/worker-inside-generated-string-K4NE6VX5.js.map +0 -7
- package/dist/types/twisty/controllers/indexer/simultaneous-moves/SimultaneousMoveIndexerV2.d.ts +0 -22
- package/dist/types/twisty/model/props/puzzle/state/AnchoredStartProp.d.ts +0 -13
package/dist/esm/twisty/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
TwistyPropDerived,
|
|
11
11
|
TwistyPropSource,
|
|
12
12
|
proxy3D
|
|
13
|
-
} from "../chunk-
|
|
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-
|
|
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.
|
|
148
|
-
const previousCatchUpMove = await this.model.
|
|
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.
|
|
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.
|
|
182
|
+
this.model.playingInfo.addFreshListener(this.onPlayingProp.bind(this));
|
|
183
183
|
this.catchUpHelper = new CatchUpHelper(this.model);
|
|
184
|
-
this.model.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
224
|
+
this.model.timestampRequest.set("start");
|
|
225
225
|
this.delegate.flash();
|
|
226
226
|
}
|
|
227
227
|
if (direction === Direction.Backwards && coarseTimelineInfo.atStart) {
|
|
228
|
-
this.model.
|
|
228
|
+
this.model.timestampRequest.set("end");
|
|
229
229
|
this.delegate.flash();
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
this.model.
|
|
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.
|
|
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.
|
|
257
|
+
this.model.playingInfo.get(),
|
|
258
258
|
this.lastTimestampPromise,
|
|
259
|
-
this.model.
|
|
260
|
-
this.model.
|
|
261
|
-
this.model.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
399
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1326
|
-
const prevCoords = await this.model.
|
|
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.
|
|
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.
|
|
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.
|
|
1588
|
-
__privateGet(this, _freshListenerManager5).addListener(this.model.
|
|
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/
|
|
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
|
|
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:
|
|
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/
|
|
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
|
|
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
|
|
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?.
|
|
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
|
|
2026
|
+
customElementsShim.define("twisty-buttons", TwistyButtons);
|
|
1987
2027
|
var _iconManager;
|
|
1988
|
-
var
|
|
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
|
|
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
|
-
|
|
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/
|
|
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
|
|
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?.
|
|
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?.
|
|
2116
|
-
this.model?.
|
|
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
|
|
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.
|
|
2165
|
-
await model.
|
|
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.
|
|
2182
|
+
await model.legacyPosition.get();
|
|
2168
2183
|
scene.add(await twisty3DWrapper.twisty3DPuzzle());
|
|
2169
|
-
const orbitCoordinates = await model.
|
|
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.
|
|
2189
|
-
model.
|
|
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
|
|
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
|
|
2230
|
-
.wrapper.controls-none twisty-buttons
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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/
|
|
3476
|
-
var
|
|
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.
|
|
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.
|
|
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.
|
|
3720
|
-
this.
|
|
3721
|
-
this.
|
|
3722
|
-
this.
|
|
3723
|
-
this.
|
|
3724
|
-
this.
|
|
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.
|
|
3751
|
+
this.hintFacelet = new HintFaceletProp();
|
|
3727
3752
|
this.hintStickerSpriteURL = new URLProp();
|
|
3728
|
-
this.
|
|
3729
|
-
this.
|
|
3730
|
-
this.
|
|
3731
|
-
this.
|
|
3732
|
-
this.
|
|
3733
|
-
this.
|
|
3734
|
-
this.
|
|
3735
|
-
this.
|
|
3736
|
-
this.
|
|
3737
|
-
this.
|
|
3738
|
-
this.
|
|
3739
|
-
this.
|
|
3740
|
-
this.
|
|
3741
|
-
this.
|
|
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.
|
|
3749
|
-
puzzleIDRequest: this.
|
|
3750
|
-
puzzleDescriptionRequest: this.
|
|
3774
|
+
this.puzzleLoader = new PuzzleLoaderProp({
|
|
3775
|
+
puzzleIDRequest: this.puzzleIDRequest,
|
|
3776
|
+
puzzleDescriptionRequest: this.puzzleDescriptionRequest
|
|
3751
3777
|
}, this.userVisibleErrorTracker);
|
|
3752
|
-
this.
|
|
3753
|
-
this.
|
|
3754
|
-
this.
|
|
3755
|
-
algWithIssues: this.
|
|
3756
|
-
kpuzzle: this.
|
|
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.
|
|
3759
|
-
algWithIssues: this.
|
|
3760
|
-
kpuzzle: this.
|
|
3784
|
+
this.puzzleSetupAlg = new PuzzleAlgProp({
|
|
3785
|
+
algWithIssues: this.setupAlg,
|
|
3786
|
+
kpuzzle: this.kpuzzle
|
|
3761
3787
|
});
|
|
3762
|
-
this.
|
|
3763
|
-
visualizationRequest: this.
|
|
3764
|
-
puzzleID: this.
|
|
3788
|
+
this.visualizationStrategy = new VisualizationStrategyProp({
|
|
3789
|
+
visualizationRequest: this.visualizationFormat,
|
|
3790
|
+
puzzleID: this.puzzleID
|
|
3765
3791
|
});
|
|
3766
|
-
this.
|
|
3767
|
-
alg: this.
|
|
3768
|
-
puzzle: this.
|
|
3769
|
-
visualizationStrategy: this.
|
|
3770
|
-
indexerConstructorRequest: this.
|
|
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.
|
|
3773
|
-
this.
|
|
3774
|
-
orbitCoordinatesRequest: this.
|
|
3775
|
-
latitudeLimit: this.
|
|
3776
|
-
puzzleID: this.
|
|
3777
|
-
strategy: this.
|
|
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.
|
|
3780
|
-
|
|
3781
|
-
kpuzzle: this.
|
|
3805
|
+
this.setupAlgTransformation = new AlgTransformationProp({
|
|
3806
|
+
setupAlg: this.puzzleSetupAlg,
|
|
3807
|
+
kpuzzle: this.kpuzzle
|
|
3782
3808
|
});
|
|
3783
|
-
this.
|
|
3784
|
-
indexerConstructor: this.
|
|
3785
|
-
algWithIssues: this.
|
|
3786
|
-
kpuzzle: this.
|
|
3809
|
+
this.indexer = new IndexerProp({
|
|
3810
|
+
indexerConstructor: this.indexerConstructor,
|
|
3811
|
+
algWithIssues: this.puzzleAlg,
|
|
3812
|
+
kpuzzle: this.kpuzzle
|
|
3787
3813
|
});
|
|
3788
|
-
this.
|
|
3789
|
-
|
|
3790
|
-
|
|
3791
|
-
|
|
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.
|
|
3794
|
-
indexer: this.
|
|
3820
|
+
this.timeRange = new TimeRangeProp({
|
|
3821
|
+
indexer: this.indexer
|
|
3795
3822
|
});
|
|
3796
|
-
this.
|
|
3797
|
-
timestampRequest: this.
|
|
3798
|
-
timeRange: this.
|
|
3799
|
-
setupAnchor: this.
|
|
3823
|
+
this.detailedTimelineInfo = new DetailedTimelineInfoProp({
|
|
3824
|
+
timestampRequest: this.timestampRequest,
|
|
3825
|
+
timeRange: this.timeRange,
|
|
3826
|
+
setupAnchor: this.setupAnchor
|
|
3800
3827
|
});
|
|
3801
|
-
this.
|
|
3802
|
-
detailedTimelineInfo: this.
|
|
3803
|
-
playingInfo: this.
|
|
3828
|
+
this.coarseTimelineInfo = new CoarseTimelineInfoProp({
|
|
3829
|
+
detailedTimelineInfo: this.detailedTimelineInfo,
|
|
3830
|
+
playingInfo: this.playingInfo
|
|
3804
3831
|
});
|
|
3805
|
-
this.
|
|
3806
|
-
indexer: this.
|
|
3807
|
-
detailedTimelineInfo: this.
|
|
3808
|
-
catchUpMove: this.
|
|
3832
|
+
this.currentMoveInfo = new CurrentMoveInfoProp({
|
|
3833
|
+
indexer: this.indexer,
|
|
3834
|
+
detailedTimelineInfo: this.detailedTimelineInfo,
|
|
3835
|
+
catchUpMove: this.catchUpMove
|
|
3809
3836
|
});
|
|
3810
|
-
this.
|
|
3811
|
-
coarseTimelineInfo: this.
|
|
3812
|
-
viewerLink: this.
|
|
3837
|
+
this.buttonAppearance = new ButtonAppearanceProp({
|
|
3838
|
+
coarseTimelineInfo: this.coarseTimelineInfo,
|
|
3839
|
+
viewerLink: this.viewerLink
|
|
3813
3840
|
});
|
|
3814
|
-
this.
|
|
3815
|
-
currentMoveInfo: this.
|
|
3841
|
+
this.currentLeavesSimplified = new CurrentLeavesSimplifiedProp({
|
|
3842
|
+
currentMoveInfo: this.currentMoveInfo
|
|
3816
3843
|
});
|
|
3817
|
-
this.
|
|
3818
|
-
anchoredStart: this.
|
|
3819
|
-
currentLeavesSimplified: this.
|
|
3820
|
-
indexer: this.
|
|
3844
|
+
this.currentState = new CurrentStateProp({
|
|
3845
|
+
anchoredStart: this.anchorTransformation,
|
|
3846
|
+
currentLeavesSimplified: this.currentLeavesSimplified,
|
|
3847
|
+
indexer: this.indexer
|
|
3821
3848
|
});
|
|
3822
|
-
this.
|
|
3823
|
-
currentMoveInfo: this.
|
|
3824
|
-
state: this.
|
|
3849
|
+
this.legacyPosition = new LegacyPositionProp({
|
|
3850
|
+
currentMoveInfo: this.currentMoveInfo,
|
|
3851
|
+
state: this.currentState
|
|
3825
3852
|
});
|
|
3826
3853
|
}
|
|
3827
3854
|
async twizzleLink() {
|
|
3828
|
-
const
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
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 (
|
|
3849
|
-
url.searchParams.set("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.
|
|
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.
|
|
3862
|
-
this.
|
|
3863
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
4064
|
+
return (await this.model.alg.get()).alg;
|
|
4020
4065
|
}
|
|
4021
4066
|
async setupAlg() {
|
|
4022
|
-
return (await this.model.
|
|
4067
|
+
return (await this.model.setupAlg.get()).alg;
|
|
4023
4068
|
}
|
|
4024
4069
|
puzzleID() {
|
|
4025
|
-
return this.model.
|
|
4070
|
+
return this.model.puzzleID.get();
|
|
4026
4071
|
}
|
|
4027
4072
|
async timestamp() {
|
|
4028
|
-
return (await this.model.
|
|
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
|
|
4139
|
+
const scrubber = new TwistyScrubber(this.experimentalModel);
|
|
4095
4140
|
this.contentWrapper.appendChild(scrubber);
|
|
4096
|
-
this.buttons = new
|
|
4141
|
+
this.buttons = new TwistyButtons(this.experimentalModel, this.controller, this);
|
|
4097
4142
|
this.contentWrapper.appendChild(this.buttons);
|
|
4098
|
-
this.experimentalModel.
|
|
4143
|
+
this.experimentalModel.background.addFreshListener((backgroundTheme) => {
|
|
4099
4144
|
this.contentWrapper.classList.toggle("checkered", backgroundTheme !== "none");
|
|
4100
4145
|
});
|
|
4101
|
-
this.experimentalModel.
|
|
4146
|
+
this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
|
|
4102
4147
|
__privateGet(this, _controlsManager).setValue(controlPanel);
|
|
4103
4148
|
});
|
|
4104
|
-
this.experimentalModel.
|
|
4105
|
-
this.experimentalModel.
|
|
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.
|
|
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.
|
|
4523
|
+
this.twistyPlayer.experimentalModel.alg.addFreshListener((algWithIssues) => {
|
|
4479
4524
|
this.setAlg(algWithIssues.alg);
|
|
4480
4525
|
});
|
|
4481
|
-
const sourceAlg = (await this.twistyPlayer.experimentalModel.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 ?? "
|
|
4830
|
-
if (options?.twistyPlayerProp === "
|
|
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) !== "
|
|
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) !== "
|
|
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) === "
|
|
4908
|
-
__privateGet(this, _twistyPlayer)?.experimentalModel.
|
|
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.
|
|
4928
|
-
await twistyPlayer.experimentalModel.
|
|
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.
|
|
4998
|
+
twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
|
|
4954
4999
|
}
|
|
4955
5000
|
});
|
|
4956
|
-
twistyPlayer.experimentalModel.
|
|
4957
|
-
const indexer = await twistyPlayer.experimentalModel.
|
|
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.
|
|
5060
|
-
this.listenToAlgProp(model.
|
|
5061
|
-
this.listenToStringSourceProp(model.
|
|
5062
|
-
this.listenToStringSourceProp(model.
|
|
5063
|
-
this.listenToStringOrNoValueProp(model.
|
|
5064
|
-
this.listenToStringOrNoValueProp(model.
|
|
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
|
-
|
|
5131
|
-
this.
|
|
5132
|
-
this.a = this.querySelector("a");
|
|
5178
|
+
fallback() {
|
|
5179
|
+
this.contentWrapper.textContent = "";
|
|
5133
5180
|
if (this.a) {
|
|
5134
|
-
const
|
|
5135
|
-
|
|
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,
|