@fastkit/scroller 0.16.0 → 0.17.0-next.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util.ts","../src/logger.ts","../src/prevent-scroll.ts","../src/scroll/schemes.ts","../src/bezier-easing.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","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n *\n * Algebraic solver by Dmitry Baranovskiy\n * http://dmitry.baranovskiy.com/bezier-easing.html\n */\n\nexport interface EasingFunction {\n (input: number): number;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\nconst { cbrt, sqrt, PI: π } = Math;\n\n// Solve cubic bezier x(t) = x for t using Cardano's formula\n// Parameters are precomputed coefficients from the bezier control points\nconst x2t = (x: number, a: number, b: number, c: number, d: number) => {\n const q = a + b * x;\n const s = q ** 2 + c;\n if (s > 0) {\n const root = sqrt(s);\n return cbrt(q + root) + cbrt(q - root) - d;\n }\n const l = cbrt(sqrt(q * q - s));\n const angle = q ? Math.atan(sqrt(-s) / q) : -π / 2;\n let φ;\n if (b < 0) {\n φ = (q > 0 ? 2 * π : π) - angle;\n } else if (d < 0) {\n φ = (q > 0 ? 2 * π : -3 * π) + angle;\n } else {\n φ = (q > 0 ? 0 : π) + angle;\n }\n return 2 * l * Math.cos(φ / 3) - d;\n};\n\nconst Y = (t: number, ay: number, by: number, cy: number) =>\n ((ay * t + 3 * by) * t + cy) * t;\n\nexport default function bezier(\n mX1: number,\n mY1: number,\n mX2: number,\n mY2: number,\n) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n const a = 6 * (3 * mX1 - 3 * mX2 + 1);\n const b = 6 * (mX2 - 2 * mX1);\n const c = 3 * mX1;\n\n const a2 = a * a;\n const b2 = b * b;\n\n const d = b / a;\n const e = (3 * b * c) / a2 - (b2 * b) / (a2 * a);\n const w1 = (2 * c) / a - b2 / a2;\n const w = w1 * w1 * w1;\n const o = 3 / a;\n\n const ay = 3 * mY1 - 3 * mY2 + 1;\n const by = mY2 - 2 * mY1;\n const cy = 3 * mY1;\n\n const X2T = a ? x2t : LinearEasing;\n\n return function BezierEasing(x: number) {\n if (x === 0 || x === 1) {\n return x;\n }\n return Y(X2T(x, e, o, w, d), ay, by, cy);\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 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\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/no-unsafe-function-type\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 */\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/no-unsafe-function-type\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"]}
1
+ {"version":3,"file":"scroller.mjs","names":["isBodyElement","easings","BezierEasing","_scrollToElementSettingsDefaults","isBodyElement"],"sources":["../src/util.ts","../src/logger.ts","../src/prevent-scroll.ts","../src/scroll/schemes.ts","../src/bezier-easing.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"],"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","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n *\n * Algebraic solver by Dmitry Baranovskiy\n * http://dmitry.baranovskiy.com/bezier-easing.html\n */\n\nexport interface EasingFunction {\n (input: number): number;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\nconst { cbrt, sqrt, PI: π } = Math;\n\n// Solve cubic bezier x(t) = x for t using Cardano's formula\n// Parameters are precomputed coefficients from the bezier control points\nconst x2t = (x: number, a: number, b: number, c: number, d: number) => {\n const q = a + b * x;\n const s = q ** 2 + c;\n if (s > 0) {\n const root = sqrt(s);\n return cbrt(q + root) + cbrt(q - root) - d;\n }\n const l = cbrt(sqrt(q * q - s));\n const angle = q ? Math.atan(sqrt(-s) / q) : -π / 2;\n let φ;\n if (b < 0) {\n φ = (q > 0 ? 2 * π : π) - angle;\n } else if (d < 0) {\n φ = (q > 0 ? 2 * π : -3 * π) + angle;\n } else {\n φ = (q > 0 ? 0 : π) + angle;\n }\n return 2 * l * Math.cos(φ / 3) - d;\n};\n\nconst Y = (t: number, ay: number, by: number, cy: number) =>\n ((ay * t + 3 * by) * t + cy) * t;\n\nexport default function bezier(\n mX1: number,\n mY1: number,\n mX2: number,\n mY2: number,\n) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n const a = 6 * (3 * mX1 - 3 * mX2 + 1);\n const b = 6 * (mX2 - 2 * mX1);\n const c = 3 * mX1;\n\n const a2 = a * a;\n const b2 = b * b;\n\n const d = b / a;\n const e = (3 * b * c) / a2 - (b2 * b) / (a2 * a);\n const w1 = (2 * c) / a - b2 / a2;\n const w = w1 * w1 * w1;\n const o = 3 / a;\n\n const ay = 3 * mY1 - 3 * mY2 + 1;\n const by = mY2 - 2 * mY1;\n const cy = 3 * mY1;\n\n const X2T = a ? x2t : LinearEasing;\n\n return function BezierEasing(x: number) {\n if (x === 0 || x === 1) {\n return x;\n }\n return Y(X2T(x, e, o, w, d), ay, by, cy);\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 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\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/no-unsafe-function-type\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 */\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/no-unsafe-function-type\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fastkit/scroller",
3
- "version": "0.16.0",
3
+ "version": "0.17.0-next.0",
4
4
  "description": "Library for controlling the scrolling state of DOM elements.",
5
5
  "keywords": [
6
6
  "fastkit",
@@ -20,7 +20,7 @@
20
20
  "exports": {
21
21
  "./package.json": "./package.json",
22
22
  ".": {
23
- "types": "./dist/scroller.d.ts",
23
+ "types": "./dist/scroller.d.mts",
24
24
  "import": {
25
25
  "default": "./dist/scroller.mjs"
26
26
  }
@@ -28,11 +28,11 @@
28
28
  "./*": "./dist/*"
29
29
  },
30
30
  "main": "./dist/scroller.mjs",
31
- "types": "./dist/scroller.d.ts",
31
+ "types": "./dist/scroller.d.mts",
32
32
  "typesVersions": {
33
33
  "*": {
34
34
  ".": [
35
- "./dist/scroller.d.ts"
35
+ "./dist/scroller.d.mts"
36
36
  ]
37
37
  }
38
38
  },
@@ -40,10 +40,10 @@
40
40
  "dist"
41
41
  ],
42
42
  "dependencies": {
43
- "@fastkit/ev": "^0.14.1",
44
- "@fastkit/helpers": "^0.15.0",
45
- "@fastkit/visibility": "^0.15.0",
46
- "@fastkit/tiny-logger": "^0.15.0"
43
+ "@fastkit/ev": "^0.15.0-next.0",
44
+ "@fastkit/visibility": "^0.16.0-next.0",
45
+ "@fastkit/helpers": "^0.16.0-next.0",
46
+ "@fastkit/tiny-logger": "^0.16.0-next.0"
47
47
  },
48
48
  "buildOptions": {
49
49
  "name": "Scroller"