UNPKG

12.4 kBJavaScriptView Raw
1var __accessCheck = (obj, member, msg) => {
2 if (!member.has(obj))
3 throw TypeError("Cannot " + msg);
4};
5var __privateGet = (obj, member, getter) => {
6 __accessCheck(obj, member, "read from private field");
7 return getter ? getter.call(obj) : member.get(obj);
8};
9var __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};
14var __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};
19var __privateMethod = (obj, member, method) => {
20 __accessCheck(obj, member, "access private method");
21 return method;
22};
23
24// src/deferred.ts
25function 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// src/queue.ts
46var _list, _limit, _top, _bottom, _destroyed, _move, move_fn, _init, init_fn;
47var 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();
90move_fn = function(n) {
91 return n === __privateGet(this, _limit) ? 0 : n + 1;
92};
93_init = new WeakSet();
94init_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// src/consts.ts
101var 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// src/utils.scroll-lock.ts
115function preventDefault(e) {
116 e.preventDefault();
117}
118function preventDefaultForScrollKeys(e) {
119 if (ScrollKeys[e.key]) {
120 preventDefault(e);
121 return false;
122 }
123}
124var wheelOpt = { passive: false };
125var wheelEvent = "onwheel" in document.createElement("div") ? "wheel" : "mousewheel";
126var 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};
132var 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// src/utils.ts
140var p2nMap = { "100%": 1 };
141function 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// src/scene.ts
149var DefaultSceneConfig = {
150 play: "100%",
151 duration: "100%"
152};
153var _scroller, _el, _events, _eventsMap, _prevState, _state, _cfg, _rect, _playStart, _stateChanged, stateChanged_get, _isEnter, isEnter_get, _isLeave, isLeave_get, _preUpdate, preUpdate_fn, _trigger, trigger_fn;
154var 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, /* @__PURE__ */ 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 = /* @__PURE__ */ 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();
249stateChanged_get = function() {
250 return __privateGet(this, _prevState) !== __privateGet(this, _state);
251};
252_isEnter = new WeakSet();
253isEnter_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();
261isLeave_get = function() {
262 return __privateGet(this, _stateChanged, stateChanged_get) && __privateGet(this, _prevState) === "during";
263};
264_preUpdate = new WeakSet();
265preUpdate_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();
287trigger_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// src/scroller.ts
298var doc = self.document;
299var _el2, _scenes, _prevScrollTop, _locker, _update, update_fn;
300var Scroller = class {
301 constructor(el) {
302 __privateAdd(this, _update);
303 __privateAdd(this, _el2, void 0);
304 __privateAdd(this, _scenes, /* @__PURE__ */ 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();
388update_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};
402export {
403 DefaultSceneConfig,
404 Scene,
405 Scroller
406};