cubing 0.29.0 → 0.29.2

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/README.md +1 -6
  2. package/dist/esm/alg/index.js +1 -1
  3. package/dist/esm/bluetooth/index.js +36 -31
  4. package/dist/esm/bluetooth/index.js.map +2 -2
  5. package/dist/esm/{chunk-NI7U4XAZ.js → chunk-7OIUETFU.js} +9 -8
  6. package/dist/esm/chunk-7OIUETFU.js.map +7 -0
  7. package/dist/esm/{chunk-DZGFGBKT.js → chunk-EOEJDDXN.js} +95 -58
  8. package/dist/esm/chunk-EOEJDDXN.js.map +7 -0
  9. package/dist/esm/{chunk-WXCNEGW3.js → chunk-HR5D6SD4.js} +2 -2
  10. package/dist/esm/{chunk-WXCNEGW3.js.map → chunk-HR5D6SD4.js.map} +2 -2
  11. package/dist/esm/{chunk-LV7IKG36.js → chunk-J5KJ2WWA.js} +35 -34
  12. package/dist/esm/chunk-J5KJ2WWA.js.map +7 -0
  13. package/dist/esm/{chunk-ZNAYJGVL.js → chunk-NUMCMGLU.js} +2 -2
  14. package/dist/esm/{chunk-ZNAYJGVL.js.map → chunk-NUMCMGLU.js.map} +0 -0
  15. package/dist/esm/{chunk-LSCTPPWV.js → chunk-OT7AIIFN.js} +4 -4
  16. package/dist/esm/chunk-OT7AIIFN.js.map +7 -0
  17. package/dist/esm/{chunk-XU5ILFX5.js → chunk-POCUG6QW.js} +6 -4
  18. package/dist/esm/{chunk-XU5ILFX5.js.map → chunk-POCUG6QW.js.map} +2 -2
  19. package/dist/esm/{chunk-OX6O2ZO5.js → chunk-QHWK5RXN.js} +1 -1
  20. package/dist/esm/chunk-QHWK5RXN.js.map +7 -0
  21. package/dist/esm/{chunk-GW4FGG42.js → chunk-RH4WZIGC.js} +2 -2
  22. package/dist/esm/{chunk-GW4FGG42.js.map → chunk-RH4WZIGC.js.map} +0 -0
  23. package/dist/esm/{chunk-TGPS3CXW.js → chunk-RIXFKOD6.js} +7 -7
  24. package/dist/esm/{chunk-TGPS3CXW.js.map → chunk-RIXFKOD6.js.map} +2 -2
  25. package/dist/esm/{chunk-2IZUSAXQ.js → chunk-WEYPAZEE.js} +1 -1
  26. package/dist/esm/{chunk-2IZUSAXQ.js.map → chunk-WEYPAZEE.js.map} +1 -1
  27. package/dist/esm/{chunk-Q4W5ZR4U.js → chunk-WNZXZ4MW.js} +10 -8
  28. package/dist/esm/{chunk-Q4W5ZR4U.js.map → chunk-WNZXZ4MW.js.map} +2 -2
  29. package/dist/esm/{chunk-PYWGREIP.js → chunk-YD2TMJI2.js} +33 -31
  30. package/dist/esm/chunk-YD2TMJI2.js.map +7 -0
  31. package/dist/esm/kpuzzle/index.js +2 -2
  32. package/dist/esm/notation/index.js +2 -2
  33. package/dist/esm/protocol/index.js +4 -4
  34. package/dist/esm/puzzle-geometry/index.js +114 -88
  35. package/dist/esm/puzzle-geometry/index.js.map +2 -2
  36. package/dist/esm/puzzles/index.js +10 -6
  37. package/dist/esm/{puzzles-dynamic-side-events-5C7LMBWX.js → puzzles-dynamic-side-events-3K26JTOG.js} +2 -2
  38. package/dist/esm/{puzzles-dynamic-side-events-5C7LMBWX.js.map → puzzles-dynamic-side-events-3K26JTOG.js.map} +1 -1
  39. package/dist/esm/scramble/index.js +3 -3
  40. package/dist/esm/search/index.js +8 -8
  41. package/dist/esm/{search-dynamic-sgs-side-events-AYX7MZO7.js → search-dynamic-sgs-side-events-AE3TLLPA.js} +6 -6
  42. package/dist/esm/search-dynamic-sgs-side-events-AE3TLLPA.js.map +7 -0
  43. package/dist/esm/{search-dynamic-sgs-unofficial-DLJOJFJL.js → search-dynamic-sgs-unofficial-JUXMNMNO.js} +122 -67
  44. package/dist/esm/search-dynamic-sgs-unofficial-JUXMNMNO.js.map +7 -0
  45. package/dist/esm/{search-dynamic-solve-3x3x3-7XZTYQMO.js → search-dynamic-solve-3x3x3-SA75BI5I.js} +649 -405
  46. package/dist/esm/search-dynamic-solve-3x3x3-SA75BI5I.js.map +7 -0
  47. package/dist/esm/{search-dynamic-solve-4x4x4-CWWTFKMR.js → search-dynamic-solve-4x4x4-ALKH43DT.js} +399 -150
  48. package/dist/esm/search-dynamic-solve-4x4x4-ALKH43DT.js.map +7 -0
  49. package/dist/esm/{search-dynamic-solve-fto-4LI23P6K.js → search-dynamic-solve-fto-5B5ZESQC.js} +74 -34
  50. package/dist/esm/search-dynamic-solve-fto-5B5ZESQC.js.map +7 -0
  51. package/dist/esm/{search-dynamic-solve-kilominx-3HEVQ4MC.js → search-dynamic-solve-kilominx-OY4VIARG.js} +136 -71
  52. package/dist/esm/search-dynamic-solve-kilominx-OY4VIARG.js.map +7 -0
  53. package/dist/esm/{search-dynamic-solve-master_tetraminx-UB32C7MM.js → search-dynamic-solve-master_tetraminx-GE2BTRGI.js} +84 -41
  54. package/dist/esm/search-dynamic-solve-master_tetraminx-GE2BTRGI.js.map +7 -0
  55. package/dist/esm/{search-dynamic-solve-sq1-HA72TYF2.js → search-dynamic-solve-sq1-W6PSSLR6.js} +129 -54
  56. package/dist/esm/search-dynamic-solve-sq1-W6PSSLR6.js.map +7 -0
  57. package/dist/esm/{search-worker-inside-generated-string-AMEXYCKK.js → search-worker-inside-generated-string-7HYFSSPW.js} +28 -28
  58. package/dist/esm/search-worker-inside-generated-string-7HYFSSPW.js.map +7 -0
  59. package/dist/esm/{search-worker-js-entry-TP2T3NUL.js → search-worker-js-entry-SNUA3SOE.js} +44 -35
  60. package/dist/esm/search-worker-js-entry-SNUA3SOE.js.map +7 -0
  61. package/dist/esm/{search-worker-ts-entry-NEH77S4I.js → search-worker-ts-entry-LNB7KNFY.js} +3 -3
  62. package/dist/esm/{search-worker-ts-entry-NEH77S4I.js.map → search-worker-ts-entry-LNB7KNFY.js.map} +0 -0
  63. package/dist/esm/stream/index.js +1 -1
  64. package/dist/esm/stream/index.js.map +2 -2
  65. package/dist/esm/twisty/index.js +287 -273
  66. package/dist/esm/twisty/index.js.map +2 -2
  67. package/dist/esm/{twisty-dynamic-3d-D3ZDBJUH.js → twisty-dynamic-3d-PU74EKRA.js} +57 -59
  68. package/dist/esm/twisty-dynamic-3d-PU74EKRA.js.map +7 -0
  69. package/dist/types/{TwizzleLink-bef52ecd.d.ts → TwizzleLink-ce20e840.d.ts} +1 -1
  70. package/dist/types/puzzles/index.d.ts +5 -3
  71. package/dist/types/twisty/index.d.ts +2 -2
  72. package/package.json +51 -147
  73. package/dist/esm/chunk-DZGFGBKT.js.map +0 -7
  74. package/dist/esm/chunk-LSCTPPWV.js.map +0 -7
  75. package/dist/esm/chunk-LV7IKG36.js.map +0 -7
  76. package/dist/esm/chunk-NI7U4XAZ.js.map +0 -7
  77. package/dist/esm/chunk-OX6O2ZO5.js.map +0 -7
  78. package/dist/esm/chunk-PYWGREIP.js.map +0 -7
  79. package/dist/esm/search-dynamic-sgs-side-events-AYX7MZO7.js.map +0 -7
  80. package/dist/esm/search-dynamic-sgs-unofficial-DLJOJFJL.js.map +0 -7
  81. package/dist/esm/search-dynamic-solve-3x3x3-7XZTYQMO.js.map +0 -7
  82. package/dist/esm/search-dynamic-solve-4x4x4-CWWTFKMR.js.map +0 -7
  83. package/dist/esm/search-dynamic-solve-fto-4LI23P6K.js.map +0 -7
  84. package/dist/esm/search-dynamic-solve-kilominx-3HEVQ4MC.js.map +0 -7
  85. package/dist/esm/search-dynamic-solve-master_tetraminx-UB32C7MM.js.map +0 -7
  86. package/dist/esm/search-dynamic-solve-sq1-HA72TYF2.js.map +0 -7
  87. package/dist/esm/search-worker-inside-generated-string-AMEXYCKK.js.map +0 -7
  88. package/dist/esm/search-worker-js-entry-TP2T3NUL.js.map +0 -7
  89. package/dist/esm/twisty-dynamic-3d-D3ZDBJUH.js.map +0 -7
@@ -17,20 +17,20 @@ import {
17
17
  proxy3D,
18
18
  setCameraFromOrbitCoordinates,
19
19
  setTwistyDebug
20
- } from "../chunk-LV7IKG36.js";
21
- import "../chunk-OX6O2ZO5.js";
20
+ } from "../chunk-J5KJ2WWA.js";
21
+ import "../chunk-QHWK5RXN.js";
22
22
  import {
23
23
  countAnimatedLeaves,
24
24
  countMoves
25
- } from "../chunk-ZNAYJGVL.js";
25
+ } from "../chunk-NUMCMGLU.js";
26
26
  import {
27
27
  cube3x3x3,
28
28
  puzzles
29
- } from "../chunk-DZGFGBKT.js";
29
+ } from "../chunk-EOEJDDXN.js";
30
30
  import {
31
31
  customPGPuzzleLoader
32
- } from "../chunk-PYWGREIP.js";
33
- import "../chunk-XU5ILFX5.js";
32
+ } from "../chunk-YD2TMJI2.js";
33
+ import "../chunk-POCUG6QW.js";
34
34
  import {
35
35
  Alg,
36
36
  AlgBuilder,
@@ -43,7 +43,7 @@ import {
43
43
  direct,
44
44
  directedGenerator,
45
45
  experimentalAppendMove
46
- } from "../chunk-NI7U4XAZ.js";
46
+ } from "../chunk-7OIUETFU.js";
47
47
  import "../chunk-SBZRVSPK.js";
48
48
 
49
49
  // src/cubing/twisty/controllers/AnimationTypes.ts
@@ -329,7 +329,7 @@ var TwistyPlayerController = class {
329
329
  // src/cubing/twisty/model/props/viewer/ControlPanelProp.ts
330
330
  var controlsLocations = {
331
331
  "bottom-row": true,
332
- "none": true
332
+ none: true
333
333
  };
334
334
  var ControlPanelProp = class extends SimpleTwistyPropSource {
335
335
  getDefaultValue() {
@@ -338,7 +338,8 @@ var ControlPanelProp = class extends SimpleTwistyPropSource {
338
338
  };
339
339
 
340
340
  // src/cubing/twisty/views/TwistyViewerWrapper.css.ts
341
- var twistyViewerWrapperCSS = new CSSSource(`
341
+ var twistyViewerWrapperCSS = new CSSSource(
342
+ `
342
343
  :host {
343
344
  width: 384px;
344
345
  height: 256px;
@@ -376,10 +377,12 @@ var twistyViewerWrapperCSS = new CSSSource(`
376
377
  grid-row: 1 / 2;
377
378
  grid-column: 2 / 3;
378
379
  }
379
- `);
380
+ `
381
+ );
380
382
 
381
383
  // src/cubing/twisty/views/2D/Twisty2DPuzzle.css.ts
382
- var twisty2DSVGCSS = new CSSSource(`
384
+ var twisty2DSVGCSS = new CSSSource(
385
+ `
383
386
  :host {
384
387
  width: 384px;
385
388
  height: 256px;
@@ -410,47 +413,48 @@ svg {
410
413
  from { opacity: 0; }
411
414
  to { opacity: 1; }
412
415
  }
413
- `);
416
+ `
417
+ );
414
418
 
415
419
  // src/cubing/twisty/views/2D/KPuzzleSVGWrapper.ts
416
420
  var xmlns = "http://www.w3.org/2000/svg";
417
421
  var svgCounter = 0;
418
422
  function nextSVGID() {
419
423
  svgCounter += 1;
420
- return "svg" + svgCounter.toString();
424
+ return `svg${svgCounter.toString()}`;
421
425
  }
422
426
  var colorMaps = {
423
427
  dim: {
424
- "white": "#dddddd",
425
- "orange": "#884400",
426
- "limegreen": "#008800",
427
- "red": "#660000",
428
+ white: "#dddddd",
429
+ orange: "#884400",
430
+ limegreen: "#008800",
431
+ red: "#660000",
428
432
  "rgb(34, 102, 255)": "#000088",
429
- "yellow": "#888800"
433
+ yellow: "#888800"
430
434
  },
431
435
  oriented: {
432
- "white": "#44ddcc",
433
- "orange": "#44ddcc",
434
- "limegreen": "#44ddcc",
435
- "red": "#44ddcc",
436
+ white: "#44ddcc",
437
+ orange: "#44ddcc",
438
+ limegreen: "#44ddcc",
439
+ red: "#44ddcc",
436
440
  "rgb(34, 102, 255)": "#44ddcc",
437
- "yellow": "#44ddcc"
441
+ yellow: "#44ddcc"
438
442
  },
439
443
  ignored: {
440
- "white": "#444444",
441
- "orange": "#444444",
442
- "limegreen": "#444444",
443
- "red": "#444444",
444
+ white: "#444444",
445
+ orange: "#444444",
446
+ limegreen: "#444444",
447
+ red: "#444444",
444
448
  "rgb(34, 102, 255)": "#444444",
445
- "yellow": "#444444"
449
+ yellow: "#444444"
446
450
  },
447
451
  invisible: {
448
- "white": "#00000000",
449
- "orange": "#00000000",
450
- "limegreen": "#00000000",
451
- "red": "#00000000",
452
+ white: "#00000000",
453
+ orange: "#00000000",
454
+ limegreen: "#00000000",
455
+ red: "#00000000",
452
456
  "rgb(34, 102, 255)": "#00000000",
453
- "yellow": "#00000000"
457
+ yellow: "#00000000"
454
458
  }
455
459
  };
456
460
  var KPuzzleSVGWrapper = class {
@@ -596,10 +600,10 @@ var KPuzzleSVGWrapper = class {
596
600
  "stop-color",
597
601
  this.originalColors[fromCur]
598
602
  );
599
- this.gradients[id].children[1].setAttribute("offset", `100%`);
600
- this.gradients[id].children[2].setAttribute("offset", `100%`);
601
- this.gradients[id].children[3].setAttribute("offset", `100%`);
602
- this.gradients[id].children[4].setAttribute("offset", `100%`);
603
+ this.gradients[id].children[1].setAttribute("offset", "100%");
604
+ this.gradients[id].children[2].setAttribute("offset", "100%");
605
+ this.gradients[id].children[3].setAttribute("offset", "100%");
606
+ this.gradients[id].children[4].setAttribute("offset", "100%");
603
607
  }
604
608
  }
605
609
  }
@@ -611,7 +615,7 @@ var KPuzzleSVGWrapper = class {
611
615
  "radialGradient"
612
616
  );
613
617
  grad.setAttribute("id", `grad-${this.svgID}-${id}`);
614
- grad.setAttribute("r", `70.7107%`);
618
+ grad.setAttribute("r", "70.7107%");
615
619
  const stopDefs = [
616
620
  { offset: 0, color: originalColor },
617
621
  { offset: 0, color: originalColor },
@@ -630,10 +634,10 @@ var KPuzzleSVGWrapper = class {
630
634
  return grad;
631
635
  }
632
636
  elementID(orbitName, idx, orientation) {
633
- return orbitName + "-l" + idx + "-o" + orientation;
637
+ return `${orbitName}-l${idx}-o${orientation}`;
634
638
  }
635
639
  elementByID(id) {
636
- return this.wrapperElement.querySelector("#" + id);
640
+ return this.wrapperElement.querySelector(`#${id}`);
637
641
  }
638
642
  };
639
643
 
@@ -651,14 +655,11 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
651
655
  this.#freshListenerManager = new FreshListenerManager();
652
656
  this.addCSS(twisty2DSVGCSS);
653
657
  this.resetSVG();
654
- this.#freshListenerManager.addListener(
655
- this.model.puzzleID,
656
- (puzzleID) => {
657
- if (puzzleLoader?.id !== puzzleID) {
658
- this.disconnect();
659
- }
658
+ this.#freshListenerManager.addListener(this.model.puzzleID, (puzzleID) => {
659
+ if (puzzleLoader?.id !== puzzleID) {
660
+ this.disconnect();
660
661
  }
661
- );
662
+ });
662
663
  this.#freshListenerManager.addListener(
663
664
  this.model.legacyPosition,
664
665
  this.onPositionChange.bind(this)
@@ -741,12 +742,9 @@ var Twisty2DPuzzleWrapper = class {
741
742
  this.puzzleLoader = puzzleLoader;
742
743
  this.effectiveVisualization = effectiveVisualization;
743
744
  this.twisty2DPuzzle();
744
- this.#freshListenerManager.addListener(
745
- this.model.twistySceneModel.stickering,
746
- async (stickering) => {
747
- (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
748
- }
749
- );
745
+ this.#freshListenerManager.addListener(this.model.twistySceneModel.stickering, async (stickering) => {
746
+ (await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
747
+ });
750
748
  }
751
749
  #freshListenerManager = new FreshListenerManager();
752
750
  disconnect() {
@@ -873,61 +871,46 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
873
871
  this.puzzleLoader = puzzleLoader;
874
872
  this.visualizationStrategy = visualizationStrategy;
875
873
  this.twisty3DPuzzle();
876
- this.#freshListenerManager.addListener(
877
- this.model.puzzleLoader,
878
- (puzzleLoader2) => {
879
- if (this.puzzleLoader.id !== puzzleLoader2.id) {
880
- this.disconnect();
881
- }
882
- }
883
- );
884
- this.#freshListenerManager.addListener(
885
- this.model.legacyPosition,
886
- async (position) => {
887
- try {
888
- (await this.twisty3DPuzzle()).onPositionChange(position);
889
- this.scheduleRender();
890
- } catch (e) {
891
- this.disconnect();
892
- }
874
+ this.#freshListenerManager.addListener(this.model.puzzleLoader, (puzzleLoader2) => {
875
+ if (this.puzzleLoader.id !== puzzleLoader2.id) {
876
+ this.disconnect();
893
877
  }
894
- );
895
- this.#freshListenerManager.addListener(
896
- this.model.twistySceneModel.hintFacelet,
897
- async (hintFaceletStyle) => {
898
- (await this.twisty3DPuzzle()).experimentalUpdateOptions({
899
- hintFacelets: hintFaceletStyle === "auto" ? "floating" : hintFaceletStyle
900
- });
878
+ });
879
+ this.#freshListenerManager.addListener(this.model.legacyPosition, async (position) => {
880
+ try {
881
+ (await this.twisty3DPuzzle()).onPositionChange(position);
901
882
  this.scheduleRender();
883
+ } catch (e) {
884
+ this.disconnect();
902
885
  }
903
- );
904
- this.#freshListenerManager.addListener(
905
- this.model.twistySceneModel.foundationDisplay,
906
- async (foundationDisplay) => {
907
- (await this.twisty3DPuzzle()).experimentalUpdateOptions({
908
- showFoundation: foundationDisplay !== "none"
909
- });
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);
910
902
  this.scheduleRender();
911
- }
912
- );
913
- this.#freshListenerManager.addListener(
914
- this.model.twistySceneModel.stickering,
915
- async (stickering) => {
916
- if ("setStickering" in await this.twisty3DPuzzle()) {
917
- (await this.twisty3DPuzzle()).setStickering(stickering);
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);
918
910
  this.scheduleRender();
919
- } else {
920
- if ("appearance" in this.puzzleLoader) {
921
- const [twisty3D, appearancePromise] = await Promise.all([
922
- this.twisty3DPuzzle(),
923
- this.puzzleLoader.appearance(stickering ?? "full")
924
- ]);
925
- twisty3D.experimentalSetAppearance(appearancePromise);
926
- this.scheduleRender();
927
- }
928
911
  }
929
912
  }
930
- );
913
+ });
931
914
  this.#freshListenerManager.addMultiListener3(
932
915
  [
933
916
  this.model.twistySceneModel.stickering,
@@ -964,14 +947,11 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
964
947
  this.model.twistySceneModel.hintStickerSprite.get(),
965
948
  this.model.twistySceneModel.stickering.get()
966
949
  ]);
967
- return (await proxyPromise).cube3DShim(
968
- () => this.schedulable.scheduleRender(),
969
- {
970
- foundationSprite,
971
- hintSprite,
972
- experimentalStickering
973
- }
974
- );
950
+ return (await proxyPromise).cube3DShim(() => this.schedulable.scheduleRender(), {
951
+ foundationSprite,
952
+ hintSprite,
953
+ experimentalStickering
954
+ });
975
955
  } else {
976
956
  const [hintFacelets, foundationSprite, hintSprite] = await Promise.all([
977
957
  this.model.twistySceneModel.hintFacelet.get(),
@@ -1159,7 +1139,8 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
1159
1139
  customElementsShim.define("twisty-3d-scene-wrapper", Twisty3DSceneWrapper);
1160
1140
 
1161
1141
  // src/cubing/twisty/views/control-panel/TwistyButtons.css.ts
1162
- var buttonGridCSS = new CSSSource(`
1142
+ var buttonGridCSS = new CSSSource(
1143
+ `
1163
1144
  :host {
1164
1145
  width: 384px;
1165
1146
  height: 24px;
@@ -1188,8 +1169,10 @@ var buttonGridCSS = new CSSSource(`
1188
1169
  width: inherit;
1189
1170
  height: inherit;
1190
1171
  }
1191
- `);
1192
- var buttonCSS = new CSSSource(`
1172
+ `
1173
+ );
1174
+ var buttonCSS = new CSSSource(
1175
+ `
1193
1176
  :host:not([hidden]) {
1194
1177
  display: grid;
1195
1178
  }
@@ -1277,7 +1260,8 @@ button.svg-exit-fullscreen {
1277
1260
  button.svg-twizzle-tw {
1278
1261
  background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODY0IiBoZWlnaHQ9IjYwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzk3LjU4MSAxNTEuMTh2NTcuMDg0aC04OS43MDN2MjQwLjM1MmgtNjYuOTU1VjIwOC4yNjRIMTUxLjIydi01Ny4wODNoMjQ2LjM2MXptNTQuMzEgNzEuNjc3bDcuNTEyIDMzLjY5MmMyLjcxOCAxMi4xNiA1LjU4IDI0LjY4IDguNTg0IDM3LjU1NWEyMTgwLjc3NSAyMTgwLjc3NSAwIDAwOS40NDIgMzguODQzIDEyNjYuMyAxMjY2LjMgMCAwMDEwLjA4NiAzNy41NTVjMy43Mi0xMi41OSA3LjM2OC0yNS40NjYgMTAuOTQ1LTM4LjYyOCAzLjU3Ni0xMy4xNjIgNy4wMS0yNi4xMSAxMC4zLTM4Ljg0M2w1Ljc2OS0yMi40NTZjMS4yNDgtNC44ODcgMi40NzItOS43MDUgMy42NzQtMTQuNDU1IDMuMDA0LTExLjg3NSA1LjY1MS0yMi45NjIgNy45NC0zMy4yNjNoNDYuMzU0bDIuMzg0IDEwLjU2M2EyMDAwLjc3IDIwMDAuNzcgMCAwMDMuOTM1IDE2LjgyOGw2LjcxMSAyNy43MWMxLjIxMyA0Ljk1NiAyLjQ1IDkuOTggMy43MDkgMTUuMDczYTMxMTkuNzc3IDMxMTkuNzc3IDAgMDA5Ljg3MSAzOC44NDMgMTI0OS4yMjcgMTI0OS4yMjcgMCAwMDEwLjczIDM4LjYyOCAxOTA3LjYwNSAxOTA3LjYwNSAwIDAwMTAuMzAxLTM3LjU1NSAxMzk3Ljk0IDEzOTcuOTQgMCAwMDkuNjU3LTM4Ljg0M2w0LjQtMTkuMDQ2Yy43MTUtMy4xMyAxLjQyMS02LjIzNiAyLjExOC05LjMyMWw5LjU3Ny00Mi44OGg2Ni41MjZhMjk4OC43MTggMjk4OC43MTggMCAwMS0xOS41MjkgNjYuMzExbC01LjcyOCAxOC40ODJhMzIzNy40NiAzMjM3LjQ2IDAgMDEtMTQuMDE1IDQzLjc1MmMtNi40MzggMTkuNi0xMi43MzMgMzcuNjk4LTE4Ljg4NSA1NC4yOTRsLTMuMzA2IDguODI1Yy00Ljg4NCAxMi44OTgtOS40MzMgMjQuMjYzLTEzLjY0NyAzNC4wOTVoLTQ5Ljc4N2E4NDE3LjI4OSA4NDE3LjI4OSAwIDAxLTIxLjAzMS02NC44MDkgMTI4OC42ODYgMTI4OC42ODYgMCAwMS0xOC44ODUtNjQuODEgMTk3Mi40NDQgMTk3Mi40NDQgMCAwMS0xOC4yNCA2NC44MSAyNTc5LjQxMiAyNTc5LjQxMiAwIDAxLTIwLjM4OCA2NC44MWgtNDkuNzg3Yy00LjY4Mi0xMC45MjYtOS43Mi0yMy43NDMtMTUuMTEtMzguNDUxbC0xLjYyOS00LjQ3Yy01LjI1OC0xNC41MjEtMTAuNjgtMzAuMTkyLTE2LjI2Ni00Ny4wMTRsLTIuNDA0LTcuMjhjLTYuNDM4LTE5LjYtMTMuMDItNDAuMzQ0LTE5Ljc0My02Mi4yMzRhMjk4OC43MDcgMjk4OC43MDcgMCAwMS0xOS41MjktNjYuMzExaDY3LjM4NXoiIGZpbGw9IiM0Mjg1RjQiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==");
1279
1262
  }
1280
- `);
1263
+ `
1264
+ );
1281
1265
 
1282
1266
  // src/cubing/twisty/views/document.ts
1283
1267
  var globalSafeDocument = typeof document === "undefined" ? null : document;
@@ -1321,7 +1305,7 @@ var buttonIcons = [
1321
1305
  var ButtonAppearanceProp = class extends TwistyPropDerived {
1322
1306
  derive(inputs) {
1323
1307
  const buttonAppearances = {
1324
- "fullscreen": {
1308
+ fullscreen: {
1325
1309
  enabled: fullscreenEnabled,
1326
1310
  icon: document.fullscreenElement === null ? "enter-fullscreen" : "exit-fullscreen",
1327
1311
  title: "Enter fullscreen"
@@ -1364,7 +1348,7 @@ var ButtonAppearanceProp = class extends TwistyPropDerived {
1364
1348
 
1365
1349
  // src/cubing/twisty/views/control-panel/TwistyButtons.ts
1366
1350
  var buttonCommands = {
1367
- "fullscreen": true,
1351
+ fullscreen: true,
1368
1352
  "jump-to-start": true,
1369
1353
  "play-step-backwards": true,
1370
1354
  "play-pause": true,
@@ -1397,33 +1381,40 @@ var TwistyButtons = class extends ManagedCustomElement {
1397
1381
  }
1398
1382
  #onCommand(command) {
1399
1383
  switch (command) {
1400
- case "fullscreen":
1384
+ case "fullscreen": {
1401
1385
  this.onFullscreenButton();
1402
1386
  break;
1403
- case "jump-to-start":
1387
+ }
1388
+ case "jump-to-start": {
1404
1389
  this.controller?.jumpToStart({ flash: true });
1405
1390
  break;
1406
- case "play-step-backwards":
1391
+ }
1392
+ case "play-step-backwards": {
1407
1393
  this.controller?.animationController.play({
1408
1394
  direction: -1 /* Backwards */,
1409
1395
  untilBoundary: "move" /* Move */
1410
1396
  });
1411
1397
  break;
1412
- case "play-pause":
1398
+ }
1399
+ case "play-pause": {
1413
1400
  this.controller?.togglePlay();
1414
1401
  break;
1415
- case "play-step":
1402
+ }
1403
+ case "play-step": {
1416
1404
  this.controller?.animationController.play({
1417
1405
  direction: 1 /* Forwards */,
1418
1406
  untilBoundary: "move" /* Move */
1419
1407
  });
1420
1408
  break;
1421
- case "jump-to-end":
1409
+ }
1410
+ case "jump-to-end": {
1422
1411
  this.controller?.jumpToEnd({ flash: true });
1423
1412
  break;
1424
- case "twizzle-link":
1413
+ }
1414
+ case "twizzle-link": {
1425
1415
  this.controller?.visitTwizzleLink();
1426
1416
  break;
1417
+ }
1427
1418
  default:
1428
1419
  throw new Error("Missing command");
1429
1420
  }
@@ -1480,7 +1471,8 @@ var TwistyButton = class extends ManagedCustomElement {
1480
1471
  customElementsShim.define("twisty-button", TwistyButton);
1481
1472
 
1482
1473
  // src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts
1483
- var twistyScrubberCSS = new CSSSource(`
1474
+ var twistyScrubberCSS = new CSSSource(
1475
+ `
1484
1476
  :host {
1485
1477
  width: 384px;
1486
1478
  height: 16px;
@@ -1500,7 +1492,8 @@ var twistyScrubberCSS = new CSSSource(`
1500
1492
  input:not(:disabled) {
1501
1493
  cursor: ew-resize;
1502
1494
  }
1503
- `);
1495
+ `
1496
+ );
1504
1497
 
1505
1498
  // src/cubing/twisty/views/control-panel/TwistyScrubber.ts
1506
1499
  var SLOW_DOWN_SCRUBBING = false;
@@ -1542,9 +1535,10 @@ var lastPreval = 0;
1542
1535
  var scaling = false;
1543
1536
  var currentClickNum = 0;
1544
1537
  var TwistyScrubber = class extends ManagedCustomElement {
1545
- constructor(model) {
1538
+ constructor(model, controller) {
1546
1539
  super();
1547
1540
  this.model = model;
1541
+ this.controller = controller;
1548
1542
  }
1549
1543
  async onDetailedTimelineInfo(detailedTimelineInfo) {
1550
1544
  const inputElem = await this.inputElem();
@@ -1567,6 +1561,7 @@ var TwistyScrubber = class extends ManagedCustomElement {
1567
1561
  this.onDetailedTimelineInfo.bind(this)
1568
1562
  );
1569
1563
  elem.addEventListener("input", this.onInput.bind(this));
1564
+ elem.addEventListener("keydown", this.onKeypress.bind(this));
1570
1565
  return elem;
1571
1566
  })());
1572
1567
  }
@@ -1580,6 +1575,24 @@ var TwistyScrubber = class extends ManagedCustomElement {
1580
1575
  this.model?.playingInfo.set({ playing: false });
1581
1576
  this.model?.timestampRequest.set(value);
1582
1577
  }
1578
+ onKeypress(e) {
1579
+ switch (e.key) {
1580
+ case "ArrowLeft":
1581
+ case "ArrowRight": {
1582
+ this.controller?.animationController.play({
1583
+ direction: e.key === "ArrowLeft" ? -1 /* Backwards */ : 1 /* Forwards */,
1584
+ untilBoundary: "move" /* Move */
1585
+ });
1586
+ e.preventDefault();
1587
+ break;
1588
+ }
1589
+ case " ": {
1590
+ this.controller?.togglePlay();
1591
+ e.preventDefault();
1592
+ break;
1593
+ }
1594
+ }
1595
+ }
1583
1596
  async slowDown(e, inputElem) {
1584
1597
  if (!SLOW_DOWN_SCRUBBING) {
1585
1598
  return;
@@ -1657,7 +1670,7 @@ async function getDefaultFilename(model) {
1657
1670
  model.puzzleID.get(),
1658
1671
  model.alg.get()
1659
1672
  ]);
1660
- return `[${puzzleID}]${algWithIssues.alg.experimentalNumChildAlgNodes() === 0 ? "" : " " + algWithIssues.alg.toString()}`;
1673
+ return `[${puzzleID}]${algWithIssues.alg.experimentalNumChildAlgNodes() === 0 ? "" : ` ${algWithIssues.alg.toString()}`}`;
1661
1674
  }
1662
1675
  function downloadURL(url, name, extension = "png") {
1663
1676
  const a = document.createElement("a");
@@ -1667,7 +1680,8 @@ function downloadURL(url, name, extension = "png") {
1667
1680
  }
1668
1681
 
1669
1682
  // src/cubing/twisty/views/TwistyPlayer.css.ts
1670
- var twistyPlayerCSS = new CSSSource(`
1683
+ var twistyPlayerCSS = new CSSSource(
1684
+ `
1671
1685
  :host {
1672
1686
  width: 384px;
1673
1687
  height: 256px;
@@ -1736,7 +1750,8 @@ twisty-scrubber {
1736
1750
  .wrapper.error .error-elem {
1737
1751
  display: grid;
1738
1752
  }
1739
- `);
1753
+ `
1754
+ );
1740
1755
 
1741
1756
  // src/cubing/twisty/model/props/general/ArbitraryStringProp.ts
1742
1757
  var ArbitraryStringProp = class extends SimpleTwistyPropSource {
@@ -1786,7 +1801,7 @@ function algWithIssuesFromString(s) {
1786
1801
  const alg = Alg.fromString(s);
1787
1802
  const warnings = [];
1788
1803
  if (alg.toString() !== s) {
1789
- warnings.push(`Alg is non-canonical!`);
1804
+ warnings.push("Alg is non-canonical!");
1790
1805
  }
1791
1806
  return {
1792
1807
  alg,
@@ -2052,7 +2067,9 @@ var SimpleAlgIndexer = class {
2052
2067
  return i;
2053
2068
  }
2054
2069
  stateAtIndex(index) {
2055
- return this.kpuzzle.startState().applyTransformation(this.transformationAtIndex(index));
2070
+ return this.kpuzzle.startState().applyTransformation(
2071
+ this.transformationAtIndex(index)
2072
+ );
2056
2073
  }
2057
2074
  transformationAtIndex(index) {
2058
2075
  let state = this.kpuzzle.identityTransformation();
@@ -2347,16 +2364,18 @@ var SimultaneousMoveIndexer = class {
2347
2364
  endTimestamp: leafWithRange.end
2348
2365
  };
2349
2366
  switch (fraction) {
2350
- case 0:
2367
+ case 0: {
2351
2368
  movesStarting.push(currentMove);
2352
2369
  break;
2353
- case 1:
2370
+ }
2371
+ case 1: {
2354
2372
  if (moveFinished) {
2355
2373
  movesFinished.push(currentMove);
2356
2374
  } else {
2357
2375
  movesFinishing.push(currentMove);
2358
2376
  }
2359
2377
  break;
2378
+ }
2360
2379
  default:
2361
2380
  currentMoves.push(currentMove);
2362
2381
  latestStart = Math.max(latestStart, leafWithRange.start);
@@ -2489,13 +2508,7 @@ var DecoratorConstructor = class extends TraversalUp {
2489
2508
  const AB = decA.forward.applyTransformation(decB.forward);
2490
2509
  const ApBp = decA.backward.applyTransformation(decB.backward);
2491
2510
  const ABApBp = AB.applyTransformation(ApBp);
2492
- const dec = new AlgWalkterDecoration(
2493
- 2 * (decA.moveCount + decB.moveCount),
2494
- 2 * (decA.duration + decB.duration),
2495
- ABApBp,
2496
- ABApBp.invert(),
2497
- [decA, decB]
2498
- );
2511
+ const dec = new AlgWalkterDecoration(2 * (decA.moveCount + decB.moveCount), 2 * (decA.duration + decB.duration), ABApBp, ABApBp.invert(), [decA, decB]);
2499
2512
  return this.mult(dec, 1, [dec, decA, decB]);
2500
2513
  }
2501
2514
  traverseConjugate(conjugate) {
@@ -2503,13 +2516,10 @@ var DecoratorConstructor = class extends TraversalUp {
2503
2516
  const decB = this.traverseAlg(conjugate.B);
2504
2517
  const AB = decA.forward.applyTransformation(decB.forward);
2505
2518
  const ABAp = AB.applyTransformation(decA.backward);
2506
- const dec = new AlgWalkterDecoration(
2507
- 2 * decA.moveCount + decB.moveCount,
2508
- 2 * decA.duration + decB.duration,
2509
- ABAp,
2510
- ABAp.invert(),
2511
- [decA, decB]
2512
- );
2519
+ const dec = new AlgWalkterDecoration(2 * decA.moveCount + decB.moveCount, 2 * decA.duration + decB.duration, ABAp, ABAp.invert(), [
2520
+ decA,
2521
+ decB
2522
+ ]);
2513
2523
  return this.mult(dec, 1, [dec, decA, decB]);
2514
2524
  }
2515
2525
  traversePause(pause) {
@@ -3085,9 +3095,9 @@ var TempoScaleProp = class extends TwistyPropSource {
3085
3095
 
3086
3096
  // src/cubing/twisty/model/props/timeline/TimestampRequestProp.ts
3087
3097
  var smartTimestamps = {
3088
- "start": true,
3089
- "end": true,
3090
- "anchor": true,
3098
+ start: true,
3099
+ end: true,
3100
+ anchor: true,
3091
3101
  "opposite-anchor": true
3092
3102
  };
3093
3103
  var TimestampRequestProp = class extends SimpleTwistyPropSource {
@@ -3113,7 +3123,7 @@ var TimestampRequestProp = class extends SimpleTwistyPropSource {
3113
3123
 
3114
3124
  // src/cubing/twisty/model/props/viewer/BackViewProp.ts
3115
3125
  var backViewLayouts = {
3116
- "none": true,
3126
+ none: true,
3117
3127
  "side-by-side": true,
3118
3128
  "top-right": true
3119
3129
  };
@@ -3698,19 +3708,25 @@ var TwistyPlayerSettable = class extends ManagedCustomElement {
3698
3708
  throw err("experimentalMovePressInput");
3699
3709
  }
3700
3710
  set cameraLatitude(latitude) {
3701
- this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({ latitude });
3711
+ this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({
3712
+ latitude
3713
+ });
3702
3714
  }
3703
3715
  get cameraLatitude() {
3704
3716
  throw err("cameraLatitude");
3705
3717
  }
3706
3718
  set cameraLongitude(longitude) {
3707
- this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({ longitude });
3719
+ this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({
3720
+ longitude
3721
+ });
3708
3722
  }
3709
3723
  get cameraLongitude() {
3710
3724
  throw err("cameraLongitude");
3711
3725
  }
3712
3726
  set cameraDistance(distance) {
3713
- this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({ distance });
3727
+ this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({
3728
+ distance
3729
+ });
3714
3730
  }
3715
3731
  get cameraDistance() {
3716
3732
  throw err("cameraDistance");
@@ -3773,15 +3789,15 @@ var ExperimentalGetters = class {
3773
3789
  // src/cubing/twisty/views/TwistyPlayer.ts
3774
3790
  var DATA_ATTRIBUTE_PREFIX = "data-";
3775
3791
  var twistyPlayerAttributeMap = {
3776
- "alg": "alg",
3792
+ alg: "alg",
3777
3793
  "experimental-setup-alg": "experimentalSetupAlg",
3778
3794
  "experimental-setup-anchor": "experimentalSetupAnchor",
3779
- "puzzle": "puzzle",
3795
+ puzzle: "puzzle",
3780
3796
  "experimental-puzzle-description": "experimentalPuzzleDescription",
3781
- "visualization": "visualization",
3797
+ visualization: "visualization",
3782
3798
  "hint-facelets": "hintFacelets",
3783
3799
  "experimental-stickering": "experimentalStickering",
3784
- "background": "background",
3800
+ background: "background",
3785
3801
  "control-panel": "controlPanel",
3786
3802
  "back-view": "backView",
3787
3803
  "viewer-link": "viewerLink",
@@ -3847,16 +3863,17 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
3847
3863
  );
3848
3864
  this.addElement(this.#errorElem).classList.add("error-elem");
3849
3865
  this.#errorElem.textContent = "Error";
3850
- this.experimentalModel.userVisibleErrorTracker.addFreshListener(
3851
- (userVisibleError) => {
3852
- const errorString = userVisibleError.errors[0] ?? null;
3853
- this.contentWrapper.classList.toggle("error", !!errorString);
3854
- if (errorString) {
3855
- this.#errorElem.textContent = errorString;
3856
- }
3866
+ this.experimentalModel.userVisibleErrorTracker.addFreshListener((userVisibleError) => {
3867
+ const errorString = userVisibleError.errors[0] ?? null;
3868
+ this.contentWrapper.classList.toggle("error", !!errorString);
3869
+ if (errorString) {
3870
+ this.#errorElem.textContent = errorString;
3857
3871
  }
3872
+ });
3873
+ const scrubber = new TwistyScrubber(
3874
+ this.experimentalModel,
3875
+ this.controller
3858
3876
  );
3859
- const scrubber = new TwistyScrubber(this.experimentalModel);
3860
3877
  this.contentWrapper.appendChild(scrubber);
3861
3878
  this.buttons = new TwistyButtons(
3862
3879
  this.experimentalModel,
@@ -3864,19 +3881,15 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
3864
3881
  this
3865
3882
  );
3866
3883
  this.contentWrapper.appendChild(this.buttons);
3867
- this.experimentalModel.twistySceneModel.background.addFreshListener(
3868
- (backgroundTheme) => {
3869
- this.contentWrapper.classList.toggle(
3870
- "checkered",
3871
- backgroundTheme !== "none"
3872
- );
3873
- }
3874
- );
3875
- this.experimentalModel.controlPanel.addFreshListener(
3876
- (controlPanel) => {
3877
- this.#controlsManager.setValue(controlPanel);
3878
- }
3879
- );
3884
+ this.experimentalModel.twistySceneModel.background.addFreshListener((backgroundTheme) => {
3885
+ this.contentWrapper.classList.toggle(
3886
+ "checkered",
3887
+ backgroundTheme !== "none"
3888
+ );
3889
+ });
3890
+ this.experimentalModel.controlPanel.addFreshListener((controlPanel) => {
3891
+ this.#controlsManager.setValue(controlPanel);
3892
+ });
3880
3893
  this.experimentalModel.visualizationStrategy.addFreshListener(
3881
3894
  this.#setVisualizationWrapper.bind(this)
3882
3895
  );
@@ -3904,17 +3917,19 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
3904
3917
  let newWrapper;
3905
3918
  switch (strategy) {
3906
3919
  case "2D":
3907
- case "experimental-2D-LL":
3920
+ case "experimental-2D-LL": {
3908
3921
  newWrapper = new Twisty2DSceneWrapper(
3909
3922
  this.experimentalModel.twistySceneModel,
3910
3923
  strategy
3911
3924
  );
3912
3925
  break;
3926
+ }
3913
3927
  case "Cube3D":
3914
- case "PG3D":
3928
+ case "PG3D": {
3915
3929
  newWrapper = new Twisty3DSceneWrapper(this.experimentalModel);
3916
3930
  this.#initial3DVisualizationWrapper.handleNewValue(newWrapper);
3917
3931
  break;
3932
+ }
3918
3933
  default:
3919
3934
  throw new Error("Invalid visualization");
3920
3935
  }
@@ -4025,7 +4040,8 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4025
4040
  customElementsShim.define("twisty-player", TwistyPlayer);
4026
4041
 
4027
4042
  // src/cubing/twisty/views/TwistyAlgViewer.css.ts
4028
- var twistyAlgViewerCSS = new CSSSource(`
4043
+ var twistyAlgViewerCSS = new CSSSource(
4044
+ `
4029
4045
  :host {
4030
4046
  display: inline;
4031
4047
  }
@@ -4051,7 +4067,8 @@ twisty-alg-leaf-elem.twisty-alg-comment {
4051
4067
  padding-right: 0.1em;
4052
4068
  border-radius: 0.1em;
4053
4069
  }
4054
- `);
4070
+ `
4071
+ );
4055
4072
 
4056
4073
  // src/cubing/twisty/views/TwistyAlgViewer.ts
4057
4074
  var DEFAULT_OFFSET_MS = 250;
@@ -4204,7 +4221,7 @@ var AlgToDOMTree = class extends TraversalDownUp {
4204
4221
  })
4205
4222
  );
4206
4223
  }
4207
- element.addString(")" + grouping.experimentalRepetitionSuffix);
4224
+ element.addString(`)${grouping.experimentalRepetitionSuffix}`);
4208
4225
  element.flushQueue();
4209
4226
  return {
4210
4227
  moveCount: moveCount * Math.abs(grouping.amount),
@@ -4391,34 +4408,28 @@ var TwistyAlgViewer = class extends HTMLElementShim {
4391
4408
  throw new Error("clearing twistyPlayer is not supported");
4392
4409
  }
4393
4410
  this.#twistyPlayer = twistyPlayer;
4394
- this.#twistyPlayer.experimentalModel.alg.addFreshListener(
4395
- (algWithIssues) => {
4396
- this.setAlg(algWithIssues.alg);
4397
- }
4398
- );
4411
+ this.#twistyPlayer.experimentalModel.alg.addFreshListener((algWithIssues) => {
4412
+ this.setAlg(algWithIssues.alg);
4413
+ });
4399
4414
  const sourceAlg = (await this.#twistyPlayer.experimentalModel.alg.get()).alg;
4400
4415
  const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
4401
4416
  this.setAlg(parsedAlg);
4402
- twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener(
4403
- (currentMoveInfo) => {
4404
- let moveInfo = currentMoveInfo.currentMoves[0];
4405
- moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4406
- moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
4407
- if (!moveInfo) {
4408
- this.highlighter.set(null);
4409
- } else {
4410
- const mainCurrentMove = moveInfo.move;
4411
- this.highlighter.set(mainCurrentMove);
4412
- }
4417
+ twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener((currentMoveInfo) => {
4418
+ let moveInfo = currentMoveInfo.currentMoves[0];
4419
+ moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
4420
+ moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
4421
+ if (!moveInfo) {
4422
+ this.highlighter.set(null);
4423
+ } else {
4424
+ const mainCurrentMove = moveInfo.move;
4425
+ this.highlighter.set(mainCurrentMove);
4413
4426
  }
4414
- );
4415
- twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener(
4416
- (detailedTimelineInfo) => {
4417
- if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4418
- this.lastClickTimestamp = null;
4419
- }
4427
+ });
4428
+ twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener((detailedTimelineInfo) => {
4429
+ if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
4430
+ this.lastClickTimestamp = null;
4420
4431
  }
4421
- );
4432
+ });
4422
4433
  }
4423
4434
  async jumpToIndex(index, offsetIntoMove) {
4424
4435
  const twistyPlayer = this.#twistyPlayer;
@@ -4632,7 +4643,8 @@ var TwistyAlgEditorModel = class {
4632
4643
  };
4633
4644
 
4634
4645
  // src/cubing/twisty/views/TwistyAlgEditor/TwistyAlgEditor.css.ts
4635
- var twistyAlgEditorCSS = new CSSSource(`
4646
+ var twistyAlgEditorCSS = new CSSSource(
4647
+ `
4636
4648
  :host {
4637
4649
  width: 384px;
4638
4650
  display: grid;
@@ -4701,7 +4713,8 @@ textarea {
4701
4713
  border: 1px solid red;
4702
4714
  background: rgba(255, 0, 0, 0.1);
4703
4715
  }
4704
- `);
4716
+ `
4717
+ );
4705
4718
 
4706
4719
  // src/cubing/twisty/views/TwistyAlgEditor/TwistyAlgEditor.ts
4707
4720
  var ATTRIBUTE_FOR_TWISTY_PLAYER = "for-twisty-player";
@@ -4752,13 +4765,11 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4752
4765
  }
4753
4766
  this.#twistyPlayerProp = options?.twistyPlayerProp ?? "alg";
4754
4767
  if (options?.twistyPlayerProp === "alg") {
4755
- this.model.leafToHighlight.addFreshListener(
4756
- (highlightInfo) => {
4757
- if (highlightInfo) {
4758
- this.highlightLeaf(highlightInfo.leafInfo.leaf);
4759
- }
4768
+ this.model.leafToHighlight.addFreshListener((highlightInfo) => {
4769
+ if (highlightInfo) {
4770
+ this.highlightLeaf(highlightInfo.leafInfo.leaf);
4760
4771
  }
4761
- );
4772
+ });
4762
4773
  }
4763
4774
  }
4764
4775
  #textarea;
@@ -4813,7 +4824,7 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4813
4824
  this.#textareaClassListValidForPuzzleManager.setValue(issues);
4814
4825
  }
4815
4826
  #padSuffix(s) {
4816
- return s.endsWith("\n") ? s + " " : s;
4827
+ return s.endsWith("\n") ? `${s} ` : s;
4817
4828
  }
4818
4829
  #highlightedLeaf;
4819
4830
  highlightLeaf(leaf) {
@@ -4861,62 +4872,61 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4861
4872
  this.algString = this.#algProp ? (await this.#algProp.get()).alg.toString() : "";
4862
4873
  })();
4863
4874
  if (this.#twistyPlayerProp === "alg") {
4864
- this.#twistyPlayer?.experimentalModel.puzzleAlg.addFreshListener(
4865
- (algWithIssues) => {
4866
- if (algWithIssues.issues.errors.length === 0) {
4867
- this.setAlgIssueClassForPuzzle(
4868
- algWithIssues.issues.warnings.length === 0 ? "none" : "warning"
4869
- );
4870
- const newAlg = algWithIssues.alg;
4871
- const oldAlg = Alg.fromString(this.algString);
4872
- if (!newAlg.isIdentical(oldAlg)) {
4873
- this.algString = newAlg.toString();
4874
- this.onInput();
4875
- } else {
4876
- }
4875
+ this.#twistyPlayer?.experimentalModel.puzzleAlg.addFreshListener((algWithIssues) => {
4876
+ if (algWithIssues.issues.errors.length === 0) {
4877
+ this.setAlgIssueClassForPuzzle(
4878
+ algWithIssues.issues.warnings.length === 0 ? "none" : "warning"
4879
+ );
4880
+ const newAlg = algWithIssues.alg;
4881
+ const oldAlg = Alg.fromString(this.algString);
4882
+ if (!newAlg.isIdentical(oldAlg)) {
4883
+ this.algString = newAlg.toString();
4884
+ this.onInput();
4877
4885
  } else {
4878
- this.setAlgIssueClassForPuzzle("error");
4879
4886
  }
4887
+ } else {
4888
+ this.setAlgIssueClassForPuzzle("error");
4880
4889
  }
4881
- );
4882
- this.model.leafToHighlight.addFreshListener(
4883
- async (highlightInfo) => {
4884
- if (highlightInfo === null) {
4885
- return;
4886
- }
4887
- const [indexer, timestampRequest] = await Promise.all([
4888
- await twistyPlayer.experimentalModel.indexer.get(),
4889
- await twistyPlayer.experimentalModel.timestampRequest.get()
4890
- ]);
4891
- if (timestampRequest === "opposite-anchor" && !this.#onInputHasFired) {
4892
- return;
4890
+ });
4891
+ this.model.leafToHighlight.addFreshListener(async (highlightInfo) => {
4892
+ if (highlightInfo === null) {
4893
+ return;
4894
+ }
4895
+ const [indexer, timestampRequest] = await Promise.all([
4896
+ await twistyPlayer.experimentalModel.indexer.get(),
4897
+ await twistyPlayer.experimentalModel.timestampRequest.get()
4898
+ ]);
4899
+ if (timestampRequest === "opposite-anchor" && !this.#onInputHasFired) {
4900
+ return;
4901
+ }
4902
+ const moveStartTimestamp = indexer.indexToMoveStartTimestamp(
4903
+ highlightInfo.leafInfo.idx
4904
+ );
4905
+ const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
4906
+ let newTimestamp;
4907
+ switch (highlightInfo.where) {
4908
+ case "before": {
4909
+ newTimestamp = moveStartTimestamp;
4910
+ break;
4893
4911
  }
4894
- const moveStartTimestamp = indexer.indexToMoveStartTimestamp(
4895
- highlightInfo.leafInfo.idx
4896
- );
4897
- const duration = indexer.moveDuration(highlightInfo.leafInfo.idx);
4898
- let newTimestamp;
4899
- switch (highlightInfo.where) {
4900
- case "before":
4901
- newTimestamp = moveStartTimestamp;
4902
- break;
4903
- case "start":
4904
- case "inside":
4905
- newTimestamp = moveStartTimestamp + duration / 4;
4906
- break;
4907
- case "end":
4908
- case "after":
4909
- newTimestamp = moveStartTimestamp + duration;
4910
- break;
4911
- default:
4912
- console.log("invalid where");
4913
- throw new Error("Invalid where!");
4912
+ case "start":
4913
+ case "inside": {
4914
+ newTimestamp = moveStartTimestamp + duration / 4;
4915
+ break;
4914
4916
  }
4915
- if (!this.debugNeverRequestTimestamp) {
4916
- twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4917
+ case "end":
4918
+ case "after": {
4919
+ newTimestamp = moveStartTimestamp + duration;
4920
+ break;
4917
4921
  }
4922
+ default:
4923
+ console.log("invalid where");
4924
+ throw new Error("Invalid where!");
4918
4925
  }
4919
- );
4926
+ if (!this.debugNeverRequestTimestamp) {
4927
+ twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
4928
+ }
4929
+ });
4920
4930
  twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(
4921
4931
  async (currentLeavesSimplified) => {
4922
4932
  const indexer = await twistyPlayer.experimentalModel.indexer.get();
@@ -4941,16 +4951,18 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4941
4951
  this.twistyPlayer = elem;
4942
4952
  return;
4943
4953
  }
4944
- case ATTRIBUTE_PLACEHOLDER:
4954
+ case ATTRIBUTE_PLACEHOLDER: {
4945
4955
  this.placeholder = newValue;
4946
4956
  return;
4947
- case ATTRIBUTE_TWISTY_PLAYER_PROP:
4957
+ }
4958
+ case ATTRIBUTE_TWISTY_PLAYER_PROP: {
4948
4959
  if (this.#twistyPlayer) {
4949
4960
  console.log("cannot set prop");
4950
4961
  throw new Error("cannot set prop after twisty player");
4951
4962
  }
4952
4963
  this.#twistyPlayerProp = newValue;
4953
4964
  return;
4965
+ }
4954
4966
  }
4955
4967
  }
4956
4968
  static get observedAttributes() {
@@ -4964,7 +4976,8 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
4964
4976
  customElementsShim.define("twisty-alg-editor", TwistyAlgEditor);
4965
4977
 
4966
4978
  // src/cubing/twisty/views/twizzle/TwizzleLink.css.ts
4967
- var twizzleLinkCSS = new CSSSource(`
4979
+ var twizzleLinkCSS = new CSSSource(
4980
+ `
4968
4981
  .wrapper {
4969
4982
  background: rgb(255, 245, 235);
4970
4983
  display: grid;
@@ -4997,20 +5010,21 @@ twisty-player {
4997
5010
  twisty-player + .heading {
4998
5011
  padding-top: 0.5em;
4999
5012
  }
5000
- `);
5013
+ `
5014
+ );
5001
5015
 
5002
5016
  // src/cubing/twisty/views/twizzle/url-params.ts
5003
5017
  function getConfigFromURL(prefix = "", url = location.href) {
5004
5018
  const paramMapping = {
5005
- "alg": "alg",
5019
+ alg: "alg",
5006
5020
  "setup-alg": "experimental-setup-alg",
5007
5021
  "setup-anchor": "experimental-setup-anchor",
5008
- "puzzle": "puzzle",
5009
- "stickering": "experimental-stickering",
5022
+ puzzle: "puzzle",
5023
+ stickering: "experimental-stickering",
5010
5024
  "puzzle-description": "experimental-puzzle-description",
5011
- "title": "experimental-title",
5025
+ title: "experimental-title",
5012
5026
  "video-url": "experimental-video-url",
5013
- "competition": "experimental-competition-id"
5027
+ competition: "experimental-competition-id"
5014
5028
  };
5015
5029
  const params = new URL(url).searchParams;
5016
5030
  const config = {};