@brytdesigns/web-component-parallax 1.2.16 → 1.2.17

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/esm/index.js CHANGED
@@ -2,9 +2,7 @@ import { createWithElementContext, customShadowlessElement, correctElementType,
2
2
  import { splitProps, createEffect, batch, onCleanup, mergeProps, createMemo } from 'solid-js';
3
3
  import { createStore } from 'solid-js/store';
4
4
  import { createContext, consume, provide } from 'component-register';
5
- import { motionValue, scroll, transformValue, transform, frame, animate, styleEffect } from 'motion';
6
- import { awaitAllAnimations } from '@brytdesigns/web-component-core/animation';
7
- import { abortablePromise } from '@brytdesigns/web-component-core/promise';
5
+ import { motionValue, scroll, frame, animate, transform, transformValue, styleEffect } from 'motion';
8
6
 
9
7
  var __defProp = Object.defineProperty;
10
8
  var __export = (target, all) => {
@@ -120,29 +118,48 @@ function getLastTruthyIndex(values) {
120
118
  }
121
119
 
122
120
  // src/hooks/useParallaxStickyLayer.ts
121
+ var HANDOFF_EASE = "easeOut";
122
+ var ENTER_HYSTERESIS = 1e-3;
123
+ var EXIT_HYSTERESIS = 5e-3;
124
+ var HANDOFF_MIN_DELTA_PX = 0.75;
125
+ var EXIT_WAIT_TIMEOUT_MS = 500;
126
+ var PREDICT_LOOKAHEAD_MS = 28;
127
+ var PREDICT_ENTER_BAND = 6e-3;
128
+ var PREDICT_EXIT_BAND = 0.01;
129
+ var PREDICT_MIN_VELOCITY = 4e-4;
130
+ var LOW_VELOCITY_NO_TWEEN = 1e-3;
131
+ var HIGH_VELOCITY_SKIP_HANDOFF = 0.01;
132
+ var MAX_PREDICT_LOOKAHEAD_MS = 60;
133
+ var MAX_HANDOFF_DELTA_PX = 56;
134
+ function supportsStickyPosition() {
135
+ if (typeof CSS === "undefined" || typeof CSS.supports !== "function") {
136
+ return false;
137
+ }
138
+ return CSS.supports("position", "sticky") || CSS.supports("position", "-webkit-sticky");
139
+ }
123
140
  function initializeParallaxStickyLayerContext(props) {
124
141
  const [_internal, _state] = splitProps(props, ["root", "start", "end"]);
125
142
  const parallax = useParallax(_internal.root);
143
+ const stickySupported = supportsStickyPosition();
126
144
  const progress = motionValue(-1);
145
+ const rawScrollProgress = motionValue(-1);
127
146
  const inRange = motionValue(false);
128
147
  const belowRange = motionValue(false);
129
148
  const aboveRange = motionValue(false);
130
- const position = transformValue(
131
- () => inRange.get() ? "sticky" : "absolute"
132
- );
133
- const transform$1 = transformValue(() => {
134
- const isInRange2 = inRange.get();
135
- const isBelowRange = belowRange.get();
136
- const isAboveRange = aboveRange.get();
137
- if (isInRange2) return "none";
138
- if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}vh)`;
139
- if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}vh)`;
140
- });
141
- const animations = motionValue([]);
142
- const styles = transformValue(() => ({
143
- position: position.get(),
144
- transform: transform$1.get()
145
- }));
149
+ const normStartValue = motionValue(0);
150
+ const normEndValue = motionValue(1);
151
+ const mode = motionValue("absolute-below");
152
+ const handoffOffsetY = motionValue(0);
153
+ const activeContentAnimations = /* @__PURE__ */ new Set();
154
+ let handoffAnimation = null;
155
+ let exitWaitRaf = null;
156
+ let exitWaitTimeout = null;
157
+ let pendingExitVersion = 0;
158
+ let pendingExitMode = null;
159
+ let lastScrollSampleValue = 0;
160
+ let lastScrollSampleTime = 0;
161
+ let hasScrollSample = false;
162
+ let latestScrollVelocity = 0;
146
163
  _internal.root.style.top = "0px";
147
164
  _internal.root.style.right = "0px";
148
165
  _internal.root.style.bottom = "0px";
@@ -153,51 +170,315 @@ function initializeParallaxStickyLayerContext(props) {
153
170
  if (window.getComputedStyle(_internal.root).display === "inline") {
154
171
  _internal.root.style.display = "block";
155
172
  }
173
+ function updateStyles() {
174
+ if (!stickySupported) {
175
+ const normStart = normStartValue.get();
176
+ const normEnd = normEndValue.get();
177
+ const raw = rawScrollProgress.get();
178
+ const span = Math.max(normEnd - normStart, Number.EPSILON);
179
+ const t = Math.min(Math.max((raw - normStart) / span, 0), 1);
180
+ const pageY = _internal.start - 1 + t * (_internal.end - _internal.start);
181
+ _internal.root.style.position = "absolute";
182
+ _internal.root.style.transform = `translate(0px, ${pageY * 100}vh)`;
183
+ return;
184
+ }
185
+ const currentMode = mode.get();
186
+ const offset = handoffOffsetY.get();
187
+ const hasOffset = Math.abs(offset) >= 0.1;
188
+ if (currentMode === "sticky") {
189
+ _internal.root.style.position = "sticky";
190
+ _internal.root.style.transform = hasOffset ? `translate(0px, ${offset}px)` : "none";
191
+ return;
192
+ }
193
+ const baseTransform = currentMode === "absolute-below" ? `translate(0px, ${(_internal.start - 1) * 100}vh)` : `translate(0px, ${(_internal.end - 1) * 100}vh)`;
194
+ _internal.root.style.position = "absolute";
195
+ _internal.root.style.transform = hasOffset ? `${baseTransform} translate(0px, ${offset}px)` : baseTransform;
196
+ }
197
+ function renderStyles() {
198
+ frame.render(updateStyles);
199
+ }
200
+ function stopHandoffAnimation() {
201
+ handoffAnimation?.stop();
202
+ handoffAnimation = null;
203
+ handoffOffsetY.set(0);
204
+ }
205
+ function clearExitWaitHandles() {
206
+ if (exitWaitRaf !== null) {
207
+ window.cancelAnimationFrame(exitWaitRaf);
208
+ exitWaitRaf = null;
209
+ }
210
+ if (exitWaitTimeout !== null) {
211
+ window.clearTimeout(exitWaitTimeout);
212
+ exitWaitTimeout = null;
213
+ }
214
+ }
215
+ function pruneFinishedAnimations() {
216
+ for (const animation of activeContentAnimations) {
217
+ if (animation.state !== "running") {
218
+ activeContentAnimations.delete(animation);
219
+ }
220
+ }
221
+ }
222
+ function hasActiveContentAnimations() {
223
+ pruneFinishedAnimations();
224
+ return activeContentAnimations.size > 0;
225
+ }
226
+ function registerContentAnimation(animation) {
227
+ activeContentAnimations.add(animation);
228
+ animation.then(
229
+ () => {
230
+ activeContentAnimations.delete(animation);
231
+ },
232
+ () => {
233
+ activeContentAnimations.delete(animation);
234
+ }
235
+ );
236
+ }
237
+ function getHandoffDuration(deltaY, velocity) {
238
+ const speed = Math.abs(velocity);
239
+ if (speed <= LOW_VELOCITY_NO_TWEEN) return 0;
240
+ const byDistance = Math.min(0.12, Math.max(0.05, Math.abs(deltaY) / 1400));
241
+ const speedScale = Math.min(speed / 0.01, 1);
242
+ return Math.max(0.04, byDistance - speedScale * 0.02);
243
+ }
244
+ function settleHandoffOverFrames(deltaY, frameCount) {
245
+ handoffOffsetY.set(deltaY);
246
+ updateStyles();
247
+ let remainingFrames = Math.max(frameCount, 1);
248
+ const settle = () => {
249
+ remainingFrames -= 1;
250
+ if (remainingFrames <= 0) {
251
+ handoffOffsetY.set(0);
252
+ updateStyles();
253
+ return;
254
+ }
255
+ frame.render(settle);
256
+ };
257
+ frame.render(settle);
258
+ }
259
+ function cancelPendingExit() {
260
+ pendingExitVersion += 1;
261
+ pendingExitMode = null;
262
+ clearExitWaitHandles();
263
+ }
264
+ function commitModeImmediately(nextMode) {
265
+ stopHandoffAnimation();
266
+ mode.set(nextMode);
267
+ updateStyles();
268
+ }
269
+ function waitForAnimations(nextMode) {
270
+ if (pendingExitMode === nextMode && (exitWaitRaf !== null || exitWaitTimeout !== null)) {
271
+ return;
272
+ }
273
+ cancelPendingExit();
274
+ pendingExitMode = nextMode;
275
+ const version = pendingExitVersion;
276
+ const completeExit = () => {
277
+ if (version !== pendingExitVersion) return;
278
+ clearExitWaitHandles();
279
+ pendingExitMode = null;
280
+ const latest = Math.min(Math.max(rawScrollProgress.get(), 0), 1);
281
+ const stableMode = getTargetMode(
282
+ latest,
283
+ normStartValue.get(),
284
+ normEndValue.get()
285
+ );
286
+ if (stableMode !== nextMode) return;
287
+ commitModeImmediately(nextMode);
288
+ };
289
+ if (!hasActiveContentAnimations()) {
290
+ completeExit();
291
+ return;
292
+ }
293
+ const tick = () => {
294
+ if (version !== pendingExitVersion) return;
295
+ if (!hasActiveContentAnimations()) {
296
+ completeExit();
297
+ return;
298
+ }
299
+ exitWaitRaf = window.requestAnimationFrame(tick);
300
+ };
301
+ exitWaitTimeout = window.setTimeout(() => {
302
+ completeExit();
303
+ }, EXIT_WAIT_TIMEOUT_MS);
304
+ exitWaitRaf = window.requestAnimationFrame(tick);
305
+ }
306
+ function getTargetMode(value, normStart, normEnd) {
307
+ if (!stickySupported) {
308
+ if (value <= normStart) return "absolute-below";
309
+ if (value >= normEnd) return "absolute-above";
310
+ return "absolute-below";
311
+ }
312
+ const current = mode.get();
313
+ if (current === "sticky") {
314
+ if (value < normStart - EXIT_HYSTERESIS) return "absolute-below";
315
+ if (value > normEnd + EXIT_HYSTERESIS) return "absolute-above";
316
+ return "sticky";
317
+ }
318
+ if (current === "absolute-below") {
319
+ if (value >= normStart + ENTER_HYSTERESIS) return "sticky";
320
+ return "absolute-below";
321
+ }
322
+ if (value <= normEnd - ENTER_HYSTERESIS) return "sticky";
323
+ return "absolute-above";
324
+ }
325
+ function getModeDecisionValue(value, normStart, normEnd, allowPrediction) {
326
+ const now = performance.now();
327
+ let velocity = 0;
328
+ if (hasScrollSample) {
329
+ const elapsed = Math.max(now - lastScrollSampleTime, 1);
330
+ velocity = (value - lastScrollSampleValue) / elapsed;
331
+ }
332
+ lastScrollSampleValue = value;
333
+ lastScrollSampleTime = now;
334
+ hasScrollSample = true;
335
+ latestScrollVelocity = velocity;
336
+ if (!allowPrediction || Math.abs(velocity) < PREDICT_MIN_VELOCITY) {
337
+ return value;
338
+ }
339
+ const speed = Math.abs(velocity);
340
+ const speedScale = Math.min(speed / HIGH_VELOCITY_SKIP_HANDOFF, 1);
341
+ const lookaheadMs = PREDICT_LOOKAHEAD_MS + speedScale * (MAX_PREDICT_LOOKAHEAD_MS - PREDICT_LOOKAHEAD_MS);
342
+ const predicted = Math.min(Math.max(value + velocity * lookaheadMs, 0), 1);
343
+ const currentMode = mode.get();
344
+ if (currentMode === "absolute-below") {
345
+ const entryEdge = normStart + ENTER_HYSTERESIS;
346
+ const nearStart = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;
347
+ if (velocity > 0 && nearStart && value < entryEdge && predicted >= entryEdge) {
348
+ return entryEdge;
349
+ }
350
+ }
351
+ if (currentMode === "absolute-above") {
352
+ const entryEdge = normEnd - ENTER_HYSTERESIS;
353
+ const nearEnd = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;
354
+ if (velocity < 0 && nearEnd && value > entryEdge && predicted <= entryEdge) {
355
+ return entryEdge;
356
+ }
357
+ }
358
+ if (currentMode === "sticky") {
359
+ const exitTopEdge = normStart - EXIT_HYSTERESIS;
360
+ const exitBottomEdge = normEnd + EXIT_HYSTERESIS;
361
+ const nearTop = Math.abs(value - exitTopEdge) <= PREDICT_EXIT_BAND;
362
+ if (velocity < 0 && nearTop && value > exitTopEdge && predicted <= exitTopEdge) {
363
+ return exitTopEdge;
364
+ }
365
+ const nearBottom = Math.abs(value - exitBottomEdge) <= PREDICT_EXIT_BAND;
366
+ if (velocity > 0 && nearBottom && value < exitBottomEdge && predicted >= exitBottomEdge) {
367
+ return exitBottomEdge;
368
+ }
369
+ }
370
+ return value;
371
+ }
372
+ function applyModeWithHandoff(nextMode) {
373
+ if (!stickySupported) {
374
+ stopHandoffAnimation();
375
+ mode.set(nextMode);
376
+ renderStyles();
377
+ return;
378
+ }
379
+ stopHandoffAnimation();
380
+ const prevRect = _internal.root.getBoundingClientRect();
381
+ mode.set(nextMode);
382
+ updateStyles();
383
+ const nextRect = _internal.root.getBoundingClientRect();
384
+ const deltaY = prevRect.top - nextRect.top;
385
+ if (Math.abs(deltaY) <= HANDOFF_MIN_DELTA_PX) {
386
+ handoffOffsetY.set(0);
387
+ renderStyles();
388
+ return;
389
+ }
390
+ if (Math.abs(latestScrollVelocity) >= HIGH_VELOCITY_SKIP_HANDOFF || Math.abs(deltaY) >= MAX_HANDOFF_DELTA_PX) {
391
+ settleHandoffOverFrames(deltaY, 2);
392
+ return;
393
+ }
394
+ handoffOffsetY.set(deltaY);
395
+ updateStyles();
396
+ const duration = getHandoffDuration(deltaY, latestScrollVelocity);
397
+ if (duration <= 0) {
398
+ settleHandoffOverFrames(deltaY, 1);
399
+ return;
400
+ }
401
+ handoffAnimation = animate([
402
+ [handoffOffsetY, 0, { duration, ease: HANDOFF_EASE }]
403
+ ]);
404
+ handoffAnimation.then(() => {
405
+ if (!handoffAnimation) return;
406
+ handoffAnimation = null;
407
+ handoffOffsetY.set(0);
408
+ renderStyles();
409
+ });
410
+ }
411
+ function syncFromScroll(value, allowHandoff) {
412
+ const clamped = Math.min(Math.max(value, 0), 1);
413
+ rawScrollProgress.set(clamped);
414
+ const normStart = normStartValue.get();
415
+ const normEnd = normEndValue.get();
416
+ const range = [normStart, normEnd];
417
+ const span = Math.max(normEnd - normStart, Number.EPSILON);
418
+ const normalizedProgress = Math.min(
419
+ Math.max((clamped - normStart) / span, 0),
420
+ 1
421
+ );
422
+ inRange.set(isInRange({ range, value: clamped }));
423
+ belowRange.set(clamped <= normStart);
424
+ aboveRange.set(clamped >= normEnd);
425
+ progress.set(normalizedProgress);
426
+ const decisionValue = getModeDecisionValue(
427
+ clamped,
428
+ normStart,
429
+ normEnd,
430
+ allowHandoff
431
+ );
432
+ const nextMode = getTargetMode(decisionValue, normStart, normEnd);
433
+ const currentMode = mode.get();
434
+ if (currentMode === "sticky" && nextMode !== "sticky" && allowHandoff) {
435
+ waitForAnimations(nextMode);
436
+ updateStyles();
437
+ return;
438
+ }
439
+ cancelPendingExit();
440
+ if (nextMode === currentMode) {
441
+ if (!allowHandoff) {
442
+ stopHandoffAnimation();
443
+ updateStyles();
444
+ }
445
+ return;
446
+ }
447
+ if (allowHandoff) {
448
+ applyModeWithHandoff(nextMode);
449
+ return;
450
+ }
451
+ commitModeImmediately(nextMode);
452
+ }
156
453
  createEffect(() => {
157
454
  const range = [_internal.start, _internal.end];
158
455
  const maxPages = parallax.maxPages;
159
456
  const normalizedRange = normalizeTuple(range, maxPages);
160
457
  const [normStart, normEnd] = normalizedRange;
161
- const transformer = transform(normalizedRange, [0, 1]);
458
+ normStartValue.set(normStart);
459
+ normEndValue.set(normEnd);
460
+ const initialValue = parallax.scrollYProgress.get();
461
+ syncFromScroll(initialValue, false);
462
+ renderStyles();
162
463
  const unsubscribe = parallax.scrollYProgress.on("change", (value) => {
163
- inRange.set(isInRange({ range: normalizedRange, value }));
164
- belowRange.set(value <= normStart);
165
- aboveRange.set(value >= normEnd);
166
- progress.set(transformer(value));
464
+ syncFromScroll(value, true);
167
465
  });
168
466
  return onCleanup(() => {
169
467
  unsubscribe();
170
468
  });
171
469
  });
172
- function updateStyles() {
173
- const s = styles.get();
174
- _internal.root.style.position = s.position;
175
- _internal.root.style.transform = s.transform;
176
- }
177
- function renderStyles() {
178
- frame.render(updateStyles);
179
- }
180
- function waitForAnimations() {
181
- const a = animations.get();
182
- const controller = new AbortController();
183
- abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {
184
- animations.set([]);
185
- renderStyles();
186
- });
187
- }
188
- const unsubStyles = styles.on("change", (_) => {
189
- if (progress.get() === 1 || progress.get() === 0)
190
- return waitForAnimations();
191
- animations.set([]);
470
+ const unsubHandoffOffset = handoffOffsetY.on("change", (_) => {
192
471
  renderStyles();
193
472
  });
194
473
  function _animate(...args) {
195
474
  const animation = animate(...args);
196
- animations.set([...animations.get(), animation]);
475
+ registerContentAnimation(animation);
197
476
  return animation;
198
477
  }
199
478
  onCleanup(() => {
200
- unsubStyles();
479
+ cancelPendingExit();
480
+ stopHandoffAnimation();
481
+ unsubHandoffOffset();
201
482
  });
202
483
  return [progress, { animate: _animate }];
203
484
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/parallax-container/index.ts","../../src/hooks/useParallax.ts","../../src/utils.ts","../../src/hooks/useParallaxStickyLayer.ts","../../src/components/parallax-sticky-layer/index.ts","../../src/components/parallax-animation/index.ts","../../src/index.ts"],"names":["info","splitProps","motionValue","transform","isInRange","createEffect","mTransform","onCleanup","createContext","mergeProps","provide","consume","createWithElementContext","getContextFromProvider","Component","Name","messages","animate","createStore","active","props","unsub","transformValue","frame","_"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { provideParallaxContext } from \"../../hooks/index.js\";\n\nexport type Props = {\n maxPages: number;\n};\n\nexport const Name = `parallax-container`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (!props.maxPages)\n return console.warn(\n `${Name}: requires max-pages attribute to be set!`,\n element,\n );\n if (props.maxPages < 1)\n return console.warn(\n `${Name}: max-pages must be greater than or equal to 1!`,\n element,\n );\n provideParallaxContext(props, element);\n};\n","import {\n onCleanup,\n createEffect,\n splitProps,\n mergeProps,\n batch,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\nimport {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport { scroll, motionValue } from \"motion\";\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n maxPages: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxContext = ReturnType<typeof initializeParallaxContext>;\n\nfunction initializeParallaxContext(props: CreateContextOptions) {\n const [_internal, _state] = splitProps(props, [\"root\"]);\n\n const scrollYProgress = motionValue(-1);\n const scrollY = motionValue(-1);\n const [info, setInfo] = createStore({\n offset: [-1, -1],\n scrollLength: -1,\n });\n\n window.addEventListener(\"resize\", () => {});\n\n createEffect(() => {\n const pages = _state.maxPages;\n\n _internal.root.style.height = `${pages * 100}vh`;\n _internal.root.style.width = `100%`;\n _internal.root.style.position = \"relative\";\n if (!_internal.root.style.display) {\n _internal.root.style.display = \"block\";\n }\n\n const remove = scroll(\n (_, info) => {\n const { y } = info;\n\n scrollYProgress.set(y.progress);\n scrollY.set(y.current);\n batch(() => {\n setInfo(\"offset\", 0, y.offset?.at(0) || 0);\n setInfo(\"offset\", 1, y.offset?.at(1) || 0);\n setInfo(\"scrollLength\", y.scrollLength);\n });\n },\n {\n target: _internal.root,\n axis: \"y\",\n offset: [\"start start\", \"end end\"],\n },\n );\n\n onCleanup(() => {\n if (remove) {\n remove();\n }\n scrollYProgress.destroy();\n scrollY.destroy();\n });\n });\n\n return mergeProps(_state, {\n scrollYProgress,\n scrollY,\n info,\n });\n}\n\nconst ParallaxContextState = createContext(initializeParallaxContext);\n\nexport const provideParallaxContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ParallaxContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ParallaxContextState, props, element);\n};\n\nexport const useParallaxContext = (context: ParallaxContext) => {\n return context;\n};\n\nexport const useParallax = (element: HTMLElement & ICustomElement) => {\n const context: ParallaxContext = consume(ParallaxContextState, element);\n\n if (!context) {\n throw console.error(\n \"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n );\n }\n\n return useParallaxContext(context);\n};\n\nexport const withParallaxElementContext = createWithElementContext<\n typeof ParallaxContextState,\n ParallaxContext\n>(ParallaxContextState);\n\nexport const getParallaxContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxContext>(\n ParallaxContextState,\n element,\n );\n return useParallaxContext(context);\n};\n","export function normalizeTuple(range: [number, number], max: number) {\n if (max <= 1) {\n throw new Error(\"The maximum value must be greater than 1.\");\n }\n\n const [start, end] = range;\n const normalizedStart = (start - 1) / (max - 1);\n const normalizedEnd = (end - 1) / (max - 1);\n\n return [normalizedStart, normalizedEnd] as const;\n}\n\nexport function isInRange({\n range: [start, end],\n value,\n}: {\n range: [number, number];\n value: number;\n}) {\n return start <= value && end >= value;\n}\n\nexport function getLastMatchingMediaQueryIndex(queries: string[]): number {\n let lastMatchIndex = -1;\n\n for (let i = 0; i < queries.length; i++) {\n const query = queries[i];\n if (typeof query !== \"string\") continue;\n if (window.matchMedia(query).matches) {\n lastMatchIndex = i;\n }\n }\n\n return lastMatchIndex;\n}\n\nexport function getActiveBreakpoints(queries: string[]): boolean[] {\n return queries.map((query) => window.matchMedia(query).matches);\n}\n\nexport function getLastTruthyIndex(values: boolean[]): number {\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i]) return i;\n }\n return -1;\n}\nexport function getLastValidValue<T>(\n arr: (T | null)[],\n index: number,\n): T | null {\n if (arr[index] != null) return arr[index]!;\n\n for (let i = index - 1; i >= 0; i--) {\n if (arr[i] != null) return arr[i]!;\n }\n\n return null;\n}\n","import { onCleanup, createEffect, splitProps, mergeProps } from \"solid-js\";\nimport {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n motionValue,\n transformValue,\n transform as mTransform,\n frame,\n animate,\n type AnimationPlaybackControlsWithThen,\n} from \"motion\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport {\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport { useParallax } from \"./useParallax\";\nimport { normalizeTuple, isInRange } from \"../utils\";\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n start: number;\n end: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxStickyLayerContext = ReturnType<\n typeof initializeParallaxStickyLayerContext\n>;\n\nfunction initializeParallaxStickyLayerContext(props: CreateContextOptions) {\n const [_internal, _state] = splitProps(props, [\"root\", \"start\", \"end\"]);\n const parallax = useParallax(_internal.root);\n\n const progress = motionValue(-1);\n const inRange = motionValue(false);\n const belowRange = motionValue(false);\n const aboveRange = motionValue(false);\n\n const position = transformValue(() =>\n inRange.get() ? \"sticky\" : \"absolute\",\n );\n const transform = transformValue(() => {\n const isInRange = inRange.get();\n const isBelowRange = belowRange.get();\n const isAboveRange = aboveRange.get();\n if (isInRange) return \"none\";\n if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}vh)`;\n if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}vh)`;\n });\n const animations = motionValue<AnimationPlaybackControlsWithThen[]>([]);\n\n const styles = transformValue(() => ({\n position: position.get(),\n transform: transform.get(),\n }));\n\n _internal.root.style.top = \"0px\";\n _internal.root.style.right = \"0px\";\n _internal.root.style.bottom = \"0px\";\n _internal.root.style.left = \"0px\";\n _internal.root.style.height = `100dvh`;\n _internal.root.style.overflowX = \"hidden\";\n _internal.root.style.maxWidth = \"100%\";\n if (window.getComputedStyle(_internal.root).display === \"inline\") {\n _internal.root.style.display = \"block\";\n }\n\n createEffect(() => {\n const range = [_internal.start, _internal.end];\n const maxPages = parallax.maxPages;\n const normalizedRange = normalizeTuple(range as any, maxPages);\n const [normStart, normEnd] = normalizedRange;\n const transformer = mTransform(normalizedRange as any, [0, 1]);\n\n const unsubscribe = parallax.scrollYProgress.on(\"change\", (value) => {\n inRange.set(isInRange({ range: normalizedRange as any, value }));\n belowRange.set(value <= normStart);\n aboveRange.set(value >= normEnd);\n progress.set(transformer(value));\n });\n\n return onCleanup(() => {\n unsubscribe();\n });\n });\n\n function updateStyles() {\n const s = styles.get();\n _internal.root.style.position = s.position;\n _internal.root.style.transform = s.transform;\n }\n\n function renderStyles() {\n frame.render(updateStyles);\n }\n\n function waitForAnimations() {\n const a = animations.get();\n const controller = new AbortController();\n abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {\n animations.set([]);\n renderStyles();\n });\n }\n\n const unsubStyles = styles.on(\"change\", (_) => {\n if (progress.get() === 1 || progress.get() === 0)\n return waitForAnimations();\n animations.set([]);\n renderStyles();\n });\n\n function _animate(...args: Parameters<typeof animate>) {\n const animation = animate(...args);\n animations.set([...animations.get(), animation]);\n return animation;\n }\n\n onCleanup(() => {\n unsubStyles();\n });\n\n return [progress, { animate: _animate }] as const;\n}\n\nconst ParallaxStickyLayerContextState = createContext(\n initializeParallaxStickyLayerContext,\n);\n\nexport const provideParallaxStickyLayerContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ParallaxStickyLayerContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ParallaxStickyLayerContextState, props, element);\n};\n\nexport const useParallaxStickyLayerContext = (\n context: ParallaxStickyLayerContext,\n) => {\n return context;\n};\n\nexport const useParallaxStickyLayer = (\n element: HTMLElement & ICustomElement,\n) => {\n const context: ParallaxStickyLayerContext = consume(\n ParallaxStickyLayerContextState,\n element,\n );\n\n if (!context) {\n throw console.error(\n \"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n );\n }\n\n return useParallaxStickyLayerContext(context);\n};\n\nexport const withParallaxStickyLayerContext = createWithElementContext<\n typeof ParallaxStickyLayerContextState,\n ParallaxStickyLayerContext\n>(ParallaxStickyLayerContextState);\n\nexport const getParallaxStickyLayerContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxStickyLayerContext>(\n ParallaxStickyLayerContextState,\n element,\n );\n return useParallaxStickyLayerContext(context);\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { provideParallaxStickyLayerContext } from \"../../hooks/index.js\";\n\nexport type Props = {\n start: number;\n end: number;\n};\n\nexport const Name = `parallax-sticky-layer`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (!props.start)\n return console.warn(\n `${Name}: requires start attribute to be set!`,\n element,\n );\n if (!props.end)\n return console.warn(`${Name}: requires end attribute to be set!`, element);\n if (props.end <= props.start)\n return console.warn(\n `${Name}: the start attribute must be less than the end attribute!`,\n element,\n );\n if (props.start < 1 || props.end < 1)\n return console.warn(\n `${Name}: The start and end attributes must be greater than or equal to 1!`,\n element,\n );\n provideParallaxStickyLayerContext(props, element);\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport {\n onCleanup,\n createEffect,\n createMemo,\n splitProps,\n mergeProps,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n motionValue,\n transformValue,\n transform as mTransform,\n styleEffect,\n frame,\n type MotionValue,\n} from \"motion\";\n\nimport { useParallaxStickyLayer } from \"../../hooks/index.js\";\nimport { getActiveBreakpoints, getLastTruthyIndex } from \"../../utils.js\";\n\ntype AnimatableArray = Array<string | number> | null;\n\nexport type Props = {\n breakpoints: string[];\n range: number[] | number[][];\n y: AnimatableArray | AnimatableArray[];\n x: AnimatableArray | AnimatableArray[];\n scale: AnimatableArray | AnimatableArray[];\n rotate: AnimatableArray | AnimatableArray[];\n opacity: AnimatableArray | AnimatableArray[];\n backgroundColor: AnimatableArray | AnimatableArray[];\n borderRadius: AnimatableArray | AnimatableArray[];\n};\n\ntype ActiveProps = {\n range: number[];\n y: AnimatableArray;\n x: AnimatableArray;\n scale: AnimatableArray;\n rotate: AnimatableArray;\n opacity: AnimatableArray;\n backgroundColor: AnimatableArray;\n borderRadius: AnimatableArray;\n};\n\nfunction keysFromObject<T extends object>(object: T): (keyof T)[] {\n return Object.keys(object) as (keyof T)[];\n}\n\nexport const Name = `parallax-animation`;\n\nexport const PROPS = {\n breakpoints: [\"\"],\n range: [0, 1],\n y: null,\n x: null,\n scale: null,\n rotate: null,\n opacity: null,\n color: null,\n backgroundColor: null,\n borderRadius: null,\n};\n\nconst PROP_DEFAULTS = {\n y: \"0%\",\n x: \"0%\",\n scale: 1,\n rotate: 0,\n opacity: null,\n color: null,\n backgroundColor: null,\n borderRadius: null,\n};\n\nconst KEYS = Object.keys(PROPS);\n\nconst isNestedAnimatableArray = (\n values: AnimatableArray | AnimatableArray[],\n): values is AnimatableArray[] => {\n return (\n Array.isArray(values) && (Array.isArray(values[0]) || values[0] === null)\n );\n};\n\nconst flattenAnimatableArray = (\n value: AnimatableArray | AnimatableArray[],\n index: number = 0,\n) => {\n if (isNestedAnimatableArray(value)) {\n return value[index]!;\n }\n return value;\n};\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (\n Object.keys(props).some(\n (key) => KEYS.includes(key) && !Array.isArray(Reflect.get(props, key)),\n )\n )\n return console.warn(\n `parallax-animate: At least one of ${KEYS.join(\",\")} properties is required and must be an array of values!`,\n element,\n );\n\n const messages = Object.entries(props).reduce((messages, [key, value]) => {\n if (!KEYS.includes(key)) return messages;\n if (value && value.length !== props.range.length) {\n return messages.concat(\n `${key} attribute must have the same length as range attribute!`,\n );\n }\n return messages;\n }, [] as string[]);\n\n if (messages.length)\n return console.warn(\n element,\n `\\nparallax-animate: Please fix the following issues:\\n${messages.join(\"\\n\")}`,\n );\n\n const [progress, { animate }] = useParallaxStickyLayer(element);\n\n const [activeBreakpoints, setActiveBreakpoints] = createStore<boolean[]>(\n getActiveBreakpoints(props.breakpoints),\n );\n const activeBreakpointIndex = createMemo(() =>\n getLastTruthyIndex(activeBreakpoints),\n );\n\n const [_, importantProps] = splitProps(props, [\"breakpoints\"]);\n const animateableProps = mergeProps(importantProps, {});\n\n const activeProps = createMemo<ActiveProps>(() => {\n const index = activeBreakpointIndex();\n\n if (index === -1) {\n const { breakpoints, ...active } = PROPS;\n return active;\n }\n\n const keys = keysFromObject(animateableProps);\n\n const active = keys.reduce((active, key) => {\n const value = animateableProps[key];\n if (isNestedAnimatableArray(value)) {\n const flattenedValue = flattenAnimatableArray(value, index);\n return {\n ...active,\n [key]: flattenedValue,\n };\n }\n return {\n ...active,\n [key]: value,\n };\n }, {} as ActiveProps);\n\n return active;\n });\n\n createEffect(() => {\n const breakpoints = props.breakpoints;\n const controller = new AbortController();\n\n for (let i = 0; i < breakpoints.length; i++) {\n const query = breakpoints[i];\n if (!query) continue;\n const mediaQuery = window.matchMedia(query);\n mediaQuery.addEventListener(\n \"change\",\n (e) => setActiveBreakpoints(i, e.matches),\n { signal: controller.signal },\n );\n }\n\n return onCleanup(() => {\n controller.abort();\n });\n });\n\n element.style.willChange = \"transform\";\n if (\n window.getComputedStyle(element).getPropertyValue(\"display\") === \"inline\"\n ) {\n element.style.display = \"block\";\n }\n\n createEffect(() => {\n const active = activeProps();\n const { range, ...props } = active;\n const valueSubscribers: VoidFunction[] = [];\n\n const progressValue = Object.keys(PROP_DEFAULTS).reduce(\n (values, key) => {\n const fallback = Reflect.get(PROP_DEFAULTS, key);\n const valueRange = Reflect.get(props, key);\n if (valueRange?.length === range.length) {\n const transform = mTransform(range, valueRange);\n const value = motionValue(transform(progress.get()));\n const unsub = progress.on(\"change\", (latest) => {\n value.set(transform(latest));\n });\n valueSubscribers.push(unsub);\n values[key] = value;\n } else values[key] = fallback;\n return values;\n },\n {} as Record<string, any>,\n );\n\n const animated = Object.keys(progressValue).reduce(\n (obj, key) => {\n const v = progressValue[key];\n Reflect.set(\n obj,\n key,\n motionValue(typeof v === \"object\" && v !== null ? v.get() : v),\n );\n return obj;\n },\n {} as Record<string, MotionValue>,\n );\n\n const transform = transformValue(\n () =>\n `translate(${animated.x?.get()}, ${animated.y?.get()}) scale(${animated.scale?.get()}) rotate(${animated.rotate?.get()}deg)`,\n );\n\n function animateValues() {\n const sequence = Object.keys(animated)\n .map((key) => {\n let v = progressValue[key]?.get?.();\n if (typeof v === \"undefined\") return null;\n return [animated[key], v, { at: \"<\" }];\n })\n .filter((v) => v !== null);\n //@ts-ignore\n animate(sequence);\n }\n\n function scheduleAnimation() {\n frame.update(animateValues);\n }\n\n const unsub = progress.on(\"change\", (_) => {\n scheduleAnimation();\n });\n\n const styledValues = Object.keys(animated)\n .filter(\n (key) =>\n key !== \"y\" && key !== \"x\" && key !== \"rotate\" && key !== \"scale\",\n )\n .reduce((obj, key) => {\n Reflect.set(obj, key, animated[key]);\n return obj;\n }, {});\n\n const unstyle = styleEffect(element, {\n transform,\n ...styledValues,\n });\n\n return onCleanup(() => {\n unstyle();\n unsub();\n valueSubscribers.forEach((unsub) => unsub());\n Object.values(animated).forEach((value) => {\n value.destroy();\n });\n Object.values(progressValue).forEach((value) => {\n value?.destroy?.();\n });\n transform.destroy();\n });\n });\n};\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport {\n ParallaxContainer,\n ParallaxStickyLayer,\n ParallaxAnimation,\n} from \"./components/index.js\";\n\nexport type ParallaxContainerProps = ParallaxContainer.Props;\nexport type ParallaxStickyLayerProps = ParallaxStickyLayer.Props;\nexport type ParallaxAnimationProps = ParallaxAnimation.Props;\n\ncustomShadowlessElement(\n ParallaxContainer.Name,\n {\n maxPages: 2,\n },\n correctElementType(ParallaxContainer.Component),\n);\n\ncustomShadowlessElement(\n ParallaxStickyLayer.Name,\n {\n start: 1,\n end: 2,\n },\n correctElementType(ParallaxStickyLayer.Component),\n);\n\ncustomShadowlessElement(\n ParallaxAnimation.Name,\n ParallaxAnimation.PROPS,\n correctElementType(ParallaxAnimation.Component),\n);\n\nexport {\n useParallax,\n getParallaxContext,\n useParallaxStickyLayer,\n getParallaxStickyLayerContext,\n withParallaxElementContext,\n withParallaxStickyLayerContext,\n} from \"./hooks/index.js\";\n"]}
1
+ {"version":3,"sources":["../../src/components/parallax-container/index.ts","../../src/hooks/useParallax.ts","../../src/utils.ts","../../src/hooks/useParallaxStickyLayer.ts","../../src/components/parallax-sticky-layer/index.ts","../../src/components/parallax-animation/index.ts","../../src/index.ts"],"names":["info","splitProps","motionValue","createEffect","onCleanup","createContext","mergeProps","provide","consume","createWithElementContext","getContextFromProvider","Component","Name","messages","animate","createStore","active","props","transform","mTransform","unsub","frame","_"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { provideParallaxContext } from \"../../hooks/index.js\";\n\nexport type Props = {\n maxPages: number;\n};\n\nexport const Name = `parallax-container`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (!props.maxPages)\n return console.warn(\n `${Name}: requires max-pages attribute to be set!`,\n element,\n );\n if (props.maxPages < 1)\n return console.warn(\n `${Name}: max-pages must be greater than or equal to 1!`,\n element,\n );\n provideParallaxContext(props, element);\n};\n","import {\n onCleanup,\n createEffect,\n splitProps,\n mergeProps,\n batch,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\nimport {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport { scroll, motionValue } from \"motion\";\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n maxPages: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxContext = ReturnType<typeof initializeParallaxContext>;\n\nfunction initializeParallaxContext(props: CreateContextOptions) {\n const [_internal, _state] = splitProps(props, [\"root\"]);\n\n const scrollYProgress = motionValue(-1);\n const scrollY = motionValue(-1);\n const [info, setInfo] = createStore({\n offset: [-1, -1],\n scrollLength: -1,\n });\n\n window.addEventListener(\"resize\", () => {});\n\n createEffect(() => {\n const pages = _state.maxPages;\n\n _internal.root.style.height = `${pages * 100}vh`;\n _internal.root.style.width = `100%`;\n _internal.root.style.position = \"relative\";\n if (!_internal.root.style.display) {\n _internal.root.style.display = \"block\";\n }\n\n const remove = scroll(\n (_, info) => {\n const { y } = info;\n\n scrollYProgress.set(y.progress);\n scrollY.set(y.current);\n batch(() => {\n setInfo(\"offset\", 0, y.offset?.at(0) || 0);\n setInfo(\"offset\", 1, y.offset?.at(1) || 0);\n setInfo(\"scrollLength\", y.scrollLength);\n });\n },\n {\n target: _internal.root,\n axis: \"y\",\n offset: [\"start start\", \"end end\"],\n },\n );\n\n onCleanup(() => {\n if (remove) {\n remove();\n }\n scrollYProgress.destroy();\n scrollY.destroy();\n });\n });\n\n return mergeProps(_state, {\n scrollYProgress,\n scrollY,\n info,\n });\n}\n\nconst ParallaxContextState = createContext(initializeParallaxContext);\n\nexport const provideParallaxContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ParallaxContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ParallaxContextState, props, element);\n};\n\nexport const useParallaxContext = (context: ParallaxContext) => {\n return context;\n};\n\nexport const useParallax = (element: HTMLElement & ICustomElement) => {\n const context: ParallaxContext = consume(ParallaxContextState, element);\n\n if (!context) {\n throw console.error(\n \"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n );\n }\n\n return useParallaxContext(context);\n};\n\nexport const withParallaxElementContext = createWithElementContext<\n typeof ParallaxContextState,\n ParallaxContext\n>(ParallaxContextState);\n\nexport const getParallaxContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxContext>(\n ParallaxContextState,\n element,\n );\n return useParallaxContext(context);\n};\n","export function normalizeTuple(range: [number, number], max: number) {\n if (max <= 1) {\n throw new Error(\"The maximum value must be greater than 1.\");\n }\n\n const [start, end] = range;\n const normalizedStart = (start - 1) / (max - 1);\n const normalizedEnd = (end - 1) / (max - 1);\n\n return [normalizedStart, normalizedEnd] as const;\n}\n\nexport function isInRange({\n range: [start, end],\n value,\n}: {\n range: [number, number];\n value: number;\n}) {\n return start <= value && end >= value;\n}\n\nexport function getLastMatchingMediaQueryIndex(queries: string[]): number {\n let lastMatchIndex = -1;\n\n for (let i = 0; i < queries.length; i++) {\n const query = queries[i];\n if (typeof query !== \"string\") continue;\n if (window.matchMedia(query).matches) {\n lastMatchIndex = i;\n }\n }\n\n return lastMatchIndex;\n}\n\nexport function getActiveBreakpoints(queries: string[]): boolean[] {\n return queries.map((query) => window.matchMedia(query).matches);\n}\n\nexport function getLastTruthyIndex(values: boolean[]): number {\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i]) return i;\n }\n return -1;\n}\nexport function getLastValidValue<T>(\n arr: (T | null)[],\n index: number,\n): T | null {\n if (arr[index] != null) return arr[index]!;\n\n for (let i = index - 1; i >= 0; i--) {\n if (arr[i] != null) return arr[i]!;\n }\n\n return null;\n}\n","import {\n\tcreateWithElementContext,\n\tgetContextFromProvider,\n} from \"@brytdesigns/web-component-core/utils\";\nimport {\n\tconsume,\n\tcreateContext,\n\ttype ICustomElement,\n\tprovide,\n} from \"component-register\";\nimport {\n\ttype AnimationPlaybackControlsWithThen,\n\tanimate,\n\tframe,\n\tmotionValue,\n} from \"motion\";\nimport { createEffect, mergeProps, onCleanup, splitProps } from \"solid-js\";\nimport { isInRange, normalizeTuple } from \"../utils\";\nimport { useParallax } from \"./useParallax\";\n\ntype CreateContextOptions = {\n\troot: HTMLElement & ICustomElement;\n\tstart: number;\n\tend: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxStickyLayerContext = ReturnType<\n\ttypeof initializeParallaxStickyLayerContext\n>;\n\ntype LayerMode = \"absolute-below\" | \"sticky\" | \"absolute-above\";\n\nconst HANDOFF_EASE = \"easeOut\";\nconst ENTER_HYSTERESIS = 0.001;\nconst EXIT_HYSTERESIS = 0.005;\nconst HANDOFF_MIN_DELTA_PX = 0.75;\nconst EXIT_WAIT_TIMEOUT_MS = 500;\nconst PREDICT_LOOKAHEAD_MS = 28;\nconst PREDICT_ENTER_BAND = 0.006;\nconst PREDICT_EXIT_BAND = 0.01;\nconst PREDICT_MIN_VELOCITY = 0.0004;\nconst LOW_VELOCITY_NO_TWEEN = 0.001;\nconst HIGH_VELOCITY_SKIP_HANDOFF = 0.01;\nconst MAX_PREDICT_LOOKAHEAD_MS = 60;\nconst MAX_HANDOFF_DELTA_PX = 56;\n\nfunction supportsStickyPosition() {\n\tif (typeof CSS === \"undefined\" || typeof CSS.supports !== \"function\") {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tCSS.supports(\"position\", \"sticky\") ||\n\t\tCSS.supports(\"position\", \"-webkit-sticky\")\n\t);\n}\n\nfunction initializeParallaxStickyLayerContext(props: CreateContextOptions) {\n\tconst [_internal, _state] = splitProps(props, [\"root\", \"start\", \"end\"]);\n\tconst parallax = useParallax(_internal.root);\n\tconst stickySupported = supportsStickyPosition();\n\n\tconst progress = motionValue(-1);\n\tconst rawScrollProgress = motionValue(-1);\n\tconst inRange = motionValue(false);\n\tconst belowRange = motionValue(false);\n\tconst aboveRange = motionValue(false);\n\tconst normStartValue = motionValue(0);\n\tconst normEndValue = motionValue(1);\n\tconst mode = motionValue<LayerMode>(\"absolute-below\");\n\tconst handoffOffsetY = motionValue(0);\n\n\tconst activeContentAnimations = new Set<AnimationPlaybackControlsWithThen>();\n\tlet handoffAnimation: AnimationPlaybackControlsWithThen | null = null;\n\tlet exitWaitRaf: number | null = null;\n\tlet exitWaitTimeout: number | null = null;\n\tlet pendingExitVersion = 0;\n\tlet pendingExitMode: LayerMode | null = null;\n\tlet lastScrollSampleValue = 0;\n\tlet lastScrollSampleTime = 0;\n\tlet hasScrollSample = false;\n\tlet latestScrollVelocity = 0;\n\n\t_internal.root.style.top = \"0px\";\n\t_internal.root.style.right = \"0px\";\n\t_internal.root.style.bottom = \"0px\";\n\t_internal.root.style.left = \"0px\";\n\t_internal.root.style.height = `100dvh`;\n\t_internal.root.style.overflowX = \"hidden\";\n\t_internal.root.style.maxWidth = \"100%\";\n\tif (window.getComputedStyle(_internal.root).display === \"inline\") {\n\t\t_internal.root.style.display = \"block\";\n\t}\n\n\tfunction updateStyles() {\n\t\tif (!stickySupported) {\n\t\t\tconst normStart = normStartValue.get();\n\t\t\tconst normEnd = normEndValue.get();\n\t\t\tconst raw = rawScrollProgress.get();\n\t\t\tconst span = Math.max(normEnd - normStart, Number.EPSILON);\n\t\t\tconst t = Math.min(Math.max((raw - normStart) / span, 0), 1);\n\t\t\tconst pageY = _internal.start - 1 + t * (_internal.end - _internal.start);\n\n\t\t\t_internal.root.style.position = \"absolute\";\n\t\t\t_internal.root.style.transform = `translate(0px, ${pageY * 100}vh)`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentMode = mode.get();\n\t\tconst offset = handoffOffsetY.get();\n\t\tconst hasOffset = Math.abs(offset) >= 0.1;\n\n\t\tif (currentMode === \"sticky\") {\n\t\t\t_internal.root.style.position = \"sticky\";\n\t\t\t_internal.root.style.transform = hasOffset\n\t\t\t\t? `translate(0px, ${offset}px)`\n\t\t\t\t: \"none\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst baseTransform =\n\t\t\tcurrentMode === \"absolute-below\"\n\t\t\t\t? `translate(0px, ${(_internal.start - 1) * 100}vh)`\n\t\t\t\t: `translate(0px, ${(_internal.end - 1) * 100}vh)`;\n\n\t\t_internal.root.style.position = \"absolute\";\n\t\t_internal.root.style.transform = hasOffset\n\t\t\t? `${baseTransform} translate(0px, ${offset}px)`\n\t\t\t: baseTransform;\n\t}\n\n\tfunction renderStyles() {\n\t\tframe.render(updateStyles);\n\t}\n\n\tfunction stopHandoffAnimation() {\n\t\thandoffAnimation?.stop();\n\t\thandoffAnimation = null;\n\t\thandoffOffsetY.set(0);\n\t}\n\n\tfunction clearExitWaitHandles() {\n\t\tif (exitWaitRaf !== null) {\n\t\t\twindow.cancelAnimationFrame(exitWaitRaf);\n\t\t\texitWaitRaf = null;\n\t\t}\n\t\tif (exitWaitTimeout !== null) {\n\t\t\twindow.clearTimeout(exitWaitTimeout);\n\t\t\texitWaitTimeout = null;\n\t\t}\n\t}\n\n\tfunction pruneFinishedAnimations() {\n\t\tfor (const animation of activeContentAnimations) {\n\t\t\tif (animation.state !== \"running\") {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hasActiveContentAnimations() {\n\t\tpruneFinishedAnimations();\n\t\treturn activeContentAnimations.size > 0;\n\t}\n\n\tfunction registerContentAnimation(\n\t\tanimation: AnimationPlaybackControlsWithThen,\n\t) {\n\t\tactiveContentAnimations.add(animation);\n\t\tanimation.then(\n\t\t\t() => {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t},\n\t\t);\n\t}\n\n\tfunction getHandoffDuration(deltaY: number, velocity: number) {\n\t\tconst speed = Math.abs(velocity);\n\t\tif (speed <= LOW_VELOCITY_NO_TWEEN) return 0;\n\n\t\tconst byDistance = Math.min(0.12, Math.max(0.05, Math.abs(deltaY) / 1400));\n\t\tconst speedScale = Math.min(speed / 0.01, 1);\n\t\treturn Math.max(0.04, byDistance - speedScale * 0.02);\n\t}\n\n\tfunction settleHandoffOverFrames(deltaY: number, frameCount: number) {\n\t\thandoffOffsetY.set(deltaY);\n\t\tupdateStyles();\n\n\t\tlet remainingFrames = Math.max(frameCount, 1);\n\t\tconst settle = () => {\n\t\t\tremainingFrames -= 1;\n\t\t\tif (remainingFrames <= 0) {\n\t\t\t\thandoffOffsetY.set(0);\n\t\t\t\tupdateStyles();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tframe.render(settle);\n\t\t};\n\n\t\tframe.render(settle);\n\t}\n\n\tfunction cancelPendingExit() {\n\t\tpendingExitVersion += 1;\n\t\tpendingExitMode = null;\n\t\tclearExitWaitHandles();\n\t}\n\n\tfunction commitModeImmediately(nextMode: LayerMode) {\n\t\tstopHandoffAnimation();\n\t\tmode.set(nextMode);\n\t\tupdateStyles();\n\t}\n\n\tfunction waitForAnimations(nextMode: LayerMode) {\n\t\tif (\n\t\t\tpendingExitMode === nextMode &&\n\t\t\t(exitWaitRaf !== null || exitWaitTimeout !== null)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tcancelPendingExit();\n\t\tpendingExitMode = nextMode;\n\t\tconst version = pendingExitVersion;\n\n\t\tconst completeExit = () => {\n\t\t\tif (version !== pendingExitVersion) return;\n\t\t\tclearExitWaitHandles();\n\t\t\tpendingExitMode = null;\n\n\t\t\tconst latest = Math.min(Math.max(rawScrollProgress.get(), 0), 1);\n\t\t\tconst stableMode = getTargetMode(\n\t\t\t\tlatest,\n\t\t\t\tnormStartValue.get(),\n\t\t\t\tnormEndValue.get(),\n\t\t\t);\n\t\t\tif (stableMode !== nextMode) return;\n\n\t\t\tcommitModeImmediately(nextMode);\n\t\t};\n\n\t\tif (!hasActiveContentAnimations()) {\n\t\t\tcompleteExit();\n\t\t\treturn;\n\t\t}\n\n\t\tconst tick = () => {\n\t\t\tif (version !== pendingExitVersion) return;\n\t\t\tif (!hasActiveContentAnimations()) {\n\t\t\t\tcompleteExit();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\texitWaitRaf = window.requestAnimationFrame(tick);\n\t\t};\n\n\t\texitWaitTimeout = window.setTimeout(() => {\n\t\t\tcompleteExit();\n\t\t}, EXIT_WAIT_TIMEOUT_MS);\n\t\texitWaitRaf = window.requestAnimationFrame(tick);\n\t}\n\n\tfunction getTargetMode(value: number, normStart: number, normEnd: number) {\n\t\tif (!stickySupported) {\n\t\t\tif (value <= normStart) return \"absolute-below\";\n\t\t\tif (value >= normEnd) return \"absolute-above\";\n\t\t\treturn \"absolute-below\";\n\t\t}\n\n\t\tconst current = mode.get();\n\t\tif (current === \"sticky\") {\n\t\t\tif (value < normStart - EXIT_HYSTERESIS) return \"absolute-below\";\n\t\t\tif (value > normEnd + EXIT_HYSTERESIS) return \"absolute-above\";\n\t\t\treturn \"sticky\";\n\t\t}\n\n\t\tif (current === \"absolute-below\") {\n\t\t\tif (value >= normStart + ENTER_HYSTERESIS) return \"sticky\";\n\t\t\treturn \"absolute-below\";\n\t\t}\n\n\t\tif (value <= normEnd - ENTER_HYSTERESIS) return \"sticky\";\n\t\treturn \"absolute-above\";\n\t}\n\n\tfunction getModeDecisionValue(\n\t\tvalue: number,\n\t\tnormStart: number,\n\t\tnormEnd: number,\n\t\tallowPrediction: boolean,\n\t) {\n\t\tconst now = performance.now();\n\t\tlet velocity = 0;\n\n\t\tif (hasScrollSample) {\n\t\t\tconst elapsed = Math.max(now - lastScrollSampleTime, 1);\n\t\t\tvelocity = (value - lastScrollSampleValue) / elapsed;\n\t\t}\n\n\t\tlastScrollSampleValue = value;\n\t\tlastScrollSampleTime = now;\n\t\thasScrollSample = true;\n\t\tlatestScrollVelocity = velocity;\n\n\t\tif (!allowPrediction || Math.abs(velocity) < PREDICT_MIN_VELOCITY) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst speed = Math.abs(velocity);\n\t\tconst speedScale = Math.min(speed / HIGH_VELOCITY_SKIP_HANDOFF, 1);\n\t\tconst lookaheadMs =\n\t\t\tPREDICT_LOOKAHEAD_MS +\n\t\t\tspeedScale * (MAX_PREDICT_LOOKAHEAD_MS - PREDICT_LOOKAHEAD_MS);\n\n\t\tconst predicted = Math.min(Math.max(value + velocity * lookaheadMs, 0), 1);\n\n\t\tconst currentMode = mode.get();\n\t\tif (currentMode === \"absolute-below\") {\n\t\t\tconst entryEdge = normStart + ENTER_HYSTERESIS;\n\t\t\tconst nearStart = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;\n\t\t\tif (\n\t\t\t\tvelocity > 0 &&\n\t\t\t\tnearStart &&\n\t\t\t\tvalue < entryEdge &&\n\t\t\t\tpredicted >= entryEdge\n\t\t\t) {\n\t\t\t\treturn entryEdge;\n\t\t\t}\n\t\t}\n\n\t\tif (currentMode === \"absolute-above\") {\n\t\t\tconst entryEdge = normEnd - ENTER_HYSTERESIS;\n\t\t\tconst nearEnd = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;\n\t\t\tif (\n\t\t\t\tvelocity < 0 &&\n\t\t\t\tnearEnd &&\n\t\t\t\tvalue > entryEdge &&\n\t\t\t\tpredicted <= entryEdge\n\t\t\t) {\n\t\t\t\treturn entryEdge;\n\t\t\t}\n\t\t}\n\n\t\tif (currentMode === \"sticky\") {\n\t\t\tconst exitTopEdge = normStart - EXIT_HYSTERESIS;\n\t\t\tconst exitBottomEdge = normEnd + EXIT_HYSTERESIS;\n\n\t\t\tconst nearTop = Math.abs(value - exitTopEdge) <= PREDICT_EXIT_BAND;\n\t\t\tif (\n\t\t\t\tvelocity < 0 &&\n\t\t\t\tnearTop &&\n\t\t\t\tvalue > exitTopEdge &&\n\t\t\t\tpredicted <= exitTopEdge\n\t\t\t) {\n\t\t\t\treturn exitTopEdge;\n\t\t\t}\n\n\t\t\tconst nearBottom = Math.abs(value - exitBottomEdge) <= PREDICT_EXIT_BAND;\n\t\t\tif (\n\t\t\t\tvelocity > 0 &&\n\t\t\t\tnearBottom &&\n\t\t\t\tvalue < exitBottomEdge &&\n\t\t\t\tpredicted >= exitBottomEdge\n\t\t\t) {\n\t\t\t\treturn exitBottomEdge;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction applyModeWithHandoff(nextMode: LayerMode) {\n\t\tif (!stickySupported) {\n\t\t\tstopHandoffAnimation();\n\t\t\tmode.set(nextMode);\n\t\t\trenderStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tstopHandoffAnimation();\n\n\t\tconst prevRect = _internal.root.getBoundingClientRect();\n\t\tmode.set(nextMode);\n\t\tupdateStyles();\n\n\t\tconst nextRect = _internal.root.getBoundingClientRect();\n\t\tconst deltaY = prevRect.top - nextRect.top;\n\t\tif (Math.abs(deltaY) <= HANDOFF_MIN_DELTA_PX) {\n\t\t\thandoffOffsetY.set(0);\n\t\t\trenderStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tMath.abs(latestScrollVelocity) >= HIGH_VELOCITY_SKIP_HANDOFF ||\n\t\t\tMath.abs(deltaY) >= MAX_HANDOFF_DELTA_PX\n\t\t) {\n\t\t\tsettleHandoffOverFrames(deltaY, 2);\n\t\t\treturn;\n\t\t}\n\n\t\thandoffOffsetY.set(deltaY);\n\t\tupdateStyles();\n\t\tconst duration = getHandoffDuration(deltaY, latestScrollVelocity);\n\t\tif (duration <= 0) {\n\t\t\tsettleHandoffOverFrames(deltaY, 1);\n\t\t\treturn;\n\t\t}\n\n\t\thandoffAnimation = animate([\n\t\t\t[handoffOffsetY, 0, { duration, ease: HANDOFF_EASE }],\n\t\t]);\n\t\thandoffAnimation.then(() => {\n\t\t\tif (!handoffAnimation) return;\n\t\t\thandoffAnimation = null;\n\t\t\thandoffOffsetY.set(0);\n\t\t\trenderStyles();\n\t\t});\n\t}\n\n\tfunction syncFromScroll(value: number, allowHandoff: boolean) {\n\t\tconst clamped = Math.min(Math.max(value, 0), 1);\n\t\trawScrollProgress.set(clamped);\n\n\t\tconst normStart = normStartValue.get();\n\t\tconst normEnd = normEndValue.get();\n\t\tconst range = [normStart, normEnd] as [number, number];\n\t\tconst span = Math.max(normEnd - normStart, Number.EPSILON);\n\t\tconst normalizedProgress = Math.min(\n\t\t\tMath.max((clamped - normStart) / span, 0),\n\t\t\t1,\n\t\t);\n\n\t\tinRange.set(isInRange({ range, value: clamped }));\n\t\tbelowRange.set(clamped <= normStart);\n\t\taboveRange.set(clamped >= normEnd);\n\t\tprogress.set(normalizedProgress);\n\n\t\tconst decisionValue = getModeDecisionValue(\n\t\t\tclamped,\n\t\t\tnormStart,\n\t\t\tnormEnd,\n\t\t\tallowHandoff,\n\t\t);\n\t\tconst nextMode = getTargetMode(decisionValue, normStart, normEnd);\n\t\tconst currentMode = mode.get();\n\n\t\tif (currentMode === \"sticky\" && nextMode !== \"sticky\" && allowHandoff) {\n\t\t\twaitForAnimations(nextMode);\n\t\t\tupdateStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tcancelPendingExit();\n\t\tif (nextMode === currentMode) {\n\t\t\tif (!allowHandoff) {\n\t\t\t\tstopHandoffAnimation();\n\t\t\t\tupdateStyles();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (allowHandoff) {\n\t\t\tapplyModeWithHandoff(nextMode);\n\t\t\treturn;\n\t\t}\n\n\t\tcommitModeImmediately(nextMode);\n\t}\n\n\tcreateEffect(() => {\n\t\tconst range = [_internal.start, _internal.end];\n\t\tconst maxPages = parallax.maxPages;\n\t\tconst normalizedRange = normalizeTuple(range as any, maxPages);\n\t\tconst [normStart, normEnd] = normalizedRange;\n\t\tnormStartValue.set(normStart);\n\t\tnormEndValue.set(normEnd);\n\n\t\tconst initialValue = parallax.scrollYProgress.get();\n\t\tsyncFromScroll(initialValue, false);\n\t\trenderStyles();\n\n\t\tconst unsubscribe = parallax.scrollYProgress.on(\"change\", (value) => {\n\t\t\tsyncFromScroll(value, true);\n\t\t});\n\n\t\treturn onCleanup(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t});\n\n\tconst unsubHandoffOffset = handoffOffsetY.on(\"change\", (_) => {\n\t\trenderStyles();\n\t});\n\n\tfunction _animate(...args: Parameters<typeof animate>) {\n\t\tconst animation = animate(...args);\n\t\tregisterContentAnimation(animation);\n\t\treturn animation;\n\t}\n\n\tonCleanup(() => {\n\t\tcancelPendingExit();\n\t\tstopHandoffAnimation();\n\t\tunsubHandoffOffset();\n\t});\n\n\treturn [progress, { animate: _animate }] as const;\n}\n\nconst ParallaxStickyLayerContextState = createContext(\n\tinitializeParallaxStickyLayerContext,\n);\n\nexport const provideParallaxStickyLayerContext = (\n\tinitialState: Omit<CreateContextOptions, \"root\">,\n\telement: WalkableNode,\n): ParallaxStickyLayerContext => {\n\tconst props = mergeProps(initialState, { root: element });\n\treturn provide(ParallaxStickyLayerContextState, props, element);\n};\n\nexport const useParallaxStickyLayerContext = (\n\tcontext: ParallaxStickyLayerContext,\n) => {\n\treturn context;\n};\n\nexport const useParallaxStickyLayer = (\n\telement: HTMLElement & ICustomElement,\n) => {\n\tconst context: ParallaxStickyLayerContext = consume(\n\t\tParallaxStickyLayerContextState,\n\t\telement,\n\t);\n\n\tif (!context) {\n\t\tthrow console.error(\n\t\t\t\"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n\t\t);\n\t}\n\n\treturn useParallaxStickyLayerContext(context);\n};\n\nexport const withParallaxStickyLayerContext = createWithElementContext<\n\ttypeof ParallaxStickyLayerContextState,\n\tParallaxStickyLayerContext\n>(ParallaxStickyLayerContextState);\n\nexport const getParallaxStickyLayerContext = (element: Element) => {\n\tconst context = getContextFromProvider<ParallaxStickyLayerContext>(\n\t\tParallaxStickyLayerContextState,\n\t\telement,\n\t);\n\treturn useParallaxStickyLayerContext(context);\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport { provideParallaxStickyLayerContext } from \"../../hooks/index.js\";\n\nexport type Props = {\n start: number;\n end: number;\n};\n\nexport const Name = `parallax-sticky-layer`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (!props.start)\n return console.warn(\n `${Name}: requires start attribute to be set!`,\n element,\n );\n if (!props.end)\n return console.warn(`${Name}: requires end attribute to be set!`, element);\n if (props.end <= props.start)\n return console.warn(\n `${Name}: the start attribute must be less than the end attribute!`,\n element,\n );\n if (props.start < 1 || props.end < 1)\n return console.warn(\n `${Name}: The start and end attributes must be greater than or equal to 1!`,\n element,\n );\n provideParallaxStickyLayerContext(props, element);\n};\n","import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport {\n onCleanup,\n createEffect,\n createMemo,\n splitProps,\n mergeProps,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n motionValue,\n transformValue,\n transform as mTransform,\n styleEffect,\n frame,\n type MotionValue,\n} from \"motion\";\n\nimport { useParallaxStickyLayer } from \"../../hooks/index.js\";\nimport { getActiveBreakpoints, getLastTruthyIndex } from \"../../utils.js\";\n\ntype AnimatableArray = Array<string | number> | null;\n\nexport type Props = {\n breakpoints: string[];\n range: number[] | number[][];\n y: AnimatableArray | AnimatableArray[];\n x: AnimatableArray | AnimatableArray[];\n scale: AnimatableArray | AnimatableArray[];\n rotate: AnimatableArray | AnimatableArray[];\n opacity: AnimatableArray | AnimatableArray[];\n backgroundColor: AnimatableArray | AnimatableArray[];\n borderRadius: AnimatableArray | AnimatableArray[];\n};\n\ntype ActiveProps = {\n range: number[];\n y: AnimatableArray;\n x: AnimatableArray;\n scale: AnimatableArray;\n rotate: AnimatableArray;\n opacity: AnimatableArray;\n backgroundColor: AnimatableArray;\n borderRadius: AnimatableArray;\n};\n\nfunction keysFromObject<T extends object>(object: T): (keyof T)[] {\n return Object.keys(object) as (keyof T)[];\n}\n\nexport const Name = `parallax-animation`;\n\nexport const PROPS = {\n breakpoints: [\"\"],\n range: [0, 1],\n y: null,\n x: null,\n scale: null,\n rotate: null,\n opacity: null,\n color: null,\n backgroundColor: null,\n borderRadius: null,\n};\n\nconst PROP_DEFAULTS = {\n y: \"0%\",\n x: \"0%\",\n scale: 1,\n rotate: 0,\n opacity: null,\n color: null,\n backgroundColor: null,\n borderRadius: null,\n};\n\nconst KEYS = Object.keys(PROPS);\n\nconst isNestedAnimatableArray = (\n values: AnimatableArray | AnimatableArray[],\n): values is AnimatableArray[] => {\n return (\n Array.isArray(values) && (Array.isArray(values[0]) || values[0] === null)\n );\n};\n\nconst flattenAnimatableArray = (\n value: AnimatableArray | AnimatableArray[],\n index: number = 0,\n) => {\n if (isNestedAnimatableArray(value)) {\n return value[index]!;\n }\n return value;\n};\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (\n Object.keys(props).some(\n (key) => KEYS.includes(key) && !Array.isArray(Reflect.get(props, key)),\n )\n )\n return console.warn(\n `parallax-animate: At least one of ${KEYS.join(\",\")} properties is required and must be an array of values!`,\n element,\n );\n\n const messages = Object.entries(props).reduce((messages, [key, value]) => {\n if (!KEYS.includes(key)) return messages;\n if (value && value.length !== props.range.length) {\n return messages.concat(\n `${key} attribute must have the same length as range attribute!`,\n );\n }\n return messages;\n }, [] as string[]);\n\n if (messages.length)\n return console.warn(\n element,\n `\\nparallax-animate: Please fix the following issues:\\n${messages.join(\"\\n\")}`,\n );\n\n const [progress, { animate }] = useParallaxStickyLayer(element);\n\n const [activeBreakpoints, setActiveBreakpoints] = createStore<boolean[]>(\n getActiveBreakpoints(props.breakpoints),\n );\n const activeBreakpointIndex = createMemo(() =>\n getLastTruthyIndex(activeBreakpoints),\n );\n\n const [_, importantProps] = splitProps(props, [\"breakpoints\"]);\n const animateableProps = mergeProps(importantProps, {});\n\n const activeProps = createMemo<ActiveProps>(() => {\n const index = activeBreakpointIndex();\n\n if (index === -1) {\n const { breakpoints, ...active } = PROPS;\n return active;\n }\n\n const keys = keysFromObject(animateableProps);\n\n const active = keys.reduce((active, key) => {\n const value = animateableProps[key];\n if (isNestedAnimatableArray(value)) {\n const flattenedValue = flattenAnimatableArray(value, index);\n return {\n ...active,\n [key]: flattenedValue,\n };\n }\n return {\n ...active,\n [key]: value,\n };\n }, {} as ActiveProps);\n\n return active;\n });\n\n createEffect(() => {\n const breakpoints = props.breakpoints;\n const controller = new AbortController();\n\n for (let i = 0; i < breakpoints.length; i++) {\n const query = breakpoints[i];\n if (!query) continue;\n const mediaQuery = window.matchMedia(query);\n mediaQuery.addEventListener(\n \"change\",\n (e) => setActiveBreakpoints(i, e.matches),\n { signal: controller.signal },\n );\n }\n\n return onCleanup(() => {\n controller.abort();\n });\n });\n\n element.style.willChange = \"transform\";\n if (\n window.getComputedStyle(element).getPropertyValue(\"display\") === \"inline\"\n ) {\n element.style.display = \"block\";\n }\n\n createEffect(() => {\n const active = activeProps();\n const { range, ...props } = active;\n const valueSubscribers: VoidFunction[] = [];\n\n const progressValue = Object.keys(PROP_DEFAULTS).reduce(\n (values, key) => {\n const fallback = Reflect.get(PROP_DEFAULTS, key);\n const valueRange = Reflect.get(props, key);\n if (valueRange?.length === range.length) {\n const transform = mTransform(range, valueRange);\n const value = motionValue(transform(progress.get()));\n const unsub = progress.on(\"change\", (latest) => {\n value.set(transform(latest));\n });\n valueSubscribers.push(unsub);\n values[key] = value;\n } else values[key] = fallback;\n return values;\n },\n {} as Record<string, any>,\n );\n\n const animated = Object.keys(progressValue).reduce(\n (obj, key) => {\n const v = progressValue[key];\n Reflect.set(\n obj,\n key,\n motionValue(typeof v === \"object\" && v !== null ? v.get() : v),\n );\n return obj;\n },\n {} as Record<string, MotionValue>,\n );\n\n const transform = transformValue(\n () =>\n `translate(${animated.x?.get()}, ${animated.y?.get()}) scale(${animated.scale?.get()}) rotate(${animated.rotate?.get()}deg)`,\n );\n\n function animateValues() {\n const sequence = Object.keys(animated)\n .map((key) => {\n let v = progressValue[key]?.get?.();\n if (typeof v === \"undefined\") return null;\n return [animated[key], v, { at: \"<\" }];\n })\n .filter((v) => v !== null);\n //@ts-ignore\n animate(sequence);\n }\n\n function scheduleAnimation() {\n frame.update(animateValues);\n }\n\n const unsub = progress.on(\"change\", (_) => {\n scheduleAnimation();\n });\n\n const styledValues = Object.keys(animated)\n .filter(\n (key) =>\n key !== \"y\" && key !== \"x\" && key !== \"rotate\" && key !== \"scale\",\n )\n .reduce((obj, key) => {\n Reflect.set(obj, key, animated[key]);\n return obj;\n }, {});\n\n const unstyle = styleEffect(element, {\n transform,\n ...styledValues,\n });\n\n return onCleanup(() => {\n unstyle();\n unsub();\n valueSubscribers.forEach((unsub) => unsub());\n Object.values(animated).forEach((value) => {\n value.destroy();\n });\n Object.values(progressValue).forEach((value) => {\n value?.destroy?.();\n });\n transform.destroy();\n });\n });\n};\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport {\n ParallaxContainer,\n ParallaxStickyLayer,\n ParallaxAnimation,\n} from \"./components/index.js\";\n\nexport type ParallaxContainerProps = ParallaxContainer.Props;\nexport type ParallaxStickyLayerProps = ParallaxStickyLayer.Props;\nexport type ParallaxAnimationProps = ParallaxAnimation.Props;\n\ncustomShadowlessElement(\n ParallaxContainer.Name,\n {\n maxPages: 2,\n },\n correctElementType(ParallaxContainer.Component),\n);\n\ncustomShadowlessElement(\n ParallaxStickyLayer.Name,\n {\n start: 1,\n end: 2,\n },\n correctElementType(ParallaxStickyLayer.Component),\n);\n\ncustomShadowlessElement(\n ParallaxAnimation.Name,\n ParallaxAnimation.PROPS,\n correctElementType(ParallaxAnimation.Component),\n);\n\nexport {\n useParallax,\n getParallaxContext,\n useParallaxStickyLayer,\n getParallaxStickyLayerContext,\n withParallaxElementContext,\n withParallaxStickyLayerContext,\n} from \"./hooks/index.js\";\n"]}
@@ -1,35 +1,52 @@
1
- import { splitProps, createEffect, onCleanup, mergeProps } from 'solid-js';
2
- import { createContext, provide, consume } from 'component-register';
3
- import { motionValue, transformValue, transform, frame, animate } from 'motion';
4
- import { awaitAllAnimations } from '@brytdesigns/web-component-core/animation';
5
- import { abortablePromise } from '@brytdesigns/web-component-core/promise';
6
1
  import { createWithElementContext, getContextFromProvider } from '@brytdesigns/web-component-core/utils';
7
- import { useParallax } from './useParallax';
2
+ import { createContext, provide, consume } from 'component-register';
3
+ import { motionValue, frame, animate } from 'motion';
4
+ import { splitProps, createEffect, onCleanup, mergeProps } from 'solid-js';
8
5
  import { normalizeTuple, isInRange } from '../utils';
6
+ import { useParallax } from './useParallax';
9
7
 
8
+ const HANDOFF_EASE = "easeOut";
9
+ const ENTER_HYSTERESIS = 1e-3;
10
+ const EXIT_HYSTERESIS = 5e-3;
11
+ const HANDOFF_MIN_DELTA_PX = 0.75;
12
+ const EXIT_WAIT_TIMEOUT_MS = 500;
13
+ const PREDICT_LOOKAHEAD_MS = 28;
14
+ const PREDICT_ENTER_BAND = 6e-3;
15
+ const PREDICT_EXIT_BAND = 0.01;
16
+ const PREDICT_MIN_VELOCITY = 4e-4;
17
+ const LOW_VELOCITY_NO_TWEEN = 1e-3;
18
+ const HIGH_VELOCITY_SKIP_HANDOFF = 0.01;
19
+ const MAX_PREDICT_LOOKAHEAD_MS = 60;
20
+ const MAX_HANDOFF_DELTA_PX = 56;
21
+ function supportsStickyPosition() {
22
+ if (typeof CSS === "undefined" || typeof CSS.supports !== "function") {
23
+ return false;
24
+ }
25
+ return CSS.supports("position", "sticky") || CSS.supports("position", "-webkit-sticky");
26
+ }
10
27
  function initializeParallaxStickyLayerContext(props) {
11
28
  const [_internal, _state] = splitProps(props, ["root", "start", "end"]);
12
29
  const parallax = useParallax(_internal.root);
30
+ const stickySupported = supportsStickyPosition();
13
31
  const progress = motionValue(-1);
32
+ const rawScrollProgress = motionValue(-1);
14
33
  const inRange = motionValue(false);
15
34
  const belowRange = motionValue(false);
16
35
  const aboveRange = motionValue(false);
17
- const position = transformValue(
18
- () => inRange.get() ? "sticky" : "absolute"
19
- );
20
- const transform$1 = transformValue(() => {
21
- const isInRange2 = inRange.get();
22
- const isBelowRange = belowRange.get();
23
- const isAboveRange = aboveRange.get();
24
- if (isInRange2) return "none";
25
- if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}vh)`;
26
- if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}vh)`;
27
- });
28
- const animations = motionValue([]);
29
- const styles = transformValue(() => ({
30
- position: position.get(),
31
- transform: transform$1.get()
32
- }));
36
+ const normStartValue = motionValue(0);
37
+ const normEndValue = motionValue(1);
38
+ const mode = motionValue("absolute-below");
39
+ const handoffOffsetY = motionValue(0);
40
+ const activeContentAnimations = /* @__PURE__ */ new Set();
41
+ let handoffAnimation = null;
42
+ let exitWaitRaf = null;
43
+ let exitWaitTimeout = null;
44
+ let pendingExitVersion = 0;
45
+ let pendingExitMode = null;
46
+ let lastScrollSampleValue = 0;
47
+ let lastScrollSampleTime = 0;
48
+ let hasScrollSample = false;
49
+ let latestScrollVelocity = 0;
33
50
  _internal.root.style.top = "0px";
34
51
  _internal.root.style.right = "0px";
35
52
  _internal.root.style.bottom = "0px";
@@ -40,51 +57,315 @@ function initializeParallaxStickyLayerContext(props) {
40
57
  if (window.getComputedStyle(_internal.root).display === "inline") {
41
58
  _internal.root.style.display = "block";
42
59
  }
60
+ function updateStyles() {
61
+ if (!stickySupported) {
62
+ const normStart = normStartValue.get();
63
+ const normEnd = normEndValue.get();
64
+ const raw = rawScrollProgress.get();
65
+ const span = Math.max(normEnd - normStart, Number.EPSILON);
66
+ const t = Math.min(Math.max((raw - normStart) / span, 0), 1);
67
+ const pageY = _internal.start - 1 + t * (_internal.end - _internal.start);
68
+ _internal.root.style.position = "absolute";
69
+ _internal.root.style.transform = `translate(0px, ${pageY * 100}vh)`;
70
+ return;
71
+ }
72
+ const currentMode = mode.get();
73
+ const offset = handoffOffsetY.get();
74
+ const hasOffset = Math.abs(offset) >= 0.1;
75
+ if (currentMode === "sticky") {
76
+ _internal.root.style.position = "sticky";
77
+ _internal.root.style.transform = hasOffset ? `translate(0px, ${offset}px)` : "none";
78
+ return;
79
+ }
80
+ const baseTransform = currentMode === "absolute-below" ? `translate(0px, ${(_internal.start - 1) * 100}vh)` : `translate(0px, ${(_internal.end - 1) * 100}vh)`;
81
+ _internal.root.style.position = "absolute";
82
+ _internal.root.style.transform = hasOffset ? `${baseTransform} translate(0px, ${offset}px)` : baseTransform;
83
+ }
84
+ function renderStyles() {
85
+ frame.render(updateStyles);
86
+ }
87
+ function stopHandoffAnimation() {
88
+ handoffAnimation?.stop();
89
+ handoffAnimation = null;
90
+ handoffOffsetY.set(0);
91
+ }
92
+ function clearExitWaitHandles() {
93
+ if (exitWaitRaf !== null) {
94
+ window.cancelAnimationFrame(exitWaitRaf);
95
+ exitWaitRaf = null;
96
+ }
97
+ if (exitWaitTimeout !== null) {
98
+ window.clearTimeout(exitWaitTimeout);
99
+ exitWaitTimeout = null;
100
+ }
101
+ }
102
+ function pruneFinishedAnimations() {
103
+ for (const animation of activeContentAnimations) {
104
+ if (animation.state !== "running") {
105
+ activeContentAnimations.delete(animation);
106
+ }
107
+ }
108
+ }
109
+ function hasActiveContentAnimations() {
110
+ pruneFinishedAnimations();
111
+ return activeContentAnimations.size > 0;
112
+ }
113
+ function registerContentAnimation(animation) {
114
+ activeContentAnimations.add(animation);
115
+ animation.then(
116
+ () => {
117
+ activeContentAnimations.delete(animation);
118
+ },
119
+ () => {
120
+ activeContentAnimations.delete(animation);
121
+ }
122
+ );
123
+ }
124
+ function getHandoffDuration(deltaY, velocity) {
125
+ const speed = Math.abs(velocity);
126
+ if (speed <= LOW_VELOCITY_NO_TWEEN) return 0;
127
+ const byDistance = Math.min(0.12, Math.max(0.05, Math.abs(deltaY) / 1400));
128
+ const speedScale = Math.min(speed / 0.01, 1);
129
+ return Math.max(0.04, byDistance - speedScale * 0.02);
130
+ }
131
+ function settleHandoffOverFrames(deltaY, frameCount) {
132
+ handoffOffsetY.set(deltaY);
133
+ updateStyles();
134
+ let remainingFrames = Math.max(frameCount, 1);
135
+ const settle = () => {
136
+ remainingFrames -= 1;
137
+ if (remainingFrames <= 0) {
138
+ handoffOffsetY.set(0);
139
+ updateStyles();
140
+ return;
141
+ }
142
+ frame.render(settle);
143
+ };
144
+ frame.render(settle);
145
+ }
146
+ function cancelPendingExit() {
147
+ pendingExitVersion += 1;
148
+ pendingExitMode = null;
149
+ clearExitWaitHandles();
150
+ }
151
+ function commitModeImmediately(nextMode) {
152
+ stopHandoffAnimation();
153
+ mode.set(nextMode);
154
+ updateStyles();
155
+ }
156
+ function waitForAnimations(nextMode) {
157
+ if (pendingExitMode === nextMode && (exitWaitRaf !== null || exitWaitTimeout !== null)) {
158
+ return;
159
+ }
160
+ cancelPendingExit();
161
+ pendingExitMode = nextMode;
162
+ const version = pendingExitVersion;
163
+ const completeExit = () => {
164
+ if (version !== pendingExitVersion) return;
165
+ clearExitWaitHandles();
166
+ pendingExitMode = null;
167
+ const latest = Math.min(Math.max(rawScrollProgress.get(), 0), 1);
168
+ const stableMode = getTargetMode(
169
+ latest,
170
+ normStartValue.get(),
171
+ normEndValue.get()
172
+ );
173
+ if (stableMode !== nextMode) return;
174
+ commitModeImmediately(nextMode);
175
+ };
176
+ if (!hasActiveContentAnimations()) {
177
+ completeExit();
178
+ return;
179
+ }
180
+ const tick = () => {
181
+ if (version !== pendingExitVersion) return;
182
+ if (!hasActiveContentAnimations()) {
183
+ completeExit();
184
+ return;
185
+ }
186
+ exitWaitRaf = window.requestAnimationFrame(tick);
187
+ };
188
+ exitWaitTimeout = window.setTimeout(() => {
189
+ completeExit();
190
+ }, EXIT_WAIT_TIMEOUT_MS);
191
+ exitWaitRaf = window.requestAnimationFrame(tick);
192
+ }
193
+ function getTargetMode(value, normStart, normEnd) {
194
+ if (!stickySupported) {
195
+ if (value <= normStart) return "absolute-below";
196
+ if (value >= normEnd) return "absolute-above";
197
+ return "absolute-below";
198
+ }
199
+ const current = mode.get();
200
+ if (current === "sticky") {
201
+ if (value < normStart - EXIT_HYSTERESIS) return "absolute-below";
202
+ if (value > normEnd + EXIT_HYSTERESIS) return "absolute-above";
203
+ return "sticky";
204
+ }
205
+ if (current === "absolute-below") {
206
+ if (value >= normStart + ENTER_HYSTERESIS) return "sticky";
207
+ return "absolute-below";
208
+ }
209
+ if (value <= normEnd - ENTER_HYSTERESIS) return "sticky";
210
+ return "absolute-above";
211
+ }
212
+ function getModeDecisionValue(value, normStart, normEnd, allowPrediction) {
213
+ const now = performance.now();
214
+ let velocity = 0;
215
+ if (hasScrollSample) {
216
+ const elapsed = Math.max(now - lastScrollSampleTime, 1);
217
+ velocity = (value - lastScrollSampleValue) / elapsed;
218
+ }
219
+ lastScrollSampleValue = value;
220
+ lastScrollSampleTime = now;
221
+ hasScrollSample = true;
222
+ latestScrollVelocity = velocity;
223
+ if (!allowPrediction || Math.abs(velocity) < PREDICT_MIN_VELOCITY) {
224
+ return value;
225
+ }
226
+ const speed = Math.abs(velocity);
227
+ const speedScale = Math.min(speed / HIGH_VELOCITY_SKIP_HANDOFF, 1);
228
+ const lookaheadMs = PREDICT_LOOKAHEAD_MS + speedScale * (MAX_PREDICT_LOOKAHEAD_MS - PREDICT_LOOKAHEAD_MS);
229
+ const predicted = Math.min(Math.max(value + velocity * lookaheadMs, 0), 1);
230
+ const currentMode = mode.get();
231
+ if (currentMode === "absolute-below") {
232
+ const entryEdge = normStart + ENTER_HYSTERESIS;
233
+ const nearStart = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;
234
+ if (velocity > 0 && nearStart && value < entryEdge && predicted >= entryEdge) {
235
+ return entryEdge;
236
+ }
237
+ }
238
+ if (currentMode === "absolute-above") {
239
+ const entryEdge = normEnd - ENTER_HYSTERESIS;
240
+ const nearEnd = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;
241
+ if (velocity < 0 && nearEnd && value > entryEdge && predicted <= entryEdge) {
242
+ return entryEdge;
243
+ }
244
+ }
245
+ if (currentMode === "sticky") {
246
+ const exitTopEdge = normStart - EXIT_HYSTERESIS;
247
+ const exitBottomEdge = normEnd + EXIT_HYSTERESIS;
248
+ const nearTop = Math.abs(value - exitTopEdge) <= PREDICT_EXIT_BAND;
249
+ if (velocity < 0 && nearTop && value > exitTopEdge && predicted <= exitTopEdge) {
250
+ return exitTopEdge;
251
+ }
252
+ const nearBottom = Math.abs(value - exitBottomEdge) <= PREDICT_EXIT_BAND;
253
+ if (velocity > 0 && nearBottom && value < exitBottomEdge && predicted >= exitBottomEdge) {
254
+ return exitBottomEdge;
255
+ }
256
+ }
257
+ return value;
258
+ }
259
+ function applyModeWithHandoff(nextMode) {
260
+ if (!stickySupported) {
261
+ stopHandoffAnimation();
262
+ mode.set(nextMode);
263
+ renderStyles();
264
+ return;
265
+ }
266
+ stopHandoffAnimation();
267
+ const prevRect = _internal.root.getBoundingClientRect();
268
+ mode.set(nextMode);
269
+ updateStyles();
270
+ const nextRect = _internal.root.getBoundingClientRect();
271
+ const deltaY = prevRect.top - nextRect.top;
272
+ if (Math.abs(deltaY) <= HANDOFF_MIN_DELTA_PX) {
273
+ handoffOffsetY.set(0);
274
+ renderStyles();
275
+ return;
276
+ }
277
+ if (Math.abs(latestScrollVelocity) >= HIGH_VELOCITY_SKIP_HANDOFF || Math.abs(deltaY) >= MAX_HANDOFF_DELTA_PX) {
278
+ settleHandoffOverFrames(deltaY, 2);
279
+ return;
280
+ }
281
+ handoffOffsetY.set(deltaY);
282
+ updateStyles();
283
+ const duration = getHandoffDuration(deltaY, latestScrollVelocity);
284
+ if (duration <= 0) {
285
+ settleHandoffOverFrames(deltaY, 1);
286
+ return;
287
+ }
288
+ handoffAnimation = animate([
289
+ [handoffOffsetY, 0, { duration, ease: HANDOFF_EASE }]
290
+ ]);
291
+ handoffAnimation.then(() => {
292
+ if (!handoffAnimation) return;
293
+ handoffAnimation = null;
294
+ handoffOffsetY.set(0);
295
+ renderStyles();
296
+ });
297
+ }
298
+ function syncFromScroll(value, allowHandoff) {
299
+ const clamped = Math.min(Math.max(value, 0), 1);
300
+ rawScrollProgress.set(clamped);
301
+ const normStart = normStartValue.get();
302
+ const normEnd = normEndValue.get();
303
+ const range = [normStart, normEnd];
304
+ const span = Math.max(normEnd - normStart, Number.EPSILON);
305
+ const normalizedProgress = Math.min(
306
+ Math.max((clamped - normStart) / span, 0),
307
+ 1
308
+ );
309
+ inRange.set(isInRange({ range, value: clamped }));
310
+ belowRange.set(clamped <= normStart);
311
+ aboveRange.set(clamped >= normEnd);
312
+ progress.set(normalizedProgress);
313
+ const decisionValue = getModeDecisionValue(
314
+ clamped,
315
+ normStart,
316
+ normEnd,
317
+ allowHandoff
318
+ );
319
+ const nextMode = getTargetMode(decisionValue, normStart, normEnd);
320
+ const currentMode = mode.get();
321
+ if (currentMode === "sticky" && nextMode !== "sticky" && allowHandoff) {
322
+ waitForAnimations(nextMode);
323
+ updateStyles();
324
+ return;
325
+ }
326
+ cancelPendingExit();
327
+ if (nextMode === currentMode) {
328
+ if (!allowHandoff) {
329
+ stopHandoffAnimation();
330
+ updateStyles();
331
+ }
332
+ return;
333
+ }
334
+ if (allowHandoff) {
335
+ applyModeWithHandoff(nextMode);
336
+ return;
337
+ }
338
+ commitModeImmediately(nextMode);
339
+ }
43
340
  createEffect(() => {
44
341
  const range = [_internal.start, _internal.end];
45
342
  const maxPages = parallax.maxPages;
46
343
  const normalizedRange = normalizeTuple(range, maxPages);
47
344
  const [normStart, normEnd] = normalizedRange;
48
- const transformer = transform(normalizedRange, [0, 1]);
345
+ normStartValue.set(normStart);
346
+ normEndValue.set(normEnd);
347
+ const initialValue = parallax.scrollYProgress.get();
348
+ syncFromScroll(initialValue, false);
349
+ renderStyles();
49
350
  const unsubscribe = parallax.scrollYProgress.on("change", (value) => {
50
- inRange.set(isInRange({ range: normalizedRange, value }));
51
- belowRange.set(value <= normStart);
52
- aboveRange.set(value >= normEnd);
53
- progress.set(transformer(value));
351
+ syncFromScroll(value, true);
54
352
  });
55
353
  return onCleanup(() => {
56
354
  unsubscribe();
57
355
  });
58
356
  });
59
- function updateStyles() {
60
- const s = styles.get();
61
- _internal.root.style.position = s.position;
62
- _internal.root.style.transform = s.transform;
63
- }
64
- function renderStyles() {
65
- frame.render(updateStyles);
66
- }
67
- function waitForAnimations() {
68
- const a = animations.get();
69
- const controller = new AbortController();
70
- abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {
71
- animations.set([]);
72
- renderStyles();
73
- });
74
- }
75
- const unsubStyles = styles.on("change", (_) => {
76
- if (progress.get() === 1 || progress.get() === 0)
77
- return waitForAnimations();
78
- animations.set([]);
357
+ const unsubHandoffOffset = handoffOffsetY.on("change", (_) => {
79
358
  renderStyles();
80
359
  });
81
360
  function _animate(...args) {
82
361
  const animation = animate(...args);
83
- animations.set([...animations.get(), animation]);
362
+ registerContentAnimation(animation);
84
363
  return animation;
85
364
  }
86
365
  onCleanup(() => {
87
- unsubStyles();
366
+ cancelPendingExit();
367
+ stopHandoffAnimation();
368
+ unsubHandoffOffset();
88
369
  });
89
370
  return [progress, { animate: _animate }];
90
371
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useParallaxStickyLayer.ts"],"names":["transform","isInRange","mTransform"],"mappings":"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","file":"useParallaxStickyLayer.js","sourcesContent":["import { onCleanup, createEffect, splitProps, mergeProps } from \"solid-js\";\nimport {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n motionValue,\n transformValue,\n transform as mTransform,\n frame,\n animate,\n type AnimationPlaybackControlsWithThen,\n} from \"motion\";\nimport { awaitAllAnimations } from \"@brytdesigns/web-component-core/animation\";\nimport { abortablePromise } from \"@brytdesigns/web-component-core/promise\";\nimport {\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport { useParallax } from \"./useParallax\";\nimport { normalizeTuple, isInRange } from \"../utils\";\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n start: number;\n end: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxStickyLayerContext = ReturnType<\n typeof initializeParallaxStickyLayerContext\n>;\n\nfunction initializeParallaxStickyLayerContext(props: CreateContextOptions) {\n const [_internal, _state] = splitProps(props, [\"root\", \"start\", \"end\"]);\n const parallax = useParallax(_internal.root);\n\n const progress = motionValue(-1);\n const inRange = motionValue(false);\n const belowRange = motionValue(false);\n const aboveRange = motionValue(false);\n\n const position = transformValue(() =>\n inRange.get() ? \"sticky\" : \"absolute\",\n );\n const transform = transformValue(() => {\n const isInRange = inRange.get();\n const isBelowRange = belowRange.get();\n const isAboveRange = aboveRange.get();\n if (isInRange) return \"none\";\n if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}vh)`;\n if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}vh)`;\n });\n const animations = motionValue<AnimationPlaybackControlsWithThen[]>([]);\n\n const styles = transformValue(() => ({\n position: position.get(),\n transform: transform.get(),\n }));\n\n _internal.root.style.top = \"0px\";\n _internal.root.style.right = \"0px\";\n _internal.root.style.bottom = \"0px\";\n _internal.root.style.left = \"0px\";\n _internal.root.style.height = `100dvh`;\n _internal.root.style.overflowX = \"hidden\";\n _internal.root.style.maxWidth = \"100%\";\n if (window.getComputedStyle(_internal.root).display === \"inline\") {\n _internal.root.style.display = \"block\";\n }\n\n createEffect(() => {\n const range = [_internal.start, _internal.end];\n const maxPages = parallax.maxPages;\n const normalizedRange = normalizeTuple(range as any, maxPages);\n const [normStart, normEnd] = normalizedRange;\n const transformer = mTransform(normalizedRange as any, [0, 1]);\n\n const unsubscribe = parallax.scrollYProgress.on(\"change\", (value) => {\n inRange.set(isInRange({ range: normalizedRange as any, value }));\n belowRange.set(value <= normStart);\n aboveRange.set(value >= normEnd);\n progress.set(transformer(value));\n });\n\n return onCleanup(() => {\n unsubscribe();\n });\n });\n\n function updateStyles() {\n const s = styles.get();\n _internal.root.style.position = s.position;\n _internal.root.style.transform = s.transform;\n }\n\n function renderStyles() {\n frame.render(updateStyles);\n }\n\n function waitForAnimations() {\n const a = animations.get();\n const controller = new AbortController();\n abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {\n animations.set([]);\n renderStyles();\n });\n }\n\n const unsubStyles = styles.on(\"change\", (_) => {\n if (progress.get() === 1 || progress.get() === 0)\n return waitForAnimations();\n animations.set([]);\n renderStyles();\n });\n\n function _animate(...args: Parameters<typeof animate>) {\n const animation = animate(...args);\n animations.set([...animations.get(), animation]);\n return animation;\n }\n\n onCleanup(() => {\n unsubStyles();\n });\n\n return [progress, { animate: _animate }] as const;\n}\n\nconst ParallaxStickyLayerContextState = createContext(\n initializeParallaxStickyLayerContext,\n);\n\nexport const provideParallaxStickyLayerContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): ParallaxStickyLayerContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(ParallaxStickyLayerContextState, props, element);\n};\n\nexport const useParallaxStickyLayerContext = (\n context: ParallaxStickyLayerContext,\n) => {\n return context;\n};\n\nexport const useParallaxStickyLayer = (\n element: HTMLElement & ICustomElement,\n) => {\n const context: ParallaxStickyLayerContext = consume(\n ParallaxStickyLayerContextState,\n element,\n );\n\n if (!context) {\n throw console.error(\n \"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n );\n }\n\n return useParallaxStickyLayerContext(context);\n};\n\nexport const withParallaxStickyLayerContext = createWithElementContext<\n typeof ParallaxStickyLayerContextState,\n ParallaxStickyLayerContext\n>(ParallaxStickyLayerContextState);\n\nexport const getParallaxStickyLayerContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxStickyLayerContext>(\n ParallaxStickyLayerContextState,\n element,\n );\n return useParallaxStickyLayerContext(context);\n};\n"]}
1
+ {"version":3,"sources":["../../../src/hooks/useParallaxStickyLayer.ts"],"names":[],"mappings":";;;;;;;AAkCA,MAAM,YAAe,GAAA,SAAA;AACrB,MAAM,gBAAmB,GAAA,IAAA;AACzB,MAAM,eAAkB,GAAA,IAAA;AACxB,MAAM,oBAAuB,GAAA,IAAA;AAC7B,MAAM,oBAAuB,GAAA,GAAA;AAC7B,MAAM,oBAAuB,GAAA,EAAA;AAC7B,MAAM,kBAAqB,GAAA,IAAA;AAC3B,MAAM,iBAAoB,GAAA,IAAA;AAC1B,MAAM,oBAAuB,GAAA,IAAA;AAC7B,MAAM,qBAAwB,GAAA,IAAA;AAC9B,MAAM,0BAA6B,GAAA,IAAA;AACnC,MAAM,wBAA2B,GAAA,EAAA;AACjC,MAAM,oBAAuB,GAAA,EAAA;AAE7B,SAAS,sBAAyB,GAAA;AACjC,EAAA,IAAI,OAAO,GAAQ,KAAA,WAAA,IAAe,OAAO,GAAA,CAAI,aAAa,UAAY,EAAA;AACrE,IAAO,OAAA,KAAA;AAAA;AAGR,EACC,OAAA,GAAA,CAAI,SAAS,UAAY,EAAA,QAAQ,KACjC,GAAI,CAAA,QAAA,CAAS,YAAY,gBAAgB,CAAA;AAE3C;AAEA,SAAS,qCAAqC,KAA6B,EAAA;AAC1E,EAAM,MAAA,CAAC,SAAW,EAAA,MAAM,CAAI,GAAA,UAAA,CAAW,OAAO,CAAC,MAAA,EAAQ,OAAS,EAAA,KAAK,CAAC,CAAA;AACtE,EAAM,MAAA,QAAA,GAAW,WAAY,CAAA,SAAA,CAAU,IAAI,CAAA;AAC3C,EAAA,MAAM,kBAAkB,sBAAuB,EAAA;AAE/C,EAAM,MAAA,QAAA,GAAW,YAAY,EAAE,CAAA;AAC/B,EAAM,MAAA,iBAAA,GAAoB,YAAY,EAAE,CAAA;AACxC,EAAM,MAAA,OAAA,GAAU,YAAY,KAAK,CAAA;AACjC,EAAM,MAAA,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,EAAM,MAAA,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,EAAM,MAAA,cAAA,GAAiB,YAAY,CAAC,CAAA;AACpC,EAAM,MAAA,YAAA,GAAe,YAAY,CAAC,CAAA;AAClC,EAAM,MAAA,IAAA,GAAO,YAAuB,gBAAgB,CAAA;AACpD,EAAM,MAAA,cAAA,GAAiB,YAAY,CAAC,CAAA;AAEpC,EAAM,MAAA,uBAAA,uBAA8B,GAAuC,EAAA;AAC3E,EAAA,IAAI,gBAA6D,GAAA,IAAA;AACjE,EAAA,IAAI,WAA6B,GAAA,IAAA;AACjC,EAAA,IAAI,eAAiC,GAAA,IAAA;AACrC,EAAA,IAAI,kBAAqB,GAAA,CAAA;AACzB,EAAA,IAAI,eAAoC,GAAA,IAAA;AACxC,EAAA,IAAI,qBAAwB,GAAA,CAAA;AAC5B,EAAA,IAAI,oBAAuB,GAAA,CAAA;AAC3B,EAAA,IAAI,eAAkB,GAAA,KAAA;AACtB,EAAA,IAAI,oBAAuB,GAAA,CAAA;AAE3B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,GAAM,GAAA,KAAA;AAC3B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,KAAQ,GAAA,KAAA;AAC7B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,MAAS,GAAA,KAAA;AAC9B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,IAAO,GAAA,KAAA;AAC5B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,MAAS,GAAA,CAAA,MAAA,CAAA;AAC9B,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,SAAY,GAAA,QAAA;AACjC,EAAU,SAAA,CAAA,IAAA,CAAK,MAAM,QAAW,GAAA,MAAA;AAChC,EAAA,IAAI,OAAO,gBAAiB,CAAA,SAAA,CAAU,IAAI,CAAA,CAAE,YAAY,QAAU,EAAA;AACjE,IAAU,SAAA,CAAA,IAAA,CAAK,MAAM,OAAU,GAAA,OAAA;AAAA;AAGhC,EAAA,SAAS,YAAe,GAAA;AACvB,IAAA,IAAI,CAAC,eAAiB,EAAA;AACrB,MAAM,MAAA,SAAA,GAAY,eAAe,GAAI,EAAA;AACrC,MAAM,MAAA,OAAA,GAAU,aAAa,GAAI,EAAA;AACjC,MAAM,MAAA,GAAA,GAAM,kBAAkB,GAAI,EAAA;AAClC,MAAA,MAAM,OAAO,IAAK,CAAA,GAAA,CAAI,OAAU,GAAA,SAAA,EAAW,OAAO,OAAO,CAAA;AACzD,MAAM,MAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAA,CAAK,MAAM,SAAa,IAAA,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3D,MAAA,MAAM,QAAQ,SAAU,CAAA,KAAA,GAAQ,IAAI,CAAK,IAAA,SAAA,CAAU,MAAM,SAAU,CAAA,KAAA,CAAA;AAEnE,MAAU,SAAA,CAAA,IAAA,CAAK,MAAM,QAAW,GAAA,UAAA;AAChC,MAAA,SAAA,CAAU,IAAK,CAAA,KAAA,CAAM,SAAY,GAAA,CAAA,eAAA,EAAkB,QAAQ,GAAG,CAAA,GAAA,CAAA;AAC9D,MAAA;AAAA;AAGD,IAAM,MAAA,WAAA,GAAc,KAAK,GAAI,EAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,eAAe,GAAI,EAAA;AAClC,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,MAAM,CAAK,IAAA,GAAA;AAEtC,IAAA,IAAI,gBAAgB,QAAU,EAAA;AAC7B,MAAU,SAAA,CAAA,IAAA,CAAK,MAAM,QAAW,GAAA,QAAA;AAChC,MAAA,SAAA,CAAU,KAAK,KAAM,CAAA,SAAA,GAAY,SAC9B,GAAA,CAAA,eAAA,EAAkB,MAAM,CACxB,GAAA,CAAA,GAAA,MAAA;AACH,MAAA;AAAA;AAGD,IAAA,MAAM,aACL,GAAA,WAAA,KAAgB,gBACb,GAAA,CAAA,eAAA,EAAA,CAAmB,SAAU,CAAA,KAAA,GAAQ,CAAK,IAAA,GAAG,CAC7C,GAAA,CAAA,GAAA,CAAA,eAAA,EAAA,CAAmB,SAAU,CAAA,GAAA,GAAM,KAAK,GAAG,CAAA,GAAA,CAAA;AAE/C,IAAU,SAAA,CAAA,IAAA,CAAK,MAAM,QAAW,GAAA,UAAA;AAChC,IAAU,SAAA,CAAA,IAAA,CAAK,MAAM,SAAY,GAAA,SAAA,GAC9B,GAAG,aAAa,CAAA,gBAAA,EAAmB,MAAM,CACzC,GAAA,CAAA,GAAA,aAAA;AAAA;AAGJ,EAAA,SAAS,YAAe,GAAA;AACvB,IAAA,KAAA,CAAM,OAAO,YAAY,CAAA;AAAA;AAG1B,EAAA,SAAS,oBAAuB,GAAA;AAC/B,IAAA,gBAAA,EAAkB,IAAK,EAAA;AACvB,IAAmB,gBAAA,GAAA,IAAA;AACnB,IAAA,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA;AAGrB,EAAA,SAAS,oBAAuB,GAAA;AAC/B,IAAA,IAAI,gBAAgB,IAAM,EAAA;AACzB,MAAA,MAAA,CAAO,qBAAqB,WAAW,CAAA;AACvC,MAAc,WAAA,GAAA,IAAA;AAAA;AAEf,IAAA,IAAI,oBAAoB,IAAM,EAAA;AAC7B,MAAA,MAAA,CAAO,aAAa,eAAe,CAAA;AACnC,MAAkB,eAAA,GAAA,IAAA;AAAA;AACnB;AAGD,EAAA,SAAS,uBAA0B,GAAA;AAClC,IAAA,KAAA,MAAW,aAAa,uBAAyB,EAAA;AAChD,MAAI,IAAA,SAAA,CAAU,UAAU,SAAW,EAAA;AAClC,QAAA,uBAAA,CAAwB,OAAO,SAAS,CAAA;AAAA;AACzC;AACD;AAGD,EAAA,SAAS,0BAA6B,GAAA;AACrC,IAAwB,uBAAA,EAAA;AACxB,IAAA,OAAO,wBAAwB,IAAO,GAAA,CAAA;AAAA;AAGvC,EAAA,SAAS,yBACR,SACC,EAAA;AACD,IAAA,uBAAA,CAAwB,IAAI,SAAS,CAAA;AACrC,IAAU,SAAA,CAAA,IAAA;AAAA,MACT,MAAM;AACL,QAAA,uBAAA,CAAwB,OAAO,SAAS,CAAA;AAAA,OACzC;AAAA,MACA,MAAM;AACL,QAAA,uBAAA,CAAwB,OAAO,SAAS,CAAA;AAAA;AACzC,KACD;AAAA;AAGD,EAAS,SAAA,kBAAA,CAAmB,QAAgB,QAAkB,EAAA;AAC7D,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,GAAA,CAAI,QAAQ,CAAA;AAC/B,IAAI,IAAA,KAAA,IAAS,uBAA8B,OAAA,CAAA;AAE3C,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,EAAM,IAAK,CAAA,GAAA,CAAI,IAAM,EAAA,IAAA,CAAK,GAAI,CAAA,MAAM,CAAI,GAAA,IAAI,CAAC,CAAA;AACzE,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,MAAM,CAAC,CAAA;AAC3C,IAAA,OAAO,IAAK,CAAA,GAAA,CAAI,IAAM,EAAA,UAAA,GAAa,aAAa,IAAI,CAAA;AAAA;AAGrD,EAAS,SAAA,uBAAA,CAAwB,QAAgB,UAAoB,EAAA;AACpE,IAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AACzB,IAAa,YAAA,EAAA;AAEb,IAAA,IAAI,eAAkB,GAAA,IAAA,CAAK,GAAI,CAAA,UAAA,EAAY,CAAC,CAAA;AAC5C,IAAA,MAAM,SAAS,MAAM;AACpB,MAAmB,eAAA,IAAA,CAAA;AACnB,MAAA,IAAI,mBAAmB,CAAG,EAAA;AACzB,QAAA,cAAA,CAAe,IAAI,CAAC,CAAA;AACpB,QAAa,YAAA,EAAA;AACb,QAAA;AAAA;AAED,MAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,KACpB;AAEA,IAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA;AAGpB,EAAA,SAAS,iBAAoB,GAAA;AAC5B,IAAsB,kBAAA,IAAA,CAAA;AACtB,IAAkB,eAAA,GAAA,IAAA;AAClB,IAAqB,oBAAA,EAAA;AAAA;AAGtB,EAAA,SAAS,sBAAsB,QAAqB,EAAA;AACnD,IAAqB,oBAAA,EAAA;AACrB,IAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,IAAa,YAAA,EAAA;AAAA;AAGd,EAAA,SAAS,kBAAkB,QAAqB,EAAA;AAC/C,IAAA,IACC,eAAoB,KAAA,QAAA,KACnB,WAAgB,KAAA,IAAA,IAAQ,oBAAoB,IAC5C,CAAA,EAAA;AACD,MAAA;AAAA;AAGD,IAAkB,iBAAA,EAAA;AAClB,IAAkB,eAAA,GAAA,QAAA;AAClB,IAAA,MAAM,OAAU,GAAA,kBAAA;AAEhB,IAAA,MAAM,eAAe,MAAM;AAC1B,MAAA,IAAI,YAAY,kBAAoB,EAAA;AACpC,MAAqB,oBAAA,EAAA;AACrB,MAAkB,eAAA,GAAA,IAAA;AAElB,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,kBAAkB,GAAI,EAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAC/D,MAAA,MAAM,UAAa,GAAA,aAAA;AAAA,QAClB,MAAA;AAAA,QACA,eAAe,GAAI,EAAA;AAAA,QACnB,aAAa,GAAI;AAAA,OAClB;AACA,MAAA,IAAI,eAAe,QAAU,EAAA;AAE7B,MAAA,qBAAA,CAAsB,QAAQ,CAAA;AAAA,KAC/B;AAEA,IAAI,IAAA,CAAC,4BAA8B,EAAA;AAClC,MAAa,YAAA,EAAA;AACb,MAAA;AAAA;AAGD,IAAA,MAAM,OAAO,MAAM;AAClB,MAAA,IAAI,YAAY,kBAAoB,EAAA;AACpC,MAAI,IAAA,CAAC,4BAA8B,EAAA;AAClC,QAAa,YAAA,EAAA;AACb,QAAA;AAAA;AAGD,MAAc,WAAA,GAAA,MAAA,CAAO,sBAAsB,IAAI,CAAA;AAAA,KAChD;AAEA,IAAkB,eAAA,GAAA,MAAA,CAAO,WAAW,MAAM;AACzC,MAAa,YAAA,EAAA;AAAA,OACX,oBAAoB,CAAA;AACvB,IAAc,WAAA,GAAA,MAAA,CAAO,sBAAsB,IAAI,CAAA;AAAA;AAGhD,EAAS,SAAA,aAAA,CAAc,KAAe,EAAA,SAAA,EAAmB,OAAiB,EAAA;AACzE,IAAA,IAAI,CAAC,eAAiB,EAAA;AACrB,MAAI,IAAA,KAAA,IAAS,WAAkB,OAAA,gBAAA;AAC/B,MAAI,IAAA,KAAA,IAAS,SAAgB,OAAA,gBAAA;AAC7B,MAAO,OAAA,gBAAA;AAAA;AAGR,IAAM,MAAA,OAAA,GAAU,KAAK,GAAI,EAAA;AACzB,IAAA,IAAI,YAAY,QAAU,EAAA;AACzB,MAAI,IAAA,KAAA,GAAQ,SAAY,GAAA,eAAA,EAAwB,OAAA,gBAAA;AAChD,MAAI,IAAA,KAAA,GAAQ,OAAU,GAAA,eAAA,EAAwB,OAAA,gBAAA;AAC9C,MAAO,OAAA,QAAA;AAAA;AAGR,IAAA,IAAI,YAAY,gBAAkB,EAAA;AACjC,MAAI,IAAA,KAAA,IAAS,SAAY,GAAA,gBAAA,EAAyB,OAAA,QAAA;AAClD,MAAO,OAAA,gBAAA;AAAA;AAGR,IAAI,IAAA,KAAA,IAAS,OAAU,GAAA,gBAAA,EAAyB,OAAA,QAAA;AAChD,IAAO,OAAA,gBAAA;AAAA;AAGR,EAAA,SAAS,oBACR,CAAA,KAAA,EACA,SACA,EAAA,OAAA,EACA,eACC,EAAA;AACD,IAAM,MAAA,GAAA,GAAM,YAAY,GAAI,EAAA;AAC5B,IAAA,IAAI,QAAW,GAAA,CAAA;AAEf,IAAA,IAAI,eAAiB,EAAA;AACpB,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,GAAM,sBAAsB,CAAC,CAAA;AACtD,MAAA,QAAA,GAAA,CAAY,QAAQ,qBAAyB,IAAA,OAAA;AAAA;AAG9C,IAAwB,qBAAA,GAAA,KAAA;AACxB,IAAuB,oBAAA,GAAA,GAAA;AACvB,IAAkB,eAAA,GAAA,IAAA;AAClB,IAAuB,oBAAA,GAAA,QAAA;AAEvB,IAAA,IAAI,CAAC,eAAmB,IAAA,IAAA,CAAK,GAAI,CAAA,QAAQ,IAAI,oBAAsB,EAAA;AAClE,MAAO,OAAA,KAAA;AAAA;AAGR,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,GAAA,CAAI,QAAQ,CAAA;AAC/B,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,4BAA4B,CAAC,CAAA;AACjE,IAAM,MAAA,WAAA,GACL,oBACA,GAAA,UAAA,IAAc,wBAA2B,GAAA,oBAAA,CAAA;AAE1C,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,QAAQ,QAAW,GAAA,WAAA,EAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAEzE,IAAM,MAAA,WAAA,GAAc,KAAK,GAAI,EAAA;AAC7B,IAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACrC,MAAA,MAAM,YAAY,SAAY,GAAA,gBAAA;AAC9B,MAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,SAAS,CAAK,IAAA,kBAAA;AACjD,MAAA,IACC,WAAW,CACX,IAAA,SAAA,IACA,KAAQ,GAAA,SAAA,IACR,aAAa,SACZ,EAAA;AACD,QAAO,OAAA,SAAA;AAAA;AACR;AAGD,IAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACrC,MAAA,MAAM,YAAY,OAAU,GAAA,gBAAA;AAC5B,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,SAAS,CAAK,IAAA,kBAAA;AAC/C,MAAA,IACC,WAAW,CACX,IAAA,OAAA,IACA,KAAQ,GAAA,SAAA,IACR,aAAa,SACZ,EAAA;AACD,QAAO,OAAA,SAAA;AAAA;AACR;AAGD,IAAA,IAAI,gBAAgB,QAAU,EAAA;AAC7B,MAAA,MAAM,cAAc,SAAY,GAAA,eAAA;AAChC,MAAA,MAAM,iBAAiB,OAAU,GAAA,eAAA;AAEjC,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,WAAW,CAAK,IAAA,iBAAA;AACjD,MAAA,IACC,WAAW,CACX,IAAA,OAAA,IACA,KAAQ,GAAA,WAAA,IACR,aAAa,WACZ,EAAA;AACD,QAAO,OAAA,WAAA;AAAA;AAGR,MAAA,MAAM,UAAa,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,cAAc,CAAK,IAAA,iBAAA;AACvD,MAAA,IACC,WAAW,CACX,IAAA,UAAA,IACA,KAAQ,GAAA,cAAA,IACR,aAAa,cACZ,EAAA;AACD,QAAO,OAAA,cAAA;AAAA;AACR;AAGD,IAAO,OAAA,KAAA;AAAA;AAGR,EAAA,SAAS,qBAAqB,QAAqB,EAAA;AAClD,IAAA,IAAI,CAAC,eAAiB,EAAA;AACrB,MAAqB,oBAAA,EAAA;AACrB,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAa,YAAA,EAAA;AACb,MAAA;AAAA;AAGD,IAAqB,oBAAA,EAAA;AAErB,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,IAAA,CAAK,qBAAsB,EAAA;AACtD,IAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,IAAa,YAAA,EAAA;AAEb,IAAM,MAAA,QAAA,GAAW,SAAU,CAAA,IAAA,CAAK,qBAAsB,EAAA;AACtD,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,GAAA,GAAM,QAAS,CAAA,GAAA;AACvC,IAAA,IAAI,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA,IAAK,oBAAsB,EAAA;AAC7C,MAAA,cAAA,CAAe,IAAI,CAAC,CAAA;AACpB,MAAa,YAAA,EAAA;AACb,MAAA;AAAA;AAGD,IACC,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA,IAAK,8BAClC,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA,IAAK,oBACnB,EAAA;AACD,MAAA,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACjC,MAAA;AAAA;AAGD,IAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AACzB,IAAa,YAAA,EAAA;AACb,IAAM,MAAA,QAAA,GAAW,kBAAmB,CAAA,MAAA,EAAQ,oBAAoB,CAAA;AAChE,IAAA,IAAI,YAAY,CAAG,EAAA;AAClB,MAAA,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACjC,MAAA;AAAA;AAGD,IAAA,gBAAA,GAAmB,OAAQ,CAAA;AAAA,MAC1B,CAAC,cAAgB,EAAA,CAAA,EAAG,EAAE,QAAU,EAAA,IAAA,EAAM,cAAc;AAAA,KACpD,CAAA;AACD,IAAA,gBAAA,CAAiB,KAAK,MAAM;AAC3B,MAAA,IAAI,CAAC,gBAAkB,EAAA;AACvB,MAAmB,gBAAA,GAAA,IAAA;AACnB,MAAA,cAAA,CAAe,IAAI,CAAC,CAAA;AACpB,MAAa,YAAA,EAAA;AAAA,KACb,CAAA;AAAA;AAGF,EAAS,SAAA,cAAA,CAAe,OAAe,YAAuB,EAAA;AAC7D,IAAM,MAAA,OAAA,GAAU,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,KAAO,EAAA,CAAC,GAAG,CAAC,CAAA;AAC9C,IAAA,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAE7B,IAAM,MAAA,SAAA,GAAY,eAAe,GAAI,EAAA;AACrC,IAAM,MAAA,OAAA,GAAU,aAAa,GAAI,EAAA;AACjC,IAAM,MAAA,KAAA,GAAQ,CAAC,SAAA,EAAW,OAAO,CAAA;AACjC,IAAA,MAAM,OAAO,IAAK,CAAA,GAAA,CAAI,OAAU,GAAA,SAAA,EAAW,OAAO,OAAO,CAAA;AACzD,IAAA,MAAM,qBAAqB,IAAK,CAAA,GAAA;AAAA,MAC/B,IAAK,CAAA,GAAA,CAAA,CAAK,OAAU,GAAA,SAAA,IAAa,MAAM,CAAC,CAAA;AAAA,MACxC;AAAA,KACD;AAEA,IAAA,OAAA,CAAQ,IAAI,SAAU,CAAA,EAAE,OAAO,KAAO,EAAA,OAAA,EAAS,CAAC,CAAA;AAChD,IAAW,UAAA,CAAA,GAAA,CAAI,WAAW,SAAS,CAAA;AACnC,IAAW,UAAA,CAAA,GAAA,CAAI,WAAW,OAAO,CAAA;AACjC,IAAA,QAAA,CAAS,IAAI,kBAAkB,CAAA;AAE/B,IAAA,MAAM,aAAgB,GAAA,oBAAA;AAAA,MACrB,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD;AACA,IAAA,MAAM,QAAW,GAAA,aAAA,CAAc,aAAe,EAAA,SAAA,EAAW,OAAO,CAAA;AAChE,IAAM,MAAA,WAAA,GAAc,KAAK,GAAI,EAAA;AAE7B,IAAA,IAAI,WAAgB,KAAA,QAAA,IAAY,QAAa,KAAA,QAAA,IAAY,YAAc,EAAA;AACtE,MAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,MAAa,YAAA,EAAA;AACb,MAAA;AAAA;AAGD,IAAkB,iBAAA,EAAA;AAClB,IAAA,IAAI,aAAa,WAAa,EAAA;AAC7B,MAAA,IAAI,CAAC,YAAc,EAAA;AAClB,QAAqB,oBAAA,EAAA;AACrB,QAAa,YAAA,EAAA;AAAA;AAEd,MAAA;AAAA;AAGD,IAAA,IAAI,YAAc,EAAA;AACjB,MAAA,oBAAA,CAAqB,QAAQ,CAAA;AAC7B,MAAA;AAAA;AAGD,IAAA,qBAAA,CAAsB,QAAQ,CAAA;AAAA;AAG/B,EAAA,YAAA,CAAa,MAAM;AAClB,IAAA,MAAM,KAAQ,GAAA,CAAC,SAAU,CAAA,KAAA,EAAO,UAAU,GAAG,CAAA;AAC7C,IAAA,MAAM,WAAW,QAAS,CAAA,QAAA;AAC1B,IAAM,MAAA,eAAA,GAAkB,cAAe,CAAA,KAAA,EAAc,QAAQ,CAAA;AAC7D,IAAM,MAAA,CAAC,SAAW,EAAA,OAAO,CAAI,GAAA,eAAA;AAC7B,IAAA,cAAA,CAAe,IAAI,SAAS,CAAA;AAC5B,IAAA,YAAA,CAAa,IAAI,OAAO,CAAA;AAExB,IAAM,MAAA,YAAA,GAAe,QAAS,CAAA,eAAA,CAAgB,GAAI,EAAA;AAClD,IAAA,cAAA,CAAe,cAAc,KAAK,CAAA;AAClC,IAAa,YAAA,EAAA;AAEb,IAAA,MAAM,cAAc,QAAS,CAAA,eAAA,CAAgB,EAAG,CAAA,QAAA,EAAU,CAAC,KAAU,KAAA;AACpE,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAAA,KAC1B,CAAA;AAED,IAAA,OAAO,UAAU,MAAM;AACtB,MAAY,WAAA,EAAA;AAAA,KACZ,CAAA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,kBAAqB,GAAA,cAAA,CAAe,EAAG,CAAA,QAAA,EAAU,CAAC,CAAM,KAAA;AAC7D,IAAa,YAAA,EAAA;AAAA,GACb,CAAA;AAED,EAAA,SAAS,YAAY,IAAkC,EAAA;AACtD,IAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,GAAG,IAAI,CAAA;AACjC,IAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,IAAO,OAAA,SAAA;AAAA;AAGR,EAAA,SAAA,CAAU,MAAM;AACf,IAAkB,iBAAA,EAAA;AAClB,IAAqB,oBAAA,EAAA;AACrB,IAAmB,kBAAA,EAAA;AAAA,GACnB,CAAA;AAED,EAAA,OAAO,CAAC,QAAA,EAAU,EAAE,OAAA,EAAS,UAAU,CAAA;AACxC;AAEA,MAAM,+BAAkC,GAAA,aAAA;AAAA,EACvC;AACD,CAAA;AAEa,MAAA,iCAAA,GAAoC,CAChD,YAAA,EACA,OACgC,KAAA;AAChC,EAAA,MAAM,QAAQ,UAAW,CAAA,YAAA,EAAc,EAAE,IAAA,EAAM,SAAS,CAAA;AACxD,EAAO,OAAA,OAAA,CAAQ,+BAAiC,EAAA,KAAA,EAAO,OAAO,CAAA;AAC/D;AAEa,MAAA,6BAAA,GAAgC,CAC5C,OACI,KAAA;AACJ,EAAO,OAAA,OAAA;AACR;AAEa,MAAA,sBAAA,GAAyB,CACrC,OACI,KAAA;AACJ,EAAA,MAAM,OAAsC,GAAA,OAAA;AAAA,IAC3C,+BAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,IAAI,CAAC,OAAS,EAAA;AACb,IAAA,MAAM,OAAQ,CAAA,KAAA;AAAA,MACb;AAAA,KACD;AAAA;AAGD,EAAA,OAAO,8BAA8B,OAAO,CAAA;AAC7C;AAEa,MAAA,8BAAA,GAAiC,yBAG5C,+BAA+B;AAEpB,MAAA,6BAAA,GAAgC,CAAC,OAAqB,KAAA;AAClE,EAAA,MAAM,OAAU,GAAA,sBAAA;AAAA,IACf,+BAAA;AAAA,IACA;AAAA,GACD;AACA,EAAA,OAAO,8BAA8B,OAAO,CAAA;AAC7C","file":"useParallaxStickyLayer.js","sourcesContent":["import {\n\tcreateWithElementContext,\n\tgetContextFromProvider,\n} from \"@brytdesigns/web-component-core/utils\";\nimport {\n\tconsume,\n\tcreateContext,\n\ttype ICustomElement,\n\tprovide,\n} from \"component-register\";\nimport {\n\ttype AnimationPlaybackControlsWithThen,\n\tanimate,\n\tframe,\n\tmotionValue,\n} from \"motion\";\nimport { createEffect, mergeProps, onCleanup, splitProps } from \"solid-js\";\nimport { isInRange, normalizeTuple } from \"../utils\";\nimport { useParallax } from \"./useParallax\";\n\ntype CreateContextOptions = {\n\troot: HTMLElement & ICustomElement;\n\tstart: number;\n\tend: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype ParallaxStickyLayerContext = ReturnType<\n\ttypeof initializeParallaxStickyLayerContext\n>;\n\ntype LayerMode = \"absolute-below\" | \"sticky\" | \"absolute-above\";\n\nconst HANDOFF_EASE = \"easeOut\";\nconst ENTER_HYSTERESIS = 0.001;\nconst EXIT_HYSTERESIS = 0.005;\nconst HANDOFF_MIN_DELTA_PX = 0.75;\nconst EXIT_WAIT_TIMEOUT_MS = 500;\nconst PREDICT_LOOKAHEAD_MS = 28;\nconst PREDICT_ENTER_BAND = 0.006;\nconst PREDICT_EXIT_BAND = 0.01;\nconst PREDICT_MIN_VELOCITY = 0.0004;\nconst LOW_VELOCITY_NO_TWEEN = 0.001;\nconst HIGH_VELOCITY_SKIP_HANDOFF = 0.01;\nconst MAX_PREDICT_LOOKAHEAD_MS = 60;\nconst MAX_HANDOFF_DELTA_PX = 56;\n\nfunction supportsStickyPosition() {\n\tif (typeof CSS === \"undefined\" || typeof CSS.supports !== \"function\") {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tCSS.supports(\"position\", \"sticky\") ||\n\t\tCSS.supports(\"position\", \"-webkit-sticky\")\n\t);\n}\n\nfunction initializeParallaxStickyLayerContext(props: CreateContextOptions) {\n\tconst [_internal, _state] = splitProps(props, [\"root\", \"start\", \"end\"]);\n\tconst parallax = useParallax(_internal.root);\n\tconst stickySupported = supportsStickyPosition();\n\n\tconst progress = motionValue(-1);\n\tconst rawScrollProgress = motionValue(-1);\n\tconst inRange = motionValue(false);\n\tconst belowRange = motionValue(false);\n\tconst aboveRange = motionValue(false);\n\tconst normStartValue = motionValue(0);\n\tconst normEndValue = motionValue(1);\n\tconst mode = motionValue<LayerMode>(\"absolute-below\");\n\tconst handoffOffsetY = motionValue(0);\n\n\tconst activeContentAnimations = new Set<AnimationPlaybackControlsWithThen>();\n\tlet handoffAnimation: AnimationPlaybackControlsWithThen | null = null;\n\tlet exitWaitRaf: number | null = null;\n\tlet exitWaitTimeout: number | null = null;\n\tlet pendingExitVersion = 0;\n\tlet pendingExitMode: LayerMode | null = null;\n\tlet lastScrollSampleValue = 0;\n\tlet lastScrollSampleTime = 0;\n\tlet hasScrollSample = false;\n\tlet latestScrollVelocity = 0;\n\n\t_internal.root.style.top = \"0px\";\n\t_internal.root.style.right = \"0px\";\n\t_internal.root.style.bottom = \"0px\";\n\t_internal.root.style.left = \"0px\";\n\t_internal.root.style.height = `100dvh`;\n\t_internal.root.style.overflowX = \"hidden\";\n\t_internal.root.style.maxWidth = \"100%\";\n\tif (window.getComputedStyle(_internal.root).display === \"inline\") {\n\t\t_internal.root.style.display = \"block\";\n\t}\n\n\tfunction updateStyles() {\n\t\tif (!stickySupported) {\n\t\t\tconst normStart = normStartValue.get();\n\t\t\tconst normEnd = normEndValue.get();\n\t\t\tconst raw = rawScrollProgress.get();\n\t\t\tconst span = Math.max(normEnd - normStart, Number.EPSILON);\n\t\t\tconst t = Math.min(Math.max((raw - normStart) / span, 0), 1);\n\t\t\tconst pageY = _internal.start - 1 + t * (_internal.end - _internal.start);\n\n\t\t\t_internal.root.style.position = \"absolute\";\n\t\t\t_internal.root.style.transform = `translate(0px, ${pageY * 100}vh)`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentMode = mode.get();\n\t\tconst offset = handoffOffsetY.get();\n\t\tconst hasOffset = Math.abs(offset) >= 0.1;\n\n\t\tif (currentMode === \"sticky\") {\n\t\t\t_internal.root.style.position = \"sticky\";\n\t\t\t_internal.root.style.transform = hasOffset\n\t\t\t\t? `translate(0px, ${offset}px)`\n\t\t\t\t: \"none\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst baseTransform =\n\t\t\tcurrentMode === \"absolute-below\"\n\t\t\t\t? `translate(0px, ${(_internal.start - 1) * 100}vh)`\n\t\t\t\t: `translate(0px, ${(_internal.end - 1) * 100}vh)`;\n\n\t\t_internal.root.style.position = \"absolute\";\n\t\t_internal.root.style.transform = hasOffset\n\t\t\t? `${baseTransform} translate(0px, ${offset}px)`\n\t\t\t: baseTransform;\n\t}\n\n\tfunction renderStyles() {\n\t\tframe.render(updateStyles);\n\t}\n\n\tfunction stopHandoffAnimation() {\n\t\thandoffAnimation?.stop();\n\t\thandoffAnimation = null;\n\t\thandoffOffsetY.set(0);\n\t}\n\n\tfunction clearExitWaitHandles() {\n\t\tif (exitWaitRaf !== null) {\n\t\t\twindow.cancelAnimationFrame(exitWaitRaf);\n\t\t\texitWaitRaf = null;\n\t\t}\n\t\tif (exitWaitTimeout !== null) {\n\t\t\twindow.clearTimeout(exitWaitTimeout);\n\t\t\texitWaitTimeout = null;\n\t\t}\n\t}\n\n\tfunction pruneFinishedAnimations() {\n\t\tfor (const animation of activeContentAnimations) {\n\t\t\tif (animation.state !== \"running\") {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction hasActiveContentAnimations() {\n\t\tpruneFinishedAnimations();\n\t\treturn activeContentAnimations.size > 0;\n\t}\n\n\tfunction registerContentAnimation(\n\t\tanimation: AnimationPlaybackControlsWithThen,\n\t) {\n\t\tactiveContentAnimations.add(animation);\n\t\tanimation.then(\n\t\t\t() => {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tactiveContentAnimations.delete(animation);\n\t\t\t},\n\t\t);\n\t}\n\n\tfunction getHandoffDuration(deltaY: number, velocity: number) {\n\t\tconst speed = Math.abs(velocity);\n\t\tif (speed <= LOW_VELOCITY_NO_TWEEN) return 0;\n\n\t\tconst byDistance = Math.min(0.12, Math.max(0.05, Math.abs(deltaY) / 1400));\n\t\tconst speedScale = Math.min(speed / 0.01, 1);\n\t\treturn Math.max(0.04, byDistance - speedScale * 0.02);\n\t}\n\n\tfunction settleHandoffOverFrames(deltaY: number, frameCount: number) {\n\t\thandoffOffsetY.set(deltaY);\n\t\tupdateStyles();\n\n\t\tlet remainingFrames = Math.max(frameCount, 1);\n\t\tconst settle = () => {\n\t\t\tremainingFrames -= 1;\n\t\t\tif (remainingFrames <= 0) {\n\t\t\t\thandoffOffsetY.set(0);\n\t\t\t\tupdateStyles();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tframe.render(settle);\n\t\t};\n\n\t\tframe.render(settle);\n\t}\n\n\tfunction cancelPendingExit() {\n\t\tpendingExitVersion += 1;\n\t\tpendingExitMode = null;\n\t\tclearExitWaitHandles();\n\t}\n\n\tfunction commitModeImmediately(nextMode: LayerMode) {\n\t\tstopHandoffAnimation();\n\t\tmode.set(nextMode);\n\t\tupdateStyles();\n\t}\n\n\tfunction waitForAnimations(nextMode: LayerMode) {\n\t\tif (\n\t\t\tpendingExitMode === nextMode &&\n\t\t\t(exitWaitRaf !== null || exitWaitTimeout !== null)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tcancelPendingExit();\n\t\tpendingExitMode = nextMode;\n\t\tconst version = pendingExitVersion;\n\n\t\tconst completeExit = () => {\n\t\t\tif (version !== pendingExitVersion) return;\n\t\t\tclearExitWaitHandles();\n\t\t\tpendingExitMode = null;\n\n\t\t\tconst latest = Math.min(Math.max(rawScrollProgress.get(), 0), 1);\n\t\t\tconst stableMode = getTargetMode(\n\t\t\t\tlatest,\n\t\t\t\tnormStartValue.get(),\n\t\t\t\tnormEndValue.get(),\n\t\t\t);\n\t\t\tif (stableMode !== nextMode) return;\n\n\t\t\tcommitModeImmediately(nextMode);\n\t\t};\n\n\t\tif (!hasActiveContentAnimations()) {\n\t\t\tcompleteExit();\n\t\t\treturn;\n\t\t}\n\n\t\tconst tick = () => {\n\t\t\tif (version !== pendingExitVersion) return;\n\t\t\tif (!hasActiveContentAnimations()) {\n\t\t\t\tcompleteExit();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\texitWaitRaf = window.requestAnimationFrame(tick);\n\t\t};\n\n\t\texitWaitTimeout = window.setTimeout(() => {\n\t\t\tcompleteExit();\n\t\t}, EXIT_WAIT_TIMEOUT_MS);\n\t\texitWaitRaf = window.requestAnimationFrame(tick);\n\t}\n\n\tfunction getTargetMode(value: number, normStart: number, normEnd: number) {\n\t\tif (!stickySupported) {\n\t\t\tif (value <= normStart) return \"absolute-below\";\n\t\t\tif (value >= normEnd) return \"absolute-above\";\n\t\t\treturn \"absolute-below\";\n\t\t}\n\n\t\tconst current = mode.get();\n\t\tif (current === \"sticky\") {\n\t\t\tif (value < normStart - EXIT_HYSTERESIS) return \"absolute-below\";\n\t\t\tif (value > normEnd + EXIT_HYSTERESIS) return \"absolute-above\";\n\t\t\treturn \"sticky\";\n\t\t}\n\n\t\tif (current === \"absolute-below\") {\n\t\t\tif (value >= normStart + ENTER_HYSTERESIS) return \"sticky\";\n\t\t\treturn \"absolute-below\";\n\t\t}\n\n\t\tif (value <= normEnd - ENTER_HYSTERESIS) return \"sticky\";\n\t\treturn \"absolute-above\";\n\t}\n\n\tfunction getModeDecisionValue(\n\t\tvalue: number,\n\t\tnormStart: number,\n\t\tnormEnd: number,\n\t\tallowPrediction: boolean,\n\t) {\n\t\tconst now = performance.now();\n\t\tlet velocity = 0;\n\n\t\tif (hasScrollSample) {\n\t\t\tconst elapsed = Math.max(now - lastScrollSampleTime, 1);\n\t\t\tvelocity = (value - lastScrollSampleValue) / elapsed;\n\t\t}\n\n\t\tlastScrollSampleValue = value;\n\t\tlastScrollSampleTime = now;\n\t\thasScrollSample = true;\n\t\tlatestScrollVelocity = velocity;\n\n\t\tif (!allowPrediction || Math.abs(velocity) < PREDICT_MIN_VELOCITY) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst speed = Math.abs(velocity);\n\t\tconst speedScale = Math.min(speed / HIGH_VELOCITY_SKIP_HANDOFF, 1);\n\t\tconst lookaheadMs =\n\t\t\tPREDICT_LOOKAHEAD_MS +\n\t\t\tspeedScale * (MAX_PREDICT_LOOKAHEAD_MS - PREDICT_LOOKAHEAD_MS);\n\n\t\tconst predicted = Math.min(Math.max(value + velocity * lookaheadMs, 0), 1);\n\n\t\tconst currentMode = mode.get();\n\t\tif (currentMode === \"absolute-below\") {\n\t\t\tconst entryEdge = normStart + ENTER_HYSTERESIS;\n\t\t\tconst nearStart = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;\n\t\t\tif (\n\t\t\t\tvelocity > 0 &&\n\t\t\t\tnearStart &&\n\t\t\t\tvalue < entryEdge &&\n\t\t\t\tpredicted >= entryEdge\n\t\t\t) {\n\t\t\t\treturn entryEdge;\n\t\t\t}\n\t\t}\n\n\t\tif (currentMode === \"absolute-above\") {\n\t\t\tconst entryEdge = normEnd - ENTER_HYSTERESIS;\n\t\t\tconst nearEnd = Math.abs(value - entryEdge) <= PREDICT_ENTER_BAND;\n\t\t\tif (\n\t\t\t\tvelocity < 0 &&\n\t\t\t\tnearEnd &&\n\t\t\t\tvalue > entryEdge &&\n\t\t\t\tpredicted <= entryEdge\n\t\t\t) {\n\t\t\t\treturn entryEdge;\n\t\t\t}\n\t\t}\n\n\t\tif (currentMode === \"sticky\") {\n\t\t\tconst exitTopEdge = normStart - EXIT_HYSTERESIS;\n\t\t\tconst exitBottomEdge = normEnd + EXIT_HYSTERESIS;\n\n\t\t\tconst nearTop = Math.abs(value - exitTopEdge) <= PREDICT_EXIT_BAND;\n\t\t\tif (\n\t\t\t\tvelocity < 0 &&\n\t\t\t\tnearTop &&\n\t\t\t\tvalue > exitTopEdge &&\n\t\t\t\tpredicted <= exitTopEdge\n\t\t\t) {\n\t\t\t\treturn exitTopEdge;\n\t\t\t}\n\n\t\t\tconst nearBottom = Math.abs(value - exitBottomEdge) <= PREDICT_EXIT_BAND;\n\t\t\tif (\n\t\t\t\tvelocity > 0 &&\n\t\t\t\tnearBottom &&\n\t\t\t\tvalue < exitBottomEdge &&\n\t\t\t\tpredicted >= exitBottomEdge\n\t\t\t) {\n\t\t\t\treturn exitBottomEdge;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction applyModeWithHandoff(nextMode: LayerMode) {\n\t\tif (!stickySupported) {\n\t\t\tstopHandoffAnimation();\n\t\t\tmode.set(nextMode);\n\t\t\trenderStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tstopHandoffAnimation();\n\n\t\tconst prevRect = _internal.root.getBoundingClientRect();\n\t\tmode.set(nextMode);\n\t\tupdateStyles();\n\n\t\tconst nextRect = _internal.root.getBoundingClientRect();\n\t\tconst deltaY = prevRect.top - nextRect.top;\n\t\tif (Math.abs(deltaY) <= HANDOFF_MIN_DELTA_PX) {\n\t\t\thandoffOffsetY.set(0);\n\t\t\trenderStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tMath.abs(latestScrollVelocity) >= HIGH_VELOCITY_SKIP_HANDOFF ||\n\t\t\tMath.abs(deltaY) >= MAX_HANDOFF_DELTA_PX\n\t\t) {\n\t\t\tsettleHandoffOverFrames(deltaY, 2);\n\t\t\treturn;\n\t\t}\n\n\t\thandoffOffsetY.set(deltaY);\n\t\tupdateStyles();\n\t\tconst duration = getHandoffDuration(deltaY, latestScrollVelocity);\n\t\tif (duration <= 0) {\n\t\t\tsettleHandoffOverFrames(deltaY, 1);\n\t\t\treturn;\n\t\t}\n\n\t\thandoffAnimation = animate([\n\t\t\t[handoffOffsetY, 0, { duration, ease: HANDOFF_EASE }],\n\t\t]);\n\t\thandoffAnimation.then(() => {\n\t\t\tif (!handoffAnimation) return;\n\t\t\thandoffAnimation = null;\n\t\t\thandoffOffsetY.set(0);\n\t\t\trenderStyles();\n\t\t});\n\t}\n\n\tfunction syncFromScroll(value: number, allowHandoff: boolean) {\n\t\tconst clamped = Math.min(Math.max(value, 0), 1);\n\t\trawScrollProgress.set(clamped);\n\n\t\tconst normStart = normStartValue.get();\n\t\tconst normEnd = normEndValue.get();\n\t\tconst range = [normStart, normEnd] as [number, number];\n\t\tconst span = Math.max(normEnd - normStart, Number.EPSILON);\n\t\tconst normalizedProgress = Math.min(\n\t\t\tMath.max((clamped - normStart) / span, 0),\n\t\t\t1,\n\t\t);\n\n\t\tinRange.set(isInRange({ range, value: clamped }));\n\t\tbelowRange.set(clamped <= normStart);\n\t\taboveRange.set(clamped >= normEnd);\n\t\tprogress.set(normalizedProgress);\n\n\t\tconst decisionValue = getModeDecisionValue(\n\t\t\tclamped,\n\t\t\tnormStart,\n\t\t\tnormEnd,\n\t\t\tallowHandoff,\n\t\t);\n\t\tconst nextMode = getTargetMode(decisionValue, normStart, normEnd);\n\t\tconst currentMode = mode.get();\n\n\t\tif (currentMode === \"sticky\" && nextMode !== \"sticky\" && allowHandoff) {\n\t\t\twaitForAnimations(nextMode);\n\t\t\tupdateStyles();\n\t\t\treturn;\n\t\t}\n\n\t\tcancelPendingExit();\n\t\tif (nextMode === currentMode) {\n\t\t\tif (!allowHandoff) {\n\t\t\t\tstopHandoffAnimation();\n\t\t\t\tupdateStyles();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (allowHandoff) {\n\t\t\tapplyModeWithHandoff(nextMode);\n\t\t\treturn;\n\t\t}\n\n\t\tcommitModeImmediately(nextMode);\n\t}\n\n\tcreateEffect(() => {\n\t\tconst range = [_internal.start, _internal.end];\n\t\tconst maxPages = parallax.maxPages;\n\t\tconst normalizedRange = normalizeTuple(range as any, maxPages);\n\t\tconst [normStart, normEnd] = normalizedRange;\n\t\tnormStartValue.set(normStart);\n\t\tnormEndValue.set(normEnd);\n\n\t\tconst initialValue = parallax.scrollYProgress.get();\n\t\tsyncFromScroll(initialValue, false);\n\t\trenderStyles();\n\n\t\tconst unsubscribe = parallax.scrollYProgress.on(\"change\", (value) => {\n\t\t\tsyncFromScroll(value, true);\n\t\t});\n\n\t\treturn onCleanup(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t});\n\n\tconst unsubHandoffOffset = handoffOffsetY.on(\"change\", (_) => {\n\t\trenderStyles();\n\t});\n\n\tfunction _animate(...args: Parameters<typeof animate>) {\n\t\tconst animation = animate(...args);\n\t\tregisterContentAnimation(animation);\n\t\treturn animation;\n\t}\n\n\tonCleanup(() => {\n\t\tcancelPendingExit();\n\t\tstopHandoffAnimation();\n\t\tunsubHandoffOffset();\n\t});\n\n\treturn [progress, { animate: _animate }] as const;\n}\n\nconst ParallaxStickyLayerContextState = createContext(\n\tinitializeParallaxStickyLayerContext,\n);\n\nexport const provideParallaxStickyLayerContext = (\n\tinitialState: Omit<CreateContextOptions, \"root\">,\n\telement: WalkableNode,\n): ParallaxStickyLayerContext => {\n\tconst props = mergeProps(initialState, { root: element });\n\treturn provide(ParallaxStickyLayerContextState, props, element);\n};\n\nexport const useParallaxStickyLayerContext = (\n\tcontext: ParallaxStickyLayerContext,\n) => {\n\treturn context;\n};\n\nexport const useParallaxStickyLayer = (\n\telement: HTMLElement & ICustomElement,\n) => {\n\tconst context: ParallaxStickyLayerContext = consume(\n\t\tParallaxStickyLayerContextState,\n\t\telement,\n\t);\n\n\tif (!context) {\n\t\tthrow console.error(\n\t\t\t\"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element.\",\n\t\t);\n\t}\n\n\treturn useParallaxStickyLayerContext(context);\n};\n\nexport const withParallaxStickyLayerContext = createWithElementContext<\n\ttypeof ParallaxStickyLayerContextState,\n\tParallaxStickyLayerContext\n>(ParallaxStickyLayerContextState);\n\nexport const getParallaxStickyLayerContext = (element: Element) => {\n\tconst context = getContextFromProvider<ParallaxStickyLayerContext>(\n\t\tParallaxStickyLayerContextState,\n\t\telement,\n\t);\n\treturn useParallaxStickyLayerContext(context);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brytdesigns/web-component-parallax",
3
- "version": "1.2.16",
3
+ "version": "1.2.17",
4
4
  "description": "Headless parallax animation web component",
5
5
  "main": "./dist/main/index.js",
6
6
  "module": "./dist/main/index.js",