@macrulez/inview-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/index.cjs +416 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +153 -0
- package/dist/index.d.ts +153 -0
- package/dist/index.js +379 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/raf-loop.ts","../src/utils/clamp.ts","../src/utils/prefersReducedMotion.ts","../src/scroll-engine.ts","../src/observer-pool.ts","../src/visibility-engine.ts","../src/element-tracker.ts","../src/utils/mapRange.ts","../src/utils/bindCSSVar.ts","../src/easing.ts"],"sourcesContent":["type Tick = (time: number) => void\n\n/**\n * One shared requestAnimationFrame loop for the whole engine, instead of\n * every scroll/tracker subscription running its own rAF callback.\n */\nclass RafLoop {\n private callbacks = new Set<Tick>()\n private handle: number | null = null\n\n add(cb: Tick): () => void {\n this.callbacks.add(cb)\n this.start()\n return () => {\n this.callbacks.delete(cb)\n if (this.callbacks.size === 0) this.stop()\n }\n }\n\n private start() {\n if (this.handle !== null || typeof requestAnimationFrame === 'undefined') return\n const loop: FrameRequestCallback = (time) => {\n this.callbacks.forEach((cb) => cb(time))\n if (this.callbacks.size > 0) {\n this.handle = requestAnimationFrame(loop)\n } else {\n this.handle = null\n }\n }\n this.handle = requestAnimationFrame(loop)\n }\n\n private stop() {\n if (this.handle !== null && typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(this.handle)\n }\n this.handle = null\n }\n}\n\nexport const rafLoop = new RafLoop()\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n","export function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n","import { rafLoop } from './raf-loop'\nimport { clamp } from './utils/clamp'\nimport { prefersReducedMotion } from './utils/prefersReducedMotion'\nimport type { ScrollDirection, ScrollEngine, ScrollEngineOptions, ScrollState, ScrollToOptions } from './types'\n\ntype ScrollTarget = Window | HTMLElement\n\nfunction isWindowTarget(target: ScrollTarget): target is Window {\n return typeof window !== 'undefined' && target === window\n}\n\nfunction getScrollPosition(target: ScrollTarget) {\n if (isWindowTarget(target)) return { x: window.scrollX, y: window.scrollY }\n return { x: target.scrollLeft, y: target.scrollTop }\n}\n\nfunction getMaxScroll(target: ScrollTarget) {\n if (isWindowTarget(target)) {\n const doc = document.documentElement\n return {\n x: Math.max(doc.scrollWidth - window.innerWidth, 0),\n y: Math.max(doc.scrollHeight - window.innerHeight, 0),\n }\n }\n return {\n x: Math.max(target.scrollWidth - target.clientWidth, 0),\n y: Math.max(target.scrollHeight - target.clientHeight, 0),\n }\n}\n\nfunction computeProgress(target: ScrollTarget, x: number, y: number): number {\n const max = getMaxScroll(target)\n if (max.y > 0) return clamp(y / max.y, 0, 1)\n if (max.x > 0) return clamp(x / max.x, 0, 1)\n return 0\n}\n\nfunction createNoopEngine(): ScrollEngine {\n const state: ScrollState = { x: 0, y: 0, direction: null, progress: 0, velocity: 0, isScrolling: false }\n return {\n getState: () => state,\n subscribe: (cb) => {\n cb(state)\n return () => {}\n },\n scrollTo: () => {},\n destroy: () => {},\n }\n}\n\n/**\n * Framework-agnostic scroll engine for window or a scrollable element.\n * Batches DOM scroll events into one shared rAF loop and notifies\n * subscribers only when the derived state actually changes.\n */\nexport function createScrollEngine(\n target: ScrollTarget = typeof window !== 'undefined' ? window : (undefined as unknown as Window),\n options: ScrollEngineOptions = {}\n): ScrollEngine {\n if (typeof window === 'undefined' || !target) return createNoopEngine()\n\n const idleTimeout = options.idleTimeout ?? 150\n const subscribers = new Set<(state: ScrollState) => void>()\n\n const initial = getScrollPosition(target)\n let state: ScrollState = {\n x: initial.x,\n y: initial.y,\n direction: null,\n progress: computeProgress(target, initial.x, initial.y),\n velocity: 0,\n isScrolling: false,\n }\n\n let frameLastX = initial.x\n let frameLastY = initial.y\n let idleHandle: ReturnType<typeof setTimeout> | null = null\n\n function notify() {\n subscribers.forEach((cb) => cb(state))\n }\n\n function onScroll() {\n const pos = getScrollPosition(target)\n const dx = pos.x - state.x\n const dy = pos.y - state.y\n\n let direction: ScrollDirection = state.direction\n if (dy > 0) direction = 'down'\n else if (dy < 0) direction = 'up'\n else if (dx > 0) direction = 'right'\n else if (dx < 0) direction = 'left'\n\n state = {\n ...state,\n x: pos.x,\n y: pos.y,\n direction,\n progress: computeProgress(target, pos.x, pos.y),\n isScrolling: true,\n }\n\n if (idleHandle !== null) clearTimeout(idleHandle)\n idleHandle = setTimeout(() => {\n idleHandle = null\n state = { ...state, isScrolling: false, velocity: 0 }\n notify()\n }, idleTimeout)\n\n notify()\n }\n\n target.addEventListener('scroll', onScroll, { passive: true })\n\n const removeRaf = rafLoop.add(() => {\n const velocity = Math.hypot(state.x - frameLastX, state.y - frameLastY)\n frameLastX = state.x\n frameLastY = state.y\n if (velocity !== state.velocity) {\n state = { ...state, velocity }\n notify()\n }\n })\n\n function scrollTo(pos: number | { x?: number; y?: number }, opts: ScrollToOptions = {}) {\n const behavior = opts.behavior ?? (prefersReducedMotion() ? 'auto' : 'smooth')\n const left = typeof pos === 'number' ? undefined : pos.x\n const top = typeof pos === 'number' ? pos : pos.y\n target.scrollTo({ left, top, behavior })\n }\n\n return {\n getState: () => state,\n subscribe(cb) {\n subscribers.add(cb)\n cb(state)\n return () => subscribers.delete(cb)\n },\n scrollTo,\n destroy() {\n target.removeEventListener('scroll', onScroll)\n if (idleHandle !== null) clearTimeout(idleHandle)\n removeRaf()\n subscribers.clear()\n },\n }\n}\n","import type { ObserverPoolOptions } from './types'\n\ntype EntryCallback = (entry: IntersectionObserverEntry) => void\n\ninterface Pool {\n observer: IntersectionObserver\n callbacks: Map<Element, Set<EntryCallback>>\n}\n\nfunction keyFor(options: ObserverPoolOptions): string {\n const threshold = Array.isArray(options.threshold) ? options.threshold.join(',') : String(options.threshold ?? 0)\n const root = options.root ? 'r' : 'window'\n return `${root}|${options.rootMargin ?? '0px'}|${threshold}`\n}\n\n/**\n * Pools IntersectionObserver instances by (root, rootMargin, threshold),\n * so many observed elements sharing the same options share one observer\n * instead of spawning one per element.\n */\nexport class ObserverPool {\n private pools = new Map<string, Pool>()\n\n observe(el: Element, options: ObserverPoolOptions, cb: EntryCallback): () => void {\n if (typeof IntersectionObserver === 'undefined') return () => {}\n\n const key = keyFor(options)\n let pool = this.pools.get(key)\n if (!pool) {\n const callbacks = new Map<Element, Set<EntryCallback>>()\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callbacks.get(entry.target)?.forEach((fn) => fn(entry))\n }\n },\n {\n root: options.root ?? null,\n rootMargin: options.rootMargin ?? '0px',\n threshold: options.threshold ?? 0,\n }\n )\n pool = { observer, callbacks }\n this.pools.set(key, pool)\n }\n\n let callbacks = pool.callbacks.get(el)\n if (!callbacks) {\n callbacks = new Set()\n pool.callbacks.set(el, callbacks)\n }\n const isNewElement = callbacks.size === 0\n callbacks.add(cb)\n if (isNewElement) pool.observer.observe(el)\n\n const currentPool = pool\n return () => {\n const set = currentPool.callbacks.get(el)\n if (!set) return\n set.delete(cb)\n if (set.size === 0) {\n currentPool.callbacks.delete(el)\n currentPool.observer.unobserve(el)\n }\n if (currentPool.callbacks.size === 0) {\n currentPool.observer.disconnect()\n this.pools.delete(key)\n }\n }\n }\n}\n\nexport const observerPool = new ObserverPool()\n","import { observerPool as defaultObserverPool, ObserverPool } from './observer-pool'\nimport type { IntersectionEdge, IntersectionInfo, VisibilityEngine, VisibilityObserveOptions } from './types'\n\nfunction computeEdge(entry: IntersectionObserverEntry, wasIntersecting: boolean): IntersectionEdge | undefined {\n if (entry.isIntersecting === wasIntersecting) return undefined\n const rootTop = entry.rootBounds ? entry.rootBounds.top : 0\n const enteringOrLeavingFromBottom = entry.boundingClientRect.top > rootTop\n if (entry.isIntersecting) return enteringOrLeavingFromBottom ? 'enter-bottom' : 'enter-top'\n return enteringOrLeavingFromBottom ? 'leave-bottom' : 'leave-top'\n}\n\n/**\n * Wraps the shared observer pool with enter/leave edge detection and\n * `once` support, without any framework-specific reactivity.\n */\nexport function createVisibilityEngine(pool: ObserverPool = defaultObserverPool): VisibilityEngine {\n const unsubs = new Set<() => void>()\n\n function observe(el: Element, options: VisibilityObserveOptions, cb: (info: IntersectionInfo) => void) {\n let wasIntersecting = false\n\n const unobserve = pool.observe(el, options, (entry) => {\n const edge = computeEdge(entry, wasIntersecting)\n wasIntersecting = entry.isIntersecting\n\n const info: IntersectionInfo = {\n isIntersecting: entry.isIntersecting,\n intersectionRatio: entry.intersectionRatio,\n boundingClientRect: entry.boundingClientRect,\n edge,\n }\n\n cb(info)\n if (edge === 'enter-top' || edge === 'enter-bottom') options.onEnter?.(info)\n if (edge === 'leave-top' || edge === 'leave-bottom') options.onLeave?.(info)\n\n if (options.once && entry.isIntersecting) {\n unsubs.delete(unobserve)\n unobserve()\n }\n })\n\n unsubs.add(unobserve)\n return () => {\n unsubs.delete(unobserve)\n unobserve()\n }\n }\n\n return {\n observe,\n destroy() {\n unsubs.forEach((fn) => fn())\n unsubs.clear()\n },\n }\n}\n","import { rafLoop } from './raf-loop'\nimport { clamp } from './utils/clamp'\nimport type { DOMRectLike, ElementTracker, ElementTrackerState } from './types'\n\nfunction toDomRectLike(rect: DOMRect): DOMRectLike {\n return {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n }\n}\n\nconst emptyRect: DOMRectLike = { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 }\n\nfunction computeViewportProgress(rect: DOMRect, viewportHeight: number): number {\n const total = viewportHeight + rect.height\n if (total <= 0) return 0\n const traveled = viewportHeight - rect.top\n return clamp(traveled / total, 0, 1)\n}\n\nfunction computeState(el: HTMLElement): ElementTrackerState {\n const rect = el.getBoundingClientRect()\n const viewportHeight = window.innerHeight\n const elementCenter = rect.top + rect.height / 2\n const viewportCenter = viewportHeight / 2\n return {\n rect: toDomRectLike(rect),\n viewportProgress: computeViewportProgress(rect, viewportHeight),\n distanceFromCenter: elementCenter - viewportCenter,\n }\n}\n\nfunction statesEqual(a: ElementTrackerState, b: ElementTrackerState): boolean {\n return (\n a.rect.top === b.rect.top &&\n a.rect.left === b.rect.left &&\n a.rect.width === b.rect.width &&\n a.rect.height === b.rect.height &&\n a.viewportProgress === b.viewportProgress &&\n a.distanceFromCenter === b.distanceFromCenter\n )\n}\n\n/**\n * Tracks an element's position relative to the viewport (rect,\n * viewportProgress, distanceFromCenter) on the shared rAF loop.\n */\nexport function createElementTracker(el: HTMLElement): ElementTracker {\n if (typeof window === 'undefined') {\n const state: ElementTrackerState = { rect: emptyRect, viewportProgress: 0, distanceFromCenter: 0 }\n return {\n getState: () => state,\n subscribe: (cb) => {\n cb(state)\n return () => {}\n },\n destroy: () => {},\n }\n }\n\n const subscribers = new Set<(state: ElementTrackerState) => void>()\n let state = computeState(el)\n\n const removeRaf = rafLoop.add(() => {\n const next = computeState(el)\n if (!statesEqual(next, state)) {\n state = next\n subscribers.forEach((cb) => cb(state))\n }\n })\n\n return {\n getState: () => state,\n subscribe(cb) {\n subscribers.add(cb)\n cb(state)\n return () => subscribers.delete(cb)\n },\n destroy() {\n removeRaf()\n subscribers.clear()\n },\n }\n}\n","import { clamp } from './clamp'\n\n/**\n * Linearly maps `value` from the `from` range into the `to` range.\n * Pass `clampResult: true` to keep the result within `to` at the edges.\n */\nexport function mapRange(\n value: number,\n from: [number, number],\n to: [number, number],\n clampResult = false\n): number {\n const [inMin, inMax] = from\n const [outMin, outMax] = to\n const ratio = inMax === inMin ? 0 : (value - inMin) / (inMax - inMin)\n const result = outMin + ratio * (outMax - outMin)\n if (!clampResult) return result\n return clamp(result, Math.min(outMin, outMax), Math.max(outMin, outMax))\n}\n","/**\n * Writes a numeric progress value into a CSS custom property on `el`,\n * so the resulting visual effect can be composed in plain CSS.\n */\nexport function bindCSSVar(el: HTMLElement, name: string, value: number | string): void {\n const varName = name.startsWith('--') ? name : `--${name}`\n el.style.setProperty(varName, String(value))\n}\n","export type Easing = (t: number) => number\n\n/**\n * Standard easing presets to apply to a 0..1 progress value before\n * feeding it into an effect (parallax offset, CSS var, etc).\n */\nexport const easings = {\n linear: (t: number) => t,\n\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\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => 1 - Math.pow(1 - t, 3),\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n\n easeInSine: (t: number) => 1 - Math.cos((t * Math.PI) / 2),\n easeOutSine: (t: number) => Math.sin((t * Math.PI) / 2),\n easeInOutSine: (t: number) => -(Math.cos(Math.PI * t) - 1) / 2,\n} satisfies Record<string, Easing>\n\nexport type EasingName = keyof typeof easings\n"],"mappings":"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","names":["callbacks","state"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@macrulez/inview-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic scroll, visibility and viewport-position engine",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.cjs",
|
|
11
|
+
"module": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"require": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"happy-dom": "^15.11.7",
|
|
26
|
+
"tsup": "^8.3.5",
|
|
27
|
+
"typescript": "^5.6.3",
|
|
28
|
+
"vitest": "^2.1.8"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"typecheck": "tsc --noEmit"
|
|
36
|
+
}
|
|
37
|
+
}
|