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.
Files changed (89) hide show
  1. package/dist/esm/alg/index.js +3 -1
  2. package/dist/esm/bluetooth/index.js +5 -5
  3. package/dist/esm/bluetooth/index.js.map +2 -2
  4. package/dist/esm/{chunk-KOAJIBEX.js → chunk-52L7V4XF.js} +32 -27
  5. package/dist/esm/chunk-52L7V4XF.js.map +7 -0
  6. package/dist/esm/{chunk-4QZRHN6S.js → chunk-55WSHQFP.js} +6 -8
  7. package/dist/esm/{chunk-4QZRHN6S.js.map → chunk-55WSHQFP.js.map} +2 -2
  8. package/dist/esm/{chunk-5OQ34D3X.js → chunk-A3PA5E45.js} +4 -4
  9. package/dist/esm/{chunk-5OQ34D3X.js.map → chunk-A3PA5E45.js.map} +2 -2
  10. package/dist/esm/{chunk-C6KMV2PL.js → chunk-G6MFOXW4.js} +10 -11
  11. package/dist/esm/chunk-G6MFOXW4.js.map +7 -0
  12. package/dist/esm/{chunk-6FB2XWAK.js → chunk-JCIUBLD5.js} +138 -183
  13. package/dist/esm/chunk-JCIUBLD5.js.map +7 -0
  14. package/dist/esm/{chunk-RI2DAEY6.js → chunk-JW5R6EBK.js} +2 -2
  15. package/dist/esm/{chunk-RI2DAEY6.js.map → chunk-JW5R6EBK.js.map} +0 -0
  16. package/dist/esm/{chunk-GQBRF4EM.js → chunk-MHP4YJE7.js} +7 -9
  17. package/dist/esm/chunk-MHP4YJE7.js.map +7 -0
  18. package/dist/esm/{chunk-ZQT3QSWD.js → chunk-PVI43RDV.js} +16 -13
  19. package/dist/esm/chunk-PVI43RDV.js.map +7 -0
  20. package/dist/esm/{chunk-35OK6TQ4.js → chunk-VTO7WPWK.js} +28 -19
  21. package/dist/esm/chunk-VTO7WPWK.js.map +7 -0
  22. package/dist/esm/{chunk-VIUWS2PX.js → chunk-XNPPG3BV.js} +3 -3
  23. package/dist/esm/chunk-XNPPG3BV.js.map +7 -0
  24. package/dist/esm/kpuzzle/index.js +2 -2
  25. package/dist/esm/notation/index.js +2 -2
  26. package/dist/esm/protocol/index.js +4 -4
  27. package/dist/esm/puzzle-geometry/index.js +6 -18
  28. package/dist/esm/puzzle-geometry/index.js.map +2 -2
  29. package/dist/esm/puzzles/index.js +4 -4
  30. package/dist/esm/scramble/index.js +2 -2
  31. package/dist/esm/search/index.js +6 -6
  32. package/dist/esm/{search-dynamic-sgs-side-events-XNTCWRI4.js → search-dynamic-sgs-side-events-UIAYYZRR.js} +6 -6
  33. package/dist/esm/{search-dynamic-sgs-side-events-XNTCWRI4.js.map → search-dynamic-sgs-side-events-UIAYYZRR.js.map} +0 -0
  34. package/dist/esm/{search-dynamic-sgs-unofficial-5KMZ747E.js → search-dynamic-sgs-unofficial-7XRXANEX.js} +6 -6
  35. package/dist/esm/{search-dynamic-sgs-unofficial-5KMZ747E.js.map → search-dynamic-sgs-unofficial-7XRXANEX.js.map} +0 -0
  36. package/dist/esm/{search-dynamic-solve-3x3x3-TSXPWENP.js → search-dynamic-solve-3x3x3-DDVSUP2C.js} +275 -290
  37. package/dist/esm/search-dynamic-solve-3x3x3-DDVSUP2C.js.map +7 -0
  38. package/dist/esm/{search-dynamic-solve-4x4x4-FKQ2JWK2.js → search-dynamic-solve-4x4x4-K5LUSS2B.js} +6 -6
  39. package/dist/esm/{search-dynamic-solve-4x4x4-FKQ2JWK2.js.map → search-dynamic-solve-4x4x4-K5LUSS2B.js.map} +0 -0
  40. package/dist/esm/{search-dynamic-solve-fto-GPLW7S5F.js → search-dynamic-solve-fto-MA4X6JEE.js} +6 -16
  41. package/dist/esm/search-dynamic-solve-fto-MA4X6JEE.js.map +7 -0
  42. package/dist/esm/{search-dynamic-solve-kilominx-HB2QFUGF.js → search-dynamic-solve-kilominx-XDOKK3ZV.js} +2 -2
  43. package/dist/esm/search-dynamic-solve-kilominx-XDOKK3ZV.js.map +7 -0
  44. package/dist/esm/{search-dynamic-solve-master_tetraminx-LR3LJI7O.js → search-dynamic-solve-master_tetraminx-YKINTRUU.js} +4 -10
  45. package/dist/esm/search-dynamic-solve-master_tetraminx-YKINTRUU.js.map +7 -0
  46. package/dist/esm/{search-worker-inside-generated-string-5HKZNHKK.js → search-worker-inside-generated-string-LBOAERDX.js} +28 -28
  47. package/dist/esm/search-worker-inside-generated-string-LBOAERDX.js.map +7 -0
  48. package/dist/esm/{search-worker-js-entry-PDXEE46R.js → search-worker-js-entry-4MMPUMST.js} +30 -36
  49. package/dist/esm/{search-worker-js-entry-PDXEE46R.js.map → search-worker-js-entry-4MMPUMST.js.map} +2 -2
  50. package/dist/esm/{search-worker-ts-entry-UV2RY2EY.js → search-worker-ts-entry-LBKZYRBU.js} +2 -2
  51. package/dist/esm/{search-worker-ts-entry-UV2RY2EY.js.map → search-worker-ts-entry-LBKZYRBU.js.map} +0 -0
  52. package/dist/esm/stream/index.js +1 -1
  53. package/dist/esm/stream/index.js.map +2 -2
  54. package/dist/esm/twisty/index.js +381 -250
  55. package/dist/esm/twisty/index.js.map +4 -4
  56. package/dist/esm/{twisty-dynamic-3d-GPF6TW32.js → twisty-dynamic-3d-TFI45NMX.js} +125 -106
  57. package/dist/esm/twisty-dynamic-3d-TFI45NMX.js.map +7 -0
  58. package/dist/types/{Alg-1c8c3757.d.ts → Alg-d3ac9660.d.ts} +53 -4
  59. package/dist/types/{KState-7c9e40f4.d.ts → KState-0a9388d0.d.ts} +1 -1
  60. package/dist/types/{TwizzleLink-3f8a01d2.d.ts → TwizzleLink-79b17516.d.ts} +63 -41
  61. package/dist/types/alg/index.d.ts +9 -6
  62. package/dist/types/bluetooth/index.d.ts +4 -4
  63. package/dist/types/{bluetooth-puzzle-a64e9756.d.ts → bluetooth-puzzle-83ade5b5.d.ts} +2 -2
  64. package/dist/types/kpuzzle/index.d.ts +2 -2
  65. package/dist/types/notation/index.d.ts +1 -1
  66. package/dist/types/{outside-b62aa614.d.ts → outside-6a613add.d.ts} +2 -2
  67. package/dist/types/{parseAlg-d5fbee87.d.ts → parseAlg-3bb4dddb.d.ts} +1 -1
  68. package/dist/types/protocol/index.d.ts +2 -2
  69. package/dist/types/puzzle-geometry/index.d.ts +3 -3
  70. package/dist/types/puzzles/index.d.ts +5 -5
  71. package/dist/types/scramble/index.d.ts +3 -3
  72. package/dist/types/search/index.d.ts +3 -3
  73. package/dist/types/stream/index.d.ts +3 -3
  74. package/dist/types/twisty/index.d.ts +6 -6
  75. package/package.json +11 -5
  76. package/dist/esm/.DS_Store +0 -0
  77. package/dist/esm/chunk-35OK6TQ4.js.map +0 -7
  78. package/dist/esm/chunk-6FB2XWAK.js.map +0 -7
  79. package/dist/esm/chunk-C6KMV2PL.js.map +0 -7
  80. package/dist/esm/chunk-GQBRF4EM.js.map +0 -7
  81. package/dist/esm/chunk-KOAJIBEX.js.map +0 -7
  82. package/dist/esm/chunk-VIUWS2PX.js.map +0 -7
  83. package/dist/esm/chunk-ZQT3QSWD.js.map +0 -7
  84. package/dist/esm/search-dynamic-solve-3x3x3-TSXPWENP.js.map +0 -7
  85. package/dist/esm/search-dynamic-solve-fto-GPLW7S5F.js.map +0 -7
  86. package/dist/esm/search-dynamic-solve-kilominx-HB2QFUGF.js.map +0 -7
  87. package/dist/esm/search-dynamic-solve-master_tetraminx-LR3LJI7O.js.map +0 -7
  88. package/dist/esm/search-worker-inside-generated-string-5HKZNHKK.js.map +0 -7
  89. package/dist/esm/twisty-dynamic-3d-GPF6TW32.js.map +0 -7
@@ -18,20 +18,21 @@ import {
18
18
  rawRenderPooled,
19
19
  setCameraFromOrbitCoordinates,
20
20
  setTwistyDebug
21
- } from "../chunk-KOAJIBEX.js";
21
+ } from "../chunk-52L7V4XF.js";
22
22
  import "../chunk-QHWK5RXN.js";
23
23
  import {
24
24
  countAnimatedLeaves,
25
25
  countMoves
26
- } from "../chunk-C6KMV2PL.js";
26
+ } from "../chunk-G6MFOXW4.js";
27
27
  import {
28
28
  cube3x3x3,
29
29
  puzzles
30
- } from "../chunk-35OK6TQ4.js";
30
+ } from "../chunk-VTO7WPWK.js";
31
31
  import {
32
- customPGPuzzleLoader
33
- } from "../chunk-6FB2XWAK.js";
34
- import "../chunk-GQBRF4EM.js";
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
- } from "../chunk-ZQT3QSWD.js";
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, experimentalAppearance) {
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 (experimentalAppearance) {
457
+ if (experimentalStickeringMask) {
492
458
  (() => {
493
- const a = experimentalAppearance.orbits;
459
+ const a = experimentalStickeringMask.orbits;
494
460
  if (!a) {
495
461
  return;
496
462
  }
497
- const orbitAppearance = a[orbitName];
498
- if (!orbitAppearance) {
463
+ const orbitStickeringMask = a[orbitName];
464
+ if (!orbitStickeringMask) {
499
465
  return;
500
466
  }
501
- const pieceAppearance = orbitAppearance.pieces[idx];
502
- if (!pieceAppearance) {
467
+ const pieceStickeringMask = orbitStickeringMask.pieces[idx];
468
+ if (!pieceStickeringMask) {
503
469
  return;
504
470
  }
505
- const faceletAppearance = pieceAppearance.facelets[orientation];
506
- if (!faceletAppearance) {
471
+ const faceletStickeringMasks = pieceStickeringMask.facelets[orientation];
472
+ if (!faceletStickeringMasks) {
507
473
  return;
508
474
  }
509
- const appearance = typeof faceletAppearance === "string" ? faceletAppearance : faceletAppearance?.appearance;
510
- const colorMap = colorMaps[appearance];
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(this.model.puzzleID, (puzzleID) => {
659
- if (puzzleLoader?.id !== puzzleID) {
660
- this.disconnect();
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?.experimentalStickering) {
668
- this.experimentalSetStickering(this.options.experimentalStickering);
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
- experimentalSetStickering(stickering) {
707
- (async () => {
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(appearance) {
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
- appearance
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(this.model.twistySceneModel.stickering, async (stickering) => {
746
- (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
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(this.model.puzzleLoader, (puzzleLoader2) => {
875
- if (this.puzzleLoader.id !== puzzleLoader2.id) {
876
- this.disconnect();
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(this.model.legacyPosition, async (position) => {
880
- try {
881
- (await this.twisty3DPuzzle()).onPositionChange(position);
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(this.model.twistySceneModel.hintFacelet, async (hintFaceletStyle) => {
888
- (await this.twisty3DPuzzle()).experimentalUpdateOptions({
889
- hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
890
- });
891
- this.scheduleRender();
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.stickering,
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, experimentalStickering] = await Promise.all([
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.stickering.get()
959
+ this.model.twistySceneModel.stickeringMask.get()
949
960
  ]);
950
- return (await proxyPromise).cube3DShim(() => this.schedulable.scheduleRender(), {
951
- foundationSprite,
952
- hintSprite,
953
- experimentalStickering
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.stickering.get(),
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 localSimulMovesInstance = new LocalSimulMoves();
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 AlgWalkterDecoration = class {
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 AlgWalkterDecoration(
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 AlgWalkterDecoration(
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 r = this.cache[key];
2500
- if (r) {
2501
- return r;
2510
+ let r2 = this.cache[key];
2511
+ if (r2) {
2512
+ return r2;
2502
2513
  }
2503
2514
  const transformation = this.kpuzzle.moveToTransformation(move);
2504
- r = new AlgWalkterDecoration(
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] = r;
2511
- return r;
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 AlgWalkterDecoration(2 * (decA.moveCount + decB.moveCount), 2 * (decA.duration + decB.duration), ABApBp, ABApBp.invert(), [decA, decB]);
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 AlgWalkterDecoration(2 * decA.moveCount + decB.moveCount, 2 * decA.duration + decB.duration, ABAp, ABAp.invert(), [
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 AlgWalkterDecoration(
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 AlgWalkterDecoration(
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 r = this.algOrAlgNode.is(Alg) ? this.traverseAlg(this.algOrAlgNode, this.root) : this.traverseAlgNode(this.algOrAlgNode, this.root);
2606
- return r;
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 chunkAlgsInstance = new ChunkAlgs();
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/StickeringProp.ts
3241
- var StickeringProp = class extends SimpleTwistyPropSource {
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 "full";
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.stickering = new StickeringProp();
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
- experimentalStickering
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.stickering.get()
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 (experimentalStickering !== "full") {
3568
- url.searchParams.set("experimental-stickering", experimentalStickering);
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.stickering.set(stickering);
3801
+ this.experimentalModel.twistySceneModel.stickeringRequest.set(stickering);
3692
3802
  }
3693
3803
  get experimentalStickering() {
3694
- throw err("stickering");
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((userVisibleError) => {
3918
- const errorString = userVisibleError.errors[0] ?? null;
3919
- this.contentWrapper.classList.toggle("error", !!errorString);
3920
- if (errorString) {
3921
- this.#errorElem.textContent = errorString;
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((backgroundTheme) => {
3936
- this.contentWrapper.classList.toggle(
3937
- "checkered",
3938
- backgroundTheme !== "none"
3939
- );
3940
- });
3941
- this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
3942
- this.#controlsManager.setValue(controlPanel);
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 algToDOMTreeInstance = new AlgToDOMTree();
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((algWithIssues) => {
4466
- this.setAlg(algWithIssues.alg);
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((currentMoveInfo) => {
4472
- let moveInfo = currentMoveInfo.currentMoves[0];
4473
- moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4474
- moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
4475
- if (!moveInfo) {
4476
- this.highlighter.set(null);
4477
- } else {
4478
- const mainCurrentMove = moveInfo.move;
4479
- this.highlighter.set(mainCurrentMove);
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((detailedTimelineInfo) => {
4483
- if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4484
- this.lastClickTimestamp = null;
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 leafTokensInstance = new LeafTokens();
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((highlightInfo) => {
4823
- if (highlightInfo) {
4824
- this.highlightLeaf(highlightInfo.leafInfo.leaf);
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((algWithIssues) => {
4930
- if (algWithIssues.issues.errors.length === 0) {
4931
- this.setAlgIssueClassForPuzzle(
4932
- algWithIssues.issues.warnings.length === 0 ? "none" : "warning"
4933
- );
4934
- const newAlg = algWithIssues.alg;
4935
- const oldAlg = Alg.fromString(this.algString);
4936
- if (!newAlg.isIdentical(oldAlg)) {
4937
- this.algString = newAlg.toString();
4938
- this.onInput();
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
- const moveStartTimestamp = indexer.indexToMoveStartTimestamp(
4957
- highlightInfo.leafInfo.idx
4958
- );
4959
- const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
4960
- let newTimestamp;
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
- case "start":
4967
- case "inside": {
4968
- newTimestamp = moveStartTimestamp + duration / 4;
4969
- break;
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
- case "end":
4972
- case "after": {
4973
- newTimestamp = moveStartTimestamp + duration;
4974
- break;
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();