@fastkit/scroller 0.14.4 → 0.14.5

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/dist/scroller.mjs CHANGED
@@ -37,8 +37,7 @@ var handleKeydown = (e) => {
37
37
  };
38
38
  function enableScroll(el) {
39
39
  const _el = el;
40
- if (!_el.__ps_ctx__)
41
- return;
40
+ if (!_el.__ps_ctx__) return;
42
41
  const { options } = _el.__ps_ctx__;
43
42
  _el.removeEventListener("wheel", handleWheel, eventListenerOptions);
44
43
  _el.removeEventListener("scroll", handleScroll, eventListenerOptions);
@@ -51,8 +50,7 @@ function enableScroll(el) {
51
50
  function disableScroll(el, opts = {}) {
52
51
  const { hideScrollbar = false } = opts;
53
52
  const _el = el;
54
- if (_el.__ps_ctx__)
55
- return;
53
+ if (_el.__ps_ctx__) return;
56
54
  const options = {
57
55
  hideScrollbar
58
56
  };
@@ -135,15 +133,13 @@ function cumulativeOffset(element) {
135
133
  };
136
134
  }
137
135
  function on(element, events, handler, opts = { passive: false }) {
138
- if (!Array.isArray(events))
139
- events = [events];
136
+ if (!Array.isArray(events)) events = [events];
140
137
  for (let i = 0; i < events.length; i++) {
141
138
  element.addEventListener(events[i], handler, opts);
142
139
  }
143
140
  }
144
141
  function off(element, events, handler) {
145
- if (!Array.isArray(events))
146
- events = [events];
142
+ if (!Array.isArray(events)) events = [events];
147
143
  for (let i = 0; i < events.length; i++) {
148
144
  element.removeEventListener(events[i], handler);
149
145
  }
@@ -187,8 +183,7 @@ function scroll(diffX, diffY, options = {}, _computedValues) {
187
183
  targetY = _computedValues.targetY;
188
184
  } else {
189
185
  $container = $(container);
190
- if (!$container)
191
- throw error(`missing container ${container}`);
186
+ if (!$container) throw error(`missing container ${container}`);
192
187
  initialX = $container.scrollLeft;
193
188
  initialY = $container.scrollTop;
194
189
  targetX = initialX + diffX;
@@ -246,8 +241,7 @@ function scroll(diffX, diffY, options = {}, _computedValues) {
246
241
  doneResolver();
247
242
  }
248
243
  function canceller(e = null, checkCancelable = false) {
249
- if (checkCancelable && !cancelable)
250
- return;
244
+ if (checkCancelable && !cancelable) return;
251
245
  off($container, abortEvents, abortFn);
252
246
  callbackValues.abortEventSource = e;
253
247
  callbackValues.aborted = true;
@@ -262,10 +256,8 @@ function scroll(diffX, diffY, options = {}, _computedValues) {
262
256
  return result;
263
257
  }
264
258
  function step(timestamp) {
265
- if (callbackValues.aborted)
266
- return done();
267
- if (!timeStart)
268
- timeStart = timestamp;
259
+ if (callbackValues.aborted) return done();
260
+ if (!timeStart) timeStart = timestamp;
269
261
  timeElapsed = timestamp - timeStart;
270
262
  let progress = Math.min(timeElapsed / duration, 1);
271
263
  progress = easingFn(progress);
@@ -275,20 +267,16 @@ function scroll(diffX, diffY, options = {}, _computedValues) {
275
267
  timeElapsed < duration ? window.requestAnimationFrame(step) : done();
276
268
  }
277
269
  function topLeft(top, left) {
278
- if (y)
279
- $container.scrollTop = top;
280
- if (x)
281
- $container.scrollLeft = left;
270
+ if (y) $container.scrollTop = top;
271
+ if (x) $container.scrollLeft = left;
282
272
  }
283
273
  function done() {
284
- if (!callbackValues.aborted)
285
- topLeft(targetY, targetX);
274
+ if (!callbackValues.aborted) topLeft(targetY, targetX);
286
275
  timeStart = 0;
287
276
  off($container, abortEvents, abortFn);
288
277
  callbackValues.progress = 1;
289
278
  doneResolve();
290
- if (!callbackValues.aborted && onDone)
291
- onDone(callbackValues);
279
+ if (!callbackValues.aborted && onDone) onDone(callbackValues);
292
280
  }
293
281
  }
294
282
 
@@ -302,14 +290,11 @@ function scrollTo(scrollPosition, options = {}) {
302
290
  let { x, y } = scrollPosition;
303
291
  const container = options.container || defaultSettings.container;
304
292
  const $container = $(container);
305
- if (!$container)
306
- throw error(`missing container ${container}`);
293
+ if (!$container) throw error(`missing container ${container}`);
307
294
  const initialY = $container.scrollTop;
308
295
  const initialX = $container.scrollLeft;
309
- if (x === void 0)
310
- x = initialX;
311
- if (y === void 0)
312
- y = initialY;
296
+ if (x === void 0) x = initialX;
297
+ if (y === void 0) y = initialY;
313
298
  const diffX = x - initialX;
314
299
  const diffY = y - initialY;
315
300
  return scroll(diffX, diffY, options, {
@@ -333,12 +318,10 @@ function scrollToElement(target, options = {}) {
333
318
  const offsetSource = _options.offset;
334
319
  const offset = typeof offsetSource === "number" ? { x: offsetSource, y: offsetSource } : offsetSource;
335
320
  const $target = $(target);
336
- if (!$target)
337
- throw error(`missing element ${target}`);
321
+ if (!$target) throw error(`missing element ${target}`);
338
322
  const container = _options.container || defaultSettings.container;
339
323
  const $container = $(container);
340
- if (!$container)
341
- throw error(`missing container ${container}`);
324
+ if (!$container) throw error(`missing container ${container}`);
342
325
  const cumulativeOffsetContainer = cumulativeOffset($container);
343
326
  const cumulativeOffsetTarget = cumulativeOffset($target);
344
327
  const initialY = $container.scrollTop;
@@ -371,12 +354,9 @@ function scrollToSide(targets, options) {
371
354
  if (hasRight || hasBottom) {
372
355
  const container = options && options.container || defaultSettings.container;
373
356
  const $container = $(container);
374
- if (!$container)
375
- throw error(`missing container ${container}`);
376
- if (hasRight)
377
- position.x = $container.scrollWidth;
378
- if (hasBottom)
379
- position.y = $container.scrollHeight;
357
+ if (!$container) throw error(`missing container ${container}`);
358
+ if (hasRight) position.x = $container.scrollWidth;
359
+ if (hasBottom) position.y = $container.scrollHeight;
380
360
  }
381
361
  return scrollTo(position, options);
382
362
  }
@@ -556,8 +536,7 @@ var Scroller = class extends EV {
556
536
  return this._scrollTop;
557
537
  }
558
538
  set scrollTop(scrollTop) {
559
- if (!this.el)
560
- return;
539
+ if (!this.el) return;
561
540
  this.el.scrollTop = scrollTop;
562
541
  }
563
542
  /**
@@ -567,8 +546,7 @@ var Scroller = class extends EV {
567
546
  return this._scrollRight;
568
547
  }
569
548
  set scrollRight(scrollRight) {
570
- if (!this.el)
571
- return;
549
+ if (!this.el) return;
572
550
  this.el.scrollLeft = this._scrollWidth - this._containerWidth - scrollRight;
573
551
  }
574
552
  /**
@@ -578,8 +556,7 @@ var Scroller = class extends EV {
578
556
  return this._scrollBottom;
579
557
  }
580
558
  set scrollBottom(scrollBottom) {
581
- if (!this.el)
582
- return;
559
+ if (!this.el) return;
583
560
  this.el.scrollTop = this._scrollHeight - this._containerHeight - scrollBottom;
584
561
  }
585
562
  /**
@@ -589,8 +566,7 @@ var Scroller = class extends EV {
589
566
  return this._scrollLeft;
590
567
  }
591
568
  set scrollLeft(scrollLeft) {
592
- if (!this.el)
593
- return;
569
+ if (!this.el) return;
594
570
  this.el.scrollLeft = scrollLeft;
595
571
  }
596
572
  /**
@@ -692,8 +668,7 @@ var Scroller = class extends EV {
692
668
  } : settingOrElementOrQueryString;
693
669
  if (convertedSetting.scrollingJudgeInterval !== void 0)
694
670
  this.scrollingJudgeInterval = convertedSetting.scrollingJudgeInterval;
695
- if (convertedSetting.baseAxis)
696
- this.baseAxis = convertedSetting.baseAxis;
671
+ if (convertedSetting.baseAxis) this.baseAxis = convertedSetting.baseAxis;
697
672
  this._lastAxis = this.baseAxis;
698
673
  const { scrollSizeObserver } = convertedSetting;
699
674
  if (scrollSizeObserver) {
@@ -717,8 +692,7 @@ var Scroller = class extends EV {
717
692
  }
718
693
  };
719
694
  this._lastDirection = this._lastAxis === "y" ? "top" : "left";
720
- if (!IN_WINDOW)
721
- return;
695
+ if (!IN_WINDOW) return;
722
696
  visibilityManager.change(this._visibilityListener);
723
697
  this.setElement(convertedSetting.el);
724
698
  }
@@ -728,8 +702,7 @@ var Scroller = class extends EV {
728
702
  * @param el - Element、もしくはCSSクエリセレクタ文字列を指定します。
729
703
  */
730
704
  setElement(el) {
731
- if (el === null)
732
- return;
705
+ if (el === null) return;
733
706
  if (!IN_WINDOW)
734
707
  logger.error("Element can be set only when it is under DOM context.");
735
708
  this.stop();
@@ -763,8 +736,7 @@ var Scroller = class extends EV {
763
736
  */
764
737
  ready() {
765
738
  this._checkDestroyed();
766
- if (!this.isPending)
767
- return Promise.resolve();
739
+ if (!this.isPending) return Promise.resolve();
768
740
  return new Promise((resolve) => this._readyResolvers.push(resolve));
769
741
  }
770
742
  /**
@@ -773,8 +745,7 @@ var Scroller = class extends EV {
773
745
  */
774
746
  async start() {
775
747
  this._checkDestroyed();
776
- if (this.isRunning)
777
- return;
748
+ if (this.isRunning) return;
778
749
  await this.ready();
779
750
  this._startListeners();
780
751
  this._setState("running" /* Running */);
@@ -787,8 +758,7 @@ var Scroller = class extends EV {
787
758
  */
788
759
  stop() {
789
760
  this._checkDestroyed();
790
- if (!this.isRunning)
791
- return;
761
+ if (!this.isRunning) return;
792
762
  this._stopListeners();
793
763
  this._setState("ready" /* Ready */);
794
764
  }
@@ -800,8 +770,7 @@ var Scroller = class extends EV {
800
770
  * 本メソッドはSPA等でのサービスにおいては意識的に実行する事を強く推奨します。
801
771
  */
802
772
  destroy() {
803
- if (this.isDestroyed)
804
- return;
773
+ if (this.isDestroyed) return;
805
774
  this.stop();
806
775
  this.cancel();
807
776
  this._readyResolvers = [];
@@ -880,8 +849,7 @@ var Scroller = class extends EV {
880
849
  * スクロール中であった場合、スクロールをキャンセルします。
881
850
  */
882
851
  cancel() {
883
- if (!this._scrollToResult)
884
- return;
852
+ if (!this._scrollToResult) return;
885
853
  this._scrollToResult.cancel();
886
854
  this._clearScrollToResult();
887
855
  }
@@ -917,10 +885,8 @@ var Scroller = class extends EV {
917
885
  */
918
886
  toElement(target, options) {
919
887
  const merged = this._createMergedScrollToElementOptions(options);
920
- if (merged.x === void 0)
921
- merged.x = this.baseAxis === "x";
922
- if (merged.y === void 0)
923
- merged.y = this.baseAxis === "y";
888
+ if (merged.x === void 0) merged.x = this.baseAxis === "x";
889
+ if (merged.y === void 0) merged.y = this.baseAxis === "y";
924
890
  return this._setScrollToResult(scrollToElement(target, merged));
925
891
  }
926
892
  /**
@@ -1083,13 +1049,11 @@ var Scroller = class extends EV {
1083
1049
  _updateContainerSize(width, height) {
1084
1050
  const { el, _isBodyElement } = this;
1085
1051
  if (width === void 0) {
1086
- if (!el)
1087
- return;
1052
+ if (!el) return;
1088
1053
  width = _isBodyElement ? document.documentElement.clientWidth : el.clientWidth;
1089
1054
  }
1090
1055
  if (height === void 0) {
1091
- if (!el)
1092
- return;
1056
+ if (!el) return;
1093
1057
  height = _isBodyElement ? document.documentElement.clientHeight : el.clientHeight;
1094
1058
  }
1095
1059
  const { _containerWidth, _containerHeight } = this;
@@ -1107,8 +1071,7 @@ var Scroller = class extends EV {
1107
1071
  }
1108
1072
  _updateScrollSize() {
1109
1073
  const { el, _scrollWidth, _scrollHeight } = this;
1110
- if (!el)
1111
- return;
1074
+ if (!el) return;
1112
1075
  this._scrollWidth = el.scrollWidth;
1113
1076
  this._scrollHeight = el.scrollHeight;
1114
1077
  if (_scrollWidth !== this._scrollWidth || _scrollHeight !== this._scrollHeight) {
@@ -1121,8 +1084,7 @@ var Scroller = class extends EV {
1121
1084
  }
1122
1085
  }
1123
1086
  _startScrollSizeObserver() {
1124
- if (!IN_WINDOW)
1125
- return;
1087
+ if (!IN_WINDOW) return;
1126
1088
  this._stopScrollSizeObserver();
1127
1089
  if (this.scrollSizeObserver) {
1128
1090
  this._scrollSizeObserverPollingId = window.setInterval(() => {
@@ -1141,8 +1103,7 @@ var Scroller = class extends EV {
1141
1103
  }
1142
1104
  }
1143
1105
  _updateScrollPositions() {
1144
- if (!this.el)
1145
- return;
1106
+ if (!this.el) return;
1146
1107
  this._scrollTop = this.el.scrollTop;
1147
1108
  this._scrollLeft = this.el.scrollLeft;
1148
1109
  this._scrollBottom = this._scrollHeight - this._scrollTop - this._containerHeight;
@@ -1310,8 +1271,7 @@ var Scroller = class extends EV {
1310
1271
  }
1311
1272
  }
1312
1273
  _syncToObservers(keys) {
1313
- if (this._observers.length === 0)
1314
- return;
1274
+ if (this._observers.length === 0) return;
1315
1275
  keys = typeof keys === "string" ? [keys] : keys;
1316
1276
  for (const observer of this._observers) {
1317
1277
  this._syncToObserver(observer, keys);
@@ -1343,13 +1303,11 @@ var Scroller = class extends EV {
1343
1303
  ...source
1344
1304
  };
1345
1305
  let { _scrollToElementAdditionalOffset: additionalOffset } = this;
1346
- if (!additionalOffset)
1347
- return merged;
1306
+ if (!additionalOffset) return merged;
1348
1307
  if (typeof additionalOffset === "function") {
1349
1308
  additionalOffset = additionalOffset(this);
1350
1309
  }
1351
- if (!additionalOffset)
1352
- return merged;
1310
+ if (!additionalOffset) return merged;
1353
1311
  if (typeof additionalOffset === "number") {
1354
1312
  additionalOffset = {
1355
1313
  x: additionalOffset,
@@ -1373,8 +1331,7 @@ var Scroller = class extends EV {
1373
1331
  return merged;
1374
1332
  }
1375
1333
  _clearScrollToResult() {
1376
- if (!this._scrollToResult)
1377
- return;
1334
+ if (!this._scrollToResult) return;
1378
1335
  this._scrollToResult = null;
1379
1336
  }
1380
1337
  _setScrollToResult(result) {
@@ -1402,5 +1359,5 @@ var Scroller = class extends EV {
1402
1359
  };
1403
1360
 
1404
1361
  export { SCROLLABLE_KEY_CODES, Scroller, ScrollerState, defaultBaseSettings, defaultSettings, disableScroll, enableScroll, scrollBy, scrollTo, scrollToBottom, scrollToElement, scrollToElementSettingsDefaults, scrollToLeft, scrollToLeftBottom, scrollToLeftTop, scrollToRight, scrollToRightBottom, scrollToRightTop, scrollToSide, scrollToTop };
1405
- //# sourceMappingURL=out.js.map
1362
+ //# sourceMappingURL=scroller.mjs.map
1406
1363
  //# sourceMappingURL=scroller.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scroller.ts","../src/util.ts","../src/logger.ts","../src/prevent-scroll.ts","../src/scroll/schemes.ts","../src/scroll/scroll-by-internal.ts","../src/scroll/easings.ts","../src/scroll/util.ts","../src/scroll/scroll-by.ts","../src/scroll/scroll-to.ts","../src/scroll/scroll-to-element.ts","../src/scroll/scroll-to-side.ts"],"names":["isBodyElement","ScrollerState"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,iBAAiB;;;ACOnB,SAAS,kBAAkB,IAAoC;AACpE,SAAO,GAAG,gBAAgB;AAC5B;AAEO,SAAS,cAAc,IAAoC;AAChE,SAAO,GAAG,gBAAgB;AAC5B;;;AClBA,SAAS,kBAAkB;AAEpB,IAAM,SAAS,IAAI,WAAW,UAAU;;;ACAxC,IAAM,uBAAuB,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAoBvE,IAAM,uBAAgD;AAAA,EACpD,SAAS;AACX;AAEA,IAAM,cAAc,CAAC,MAAkB;AACrC,IAAE,eAAe;AACnB;AAEA,IAAM,eAAe,CAAC,MAAa;AACjC,QAAM,KAAK,EAAE;AACb,MAAI,MAAM,GAAG,YAAY;AACvB,OAAG,SAAS,GAAG,WAAW,aAAa,GAAG,GAAG,WAAW,aAAa,CAAC;AAAA,EACxE;AACF;AAEA,IAAM,gBAAgB,CAAC,MAAqB;AAC1C,MACE,EAAE,UACF,CAAC,SAAS,UAAU,EAAE,SAAU,EAAE,OAAuB,OAAO,GAChE;AACA;AAAA,EACF;AACA,MAAI,qBAAqB,SAAS,EAAE,KAAK,GAAG;AAC1C,MAAE,eAAe;AAAA,EACnB;AACF;AAEO,SAAS,aAAa,IAAa;AACxC,QAAM,MAAkD;AACxD,MAAI,CAAC,IAAI;AAAY;AAErB,QAAM,EAAE,QAAQ,IAAI,IAAI;AAExB,MAAI,oBAAoB,SAAS,aAAa,oBAAoB;AAClE,MAAI,oBAAoB,UAAU,cAAc,oBAAoB;AACpE,MAAI,oBAAoB,WAAW,aAAa;AAEhD,MAAI,QAAQ,eAAe;AACzB,QAAI,MAAM,WAAW,IAAI,WAAW;AAAA,EACtC;AACA,SAAQ,IAAY;AACtB;AAEO,SAAS,cACd,IACA,OAAsC,CAAC,GACvC;AACA,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAElC,QAAM,MAAkD;AACxD,MAAI,IAAI;AAAY;AAEpB,QAAM,UAAU;AAAA,IACd;AAAA,EACF;AAEA,MAAI,aAAa;AAAA,IACf;AAAA,IACA,IAAI;AAAA,IACJ,gBAAgB,IAAI,MAAM;AAAA,IAC1B,cAAc;AAAA,MACZ,GAAG,IAAI,cAAe,IAAY;AAAA,MAClC,GAAG,IAAI,aAAc,IAAY;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe;AACzB,QAAI,MAAM,WAAW;AAAA,EACvB;AAEA,MAAI,iBAAiB,SAAS,aAAa,oBAAoB;AAC/D,MAAI,iBAAiB,UAAU,cAAc,oBAAoB;AACjE,MAAI,iBAAiB,WAAW,aAAa;AAC/C;;;ACWO,IAAM,sBAA0C;AAAA,EACrD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AACd;AAEO,IAAM,kBAAkC;AAAA,EAC7C,IAAI,YAAqB;AACvB,WAAO,SAAS;AAAA,EAClB;AAAA,EACA,GAAG;AACL;;;ACrHA,OAAO,kBAAsC;AAC7C,SAAS,mBAAmB;;;ACD5B,IAAM,UAAU;AAAA,EACd,MAAM,CAAC,MAAM,KAAK,MAAM,CAAG;AAAA,EAC3B,QAAQ,CAAC,GAAK,GAAK,GAAK,CAAG;AAAA,EAC3B,WAAW,CAAC,MAAM,GAAK,GAAK,CAAG;AAAA,EAC/B,YAAY,CAAC,GAAK,GAAK,MAAM,CAAG;AAAA,EAChC,eAAe,CAAC,MAAM,GAAK,MAAM,CAAG;AACtC;AAGA,IAAO,kBAAQ;;;ACPR,SAASA,eAAc,IAAoC;AAChE,SAAO,GAAG,QAAQ,YAAY,MAAM;AACtC;AAEO,SAAS,sBAAsB,IAAa;AACjD,MAAIA,eAAc,EAAE,GAAG;AACrB,UAAM,kBAA+B,SAAS;AAC9C,WAAO;AAAA;AAAA;AAAA,MAGL,OAAO,gBAAgB;AAAA,MACvB,QAAQ,gBAAgB;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,GAAG;AAAA,IACV,QAAQ,GAAG;AAAA,EACb;AACF;AAEO,SAAS,EAAE,mBAAyD;AACzE,MAAI,OAAO,sBAAsB;AAC/B,WAAO;AACT,SAAO,SAAS,cAAc,iBAAiB;AACjD;AAEO,SAAS,iBAAiB,SAAkB;AACjD,MAAI,MAAM;AACV,MAAI,OAAO;AACX,MAAI,KAAyB;AAE7B,SAAO,IAAI;AACT,WAAO,GAAG,aAAa;AACvB,YAAQ,GAAG,cAAc;AACzB,SAAK,GAAG;AAAA,EACV;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAOO,SAAS,GACd,SACA,QACA,SACA,OAAO,EAAE,SAAS,MAAM,GACxB;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM;AAAG,aAAS,CAAC,MAAM;AAC5C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAQ,iBAAiB,OAAO,CAAC,GAAG,SAAS,IAAI;AAAA,EACnD;AACF;AAEO,SAAS,IACd,SACA,QACA,SACA;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM;AAAG,aAAS,CAAC,MAAM;AAC5C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAQ,oBAAoB,OAAO,CAAC,GAAG,OAAO;AAAA,EAChD;AACF;AAMO,SAAS,MAAM,SAAwB;AAC5C,SAAO,IAAI,MAAM,YAAY,OAAO,EAAE;AACxC;;;AFpDA,IAAM,cAAwC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,OACd,OACA,OAEA,UAAyB,CAAC,GAC1B,iBACc;AACd,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,WAAW,EAAE,GAAG,iBAAiB,GAAG,YAAY,OAAO,EAAE;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,IAAI,UAAU;AACpB,QAAM,IAAI,UAAU;AAEpB,MAAI,iBAAiB;AACnB,iBAAa,gBAAgB;AAC7B,eAAW,gBAAgB;AAC3B,eAAW,gBAAgB;AAC3B,cAAU,gBAAgB;AAC1B,cAAU,gBAAgB;AAAA,EAC5B,OAAO;AACL,iBAAa,EAAE,SAAS;AACxB,QAAI,CAAC;AAAY,YAAM,MAAM,qBAAqB,SAAS,EAAE;AAC7D,eAAW,WAAW;AACtB,eAAW,WAAW;AACtB,cAAU,WAAW;AACrB,cAAU,WAAW;AAAA,EACvB;AAGA,QAAM,EAAE,aAAa,aAAa,IAAI;AACtC,QAAM,EAAE,OAAO,OAAO,IAAI,sBAAsB,UAAU;AAC1D,QAAM,YAAY,UAAU,QAAQ;AACpC,QAAM,YAAY,UAAU,SAAS;AACrC,MAAI,YAAY,GAAG;AACjB,aAAS;AACT,eAAW;AAAA,EACb;AACA,MAAI,YAAY,GAAG;AACjB,aAAS;AACT,eAAW;AAAA,EACb;AAMA,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI;AAEJ,QAAM,iBAAuC;AAAA,IAC3C,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,kBAAkB;AAAA,EACpB;AAEA,QAAM,SAAuB;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,IAAI,QAAQ,CAAC,YAAY;AAChC,qBAAe;AAAA,IACjB,CAAC;AAAA,IACD,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAKA,MACG,UAAU,KAAK,UAAU,KAC1B,CAAC,CAAE,WAAoC;AAEvC,WAAO,aAAa;AAGtB,MAAI;AACJ,MAAI,CAAC,QAAQ;AACX,mBAAe,gBAAQ;AAAA,EACzB,WAAW,OAAO,WAAW,UAAU;AACrC,mBAAe,gBAAQ,SAAS,MAAM;AAAA,EACxC,OAAO;AACL,mBAAe;AAAA,EACjB;AACA,QAAM,WAA2B,aAAa;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AAEA,KAAG,YAAY,aAAa,SAAS,EAAE,SAAS,KAAK,CAAC;AACtD,SAAO,sBAAsB,IAAI;AACjC,SAAO;AAKP,WAAS,cAAoB;AAC3B,iBAAa;AAAA,EACf;AAEA,WAAS,UAAU,IAAkB,MAAM,kBAAkB,OAAO;AAClE,QAAI,mBAAmB,CAAC;AAAY;AACpC,QAAI,YAAY,aAAa,OAAO;AACpC,mBAAe,mBAAmB;AAClC,mBAAe,UAAU;AACzB,gBAAY,SAAS,cAAc;AAAA,EACrC;AAEA,WAAS,QAAQ,GAAU;AACzB,cAAU,GAAG,IAAI;AAAA,EACnB;AAEA,WAAS,aAAa,IAAkB,MAAM;AAC5C,cAAU,CAAC;AACX,gBAAY;AACZ,WAAO;AAAA,EACT;AAEA,WAAS,KAAK,WAAyB;AACrC,QAAI,eAAe;AAAS,aAAO,KAAK;AACxC,QAAI,CAAC;AAAW,kBAAY;AAE5B,kBAAc,YAAY;AAE1B,QAAI,WAAW,KAAK,IAAI,cAAc,UAAU,CAAC;AACjD,eAAW,SAAS,QAAQ;AAC5B,mBAAe,WAAW;AAE1B,YAAQ,WAAW,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAChE,kBAAc,WAAW,cAAc;AAEvC,kBAAc,WAAW,OAAO,sBAAsB,IAAI,IAAI,KAAK;AAAA,EACrE;AAEA,WAAS,QAAQ,KAAa,MAAc;AAC1C,QAAI;AAAG,iBAAW,YAAY;AAC9B,QAAI;AAAG,iBAAW,aAAa;AAAA,EACjC;AAEA,WAAS,OAAO;AACd,QAAI,CAAC,eAAe;AAAS,cAAQ,SAAS,OAAO;AACrD,gBAAY;AACZ,QAAI,YAAY,aAAa,OAAO;AACpC,mBAAe,WAAW;AAC1B,gBAAY;AACZ,QAAI,CAAC,eAAe,WAAW;AAAQ,aAAO,cAAc;AAAA,EAC9D;AACF;;;AG9LO,SAAS,SACd,OACA,OACA,SACc;AACd,SAAO,OAAO,OAAO,OAAO,OAAO;AACrC;;;ACDO,SAAS,SACd,gBACA,UAAyB,CAAC,GACZ;AACd,MAAI,EAAE,GAAG,EAAE,IAAI;AACf,QAAM,YAAY,QAAQ,aAAa,gBAAgB;AACvD,QAAM,aAAa,EAAE,SAAS;AAC9B,MAAI,CAAC;AAAY,UAAM,MAAM,qBAAqB,SAAS,EAAE;AAC7D,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW,WAAW;AAC5B,MAAI,MAAM;AAAW,QAAI;AACzB,MAAI,MAAM;AAAW,QAAI;AACzB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAElB,SAAO,OAAO,OAAO,OAAO,SAAS;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AACH;;;ACFO,IAAM,kCAA2D;AAAA,EACtE,QAAQ;AAAA,EACR,GAAG;AAAA,EACH,GAAG;AACL;AAcO,SAAS,gBACd,QACA,UAAkC,CAAC,GACrB;AAKd,QAAM,WAAW,EAAE,GAAG,iCAAiC,GAAG,QAAQ;AAElE,QAAM,EAAE,GAAG,EAAE,IAAI;AAEjB,QAAM,eAAe,SAAS;AAE9B,QAAM,SACJ,OAAO,iBAAiB,WACpB,EAAE,GAAG,cAAc,GAAG,aAAa,IACnC;AAMN,QAAM,UAAU,EAAE,MAAM;AACxB,MAAI,CAAC;AAAS,UAAM,MAAM,mBAAmB,MAAM,EAAE;AAErD,QAAM,YAAY,SAAS,aAAa,gBAAgB;AACxD,QAAM,aAAa,EAAE,SAAS;AAC9B,MAAI,CAAC;AAAY,UAAM,MAAM,qBAAqB,SAAS,EAAE;AAE7D,QAAM,4BAA4B,iBAAiB,UAAU;AAC7D,QAAM,yBAAyB,iBAAiB,OAAO;AAEvD,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW,WAAW;AAE5B,QAAM,UACJ,uBAAuB,MACvB,0BAA0B,OACzB,OAAO,KAAK;AAEf,QAAM,UACJ,uBAAuB,OACvB,0BAA0B,QACzB,OAAO,KAAK;AAEf,QAAM,QAAQ,IAAI,UAAU,WAAW;AACvC,QAAM,QAAQ,IAAI,UAAU,WAAW;AAEvC,SAAO,OAAO,OAAO,OAAO,UAAU;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACtEO,SAAS,aACd,SACA,SACc;AACd,QAAM,QAAsB,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI;AACtE,QAAM,WAAoC,CAAC;AAE3C,QAAM,WAAW,MAAM,SAAS,OAAO;AACvC,QAAM,YAAY,MAAM,SAAS,QAAQ;AAEzC,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,aAAS,IAAI;AAAA,EACf;AAEA,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,aAAS,IAAI;AAAA,EACf;AAEA,MAAI,YAAY,WAAW;AACzB,UAAM,YACH,WAAW,QAAQ,aAAc,gBAAgB;AACpD,UAAM,aAAa,EAAE,SAAS;AAC9B,QAAI,CAAC;AAAY,YAAM,MAAM,qBAAqB,SAAS,EAAE;AAE7D,QAAI;AAAU,eAAS,IAAI,WAAW;AACtC,QAAI;AAAW,eAAS,IAAI,WAAW;AAAA,EACzC;AAEA,SAAO,SAAS,UAAU,OAAO;AACnC;AAMO,SAAS,YAAY,SAAyB;AACnD,SAAO,aAAa,OAAO,OAAO;AACpC;AAMO,SAAS,cAAc,SAAyB;AACrD,SAAO,aAAa,SAAS,OAAO;AACtC;AAMO,SAAS,eAAe,SAAyB;AACtD,SAAO,aAAa,UAAU,OAAO;AACvC;AAMO,SAAS,aAAa,SAAyB;AACpD,SAAO,aAAa,QAAQ,OAAO;AACrC;AAMO,SAAS,gBAAgB,SAAyB;AACvD,SAAO,aAAa,CAAC,QAAQ,KAAK,GAAG,OAAO;AAC9C;AAMO,SAAS,mBAAmB,SAAyB;AAC1D,SAAO,aAAa,CAAC,QAAQ,QAAQ,GAAG,OAAO;AACjD;AAMO,SAAS,iBAAiB,SAAyB;AACxD,SAAO,aAAa,CAAC,SAAS,KAAK,GAAG,OAAO;AAC/C;AAMO,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,aAAa,CAAC,SAAS,QAAQ,GAAG,OAAO;AAClD;;;AXyGO,IAAK,gBAAL,kBAAKC,mBAAL;AAIL,EAAAA,eAAA,aAAU;AAKV,EAAAA,eAAA,WAAQ;AAKR,EAAAA,eAAA,aAAU;AAKV,EAAAA,eAAA,eAAY;AAnBF,SAAAA;AAAA,GAAA;AAwDZ,IAAM,yBAAmD;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAaO,IAAM,WAAN,cAAuB,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjD,OAAgB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,OAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,WAAuB;AAAA;AAAA;AAAA;AAAA,EAKvB,yBAA6C,EAAE,GAAG,oBAAoB;AAAA;AAAA;AAAA;AAAA,EAKtE,kCAAkE;AAAA,IAChE,GAAG;AAAA,EACL;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAK;AACP,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAqB;AACvB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAqB;AACvB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAuB;AACzB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,gBAAgB,WAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,kBAA0B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAuB;AACzB,WAAO,KAAK,eAAe,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAuB;AACzB,WAAO,KAAK,gBAAgB,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,WAAmB;AAC/B,QAAI,CAAC,KAAK;AAAI;AACd,SAAK,GAAG,YAAY;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAY,aAAqB;AACnC,QAAI,CAAC,KAAK;AAAI;AACd,SAAK,GAAG,aAAa,KAAK,eAAe,KAAK,kBAAkB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa,cAAsB;AACrC,QAAI,CAAC,KAAK;AAAI;AACd,SAAK,GAAG,YACN,KAAK,gBAAgB,KAAK,mBAAmB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW,YAAoB;AACjC,QAAI,CAAC,KAAK;AAAI;AACd,SAAK,GAAG,aAAa;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAwB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAiC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAmC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAmC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAA+B;AACjC,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EAEQ;AAAA,EAEA;AAAA,EAEA,qBAAqB;AAAA,EAErB,iBAAiB;AAAA,EAEjB,iBAAiB;AAAA,EAEjB,SAAwB;AAAA,EAExB,kBAAkB;AAAA,EAElB,mBAAmB;AAAA,EAEnB,eAAe;AAAA,EAEf,gBAAgB;AAAA,EAEhB,aAAa;AAAA,EAEb,eAAe;AAAA,EAEf,gBAAgB;AAAA,EAEhB,cAAc;AAAA,EAEd;AAAA,EAEA;AAAA,EAEA,kBAAoC;AAAA,EAEpC,kBAAoC;AAAA,EAEpC,gBAAgB;AAAA;AAAA,EAGhB,kBAA8B,CAAC;AAAA,EAE/B,yBAAwC;AAAA,EAExC,UAAU;AAAA,EAEV,UAAU;AAAA,EAEV,WAAW;AAAA,EAEX,WAAW;AAAA,EAEX,cAAc;AAAA,EAEd,cAAc;AAAA,EAEd;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA,kBAAuC;AAAA,EAEvC,aAAiC,CAAC;AAAA,EAElC,kBAAmC,CAAC;AAAA,EAEpC,+BAA8C;AAAA,EAE9C,+BAA+B;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,YACE,gCAGa,CAAC,GACd;AACA,UAAM;AAEN,UAAM,mBACJ,OAAO,kCAAkC,YACzC,kCAAkC,QACjC,aAAa,yCAAyC,UAClD,gCAAgC;AAAA,MAC/B,IAAsB;AAAA,IACxB,IACC;AAEP,QAAI,iBAAiB,2BAA2B;AAC9C,WAAK,yBAAyB,iBAAiB;AAEjD,QAAI,iBAAiB;AAAU,WAAK,WAAW,iBAAiB;AAChE,SAAK,YAAY,KAAK;AAEtB,UAAM,EAAE,mBAAmB,IAAI;AAC/B,QAAI,oBAAoB;AACtB,WAAK,qBAAqB;AAAA,QACxB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,GAAG;AAAA,MACL;AAAA,IACF;AAEA,SAAK,sBAAsB,MAAM;AAC/B,UAAI,kBAAkB,WAAW;AAC/B,aAAK,OAAO;AACZ,YAAI,KAAK,8BAA8B;AACrC,eAAK,+BAA+B;AACpC,eAAK,yBAAyB;AAAA,QAChC;AAAA,MACF,OAAO;AACL,aAAK,+BACH,KAAK,iCAAiC;AACxC,aAAK,wBAAwB;AAAA,MAC/B;AAAA,IACF;AAEA,SAAK,iBAAiB,KAAK,cAAc,MAAM,QAAQ;AAGvD,QAAI,CAAC;AAAW;AAGhB,sBAAkB,OAAO,KAAK,mBAAmB;AAGjD,SAAK,WAAW,iBAAiB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,IAA8B;AACvC,QAAI,OAAO;AAAM;AACjB,QAAI,CAAC;AACH,aAAO,MAAM,uDAAuD;AAEtE,SAAK,KAAK;AAEV,QAAI;AACJ,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,SAAS,cAAc,EAAE;AAAA,IACjC,OAAO;AACL,YAAM,MAAM,SAAS;AAAA,IACvB;AACA,QAAI,CAAC,KAAK;AACR,YAAM,UAAU;AAChB,aAAO,MAAM,SAAS,EAAE;AACxB,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,SAAK,MAAM;AACX,SAAK,qBAAqB,kBAAkB,GAAG;AAC/C,SAAK,iBAAiB,cAAc,GAAG;AACvC,SAAK,iBAAiB,KAAK,sBAAsB,KAAK;AACtD,SAAK,eACH,KAAK,sBAAsB,KAAK,iBAAiB,SAAS,KAAK;AAEjE,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ;AAAA,EAIR,mCACE,QACA;AACA,SAAK,mCAAmC;AAAA,EAC1C;AAAA,EAEA,wCAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAuB;AACrB,SAAK,gBAAgB;AACrB,QAAI,CAAC,KAAK;AAAW,aAAO,QAAQ,QAAQ;AAC5C,WAAO,IAAI,QAAQ,CAAC,YAAY,KAAK,gBAAgB,KAAK,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAuB;AAC3B,SAAK,gBAAgB;AACrB,QAAI,KAAK;AAAW;AACpB,UAAM,KAAK,MAAM;AACjB,SAAK,gBAAgB;AACrB,SAAK,UAAU,uBAAqB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAa;AACX,SAAK,gBAAgB;AACrB,QAAI,CAAC,KAAK;AAAW;AACrB,SAAK,eAAe;AACpB,SAAK,UAAU,mBAAmB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AACR,QAAI,KAAK;AAAa;AACtB,SAAK,KAAK;AACV,SAAK,OAAO;AACZ,SAAK,kBAAkB,CAAC;AACxB,SAAK,kBAAkB,CAAC;AACxB,SAAK,cAAc;AACnB,SAAK,aAAa,CAAC;AACnB,sBAAkB,OAAO,KAAK,mBAAmB;AAEjD,WAAQ,KAAa;AACrB,WAAQ,KAAa;AACrB,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAQ,KAAa;AACrB,WAAQ,KAAa;AACrB,WAAQ,KAAa;AAErB,SAAK,sCAAsC;AAC3C,SAAK,UAAU,2BAAuB;AACtC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAe;AACb,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAA2B;AACzB,UAAM,OAAkC,CAAC;AACzC,eAAW,OAAO,wBAAwB;AACxC,WAAK,GAAG,IAAI,KAAK,GAAG;AAAA,IACtB;AACA,WAAyB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,WAAO,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,UAAwC;AAC9C,QAAI,CAAC,KAAK,WAAW,SAAS,QAAQ,GAAG;AACvC,WAAK,WAAW,KAAK,QAAQ;AAAA,IAC/B;AACA,SAAK,gBAAgB,QAAQ;AAC7B,UAAM,YAAY,MAAM;AACtB,WAAK,UAAU,QAAQ;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,UAA4B;AACpC,UAAM,QAAQ,KAAK,WAAW,QAAQ,QAAQ;AAC9C,QAAI,UAAU,IAAI;AAChB,WAAK,WAAW,OAAO,OAAO,CAAC;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,QAAI,CAAC,KAAK;AAAiB;AAC3B,SAAK,gBAAgB,OAAO;AAC5B,SAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GACE,OACA,OACA,SACc;AACd,WAAO,KAAK;AAAA,MACV,SAAS,OAAO,OAAO,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GACE,gBACA,SACc;AACd,WAAO,KAAK;AAAA,MACV,SAAS,gBAAgB,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UACE,QACA,SACA;AACA,UAAM,SAAS,KAAK,oCAAoC,OAAO;AAC/D,QAAI,OAAO,MAAM;AAAW,aAAO,IAAI,KAAK,aAAa;AACzD,QAAI,OAAO,MAAM;AAAW,aAAO,IAAI,KAAK,aAAa;AAEzD,WAAO,KAAK,mBAAmB,gBAAgB,QAAQ,MAAM,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,SACA,SACc;AACd,WAAO,KAAK;AAAA,MACV,aAAa,SAAS,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAiC;AACrC,WAAO,KAAK;AAAA,MACV,YAAY,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,SAAiC;AACvC,WAAO,KAAK;AAAA,MACV,cAAc,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,SAAiC;AACxC,WAAO,KAAK;AAAA,MACV,eAAe,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAiC;AACtC,WAAO,KAAK;AAAA,MACV,aAAa,KAAK,2BAA2B,OAAO,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,SAAiC;AACzC,WAAO,KAAK;AAAA,MACV,gBAAgB,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAAiC;AAC5C,WAAO,KAAK;AAAA,MACV,mBAAmB,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAAiC;AAC1C,WAAO,KAAK;AAAA,MACV,iBAAiB,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAiC;AAC7C,WAAO,KAAK;AAAA,MACV,oBAAoB,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,SAAwB;AACxC,QAAI,CAAC,KAAK,gBAAgB,SAAS,OAAO,GAAG;AAC3C,WAAK,gBAAgB,KAAK,OAAO;AACjC,UAAI,KAAK,gBAAgB,WAAW,GAAG;AACrC,aAAK,kBAAkB;AACvB,aAAK,iBAAiB,CAAC,eAAe,CAAC;AAAA,MACzC;AAAA,IACF;AACA,WAAO,MAAM;AACX,WAAK,oBAAoB,OAAO;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoB,SAAwB;AAC1C,UAAM,QAAQ,KAAK,gBAAgB,QAAQ,OAAO;AAClD,QAAI,UAAU,IAAI;AAChB,WAAK,gBAAgB,OAAO,OAAO,CAAC;AACpC,UAAI,KAAK,gBAAgB,WAAW,GAAG;AACrC,aAAK,kBAAkB;AACvB,aAAK,iBAAiB,CAAC,eAAe,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,SAAwB;AACpC,SAAK,kBAAkB;AACvB,SAAK,QAAQ;AACb,SAAK,UAAU,mBAAmB;AAClC,SAAK,MAAM;AACX,SAAK,KAAK,SAAS,MAAS;AAC5B,SAAK,gBAAgB,QAAQ,CAAC,YAAY,QAAQ,CAAC;AACnD,SAAK,kBAAkB,CAAC;AAAA,EAC1B;AAAA,EAEQ,UAAU,OAA4B;AAC5C,QAAI,KAAK,WAAW,OAAO;AACzB,WAAK,SAAS;AACd,WAAK,iBAAiB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,WAAK,KAAK,eAAe,KAAK;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,aAAa;AACpB,YAAM,UAAU;AAChB,aAAO,MAAM,OAAO;AACpB,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAgB,QAAuB;AACrD,SAAK,qBAAqB,OAAO,MAAM;AACvC,SAAK,kBAAkB;AACvB,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,qBAAqB,OAAgB,QAAuB;AAClE,UAAM,EAAE,IAAI,eAAe,IAAI;AAC/B,QAAI,UAAU,QAAW;AACvB,UAAI,CAAC;AAAI;AACT,cAAQ,iBACH,SAAS,gBAAgC,cAC1C,GAAG;AAAA,IACT;AAEA,QAAI,WAAW,QAAW;AACxB,UAAI,CAAC;AAAI;AACT,eAAS,iBACJ,SAAS,gBAAgC,eAC1C,GAAG;AAAA,IACT;AAEA,UAAM,EAAE,iBAAiB,iBAAiB,IAAI;AAC9C,SAAK,kBAAkB;AACvB,SAAK,mBAAmB;AACxB,QAAI,UAAU,mBAAmB,WAAW,kBAAkB;AAC5D,WAAK,iBAAiB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,WAAK,KAAK,UAAU,EAAE,OAAO,OAAO,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,UAAM,EAAE,IAAI,cAAc,cAAc,IAAI;AAC5C,QAAI,CAAC;AAAI;AACT,SAAK,eAAe,GAAG;AACvB,SAAK,gBAAgB,GAAG;AACxB,QACE,iBAAiB,KAAK,gBACtB,kBAAkB,KAAK,eACvB;AACA,WAAK,iBAAiB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,2BAA2B;AACjC,QAAI,CAAC;AAAW;AAEhB,SAAK,wBAAwB;AAE7B,QAAI,KAAK,oBAAoB;AAC3B,WAAK,+BAA+B,OAAO,YAAY,MAAM;AAC3D,YAAI,CAAC,KAAK,sBAAsB,KAAK,aAAa;AAChD,eAAK,wBAAwB;AAC7B;AAAA,QACF;AAEA,aAAK,kBAAkB;AAAA,MACzB,GAAG,KAAK,mBAAmB,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,0BAA0B;AAChC,QAAI,KAAK,iCAAiC,MAAM;AAC9C,oBAAc,KAAK,4BAA4B;AAC/C,WAAK,+BAA+B;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI,CAAC,KAAK;AAAI;AACd,SAAK,aAAa,KAAK,GAAG;AAC1B,SAAK,cAAc,KAAK,GAAG;AAG3B,SAAK,gBACH,KAAK,gBAAgB,KAAK,aAAa,KAAK;AAC9C,SAAK,eACH,KAAK,eAAe,KAAK,cAAc,KAAK;AAE9C,SAAK,iBAAiB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB;AACxB,SAAK,eAAe;AAEpB,SAAK,kBAAkB,MAAM;AAC3B,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,aAAa,iBAAiB,UAAU,KAAK,iBAAiB,KAAK;AAExE,QAAI,KAAK,gBAAgB;AACvB,WAAK,kBAAkB,MAAM;AAC3B,aAAK,UAAU;AAAA,MACjB;AACA,aAAO,iBAAiB,UAAU,KAAK,iBAAiB,KAAK;AAAA,IAC/D,OAAO;AACL,WAAK,kBAAkB,IAAI,eAAe,CAAC,YAAY;AACrD,mBAAW,SAAS,SAAS;AAC3B,gBAAM,EAAE,OAAO,OAAO,IAAI,MAAM;AAChC,eAAK,UAAU,OAAO,MAAM;AAAA,QAC9B;AAAA,MACF,CAAC;AACD,WAAK,OAAO,KAAK,gBAAgB,QAAQ,KAAK,GAAG;AAAA,IACnD;AAEA,QAAI,kBAAkB,WAAW;AAC/B,WAAK,+BAA+B;AACpC,WAAK,yBAAyB;AAAA,IAChC,OAAO;AACL,WAAK,+BAA+B;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,iBAAiB;AACxB,WAAK,aAAa;AAAA,QAChB;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,iBAAiB;AACxB,UAAI,KAAK,oBAAoB;AAC3B,eAAO,oBAAoB,UAAU,KAAK,iBAAiB,KAAK;AAChE,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB,KAAK,KAAK;AACpC,WAAK,gBAAgB,UAAU,KAAK,GAAG;AACvC,WAAK,gBAAgB,WAAW;AAChC,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,4BAA4B;AAClC,QAAI,KAAK,2BAA2B,MAAM;AACxC,mBAAa,KAAK,sBAAsB;AACxC,WAAK,yBAAyB;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,UAAU,OAAgB,QAAiB;AACjD,SAAK,QAAQ,OAAO,MAAM;AAAA,EAC5B;AAAA,EAEQ,mBAAmB,OAA2C;AACpE,UAAM,EAAE,cAAc,IAAI;AAE1B,QAAI,UAAU,eAAe;AAC3B,WAAK,UAAU,KAAK;AACpB,WAAK,UAAU,KAAK;AACpB,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AAAA,IACvB,WAAW,UAAU,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACvB;AAEA,QAAI,kBAAkB,KAAK,eAAe;AACxC,WAAK,iBAAiB,cAAc;AAAA,IACtC;AACA,SAAK,KAAK,OAAO,KAAK,WAAW;AAAA,EACnC;AAAA,EAEQ,YAAY;AAClB,QAAI,CAAC,KAAK,iBAAiB,KAAK,KAAK;AACnC,WAAK,IAAI,aAAa,KAAK;AAC3B,WAAK,IAAI,YAAY,KAAK;AAC1B;AAAA,IACF;AAGA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,SAAK,uBAAuB;AAG5B,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,UAAU,KAAK,aAAa;AAClC,SAAK,WAAW;AAChB,SAAK,WAAW;AAGhB,QAAI,YAAY,SAAS;AACvB,WAAK,YAAY,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,YAAY,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,MAAM;AAAA,IACjE;AAGA,QAAI,aAAa,KAAK,YAAY;AAChC,WAAK,kBAAkB;AAAA,IACzB,WAAW,aAAa,KAAK,YAAY;AACvC,WAAK,kBAAkB;AAAA,IACzB;AAEA,QAAI,cAAc,KAAK,aAAa;AAClC,WAAK,kBAAkB;AAAA,IACzB,WAAW,cAAc,KAAK,aAAa;AACzC,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,iBACH,KAAK,cAAc,MAAM,KAAK,kBAAkB,KAAK;AAGvD,UAAM,gBAAgB,KAAK,cAAc;AACzC,UAAM,0BAA0B,KAAK,oBAAoB;AACzD,UAAM,0BAA0B,KAAK,oBAAoB;AACzD,UAAM,yBAAyB,KAAK,mBAAmB;AAEvD,QAAI,eAAe;AACjB,WAAK,KAAK,cAAc,KAAK,SAAS;AAAA,IACxC;AAEA,QAAI,yBAAyB;AAC3B,WAAK,KAAK,wBAAwB,KAAK,eAAe;AAAA,IACxD;AAEA,QAAI,yBAAyB;AAC3B,WAAK,KAAK,wBAAwB,KAAK,eAAe;AAAA,IACxD;AAEA,QAAI,wBAAwB;AAC1B,WAAK,KAAK,uBAAuB,KAAK,cAAc;AAAA,IACtD;AAEA,QACE,iBACA,2BACA,2BACA,wBACA;AACA,WAAK,iBAAiB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,eAAe;AACtB,UACE,iBACC,cAAc,OAAO,2BACrB,cAAc,OAAO,yBACtB;AAEA,aAAK,mBAAmB,WAAW;AAAA,MACrC,OAAO;AAEL,aAAK,cAAc,KAAK,cAAc,KAAK;AAC3C,aAAK,cAAc,KAAK,aAAa,KAAK;AAC1C,aAAK,mBAAmB,QAAQ;AAAA,MAClC;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,kBAAkB;AACvB,WAAK,mBAAmB,aAAa;AAAA,IACvC;AAEA,SAAK,0BAA0B;AAC/B,SAAK,yBAAyB,OAAO,WAAW,MAAM;AACpD,WAAK,mBAAmB,WAAW;AAAA,IACrC,GAAG,KAAK,sBAAsB;AAAA,EAChC;AAAA,EAEQ,gBACN,UACA,OAAiC,wBACjC;AACA,eAAW,OAAO,MAAM;AACtB,MAAC,SAAiB,GAAG,IAAI,KAAK,GAAG;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,iBACN,MACA;AACA,QAAI,KAAK,WAAW,WAAW;AAAG;AAClC,WAAO,OAAO,SAAS,WAAW,CAAC,IAAI,IAAI;AAC3C,eAAW,YAAY,KAAK,YAAY;AACtC,WAAK,gBAAgB,UAAU,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,CAAC,KAAK;AACR,YAAM,UAAU;AAChB,aAAO,MAAM,OAAO;AACpB,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,2BACN,QACe;AACf,UAAM,KAAK,KAAK,cAAc;AAC9B,UAAM,SAAwB;AAAA,MAC5B,WAAW;AAAA,MACX,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oCACN,QACwB;AACxB,UAAM,KAAK,KAAK,cAAc;AAC9B,UAAM,SAAiC;AAAA,MACrC,WAAW;AAAA,MACX,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AACA,QAAI,EAAE,kCAAkC,iBAAiB,IAAI;AAC7D,QAAI,CAAC;AAAkB,aAAO;AAC9B,QAAI,OAAO,qBAAqB,YAAY;AAC1C,yBAAmB,iBAAiB,IAAI;AAAA,IAC1C;AACA,QAAI,CAAC;AAAkB,aAAO;AAC9B,QAAI,OAAO,qBAAqB,UAAU;AACxC,yBAAmB;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AACA,QAAI,EAAE,OAAO,IAAI;AACjB,QAAI,CAAC,QAAQ;AACX,aAAO,SAAS;AAChB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,eAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,KAAK,MAAM,iBAAiB,KAAK;AACpD,WAAO,KAAK,OAAO,KAAK,MAAM,iBAAiB,KAAK;AACpD,WAAO,SAAS;AAChB,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK;AAAiB;AAC3B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,mBAAmB,QAAoC;AAC7D,SAAK,kBAAkB;AACvB,WAAO,QAAQ,KAAK,MAAM;AACxB,WAAK,qBAAqB;AAAA,IAC5B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,iBAAa,KAAK,cAAc,CAAC;AAAA,EACnC;AAAA,EAEQ,iBAAiB;AACvB,UAAM,KAAK,KAAK,cAAc;AAC9B,SAAK,OAAO;AACZ,kBAAc,EAAE;AAAA,EAClB;AACF","sourcesContent":["import { EV } from '@fastkit/ev';\nimport {\n visibilityManager,\n VisibilityStateListener,\n} from '@fastkit/visibility';\nimport { IN_WINDOW } from '@fastkit/helpers';\nimport { isDocumentElement, isBodyElement } from './util';\nimport { logger } from './logger';\n\nimport { enableScroll, disableScroll } from './prevent-scroll';\n\nimport {\n ScrollPosition,\n ScrollOptions,\n ScrollBaseSettings,\n ScrollToElementTarget,\n ScrollResult,\n ScrollerScrollOptions,\n ScrollToElementSettings,\n scrollToElementSettingsDefaults as _scrollToElementSettingsDefaults,\n scrollBy,\n scrollTo,\n scrollToElement,\n scrollToSide,\n scrollToTop,\n scrollToRight,\n scrollToBottom,\n scrollToLeft,\n scrollToLeftTop,\n scrollToLeftBottom,\n scrollToRightTop,\n scrollToRightBottom,\n ScrollToSideTargets,\n ScrollToElementOptions,\n} from './scroll';\n\nimport { defaultBaseSettings } from './scroll/schemes';\n\nexport * from './prevent-scroll';\n\nexport * from './scroll';\n\nexport type ScrollToElementAdditionalOffset =\n | number\n | { x?: number; y?: number }\n | ((scroller: Scroller) => number | { x?: number; y?: number } | undefined);\n\n/**\n * [[Scroller]]を任意のElementまでスクロールさせる際のオプションです。\n * 詳細は [[ScrollerScrollOptions]] 及び、 [[ScrollToElementSettings]] を参照してください。\n */\nexport type ScrollerScrollToElementOptions = Partial<\n ScrollerScrollOptions & ScrollToElementSettings\n>;\n\n// Scroller は設定されたコンテキスト要素に応じてscrollやsize検知のリスナを\n// window か 自身のelementに切り替えます\ntype ScrollerEventTarget = Window | Element;\n\n/**\n * Scrollerに縦スクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollYDirection = 'top' | 'bottom';\n\n/**\n * Scrollerに横スクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollXDirection = 'left' | 'right';\n\n/**\n * Scrollerにスクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollDirection = ScrollYDirection | ScrollXDirection;\n\n/**\n * スクロールの軸を示します。\n * xは水平、\n * yは垂直をそれぞれ示します\n */\nexport type ScrollAxis = 'x' | 'y';\n\nexport interface ScrollSizeObserverSetting {\n interval: number;\n width: boolean;\n height: boolean;\n}\n\n/**\n * Scrollerの基本セッティングです。\n * 個々のフィールドの詳細は[[Scroller]]の同名プロパティを参照してください。\n */\nexport interface ScrollerSetting {\n el: Element | string | null;\n scrollingJudgeInterval: number;\n baseAxis: ScrollAxis;\n scrollSizeObserver: Partial<ScrollSizeObserverSetting>;\n}\n\n/**\n * Elementのscrollイベントを検知した際に、通知する情報です\n * 現在のスクロールポジションや、スクロール開始(or前回のtick)からのスクロール量が渡されます。\n */\nexport interface ScrollerPayload {\n /**\n * [[Scroller.scrollTop]] が渡されます\n */\n top: number;\n\n /**\n * [[Scroller.scrollLeft]] が渡されます\n */\n left: number;\n\n /**\n * [[Scroller.scrollBottom]] が渡されます\n */\n bottom: number;\n\n /**\n * [[Scroller.scrollRight]] が渡されます\n */\n right: number;\n\n /**\n * 発生したスクロールの軸が渡されます。\n * 斜めスクロールが発生した際は、x、yのうち移動量が大きいものが自動判定されて渡されます。\n * どちらも同じ移動量であった場合は[[Scroller.baseAxis]]の設定値が渡されます。\n */\n axis: ScrollAxis;\n\n /**\n * 発生したスクロールの方向が渡されます。\n * 斜めスクロールが発生した際は、x、yのうち移動量が大きいものが自動判定されて渡されます。\n * どちらも同じ移動量であった場合は[[Scroller.baseAxis]]の設定値が渡されます。\n */\n direction: ScrollDirection;\n\n /**\n * 発生したスクロールの水平方向が渡されます。\n */\n directionX: ScrollXDirection;\n\n /**\n * 発生したスクロールの垂直方向が渡されます。\n */\n directionY: ScrollYDirection;\n\n // tick amount at element.on('scroll') detect\n\n /**\n * [[Scroller.on]]('scroll')時の前回からの水平移動量が渡されます。\n */\n tickedX: number;\n\n /**\n * [[Scroller.on]]('scroll')時の前回からの垂直移動量が渡されます。\n */\n tickedY: number;\n\n /**\n * [[Scroller.on]]('scrollStart')時からの合計水平移動量が渡されます。\n */\n totalX: number;\n\n /**\n * [[Scroller.on]]('scrollStart')時からの合計垂直移動量が渡されます。\n */\n totalY: number;\n}\n\n/**\n * Scrollerは設定されたElementのスクロール開始、tick、終了を検知し\n * イベントを通知します。\n * これらのイベントを購読する事でスクロール量や移動方向を検知可能です。\n */\nexport interface ScrollerScrollEventMap {\n /**\n * スクロールの開始時に発生します。\n */\n scrollStart: ScrollerPayload;\n\n /**\n * 毎スクロール検知時に発生します。\n */\n scroll: ScrollerPayload;\n\n /**\n * スクロールの終了時に発生します。\n */\n scrollEnd: ScrollerPayload;\n}\n\n/**\n * Scrollerに発生するイベントの全てです。\n */\nexport interface ScrollerEventMap extends ScrollerScrollEventMap {\n /**\n * Scrollerが利用可能になった時(Elementが設定されて初期化が完了した)に発生します。\n */\n ready: void;\n\n /**\n * [[Scroller.state]]が変更された時に発生します。\n */\n changeState: ScrollerState;\n\n /**\n * [[Scroller.el]]のサイズ変更を検知した際に発生します。\n */\n resize: { width: number; height: number };\n\n /**\n * [[Scroller.lastAxis]]の変更を検知した際に発生します。\n */\n changeAxis: ScrollAxis;\n\n /**\n * [[Scroller.lastDirection]]の変更を検知した際に発生します。\n */\n changeLastDirection: ScrollDirection;\n\n /**\n * [[Scroller.lastYDirection]]の変更を検知した際に発生します。\n */\n changeLastYDirection: ScrollYDirection;\n\n /**\n * [[Scroller.lastXDirection]]の変更を検知した際に発生します。\n */\n changeLastXDirection: ScrollXDirection;\n}\n\n/**\n * Scrollerの状態を示します。\n */\n// eslint-disable-next-line no-shadow\nexport enum ScrollerState {\n /**\n * Scrollerが初期化されていない(Elementが設定されていない)状態を示します。\n */\n Pending = 'pending',\n\n /**\n * Scrollerが初期化されているが、[[Scroller.el]]のリサイズやスクロールのイベント監視が動作していない状態を示します。\n */\n Ready = 'ready',\n\n /**\n * Scrollerが初期化されていて、[[Scroller.el]]のリサイズやスクロールのイベント監視が動作している状態を示します。\n */\n Running = 'running',\n\n /**\n * [[Scroller.destroy]]が実行され、Scrollerが利用不可である状態を示します。\n */\n Destroyed = 'destroyed',\n}\n\n/**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一覧です。\n * 個々のプロパティ名は、同名のScrollerクラスのプロパティを参照して下さい\n */\nexport interface ScrollerObserver {\n state: ScrollerState;\n isPending: boolean;\n isReady: boolean;\n isRunning: boolean;\n isDestroyed: boolean;\n scrollEnabled: boolean;\n containerWidth: number;\n containerHeight: number;\n scrollWidth: number;\n scrollHeight: number;\n scrollableX: boolean;\n scrollableY: boolean;\n scrollTop: number;\n scrollLeft: number;\n scrollRight: number;\n scrollBottom: number;\n lastAxis: ScrollAxis;\n lastDirection: ScrollDirection;\n lastYDirection: ScrollYDirection;\n lastXDirection: ScrollXDirection;\n nowScrolling: boolean;\n}\n\n/**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一のキー覧です。\n */\nexport type ScrollerObservableKeys = keyof ScrollerObserver;\nconst scrollerObservableKeys: ScrollerObservableKeys[] = [\n 'state',\n 'isPending',\n 'isReady',\n 'isRunning',\n 'isDestroyed',\n 'scrollEnabled',\n 'containerWidth',\n 'containerHeight',\n 'scrollWidth',\n 'scrollHeight',\n 'scrollableX',\n 'scrollableY',\n 'scrollTop',\n 'scrollLeft',\n 'scrollRight',\n 'scrollBottom',\n 'lastAxis',\n 'lastDirection',\n 'lastYDirection',\n 'lastXDirection',\n 'nowScrolling',\n];\n\n/**\n * スクロールを停止させるためのソースオブジェクト\n */\nexport type ScrollStopper = number | string | Record<string, unknown> | symbol;\n\n/**\n * 任意のElement(or HTML Document)のスクロールやサイズ変更を監視し、その情報を通知するクラスです。<br>\n * <a href=\"https://dadajam4.github.io/dadajam4/ev/classes/_ev_.ev.html\" target=\"_blank\">EV</a>を継承しており、イベントの購読[[Scroller.on]]等のインターフェースを利用するか、\n * [[Scroller.observe]]メソッドを利用します。<br>\n * [[Scroller.on]]、[[Scroller.once]]で購読可能なイベントについては[[ScrollerEventMap]]を参照してください。\n */\nexport class Scroller extends EV<ScrollerEventMap> {\n /**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一のキーの配列です。\n */\n static readonly scrollerObservableKeys = scrollerObservableKeys;\n\n /**\n * Scrollerの状態を示すenum値です。\n * {@link ScrollerState}\n */\n static readonly States = ScrollerState;\n\n /**\n * スクロールを検知してから、移動がなくなった際に、何ms後にスクロール終了と判定するかのインターバル値を示します。\n * デフォルトは500です。\n */\n scrollingJudgeInterval = 500;\n\n /**\n * 縦、横のどちらのスクロールを基準とするかを示します。\n * デフォルトはyです。<br>\n * この設定は[[Scroller.toElement]]のデフォルト値にも影響します。\n */\n baseAxis: ScrollAxis = 'y';\n\n /**\n * スクロール系メソッド[[Scroller.to]]等を利用する際のデフォルトの設定を示します。\n */\n scrollSettingsDefaults: ScrollBaseSettings = { ...defaultBaseSettings };\n\n /**\n * [[Scroller.toElement]]のデフォルトオプションの設定を示します。\n */\n scrollToElementSettingsDefaults: ScrollerScrollToElementOptions = {\n ..._scrollToElementSettingsDefaults,\n };\n\n scrollSizeObserver?: ScrollSizeObserverSetting;\n\n /**\n * 設定されたElement要素です。\n * 初期化が完了していない時には本getterはundefinedを返却する事に注意してください。\n */\n get el() {\n return this._el;\n }\n\n /**\n * 現在の状態です。<br>\n * {@link ScrollerState}\n */\n get state(): ScrollerState {\n return this._state;\n }\n\n /**\n * 未初期化である場合trueを示します。\n */\n get isPending(): boolean {\n return this._state === ScrollerState.Pending;\n }\n\n /**\n * 初期化済み&停止状態である場合trueを示します。\n */\n get isReady(): boolean {\n return this._state === ScrollerState.Ready;\n }\n\n /**\n * 初期化済み&動作中である場合trueを示します。\n */\n get isRunning(): boolean {\n return this._state === ScrollerState.Running;\n }\n\n /**\n * インスタンスが破棄済みである場合trueを示します。\n */\n get isDestroyed(): boolean {\n return this._state === ScrollerState.Destroyed;\n }\n\n /**\n * スクロールの有効状態を取得します\n */\n get scrollEnabled(): boolean {\n return this._scrollStoppers.length === 0;\n }\n\n /**\n * スクロール要素の幅を示します。\n */\n get containerWidth(): number {\n return this._containerWidth;\n }\n\n /**\n * スクロール要素の高さを示します。\n */\n get containerHeight(): number {\n return this._containerHeight;\n }\n\n /**\n * スクロール要素内のコンテンツの幅を示します。\n */\n get scrollWidth(): number {\n return this._scrollWidth;\n }\n\n /**\n * スクロール要素内のコンテンツの高さを示します。\n */\n get scrollHeight(): number {\n return this._scrollHeight;\n }\n\n /**\n * x軸にスクロール可能な場合trueを示します\n */\n get scrollableX(): boolean {\n return this._scrollWidth > this._containerWidth;\n }\n\n /**\n * y軸にスクロール可能な場合trueを示します\n */\n get scrollableY(): boolean {\n return this._scrollHeight > this._containerHeight;\n }\n\n /**\n * 現在の上辺からのスクロール量を示します。\n */\n get scrollTop(): number {\n return this._scrollTop;\n }\n\n set scrollTop(scrollTop: number) {\n if (!this.el) return;\n this.el.scrollTop = scrollTop;\n }\n\n /**\n * 現在の右辺からのスクロール量を示します。\n */\n get scrollRight(): number {\n return this._scrollRight;\n }\n\n set scrollRight(scrollRight: number) {\n if (!this.el) return;\n this.el.scrollLeft = this._scrollWidth - this._containerWidth - scrollRight;\n }\n\n /**\n * 現在の下辺からのスクロール量を示します。\n */\n get scrollBottom(): number {\n return this._scrollBottom;\n }\n\n set scrollBottom(scrollBottom: number) {\n if (!this.el) return;\n this.el.scrollTop =\n this._scrollHeight - this._containerHeight - scrollBottom;\n }\n\n /**\n * 現在の左辺からのスクロール量を示します。\n */\n get scrollLeft(): number {\n return this._scrollLeft;\n }\n\n set scrollLeft(scrollLeft: number) {\n if (!this.el) return;\n this.el.scrollLeft = scrollLeft;\n }\n\n /**\n * 現在スクロール中である場合trueを示します。\n */\n get nowScrolling(): boolean {\n return this._nowScrolling;\n }\n\n /**\n * 最後に検知したスクロールの軸を示します。\n */\n get lastAxis(): ScrollAxis {\n return this._lastAxis;\n }\n\n /**\n * 最後に検知したスクロールの方向を示します。\n */\n get lastDirection(): ScrollDirection {\n return this._lastDirection;\n }\n\n /**\n * 最後に検知したスクロールの垂直方向を示します。\n */\n get lastYDirection(): ScrollYDirection {\n return this._lastYDirection;\n }\n\n /**\n * 最後に検知したスクロールの水平方向を示します。\n */\n get lastXDirection(): ScrollXDirection {\n return this._lastXDirection;\n }\n\n /**\n * 最後に検知したスクロールにより通知した情報を示します。\n */\n get lastPayload(): ScrollerPayload {\n return {\n top: this._scrollTop,\n left: this._scrollLeft,\n bottom: this._scrollBottom,\n right: this._scrollRight,\n axis: this._lastAxis,\n direction: this._lastDirection,\n directionX: this._lastXDirection,\n directionY: this._lastYDirection,\n tickedX: this._tickedX,\n tickedY: this._tickedY,\n totalX: this._lastTotalX,\n totalY: this._lastTotalY,\n };\n }\n\n private _el!: Element | null;\n\n private _eventTarget!: ScrollerEventTarget;\n\n private _isDocumentElement = false;\n\n private _isBodyElement = false;\n\n private _isRootElement = false;\n\n private _state: ScrollerState = ScrollerState.Pending;\n\n private _containerWidth = 0;\n\n private _containerHeight = 0;\n\n private _scrollWidth = 0;\n\n private _scrollHeight = 0;\n\n private _scrollTop = 0;\n\n private _scrollRight = 0;\n\n private _scrollBottom = 0;\n\n private _scrollLeft = 0;\n\n private _lastAxis: ScrollAxis;\n\n private _lastDirection: ScrollDirection;\n\n private _lastYDirection: ScrollYDirection = 'top';\n\n private _lastXDirection: ScrollXDirection = 'left';\n\n private _nowScrolling = false;\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private _readyResolvers: Function[] = [];\n\n private _scrollingJudgeTimerId: number | null = null;\n\n private _startX = 0;\n\n private _startY = 0;\n\n private _tickedX = 0;\n\n private _tickedY = 0;\n\n private _lastTotalX = 0;\n\n private _lastTotalY = 0;\n\n private _scrollListener?: EventListener;\n\n private _resizeListener?: EventListener;\n\n private _resizeObserver?: ResizeObserver;\n\n private _scrollToResult: ScrollResult | null = null;\n\n private _observers: ScrollerObserver[] = [];\n\n private _scrollStoppers: ScrollStopper[] = [];\n\n private _scrollSizeObserverPollingId: number | null = null;\n\n private _scrollSizeObserverSuspended = false;\n\n private _visibilityListener: VisibilityStateListener;\n\n /**\n * Scrollerインスタンスを作成します。\n * コンテキストとなるElementをこの時点で指定するか否かは任意です。\n *\n * @param settingOrElementOrQueryString - 任意です。{@link ScrollerSetting}か Element(or cssクエリセレクタ文字列)を直接指定します。この時点でElementを指定しない場合は、[[setElement]]を実行するまでインスタンスは動作しません。\n */\n constructor(\n settingOrElementOrQueryString:\n | Partial<ScrollerSetting>\n | Element\n | string = {},\n ) {\n super();\n\n const convertedSetting: Partial<ScrollerSetting> =\n typeof settingOrElementOrQueryString === 'string' ||\n settingOrElementOrQueryString === null ||\n (IN_WINDOW && settingOrElementOrQueryString instanceof Element)\n ? (settingOrElementOrQueryString = {\n el: <Element | string>settingOrElementOrQueryString,\n })\n : (settingOrElementOrQueryString as Partial<ScrollerSetting>);\n\n if (convertedSetting.scrollingJudgeInterval !== undefined)\n this.scrollingJudgeInterval = convertedSetting.scrollingJudgeInterval;\n\n if (convertedSetting.baseAxis) this.baseAxis = convertedSetting.baseAxis;\n this._lastAxis = this.baseAxis;\n\n const { scrollSizeObserver } = convertedSetting;\n if (scrollSizeObserver) {\n this.scrollSizeObserver = {\n interval: 500,\n width: true,\n height: true,\n ...scrollSizeObserver,\n };\n }\n\n this._visibilityListener = () => {\n if (visibilityManager.isVisible) {\n this.update();\n if (this._scrollSizeObserverSuspended) {\n this._scrollSizeObserverSuspended = false;\n this._startScrollSizeObserver();\n }\n } else {\n this._scrollSizeObserverSuspended =\n this._scrollSizeObserverPollingId !== null;\n this._stopScrollSizeObserver();\n }\n };\n\n this._lastDirection = this._lastAxis === 'y' ? 'top' : 'left';\n\n // for SSR\n if (!IN_WINDOW) return;\n\n // Add Visibility Listener\n visibilityManager.change(this._visibilityListener);\n\n // Skip auto setup when missing scrolling element.\n this.setElement(convertedSetting.el);\n }\n\n /**\n * インスタンスにElementを設定します。特別な理由(SSRの利用等)によりコンストラクタでElementを指定できない場合、\n * 本メソッドを利用しブラウザコンテキスト配下で本メソッドを実行してください。\n * @param el - Element、もしくはCSSクエリセレクタ文字列を指定します。\n */\n setElement(el?: Element | string | null) {\n if (el === null) return;\n if (!IN_WINDOW)\n logger.error('Element can be set only when it is under DOM context.');\n\n this.stop();\n\n let _el: Element | null;\n if (typeof el === 'string') {\n _el = document.querySelector(el);\n } else {\n _el = el || document.scrollingElement;\n }\n if (!_el) {\n const message = 'missing scrolling element';\n logger.error(message, el);\n throw new Error(message);\n }\n\n this._el = _el;\n this._isDocumentElement = isDocumentElement(_el);\n this._isBodyElement = isBodyElement(_el);\n this._isRootElement = this._isDocumentElement || this._isBodyElement;\n this._eventTarget =\n this._isDocumentElement || this._isBodyElement ? window : this._el;\n\n this._setup();\n }\n\n private _scrollToElementAdditionalOffset:\n | ScrollToElementAdditionalOffset\n | undefined;\n\n setScrollToElementAdditionalOffset(\n offset: ScrollToElementAdditionalOffset | undefined,\n ) {\n this._scrollToElementAdditionalOffset = offset;\n }\n\n deleteScrollToElementAdditionalOffset() {\n delete this._scrollToElementAdditionalOffset;\n }\n\n /**\n * インスタンスが実行可能になった際にresolveされるPromiseインスタンスを返却します。\n */\n ready(): Promise<void> {\n this._checkDestroyed();\n if (!this.isPending) return Promise.resolve();\n return new Promise((resolve) => this._readyResolvers.push(resolve));\n }\n\n /**\n * インスタンスの動作を開始します。本インスタンスはElementが設定され初期化された際に自動で動作を開始しますが、\n * [[Scroller.stop]]メソッドを利用し動作を停止した後に再開する場合に本メソッドを利用します。\n */\n async start(): Promise<void> {\n this._checkDestroyed();\n if (this.isRunning) return;\n await this.ready();\n this._startListeners();\n this._setState(ScrollerState.Running);\n }\n\n /**\n * インスタンスの動作(スクロール、リサイズイベントの検知等)を停止します。\n * 何らかの理由で動作を停止させたい場合に利用してください。\n * 本メソッドを実行後もインスタンス内の状態は保持されたままです。\n * 完全にインスタンスを破棄するためには[[Scroller.destroy]]を利用してください。\n */\n stop(): void {\n this._checkDestroyed();\n if (!this.isRunning) return;\n this._stopListeners();\n this._setState(ScrollerState.Ready);\n }\n\n /**\n * インスタンスの動作を停止し、内部情報を完全に破棄します。\n * これに伴い、スクロール中であった場合にはキャンセルされ、以後イベント通知は完全に行われません。\n * また[[Scroller.start]]メソッドでの再利用も不可となります。\n * 本インスタンスの利用を完全に停止する場合に必ず実行し、利用側のオブジェクト等において本インスタンスへの参照を完全に削除してください。\n * 本メソッドはSPA等でのサービスにおいては意識的に実行する事を強く推奨します。\n */\n destroy() {\n if (this.isDestroyed) return;\n this.stop();\n this.cancel();\n this._readyResolvers = [];\n this._scrollStoppers = [];\n this._scrollEnable();\n this._observers = [];\n visibilityManager.remove(this._visibilityListener);\n\n delete (this as any)._el;\n delete (this as any)._eventTarget;\n delete this._scrollListener;\n delete this._resizeListener;\n delete (this as any)._resizeObserver;\n delete (this as any)._scrollToResult;\n delete (this as any)._visibilityListener;\n\n this.deleteScrollToElementAdditionalOffset();\n this._setState(ScrollerState.Destroyed);\n this.offAll();\n }\n\n /**\n * インスタンス内部のスクロール量や、Elementのサイズを強制的に更新します。\n * 基本的に利用が必要なケースはありませんが、何らかの理由で更新をトリガーしたい場合に利用します。\n */\n update(): void {\n this._update();\n }\n\n /**\n * インスタンス内の情報をjsonオブジェクトとして返却します。\n * 情報の詳細は[[ScrollerObserver]]を参照してください。\n */\n toJSON(): ScrollerObserver {\n const json: Partial<ScrollerObserver> = {};\n for (const key of scrollerObservableKeys) {\n json[key] = this[key] as any;\n }\n return <ScrollerObserver>json;\n }\n\n /**\n * [[Scroller.toJSON]]の情報を文字列として返却します。\n */\n toString(): string {\n return JSON.stringify(this.toJSON());\n }\n\n /**\n * 本インスタンスの情報を購読するためのオブジェクトを設定する事で、\n * インスタンスの内部情報が変更される度にパラメータが同期されます。\n * 設定するオブジェクトは[[ScrollerObserver]]のインターフェースを満たしていれば内容は問いません。\n * 本機能により同期される方法は単純にオブジェクトプロパティへの変数代入です。\n * 従って対象となるプロパティをgetterとして実装(Ex: Vue computed等、、)しておく事により、\n * 同期を受け取るオブジェクト側でパラメータ変更後の動作をリアクティブに実装可能です。\n * @param observer - 同期させたいオブジェクト\n * @returns 同期を停止するためのメソッド\n */\n observe(observer: ScrollerObserver): () => void {\n if (!this._observers.includes(observer)) {\n this._observers.push(observer);\n }\n this._syncToObserver(observer);\n const unobserve = () => {\n this.unobserve(observer);\n };\n return unobserve;\n }\n\n /**\n * [[Scroller.observe]]でパラメータ同期中のオブジェクトを停止します。\n * [[Scroller.destroy]]実行時にも、同期中のオブジェクトは全停止されますが、destroy前に任意のタイミングで停止したい場合\n * 本メソッドを利用します。\n * @param observer - 同期中のオブジェクト\n */\n unobserve(observer: ScrollerObserver) {\n const index = this._observers.indexOf(observer);\n if (index !== -1) {\n this._observers.splice(index, 1);\n }\n }\n\n /**\n * スクロール中であった場合、スクロールをキャンセルします。\n */\n cancel() {\n if (!this._scrollToResult) return;\n this._scrollToResult.cancel();\n this._clearScrollToResult();\n }\n\n /**\n * x, yの差分pxを指定しスクロールします。\n * メソッド、パラメータの詳細は[[scrollBy]]を参照してください。\n * @param diffX - 横移動量\n * @param diffY - 縦移動量\n * @param options - スクロールオプション\n */\n by(\n diffX: number,\n diffY: number,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollBy(diffX, diffY, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 指定の座標へスクロールします。\n * メソッド、パラメータの詳細は[[scrollTo]]を参照してください。\n * @param scrollPosition - 座標\n * @param options - スクロールオプション\n */\n to(\n scrollPosition: Partial<ScrollPosition>,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollTo(scrollPosition, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 指定の要素の位置へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToElement]]を参照してください。\n * オプションのx, yが未設定であった場合、[[Scroller.baseAxis]]により自動設定されます。\n * @param target - スクロール先の要素\n * @param options - スクロールオプション\n */\n toElement(\n target: ScrollToElementTarget,\n options?: ScrollerScrollToElementOptions,\n ) {\n const merged = this._createMergedScrollToElementOptions(options);\n if (merged.x === undefined) merged.x = this.baseAxis === 'x';\n if (merged.y === undefined) merged.y = this.baseAxis === 'y';\n\n return this._setScrollToResult(scrollToElement(target, merged));\n }\n\n /**\n * 指定の辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToSide]]を参照してください。\n * @param targets - スクロール先\n * @param options - スクロールオプション\n */\n toSide(\n targets: ScrollToSideTargets,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollToSide(targets, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 上辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRight]]を参照してください。\n * @param options - スクロールオプション\n */\n toRight(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRight(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 下辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeft]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeft(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeft(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左上コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeftTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeftTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeftTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左下コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeftBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeftBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeftBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右上コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRightTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toRightTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRightTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右下コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRightBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toRightBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRightBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * スクロールの停止を要求します。\n * @param stopper - 停止要求ソース\n */\n pushScrollStopper(stopper: ScrollStopper) {\n if (!this._scrollStoppers.includes(stopper)) {\n this._scrollStoppers.push(stopper);\n if (this._scrollStoppers.length === 1) {\n this._updateScrollable();\n this._syncToObservers(['scrollEnabled']);\n }\n }\n return () => {\n this.removeScrollStopper(stopper);\n };\n }\n\n /**\n * スクロールの停止要求を解除します。<br>\n * 別のプロセスにより異なる[[ScrollStopper]]が登録されている場合、\n * スクロールは再開されない事に注意してください。\n * @param stopper - 停止要求ソース\n */\n removeScrollStopper(stopper: ScrollStopper) {\n const index = this._scrollStoppers.indexOf(stopper);\n if (index !== -1) {\n this._scrollStoppers.splice(index, 1);\n if (this._scrollStoppers.length === 0) {\n this._updateScrollable();\n this._syncToObservers(['scrollEnabled']);\n }\n }\n }\n\n private async _setup(): Promise<void> {\n this._updateScrollable();\n this._update();\n this._setState(ScrollerState.Ready);\n this.start();\n this.emit('ready', undefined);\n this._readyResolvers.forEach((resolve) => resolve());\n this._readyResolvers = [];\n }\n\n private _setState(state: ScrollerState): void {\n if (this._state !== state) {\n this._state = state;\n this._syncToObservers([\n 'state',\n 'isPending',\n 'isReady',\n 'isRunning',\n 'isDestroyed',\n ]);\n this.emit('changeState', state);\n }\n }\n\n private _checkDestroyed(): void {\n if (this.isDestroyed) {\n const message = 'already destroyed.';\n logger.error(message);\n throw new Error(message);\n }\n }\n\n private _update(width?: number, height?: number): void {\n this._updateContainerSize(width, height);\n this._updateScrollSize();\n this._updateScrollPositions();\n }\n\n private _updateContainerSize(width?: number, height?: number): void {\n const { el, _isBodyElement } = this;\n if (width === undefined) {\n if (!el) return;\n width = _isBodyElement\n ? (document.documentElement as HTMLElement).clientWidth\n : el.clientWidth;\n }\n\n if (height === undefined) {\n if (!el) return;\n height = _isBodyElement\n ? (document.documentElement as HTMLElement).clientHeight\n : el.clientHeight;\n }\n\n const { _containerWidth, _containerHeight } = this;\n this._containerWidth = width;\n this._containerHeight = height;\n if (width !== _containerWidth || height !== _containerHeight) {\n this._syncToObservers([\n 'containerWidth',\n 'containerHeight',\n 'scrollableX',\n 'scrollableY',\n ]);\n this.emit('resize', { width, height });\n }\n }\n\n private _updateScrollSize(): void {\n const { el, _scrollWidth, _scrollHeight } = this;\n if (!el) return;\n this._scrollWidth = el.scrollWidth;\n this._scrollHeight = el.scrollHeight;\n if (\n _scrollWidth !== this._scrollWidth ||\n _scrollHeight !== this._scrollHeight\n ) {\n this._syncToObservers([\n 'scrollWidth',\n 'scrollHeight',\n 'scrollableX',\n 'scrollableY',\n ]);\n }\n }\n\n private _startScrollSizeObserver() {\n if (!IN_WINDOW) return;\n\n this._stopScrollSizeObserver();\n\n if (this.scrollSizeObserver) {\n this._scrollSizeObserverPollingId = window.setInterval(() => {\n if (!this.scrollSizeObserver || this.isDestroyed) {\n this._stopScrollSizeObserver();\n return;\n }\n\n this._updateScrollSize();\n }, this.scrollSizeObserver.interval);\n }\n }\n\n private _stopScrollSizeObserver() {\n if (this._scrollSizeObserverPollingId !== null) {\n clearInterval(this._scrollSizeObserverPollingId);\n this._scrollSizeObserverPollingId = null;\n }\n }\n\n private _updateScrollPositions(): void {\n if (!this.el) return;\n this._scrollTop = this.el.scrollTop;\n this._scrollLeft = this.el.scrollLeft;\n\n // advanced values\n this._scrollBottom =\n this._scrollHeight - this._scrollTop - this._containerHeight;\n this._scrollRight =\n this._scrollWidth - this._scrollLeft - this._containerWidth;\n\n this._syncToObservers([\n 'scrollTop',\n 'scrollRight',\n 'scrollBottom',\n 'scrollLeft',\n ]);\n }\n\n private _startListeners() {\n this._stopListeners();\n\n this._scrollListener = () => {\n this._onScroll();\n };\n this._eventTarget.addEventListener('scroll', this._scrollListener, false);\n\n if (this._isRootElement) {\n this._resizeListener = () => {\n this._onResize();\n };\n window.addEventListener('resize', this._resizeListener, false);\n } else {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this._onResize(width, height);\n }\n });\n this._el && this._resizeObserver.observe(this._el);\n }\n\n if (visibilityManager.isVisible) {\n this._scrollSizeObserverSuspended = false;\n this._startScrollSizeObserver();\n } else {\n this._scrollSizeObserverSuspended = true;\n }\n }\n\n private _stopListeners() {\n if (this._scrollListener) {\n this._eventTarget.removeEventListener(\n 'scroll',\n this._scrollListener,\n false,\n );\n delete this._scrollListener;\n }\n\n if (this._resizeListener) {\n if (this._isDocumentElement) {\n window.removeEventListener('resize', this._resizeListener, false);\n delete this._resizeListener;\n }\n }\n\n if (this._resizeObserver && this._el) {\n this._resizeObserver.unobserve(this._el);\n this._resizeObserver.disconnect();\n delete this._resizeObserver;\n }\n }\n\n private _clearScrollingJudgeTimer() {\n if (this._scrollingJudgeTimerId !== null) {\n clearTimeout(this._scrollingJudgeTimerId);\n this._scrollingJudgeTimerId = null;\n }\n }\n\n private _onResize(width?: number, height?: number) {\n this._update(width, height);\n }\n\n private _triggerScrollTick(event: keyof ScrollerScrollEventMap): void {\n const { _nowScrolling } = this;\n\n if (event === 'scrollStart') {\n this._startX = this._scrollLeft;\n this._startY = this._scrollTop;\n this._lastTotalX = 0;\n this._lastTotalY = 0;\n this._nowScrolling = true;\n } else if (event === 'scrollEnd') {\n this._nowScrolling = false;\n }\n\n if (_nowScrolling !== this._nowScrolling) {\n this._syncToObservers('nowScrolling');\n }\n this.emit(event, this.lastPayload);\n }\n\n private _onScroll() {\n if (!this.scrollEnabled && this._el) {\n this._el.scrollLeft = this._scrollLeft;\n this._el.scrollTop = this._scrollTop;\n return;\n }\n\n // remember before values\n const {\n _scrollTop,\n _scrollLeft,\n _lastAxis,\n _lastDirection,\n _lastXDirection,\n _lastYDirection,\n } = this;\n\n // ,,,and next update values\n this._updateScrollPositions();\n\n // calculate scrolled amount at (ticked time)\n const tickedX = this._scrollLeft - _scrollLeft;\n const tickedY = this._scrollTop - _scrollTop;\n this._tickedX = tickedX;\n this._tickedY = tickedY;\n\n // update axis\n if (tickedX === tickedY) {\n this._lastAxis = this.baseAxis;\n } else {\n this._lastAxis = Math.abs(tickedX) > Math.abs(tickedY) ? 'x' : 'y';\n }\n\n // update directions\n if (_scrollTop < this._scrollTop) {\n this._lastYDirection = 'bottom';\n } else if (_scrollTop > this._scrollTop) {\n this._lastYDirection = 'top';\n }\n\n if (_scrollLeft < this._scrollLeft) {\n this._lastXDirection = 'right';\n } else if (_scrollLeft > this._scrollLeft) {\n this._lastXDirection = 'left';\n }\n\n this._lastDirection =\n this._lastAxis === 'y' ? this._lastYDirection : this._lastXDirection;\n\n // judge scroll end by before axis and directions\n const axisIsChanged = this._lastAxis !== _lastAxis;\n const lastXDirectionIsChanged = this._lastXDirection !== _lastXDirection;\n const lastYDirectionIsChanged = this._lastYDirection !== _lastYDirection;\n const lastDirectionIsChanged = this._lastDirection !== _lastDirection;\n\n if (axisIsChanged) {\n this.emit('changeAxis', this._lastAxis);\n }\n\n if (lastXDirectionIsChanged) {\n this.emit('changeLastXDirection', this._lastXDirection);\n }\n\n if (lastYDirectionIsChanged) {\n this.emit('changeLastYDirection', this._lastYDirection);\n }\n\n if (lastDirectionIsChanged) {\n this.emit('changeLastDirection', this._lastDirection);\n }\n\n if (\n axisIsChanged ||\n lastXDirectionIsChanged ||\n lastYDirectionIsChanged ||\n lastDirectionIsChanged\n ) {\n this._syncToObservers([\n 'lastAxis',\n 'lastDirection',\n 'lastYDirection',\n 'lastXDirection',\n ]);\n }\n\n if (this._nowScrolling) {\n if (\n axisIsChanged ||\n (_lastAxis === 'y' && lastYDirectionIsChanged) ||\n (_lastAxis === 'x' && lastXDirectionIsChanged)\n ) {\n // emit scroll end & start(both)\n this._triggerScrollTick('scrollEnd');\n } else {\n // add scroll amounts\n this._lastTotalX = this._scrollLeft - this._startX;\n this._lastTotalY = this._scrollTop - this._startY;\n this._triggerScrollTick('scroll');\n }\n }\n\n // judge scroll start\n if (!this._nowScrolling) {\n this._updateScrollSize();\n this._triggerScrollTick('scrollStart');\n }\n\n this._clearScrollingJudgeTimer();\n this._scrollingJudgeTimerId = window.setTimeout(() => {\n this._triggerScrollTick('scrollEnd');\n }, this.scrollingJudgeInterval);\n }\n\n private _syncToObserver(\n observer: ScrollerObserver,\n keys: ScrollerObservableKeys[] = scrollerObservableKeys,\n ) {\n for (const key of keys) {\n (observer as any)[key] = this[key];\n }\n }\n\n private _syncToObservers(\n keys: ScrollerObservableKeys | ScrollerObservableKeys[],\n ) {\n if (this._observers.length === 0) return;\n keys = typeof keys === 'string' ? [keys] : keys;\n for (const observer of this._observers) {\n this._syncToObserver(observer, keys);\n }\n }\n\n private _checkElement() {\n const { _el } = this;\n if (!_el) {\n const message = 'missing element';\n logger.error(message);\n throw new Error(message);\n }\n return _el;\n }\n\n private _createMergedScrollOptions(\n source?: ScrollerScrollOptions,\n ): ScrollOptions {\n const el = this._checkElement();\n const merged: ScrollOptions = {\n container: el,\n ...this.scrollSettingsDefaults,\n ...source,\n };\n return merged;\n }\n\n private _createMergedScrollToElementOptions(\n source?: ScrollerScrollToElementOptions,\n ): ScrollToElementOptions {\n const el = this._checkElement();\n const merged: ScrollToElementOptions = {\n container: el,\n ...this.scrollToElementSettingsDefaults,\n ...source,\n };\n let { _scrollToElementAdditionalOffset: additionalOffset } = this;\n if (!additionalOffset) return merged;\n if (typeof additionalOffset === 'function') {\n additionalOffset = additionalOffset(this);\n }\n if (!additionalOffset) return merged;\n if (typeof additionalOffset === 'number') {\n additionalOffset = {\n x: additionalOffset,\n y: additionalOffset,\n };\n }\n let { offset } = merged;\n if (!offset) {\n merged.offset = additionalOffset;\n return merged;\n }\n if (typeof offset === 'number') {\n offset = {\n x: offset,\n y: offset,\n };\n }\n\n offset.x = (offset.x || 0) + (additionalOffset.x || 0);\n offset.y = (offset.y || 0) + (additionalOffset.y || 0);\n merged.offset = offset;\n return merged;\n }\n\n private _clearScrollToResult() {\n if (!this._scrollToResult) return;\n this._scrollToResult = null;\n }\n\n private _setScrollToResult(result: ScrollResult): ScrollResult {\n this._scrollToResult = result;\n result.promise.then(() => {\n this._clearScrollToResult();\n });\n return result;\n }\n\n private _updateScrollable() {\n if (this.scrollEnabled) {\n this._scrollEnable();\n } else {\n this._scrollDisable();\n }\n }\n\n private _scrollEnable() {\n enableScroll(this._checkElement());\n }\n\n private _scrollDisable() {\n const el = this._checkElement();\n this.cancel();\n disableScroll(el);\n }\n}\n","// export const HAS_WINDOW = typeof window !== 'undefined';\n\n// export function warn(message: string): void {\n// if (typeof console === 'object' && console.warn) {\n// console.warn(`[scroller] ${message}`);\n// }\n// }\n\n// export function error(message: string): Error {\n// return new Error(`[scroller] ${message}`);\n// }\n\nexport function isDocumentElement(el: Element): el is HTMLHtmlElement {\n return el.constructor === HTMLHtmlElement;\n}\n\nexport function isBodyElement(el: Element): el is HTMLBodyElement {\n return el.constructor === HTMLBodyElement;\n}\n\nexport function isRootElement(\n el: Element,\n): el is HTMLHtmlElement | HTMLBodyElement {\n return isDocumentElement(el) || isBodyElement(el);\n}\n","import { TinyLogger } from '@fastkit/tiny-logger';\n\nexport const logger = new TinyLogger('scroller');\n","// space: 32, page up: 33, page down: 34, end: 35, home: 36\n// left: 37, up: 38, right: 39, down: 40\nexport const SCROLLABLE_KEY_CODES = [32, 33, 34, 35, 36, 37, 38, 39, 40];\n\nexport interface PreventScrollOptions {\n hideScrollbar: boolean;\n}\n\nexport interface PreventScrollContext {\n options: PreventScrollOptions;\n el: PreventScrollElement;\n overflowOrigin?: string | null;\n lockPosition: {\n x: number;\n y: number;\n };\n}\n\nexport interface PreventScrollElement extends HTMLElement {\n __ps_ctx__: PreventScrollContext;\n}\n\nconst eventListenerOptions: AddEventListenerOptions = {\n passive: false,\n};\n\nconst handleWheel = (e: WheelEvent) => {\n e.preventDefault();\n};\n\nconst handleScroll = (e: Event) => {\n const el = e.target as PreventScrollElement;\n if (el && el.__ps_ctx__) {\n el.scrollTo(el.__ps_ctx__.lockPosition.x, el.__ps_ctx__.lockPosition.y);\n }\n};\n\nconst handleKeydown = (e: KeyboardEvent) => {\n if (\n e.target &&\n ['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement).tagName)\n ) {\n return;\n }\n if (SCROLLABLE_KEY_CODES.includes(e.which)) {\n e.preventDefault();\n }\n};\n\nexport function enableScroll(el: Element) {\n const _el: PreventScrollElement = <PreventScrollElement>el;\n if (!_el.__ps_ctx__) return;\n\n const { options } = _el.__ps_ctx__;\n\n _el.removeEventListener('wheel', handleWheel, eventListenerOptions);\n _el.removeEventListener('scroll', handleScroll, eventListenerOptions);\n _el.removeEventListener('keydown', handleKeydown);\n\n if (options.hideScrollbar) {\n _el.style.overflow = _el.__ps_ctx__.overflowOrigin as string;\n }\n delete (_el as any).__ps_ctx__;\n}\n\nexport function disableScroll(\n el: Element,\n opts: Partial<PreventScrollOptions> = {},\n) {\n const { hideScrollbar = false } = opts;\n\n const _el: PreventScrollElement = <PreventScrollElement>el;\n if (_el.__ps_ctx__) return;\n\n const options = {\n hideScrollbar,\n };\n\n _el.__ps_ctx__ = {\n options,\n el: _el,\n overflowOrigin: _el.style.overflow,\n lockPosition: {\n x: _el.scrollLeft || (_el as any).scrollX,\n y: _el.scrollTop || (_el as any).scrollY,\n },\n };\n\n if (options.hideScrollbar) {\n _el.style.overflow = 'hidden';\n }\n\n _el.addEventListener('wheel', handleWheel, eventListenerOptions);\n _el.addEventListener('scroll', handleScroll, eventListenerOptions);\n _el.addEventListener('keydown', handleKeydown);\n}\n","import { EasingName } from './easings';\n\n/**\n * スクロール系メソッドの基本オプション設定です。\n */\nexport interface ScrollBaseSettings {\n /**\n * アニメーションの総合時間をms単位で指定します。\n */\n duration: number;\n\n /**\n * アニメーションのイージングを指定します。\n * {@link EasingName}\n */\n easing: EasingName;\n\n /**\n * スクロールアニメーションがユーザーのインタラクションにより中断可能かをboolean値で示します。\n */\n cancelable: boolean;\n}\n\n/**\n * Scrollerで利用するスクロール系メソッドのオプション設定です。\n */\nexport interface ScrollerScrollSettings extends ScrollBaseSettings {\n onProgress?: ScrollCallback;\n onCancel?: ScrollCallback;\n onDone?: ScrollCallback;\n}\n\nexport interface ScrollSettings extends ScrollerScrollSettings {\n container: string | Element;\n}\n\nexport type ScrollerScrollOptions = Partial<ScrollerScrollSettings>;\nexport type ScrollOptions = Partial<ScrollSettings>;\n\n/**\n * スクロール関連メソッドによるスクロールアニメーションをキャンセルするメソッドです。<br>\n * ユーザーのインタラクション起因の中断の場合、Eventオブジェクトが渡されます。\n */\nexport type ScrollCanceller = (\n event?: Event | null,\n checkCancelable?: boolean,\n) => void;\n\n/**\n * スクロール関連メソッドの返却値となるインターフェースです。\n */\nexport interface ScrollResult {\n /**\n * スクロールをキャンセルするメソッドです。\n */\n cancel: ScrollCanceller;\n\n /**\n * スクロールの完了、キャンセル、中断を問わず終了を検知するPromiseインスタンスです。\n */\n promise: Promise<void>; // resolve when done or cancel\n\n /**\n * スクロール開始位置から完了位置までの想定px数をx、y軸共に返却します。<br>\n * スクロールが途中でキャンセルされた場合はこのpxが加算されていない事もあります。\n */\n plans: { x: number; y: number };\n}\n\n/**\n * スクロール関連の各種メソッドにおいて、コールバックメソッドに渡されるインターフェースです。\n */\nexport interface ScrollCallbackValues {\n /**\n * スクロール中のコンテナ要素です。\n */\n container: Element;\n\n /**\n * スクロールの進捗を0〜1で示します。\n */\n progress: number;\n\n /**\n * スクロールが中断されている場合trueを示します。\n */\n aborted: boolean;\n\n /**\n * ユーザーのインタラクションによりスクロールが中断されていた場合、そのEventオブジェクトが設定されます。\n */\n abortEventSource: Event | null;\n}\n\nexport type ScrollCallback = (\n scrollToCallbackValues: ScrollCallbackValues,\n) => any;\n\n/**\n * スクロール値をx軸、y軸で示します。\n */\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const defaultBaseSettings: ScrollBaseSettings = {\n duration: 500,\n easing: 'ease',\n cancelable: true,\n};\n\nexport const defaultSettings: ScrollSettings = {\n get container(): Element {\n return document.scrollingElement as Element;\n },\n ...defaultBaseSettings,\n};\n","import BezierEasing, { EasingFunction } from 'bezier-easing';\nimport { removeUndef } from '@fastkit/helpers';\nimport easings, { EasingValues } from './easings';\nimport {\n ScrollResult,\n ScrollCallbackValues,\n ScrollOptions,\n defaultSettings,\n} from './schemes';\nimport {\n $,\n on,\n off,\n getContainerDimension,\n HTMLElementEventMapKey,\n error,\n} from './util';\nimport { PreventScrollElement } from '../prevent-scroll';\n\ninterface ComputedValues {\n $container: HTMLElement;\n initialX: number;\n initialY: number;\n targetX: number;\n targetY: number;\n}\n\nconst abortEvents: HTMLElementEventMapKey[] = [\n 'mousedown',\n 'wheel',\n 'DOMMouseScroll',\n 'mousewheel',\n 'keyup',\n 'touchmove',\n];\n\nexport function scroll(\n diffX: number,\n diffY: number,\n // eslint-disable-next-line default-param-last\n options: ScrollOptions = {},\n _computedValues?: ComputedValues,\n): ScrollResult {\n let $container: HTMLElement;\n let initialX: number;\n let initialY: number;\n let targetX: number;\n let targetY: number;\n\n const _options = { ...defaultSettings, ...removeUndef(options) };\n const {\n container,\n duration,\n easing,\n cancelable,\n onProgress,\n onCancel,\n onDone,\n } = _options;\n\n const x = diffX !== 0;\n const y = diffY !== 0;\n\n if (_computedValues) {\n $container = _computedValues.$container;\n initialX = _computedValues.initialX;\n initialY = _computedValues.initialY;\n targetX = _computedValues.targetX;\n targetY = _computedValues.targetY;\n } else {\n $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n initialX = $container.scrollLeft;\n initialY = $container.scrollTop;\n targetX = initialX + diffX;\n targetY = initialY + diffY;\n }\n\n // compute overflow and adjust values\n const { scrollWidth, scrollHeight } = $container;\n const { width, height } = getContainerDimension($container);\n const overflowX = targetX + width - scrollWidth;\n const overflowY = targetY + height - scrollHeight;\n if (overflowX > 0) {\n diffX -= overflowX;\n targetX -= overflowX;\n }\n if (overflowY > 0) {\n diffY -= overflowY;\n targetY -= overflowY;\n }\n\n //\n // Setup Temporary values\n //\n // eslint-disable-next-line @typescript-eslint/ban-types\n let doneResolver: Function;\n let timeStart = 0;\n let timeElapsed: number;\n\n const callbackValues: ScrollCallbackValues = {\n container: $container,\n progress: 0,\n aborted: false,\n abortEventSource: null,\n };\n\n const result: ScrollResult = {\n cancel: canceller,\n promise: new Promise((resolve) => {\n doneResolver = resolve;\n }),\n plans: {\n x: diffX,\n y: diffY,\n },\n };\n\n //\n // processes\n //\n if (\n (diffY === 0 && diffX === 0) ||\n !!($container as PreventScrollElement).__ps_ctx__\n )\n return initialAbort();\n\n // setup easings\n let easingValues: EasingValues;\n if (!easing) {\n easingValues = easings.ease;\n } else if (typeof easing === 'string') {\n easingValues = easings[_options.easing];\n } else {\n easingValues = easing;\n }\n const easingFn: EasingFunction = BezierEasing.apply(\n BezierEasing,\n easingValues,\n );\n\n on($container, abortEvents, abortFn, { passive: true });\n window.requestAnimationFrame(step);\n return result;\n\n //\n // inner methods\n //\n function doneResolve(): void {\n doneResolver();\n }\n\n function canceller(e: Event | null = null, checkCancelable = false) {\n if (checkCancelable && !cancelable) return;\n off($container, abortEvents, abortFn);\n callbackValues.abortEventSource = e;\n callbackValues.aborted = true;\n onCancel && onCancel(callbackValues);\n }\n\n function abortFn(e: Event) {\n canceller(e, true);\n }\n\n function initialAbort(e: Event | null = null) {\n canceller(e);\n doneResolve();\n return result;\n }\n\n function step(timestamp: number): void {\n if (callbackValues.aborted) return done();\n if (!timeStart) timeStart = timestamp;\n\n timeElapsed = timestamp - timeStart;\n\n let progress = Math.min(timeElapsed / duration, 1);\n progress = easingFn(progress);\n callbackValues.progress = progress;\n\n topLeft(initialY + diffY * progress, initialX + diffX * progress);\n onProgress && onProgress(callbackValues);\n\n timeElapsed < duration ? window.requestAnimationFrame(step) : done();\n }\n\n function topLeft(top: number, left: number) {\n if (y) $container.scrollTop = top;\n if (x) $container.scrollLeft = left;\n }\n\n function done() {\n if (!callbackValues.aborted) topLeft(targetY, targetX);\n timeStart = 0;\n off($container, abortEvents, abortFn);\n callbackValues.progress = 1;\n doneResolve();\n if (!callbackValues.aborted && onDone) onDone(callbackValues);\n }\n}\n","const easings = {\n ease: [0.25, 0.1, 0.25, 1.0] as EasingValues,\n linear: [0.0, 0.0, 1.0, 1.0] as EasingValues,\n 'ease-in': [0.42, 0.0, 1.0, 1.0] as EasingValues,\n 'ease-out': [0.0, 0.0, 0.58, 1.0] as EasingValues,\n 'ease-in-out': [0.42, 0.0, 0.58, 1.0] as EasingValues,\n};\nexport type EasingName = keyof typeof easings;\nexport type EasingValues = [number, number, number, number];\nexport default easings;\n","import { logger } from '../logger';\n\nexport function isBodyElement(el: Element): el is HTMLBodyElement {\n return el.tagName.toLowerCase() === 'body';\n}\n\nexport function getContainerDimension(el: Element) {\n if (isBodyElement(el)) {\n const documentElement = <HTMLElement>document.documentElement;\n return {\n // width: window.innerWidth,\n // height: window.innerHeight,\n width: documentElement.clientWidth,\n height: documentElement.clientWidth,\n };\n }\n return {\n width: el.clientWidth,\n height: el.clientHeight,\n };\n}\n\nexport function $(selectorOrElement: string | Element): HTMLElement | null {\n if (typeof selectorOrElement !== 'string')\n return selectorOrElement as HTMLElement;\n return document.querySelector(selectorOrElement);\n}\n\nexport function cumulativeOffset(element: Element) {\n let top = 0;\n let left = 0;\n let el: HTMLElement | null = element as HTMLElement;\n\n while (el) {\n top += el.offsetTop || 0;\n left += el.offsetLeft || 0;\n el = el.offsetParent as HTMLElement;\n }\n\n return {\n top,\n left,\n };\n}\n\nexport type HTMLElementEventMapKey =\n | keyof HTMLElementEventMap\n | 'DOMMouseScroll'\n | 'mousewheel';\n\nexport function on(\n element: Element,\n events: HTMLElementEventMapKey | HTMLElementEventMapKey[],\n handler: EventListenerOrEventListenerObject,\n opts = { passive: false },\n) {\n if (!Array.isArray(events)) events = [events];\n for (let i = 0; i < events.length; i++) {\n element.addEventListener(events[i], handler, opts);\n }\n}\n\nexport function off(\n element: Element,\n events: HTMLElementEventMapKey | HTMLElementEventMapKey[],\n handler: EventListenerOrEventListenerObject,\n) {\n if (!Array.isArray(events)) events = [events];\n for (let i = 0; i < events.length; i++) {\n element.removeEventListener(events[i], handler);\n }\n}\n\nexport function warn(message: string): void {\n logger.warn(message);\n}\n\nexport function error(message: string): Error {\n return new Error(`[scroll] ${message}`);\n}\n","import { scroll } from './scroll-by-internal';\nimport { ScrollOptions, ScrollResult } from './schemes';\n\n/**\n * 指定の差分だけコンテナをスクロールします。\n * @param diffX - 横軸の移動量(px)です。デフォルトは0です。\n * @param diffY - 縦軸の移動量(px)です。デフォルトは0です。\n * @param options - スクロールオプション\n */\nexport function scrollBy(\n diffX: number,\n diffY: number,\n options?: ScrollOptions,\n): ScrollResult {\n return scroll(diffX, diffY, options);\n}\n","import { scroll } from './scroll-by-internal';\nimport {\n ScrollOptions,\n defaultSettings,\n ScrollPosition,\n ScrollResult,\n} from './schemes';\nimport { $, error } from './util';\n\n/**\n * 任意の位置(px)へコンテナをスクロールします。\n * @param scrollPosition - スクロール先を指定します。x, y 共にオプショナルなるです。未指定の軸は現在のスクロール値のまま保持されます。\n * @param options - スクロールオプション\n */\nexport function scrollTo(\n scrollPosition: Partial<ScrollPosition>,\n options: ScrollOptions = {},\n): ScrollResult {\n let { x, y } = scrollPosition;\n const container = options.container || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n const initialY = $container.scrollTop;\n const initialX = $container.scrollLeft;\n if (x === undefined) x = initialX;\n if (y === undefined) y = initialY;\n const diffX = x - initialX;\n const diffY = y - initialY;\n\n return scroll(diffX, diffY, options, {\n $container,\n initialX,\n initialY,\n targetX: x,\n targetY: y,\n });\n}\n","import { scroll } from './scroll-by-internal';\nimport { ScrollOptions, ScrollResult, defaultSettings } from './schemes';\nimport { $, cumulativeOffset, error } from './util';\n\n/**\n * スクロール先の要素をElement or CSSクエリストリングで示します。\n */\nexport type ScrollToElementTarget = string | Element;\n\n/**\n * 要素へスクロールする際のオプション設定です。\n */\nexport interface ScrollToElementSettings {\n /**\n * 要素へスクロールする際、そのスクロール先をずらす際に設定します。<br>\n * x, y 個別に設定が可能ですが、シングルのnumberのみを指定した場合、x, y のそれぞれのオプションが有効な場合にのみその軸に設定されます。\n */\n offset: number | { x?: number; y?: number };\n\n /**\n * 横スクロールの可否を示します。\n */\n x: boolean;\n\n /**\n * 縦スクロールの可否を示します。\n */\n y: boolean;\n}\n\n/**\n * 要素スクロール利用事のデフォルト設定です。\n * {@link ScrollToElementSettings}\n */\nexport const scrollToElementSettingsDefaults: ScrollToElementSettings = {\n offset: 0,\n x: false,\n y: true,\n};\n\n/**\n * 要素へスクロールさせる際のオプション設定です。\n */\nexport type ScrollToElementOptions = Partial<\n ScrollOptions & ScrollToElementSettings\n>;\n\n/**\n * 任意の要素の位置へスクロールします。\n * @param target - スクロール先の要素\n * @param options - スクロールオプション\n */\nexport function scrollToElement(\n target: ScrollToElementTarget,\n options: ScrollToElementOptions = {},\n): ScrollResult {\n //\n // Setup Options\n //\n\n const _options = { ...scrollToElementSettingsDefaults, ...options };\n\n const { x, y } = _options;\n\n const offsetSource = _options.offset;\n\n const offset =\n typeof offsetSource === 'number'\n ? { x: offsetSource, y: offsetSource }\n : offsetSource;\n\n //\n // Setup Elements\n //\n\n const $target = $(target) as HTMLElement;\n if (!$target) throw error(`missing element ${target}`);\n\n const container = _options.container || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n\n const cumulativeOffsetContainer = cumulativeOffset($container);\n const cumulativeOffsetTarget = cumulativeOffset($target);\n\n const initialY = $container.scrollTop;\n const initialX = $container.scrollLeft;\n\n const targetY =\n cumulativeOffsetTarget.top -\n cumulativeOffsetContainer.top +\n (offset.y || 0);\n\n const targetX =\n cumulativeOffsetTarget.left -\n cumulativeOffsetContainer.left +\n (offset.x || 0);\n\n const diffX = x ? targetX - initialX : 0;\n const diffY = y ? targetY - initialY : 0;\n\n return scroll(diffX, diffY, _options, {\n $container,\n initialX,\n initialY,\n targetX,\n targetY,\n });\n}\n","import {\n ScrollOptions,\n ScrollResult,\n defaultSettings,\n ScrollPosition,\n} from './schemes';\nimport { $, error } from './util';\nimport { scrollTo } from './scroll-to';\n\n/**\n * y軸の両端の辺を示します。\n */\nexport type ScrollYSide = 'top' | 'bottom';\n\n/**\n * x軸の両端の辺を示します。\n */\nexport type ScrollXSide = 'left' | 'right';\n\n/**\n * コンテナの4辺を示します。\n */\nexport type ScrollSide = ScrollYSide | ScrollXSide;\n\n/**\n * コンテナの辺へスクロールさせる際のターゲット指定のパターンです。\n */\nexport type ScrollToSideTargets =\n | ScrollSide\n | [ScrollSide]\n | [ScrollYSide, ScrollXSide]\n | [ScrollXSide, ScrollYSide];\n\n/**\n * コンテナをいずれかの辺までスクロールします。\n * @param targets - 辺を指定します。シングルの文字列、及び配列に対応しています。\n * @param options - スクロールオプション\n */\nexport function scrollToSide(\n targets: ScrollToSideTargets,\n options?: ScrollOptions,\n): ScrollResult {\n const sides: ScrollSide[] = typeof targets === 'string' ? [targets] : targets;\n const position: Partial<ScrollPosition> = {};\n\n const hasRight = sides.includes('right');\n const hasBottom = sides.includes('bottom');\n\n if (sides.includes('top')) {\n position.y = 0;\n }\n\n if (sides.includes('left')) {\n position.x = 0;\n }\n\n if (hasRight || hasBottom) {\n const container =\n (options && options.container) || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n\n if (hasRight) position.x = $container.scrollWidth;\n if (hasBottom) position.y = $container.scrollHeight;\n }\n\n return scrollTo(position, options);\n}\n\n/**\n * コンテナを上辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToTop(options?: ScrollOptions) {\n return scrollToSide('top', options);\n}\n\n/**\n * コンテナを右辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRight(options?: ScrollOptions) {\n return scrollToSide('right', options);\n}\n\n/**\n * コンテナを下辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToBottom(options?: ScrollOptions) {\n return scrollToSide('bottom', options);\n}\n\n/**\n * コンテナを左辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeft(options?: ScrollOptions) {\n return scrollToSide('left', options);\n}\n\n/**\n * コンテナを左上コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeftTop(options?: ScrollOptions) {\n return scrollToSide(['left', 'top'], options);\n}\n\n/**\n * コンテナを左下コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeftBottom(options?: ScrollOptions) {\n return scrollToSide(['left', 'bottom'], options);\n}\n\n/**\n * コンテナを右上コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRightTop(options?: ScrollOptions) {\n return scrollToSide(['right', 'top'], options);\n}\n\n/**\n * コンテナを右下コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRightBottom(options?: ScrollOptions) {\n return scrollToSide(['right', 'bottom'], options);\n}\n"]}
1
+ {"version":3,"sources":["../src/util.ts","../src/logger.ts","../src/prevent-scroll.ts","../src/scroll/schemes.ts","../src/scroll/easings.ts","../src/scroll/util.ts","../src/scroll/scroll-by-internal.ts","../src/scroll/scroll-by.ts","../src/scroll/scroll-to.ts","../src/scroll/scroll-to-element.ts","../src/scroll/scroll-to-side.ts","../src/scroller.ts"],"names":["isBodyElement","ScrollerState"],"mappings":"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","file":"scroller.mjs","sourcesContent":["// export const HAS_WINDOW = typeof window !== 'undefined';\n\n// export function warn(message: string): void {\n// if (typeof console === 'object' && console.warn) {\n// console.warn(`[scroller] ${message}`);\n// }\n// }\n\n// export function error(message: string): Error {\n// return new Error(`[scroller] ${message}`);\n// }\n\nexport function isDocumentElement(el: Element): el is HTMLHtmlElement {\n return el.constructor === HTMLHtmlElement;\n}\n\nexport function isBodyElement(el: Element): el is HTMLBodyElement {\n return el.constructor === HTMLBodyElement;\n}\n\nexport function isRootElement(\n el: Element,\n): el is HTMLHtmlElement | HTMLBodyElement {\n return isDocumentElement(el) || isBodyElement(el);\n}\n","import { TinyLogger } from '@fastkit/tiny-logger';\n\nexport const logger = new TinyLogger('scroller');\n","// space: 32, page up: 33, page down: 34, end: 35, home: 36\n// left: 37, up: 38, right: 39, down: 40\nexport const SCROLLABLE_KEY_CODES = [32, 33, 34, 35, 36, 37, 38, 39, 40];\n\nexport interface PreventScrollOptions {\n hideScrollbar: boolean;\n}\n\nexport interface PreventScrollContext {\n options: PreventScrollOptions;\n el: PreventScrollElement;\n overflowOrigin?: string | null;\n lockPosition: {\n x: number;\n y: number;\n };\n}\n\nexport interface PreventScrollElement extends HTMLElement {\n __ps_ctx__: PreventScrollContext;\n}\n\nconst eventListenerOptions: AddEventListenerOptions = {\n passive: false,\n};\n\nconst handleWheel = (e: WheelEvent) => {\n e.preventDefault();\n};\n\nconst handleScroll = (e: Event) => {\n const el = e.target as PreventScrollElement;\n if (el && el.__ps_ctx__) {\n el.scrollTo(el.__ps_ctx__.lockPosition.x, el.__ps_ctx__.lockPosition.y);\n }\n};\n\nconst handleKeydown = (e: KeyboardEvent) => {\n if (\n e.target &&\n ['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement).tagName)\n ) {\n return;\n }\n if (SCROLLABLE_KEY_CODES.includes(e.which)) {\n e.preventDefault();\n }\n};\n\nexport function enableScroll(el: Element) {\n const _el: PreventScrollElement = <PreventScrollElement>el;\n if (!_el.__ps_ctx__) return;\n\n const { options } = _el.__ps_ctx__;\n\n _el.removeEventListener('wheel', handleWheel, eventListenerOptions);\n _el.removeEventListener('scroll', handleScroll, eventListenerOptions);\n _el.removeEventListener('keydown', handleKeydown);\n\n if (options.hideScrollbar) {\n _el.style.overflow = _el.__ps_ctx__.overflowOrigin as string;\n }\n delete (_el as any).__ps_ctx__;\n}\n\nexport function disableScroll(\n el: Element,\n opts: Partial<PreventScrollOptions> = {},\n) {\n const { hideScrollbar = false } = opts;\n\n const _el: PreventScrollElement = <PreventScrollElement>el;\n if (_el.__ps_ctx__) return;\n\n const options = {\n hideScrollbar,\n };\n\n _el.__ps_ctx__ = {\n options,\n el: _el,\n overflowOrigin: _el.style.overflow,\n lockPosition: {\n x: _el.scrollLeft || (_el as any).scrollX,\n y: _el.scrollTop || (_el as any).scrollY,\n },\n };\n\n if (options.hideScrollbar) {\n _el.style.overflow = 'hidden';\n }\n\n _el.addEventListener('wheel', handleWheel, eventListenerOptions);\n _el.addEventListener('scroll', handleScroll, eventListenerOptions);\n _el.addEventListener('keydown', handleKeydown);\n}\n","import { EasingName } from './easings';\n\n/**\n * スクロール系メソッドの基本オプション設定です。\n */\nexport interface ScrollBaseSettings {\n /**\n * アニメーションの総合時間をms単位で指定します。\n */\n duration: number;\n\n /**\n * アニメーションのイージングを指定します。\n * {@link EasingName}\n */\n easing: EasingName;\n\n /**\n * スクロールアニメーションがユーザーのインタラクションにより中断可能かをboolean値で示します。\n */\n cancelable: boolean;\n}\n\n/**\n * Scrollerで利用するスクロール系メソッドのオプション設定です。\n */\nexport interface ScrollerScrollSettings extends ScrollBaseSettings {\n onProgress?: ScrollCallback;\n onCancel?: ScrollCallback;\n onDone?: ScrollCallback;\n}\n\nexport interface ScrollSettings extends ScrollerScrollSettings {\n container: string | Element;\n}\n\nexport type ScrollerScrollOptions = Partial<ScrollerScrollSettings>;\nexport type ScrollOptions = Partial<ScrollSettings>;\n\n/**\n * スクロール関連メソッドによるスクロールアニメーションをキャンセルするメソッドです。<br>\n * ユーザーのインタラクション起因の中断の場合、Eventオブジェクトが渡されます。\n */\nexport type ScrollCanceller = (\n event?: Event | null,\n checkCancelable?: boolean,\n) => void;\n\n/**\n * スクロール関連メソッドの返却値となるインターフェースです。\n */\nexport interface ScrollResult {\n /**\n * スクロールをキャンセルするメソッドです。\n */\n cancel: ScrollCanceller;\n\n /**\n * スクロールの完了、キャンセル、中断を問わず終了を検知するPromiseインスタンスです。\n */\n promise: Promise<void>; // resolve when done or cancel\n\n /**\n * スクロール開始位置から完了位置までの想定px数をx、y軸共に返却します。<br>\n * スクロールが途中でキャンセルされた場合はこのpxが加算されていない事もあります。\n */\n plans: { x: number; y: number };\n}\n\n/**\n * スクロール関連の各種メソッドにおいて、コールバックメソッドに渡されるインターフェースです。\n */\nexport interface ScrollCallbackValues {\n /**\n * スクロール中のコンテナ要素です。\n */\n container: Element;\n\n /**\n * スクロールの進捗を0〜1で示します。\n */\n progress: number;\n\n /**\n * スクロールが中断されている場合trueを示します。\n */\n aborted: boolean;\n\n /**\n * ユーザーのインタラクションによりスクロールが中断されていた場合、そのEventオブジェクトが設定されます。\n */\n abortEventSource: Event | null;\n}\n\nexport type ScrollCallback = (\n scrollToCallbackValues: ScrollCallbackValues,\n) => any;\n\n/**\n * スクロール値をx軸、y軸で示します。\n */\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const defaultBaseSettings: ScrollBaseSettings = {\n duration: 500,\n easing: 'ease',\n cancelable: true,\n};\n\nexport const defaultSettings: ScrollSettings = {\n get container(): Element {\n return document.scrollingElement as Element;\n },\n ...defaultBaseSettings,\n};\n","const easings = {\n ease: [0.25, 0.1, 0.25, 1.0] as EasingValues,\n linear: [0.0, 0.0, 1.0, 1.0] as EasingValues,\n 'ease-in': [0.42, 0.0, 1.0, 1.0] as EasingValues,\n 'ease-out': [0.0, 0.0, 0.58, 1.0] as EasingValues,\n 'ease-in-out': [0.42, 0.0, 0.58, 1.0] as EasingValues,\n};\nexport type EasingName = keyof typeof easings;\nexport type EasingValues = [number, number, number, number];\nexport default easings;\n","import { logger } from '../logger';\n\nexport function isBodyElement(el: Element): el is HTMLBodyElement {\n return el.tagName.toLowerCase() === 'body';\n}\n\nexport function getContainerDimension(el: Element) {\n if (isBodyElement(el)) {\n const documentElement = <HTMLElement>document.documentElement;\n return {\n // width: window.innerWidth,\n // height: window.innerHeight,\n width: documentElement.clientWidth,\n height: documentElement.clientWidth,\n };\n }\n return {\n width: el.clientWidth,\n height: el.clientHeight,\n };\n}\n\nexport function $(selectorOrElement: string | Element): HTMLElement | null {\n if (typeof selectorOrElement !== 'string')\n return selectorOrElement as HTMLElement;\n return document.querySelector(selectorOrElement);\n}\n\nexport function cumulativeOffset(element: Element) {\n let top = 0;\n let left = 0;\n let el: HTMLElement | null = element as HTMLElement;\n\n while (el) {\n top += el.offsetTop || 0;\n left += el.offsetLeft || 0;\n el = el.offsetParent as HTMLElement;\n }\n\n return {\n top,\n left,\n };\n}\n\nexport type HTMLElementEventMapKey =\n | keyof HTMLElementEventMap\n | 'DOMMouseScroll'\n | 'mousewheel';\n\nexport function on(\n element: Element,\n events: HTMLElementEventMapKey | HTMLElementEventMapKey[],\n handler: EventListenerOrEventListenerObject,\n opts = { passive: false },\n) {\n if (!Array.isArray(events)) events = [events];\n for (let i = 0; i < events.length; i++) {\n element.addEventListener(events[i], handler, opts);\n }\n}\n\nexport function off(\n element: Element,\n events: HTMLElementEventMapKey | HTMLElementEventMapKey[],\n handler: EventListenerOrEventListenerObject,\n) {\n if (!Array.isArray(events)) events = [events];\n for (let i = 0; i < events.length; i++) {\n element.removeEventListener(events[i], handler);\n }\n}\n\nexport function warn(message: string): void {\n logger.warn(message);\n}\n\nexport function error(message: string): Error {\n return new Error(`[scroll] ${message}`);\n}\n","import BezierEasing, { EasingFunction } from 'bezier-easing';\nimport { removeUndef } from '@fastkit/helpers';\nimport easings, { EasingValues } from './easings';\nimport {\n ScrollResult,\n ScrollCallbackValues,\n ScrollOptions,\n defaultSettings,\n} from './schemes';\nimport {\n $,\n on,\n off,\n getContainerDimension,\n HTMLElementEventMapKey,\n error,\n} from './util';\nimport { PreventScrollElement } from '../prevent-scroll';\n\ninterface ComputedValues {\n $container: HTMLElement;\n initialX: number;\n initialY: number;\n targetX: number;\n targetY: number;\n}\n\nconst abortEvents: HTMLElementEventMapKey[] = [\n 'mousedown',\n 'wheel',\n 'DOMMouseScroll',\n 'mousewheel',\n 'keyup',\n 'touchmove',\n];\n\nexport function scroll(\n diffX: number,\n diffY: number,\n // eslint-disable-next-line default-param-last\n options: ScrollOptions = {},\n _computedValues?: ComputedValues,\n): ScrollResult {\n let $container: HTMLElement;\n let initialX: number;\n let initialY: number;\n let targetX: number;\n let targetY: number;\n\n const _options = { ...defaultSettings, ...removeUndef(options) };\n const {\n container,\n duration,\n easing,\n cancelable,\n onProgress,\n onCancel,\n onDone,\n } = _options;\n\n const x = diffX !== 0;\n const y = diffY !== 0;\n\n if (_computedValues) {\n $container = _computedValues.$container;\n initialX = _computedValues.initialX;\n initialY = _computedValues.initialY;\n targetX = _computedValues.targetX;\n targetY = _computedValues.targetY;\n } else {\n $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n initialX = $container.scrollLeft;\n initialY = $container.scrollTop;\n targetX = initialX + diffX;\n targetY = initialY + diffY;\n }\n\n // compute overflow and adjust values\n const { scrollWidth, scrollHeight } = $container;\n const { width, height } = getContainerDimension($container);\n const overflowX = targetX + width - scrollWidth;\n const overflowY = targetY + height - scrollHeight;\n if (overflowX > 0) {\n diffX -= overflowX;\n targetX -= overflowX;\n }\n if (overflowY > 0) {\n diffY -= overflowY;\n targetY -= overflowY;\n }\n\n //\n // Setup Temporary values\n //\n // eslint-disable-next-line @typescript-eslint/ban-types\n let doneResolver: Function;\n let timeStart = 0;\n let timeElapsed: number;\n\n const callbackValues: ScrollCallbackValues = {\n container: $container,\n progress: 0,\n aborted: false,\n abortEventSource: null,\n };\n\n const result: ScrollResult = {\n cancel: canceller,\n promise: new Promise((resolve) => {\n doneResolver = resolve;\n }),\n plans: {\n x: diffX,\n y: diffY,\n },\n };\n\n //\n // processes\n //\n if (\n (diffY === 0 && diffX === 0) ||\n !!($container as PreventScrollElement).__ps_ctx__\n )\n return initialAbort();\n\n // setup easings\n let easingValues: EasingValues;\n if (!easing) {\n easingValues = easings.ease;\n } else if (typeof easing === 'string') {\n easingValues = easings[_options.easing];\n } else {\n easingValues = easing;\n }\n const easingFn: EasingFunction = BezierEasing.apply(\n BezierEasing,\n easingValues,\n );\n\n on($container, abortEvents, abortFn, { passive: true });\n window.requestAnimationFrame(step);\n return result;\n\n //\n // inner methods\n //\n function doneResolve(): void {\n doneResolver();\n }\n\n function canceller(e: Event | null = null, checkCancelable = false) {\n if (checkCancelable && !cancelable) return;\n off($container, abortEvents, abortFn);\n callbackValues.abortEventSource = e;\n callbackValues.aborted = true;\n onCancel && onCancel(callbackValues);\n }\n\n function abortFn(e: Event) {\n canceller(e, true);\n }\n\n function initialAbort(e: Event | null = null) {\n canceller(e);\n doneResolve();\n return result;\n }\n\n function step(timestamp: number): void {\n if (callbackValues.aborted) return done();\n if (!timeStart) timeStart = timestamp;\n\n timeElapsed = timestamp - timeStart;\n\n let progress = Math.min(timeElapsed / duration, 1);\n progress = easingFn(progress);\n callbackValues.progress = progress;\n\n topLeft(initialY + diffY * progress, initialX + diffX * progress);\n onProgress && onProgress(callbackValues);\n\n timeElapsed < duration ? window.requestAnimationFrame(step) : done();\n }\n\n function topLeft(top: number, left: number) {\n if (y) $container.scrollTop = top;\n if (x) $container.scrollLeft = left;\n }\n\n function done() {\n if (!callbackValues.aborted) topLeft(targetY, targetX);\n timeStart = 0;\n off($container, abortEvents, abortFn);\n callbackValues.progress = 1;\n doneResolve();\n if (!callbackValues.aborted && onDone) onDone(callbackValues);\n }\n}\n","import { scroll } from './scroll-by-internal';\nimport { ScrollOptions, ScrollResult } from './schemes';\n\n/**\n * 指定の差分だけコンテナをスクロールします。\n * @param diffX - 横軸の移動量(px)です。デフォルトは0です。\n * @param diffY - 縦軸の移動量(px)です。デフォルトは0です。\n * @param options - スクロールオプション\n */\nexport function scrollBy(\n diffX: number,\n diffY: number,\n options?: ScrollOptions,\n): ScrollResult {\n return scroll(diffX, diffY, options);\n}\n","import { scroll } from './scroll-by-internal';\nimport {\n ScrollOptions,\n defaultSettings,\n ScrollPosition,\n ScrollResult,\n} from './schemes';\nimport { $, error } from './util';\n\n/**\n * 任意の位置(px)へコンテナをスクロールします。\n * @param scrollPosition - スクロール先を指定します。x, y 共にオプショナルなるです。未指定の軸は現在のスクロール値のまま保持されます。\n * @param options - スクロールオプション\n */\nexport function scrollTo(\n scrollPosition: Partial<ScrollPosition>,\n options: ScrollOptions = {},\n): ScrollResult {\n let { x, y } = scrollPosition;\n const container = options.container || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n const initialY = $container.scrollTop;\n const initialX = $container.scrollLeft;\n if (x === undefined) x = initialX;\n if (y === undefined) y = initialY;\n const diffX = x - initialX;\n const diffY = y - initialY;\n\n return scroll(diffX, diffY, options, {\n $container,\n initialX,\n initialY,\n targetX: x,\n targetY: y,\n });\n}\n","import { scroll } from './scroll-by-internal';\nimport { ScrollOptions, ScrollResult, defaultSettings } from './schemes';\nimport { $, cumulativeOffset, error } from './util';\n\n/**\n * スクロール先の要素をElement or CSSクエリストリングで示します。\n */\nexport type ScrollToElementTarget = string | Element;\n\n/**\n * 要素へスクロールする際のオプション設定です。\n */\nexport interface ScrollToElementSettings {\n /**\n * 要素へスクロールする際、そのスクロール先をずらす際に設定します。<br>\n * x, y 個別に設定が可能ですが、シングルのnumberのみを指定した場合、x, y のそれぞれのオプションが有効な場合にのみその軸に設定されます。\n */\n offset: number | { x?: number; y?: number };\n\n /**\n * 横スクロールの可否を示します。\n */\n x: boolean;\n\n /**\n * 縦スクロールの可否を示します。\n */\n y: boolean;\n}\n\n/**\n * 要素スクロール利用事のデフォルト設定です。\n * {@link ScrollToElementSettings}\n */\nexport const scrollToElementSettingsDefaults: ScrollToElementSettings = {\n offset: 0,\n x: false,\n y: true,\n};\n\n/**\n * 要素へスクロールさせる際のオプション設定です。\n */\nexport type ScrollToElementOptions = Partial<\n ScrollOptions & ScrollToElementSettings\n>;\n\n/**\n * 任意の要素の位置へスクロールします。\n * @param target - スクロール先の要素\n * @param options - スクロールオプション\n */\nexport function scrollToElement(\n target: ScrollToElementTarget,\n options: ScrollToElementOptions = {},\n): ScrollResult {\n //\n // Setup Options\n //\n\n const _options = { ...scrollToElementSettingsDefaults, ...options };\n\n const { x, y } = _options;\n\n const offsetSource = _options.offset;\n\n const offset =\n typeof offsetSource === 'number'\n ? { x: offsetSource, y: offsetSource }\n : offsetSource;\n\n //\n // Setup Elements\n //\n\n const $target = $(target) as HTMLElement;\n if (!$target) throw error(`missing element ${target}`);\n\n const container = _options.container || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n\n const cumulativeOffsetContainer = cumulativeOffset($container);\n const cumulativeOffsetTarget = cumulativeOffset($target);\n\n const initialY = $container.scrollTop;\n const initialX = $container.scrollLeft;\n\n const targetY =\n cumulativeOffsetTarget.top -\n cumulativeOffsetContainer.top +\n (offset.y || 0);\n\n const targetX =\n cumulativeOffsetTarget.left -\n cumulativeOffsetContainer.left +\n (offset.x || 0);\n\n const diffX = x ? targetX - initialX : 0;\n const diffY = y ? targetY - initialY : 0;\n\n return scroll(diffX, diffY, _options, {\n $container,\n initialX,\n initialY,\n targetX,\n targetY,\n });\n}\n","import {\n ScrollOptions,\n ScrollResult,\n defaultSettings,\n ScrollPosition,\n} from './schemes';\nimport { $, error } from './util';\nimport { scrollTo } from './scroll-to';\n\n/**\n * y軸の両端の辺を示します。\n */\nexport type ScrollYSide = 'top' | 'bottom';\n\n/**\n * x軸の両端の辺を示します。\n */\nexport type ScrollXSide = 'left' | 'right';\n\n/**\n * コンテナの4辺を示します。\n */\nexport type ScrollSide = ScrollYSide | ScrollXSide;\n\n/**\n * コンテナの辺へスクロールさせる際のターゲット指定のパターンです。\n */\nexport type ScrollToSideTargets =\n | ScrollSide\n | [ScrollSide]\n | [ScrollYSide, ScrollXSide]\n | [ScrollXSide, ScrollYSide];\n\n/**\n * コンテナをいずれかの辺までスクロールします。\n * @param targets - 辺を指定します。シングルの文字列、及び配列に対応しています。\n * @param options - スクロールオプション\n */\nexport function scrollToSide(\n targets: ScrollToSideTargets,\n options?: ScrollOptions,\n): ScrollResult {\n const sides: ScrollSide[] = typeof targets === 'string' ? [targets] : targets;\n const position: Partial<ScrollPosition> = {};\n\n const hasRight = sides.includes('right');\n const hasBottom = sides.includes('bottom');\n\n if (sides.includes('top')) {\n position.y = 0;\n }\n\n if (sides.includes('left')) {\n position.x = 0;\n }\n\n if (hasRight || hasBottom) {\n const container =\n (options && options.container) || defaultSettings.container;\n const $container = $(container) as HTMLElement;\n if (!$container) throw error(`missing container ${container}`);\n\n if (hasRight) position.x = $container.scrollWidth;\n if (hasBottom) position.y = $container.scrollHeight;\n }\n\n return scrollTo(position, options);\n}\n\n/**\n * コンテナを上辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToTop(options?: ScrollOptions) {\n return scrollToSide('top', options);\n}\n\n/**\n * コンテナを右辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRight(options?: ScrollOptions) {\n return scrollToSide('right', options);\n}\n\n/**\n * コンテナを下辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToBottom(options?: ScrollOptions) {\n return scrollToSide('bottom', options);\n}\n\n/**\n * コンテナを左辺までスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeft(options?: ScrollOptions) {\n return scrollToSide('left', options);\n}\n\n/**\n * コンテナを左上コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeftTop(options?: ScrollOptions) {\n return scrollToSide(['left', 'top'], options);\n}\n\n/**\n * コンテナを左下コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToLeftBottom(options?: ScrollOptions) {\n return scrollToSide(['left', 'bottom'], options);\n}\n\n/**\n * コンテナを右上コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRightTop(options?: ScrollOptions) {\n return scrollToSide(['right', 'top'], options);\n}\n\n/**\n * コンテナを右下コーナーまでスクロールします。\n * @param options - スクロールオプション\n */\nexport function scrollToRightBottom(options?: ScrollOptions) {\n return scrollToSide(['right', 'bottom'], options);\n}\n","import { EV } from '@fastkit/ev';\nimport {\n visibilityManager,\n VisibilityStateListener,\n} from '@fastkit/visibility';\nimport { IN_WINDOW } from '@fastkit/helpers';\nimport { isDocumentElement, isBodyElement } from './util';\nimport { logger } from './logger';\n\nimport { enableScroll, disableScroll } from './prevent-scroll';\n\nimport {\n ScrollPosition,\n ScrollOptions,\n ScrollBaseSettings,\n ScrollToElementTarget,\n ScrollResult,\n ScrollerScrollOptions,\n ScrollToElementSettings,\n scrollToElementSettingsDefaults as _scrollToElementSettingsDefaults,\n scrollBy,\n scrollTo,\n scrollToElement,\n scrollToSide,\n scrollToTop,\n scrollToRight,\n scrollToBottom,\n scrollToLeft,\n scrollToLeftTop,\n scrollToLeftBottom,\n scrollToRightTop,\n scrollToRightBottom,\n ScrollToSideTargets,\n ScrollToElementOptions,\n} from './scroll';\n\nimport { defaultBaseSettings } from './scroll/schemes';\n\nexport * from './prevent-scroll';\n\nexport * from './scroll';\n\nexport type ScrollToElementAdditionalOffset =\n | number\n | { x?: number; y?: number }\n | ((scroller: Scroller) => number | { x?: number; y?: number } | undefined);\n\n/**\n * [[Scroller]]を任意のElementまでスクロールさせる際のオプションです。\n * 詳細は [[ScrollerScrollOptions]] 及び、 [[ScrollToElementSettings]] を参照してください。\n */\nexport type ScrollerScrollToElementOptions = Partial<\n ScrollerScrollOptions & ScrollToElementSettings\n>;\n\n// Scroller は設定されたコンテキスト要素に応じてscrollやsize検知のリスナを\n// window か 自身のelementに切り替えます\ntype ScrollerEventTarget = Window | Element;\n\n/**\n * Scrollerに縦スクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollYDirection = 'top' | 'bottom';\n\n/**\n * Scrollerに横スクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollXDirection = 'left' | 'right';\n\n/**\n * Scrollerにスクロールが発生した際の方向を示すTypeです。\n */\nexport type ScrollDirection = ScrollYDirection | ScrollXDirection;\n\n/**\n * スクロールの軸を示します。\n * xは水平、\n * yは垂直をそれぞれ示します\n */\nexport type ScrollAxis = 'x' | 'y';\n\nexport interface ScrollSizeObserverSetting {\n interval: number;\n width: boolean;\n height: boolean;\n}\n\n/**\n * Scrollerの基本セッティングです。\n * 個々のフィールドの詳細は[[Scroller]]の同名プロパティを参照してください。\n */\nexport interface ScrollerSetting {\n el: Element | string | null;\n scrollingJudgeInterval: number;\n baseAxis: ScrollAxis;\n scrollSizeObserver: Partial<ScrollSizeObserverSetting>;\n}\n\n/**\n * Elementのscrollイベントを検知した際に、通知する情報です\n * 現在のスクロールポジションや、スクロール開始(or前回のtick)からのスクロール量が渡されます。\n */\nexport interface ScrollerPayload {\n /**\n * [[Scroller.scrollTop]] が渡されます\n */\n top: number;\n\n /**\n * [[Scroller.scrollLeft]] が渡されます\n */\n left: number;\n\n /**\n * [[Scroller.scrollBottom]] が渡されます\n */\n bottom: number;\n\n /**\n * [[Scroller.scrollRight]] が渡されます\n */\n right: number;\n\n /**\n * 発生したスクロールの軸が渡されます。\n * 斜めスクロールが発生した際は、x、yのうち移動量が大きいものが自動判定されて渡されます。\n * どちらも同じ移動量であった場合は[[Scroller.baseAxis]]の設定値が渡されます。\n */\n axis: ScrollAxis;\n\n /**\n * 発生したスクロールの方向が渡されます。\n * 斜めスクロールが発生した際は、x、yのうち移動量が大きいものが自動判定されて渡されます。\n * どちらも同じ移動量であった場合は[[Scroller.baseAxis]]の設定値が渡されます。\n */\n direction: ScrollDirection;\n\n /**\n * 発生したスクロールの水平方向が渡されます。\n */\n directionX: ScrollXDirection;\n\n /**\n * 発生したスクロールの垂直方向が渡されます。\n */\n directionY: ScrollYDirection;\n\n // tick amount at element.on('scroll') detect\n\n /**\n * [[Scroller.on]]('scroll')時の前回からの水平移動量が渡されます。\n */\n tickedX: number;\n\n /**\n * [[Scroller.on]]('scroll')時の前回からの垂直移動量が渡されます。\n */\n tickedY: number;\n\n /**\n * [[Scroller.on]]('scrollStart')時からの合計水平移動量が渡されます。\n */\n totalX: number;\n\n /**\n * [[Scroller.on]]('scrollStart')時からの合計垂直移動量が渡されます。\n */\n totalY: number;\n}\n\n/**\n * Scrollerは設定されたElementのスクロール開始、tick、終了を検知し\n * イベントを通知します。\n * これらのイベントを購読する事でスクロール量や移動方向を検知可能です。\n */\nexport interface ScrollerScrollEventMap {\n /**\n * スクロールの開始時に発生します。\n */\n scrollStart: ScrollerPayload;\n\n /**\n * 毎スクロール検知時に発生します。\n */\n scroll: ScrollerPayload;\n\n /**\n * スクロールの終了時に発生します。\n */\n scrollEnd: ScrollerPayload;\n}\n\n/**\n * Scrollerに発生するイベントの全てです。\n */\nexport interface ScrollerEventMap extends ScrollerScrollEventMap {\n /**\n * Scrollerが利用可能になった時(Elementが設定されて初期化が完了した)に発生します。\n */\n ready: void;\n\n /**\n * [[Scroller.state]]が変更された時に発生します。\n */\n changeState: ScrollerState;\n\n /**\n * [[Scroller.el]]のサイズ変更を検知した際に発生します。\n */\n resize: { width: number; height: number };\n\n /**\n * [[Scroller.lastAxis]]の変更を検知した際に発生します。\n */\n changeAxis: ScrollAxis;\n\n /**\n * [[Scroller.lastDirection]]の変更を検知した際に発生します。\n */\n changeLastDirection: ScrollDirection;\n\n /**\n * [[Scroller.lastYDirection]]の変更を検知した際に発生します。\n */\n changeLastYDirection: ScrollYDirection;\n\n /**\n * [[Scroller.lastXDirection]]の変更を検知した際に発生します。\n */\n changeLastXDirection: ScrollXDirection;\n}\n\n/**\n * Scrollerの状態を示します。\n */\n// eslint-disable-next-line no-shadow\nexport enum ScrollerState {\n /**\n * Scrollerが初期化されていない(Elementが設定されていない)状態を示します。\n */\n Pending = 'pending',\n\n /**\n * Scrollerが初期化されているが、[[Scroller.el]]のリサイズやスクロールのイベント監視が動作していない状態を示します。\n */\n Ready = 'ready',\n\n /**\n * Scrollerが初期化されていて、[[Scroller.el]]のリサイズやスクロールのイベント監視が動作している状態を示します。\n */\n Running = 'running',\n\n /**\n * [[Scroller.destroy]]が実行され、Scrollerが利用不可である状態を示します。\n */\n Destroyed = 'destroyed',\n}\n\n/**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一覧です。\n * 個々のプロパティ名は、同名のScrollerクラスのプロパティを参照して下さい\n */\nexport interface ScrollerObserver {\n state: ScrollerState;\n isPending: boolean;\n isReady: boolean;\n isRunning: boolean;\n isDestroyed: boolean;\n scrollEnabled: boolean;\n containerWidth: number;\n containerHeight: number;\n scrollWidth: number;\n scrollHeight: number;\n scrollableX: boolean;\n scrollableY: boolean;\n scrollTop: number;\n scrollLeft: number;\n scrollRight: number;\n scrollBottom: number;\n lastAxis: ScrollAxis;\n lastDirection: ScrollDirection;\n lastYDirection: ScrollYDirection;\n lastXDirection: ScrollXDirection;\n nowScrolling: boolean;\n}\n\n/**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一のキー覧です。\n */\nexport type ScrollerObservableKeys = keyof ScrollerObserver;\nconst scrollerObservableKeys: ScrollerObservableKeys[] = [\n 'state',\n 'isPending',\n 'isReady',\n 'isRunning',\n 'isDestroyed',\n 'scrollEnabled',\n 'containerWidth',\n 'containerHeight',\n 'scrollWidth',\n 'scrollHeight',\n 'scrollableX',\n 'scrollableY',\n 'scrollTop',\n 'scrollLeft',\n 'scrollRight',\n 'scrollBottom',\n 'lastAxis',\n 'lastDirection',\n 'lastYDirection',\n 'lastXDirection',\n 'nowScrolling',\n];\n\n/**\n * スクロールを停止させるためのソースオブジェクト\n */\nexport type ScrollStopper = number | string | Record<string, unknown> | symbol;\n\n/**\n * 任意のElement(or HTML Document)のスクロールやサイズ変更を監視し、その情報を通知するクラスです。<br>\n * <a href=\"https://dadajam4.github.io/dadajam4/ev/classes/_ev_.ev.html\" target=\"_blank\">EV</a>を継承しており、イベントの購読[[Scroller.on]]等のインターフェースを利用するか、\n * [[Scroller.observe]]メソッドを利用します。<br>\n * [[Scroller.on]]、[[Scroller.once]]で購読可能なイベントについては[[ScrollerEventMap]]を参照してください。\n */\nexport class Scroller extends EV<ScrollerEventMap> {\n /**\n * Scrollerクラスの状態を監視&同期するオブジェクトが\n * 保有すべきプロパティ一のキーの配列です。\n */\n static readonly scrollerObservableKeys = scrollerObservableKeys;\n\n /**\n * Scrollerの状態を示すenum値です。\n * {@link ScrollerState}\n */\n static readonly States = ScrollerState;\n\n /**\n * スクロールを検知してから、移動がなくなった際に、何ms後にスクロール終了と判定するかのインターバル値を示します。\n * デフォルトは500です。\n */\n scrollingJudgeInterval = 500;\n\n /**\n * 縦、横のどちらのスクロールを基準とするかを示します。\n * デフォルトはyです。<br>\n * この設定は[[Scroller.toElement]]のデフォルト値にも影響します。\n */\n baseAxis: ScrollAxis = 'y';\n\n /**\n * スクロール系メソッド[[Scroller.to]]等を利用する際のデフォルトの設定を示します。\n */\n scrollSettingsDefaults: ScrollBaseSettings = { ...defaultBaseSettings };\n\n /**\n * [[Scroller.toElement]]のデフォルトオプションの設定を示します。\n */\n scrollToElementSettingsDefaults: ScrollerScrollToElementOptions = {\n ..._scrollToElementSettingsDefaults,\n };\n\n scrollSizeObserver?: ScrollSizeObserverSetting;\n\n /**\n * 設定されたElement要素です。\n * 初期化が完了していない時には本getterはundefinedを返却する事に注意してください。\n */\n get el() {\n return this._el;\n }\n\n /**\n * 現在の状態です。<br>\n * {@link ScrollerState}\n */\n get state(): ScrollerState {\n return this._state;\n }\n\n /**\n * 未初期化である場合trueを示します。\n */\n get isPending(): boolean {\n return this._state === ScrollerState.Pending;\n }\n\n /**\n * 初期化済み&停止状態である場合trueを示します。\n */\n get isReady(): boolean {\n return this._state === ScrollerState.Ready;\n }\n\n /**\n * 初期化済み&動作中である場合trueを示します。\n */\n get isRunning(): boolean {\n return this._state === ScrollerState.Running;\n }\n\n /**\n * インスタンスが破棄済みである場合trueを示します。\n */\n get isDestroyed(): boolean {\n return this._state === ScrollerState.Destroyed;\n }\n\n /**\n * スクロールの有効状態を取得します\n */\n get scrollEnabled(): boolean {\n return this._scrollStoppers.length === 0;\n }\n\n /**\n * スクロール要素の幅を示します。\n */\n get containerWidth(): number {\n return this._containerWidth;\n }\n\n /**\n * スクロール要素の高さを示します。\n */\n get containerHeight(): number {\n return this._containerHeight;\n }\n\n /**\n * スクロール要素内のコンテンツの幅を示します。\n */\n get scrollWidth(): number {\n return this._scrollWidth;\n }\n\n /**\n * スクロール要素内のコンテンツの高さを示します。\n */\n get scrollHeight(): number {\n return this._scrollHeight;\n }\n\n /**\n * x軸にスクロール可能な場合trueを示します\n */\n get scrollableX(): boolean {\n return this._scrollWidth > this._containerWidth;\n }\n\n /**\n * y軸にスクロール可能な場合trueを示します\n */\n get scrollableY(): boolean {\n return this._scrollHeight > this._containerHeight;\n }\n\n /**\n * 現在の上辺からのスクロール量を示します。\n */\n get scrollTop(): number {\n return this._scrollTop;\n }\n\n set scrollTop(scrollTop: number) {\n if (!this.el) return;\n this.el.scrollTop = scrollTop;\n }\n\n /**\n * 現在の右辺からのスクロール量を示します。\n */\n get scrollRight(): number {\n return this._scrollRight;\n }\n\n set scrollRight(scrollRight: number) {\n if (!this.el) return;\n this.el.scrollLeft = this._scrollWidth - this._containerWidth - scrollRight;\n }\n\n /**\n * 現在の下辺からのスクロール量を示します。\n */\n get scrollBottom(): number {\n return this._scrollBottom;\n }\n\n set scrollBottom(scrollBottom: number) {\n if (!this.el) return;\n this.el.scrollTop =\n this._scrollHeight - this._containerHeight - scrollBottom;\n }\n\n /**\n * 現在の左辺からのスクロール量を示します。\n */\n get scrollLeft(): number {\n return this._scrollLeft;\n }\n\n set scrollLeft(scrollLeft: number) {\n if (!this.el) return;\n this.el.scrollLeft = scrollLeft;\n }\n\n /**\n * 現在スクロール中である場合trueを示します。\n */\n get nowScrolling(): boolean {\n return this._nowScrolling;\n }\n\n /**\n * 最後に検知したスクロールの軸を示します。\n */\n get lastAxis(): ScrollAxis {\n return this._lastAxis;\n }\n\n /**\n * 最後に検知したスクロールの方向を示します。\n */\n get lastDirection(): ScrollDirection {\n return this._lastDirection;\n }\n\n /**\n * 最後に検知したスクロールの垂直方向を示します。\n */\n get lastYDirection(): ScrollYDirection {\n return this._lastYDirection;\n }\n\n /**\n * 最後に検知したスクロールの水平方向を示します。\n */\n get lastXDirection(): ScrollXDirection {\n return this._lastXDirection;\n }\n\n /**\n * 最後に検知したスクロールにより通知した情報を示します。\n */\n get lastPayload(): ScrollerPayload {\n return {\n top: this._scrollTop,\n left: this._scrollLeft,\n bottom: this._scrollBottom,\n right: this._scrollRight,\n axis: this._lastAxis,\n direction: this._lastDirection,\n directionX: this._lastXDirection,\n directionY: this._lastYDirection,\n tickedX: this._tickedX,\n tickedY: this._tickedY,\n totalX: this._lastTotalX,\n totalY: this._lastTotalY,\n };\n }\n\n private _el!: Element | null;\n\n private _eventTarget!: ScrollerEventTarget;\n\n private _isDocumentElement = false;\n\n private _isBodyElement = false;\n\n private _isRootElement = false;\n\n private _state: ScrollerState = ScrollerState.Pending;\n\n private _containerWidth = 0;\n\n private _containerHeight = 0;\n\n private _scrollWidth = 0;\n\n private _scrollHeight = 0;\n\n private _scrollTop = 0;\n\n private _scrollRight = 0;\n\n private _scrollBottom = 0;\n\n private _scrollLeft = 0;\n\n private _lastAxis: ScrollAxis;\n\n private _lastDirection: ScrollDirection;\n\n private _lastYDirection: ScrollYDirection = 'top';\n\n private _lastXDirection: ScrollXDirection = 'left';\n\n private _nowScrolling = false;\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private _readyResolvers: Function[] = [];\n\n private _scrollingJudgeTimerId: number | null = null;\n\n private _startX = 0;\n\n private _startY = 0;\n\n private _tickedX = 0;\n\n private _tickedY = 0;\n\n private _lastTotalX = 0;\n\n private _lastTotalY = 0;\n\n private _scrollListener?: EventListener;\n\n private _resizeListener?: EventListener;\n\n private _resizeObserver?: ResizeObserver;\n\n private _scrollToResult: ScrollResult | null = null;\n\n private _observers: ScrollerObserver[] = [];\n\n private _scrollStoppers: ScrollStopper[] = [];\n\n private _scrollSizeObserverPollingId: number | null = null;\n\n private _scrollSizeObserverSuspended = false;\n\n private _visibilityListener: VisibilityStateListener;\n\n /**\n * Scrollerインスタンスを作成します。\n * コンテキストとなるElementをこの時点で指定するか否かは任意です。\n *\n * @param settingOrElementOrQueryString - 任意です。{@link ScrollerSetting}か Element(or cssクエリセレクタ文字列)を直接指定します。この時点でElementを指定しない場合は、[[setElement]]を実行するまでインスタンスは動作しません。\n */\n constructor(\n settingOrElementOrQueryString:\n | Partial<ScrollerSetting>\n | Element\n | string = {},\n ) {\n super();\n\n const convertedSetting: Partial<ScrollerSetting> =\n typeof settingOrElementOrQueryString === 'string' ||\n settingOrElementOrQueryString === null ||\n (IN_WINDOW && settingOrElementOrQueryString instanceof Element)\n ? (settingOrElementOrQueryString = {\n el: <Element | string>settingOrElementOrQueryString,\n })\n : (settingOrElementOrQueryString as Partial<ScrollerSetting>);\n\n if (convertedSetting.scrollingJudgeInterval !== undefined)\n this.scrollingJudgeInterval = convertedSetting.scrollingJudgeInterval;\n\n if (convertedSetting.baseAxis) this.baseAxis = convertedSetting.baseAxis;\n this._lastAxis = this.baseAxis;\n\n const { scrollSizeObserver } = convertedSetting;\n if (scrollSizeObserver) {\n this.scrollSizeObserver = {\n interval: 500,\n width: true,\n height: true,\n ...scrollSizeObserver,\n };\n }\n\n this._visibilityListener = () => {\n if (visibilityManager.isVisible) {\n this.update();\n if (this._scrollSizeObserverSuspended) {\n this._scrollSizeObserverSuspended = false;\n this._startScrollSizeObserver();\n }\n } else {\n this._scrollSizeObserverSuspended =\n this._scrollSizeObserverPollingId !== null;\n this._stopScrollSizeObserver();\n }\n };\n\n this._lastDirection = this._lastAxis === 'y' ? 'top' : 'left';\n\n // for SSR\n if (!IN_WINDOW) return;\n\n // Add Visibility Listener\n visibilityManager.change(this._visibilityListener);\n\n // Skip auto setup when missing scrolling element.\n this.setElement(convertedSetting.el);\n }\n\n /**\n * インスタンスにElementを設定します。特別な理由(SSRの利用等)によりコンストラクタでElementを指定できない場合、\n * 本メソッドを利用しブラウザコンテキスト配下で本メソッドを実行してください。\n * @param el - Element、もしくはCSSクエリセレクタ文字列を指定します。\n */\n setElement(el?: Element | string | null) {\n if (el === null) return;\n if (!IN_WINDOW)\n logger.error('Element can be set only when it is under DOM context.');\n\n this.stop();\n\n let _el: Element | null;\n if (typeof el === 'string') {\n _el = document.querySelector(el);\n } else {\n _el = el || document.scrollingElement;\n }\n if (!_el) {\n const message = 'missing scrolling element';\n logger.error(message, el);\n throw new Error(message);\n }\n\n this._el = _el;\n this._isDocumentElement = isDocumentElement(_el);\n this._isBodyElement = isBodyElement(_el);\n this._isRootElement = this._isDocumentElement || this._isBodyElement;\n this._eventTarget =\n this._isDocumentElement || this._isBodyElement ? window : this._el;\n\n this._setup();\n }\n\n private _scrollToElementAdditionalOffset:\n | ScrollToElementAdditionalOffset\n | undefined;\n\n setScrollToElementAdditionalOffset(\n offset: ScrollToElementAdditionalOffset | undefined,\n ) {\n this._scrollToElementAdditionalOffset = offset;\n }\n\n deleteScrollToElementAdditionalOffset() {\n delete this._scrollToElementAdditionalOffset;\n }\n\n /**\n * インスタンスが実行可能になった際にresolveされるPromiseインスタンスを返却します。\n */\n ready(): Promise<void> {\n this._checkDestroyed();\n if (!this.isPending) return Promise.resolve();\n return new Promise((resolve) => this._readyResolvers.push(resolve));\n }\n\n /**\n * インスタンスの動作を開始します。本インスタンスはElementが設定され初期化された際に自動で動作を開始しますが、\n * [[Scroller.stop]]メソッドを利用し動作を停止した後に再開する場合に本メソッドを利用します。\n */\n async start(): Promise<void> {\n this._checkDestroyed();\n if (this.isRunning) return;\n await this.ready();\n this._startListeners();\n this._setState(ScrollerState.Running);\n }\n\n /**\n * インスタンスの動作(スクロール、リサイズイベントの検知等)を停止します。\n * 何らかの理由で動作を停止させたい場合に利用してください。\n * 本メソッドを実行後もインスタンス内の状態は保持されたままです。\n * 完全にインスタンスを破棄するためには[[Scroller.destroy]]を利用してください。\n */\n stop(): void {\n this._checkDestroyed();\n if (!this.isRunning) return;\n this._stopListeners();\n this._setState(ScrollerState.Ready);\n }\n\n /**\n * インスタンスの動作を停止し、内部情報を完全に破棄します。\n * これに伴い、スクロール中であった場合にはキャンセルされ、以後イベント通知は完全に行われません。\n * また[[Scroller.start]]メソッドでの再利用も不可となります。\n * 本インスタンスの利用を完全に停止する場合に必ず実行し、利用側のオブジェクト等において本インスタンスへの参照を完全に削除してください。\n * 本メソッドはSPA等でのサービスにおいては意識的に実行する事を強く推奨します。\n */\n destroy() {\n if (this.isDestroyed) return;\n this.stop();\n this.cancel();\n this._readyResolvers = [];\n this._scrollStoppers = [];\n this._scrollEnable();\n this._observers = [];\n visibilityManager.remove(this._visibilityListener);\n\n delete (this as any)._el;\n delete (this as any)._eventTarget;\n delete this._scrollListener;\n delete this._resizeListener;\n delete (this as any)._resizeObserver;\n delete (this as any)._scrollToResult;\n delete (this as any)._visibilityListener;\n\n this.deleteScrollToElementAdditionalOffset();\n this._setState(ScrollerState.Destroyed);\n this.offAll();\n }\n\n /**\n * インスタンス内部のスクロール量や、Elementのサイズを強制的に更新します。\n * 基本的に利用が必要なケースはありませんが、何らかの理由で更新をトリガーしたい場合に利用します。\n */\n update(): void {\n this._update();\n }\n\n /**\n * インスタンス内の情報をjsonオブジェクトとして返却します。\n * 情報の詳細は[[ScrollerObserver]]を参照してください。\n */\n toJSON(): ScrollerObserver {\n const json: Partial<ScrollerObserver> = {};\n for (const key of scrollerObservableKeys) {\n json[key] = this[key] as any;\n }\n return <ScrollerObserver>json;\n }\n\n /**\n * [[Scroller.toJSON]]の情報を文字列として返却します。\n */\n toString(): string {\n return JSON.stringify(this.toJSON());\n }\n\n /**\n * 本インスタンスの情報を購読するためのオブジェクトを設定する事で、\n * インスタンスの内部情報が変更される度にパラメータが同期されます。\n * 設定するオブジェクトは[[ScrollerObserver]]のインターフェースを満たしていれば内容は問いません。\n * 本機能により同期される方法は単純にオブジェクトプロパティへの変数代入です。\n * 従って対象となるプロパティをgetterとして実装(Ex: Vue computed等、、)しておく事により、\n * 同期を受け取るオブジェクト側でパラメータ変更後の動作をリアクティブに実装可能です。\n * @param observer - 同期させたいオブジェクト\n * @returns 同期を停止するためのメソッド\n */\n observe(observer: ScrollerObserver): () => void {\n if (!this._observers.includes(observer)) {\n this._observers.push(observer);\n }\n this._syncToObserver(observer);\n const unobserve = () => {\n this.unobserve(observer);\n };\n return unobserve;\n }\n\n /**\n * [[Scroller.observe]]でパラメータ同期中のオブジェクトを停止します。\n * [[Scroller.destroy]]実行時にも、同期中のオブジェクトは全停止されますが、destroy前に任意のタイミングで停止したい場合\n * 本メソッドを利用します。\n * @param observer - 同期中のオブジェクト\n */\n unobserve(observer: ScrollerObserver) {\n const index = this._observers.indexOf(observer);\n if (index !== -1) {\n this._observers.splice(index, 1);\n }\n }\n\n /**\n * スクロール中であった場合、スクロールをキャンセルします。\n */\n cancel() {\n if (!this._scrollToResult) return;\n this._scrollToResult.cancel();\n this._clearScrollToResult();\n }\n\n /**\n * x, yの差分pxを指定しスクロールします。\n * メソッド、パラメータの詳細は[[scrollBy]]を参照してください。\n * @param diffX - 横移動量\n * @param diffY - 縦移動量\n * @param options - スクロールオプション\n */\n by(\n diffX: number,\n diffY: number,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollBy(diffX, diffY, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 指定の座標へスクロールします。\n * メソッド、パラメータの詳細は[[scrollTo]]を参照してください。\n * @param scrollPosition - 座標\n * @param options - スクロールオプション\n */\n to(\n scrollPosition: Partial<ScrollPosition>,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollTo(scrollPosition, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 指定の要素の位置へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToElement]]を参照してください。\n * オプションのx, yが未設定であった場合、[[Scroller.baseAxis]]により自動設定されます。\n * @param target - スクロール先の要素\n * @param options - スクロールオプション\n */\n toElement(\n target: ScrollToElementTarget,\n options?: ScrollerScrollToElementOptions,\n ) {\n const merged = this._createMergedScrollToElementOptions(options);\n if (merged.x === undefined) merged.x = this.baseAxis === 'x';\n if (merged.y === undefined) merged.y = this.baseAxis === 'y';\n\n return this._setScrollToResult(scrollToElement(target, merged));\n }\n\n /**\n * 指定の辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToSide]]を参照してください。\n * @param targets - スクロール先\n * @param options - スクロールオプション\n */\n toSide(\n targets: ScrollToSideTargets,\n options?: ScrollerScrollOptions,\n ): ScrollResult {\n return this._setScrollToResult(\n scrollToSide(targets, this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 上辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRight]]を参照してください。\n * @param options - スクロールオプション\n */\n toRight(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRight(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 下辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左辺へスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeft]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeft(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeft(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左上コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeftTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeftTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeftTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 左下コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToLeftBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toLeftBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToLeftBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右上コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRightTop]]を参照してください。\n * @param options - スクロールオプション\n */\n toRightTop(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRightTop(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * 右下コーナーへスクロールします。\n * メソッド、パラメータの詳細は[[scrollToRightBottom]]を参照してください。\n * @param options - スクロールオプション\n */\n toRightBottom(options?: ScrollerScrollOptions) {\n return this._setScrollToResult(\n scrollToRightBottom(this._createMergedScrollOptions(options)),\n );\n }\n\n /**\n * スクロールの停止を要求します。\n * @param stopper - 停止要求ソース\n */\n pushScrollStopper(stopper: ScrollStopper) {\n if (!this._scrollStoppers.includes(stopper)) {\n this._scrollStoppers.push(stopper);\n if (this._scrollStoppers.length === 1) {\n this._updateScrollable();\n this._syncToObservers(['scrollEnabled']);\n }\n }\n return () => {\n this.removeScrollStopper(stopper);\n };\n }\n\n /**\n * スクロールの停止要求を解除します。<br>\n * 別のプロセスにより異なる[[ScrollStopper]]が登録されている場合、\n * スクロールは再開されない事に注意してください。\n * @param stopper - 停止要求ソース\n */\n removeScrollStopper(stopper: ScrollStopper) {\n const index = this._scrollStoppers.indexOf(stopper);\n if (index !== -1) {\n this._scrollStoppers.splice(index, 1);\n if (this._scrollStoppers.length === 0) {\n this._updateScrollable();\n this._syncToObservers(['scrollEnabled']);\n }\n }\n }\n\n private async _setup(): Promise<void> {\n this._updateScrollable();\n this._update();\n this._setState(ScrollerState.Ready);\n this.start();\n this.emit('ready', undefined);\n this._readyResolvers.forEach((resolve) => resolve());\n this._readyResolvers = [];\n }\n\n private _setState(state: ScrollerState): void {\n if (this._state !== state) {\n this._state = state;\n this._syncToObservers([\n 'state',\n 'isPending',\n 'isReady',\n 'isRunning',\n 'isDestroyed',\n ]);\n this.emit('changeState', state);\n }\n }\n\n private _checkDestroyed(): void {\n if (this.isDestroyed) {\n const message = 'already destroyed.';\n logger.error(message);\n throw new Error(message);\n }\n }\n\n private _update(width?: number, height?: number): void {\n this._updateContainerSize(width, height);\n this._updateScrollSize();\n this._updateScrollPositions();\n }\n\n private _updateContainerSize(width?: number, height?: number): void {\n const { el, _isBodyElement } = this;\n if (width === undefined) {\n if (!el) return;\n width = _isBodyElement\n ? (document.documentElement as HTMLElement).clientWidth\n : el.clientWidth;\n }\n\n if (height === undefined) {\n if (!el) return;\n height = _isBodyElement\n ? (document.documentElement as HTMLElement).clientHeight\n : el.clientHeight;\n }\n\n const { _containerWidth, _containerHeight } = this;\n this._containerWidth = width;\n this._containerHeight = height;\n if (width !== _containerWidth || height !== _containerHeight) {\n this._syncToObservers([\n 'containerWidth',\n 'containerHeight',\n 'scrollableX',\n 'scrollableY',\n ]);\n this.emit('resize', { width, height });\n }\n }\n\n private _updateScrollSize(): void {\n const { el, _scrollWidth, _scrollHeight } = this;\n if (!el) return;\n this._scrollWidth = el.scrollWidth;\n this._scrollHeight = el.scrollHeight;\n if (\n _scrollWidth !== this._scrollWidth ||\n _scrollHeight !== this._scrollHeight\n ) {\n this._syncToObservers([\n 'scrollWidth',\n 'scrollHeight',\n 'scrollableX',\n 'scrollableY',\n ]);\n }\n }\n\n private _startScrollSizeObserver() {\n if (!IN_WINDOW) return;\n\n this._stopScrollSizeObserver();\n\n if (this.scrollSizeObserver) {\n this._scrollSizeObserverPollingId = window.setInterval(() => {\n if (!this.scrollSizeObserver || this.isDestroyed) {\n this._stopScrollSizeObserver();\n return;\n }\n\n this._updateScrollSize();\n }, this.scrollSizeObserver.interval);\n }\n }\n\n private _stopScrollSizeObserver() {\n if (this._scrollSizeObserverPollingId !== null) {\n clearInterval(this._scrollSizeObserverPollingId);\n this._scrollSizeObserverPollingId = null;\n }\n }\n\n private _updateScrollPositions(): void {\n if (!this.el) return;\n this._scrollTop = this.el.scrollTop;\n this._scrollLeft = this.el.scrollLeft;\n\n // advanced values\n this._scrollBottom =\n this._scrollHeight - this._scrollTop - this._containerHeight;\n this._scrollRight =\n this._scrollWidth - this._scrollLeft - this._containerWidth;\n\n this._syncToObservers([\n 'scrollTop',\n 'scrollRight',\n 'scrollBottom',\n 'scrollLeft',\n ]);\n }\n\n private _startListeners() {\n this._stopListeners();\n\n this._scrollListener = () => {\n this._onScroll();\n };\n this._eventTarget.addEventListener('scroll', this._scrollListener, false);\n\n if (this._isRootElement) {\n this._resizeListener = () => {\n this._onResize();\n };\n window.addEventListener('resize', this._resizeListener, false);\n } else {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this._onResize(width, height);\n }\n });\n this._el && this._resizeObserver.observe(this._el);\n }\n\n if (visibilityManager.isVisible) {\n this._scrollSizeObserverSuspended = false;\n this._startScrollSizeObserver();\n } else {\n this._scrollSizeObserverSuspended = true;\n }\n }\n\n private _stopListeners() {\n if (this._scrollListener) {\n this._eventTarget.removeEventListener(\n 'scroll',\n this._scrollListener,\n false,\n );\n delete this._scrollListener;\n }\n\n if (this._resizeListener) {\n if (this._isDocumentElement) {\n window.removeEventListener('resize', this._resizeListener, false);\n delete this._resizeListener;\n }\n }\n\n if (this._resizeObserver && this._el) {\n this._resizeObserver.unobserve(this._el);\n this._resizeObserver.disconnect();\n delete this._resizeObserver;\n }\n }\n\n private _clearScrollingJudgeTimer() {\n if (this._scrollingJudgeTimerId !== null) {\n clearTimeout(this._scrollingJudgeTimerId);\n this._scrollingJudgeTimerId = null;\n }\n }\n\n private _onResize(width?: number, height?: number) {\n this._update(width, height);\n }\n\n private _triggerScrollTick(event: keyof ScrollerScrollEventMap): void {\n const { _nowScrolling } = this;\n\n if (event === 'scrollStart') {\n this._startX = this._scrollLeft;\n this._startY = this._scrollTop;\n this._lastTotalX = 0;\n this._lastTotalY = 0;\n this._nowScrolling = true;\n } else if (event === 'scrollEnd') {\n this._nowScrolling = false;\n }\n\n if (_nowScrolling !== this._nowScrolling) {\n this._syncToObservers('nowScrolling');\n }\n this.emit(event, this.lastPayload);\n }\n\n private _onScroll() {\n if (!this.scrollEnabled && this._el) {\n this._el.scrollLeft = this._scrollLeft;\n this._el.scrollTop = this._scrollTop;\n return;\n }\n\n // remember before values\n const {\n _scrollTop,\n _scrollLeft,\n _lastAxis,\n _lastDirection,\n _lastXDirection,\n _lastYDirection,\n } = this;\n\n // ,,,and next update values\n this._updateScrollPositions();\n\n // calculate scrolled amount at (ticked time)\n const tickedX = this._scrollLeft - _scrollLeft;\n const tickedY = this._scrollTop - _scrollTop;\n this._tickedX = tickedX;\n this._tickedY = tickedY;\n\n // update axis\n if (tickedX === tickedY) {\n this._lastAxis = this.baseAxis;\n } else {\n this._lastAxis = Math.abs(tickedX) > Math.abs(tickedY) ? 'x' : 'y';\n }\n\n // update directions\n if (_scrollTop < this._scrollTop) {\n this._lastYDirection = 'bottom';\n } else if (_scrollTop > this._scrollTop) {\n this._lastYDirection = 'top';\n }\n\n if (_scrollLeft < this._scrollLeft) {\n this._lastXDirection = 'right';\n } else if (_scrollLeft > this._scrollLeft) {\n this._lastXDirection = 'left';\n }\n\n this._lastDirection =\n this._lastAxis === 'y' ? this._lastYDirection : this._lastXDirection;\n\n // judge scroll end by before axis and directions\n const axisIsChanged = this._lastAxis !== _lastAxis;\n const lastXDirectionIsChanged = this._lastXDirection !== _lastXDirection;\n const lastYDirectionIsChanged = this._lastYDirection !== _lastYDirection;\n const lastDirectionIsChanged = this._lastDirection !== _lastDirection;\n\n if (axisIsChanged) {\n this.emit('changeAxis', this._lastAxis);\n }\n\n if (lastXDirectionIsChanged) {\n this.emit('changeLastXDirection', this._lastXDirection);\n }\n\n if (lastYDirectionIsChanged) {\n this.emit('changeLastYDirection', this._lastYDirection);\n }\n\n if (lastDirectionIsChanged) {\n this.emit('changeLastDirection', this._lastDirection);\n }\n\n if (\n axisIsChanged ||\n lastXDirectionIsChanged ||\n lastYDirectionIsChanged ||\n lastDirectionIsChanged\n ) {\n this._syncToObservers([\n 'lastAxis',\n 'lastDirection',\n 'lastYDirection',\n 'lastXDirection',\n ]);\n }\n\n if (this._nowScrolling) {\n if (\n axisIsChanged ||\n (_lastAxis === 'y' && lastYDirectionIsChanged) ||\n (_lastAxis === 'x' && lastXDirectionIsChanged)\n ) {\n // emit scroll end & start(both)\n this._triggerScrollTick('scrollEnd');\n } else {\n // add scroll amounts\n this._lastTotalX = this._scrollLeft - this._startX;\n this._lastTotalY = this._scrollTop - this._startY;\n this._triggerScrollTick('scroll');\n }\n }\n\n // judge scroll start\n if (!this._nowScrolling) {\n this._updateScrollSize();\n this._triggerScrollTick('scrollStart');\n }\n\n this._clearScrollingJudgeTimer();\n this._scrollingJudgeTimerId = window.setTimeout(() => {\n this._triggerScrollTick('scrollEnd');\n }, this.scrollingJudgeInterval);\n }\n\n private _syncToObserver(\n observer: ScrollerObserver,\n keys: ScrollerObservableKeys[] = scrollerObservableKeys,\n ) {\n for (const key of keys) {\n (observer as any)[key] = this[key];\n }\n }\n\n private _syncToObservers(\n keys: ScrollerObservableKeys | ScrollerObservableKeys[],\n ) {\n if (this._observers.length === 0) return;\n keys = typeof keys === 'string' ? [keys] : keys;\n for (const observer of this._observers) {\n this._syncToObserver(observer, keys);\n }\n }\n\n private _checkElement() {\n const { _el } = this;\n if (!_el) {\n const message = 'missing element';\n logger.error(message);\n throw new Error(message);\n }\n return _el;\n }\n\n private _createMergedScrollOptions(\n source?: ScrollerScrollOptions,\n ): ScrollOptions {\n const el = this._checkElement();\n const merged: ScrollOptions = {\n container: el,\n ...this.scrollSettingsDefaults,\n ...source,\n };\n return merged;\n }\n\n private _createMergedScrollToElementOptions(\n source?: ScrollerScrollToElementOptions,\n ): ScrollToElementOptions {\n const el = this._checkElement();\n const merged: ScrollToElementOptions = {\n container: el,\n ...this.scrollToElementSettingsDefaults,\n ...source,\n };\n let { _scrollToElementAdditionalOffset: additionalOffset } = this;\n if (!additionalOffset) return merged;\n if (typeof additionalOffset === 'function') {\n additionalOffset = additionalOffset(this);\n }\n if (!additionalOffset) return merged;\n if (typeof additionalOffset === 'number') {\n additionalOffset = {\n x: additionalOffset,\n y: additionalOffset,\n };\n }\n let { offset } = merged;\n if (!offset) {\n merged.offset = additionalOffset;\n return merged;\n }\n if (typeof offset === 'number') {\n offset = {\n x: offset,\n y: offset,\n };\n }\n\n offset.x = (offset.x || 0) + (additionalOffset.x || 0);\n offset.y = (offset.y || 0) + (additionalOffset.y || 0);\n merged.offset = offset;\n return merged;\n }\n\n private _clearScrollToResult() {\n if (!this._scrollToResult) return;\n this._scrollToResult = null;\n }\n\n private _setScrollToResult(result: ScrollResult): ScrollResult {\n this._scrollToResult = result;\n result.promise.then(() => {\n this._clearScrollToResult();\n });\n return result;\n }\n\n private _updateScrollable() {\n if (this.scrollEnabled) {\n this._scrollEnable();\n } else {\n this._scrollDisable();\n }\n }\n\n private _scrollEnable() {\n enableScroll(this._checkElement());\n }\n\n private _scrollDisable() {\n const el = this._checkElement();\n this.cancel();\n disableScroll(el);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastkit/scroller",
3
- "version": "0.14.4",
3
+ "version": "0.14.5",
4
4
  "description": "Library for controlling the scrolling state of DOM elements.",
5
5
  "keywords": [
6
6
  "fastkit",
@@ -42,9 +42,9 @@
42
42
  "dependencies": {
43
43
  "bezier-easing": "^2.1.0",
44
44
  "@fastkit/ev": "^0.14.1",
45
- "@fastkit/helpers": "^0.14.4",
46
- "@fastkit/visibility": "^0.14.4",
47
- "@fastkit/tiny-logger": "^0.14.4"
45
+ "@fastkit/helpers": "^0.14.5",
46
+ "@fastkit/tiny-logger": "^0.14.5",
47
+ "@fastkit/visibility": "^0.14.5"
48
48
  },
49
49
  "buildOptions": {
50
50
  "name": "Scroller"