cubing 0.30.0 → 0.31.1
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/dist/esm/alg/index.js +3 -1
- package/dist/esm/bluetooth/index.js +5 -5
- package/dist/esm/bluetooth/index.js.map +2 -2
- package/dist/esm/{chunk-KOAJIBEX.js → chunk-52L7V4XF.js} +32 -27
- package/dist/esm/chunk-52L7V4XF.js.map +7 -0
- package/dist/esm/{chunk-4QZRHN6S.js → chunk-55WSHQFP.js} +6 -8
- package/dist/esm/{chunk-4QZRHN6S.js.map → chunk-55WSHQFP.js.map} +2 -2
- package/dist/esm/{chunk-5OQ34D3X.js → chunk-A3PA5E45.js} +4 -4
- package/dist/esm/{chunk-5OQ34D3X.js.map → chunk-A3PA5E45.js.map} +2 -2
- package/dist/esm/{chunk-C6KMV2PL.js → chunk-G6MFOXW4.js} +10 -11
- package/dist/esm/chunk-G6MFOXW4.js.map +7 -0
- package/dist/esm/{chunk-6FB2XWAK.js → chunk-JCIUBLD5.js} +138 -183
- package/dist/esm/chunk-JCIUBLD5.js.map +7 -0
- package/dist/esm/{chunk-RI2DAEY6.js → chunk-JW5R6EBK.js} +2 -2
- package/dist/esm/{chunk-RI2DAEY6.js.map → chunk-JW5R6EBK.js.map} +0 -0
- package/dist/esm/{chunk-GQBRF4EM.js → chunk-MHP4YJE7.js} +7 -9
- package/dist/esm/chunk-MHP4YJE7.js.map +7 -0
- package/dist/esm/{chunk-ZQT3QSWD.js → chunk-PVI43RDV.js} +16 -13
- package/dist/esm/chunk-PVI43RDV.js.map +7 -0
- package/dist/esm/{chunk-35OK6TQ4.js → chunk-VTO7WPWK.js} +28 -19
- package/dist/esm/chunk-VTO7WPWK.js.map +7 -0
- package/dist/esm/{chunk-VIUWS2PX.js → chunk-XNPPG3BV.js} +3 -3
- package/dist/esm/chunk-XNPPG3BV.js.map +7 -0
- package/dist/esm/kpuzzle/index.js +2 -2
- package/dist/esm/notation/index.js +2 -2
- package/dist/esm/protocol/index.js +4 -4
- package/dist/esm/puzzle-geometry/index.js +6 -18
- package/dist/esm/puzzle-geometry/index.js.map +2 -2
- package/dist/esm/puzzles/index.js +4 -4
- package/dist/esm/scramble/index.js +2 -2
- package/dist/esm/search/index.js +6 -6
- package/dist/esm/{search-dynamic-sgs-side-events-XNTCWRI4.js → search-dynamic-sgs-side-events-UIAYYZRR.js} +6 -6
- package/dist/esm/{search-dynamic-sgs-side-events-XNTCWRI4.js.map → search-dynamic-sgs-side-events-UIAYYZRR.js.map} +0 -0
- package/dist/esm/{search-dynamic-sgs-unofficial-5KMZ747E.js → search-dynamic-sgs-unofficial-7XRXANEX.js} +6 -6
- package/dist/esm/{search-dynamic-sgs-unofficial-5KMZ747E.js.map → search-dynamic-sgs-unofficial-7XRXANEX.js.map} +0 -0
- package/dist/esm/{search-dynamic-solve-3x3x3-TSXPWENP.js → search-dynamic-solve-3x3x3-DDVSUP2C.js} +275 -290
- package/dist/esm/search-dynamic-solve-3x3x3-DDVSUP2C.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-4x4x4-FKQ2JWK2.js → search-dynamic-solve-4x4x4-K5LUSS2B.js} +6 -6
- package/dist/esm/{search-dynamic-solve-4x4x4-FKQ2JWK2.js.map → search-dynamic-solve-4x4x4-K5LUSS2B.js.map} +0 -0
- package/dist/esm/{search-dynamic-solve-fto-GPLW7S5F.js → search-dynamic-solve-fto-MA4X6JEE.js} +6 -16
- package/dist/esm/search-dynamic-solve-fto-MA4X6JEE.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-kilominx-HB2QFUGF.js → search-dynamic-solve-kilominx-XDOKK3ZV.js} +2 -2
- package/dist/esm/search-dynamic-solve-kilominx-XDOKK3ZV.js.map +7 -0
- package/dist/esm/{search-dynamic-solve-master_tetraminx-LR3LJI7O.js → search-dynamic-solve-master_tetraminx-YKINTRUU.js} +4 -10
- package/dist/esm/search-dynamic-solve-master_tetraminx-YKINTRUU.js.map +7 -0
- package/dist/esm/{search-worker-inside-generated-string-5HKZNHKK.js → search-worker-inside-generated-string-LBOAERDX.js} +28 -28
- package/dist/esm/search-worker-inside-generated-string-LBOAERDX.js.map +7 -0
- package/dist/esm/{search-worker-js-entry-PDXEE46R.js → search-worker-js-entry-4MMPUMST.js} +30 -36
- package/dist/esm/{search-worker-js-entry-PDXEE46R.js.map → search-worker-js-entry-4MMPUMST.js.map} +2 -2
- package/dist/esm/{search-worker-ts-entry-UV2RY2EY.js → search-worker-ts-entry-LBKZYRBU.js} +2 -2
- package/dist/esm/{search-worker-ts-entry-UV2RY2EY.js.map → search-worker-ts-entry-LBKZYRBU.js.map} +0 -0
- package/dist/esm/stream/index.js +1 -1
- package/dist/esm/stream/index.js.map +2 -2
- package/dist/esm/twisty/index.js +381 -250
- package/dist/esm/twisty/index.js.map +4 -4
- package/dist/esm/{twisty-dynamic-3d-GPF6TW32.js → twisty-dynamic-3d-TFI45NMX.js} +125 -106
- package/dist/esm/twisty-dynamic-3d-TFI45NMX.js.map +7 -0
- package/dist/types/{Alg-1c8c3757.d.ts → Alg-d3ac9660.d.ts} +53 -4
- package/dist/types/{KState-7c9e40f4.d.ts → KState-0a9388d0.d.ts} +1 -1
- package/dist/types/{TwizzleLink-3f8a01d2.d.ts → TwizzleLink-79b17516.d.ts} +63 -41
- package/dist/types/alg/index.d.ts +9 -6
- package/dist/types/bluetooth/index.d.ts +4 -4
- package/dist/types/{bluetooth-puzzle-a64e9756.d.ts → bluetooth-puzzle-83ade5b5.d.ts} +2 -2
- package/dist/types/kpuzzle/index.d.ts +2 -2
- package/dist/types/notation/index.d.ts +1 -1
- package/dist/types/{outside-b62aa614.d.ts → outside-6a613add.d.ts} +2 -2
- package/dist/types/{parseAlg-d5fbee87.d.ts → parseAlg-3bb4dddb.d.ts} +1 -1
- package/dist/types/protocol/index.d.ts +2 -2
- package/dist/types/puzzle-geometry/index.d.ts +3 -3
- package/dist/types/puzzles/index.d.ts +5 -5
- package/dist/types/scramble/index.d.ts +3 -3
- package/dist/types/search/index.d.ts +3 -3
- package/dist/types/stream/index.d.ts +3 -3
- package/dist/types/twisty/index.d.ts +6 -6
- package/package.json +11 -5
- package/dist/esm/.DS_Store +0 -0
- package/dist/esm/chunk-35OK6TQ4.js.map +0 -7
- package/dist/esm/chunk-6FB2XWAK.js.map +0 -7
- package/dist/esm/chunk-C6KMV2PL.js.map +0 -7
- package/dist/esm/chunk-GQBRF4EM.js.map +0 -7
- package/dist/esm/chunk-KOAJIBEX.js.map +0 -7
- package/dist/esm/chunk-VIUWS2PX.js.map +0 -7
- package/dist/esm/chunk-ZQT3QSWD.js.map +0 -7
- package/dist/esm/search-dynamic-solve-3x3x3-TSXPWENP.js.map +0 -7
- package/dist/esm/search-dynamic-solve-fto-GPLW7S5F.js.map +0 -7
- package/dist/esm/search-dynamic-solve-kilominx-HB2QFUGF.js.map +0 -7
- package/dist/esm/search-dynamic-solve-master_tetraminx-LR3LJI7O.js.map +0 -7
- package/dist/esm/search-worker-inside-generated-string-5HKZNHKK.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-GPF6TW32.js.map +0 -7
package/dist/esm/twisty/index.js
CHANGED
|
@@ -18,20 +18,21 @@ import {
|
|
|
18
18
|
rawRenderPooled,
|
|
19
19
|
setCameraFromOrbitCoordinates,
|
|
20
20
|
setTwistyDebug
|
|
21
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-52L7V4XF.js";
|
|
22
22
|
import "../chunk-QHWK5RXN.js";
|
|
23
23
|
import {
|
|
24
24
|
countAnimatedLeaves,
|
|
25
25
|
countMoves
|
|
26
|
-
} from "../chunk-
|
|
26
|
+
} from "../chunk-G6MFOXW4.js";
|
|
27
27
|
import {
|
|
28
28
|
cube3x3x3,
|
|
29
29
|
puzzles
|
|
30
|
-
} from "../chunk-
|
|
30
|
+
} from "../chunk-VTO7WPWK.js";
|
|
31
31
|
import {
|
|
32
|
-
customPGPuzzleLoader
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
customPGPuzzleLoader,
|
|
33
|
+
getPieceStickeringMask
|
|
34
|
+
} from "../chunk-JCIUBLD5.js";
|
|
35
|
+
import "../chunk-MHP4YJE7.js";
|
|
35
36
|
import {
|
|
36
37
|
Alg,
|
|
37
38
|
AlgBuilder,
|
|
@@ -43,8 +44,9 @@ import {
|
|
|
43
44
|
TraversalUp,
|
|
44
45
|
direct,
|
|
45
46
|
directedGenerator,
|
|
46
|
-
experimentalAppendMove
|
|
47
|
-
|
|
47
|
+
experimentalAppendMove,
|
|
48
|
+
functionFromTraversal
|
|
49
|
+
} from "../chunk-PVI43RDV.js";
|
|
48
50
|
|
|
49
51
|
// src/cubing/twisty/controllers/AnimationTypes.ts
|
|
50
52
|
function directionScalar(direction) {
|
|
@@ -380,42 +382,6 @@ var twistyViewerWrapperCSS = new CSSSource(
|
|
|
380
382
|
`
|
|
381
383
|
);
|
|
382
384
|
|
|
383
|
-
// src/cubing/twisty/views/2D/Twisty2DPuzzle.css.ts
|
|
384
|
-
var twisty2DSVGCSS = new CSSSource(
|
|
385
|
-
`
|
|
386
|
-
:host {
|
|
387
|
-
width: 384px;
|
|
388
|
-
height: 256px;
|
|
389
|
-
display: grid;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
.wrapper {
|
|
393
|
-
width: 100%;
|
|
394
|
-
height: 100%;
|
|
395
|
-
display: grid;
|
|
396
|
-
overflow: hidden;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
.svg-wrapper,
|
|
400
|
-
twisty-2d-svg,
|
|
401
|
-
svg {
|
|
402
|
-
width: 100%;
|
|
403
|
-
height: 100%;
|
|
404
|
-
display: grid;
|
|
405
|
-
min-height: 0;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
svg {
|
|
409
|
-
animation: fade-in 0.25s ease-in;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
@keyframes fade-in {
|
|
413
|
-
from { opacity: 0; }
|
|
414
|
-
to { opacity: 1; }
|
|
415
|
-
}
|
|
416
|
-
`
|
|
417
|
-
);
|
|
418
|
-
|
|
419
385
|
// src/cubing/twisty/views/2D/KPuzzleSVGWrapper.ts
|
|
420
386
|
var xmlns = "http://www.w3.org/2000/svg";
|
|
421
387
|
var svgCounter = 0;
|
|
@@ -458,7 +424,7 @@ var colorMaps = {
|
|
|
458
424
|
}
|
|
459
425
|
};
|
|
460
426
|
var KPuzzleSVGWrapper = class {
|
|
461
|
-
constructor(kpuzzle, svgSource,
|
|
427
|
+
constructor(kpuzzle, svgSource, experimentalStickeringMask) {
|
|
462
428
|
this.kpuzzle = kpuzzle;
|
|
463
429
|
this.originalColors = {};
|
|
464
430
|
this.gradients = {};
|
|
@@ -488,26 +454,26 @@ var KPuzzleSVGWrapper = class {
|
|
|
488
454
|
const id = this.elementID(orbitName, idx, orientation);
|
|
489
455
|
const elem = this.elementByID(id);
|
|
490
456
|
let originalColor = elem.style.fill;
|
|
491
|
-
if (
|
|
457
|
+
if (experimentalStickeringMask) {
|
|
492
458
|
(() => {
|
|
493
|
-
const a =
|
|
459
|
+
const a = experimentalStickeringMask.orbits;
|
|
494
460
|
if (!a) {
|
|
495
461
|
return;
|
|
496
462
|
}
|
|
497
|
-
const
|
|
498
|
-
if (!
|
|
463
|
+
const orbitStickeringMask = a[orbitName];
|
|
464
|
+
if (!orbitStickeringMask) {
|
|
499
465
|
return;
|
|
500
466
|
}
|
|
501
|
-
const
|
|
502
|
-
if (!
|
|
467
|
+
const pieceStickeringMask = orbitStickeringMask.pieces[idx];
|
|
468
|
+
if (!pieceStickeringMask) {
|
|
503
469
|
return;
|
|
504
470
|
}
|
|
505
|
-
const
|
|
506
|
-
if (!
|
|
471
|
+
const faceletStickeringMasks = pieceStickeringMask.facelets[orientation];
|
|
472
|
+
if (!faceletStickeringMasks) {
|
|
507
473
|
return;
|
|
508
474
|
}
|
|
509
|
-
const
|
|
510
|
-
const colorMap = colorMaps[
|
|
475
|
+
const stickeringMask = typeof faceletStickeringMasks === "string" ? faceletStickeringMasks : faceletStickeringMasks?.mask;
|
|
476
|
+
const colorMap = colorMaps[stickeringMask];
|
|
511
477
|
if (colorMap) {
|
|
512
478
|
originalColor = colorMap[originalColor];
|
|
513
479
|
}
|
|
@@ -641,6 +607,42 @@ var KPuzzleSVGWrapper = class {
|
|
|
641
607
|
}
|
|
642
608
|
};
|
|
643
609
|
|
|
610
|
+
// src/cubing/twisty/views/2D/Twisty2DPuzzle.css.ts
|
|
611
|
+
var twisty2DSVGCSS = new CSSSource(
|
|
612
|
+
`
|
|
613
|
+
:host {
|
|
614
|
+
width: 384px;
|
|
615
|
+
height: 256px;
|
|
616
|
+
display: grid;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.wrapper {
|
|
620
|
+
width: 100%;
|
|
621
|
+
height: 100%;
|
|
622
|
+
display: grid;
|
|
623
|
+
overflow: hidden;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.svg-wrapper,
|
|
627
|
+
twisty-2d-svg,
|
|
628
|
+
svg {
|
|
629
|
+
width: 100%;
|
|
630
|
+
height: 100%;
|
|
631
|
+
display: grid;
|
|
632
|
+
min-height: 0;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
svg {
|
|
636
|
+
animation: fade-in 0.25s ease-in;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
@keyframes fade-in {
|
|
640
|
+
from { opacity: 0; }
|
|
641
|
+
to { opacity: 1; }
|
|
642
|
+
}
|
|
643
|
+
`
|
|
644
|
+
);
|
|
645
|
+
|
|
644
646
|
// src/cubing/twisty/views/2D/Twisty2DPuzzle.ts
|
|
645
647
|
var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
646
648
|
constructor(model, kpuzzle, svgSource, options, puzzleLoader) {
|
|
@@ -655,17 +657,22 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
655
657
|
this.#freshListenerManager = new FreshListenerManager();
|
|
656
658
|
this.addCSS(twisty2DSVGCSS);
|
|
657
659
|
this.resetSVG();
|
|
658
|
-
this.#freshListenerManager.addListener(
|
|
659
|
-
|
|
660
|
-
|
|
660
|
+
this.#freshListenerManager.addListener(
|
|
661
|
+
this.model.puzzleID,
|
|
662
|
+
(puzzleID) => {
|
|
663
|
+
if (puzzleLoader?.id !== puzzleID) {
|
|
664
|
+
this.disconnect();
|
|
665
|
+
}
|
|
661
666
|
}
|
|
662
|
-
|
|
667
|
+
);
|
|
663
668
|
this.#freshListenerManager.addListener(
|
|
664
669
|
this.model.legacyPosition,
|
|
665
670
|
this.onPositionChange.bind(this)
|
|
666
671
|
);
|
|
667
|
-
if (this.options?.
|
|
668
|
-
this.
|
|
672
|
+
if (this.options?.experimentalStickeringMask) {
|
|
673
|
+
this.experimentalSetStickeringMask(
|
|
674
|
+
this.options.experimentalStickeringMask
|
|
675
|
+
);
|
|
669
676
|
}
|
|
670
677
|
}
|
|
671
678
|
#cachedPosition;
|
|
@@ -703,16 +710,10 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
703
710
|
scheduleRender() {
|
|
704
711
|
this.scheduler.requestAnimFrame();
|
|
705
712
|
}
|
|
706
|
-
|
|
707
|
-
(
|
|
708
|
-
if (!this.puzzleLoader?.appearance) {
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
const appearance = await this.puzzleLoader.appearance(stickering);
|
|
712
|
-
this.resetSVG(appearance);
|
|
713
|
-
})();
|
|
713
|
+
experimentalSetStickeringMask(stickeringMask) {
|
|
714
|
+
this.resetSVG(stickeringMask);
|
|
714
715
|
}
|
|
715
|
-
resetSVG(
|
|
716
|
+
resetSVG(stickeringMask) {
|
|
716
717
|
if (this.svgWrapper) {
|
|
717
718
|
this.removeElement(this.svgWrapper.wrapperElement);
|
|
718
719
|
}
|
|
@@ -722,7 +723,7 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
722
723
|
this.svgWrapper = new KPuzzleSVGWrapper(
|
|
723
724
|
this.kpuzzle,
|
|
724
725
|
this.svgSource,
|
|
725
|
-
|
|
726
|
+
stickeringMask
|
|
726
727
|
);
|
|
727
728
|
this.addElement(this.svgWrapper.wrapperElement);
|
|
728
729
|
if (this.#cachedPosition) {
|
|
@@ -742,9 +743,14 @@ var Twisty2DPuzzleWrapper = class {
|
|
|
742
743
|
this.puzzleLoader = puzzleLoader;
|
|
743
744
|
this.effectiveVisualization = effectiveVisualization;
|
|
744
745
|
this.twisty2DPuzzle();
|
|
745
|
-
this.#freshListenerManager.addListener(
|
|
746
|
-
|
|
747
|
-
|
|
746
|
+
this.#freshListenerManager.addListener(
|
|
747
|
+
this.model.twistySceneModel.stickeringMask,
|
|
748
|
+
async (stickeringMask) => {
|
|
749
|
+
(await this.twisty2DPuzzle()).experimentalSetStickeringMask(
|
|
750
|
+
stickeringMask
|
|
751
|
+
);
|
|
752
|
+
}
|
|
753
|
+
);
|
|
748
754
|
}
|
|
749
755
|
#freshListenerManager = new FreshListenerManager();
|
|
750
756
|
disconnect() {
|
|
@@ -871,56 +877,61 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
871
877
|
this.puzzleLoader = puzzleLoader;
|
|
872
878
|
this.visualizationStrategy = visualizationStrategy;
|
|
873
879
|
this.twisty3DPuzzle();
|
|
874
|
-
this.#freshListenerManager.addListener(
|
|
875
|
-
|
|
876
|
-
|
|
880
|
+
this.#freshListenerManager.addListener(
|
|
881
|
+
this.model.puzzleLoader,
|
|
882
|
+
(puzzleLoader2) => {
|
|
883
|
+
if (this.puzzleLoader.id !== puzzleLoader2.id) {
|
|
884
|
+
this.disconnect();
|
|
885
|
+
}
|
|
877
886
|
}
|
|
878
|
-
|
|
879
|
-
this.#freshListenerManager.addListener(
|
|
880
|
-
|
|
881
|
-
|
|
887
|
+
);
|
|
888
|
+
this.#freshListenerManager.addListener(
|
|
889
|
+
this.model.legacyPosition,
|
|
890
|
+
async (position) => {
|
|
891
|
+
try {
|
|
892
|
+
(await this.twisty3DPuzzle()).onPositionChange(position);
|
|
893
|
+
this.scheduleRender();
|
|
894
|
+
} catch (e) {
|
|
895
|
+
this.disconnect();
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
);
|
|
899
|
+
this.#freshListenerManager.addListener(
|
|
900
|
+
this.model.twistySceneModel.hintFacelet,
|
|
901
|
+
async (hintFaceletStyle) => {
|
|
902
|
+
(await this.twisty3DPuzzle()).experimentalUpdateOptions({
|
|
903
|
+
hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
|
|
904
|
+
});
|
|
882
905
|
this.scheduleRender();
|
|
883
|
-
} catch (e) {
|
|
884
|
-
this.disconnect();
|
|
885
906
|
}
|
|
886
|
-
|
|
887
|
-
this.#freshListenerManager.addListener(
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
this.#freshListenerManager.addListener(this.model.twistySceneModel.foundationDisplay, async (foundationDisplay) => {
|
|
894
|
-
(await this.twisty3DPuzzle()).experimentalUpdateOptions({
|
|
895
|
-
showFoundation: foundationDisplay !== "none"
|
|
896
|
-
});
|
|
897
|
-
this.scheduleRender();
|
|
898
|
-
});
|
|
899
|
-
this.#freshListenerManager.addListener(this.model.twistySceneModel.stickering, async (stickering) => {
|
|
900
|
-
if ("setStickering" in await this.twisty3DPuzzle()) {
|
|
901
|
-
(await this.twisty3DPuzzle()).setStickering(stickering);
|
|
907
|
+
);
|
|
908
|
+
this.#freshListenerManager.addListener(
|
|
909
|
+
this.model.twistySceneModel.foundationDisplay,
|
|
910
|
+
async (foundationDisplay) => {
|
|
911
|
+
(await this.twisty3DPuzzle()).experimentalUpdateOptions({
|
|
912
|
+
showFoundation: foundationDisplay !== "none"
|
|
913
|
+
});
|
|
902
914
|
this.scheduleRender();
|
|
903
|
-
} else {
|
|
904
|
-
if ("appearance" in this.puzzleLoader) {
|
|
905
|
-
const [twisty3D, appearancePromise] = await Promise.all([
|
|
906
|
-
this.twisty3DPuzzle(),
|
|
907
|
-
this.puzzleLoader.appearance(stickering ?? "full")
|
|
908
|
-
]);
|
|
909
|
-
twisty3D.experimentalSetAppearance(appearancePromise);
|
|
910
|
-
this.scheduleRender();
|
|
911
|
-
}
|
|
912
915
|
}
|
|
913
|
-
|
|
916
|
+
);
|
|
917
|
+
this.#freshListenerManager.addListener(
|
|
918
|
+
this.model.twistySceneModel.stickeringMask,
|
|
919
|
+
async (stickeringMask) => {
|
|
920
|
+
const twisty3D = await this.twisty3DPuzzle();
|
|
921
|
+
twisty3D.setStickeringMask(stickeringMask);
|
|
922
|
+
this.scheduleRender();
|
|
923
|
+
}
|
|
924
|
+
);
|
|
914
925
|
this.#freshListenerManager.addMultiListener3(
|
|
915
926
|
[
|
|
916
|
-
this.model.twistySceneModel.
|
|
927
|
+
this.model.twistySceneModel.stickeringMask,
|
|
917
928
|
this.model.twistySceneModel.foundationStickerSprite,
|
|
918
929
|
this.model.twistySceneModel.hintStickerSprite
|
|
919
930
|
],
|
|
920
931
|
async (inputs) => {
|
|
921
932
|
if ("experimentalUpdateTexture" in await this.twisty3DPuzzle()) {
|
|
922
933
|
(await this.twisty3DPuzzle()).experimentalUpdateTexture(
|
|
923
|
-
inputs[0] === "picture",
|
|
934
|
+
inputs[0].specialBehaviour === "picture",
|
|
924
935
|
inputs[1],
|
|
925
936
|
inputs[2]
|
|
926
937
|
);
|
|
@@ -942,16 +953,19 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
942
953
|
return this.#cachedTwisty3DPuzzle ?? (this.#cachedTwisty3DPuzzle = (async () => {
|
|
943
954
|
const proxyPromise = proxy3D();
|
|
944
955
|
if (this.puzzleLoader.id === "3x3x3" && this.visualizationStrategy === "Cube3D") {
|
|
945
|
-
const [foundationSprite, hintSprite,
|
|
956
|
+
const [foundationSprite, hintSprite, experimentalStickeringMask] = await Promise.all([
|
|
946
957
|
this.model.twistySceneModel.foundationStickerSprite.get(),
|
|
947
958
|
this.model.twistySceneModel.hintStickerSprite.get(),
|
|
948
|
-
this.model.twistySceneModel.
|
|
959
|
+
this.model.twistySceneModel.stickeringMask.get()
|
|
949
960
|
]);
|
|
950
|
-
return (await proxyPromise).cube3DShim(
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
961
|
+
return (await proxyPromise).cube3DShim(
|
|
962
|
+
() => this.schedulable.scheduleRender(),
|
|
963
|
+
{
|
|
964
|
+
foundationSprite,
|
|
965
|
+
hintSprite,
|
|
966
|
+
experimentalStickeringMask
|
|
967
|
+
}
|
|
968
|
+
);
|
|
955
969
|
} else {
|
|
956
970
|
const [hintFacelets, foundationSprite, hintSprite] = await Promise.all([
|
|
957
971
|
this.model.twistySceneModel.hintFacelet.get(),
|
|
@@ -1637,13 +1651,15 @@ async function screenshot(model, options) {
|
|
|
1637
1651
|
puzzleLoader,
|
|
1638
1652
|
visualizationStrategy,
|
|
1639
1653
|
_stickering,
|
|
1654
|
+
_stickeringMaskRequest,
|
|
1640
1655
|
_legacyPosition,
|
|
1641
1656
|
orbitCoordinates
|
|
1642
1657
|
] = await Promise.all([
|
|
1643
1658
|
THREEJS,
|
|
1644
1659
|
await model.puzzleLoader.get(),
|
|
1645
1660
|
await model.visualizationStrategy.get(),
|
|
1646
|
-
await model.twistySceneModel.
|
|
1661
|
+
await model.twistySceneModel.stickeringRequest.get(),
|
|
1662
|
+
await model.twistySceneModel.stickeringMaskRequest.get(),
|
|
1647
1663
|
await model.legacyPosition.get(),
|
|
1648
1664
|
await model.twistySceneModel.orbitCoordinates.get()
|
|
1649
1665
|
]);
|
|
@@ -2075,9 +2091,7 @@ var SimpleAlgIndexer = class {
|
|
|
2075
2091
|
return i;
|
|
2076
2092
|
}
|
|
2077
2093
|
stateAtIndex(index) {
|
|
2078
|
-
return this.kpuzzle.startState().applyTransformation(
|
|
2079
|
-
this.transformationAtIndex(index)
|
|
2080
|
-
);
|
|
2094
|
+
return this.kpuzzle.startState().applyTransformation(this.transformationAtIndex(index));
|
|
2081
2095
|
}
|
|
2082
2096
|
transformationAtIndex(index) {
|
|
2083
2097
|
let state = this.kpuzzle.identityTransformation();
|
|
@@ -2220,10 +2234,7 @@ var LocalSimulMoves = class extends TraversalUp {
|
|
|
2220
2234
|
return [];
|
|
2221
2235
|
}
|
|
2222
2236
|
};
|
|
2223
|
-
var
|
|
2224
|
-
var localSimulMoves = localSimulMovesInstance.traverseAlg.bind(
|
|
2225
|
-
localSimulMovesInstance
|
|
2226
|
-
);
|
|
2237
|
+
var localSimulMoves = functionFromTraversal(LocalSimulMoves);
|
|
2227
2238
|
function simulMoves(a) {
|
|
2228
2239
|
let timestamp = 0;
|
|
2229
2240
|
const l = localSimulMoves(a).map(
|
|
@@ -2440,7 +2451,7 @@ var SimultaneousMoveIndexer = class {
|
|
|
2440
2451
|
};
|
|
2441
2452
|
|
|
2442
2453
|
// src/cubing/twisty/controllers/indexer/tree/AlgWalker.ts
|
|
2443
|
-
var
|
|
2454
|
+
var AlgWalkerDecoration = class {
|
|
2444
2455
|
constructor(moveCount, duration, forward, backward, children = []) {
|
|
2445
2456
|
this.moveCount = moveCount;
|
|
2446
2457
|
this.duration = duration;
|
|
@@ -2458,7 +2469,7 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2458
2469
|
);
|
|
2459
2470
|
this.cache = {};
|
|
2460
2471
|
this.identity = kpuzzle.identityTransformation();
|
|
2461
|
-
this.dummyLeaf = new
|
|
2472
|
+
this.dummyLeaf = new AlgWalkerDecoration(
|
|
2462
2473
|
0,
|
|
2463
2474
|
0,
|
|
2464
2475
|
this.identity,
|
|
@@ -2482,7 +2493,7 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2482
2493
|
}
|
|
2483
2494
|
child.push(apd);
|
|
2484
2495
|
}
|
|
2485
|
-
return new
|
|
2496
|
+
return new AlgWalkerDecoration(
|
|
2486
2497
|
moveCount,
|
|
2487
2498
|
duration,
|
|
2488
2499
|
transformation,
|
|
@@ -2496,19 +2507,19 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2496
2507
|
}
|
|
2497
2508
|
traverseMove(move) {
|
|
2498
2509
|
const key = move.toString();
|
|
2499
|
-
let
|
|
2500
|
-
if (
|
|
2501
|
-
return
|
|
2510
|
+
let r2 = this.cache[key];
|
|
2511
|
+
if (r2) {
|
|
2512
|
+
return r2;
|
|
2502
2513
|
}
|
|
2503
2514
|
const transformation = this.kpuzzle.moveToTransformation(move);
|
|
2504
|
-
|
|
2515
|
+
r2 = new AlgWalkerDecoration(
|
|
2505
2516
|
1,
|
|
2506
2517
|
this.durationFn.traverseAlgNode(move),
|
|
2507
2518
|
transformation,
|
|
2508
2519
|
transformation.invert()
|
|
2509
2520
|
);
|
|
2510
|
-
this.cache[key] =
|
|
2511
|
-
return
|
|
2521
|
+
this.cache[key] = r2;
|
|
2522
|
+
return r2;
|
|
2512
2523
|
}
|
|
2513
2524
|
traverseCommutator(commutator) {
|
|
2514
2525
|
const decA = this.traverseAlg(commutator.A);
|
|
@@ -2516,7 +2527,13 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2516
2527
|
const AB = decA.forward.applyTransformation(decB.forward);
|
|
2517
2528
|
const ApBp = decA.backward.applyTransformation(decB.backward);
|
|
2518
2529
|
const ABApBp = AB.applyTransformation(ApBp);
|
|
2519
|
-
const dec = new
|
|
2530
|
+
const dec = new AlgWalkerDecoration(
|
|
2531
|
+
2 * (decA.moveCount + decB.moveCount),
|
|
2532
|
+
2 * (decA.duration + decB.duration),
|
|
2533
|
+
ABApBp,
|
|
2534
|
+
ABApBp.invert(),
|
|
2535
|
+
[decA, decB]
|
|
2536
|
+
);
|
|
2520
2537
|
return this.mult(dec, 1, [dec, decA, decB]);
|
|
2521
2538
|
}
|
|
2522
2539
|
traverseConjugate(conjugate) {
|
|
@@ -2524,17 +2541,20 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2524
2541
|
const decB = this.traverseAlg(conjugate.B);
|
|
2525
2542
|
const AB = decA.forward.applyTransformation(decB.forward);
|
|
2526
2543
|
const ABAp = AB.applyTransformation(decA.backward);
|
|
2527
|
-
const dec = new
|
|
2528
|
-
decA,
|
|
2529
|
-
decB
|
|
2530
|
-
|
|
2544
|
+
const dec = new AlgWalkerDecoration(
|
|
2545
|
+
2 * decA.moveCount + decB.moveCount,
|
|
2546
|
+
2 * decA.duration + decB.duration,
|
|
2547
|
+
ABAp,
|
|
2548
|
+
ABAp.invert(),
|
|
2549
|
+
[decA, decB]
|
|
2550
|
+
);
|
|
2531
2551
|
return this.mult(dec, 1, [dec, decA, decB]);
|
|
2532
2552
|
}
|
|
2533
2553
|
traversePause(pause) {
|
|
2534
2554
|
if (pause.experimentalNISSGrouping) {
|
|
2535
2555
|
return this.dummyLeaf;
|
|
2536
2556
|
}
|
|
2537
|
-
return new
|
|
2557
|
+
return new AlgWalkerDecoration(
|
|
2538
2558
|
1,
|
|
2539
2559
|
this.durationFn.traverseAlgNode(pause),
|
|
2540
2560
|
this.identity,
|
|
@@ -2550,7 +2570,7 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2550
2570
|
mult(apd, n, child) {
|
|
2551
2571
|
const absn = Math.abs(n);
|
|
2552
2572
|
const st = apd.forward.selfMultiply(n);
|
|
2553
|
-
return new
|
|
2573
|
+
return new AlgWalkerDecoration(
|
|
2554
2574
|
apd.moveCount * absn,
|
|
2555
2575
|
apd.duration * absn,
|
|
2556
2576
|
st,
|
|
@@ -2602,8 +2622,8 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
2602
2622
|
this.moveDuration = 0;
|
|
2603
2623
|
this.back = false;
|
|
2604
2624
|
this.st = this.kpuzzle.identityTransformation();
|
|
2605
|
-
const
|
|
2606
|
-
return
|
|
2625
|
+
const r2 = this.algOrAlgNode.is(Alg) ? this.traverseAlg(this.algOrAlgNode, this.root) : this.traverseAlgNode(this.algOrAlgNode, this.root);
|
|
2626
|
+
return r2;
|
|
2607
2627
|
}
|
|
2608
2628
|
traverseAlg(alg, wd) {
|
|
2609
2629
|
if (!this.firstcheck(wd)) {
|
|
@@ -2814,10 +2834,7 @@ var ChunkAlgs = class extends TraversalUp {
|
|
|
2814
2834
|
return comment;
|
|
2815
2835
|
}
|
|
2816
2836
|
};
|
|
2817
|
-
var
|
|
2818
|
-
var chunkAlgs = chunkAlgsInstance.traverseAlg.bind(
|
|
2819
|
-
chunkAlgsInstance
|
|
2820
|
-
);
|
|
2837
|
+
var chunkAlgs = functionFromTraversal(ChunkAlgs);
|
|
2821
2838
|
|
|
2822
2839
|
// src/cubing/twisty/controllers/indexer/tree/TreeAlgIndexer.ts
|
|
2823
2840
|
var TreeAlgIndexer = class {
|
|
@@ -3237,10 +3254,94 @@ var SpriteProp = class extends TwistyPropDerived {
|
|
|
3237
3254
|
}
|
|
3238
3255
|
};
|
|
3239
3256
|
|
|
3240
|
-
// src/cubing/twisty/model/props/puzzle/display/
|
|
3241
|
-
var
|
|
3257
|
+
// src/cubing/twisty/model/props/puzzle/display/StickeringMaskProp.ts
|
|
3258
|
+
var r = {
|
|
3259
|
+
facelets: ["regular", "regular", "regular", "regular", "regular"]
|
|
3260
|
+
};
|
|
3261
|
+
async function fullStickeringMask(puzzleLoader) {
|
|
3262
|
+
const { definition } = await puzzleLoader.kpuzzle();
|
|
3263
|
+
const fullStickeringMask2 = { orbits: {} };
|
|
3264
|
+
for (const [orbitName, orbitDef] of Object.entries(definition.orbits)) {
|
|
3265
|
+
fullStickeringMask2.orbits[orbitName] = {
|
|
3266
|
+
pieces: new Array(orbitDef.numPieces).fill(r)
|
|
3267
|
+
};
|
|
3268
|
+
}
|
|
3269
|
+
return fullStickeringMask2;
|
|
3270
|
+
}
|
|
3271
|
+
var StickeringMaskProp = class extends TwistyPropDerived {
|
|
3242
3272
|
getDefaultValue() {
|
|
3243
|
-
return
|
|
3273
|
+
return { orbits: {} };
|
|
3274
|
+
}
|
|
3275
|
+
async derive(inputs) {
|
|
3276
|
+
if (inputs.stickeringMaskRequest) {
|
|
3277
|
+
return inputs.stickeringMaskRequest;
|
|
3278
|
+
}
|
|
3279
|
+
if (inputs.stickeringRequest === "picture") {
|
|
3280
|
+
return {
|
|
3281
|
+
specialBehaviour: "picture",
|
|
3282
|
+
orbits: {}
|
|
3283
|
+
};
|
|
3284
|
+
}
|
|
3285
|
+
return inputs.puzzleLoader.stickeringMask?.(
|
|
3286
|
+
inputs.stickeringRequest ?? "full"
|
|
3287
|
+
) ?? fullStickeringMask(inputs.puzzleLoader);
|
|
3288
|
+
}
|
|
3289
|
+
};
|
|
3290
|
+
|
|
3291
|
+
// src/cubing/twisty/model/props/puzzle/display/parseSerializedStickeringMask.ts
|
|
3292
|
+
var charMap = {
|
|
3293
|
+
"-": "Regular" /* Regular */,
|
|
3294
|
+
D: "Dim" /* Dim */,
|
|
3295
|
+
I: "Ignored" /* Ignored */,
|
|
3296
|
+
X: "Invisible" /* Invisible */,
|
|
3297
|
+
O: "IgnoreNonPrimary" /* IgnoreNonPrimary */,
|
|
3298
|
+
P: "PermuteNonPrimary" /* PermuteNonPrimary */,
|
|
3299
|
+
o: "Ignoriented" /* Ignoriented */,
|
|
3300
|
+
"?": "OrientationWithoutPermutation" /* OrientationWithoutPermutation */,
|
|
3301
|
+
"@": "Regular" /* Regular */
|
|
3302
|
+
};
|
|
3303
|
+
function parseSerializedStickeringMask(serializedStickeringMask) {
|
|
3304
|
+
const stickeringMask = {
|
|
3305
|
+
orbits: {}
|
|
3306
|
+
};
|
|
3307
|
+
const serializedOrbits = serializedStickeringMask.split(",");
|
|
3308
|
+
for (const serializedOrbit of serializedOrbits) {
|
|
3309
|
+
const [orbitName, serializedOrbitPieces, ...rest] = serializedOrbit.split(":");
|
|
3310
|
+
if (rest.length > 0) {
|
|
3311
|
+
throw new Error(
|
|
3312
|
+
`Invalid serialized orbit stickering mask (too many colons): \`${serializedOrbit}\``
|
|
3313
|
+
);
|
|
3314
|
+
}
|
|
3315
|
+
const pieces = [];
|
|
3316
|
+
stickeringMask.orbits[orbitName] = { pieces };
|
|
3317
|
+
for (const char of serializedOrbitPieces) {
|
|
3318
|
+
const pieceStickering = charMap[char];
|
|
3319
|
+
pieces.push(getPieceStickeringMask(pieceStickering));
|
|
3320
|
+
}
|
|
3321
|
+
}
|
|
3322
|
+
return stickeringMask;
|
|
3323
|
+
}
|
|
3324
|
+
|
|
3325
|
+
// src/cubing/twisty/model/props/puzzle/display/StickeringMaskRequestProp.ts
|
|
3326
|
+
var StickeringMaskRequestProp = class extends TwistyPropSource {
|
|
3327
|
+
getDefaultValue() {
|
|
3328
|
+
return null;
|
|
3329
|
+
}
|
|
3330
|
+
derive(input) {
|
|
3331
|
+
if (input === null) {
|
|
3332
|
+
return null;
|
|
3333
|
+
} else if (typeof input === "string") {
|
|
3334
|
+
return parseSerializedStickeringMask(input);
|
|
3335
|
+
} else {
|
|
3336
|
+
return input;
|
|
3337
|
+
}
|
|
3338
|
+
}
|
|
3339
|
+
};
|
|
3340
|
+
|
|
3341
|
+
// src/cubing/twisty/model/props/puzzle/display/StickeringRequestProp.ts
|
|
3342
|
+
var StickeringRequestProp = class extends SimpleTwistyPropSource {
|
|
3343
|
+
getDefaultValue() {
|
|
3344
|
+
return null;
|
|
3244
3345
|
}
|
|
3245
3346
|
};
|
|
3246
3347
|
|
|
@@ -3401,7 +3502,8 @@ var TwistySceneModel = class {
|
|
|
3401
3502
|
this.movePressInput = new MovePressInputProp();
|
|
3402
3503
|
this.movePressCancelOptions = new MovePressCancelOptions();
|
|
3403
3504
|
this.orbitCoordinatesRequest = new OrbitCoordinatesRequestProp();
|
|
3404
|
-
this.
|
|
3505
|
+
this.stickeringMaskRequest = new StickeringMaskRequestProp();
|
|
3506
|
+
this.stickeringRequest = new StickeringRequestProp();
|
|
3405
3507
|
this.foundationStickerSprite = new SpriteProp({
|
|
3406
3508
|
spriteURL: this.foundationStickerSpriteURL
|
|
3407
3509
|
});
|
|
@@ -3414,6 +3516,11 @@ var TwistySceneModel = class {
|
|
|
3414
3516
|
puzzleID: twistyPlayerModel.puzzleID,
|
|
3415
3517
|
strategy: twistyPlayerModel.visualizationStrategy
|
|
3416
3518
|
});
|
|
3519
|
+
this.stickeringMask = new StickeringMaskProp({
|
|
3520
|
+
stickeringMaskRequest: this.stickeringMaskRequest,
|
|
3521
|
+
stickeringRequest: this.stickeringRequest,
|
|
3522
|
+
puzzleLoader: twistyPlayerModel.puzzleLoader
|
|
3523
|
+
});
|
|
3417
3524
|
}
|
|
3418
3525
|
};
|
|
3419
3526
|
|
|
@@ -3541,7 +3648,7 @@ var TwistyPlayerModel = class {
|
|
|
3541
3648
|
alg,
|
|
3542
3649
|
setup,
|
|
3543
3650
|
anchor,
|
|
3544
|
-
|
|
3651
|
+
experimentalStickeringRequest
|
|
3545
3652
|
] = await Promise.all([
|
|
3546
3653
|
this.viewerLink.get(),
|
|
3547
3654
|
this.puzzleID.get(),
|
|
@@ -3549,7 +3656,7 @@ var TwistyPlayerModel = class {
|
|
|
3549
3656
|
this.alg.get(),
|
|
3550
3657
|
this.setupAlg.get(),
|
|
3551
3658
|
this.setupAnchor.get(),
|
|
3552
|
-
this.twistySceneModel.
|
|
3659
|
+
this.twistySceneModel.stickeringRequest.get()
|
|
3553
3660
|
]);
|
|
3554
3661
|
const isExplorer = viewerLink === "experimental-twizzle-explorer";
|
|
3555
3662
|
const url = new URL(
|
|
@@ -3564,8 +3671,11 @@ var TwistyPlayerModel = class {
|
|
|
3564
3671
|
if (anchor !== "start") {
|
|
3565
3672
|
url.searchParams.set("setup-anchor", anchor);
|
|
3566
3673
|
}
|
|
3567
|
-
if (
|
|
3568
|
-
url.searchParams.set(
|
|
3674
|
+
if (experimentalStickeringRequest !== "full" && experimentalStickeringRequest !== null) {
|
|
3675
|
+
url.searchParams.set(
|
|
3676
|
+
"experimental-stickering",
|
|
3677
|
+
experimentalStickeringRequest
|
|
3678
|
+
);
|
|
3569
3679
|
}
|
|
3570
3680
|
if (isExplorer && puzzleDescription !== NO_VALUE) {
|
|
3571
3681
|
url.searchParams.set("puzzle-description", puzzleDescription);
|
|
@@ -3688,10 +3798,18 @@ var TwistyPlayerSettable = class extends ManagedCustomElement {
|
|
|
3688
3798
|
throw err("hintFacelets");
|
|
3689
3799
|
}
|
|
3690
3800
|
set experimentalStickering(stickering) {
|
|
3691
|
-
this.experimentalModel.twistySceneModel.
|
|
3801
|
+
this.experimentalModel.twistySceneModel.stickeringRequest.set(stickering);
|
|
3692
3802
|
}
|
|
3693
3803
|
get experimentalStickering() {
|
|
3694
|
-
throw err("
|
|
3804
|
+
throw err("experimentalStickering");
|
|
3805
|
+
}
|
|
3806
|
+
set experimentalStickeringMaskOrbits(stickeringMask) {
|
|
3807
|
+
this.experimentalModel.twistySceneModel.stickeringMaskRequest.set(
|
|
3808
|
+
stickeringMask
|
|
3809
|
+
);
|
|
3810
|
+
}
|
|
3811
|
+
get experimentalStickeringMaskOrbits() {
|
|
3812
|
+
throw err("experimentalStickeringMaskOrbits");
|
|
3695
3813
|
}
|
|
3696
3814
|
set backView(backView) {
|
|
3697
3815
|
this.experimentalModel.backView.set(backView);
|
|
@@ -3845,6 +3963,7 @@ var twistyPlayerAttributeMap = {
|
|
|
3845
3963
|
visualization: "visualization",
|
|
3846
3964
|
"hint-facelets": "hintFacelets",
|
|
3847
3965
|
"experimental-stickering": "experimentalStickering",
|
|
3966
|
+
"experimental-stickering-mask-orbits": "experimentalStickeringMaskOrbits",
|
|
3848
3967
|
background: "background",
|
|
3849
3968
|
"control-panel": "controlPanel",
|
|
3850
3969
|
"back-view": "backView",
|
|
@@ -3914,13 +4033,15 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
3914
4033
|
);
|
|
3915
4034
|
this.addElement(this.#errorElem).classList.add("error-elem");
|
|
3916
4035
|
this.#errorElem.textContent = "Error";
|
|
3917
|
-
this.experimentalModel.userVisibleErrorTracker.addFreshListener(
|
|
3918
|
-
|
|
3919
|
-
|
|
3920
|
-
|
|
3921
|
-
|
|
4036
|
+
this.experimentalModel.userVisibleErrorTracker.addFreshListener(
|
|
4037
|
+
(userVisibleError) => {
|
|
4038
|
+
const errorString = userVisibleError.errors[0] ?? null;
|
|
4039
|
+
this.contentWrapper.classList.toggle("error", !!errorString);
|
|
4040
|
+
if (errorString) {
|
|
4041
|
+
this.#errorElem.textContent = errorString;
|
|
4042
|
+
}
|
|
3922
4043
|
}
|
|
3923
|
-
|
|
4044
|
+
);
|
|
3924
4045
|
const scrubber = new TwistyScrubber(
|
|
3925
4046
|
this.experimentalModel,
|
|
3926
4047
|
this.controller
|
|
@@ -3932,15 +4053,19 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
3932
4053
|
this
|
|
3933
4054
|
);
|
|
3934
4055
|
this.contentWrapper.appendChild(this.buttons);
|
|
3935
|
-
this.experimentalModel.twistySceneModel.background.addFreshListener(
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
|
|
3943
|
-
|
|
4056
|
+
this.experimentalModel.twistySceneModel.background.addFreshListener(
|
|
4057
|
+
(backgroundTheme) => {
|
|
4058
|
+
this.contentWrapper.classList.toggle(
|
|
4059
|
+
"checkered",
|
|
4060
|
+
backgroundTheme !== "none"
|
|
4061
|
+
);
|
|
4062
|
+
}
|
|
4063
|
+
);
|
|
4064
|
+
this.experimentalModel.controlPanel.addFreshListener(
|
|
4065
|
+
(controlPanel) => {
|
|
4066
|
+
this.#controlsManager.setValue(controlPanel);
|
|
4067
|
+
}
|
|
4068
|
+
);
|
|
3944
4069
|
this.experimentalModel.visualizationStrategy.addFreshListener(
|
|
3945
4070
|
this.#setVisualizationWrapper.bind(this)
|
|
3946
4071
|
);
|
|
@@ -4400,10 +4525,7 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4400
4525
|
};
|
|
4401
4526
|
}
|
|
4402
4527
|
};
|
|
4403
|
-
var
|
|
4404
|
-
var algToDOMTree = algToDOMTreeInstance.traverseAlg.bind(
|
|
4405
|
-
algToDOMTreeInstance
|
|
4406
|
-
);
|
|
4528
|
+
var algToDOMTree = functionFromTraversal(AlgToDOMTree);
|
|
4407
4529
|
var MoveHighlighter = class {
|
|
4408
4530
|
constructor() {
|
|
4409
4531
|
this.moveCharIndexMap = /* @__PURE__ */ new Map();
|
|
@@ -4462,28 +4584,34 @@ var TwistyAlgViewer = class extends HTMLElementShim {
|
|
|
4462
4584
|
throw new Error("clearing twistyPlayer is not supported");
|
|
4463
4585
|
}
|
|
4464
4586
|
this.#twistyPlayer = twistyPlayer;
|
|
4465
|
-
this.#twistyPlayer.experimentalModel.alg.addFreshListener(
|
|
4466
|
-
|
|
4467
|
-
|
|
4587
|
+
this.#twistyPlayer.experimentalModel.alg.addFreshListener(
|
|
4588
|
+
(algWithIssues) => {
|
|
4589
|
+
this.setAlg(algWithIssues.alg);
|
|
4590
|
+
}
|
|
4591
|
+
);
|
|
4468
4592
|
const sourceAlg = (await this.#twistyPlayer.experimentalModel.alg.get()).alg;
|
|
4469
4593
|
const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
|
|
4470
4594
|
this.setAlg(parsedAlg);
|
|
4471
|
-
twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener(
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4595
|
+
twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener(
|
|
4596
|
+
(currentMoveInfo) => {
|
|
4597
|
+
let moveInfo = currentMoveInfo.currentMoves[0];
|
|
4598
|
+
moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
|
|
4599
|
+
moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
|
|
4600
|
+
if (!moveInfo) {
|
|
4601
|
+
this.highlighter.set(null);
|
|
4602
|
+
} else {
|
|
4603
|
+
const mainCurrentMove = moveInfo.move;
|
|
4604
|
+
this.highlighter.set(mainCurrentMove);
|
|
4605
|
+
}
|
|
4480
4606
|
}
|
|
4481
|
-
|
|
4482
|
-
twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener(
|
|
4483
|
-
|
|
4484
|
-
this.lastClickTimestamp
|
|
4607
|
+
);
|
|
4608
|
+
twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener(
|
|
4609
|
+
(detailedTimelineInfo) => {
|
|
4610
|
+
if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
|
|
4611
|
+
this.lastClickTimestamp = null;
|
|
4612
|
+
}
|
|
4485
4613
|
}
|
|
4486
|
-
|
|
4614
|
+
);
|
|
4487
4615
|
}
|
|
4488
4616
|
async jumpToIndex(index, offsetIntoMove) {
|
|
4489
4617
|
const twistyPlayer = this.#twistyPlayer;
|
|
@@ -4595,10 +4723,7 @@ var LeafTokens = class extends TraversalDownUp {
|
|
|
4595
4723
|
};
|
|
4596
4724
|
}
|
|
4597
4725
|
};
|
|
4598
|
-
var
|
|
4599
|
-
var leafTokens = leafTokensInstance.traverseAlg.bind(
|
|
4600
|
-
leafTokensInstance
|
|
4601
|
-
);
|
|
4726
|
+
var leafTokens = functionFromTraversal(LeafTokens);
|
|
4602
4727
|
|
|
4603
4728
|
// src/cubing/twisty/views/TwistyAlgEditor/model.ts
|
|
4604
4729
|
var TwistyAlgEditorValueProp = class extends SimpleTwistyPropSource {
|
|
@@ -4819,11 +4944,13 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
|
4819
4944
|
}
|
|
4820
4945
|
this.#twistyPlayerProp = options?.twistyPlayerProp ?? "alg";
|
|
4821
4946
|
if (options?.twistyPlayerProp === "alg") {
|
|
4822
|
-
this.model.leafToHighlight.addFreshListener(
|
|
4823
|
-
|
|
4824
|
-
|
|
4947
|
+
this.model.leafToHighlight.addFreshListener(
|
|
4948
|
+
(highlightInfo) => {
|
|
4949
|
+
if (highlightInfo) {
|
|
4950
|
+
this.highlightLeaf(highlightInfo.leafInfo.leaf);
|
|
4951
|
+
}
|
|
4825
4952
|
}
|
|
4826
|
-
|
|
4953
|
+
);
|
|
4827
4954
|
}
|
|
4828
4955
|
}
|
|
4829
4956
|
#textarea;
|
|
@@ -4926,61 +5053,65 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
|
4926
5053
|
this.algString = this.#algProp ? (await this.#algProp.get()).alg.toString() : "";
|
|
4927
5054
|
})();
|
|
4928
5055
|
if (this.#twistyPlayerProp === "alg") {
|
|
4929
|
-
this.#twistyPlayer?.experimentalModel.puzzleAlg.addFreshListener(
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
5056
|
+
this.#twistyPlayer?.experimentalModel.puzzleAlg.addFreshListener(
|
|
5057
|
+
(algWithIssues) => {
|
|
5058
|
+
if (algWithIssues.issues.errors.length === 0) {
|
|
5059
|
+
this.setAlgIssueClassForPuzzle(
|
|
5060
|
+
algWithIssues.issues.warnings.length === 0 ? "none" : "warning"
|
|
5061
|
+
);
|
|
5062
|
+
const newAlg = algWithIssues.alg;
|
|
5063
|
+
const oldAlg = Alg.fromString(this.algString);
|
|
5064
|
+
if (!newAlg.isIdentical(oldAlg)) {
|
|
5065
|
+
this.algString = newAlg.toString();
|
|
5066
|
+
this.onInput();
|
|
5067
|
+
} else {
|
|
5068
|
+
}
|
|
4939
5069
|
} else {
|
|
5070
|
+
this.setAlgIssueClassForPuzzle("error");
|
|
4940
5071
|
}
|
|
4941
|
-
} else {
|
|
4942
|
-
this.setAlgIssueClassForPuzzle("error");
|
|
4943
|
-
}
|
|
4944
|
-
});
|
|
4945
|
-
this.model.leafToHighlight.addFreshListener(async (highlightInfo) => {
|
|
4946
|
-
if (highlightInfo === null) {
|
|
4947
|
-
return;
|
|
4948
|
-
}
|
|
4949
|
-
const [indexer, timestampRequest] = await Promise.all([
|
|
4950
|
-
await twistyPlayer.experimentalModel.indexer.get(),
|
|
4951
|
-
await twistyPlayer.experimentalModel.timestampRequest.get()
|
|
4952
|
-
]);
|
|
4953
|
-
if (timestampRequest === "opposite-anchor" && !this.#onInputHasFired) {
|
|
4954
|
-
return;
|
|
4955
5072
|
}
|
|
4956
|
-
|
|
4957
|
-
|
|
4958
|
-
)
|
|
4959
|
-
|
|
4960
|
-
|
|
4961
|
-
switch (highlightInfo.where) {
|
|
4962
|
-
case "before": {
|
|
4963
|
-
newTimestamp = moveStartTimestamp;
|
|
4964
|
-
break;
|
|
5073
|
+
);
|
|
5074
|
+
this.model.leafToHighlight.addFreshListener(
|
|
5075
|
+
async (highlightInfo) => {
|
|
5076
|
+
if (highlightInfo === null) {
|
|
5077
|
+
return;
|
|
4965
5078
|
}
|
|
4966
|
-
|
|
4967
|
-
|
|
4968
|
-
|
|
4969
|
-
|
|
5079
|
+
const [indexer, timestampRequest] = await Promise.all([
|
|
5080
|
+
await twistyPlayer.experimentalModel.indexer.get(),
|
|
5081
|
+
await twistyPlayer.experimentalModel.timestampRequest.get()
|
|
5082
|
+
]);
|
|
5083
|
+
if (timestampRequest === "opposite-anchor" && !this.#onInputHasFired) {
|
|
5084
|
+
return;
|
|
4970
5085
|
}
|
|
4971
|
-
|
|
4972
|
-
|
|
4973
|
-
|
|
4974
|
-
|
|
5086
|
+
const moveStartTimestamp = indexer.indexToMoveStartTimestamp(
|
|
5087
|
+
highlightInfo.leafInfo.idx
|
|
5088
|
+
);
|
|
5089
|
+
const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
|
|
5090
|
+
let newTimestamp;
|
|
5091
|
+
switch (highlightInfo.where) {
|
|
5092
|
+
case "before": {
|
|
5093
|
+
newTimestamp = moveStartTimestamp;
|
|
5094
|
+
break;
|
|
5095
|
+
}
|
|
5096
|
+
case "start":
|
|
5097
|
+
case "inside": {
|
|
5098
|
+
newTimestamp = moveStartTimestamp + duration / 4;
|
|
5099
|
+
break;
|
|
5100
|
+
}
|
|
5101
|
+
case "end":
|
|
5102
|
+
case "after": {
|
|
5103
|
+
newTimestamp = moveStartTimestamp + duration;
|
|
5104
|
+
break;
|
|
5105
|
+
}
|
|
5106
|
+
default:
|
|
5107
|
+
console.log("invalid where");
|
|
5108
|
+
throw new Error("Invalid where!");
|
|
5109
|
+
}
|
|
5110
|
+
if (!this.debugNeverRequestTimestamp) {
|
|
5111
|
+
twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
|
|
4975
5112
|
}
|
|
4976
|
-
default:
|
|
4977
|
-
console.log("invalid where");
|
|
4978
|
-
throw new Error("Invalid where!");
|
|
4979
|
-
}
|
|
4980
|
-
if (!this.debugNeverRequestTimestamp) {
|
|
4981
|
-
twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
|
|
4982
5113
|
}
|
|
4983
|
-
|
|
5114
|
+
);
|
|
4984
5115
|
twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(
|
|
4985
5116
|
async (currentLeavesSimplified) => {
|
|
4986
5117
|
const indexer = await twistyPlayer.experimentalModel.indexer.get();
|