@fastkit/scroller 0.14.4 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,7 @@
1
+
1
2
  # @fastkit/scroller
2
3
 
4
+ 🌐 English | [日本語](https://github.com/dadajam4/fastkit/blob/main/packages/scroller/README-ja.md)
5
+
3
6
  ## Documentation
4
7
  https://dadajam4.github.io/fastkit/scroller/
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":"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","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.15.0",
4
4
  "description": "Library for controlling the scrolling state of DOM elements.",
5
5
  "keywords": [
6
6
  "fastkit",
@@ -41,10 +41,10 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "bezier-easing": "^2.1.0",
44
+ "@fastkit/helpers": "^0.15.0",
44
45
  "@fastkit/ev": "^0.14.1",
45
- "@fastkit/helpers": "^0.14.4",
46
- "@fastkit/visibility": "^0.14.4",
47
- "@fastkit/tiny-logger": "^0.14.4"
46
+ "@fastkit/tiny-logger": "^0.15.0",
47
+ "@fastkit/visibility": "^0.15.0"
48
48
  },
49
49
  "buildOptions": {
50
50
  "name": "Scroller"