@andrew_l/dom 0.2.21 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/animation.ts","../src/environment.ts","../src/copyTextToClipboard.ts","../src/fastSmoothScroll.ts","../src/isScrolledToDown.ts","../src/resetScroll.ts"],"sourcesContent":["import { fastRaf } from '@andrew_l/toolkit';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\n/**\n * Animates a single tick of an animation, running repeatedly until cancelled or the tick function returns `false`.\n *\n * If an `instance` is provided, it will control the cancellation state of the animation. Otherwise, a new animation\n * instance is created and assigned as the current instance. This function uses `fastRaf` to run the animation in the\n * next available frame.\n *\n * @param tick A function to be called on each frame, returning `true` to continue animating or `false` to stop.\n * @param instance An optional animation instance to control cancellation state.\n *\n * @example\n * animateSingle(() => {\n * // Your tick logic here (e.g., move an element)\n * return true; // Return `true` to keep animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\n/**\n * Continuously animates by repeatedly calling the `tick` function until it returns `false`.\n *\n * The function uses `fastRaf` to run the animation and continues until the `tick` function no longer returns `true`.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animate(() => {\n * // Your animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n\n/**\n * Instantly animates by calling the `tick` function in rapid succession until it returns `false`.\n *\n * This is intended for scenarios where the animation should run as quickly as possible, without any delay.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animateInstantly(() => {\n * // Your instant animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateInstantly(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animateInstantly(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - --t * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + --t * t ** 4,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t * t ** 4,\n};\n\n/**\n * Animates a numeric value from `from` to `to` over a specified duration, applying an optional timing function.\n *\n * The animation will continuously update the value using the `onUpdate` callback until the animation is complete.\n * Once the animation ends, the `onEnd` callback will be called, if provided.\n *\n * @param timing The timing function that controls the progression of the animation. Defaults to `linear`.\n * @param onUpdate A callback that receives the updated value (or values) on each animation frame.\n * @param duration The duration of the animation in milliseconds.\n * @param onEnd An optional callback to be called when the animation completes.\n * @param from The starting value(s) of the animation.\n * @param to The target value(s) of the animation.\n *\n * @returns A function that can be called to cancel the animation.\n *\n * @example\n * animateNumber({\n * from: 0,\n * to: 100,\n * duration: 1000,\n * onUpdate: (value) => {\n * console.log(value); // Updated value on each frame\n * },\n * onEnd: () => {\n * console.log('Animation complete!');\n * },\n * });\n *\n * @group Animation\n */\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animateInstantly(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + (to - from) * progress);\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + (to[i] - f) * progress);\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","export const defaultWindow = /* #__PURE__ */ (globalThis as any)?.window as\n | Window\n | undefined;\n\nexport const defaultDocument = /* #__PURE__ */ (globalThis as any)?.document as\n | Document\n | undefined;\n\nexport const defaultNavigator = /* #__PURE__ */ (globalThis as any)\n ?.navigator as Navigator | undefined;\n\nexport const defaultLocation = /* #__PURE__ */ (globalThis as any)?.window\n ?.location as Location | undefined;\n","import {\n defaultDocument,\n defaultNavigator,\n defaultWindow,\n} from './environment';\n\n/**\n * Copies the provided text to the system clipboard.\n *\n * The function attempts to use the `navigator.clipboard` API if available. If not,\n * it falls back to using a fake element approach to copy the text.\n *\n * @param text The text to be copied to the clipboard.\n * @returns A promise that resolves to `true` if the text was successfully copied,\n * or `false` if the operation failed.\n *\n * @example\n * copyTextToClipboard('Hello, World!')\n * .then(success => {\n * if (success) {\n * console.log('Text copied to clipboard!');\n * } else {\n * console.log('Failed to copy text.');\n * }\n * });\n *\n * @group Clipboard\n */\nexport function copyTextToClipboard(text: string): Promise<boolean> {\n if (defaultNavigator?.clipboard) {\n return copyWithNavigator(text);\n } else {\n return copyWithFakeElement(text);\n }\n}\n\nfunction copyWithNavigator(text: string): Promise<boolean> {\n if (!defaultNavigator) return Promise.resolve(false);\n\n return navigator.clipboard.writeText(text).then(() => true);\n}\n\nfunction copyWithFakeElement(text: string): Promise<boolean> {\n return new Promise((resolve, reject) => {\n if (!defaultDocument) return resolve(false);\n if (!defaultWindow) return resolve(false);\n\n const textareaEl = defaultDocument.createElement('textarea');\n const range = defaultDocument.createRange();\n\n textareaEl.value = text;\n textareaEl.style.position = 'fixed'; // Avoid scrolling to bottom\n textareaEl.contentEditable = 'true';\n\n defaultDocument.body.appendChild(textareaEl);\n\n textareaEl.focus();\n textareaEl.select();\n\n range.selectNodeContents(textareaEl);\n\n const selection = defaultWindow.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n textareaEl.setSelectionRange(0, 999999);\n\n try {\n const successful = defaultDocument.execCommand('copy');\n if (successful) {\n resolve(true);\n } else {\n reject(new Error('copy failed'));\n }\n } catch (error) {\n reject(error);\n }\n\n if (selection) {\n selection.removeAllRanges();\n }\n\n defaultDocument.body.removeChild(textareaEl);\n });\n}\n","import { fastRaf } from '@andrew_l/toolkit';\nimport { animateSingle } from './animation';\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\nexport type ScrollCompleteCallback = (target: HTMLElement) => void;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\n/**\n * Smoothly scrolls the specified container to bring the given element into view,\n * with optional customization for scroll behavior, direction, and duration.\n *\n * This function calculates the optimal scroll position based on the given parameters\n * and smoothly scrolls the container to that position. It can adjust the scroll\n * behavior for accessibility, animation duration, and other constraints.\n *\n * @param container The container element that will be scrolled.\n * @param element The element inside the container that needs to be brought into view.\n * @param position The scroll position logic (`'centerOrTop'`, `ScrollLogicalPosition`).\n * @param margin A margin in pixels to be applied around the element when scrolling into view (default is `0`).\n * @param maxDistance The maximum distance for smooth scrolling (default is `FAST_SMOOTH_MAX_DISTANCE`).\n * @param forceDirection Optional, the direction to force the scroll (`FocusDirection`). If not provided, the default scroll direction is calculated.\n * @param forceDuration Optional, a custom duration (in milliseconds) for the smooth scroll. If not provided, a default duration is used.\n * @param forceNormalContainerHeight Optional, a flag indicating whether to force the container height calculation for normal behavior.\n * @param onComplete Optional callback function that is triggered when the scroll operation completes.\n *\n * @example\n * fastSmoothScroll(container, element, 'centerOrTop', 10, 500, FocusDirection.Up, 300);\n *\n * @group Scrolling\n */\nexport function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const scrollFrom = calculateScrollFrom(\n container,\n element,\n maxDistance,\n forceDirection,\n );\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n scrollWithJs(\n container,\n element,\n scrollFrom,\n position,\n margin,\n forceDuration,\n forceNormalContainerHeight,\n onComplete,\n );\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const {\n scrollTop: currentScrollTop,\n offsetHeight: containerHeight,\n scrollHeight,\n } = container;\n const targetContainerHeight =\n forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = elementTop - margin - scrollFrom;\n break;\n case 'end':\n path =\n elementTop +\n elementHeight +\n margin -\n (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path =\n elementHeight < targetContainerHeight\n ? elementTop +\n elementHeight / 2 -\n (scrollFrom + targetContainerHeight / 2)\n : elementTop - margin - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n onComplete?.(container);\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n onComplete?.(container);\n return;\n }\n\n const absPath = Math.abs(path);\n const transition =\n absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE\n ? shortTransition\n : longTransition;\n const duration =\n forceDuration ||\n FAST_SMOOTH_MIN_DURATION +\n (absPath / FAST_SMOOTH_MAX_DISTANCE) *\n (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION);\n const startAt = Date.now();\n\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n if (t > 0) {\n return true;\n }\n\n onComplete?.(container);\n return false;\n });\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - (1 - t) ** 5;\n}\n\nfunction shortTransition(t: number) {\n return 1 - (1 - t) ** 3.5;\n}\n","import { defaultDocument, defaultWindow } from './environment';\n\n/**\n * Determines if the specified element or the document/window is scrolled near the bottom.\n *\n * This function checks if the scroll position has reached the bottom of the target element or window\n * within a specified threshold. It is commonly used for implementing \"infinite scroll\" or detecting\n * when a user has scrolled to the bottom of a page or container.\n *\n * @param target The target element, document, or window to check the scroll position.\n * Can be an `HTMLElement`, `Document`, or `Window`.\n * @param threshold The threshold (in pixels) below which the target is considered \"scrolled to the bottom.\"\n * Default is `10`, meaning the target is considered scrolled to the bottom if it is within 10px of the bottom.\n *\n * @returns `true` if the target is scrolled near the bottom within the given threshold, otherwise `false`.\n *\n * @example\n * // Check if the window is scrolled near the bottom\n * isScrolledToDown(window, 20); // Returns true if within 20px of the bottom of the window.\n *\n * @example\n * // Check if a specific container is scrolled near the bottom\n * const container = document.getElementById('myContainer');\n * isScrolledToDown(container, 50); // Returns true if within 50px of the bottom of the container.\n *\n * @group Scrolling\n */\nexport function isScrolledToDown(\n target: HTMLElement | Document | Window,\n threshold: number = 10,\n) {\n let scrollBottom: number;\n\n if (target === defaultDocument) {\n scrollBottom =\n (defaultDocument?.body?.offsetHeight || 0) -\n ((defaultWindow?.innerHeight || 0) + (defaultWindow?.scrollY || 0));\n } else {\n const el = target as HTMLElement;\n scrollBottom = el.scrollHeight - (el.offsetHeight + el.scrollTop);\n }\n\n return scrollBottom <= threshold;\n}\n","/**\n * Resets the scroll position of the specified container element.\n *\n * If a `scrollTop` value is provided, the container's scroll position is set\n * to that value. Otherwise, the function will leave the scroll position unchanged.\n * This function is useful for resetting the scroll state in a container, such as\n * when the content changes or after an animation.\n *\n * @param container The container element whose scroll position needs to be reset.\n * @param scrollTop Optional value to set the container's `scrollTop`. If not provided, the scroll position remains unchanged.\n *\n * @example\n * resetScroll(container, 0); // Resets scroll to top of the container.\n * resetScroll(container); // Resets scroll position without changing it.\n *\n * @group Scrolling\n */\nexport function resetScroll(container: HTMLDivElement, scrollTop?: number) {\n // if (IS_IOS) {\n // \tcontainer.style.overflow = 'hidden';\n // }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n // if (IS_IOS) {\n // \tcontainer.style.overflow = '';\n // }\n}\n"],"names":["fastRaf","FocusDirection"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/animation.ts","../src/environment.ts","../src/copyTextToClipboard.ts","../src/fastSmoothScroll.ts","../src/isScrolledToDown.ts","../src/resetScroll.ts"],"sourcesContent":["import { fastRaf } from '@andrew_l/toolkit';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\n/**\n * Animates a single tick of an animation, running repeatedly until cancelled or the tick function returns `false`.\n *\n * If an `instance` is provided, it will control the cancellation state of the animation. Otherwise, a new animation\n * instance is created and assigned as the current instance. This function uses `fastRaf` to run the animation in the\n * next available frame.\n *\n * @param tick A function to be called on each frame, returning `true` to continue animating or `false` to stop.\n * @param instance An optional animation instance to control cancellation state.\n *\n * @example\n * animateSingle(() => {\n * // Your tick logic here (e.g., move an element)\n * return true; // Return `true` to keep animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\n/**\n * Continuously animates by repeatedly calling the `tick` function until it returns `false`.\n *\n * The function uses `fastRaf` to run the animation and continues until the `tick` function no longer returns `true`.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animate(() => {\n * // Your animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n\n/**\n * Instantly animates by calling the `tick` function in rapid succession until it returns `false`.\n *\n * This is intended for scenarios where the animation should run as quickly as possible, without any delay.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animateInstantly(() => {\n * // Your instant animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateInstantly(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animateInstantly(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - --t * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + --t * t ** 4,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t * t ** 4,\n};\n\n/**\n * Animates a numeric value from `from` to `to` over a specified duration, applying an optional timing function.\n *\n * The animation will continuously update the value using the `onUpdate` callback until the animation is complete.\n * Once the animation ends, the `onEnd` callback will be called, if provided.\n *\n * @param timing The timing function that controls the progression of the animation. Defaults to `linear`.\n * @param onUpdate A callback that receives the updated value (or values) on each animation frame.\n * @param duration The duration of the animation in milliseconds.\n * @param onEnd An optional callback to be called when the animation completes.\n * @param from The starting value(s) of the animation.\n * @param to The target value(s) of the animation.\n *\n * @returns A function that can be called to cancel the animation.\n *\n * @example\n * animateNumber({\n * from: 0,\n * to: 100,\n * duration: 1000,\n * onUpdate: (value) => {\n * console.log(value); // Updated value on each frame\n * },\n * onEnd: () => {\n * console.log('Animation complete!');\n * },\n * });\n *\n * @group Animation\n */\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animateInstantly(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + (to - from) * progress);\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + (to[i] - f) * progress);\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","export const defaultWindow = /* #__PURE__ */ (globalThis as any)?.window as\n | Window\n | undefined;\n\nexport const defaultDocument = /* #__PURE__ */ (globalThis as any)?.document as\n | Document\n | undefined;\n\nexport const defaultNavigator = /* #__PURE__ */ (globalThis as any)\n ?.navigator as Navigator | undefined;\n\nexport const defaultLocation = /* #__PURE__ */ (globalThis as any)?.window\n ?.location as Location | undefined;\n","import {\n defaultDocument,\n defaultNavigator,\n defaultWindow,\n} from './environment';\n\n/**\n * Copies the provided text to the system clipboard.\n *\n * The function attempts to use the `navigator.clipboard` API if available. If not,\n * it falls back to using a fake element approach to copy the text.\n *\n * @param text The text to be copied to the clipboard.\n * @returns A promise that resolves to `true` if the text was successfully copied,\n * or `false` if the operation failed.\n *\n * @example\n * copyTextToClipboard('Hello, World!')\n * .then(success => {\n * if (success) {\n * console.log('Text copied to clipboard!');\n * } else {\n * console.log('Failed to copy text.');\n * }\n * });\n *\n * @group Clipboard\n */\nexport function copyTextToClipboard(text: string): Promise<boolean> {\n if (defaultNavigator?.clipboard) {\n return copyWithNavigator(text);\n } else {\n return copyWithFakeElement(text);\n }\n}\n\nfunction copyWithNavigator(text: string): Promise<boolean> {\n if (!defaultNavigator) return Promise.resolve(false);\n\n return navigator.clipboard.writeText(text).then(() => true);\n}\n\nfunction copyWithFakeElement(text: string): Promise<boolean> {\n return new Promise((resolve, reject) => {\n if (!defaultDocument) return resolve(false);\n if (!defaultWindow) return resolve(false);\n\n const textareaEl = defaultDocument.createElement('textarea');\n const range = defaultDocument.createRange();\n\n textareaEl.value = text;\n textareaEl.style.position = 'fixed'; // Avoid scrolling to bottom\n textareaEl.contentEditable = 'true';\n\n defaultDocument.body.appendChild(textareaEl);\n\n textareaEl.focus();\n textareaEl.select();\n\n range.selectNodeContents(textareaEl);\n\n const selection = defaultWindow.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n textareaEl.setSelectionRange(0, 999999);\n\n try {\n const successful = defaultDocument.execCommand('copy');\n if (successful) {\n resolve(true);\n } else {\n reject(new Error('copy failed'));\n }\n } catch (error) {\n reject(error);\n }\n\n if (selection) {\n selection.removeAllRanges();\n }\n\n defaultDocument.body.removeChild(textareaEl);\n });\n}\n","import { fastRaf } from '@andrew_l/toolkit';\nimport { animateSingle } from './animation';\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\nexport type ScrollCompleteCallback = (target: HTMLElement) => void;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\n/**\n * Smoothly scrolls the specified container to bring the given element into view,\n * with optional customization for scroll behavior, direction, and duration.\n *\n * This function calculates the optimal scroll position based on the given parameters\n * and smoothly scrolls the container to that position. It can adjust the scroll\n * behavior for accessibility, animation duration, and other constraints.\n *\n * @param container The container element that will be scrolled.\n * @param element The element inside the container that needs to be brought into view.\n * @param position The scroll position logic (`'centerOrTop'`, `ScrollLogicalPosition`).\n * @param margin A margin in pixels to be applied around the element when scrolling into view (default is `0`).\n * @param maxDistance The maximum distance for smooth scrolling (default is `FAST_SMOOTH_MAX_DISTANCE`).\n * @param forceDirection Optional, the direction to force the scroll (`FocusDirection`). If not provided, the default scroll direction is calculated.\n * @param forceDuration Optional, a custom duration (in milliseconds) for the smooth scroll. If not provided, a default duration is used.\n * @param forceNormalContainerHeight Optional, a flag indicating whether to force the container height calculation for normal behavior.\n * @param onComplete Optional callback function that is triggered when the scroll operation completes.\n *\n * @example\n * fastSmoothScroll(container, element, 'centerOrTop', 10, 500, FocusDirection.Up, 300);\n *\n * @group Scrolling\n */\nexport function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const scrollFrom = calculateScrollFrom(\n container,\n element,\n maxDistance,\n forceDirection,\n );\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n scrollWithJs(\n container,\n element,\n scrollFrom,\n position,\n margin,\n forceDuration,\n forceNormalContainerHeight,\n onComplete,\n );\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const {\n scrollTop: currentScrollTop,\n offsetHeight: containerHeight,\n scrollHeight,\n } = container;\n const targetContainerHeight =\n forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = elementTop - margin - scrollFrom;\n break;\n case 'end':\n path =\n elementTop +\n elementHeight +\n margin -\n (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path =\n elementHeight < targetContainerHeight\n ? elementTop +\n elementHeight / 2 -\n (scrollFrom + targetContainerHeight / 2)\n : elementTop - margin - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n onComplete?.(container);\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n onComplete?.(container);\n return;\n }\n\n const absPath = Math.abs(path);\n const transition =\n absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE\n ? shortTransition\n : longTransition;\n const duration =\n forceDuration ||\n FAST_SMOOTH_MIN_DURATION +\n (absPath / FAST_SMOOTH_MAX_DISTANCE) *\n (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION);\n const startAt = Date.now();\n\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n if (t > 0) {\n return true;\n }\n\n onComplete?.(container);\n return false;\n });\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - (1 - t) ** 5;\n}\n\nfunction shortTransition(t: number) {\n return 1 - (1 - t) ** 3.5;\n}\n","import { defaultDocument, defaultWindow } from './environment';\n\n/**\n * Determines if the specified element or the document/window is scrolled near the bottom.\n *\n * This function checks if the scroll position has reached the bottom of the target element or window\n * within a specified threshold. It is commonly used for implementing \"infinite scroll\" or detecting\n * when a user has scrolled to the bottom of a page or container.\n *\n * @param target The target element, document, or window to check the scroll position.\n * Can be an `HTMLElement`, `Document`, or `Window`.\n * @param threshold The threshold (in pixels) below which the target is considered \"scrolled to the bottom.\"\n * Default is `10`, meaning the target is considered scrolled to the bottom if it is within 10px of the bottom.\n *\n * @returns `true` if the target is scrolled near the bottom within the given threshold, otherwise `false`.\n *\n * @example\n * // Check if the window is scrolled near the bottom\n * isScrolledToDown(window, 20); // Returns true if within 20px of the bottom of the window.\n *\n * @example\n * // Check if a specific container is scrolled near the bottom\n * const container = document.getElementById('myContainer');\n * isScrolledToDown(container, 50); // Returns true if within 50px of the bottom of the container.\n *\n * @group Scrolling\n */\nexport function isScrolledToDown(\n target: HTMLElement | Document | Window,\n threshold: number = 10,\n) {\n let scrollBottom: number;\n\n if (target === defaultDocument) {\n scrollBottom =\n (defaultDocument?.body?.offsetHeight || 0) -\n ((defaultWindow?.innerHeight || 0) + (defaultWindow?.scrollY || 0));\n } else {\n const el = target as HTMLElement;\n scrollBottom = el.scrollHeight - (el.offsetHeight + el.scrollTop);\n }\n\n return scrollBottom <= threshold;\n}\n","/**\n * Resets the scroll position of the specified container element.\n *\n * If a `scrollTop` value is provided, the container's scroll position is set\n * to that value. Otherwise, the function will leave the scroll position unchanged.\n * This function is useful for resetting the scroll state in a container, such as\n * when the content changes or after an animation.\n *\n * @param container The container element whose scroll position needs to be reset.\n * @param scrollTop Optional value to set the container's `scrollTop`. If not provided, the scroll position remains unchanged.\n *\n * @example\n * resetScroll(container, 0); // Resets scroll to top of the container.\n * resetScroll(container); // Resets scroll position without changing it.\n *\n * @group Scrolling\n */\nexport function resetScroll(container: HTMLDivElement, scrollTop?: number) {\n // if (IS_IOS) {\n // \tcontainer.style.overflow = 'hidden';\n // }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n // if (IS_IOS) {\n // \tcontainer.style.overflow = '';\n // }\n}\n"],"names":["fastRaf","FocusDirection"],"mappings":"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"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/animation.ts","../src/environment.ts","../src/copyTextToClipboard.ts","../src/fastSmoothScroll.ts","../src/isScrolledToDown.ts","../src/resetScroll.ts"],"sourcesContent":["import { fastRaf } from '@andrew_l/toolkit';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\n/**\n * Animates a single tick of an animation, running repeatedly until cancelled or the tick function returns `false`.\n *\n * If an `instance` is provided, it will control the cancellation state of the animation. Otherwise, a new animation\n * instance is created and assigned as the current instance. This function uses `fastRaf` to run the animation in the\n * next available frame.\n *\n * @param tick A function to be called on each frame, returning `true` to continue animating or `false` to stop.\n * @param instance An optional animation instance to control cancellation state.\n *\n * @example\n * animateSingle(() => {\n * // Your tick logic here (e.g., move an element)\n * return true; // Return `true` to keep animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\n/**\n * Continuously animates by repeatedly calling the `tick` function until it returns `false`.\n *\n * The function uses `fastRaf` to run the animation and continues until the `tick` function no longer returns `true`.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animate(() => {\n * // Your animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n\n/**\n * Instantly animates by calling the `tick` function in rapid succession until it returns `false`.\n *\n * This is intended for scenarios where the animation should run as quickly as possible, without any delay.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animateInstantly(() => {\n * // Your instant animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateInstantly(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animateInstantly(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - --t * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + --t * t ** 4,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t * t ** 4,\n};\n\n/**\n * Animates a numeric value from `from` to `to` over a specified duration, applying an optional timing function.\n *\n * The animation will continuously update the value using the `onUpdate` callback until the animation is complete.\n * Once the animation ends, the `onEnd` callback will be called, if provided.\n *\n * @param timing The timing function that controls the progression of the animation. Defaults to `linear`.\n * @param onUpdate A callback that receives the updated value (or values) on each animation frame.\n * @param duration The duration of the animation in milliseconds.\n * @param onEnd An optional callback to be called when the animation completes.\n * @param from The starting value(s) of the animation.\n * @param to The target value(s) of the animation.\n *\n * @returns A function that can be called to cancel the animation.\n *\n * @example\n * animateNumber({\n * from: 0,\n * to: 100,\n * duration: 1000,\n * onUpdate: (value) => {\n * console.log(value); // Updated value on each frame\n * },\n * onEnd: () => {\n * console.log('Animation complete!');\n * },\n * });\n *\n * @group Animation\n */\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animateInstantly(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + (to - from) * progress);\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + (to[i] - f) * progress);\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","export const defaultWindow = /* #__PURE__ */ (globalThis as any)?.window as\n | Window\n | undefined;\n\nexport const defaultDocument = /* #__PURE__ */ (globalThis as any)?.document as\n | Document\n | undefined;\n\nexport const defaultNavigator = /* #__PURE__ */ (globalThis as any)\n ?.navigator as Navigator | undefined;\n\nexport const defaultLocation = /* #__PURE__ */ (globalThis as any)?.window\n ?.location as Location | undefined;\n","import {\n defaultDocument,\n defaultNavigator,\n defaultWindow,\n} from './environment';\n\n/**\n * Copies the provided text to the system clipboard.\n *\n * The function attempts to use the `navigator.clipboard` API if available. If not,\n * it falls back to using a fake element approach to copy the text.\n *\n * @param text The text to be copied to the clipboard.\n * @returns A promise that resolves to `true` if the text was successfully copied,\n * or `false` if the operation failed.\n *\n * @example\n * copyTextToClipboard('Hello, World!')\n * .then(success => {\n * if (success) {\n * console.log('Text copied to clipboard!');\n * } else {\n * console.log('Failed to copy text.');\n * }\n * });\n *\n * @group Clipboard\n */\nexport function copyTextToClipboard(text: string): Promise<boolean> {\n if (defaultNavigator?.clipboard) {\n return copyWithNavigator(text);\n } else {\n return copyWithFakeElement(text);\n }\n}\n\nfunction copyWithNavigator(text: string): Promise<boolean> {\n if (!defaultNavigator) return Promise.resolve(false);\n\n return navigator.clipboard.writeText(text).then(() => true);\n}\n\nfunction copyWithFakeElement(text: string): Promise<boolean> {\n return new Promise((resolve, reject) => {\n if (!defaultDocument) return resolve(false);\n if (!defaultWindow) return resolve(false);\n\n const textareaEl = defaultDocument.createElement('textarea');\n const range = defaultDocument.createRange();\n\n textareaEl.value = text;\n textareaEl.style.position = 'fixed'; // Avoid scrolling to bottom\n textareaEl.contentEditable = 'true';\n\n defaultDocument.body.appendChild(textareaEl);\n\n textareaEl.focus();\n textareaEl.select();\n\n range.selectNodeContents(textareaEl);\n\n const selection = defaultWindow.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n textareaEl.setSelectionRange(0, 999999);\n\n try {\n const successful = defaultDocument.execCommand('copy');\n if (successful) {\n resolve(true);\n } else {\n reject(new Error('copy failed'));\n }\n } catch (error) {\n reject(error);\n }\n\n if (selection) {\n selection.removeAllRanges();\n }\n\n defaultDocument.body.removeChild(textareaEl);\n });\n}\n","import { fastRaf } from '@andrew_l/toolkit';\nimport { animateSingle } from './animation';\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\nexport type ScrollCompleteCallback = (target: HTMLElement) => void;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\n/**\n * Smoothly scrolls the specified container to bring the given element into view,\n * with optional customization for scroll behavior, direction, and duration.\n *\n * This function calculates the optimal scroll position based on the given parameters\n * and smoothly scrolls the container to that position. It can adjust the scroll\n * behavior for accessibility, animation duration, and other constraints.\n *\n * @param container The container element that will be scrolled.\n * @param element The element inside the container that needs to be brought into view.\n * @param position The scroll position logic (`'centerOrTop'`, `ScrollLogicalPosition`).\n * @param margin A margin in pixels to be applied around the element when scrolling into view (default is `0`).\n * @param maxDistance The maximum distance for smooth scrolling (default is `FAST_SMOOTH_MAX_DISTANCE`).\n * @param forceDirection Optional, the direction to force the scroll (`FocusDirection`). If not provided, the default scroll direction is calculated.\n * @param forceDuration Optional, a custom duration (in milliseconds) for the smooth scroll. If not provided, a default duration is used.\n * @param forceNormalContainerHeight Optional, a flag indicating whether to force the container height calculation for normal behavior.\n * @param onComplete Optional callback function that is triggered when the scroll operation completes.\n *\n * @example\n * fastSmoothScroll(container, element, 'centerOrTop', 10, 500, FocusDirection.Up, 300);\n *\n * @group Scrolling\n */\nexport function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const scrollFrom = calculateScrollFrom(\n container,\n element,\n maxDistance,\n forceDirection,\n );\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n scrollWithJs(\n container,\n element,\n scrollFrom,\n position,\n margin,\n forceDuration,\n forceNormalContainerHeight,\n onComplete,\n );\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const {\n scrollTop: currentScrollTop,\n offsetHeight: containerHeight,\n scrollHeight,\n } = container;\n const targetContainerHeight =\n forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = elementTop - margin - scrollFrom;\n break;\n case 'end':\n path =\n elementTop +\n elementHeight +\n margin -\n (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path =\n elementHeight < targetContainerHeight\n ? elementTop +\n elementHeight / 2 -\n (scrollFrom + targetContainerHeight / 2)\n : elementTop - margin - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n onComplete?.(container);\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n onComplete?.(container);\n return;\n }\n\n const absPath = Math.abs(path);\n const transition =\n absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE\n ? shortTransition\n : longTransition;\n const duration =\n forceDuration ||\n FAST_SMOOTH_MIN_DURATION +\n (absPath / FAST_SMOOTH_MAX_DISTANCE) *\n (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION);\n const startAt = Date.now();\n\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n if (t > 0) {\n return true;\n }\n\n onComplete?.(container);\n return false;\n });\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - (1 - t) ** 5;\n}\n\nfunction shortTransition(t: number) {\n return 1 - (1 - t) ** 3.5;\n}\n","import { defaultDocument, defaultWindow } from './environment';\n\n/**\n * Determines if the specified element or the document/window is scrolled near the bottom.\n *\n * This function checks if the scroll position has reached the bottom of the target element or window\n * within a specified threshold. It is commonly used for implementing \"infinite scroll\" or detecting\n * when a user has scrolled to the bottom of a page or container.\n *\n * @param target The target element, document, or window to check the scroll position.\n * Can be an `HTMLElement`, `Document`, or `Window`.\n * @param threshold The threshold (in pixels) below which the target is considered \"scrolled to the bottom.\"\n * Default is `10`, meaning the target is considered scrolled to the bottom if it is within 10px of the bottom.\n *\n * @returns `true` if the target is scrolled near the bottom within the given threshold, otherwise `false`.\n *\n * @example\n * // Check if the window is scrolled near the bottom\n * isScrolledToDown(window, 20); // Returns true if within 20px of the bottom of the window.\n *\n * @example\n * // Check if a specific container is scrolled near the bottom\n * const container = document.getElementById('myContainer');\n * isScrolledToDown(container, 50); // Returns true if within 50px of the bottom of the container.\n *\n * @group Scrolling\n */\nexport function isScrolledToDown(\n target: HTMLElement | Document | Window,\n threshold: number = 10,\n) {\n let scrollBottom: number;\n\n if (target === defaultDocument) {\n scrollBottom =\n (defaultDocument?.body?.offsetHeight || 0) -\n ((defaultWindow?.innerHeight || 0) + (defaultWindow?.scrollY || 0));\n } else {\n const el = target as HTMLElement;\n scrollBottom = el.scrollHeight - (el.offsetHeight + el.scrollTop);\n }\n\n return scrollBottom <= threshold;\n}\n","/**\n * Resets the scroll position of the specified container element.\n *\n * If a `scrollTop` value is provided, the container's scroll position is set\n * to that value. Otherwise, the function will leave the scroll position unchanged.\n * This function is useful for resetting the scroll state in a container, such as\n * when the content changes or after an animation.\n *\n * @param container The container element whose scroll position needs to be reset.\n * @param scrollTop Optional value to set the container's `scrollTop`. If not provided, the scroll position remains unchanged.\n *\n * @example\n * resetScroll(container, 0); // Resets scroll to top of the container.\n * resetScroll(container); // Resets scroll position without changing it.\n *\n * @group Scrolling\n */\nexport function resetScroll(container: HTMLDivElement, scrollTop?: number) {\n // if (IS_IOS) {\n // \tcontainer.style.overflow = 'hidden';\n // }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n // if (IS_IOS) {\n // \tcontainer.style.overflow = '';\n // }\n}\n"],"names":["FocusDirection"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/animation.ts","../src/environment.ts","../src/copyTextToClipboard.ts","../src/fastSmoothScroll.ts","../src/isScrolledToDown.ts","../src/resetScroll.ts"],"sourcesContent":["import { fastRaf } from '@andrew_l/toolkit';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\n/**\n * Animates a single tick of an animation, running repeatedly until cancelled or the tick function returns `false`.\n *\n * If an `instance` is provided, it will control the cancellation state of the animation. Otherwise, a new animation\n * instance is created and assigned as the current instance. This function uses `fastRaf` to run the animation in the\n * next available frame.\n *\n * @param tick A function to be called on each frame, returning `true` to continue animating or `false` to stop.\n * @param instance An optional animation instance to control cancellation state.\n *\n * @example\n * animateSingle(() => {\n * // Your tick logic here (e.g., move an element)\n * return true; // Return `true` to keep animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\n/**\n * Continuously animates by repeatedly calling the `tick` function until it returns `false`.\n *\n * The function uses `fastRaf` to run the animation and continues until the `tick` function no longer returns `true`.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animate(() => {\n * // Your animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n\n/**\n * Instantly animates by calling the `tick` function in rapid succession until it returns `false`.\n *\n * This is intended for scenarios where the animation should run as quickly as possible, without any delay.\n *\n * @param tick The tick function to be executed on each frame. If it returns `false`, the animation stops.\n *\n * @example\n * animateInstantly(() => {\n * // Your instant animation logic here\n * return true; // Return `true` to continue animating, `false` to stop.\n * });\n *\n * @group Animation\n */\nexport function animateInstantly(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animateInstantly(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - --t * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * --t * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + --t * t ** 4,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t ** 5 : 1 + 16 * --t * t ** 4,\n};\n\n/**\n * Animates a numeric value from `from` to `to` over a specified duration, applying an optional timing function.\n *\n * The animation will continuously update the value using the `onUpdate` callback until the animation is complete.\n * Once the animation ends, the `onEnd` callback will be called, if provided.\n *\n * @param timing The timing function that controls the progression of the animation. Defaults to `linear`.\n * @param onUpdate A callback that receives the updated value (or values) on each animation frame.\n * @param duration The duration of the animation in milliseconds.\n * @param onEnd An optional callback to be called when the animation completes.\n * @param from The starting value(s) of the animation.\n * @param to The target value(s) of the animation.\n *\n * @returns A function that can be called to cancel the animation.\n *\n * @example\n * animateNumber({\n * from: 0,\n * to: 100,\n * duration: 1000,\n * onUpdate: (value) => {\n * console.log(value); // Updated value on each frame\n * },\n * onEnd: () => {\n * console.log('Animation complete!');\n * },\n * });\n *\n * @group Animation\n */\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animateInstantly(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + (to - from) * progress);\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + (to[i] - f) * progress);\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","export const defaultWindow = /* #__PURE__ */ (globalThis as any)?.window as\n | Window\n | undefined;\n\nexport const defaultDocument = /* #__PURE__ */ (globalThis as any)?.document as\n | Document\n | undefined;\n\nexport const defaultNavigator = /* #__PURE__ */ (globalThis as any)\n ?.navigator as Navigator | undefined;\n\nexport const defaultLocation = /* #__PURE__ */ (globalThis as any)?.window\n ?.location as Location | undefined;\n","import {\n defaultDocument,\n defaultNavigator,\n defaultWindow,\n} from './environment';\n\n/**\n * Copies the provided text to the system clipboard.\n *\n * The function attempts to use the `navigator.clipboard` API if available. If not,\n * it falls back to using a fake element approach to copy the text.\n *\n * @param text The text to be copied to the clipboard.\n * @returns A promise that resolves to `true` if the text was successfully copied,\n * or `false` if the operation failed.\n *\n * @example\n * copyTextToClipboard('Hello, World!')\n * .then(success => {\n * if (success) {\n * console.log('Text copied to clipboard!');\n * } else {\n * console.log('Failed to copy text.');\n * }\n * });\n *\n * @group Clipboard\n */\nexport function copyTextToClipboard(text: string): Promise<boolean> {\n if (defaultNavigator?.clipboard) {\n return copyWithNavigator(text);\n } else {\n return copyWithFakeElement(text);\n }\n}\n\nfunction copyWithNavigator(text: string): Promise<boolean> {\n if (!defaultNavigator) return Promise.resolve(false);\n\n return navigator.clipboard.writeText(text).then(() => true);\n}\n\nfunction copyWithFakeElement(text: string): Promise<boolean> {\n return new Promise((resolve, reject) => {\n if (!defaultDocument) return resolve(false);\n if (!defaultWindow) return resolve(false);\n\n const textareaEl = defaultDocument.createElement('textarea');\n const range = defaultDocument.createRange();\n\n textareaEl.value = text;\n textareaEl.style.position = 'fixed'; // Avoid scrolling to bottom\n textareaEl.contentEditable = 'true';\n\n defaultDocument.body.appendChild(textareaEl);\n\n textareaEl.focus();\n textareaEl.select();\n\n range.selectNodeContents(textareaEl);\n\n const selection = defaultWindow.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n textareaEl.setSelectionRange(0, 999999);\n\n try {\n const successful = defaultDocument.execCommand('copy');\n if (successful) {\n resolve(true);\n } else {\n reject(new Error('copy failed'));\n }\n } catch (error) {\n reject(error);\n }\n\n if (selection) {\n selection.removeAllRanges();\n }\n\n defaultDocument.body.removeChild(textareaEl);\n });\n}\n","import { fastRaf } from '@andrew_l/toolkit';\nimport { animateSingle } from './animation';\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\nexport type ScrollCompleteCallback = (target: HTMLElement) => void;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\n/**\n * Smoothly scrolls the specified container to bring the given element into view,\n * with optional customization for scroll behavior, direction, and duration.\n *\n * This function calculates the optimal scroll position based on the given parameters\n * and smoothly scrolls the container to that position. It can adjust the scroll\n * behavior for accessibility, animation duration, and other constraints.\n *\n * @param container The container element that will be scrolled.\n * @param element The element inside the container that needs to be brought into view.\n * @param position The scroll position logic (`'centerOrTop'`, `ScrollLogicalPosition`).\n * @param margin A margin in pixels to be applied around the element when scrolling into view (default is `0`).\n * @param maxDistance The maximum distance for smooth scrolling (default is `FAST_SMOOTH_MAX_DISTANCE`).\n * @param forceDirection Optional, the direction to force the scroll (`FocusDirection`). If not provided, the default scroll direction is calculated.\n * @param forceDuration Optional, a custom duration (in milliseconds) for the smooth scroll. If not provided, a default duration is used.\n * @param forceNormalContainerHeight Optional, a flag indicating whether to force the container height calculation for normal behavior.\n * @param onComplete Optional callback function that is triggered when the scroll operation completes.\n *\n * @example\n * fastSmoothScroll(container, element, 'centerOrTop', 10, 500, FocusDirection.Up, 300);\n *\n * @group Scrolling\n */\nexport function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const scrollFrom = calculateScrollFrom(\n container,\n element,\n maxDistance,\n forceDirection,\n );\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n scrollWithJs(\n container,\n element,\n scrollFrom,\n position,\n margin,\n forceDuration,\n forceNormalContainerHeight,\n onComplete,\n );\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n onComplete?: ScrollCompleteCallback,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const {\n scrollTop: currentScrollTop,\n offsetHeight: containerHeight,\n scrollHeight,\n } = container;\n const targetContainerHeight =\n forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = elementTop - margin - scrollFrom;\n break;\n case 'end':\n path =\n elementTop +\n elementHeight +\n margin -\n (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path =\n elementHeight < targetContainerHeight\n ? elementTop +\n elementHeight / 2 -\n (scrollFrom + targetContainerHeight / 2)\n : elementTop - margin - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n onComplete?.(container);\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n onComplete?.(container);\n return;\n }\n\n const absPath = Math.abs(path);\n const transition =\n absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE\n ? shortTransition\n : longTransition;\n const duration =\n forceDuration ||\n FAST_SMOOTH_MIN_DURATION +\n (absPath / FAST_SMOOTH_MAX_DISTANCE) *\n (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION);\n const startAt = Date.now();\n\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n if (t > 0) {\n return true;\n }\n\n onComplete?.(container);\n return false;\n });\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - (1 - t) ** 5;\n}\n\nfunction shortTransition(t: number) {\n return 1 - (1 - t) ** 3.5;\n}\n","import { defaultDocument, defaultWindow } from './environment';\n\n/**\n * Determines if the specified element or the document/window is scrolled near the bottom.\n *\n * This function checks if the scroll position has reached the bottom of the target element or window\n * within a specified threshold. It is commonly used for implementing \"infinite scroll\" or detecting\n * when a user has scrolled to the bottom of a page or container.\n *\n * @param target The target element, document, or window to check the scroll position.\n * Can be an `HTMLElement`, `Document`, or `Window`.\n * @param threshold The threshold (in pixels) below which the target is considered \"scrolled to the bottom.\"\n * Default is `10`, meaning the target is considered scrolled to the bottom if it is within 10px of the bottom.\n *\n * @returns `true` if the target is scrolled near the bottom within the given threshold, otherwise `false`.\n *\n * @example\n * // Check if the window is scrolled near the bottom\n * isScrolledToDown(window, 20); // Returns true if within 20px of the bottom of the window.\n *\n * @example\n * // Check if a specific container is scrolled near the bottom\n * const container = document.getElementById('myContainer');\n * isScrolledToDown(container, 50); // Returns true if within 50px of the bottom of the container.\n *\n * @group Scrolling\n */\nexport function isScrolledToDown(\n target: HTMLElement | Document | Window,\n threshold: number = 10,\n) {\n let scrollBottom: number;\n\n if (target === defaultDocument) {\n scrollBottom =\n (defaultDocument?.body?.offsetHeight || 0) -\n ((defaultWindow?.innerHeight || 0) + (defaultWindow?.scrollY || 0));\n } else {\n const el = target as HTMLElement;\n scrollBottom = el.scrollHeight - (el.offsetHeight + el.scrollTop);\n }\n\n return scrollBottom <= threshold;\n}\n","/**\n * Resets the scroll position of the specified container element.\n *\n * If a `scrollTop` value is provided, the container's scroll position is set\n * to that value. Otherwise, the function will leave the scroll position unchanged.\n * This function is useful for resetting the scroll state in a container, such as\n * when the content changes or after an animation.\n *\n * @param container The container element whose scroll position needs to be reset.\n * @param scrollTop Optional value to set the container's `scrollTop`. If not provided, the scroll position remains unchanged.\n *\n * @example\n * resetScroll(container, 0); // Resets scroll to top of the container.\n * resetScroll(container); // Resets scroll position without changing it.\n *\n * @group Scrolling\n */\nexport function resetScroll(container: HTMLDivElement, scrollTop?: number) {\n // if (IS_IOS) {\n // \tcontainer.style.overflow = 'hidden';\n // }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n // if (IS_IOS) {\n // \tcontainer.style.overflow = '';\n // }\n}\n"],"names":["FocusDirection"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrew_l/dom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Utility functions to simplify animations, clipboard operations, and smooth scrolling.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,14 +27,15 @@
|
|
|
27
27
|
],
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "22.10.5",
|
|
30
|
-
"typescript": "~5.
|
|
31
|
-
"unbuild": "3.
|
|
32
|
-
"vitest": "^2.
|
|
30
|
+
"typescript": "~5.8.3",
|
|
31
|
+
"unbuild": "3.5.0",
|
|
32
|
+
"vitest": "^3.2.4"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@andrew_l/toolkit": "0.
|
|
35
|
+
"@andrew_l/toolkit": "0.3.1"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
|
+
"check-types": "tsc --noEmit",
|
|
38
39
|
"build": "unbuild",
|
|
39
40
|
"test": "echo todo",
|
|
40
41
|
"test:watch": "vitest watch --typecheck"
|