1 | var __accessCheck = (obj, member, msg) => {
|
2 | if (!member.has(obj))
|
3 | throw TypeError("Cannot " + msg);
|
4 | };
|
5 | var __privateGet = (obj, member, getter) => {
|
6 | __accessCheck(obj, member, "read from private field");
|
7 | return getter ? getter.call(obj) : member.get(obj);
|
8 | };
|
9 | var __privateAdd = (obj, member, value) => {
|
10 | if (member.has(obj))
|
11 | throw TypeError("Cannot add the same private member more than once");
|
12 | member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
13 | };
|
14 | var __privateSet = (obj, member, value, setter) => {
|
15 | __accessCheck(obj, member, "write to private field");
|
16 | setter ? setter.call(obj, value) : member.set(obj, value);
|
17 | return value;
|
18 | };
|
19 | var __privateMethod = (obj, member, method) => {
|
20 | __accessCheck(obj, member, "access private method");
|
21 | return method;
|
22 | };
|
23 |
|
24 |
|
25 | function deferred() {
|
26 | let methods;
|
27 | let state = "pending";
|
28 | const promise = new Promise((resolve, reject) => {
|
29 | methods = {
|
30 | async resolve(value) {
|
31 | await value;
|
32 | state = "fulfilled";
|
33 | resolve(value);
|
34 | },
|
35 | reject(reason) {
|
36 | state = "rejected";
|
37 | reject(reason);
|
38 | }
|
39 | };
|
40 | });
|
41 | Object.defineProperty(promise, "state", { get: () => state });
|
42 | return Object.assign(promise, methods);
|
43 | }
|
44 |
|
45 |
|
46 | var _list, _limit, _top, _bottom, _destroyed, _move, move_fn, _init, init_fn;
|
47 | var Queue = class {
|
48 | constructor(limit = 1024) {
|
49 | __privateAdd(this, _move);
|
50 | __privateAdd(this, _init);
|
51 | __privateAdd(this, _list, void 0);
|
52 | __privateAdd(this, _limit, void 0);
|
53 | __privateAdd(this, _top, 0);
|
54 | __privateAdd(this, _bottom, 0);
|
55 | __privateAdd(this, _destroyed, false);
|
56 | __privateSet(this, _limit, limit);
|
57 | __privateMethod(this, _init, init_fn).call(this);
|
58 | }
|
59 | async *[Symbol.asyncIterator]() {
|
60 | for (; !__privateGet(this, _destroyed); ) {
|
61 | yield this.pop();
|
62 | }
|
63 | }
|
64 | pop() {
|
65 | const dataDeferred = __privateGet(this, _list)[__privateGet(this, _top)];
|
66 | __privateSet(this, _top, __privateMethod(this, _move, move_fn).call(this, __privateGet(this, _top)));
|
67 | return dataDeferred;
|
68 | }
|
69 | push(data) {
|
70 | __privateGet(this, _list)[__privateGet(this, _bottom)].resolve(data);
|
71 | __privateSet(this, _bottom, __privateMethod(this, _move, move_fn).call(this, __privateGet(this, _bottom)));
|
72 | __privateGet(this, _list)[__privateGet(this, _bottom)] = deferred();
|
73 | }
|
74 | refresh() {
|
75 | __privateMethod(this, _init, init_fn).call(this);
|
76 | }
|
77 | destroy() {
|
78 | if (!__privateGet(this, _destroyed)) {
|
79 | __privateSet(this, _destroyed, true);
|
80 | __privateGet(this, _list)[__privateGet(this, _bottom)].resolve();
|
81 | }
|
82 | }
|
83 | };
|
84 | _list = new WeakMap();
|
85 | _limit = new WeakMap();
|
86 | _top = new WeakMap();
|
87 | _bottom = new WeakMap();
|
88 | _destroyed = new WeakMap();
|
89 | _move = new WeakSet();
|
90 | move_fn = function(n) {
|
91 | return n === __privateGet(this, _limit) ? 0 : n + 1;
|
92 | };
|
93 | _init = new WeakSet();
|
94 | init_fn = function() {
|
95 | __privateSet(this, _list, new Array(__privateGet(this, _limit) + 100));
|
96 | __privateGet(this, _list)[0] = deferred();
|
97 | __privateSet(this, _top, __privateSet(this, _bottom, 0));
|
98 | };
|
99 |
|
100 |
|
101 | var ScrollKeys = {
|
102 | " ": 1,
|
103 | "Tab": 1,
|
104 | "ArrowDown": 1,
|
105 | "ArrowLeft": 1,
|
106 | "ArrowRight": 1,
|
107 | "ArrowUp": 1,
|
108 | "End": 1,
|
109 | "Home": 1,
|
110 | "PageDown": 1,
|
111 | "PageUp": 1
|
112 | };
|
113 |
|
114 |
|
115 | function preventDefault(e) {
|
116 | e.preventDefault();
|
117 | }
|
118 | function preventDefaultForScrollKeys(e) {
|
119 | if (ScrollKeys[e.key]) {
|
120 | preventDefault(e);
|
121 | return false;
|
122 | }
|
123 | }
|
124 | var wheelOpt = { passive: false };
|
125 | var wheelEvent = "onwheel" in document.createElement("div") ? "wheel" : "mousewheel";
|
126 | var lockScroll = (el) => {
|
127 | el.addEventListener("DOMMouseScroll", preventDefault, false);
|
128 | el.addEventListener(wheelEvent, preventDefault, wheelOpt);
|
129 | el.addEventListener("touchmove", preventDefault, wheelOpt);
|
130 | el.addEventListener("keydown", preventDefaultForScrollKeys, false);
|
131 | };
|
132 | var unlockScroll = (el) => {
|
133 | el.removeEventListener("DOMMouseScroll", preventDefault, false);
|
134 | el.removeEventListener(wheelEvent, preventDefault, false);
|
135 | el.removeEventListener("touchmove", preventDefault, false);
|
136 | el.removeEventListener("keydown", preventDefaultForScrollKeys, false);
|
137 | };
|
138 |
|
139 |
|
140 | var p2nMap = { "100%": 1 };
|
141 | function p2n(p) {
|
142 | if (p2nMap[p] !== void 0) {
|
143 | return p2nMap[p];
|
144 | }
|
145 | return p2nMap[p] = Number(p.slice(0, p.length - 1)) / 100;
|
146 | }
|
147 |
|
148 |
|
149 | var DefaultSceneConfig = {
|
150 | play: "100%",
|
151 | duration: "100%"
|
152 | };
|
153 | var _scroller, _el, _events, _eventsMap, _prevState, _state, _cfg, _rect, _playStart, _stateChanged, stateChanged_get, _isEnter, isEnter_get, _isLeave, isLeave_get, _preUpdate, preUpdate_fn, _trigger, trigger_fn;
|
154 | var Scene = class {
|
155 | constructor(scroller, el, cfg) {
|
156 | __privateAdd(this, _stateChanged);
|
157 | __privateAdd(this, _isEnter);
|
158 | __privateAdd(this, _isLeave);
|
159 | __privateAdd(this, _preUpdate);
|
160 | __privateAdd(this, _trigger);
|
161 | __privateAdd(this, _scroller, void 0);
|
162 | __privateAdd(this, _el, void 0);
|
163 | __privateAdd(this, _events, new Queue());
|
164 | __privateAdd(this, _eventsMap, new Map());
|
165 | __privateAdd(this, _prevState, void 0);
|
166 | __privateAdd(this, _state, void 0);
|
167 | __privateAdd(this, _cfg, void 0);
|
168 | __privateAdd(this, _rect, void 0);
|
169 | __privateAdd(this, _playStart, void 0);
|
170 | this.isActive = true;
|
171 | __privateSet(this, _scroller, scroller);
|
172 | __privateSet(this, _el, el);
|
173 | __privateSet(this, _cfg, cfg);
|
174 | __privateMethod(this, _preUpdate, preUpdate_fn).call(this);
|
175 | }
|
176 | get emitter() {
|
177 | return __privateGet(this, _events);
|
178 | }
|
179 | get scrollTop() {
|
180 | return __privateGet(this, _playStart) - __privateGet(this, _rect).top;
|
181 | }
|
182 | get progress() {
|
183 | return this.scrollTop / this.duration;
|
184 | }
|
185 | get state() {
|
186 | return __privateGet(this, _state);
|
187 | }
|
188 | update() {
|
189 | __privateMethod(this, _preUpdate, preUpdate_fn).call(this);
|
190 | const event = {
|
191 | target: __privateGet(this, _el),
|
192 | scrollTop: this.scrollTop,
|
193 | progress: this.progress
|
194 | };
|
195 | __privateMethod(this, _trigger, trigger_fn).call(this, "update", event);
|
196 | if (__privateGet(this, _isEnter, isEnter_get)) {
|
197 | __privateMethod(this, _trigger, trigger_fn).call(this, "enter", event);
|
198 | } else if (__privateGet(this, _isLeave, isLeave_get)) {
|
199 | __privateMethod(this, _trigger, trigger_fn).call(this, "leave", event);
|
200 | }
|
201 | }
|
202 | removeSelf() {
|
203 | __privateGet(this, _events).destroy();
|
204 | __privateGet(this, _scroller).removeScene(this);
|
205 | }
|
206 | scrollTo(n, cfg) {
|
207 | if (typeof n === "string") {
|
208 | n = this.duration * p2n(n);
|
209 | }
|
210 | __privateGet(this, _scroller).scrollTo(__privateGet(this, _el).offsetTop - __privateGet(this, _playStart) + n, cfg);
|
211 | }
|
212 | on(eventType, cb) {
|
213 | let cbs = __privateGet(this, _eventsMap).get(eventType);
|
214 | if (!cbs) {
|
215 | cbs = new Set();
|
216 | __privateGet(this, _eventsMap).set(eventType, cbs);
|
217 | }
|
218 | cbs.add(cb);
|
219 | }
|
220 | off(eventType, cb) {
|
221 | const cbs = __privateGet(this, _eventsMap).get(eventType);
|
222 | if (!(cbs == null ? void 0 : cbs.size)) {
|
223 | return;
|
224 | }
|
225 | if (cb) {
|
226 | cbs.delete(cb);
|
227 | } else {
|
228 | cbs.clear();
|
229 | }
|
230 | }
|
231 | once(eventType, cb) {
|
232 | const handler = (ev) => {
|
233 | cb(ev);
|
234 | this.off(eventType, handler);
|
235 | };
|
236 | this.on(eventType, handler);
|
237 | }
|
238 | };
|
239 | _scroller = new WeakMap();
|
240 | _el = new WeakMap();
|
241 | _events = new WeakMap();
|
242 | _eventsMap = new WeakMap();
|
243 | _prevState = new WeakMap();
|
244 | _state = new WeakMap();
|
245 | _cfg = new WeakMap();
|
246 | _rect = new WeakMap();
|
247 | _playStart = new WeakMap();
|
248 | _stateChanged = new WeakSet();
|
249 | stateChanged_get = function() {
|
250 | return __privateGet(this, _prevState) !== __privateGet(this, _state);
|
251 | };
|
252 | _isEnter = new WeakSet();
|
253 | isEnter_get = function() {
|
254 | if (__privateGet(this, _stateChanged, stateChanged_get)) {
|
255 | const direction = __privateGet(this, _scroller).direction;
|
256 | return direction === "forward" && __privateGet(this, _prevState) === "before" || direction === "reverse" && __privateGet(this, _prevState) === "after";
|
257 | }
|
258 | return false;
|
259 | };
|
260 | _isLeave = new WeakSet();
|
261 | isLeave_get = function() {
|
262 | return __privateGet(this, _stateChanged, stateChanged_get) && __privateGet(this, _prevState) === "during";
|
263 | };
|
264 | _preUpdate = new WeakSet();
|
265 | preUpdate_fn = function() {
|
266 | const clientHeight = __privateGet(this, _scroller).clientHeight;
|
267 | const rect = __privateSet(this, _rect, __privateGet(this, _el).getBoundingClientRect());
|
268 | const { top, bottom } = rect;
|
269 | let playStart = __privateGet(this, _cfg).play;
|
270 | if (typeof playStart === "string") {
|
271 | playStart = clientHeight * p2n(playStart);
|
272 | }
|
273 | __privateSet(this, _playStart, playStart);
|
274 | let duration = __privateGet(this, _cfg).duration;
|
275 | if (typeof duration === "string") {
|
276 | duration = (bottom - top) * p2n(duration);
|
277 | }
|
278 | this.duration = duration;
|
279 | __privateSet(this, _prevState, __privateGet(this, _state));
|
280 | const newState = top <= playStart && top + duration >= playStart ? "during" : top < playStart ? "after" : "before";
|
281 | if (!__privateGet(this, _state)) {
|
282 | __privateSet(this, _prevState, newState);
|
283 | }
|
284 | __privateSet(this, _state, newState);
|
285 | };
|
286 | _trigger = new WeakSet();
|
287 | trigger_fn = function(type, event) {
|
288 | __privateGet(this, _events).push([type, event]);
|
289 | const cbs = __privateGet(this, _eventsMap).get(type);
|
290 | if (cbs) {
|
291 | for (const cb of cbs) {
|
292 | cb(event);
|
293 | }
|
294 | }
|
295 | };
|
296 |
|
297 |
|
298 | var doc = self.document;
|
299 | var _el2, _scenes, _prevScrollTop, _locker, _update, update_fn;
|
300 | var Scroller = class {
|
301 | constructor(el) {
|
302 | __privateAdd(this, _update);
|
303 | __privateAdd(this, _el2, void 0);
|
304 | __privateAdd(this, _scenes, new Set());
|
305 | __privateAdd(this, _prevScrollTop, void 0);
|
306 | __privateAdd(this, _locker, void 0);
|
307 | __privateSet(this, _el2, el);
|
308 | doc.addEventListener("scroll", __privateMethod(this, _update, update_fn).bind(this));
|
309 | this.destroy = () => {
|
310 | doc.removeEventListener("scroll", __privateMethod(this, _update, update_fn).bind(this));
|
311 | for (const scene of __privateGet(this, _scenes)) {
|
312 | this.removeScene(scene);
|
313 | }
|
314 | this.unlock();
|
315 | };
|
316 | }
|
317 | get clientHeight() {
|
318 | return self.innerHeight || doc.documentElement.clientHeight;
|
319 | }
|
320 | get locked() {
|
321 | return !!__privateGet(this, _locker);
|
322 | }
|
323 | get el() {
|
324 | return __privateGet(this, _el2) || doc.body;
|
325 | }
|
326 | addScene(el, cfg) {
|
327 | const scene = new Scene(this, el, cfg);
|
328 | __privateGet(this, _scenes).add(scene);
|
329 | return scene;
|
330 | }
|
331 | addSceneWithDefault(el) {
|
332 | return this.addScene(el, DefaultSceneConfig);
|
333 | }
|
334 | removeScene(scene) {
|
335 | if (__privateGet(this, _scenes).has(scene)) {
|
336 | __privateGet(this, _scenes).delete(scene);
|
337 | scene.removeSelf();
|
338 | }
|
339 | }
|
340 | scrollTo(n, cfg = {}) {
|
341 | if (typeof n === "string") {
|
342 | n = p2n(n);
|
343 | }
|
344 | if (__privateGet(this, _el2) === void 0) {
|
345 | self.scrollTo({ top: n, ...cfg });
|
346 | }
|
347 | __privateMethod(this, _update, update_fn).call(this);
|
348 | }
|
349 | lock(duration) {
|
350 | if (__privateGet(this, _locker)) {
|
351 | this.unlock();
|
352 | }
|
353 | const future = deferred();
|
354 | const currentScrollTop = this.scrollTop;
|
355 | lockScroll(this.el);
|
356 | let ticking = false;
|
357 | __privateSet(this, _locker, [
|
358 | setInterval(() => {
|
359 | if (!ticking) {
|
360 | self.requestAnimationFrame(() => {
|
361 | this.scrollTo(currentScrollTop);
|
362 | ticking = false;
|
363 | });
|
364 | ticking = true;
|
365 | }
|
366 | }, 0),
|
367 | future
|
368 | ]);
|
369 | if (duration) {
|
370 | setTimeout(this.unlock.bind(this), duration);
|
371 | }
|
372 | return future;
|
373 | }
|
374 | unlock() {
|
375 | unlockScroll(this.el);
|
376 | if (__privateGet(this, _locker)) {
|
377 | clearInterval(__privateGet(this, _locker)[0]);
|
378 | __privateGet(this, _locker)[1].resolve();
|
379 | __privateSet(this, _locker, void 0);
|
380 | }
|
381 | }
|
382 | };
|
383 | _el2 = new WeakMap();
|
384 | _scenes = new WeakMap();
|
385 | _prevScrollTop = new WeakMap();
|
386 | _locker = new WeakMap();
|
387 | _update = new WeakSet();
|
388 | update_fn = function() {
|
389 | __privateSet(this, _prevScrollTop, this.scrollTop);
|
390 | this.scrollTop = self.scrollY;
|
391 | if (!__privateGet(this, _prevScrollTop)) {
|
392 | __privateSet(this, _prevScrollTop, this.scrollTop);
|
393 | }
|
394 | const delta = this.scrollTop - __privateGet(this, _prevScrollTop);
|
395 | this.direction = delta > 0 ? "forward" : delta < 0 ? "reverse" : "paused";
|
396 | for (const scene of __privateGet(this, _scenes)) {
|
397 | if (scene.isActive) {
|
398 | scene.update();
|
399 | }
|
400 | }
|
401 | };
|
402 | export {
|
403 | DefaultSceneConfig,
|
404 | Scene,
|
405 | Scroller
|
406 | };
|