cubing 0.28.0 → 0.28.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/esm/alg/index.js +4 -4
- package/dist/esm/bluetooth/index.js +222 -86
- package/dist/esm/bluetooth/index.js.map +3 -3
- package/dist/esm/{chunk-F4WWCPVE.js → chunk-2IZUSAXQ.js} +2 -2
- package/dist/esm/{chunk-F4WWCPVE.js.map → chunk-2IZUSAXQ.js.map} +1 -1
- package/dist/esm/{chunk-KBOIUBUE.js → chunk-DGJ3VGQO.js} +28 -12
- package/dist/esm/{chunk-KBOIUBUE.js.map → chunk-DGJ3VGQO.js.map} +1 -1
- package/dist/esm/{chunk-NJPSC7SH.js → chunk-GW4FGG42.js} +8 -4
- package/dist/esm/{chunk-NJPSC7SH.js.map → chunk-GW4FGG42.js.map} +1 -1
- package/dist/esm/{chunk-4KIZAW2Z.js → chunk-LSCTPPWV.js} +22 -8
- package/dist/esm/{chunk-4KIZAW2Z.js.map → chunk-LSCTPPWV.js.map} +1 -1
- package/dist/esm/{chunk-GXZIBFSN.js → chunk-NI7U4XAZ.js} +380 -242
- package/dist/esm/chunk-NI7U4XAZ.js.map +7 -0
- package/dist/esm/{chunk-GVPTO3OF.js → chunk-OX6O2ZO5.js} +1 -1
- package/dist/esm/{chunk-GVPTO3OF.js.map → chunk-OX6O2ZO5.js.map} +1 -1
- package/dist/esm/{chunk-LTPPXK6F.js → chunk-PYWGREIP.js} +44 -13
- package/dist/esm/chunk-PYWGREIP.js.map +7 -0
- package/dist/esm/{chunk-JAGHV77R.js → chunk-QDVCP6G7.js} +179 -76
- package/dist/esm/chunk-QDVCP6G7.js.map +7 -0
- package/dist/esm/chunk-RQGVI4ZL.js +1137 -0
- package/dist/esm/chunk-RQGVI4ZL.js.map +7 -0
- package/dist/esm/{chunk-MGJA5U5O.js → chunk-SBZRVSPK.js} +1 -12
- package/dist/esm/{chunk-MGJA5U5O.js.map → chunk-SBZRVSPK.js.map} +0 -0
- package/dist/esm/{chunk-V55YSWJY.js → chunk-WXCNEGW3.js} +10 -4
- package/dist/esm/{chunk-V55YSWJY.js.map → chunk-WXCNEGW3.js.map} +1 -1
- package/dist/esm/{chunk-UP6RBLG2.js → chunk-XU5ILFX5.js} +137 -66
- package/dist/esm/{chunk-UP6RBLG2.js.map → chunk-XU5ILFX5.js.map} +3 -3
- package/dist/esm/{chunk-4V4RM3YJ.js → chunk-Y22I7F7D.js} +21 -12
- package/dist/esm/{chunk-4V4RM3YJ.js.map → chunk-Y22I7F7D.js.map} +2 -2
- package/dist/esm/{chunk-ALBEW4DJ.js → chunk-ZB3P5AZN.js} +1 -1
- package/dist/esm/{chunk-ALBEW4DJ.js.map → chunk-ZB3P5AZN.js.map} +1 -1
- package/dist/esm/{chunk-47SWOA3X.js → chunk-ZNAYJGVL.js} +2 -2
- package/dist/esm/{chunk-47SWOA3X.js.map → chunk-ZNAYJGVL.js.map} +1 -1
- package/dist/esm/kpuzzle/index.js +3 -3
- package/dist/esm/notation/index.js +3 -3
- package/dist/esm/protocol/index.js +5 -5
- package/dist/esm/puzzle-geometry/index.js +4570 -15
- package/dist/esm/puzzle-geometry/index.js.map +4 -4
- package/dist/esm/puzzles/index.js +5 -5
- package/dist/esm/{puzzles-dynamic-3x3x3-NB2PEZTV.js → puzzles-dynamic-3x3x3-KIG5A6QR.js} +2 -2
- package/dist/esm/{puzzles-dynamic-3x3x3-NB2PEZTV.js.map → puzzles-dynamic-3x3x3-KIG5A6QR.js.map} +0 -0
- package/dist/esm/puzzles-dynamic-4x4x4-PEDAPUZK.js +126 -0
- package/dist/esm/puzzles-dynamic-4x4x4-PEDAPUZK.js.map +7 -0
- package/dist/esm/{puzzles-dynamic-side-events-WZI4Y3N6.js → puzzles-dynamic-side-events-5C7LMBWX.js} +2 -2
- package/dist/esm/{puzzles-dynamic-side-events-WZI4Y3N6.js.map → puzzles-dynamic-side-events-5C7LMBWX.js.map} +0 -0
- package/dist/esm/{puzzles-dynamic-unofficial-FUG3JBMH.js → puzzles-dynamic-unofficial-WWJ4NJMX.js} +2 -2
- package/dist/esm/{puzzles-dynamic-unofficial-FUG3JBMH.js.map → puzzles-dynamic-unofficial-WWJ4NJMX.js.map} +0 -0
- package/dist/esm/scramble/index.js +5 -5
- package/dist/esm/search/index.js +10 -10
- package/dist/esm/{search-dynamic-sgs-side-events-ZTOWSMQT.js → search-dynamic-sgs-side-events-MZN22QGN.js} +37 -21
- package/dist/esm/search-dynamic-sgs-side-events-MZN22QGN.js.map +7 -0
- package/dist/esm/{search-dynamic-sgs-unofficial-V6HZTLGM.js → search-dynamic-sgs-unofficial-AHPCH5XJ.js} +35 -14
- package/dist/esm/{search-dynamic-sgs-unofficial-V6HZTLGM.js.map → search-dynamic-sgs-unofficial-AHPCH5XJ.js.map} +2 -2
- package/dist/esm/{search-dynamic-solve-3x3x3-K42IWMQV.js → search-dynamic-solve-3x3x3-7XZTYQMO.js} +795 -142
- package/dist/esm/{search-dynamic-solve-3x3x3-K42IWMQV.js.map → search-dynamic-solve-3x3x3-7XZTYQMO.js.map} +1 -1
- package/dist/esm/{search-dynamic-solve-4x4x4-YH6SB2WB.js → search-dynamic-solve-4x4x4-IBS66QTP.js} +135 -29
- package/dist/esm/{search-dynamic-solve-4x4x4-YH6SB2WB.js.map → search-dynamic-solve-4x4x4-IBS66QTP.js.map} +1 -1
- package/dist/esm/{search-dynamic-solve-fto-O6UXF7EC.js → search-dynamic-solve-fto-4LI23P6K.js} +253 -69
- package/dist/esm/{search-dynamic-solve-fto-O6UXF7EC.js.map → search-dynamic-solve-fto-4LI23P6K.js.map} +2 -2
- package/dist/esm/{search-dynamic-solve-kilominx-ZPEOK4DY.js → search-dynamic-solve-kilominx-3HEVQ4MC.js} +32 -8
- package/dist/esm/{search-dynamic-solve-kilominx-ZPEOK4DY.js.map → search-dynamic-solve-kilominx-3HEVQ4MC.js.map} +2 -2
- package/dist/esm/{search-dynamic-solve-master_tetraminx-3RKD3IAN.js → search-dynamic-solve-master_tetraminx-UB32C7MM.js} +111 -42
- package/dist/esm/{search-dynamic-solve-master_tetraminx-3RKD3IAN.js.map → search-dynamic-solve-master_tetraminx-UB32C7MM.js.map} +2 -2
- package/dist/esm/{search-dynamic-solve-sq1-WIJEGVLP.js → search-dynamic-solve-sq1-HA72TYF2.js} +54 -9
- package/dist/esm/{search-dynamic-solve-sq1-WIJEGVLP.js.map → search-dynamic-solve-sq1-HA72TYF2.js.map} +2 -2
- package/dist/esm/search-worker-inside-generated-string-AMEXYCKK.js +3886 -0
- package/dist/esm/search-worker-inside-generated-string-AMEXYCKK.js.map +7 -0
- package/dist/esm/{search-worker-js-entry-3VKCL3RX.js → search-worker-js-entry-HUD3PWTB.js} +147 -53
- package/dist/esm/{search-worker-js-entry-3VKCL3RX.js.map → search-worker-js-entry-HUD3PWTB.js.map} +2 -2
- package/dist/esm/{search-worker-ts-entry-J3TDBCMV.js → search-worker-ts-entry-HER6WT5D.js} +5 -5
- package/dist/esm/{search-worker-ts-entry-J3TDBCMV.js.map → search-worker-ts-entry-HER6WT5D.js.map} +1 -1
- package/dist/esm/stream/index.js +12 -8
- package/dist/esm/stream/index.js.map +1 -1
- package/dist/esm/twisty/index.js +1164 -1513
- package/dist/esm/twisty/index.js.map +4 -4
- package/dist/esm/{twisty-dynamic-3d-UQJETF7O.js → twisty-dynamic-3d-NJUXK7KI.js} +358 -146
- package/dist/esm/twisty-dynamic-3d-NJUXK7KI.js.map +7 -0
- package/dist/types/{Alg-e2a80975.d.ts → Alg-137fb0d5.d.ts} +19 -16
- package/dist/types/{KState-a2f0e651.d.ts → KState-a73111d7.d.ts} +1 -9
- package/dist/types/{TwizzleLink-cd0fa192.d.ts → TwizzleLink-bef52ecd.d.ts} +47 -13
- package/dist/types/alg/index.d.ts +7 -6
- package/dist/types/bluetooth/index.d.ts +4 -4
- package/dist/types/{bluetooth-puzzle-3670a6a1.d.ts → bluetooth-puzzle-8a678993.d.ts} +9 -9
- package/dist/types/kpuzzle/index.d.ts +2 -2
- package/dist/types/notation/index.d.ts +1 -1
- package/dist/types/{outside-0ce1b145.d.ts → outside-e55f28a0.d.ts} +2 -2
- package/dist/types/{parse-ec97687c.d.ts → parseAlg-a28f7568.d.ts} +1 -1
- package/dist/types/protocol/index.d.ts +2 -2
- package/dist/types/puzzle-geometry/index.d.ts +3 -3
- package/dist/types/puzzles/index.d.ts +5 -5
- package/dist/types/scramble/index.d.ts +3 -3
- package/dist/types/search/index.d.ts +3 -3
- package/dist/types/stream/index.d.ts +5 -5
- package/dist/types/twisty/index.d.ts +13 -6
- package/package.json +43 -40
- package/dist/esm/chunk-7BLWQDZX.js +0 -342
- package/dist/esm/chunk-7BLWQDZX.js.map +0 -7
- package/dist/esm/chunk-GXZIBFSN.js.map +0 -7
- package/dist/esm/chunk-JAGHV77R.js.map +0 -7
- package/dist/esm/chunk-LTPPXK6F.js.map +0 -7
- package/dist/esm/chunk-ROGN5SXC.js +0 -4386
- package/dist/esm/chunk-ROGN5SXC.js.map +0 -7
- package/dist/esm/search-dynamic-sgs-side-events-ZTOWSMQT.js.map +0 -7
- package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js +0 -3768
- package/dist/esm/search-worker-inside-generated-string-T43JGYSP.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-UQJETF7O.js.map +0 -7
package/dist/esm/twisty/index.js
CHANGED
|
@@ -1,28 +1,36 @@
|
|
|
1
1
|
import {
|
|
2
|
+
CSSSource,
|
|
2
3
|
DEGREES_PER_RADIAN,
|
|
3
4
|
FreshListenerManager,
|
|
5
|
+
HTMLElementShim,
|
|
4
6
|
HintFaceletProp,
|
|
7
|
+
ManagedCustomElement,
|
|
5
8
|
NO_VALUE,
|
|
9
|
+
RenderScheduler,
|
|
6
10
|
SimpleTwistyPropSource,
|
|
7
11
|
StaleDropper,
|
|
8
12
|
THREEJS,
|
|
13
|
+
Twisty3DVantage,
|
|
9
14
|
TwistyPropDerived,
|
|
10
15
|
TwistyPropSource,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
customElementsShim,
|
|
17
|
+
proxy3D,
|
|
18
|
+
setCameraFromOrbitCoordinates,
|
|
19
|
+
setTwistyDebug
|
|
20
|
+
} from "../chunk-RQGVI4ZL.js";
|
|
21
|
+
import "../chunk-OX6O2ZO5.js";
|
|
14
22
|
import {
|
|
15
23
|
countAnimatedLeaves,
|
|
16
24
|
countMoves
|
|
17
|
-
} from "../chunk-
|
|
25
|
+
} from "../chunk-ZNAYJGVL.js";
|
|
18
26
|
import {
|
|
19
27
|
cube3x3x3,
|
|
20
28
|
puzzles
|
|
21
|
-
} from "../chunk-
|
|
29
|
+
} from "../chunk-QDVCP6G7.js";
|
|
22
30
|
import {
|
|
23
31
|
customPGPuzzleLoader
|
|
24
|
-
} from "../chunk-
|
|
25
|
-
import "../chunk-
|
|
32
|
+
} from "../chunk-PYWGREIP.js";
|
|
33
|
+
import "../chunk-XU5ILFX5.js";
|
|
26
34
|
import {
|
|
27
35
|
Alg,
|
|
28
36
|
AlgBuilder,
|
|
@@ -35,40 +43,8 @@ import {
|
|
|
35
43
|
direct,
|
|
36
44
|
directedGenerator,
|
|
37
45
|
experimentalAppendMove
|
|
38
|
-
} from "../chunk-
|
|
39
|
-
import
|
|
40
|
-
__privateAdd,
|
|
41
|
-
__privateGet,
|
|
42
|
-
__privateMethod,
|
|
43
|
-
__privateSet
|
|
44
|
-
} from "../chunk-MGJA5U5O.js";
|
|
45
|
-
|
|
46
|
-
// src/cubing/twisty/controllers/RenderScheduler.ts
|
|
47
|
-
var RenderScheduler = class {
|
|
48
|
-
constructor(callback) {
|
|
49
|
-
this.callback = callback;
|
|
50
|
-
this.animFrameID = null;
|
|
51
|
-
this.animFrame = this.animFrameWrapper.bind(this);
|
|
52
|
-
}
|
|
53
|
-
requestIsPending() {
|
|
54
|
-
return !!this.animFrameID;
|
|
55
|
-
}
|
|
56
|
-
requestAnimFrame() {
|
|
57
|
-
if (!this.animFrameID) {
|
|
58
|
-
this.animFrameID = requestAnimationFrame(this.animFrame);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
cancelAnimFrame() {
|
|
62
|
-
if (this.animFrameID) {
|
|
63
|
-
cancelAnimationFrame(this.animFrameID);
|
|
64
|
-
this.animFrameID = 0;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
animFrameWrapper(timestamp) {
|
|
68
|
-
this.animFrameID = 0;
|
|
69
|
-
this.callback(timestamp);
|
|
70
|
-
}
|
|
71
|
-
};
|
|
46
|
+
} from "../chunk-NI7U4XAZ.js";
|
|
47
|
+
import "../chunk-SBZRVSPK.js";
|
|
72
48
|
|
|
73
49
|
// src/cubing/twisty/controllers/AnimationTypes.ts
|
|
74
50
|
function directionScalar(direction) {
|
|
@@ -117,7 +93,9 @@ var CatchUpHelper = class {
|
|
|
117
93
|
this.model = model;
|
|
118
94
|
this.catchingUp = false;
|
|
119
95
|
this.pendingFrame = false;
|
|
120
|
-
this.scheduler = new RenderScheduler(
|
|
96
|
+
this.scheduler = new RenderScheduler(
|
|
97
|
+
this.animFrame.bind(this)
|
|
98
|
+
);
|
|
121
99
|
this.catchUpMs = 500;
|
|
122
100
|
this.lastTimestamp = 0;
|
|
123
101
|
}
|
|
@@ -137,41 +115,43 @@ var CatchUpHelper = class {
|
|
|
137
115
|
this.scheduler.requestAnimFrame();
|
|
138
116
|
const delta = (timestamp - this.lastTimestamp) / this.catchUpMs;
|
|
139
117
|
this.lastTimestamp = timestamp;
|
|
140
|
-
this.model.catchUpMove.set(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
118
|
+
this.model.catchUpMove.set(
|
|
119
|
+
(async () => {
|
|
120
|
+
const previousCatchUpMove = await this.model.catchUpMove.get();
|
|
121
|
+
if (previousCatchUpMove.move === null) {
|
|
122
|
+
return previousCatchUpMove;
|
|
123
|
+
}
|
|
124
|
+
const amount = previousCatchUpMove.amount + delta;
|
|
125
|
+
if (amount >= 1) {
|
|
126
|
+
this.pendingFrame = true;
|
|
127
|
+
this.stop();
|
|
128
|
+
this.model.timestampRequest.set("end");
|
|
129
|
+
return {
|
|
130
|
+
move: null,
|
|
131
|
+
amount: 0
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
this.pendingFrame = false;
|
|
150
135
|
return {
|
|
151
|
-
move:
|
|
152
|
-
amount
|
|
136
|
+
move: previousCatchUpMove.move,
|
|
137
|
+
amount
|
|
153
138
|
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return {
|
|
157
|
-
move: previousCatchUpMove.move,
|
|
158
|
-
amount
|
|
159
|
-
};
|
|
160
|
-
})());
|
|
139
|
+
})()
|
|
140
|
+
);
|
|
161
141
|
}
|
|
162
142
|
};
|
|
163
|
-
var _effectiveTimestampMilliseconds, effectiveTimestampMilliseconds_fn, _animFrameEffectiveTimestampStaleDropper;
|
|
164
143
|
var TwistyAnimationController = class {
|
|
165
144
|
constructor(model, delegate) {
|
|
166
145
|
this.delegate = delegate;
|
|
167
|
-
__privateAdd(this, _effectiveTimestampMilliseconds);
|
|
168
146
|
this.playing = false;
|
|
169
147
|
this.direction = 1 /* Forwards */;
|
|
170
148
|
this.lastDatestamp = 0;
|
|
171
|
-
this.scheduler = new RenderScheduler(
|
|
172
|
-
|
|
149
|
+
this.scheduler = new RenderScheduler(
|
|
150
|
+
this.animFrame.bind(this)
|
|
151
|
+
);
|
|
152
|
+
this.#animFrameEffectiveTimestampStaleDropper = new StaleDropper();
|
|
173
153
|
this.model = model;
|
|
174
|
-
this.lastTimestampPromise =
|
|
154
|
+
this.lastTimestampPromise = this.#effectiveTimestampMilliseconds();
|
|
175
155
|
this.model.playingInfo.addFreshListener(this.onPlayingProp.bind(this));
|
|
176
156
|
this.catchUpHelper = new CatchUpHelper(this.model);
|
|
177
157
|
this.model.catchUpMove.addFreshListener(this.onCatchUpMoveProp.bind(this));
|
|
@@ -188,6 +168,9 @@ var TwistyAnimationController = class {
|
|
|
188
168
|
}
|
|
189
169
|
this.scheduler.requestAnimFrame();
|
|
190
170
|
}
|
|
171
|
+
async #effectiveTimestampMilliseconds() {
|
|
172
|
+
return (await this.model.detailedTimelineInfo.get()).timestamp;
|
|
173
|
+
}
|
|
191
174
|
jumpToStart(options) {
|
|
192
175
|
this.model.timestampRequest.set("start");
|
|
193
176
|
this.pause();
|
|
@@ -230,7 +213,7 @@ var TwistyAnimationController = class {
|
|
|
230
213
|
});
|
|
231
214
|
this.playing = true;
|
|
232
215
|
this.lastDatestamp = performance.now();
|
|
233
|
-
this.lastTimestampPromise =
|
|
216
|
+
this.lastTimestampPromise = this.#effectiveTimestampMilliseconds();
|
|
234
217
|
this.scheduler.requestAnimFrame();
|
|
235
218
|
}
|
|
236
219
|
pause() {
|
|
@@ -241,18 +224,21 @@ var TwistyAnimationController = class {
|
|
|
241
224
|
untilBoundary: "entire-timeline" /* EntireTimeline */
|
|
242
225
|
});
|
|
243
226
|
}
|
|
227
|
+
#animFrameEffectiveTimestampStaleDropper;
|
|
244
228
|
async animFrame(frameDatestamp) {
|
|
245
229
|
if (this.playing) {
|
|
246
230
|
this.scheduler.requestAnimFrame();
|
|
247
231
|
}
|
|
248
232
|
const lastDatestamp = this.lastDatestamp;
|
|
249
|
-
const freshenerResult = await
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
233
|
+
const freshenerResult = await this.#animFrameEffectiveTimestampStaleDropper.queue(
|
|
234
|
+
Promise.all([
|
|
235
|
+
this.model.playingInfo.get(),
|
|
236
|
+
this.lastTimestampPromise,
|
|
237
|
+
this.model.timeRange.get(),
|
|
238
|
+
this.model.tempoScale.get(),
|
|
239
|
+
this.model.currentMoveInfo.get()
|
|
240
|
+
])
|
|
241
|
+
);
|
|
256
242
|
const [playingInfo, lastTimestamp, timeRange, tempoScale, currentMoveInfo] = freshenerResult;
|
|
257
243
|
if (!playingInfo.playing) {
|
|
258
244
|
this.playing = false;
|
|
@@ -273,7 +259,11 @@ var TwistyAnimationController = class {
|
|
|
273
259
|
let newSmartTimestampRequest = null;
|
|
274
260
|
if (newTimestamp >= end) {
|
|
275
261
|
if (playingInfo.loop) {
|
|
276
|
-
newTimestamp = modIntoRange(
|
|
262
|
+
newTimestamp = modIntoRange(
|
|
263
|
+
newTimestamp,
|
|
264
|
+
timeRange.start,
|
|
265
|
+
timeRange.end
|
|
266
|
+
);
|
|
277
267
|
} else {
|
|
278
268
|
if (newTimestamp === timeRange.end) {
|
|
279
269
|
newSmartTimestampRequest = "end";
|
|
@@ -287,7 +277,11 @@ var TwistyAnimationController = class {
|
|
|
287
277
|
}
|
|
288
278
|
} else if (newTimestamp <= start) {
|
|
289
279
|
if (playingInfo.loop) {
|
|
290
|
-
newTimestamp = modIntoRange(
|
|
280
|
+
newTimestamp = modIntoRange(
|
|
281
|
+
newTimestamp,
|
|
282
|
+
timeRange.start,
|
|
283
|
+
timeRange.end
|
|
284
|
+
);
|
|
291
285
|
} else {
|
|
292
286
|
if (newTimestamp === timeRange.start) {
|
|
293
287
|
newSmartTimestampRequest = "start";
|
|
@@ -305,11 +299,6 @@ var TwistyAnimationController = class {
|
|
|
305
299
|
this.model.timestampRequest.set(newSmartTimestampRequest ?? newTimestamp);
|
|
306
300
|
}
|
|
307
301
|
};
|
|
308
|
-
_effectiveTimestampMilliseconds = new WeakSet();
|
|
309
|
-
effectiveTimestampMilliseconds_fn = async function() {
|
|
310
|
-
return (await this.model.detailedTimelineInfo.get()).timestamp;
|
|
311
|
-
};
|
|
312
|
-
_animFrameEffectiveTimestampStaleDropper = new WeakMap();
|
|
313
302
|
|
|
314
303
|
// src/cubing/twisty/controllers/TwistyPlayerController.ts
|
|
315
304
|
var TwistyPlayerController = class {
|
|
@@ -348,77 +337,6 @@ var ControlPanelProp = class extends SimpleTwistyPropSource {
|
|
|
348
337
|
}
|
|
349
338
|
};
|
|
350
339
|
|
|
351
|
-
// src/cubing/twisty/views/node-custom-element-shims.ts
|
|
352
|
-
var HTMLElementStub = class {
|
|
353
|
-
};
|
|
354
|
-
var HTMLElementShim;
|
|
355
|
-
if (globalThis.HTMLElement) {
|
|
356
|
-
HTMLElementShim = HTMLElement;
|
|
357
|
-
} else {
|
|
358
|
-
HTMLElementShim = HTMLElementStub;
|
|
359
|
-
}
|
|
360
|
-
var CustomElementsStub = class {
|
|
361
|
-
define() {
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
var customElementsShim;
|
|
365
|
-
if (globalThis.customElements) {
|
|
366
|
-
customElementsShim = customElements;
|
|
367
|
-
} else {
|
|
368
|
-
customElementsShim = new CustomElementsStub();
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
// src/cubing/twisty/views/ManagedCustomElement.ts
|
|
372
|
-
var CSSSource = class {
|
|
373
|
-
constructor(sourceText) {
|
|
374
|
-
this.sourceText = sourceText;
|
|
375
|
-
}
|
|
376
|
-
getAsString() {
|
|
377
|
-
return this.sourceText;
|
|
378
|
-
}
|
|
379
|
-
};
|
|
380
|
-
var _cssSourceMap;
|
|
381
|
-
var ManagedCustomElement = class extends HTMLElementShim {
|
|
382
|
-
constructor(options) {
|
|
383
|
-
super();
|
|
384
|
-
__privateAdd(this, _cssSourceMap, /* @__PURE__ */ new Map());
|
|
385
|
-
this.shadow = this.attachShadow({ mode: options?.mode ?? "closed" });
|
|
386
|
-
this.contentWrapper = document.createElement("div");
|
|
387
|
-
this.contentWrapper.classList.add("wrapper");
|
|
388
|
-
this.shadow.appendChild(this.contentWrapper);
|
|
389
|
-
}
|
|
390
|
-
addCSS(cssSource) {
|
|
391
|
-
const existing = __privateGet(this, _cssSourceMap).get(cssSource);
|
|
392
|
-
if (existing) {
|
|
393
|
-
return existing;
|
|
394
|
-
}
|
|
395
|
-
const cssElem = document.createElement("style");
|
|
396
|
-
cssElem.textContent = cssSource.getAsString();
|
|
397
|
-
__privateGet(this, _cssSourceMap).set(cssSource, cssElem);
|
|
398
|
-
this.shadow.appendChild(cssElem);
|
|
399
|
-
return cssElem;
|
|
400
|
-
}
|
|
401
|
-
removeCSS(cssSource) {
|
|
402
|
-
const cssElem = __privateGet(this, _cssSourceMap).get(cssSource);
|
|
403
|
-
if (!cssElem) {
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
this.shadow.removeChild(cssElem);
|
|
407
|
-
__privateGet(this, _cssSourceMap).delete(cssSource);
|
|
408
|
-
}
|
|
409
|
-
addElement(element) {
|
|
410
|
-
return this.contentWrapper.appendChild(element);
|
|
411
|
-
}
|
|
412
|
-
prependElement(element) {
|
|
413
|
-
this.contentWrapper.prepend(element);
|
|
414
|
-
}
|
|
415
|
-
removeElement(element) {
|
|
416
|
-
return this.contentWrapper.removeChild(element);
|
|
417
|
-
}
|
|
418
|
-
};
|
|
419
|
-
_cssSourceMap = new WeakMap();
|
|
420
|
-
customElementsShim.define("twisty-managed-custom-element", ManagedCustomElement);
|
|
421
|
-
|
|
422
340
|
// src/cubing/twisty/views/TwistyViewerWrapper.css.ts
|
|
423
341
|
var twistyViewerWrapperCSS = new CSSSource(`
|
|
424
342
|
:host {
|
|
@@ -617,29 +535,67 @@ var KPuzzleSVGWrapper = class {
|
|
|
617
535
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
618
536
|
for (let orientation = 0; orientation < orbitDefinition.numOrientations; orientation++) {
|
|
619
537
|
const id = this.elementID(orbitName, idx, orientation);
|
|
620
|
-
const fromCur = this.elementID(
|
|
538
|
+
const fromCur = this.elementID(
|
|
539
|
+
orbitName,
|
|
540
|
+
curTransformationOrbit.permutation[idx],
|
|
541
|
+
(orbitDefinition.numOrientations - curTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations
|
|
542
|
+
);
|
|
621
543
|
let singleColor = false;
|
|
622
544
|
if (nextTransformationOrbit) {
|
|
623
|
-
const fromNext = this.elementID(
|
|
545
|
+
const fromNext = this.elementID(
|
|
546
|
+
orbitName,
|
|
547
|
+
nextTransformationOrbit.permutation[idx],
|
|
548
|
+
(orbitDefinition.numOrientations - nextTransformationOrbit.orientation[idx] + orientation) % orbitDefinition.numOrientations
|
|
549
|
+
);
|
|
624
550
|
if (fromCur === fromNext) {
|
|
625
551
|
singleColor = true;
|
|
626
552
|
}
|
|
627
553
|
fraction = fraction || 0;
|
|
628
554
|
const easedBackwardsPercent = 100 * (1 - fraction * fraction * (2 - fraction * fraction));
|
|
629
|
-
this.gradients[id].children[0].setAttribute(
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
this.gradients[id].children[
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
555
|
+
this.gradients[id].children[0].setAttribute(
|
|
556
|
+
"stop-color",
|
|
557
|
+
this.originalColors[fromCur]
|
|
558
|
+
);
|
|
559
|
+
this.gradients[id].children[1].setAttribute(
|
|
560
|
+
"stop-color",
|
|
561
|
+
this.originalColors[fromCur]
|
|
562
|
+
);
|
|
563
|
+
this.gradients[id].children[1].setAttribute(
|
|
564
|
+
"offset",
|
|
565
|
+
`${Math.max(easedBackwardsPercent - 5, 0)}%`
|
|
566
|
+
);
|
|
567
|
+
this.gradients[id].children[2].setAttribute(
|
|
568
|
+
"offset",
|
|
569
|
+
`${Math.max(easedBackwardsPercent - 5, 0)}%`
|
|
570
|
+
);
|
|
571
|
+
this.gradients[id].children[3].setAttribute(
|
|
572
|
+
"offset",
|
|
573
|
+
`${easedBackwardsPercent}%`
|
|
574
|
+
);
|
|
575
|
+
this.gradients[id].children[4].setAttribute(
|
|
576
|
+
"offset",
|
|
577
|
+
`${easedBackwardsPercent}%`
|
|
578
|
+
);
|
|
579
|
+
this.gradients[id].children[4].setAttribute(
|
|
580
|
+
"stop-color",
|
|
581
|
+
this.originalColors[fromNext]
|
|
582
|
+
);
|
|
583
|
+
this.gradients[id].children[5].setAttribute(
|
|
584
|
+
"stop-color",
|
|
585
|
+
this.originalColors[fromNext]
|
|
586
|
+
);
|
|
637
587
|
} else {
|
|
638
588
|
singleColor = true;
|
|
639
589
|
}
|
|
640
590
|
if (singleColor) {
|
|
641
|
-
this.gradients[id].children[0].setAttribute(
|
|
642
|
-
|
|
591
|
+
this.gradients[id].children[0].setAttribute(
|
|
592
|
+
"stop-color",
|
|
593
|
+
this.originalColors[fromCur]
|
|
594
|
+
);
|
|
595
|
+
this.gradients[id].children[1].setAttribute(
|
|
596
|
+
"stop-color",
|
|
597
|
+
this.originalColors[fromCur]
|
|
598
|
+
);
|
|
643
599
|
this.gradients[id].children[1].setAttribute("offset", `100%`);
|
|
644
600
|
this.gradients[id].children[2].setAttribute("offset", `100%`);
|
|
645
601
|
this.gradients[id].children[3].setAttribute("offset", `100%`);
|
|
@@ -650,7 +606,10 @@ var KPuzzleSVGWrapper = class {
|
|
|
650
606
|
}
|
|
651
607
|
}
|
|
652
608
|
newGradient(id, originalColor) {
|
|
653
|
-
const grad = document.createElementNS(
|
|
609
|
+
const grad = document.createElementNS(
|
|
610
|
+
xmlns,
|
|
611
|
+
"radialGradient"
|
|
612
|
+
);
|
|
654
613
|
grad.setAttribute("id", `grad-${this.svgID}-${id}`);
|
|
655
614
|
grad.setAttribute("r", `70.7107%`);
|
|
656
615
|
const stopDefs = [
|
|
@@ -679,7 +638,6 @@ var KPuzzleSVGWrapper = class {
|
|
|
679
638
|
};
|
|
680
639
|
|
|
681
640
|
// src/cubing/twisty/views/2D/Twisty2DPuzzle.ts
|
|
682
|
-
var _cachedPosition, _freshListenerManager;
|
|
683
641
|
var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
684
642
|
constructor(model, kpuzzle, svgSource, options, puzzleLoader) {
|
|
685
643
|
super();
|
|
@@ -689,22 +647,30 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
689
647
|
this.options = options;
|
|
690
648
|
this.puzzleLoader = puzzleLoader;
|
|
691
649
|
this.scheduler = new RenderScheduler(this.render.bind(this));
|
|
692
|
-
|
|
693
|
-
|
|
650
|
+
this.#cachedPosition = null;
|
|
651
|
+
this.#freshListenerManager = new FreshListenerManager();
|
|
694
652
|
this.addCSS(twisty2DSVGCSS);
|
|
695
653
|
this.resetSVG();
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
654
|
+
this.#freshListenerManager.addListener(
|
|
655
|
+
this.model.puzzleID,
|
|
656
|
+
(puzzleID) => {
|
|
657
|
+
if (puzzleLoader?.id !== puzzleID) {
|
|
658
|
+
this.disconnect();
|
|
659
|
+
}
|
|
699
660
|
}
|
|
700
|
-
|
|
701
|
-
|
|
661
|
+
);
|
|
662
|
+
this.#freshListenerManager.addListener(
|
|
663
|
+
this.model.legacyPosition,
|
|
664
|
+
this.onPositionChange.bind(this)
|
|
665
|
+
);
|
|
702
666
|
if (this.options?.experimentalStickering) {
|
|
703
667
|
this.experimentalSetStickering(this.options.experimentalStickering);
|
|
704
668
|
}
|
|
705
669
|
}
|
|
670
|
+
#cachedPosition;
|
|
671
|
+
#freshListenerManager;
|
|
706
672
|
disconnect() {
|
|
707
|
-
|
|
673
|
+
this.#freshListenerManager.disconnect();
|
|
708
674
|
}
|
|
709
675
|
onPositionChange(position) {
|
|
710
676
|
try {
|
|
@@ -715,13 +681,21 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
715
681
|
partialMove = move.invert();
|
|
716
682
|
}
|
|
717
683
|
const newState = position.state.applyMove(partialMove);
|
|
718
|
-
this.svgWrapper.draw(
|
|
684
|
+
this.svgWrapper.draw(
|
|
685
|
+
position.state,
|
|
686
|
+
newState,
|
|
687
|
+
position.movesInProgress[0].fraction
|
|
688
|
+
);
|
|
719
689
|
} else {
|
|
720
690
|
this.svgWrapper.draw(position.state);
|
|
721
|
-
|
|
691
|
+
this.#cachedPosition = position;
|
|
722
692
|
}
|
|
723
693
|
} catch (e) {
|
|
724
|
-
console.warn(
|
|
694
|
+
console.warn(
|
|
695
|
+
"Bad position (this doesn't necessarily mean something is wrong). Pre-emptively disconnecting:",
|
|
696
|
+
this.puzzleLoader?.id,
|
|
697
|
+
e
|
|
698
|
+
);
|
|
725
699
|
this.disconnect();
|
|
726
700
|
}
|
|
727
701
|
}
|
|
@@ -744,146 +718,153 @@ var Twisty2DPuzzle = class extends ManagedCustomElement {
|
|
|
744
718
|
if (!this.kpuzzle) {
|
|
745
719
|
return;
|
|
746
720
|
}
|
|
747
|
-
this.svgWrapper = new KPuzzleSVGWrapper(
|
|
721
|
+
this.svgWrapper = new KPuzzleSVGWrapper(
|
|
722
|
+
this.kpuzzle,
|
|
723
|
+
this.svgSource,
|
|
724
|
+
appearance
|
|
725
|
+
);
|
|
748
726
|
this.addElement(this.svgWrapper.wrapperElement);
|
|
749
|
-
if (
|
|
750
|
-
this.onPositionChange(
|
|
727
|
+
if (this.#cachedPosition) {
|
|
728
|
+
this.onPositionChange(this.#cachedPosition);
|
|
751
729
|
}
|
|
752
730
|
}
|
|
753
731
|
render() {
|
|
754
732
|
}
|
|
755
733
|
};
|
|
756
|
-
_cachedPosition = new WeakMap();
|
|
757
|
-
_freshListenerManager = new WeakMap();
|
|
758
734
|
customElementsShim.define("twisty-2d-puzzle", Twisty2DPuzzle);
|
|
759
735
|
|
|
760
736
|
// src/cubing/twisty/views/2D/Twisty2DPuzzleWrapper.ts
|
|
761
|
-
var _freshListenerManager2, _cachedTwisty2DPuzzle;
|
|
762
737
|
var Twisty2DPuzzleWrapper = class {
|
|
763
738
|
constructor(model, schedulable, puzzleLoader, effectiveVisualization) {
|
|
764
739
|
this.model = model;
|
|
765
740
|
this.schedulable = schedulable;
|
|
766
741
|
this.puzzleLoader = puzzleLoader;
|
|
767
742
|
this.effectiveVisualization = effectiveVisualization;
|
|
768
|
-
__privateAdd(this, _freshListenerManager2, new FreshListenerManager());
|
|
769
|
-
__privateAdd(this, _cachedTwisty2DPuzzle, null);
|
|
770
743
|
this.twisty2DPuzzle();
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
744
|
+
this.#freshListenerManager.addListener(
|
|
745
|
+
this.model.twistySceneModel.stickering,
|
|
746
|
+
async (stickering) => {
|
|
747
|
+
(await this.twisty2DPuzzle()).experimentalSetStickering(stickering);
|
|
748
|
+
}
|
|
749
|
+
);
|
|
774
750
|
}
|
|
751
|
+
#freshListenerManager = new FreshListenerManager();
|
|
775
752
|
disconnect() {
|
|
776
|
-
|
|
753
|
+
this.#freshListenerManager.disconnect();
|
|
777
754
|
}
|
|
778
755
|
scheduleRender() {
|
|
779
756
|
}
|
|
757
|
+
#cachedTwisty2DPuzzle = null;
|
|
780
758
|
async twisty2DPuzzle() {
|
|
781
|
-
return
|
|
759
|
+
return this.#cachedTwisty2DPuzzle ?? (this.#cachedTwisty2DPuzzle = (async () => {
|
|
782
760
|
const svgPromise = this.effectiveVisualization === "experimental-2D-LL" ? this.puzzleLoader.llSVG() : this.puzzleLoader.svg();
|
|
783
|
-
return new Twisty2DPuzzle(
|
|
761
|
+
return new Twisty2DPuzzle(
|
|
762
|
+
this.model,
|
|
763
|
+
await this.puzzleLoader.kpuzzle(),
|
|
764
|
+
await svgPromise,
|
|
765
|
+
{},
|
|
766
|
+
this.puzzleLoader
|
|
767
|
+
);
|
|
784
768
|
})());
|
|
785
769
|
}
|
|
786
770
|
};
|
|
787
|
-
_freshListenerManager2 = new WeakMap();
|
|
788
|
-
_cachedTwisty2DPuzzle = new WeakMap();
|
|
789
771
|
|
|
790
772
|
// src/cubing/twisty/views/2D/Twisty2DSceneWrapper.ts
|
|
791
|
-
var _freshListenerManager3, _cachedScene, _currentTwisty2DPuzzleWrapper;
|
|
792
773
|
var Twisty2DSceneWrapper = class extends ManagedCustomElement {
|
|
793
774
|
constructor(model, effectiveVisualization) {
|
|
794
775
|
super();
|
|
795
776
|
this.model = model;
|
|
796
777
|
this.effectiveVisualization = effectiveVisualization;
|
|
797
|
-
__privateAdd(this, _freshListenerManager3, new FreshListenerManager());
|
|
798
|
-
__privateAdd(this, _cachedScene, void 0);
|
|
799
|
-
__privateAdd(this, _currentTwisty2DPuzzleWrapper, null);
|
|
800
778
|
}
|
|
779
|
+
#freshListenerManager = new FreshListenerManager();
|
|
801
780
|
disconnect() {
|
|
802
|
-
|
|
781
|
+
this.#freshListenerManager.disconnect();
|
|
803
782
|
}
|
|
804
783
|
async connectedCallback() {
|
|
805
784
|
this.addCSS(twistyViewerWrapperCSS);
|
|
806
785
|
if (this.model) {
|
|
807
|
-
|
|
786
|
+
this.#freshListenerManager.addListener(
|
|
787
|
+
this.model.twistyPlayerModel.puzzleLoader,
|
|
788
|
+
this.onPuzzleLoader.bind(this)
|
|
789
|
+
);
|
|
808
790
|
}
|
|
809
791
|
}
|
|
792
|
+
#cachedScene;
|
|
810
793
|
async scene() {
|
|
811
|
-
return
|
|
794
|
+
return this.#cachedScene ?? (this.#cachedScene = (async () => new (await THREEJS).Scene())());
|
|
812
795
|
}
|
|
813
796
|
scheduleRender() {
|
|
814
|
-
|
|
797
|
+
this.#currentTwisty2DPuzzleWrapper?.scheduleRender();
|
|
815
798
|
}
|
|
799
|
+
#currentTwisty2DPuzzleWrapper = null;
|
|
816
800
|
currentTwisty2DPuzzleWrapper() {
|
|
817
|
-
return
|
|
801
|
+
return this.#currentTwisty2DPuzzleWrapper;
|
|
818
802
|
}
|
|
819
803
|
async setCurrentTwisty2DPuzzleWrapper(twisty2DPuzzleWrapper) {
|
|
820
|
-
const old =
|
|
821
|
-
|
|
804
|
+
const old = this.#currentTwisty2DPuzzleWrapper;
|
|
805
|
+
this.#currentTwisty2DPuzzleWrapper = twisty2DPuzzleWrapper;
|
|
822
806
|
old?.disconnect();
|
|
823
807
|
const twisty2DPuzzlePromise = twisty2DPuzzleWrapper.twisty2DPuzzle();
|
|
824
808
|
this.contentWrapper.textContent = "";
|
|
825
809
|
this.addElement(await twisty2DPuzzlePromise);
|
|
826
810
|
}
|
|
827
811
|
async onPuzzleLoader(puzzleLoader) {
|
|
828
|
-
|
|
829
|
-
const twisty2DPuzzleWrapper = new Twisty2DPuzzleWrapper(
|
|
812
|
+
this.#currentTwisty2DPuzzleWrapper?.disconnect();
|
|
813
|
+
const twisty2DPuzzleWrapper = new Twisty2DPuzzleWrapper(
|
|
814
|
+
this.model.twistyPlayerModel,
|
|
815
|
+
this,
|
|
816
|
+
puzzleLoader,
|
|
817
|
+
this.effectiveVisualization
|
|
818
|
+
);
|
|
830
819
|
this.setCurrentTwisty2DPuzzleWrapper(twisty2DPuzzleWrapper);
|
|
831
820
|
}
|
|
832
821
|
};
|
|
833
|
-
_freshListenerManager3 = new WeakMap();
|
|
834
|
-
_cachedScene = new WeakMap();
|
|
835
|
-
_currentTwisty2DPuzzleWrapper = new WeakMap();
|
|
836
822
|
customElementsShim.define("twisty-2d-scene-wrapper", Twisty2DSceneWrapper);
|
|
837
823
|
|
|
838
824
|
// src/cubing/twisty/views/ClassListManager.ts
|
|
839
|
-
var _currentClassName;
|
|
840
825
|
var ClassListManager = class {
|
|
841
826
|
constructor(elem, prefix, validSuffixes) {
|
|
842
827
|
this.elem = elem;
|
|
843
828
|
this.prefix = prefix;
|
|
844
829
|
this.validSuffixes = validSuffixes;
|
|
845
|
-
__privateAdd(this, _currentClassName, null);
|
|
846
830
|
}
|
|
831
|
+
#currentClassName = null;
|
|
847
832
|
clearValue() {
|
|
848
|
-
if (
|
|
849
|
-
this.elem.contentWrapper.classList.remove(
|
|
833
|
+
if (this.#currentClassName) {
|
|
834
|
+
this.elem.contentWrapper.classList.remove(this.#currentClassName);
|
|
850
835
|
}
|
|
851
|
-
|
|
836
|
+
this.#currentClassName = null;
|
|
852
837
|
}
|
|
853
838
|
setValue(suffix) {
|
|
854
839
|
if (!this.validSuffixes.includes(suffix)) {
|
|
855
840
|
throw new Error(`Invalid suffix: ${suffix}`);
|
|
856
841
|
}
|
|
857
842
|
const newClassName = `${this.prefix}${suffix}`;
|
|
858
|
-
const changed =
|
|
843
|
+
const changed = this.#currentClassName !== newClassName;
|
|
859
844
|
if (changed) {
|
|
860
845
|
this.clearValue();
|
|
861
846
|
this.elem.contentWrapper.classList.add(newClassName);
|
|
862
|
-
|
|
847
|
+
this.#currentClassName = newClassName;
|
|
863
848
|
}
|
|
864
849
|
return changed;
|
|
865
850
|
}
|
|
866
851
|
};
|
|
867
|
-
_currentClassName = new WeakMap();
|
|
868
852
|
|
|
869
853
|
// src/cubing/twisty/views/InitialValueTracker.ts
|
|
870
|
-
var _resolve;
|
|
871
854
|
var InitialValueTracker = class {
|
|
872
855
|
constructor() {
|
|
873
|
-
__privateAdd(this, _resolve, void 0);
|
|
874
856
|
this.promise = new Promise((resolve, reject) => {
|
|
875
|
-
|
|
857
|
+
this.#resolve = resolve;
|
|
876
858
|
this.reject = reject;
|
|
877
859
|
});
|
|
878
860
|
}
|
|
861
|
+
#resolve;
|
|
879
862
|
handleNewValue(t) {
|
|
880
|
-
|
|
863
|
+
this.#resolve(t);
|
|
881
864
|
}
|
|
882
865
|
};
|
|
883
|
-
_resolve = new WeakMap();
|
|
884
866
|
|
|
885
867
|
// src/cubing/twisty/views/3D/Twisty3DPuzzleWrapper.ts
|
|
886
|
-
var _freshListenerManager4, _cachedTwisty3DPuzzle;
|
|
887
868
|
var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
888
869
|
constructor(model, schedulable, puzzleLoader, visualizationStrategy) {
|
|
889
870
|
super();
|
|
@@ -891,69 +872,91 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
891
872
|
this.schedulable = schedulable;
|
|
892
873
|
this.puzzleLoader = puzzleLoader;
|
|
893
874
|
this.visualizationStrategy = visualizationStrategy;
|
|
894
|
-
__privateAdd(this, _freshListenerManager4, new FreshListenerManager());
|
|
895
|
-
__privateAdd(this, _cachedTwisty3DPuzzle, null);
|
|
896
875
|
this.twisty3DPuzzle();
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
876
|
+
this.#freshListenerManager.addListener(
|
|
877
|
+
this.model.puzzleLoader,
|
|
878
|
+
(puzzleLoader2) => {
|
|
879
|
+
if (this.puzzleLoader.id !== puzzleLoader2.id) {
|
|
880
|
+
this.disconnect();
|
|
881
|
+
}
|
|
900
882
|
}
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
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
|
+
}
|
|
893
|
+
}
|
|
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
|
+
});
|
|
905
901
|
this.scheduleRender();
|
|
906
|
-
} catch (e) {
|
|
907
|
-
this.disconnect();
|
|
908
902
|
}
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
__privateGet(this, _freshListenerManager4).addListener(this.model.twistySceneModel.foundationDisplay, async (foundationDisplay) => {
|
|
917
|
-
(await this.twisty3DPuzzle()).experimentalUpdateOptions({
|
|
918
|
-
showFoundation: foundationDisplay !== "none"
|
|
919
|
-
});
|
|
920
|
-
this.scheduleRender();
|
|
921
|
-
});
|
|
922
|
-
__privateGet(this, _freshListenerManager4).addListener(this.model.twistySceneModel.stickering, async (stickering) => {
|
|
923
|
-
if ("setStickering" in await this.twisty3DPuzzle()) {
|
|
924
|
-
(await this.twisty3DPuzzle()).setStickering(stickering);
|
|
903
|
+
);
|
|
904
|
+
this.#freshListenerManager.addListener(
|
|
905
|
+
this.model.twistySceneModel.foundationDisplay,
|
|
906
|
+
async (foundationDisplay) => {
|
|
907
|
+
(await this.twisty3DPuzzle()).experimentalUpdateOptions({
|
|
908
|
+
showFoundation: foundationDisplay !== "none"
|
|
909
|
+
});
|
|
925
910
|
this.scheduleRender();
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
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);
|
|
933
918
|
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
|
+
}
|
|
934
928
|
}
|
|
935
929
|
}
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
this.
|
|
930
|
+
);
|
|
931
|
+
this.#freshListenerManager.addMultiListener3(
|
|
932
|
+
[
|
|
933
|
+
this.model.twistySceneModel.stickering,
|
|
934
|
+
this.model.twistySceneModel.foundationStickerSprite,
|
|
935
|
+
this.model.twistySceneModel.hintStickerSprite
|
|
936
|
+
],
|
|
937
|
+
async (inputs) => {
|
|
938
|
+
if ("experimentalUpdateTexture" in await this.twisty3DPuzzle()) {
|
|
939
|
+
(await this.twisty3DPuzzle()).experimentalUpdateTexture(
|
|
940
|
+
inputs[0] === "picture",
|
|
941
|
+
inputs[1],
|
|
942
|
+
inputs[2]
|
|
943
|
+
);
|
|
944
|
+
this.scheduleRender();
|
|
945
|
+
}
|
|
945
946
|
}
|
|
946
|
-
|
|
947
|
+
);
|
|
947
948
|
}
|
|
949
|
+
#freshListenerManager = new FreshListenerManager();
|
|
948
950
|
disconnect() {
|
|
949
|
-
|
|
951
|
+
this.#freshListenerManager.disconnect();
|
|
950
952
|
}
|
|
951
953
|
scheduleRender() {
|
|
952
954
|
this.schedulable.scheduleRender();
|
|
953
955
|
this.dispatchEvent(new CustomEvent("render-scheduled"));
|
|
954
956
|
}
|
|
957
|
+
#cachedTwisty3DPuzzle = null;
|
|
955
958
|
async twisty3DPuzzle() {
|
|
956
|
-
return
|
|
959
|
+
return this.#cachedTwisty3DPuzzle ?? (this.#cachedTwisty3DPuzzle = (async () => {
|
|
957
960
|
const proxyPromise = proxy3D();
|
|
958
961
|
if (this.puzzleLoader.id === "3x3x3" && this.visualizationStrategy === "Cube3D") {
|
|
959
962
|
const [foundationSprite, hintSprite, experimentalStickering] = await Promise.all([
|
|
@@ -961,19 +964,32 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
961
964
|
this.model.twistySceneModel.hintStickerSprite.get(),
|
|
962
965
|
this.model.twistySceneModel.stickering.get()
|
|
963
966
|
]);
|
|
964
|
-
return (await proxyPromise).cube3DShim(
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
967
|
+
return (await proxyPromise).cube3DShim(
|
|
968
|
+
() => this.schedulable.scheduleRender(),
|
|
969
|
+
{
|
|
970
|
+
foundationSprite,
|
|
971
|
+
hintSprite,
|
|
972
|
+
experimentalStickering
|
|
973
|
+
}
|
|
974
|
+
);
|
|
969
975
|
} else {
|
|
970
976
|
const [hintFacelets, foundationSprite, hintSprite] = await Promise.all([
|
|
971
977
|
this.model.twistySceneModel.hintFacelet.get(),
|
|
972
978
|
this.model.twistySceneModel.foundationStickerSprite.get(),
|
|
973
979
|
this.model.twistySceneModel.hintStickerSprite.get()
|
|
974
980
|
]);
|
|
975
|
-
const pg3d = (await proxyPromise).pg3dShim(
|
|
976
|
-
|
|
981
|
+
const pg3d = (await proxyPromise).pg3dShim(
|
|
982
|
+
() => this.schedulable.scheduleRender(),
|
|
983
|
+
this.puzzleLoader,
|
|
984
|
+
hintFacelets === "auto" ? "floating" : hintFacelets
|
|
985
|
+
);
|
|
986
|
+
pg3d.then(
|
|
987
|
+
(p) => p.experimentalUpdateTexture(
|
|
988
|
+
true,
|
|
989
|
+
foundationSprite ?? void 0,
|
|
990
|
+
hintSprite ?? void 0
|
|
991
|
+
)
|
|
992
|
+
);
|
|
977
993
|
return pg3d;
|
|
978
994
|
}
|
|
979
995
|
})());
|
|
@@ -988,7 +1004,10 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
988
1004
|
const [raycaster] = await Promise.all([raycasterPromise]);
|
|
989
1005
|
const intersects = raycaster.intersectObjects(targets);
|
|
990
1006
|
if (intersects.length > 0) {
|
|
991
|
-
const closestMove = puzzle.getClosestMoveToAxis(
|
|
1007
|
+
const closestMove = puzzle.getClosestMoveToAxis(
|
|
1008
|
+
intersects[0].point,
|
|
1009
|
+
transformations
|
|
1010
|
+
);
|
|
992
1011
|
if (closestMove) {
|
|
993
1012
|
this.model.experimentalAddMove(closestMove.move, {
|
|
994
1013
|
coalesce: true,
|
|
@@ -1000,708 +1019,56 @@ var Twisty3DPuzzleWrapper = class extends EventTarget {
|
|
|
1000
1019
|
}
|
|
1001
1020
|
}
|
|
1002
1021
|
};
|
|
1003
|
-
_freshListenerManager4 = new WeakMap();
|
|
1004
|
-
_cachedTwisty3DPuzzle = new WeakMap();
|
|
1005
|
-
|
|
1006
|
-
// src/cubing/vendor/three/examples/jsm/libs/stats.modified.module.ts
|
|
1007
|
-
var performance2 = globalThis.performance;
|
|
1008
|
-
var Stats = class {
|
|
1009
|
-
constructor() {
|
|
1010
|
-
this.mode = 0;
|
|
1011
|
-
this.dom = document.createElement("div");
|
|
1012
|
-
this.beginTime = (performance2 || Date).now();
|
|
1013
|
-
this.prevTime = this.beginTime;
|
|
1014
|
-
this.frames = 0;
|
|
1015
|
-
this.fpsPanel = this.addPanel(new StatsPanel("FPS", "#0ff", "#002"));
|
|
1016
|
-
this.msPanel = this.addPanel(new StatsPanel("MS", "#0f0", "#020"));
|
|
1017
|
-
this.memPanel = performance2?.memory ? this.addPanel(new StatsPanel("MB", "#f08", "#201")) : null;
|
|
1018
|
-
this.REVISION = 16;
|
|
1019
|
-
this.dom.style.cssText = "position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";
|
|
1020
|
-
this.dom.addEventListener("click", (event) => {
|
|
1021
|
-
event.preventDefault();
|
|
1022
|
-
this.showPanel(++this.mode % this.dom.children.length);
|
|
1023
|
-
}, false);
|
|
1024
|
-
this.showPanel(0);
|
|
1025
|
-
}
|
|
1026
|
-
addPanel(panel) {
|
|
1027
|
-
this.dom.appendChild(panel.dom);
|
|
1028
|
-
return panel;
|
|
1029
|
-
}
|
|
1030
|
-
showPanel(id) {
|
|
1031
|
-
for (let i = 0; i < this.dom.children.length; i++) {
|
|
1032
|
-
this.dom.children[i].style.display = i === id ? "block" : "none";
|
|
1033
|
-
}
|
|
1034
|
-
this.mode = id;
|
|
1035
|
-
}
|
|
1036
|
-
begin() {
|
|
1037
|
-
this.beginTime = (performance2 || Date).now();
|
|
1038
|
-
}
|
|
1039
|
-
end() {
|
|
1040
|
-
this.frames++;
|
|
1041
|
-
const time = (performance2 || Date).now();
|
|
1042
|
-
this.msPanel.update(time - this.beginTime, 200);
|
|
1043
|
-
if (time >= this.prevTime + 1e3) {
|
|
1044
|
-
this.fpsPanel.update(this.frames * 1e3 / (time - this.prevTime), 100);
|
|
1045
|
-
this.prevTime = time;
|
|
1046
|
-
this.frames = 0;
|
|
1047
|
-
if (this.memPanel) {
|
|
1048
|
-
const memory = performance2.memory;
|
|
1049
|
-
this.memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576);
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
return time;
|
|
1053
|
-
}
|
|
1054
|
-
update() {
|
|
1055
|
-
this.beginTime = this.end();
|
|
1056
|
-
}
|
|
1057
|
-
};
|
|
1058
|
-
var PR = Math.round(globalThis?.window?.devicePixelRatio ?? 1);
|
|
1059
|
-
var WIDTH = 80 * PR;
|
|
1060
|
-
var HEIGHT = 48 * PR;
|
|
1061
|
-
var TEXT_X = 3 * PR;
|
|
1062
|
-
var TEXT_Y = 2 * PR;
|
|
1063
|
-
var GRAPH_X = 3 * PR;
|
|
1064
|
-
var GRAPH_Y = 15 * PR;
|
|
1065
|
-
var GRAPH_WIDTH = 74 * PR;
|
|
1066
|
-
var GRAPH_HEIGHT = 30 * PR;
|
|
1067
|
-
var StatsPanel = class {
|
|
1068
|
-
constructor(name, fg, bg) {
|
|
1069
|
-
this.name = name;
|
|
1070
|
-
this.fg = fg;
|
|
1071
|
-
this.bg = bg;
|
|
1072
|
-
this.min = Infinity;
|
|
1073
|
-
this.max = 0;
|
|
1074
|
-
this.dom = document.createElement("canvas");
|
|
1075
|
-
this.context = this.dom.getContext("2d");
|
|
1076
|
-
this.dom.width = WIDTH;
|
|
1077
|
-
this.dom.height = HEIGHT;
|
|
1078
|
-
this.dom.style.cssText = "width:80px;height:48px";
|
|
1079
|
-
this.context.font = `bold ${9 * PR}px Helvetica,Arial,sans-serif`;
|
|
1080
|
-
this.context.textBaseline = "top";
|
|
1081
|
-
this.context.fillStyle = bg;
|
|
1082
|
-
this.context.fillRect(0, 0, WIDTH, HEIGHT);
|
|
1083
|
-
this.context.fillStyle = fg;
|
|
1084
|
-
this.context.fillText(name, TEXT_X, TEXT_Y);
|
|
1085
|
-
this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);
|
|
1086
|
-
this.context.fillStyle = bg;
|
|
1087
|
-
this.context.globalAlpha = 0.9;
|
|
1088
|
-
this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);
|
|
1089
|
-
}
|
|
1090
|
-
update(value, maxValue) {
|
|
1091
|
-
this.min = Math.min(this.min, value);
|
|
1092
|
-
this.max = Math.max(this.max, value);
|
|
1093
|
-
this.context.fillStyle = this.bg;
|
|
1094
|
-
this.context.globalAlpha = 1;
|
|
1095
|
-
this.context.fillRect(0, 0, WIDTH, GRAPH_Y);
|
|
1096
|
-
this.context.fillStyle = this.fg;
|
|
1097
|
-
this.context.fillText(Math.round(value) + " " + this.name + " (" + Math.round(this.min) + "-" + Math.round(this.max) + ")", TEXT_X, TEXT_Y);
|
|
1098
|
-
this.context.drawImage(this.dom, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT);
|
|
1099
|
-
this.context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT);
|
|
1100
|
-
this.context.fillStyle = this.bg;
|
|
1101
|
-
this.context.globalAlpha = 0.9;
|
|
1102
|
-
this.context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, Math.round((1 - value / maxValue) * GRAPH_HEIGHT));
|
|
1103
|
-
}
|
|
1104
|
-
};
|
|
1105
|
-
|
|
1106
|
-
// src/cubing/twisty/views/canvas.ts
|
|
1107
|
-
var globalPixelRatioOverride = null;
|
|
1108
|
-
function pixelRatio() {
|
|
1109
|
-
return globalPixelRatioOverride ?? (devicePixelRatio || 1);
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
// src/cubing/twisty/views/3D/Twisty3DVantage.css.ts
|
|
1113
|
-
var twisty3DVantageCSS = new CSSSource(`
|
|
1114
|
-
:host {
|
|
1115
|
-
width: 384px;
|
|
1116
|
-
height: 256px;
|
|
1117
|
-
display: grid;
|
|
1118
|
-
}
|
|
1119
|
-
|
|
1120
|
-
.wrapper {
|
|
1121
|
-
width: 100%;
|
|
1122
|
-
height: 100%;
|
|
1123
|
-
display: grid;
|
|
1124
|
-
overflow: hidden;
|
|
1125
|
-
place-content: center;
|
|
1126
|
-
contain: strict;
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
|
-
.loading {
|
|
1130
|
-
width: 4em;
|
|
1131
|
-
height: 4em;
|
|
1132
|
-
border-radius: 2.5em;
|
|
1133
|
-
border: 0.5em solid rgba(0, 0, 0, 0);
|
|
1134
|
-
border-top: 0.5em solid rgba(0, 0, 0, 0.7);
|
|
1135
|
-
border-right: 0.5em solid rgba(0, 0, 0, 0.7);
|
|
1136
|
-
animation: fade-in-delayed 4s, rotate 1s linear infinite;
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
@keyframes fade-in-delayed {
|
|
1140
|
-
0% { opacity: 0; }
|
|
1141
|
-
25% {opacity: 0; }
|
|
1142
|
-
100% { opacity: 1; }
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
@keyframes rotate {
|
|
1146
|
-
from { transform: rotate(0deg); }
|
|
1147
|
-
to { transform: rotate(360deg); }
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
/* TODO: This is due to stats hack. Replace with \`canvas\`. */
|
|
1151
|
-
.wrapper > canvas {
|
|
1152
|
-
max-width: 100%;
|
|
1153
|
-
max-height: 100%;
|
|
1154
|
-
animation: fade-in 0.25s ease-in;
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1157
|
-
@keyframes fade-in {
|
|
1158
|
-
from { opacity: 0; }
|
|
1159
|
-
to { opacity: 1; }
|
|
1160
|
-
}
|
|
1161
|
-
|
|
1162
|
-
.wrapper.invisible {
|
|
1163
|
-
opacity: 0;
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
.wrapper.drag-input-enabled > canvas {
|
|
1167
|
-
cursor: grab;
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
.wrapper.drag-input-enabled > canvas:active {
|
|
1171
|
-
cursor: grabbing;
|
|
1172
|
-
}
|
|
1173
|
-
`);
|
|
1174
|
-
|
|
1175
|
-
// src/cubing/twisty/views/3D/DragTracker.ts
|
|
1176
|
-
var MOVEMENT_EPSILON = 0.1;
|
|
1177
|
-
var _dragInfoMap, _targetListeners, _lazyListenersRegistered, _registerLazyListeners, registerLazyListeners_fn, _clear, clear_fn, _trackDrag, trackDrag_fn;
|
|
1178
|
-
var DragTracker = class extends EventTarget {
|
|
1179
|
-
constructor(target) {
|
|
1180
|
-
super();
|
|
1181
|
-
this.target = target;
|
|
1182
|
-
__privateAdd(this, _registerLazyListeners);
|
|
1183
|
-
__privateAdd(this, _clear);
|
|
1184
|
-
__privateAdd(this, _trackDrag);
|
|
1185
|
-
__privateAdd(this, _dragInfoMap, /* @__PURE__ */ new Map());
|
|
1186
|
-
__privateAdd(this, _targetListeners, /* @__PURE__ */ new Map());
|
|
1187
|
-
__privateAdd(this, _lazyListenersRegistered, false);
|
|
1188
|
-
}
|
|
1189
|
-
start() {
|
|
1190
|
-
this.addTargetListener("pointerdown", this.onPointerDown.bind(this));
|
|
1191
|
-
this.addTargetListener("contextmenu", (e) => {
|
|
1192
|
-
e.preventDefault();
|
|
1193
|
-
});
|
|
1194
|
-
this.addTargetListener("touchmove", (e) => e.preventDefault());
|
|
1195
|
-
this.addTargetListener("dblclick", (e) => e.preventDefault());
|
|
1196
|
-
}
|
|
1197
|
-
stop() {
|
|
1198
|
-
for (const [eventType, listener] of __privateGet(this, _targetListeners).entries()) {
|
|
1199
|
-
this.target.removeEventListener(eventType, listener);
|
|
1200
|
-
}
|
|
1201
|
-
__privateGet(this, _targetListeners).clear();
|
|
1202
|
-
__privateSet(this, _lazyListenersRegistered, false);
|
|
1203
|
-
}
|
|
1204
|
-
addTargetListener(eventType, listener) {
|
|
1205
|
-
if (!__privateGet(this, _targetListeners).has(eventType)) {
|
|
1206
|
-
this.target.addEventListener(eventType, listener);
|
|
1207
|
-
__privateGet(this, _targetListeners).set(eventType, listener);
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
onPointerDown(e) {
|
|
1211
|
-
__privateMethod(this, _registerLazyListeners, registerLazyListeners_fn).call(this);
|
|
1212
|
-
const newDragInfo = {
|
|
1213
|
-
attachedInfo: {},
|
|
1214
|
-
hasMoved: false,
|
|
1215
|
-
lastClientX: e.clientX,
|
|
1216
|
-
lastClientY: e.clientY,
|
|
1217
|
-
lastTimeStamp: e.timeStamp
|
|
1218
|
-
};
|
|
1219
|
-
__privateGet(this, _dragInfoMap).set(e.pointerId, newDragInfo);
|
|
1220
|
-
this.target.setPointerCapture(e.pointerId);
|
|
1221
|
-
}
|
|
1222
|
-
onPointerMove(e) {
|
|
1223
|
-
const movementInfo = __privateMethod(this, _trackDrag, trackDrag_fn).call(this, e).movementInfo;
|
|
1224
|
-
if (movementInfo) {
|
|
1225
|
-
e.preventDefault();
|
|
1226
|
-
this.dispatchEvent(new CustomEvent("move", {
|
|
1227
|
-
detail: movementInfo
|
|
1228
|
-
}));
|
|
1229
|
-
}
|
|
1230
|
-
}
|
|
1231
|
-
onPointerUp(e) {
|
|
1232
|
-
const trackDragResult = __privateMethod(this, _trackDrag, trackDrag_fn).call(this, e);
|
|
1233
|
-
const existing = __privateGet(this, _dragInfoMap).get(e.pointerId);
|
|
1234
|
-
__privateMethod(this, _clear, clear_fn).call(this, e);
|
|
1235
|
-
this.target.releasePointerCapture(e.pointerId);
|
|
1236
|
-
let event;
|
|
1237
|
-
if (trackDragResult.hasMoved) {
|
|
1238
|
-
event = new CustomEvent("up", {
|
|
1239
|
-
detail: { attachedInfo: existing.attachedInfo }
|
|
1240
|
-
});
|
|
1241
|
-
} else {
|
|
1242
|
-
const { altKey, ctrlKey, metaKey, shiftKey } = e;
|
|
1243
|
-
event = new CustomEvent("press", {
|
|
1244
|
-
detail: {
|
|
1245
|
-
normalizedX: e.offsetX / this.target.offsetWidth * 2 - 1,
|
|
1246
|
-
normalizedY: 1 - e.offsetY / this.target.offsetHeight * 2,
|
|
1247
|
-
rightClick: !!(e.button & 2),
|
|
1248
|
-
keys: {
|
|
1249
|
-
altKey,
|
|
1250
|
-
ctrlOrMetaKey: ctrlKey || metaKey,
|
|
1251
|
-
shiftKey
|
|
1252
|
-
}
|
|
1253
|
-
}
|
|
1254
|
-
});
|
|
1255
|
-
}
|
|
1256
|
-
this.dispatchEvent(event);
|
|
1257
|
-
}
|
|
1258
|
-
};
|
|
1259
|
-
_dragInfoMap = new WeakMap();
|
|
1260
|
-
_targetListeners = new WeakMap();
|
|
1261
|
-
_lazyListenersRegistered = new WeakMap();
|
|
1262
|
-
_registerLazyListeners = new WeakSet();
|
|
1263
|
-
registerLazyListeners_fn = function() {
|
|
1264
|
-
if (__privateGet(this, _lazyListenersRegistered)) {
|
|
1265
|
-
return;
|
|
1266
|
-
}
|
|
1267
|
-
this.addTargetListener("pointermove", this.onPointerMove.bind(this));
|
|
1268
|
-
this.addTargetListener("pointerup", this.onPointerUp.bind(this));
|
|
1269
|
-
__privateSet(this, _lazyListenersRegistered, true);
|
|
1270
|
-
};
|
|
1271
|
-
_clear = new WeakSet();
|
|
1272
|
-
clear_fn = function(e) {
|
|
1273
|
-
__privateGet(this, _dragInfoMap).delete(e.pointerId);
|
|
1274
|
-
};
|
|
1275
|
-
_trackDrag = new WeakSet();
|
|
1276
|
-
trackDrag_fn = function(e) {
|
|
1277
|
-
const existing = __privateGet(this, _dragInfoMap).get(e.pointerId);
|
|
1278
|
-
if (!existing) {
|
|
1279
|
-
return { movementInfo: null, hasMoved: false };
|
|
1280
|
-
}
|
|
1281
|
-
let movementInfo;
|
|
1282
|
-
if ((e.movementX ?? 0) !== 0 || (e.movementY ?? 0) !== 0) {
|
|
1283
|
-
movementInfo = {
|
|
1284
|
-
attachedInfo: existing.attachedInfo,
|
|
1285
|
-
movementX: e.movementX,
|
|
1286
|
-
movementY: e.movementY,
|
|
1287
|
-
elapsedMs: e.timeStamp - existing.lastTimeStamp
|
|
1288
|
-
};
|
|
1289
|
-
} else {
|
|
1290
|
-
movementInfo = {
|
|
1291
|
-
attachedInfo: existing.attachedInfo,
|
|
1292
|
-
movementX: e.clientX - existing.lastClientX,
|
|
1293
|
-
movementY: e.clientY - existing.lastClientY,
|
|
1294
|
-
elapsedMs: e.timeStamp - existing.lastTimeStamp
|
|
1295
|
-
};
|
|
1296
|
-
}
|
|
1297
|
-
existing.lastClientX = e.clientX;
|
|
1298
|
-
existing.lastClientY = e.clientY;
|
|
1299
|
-
existing.lastTimeStamp = e.timeStamp;
|
|
1300
|
-
if (Math.abs(movementInfo.movementX) < MOVEMENT_EPSILON && Math.abs(movementInfo.movementY) < MOVEMENT_EPSILON) {
|
|
1301
|
-
return { movementInfo: null, hasMoved: existing.hasMoved };
|
|
1302
|
-
} else {
|
|
1303
|
-
existing.hasMoved = true;
|
|
1304
|
-
return { movementInfo, hasMoved: existing.hasMoved };
|
|
1305
|
-
}
|
|
1306
|
-
};
|
|
1307
|
-
|
|
1308
|
-
// src/cubing/twisty/views/3D/RendererPool.ts
|
|
1309
|
-
var renderers = [];
|
|
1310
|
-
async function renderPooled(width, height, canvas, scene, camera) {
|
|
1311
|
-
if (width === 0 || height === 0) {
|
|
1312
|
-
return;
|
|
1313
|
-
}
|
|
1314
|
-
if (renderers.length === 0) {
|
|
1315
|
-
renderers.push(newRenderer());
|
|
1316
|
-
}
|
|
1317
|
-
const renderer = await renderers[0];
|
|
1318
|
-
renderer.setSize(width, height);
|
|
1319
|
-
renderer.render(scene, camera);
|
|
1320
|
-
const context = canvas.getContext("2d");
|
|
1321
|
-
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
1322
|
-
context.drawImage(renderer.domElement, 0, 0);
|
|
1323
|
-
}
|
|
1324
|
-
async function newRenderer() {
|
|
1325
|
-
const rendererConstructor = (await THREEJS).WebGLRenderer;
|
|
1326
|
-
const renderer = new rendererConstructor({
|
|
1327
|
-
antialias: true,
|
|
1328
|
-
alpha: true
|
|
1329
|
-
});
|
|
1330
|
-
renderer.setPixelRatio(pixelRatio());
|
|
1331
|
-
return renderer;
|
|
1332
|
-
}
|
|
1333
|
-
|
|
1334
|
-
// src/cubing/twisty/views/3D/TwistyOrbitControls.ts
|
|
1335
|
-
var INERTIA_DEFAULT = true;
|
|
1336
|
-
var INERTIA_DURATION_MS = 500;
|
|
1337
|
-
var INERTIA_TIMEOUT_MS = 50;
|
|
1338
|
-
var VERTICAL_MOVEMENT_BASE_SCALE = 0.75;
|
|
1339
|
-
function momentumScale(progress) {
|
|
1340
|
-
return (Math.exp(1 - progress) - (1 - progress)) / (1 - Math.E) + 1;
|
|
1341
|
-
}
|
|
1342
|
-
var Inertia = class {
|
|
1343
|
-
constructor(startTimestamp, momentumX, momentumY, callback) {
|
|
1344
|
-
this.startTimestamp = startTimestamp;
|
|
1345
|
-
this.momentumX = momentumX;
|
|
1346
|
-
this.momentumY = momentumY;
|
|
1347
|
-
this.callback = callback;
|
|
1348
|
-
this.scheduler = new RenderScheduler(this.render.bind(this));
|
|
1349
|
-
this.scheduler.requestAnimFrame();
|
|
1350
|
-
this.lastTimestamp = startTimestamp;
|
|
1351
|
-
}
|
|
1352
|
-
render(now) {
|
|
1353
|
-
const progressBefore = (this.lastTimestamp - this.startTimestamp) / INERTIA_DURATION_MS;
|
|
1354
|
-
const progressAfter = Math.min(1, (now - this.startTimestamp) / INERTIA_DURATION_MS);
|
|
1355
|
-
if (progressBefore === 0 && progressAfter > INERTIA_TIMEOUT_MS / INERTIA_DURATION_MS) {
|
|
1356
|
-
return;
|
|
1357
|
-
}
|
|
1358
|
-
const delta = momentumScale(progressAfter) - momentumScale(progressBefore);
|
|
1359
|
-
this.callback(this.momentumX * delta * 1e3, this.momentumY * delta * 1e3);
|
|
1360
|
-
if (progressAfter < 1) {
|
|
1361
|
-
this.scheduler.requestAnimFrame();
|
|
1362
|
-
}
|
|
1363
|
-
this.lastTimestamp = now;
|
|
1364
|
-
}
|
|
1365
|
-
};
|
|
1366
|
-
var TwistyOrbitControls = class {
|
|
1367
|
-
constructor(model, mirror, canvas, dragTracker) {
|
|
1368
|
-
this.model = model;
|
|
1369
|
-
this.mirror = mirror;
|
|
1370
|
-
this.canvas = canvas;
|
|
1371
|
-
this.dragTracker = dragTracker;
|
|
1372
|
-
this.experimentalInertia = INERTIA_DEFAULT;
|
|
1373
|
-
this.onMovementBound = this.onMovement.bind(this);
|
|
1374
|
-
this.experimentalHasBeenMoved = false;
|
|
1375
|
-
this.dragTracker.addEventListener("move", this.onMove.bind(this));
|
|
1376
|
-
this.dragTracker.addEventListener("up", this.onUp.bind(this));
|
|
1377
|
-
}
|
|
1378
|
-
temperMovement(f) {
|
|
1379
|
-
return Math.sign(f) * Math.log(Math.abs(f * 10) + 1) / 6;
|
|
1380
|
-
}
|
|
1381
|
-
onMove(e) {
|
|
1382
|
-
var _a;
|
|
1383
|
-
(_a = e.detail).attachedInfo ?? (_a.attachedInfo = {});
|
|
1384
|
-
const { temperedX, temperedY } = this.onMovement(e.detail.movementX, e.detail.movementY);
|
|
1385
|
-
const attachedInfo = e.detail.attachedInfo;
|
|
1386
|
-
attachedInfo.lastTemperedX = temperedX * 10;
|
|
1387
|
-
attachedInfo.lastTemperedY = temperedY * 10;
|
|
1388
|
-
attachedInfo.timestamp = e.timeStamp;
|
|
1389
|
-
}
|
|
1390
|
-
onMovement(movementX, movementY) {
|
|
1391
|
-
const scale = this.mirror ? -1 : 1;
|
|
1392
|
-
const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);
|
|
1393
|
-
const temperedX = this.temperMovement(movementX / minDim);
|
|
1394
|
-
const temperedY = this.temperMovement(movementY / minDim * VERTICAL_MOVEMENT_BASE_SCALE);
|
|
1395
|
-
this.model.twistySceneModel.orbitCoordinatesRequest.set((async () => {
|
|
1396
|
-
const prevCoords = await this.model.twistySceneModel.orbitCoordinates.get();
|
|
1397
|
-
const newCoords = {
|
|
1398
|
-
latitude: prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,
|
|
1399
|
-
longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN
|
|
1400
|
-
};
|
|
1401
|
-
return newCoords;
|
|
1402
|
-
})());
|
|
1403
|
-
return { temperedX, temperedY };
|
|
1404
|
-
}
|
|
1405
|
-
onUp(e) {
|
|
1406
|
-
e.preventDefault();
|
|
1407
|
-
if ("lastTemperedX" in e.detail.attachedInfo && "lastTemperedY" in e.detail.attachedInfo && "timestamp" in e.detail.attachedInfo && e.timeStamp - e.detail.attachedInfo.timestamp < 60) {
|
|
1408
|
-
new Inertia(e.timeStamp, e.detail.attachedInfo.lastTemperedX, e.detail.attachedInfo.lastTemperedY, this.onMovementBound);
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
};
|
|
1412
|
-
|
|
1413
|
-
// src/cubing/twisty/views/3D/Twisty3DVantage.ts
|
|
1414
|
-
var SHOW_STATS = false;
|
|
1415
|
-
function debugShowRenderStats(enable) {
|
|
1416
|
-
SHOW_STATS = enable;
|
|
1417
|
-
}
|
|
1418
|
-
async function setCameraFromOrbitCoordinates(camera, orbitCoordinates, backView = false) {
|
|
1419
|
-
const spherical = new (await THREEJS).Spherical(orbitCoordinates.distance, (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN, ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN);
|
|
1420
|
-
spherical.makeSafe();
|
|
1421
|
-
camera.position.setFromSpherical(spherical);
|
|
1422
|
-
camera.lookAt(0, 0, 0);
|
|
1423
|
-
}
|
|
1424
|
-
var shareAllNewRenderers = null;
|
|
1425
|
-
function experimentalForceNewRendererSharing(share) {
|
|
1426
|
-
shareAllNewRenderers = share;
|
|
1427
|
-
}
|
|
1428
|
-
var dedicatedRenderersSoFar = 0;
|
|
1429
|
-
var DEFAULT_MAX_DEDICATED_RENDERERS = 2;
|
|
1430
|
-
function shareRenderer() {
|
|
1431
|
-
if (shareAllNewRenderers !== null) {
|
|
1432
|
-
if (!shareAllNewRenderers) {
|
|
1433
|
-
dedicatedRenderersSoFar++;
|
|
1434
|
-
}
|
|
1435
|
-
return shareAllNewRenderers;
|
|
1436
|
-
}
|
|
1437
|
-
if (dedicatedRenderersSoFar < DEFAULT_MAX_DEDICATED_RENDERERS) {
|
|
1438
|
-
dedicatedRenderersSoFar++;
|
|
1439
|
-
return false;
|
|
1440
|
-
} else {
|
|
1441
|
-
return true;
|
|
1442
|
-
}
|
|
1443
|
-
}
|
|
1444
|
-
var _setupBasicPresses, setupBasicPresses_fn, _onResizeStaleDropper, _width, _height, _onResize, onResize_fn, _cachedRenderer, _cachedCanvas, _cachedDragTracker, _dragTracker, dragTracker_fn, _cachedCamera, _cachedOrbitControls, _disconnectionFunctions, _experimentalNextRenderFinishedCallback, _scheduler;
|
|
1445
|
-
var Twisty3DVantage = class extends ManagedCustomElement {
|
|
1446
|
-
constructor(model, scene, options) {
|
|
1447
|
-
super();
|
|
1448
|
-
this.model = model;
|
|
1449
|
-
this.options = options;
|
|
1450
|
-
__privateAdd(this, _setupBasicPresses);
|
|
1451
|
-
__privateAdd(this, _onResize);
|
|
1452
|
-
__privateAdd(this, _dragTracker);
|
|
1453
|
-
this.scene = null;
|
|
1454
|
-
this.stats = null;
|
|
1455
|
-
this.rendererIsShared = shareRenderer();
|
|
1456
|
-
this.loadingElement = null;
|
|
1457
|
-
__privateAdd(this, _onResizeStaleDropper, new StaleDropper());
|
|
1458
|
-
__privateAdd(this, _width, 0);
|
|
1459
|
-
__privateAdd(this, _height, 0);
|
|
1460
|
-
__privateAdd(this, _cachedRenderer, null);
|
|
1461
|
-
__privateAdd(this, _cachedCanvas, null);
|
|
1462
|
-
__privateAdd(this, _cachedDragTracker, null);
|
|
1463
|
-
__privateAdd(this, _cachedCamera, null);
|
|
1464
|
-
__privateAdd(this, _cachedOrbitControls, null);
|
|
1465
|
-
__privateAdd(this, _disconnectionFunctions, []);
|
|
1466
|
-
__privateAdd(this, _experimentalNextRenderFinishedCallback, null);
|
|
1467
|
-
__privateAdd(this, _scheduler, new RenderScheduler(this.render.bind(this)));
|
|
1468
|
-
this.scene = scene ?? null;
|
|
1469
|
-
this.loadingElement = this.addElement(document.createElement("div"));
|
|
1470
|
-
this.loadingElement.classList.add("loading");
|
|
1471
|
-
if (SHOW_STATS) {
|
|
1472
|
-
this.stats = new Stats();
|
|
1473
|
-
this.stats.dom.style.position = "absolute";
|
|
1474
|
-
this.contentWrapper.appendChild(this.stats.dom);
|
|
1475
|
-
}
|
|
1476
|
-
}
|
|
1477
|
-
async connectedCallback() {
|
|
1478
|
-
this.addCSS(twisty3DVantageCSS);
|
|
1479
|
-
this.addElement((await this.canvasInfo()).canvas);
|
|
1480
|
-
__privateMethod(this, _onResize, onResize_fn).call(this);
|
|
1481
|
-
const observer = new ResizeObserver(__privateMethod(this, _onResize, onResize_fn).bind(this));
|
|
1482
|
-
observer.observe(this.contentWrapper);
|
|
1483
|
-
this.orbitControls();
|
|
1484
|
-
__privateMethod(this, _setupBasicPresses, setupBasicPresses_fn).call(this);
|
|
1485
|
-
this.scheduleRender();
|
|
1486
|
-
}
|
|
1487
|
-
async clearCanvas() {
|
|
1488
|
-
if (this.rendererIsShared) {
|
|
1489
|
-
const canvasInfo = await this.canvasInfo();
|
|
1490
|
-
canvasInfo.context.clearRect(0, 0, canvasInfo.canvas.width, canvasInfo.canvas.height);
|
|
1491
|
-
} else {
|
|
1492
|
-
const renderer = await this.renderer();
|
|
1493
|
-
const context = renderer.getContext();
|
|
1494
|
-
context.clear(context.COLOR_BUFFER_BIT);
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
async renderer() {
|
|
1498
|
-
if (this.rendererIsShared) {
|
|
1499
|
-
throw new Error("renderer expected to be shared.");
|
|
1500
|
-
}
|
|
1501
|
-
return __privateGet(this, _cachedRenderer) ?? __privateSet(this, _cachedRenderer, newRenderer());
|
|
1502
|
-
}
|
|
1503
|
-
async canvasInfo() {
|
|
1504
|
-
return __privateGet(this, _cachedCanvas) ?? __privateSet(this, _cachedCanvas, (async () => {
|
|
1505
|
-
let canvas;
|
|
1506
|
-
if (this.rendererIsShared) {
|
|
1507
|
-
canvas = this.addElement(document.createElement("canvas"));
|
|
1508
|
-
} else {
|
|
1509
|
-
const renderer = await this.renderer();
|
|
1510
|
-
canvas = this.addElement(renderer.domElement);
|
|
1511
|
-
}
|
|
1512
|
-
this.loadingElement?.remove();
|
|
1513
|
-
const context = canvas.getContext("2d");
|
|
1514
|
-
return { canvas, context };
|
|
1515
|
-
})());
|
|
1516
|
-
}
|
|
1517
|
-
async camera() {
|
|
1518
|
-
return __privateGet(this, _cachedCamera) ?? __privateSet(this, _cachedCamera, (async () => {
|
|
1519
|
-
const camera = new (await THREEJS).PerspectiveCamera(20, 1, 0.1, 20);
|
|
1520
|
-
camera.position.copy(new (await THREEJS).Vector3(2, 4, 4).multiplyScalar(this.options?.backView ? -1 : 1));
|
|
1521
|
-
camera.lookAt(0, 0, 0);
|
|
1522
|
-
return camera;
|
|
1523
|
-
})());
|
|
1524
|
-
}
|
|
1525
|
-
async orbitControls() {
|
|
1526
|
-
return __privateGet(this, _cachedOrbitControls) ?? __privateSet(this, _cachedOrbitControls, (async () => {
|
|
1527
|
-
const orbitControls = new TwistyOrbitControls(this.model, !!this.options?.backView, (await this.canvasInfo()).canvas, await __privateMethod(this, _dragTracker, dragTracker_fn).call(this));
|
|
1528
|
-
if (this.model) {
|
|
1529
|
-
this.addListener(this.model.twistySceneModel.orbitCoordinates, async (orbitCoordinates) => {
|
|
1530
|
-
const camera = await this.camera();
|
|
1531
|
-
setCameraFromOrbitCoordinates(camera, orbitCoordinates, this.options?.backView);
|
|
1532
|
-
this.scheduleRender();
|
|
1533
|
-
});
|
|
1534
|
-
}
|
|
1535
|
-
return orbitControls;
|
|
1536
|
-
})());
|
|
1537
|
-
}
|
|
1538
|
-
addListener(prop, listener) {
|
|
1539
|
-
prop.addFreshListener(listener);
|
|
1540
|
-
__privateGet(this, _disconnectionFunctions).push(() => {
|
|
1541
|
-
prop.removeFreshListener(listener);
|
|
1542
|
-
});
|
|
1543
|
-
}
|
|
1544
|
-
disconnect() {
|
|
1545
|
-
for (const fn of __privateGet(this, _disconnectionFunctions)) {
|
|
1546
|
-
fn();
|
|
1547
|
-
}
|
|
1548
|
-
__privateSet(this, _disconnectionFunctions, []);
|
|
1549
|
-
}
|
|
1550
|
-
experimentalNextRenderFinishedCallback(callback) {
|
|
1551
|
-
__privateSet(this, _experimentalNextRenderFinishedCallback, callback);
|
|
1552
|
-
}
|
|
1553
|
-
async render() {
|
|
1554
|
-
var _a;
|
|
1555
|
-
if (!this.scene) {
|
|
1556
|
-
throw new Error("Attempted to render without a scene");
|
|
1557
|
-
}
|
|
1558
|
-
this.stats?.begin();
|
|
1559
|
-
const [scene, camera, canvas] = await Promise.all([
|
|
1560
|
-
this.scene.scene(),
|
|
1561
|
-
this.camera(),
|
|
1562
|
-
this.canvasInfo()
|
|
1563
|
-
]);
|
|
1564
|
-
if (this.rendererIsShared) {
|
|
1565
|
-
renderPooled(__privateGet(this, _width), __privateGet(this, _height), canvas.canvas, scene, camera);
|
|
1566
|
-
} else {
|
|
1567
|
-
(await this.renderer()).render(scene, camera);
|
|
1568
|
-
}
|
|
1569
|
-
this.stats?.end();
|
|
1570
|
-
(_a = __privateGet(this, _experimentalNextRenderFinishedCallback)) == null ? void 0 : _a.call(this);
|
|
1571
|
-
__privateSet(this, _experimentalNextRenderFinishedCallback, null);
|
|
1572
|
-
}
|
|
1573
|
-
scheduleRender() {
|
|
1574
|
-
__privateGet(this, _scheduler).requestAnimFrame();
|
|
1575
|
-
}
|
|
1576
|
-
};
|
|
1577
|
-
_setupBasicPresses = new WeakSet();
|
|
1578
|
-
setupBasicPresses_fn = async function() {
|
|
1579
|
-
const dragTracker = await __privateMethod(this, _dragTracker, dragTracker_fn).call(this);
|
|
1580
|
-
dragTracker.addEventListener("press", async (e) => {
|
|
1581
|
-
const movePressInput = await this.model.twistySceneModel.movePressInput.get();
|
|
1582
|
-
if (movePressInput !== "basic") {
|
|
1583
|
-
return;
|
|
1584
|
-
}
|
|
1585
|
-
this.dispatchEvent(new CustomEvent("press", {
|
|
1586
|
-
detail: {
|
|
1587
|
-
pressInfo: e.detail,
|
|
1588
|
-
cameraPromise: this.camera()
|
|
1589
|
-
}
|
|
1590
|
-
}));
|
|
1591
|
-
});
|
|
1592
|
-
};
|
|
1593
|
-
_onResizeStaleDropper = new WeakMap();
|
|
1594
|
-
_width = new WeakMap();
|
|
1595
|
-
_height = new WeakMap();
|
|
1596
|
-
_onResize = new WeakSet();
|
|
1597
|
-
onResize_fn = async function() {
|
|
1598
|
-
const camera = await __privateGet(this, _onResizeStaleDropper).queue(this.camera());
|
|
1599
|
-
const w = this.contentWrapper.clientWidth;
|
|
1600
|
-
const h = this.contentWrapper.clientHeight;
|
|
1601
|
-
__privateSet(this, _width, w);
|
|
1602
|
-
__privateSet(this, _height, h);
|
|
1603
|
-
const off = 0;
|
|
1604
|
-
let yoff = 0;
|
|
1605
|
-
let excess = 0;
|
|
1606
|
-
if (h > w) {
|
|
1607
|
-
excess = h - w;
|
|
1608
|
-
yoff = -Math.floor(0.5 * excess);
|
|
1609
|
-
}
|
|
1610
|
-
camera.aspect = w / h;
|
|
1611
|
-
camera.setViewOffset(w, h - excess, off, yoff, w, h);
|
|
1612
|
-
camera.updateProjectionMatrix();
|
|
1613
|
-
this.clearCanvas();
|
|
1614
|
-
if (this.rendererIsShared) {
|
|
1615
|
-
const canvasInfo = await this.canvasInfo();
|
|
1616
|
-
canvasInfo.canvas.width = w * pixelRatio();
|
|
1617
|
-
canvasInfo.canvas.height = h * pixelRatio();
|
|
1618
|
-
canvasInfo.canvas.style.width = w.toString();
|
|
1619
|
-
canvasInfo.canvas.style.height = h.toString();
|
|
1620
|
-
} else {
|
|
1621
|
-
const renderer = await this.renderer();
|
|
1622
|
-
renderer.setSize(w, h, true);
|
|
1623
|
-
}
|
|
1624
|
-
this.scheduleRender();
|
|
1625
|
-
};
|
|
1626
|
-
_cachedRenderer = new WeakMap();
|
|
1627
|
-
_cachedCanvas = new WeakMap();
|
|
1628
|
-
_cachedDragTracker = new WeakMap();
|
|
1629
|
-
_dragTracker = new WeakSet();
|
|
1630
|
-
dragTracker_fn = async function() {
|
|
1631
|
-
return __privateGet(this, _cachedDragTracker) ?? __privateSet(this, _cachedDragTracker, (async () => {
|
|
1632
|
-
const dragTracker = new DragTracker((await this.canvasInfo()).canvas);
|
|
1633
|
-
this.model?.twistySceneModel.dragInput.addFreshListener((dragInputMode) => {
|
|
1634
|
-
let dragInputEnabled = false;
|
|
1635
|
-
switch (dragInputMode) {
|
|
1636
|
-
case "auto":
|
|
1637
|
-
dragTracker.start();
|
|
1638
|
-
dragInputEnabled = true;
|
|
1639
|
-
break;
|
|
1640
|
-
case "none":
|
|
1641
|
-
dragTracker.stop();
|
|
1642
|
-
break;
|
|
1643
|
-
}
|
|
1644
|
-
this.contentWrapper.classList.toggle("drag-input-enabled", dragInputEnabled);
|
|
1645
|
-
});
|
|
1646
|
-
return dragTracker;
|
|
1647
|
-
})());
|
|
1648
|
-
};
|
|
1649
|
-
_cachedCamera = new WeakMap();
|
|
1650
|
-
_cachedOrbitControls = new WeakMap();
|
|
1651
|
-
_disconnectionFunctions = new WeakMap();
|
|
1652
|
-
_experimentalNextRenderFinishedCallback = new WeakMap();
|
|
1653
|
-
_scheduler = new WeakMap();
|
|
1654
|
-
customElementsShim.define("twisty-3d-vantage", Twisty3DVantage);
|
|
1655
1022
|
|
|
1656
1023
|
// src/cubing/twisty/views/3D/Twisty3DSceneWrapper.ts
|
|
1657
|
-
var _backViewClassListManager, _freshListenerManager5, _backViewVantage, _cachedScene2, _vantages, _currentTwisty3DPuzzleWrapper, _initialWrapperTracker, _twisty3DStaleDropper;
|
|
1658
1024
|
var Twisty3DSceneWrapper = class extends ManagedCustomElement {
|
|
1659
1025
|
constructor(model) {
|
|
1660
1026
|
super();
|
|
1661
1027
|
this.model = model;
|
|
1662
|
-
__privateAdd(this, _backViewClassListManager, new ClassListManager(this, "back-view-", [
|
|
1663
|
-
"auto",
|
|
1664
|
-
"none",
|
|
1665
|
-
"side-by-side",
|
|
1666
|
-
"top-right"
|
|
1667
|
-
]));
|
|
1668
|
-
__privateAdd(this, _freshListenerManager5, new FreshListenerManager());
|
|
1669
|
-
__privateAdd(this, _backViewVantage, null);
|
|
1670
|
-
__privateAdd(this, _cachedScene2, void 0);
|
|
1671
|
-
__privateAdd(this, _vantages, /* @__PURE__ */ new Set());
|
|
1672
|
-
__privateAdd(this, _currentTwisty3DPuzzleWrapper, null);
|
|
1673
|
-
__privateAdd(this, _initialWrapperTracker, new InitialValueTracker());
|
|
1674
|
-
__privateAdd(this, _twisty3DStaleDropper, new StaleDropper());
|
|
1675
1028
|
}
|
|
1029
|
+
#backViewClassListManager = new ClassListManager(this, "back-view-", [
|
|
1030
|
+
"auto",
|
|
1031
|
+
"none",
|
|
1032
|
+
"side-by-side",
|
|
1033
|
+
"top-right"
|
|
1034
|
+
]);
|
|
1035
|
+
#freshListenerManager = new FreshListenerManager();
|
|
1676
1036
|
disconnect() {
|
|
1677
|
-
|
|
1037
|
+
this.#freshListenerManager.disconnect();
|
|
1678
1038
|
}
|
|
1679
1039
|
async connectedCallback() {
|
|
1680
1040
|
this.addCSS(twistyViewerWrapperCSS);
|
|
1681
1041
|
const vantage = new Twisty3DVantage(this.model, this);
|
|
1682
1042
|
this.addVantage(vantage);
|
|
1683
1043
|
if (this.model) {
|
|
1684
|
-
|
|
1685
|
-
|
|
1044
|
+
this.#freshListenerManager.addMultiListener(
|
|
1045
|
+
[this.model.puzzleLoader, this.model.visualizationStrategy],
|
|
1046
|
+
this.onPuzzle.bind(this)
|
|
1047
|
+
);
|
|
1048
|
+
this.#freshListenerManager.addListener(
|
|
1049
|
+
this.model.backView,
|
|
1050
|
+
this.onBackView.bind(this)
|
|
1051
|
+
);
|
|
1686
1052
|
}
|
|
1687
1053
|
this.scheduleRender();
|
|
1688
1054
|
}
|
|
1055
|
+
#backViewVantage = null;
|
|
1689
1056
|
setBackView(backView) {
|
|
1690
1057
|
const shouldHaveBackView = ["side-by-side", "top-right"].includes(backView);
|
|
1691
|
-
const hasBackView =
|
|
1692
|
-
|
|
1058
|
+
const hasBackView = this.#backViewVantage !== null;
|
|
1059
|
+
this.#backViewClassListManager.setValue(backView);
|
|
1693
1060
|
if (shouldHaveBackView) {
|
|
1694
1061
|
if (!hasBackView) {
|
|
1695
|
-
|
|
1062
|
+
this.#backViewVantage = new Twisty3DVantage(this.model, this, {
|
|
1696
1063
|
backView: true
|
|
1697
|
-
})
|
|
1698
|
-
this.addVantage(
|
|
1064
|
+
});
|
|
1065
|
+
this.addVantage(this.#backViewVantage);
|
|
1699
1066
|
this.scheduleRender();
|
|
1700
1067
|
}
|
|
1701
1068
|
} else {
|
|
1702
|
-
if (
|
|
1703
|
-
this.removeVantage(
|
|
1704
|
-
|
|
1069
|
+
if (this.#backViewVantage) {
|
|
1070
|
+
this.removeVantage(this.#backViewVantage);
|
|
1071
|
+
this.#backViewVantage = null;
|
|
1705
1072
|
}
|
|
1706
1073
|
}
|
|
1707
1074
|
}
|
|
@@ -1709,7 +1076,7 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
|
|
|
1709
1076
|
this.setBackView(backView);
|
|
1710
1077
|
}
|
|
1711
1078
|
async onPress(e) {
|
|
1712
|
-
const twisty3DPuzzleWrapper =
|
|
1079
|
+
const twisty3DPuzzleWrapper = this.#currentTwisty3DPuzzleWrapper;
|
|
1713
1080
|
if (!twisty3DPuzzleWrapper) {
|
|
1714
1081
|
console.info("no wrapper; skipping scene wrapper press!");
|
|
1715
1082
|
return;
|
|
@@ -1720,7 +1087,10 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
|
|
|
1720
1087
|
THREEJS
|
|
1721
1088
|
]);
|
|
1722
1089
|
const raycaster = new three.Raycaster();
|
|
1723
|
-
const mouse = new (await THREEJS).Vector2(
|
|
1090
|
+
const mouse = new (await THREEJS).Vector2(
|
|
1091
|
+
e.detail.pressInfo.normalizedX,
|
|
1092
|
+
e.detail.pressInfo.normalizedY
|
|
1093
|
+
);
|
|
1724
1094
|
raycaster.setFromCamera(mouse, camera);
|
|
1725
1095
|
return raycaster;
|
|
1726
1096
|
})();
|
|
@@ -1729,32 +1099,35 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
|
|
|
1729
1099
|
depth: e.detail.pressInfo.keys.ctrlOrMetaKey ? "rotation" : e.detail.pressInfo.keys.shiftKey ? "secondSlice" : "none"
|
|
1730
1100
|
});
|
|
1731
1101
|
}
|
|
1102
|
+
#cachedScene;
|
|
1732
1103
|
async scene() {
|
|
1733
|
-
return
|
|
1104
|
+
return this.#cachedScene ?? (this.#cachedScene = (async () => new (await THREEJS).Scene())());
|
|
1734
1105
|
}
|
|
1106
|
+
#vantages = /* @__PURE__ */ new Set();
|
|
1735
1107
|
addVantage(vantage) {
|
|
1736
1108
|
vantage.addEventListener("press", this.onPress.bind(this));
|
|
1737
|
-
|
|
1109
|
+
this.#vantages.add(vantage);
|
|
1738
1110
|
this.contentWrapper.appendChild(vantage);
|
|
1739
1111
|
}
|
|
1740
1112
|
removeVantage(vantage) {
|
|
1741
|
-
|
|
1113
|
+
this.#vantages.delete(vantage);
|
|
1742
1114
|
vantage.remove();
|
|
1743
1115
|
vantage.disconnect();
|
|
1744
|
-
|
|
1116
|
+
this.#currentTwisty3DPuzzleWrapper?.disconnect();
|
|
1745
1117
|
}
|
|
1746
1118
|
experimentalVantages() {
|
|
1747
|
-
return
|
|
1119
|
+
return this.#vantages.values();
|
|
1748
1120
|
}
|
|
1749
1121
|
scheduleRender() {
|
|
1750
|
-
for (const vantage of
|
|
1122
|
+
for (const vantage of this.#vantages) {
|
|
1751
1123
|
vantage.scheduleRender();
|
|
1752
1124
|
}
|
|
1753
1125
|
}
|
|
1126
|
+
#currentTwisty3DPuzzleWrapper = null;
|
|
1754
1127
|
async setCurrentTwisty3DPuzzleWrapper(scene, twisty3DPuzzleWrapper) {
|
|
1755
|
-
const old =
|
|
1128
|
+
const old = this.#currentTwisty3DPuzzleWrapper;
|
|
1756
1129
|
try {
|
|
1757
|
-
|
|
1130
|
+
this.#currentTwisty3DPuzzleWrapper = twisty3DPuzzleWrapper;
|
|
1758
1131
|
old?.disconnect();
|
|
1759
1132
|
scene.add(await twisty3DPuzzleWrapper.twisty3DPuzzle());
|
|
1760
1133
|
} finally {
|
|
@@ -1762,31 +1135,27 @@ var Twisty3DSceneWrapper = class extends ManagedCustomElement {
|
|
|
1762
1135
|
scene.remove(await old.twisty3DPuzzle());
|
|
1763
1136
|
}
|
|
1764
1137
|
}
|
|
1765
|
-
|
|
1138
|
+
this.#initialWrapperTracker.handleNewValue(twisty3DPuzzleWrapper);
|
|
1766
1139
|
}
|
|
1140
|
+
#initialWrapperTracker = new InitialValueTracker();
|
|
1767
1141
|
async experimentalTwisty3DPuzzleWrapper() {
|
|
1768
|
-
return
|
|
1142
|
+
return this.#currentTwisty3DPuzzleWrapper || this.#initialWrapperTracker.promise;
|
|
1769
1143
|
}
|
|
1144
|
+
#twisty3DStaleDropper = new StaleDropper();
|
|
1770
1145
|
async onPuzzle(inputs) {
|
|
1771
1146
|
if (inputs[1] === "2D") {
|
|
1772
1147
|
return;
|
|
1773
1148
|
}
|
|
1774
|
-
|
|
1775
|
-
const [scene, twisty3DPuzzleWrapper] = await
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1149
|
+
this.#currentTwisty3DPuzzleWrapper?.disconnect();
|
|
1150
|
+
const [scene, twisty3DPuzzleWrapper] = await this.#twisty3DStaleDropper.queue(
|
|
1151
|
+
Promise.all([
|
|
1152
|
+
this.scene(),
|
|
1153
|
+
new Twisty3DPuzzleWrapper(this.model, this, inputs[0], inputs[1])
|
|
1154
|
+
])
|
|
1155
|
+
);
|
|
1779
1156
|
this.setCurrentTwisty3DPuzzleWrapper(scene, twisty3DPuzzleWrapper);
|
|
1780
1157
|
}
|
|
1781
1158
|
};
|
|
1782
|
-
_backViewClassListManager = new WeakMap();
|
|
1783
|
-
_freshListenerManager5 = new WeakMap();
|
|
1784
|
-
_backViewVantage = new WeakMap();
|
|
1785
|
-
_cachedScene2 = new WeakMap();
|
|
1786
|
-
_vantages = new WeakMap();
|
|
1787
|
-
_currentTwisty3DPuzzleWrapper = new WeakMap();
|
|
1788
|
-
_initialWrapperTracker = new WeakMap();
|
|
1789
|
-
_twisty3DStaleDropper = new WeakMap();
|
|
1790
1159
|
customElementsShim.define("twisty-3d-scene-wrapper", Twisty3DSceneWrapper);
|
|
1791
1160
|
|
|
1792
1161
|
// src/cubing/twisty/views/control-panel/TwistyButtons.css.ts
|
|
@@ -2003,14 +1372,12 @@ var buttonCommands = {
|
|
|
2003
1372
|
"jump-to-end": true,
|
|
2004
1373
|
"twizzle-link": true
|
|
2005
1374
|
};
|
|
2006
|
-
var _onCommand, onCommand_fn;
|
|
2007
1375
|
var TwistyButtons = class extends ManagedCustomElement {
|
|
2008
1376
|
constructor(model, controller, fullscreenElement) {
|
|
2009
1377
|
super();
|
|
2010
1378
|
this.model = model;
|
|
2011
1379
|
this.controller = controller;
|
|
2012
1380
|
this.fullscreenElement = fullscreenElement;
|
|
2013
|
-
__privateAdd(this, _onCommand);
|
|
2014
1381
|
this.buttons = null;
|
|
2015
1382
|
}
|
|
2016
1383
|
connectedCallback() {
|
|
@@ -2019,12 +1386,48 @@ var TwistyButtons = class extends ManagedCustomElement {
|
|
|
2019
1386
|
for (const command in buttonCommands) {
|
|
2020
1387
|
const button = new TwistyButton();
|
|
2021
1388
|
buttons[command] = button;
|
|
2022
|
-
button.htmlButton.addEventListener(
|
|
1389
|
+
button.htmlButton.addEventListener(
|
|
1390
|
+
"click",
|
|
1391
|
+
() => this.#onCommand(command)
|
|
1392
|
+
);
|
|
2023
1393
|
this.addElement(button);
|
|
2024
1394
|
}
|
|
2025
1395
|
this.buttons = buttons;
|
|
2026
1396
|
this.model?.buttonAppearance.addFreshListener(this.update.bind(this));
|
|
2027
1397
|
}
|
|
1398
|
+
#onCommand(command) {
|
|
1399
|
+
switch (command) {
|
|
1400
|
+
case "fullscreen":
|
|
1401
|
+
this.onFullscreenButton();
|
|
1402
|
+
break;
|
|
1403
|
+
case "jump-to-start":
|
|
1404
|
+
this.controller?.jumpToStart({ flash: true });
|
|
1405
|
+
break;
|
|
1406
|
+
case "play-step-backwards":
|
|
1407
|
+
this.controller?.animationController.play({
|
|
1408
|
+
direction: -1 /* Backwards */,
|
|
1409
|
+
untilBoundary: "move" /* Move */
|
|
1410
|
+
});
|
|
1411
|
+
break;
|
|
1412
|
+
case "play-pause":
|
|
1413
|
+
this.controller?.togglePlay();
|
|
1414
|
+
break;
|
|
1415
|
+
case "play-step":
|
|
1416
|
+
this.controller?.animationController.play({
|
|
1417
|
+
direction: 1 /* Forwards */,
|
|
1418
|
+
untilBoundary: "move" /* Move */
|
|
1419
|
+
});
|
|
1420
|
+
break;
|
|
1421
|
+
case "jump-to-end":
|
|
1422
|
+
this.controller?.jumpToEnd({ flash: true });
|
|
1423
|
+
break;
|
|
1424
|
+
case "twizzle-link":
|
|
1425
|
+
this.controller?.visitTwizzleLink();
|
|
1426
|
+
break;
|
|
1427
|
+
default:
|
|
1428
|
+
throw new Error("Missing command");
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
2028
1431
|
async onFullscreenButton() {
|
|
2029
1432
|
if (!this.fullscreenElement) {
|
|
2030
1433
|
throw new Error("Attempted to go fullscreen without an element.");
|
|
@@ -2054,57 +1457,26 @@ var TwistyButtons = class extends ManagedCustomElement {
|
|
|
2054
1457
|
}
|
|
2055
1458
|
}
|
|
2056
1459
|
};
|
|
2057
|
-
_onCommand = new WeakSet();
|
|
2058
|
-
onCommand_fn = function(command) {
|
|
2059
|
-
switch (command) {
|
|
2060
|
-
case "fullscreen":
|
|
2061
|
-
this.onFullscreenButton();
|
|
2062
|
-
break;
|
|
2063
|
-
case "jump-to-start":
|
|
2064
|
-
this.controller?.jumpToStart({ flash: true });
|
|
2065
|
-
break;
|
|
2066
|
-
case "play-step-backwards":
|
|
2067
|
-
this.controller?.animationController.play({
|
|
2068
|
-
direction: -1 /* Backwards */,
|
|
2069
|
-
untilBoundary: "move" /* Move */
|
|
2070
|
-
});
|
|
2071
|
-
break;
|
|
2072
|
-
case "play-pause":
|
|
2073
|
-
this.controller?.togglePlay();
|
|
2074
|
-
break;
|
|
2075
|
-
case "play-step":
|
|
2076
|
-
this.controller?.animationController.play({
|
|
2077
|
-
direction: 1 /* Forwards */,
|
|
2078
|
-
untilBoundary: "move" /* Move */
|
|
2079
|
-
});
|
|
2080
|
-
break;
|
|
2081
|
-
case "jump-to-end":
|
|
2082
|
-
this.controller?.jumpToEnd({ flash: true });
|
|
2083
|
-
break;
|
|
2084
|
-
case "twizzle-link":
|
|
2085
|
-
this.controller?.visitTwizzleLink();
|
|
2086
|
-
break;
|
|
2087
|
-
default:
|
|
2088
|
-
throw new Error("Missing command");
|
|
2089
|
-
}
|
|
2090
|
-
};
|
|
2091
1460
|
customElementsShim.define("twisty-buttons", TwistyButtons);
|
|
2092
|
-
var _iconManager;
|
|
2093
1461
|
var TwistyButton = class extends ManagedCustomElement {
|
|
2094
1462
|
constructor() {
|
|
2095
1463
|
super(...arguments);
|
|
2096
1464
|
this.htmlButton = document.createElement("button");
|
|
2097
|
-
|
|
1465
|
+
this.#iconManager = new ClassListManager(
|
|
1466
|
+
this,
|
|
1467
|
+
"svg-",
|
|
1468
|
+
buttonIcons
|
|
1469
|
+
);
|
|
2098
1470
|
}
|
|
2099
1471
|
connectedCallback() {
|
|
2100
1472
|
this.addCSS(buttonCSS);
|
|
2101
1473
|
this.addElement(this.htmlButton);
|
|
2102
1474
|
}
|
|
1475
|
+
#iconManager;
|
|
2103
1476
|
setIcon(iconName) {
|
|
2104
|
-
|
|
1477
|
+
this.#iconManager.setValue(iconName);
|
|
2105
1478
|
}
|
|
2106
1479
|
};
|
|
2107
|
-
_iconManager = new WeakMap();
|
|
2108
1480
|
customElementsShim.define("twisty-button", TwistyButton);
|
|
2109
1481
|
|
|
2110
1482
|
// src/cubing/twisty/views/control-panel/TwistyScrubber.css.ts
|
|
@@ -2133,21 +1505,33 @@ input:not(:disabled) {
|
|
|
2133
1505
|
// src/cubing/twisty/views/control-panel/TwistyScrubber.ts
|
|
2134
1506
|
var SLOW_DOWN_SCRUBBING = false;
|
|
2135
1507
|
var isMouseDown = false;
|
|
2136
|
-
globalSafeDocument?.addEventListener(
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
1508
|
+
globalSafeDocument?.addEventListener(
|
|
1509
|
+
"mousedown",
|
|
1510
|
+
function(event) {
|
|
1511
|
+
if (event.which) {
|
|
1512
|
+
isMouseDown = true;
|
|
1513
|
+
}
|
|
1514
|
+
},
|
|
1515
|
+
true
|
|
1516
|
+
);
|
|
1517
|
+
globalSafeDocument?.addEventListener(
|
|
1518
|
+
"mouseup",
|
|
1519
|
+
function(event) {
|
|
1520
|
+
if (event.which) {
|
|
1521
|
+
isMouseDown = false;
|
|
1522
|
+
}
|
|
1523
|
+
},
|
|
1524
|
+
true
|
|
1525
|
+
);
|
|
2146
1526
|
var y = 0;
|
|
2147
1527
|
var clickNum = 0;
|
|
2148
|
-
globalSafeDocument?.addEventListener(
|
|
2149
|
-
|
|
2150
|
-
|
|
1528
|
+
globalSafeDocument?.addEventListener(
|
|
1529
|
+
"mousedown",
|
|
1530
|
+
() => {
|
|
1531
|
+
clickNum++;
|
|
1532
|
+
},
|
|
1533
|
+
false
|
|
1534
|
+
);
|
|
2151
1535
|
globalSafeDocument?.addEventListener("mousemove", onMouseUpdate, false);
|
|
2152
1536
|
globalSafeDocument?.addEventListener("mouseenter", onMouseUpdate, false);
|
|
2153
1537
|
function onMouseUpdate(e) {
|
|
@@ -2157,12 +1541,10 @@ var lastVal = 0;
|
|
|
2157
1541
|
var lastPreval = 0;
|
|
2158
1542
|
var scaling = false;
|
|
2159
1543
|
var currentClickNum = 0;
|
|
2160
|
-
var _inputElem;
|
|
2161
1544
|
var TwistyScrubber = class extends ManagedCustomElement {
|
|
2162
1545
|
constructor(model) {
|
|
2163
1546
|
super();
|
|
2164
1547
|
this.model = model;
|
|
2165
|
-
__privateAdd(this, _inputElem, null);
|
|
2166
1548
|
}
|
|
2167
1549
|
async onDetailedTimelineInfo(detailedTimelineInfo) {
|
|
2168
1550
|
const inputElem = await this.inputElem();
|
|
@@ -2175,12 +1557,15 @@ var TwistyScrubber = class extends ManagedCustomElement {
|
|
|
2175
1557
|
this.addCSS(twistyScrubberCSS);
|
|
2176
1558
|
this.addElement(await this.inputElem());
|
|
2177
1559
|
}
|
|
1560
|
+
#inputElem = null;
|
|
2178
1561
|
async inputElem() {
|
|
2179
|
-
return
|
|
1562
|
+
return this.#inputElem ?? (this.#inputElem = (async () => {
|
|
2180
1563
|
const elem = document.createElement("input");
|
|
2181
1564
|
elem.type = "range";
|
|
2182
1565
|
elem.disabled = true;
|
|
2183
|
-
this.model?.detailedTimelineInfo.addFreshListener(
|
|
1566
|
+
this.model?.detailedTimelineInfo.addFreshListener(
|
|
1567
|
+
this.onDetailedTimelineInfo.bind(this)
|
|
1568
|
+
);
|
|
2184
1569
|
elem.addEventListener("input", this.onInput.bind(this));
|
|
2185
1570
|
return elem;
|
|
2186
1571
|
})());
|
|
@@ -2227,7 +1612,6 @@ var TwistyScrubber = class extends ManagedCustomElement {
|
|
|
2227
1612
|
}
|
|
2228
1613
|
}
|
|
2229
1614
|
};
|
|
2230
|
-
_inputElem = new WeakMap();
|
|
2231
1615
|
customElementsShim.define("twisty-scrubber", TwistyScrubber);
|
|
2232
1616
|
|
|
2233
1617
|
// src/cubing/twisty/views/screenshot.ts
|
|
@@ -2240,8 +1624,13 @@ async function screenshot(model, options) {
|
|
|
2240
1624
|
return new (await THREEJS).PerspectiveCamera(20, aspectRatio, 0.1, 20);
|
|
2241
1625
|
})());
|
|
2242
1626
|
const scene = new (await THREEJS).Scene();
|
|
2243
|
-
const twisty3DWrapper = new Twisty3DPuzzleWrapper(
|
|
2244
|
-
|
|
1627
|
+
const twisty3DWrapper = new Twisty3DPuzzleWrapper(
|
|
1628
|
+
model,
|
|
1629
|
+
{ scheduleRender: () => {
|
|
1630
|
+
} },
|
|
1631
|
+
await model.puzzleLoader.get(),
|
|
1632
|
+
await model.visualizationStrategy.get()
|
|
1633
|
+
);
|
|
2245
1634
|
await model.twistySceneModel.stickering.get();
|
|
2246
1635
|
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
2247
1636
|
await model.legacyPosition.get();
|
|
@@ -2451,9 +1840,13 @@ var AnchorTransformationProp = class extends TwistyPropDerived {
|
|
|
2451
1840
|
case "start":
|
|
2452
1841
|
return inputs.setupAlgTransformation;
|
|
2453
1842
|
case "end": {
|
|
2454
|
-
const algTransformation = inputs.indexer.transformationAtIndex(
|
|
1843
|
+
const algTransformation = inputs.indexer.transformationAtIndex(
|
|
1844
|
+
inputs.indexer.numAnimatedLeaves()
|
|
1845
|
+
);
|
|
2455
1846
|
const inverseAlgTransformation = algTransformation.invert();
|
|
2456
|
-
return inputs.setupAlgTransformation.applyTransformation(
|
|
1847
|
+
return inputs.setupAlgTransformation.applyTransformation(
|
|
1848
|
+
inverseAlgTransformation
|
|
1849
|
+
);
|
|
2457
1850
|
}
|
|
2458
1851
|
default:
|
|
2459
1852
|
throw new Error("Unimplemented!");
|
|
@@ -2476,12 +1869,24 @@ var CurrentLeavesSimplifiedProp = class extends TwistyPropDerived {
|
|
|
2476
1869
|
derive(inputs) {
|
|
2477
1870
|
return {
|
|
2478
1871
|
stateIndex: inputs.currentMoveInfo.stateIndex,
|
|
2479
|
-
movesFinishing: inputs.currentMoveInfo.movesFinishing.map(
|
|
2480
|
-
|
|
1872
|
+
movesFinishing: inputs.currentMoveInfo.movesFinishing.map(
|
|
1873
|
+
(currentMoveInfo) => currentMoveInfo.move
|
|
1874
|
+
),
|
|
1875
|
+
movesFinished: inputs.currentMoveInfo.movesFinished.map(
|
|
1876
|
+
(currentMoveInfo) => currentMoveInfo.move
|
|
1877
|
+
)
|
|
2481
1878
|
};
|
|
2482
1879
|
}
|
|
2483
1880
|
canReuse(v1, v2) {
|
|
2484
|
-
return v1.stateIndex === v2.stateIndex && arrayEqualsCompare(
|
|
1881
|
+
return v1.stateIndex === v2.stateIndex && arrayEqualsCompare(
|
|
1882
|
+
v1.movesFinishing,
|
|
1883
|
+
v2.movesFinishing,
|
|
1884
|
+
(m1, m2) => m1.isIdentical(m2)
|
|
1885
|
+
) && arrayEqualsCompare(
|
|
1886
|
+
v1.movesFinished,
|
|
1887
|
+
v2.movesFinished,
|
|
1888
|
+
(m1, m2) => m1.isIdentical(m2)
|
|
1889
|
+
);
|
|
2485
1890
|
}
|
|
2486
1891
|
};
|
|
2487
1892
|
|
|
@@ -2501,9 +1906,13 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
|
|
|
2501
1906
|
return currentMoveInfo;
|
|
2502
1907
|
}
|
|
2503
1908
|
if (inputs.indexer.currentMoveInfo) {
|
|
2504
|
-
return addCatchUpMove(
|
|
1909
|
+
return addCatchUpMove(
|
|
1910
|
+
inputs.indexer.currentMoveInfo(inputs.detailedTimelineInfo.timestamp)
|
|
1911
|
+
);
|
|
2505
1912
|
} else {
|
|
2506
|
-
const idx = inputs.indexer.timestampToIndex(
|
|
1913
|
+
const idx = inputs.indexer.timestampToIndex(
|
|
1914
|
+
inputs.detailedTimelineInfo.timestamp
|
|
1915
|
+
);
|
|
2507
1916
|
const currentMoveInfo = {
|
|
2508
1917
|
stateIndex: idx,
|
|
2509
1918
|
currentMoves: [],
|
|
@@ -2535,8 +1944,14 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
|
|
|
2535
1944
|
currentMoveInfo.movesFinishing.push(currentMove);
|
|
2536
1945
|
} else {
|
|
2537
1946
|
currentMoveInfo.currentMoves.push(currentMove);
|
|
2538
|
-
currentMoveInfo.latestStart = Math.max(
|
|
2539
|
-
|
|
1947
|
+
currentMoveInfo.latestStart = Math.max(
|
|
1948
|
+
currentMoveInfo.latestStart,
|
|
1949
|
+
start
|
|
1950
|
+
);
|
|
1951
|
+
currentMoveInfo.earliestEnd = Math.min(
|
|
1952
|
+
currentMoveInfo.earliestEnd,
|
|
1953
|
+
end
|
|
1954
|
+
);
|
|
2540
1955
|
}
|
|
2541
1956
|
}
|
|
2542
1957
|
return addCatchUpMove(currentMoveInfo);
|
|
@@ -2547,7 +1962,9 @@ var CurrentMoveInfoProp = class extends TwistyPropDerived {
|
|
|
2547
1962
|
// src/cubing/twisty/model/props/puzzle/state/CurrentStateProp.ts
|
|
2548
1963
|
var CurrentStateProp = class extends TwistyPropDerived {
|
|
2549
1964
|
derive(inputs) {
|
|
2550
|
-
let transformation = inputs.indexer.transformationAtIndex(
|
|
1965
|
+
let transformation = inputs.indexer.transformationAtIndex(
|
|
1966
|
+
inputs.currentLeavesSimplified.stateIndex
|
|
1967
|
+
);
|
|
2551
1968
|
transformation = inputs.anchoredStart.applyTransformation(transformation);
|
|
2552
1969
|
for (const finishingMove of inputs.currentLeavesSimplified.movesFinishing) {
|
|
2553
1970
|
transformation = transformation.applyMove(finishingMove);
|
|
@@ -2611,7 +2028,9 @@ var AlgDuration = class extends TraversalUp {
|
|
|
2611
2028
|
var SimpleAlgIndexer = class {
|
|
2612
2029
|
constructor(kpuzzle, alg) {
|
|
2613
2030
|
this.kpuzzle = kpuzzle;
|
|
2614
|
-
this.durationFn = new AlgDuration(
|
|
2031
|
+
this.durationFn = new AlgDuration(
|
|
2032
|
+
defaultDurationForAmount
|
|
2033
|
+
);
|
|
2615
2034
|
this.moves = new Alg(alg.experimentalExpand());
|
|
2616
2035
|
}
|
|
2617
2036
|
getAnimLeaf(index) {
|
|
@@ -2696,15 +2115,20 @@ var LocalSimulMoves = class extends TraversalUp {
|
|
|
2696
2115
|
return this.traverseAlg(alg);
|
|
2697
2116
|
}
|
|
2698
2117
|
}
|
|
2699
|
-
maxSimulDur = Math.max(
|
|
2118
|
+
maxSimulDur = Math.max(
|
|
2119
|
+
maxSimulDur,
|
|
2120
|
+
defaultDurationForAmount(moves[i].amount)
|
|
2121
|
+
);
|
|
2700
2122
|
}
|
|
2701
|
-
const localMovesWithRange = moves.map(
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2123
|
+
const localMovesWithRange = moves.map(
|
|
2124
|
+
(blockMove) => {
|
|
2125
|
+
return {
|
|
2126
|
+
animLeafAlgNode: blockMove,
|
|
2127
|
+
msUntilNext: 0,
|
|
2128
|
+
duration: maxSimulDur
|
|
2129
|
+
};
|
|
2130
|
+
}
|
|
2131
|
+
);
|
|
2708
2132
|
localMovesWithRange[localMovesWithRange.length - 1].msUntilNext = maxSimulDur;
|
|
2709
2133
|
return localMovesWithRange;
|
|
2710
2134
|
}
|
|
@@ -2772,18 +2196,22 @@ var LocalSimulMoves = class extends TraversalUp {
|
|
|
2772
2196
|
}
|
|
2773
2197
|
};
|
|
2774
2198
|
var localSimulMovesInstance = new LocalSimulMoves();
|
|
2775
|
-
var localSimulMoves = localSimulMovesInstance.traverseAlg.bind(
|
|
2199
|
+
var localSimulMoves = localSimulMovesInstance.traverseAlg.bind(
|
|
2200
|
+
localSimulMovesInstance
|
|
2201
|
+
);
|
|
2776
2202
|
function simulMoves(a) {
|
|
2777
2203
|
let timestamp = 0;
|
|
2778
|
-
const l = localSimulMoves(a).map(
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2204
|
+
const l = localSimulMoves(a).map(
|
|
2205
|
+
(localSimulMove) => {
|
|
2206
|
+
const leafWithRange = {
|
|
2207
|
+
animLeaf: localSimulMove.animLeafAlgNode,
|
|
2208
|
+
start: timestamp,
|
|
2209
|
+
end: timestamp + localSimulMove.duration
|
|
2210
|
+
};
|
|
2211
|
+
timestamp += localSimulMove.msUntilNext;
|
|
2212
|
+
return leafWithRange;
|
|
2213
|
+
}
|
|
2214
|
+
);
|
|
2787
2215
|
return l;
|
|
2788
2216
|
}
|
|
2789
2217
|
|
|
@@ -2864,7 +2292,10 @@ var SimultaneousMoveIndexer = class {
|
|
|
2864
2292
|
timestampToPosition(timestamp, startState) {
|
|
2865
2293
|
const currentMoveInfo = this.currentMoveInfo(timestamp);
|
|
2866
2294
|
let state = startState ?? this.kpuzzle.identityTransformation().toKState();
|
|
2867
|
-
for (const leafWithRange of this.animLeaves.slice(
|
|
2295
|
+
for (const leafWithRange of this.animLeaves.slice(
|
|
2296
|
+
0,
|
|
2297
|
+
currentMoveInfo.stateIndex
|
|
2298
|
+
)) {
|
|
2868
2299
|
const move = leafWithRange.animLeaf.as(Move);
|
|
2869
2300
|
if (move !== null) {
|
|
2870
2301
|
state = state.applyMove(move);
|
|
@@ -2879,7 +2310,10 @@ var SimultaneousMoveIndexer = class {
|
|
|
2879
2310
|
let windowEarliestTimestamp = Infinity;
|
|
2880
2311
|
for (const leafWithRange of this.animLeaves) {
|
|
2881
2312
|
if (leafWithRange.start <= timestamp && leafWithRange.end >= timestamp) {
|
|
2882
|
-
windowEarliestTimestamp = Math.min(
|
|
2313
|
+
windowEarliestTimestamp = Math.min(
|
|
2314
|
+
windowEarliestTimestamp,
|
|
2315
|
+
leafWithRange.start
|
|
2316
|
+
);
|
|
2883
2317
|
} else if (leafWithRange.start > timestamp) {
|
|
2884
2318
|
break;
|
|
2885
2319
|
}
|
|
@@ -2992,10 +2426,18 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
2992
2426
|
constructor(kpuzzle) {
|
|
2993
2427
|
super();
|
|
2994
2428
|
this.kpuzzle = kpuzzle;
|
|
2995
|
-
this.durationFn = new AlgDuration(
|
|
2429
|
+
this.durationFn = new AlgDuration(
|
|
2430
|
+
defaultDurationForAmount
|
|
2431
|
+
);
|
|
2996
2432
|
this.cache = {};
|
|
2997
2433
|
this.identity = kpuzzle.identityTransformation();
|
|
2998
|
-
this.dummyLeaf = new AlgWalkterDecoration(
|
|
2434
|
+
this.dummyLeaf = new AlgWalkterDecoration(
|
|
2435
|
+
0,
|
|
2436
|
+
0,
|
|
2437
|
+
this.identity,
|
|
2438
|
+
this.identity,
|
|
2439
|
+
[]
|
|
2440
|
+
);
|
|
2999
2441
|
}
|
|
3000
2442
|
traverseAlg(alg) {
|
|
3001
2443
|
let moveCount = 0;
|
|
@@ -3013,7 +2455,13 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
3013
2455
|
}
|
|
3014
2456
|
child.push(apd);
|
|
3015
2457
|
}
|
|
3016
|
-
return new AlgWalkterDecoration(
|
|
2458
|
+
return new AlgWalkterDecoration(
|
|
2459
|
+
moveCount,
|
|
2460
|
+
duration,
|
|
2461
|
+
transformation,
|
|
2462
|
+
transformation.invert(),
|
|
2463
|
+
child
|
|
2464
|
+
);
|
|
3017
2465
|
}
|
|
3018
2466
|
traverseGrouping(grouping) {
|
|
3019
2467
|
const dec = this.traverseAlg(grouping.alg);
|
|
@@ -3026,7 +2474,12 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
3026
2474
|
return r;
|
|
3027
2475
|
}
|
|
3028
2476
|
const transformation = this.kpuzzle.moveToTransformation(move);
|
|
3029
|
-
r = new AlgWalkterDecoration(
|
|
2477
|
+
r = new AlgWalkterDecoration(
|
|
2478
|
+
1,
|
|
2479
|
+
this.durationFn.traverseAlgNode(move),
|
|
2480
|
+
transformation,
|
|
2481
|
+
transformation.invert()
|
|
2482
|
+
);
|
|
3030
2483
|
this.cache[key] = r;
|
|
3031
2484
|
return r;
|
|
3032
2485
|
}
|
|
@@ -3036,7 +2489,13 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
3036
2489
|
const AB = decA.forward.applyTransformation(decB.forward);
|
|
3037
2490
|
const ApBp = decA.backward.applyTransformation(decB.backward);
|
|
3038
2491
|
const ABApBp = AB.applyTransformation(ApBp);
|
|
3039
|
-
const dec = new AlgWalkterDecoration(
|
|
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
|
+
);
|
|
3040
2499
|
return this.mult(dec, 1, [dec, decA, decB]);
|
|
3041
2500
|
}
|
|
3042
2501
|
traverseConjugate(conjugate) {
|
|
@@ -3044,14 +2503,25 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
3044
2503
|
const decB = this.traverseAlg(conjugate.B);
|
|
3045
2504
|
const AB = decA.forward.applyTransformation(decB.forward);
|
|
3046
2505
|
const ABAp = AB.applyTransformation(decA.backward);
|
|
3047
|
-
const dec = new AlgWalkterDecoration(
|
|
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
|
+
);
|
|
3048
2513
|
return this.mult(dec, 1, [dec, decA, decB]);
|
|
3049
2514
|
}
|
|
3050
2515
|
traversePause(pause) {
|
|
3051
2516
|
if (pause.experimentalNISSGrouping) {
|
|
3052
2517
|
return this.dummyLeaf;
|
|
3053
2518
|
}
|
|
3054
|
-
return new AlgWalkterDecoration(
|
|
2519
|
+
return new AlgWalkterDecoration(
|
|
2520
|
+
1,
|
|
2521
|
+
this.durationFn.traverseAlgNode(pause),
|
|
2522
|
+
this.identity,
|
|
2523
|
+
this.identity
|
|
2524
|
+
);
|
|
3055
2525
|
}
|
|
3056
2526
|
traverseNewline(_newline) {
|
|
3057
2527
|
return this.dummyLeaf;
|
|
@@ -3062,7 +2532,13 @@ var DecoratorConstructor = class extends TraversalUp {
|
|
|
3062
2532
|
mult(apd, n, child) {
|
|
3063
2533
|
const absn = Math.abs(n);
|
|
3064
2534
|
const st = apd.forward.selfMultiply(n);
|
|
3065
|
-
return new AlgWalkterDecoration(
|
|
2535
|
+
return new AlgWalkterDecoration(
|
|
2536
|
+
apd.moveCount * absn,
|
|
2537
|
+
apd.duration * absn,
|
|
2538
|
+
st,
|
|
2539
|
+
st.invert(),
|
|
2540
|
+
child
|
|
2541
|
+
);
|
|
3066
2542
|
}
|
|
3067
2543
|
};
|
|
3068
2544
|
var WalkerDown = class {
|
|
@@ -3116,8 +2592,14 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3116
2592
|
return false;
|
|
3117
2593
|
}
|
|
3118
2594
|
let i = wd.back ? alg.experimentalNumChildAlgNodes() - 1 : 0;
|
|
3119
|
-
for (const algNode of directedGenerator(
|
|
3120
|
-
|
|
2595
|
+
for (const algNode of directedGenerator(
|
|
2596
|
+
alg.childAlgNodes(),
|
|
2597
|
+
wd.back ? -1 /* Backwards */ : 1 /* Forwards */
|
|
2598
|
+
)) {
|
|
2599
|
+
if (this.traverseAlgNode(
|
|
2600
|
+
algNode,
|
|
2601
|
+
new WalkerDown(wd.apd.children[i], wd.back)
|
|
2602
|
+
)) {
|
|
3121
2603
|
return true;
|
|
3122
2604
|
}
|
|
3123
2605
|
i += wd.back ? -1 : 1;
|
|
@@ -3129,7 +2611,10 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3129
2611
|
return false;
|
|
3130
2612
|
}
|
|
3131
2613
|
const back = this.domult(wd, grouping.amount);
|
|
3132
|
-
return this.traverseAlg(
|
|
2614
|
+
return this.traverseAlg(
|
|
2615
|
+
grouping.alg,
|
|
2616
|
+
new WalkerDown(wd.apd.children[0], back)
|
|
2617
|
+
);
|
|
3133
2618
|
}
|
|
3134
2619
|
traverseMove(move, wd) {
|
|
3135
2620
|
if (!this.firstcheck(wd)) {
|
|
@@ -3146,9 +2631,30 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3146
2631
|
}
|
|
3147
2632
|
const back = this.domult(wd, 1);
|
|
3148
2633
|
if (back) {
|
|
3149
|
-
return this.traverseAlg(
|
|
2634
|
+
return this.traverseAlg(
|
|
2635
|
+
commutator.B,
|
|
2636
|
+
new WalkerDown(wd.apd.children[2], !back)
|
|
2637
|
+
) || this.traverseAlg(
|
|
2638
|
+
commutator.A,
|
|
2639
|
+
new WalkerDown(wd.apd.children[1], !back)
|
|
2640
|
+
) || this.traverseAlg(
|
|
2641
|
+
commutator.B,
|
|
2642
|
+
new WalkerDown(wd.apd.children[2], back)
|
|
2643
|
+
) || this.traverseAlg(commutator.A, new WalkerDown(wd.apd.children[1], back));
|
|
3150
2644
|
} else {
|
|
3151
|
-
return this.traverseAlg(
|
|
2645
|
+
return this.traverseAlg(
|
|
2646
|
+
commutator.A,
|
|
2647
|
+
new WalkerDown(wd.apd.children[1], back)
|
|
2648
|
+
) || this.traverseAlg(
|
|
2649
|
+
commutator.B,
|
|
2650
|
+
new WalkerDown(wd.apd.children[2], back)
|
|
2651
|
+
) || this.traverseAlg(
|
|
2652
|
+
commutator.A,
|
|
2653
|
+
new WalkerDown(wd.apd.children[1], !back)
|
|
2654
|
+
) || this.traverseAlg(
|
|
2655
|
+
commutator.B,
|
|
2656
|
+
new WalkerDown(wd.apd.children[2], !back)
|
|
2657
|
+
);
|
|
3152
2658
|
}
|
|
3153
2659
|
}
|
|
3154
2660
|
traverseConjugate(conjugate, wd) {
|
|
@@ -3157,9 +2663,21 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3157
2663
|
}
|
|
3158
2664
|
const back = this.domult(wd, 1);
|
|
3159
2665
|
if (back) {
|
|
3160
|
-
return this.traverseAlg(
|
|
2666
|
+
return this.traverseAlg(
|
|
2667
|
+
conjugate.A,
|
|
2668
|
+
new WalkerDown(wd.apd.children[1], !back)
|
|
2669
|
+
) || this.traverseAlg(
|
|
2670
|
+
conjugate.B,
|
|
2671
|
+
new WalkerDown(wd.apd.children[2], back)
|
|
2672
|
+
) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], back));
|
|
3161
2673
|
} else {
|
|
3162
|
-
return this.traverseAlg(
|
|
2674
|
+
return this.traverseAlg(
|
|
2675
|
+
conjugate.A,
|
|
2676
|
+
new WalkerDown(wd.apd.children[1], back)
|
|
2677
|
+
) || this.traverseAlg(
|
|
2678
|
+
conjugate.B,
|
|
2679
|
+
new WalkerDown(wd.apd.children[2], back)
|
|
2680
|
+
) || this.traverseAlg(conjugate.A, new WalkerDown(wd.apd.children[1], !back));
|
|
3163
2681
|
}
|
|
3164
2682
|
}
|
|
3165
2683
|
traversePause(pause, wd) {
|
|
@@ -3193,7 +2711,10 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3193
2711
|
amount = -amount;
|
|
3194
2712
|
}
|
|
3195
2713
|
const base = wd.apd.children[0];
|
|
3196
|
-
const full = Math.min(
|
|
2714
|
+
const full = Math.min(
|
|
2715
|
+
Math.floor((this.goali - this.i) / base.moveCount),
|
|
2716
|
+
Math.ceil((this.goaldur - this.dur) / base.duration - 1)
|
|
2717
|
+
);
|
|
3197
2718
|
if (full > 0) {
|
|
3198
2719
|
this.keepgoing(new WalkerDown(base, back), full);
|
|
3199
2720
|
}
|
|
@@ -3204,7 +2725,9 @@ var AlgWalker = class extends TraversalDownUp {
|
|
|
3204
2725
|
this.dur += mul * wd.apd.duration;
|
|
3205
2726
|
if (mul !== 1) {
|
|
3206
2727
|
if (wd.back) {
|
|
3207
|
-
this.st = this.st.applyTransformation(
|
|
2728
|
+
this.st = this.st.applyTransformation(
|
|
2729
|
+
wd.apd.backward.selfMultiply(mul)
|
|
2730
|
+
);
|
|
3208
2731
|
} else {
|
|
3209
2732
|
this.st = this.st.applyTransformation(wd.apd.forward.selfMultiply(mul));
|
|
3210
2733
|
}
|
|
@@ -3243,16 +2766,25 @@ var ChunkAlgs = class extends TraversalUp {
|
|
|
3243
2766
|
return chunkifyAlg(alg, Math.ceil(Math.sqrt(algLength)));
|
|
3244
2767
|
}
|
|
3245
2768
|
traverseGrouping(grouping) {
|
|
3246
|
-
return new Grouping(
|
|
2769
|
+
return new Grouping(
|
|
2770
|
+
this.traverseAlg(grouping.alg),
|
|
2771
|
+
grouping.amount
|
|
2772
|
+
);
|
|
3247
2773
|
}
|
|
3248
2774
|
traverseMove(move) {
|
|
3249
2775
|
return move;
|
|
3250
2776
|
}
|
|
3251
2777
|
traverseCommutator(commutator) {
|
|
3252
|
-
return new Conjugate(
|
|
2778
|
+
return new Conjugate(
|
|
2779
|
+
this.traverseAlg(commutator.A),
|
|
2780
|
+
this.traverseAlg(commutator.B)
|
|
2781
|
+
);
|
|
3253
2782
|
}
|
|
3254
2783
|
traverseConjugate(conjugate) {
|
|
3255
|
-
return new Conjugate(
|
|
2784
|
+
return new Conjugate(
|
|
2785
|
+
this.traverseAlg(conjugate.A),
|
|
2786
|
+
this.traverseAlg(conjugate.B)
|
|
2787
|
+
);
|
|
3256
2788
|
}
|
|
3257
2789
|
traversePause(pause) {
|
|
3258
2790
|
return pause;
|
|
@@ -3265,7 +2797,9 @@ var ChunkAlgs = class extends TraversalUp {
|
|
|
3265
2797
|
}
|
|
3266
2798
|
};
|
|
3267
2799
|
var chunkAlgsInstance = new ChunkAlgs();
|
|
3268
|
-
var chunkAlgs = chunkAlgsInstance.traverseAlg.bind(
|
|
2800
|
+
var chunkAlgs = chunkAlgsInstance.traverseAlg.bind(
|
|
2801
|
+
chunkAlgsInstance
|
|
2802
|
+
);
|
|
3269
2803
|
|
|
3270
2804
|
// src/cubing/twisty/controllers/indexer/tree/TreeAlgIndexer.ts
|
|
3271
2805
|
var TreeAlgIndexer = class {
|
|
@@ -3303,7 +2837,9 @@ var TreeAlgIndexer = class {
|
|
|
3303
2837
|
}
|
|
3304
2838
|
stateAtIndex(index, startState) {
|
|
3305
2839
|
this.walker.moveByIndex(index);
|
|
3306
|
-
return (startState ?? this.kpuzzle.startState()).applyTransformation(
|
|
2840
|
+
return (startState ?? this.kpuzzle.startState()).applyTransformation(
|
|
2841
|
+
this.walker.st
|
|
2842
|
+
);
|
|
3307
2843
|
}
|
|
3308
2844
|
transformationAtIndex(index) {
|
|
3309
2845
|
this.walker.moveByIndex(index);
|
|
@@ -3477,14 +3013,9 @@ var CoarseTimelineInfoProp = class extends TwistyPropDerived {
|
|
|
3477
3013
|
};
|
|
3478
3014
|
|
|
3479
3015
|
// src/cubing/twisty/model/props/timeline/DetailedTimelineInfoProp.ts
|
|
3480
|
-
var _requestedTimestampToMilliseconds, requestedTimestampToMilliseconds_fn;
|
|
3481
3016
|
var DetailedTimelineInfoProp = class extends TwistyPropDerived {
|
|
3482
|
-
constructor() {
|
|
3483
|
-
super(...arguments);
|
|
3484
|
-
__privateAdd(this, _requestedTimestampToMilliseconds);
|
|
3485
|
-
}
|
|
3486
3017
|
derive(inputs) {
|
|
3487
|
-
let timestamp =
|
|
3018
|
+
let timestamp = this.#requestedTimestampToMilliseconds(inputs);
|
|
3488
3019
|
let atStart = false;
|
|
3489
3020
|
let atEnd = false;
|
|
3490
3021
|
if (timestamp >= inputs.timeRange.end) {
|
|
@@ -3502,25 +3033,24 @@ var DetailedTimelineInfoProp = class extends TwistyPropDerived {
|
|
|
3502
3033
|
atEnd
|
|
3503
3034
|
};
|
|
3504
3035
|
}
|
|
3036
|
+
#requestedTimestampToMilliseconds(inputs) {
|
|
3037
|
+
switch (inputs.timestampRequest) {
|
|
3038
|
+
case "start":
|
|
3039
|
+
return inputs.timeRange.start;
|
|
3040
|
+
case "end":
|
|
3041
|
+
return inputs.timeRange.end;
|
|
3042
|
+
case "anchor":
|
|
3043
|
+
return inputs.setupAnchor === "start" ? inputs.timeRange.start : inputs.timeRange.end;
|
|
3044
|
+
case "opposite-anchor":
|
|
3045
|
+
return inputs.setupAnchor === "start" ? inputs.timeRange.end : inputs.timeRange.start;
|
|
3046
|
+
default:
|
|
3047
|
+
return inputs.timestampRequest;
|
|
3048
|
+
}
|
|
3049
|
+
}
|
|
3505
3050
|
canReuse(v1, v2) {
|
|
3506
3051
|
return v1.timestamp === v2.timestamp && v1.timeRange.start === v2.timeRange.start && v1.timeRange.end === v2.timeRange.end && v1.atStart === v2.atStart && v1.atEnd === v2.atEnd;
|
|
3507
3052
|
}
|
|
3508
3053
|
};
|
|
3509
|
-
_requestedTimestampToMilliseconds = new WeakSet();
|
|
3510
|
-
requestedTimestampToMilliseconds_fn = function(inputs) {
|
|
3511
|
-
switch (inputs.timestampRequest) {
|
|
3512
|
-
case "start":
|
|
3513
|
-
return inputs.timeRange.start;
|
|
3514
|
-
case "end":
|
|
3515
|
-
return inputs.timeRange.end;
|
|
3516
|
-
case "anchor":
|
|
3517
|
-
return inputs.setupAnchor === "start" ? inputs.timeRange.start : inputs.timeRange.end;
|
|
3518
|
-
case "opposite-anchor":
|
|
3519
|
-
return inputs.setupAnchor === "start" ? inputs.timeRange.end : inputs.timeRange.start;
|
|
3520
|
-
default:
|
|
3521
|
-
return inputs.timestampRequest;
|
|
3522
|
-
}
|
|
3523
|
-
};
|
|
3524
3054
|
|
|
3525
3055
|
// src/cubing/twisty/model/props/timeline/PlayingInfoProp.ts
|
|
3526
3056
|
var PlayingInfoProp = class extends TwistyPropSource {
|
|
@@ -3640,7 +3170,11 @@ var VisualizationStrategyProp = class extends TwistyPropDerived {
|
|
|
3640
3170
|
case "3D":
|
|
3641
3171
|
return "PG3D";
|
|
3642
3172
|
case "experimental-2D-LL":
|
|
3643
|
-
|
|
3173
|
+
if (inputs.puzzleID === "4x4x4") {
|
|
3174
|
+
return "experimental-2D-LL";
|
|
3175
|
+
} else {
|
|
3176
|
+
return "2D";
|
|
3177
|
+
}
|
|
3644
3178
|
default:
|
|
3645
3179
|
return inputs.visualizationRequest;
|
|
3646
3180
|
}
|
|
@@ -3672,7 +3206,12 @@ var SpriteProp = class extends TwistyPropDerived {
|
|
|
3672
3206
|
resolve(null);
|
|
3673
3207
|
};
|
|
3674
3208
|
try {
|
|
3675
|
-
(await loader()).load(
|
|
3209
|
+
(await loader()).load(
|
|
3210
|
+
textureURL.toString(),
|
|
3211
|
+
resolve,
|
|
3212
|
+
onLoadingError,
|
|
3213
|
+
onLoadingError
|
|
3214
|
+
);
|
|
3676
3215
|
} catch (e) {
|
|
3677
3216
|
onLoadingError();
|
|
3678
3217
|
}
|
|
@@ -3756,7 +3295,13 @@ var OrbitCoordinatesProp = class extends TwistyPropDerived {
|
|
|
3756
3295
|
if (inputs.orbitCoordinatesRequest === "auto") {
|
|
3757
3296
|
return defaultCameraOrbitCoordinates(inputs.puzzleID, inputs.strategy);
|
|
3758
3297
|
}
|
|
3759
|
-
const req = Object.assign(
|
|
3298
|
+
const req = Object.assign(
|
|
3299
|
+
Object.assign(
|
|
3300
|
+
{},
|
|
3301
|
+
defaultCameraOrbitCoordinates(inputs.puzzleID, inputs.strategy),
|
|
3302
|
+
inputs.orbitCoordinatesRequest
|
|
3303
|
+
)
|
|
3304
|
+
);
|
|
3760
3305
|
if (Math.abs(req.latitude) <= inputs.latitudeLimit) {
|
|
3761
3306
|
return req;
|
|
3762
3307
|
} else {
|
|
@@ -3882,10 +3427,13 @@ var TwistyPlayerModel = class {
|
|
|
3882
3427
|
this.title = new ArbitraryStringProp();
|
|
3883
3428
|
this.videoURL = new URLProp();
|
|
3884
3429
|
this.competitionID = new ArbitraryStringProp();
|
|
3885
|
-
this.puzzleLoader = new PuzzleLoaderProp(
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3430
|
+
this.puzzleLoader = new PuzzleLoaderProp(
|
|
3431
|
+
{
|
|
3432
|
+
puzzleIDRequest: this.puzzleIDRequest,
|
|
3433
|
+
puzzleDescriptionRequest: this.puzzleDescriptionRequest
|
|
3434
|
+
},
|
|
3435
|
+
this.userVisibleErrorTracker
|
|
3436
|
+
);
|
|
3889
3437
|
this.kpuzzle = new KPuzzleProp({ puzzleLoader: this.puzzleLoader });
|
|
3890
3438
|
this.puzzleID = new PuzzleIDProp({ puzzleLoader: this.puzzleLoader });
|
|
3891
3439
|
this.puzzleAlg = new PuzzleAlgProp({
|
|
@@ -3925,11 +3473,13 @@ var TwistyPlayerModel = class {
|
|
|
3925
3473
|
this.timeRange = new TimeRangeProp({
|
|
3926
3474
|
indexer: this.indexer
|
|
3927
3475
|
});
|
|
3928
|
-
this.detailedTimelineInfo = new DetailedTimelineInfoProp(
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
|
|
3476
|
+
this.detailedTimelineInfo = new DetailedTimelineInfoProp(
|
|
3477
|
+
{
|
|
3478
|
+
timestampRequest: this.timestampRequest,
|
|
3479
|
+
timeRange: this.timeRange,
|
|
3480
|
+
setupAnchor: this.setupAnchor
|
|
3481
|
+
}
|
|
3482
|
+
);
|
|
3933
3483
|
this.coarseTimelineInfo = new CoarseTimelineInfoProp({
|
|
3934
3484
|
detailedTimelineInfo: this.detailedTimelineInfo,
|
|
3935
3485
|
playingInfo: this.playingInfo
|
|
@@ -3976,7 +3526,9 @@ var TwistyPlayerModel = class {
|
|
|
3976
3526
|
this.twistySceneModel.stickering.get()
|
|
3977
3527
|
]);
|
|
3978
3528
|
const isExplorer = viewerLink === "experimental-twizzle-explorer";
|
|
3979
|
-
const url = new URL(
|
|
3529
|
+
const url = new URL(
|
|
3530
|
+
`https://alpha.twizzle.net/${isExplorer ? "explore" : "edit"}/`
|
|
3531
|
+
);
|
|
3980
3532
|
if (!alg.alg.experimentalIsEmpty()) {
|
|
3981
3533
|
url.searchParams.set("alg", alg.alg.toString());
|
|
3982
3534
|
}
|
|
@@ -3996,31 +3548,46 @@ var TwistyPlayerModel = class {
|
|
|
3996
3548
|
}
|
|
3997
3549
|
return url.toString();
|
|
3998
3550
|
}
|
|
3551
|
+
experimentalAddAlgLeaf(algLeaf, options = {}) {
|
|
3552
|
+
const maybeMove = algLeaf.as(Move);
|
|
3553
|
+
if (maybeMove) {
|
|
3554
|
+
this.experimentalAddMove(maybeMove, options);
|
|
3555
|
+
} else {
|
|
3556
|
+
this.alg.set(
|
|
3557
|
+
(async () => {
|
|
3558
|
+
const alg = (await this.alg.get()).alg;
|
|
3559
|
+
const newAlg = alg.concat(new Alg([algLeaf]));
|
|
3560
|
+
this.timestampRequest.set("end");
|
|
3561
|
+
return newAlg;
|
|
3562
|
+
})()
|
|
3563
|
+
);
|
|
3564
|
+
}
|
|
3565
|
+
}
|
|
3999
3566
|
experimentalAddMove(flexibleMove, options = {}) {
|
|
4000
3567
|
const move = typeof flexibleMove === "string" ? new Move(flexibleMove) : flexibleMove;
|
|
4001
|
-
(
|
|
4002
|
-
|
|
4003
|
-
|
|
4004
|
-
|
|
4005
|
-
|
|
4006
|
-
|
|
4007
|
-
|
|
4008
|
-
|
|
4009
|
-
|
|
4010
|
-
|
|
4011
|
-
|
|
4012
|
-
|
|
4013
|
-
|
|
4014
|
-
|
|
4015
|
-
|
|
4016
|
-
console.warn("Using deprecated prop: `playingInfoProp`. Please switch to: `playingInfo`");
|
|
4017
|
-
return this.playingInfo;
|
|
3568
|
+
this.alg.set(
|
|
3569
|
+
(async () => {
|
|
3570
|
+
const alg = (await this.alg.get()).alg;
|
|
3571
|
+
const newAlg = experimentalAppendMove(alg, move, {
|
|
3572
|
+
coalesce: options?.coalesce,
|
|
3573
|
+
mod: options?.mod
|
|
3574
|
+
});
|
|
3575
|
+
this.timestampRequest.set("end");
|
|
3576
|
+
this.catchUpMove.set({
|
|
3577
|
+
move,
|
|
3578
|
+
amount: 0
|
|
3579
|
+
});
|
|
3580
|
+
return newAlg;
|
|
3581
|
+
})()
|
|
3582
|
+
);
|
|
4018
3583
|
}
|
|
4019
3584
|
};
|
|
4020
3585
|
|
|
4021
3586
|
// src/cubing/twisty/views/TwistyPlayerSettable.ts
|
|
4022
3587
|
function err(propName) {
|
|
4023
|
-
return new Error(
|
|
3588
|
+
return new Error(
|
|
3589
|
+
`Cannot get \`.${propName}\` directly from a \`TwistyPlayer\`.`
|
|
3590
|
+
);
|
|
4024
3591
|
}
|
|
4025
3592
|
var TwistyPlayerSettable = class extends ManagedCustomElement {
|
|
4026
3593
|
constructor() {
|
|
@@ -4231,23 +3798,32 @@ var twistyPlayerAttributeMap = {
|
|
|
4231
3798
|
"experimental-sprite": "experimentalSprite",
|
|
4232
3799
|
"experimental-hint-sprite": "experimentalHintSprite"
|
|
4233
3800
|
};
|
|
4234
|
-
var configKeys = Object.fromEntries(
|
|
4235
|
-
|
|
3801
|
+
var configKeys = Object.fromEntries(
|
|
3802
|
+
Object.values(twistyPlayerAttributeMap).map((s) => [s, true])
|
|
3803
|
+
);
|
|
4236
3804
|
var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
4237
3805
|
constructor(config = {}) {
|
|
4238
3806
|
super();
|
|
4239
|
-
|
|
4240
|
-
|
|
3807
|
+
this.controller = new TwistyPlayerController(
|
|
3808
|
+
this.experimentalModel,
|
|
3809
|
+
this
|
|
3810
|
+
);
|
|
4241
3811
|
this.experimentalCanvasClickCallback = () => {
|
|
4242
3812
|
};
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
3813
|
+
this.#controlsManager = new ClassListManager(
|
|
3814
|
+
this,
|
|
3815
|
+
"controls-",
|
|
3816
|
+
["auto"].concat(
|
|
3817
|
+
Object.keys(controlsLocations)
|
|
3818
|
+
)
|
|
3819
|
+
);
|
|
3820
|
+
this.#visualizationWrapperElem = document.createElement("div");
|
|
3821
|
+
this.#errorElem = document.createElement("div");
|
|
3822
|
+
this.#alreadyConnected = false;
|
|
3823
|
+
this.#flashLevel = "auto";
|
|
3824
|
+
this.#visualizationWrapper = null;
|
|
3825
|
+
this.#initial3DVisualizationWrapper = new InitialValueTracker();
|
|
3826
|
+
this.#visualizationStrategy = null;
|
|
4251
3827
|
for (const [propName, value] of Object.entries(config)) {
|
|
4252
3828
|
if (!configKeys[propName]) {
|
|
4253
3829
|
console.warn(`Invalid config passed to TwistyPlayer: ${propName}`);
|
|
@@ -4256,49 +3832,100 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
4256
3832
|
this[propName] = value;
|
|
4257
3833
|
}
|
|
4258
3834
|
}
|
|
3835
|
+
#controlsManager;
|
|
3836
|
+
#visualizationWrapperElem;
|
|
3837
|
+
#errorElem;
|
|
3838
|
+
#alreadyConnected;
|
|
4259
3839
|
async connectedCallback() {
|
|
4260
|
-
if (
|
|
3840
|
+
if (this.#alreadyConnected) {
|
|
4261
3841
|
return;
|
|
4262
3842
|
}
|
|
4263
|
-
|
|
3843
|
+
this.#alreadyConnected = true;
|
|
4264
3844
|
this.addCSS(twistyPlayerCSS);
|
|
4265
|
-
this.addElement(
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
this.
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
3845
|
+
this.addElement(this.#visualizationWrapperElem).classList.add(
|
|
3846
|
+
"visualization-wrapper"
|
|
3847
|
+
);
|
|
3848
|
+
this.addElement(this.#errorElem).classList.add("error-elem");
|
|
3849
|
+
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
|
+
}
|
|
4273
3857
|
}
|
|
4274
|
-
|
|
3858
|
+
);
|
|
4275
3859
|
const scrubber = new TwistyScrubber(this.experimentalModel);
|
|
4276
3860
|
this.contentWrapper.appendChild(scrubber);
|
|
4277
|
-
this.buttons = new TwistyButtons(
|
|
3861
|
+
this.buttons = new TwistyButtons(
|
|
3862
|
+
this.experimentalModel,
|
|
3863
|
+
this.controller,
|
|
3864
|
+
this
|
|
3865
|
+
);
|
|
4278
3866
|
this.contentWrapper.appendChild(this.buttons);
|
|
4279
|
-
this.experimentalModel.twistySceneModel.background.addFreshListener(
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
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
|
+
);
|
|
3880
|
+
this.experimentalModel.visualizationStrategy.addFreshListener(
|
|
3881
|
+
this.#setVisualizationWrapper.bind(this)
|
|
3882
|
+
);
|
|
4286
3883
|
this.experimentalModel.puzzleID.addFreshListener(this.flash.bind(this));
|
|
4287
3884
|
}
|
|
3885
|
+
#flashLevel;
|
|
4288
3886
|
experimentalSetFlashLevel(newLevel) {
|
|
4289
|
-
|
|
3887
|
+
this.#flashLevel = newLevel;
|
|
4290
3888
|
}
|
|
4291
3889
|
flash() {
|
|
4292
|
-
if (
|
|
4293
|
-
|
|
3890
|
+
if (this.#flashLevel === "auto") {
|
|
3891
|
+
this.#visualizationWrapper?.animate([{ opacity: 0.25 }, { opacity: 1 }], {
|
|
4294
3892
|
duration: 250,
|
|
4295
3893
|
easing: "ease-out"
|
|
4296
3894
|
});
|
|
4297
3895
|
}
|
|
4298
3896
|
}
|
|
3897
|
+
#visualizationWrapper;
|
|
3898
|
+
#initial3DVisualizationWrapper;
|
|
3899
|
+
#visualizationStrategy;
|
|
3900
|
+
#setVisualizationWrapper(strategy) {
|
|
3901
|
+
if (strategy !== this.#visualizationStrategy) {
|
|
3902
|
+
this.#visualizationWrapper?.remove();
|
|
3903
|
+
this.#visualizationWrapper?.disconnect();
|
|
3904
|
+
let newWrapper;
|
|
3905
|
+
switch (strategy) {
|
|
3906
|
+
case "2D":
|
|
3907
|
+
case "experimental-2D-LL":
|
|
3908
|
+
newWrapper = new Twisty2DSceneWrapper(
|
|
3909
|
+
this.experimentalModel.twistySceneModel,
|
|
3910
|
+
strategy
|
|
3911
|
+
);
|
|
3912
|
+
break;
|
|
3913
|
+
case "Cube3D":
|
|
3914
|
+
case "PG3D":
|
|
3915
|
+
newWrapper = new Twisty3DSceneWrapper(this.experimentalModel);
|
|
3916
|
+
this.#initial3DVisualizationWrapper.handleNewValue(newWrapper);
|
|
3917
|
+
break;
|
|
3918
|
+
default:
|
|
3919
|
+
throw new Error("Invalid visualization");
|
|
3920
|
+
}
|
|
3921
|
+
this.#visualizationWrapperElem.appendChild(newWrapper);
|
|
3922
|
+
this.#visualizationWrapper = newWrapper;
|
|
3923
|
+
this.#visualizationStrategy = strategy;
|
|
3924
|
+
}
|
|
3925
|
+
}
|
|
4299
3926
|
async experimentalCurrentVantages() {
|
|
4300
3927
|
this.connectedCallback();
|
|
4301
|
-
const wrapper =
|
|
3928
|
+
const wrapper = this.#visualizationWrapper;
|
|
4302
3929
|
if (wrapper instanceof Twisty3DSceneWrapper) {
|
|
4303
3930
|
return wrapper.experimentalVantages();
|
|
4304
3931
|
}
|
|
@@ -4314,7 +3941,7 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
4314
3941
|
}
|
|
4315
3942
|
async experimentalCurrentThreeJSPuzzleObject(puzzleChangeCallback) {
|
|
4316
3943
|
this.connectedCallback();
|
|
4317
|
-
const sceneWrapper = await
|
|
3944
|
+
const sceneWrapper = await this.#initial3DVisualizationWrapper.promise;
|
|
4318
3945
|
const puzzleWrapper = await sceneWrapper.experimentalTwisty3DPuzzleWrapper();
|
|
4319
3946
|
const twisty3DPuzzlePromise = puzzleWrapper.twisty3DPuzzle();
|
|
4320
3947
|
const safeToCallback = (async () => {
|
|
@@ -4352,6 +3979,9 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
4352
3979
|
experimentalAddMove(flexibleMove, options = {}) {
|
|
4353
3980
|
this.experimentalModel.experimentalAddMove(flexibleMove, options);
|
|
4354
3981
|
}
|
|
3982
|
+
experimentalAddAlgLeaf(algLeaf, options = {}) {
|
|
3983
|
+
this.experimentalModel.experimentalAddAlgLeaf(algLeaf, options);
|
|
3984
|
+
}
|
|
4355
3985
|
static get observedAttributes() {
|
|
4356
3986
|
const observed = [];
|
|
4357
3987
|
for (const key of Object.keys(twistyPlayerAttributeMap)) {
|
|
@@ -4360,8 +3990,8 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
4360
3990
|
return observed;
|
|
4361
3991
|
}
|
|
4362
3992
|
attributeChangedCallback(attributeName, _oldValue, newValue) {
|
|
4363
|
-
if (attributeName.startsWith(
|
|
4364
|
-
attributeName = attributeName.slice(
|
|
3993
|
+
if (attributeName.startsWith(DATA_ATTRIBUTE_PREFIX)) {
|
|
3994
|
+
attributeName = attributeName.slice(DATA_ATTRIBUTE_PREFIX.length);
|
|
4365
3995
|
}
|
|
4366
3996
|
const setterName = twistyPlayerAttributeMap[attributeName];
|
|
4367
3997
|
if (!setterName) {
|
|
@@ -4373,49 +4003,25 @@ var TwistyPlayer = class extends TwistyPlayerSettable {
|
|
|
4373
4003
|
return (await screenshot(this.experimentalModel, options)).dataURL;
|
|
4374
4004
|
}
|
|
4375
4005
|
async experimentalDownloadScreenshot(filename) {
|
|
4376
|
-
if (["2D", "experimental-2D-LL"].includes(
|
|
4377
|
-
|
|
4006
|
+
if (["2D", "experimental-2D-LL"].includes(
|
|
4007
|
+
await this.experimentalModel.visualizationStrategy.get()
|
|
4008
|
+
)) {
|
|
4009
|
+
const wrapper2D = this.#visualizationWrapper;
|
|
4378
4010
|
const twisty2DPuzzle = await wrapper2D.currentTwisty2DPuzzleWrapper().twisty2DPuzzle();
|
|
4379
|
-
const str = new XMLSerializer().serializeToString(
|
|
4011
|
+
const str = new XMLSerializer().serializeToString(
|
|
4012
|
+
twisty2DPuzzle.svgWrapper.svgElement
|
|
4013
|
+
);
|
|
4380
4014
|
const url = URL.createObjectURL(new Blob([str]));
|
|
4381
|
-
downloadURL(
|
|
4015
|
+
downloadURL(
|
|
4016
|
+
url,
|
|
4017
|
+
filename ?? await getDefaultFilename(this.experimentalModel),
|
|
4018
|
+
"svg"
|
|
4019
|
+
);
|
|
4382
4020
|
} else {
|
|
4383
4021
|
await (await screenshot(this.experimentalModel)).download(filename);
|
|
4384
4022
|
}
|
|
4385
4023
|
}
|
|
4386
4024
|
};
|
|
4387
|
-
_controlsManager = new WeakMap();
|
|
4388
|
-
_visualizationWrapperElem = new WeakMap();
|
|
4389
|
-
_errorElem = new WeakMap();
|
|
4390
|
-
_alreadyConnected = new WeakMap();
|
|
4391
|
-
_flashLevel = new WeakMap();
|
|
4392
|
-
_visualizationWrapper = new WeakMap();
|
|
4393
|
-
_initial3DVisualizationWrapper = new WeakMap();
|
|
4394
|
-
_visualizationStrategy = new WeakMap();
|
|
4395
|
-
_setVisualizationWrapper = new WeakSet();
|
|
4396
|
-
setVisualizationWrapper_fn = function(strategy) {
|
|
4397
|
-
if (strategy !== __privateGet(this, _visualizationStrategy)) {
|
|
4398
|
-
__privateGet(this, _visualizationWrapper)?.remove();
|
|
4399
|
-
__privateGet(this, _visualizationWrapper)?.disconnect();
|
|
4400
|
-
let newWrapper;
|
|
4401
|
-
switch (strategy) {
|
|
4402
|
-
case "2D":
|
|
4403
|
-
case "experimental-2D-LL":
|
|
4404
|
-
newWrapper = new Twisty2DSceneWrapper(this.experimentalModel.twistySceneModel, strategy);
|
|
4405
|
-
break;
|
|
4406
|
-
case "Cube3D":
|
|
4407
|
-
case "PG3D":
|
|
4408
|
-
newWrapper = new Twisty3DSceneWrapper(this.experimentalModel);
|
|
4409
|
-
__privateGet(this, _initial3DVisualizationWrapper).handleNewValue(newWrapper);
|
|
4410
|
-
break;
|
|
4411
|
-
default:
|
|
4412
|
-
throw new Error("Invalid visualization");
|
|
4413
|
-
}
|
|
4414
|
-
__privateGet(this, _visualizationWrapperElem).appendChild(newWrapper);
|
|
4415
|
-
__privateSet(this, _visualizationWrapper, newWrapper);
|
|
4416
|
-
__privateSet(this, _visualizationStrategy, strategy);
|
|
4417
|
-
}
|
|
4418
|
-
};
|
|
4419
4025
|
customElementsShim.define("twisty-player", TwistyPlayer);
|
|
4420
4026
|
|
|
4421
4027
|
// src/cubing/twisty/views/TwistyAlgViewer.css.ts
|
|
@@ -4456,15 +4062,22 @@ var TwistyAlgLeafElem = class extends ManagedCustomElement {
|
|
|
4456
4062
|
this.classList.add(className);
|
|
4457
4063
|
this.addCSS(twistyAlgViewerCSS);
|
|
4458
4064
|
if (clickable) {
|
|
4459
|
-
const anchor = this.contentWrapper.appendChild(
|
|
4065
|
+
const anchor = this.contentWrapper.appendChild(
|
|
4066
|
+
document.createElement("a")
|
|
4067
|
+
);
|
|
4460
4068
|
anchor.href = "#";
|
|
4461
4069
|
anchor.textContent = text;
|
|
4462
4070
|
anchor.addEventListener("click", (e) => {
|
|
4463
4071
|
e.preventDefault();
|
|
4464
|
-
dataDown.twistyAlgViewer.jumpToIndex(
|
|
4072
|
+
dataDown.twistyAlgViewer.jumpToIndex(
|
|
4073
|
+
dataDown.earliestMoveIndex,
|
|
4074
|
+
offsetIntoMove
|
|
4075
|
+
);
|
|
4465
4076
|
});
|
|
4466
4077
|
} else {
|
|
4467
|
-
this.contentWrapper.appendChild(
|
|
4078
|
+
this.contentWrapper.appendChild(
|
|
4079
|
+
document.createElement("span")
|
|
4080
|
+
).textContent = text;
|
|
4468
4081
|
}
|
|
4469
4082
|
}
|
|
4470
4083
|
pathToIndex(_index) {
|
|
@@ -4519,7 +4132,10 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4519
4132
|
let moveCount = 0;
|
|
4520
4133
|
const element = new TwistyAlgWrapperElem("twisty-alg-alg", alg);
|
|
4521
4134
|
let first = true;
|
|
4522
|
-
for (const algNode of direct(
|
|
4135
|
+
for (const algNode of direct(
|
|
4136
|
+
alg.childAlgNodes(),
|
|
4137
|
+
dataDown.direction
|
|
4138
|
+
)) {
|
|
4523
4139
|
if (!first) {
|
|
4524
4140
|
element.addString(" ");
|
|
4525
4141
|
}
|
|
@@ -4528,11 +4144,13 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4528
4144
|
element.addString("^(");
|
|
4529
4145
|
}
|
|
4530
4146
|
if (!algNode.as(Grouping)?.experimentalNISSPlaceholder) {
|
|
4531
|
-
moveCount += element.addElem(
|
|
4532
|
-
|
|
4533
|
-
|
|
4534
|
-
|
|
4535
|
-
|
|
4147
|
+
moveCount += element.addElem(
|
|
4148
|
+
this.traverseAlgNode(algNode, {
|
|
4149
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4150
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4151
|
+
direction: dataDown.direction
|
|
4152
|
+
})
|
|
4153
|
+
);
|
|
4536
4154
|
}
|
|
4537
4155
|
if (algNode.as(Pause)?.experimentalNISSGrouping) {
|
|
4538
4156
|
element.addString(")");
|
|
@@ -4546,26 +4164,45 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4546
4164
|
}
|
|
4547
4165
|
traverseGrouping(grouping, dataDown) {
|
|
4548
4166
|
const square1Tuple = grouping.experimentalAsSquare1Tuple();
|
|
4549
|
-
const direction = updateDirectionByAmount(
|
|
4167
|
+
const direction = updateDirectionByAmount(
|
|
4168
|
+
dataDown.direction,
|
|
4169
|
+
grouping.amount
|
|
4170
|
+
);
|
|
4550
4171
|
let moveCount = 0;
|
|
4551
4172
|
const element = new TwistyAlgWrapperElem("twisty-alg-grouping", grouping);
|
|
4552
4173
|
element.addString("(");
|
|
4553
4174
|
if (square1Tuple) {
|
|
4554
4175
|
moveCount += element.addElem({
|
|
4555
4176
|
moveCount: 1,
|
|
4556
|
-
element: new TwistyAlgLeafElem(
|
|
4177
|
+
element: new TwistyAlgLeafElem(
|
|
4178
|
+
"twisty-alg-move",
|
|
4179
|
+
square1Tuple[0].amount.toString(),
|
|
4180
|
+
dataDown,
|
|
4181
|
+
square1Tuple[0],
|
|
4182
|
+
true,
|
|
4183
|
+
true
|
|
4184
|
+
)
|
|
4557
4185
|
});
|
|
4558
4186
|
element.addString(", ");
|
|
4559
4187
|
moveCount += element.addElem({
|
|
4560
4188
|
moveCount: 1,
|
|
4561
|
-
element: new TwistyAlgLeafElem(
|
|
4189
|
+
element: new TwistyAlgLeafElem(
|
|
4190
|
+
"twisty-alg-move",
|
|
4191
|
+
square1Tuple[1].amount.toString(),
|
|
4192
|
+
dataDown,
|
|
4193
|
+
square1Tuple[1],
|
|
4194
|
+
true,
|
|
4195
|
+
true
|
|
4196
|
+
)
|
|
4562
4197
|
});
|
|
4563
4198
|
} else {
|
|
4564
|
-
moveCount += element.addElem(
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4199
|
+
moveCount += element.addElem(
|
|
4200
|
+
this.traverseAlg(grouping.alg, {
|
|
4201
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4202
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4203
|
+
direction
|
|
4204
|
+
})
|
|
4205
|
+
);
|
|
4569
4206
|
}
|
|
4570
4207
|
element.addString(")" + grouping.experimentalRepetitionSuffix);
|
|
4571
4208
|
element.flushQueue();
|
|
@@ -4575,8 +4212,18 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4575
4212
|
};
|
|
4576
4213
|
}
|
|
4577
4214
|
traverseMove(move, dataDown) {
|
|
4578
|
-
const element = new TwistyAlgLeafElem(
|
|
4579
|
-
|
|
4215
|
+
const element = new TwistyAlgLeafElem(
|
|
4216
|
+
"twisty-alg-move",
|
|
4217
|
+
move.toString(),
|
|
4218
|
+
dataDown,
|
|
4219
|
+
move,
|
|
4220
|
+
true,
|
|
4221
|
+
true
|
|
4222
|
+
);
|
|
4223
|
+
dataDown.twistyAlgViewer.highlighter.addMove(
|
|
4224
|
+
move.startCharIndex,
|
|
4225
|
+
element
|
|
4226
|
+
);
|
|
4580
4227
|
return {
|
|
4581
4228
|
moveCount: 1,
|
|
4582
4229
|
element
|
|
@@ -4584,21 +4231,31 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4584
4231
|
}
|
|
4585
4232
|
traverseCommutator(commutator, dataDown) {
|
|
4586
4233
|
let moveCount = 0;
|
|
4587
|
-
const element = new TwistyAlgWrapperElem(
|
|
4234
|
+
const element = new TwistyAlgWrapperElem(
|
|
4235
|
+
"twisty-alg-commutator",
|
|
4236
|
+
commutator
|
|
4237
|
+
);
|
|
4588
4238
|
element.addString("[");
|
|
4589
4239
|
element.flushQueue();
|
|
4590
|
-
const [first, second] = maybeReverseList(
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4240
|
+
const [first, second] = maybeReverseList(
|
|
4241
|
+
[commutator.A, commutator.B],
|
|
4242
|
+
dataDown.direction
|
|
4243
|
+
);
|
|
4244
|
+
moveCount += element.addElem(
|
|
4245
|
+
this.traverseAlg(first, {
|
|
4246
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4247
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4248
|
+
direction: dataDown.direction
|
|
4249
|
+
})
|
|
4250
|
+
);
|
|
4596
4251
|
element.addString(", ");
|
|
4597
|
-
moveCount += element.addElem(
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4252
|
+
moveCount += element.addElem(
|
|
4253
|
+
this.traverseAlg(second, {
|
|
4254
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4255
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4256
|
+
direction: dataDown.direction
|
|
4257
|
+
})
|
|
4258
|
+
);
|
|
4602
4259
|
element.flushQueue(dataDown.direction);
|
|
4603
4260
|
element.addString("]");
|
|
4604
4261
|
element.flushQueue();
|
|
@@ -4611,18 +4268,22 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4611
4268
|
let moveCount = 0;
|
|
4612
4269
|
const element = new TwistyAlgWrapperElem("twisty-alg-conjugate", conjugate);
|
|
4613
4270
|
element.addString("[");
|
|
4614
|
-
const aLen = element.addElem(
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
4271
|
+
const aLen = element.addElem(
|
|
4272
|
+
this.traverseAlg(conjugate.A, {
|
|
4273
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4274
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4275
|
+
direction: dataDown.direction
|
|
4276
|
+
})
|
|
4277
|
+
);
|
|
4619
4278
|
moveCount += aLen;
|
|
4620
4279
|
element.addString(": ");
|
|
4621
|
-
moveCount += element.addElem(
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4280
|
+
moveCount += element.addElem(
|
|
4281
|
+
this.traverseAlg(conjugate.B, {
|
|
4282
|
+
earliestMoveIndex: dataDown.earliestMoveIndex + moveCount,
|
|
4283
|
+
twistyAlgViewer: dataDown.twistyAlgViewer,
|
|
4284
|
+
direction: dataDown.direction
|
|
4285
|
+
})
|
|
4286
|
+
);
|
|
4626
4287
|
element.addString("]");
|
|
4627
4288
|
element.flushQueue();
|
|
4628
4289
|
return {
|
|
@@ -4636,7 +4297,14 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4636
4297
|
}
|
|
4637
4298
|
return {
|
|
4638
4299
|
moveCount: 1,
|
|
4639
|
-
element: new TwistyAlgLeafElem(
|
|
4300
|
+
element: new TwistyAlgLeafElem(
|
|
4301
|
+
"twisty-alg-pause",
|
|
4302
|
+
".",
|
|
4303
|
+
dataDown,
|
|
4304
|
+
pause,
|
|
4305
|
+
true,
|
|
4306
|
+
true
|
|
4307
|
+
)
|
|
4640
4308
|
};
|
|
4641
4309
|
}
|
|
4642
4310
|
traverseNewline(newline, _dataDown) {
|
|
@@ -4650,12 +4318,21 @@ var AlgToDOMTree = class extends TraversalDownUp {
|
|
|
4650
4318
|
traverseLineComment(lineComment, dataDown) {
|
|
4651
4319
|
return {
|
|
4652
4320
|
moveCount: 0,
|
|
4653
|
-
element: new TwistyAlgLeafElem(
|
|
4321
|
+
element: new TwistyAlgLeafElem(
|
|
4322
|
+
"twisty-alg-line-comment",
|
|
4323
|
+
`//${lineComment.text}`,
|
|
4324
|
+
dataDown,
|
|
4325
|
+
lineComment,
|
|
4326
|
+
false,
|
|
4327
|
+
false
|
|
4328
|
+
)
|
|
4654
4329
|
};
|
|
4655
4330
|
}
|
|
4656
4331
|
};
|
|
4657
4332
|
var algToDOMTreeInstance = new AlgToDOMTree();
|
|
4658
|
-
var algToDOMTree = algToDOMTreeInstance.traverseAlg.bind(
|
|
4333
|
+
var algToDOMTree = algToDOMTreeInstance.traverseAlg.bind(
|
|
4334
|
+
algToDOMTreeInstance
|
|
4335
|
+
);
|
|
4659
4336
|
var MoveHighlighter = class {
|
|
4660
4337
|
constructor() {
|
|
4661
4338
|
this.moveCharIndexMap = /* @__PURE__ */ new Map();
|
|
@@ -4676,38 +4353,75 @@ var MoveHighlighter = class {
|
|
|
4676
4353
|
this.currentElem = newElem;
|
|
4677
4354
|
}
|
|
4678
4355
|
};
|
|
4679
|
-
var _domTree, _twistyPlayer, _setTwistyPlayer, setTwistyPlayer_fn;
|
|
4680
4356
|
var TwistyAlgViewer = class extends HTMLElementShim {
|
|
4681
4357
|
constructor(options) {
|
|
4682
4358
|
super();
|
|
4683
|
-
__privateAdd(this, _setTwistyPlayer);
|
|
4684
4359
|
this.highlighter = new MoveHighlighter();
|
|
4685
|
-
|
|
4686
|
-
__privateAdd(this, _twistyPlayer, null);
|
|
4360
|
+
this.#twistyPlayer = null;
|
|
4687
4361
|
this.lastClickTimestamp = null;
|
|
4688
4362
|
if (options?.twistyPlayer) {
|
|
4689
4363
|
this.twistyPlayer = options?.twistyPlayer;
|
|
4690
4364
|
}
|
|
4691
4365
|
}
|
|
4366
|
+
#domTree;
|
|
4367
|
+
#twistyPlayer;
|
|
4692
4368
|
connectedCallback() {
|
|
4693
4369
|
}
|
|
4694
4370
|
setAlg(alg) {
|
|
4695
|
-
|
|
4371
|
+
this.#domTree = algToDOMTree(alg, {
|
|
4696
4372
|
earliestMoveIndex: 0,
|
|
4697
4373
|
twistyAlgViewer: this,
|
|
4698
4374
|
direction: 1 /* Forwards */
|
|
4699
|
-
}).element
|
|
4375
|
+
}).element;
|
|
4700
4376
|
this.textContent = "";
|
|
4701
|
-
this.appendChild(
|
|
4377
|
+
this.appendChild(this.#domTree);
|
|
4702
4378
|
}
|
|
4703
4379
|
get twistyPlayer() {
|
|
4704
|
-
return
|
|
4380
|
+
return this.#twistyPlayer;
|
|
4705
4381
|
}
|
|
4706
4382
|
set twistyPlayer(twistyPlayer) {
|
|
4707
|
-
|
|
4383
|
+
this.#setTwistyPlayer(twistyPlayer);
|
|
4384
|
+
}
|
|
4385
|
+
async #setTwistyPlayer(twistyPlayer) {
|
|
4386
|
+
if (this.#twistyPlayer) {
|
|
4387
|
+
console.warn("twisty-player reassignment is not supported");
|
|
4388
|
+
return;
|
|
4389
|
+
}
|
|
4390
|
+
if (twistyPlayer === null) {
|
|
4391
|
+
throw new Error("clearing twistyPlayer is not supported");
|
|
4392
|
+
}
|
|
4393
|
+
this.#twistyPlayer = twistyPlayer;
|
|
4394
|
+
this.#twistyPlayer.experimentalModel.alg.addFreshListener(
|
|
4395
|
+
(algWithIssues) => {
|
|
4396
|
+
this.setAlg(algWithIssues.alg);
|
|
4397
|
+
}
|
|
4398
|
+
);
|
|
4399
|
+
const sourceAlg = (await this.#twistyPlayer.experimentalModel.alg.get()).alg;
|
|
4400
|
+
const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
|
|
4401
|
+
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
|
+
}
|
|
4413
|
+
}
|
|
4414
|
+
);
|
|
4415
|
+
twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener(
|
|
4416
|
+
(detailedTimelineInfo) => {
|
|
4417
|
+
if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
|
|
4418
|
+
this.lastClickTimestamp = null;
|
|
4419
|
+
}
|
|
4420
|
+
}
|
|
4421
|
+
);
|
|
4708
4422
|
}
|
|
4709
4423
|
async jumpToIndex(index, offsetIntoMove) {
|
|
4710
|
-
const twistyPlayer =
|
|
4424
|
+
const twistyPlayer = this.#twistyPlayer;
|
|
4711
4425
|
if (twistyPlayer) {
|
|
4712
4426
|
twistyPlayer.pause();
|
|
4713
4427
|
const timestampPromise = (async () => {
|
|
@@ -4715,7 +4429,9 @@ var TwistyAlgViewer = class extends HTMLElementShim {
|
|
|
4715
4429
|
const offset = offsetIntoMove ? DEFAULT_OFFSET_MS : 0;
|
|
4716
4430
|
return (indexer.indexToMoveStartTimestamp(index) ?? -offset) + offset;
|
|
4717
4431
|
})();
|
|
4718
|
-
twistyPlayer.experimentalModel.timestampRequest.set(
|
|
4432
|
+
twistyPlayer.experimentalModel.timestampRequest.set(
|
|
4433
|
+
await timestampPromise
|
|
4434
|
+
);
|
|
4719
4435
|
if (this.lastClickTimestamp === await timestampPromise) {
|
|
4720
4436
|
twistyPlayer.play();
|
|
4721
4437
|
this.lastClickTimestamp = null;
|
|
@@ -4743,41 +4459,6 @@ var TwistyAlgViewer = class extends HTMLElementShim {
|
|
|
4743
4459
|
return ["for"];
|
|
4744
4460
|
}
|
|
4745
4461
|
};
|
|
4746
|
-
_domTree = new WeakMap();
|
|
4747
|
-
_twistyPlayer = new WeakMap();
|
|
4748
|
-
_setTwistyPlayer = new WeakSet();
|
|
4749
|
-
setTwistyPlayer_fn = async function(twistyPlayer) {
|
|
4750
|
-
if (__privateGet(this, _twistyPlayer)) {
|
|
4751
|
-
console.warn("twisty-player reassignment is not supported");
|
|
4752
|
-
return;
|
|
4753
|
-
}
|
|
4754
|
-
if (twistyPlayer === null) {
|
|
4755
|
-
throw new Error("clearing twistyPlayer is not supported");
|
|
4756
|
-
}
|
|
4757
|
-
__privateSet(this, _twistyPlayer, twistyPlayer);
|
|
4758
|
-
__privateGet(this, _twistyPlayer).experimentalModel.alg.addFreshListener((algWithIssues) => {
|
|
4759
|
-
this.setAlg(algWithIssues.alg);
|
|
4760
|
-
});
|
|
4761
|
-
const sourceAlg = (await __privateGet(this, _twistyPlayer).experimentalModel.alg.get()).alg;
|
|
4762
|
-
const parsedAlg = "startCharIndex" in sourceAlg ? sourceAlg : Alg.fromString(sourceAlg.toString());
|
|
4763
|
-
this.setAlg(parsedAlg);
|
|
4764
|
-
twistyPlayer.experimentalModel.currentMoveInfo.addFreshListener((currentMoveInfo) => {
|
|
4765
|
-
let moveInfo = currentMoveInfo.currentMoves[0];
|
|
4766
|
-
moveInfo ?? (moveInfo = currentMoveInfo.movesStarting[0]);
|
|
4767
|
-
moveInfo ?? (moveInfo = currentMoveInfo.movesFinishing[0]);
|
|
4768
|
-
if (!moveInfo) {
|
|
4769
|
-
this.highlighter.set(null);
|
|
4770
|
-
} else {
|
|
4771
|
-
const mainCurrentMove = moveInfo.move;
|
|
4772
|
-
this.highlighter.set(mainCurrentMove);
|
|
4773
|
-
}
|
|
4774
|
-
});
|
|
4775
|
-
twistyPlayer.experimentalModel.detailedTimelineInfo.addFreshListener((detailedTimelineInfo) => {
|
|
4776
|
-
if (detailedTimelineInfo.timestamp !== this.lastClickTimestamp) {
|
|
4777
|
-
this.lastClickTimestamp = null;
|
|
4778
|
-
}
|
|
4779
|
-
});
|
|
4780
|
-
};
|
|
4781
4462
|
customElementsShim.define("twisty-alg-viewer", TwistyAlgViewer);
|
|
4782
4463
|
|
|
4783
4464
|
// src/cubing/twisty/views/TwistyAlgEditor/LeafTokens.ts
|
|
@@ -4850,7 +4531,9 @@ var LeafTokens = class extends TraversalDownUp {
|
|
|
4850
4531
|
}
|
|
4851
4532
|
};
|
|
4852
4533
|
var leafTokensInstance = new LeafTokens();
|
|
4853
|
-
var leafTokens = leafTokensInstance.traverseAlg.bind(
|
|
4534
|
+
var leafTokens = leafTokensInstance.traverseAlg.bind(
|
|
4535
|
+
leafTokensInstance
|
|
4536
|
+
);
|
|
4854
4537
|
|
|
4855
4538
|
// src/cubing/twisty/views/TwistyAlgEditor/model.ts
|
|
4856
4539
|
var TwistyAlgEditorValueProp = class extends SimpleTwistyPropSource {
|
|
@@ -5024,84 +4707,101 @@ textarea {
|
|
|
5024
4707
|
var ATTRIBUTE_FOR_TWISTY_PLAYER = "for-twisty-player";
|
|
5025
4708
|
var ATTRIBUTE_PLACEHOLDER = "placeholder";
|
|
5026
4709
|
var ATTRIBUTE_TWISTY_PLAYER_PROP = "twisty-player-prop";
|
|
5027
|
-
var _textarea, _carbonCopy, _carbonCopyPrefix, _carbonCopyHighlight, _carbonCopySuffix, _textareaClassListValidForPuzzleManager, _twistyPlayer2, _twistyPlayerProp, _algProp, algProp_get, _onInputHasFired, _padSuffix, padSuffix_fn, _highlightedLeaf;
|
|
5028
4710
|
var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
5029
4711
|
constructor(options) {
|
|
5030
4712
|
super();
|
|
5031
|
-
__privateAdd(this, _algProp);
|
|
5032
|
-
__privateAdd(this, _padSuffix);
|
|
5033
4713
|
this.model = new TwistyAlgEditorModel();
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
4714
|
+
this.#textarea = document.createElement("textarea");
|
|
4715
|
+
this.#carbonCopy = document.createElement("div");
|
|
4716
|
+
this.#carbonCopyPrefix = document.createElement("span");
|
|
4717
|
+
this.#carbonCopyHighlight = document.createElement("span");
|
|
4718
|
+
this.#carbonCopySuffix = document.createElement("span");
|
|
4719
|
+
this.#textareaClassListValidForPuzzleManager = new ClassListManager(this, "valid-for-puzzle-", [
|
|
5040
4720
|
"none",
|
|
5041
4721
|
"warning",
|
|
5042
4722
|
"error"
|
|
5043
|
-
])
|
|
5044
|
-
|
|
5045
|
-
__privateAdd(this, _twistyPlayerProp, void 0);
|
|
4723
|
+
]);
|
|
4724
|
+
this.#twistyPlayer = null;
|
|
5046
4725
|
this.debugNeverRequestTimestamp = false;
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
5050
|
-
this.addElement(
|
|
5051
|
-
|
|
5052
|
-
this.addElement(
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
4726
|
+
this.#onInputHasFired = false;
|
|
4727
|
+
this.#highlightedLeaf = null;
|
|
4728
|
+
this.#carbonCopy.classList.add("carbon-copy");
|
|
4729
|
+
this.addElement(this.#carbonCopy);
|
|
4730
|
+
this.#textarea.rows = 1;
|
|
4731
|
+
this.addElement(this.#textarea);
|
|
4732
|
+
this.#carbonCopyPrefix.classList.add("prefix");
|
|
4733
|
+
this.#carbonCopy.appendChild(this.#carbonCopyPrefix);
|
|
4734
|
+
this.#carbonCopyHighlight.classList.add("highlight");
|
|
4735
|
+
this.#carbonCopy.appendChild(this.#carbonCopyHighlight);
|
|
4736
|
+
this.#carbonCopySuffix.classList.add("suffix");
|
|
4737
|
+
this.#carbonCopy.appendChild(this.#carbonCopySuffix);
|
|
4738
|
+
this.#textarea.placeholder = "Alg";
|
|
4739
|
+
this.#textarea.setAttribute("spellcheck", "false");
|
|
5061
4740
|
this.addCSS(twistyAlgEditorCSS);
|
|
5062
|
-
|
|
5063
|
-
|
|
4741
|
+
this.#textarea.addEventListener("input", () => {
|
|
4742
|
+
this.#onInputHasFired = true;
|
|
5064
4743
|
this.onInput();
|
|
5065
4744
|
});
|
|
5066
|
-
|
|
5067
|
-
document.addEventListener(
|
|
4745
|
+
this.#textarea.addEventListener("blur", () => this.onBlur());
|
|
4746
|
+
document.addEventListener(
|
|
4747
|
+
"selectionchange",
|
|
4748
|
+
() => this.onSelectionChange()
|
|
4749
|
+
);
|
|
5068
4750
|
if (options?.twistyPlayer) {
|
|
5069
4751
|
this.twistyPlayer = options.twistyPlayer;
|
|
5070
4752
|
}
|
|
5071
|
-
|
|
4753
|
+
this.#twistyPlayerProp = options?.twistyPlayerProp ?? "alg";
|
|
5072
4754
|
if (options?.twistyPlayerProp === "alg") {
|
|
5073
|
-
this.model.leafToHighlight.addFreshListener(
|
|
5074
|
-
|
|
5075
|
-
|
|
4755
|
+
this.model.leafToHighlight.addFreshListener(
|
|
4756
|
+
(highlightInfo) => {
|
|
4757
|
+
if (highlightInfo) {
|
|
4758
|
+
this.highlightLeaf(highlightInfo.leafInfo.leaf);
|
|
4759
|
+
}
|
|
5076
4760
|
}
|
|
5077
|
-
|
|
4761
|
+
);
|
|
4762
|
+
}
|
|
4763
|
+
}
|
|
4764
|
+
#textarea;
|
|
4765
|
+
#carbonCopy;
|
|
4766
|
+
#carbonCopyPrefix;
|
|
4767
|
+
#carbonCopyHighlight;
|
|
4768
|
+
#carbonCopySuffix;
|
|
4769
|
+
#textareaClassListValidForPuzzleManager;
|
|
4770
|
+
#twistyPlayer;
|
|
4771
|
+
#twistyPlayerProp;
|
|
4772
|
+
get #algProp() {
|
|
4773
|
+
if (this.#twistyPlayer === null) {
|
|
4774
|
+
return null;
|
|
4775
|
+
} else {
|
|
4776
|
+
return this.#twistyPlayer.experimentalModel[this.#twistyPlayerProp];
|
|
5078
4777
|
}
|
|
5079
4778
|
}
|
|
5080
4779
|
set algString(s) {
|
|
5081
|
-
|
|
4780
|
+
this.#textarea.value = s;
|
|
5082
4781
|
this.onInput();
|
|
5083
4782
|
}
|
|
5084
4783
|
get algString() {
|
|
5085
|
-
return
|
|
4784
|
+
return this.#textarea.value;
|
|
5086
4785
|
}
|
|
5087
4786
|
set placeholder(placeholderText) {
|
|
5088
|
-
|
|
4787
|
+
this.#textarea.placeholder = placeholderText;
|
|
5089
4788
|
}
|
|
4789
|
+
#onInputHasFired;
|
|
5090
4790
|
onInput() {
|
|
5091
|
-
|
|
4791
|
+
this.#carbonCopyHighlight.hidden = true;
|
|
5092
4792
|
this.highlightLeaf(null);
|
|
5093
|
-
const endTrimmed =
|
|
4793
|
+
const endTrimmed = this.#textarea.value.trimEnd();
|
|
5094
4794
|
this.model.valueProp.set(endTrimmed);
|
|
5095
|
-
|
|
4795
|
+
this.#algProp?.set(endTrimmed);
|
|
5096
4796
|
}
|
|
5097
4797
|
async onSelectionChange() {
|
|
5098
|
-
if (document.activeElement !== this || this.shadow.activeElement !==
|
|
4798
|
+
if (document.activeElement !== this || this.shadow.activeElement !== this.#textarea) {
|
|
5099
4799
|
return;
|
|
5100
4800
|
}
|
|
5101
|
-
if (
|
|
4801
|
+
if (this.#twistyPlayerProp !== "alg") {
|
|
5102
4802
|
return;
|
|
5103
4803
|
}
|
|
5104
|
-
const { selectionStart, selectionEnd } =
|
|
4804
|
+
const { selectionStart, selectionEnd } = this.#textarea;
|
|
5105
4805
|
this.model.selectionProp.set({
|
|
5106
4806
|
selectionStart,
|
|
5107
4807
|
selectionEnd
|
|
@@ -5110,96 +4810,120 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
|
5110
4810
|
async onBlur() {
|
|
5111
4811
|
}
|
|
5112
4812
|
setAlgIssueClassForPuzzle(issues) {
|
|
5113
|
-
|
|
4813
|
+
this.#textareaClassListValidForPuzzleManager.setValue(issues);
|
|
5114
4814
|
}
|
|
4815
|
+
#padSuffix(s) {
|
|
4816
|
+
return s.endsWith("\n") ? s + " " : s;
|
|
4817
|
+
}
|
|
4818
|
+
#highlightedLeaf;
|
|
5115
4819
|
highlightLeaf(leaf) {
|
|
5116
|
-
if (
|
|
4820
|
+
if (this.#twistyPlayerProp !== "alg") {
|
|
5117
4821
|
return;
|
|
5118
4822
|
}
|
|
5119
4823
|
if (leaf === null) {
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
|
|
4824
|
+
this.#carbonCopyPrefix.textContent = "";
|
|
4825
|
+
this.#carbonCopyHighlight.textContent = "";
|
|
4826
|
+
this.#carbonCopySuffix.textContent = this.#padSuffix(
|
|
4827
|
+
this.#textarea.value
|
|
4828
|
+
);
|
|
5123
4829
|
return;
|
|
5124
4830
|
}
|
|
5125
|
-
if (leaf ===
|
|
4831
|
+
if (leaf === this.#highlightedLeaf) {
|
|
5126
4832
|
return;
|
|
5127
4833
|
}
|
|
5128
|
-
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
4834
|
+
this.#highlightedLeaf = leaf;
|
|
4835
|
+
this.#carbonCopyPrefix.textContent = this.#textarea.value.slice(
|
|
4836
|
+
0,
|
|
4837
|
+
leaf.startCharIndex
|
|
4838
|
+
);
|
|
4839
|
+
this.#carbonCopyHighlight.textContent = this.#textarea.value.slice(
|
|
4840
|
+
leaf.startCharIndex,
|
|
4841
|
+
leaf.endCharIndex
|
|
4842
|
+
);
|
|
4843
|
+
this.#carbonCopySuffix.textContent = this.#padSuffix(
|
|
4844
|
+
this.#textarea.value.slice(leaf.endCharIndex)
|
|
4845
|
+
);
|
|
4846
|
+
this.#carbonCopyHighlight.hidden = false;
|
|
5133
4847
|
}
|
|
5134
4848
|
get twistyPlayer() {
|
|
5135
|
-
return
|
|
4849
|
+
return this.#twistyPlayer;
|
|
5136
4850
|
}
|
|
5137
4851
|
set twistyPlayer(twistyPlayer) {
|
|
5138
|
-
if (
|
|
4852
|
+
if (this.#twistyPlayer) {
|
|
5139
4853
|
console.warn("twisty-player reassignment/clearing is not supported");
|
|
5140
4854
|
return;
|
|
5141
4855
|
}
|
|
5142
|
-
|
|
4856
|
+
this.#twistyPlayer = twistyPlayer;
|
|
5143
4857
|
if (!twistyPlayer) {
|
|
5144
4858
|
return;
|
|
5145
4859
|
}
|
|
5146
4860
|
(async () => {
|
|
5147
|
-
this.algString =
|
|
4861
|
+
this.algString = this.#algProp ? (await this.#algProp.get()).alg.toString() : "";
|
|
5148
4862
|
})();
|
|
5149
|
-
if (
|
|
5150
|
-
|
|
5151
|
-
|
|
5152
|
-
|
|
5153
|
-
|
|
5154
|
-
|
|
5155
|
-
|
|
5156
|
-
|
|
5157
|
-
this.
|
|
4863
|
+
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
|
+
}
|
|
5158
4877
|
} else {
|
|
4878
|
+
this.setAlgIssueClassForPuzzle("error");
|
|
5159
4879
|
}
|
|
5160
|
-
} else {
|
|
5161
|
-
this.setAlgIssueClassForPuzzle("error");
|
|
5162
|
-
}
|
|
5163
|
-
});
|
|
5164
|
-
this.model.leafToHighlight.addFreshListener(async (highlightInfo) => {
|
|
5165
|
-
if (highlightInfo === null) {
|
|
5166
|
-
return;
|
|
5167
4880
|
}
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5172
|
-
|
|
5173
|
-
|
|
5174
|
-
|
|
5175
|
-
|
|
5176
|
-
|
|
5177
|
-
|
|
5178
|
-
|
|
5179
|
-
|
|
5180
|
-
|
|
5181
|
-
|
|
5182
|
-
|
|
5183
|
-
|
|
5184
|
-
|
|
5185
|
-
|
|
5186
|
-
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
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;
|
|
4893
|
+
}
|
|
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!");
|
|
4914
|
+
}
|
|
4915
|
+
if (!this.debugNeverRequestTimestamp) {
|
|
4916
|
+
twistyPlayer.experimentalModel.timestampRequest.set(newTimestamp);
|
|
4917
|
+
}
|
|
5193
4918
|
}
|
|
5194
|
-
|
|
5195
|
-
|
|
4919
|
+
);
|
|
4920
|
+
twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(
|
|
4921
|
+
async (currentLeavesSimplified) => {
|
|
4922
|
+
const indexer = await twistyPlayer.experimentalModel.indexer.get();
|
|
4923
|
+
const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
|
|
4924
|
+
this.highlightLeaf(leaf);
|
|
5196
4925
|
}
|
|
5197
|
-
|
|
5198
|
-
twistyPlayer.experimentalModel.currentLeavesSimplified.addFreshListener(async (currentLeavesSimplified) => {
|
|
5199
|
-
const indexer = await twistyPlayer.experimentalModel.indexer.get();
|
|
5200
|
-
const leaf = indexer.getAnimLeaf(currentLeavesSimplified.stateIndex);
|
|
5201
|
-
this.highlightLeaf(leaf);
|
|
5202
|
-
});
|
|
4926
|
+
);
|
|
5203
4927
|
}
|
|
5204
4928
|
}
|
|
5205
4929
|
attributeChangedCallback(attributeName, _oldValue, newValue) {
|
|
@@ -5221,11 +4945,11 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
|
5221
4945
|
this.placeholder = newValue;
|
|
5222
4946
|
return;
|
|
5223
4947
|
case ATTRIBUTE_TWISTY_PLAYER_PROP:
|
|
5224
|
-
if (
|
|
4948
|
+
if (this.#twistyPlayer) {
|
|
5225
4949
|
console.log("cannot set prop");
|
|
5226
4950
|
throw new Error("cannot set prop after twisty player");
|
|
5227
4951
|
}
|
|
5228
|
-
|
|
4952
|
+
this.#twistyPlayerProp = newValue;
|
|
5229
4953
|
return;
|
|
5230
4954
|
}
|
|
5231
4955
|
}
|
|
@@ -5237,28 +4961,6 @@ var TwistyAlgEditor = class extends ManagedCustomElement {
|
|
|
5237
4961
|
];
|
|
5238
4962
|
}
|
|
5239
4963
|
};
|
|
5240
|
-
_textarea = new WeakMap();
|
|
5241
|
-
_carbonCopy = new WeakMap();
|
|
5242
|
-
_carbonCopyPrefix = new WeakMap();
|
|
5243
|
-
_carbonCopyHighlight = new WeakMap();
|
|
5244
|
-
_carbonCopySuffix = new WeakMap();
|
|
5245
|
-
_textareaClassListValidForPuzzleManager = new WeakMap();
|
|
5246
|
-
_twistyPlayer2 = new WeakMap();
|
|
5247
|
-
_twistyPlayerProp = new WeakMap();
|
|
5248
|
-
_algProp = new WeakSet();
|
|
5249
|
-
algProp_get = function() {
|
|
5250
|
-
if (__privateGet(this, _twistyPlayer2) === null) {
|
|
5251
|
-
return null;
|
|
5252
|
-
} else {
|
|
5253
|
-
return __privateGet(this, _twistyPlayer2).experimentalModel[__privateGet(this, _twistyPlayerProp)];
|
|
5254
|
-
}
|
|
5255
|
-
};
|
|
5256
|
-
_onInputHasFired = new WeakMap();
|
|
5257
|
-
_padSuffix = new WeakSet();
|
|
5258
|
-
padSuffix_fn = function(s) {
|
|
5259
|
-
return s.endsWith("\n") ? s + " " : s;
|
|
5260
|
-
};
|
|
5261
|
-
_highlightedLeaf = new WeakMap();
|
|
5262
4964
|
customElementsShim.define("twisty-alg-editor", TwistyAlgEditor);
|
|
5263
4965
|
|
|
5264
4966
|
// src/cubing/twisty/views/twizzle/TwizzleLink.css.ts
|
|
@@ -5298,62 +5000,6 @@ twisty-player + .heading {
|
|
|
5298
5000
|
`);
|
|
5299
5001
|
|
|
5300
5002
|
// src/cubing/twisty/views/twizzle/url-params.ts
|
|
5301
|
-
function updateURL(url) {
|
|
5302
|
-
window.history.replaceState("", "", url.toString());
|
|
5303
|
-
}
|
|
5304
|
-
var _prefix;
|
|
5305
|
-
var URLParamUpdater = class {
|
|
5306
|
-
constructor(model, options) {
|
|
5307
|
-
__privateAdd(this, _prefix, void 0);
|
|
5308
|
-
__privateSet(this, _prefix, options?.prefix ?? "");
|
|
5309
|
-
this.listenToAlgProp(model.alg, "alg");
|
|
5310
|
-
this.listenToAlgProp(model.setupAlg, "setup-alg");
|
|
5311
|
-
this.listenToStringSourceProp(model.twistySceneModel.stickering, "stickering");
|
|
5312
|
-
this.listenToStringSourceProp(model.setupAnchor, "setup-anchor");
|
|
5313
|
-
this.listenToStringOrNullProp(model.title, "title");
|
|
5314
|
-
this.listenToStringOrNoValueProp(model.puzzleIDRequest, "puzzle", NO_VALUE);
|
|
5315
|
-
this.listenToStringOrNoValueProp(model.puzzleDescriptionRequest, "puzzle-description", NO_VALUE);
|
|
5316
|
-
}
|
|
5317
|
-
setURLParam(unprefixedKey, value, defaultString) {
|
|
5318
|
-
const prefixedKey = __privateGet(this, _prefix) + unprefixedKey;
|
|
5319
|
-
const url = new URL(location.href);
|
|
5320
|
-
if (value === defaultString) {
|
|
5321
|
-
url.searchParams.delete(prefixedKey);
|
|
5322
|
-
} else {
|
|
5323
|
-
url.searchParams.set(prefixedKey, value);
|
|
5324
|
-
}
|
|
5325
|
-
updateURL(url);
|
|
5326
|
-
}
|
|
5327
|
-
async listenToStringSourceProp(prop, key, defaultString) {
|
|
5328
|
-
const actualDefaultString = defaultString ?? await prop.getDefaultValue();
|
|
5329
|
-
prop.addFreshListener((s) => {
|
|
5330
|
-
this.setURLParam(key, s, actualDefaultString);
|
|
5331
|
-
});
|
|
5332
|
-
}
|
|
5333
|
-
async listenToStringOrNullProp(prop, key, defaultString = "") {
|
|
5334
|
-
prop.addFreshListener((s) => {
|
|
5335
|
-
this.setURLParam(key, s ?? defaultString, defaultString);
|
|
5336
|
-
});
|
|
5337
|
-
}
|
|
5338
|
-
async listenToStringOrNoValueProp(prop, key, defaultString) {
|
|
5339
|
-
prop.addFreshListener((s) => {
|
|
5340
|
-
if (s === NO_VALUE) {
|
|
5341
|
-
s = defaultString;
|
|
5342
|
-
}
|
|
5343
|
-
if (s === NO_VALUE) {
|
|
5344
|
-
this.setURLParam(key, "", "");
|
|
5345
|
-
} else {
|
|
5346
|
-
this.setURLParam(key, s, "");
|
|
5347
|
-
}
|
|
5348
|
-
});
|
|
5349
|
-
}
|
|
5350
|
-
listenToAlgProp(prop, key) {
|
|
5351
|
-
prop.addFreshListener((algWithIssues) => {
|
|
5352
|
-
this.setURLParam(key, algWithIssues.alg.toString(), "");
|
|
5353
|
-
});
|
|
5354
|
-
}
|
|
5355
|
-
};
|
|
5356
|
-
_prefix = new WeakMap();
|
|
5357
5003
|
function getConfigFromURL(prefix = "", url = location.href) {
|
|
5358
5004
|
const paramMapping = {
|
|
5359
5005
|
"alg": "alg",
|
|
@@ -5379,28 +5025,29 @@ function getConfigFromURL(prefix = "", url = location.href) {
|
|
|
5379
5025
|
}
|
|
5380
5026
|
|
|
5381
5027
|
// src/cubing/twisty/views/twizzle/TwizzleLink.ts
|
|
5382
|
-
var _cssElem;
|
|
5383
5028
|
var TwizzleLink = class extends ManagedCustomElement {
|
|
5384
5029
|
constructor() {
|
|
5385
5030
|
super({ mode: "open" });
|
|
5386
5031
|
this.twistyPlayer = null;
|
|
5387
5032
|
this.a = null;
|
|
5388
|
-
__privateAdd(this, _cssElem, void 0);
|
|
5389
5033
|
}
|
|
5390
5034
|
fallback() {
|
|
5391
5035
|
this.contentWrapper.textContent = "";
|
|
5392
5036
|
if (this.a) {
|
|
5393
|
-
const span = this.contentWrapper.appendChild(
|
|
5037
|
+
const span = this.contentWrapper.appendChild(
|
|
5038
|
+
document.createElement("span")
|
|
5039
|
+
);
|
|
5394
5040
|
span.textContent = "\u2757\uFE0F";
|
|
5395
5041
|
span.title = "Could not show a player for link";
|
|
5396
5042
|
this.addElement(this.a);
|
|
5397
5043
|
}
|
|
5398
|
-
if (
|
|
5399
|
-
|
|
5044
|
+
if (this.#cssElem) {
|
|
5045
|
+
this.#cssElem.remove();
|
|
5400
5046
|
}
|
|
5401
5047
|
}
|
|
5048
|
+
#cssElem;
|
|
5402
5049
|
async connectedCallback() {
|
|
5403
|
-
|
|
5050
|
+
this.#cssElem = this.addCSS(twizzleLinkCSS);
|
|
5404
5051
|
this.a = this.querySelector("a");
|
|
5405
5052
|
if (!this.a) {
|
|
5406
5053
|
return;
|
|
@@ -5419,10 +5066,12 @@ var TwizzleLink = class extends ManagedCustomElement {
|
|
|
5419
5066
|
delete config.puzzle;
|
|
5420
5067
|
config.experimentalPuzzleDescription = puzzleDescription;
|
|
5421
5068
|
}
|
|
5422
|
-
this.twistyPlayer = this.addElement(
|
|
5423
|
-
|
|
5424
|
-
|
|
5425
|
-
|
|
5069
|
+
this.twistyPlayer = this.addElement(
|
|
5070
|
+
new TwistyPlayer({
|
|
5071
|
+
...config,
|
|
5072
|
+
viewerLink: isExplorer ? "experimental-twizzle-explorer" : "auto"
|
|
5073
|
+
})
|
|
5074
|
+
);
|
|
5426
5075
|
if (config.experimentalTitle) {
|
|
5427
5076
|
this.addHeading(config.experimentalTitle).classList.add("title");
|
|
5428
5077
|
}
|
|
@@ -5430,10 +5079,14 @@ var TwizzleLink = class extends ManagedCustomElement {
|
|
|
5430
5079
|
this.addHeading("Setup");
|
|
5431
5080
|
const setupAlgDiv = this.addElement(document.createElement("div"));
|
|
5432
5081
|
setupAlgDiv.classList.add("setup-alg");
|
|
5433
|
-
setupAlgDiv.textContent = new Alg(
|
|
5082
|
+
setupAlgDiv.textContent = new Alg(
|
|
5083
|
+
config.experimentalSetupAlg
|
|
5084
|
+
).toString();
|
|
5434
5085
|
}
|
|
5435
5086
|
this.addHeading("Moves");
|
|
5436
|
-
const twistyAlgViewer = this.addElement(
|
|
5087
|
+
const twistyAlgViewer = this.addElement(
|
|
5088
|
+
new TwistyAlgViewer({ twistyPlayer: this.twistyPlayer })
|
|
5089
|
+
);
|
|
5437
5090
|
twistyAlgViewer.part.add("twisty-alg-viewer");
|
|
5438
5091
|
} else {
|
|
5439
5092
|
this.fallback();
|
|
@@ -5446,7 +5099,6 @@ var TwizzleLink = class extends ManagedCustomElement {
|
|
|
5446
5099
|
return headingDiv;
|
|
5447
5100
|
}
|
|
5448
5101
|
};
|
|
5449
|
-
_cssElem = new WeakMap();
|
|
5450
5102
|
customElementsShim.define("twizzle-link", TwizzleLink);
|
|
5451
5103
|
export {
|
|
5452
5104
|
NO_VALUE as EXPERIMENTAL_PROP_NO_VALUE,
|
|
@@ -5458,7 +5110,6 @@ export {
|
|
|
5458
5110
|
TwistyPlayer,
|
|
5459
5111
|
TwizzleLink,
|
|
5460
5112
|
backViewLayouts,
|
|
5461
|
-
|
|
5462
|
-
experimentalForceNewRendererSharing
|
|
5113
|
+
setTwistyDebug
|
|
5463
5114
|
};
|
|
5464
5115
|
//# sourceMappingURL=index.js.map
|