cubing 0.26.6 → 0.28.0

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 (104) hide show
  1. package/README.md +2 -0
  2. package/dist/esm/alg/index.js +5 -9
  3. package/dist/esm/bluetooth/index.js +15 -16
  4. package/dist/esm/bluetooth/index.js.map +2 -2
  5. package/dist/esm/{chunk-NHCGS73I.js → chunk-47SWOA3X.js} +12 -6
  6. package/dist/esm/chunk-47SWOA3X.js.map +7 -0
  7. package/dist/esm/{chunk-VCOUFQGJ.js → chunk-4KIZAW2Z.js} +3 -3
  8. package/dist/esm/chunk-4KIZAW2Z.js.map +7 -0
  9. package/dist/esm/{chunk-7K6HJKEG.js → chunk-4V4RM3YJ.js} +21 -9
  10. package/dist/esm/chunk-4V4RM3YJ.js.map +7 -0
  11. package/dist/esm/{chunk-LJBHUHEP.js → chunk-7BLWQDZX.js} +6 -3
  12. package/dist/esm/{chunk-LJBHUHEP.js.map → chunk-7BLWQDZX.js.map} +2 -2
  13. package/dist/esm/{chunk-GBMX6FHY.js → chunk-ALBEW4DJ.js} +1 -1
  14. package/dist/esm/{chunk-GBMX6FHY.js.map → chunk-ALBEW4DJ.js.map} +1 -1
  15. package/dist/esm/{chunk-WQK6XWML.js → chunk-F4WWCPVE.js} +2 -2
  16. package/dist/esm/{chunk-WQK6XWML.js.map → chunk-F4WWCPVE.js.map} +1 -1
  17. package/dist/esm/{chunk-YBDBUTYE.js → chunk-GVPTO3OF.js} +1 -1
  18. package/dist/esm/{chunk-YBDBUTYE.js.map → chunk-GVPTO3OF.js.map} +1 -1
  19. package/dist/esm/{chunk-FCB447RN.js → chunk-GXZIBFSN.js} +191 -125
  20. package/dist/esm/chunk-GXZIBFSN.js.map +7 -0
  21. package/dist/esm/{chunk-GOBAXDTU.js → chunk-JAGHV77R.js} +14 -14
  22. package/dist/esm/chunk-JAGHV77R.js.map +7 -0
  23. package/dist/esm/{chunk-K62P6E3H.js → chunk-KBOIUBUE.js} +7 -7
  24. package/dist/esm/{chunk-K62P6E3H.js.map → chunk-KBOIUBUE.js.map} +1 -1
  25. package/dist/esm/{chunk-VFDAQ42O.js → chunk-LTPPXK6F.js} +3 -3
  26. package/dist/esm/{chunk-VFDAQ42O.js.map → chunk-LTPPXK6F.js.map} +1 -1
  27. package/dist/esm/{chunk-ITRA3DUQ.js → chunk-NJPSC7SH.js} +2 -2
  28. package/dist/esm/{chunk-ITRA3DUQ.js.map → chunk-NJPSC7SH.js.map} +1 -1
  29. package/dist/esm/{chunk-BEXHMXCT.js → chunk-RHC3DIN3.js} +1 -1
  30. package/dist/esm/{chunk-BEXHMXCT.js.map → chunk-RHC3DIN3.js.map} +1 -1
  31. package/dist/esm/{chunk-TB6NTLZY.js → chunk-ROGN5SXC.js} +7 -7
  32. package/dist/esm/chunk-ROGN5SXC.js.map +7 -0
  33. package/dist/esm/{chunk-GNKVWDWW.js → chunk-UP6RBLG2.js} +5 -5
  34. package/dist/esm/chunk-UP6RBLG2.js.map +7 -0
  35. package/dist/esm/{chunk-NYAPGKCW.js → chunk-V55YSWJY.js} +1 -1
  36. package/dist/esm/{chunk-NYAPGKCW.js.map → chunk-V55YSWJY.js.map} +1 -1
  37. package/dist/esm/kpuzzle/index.js +2 -2
  38. package/dist/esm/notation/index.js +4 -2
  39. package/dist/esm/protocol/index.js +8 -8
  40. package/dist/esm/puzzle-geometry/index.js +2 -2
  41. package/dist/esm/puzzles/index.js +4 -4
  42. package/dist/esm/{puzzles-dynamic-side-events-HOXBZYWI.js → puzzles-dynamic-side-events-WZI4Y3N6.js} +1 -1
  43. package/dist/esm/{puzzles-dynamic-side-events-HOXBZYWI.js.map → puzzles-dynamic-side-events-WZI4Y3N6.js.map} +1 -1
  44. package/dist/esm/{puzzles-dynamic-unofficial-MGVOFUDR.js → puzzles-dynamic-unofficial-FUG3JBMH.js} +1 -1
  45. package/dist/esm/{puzzles-dynamic-unofficial-MGVOFUDR.js.map → puzzles-dynamic-unofficial-FUG3JBMH.js.map} +1 -1
  46. package/dist/esm/scramble/index.js +5 -5
  47. package/dist/esm/search/index.js +10 -10
  48. package/dist/esm/{search-dynamic-sgs-side-events-KK62JAWA.js → search-dynamic-sgs-side-events-ZTOWSMQT.js} +7 -7
  49. package/dist/esm/{search-dynamic-sgs-side-events-KK62JAWA.js.map → search-dynamic-sgs-side-events-ZTOWSMQT.js.map} +1 -1
  50. package/dist/esm/{search-dynamic-sgs-unofficial-VLNIEUW3.js → search-dynamic-sgs-unofficial-V6HZTLGM.js} +7 -7
  51. package/dist/esm/{search-dynamic-sgs-unofficial-VLNIEUW3.js.map → search-dynamic-sgs-unofficial-V6HZTLGM.js.map} +1 -1
  52. package/dist/esm/{search-dynamic-solve-3x3x3-K4TG7P3X.js → search-dynamic-solve-3x3x3-K42IWMQV.js} +1 -1
  53. package/dist/esm/{search-dynamic-solve-3x3x3-K4TG7P3X.js.map → search-dynamic-solve-3x3x3-K42IWMQV.js.map} +1 -1
  54. package/dist/esm/{search-dynamic-solve-4x4x4-S5JPXMNU.js → search-dynamic-solve-4x4x4-YH6SB2WB.js} +8 -8
  55. package/dist/esm/{search-dynamic-solve-4x4x4-S5JPXMNU.js.map → search-dynamic-solve-4x4x4-YH6SB2WB.js.map} +1 -1
  56. package/dist/esm/{search-dynamic-solve-fto-WROONLZS.js → search-dynamic-solve-fto-O6UXF7EC.js} +2 -2
  57. package/dist/esm/{search-dynamic-solve-fto-WROONLZS.js.map → search-dynamic-solve-fto-O6UXF7EC.js.map} +1 -1
  58. package/dist/esm/{search-dynamic-solve-kilominx-UEFJENHO.js → search-dynamic-solve-kilominx-ZPEOK4DY.js} +3 -3
  59. package/dist/esm/{search-dynamic-solve-kilominx-UEFJENHO.js.map → search-dynamic-solve-kilominx-ZPEOK4DY.js.map} +1 -1
  60. package/dist/esm/{search-dynamic-solve-master_tetraminx-3R2CJUKW.js → search-dynamic-solve-master_tetraminx-3RKD3IAN.js} +2 -2
  61. package/dist/esm/{search-dynamic-solve-master_tetraminx-3R2CJUKW.js.map → search-dynamic-solve-master_tetraminx-3RKD3IAN.js.map} +1 -1
  62. package/dist/esm/{search-dynamic-solve-sq1-RS5HN6AH.js → search-dynamic-solve-sq1-WIJEGVLP.js} +2 -2
  63. package/dist/esm/{search-dynamic-solve-sq1-RS5HN6AH.js.map → search-dynamic-solve-sq1-WIJEGVLP.js.map} +1 -1
  64. package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js +3768 -0
  65. package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js.map +7 -0
  66. package/dist/esm/{search-worker-js-entry-KJRZ3CJQ.js → search-worker-js-entry-3VKCL3RX.js} +21 -21
  67. package/dist/esm/search-worker-js-entry-3VKCL3RX.js.map +7 -0
  68. package/dist/esm/{search-worker-ts-entry-AFMPRPSV.js → search-worker-ts-entry-J3TDBCMV.js} +5 -5
  69. package/dist/esm/{search-worker-ts-entry-AFMPRPSV.js.map → search-worker-ts-entry-J3TDBCMV.js.map} +1 -1
  70. package/dist/esm/stream/index.js +4 -4
  71. package/dist/esm/stream/index.js.map +1 -1
  72. package/dist/esm/twisty/index.js +121 -84
  73. package/dist/esm/twisty/index.js.map +2 -2
  74. package/dist/esm/{twisty-dynamic-3d-AVZOMIIW.js → twisty-dynamic-3d-UQJETF7O.js} +7 -7
  75. package/dist/esm/{twisty-dynamic-3d-AVZOMIIW.js.map → twisty-dynamic-3d-UQJETF7O.js.map} +1 -1
  76. package/dist/types/{Alg-5cf4b166.d.ts → Alg-e2a80975.d.ts} +66 -53
  77. package/dist/types/{KState-84892e94.d.ts → KState-a2f0e651.d.ts} +49 -48
  78. package/dist/types/{TwizzleLink-02cfe1b1.d.ts → TwizzleLink-cd0fa192.d.ts} +181 -15
  79. package/dist/types/alg/index.d.ts +14 -6
  80. package/dist/types/bluetooth/index.d.ts +17 -7
  81. package/dist/types/{bluetooth-puzzle-0f2e5f07.d.ts → bluetooth-puzzle-3670a6a1.d.ts} +6 -9
  82. package/dist/types/kpuzzle/index.d.ts +2 -2
  83. package/dist/types/notation/index.d.ts +3 -2
  84. package/dist/types/{outside-d0ced6cc.d.ts → outside-0ce1b145.d.ts} +3 -2
  85. package/dist/types/parse-ec97687c.d.ts +9 -0
  86. package/dist/types/protocol/index.d.ts +7 -3
  87. package/dist/types/puzzle-geometry/index.d.ts +3 -3
  88. package/dist/types/puzzles/index.d.ts +10 -5
  89. package/dist/types/scramble/index.d.ts +3 -3
  90. package/dist/types/search/index.d.ts +3 -3
  91. package/dist/types/stream/index.d.ts +4 -4
  92. package/dist/types/twisty/index.d.ts +8 -10
  93. package/package.json +27 -24
  94. package/dist/esm/chunk-7K6HJKEG.js.map +0 -7
  95. package/dist/esm/chunk-FCB447RN.js.map +0 -7
  96. package/dist/esm/chunk-GNKVWDWW.js.map +0 -7
  97. package/dist/esm/chunk-GOBAXDTU.js.map +0 -7
  98. package/dist/esm/chunk-NHCGS73I.js.map +0 -7
  99. package/dist/esm/chunk-TB6NTLZY.js.map +0 -7
  100. package/dist/esm/chunk-VCOUFQGJ.js.map +0 -7
  101. package/dist/esm/search-worker-inside-generated-string-AVMDARJP.js +0 -3768
  102. package/dist/esm/search-worker-inside-generated-string-AVMDARJP.js.map +0 -7
  103. package/dist/esm/search-worker-js-entry-KJRZ3CJQ.js.map +0 -7
  104. package/dist/types/parse-9db7ee51.d.ts +0 -9
@@ -9,32 +9,33 @@ import {
9
9
  TwistyPropDerived,
10
10
  TwistyPropSource,
11
11
  proxy3D
12
- } from "../chunk-LJBHUHEP.js";
13
- import "../chunk-YBDBUTYE.js";
12
+ } from "../chunk-7BLWQDZX.js";
13
+ import "../chunk-GVPTO3OF.js";
14
14
  import {
15
15
  countAnimatedLeaves,
16
16
  countMoves
17
- } from "../chunk-NHCGS73I.js";
17
+ } from "../chunk-47SWOA3X.js";
18
18
  import {
19
19
  cube3x3x3,
20
20
  puzzles
21
- } from "../chunk-GOBAXDTU.js";
21
+ } from "../chunk-JAGHV77R.js";
22
22
  import {
23
23
  customPGPuzzleLoader
24
- } from "../chunk-VFDAQ42O.js";
25
- import "../chunk-GNKVWDWW.js";
24
+ } from "../chunk-LTPPXK6F.js";
25
+ import "../chunk-UP6RBLG2.js";
26
26
  import {
27
27
  Alg,
28
28
  AlgBuilder,
29
29
  Conjugate,
30
30
  Grouping,
31
31
  Move,
32
+ Pause,
32
33
  TraversalDownUp,
33
34
  TraversalUp,
34
35
  direct,
35
36
  directedGenerator,
36
37
  experimentalAppendMove
37
- } from "../chunk-FCB447RN.js";
38
+ } from "../chunk-GXZIBFSN.js";
38
39
  import {
39
40
  __privateAdd,
40
41
  __privateGet,
@@ -543,13 +544,14 @@ var KPuzzleSVGWrapper = class {
543
544
  throw new Error(`No SVG definition for puzzle type: ${kpuzzle.name()}`);
544
545
  }
545
546
  this.svgID = nextSVGID();
546
- this.element = document.createElement("div");
547
- this.element.classList.add("svg-wrapper");
548
- this.element.innerHTML = svgSource;
549
- const svgElem = this.element.querySelector("svg");
547
+ this.wrapperElement = document.createElement("div");
548
+ this.wrapperElement.classList.add("svg-wrapper");
549
+ this.wrapperElement.innerHTML = svgSource;
550
+ const svgElem = this.wrapperElement.querySelector("svg");
550
551
  if (!svgElem) {
551
552
  throw new Error("Could not get SVG element");
552
553
  }
554
+ this.svgElement = svgElem;
553
555
  if (xmlns !== svgElem.namespaceURI) {
554
556
  throw new Error("Unexpected XML namespace");
555
557
  }
@@ -672,7 +674,7 @@ var KPuzzleSVGWrapper = class {
672
674
  return orbitName + "-l" + idx + "-o" + orientation;
673
675
  }
674
676
  elementByID(id) {
675
- return this.element.querySelector("#" + id);
677
+ return this.wrapperElement.querySelector("#" + id);
676
678
  }
677
679
  };
678
680
 
@@ -713,9 +715,9 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
713
715
  partialMove = move.invert();
714
716
  }
715
717
  const newState = position.state.applyMove(partialMove);
716
- this.svg.draw(position.state, newState, position.movesInProgress[0].fraction);
718
+ this.svgWrapper.draw(position.state, newState, position.movesInProgress[0].fraction);
717
719
  } else {
718
- this.svg.draw(position.state);
720
+ this.svgWrapper.draw(position.state);
719
721
  __privateSet(this, _cachedPosition, position);
720
722
  }
721
723
  } catch (e) {
@@ -736,14 +738,14 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
736
738
  })();
737
739
  }
738
740
  resetSVG(appearance) {
739
- if (this.svg) {
740
- this.removeElement(this.svg.element);
741
+ if (this.svgWrapper) {
742
+ this.removeElement(this.svgWrapper.wrapperElement);
741
743
  }
742
744
  if (!this.kpuzzle) {
743
745
  return;
744
746
  }
745
- this.svg = new KPuzzleSVGWrapper(this.kpuzzle, this.svgSource, appearance);
746
- this.addElement(this.svg.element);
747
+ this.svgWrapper = new KPuzzleSVGWrapper(this.kpuzzle, this.svgSource, appearance);
748
+ this.addElement(this.svgWrapper.wrapperElement);
747
749
  if (__privateGet(this, _cachedPosition)) {
748
750
  this.onPositionChange(__privateGet(this, _cachedPosition));
749
751
  }
@@ -932,12 +934,13 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
932
934
  }
933
935
  }
934
936
  });
935
- __privateGet(this, _freshListenerManager4).addMultiListener([
937
+ __privateGet(this, _freshListenerManager4).addMultiListener3([
938
+ this.model.twistySceneModel.stickering,
936
939
  this.model.twistySceneModel.foundationStickerSprite,
937
940
  this.model.twistySceneModel.hintStickerSprite
938
941
  ], async (inputs) => {
939
942
  if ("experimentalUpdateTexture" in await this.twisty3DPuzzle()) {
940
- (await this.twisty3DPuzzle()).experimentalUpdateTexture(true, ...inputs);
943
+ (await this.twisty3DPuzzle()).experimentalUpdateTexture(inputs[0] === "picture", inputs[1], inputs[2]);
941
944
  this.scheduleRender();
942
945
  }
943
946
  });
@@ -1438,7 +1441,7 @@ function shareRenderer() {
1438
1441
  return true;
1439
1442
  }
1440
1443
  }
1441
- var _setupBasicPresses, setupBasicPresses_fn, _onResizeStaleDropper, _width, _height, _onResize, onResize_fn, _cachedRenderer, _cachedCanvas, _cachedDragTracker, _dragTracker, dragTracker_fn, _cachedCamera, _cachedOrbitControls, _disconnectionFunctions, _scheduler;
1444
+ var _setupBasicPresses, setupBasicPresses_fn, _onResizeStaleDropper, _width, _height, _onResize, onResize_fn, _cachedRenderer, _cachedCanvas, _cachedDragTracker, _dragTracker, dragTracker_fn, _cachedCamera, _cachedOrbitControls, _disconnectionFunctions, _experimentalNextRenderFinishedCallback, _scheduler;
1442
1445
  var Twisty3DVantage = class extends ManagedCustomElement {
1443
1446
  constructor(model, scene, options) {
1444
1447
  super();
@@ -1460,6 +1463,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1460
1463
  __privateAdd(this, _cachedCamera, null);
1461
1464
  __privateAdd(this, _cachedOrbitControls, null);
1462
1465
  __privateAdd(this, _disconnectionFunctions, []);
1466
+ __privateAdd(this, _experimentalNextRenderFinishedCallback, null);
1463
1467
  __privateAdd(this, _scheduler, new RenderScheduler(this.render.bind(this)));
1464
1468
  this.scene = scene ?? null;
1465
1469
  this.loadingElement = this.addElement(document.createElement("div"));
@@ -1543,7 +1547,11 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1543
1547
  }
1544
1548
  __privateSet(this, _disconnectionFunctions, []);
1545
1549
  }
1550
+ experimentalNextRenderFinishedCallback(callback) {
1551
+ __privateSet(this, _experimentalNextRenderFinishedCallback, callback);
1552
+ }
1546
1553
  async render() {
1554
+ var _a;
1547
1555
  if (!this.scene) {
1548
1556
  throw new Error("Attempted to render without a scene");
1549
1557
  }
@@ -1559,6 +1567,8 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1559
1567
  (await this.renderer()).render(scene, camera);
1560
1568
  }
1561
1569
  this.stats?.end();
1570
+ (_a = __privateGet(this, _experimentalNextRenderFinishedCallback)) == null ? void 0 : _a.call(this);
1571
+ __privateSet(this, _experimentalNextRenderFinishedCallback, null);
1562
1572
  }
1563
1573
  scheduleRender() {
1564
1574
  __privateGet(this, _scheduler).requestAnimFrame();
@@ -1639,6 +1649,7 @@ dragTracker_fn = async function() {
1639
1649
  _cachedCamera = new WeakMap();
1640
1650
  _cachedOrbitControls = new WeakMap();
1641
1651
  _disconnectionFunctions = new WeakMap();
1652
+ _experimentalNextRenderFinishedCallback = new WeakMap();
1642
1653
  _scheduler = new WeakMap();
1643
1654
  customElementsShim.define("twisty-3d-vantage", Twisty3DVantage);
1644
1655
 
@@ -2257,7 +2268,7 @@ async function getDefaultFilename(model) {
2257
2268
  model.puzzleID.get(),
2258
2269
  model.alg.get()
2259
2270
  ]);
2260
- return `[${puzzleID}]${algWithIssues.alg.experimentalNumUnits() === 0 ? "" : " " + algWithIssues.alg.toString()}`;
2271
+ return `[${puzzleID}]${algWithIssues.alg.experimentalNumChildAlgNodes() === 0 ? "" : " " + algWithIssues.alg.toString()}`;
2261
2272
  }
2262
2273
  function downloadURL(url, name, extension = "png") {
2263
2274
  const a = document.createElement("a");
@@ -2568,8 +2579,8 @@ var AlgDuration = class extends TraversalUp {
2568
2579
  }
2569
2580
  traverseAlg(alg) {
2570
2581
  let total = 0;
2571
- for (const unit of alg.units()) {
2572
- total += this.traverseUnit(unit);
2582
+ for (const algNode of alg.childAlgNodes()) {
2583
+ total += this.traverseAlgNode(algNode);
2573
2584
  }
2574
2585
  return total;
2575
2586
  }
@@ -2604,10 +2615,10 @@ var SimpleAlgIndexer = class {
2604
2615
  this.moves = new Alg(alg.experimentalExpand());
2605
2616
  }
2606
2617
  getAnimLeaf(index) {
2607
- return Array.from(this.moves.units())[index];
2618
+ return Array.from(this.moves.childAlgNodes())[index];
2608
2619
  }
2609
2620
  indexToMoveStartTimestamp(index) {
2610
- const alg = new Alg(Array.from(this.moves.units()).slice(0, index));
2621
+ const alg = new Alg(Array.from(this.moves.childAlgNodes()).slice(0, index));
2611
2622
  return this.durationFn.traverseAlg(alg);
2612
2623
  }
2613
2624
  timestampToIndex(timestamp) {
@@ -2626,7 +2637,7 @@ var SimpleAlgIndexer = class {
2626
2637
  }
2627
2638
  transformationAtIndex(index) {
2628
2639
  let state = this.kpuzzle.identityTransformation();
2629
- for (const move of Array.from(this.moves.units()).slice(0, index)) {
2640
+ for (const move of Array.from(this.moves.childAlgNodes()).slice(0, index)) {
2630
2641
  state = state.applyMove(move);
2631
2642
  }
2632
2643
  return state;
@@ -2663,8 +2674,8 @@ function isSameAxis(move1, move2) {
2663
2674
  var LocalSimulMoves = class extends TraversalUp {
2664
2675
  traverseAlg(alg) {
2665
2676
  const processed = [];
2666
- for (const nestedUnit of alg.units()) {
2667
- processed.push(this.traverseUnit(nestedUnit));
2677
+ for (const childAlgNode of alg.childAlgNodes()) {
2678
+ processed.push(this.traverseAlgNode(childAlgNode));
2668
2679
  }
2669
2680
  return Array.prototype.concat(...processed);
2670
2681
  }
@@ -2672,12 +2683,12 @@ var LocalSimulMoves = class extends TraversalUp {
2672
2683
  if (alg.experimentalIsEmpty()) {
2673
2684
  return [];
2674
2685
  }
2675
- for (const unit of alg.units()) {
2676
- if (!unit.is(Move)) {
2686
+ for (const algNode of alg.childAlgNodes()) {
2687
+ if (!algNode.is(Move)) {
2677
2688
  return this.traverseAlg(alg);
2678
2689
  }
2679
2690
  }
2680
- const moves = Array.from(alg.units());
2691
+ const moves = Array.from(alg.childAlgNodes());
2681
2692
  let maxSimulDur = defaultDurationForAmount(moves[0].amount);
2682
2693
  for (let i = 0; i < moves.length - 1; i++) {
2683
2694
  for (let j = 1; j < moves.length; j++) {
@@ -2689,7 +2700,7 @@ var LocalSimulMoves = class extends TraversalUp {
2689
2700
  }
2690
2701
  const localMovesWithRange = moves.map((blockMove) => {
2691
2702
  return {
2692
- animLeafUnit: blockMove,
2703
+ animLeafAlgNode: blockMove,
2693
2704
  msUntilNext: 0,
2694
2705
  duration: maxSimulDur
2695
2706
  };
@@ -2709,7 +2720,7 @@ var LocalSimulMoves = class extends TraversalUp {
2709
2720
  const duration = defaultDurationForAmount(move.amount);
2710
2721
  return [
2711
2722
  {
2712
- animLeafUnit: move,
2723
+ animLeafAlgNode: move,
2713
2724
  msUntilNext: duration,
2714
2725
  duration
2715
2726
  }
@@ -2741,10 +2752,13 @@ var LocalSimulMoves = class extends TraversalUp {
2741
2752
  return Array.prototype.concat(...processed);
2742
2753
  }
2743
2754
  traversePause(pause) {
2755
+ if (pause.experimentalNISSGrouping) {
2756
+ return [];
2757
+ }
2744
2758
  const duration = defaultDurationForAmount(1);
2745
2759
  return [
2746
2760
  {
2747
- animLeafUnit: pause,
2761
+ animLeafAlgNode: pause,
2748
2762
  msUntilNext: duration,
2749
2763
  duration
2750
2764
  }
@@ -2763,7 +2777,7 @@ function simulMoves(a) {
2763
2777
  let timestamp = 0;
2764
2778
  const l = localSimulMoves(a).map((localSimulMove) => {
2765
2779
  const leafWithRange = {
2766
- animLeaf: localSimulMove.animLeafUnit,
2780
+ animLeaf: localSimulMove.animLeafAlgNode,
2767
2781
  start: timestamp,
2768
2782
  end: timestamp + localSimulMove.duration
2769
2783
  };
@@ -2965,7 +2979,7 @@ var SimultaneousMoveIndexer = class {
2965
2979
  };
2966
2980
 
2967
2981
  // src/cubing/twisty/controllers/indexer/tree/AlgWalker.ts
2968
- var AlgPartDecoration = class {
2982
+ var AlgWalkterDecoration = class {
2969
2983
  constructor(moveCount, duration, forward, backward, children = []) {
2970
2984
  this.moveCount = moveCount;
2971
2985
  this.duration = duration;
@@ -2981,15 +2995,15 @@ var DecoratorConstructor = class extends TraversalUp {
2981
2995
  this.durationFn = new AlgDuration(defaultDurationForAmount);
2982
2996
  this.cache = {};
2983
2997
  this.identity = kpuzzle.identityTransformation();
2984
- this.dummyLeaf = new AlgPartDecoration(0, 0, this.identity, this.identity, []);
2998
+ this.dummyLeaf = new AlgWalkterDecoration(0, 0, this.identity, this.identity, []);
2985
2999
  }
2986
3000
  traverseAlg(alg) {
2987
3001
  let moveCount = 0;
2988
3002
  let duration = 0;
2989
3003
  let transformation = this.identity;
2990
3004
  const child = [];
2991
- for (const unit of alg.units()) {
2992
- const apd = this.traverseUnit(unit);
3005
+ for (const algNode of alg.childAlgNodes()) {
3006
+ const apd = this.traverseAlgNode(algNode);
2993
3007
  moveCount += apd.moveCount;
2994
3008
  duration += apd.duration;
2995
3009
  if (transformation === this.identity) {
@@ -2999,7 +3013,7 @@ var DecoratorConstructor = class extends TraversalUp {
2999
3013
  }
3000
3014
  child.push(apd);
3001
3015
  }
3002
- return new AlgPartDecoration(moveCount, duration, transformation, transformation.invert(), child);
3016
+ return new AlgWalkterDecoration(moveCount, duration, transformation, transformation.invert(), child);
3003
3017
  }
3004
3018
  traverseGrouping(grouping) {
3005
3019
  const dec = this.traverseAlg(grouping.alg);
@@ -3012,7 +3026,7 @@ var DecoratorConstructor = class extends TraversalUp {
3012
3026
  return r;
3013
3027
  }
3014
3028
  const transformation = this.kpuzzle.moveToTransformation(move);
3015
- r = new AlgPartDecoration(1, this.durationFn.traverseUnit(move), transformation, transformation.invert());
3029
+ r = new AlgWalkterDecoration(1, this.durationFn.traverseAlgNode(move), transformation, transformation.invert());
3016
3030
  this.cache[key] = r;
3017
3031
  return r;
3018
3032
  }
@@ -3022,7 +3036,7 @@ var DecoratorConstructor = class extends TraversalUp {
3022
3036
  const AB = decA.forward.applyTransformation(decB.forward);
3023
3037
  const ApBp = decA.backward.applyTransformation(decB.backward);
3024
3038
  const ABApBp = AB.applyTransformation(ApBp);
3025
- const dec = new AlgPartDecoration(2 * (decA.moveCount + decB.moveCount), 2 * (decA.duration + decB.duration), ABApBp, ABApBp.invert(), [decA, decB]);
3039
+ const dec = new AlgWalkterDecoration(2 * (decA.moveCount + decB.moveCount), 2 * (decA.duration + decB.duration), ABApBp, ABApBp.invert(), [decA, decB]);
3026
3040
  return this.mult(dec, 1, [dec, decA, decB]);
3027
3041
  }
3028
3042
  traverseConjugate(conjugate) {
@@ -3030,11 +3044,14 @@ var DecoratorConstructor = class extends TraversalUp {
3030
3044
  const decB = this.traverseAlg(conjugate.B);
3031
3045
  const AB = decA.forward.applyTransformation(decB.forward);
3032
3046
  const ABAp = AB.applyTransformation(decA.backward);
3033
- const dec = new AlgPartDecoration(2 * decA.moveCount + decB.moveCount, 2 * decA.duration + decB.duration, ABAp, ABAp.invert(), [decA, decB]);
3047
+ const dec = new AlgWalkterDecoration(2 * decA.moveCount + decB.moveCount, 2 * decA.duration + decB.duration, ABAp, ABAp.invert(), [decA, decB]);
3034
3048
  return this.mult(dec, 1, [dec, decA, decB]);
3035
3049
  }
3036
3050
  traversePause(pause) {
3037
- return new AlgPartDecoration(1, this.durationFn.traverseUnit(pause), this.identity, this.identity);
3051
+ if (pause.experimentalNISSGrouping) {
3052
+ return this.dummyLeaf;
3053
+ }
3054
+ return new AlgWalkterDecoration(1, this.durationFn.traverseAlgNode(pause), this.identity, this.identity);
3038
3055
  }
3039
3056
  traverseNewline(_newline) {
3040
3057
  return this.dummyLeaf;
@@ -3045,7 +3062,7 @@ var DecoratorConstructor = class extends TraversalUp {
3045
3062
  mult(apd, n, child) {
3046
3063
  const absn = Math.abs(n);
3047
3064
  const st = apd.forward.selfMultiply(n);
3048
- return new AlgPartDecoration(apd.moveCount * absn, apd.duration * absn, st, st.invert(), child);
3065
+ return new AlgWalkterDecoration(apd.moveCount * absn, apd.duration * absn, st, st.invert(), child);
3049
3066
  }
3050
3067
  };
3051
3068
  var WalkerDown = class {
@@ -3055,10 +3072,10 @@ var WalkerDown = class {
3055
3072
  }
3056
3073
  };
3057
3074
  var AlgWalker = class extends TraversalDownUp {
3058
- constructor(kpuzzle, algOrUnit, apd) {
3075
+ constructor(kpuzzle, algOrAlgNode, apd) {
3059
3076
  super();
3060
3077
  this.kpuzzle = kpuzzle;
3061
- this.algOrUnit = algOrUnit;
3078
+ this.algOrAlgNode = algOrAlgNode;
3062
3079
  this.apd = apd;
3063
3080
  this.i = -1;
3064
3081
  this.dur = -1;
@@ -3091,16 +3108,16 @@ var AlgWalker = class extends TraversalDownUp {
3091
3108
  this.moveDuration = 0;
3092
3109
  this.back = false;
3093
3110
  this.st = this.kpuzzle.identityTransformation();
3094
- const r = this.algOrUnit.is(Alg) ? this.traverseAlg(this.algOrUnit, this.root) : this.traverseUnit(this.algOrUnit, this.root);
3111
+ const r = this.algOrAlgNode.is(Alg) ? this.traverseAlg(this.algOrAlgNode, this.root) : this.traverseAlgNode(this.algOrAlgNode, this.root);
3095
3112
  return r;
3096
3113
  }
3097
3114
  traverseAlg(alg, wd) {
3098
3115
  if (!this.firstcheck(wd)) {
3099
3116
  return false;
3100
3117
  }
3101
- let i = wd.back ? alg.experimentalNumUnits() - 1 : 0;
3102
- for (const unit of directedGenerator(alg.units(), wd.back ? -1 /* Backwards */ : 1 /* Forwards */)) {
3103
- if (this.traverseUnit(unit, new WalkerDown(wd.apd.children[i], wd.back))) {
3118
+ let i = wd.back ? alg.experimentalNumChildAlgNodes() - 1 : 0;
3119
+ for (const algNode of directedGenerator(alg.childAlgNodes(), wd.back ? -1 /* Backwards */ : 1 /* Forwards */)) {
3120
+ if (this.traverseAlgNode(algNode, new WalkerDown(wd.apd.children[i], wd.back))) {
3104
3121
  return true;
3105
3122
  }
3106
3123
  i += wd.back ? -1 : 1;
@@ -3207,9 +3224,9 @@ var MIN_CHUNKING_THRESHOLD = 16;
3207
3224
  function chunkifyAlg(alg, chunkMaxLength) {
3208
3225
  const mainAlgBuilder = new AlgBuilder();
3209
3226
  const chunkAlgBuilder = new AlgBuilder();
3210
- for (const unit of alg.units()) {
3211
- chunkAlgBuilder.push(unit);
3212
- if (chunkAlgBuilder.experimentalNumUnits() >= chunkMaxLength) {
3227
+ for (const algNode of alg.childAlgNodes()) {
3228
+ chunkAlgBuilder.push(algNode);
3229
+ if (chunkAlgBuilder.experimentalNumAlgNodes() >= chunkMaxLength) {
3213
3230
  mainAlgBuilder.push(new Grouping(chunkAlgBuilder.toAlg()));
3214
3231
  chunkAlgBuilder.reset();
3215
3232
  }
@@ -3219,7 +3236,7 @@ function chunkifyAlg(alg, chunkMaxLength) {
3219
3236
  }
3220
3237
  var ChunkAlgs = class extends TraversalUp {
3221
3238
  traverseAlg(alg) {
3222
- const algLength = alg.experimentalNumUnits();
3239
+ const algLength = alg.experimentalNumChildAlgNodes();
3223
3240
  if (algLength < MIN_CHUNKING_THRESHOLD) {
3224
3241
  return alg;
3225
3242
  }
@@ -4279,15 +4296,19 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4279
4296
  });
4280
4297
  }
4281
4298
  }
4282
- async experimentalCurrentCanvases() {
4299
+ async experimentalCurrentVantages() {
4283
4300
  this.connectedCallback();
4284
4301
  const wrapper = __privateGet(this, _visualizationWrapper);
4285
- const canvases = [];
4286
4302
  if (wrapper instanceof Twisty3DSceneWrapper) {
4287
- const vantages = wrapper.experimentalVantages();
4288
- for (const vantage of vantages) {
4289
- canvases.push((await vantage.canvasInfo()).canvas);
4290
- }
4303
+ return wrapper.experimentalVantages();
4304
+ }
4305
+ return [];
4306
+ }
4307
+ async experimentalCurrentCanvases() {
4308
+ const vantages = await this.experimentalCurrentVantages();
4309
+ const canvases = [];
4310
+ for (const vantage of vantages) {
4311
+ canvases.push((await vantage.canvasInfo()).canvas);
4291
4312
  }
4292
4313
  return canvases;
4293
4314
  }
@@ -4296,17 +4317,18 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4296
4317
  const sceneWrapper = await __privateGet(this, _initial3DVisualizationWrapper).promise;
4297
4318
  const puzzleWrapper = await sceneWrapper.experimentalTwisty3DPuzzleWrapper();
4298
4319
  const twisty3DPuzzlePromise = puzzleWrapper.twisty3DPuzzle();
4299
- const setTimeoutPromise = new Promise((resolve, _) => setTimeout(resolve, 0));
4320
+ const safeToCallback = (async () => {
4321
+ await twisty3DPuzzlePromise;
4322
+ await new Promise((resolve) => setTimeout(resolve, 0));
4323
+ })();
4300
4324
  if (puzzleChangeCallback) {
4301
4325
  const scheduler = new RenderScheduler(async () => {
4302
4326
  });
4303
4327
  puzzleWrapper.addEventListener("render-scheduled", async () => {
4304
4328
  if (!scheduler.requestIsPending()) {
4305
4329
  scheduler.requestAnimFrame();
4306
- (async () => {
4307
- await setTimeoutPromise;
4308
- puzzleChangeCallback();
4309
- })();
4330
+ await safeToCallback;
4331
+ puzzleChangeCallback();
4310
4332
  }
4311
4333
  });
4312
4334
  }
@@ -4354,7 +4376,7 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
4354
4376
  if (["2D", "experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategy.get())) {
4355
4377
  const wrapper2D = __privateGet(this, _visualizationWrapper);
4356
4378
  const twisty2DPuzzle = await wrapper2D.currentTwisty2DPuzzleWrapper().twisty2DPuzzle();
4357
- const str = new XMLSerializer().serializeToString(twisty2DPuzzle.svg.element);
4379
+ const str = new XMLSerializer().serializeToString(twisty2DPuzzle.svgWrapper.svgElement);
4358
4380
  const url = URL.createObjectURL(new Blob([str]));
4359
4381
  downloadURL(url, filename ?? await getDefaultFilename(this.experimentalModel), "svg");
4360
4382
  } else {
@@ -4399,7 +4421,11 @@ customElementsShim.define("twisty-player", TwistyPlayer);
4399
4421
  // src/cubing/twisty/views/TwistyAlgViewer.css.ts
4400
4422
  var twistyAlgViewerCSS = new CSSSource(`
4401
4423
  :host {
4402
- display: inline-grid;
4424
+ display: inline;
4425
+ }
4426
+
4427
+ .wrapper {
4428
+ display: inline;
4403
4429
  }
4404
4430
 
4405
4431
  a:not(:hover) {
@@ -4424,9 +4450,9 @@ twisty-alg-leaf-elem.twisty-alg-comment {
4424
4450
  // src/cubing/twisty/views/TwistyAlgViewer.ts
4425
4451
  var DEFAULT_OFFSET_MS = 250;
4426
4452
  var TwistyAlgLeafElem = class extends ManagedCustomElement {
4427
- constructor(className, text, dataDown, algOrUnit, offsetIntoMove, clickable) {
4453
+ constructor(className, text, dataDown, algOrAlgNode, offsetIntoMove, clickable) {
4428
4454
  super({ mode: "open" });
4429
- this.algOrUnit = algOrUnit;
4455
+ this.algOrAlgNode = algOrAlgNode;
4430
4456
  this.classList.add(className);
4431
4457
  this.addCSS(twistyAlgViewerCSS);
4432
4458
  if (clickable) {
@@ -4450,9 +4476,9 @@ var TwistyAlgLeafElem = class extends ManagedCustomElement {
4450
4476
  };
4451
4477
  customElementsShim.define("twisty-alg-leaf-elem", TwistyAlgLeafElem);
4452
4478
  var TwistyAlgWrapperElem = class extends HTMLElementShim {
4453
- constructor(className, algOrUnit) {
4479
+ constructor(className, algOrAlgNode) {
4454
4480
  super();
4455
- this.algOrUnit = algOrUnit;
4481
+ this.algOrAlgNode = algOrAlgNode;
4456
4482
  this.queue = [];
4457
4483
  this.classList.add(className);
4458
4484
  }
@@ -4493,16 +4519,24 @@ var AlgToDOMTree = class extends TraversalDownUp {
4493
4519
  let moveCount = 0;
4494
4520
  const element = new TwistyAlgWrapperElem("twisty-alg-alg", alg);
4495
4521
  let first = true;
4496
- for (const unit of direct(alg.units(), dataDown.direction)) {
4522
+ for (const algNode of direct(alg.childAlgNodes(), dataDown.direction)) {
4497
4523
  if (!first) {
4498
4524
  element.addString(" ");
4499
4525
  }
4500
4526
  first = false;
4501
- moveCount += element.addElem(this.traverseUnit(unit, {
4502
- earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4503
- twistyAlgViewer: dataDown.twistyAlgViewer,
4504
- direction: dataDown.direction
4505
- }));
4527
+ if (algNode.as(Pause)?.experimentalNISSGrouping) {
4528
+ element.addString("^(");
4529
+ }
4530
+ if (!algNode.as(Grouping)?.experimentalNISSPlaceholder) {
4531
+ moveCount += element.addElem(this.traverseAlgNode(algNode, {
4532
+ earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
4533
+ twistyAlgViewer: dataDown.twistyAlgViewer,
4534
+ direction: dataDown.direction
4535
+ }));
4536
+ }
4537
+ if (algNode.as(Pause)?.experimentalNISSGrouping) {
4538
+ element.addString(")");
4539
+ }
4506
4540
  }
4507
4541
  element.flushQueue(dataDown.direction);
4508
4542
  return {
@@ -4597,6 +4631,9 @@ var AlgToDOMTree = class extends TraversalDownUp {
4597
4631
  };
4598
4632
  }
4599
4633
  traversePause(pause, dataDown) {
4634
+ if (pause.experimentalNISSGrouping) {
4635
+ return this.traverseAlg(pause.experimentalNISSGrouping.alg, dataDown);
4636
+ }
4600
4637
  return {
4601
4638
  moveCount: 1,
4602
4639
  element: new TwistyAlgLeafElem("twisty-alg-pause", ".", dataDown, pause, true, true)
@@ -4746,17 +4783,17 @@ customElementsShim.define("twisty-alg-viewer", TwistyAlgViewer);
4746
4783
  // src/cubing/twisty/views/TwistyAlgEditor/LeafTokens.ts
4747
4784
  var LeafTokens = class extends TraversalDownUp {
4748
4785
  traverseAlg(alg, dataDown) {
4749
- const unitArrays = [];
4786
+ const algNodeArrays = [];
4750
4787
  let numMovesInside = 0;
4751
- for (const unit of alg.units()) {
4752
- const dataUp = this.traverseUnit(unit, {
4788
+ for (const algNode of alg.childAlgNodes()) {
4789
+ const dataUp = this.traverseAlgNode(algNode, {
4753
4790
  numMovesSofar: dataDown.numMovesSofar + numMovesInside
4754
4791
  });
4755
- unitArrays.push(dataUp.tokens);
4792
+ algNodeArrays.push(dataUp.tokens);
4756
4793
  numMovesInside += dataUp.numLeavesInside;
4757
4794
  }
4758
4795
  return {
4759
- tokens: Array.prototype.concat(...unitArrays),
4796
+ tokens: Array.prototype.concat(...algNodeArrays),
4760
4797
  numLeavesInside: numMovesInside
4761
4798
  };
4762
4799
  }