@brytdesigns/web-component-parallax 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/esm/index.js +481 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/main/components/index.js +8 -0
- package/dist/main/components/index.js.map +1 -0
- package/dist/main/components/parallax-animation/index.js +145 -0
- package/dist/main/components/parallax-animation/index.js.map +1 -0
- package/dist/main/components/parallax-container/index.js +20 -0
- package/dist/main/components/parallax-container/index.js.map +1 -0
- package/dist/main/components/parallax-sticky-layer/index.js +27 -0
- package/dist/main/components/parallax-sticky-layer/index.js.map +1 -0
- package/dist/main/consts.js +16 -0
- package/dist/main/consts.js.map +1 -0
- package/dist/main/hooks/index.js +4 -0
- package/dist/main/hooks/index.js.map +1 -0
- package/dist/main/hooks/useParallax.js +81 -0
- package/dist/main/hooks/useParallax.js.map +1 -0
- package/dist/main/hooks/useParallaxStickyLayer.js +119 -0
- package/dist/main/hooks/useParallaxStickyLayer.js.map +1 -0
- package/dist/main/index.d.ts +37 -0
- package/dist/main/index.js +29 -0
- package/dist/main/index.js.map +1 -0
- package/dist/main/utils.js +71 -0
- package/dist/main/utils.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { customShadowlessElement, correctElementType, getContextFromProvider } from '@brytdesigns/web-component-utils';
|
|
2
|
+
import { splitProps, createEffect, batch, onCleanup, mergeProps } from 'solid-js';
|
|
3
|
+
import { createStore } from 'solid-js/store';
|
|
4
|
+
import { createContext, consume, provide } from 'component-register';
|
|
5
|
+
import { motionValue, scroll, transformValue, transform, frame, animate, styleEffect } from 'motion';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// src/components/parallax-container/index.ts
|
|
14
|
+
var parallax_container_exports = {};
|
|
15
|
+
__export(parallax_container_exports, {
|
|
16
|
+
Component: () => Component,
|
|
17
|
+
Name: () => Name
|
|
18
|
+
});
|
|
19
|
+
function initializeParallaxContext(props) {
|
|
20
|
+
const [_internal, _state] = splitProps(props, ["root"]);
|
|
21
|
+
const scrollYProgress = motionValue(-1);
|
|
22
|
+
const scrollY = motionValue(-1);
|
|
23
|
+
const [info, setInfo] = createStore({
|
|
24
|
+
offset: [-1, -1],
|
|
25
|
+
scrollLength: -1
|
|
26
|
+
});
|
|
27
|
+
createEffect(() => {
|
|
28
|
+
const pages = _state.maxPages;
|
|
29
|
+
_internal.root.style.height = `${pages * 100}vh`;
|
|
30
|
+
_internal.root.style.width = `100%`;
|
|
31
|
+
_internal.root.style.position = "relative";
|
|
32
|
+
if (!_internal.root.style.display) {
|
|
33
|
+
_internal.root.style.display = "block";
|
|
34
|
+
}
|
|
35
|
+
const remove = scroll(
|
|
36
|
+
(_, info2) => {
|
|
37
|
+
const { y } = info2;
|
|
38
|
+
scrollYProgress.set(y.progress);
|
|
39
|
+
scrollY.set(y.current);
|
|
40
|
+
batch(() => {
|
|
41
|
+
setInfo("offset", 0, y.offset?.at(0) || 0);
|
|
42
|
+
setInfo("offset", 1, y.offset?.at(1) || 0);
|
|
43
|
+
setInfo("scrollLength", y.scrollLength);
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
target: _internal.root,
|
|
48
|
+
axis: "y",
|
|
49
|
+
offset: ["start start", "end end"]
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
onCleanup(() => {
|
|
53
|
+
if (remove) {
|
|
54
|
+
remove();
|
|
55
|
+
}
|
|
56
|
+
scrollYProgress.destroy();
|
|
57
|
+
scrollY.destroy();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
return mergeProps(_state, {
|
|
61
|
+
scrollYProgress,
|
|
62
|
+
scrollY,
|
|
63
|
+
info
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
var ParallaxContextState = createContext(initializeParallaxContext);
|
|
67
|
+
var provideParallaxContext = (initialState, element) => {
|
|
68
|
+
const props = mergeProps(initialState, { root: element });
|
|
69
|
+
return provide(ParallaxContextState, props, element);
|
|
70
|
+
};
|
|
71
|
+
var useParallaxContext = (context) => {
|
|
72
|
+
return context;
|
|
73
|
+
};
|
|
74
|
+
var useParallax = (element) => {
|
|
75
|
+
const context = consume(ParallaxContextState, element);
|
|
76
|
+
if (!context) {
|
|
77
|
+
throw console.error(
|
|
78
|
+
"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element."
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return useParallaxContext(context);
|
|
82
|
+
};
|
|
83
|
+
var getParallaxContext = (element) => {
|
|
84
|
+
const context = getContextFromProvider(
|
|
85
|
+
ParallaxContextState,
|
|
86
|
+
element
|
|
87
|
+
);
|
|
88
|
+
return useParallaxContext(context);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/utils.ts
|
|
92
|
+
function normalizeTuple(range, max) {
|
|
93
|
+
if (max <= 1) {
|
|
94
|
+
throw new Error("The maximum value must be greater than 1.");
|
|
95
|
+
}
|
|
96
|
+
const [start, end] = range;
|
|
97
|
+
const normalizedStart = (start - 1) / (max - 1);
|
|
98
|
+
const normalizedEnd = (end - 1) / (max - 1);
|
|
99
|
+
return [normalizedStart, normalizedEnd];
|
|
100
|
+
}
|
|
101
|
+
function isInRange({
|
|
102
|
+
range: [start, end],
|
|
103
|
+
value
|
|
104
|
+
}) {
|
|
105
|
+
return start <= value && end >= value;
|
|
106
|
+
}
|
|
107
|
+
function abortablePromise(promise, signal) {
|
|
108
|
+
if (signal.aborted) {
|
|
109
|
+
return new Promise((_, rej) => rej(signal.reason));
|
|
110
|
+
}
|
|
111
|
+
return new Promise(async (res, rej) => {
|
|
112
|
+
signal.addEventListener(
|
|
113
|
+
"abort",
|
|
114
|
+
() => {
|
|
115
|
+
rej(signal.reason);
|
|
116
|
+
},
|
|
117
|
+
{ once: true }
|
|
118
|
+
);
|
|
119
|
+
promise.then(res);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function awaitAllAnimations(promises) {
|
|
123
|
+
return new Promise((resolve, _) => {
|
|
124
|
+
const results = [];
|
|
125
|
+
let remaining = promises.length;
|
|
126
|
+
if (remaining === 0) {
|
|
127
|
+
resolve([]);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
function updateResults(value, index) {
|
|
131
|
+
results[index] = value;
|
|
132
|
+
remaining -= 1;
|
|
133
|
+
if (remaining === 0) {
|
|
134
|
+
resolve(results);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
promises.forEach((p, i) => {
|
|
138
|
+
try {
|
|
139
|
+
if (p?.state === "idle") {
|
|
140
|
+
updateResults(null, i);
|
|
141
|
+
} else {
|
|
142
|
+
p.then(() => {
|
|
143
|
+
updateResults(null, i);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
} catch (e) {
|
|
147
|
+
p.then(() => {
|
|
148
|
+
updateResults(null, i);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/hooks/useParallaxStickyLayer.ts
|
|
156
|
+
function initializeParallaxStickyLayerContext(props) {
|
|
157
|
+
const [_internal, _state] = splitProps(props, ["root", "start", "end"]);
|
|
158
|
+
const parallax = useParallax(_internal.root);
|
|
159
|
+
const progress = motionValue(-1);
|
|
160
|
+
const inRange = motionValue(false);
|
|
161
|
+
const belowRange = motionValue(false);
|
|
162
|
+
const aboveRange = motionValue(false);
|
|
163
|
+
const position = transformValue(
|
|
164
|
+
() => inRange.get() ? "sticky" : "absolute"
|
|
165
|
+
);
|
|
166
|
+
const transform$1 = transformValue(() => {
|
|
167
|
+
const isInRange2 = inRange.get();
|
|
168
|
+
const isBelowRange = belowRange.get();
|
|
169
|
+
const isAboveRange = aboveRange.get();
|
|
170
|
+
if (isInRange2) return "none";
|
|
171
|
+
if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}%)`;
|
|
172
|
+
if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}%)`;
|
|
173
|
+
});
|
|
174
|
+
const animations = motionValue([]);
|
|
175
|
+
const styles = transformValue(() => ({
|
|
176
|
+
position: position.get(),
|
|
177
|
+
transform: transform$1.get()
|
|
178
|
+
}));
|
|
179
|
+
_internal.root.style.top = "0";
|
|
180
|
+
_internal.root.style.right = "0";
|
|
181
|
+
_internal.root.style.bottom = "0";
|
|
182
|
+
_internal.root.style.left = "0";
|
|
183
|
+
_internal.root.style.height = "100vh";
|
|
184
|
+
if (!_internal.root.style.display) {
|
|
185
|
+
_internal.root.style.display = "block";
|
|
186
|
+
}
|
|
187
|
+
createEffect(() => {
|
|
188
|
+
const range = [_internal.start, _internal.end];
|
|
189
|
+
const maxPages = parallax.maxPages;
|
|
190
|
+
const normalizedRange = normalizeTuple(range, maxPages);
|
|
191
|
+
const [normStart, normEnd] = normalizedRange;
|
|
192
|
+
const transformer = transform(normalizedRange, [0, 1]);
|
|
193
|
+
const unsubscribe = parallax.scrollYProgress.on("change", (value) => {
|
|
194
|
+
inRange.set(isInRange({ range: normalizedRange, value }));
|
|
195
|
+
belowRange.set(value <= normStart);
|
|
196
|
+
aboveRange.set(value >= normEnd);
|
|
197
|
+
progress.set(transformer(value));
|
|
198
|
+
});
|
|
199
|
+
return onCleanup(() => {
|
|
200
|
+
unsubscribe();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
function updateStyles() {
|
|
204
|
+
const s = styles.get();
|
|
205
|
+
_internal.root.style.position = s.position;
|
|
206
|
+
_internal.root.style.transform = s.transform;
|
|
207
|
+
}
|
|
208
|
+
function renderStyles() {
|
|
209
|
+
frame.render(updateStyles);
|
|
210
|
+
}
|
|
211
|
+
function waitForAnimations() {
|
|
212
|
+
const a = animations.get();
|
|
213
|
+
const controller = new AbortController();
|
|
214
|
+
abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {
|
|
215
|
+
animations.set([]);
|
|
216
|
+
renderStyles();
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
const unsubStyles = styles.on("change", (_) => {
|
|
220
|
+
if (progress.get() === 1 || progress.get() === 0)
|
|
221
|
+
return waitForAnimations();
|
|
222
|
+
animations.set([]);
|
|
223
|
+
renderStyles();
|
|
224
|
+
});
|
|
225
|
+
function _animate(...args) {
|
|
226
|
+
const animation = animate(...args);
|
|
227
|
+
animations.set([...animations.get(), animation]);
|
|
228
|
+
return animation;
|
|
229
|
+
}
|
|
230
|
+
onCleanup(() => {
|
|
231
|
+
unsubStyles();
|
|
232
|
+
});
|
|
233
|
+
return [progress, { animate: _animate }];
|
|
234
|
+
}
|
|
235
|
+
var ParallaxStickyLayerContextState = createContext(
|
|
236
|
+
initializeParallaxStickyLayerContext
|
|
237
|
+
);
|
|
238
|
+
var provideParallaxStickyLayerContext = (initialState, element) => {
|
|
239
|
+
const props = mergeProps(initialState, { root: element });
|
|
240
|
+
return provide(ParallaxStickyLayerContextState, props, element);
|
|
241
|
+
};
|
|
242
|
+
var useParallaxStickyLayerContext = (context) => {
|
|
243
|
+
return context;
|
|
244
|
+
};
|
|
245
|
+
var useParallaxStickyLayer = (element) => {
|
|
246
|
+
const context = consume(
|
|
247
|
+
ParallaxStickyLayerContextState,
|
|
248
|
+
element
|
|
249
|
+
);
|
|
250
|
+
if (!context) {
|
|
251
|
+
throw console.error(
|
|
252
|
+
"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element."
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
return useParallaxStickyLayerContext(context);
|
|
256
|
+
};
|
|
257
|
+
var getParallaxStickyLayerContext = (element) => {
|
|
258
|
+
const context = getContextFromProvider(
|
|
259
|
+
ParallaxStickyLayerContextState,
|
|
260
|
+
element
|
|
261
|
+
);
|
|
262
|
+
return useParallaxStickyLayerContext(context);
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// src/components/parallax-container/index.ts
|
|
266
|
+
var Name = `parallax-container`;
|
|
267
|
+
var Component = (props, { element }) => {
|
|
268
|
+
if (!props.maxPages)
|
|
269
|
+
return console.warn(
|
|
270
|
+
`${Name}: requires max-pages attribute to be set!`,
|
|
271
|
+
element
|
|
272
|
+
);
|
|
273
|
+
if (props.maxPages < 1)
|
|
274
|
+
return console.warn(
|
|
275
|
+
`${Name}: max-pages must be greater than or equal to 1!`,
|
|
276
|
+
element
|
|
277
|
+
);
|
|
278
|
+
provideParallaxContext(props, element);
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
// src/components/parallax-sticky-layer/index.ts
|
|
282
|
+
var parallax_sticky_layer_exports = {};
|
|
283
|
+
__export(parallax_sticky_layer_exports, {
|
|
284
|
+
Component: () => Component2,
|
|
285
|
+
Name: () => Name2
|
|
286
|
+
});
|
|
287
|
+
var Name2 = `parallax-sticky-layer`;
|
|
288
|
+
var Component2 = (props, { element }) => {
|
|
289
|
+
if (!props.start)
|
|
290
|
+
return console.warn(
|
|
291
|
+
`${Name2}: requires start attribute to be set!`,
|
|
292
|
+
element
|
|
293
|
+
);
|
|
294
|
+
if (!props.end)
|
|
295
|
+
return console.warn(`${Name2}: requires end attribute to be set!`, element);
|
|
296
|
+
if (props.end <= props.start)
|
|
297
|
+
return console.warn(
|
|
298
|
+
`${Name2}: the start attribute must be less than the end attribute!`,
|
|
299
|
+
element
|
|
300
|
+
);
|
|
301
|
+
if (props.start < 1 || props.end < 1)
|
|
302
|
+
return console.warn(
|
|
303
|
+
`${Name2}: The start and end attributes must be greater than or equal to 1!`,
|
|
304
|
+
element
|
|
305
|
+
);
|
|
306
|
+
provideParallaxStickyLayerContext(props, element);
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
// src/components/parallax-animation/index.ts
|
|
310
|
+
var parallax_animation_exports = {};
|
|
311
|
+
__export(parallax_animation_exports, {
|
|
312
|
+
Component: () => Component3,
|
|
313
|
+
Name: () => Name3,
|
|
314
|
+
PROPS: () => PROPS
|
|
315
|
+
});
|
|
316
|
+
var Name3 = `parallax-animation`;
|
|
317
|
+
var PROPS = {
|
|
318
|
+
y: null,
|
|
319
|
+
x: null,
|
|
320
|
+
scale: null,
|
|
321
|
+
rotate: null,
|
|
322
|
+
opacity: null,
|
|
323
|
+
color: null,
|
|
324
|
+
backgroundColor: null,
|
|
325
|
+
borderRadius: null,
|
|
326
|
+
top: null,
|
|
327
|
+
left: null,
|
|
328
|
+
bottom: null,
|
|
329
|
+
right: null,
|
|
330
|
+
width: null,
|
|
331
|
+
height: null
|
|
332
|
+
};
|
|
333
|
+
var PROP_DEFAULTS = {
|
|
334
|
+
y: "0%",
|
|
335
|
+
x: "0%",
|
|
336
|
+
scale: 1,
|
|
337
|
+
rotate: 0,
|
|
338
|
+
opacity: null,
|
|
339
|
+
color: null,
|
|
340
|
+
backgroundColor: null,
|
|
341
|
+
borderRadius: null,
|
|
342
|
+
top: null,
|
|
343
|
+
left: null,
|
|
344
|
+
bottom: null,
|
|
345
|
+
right: null,
|
|
346
|
+
width: null,
|
|
347
|
+
height: null
|
|
348
|
+
};
|
|
349
|
+
var KEYS = Object.keys(PROPS);
|
|
350
|
+
var Component3 = (props, { element }) => {
|
|
351
|
+
const [progress, { animate: animate2 }] = useParallaxStickyLayer(element);
|
|
352
|
+
if (Object.keys(props).some(
|
|
353
|
+
(key) => KEYS.includes(key) && !Array.isArray(Reflect.get(props, key))
|
|
354
|
+
))
|
|
355
|
+
return console.warn(
|
|
356
|
+
`parallax-animate: At least one of ${KEYS.join(",")} properties is required and must be an array of values!`,
|
|
357
|
+
element
|
|
358
|
+
);
|
|
359
|
+
const messages = Object.entries(props).reduce((messages2, [key, value]) => {
|
|
360
|
+
if (!KEYS.includes(key)) return messages2;
|
|
361
|
+
if (value && value.length !== props.range.length) {
|
|
362
|
+
return messages2.concat(
|
|
363
|
+
`${key} attribute must have the same length as range attribute!`
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
return messages2;
|
|
367
|
+
}, []);
|
|
368
|
+
if (messages.length)
|
|
369
|
+
return console.warn(
|
|
370
|
+
element,
|
|
371
|
+
`
|
|
372
|
+
parallax-animate: Please fix the following issues:
|
|
373
|
+
${messages.join("\n")}`
|
|
374
|
+
);
|
|
375
|
+
element.style.willChange = "transform";
|
|
376
|
+
if (!window.getComputedStyle(element).getPropertyValue("display")) {
|
|
377
|
+
element.style.display = "block";
|
|
378
|
+
}
|
|
379
|
+
createEffect(() => {
|
|
380
|
+
Object.values(props);
|
|
381
|
+
const range = props.range;
|
|
382
|
+
const valueSubscribers = [];
|
|
383
|
+
const progressValue = Object.keys(PROP_DEFAULTS).reduce(
|
|
384
|
+
(values, key) => {
|
|
385
|
+
const fallback = Reflect.get(PROP_DEFAULTS, key);
|
|
386
|
+
const valueRange = Reflect.get(props, key);
|
|
387
|
+
if (valueRange?.length === range.length) {
|
|
388
|
+
const transform2 = transform(range, valueRange);
|
|
389
|
+
const value = motionValue(transform2(progress.get()));
|
|
390
|
+
const unsub2 = progress.on("change", (latest) => {
|
|
391
|
+
value.set(transform2(latest));
|
|
392
|
+
});
|
|
393
|
+
valueSubscribers.push(unsub2);
|
|
394
|
+
values[key] = value;
|
|
395
|
+
} else values[key] = fallback;
|
|
396
|
+
return values;
|
|
397
|
+
},
|
|
398
|
+
{}
|
|
399
|
+
);
|
|
400
|
+
const animated = Object.keys(progressValue).reduce(
|
|
401
|
+
(obj, key) => {
|
|
402
|
+
const v = progressValue[key];
|
|
403
|
+
Reflect.set(
|
|
404
|
+
obj,
|
|
405
|
+
key,
|
|
406
|
+
motionValue(typeof v === "object" && v !== null ? v.get() : v)
|
|
407
|
+
);
|
|
408
|
+
return obj;
|
|
409
|
+
},
|
|
410
|
+
{}
|
|
411
|
+
);
|
|
412
|
+
const transform$1 = transformValue(
|
|
413
|
+
() => `translate(${animated.x?.get()}, ${animated.y?.get()}) scale(${animated.scale?.get()}) rotate(${animated.rotate?.get()}deg)`
|
|
414
|
+
);
|
|
415
|
+
function animateValues() {
|
|
416
|
+
const sequence = Object.keys(animated).map((key) => {
|
|
417
|
+
let v = progressValue[key]?.get?.();
|
|
418
|
+
if (typeof v === "undefined") return null;
|
|
419
|
+
return [animated[key], v, { at: "<" }];
|
|
420
|
+
}).filter((v) => v !== null);
|
|
421
|
+
animate2(sequence);
|
|
422
|
+
}
|
|
423
|
+
function scheduleAnimation() {
|
|
424
|
+
frame.update(animateValues);
|
|
425
|
+
}
|
|
426
|
+
const unsub = progress.on("change", (_) => {
|
|
427
|
+
scheduleAnimation();
|
|
428
|
+
});
|
|
429
|
+
const styledValues = Object.keys(animated).filter(
|
|
430
|
+
(key) => key !== "y" && key !== "x" && key !== "rotate" && key !== "scale"
|
|
431
|
+
).reduce((obj, key) => {
|
|
432
|
+
Reflect.set(obj, key, animated[key]);
|
|
433
|
+
return obj;
|
|
434
|
+
}, {});
|
|
435
|
+
const unstyle = styleEffect(element, {
|
|
436
|
+
transform: transform$1,
|
|
437
|
+
...styledValues
|
|
438
|
+
});
|
|
439
|
+
return onCleanup(() => {
|
|
440
|
+
unstyle();
|
|
441
|
+
unsub();
|
|
442
|
+
valueSubscribers.forEach((unsub2) => unsub2());
|
|
443
|
+
Object.values(animated).forEach((value) => {
|
|
444
|
+
value.destroy();
|
|
445
|
+
});
|
|
446
|
+
Object.values(progressValue).forEach((value) => {
|
|
447
|
+
value?.destroy?.();
|
|
448
|
+
});
|
|
449
|
+
transform$1.destroy();
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
// src/index.ts
|
|
455
|
+
customShadowlessElement(
|
|
456
|
+
parallax_container_exports.Name,
|
|
457
|
+
{
|
|
458
|
+
maxPages: 2
|
|
459
|
+
},
|
|
460
|
+
correctElementType(parallax_container_exports.Component)
|
|
461
|
+
);
|
|
462
|
+
customShadowlessElement(
|
|
463
|
+
parallax_sticky_layer_exports.Name,
|
|
464
|
+
{
|
|
465
|
+
start: 1,
|
|
466
|
+
end: 2
|
|
467
|
+
},
|
|
468
|
+
correctElementType(parallax_sticky_layer_exports.Component)
|
|
469
|
+
);
|
|
470
|
+
customShadowlessElement(
|
|
471
|
+
parallax_animation_exports.Name,
|
|
472
|
+
{
|
|
473
|
+
range: [0, 1],
|
|
474
|
+
...parallax_animation_exports.PROPS
|
|
475
|
+
},
|
|
476
|
+
correctElementType(parallax_animation_exports.Component)
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
export { getParallaxContext, getParallaxStickyLayerContext, useParallax, useParallaxStickyLayer };
|
|
480
|
+
//# sourceMappingURL=index.js.map
|
|
481
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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","getContextFromProvider","Component","Name","animate","messages","unsub","transformValue","frame"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\nimport { provideParallaxContext } from \"../../hooks/index.js\";\n\ntype ParallaxContainerProps = {\n maxPages: number;\n};\n\nexport const Name = `parallax-container`;\n\nexport const Component: CorrectComponentType<ParallaxContainerProps> = (\n props,\n { element },\n) => {\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 { getContextFromProvider } from \"@brytdesigns/web-component-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 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 getParallaxContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxContext>(\n ParallaxContextState,\n element,\n );\n return useParallaxContext(context);\n};\n","import type { AnimationPlaybackControlsWithThen } from \"motion\";\n\nexport 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 abortablePromise(promise: Promise<any>, signal: AbortSignal) {\n if (signal.aborted) {\n return new Promise((_, rej) => rej(signal.reason));\n }\n\n return new Promise(async (res, rej) => {\n signal.addEventListener(\n \"abort\",\n () => {\n rej(signal.reason);\n },\n { once: true },\n );\n promise.then(res);\n });\n}\n\nexport function awaitAllAnimations(\n promises: AnimationPlaybackControlsWithThen[],\n) {\n return new Promise((resolve, _) => {\n const results: any[] = [];\n let remaining = promises.length;\n if (remaining === 0) {\n resolve([]); // zero‐length edge case\n return;\n }\n\n function updateResults<T>(value: T, index: number) {\n results[index] = value;\n remaining -= 1;\n if (remaining === 0) {\n resolve(results);\n }\n }\n\n promises.forEach((p, i) => {\n try {\n if (p?.state === \"idle\") {\n updateResults(null, i);\n } else {\n p.then(() => {\n updateResults(null, i);\n });\n }\n } catch (e) {\n p.then(() => {\n updateResults(null, i);\n });\n }\n });\n });\n}\n\nexport async function controlPromise(\n controls: AnimationPlaybackControlsWithThen,\n) {\n return new Promise((resolve) => {\n controls.then(() => resolve(null));\n });\n}\n","import { onCleanup, createEffect, splitProps, mergeProps } from \"solid-js\";\nimport { getContextFromProvider } from \"@brytdesigns/web-component-utils\";\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 { useParallax } from \"./useParallax\";\nimport {\n normalizeTuple,\n isInRange,\n abortablePromise,\n awaitAllAnimations,\n} 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}%)`;\n if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}%)`;\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 = \"0\";\n _internal.root.style.right = \"0\";\n _internal.root.style.bottom = \"0\";\n _internal.root.style.left = \"0\";\n _internal.root.style.height = \"100vh\";\n if (!_internal.root.style.display) {\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 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-utils\";\nimport { provideParallaxStickyLayerContext } from \"../../hooks/index.js\";\n\ntype StickyParallaxLayerProps = {\n start: number;\n end: number;\n};\n\nexport const Name = `parallax-sticky-layer`;\n\nexport const Component: CorrectComponentType<StickyParallaxLayerProps> = (\n props,\n { element },\n) => {\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-utils\";\nimport { onCleanup, createEffect } from \"solid-js\";\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\";\n\ntype ParallaxContainerProps = {\n range: number[];\n y: Array<string | number> | null;\n x: Array<string | number> | null;\n scale: Array<string | number> | null;\n rotate: Array<string | number> | null;\n opacity: Array<string | number> | null;\n backgroundColor: string[] | null;\n borderRadius: Array<string | number> | null;\n top: Array<string | number> | null;\n left: Array<string | number> | null;\n right: Array<string | number> | null;\n bottom: Array<string | number> | null;\n width: Array<string | number> | null;\n height: Array<string | number> | null;\n};\n\nexport const Name = `parallax-animation`;\n\nexport const PROPS = {\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 top: null,\n left: null,\n bottom: null,\n right: null,\n width: null,\n height: 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 top: null,\n left: null,\n bottom: null,\n right: null,\n width: null,\n height: null,\n};\n\nconst KEYS = Object.keys(PROPS);\n\nexport const Component: CorrectComponentType<ParallaxContainerProps> = (\n props,\n { element },\n) => {\n const [progress, { animate }] = useParallaxStickyLayer(element);\n\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 element.style.willChange = \"transform\";\n if (!window.getComputedStyle(element).getPropertyValue(\"display\")) {\n element.style.display = \"block\";\n }\n\n createEffect(() => {\n // Subscribe to all changes\n Object.values(props);\n const range = props.range;\n\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-utils\";\n\nimport {\n ParallaxContainer,\n ParallaxStickyLayer,\n ParallaxAnimation,\n} from \"./components/index.js\";\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 {\n range: [0, 1],\n ...ParallaxAnimation.PROPS,\n },\n correctElementType(ParallaxAnimation.Component),\n);\n\nexport {\n useParallax,\n getParallaxContext,\n useParallaxStickyLayer,\n getParallaxStickyLayerContext,\n} from \"./hooks/index.js\";\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as index_js$1 from './parallax-container/index.js';
|
|
2
|
+
export { index_js$1 as ParallaxContainer };
|
|
3
|
+
import * as index_js$2 from './parallax-sticky-layer/index.js';
|
|
4
|
+
export { index_js$2 as ParallaxStickyLayer };
|
|
5
|
+
import * as index_js from './parallax-animation/index.js';
|
|
6
|
+
export { index_js as ParallaxAnimation };
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createEffect, onCleanup } from 'solid-js';
|
|
2
|
+
import { transform, motionValue, transformValue, styleEffect, frame } from 'motion';
|
|
3
|
+
import { useParallaxStickyLayer } from '../../hooks/index.js';
|
|
4
|
+
|
|
5
|
+
const Name = `parallax-animation`;
|
|
6
|
+
const PROPS = {
|
|
7
|
+
y: null,
|
|
8
|
+
x: null,
|
|
9
|
+
scale: null,
|
|
10
|
+
rotate: null,
|
|
11
|
+
opacity: null,
|
|
12
|
+
color: null,
|
|
13
|
+
backgroundColor: null,
|
|
14
|
+
borderRadius: null,
|
|
15
|
+
top: null,
|
|
16
|
+
left: null,
|
|
17
|
+
bottom: null,
|
|
18
|
+
right: null,
|
|
19
|
+
width: null,
|
|
20
|
+
height: null
|
|
21
|
+
};
|
|
22
|
+
const PROP_DEFAULTS = {
|
|
23
|
+
y: "0%",
|
|
24
|
+
x: "0%",
|
|
25
|
+
scale: 1,
|
|
26
|
+
rotate: 0,
|
|
27
|
+
opacity: null,
|
|
28
|
+
color: null,
|
|
29
|
+
backgroundColor: null,
|
|
30
|
+
borderRadius: null,
|
|
31
|
+
top: null,
|
|
32
|
+
left: null,
|
|
33
|
+
bottom: null,
|
|
34
|
+
right: null,
|
|
35
|
+
width: null,
|
|
36
|
+
height: null
|
|
37
|
+
};
|
|
38
|
+
const KEYS = Object.keys(PROPS);
|
|
39
|
+
const Component = (props, { element }) => {
|
|
40
|
+
const [progress, { animate }] = useParallaxStickyLayer(element);
|
|
41
|
+
if (Object.keys(props).some(
|
|
42
|
+
(key) => KEYS.includes(key) && !Array.isArray(Reflect.get(props, key))
|
|
43
|
+
))
|
|
44
|
+
return console.warn(
|
|
45
|
+
`parallax-animate: At least one of ${KEYS.join(",")} properties is required and must be an array of values!`,
|
|
46
|
+
element
|
|
47
|
+
);
|
|
48
|
+
const messages = Object.entries(props).reduce((messages2, [key, value]) => {
|
|
49
|
+
if (!KEYS.includes(key)) return messages2;
|
|
50
|
+
if (value && value.length !== props.range.length) {
|
|
51
|
+
return messages2.concat(
|
|
52
|
+
`${key} attribute must have the same length as range attribute!`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return messages2;
|
|
56
|
+
}, []);
|
|
57
|
+
if (messages.length)
|
|
58
|
+
return console.warn(
|
|
59
|
+
element,
|
|
60
|
+
`
|
|
61
|
+
parallax-animate: Please fix the following issues:
|
|
62
|
+
${messages.join("\n")}`
|
|
63
|
+
);
|
|
64
|
+
element.style.willChange = "transform";
|
|
65
|
+
if (!window.getComputedStyle(element).getPropertyValue("display")) {
|
|
66
|
+
element.style.display = "block";
|
|
67
|
+
}
|
|
68
|
+
createEffect(() => {
|
|
69
|
+
Object.values(props);
|
|
70
|
+
const range = props.range;
|
|
71
|
+
const valueSubscribers = [];
|
|
72
|
+
const progressValue = Object.keys(PROP_DEFAULTS).reduce(
|
|
73
|
+
(values, key) => {
|
|
74
|
+
const fallback = Reflect.get(PROP_DEFAULTS, key);
|
|
75
|
+
const valueRange = Reflect.get(props, key);
|
|
76
|
+
if (valueRange?.length === range.length) {
|
|
77
|
+
const transform2 = transform(range, valueRange);
|
|
78
|
+
const value = motionValue(transform2(progress.get()));
|
|
79
|
+
const unsub2 = progress.on("change", (latest) => {
|
|
80
|
+
value.set(transform2(latest));
|
|
81
|
+
});
|
|
82
|
+
valueSubscribers.push(unsub2);
|
|
83
|
+
values[key] = value;
|
|
84
|
+
} else values[key] = fallback;
|
|
85
|
+
return values;
|
|
86
|
+
},
|
|
87
|
+
{}
|
|
88
|
+
);
|
|
89
|
+
const animated = Object.keys(progressValue).reduce(
|
|
90
|
+
(obj, key) => {
|
|
91
|
+
const v = progressValue[key];
|
|
92
|
+
Reflect.set(
|
|
93
|
+
obj,
|
|
94
|
+
key,
|
|
95
|
+
motionValue(typeof v === "object" && v !== null ? v.get() : v)
|
|
96
|
+
);
|
|
97
|
+
return obj;
|
|
98
|
+
},
|
|
99
|
+
{}
|
|
100
|
+
);
|
|
101
|
+
const transform$1 = transformValue(
|
|
102
|
+
() => `translate(${animated.x?.get()}, ${animated.y?.get()}) scale(${animated.scale?.get()}) rotate(${animated.rotate?.get()}deg)`
|
|
103
|
+
);
|
|
104
|
+
function animateValues() {
|
|
105
|
+
const sequence = Object.keys(animated).map((key) => {
|
|
106
|
+
let v = progressValue[key]?.get?.();
|
|
107
|
+
if (typeof v === "undefined") return null;
|
|
108
|
+
return [animated[key], v, { at: "<" }];
|
|
109
|
+
}).filter((v) => v !== null);
|
|
110
|
+
animate(sequence);
|
|
111
|
+
}
|
|
112
|
+
function scheduleAnimation() {
|
|
113
|
+
frame.update(animateValues);
|
|
114
|
+
}
|
|
115
|
+
const unsub = progress.on("change", (_) => {
|
|
116
|
+
scheduleAnimation();
|
|
117
|
+
});
|
|
118
|
+
const styledValues = Object.keys(animated).filter(
|
|
119
|
+
(key) => key !== "y" && key !== "x" && key !== "rotate" && key !== "scale"
|
|
120
|
+
).reduce((obj, key) => {
|
|
121
|
+
Reflect.set(obj, key, animated[key]);
|
|
122
|
+
return obj;
|
|
123
|
+
}, {});
|
|
124
|
+
const unstyle = styleEffect(element, {
|
|
125
|
+
transform: transform$1,
|
|
126
|
+
...styledValues
|
|
127
|
+
});
|
|
128
|
+
return onCleanup(() => {
|
|
129
|
+
unstyle();
|
|
130
|
+
unsub();
|
|
131
|
+
valueSubscribers.forEach((unsub2) => unsub2());
|
|
132
|
+
Object.values(animated).forEach((value) => {
|
|
133
|
+
value.destroy();
|
|
134
|
+
});
|
|
135
|
+
Object.values(progressValue).forEach((value) => {
|
|
136
|
+
value?.destroy?.();
|
|
137
|
+
});
|
|
138
|
+
transform$1.destroy();
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
export { Component, Name, PROPS };
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
145
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/parallax-animation/index.ts"],"names":["messages","transform","mTransform","unsub"],"mappings":";;;;AA8BO,MAAM,IAAO,GAAA,CAAA,kBAAA;AAEb,MAAM,KAAQ,GAAA;AAAA,EACnB,CAAG,EAAA,IAAA;AAAA,EACH,CAAG,EAAA,IAAA;AAAA,EACH,KAAO,EAAA,IAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,OAAS,EAAA,IAAA;AAAA,EACT,KAAO,EAAA,IAAA;AAAA,EACP,eAAiB,EAAA,IAAA;AAAA,EACjB,YAAc,EAAA,IAAA;AAAA,EACd,GAAK,EAAA,IAAA;AAAA,EACL,IAAM,EAAA,IAAA;AAAA,EACN,MAAQ,EAAA,IAAA;AAAA,EACR,KAAO,EAAA,IAAA;AAAA,EACP,KAAO,EAAA,IAAA;AAAA,EACP,MAAQ,EAAA;AACV;AAEA,MAAM,aAAgB,GAAA;AAAA,EACpB,CAAG,EAAA,IAAA;AAAA,EACH,CAAG,EAAA,IAAA;AAAA,EACH,KAAO,EAAA,CAAA;AAAA,EACP,MAAQ,EAAA,CAAA;AAAA,EACR,OAAS,EAAA,IAAA;AAAA,EACT,KAAO,EAAA,IAAA;AAAA,EACP,eAAiB,EAAA,IAAA;AAAA,EACjB,YAAc,EAAA,IAAA;AAAA,EACd,GAAK,EAAA,IAAA;AAAA,EACL,IAAM,EAAA,IAAA;AAAA,EACN,MAAQ,EAAA,IAAA;AAAA,EACR,KAAO,EAAA,IAAA;AAAA,EACP,KAAO,EAAA,IAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAA;AAEA,MAAM,IAAA,GAAO,MAAO,CAAA,IAAA,CAAK,KAAK,CAAA;AAEvB,MAAM,SAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,MAAM,CAAC,QAAU,EAAA,EAAE,SAAS,CAAA,GAAI,uBAAuB,OAAO,CAAA;AAE9D,EACE,IAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAE,CAAA,IAAA;AAAA,IACjB,CAAC,GAAA,KAAQ,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,KAAA,CAAM,OAAQ,CAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAO,GAAG,CAAC;AAAA,GACvE;AAEA,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,CAAqC,kCAAA,EAAA,IAAA,CAAK,IAAK,CAAA,GAAG,CAAC,CAAA,uDAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAEF,EAAM,MAAA,QAAA,GAAW,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAO,CAAA,CAACA,SAAU,EAAA,CAAC,GAAK,EAAA,KAAK,CAAM,KAAA;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAS,CAAA,GAAG,GAAUA,OAAAA,SAAAA;AAChC,IAAA,IAAI,KAAS,IAAA,KAAA,CAAM,MAAW,KAAA,KAAA,CAAM,MAAM,MAAQ,EAAA;AAChD,MAAA,OAAOA,SAAS,CAAA,MAAA;AAAA,QACd,GAAG,GAAG,CAAA,wDAAA;AAAA,OACR;AAAA;AAEF,IAAOA,OAAAA,SAAAA;AAAA,GACT,EAAG,EAAc,CAAA;AAEjB,EAAA,IAAI,QAAS,CAAA,MAAA;AACX,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,OAAA;AAAA,MACA;AAAA;AAAA,EAAyD,QAAA,CAAS,IAAK,CAAA,IAAI,CAAC,CAAA;AAAA,KAC9E;AAEF,EAAA,OAAA,CAAQ,MAAM,UAAa,GAAA,WAAA;AAC3B,EAAA,IAAI,CAAC,MAAO,CAAA,gBAAA,CAAiB,OAAO,CAAE,CAAA,gBAAA,CAAiB,SAAS,CAAG,EAAA;AACjE,IAAA,OAAA,CAAQ,MAAM,OAAU,GAAA,OAAA;AAAA;AAG1B,EAAA,YAAA,CAAa,MAAM;AAEjB,IAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,IAAA,MAAM,QAAQ,KAAM,CAAA,KAAA;AAEpB,IAAA,MAAM,mBAAmC,EAAC;AAE1C,IAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,IAAK,CAAA,aAAa,CAAE,CAAA,MAAA;AAAA,MAC/C,CAAC,QAAQ,GAAQ,KAAA;AACf,QAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,GAAI,CAAA,aAAA,EAAe,GAAG,CAAA;AAC/C,QAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,EAAO,GAAG,CAAA;AACzC,QAAI,IAAA,UAAA,EAAY,MAAW,KAAA,KAAA,CAAM,MAAQ,EAAA;AACvC,UAAMC,MAAAA,UAAAA,GAAYC,SAAW,CAAA,KAAA,EAAO,UAAU,CAAA;AAC9C,UAAA,MAAM,QAAQ,WAAYD,CAAAA,UAAAA,CAAU,QAAS,CAAA,GAAA,EAAK,CAAC,CAAA;AACnD,UAAA,MAAME,MAAQ,GAAA,QAAA,CAAS,EAAG,CAAA,QAAA,EAAU,CAAC,MAAW,KAAA;AAC9C,YAAM,KAAA,CAAA,GAAA,CAAIF,UAAU,CAAA,MAAM,CAAC,CAAA;AAAA,WAC5B,CAAA;AACD,UAAA,gBAAA,CAAiB,KAAKE,MAAK,CAAA;AAC3B,UAAA,MAAA,CAAO,GAAG,CAAI,GAAA,KAAA;AAAA,SAChB,MAAc,MAAA,CAAA,GAAG,CAAI,GAAA,QAAA;AACrB,QAAO,OAAA,MAAA;AAAA,OACT;AAAA,MACA;AAAC,KACH;AAEA,IAAA,MAAM,QAAW,GAAA,MAAA,CAAO,IAAK,CAAA,aAAa,CAAE,CAAA,MAAA;AAAA,MAC1C,CAAC,KAAK,GAAQ,KAAA;AACZ,QAAM,MAAA,CAAA,GAAI,cAAc,GAAG,CAAA;AAC3B,QAAQ,OAAA,CAAA,GAAA;AAAA,UACN,GAAA;AAAA,UACA,GAAA;AAAA,UACA,WAAA,CAAY,OAAO,CAAM,KAAA,QAAA,IAAY,MAAM,IAAO,GAAA,CAAA,CAAE,GAAI,EAAA,GAAI,CAAC;AAAA,SAC/D;AACA,QAAO,OAAA,GAAA;AAAA,OACT;AAAA,MACA;AAAC,KACH;AAEA,IAAA,MAAMF,WAAY,GAAA,cAAA;AAAA,MAChB,MACE,aAAa,QAAS,CAAA,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,SAAS,CAAG,EAAA,GAAA,EAAK,CAAW,QAAA,EAAA,QAAA,CAAS,OAAO,GAAI,EAAC,YAAY,QAAS,CAAA,MAAA,EAAQ,KAAK,CAAA,IAAA;AAAA,KAC1H;AAEA,IAAA,SAAS,aAAgB,GAAA;AACvB,MAAA,MAAM,WAAW,MAAO,CAAA,IAAA,CAAK,QAAQ,CAClC,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACZ,QAAA,IAAI,CAAI,GAAA,aAAA,CAAc,GAAG,CAAA,EAAG,GAAM,IAAA;AAClC,QAAI,IAAA,OAAO,CAAM,KAAA,WAAA,EAAoB,OAAA,IAAA;AACrC,QAAO,OAAA,CAAC,SAAS,GAAG,CAAA,EAAG,GAAG,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,OACtC,CACA,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAE3B,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA;AAGlB,IAAA,SAAS,iBAAoB,GAAA;AAC3B,MAAA,KAAA,CAAM,OAAO,aAAa,CAAA;AAAA;AAG5B,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,EAAG,CAAA,QAAA,EAAU,CAAC,CAAM,KAAA;AACzC,MAAkB,iBAAA,EAAA;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,YAAe,GAAA,MAAA,CAAO,IAAK,CAAA,QAAQ,CACtC,CAAA,MAAA;AAAA,MACC,CAAC,QACC,GAAQ,KAAA,GAAA,IAAO,QAAQ,GAAO,IAAA,GAAA,KAAQ,YAAY,GAAQ,KAAA;AAAA,KAE7D,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,GAAQ,KAAA;AACpB,MAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,GAAK,EAAA,QAAA,CAAS,GAAG,CAAC,CAAA;AACnC,MAAO,OAAA,GAAA;AAAA,KACT,EAAG,EAAE,CAAA;AAEP,IAAM,MAAA,OAAA,GAAU,YAAY,OAAS,EAAA;AAAA,iBACnCA,WAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,UAAU,MAAM;AACrB,MAAQ,OAAA,EAAA;AACR,MAAM,KAAA,EAAA;AACN,MAAA,gBAAA,CAAiB,OAAQ,CAAA,CAACE,MAAUA,KAAAA,MAAAA,EAAO,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAO,CAAA,QAAQ,CAAE,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACzC,QAAA,KAAA,CAAM,OAAQ,EAAA;AAAA,OACf,CAAA;AACD,MAAA,MAAA,CAAO,MAAO,CAAA,aAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AAC9C,QAAA,KAAA,EAAO,OAAU,IAAA;AAAA,OAClB,CAAA;AACD,MAAAF,WAAA,CAAU,OAAQ,EAAA;AAAA,KACnB,CAAA;AAAA,GACF,CAAA;AACH","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\nimport { onCleanup, createEffect } from \"solid-js\";\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\";\n\ntype ParallaxContainerProps = {\n range: number[];\n y: Array<string | number> | null;\n x: Array<string | number> | null;\n scale: Array<string | number> | null;\n rotate: Array<string | number> | null;\n opacity: Array<string | number> | null;\n backgroundColor: string[] | null;\n borderRadius: Array<string | number> | null;\n top: Array<string | number> | null;\n left: Array<string | number> | null;\n right: Array<string | number> | null;\n bottom: Array<string | number> | null;\n width: Array<string | number> | null;\n height: Array<string | number> | null;\n};\n\nexport const Name = `parallax-animation`;\n\nexport const PROPS = {\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 top: null,\n left: null,\n bottom: null,\n right: null,\n width: null,\n height: 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 top: null,\n left: null,\n bottom: null,\n right: null,\n width: null,\n height: null,\n};\n\nconst KEYS = Object.keys(PROPS);\n\nexport const Component: CorrectComponentType<ParallaxContainerProps> = (\n props,\n { element },\n) => {\n const [progress, { animate }] = useParallaxStickyLayer(element);\n\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 element.style.willChange = \"transform\";\n if (!window.getComputedStyle(element).getPropertyValue(\"display\")) {\n element.style.display = \"block\";\n }\n\n createEffect(() => {\n // Subscribe to all changes\n Object.values(props);\n const range = props.range;\n\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"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { provideParallaxContext } from '../../hooks/index.js';
|
|
2
|
+
|
|
3
|
+
const Name = `parallax-container`;
|
|
4
|
+
const Component = (props, { element }) => {
|
|
5
|
+
if (!props.maxPages)
|
|
6
|
+
return console.warn(
|
|
7
|
+
`${Name}: requires max-pages attribute to be set!`,
|
|
8
|
+
element
|
|
9
|
+
);
|
|
10
|
+
if (props.maxPages < 1)
|
|
11
|
+
return console.warn(
|
|
12
|
+
`${Name}: max-pages must be greater than or equal to 1!`,
|
|
13
|
+
element
|
|
14
|
+
);
|
|
15
|
+
provideParallaxContext(props, element);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { Component, Name };
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/parallax-container/index.ts"],"names":[],"mappings":";;AAOO,MAAM,IAAO,GAAA,CAAA,kBAAA;AAEb,MAAM,SAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,IAAI,CAAC,KAAM,CAAA,QAAA;AACT,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,GAAG,IAAI,CAAA,yCAAA,CAAA;AAAA,MACP;AAAA,KACF;AACF,EAAA,IAAI,MAAM,QAAW,GAAA,CAAA;AACnB,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,GAAG,IAAI,CAAA,+CAAA,CAAA;AAAA,MACP;AAAA,KACF;AACF,EAAA,sBAAA,CAAuB,OAAO,OAAO,CAAA;AACvC","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\nimport { provideParallaxContext } from \"../../hooks/index.js\";\n\ntype ParallaxContainerProps = {\n maxPages: number;\n};\n\nexport const Name = `parallax-container`;\n\nexport const Component: CorrectComponentType<ParallaxContainerProps> = (\n props,\n { element },\n) => {\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"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { provideParallaxStickyLayerContext } from '../../hooks/index.js';
|
|
2
|
+
|
|
3
|
+
const Name = `parallax-sticky-layer`;
|
|
4
|
+
const Component = (props, { element }) => {
|
|
5
|
+
if (!props.start)
|
|
6
|
+
return console.warn(
|
|
7
|
+
`${Name}: requires start attribute to be set!`,
|
|
8
|
+
element
|
|
9
|
+
);
|
|
10
|
+
if (!props.end)
|
|
11
|
+
return console.warn(`${Name}: requires end attribute to be set!`, element);
|
|
12
|
+
if (props.end <= props.start)
|
|
13
|
+
return console.warn(
|
|
14
|
+
`${Name}: the start attribute must be less than the end attribute!`,
|
|
15
|
+
element
|
|
16
|
+
);
|
|
17
|
+
if (props.start < 1 || props.end < 1)
|
|
18
|
+
return console.warn(
|
|
19
|
+
`${Name}: The start and end attributes must be greater than or equal to 1!`,
|
|
20
|
+
element
|
|
21
|
+
);
|
|
22
|
+
provideParallaxStickyLayerContext(props, element);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { Component, Name };
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/parallax-sticky-layer/index.ts"],"names":[],"mappings":";;AAQO,MAAM,IAAO,GAAA,CAAA,qBAAA;AAEb,MAAM,SAA4D,GAAA,CACvE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,IAAI,CAAC,KAAM,CAAA,KAAA;AACT,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,GAAG,IAAI,CAAA,qCAAA,CAAA;AAAA,MACP;AAAA,KACF;AACF,EAAA,IAAI,CAAC,KAAM,CAAA,GAAA;AACT,IAAA,OAAO,OAAQ,CAAA,IAAA,CAAK,CAAG,EAAA,IAAI,uCAAuC,OAAO,CAAA;AAC3E,EAAI,IAAA,KAAA,CAAM,OAAO,KAAM,CAAA,KAAA;AACrB,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,GAAG,IAAI,CAAA,0DAAA,CAAA;AAAA,MACP;AAAA,KACF;AACF,EAAA,IAAI,KAAM,CAAA,KAAA,GAAQ,CAAK,IAAA,KAAA,CAAM,GAAM,GAAA,CAAA;AACjC,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb,GAAG,IAAI,CAAA,kEAAA,CAAA;AAAA,MACP;AAAA,KACF;AACF,EAAA,iCAAA,CAAkC,OAAO,OAAO,CAAA;AAClD","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-utils\";\nimport { provideParallaxStickyLayerContext } from \"../../hooks/index.js\";\n\ntype StickyParallaxLayerProps = {\n start: number;\n end: number;\n};\n\nexport const Name = `parallax-sticky-layer`;\n\nexport const Component: CorrectComponentType<StickyParallaxLayerProps> = (\n props,\n { element },\n) => {\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"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const POSITION = {
|
|
2
|
+
TOP: "top",
|
|
3
|
+
BOTTOM: "bottom",
|
|
4
|
+
LEFT: "left",
|
|
5
|
+
RIGHT: "right"
|
|
6
|
+
};
|
|
7
|
+
const ACTION = {
|
|
8
|
+
OPEN: "open",
|
|
9
|
+
CLOSE: "close",
|
|
10
|
+
TOGGLE: "toggle"
|
|
11
|
+
};
|
|
12
|
+
const EVENT_NAMESPACE = `bryt:drawer`;
|
|
13
|
+
|
|
14
|
+
export { ACTION, EVENT_NAMESPACE, POSITION };
|
|
15
|
+
//# sourceMappingURL=consts.js.map
|
|
16
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/consts.ts"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA;AAAA,EACtB,GAAK,EAAA,KAAA;AAAA,EACL,MAAQ,EAAA,QAAA;AAAA,EACR,IAAM,EAAA,MAAA;AAAA,EACN,KAAO,EAAA;AACT;AAEO,MAAM,MAAS,GAAA;AAAA,EACpB,IAAM,EAAA,MAAA;AAAA,EACN,KAAO,EAAA,OAAA;AAAA,EACP,MAAQ,EAAA;AACV;AAEO,MAAM,eAAkB,GAAA,CAAA,WAAA","file":"consts.js","sourcesContent":["export type Position = (typeof POSITION)[keyof typeof POSITION];\nexport type Action = (typeof ACTION)[keyof typeof ACTION];\n\nexport const POSITION = {\n TOP: \"top\",\n BOTTOM: \"bottom\",\n LEFT: \"left\",\n RIGHT: \"right\",\n} as const;\n\nexport const ACTION = {\n OPEN: \"open\",\n CLOSE: \"close\",\n TOGGLE: \"toggle\",\n};\n\nexport const EVENT_NAMESPACE = `bryt:drawer` as const;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { splitProps, createEffect, batch, onCleanup, mergeProps } from 'solid-js';
|
|
2
|
+
import { createStore } from 'solid-js/store';
|
|
3
|
+
import { getContextFromProvider } from '@brytdesigns/web-component-utils';
|
|
4
|
+
import { createContext, provide, consume } from 'component-register';
|
|
5
|
+
import { motionValue, scroll } from 'motion';
|
|
6
|
+
|
|
7
|
+
function initializeParallaxContext(props) {
|
|
8
|
+
const [_internal, _state] = splitProps(props, ["root"]);
|
|
9
|
+
const scrollYProgress = motionValue(-1);
|
|
10
|
+
const scrollY = motionValue(-1);
|
|
11
|
+
const [info, setInfo] = createStore({
|
|
12
|
+
offset: [-1, -1],
|
|
13
|
+
scrollLength: -1
|
|
14
|
+
});
|
|
15
|
+
createEffect(() => {
|
|
16
|
+
const pages = _state.maxPages;
|
|
17
|
+
_internal.root.style.height = `${pages * 100}vh`;
|
|
18
|
+
_internal.root.style.width = `100%`;
|
|
19
|
+
_internal.root.style.position = "relative";
|
|
20
|
+
if (!_internal.root.style.display) {
|
|
21
|
+
_internal.root.style.display = "block";
|
|
22
|
+
}
|
|
23
|
+
const remove = scroll(
|
|
24
|
+
(_, info2) => {
|
|
25
|
+
const { y } = info2;
|
|
26
|
+
scrollYProgress.set(y.progress);
|
|
27
|
+
scrollY.set(y.current);
|
|
28
|
+
batch(() => {
|
|
29
|
+
setInfo("offset", 0, y.offset?.at(0) || 0);
|
|
30
|
+
setInfo("offset", 1, y.offset?.at(1) || 0);
|
|
31
|
+
setInfo("scrollLength", y.scrollLength);
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
target: _internal.root,
|
|
36
|
+
axis: "y",
|
|
37
|
+
offset: ["start start", "end end"]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
onCleanup(() => {
|
|
41
|
+
if (remove) {
|
|
42
|
+
remove();
|
|
43
|
+
}
|
|
44
|
+
scrollYProgress.destroy();
|
|
45
|
+
scrollY.destroy();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
return mergeProps(_state, {
|
|
49
|
+
scrollYProgress,
|
|
50
|
+
scrollY,
|
|
51
|
+
info
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const ParallaxContextState = createContext(initializeParallaxContext);
|
|
55
|
+
const provideParallaxContext = (initialState, element) => {
|
|
56
|
+
const props = mergeProps(initialState, { root: element });
|
|
57
|
+
return provide(ParallaxContextState, props, element);
|
|
58
|
+
};
|
|
59
|
+
const useParallaxContext = (context) => {
|
|
60
|
+
return context;
|
|
61
|
+
};
|
|
62
|
+
const useParallax = (element) => {
|
|
63
|
+
const context = consume(ParallaxContextState, element);
|
|
64
|
+
if (!context) {
|
|
65
|
+
throw console.error(
|
|
66
|
+
"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element."
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return useParallaxContext(context);
|
|
70
|
+
};
|
|
71
|
+
const getParallaxContext = (element) => {
|
|
72
|
+
const context = getContextFromProvider(
|
|
73
|
+
ParallaxContextState,
|
|
74
|
+
element
|
|
75
|
+
);
|
|
76
|
+
return useParallaxContext(context);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export { getParallaxContext, provideParallaxContext, useParallax, useParallaxContext };
|
|
80
|
+
//# sourceMappingURL=useParallax.js.map
|
|
81
|
+
//# sourceMappingURL=useParallax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useParallax.ts"],"names":["info"],"mappings":"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","file":"useParallax.js","sourcesContent":["import {\n onCleanup,\n createEffect,\n splitProps,\n mergeProps,\n batch,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport { getContextFromProvider } from \"@brytdesigns/web-component-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 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 getParallaxContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxContext>(\n ParallaxContextState,\n element,\n );\n return useParallaxContext(context);\n};\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { splitProps, createEffect, onCleanup, mergeProps } from 'solid-js';
|
|
2
|
+
import { getContextFromProvider } from '@brytdesigns/web-component-utils';
|
|
3
|
+
import { createContext, provide, consume } from 'component-register';
|
|
4
|
+
import { motionValue, transformValue, transform, frame, animate } from 'motion';
|
|
5
|
+
import { useParallax } from './useParallax';
|
|
6
|
+
import { normalizeTuple, isInRange, abortablePromise, awaitAllAnimations } from '../utils';
|
|
7
|
+
|
|
8
|
+
function initializeParallaxStickyLayerContext(props) {
|
|
9
|
+
const [_internal, _state] = splitProps(props, ["root", "start", "end"]);
|
|
10
|
+
const parallax = useParallax(_internal.root);
|
|
11
|
+
const progress = motionValue(-1);
|
|
12
|
+
const inRange = motionValue(false);
|
|
13
|
+
const belowRange = motionValue(false);
|
|
14
|
+
const aboveRange = motionValue(false);
|
|
15
|
+
const position = transformValue(
|
|
16
|
+
() => inRange.get() ? "sticky" : "absolute"
|
|
17
|
+
);
|
|
18
|
+
const transform$1 = transformValue(() => {
|
|
19
|
+
const isInRange2 = inRange.get();
|
|
20
|
+
const isBelowRange = belowRange.get();
|
|
21
|
+
const isAboveRange = aboveRange.get();
|
|
22
|
+
if (isInRange2) return "none";
|
|
23
|
+
if (isBelowRange) return `translate(0px, ${(_internal.start - 1) * 100}%)`;
|
|
24
|
+
if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}%)`;
|
|
25
|
+
});
|
|
26
|
+
const animations = motionValue([]);
|
|
27
|
+
const styles = transformValue(() => ({
|
|
28
|
+
position: position.get(),
|
|
29
|
+
transform: transform$1.get()
|
|
30
|
+
}));
|
|
31
|
+
_internal.root.style.top = "0";
|
|
32
|
+
_internal.root.style.right = "0";
|
|
33
|
+
_internal.root.style.bottom = "0";
|
|
34
|
+
_internal.root.style.left = "0";
|
|
35
|
+
_internal.root.style.height = "100vh";
|
|
36
|
+
if (!_internal.root.style.display) {
|
|
37
|
+
_internal.root.style.display = "block";
|
|
38
|
+
}
|
|
39
|
+
createEffect(() => {
|
|
40
|
+
const range = [_internal.start, _internal.end];
|
|
41
|
+
const maxPages = parallax.maxPages;
|
|
42
|
+
const normalizedRange = normalizeTuple(range, maxPages);
|
|
43
|
+
const [normStart, normEnd] = normalizedRange;
|
|
44
|
+
const transformer = transform(normalizedRange, [0, 1]);
|
|
45
|
+
const unsubscribe = parallax.scrollYProgress.on("change", (value) => {
|
|
46
|
+
inRange.set(isInRange({ range: normalizedRange, value }));
|
|
47
|
+
belowRange.set(value <= normStart);
|
|
48
|
+
aboveRange.set(value >= normEnd);
|
|
49
|
+
progress.set(transformer(value));
|
|
50
|
+
});
|
|
51
|
+
return onCleanup(() => {
|
|
52
|
+
unsubscribe();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
function updateStyles() {
|
|
56
|
+
const s = styles.get();
|
|
57
|
+
_internal.root.style.position = s.position;
|
|
58
|
+
_internal.root.style.transform = s.transform;
|
|
59
|
+
}
|
|
60
|
+
function renderStyles() {
|
|
61
|
+
frame.render(updateStyles);
|
|
62
|
+
}
|
|
63
|
+
function waitForAnimations() {
|
|
64
|
+
const a = animations.get();
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
abortablePromise(awaitAllAnimations(a), controller.signal).then(() => {
|
|
67
|
+
animations.set([]);
|
|
68
|
+
renderStyles();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
const unsubStyles = styles.on("change", (_) => {
|
|
72
|
+
if (progress.get() === 1 || progress.get() === 0)
|
|
73
|
+
return waitForAnimations();
|
|
74
|
+
animations.set([]);
|
|
75
|
+
renderStyles();
|
|
76
|
+
});
|
|
77
|
+
function _animate(...args) {
|
|
78
|
+
const animation = animate(...args);
|
|
79
|
+
animations.set([...animations.get(), animation]);
|
|
80
|
+
return animation;
|
|
81
|
+
}
|
|
82
|
+
onCleanup(() => {
|
|
83
|
+
unsubStyles();
|
|
84
|
+
});
|
|
85
|
+
return [progress, { animate: _animate }];
|
|
86
|
+
}
|
|
87
|
+
const ParallaxStickyLayerContextState = createContext(
|
|
88
|
+
initializeParallaxStickyLayerContext
|
|
89
|
+
);
|
|
90
|
+
const provideParallaxStickyLayerContext = (initialState, element) => {
|
|
91
|
+
const props = mergeProps(initialState, { root: element });
|
|
92
|
+
return provide(ParallaxStickyLayerContextState, props, element);
|
|
93
|
+
};
|
|
94
|
+
const useParallaxStickyLayerContext = (context) => {
|
|
95
|
+
return context;
|
|
96
|
+
};
|
|
97
|
+
const useParallaxStickyLayer = (element) => {
|
|
98
|
+
const context = consume(
|
|
99
|
+
ParallaxStickyLayerContextState,
|
|
100
|
+
element
|
|
101
|
+
);
|
|
102
|
+
if (!context) {
|
|
103
|
+
throw console.error(
|
|
104
|
+
"ParallaxContext not found! Please ensure to wrap your custom element with parallax-container element."
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
return useParallaxStickyLayerContext(context);
|
|
108
|
+
};
|
|
109
|
+
const getParallaxStickyLayerContext = (element) => {
|
|
110
|
+
const context = getContextFromProvider(
|
|
111
|
+
ParallaxStickyLayerContextState,
|
|
112
|
+
element
|
|
113
|
+
);
|
|
114
|
+
return useParallaxStickyLayerContext(context);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export { getParallaxStickyLayerContext, provideParallaxStickyLayerContext, useParallaxStickyLayer, useParallaxStickyLayerContext };
|
|
118
|
+
//# sourceMappingURL=useParallaxStickyLayer.js.map
|
|
119
|
+
//# sourceMappingURL=useParallaxStickyLayer.js.map
|
|
@@ -0,0 +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 { getContextFromProvider } from \"@brytdesigns/web-component-utils\";\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 { useParallax } from \"./useParallax\";\nimport {\n normalizeTuple,\n isInRange,\n abortablePromise,\n awaitAllAnimations,\n} 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}%)`;\n if (isAboveRange) return `translate(0px, ${(_internal.end - 1) * 100}%)`;\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 = \"0\";\n _internal.root.style.right = \"0\";\n _internal.root.style.bottom = \"0\";\n _internal.root.style.left = \"0\";\n _internal.root.style.height = \"100vh\";\n if (!_internal.root.style.display) {\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 getParallaxStickyLayerContext = (element: Element) => {\n const context = getContextFromProvider<ParallaxStickyLayerContext>(\n ParallaxStickyLayerContextState,\n element,\n );\n return useParallaxStickyLayerContext(context);\n};\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Generated by dts-bundle-generator v9.5.1
|
|
2
|
+
|
|
3
|
+
import { ICustomElement } from 'component-register';
|
|
4
|
+
import { AnimationPlaybackControlsWithThen } from 'motion';
|
|
5
|
+
|
|
6
|
+
export declare const useParallax: (element: HTMLElement & ICustomElement) => {
|
|
7
|
+
maxPages: number;
|
|
8
|
+
scrollYProgress: import("motion").MotionValue<number>;
|
|
9
|
+
scrollY: import("motion").MotionValue<number>;
|
|
10
|
+
info: {
|
|
11
|
+
offset: number[];
|
|
12
|
+
scrollLength: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare const getParallaxContext: (element: Element) => {
|
|
16
|
+
maxPages: number;
|
|
17
|
+
scrollYProgress: import("motion").MotionValue<number>;
|
|
18
|
+
scrollY: import("motion").MotionValue<number>;
|
|
19
|
+
info: {
|
|
20
|
+
offset: number[];
|
|
21
|
+
scrollLength: number;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare const useParallaxStickyLayer: (element: HTMLElement & ICustomElement) => readonly [
|
|
25
|
+
import("motion").MotionValue<number>,
|
|
26
|
+
{
|
|
27
|
+
readonly animate: (object: {} | {}[], keyframes: import("motion").ObjectTarget<{}>, options?: import("motion").AnimationOptions | undefined) => AnimationPlaybackControlsWithThen;
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
export declare const getParallaxStickyLayerContext: (element: Element) => readonly [
|
|
31
|
+
import("motion").MotionValue<number>,
|
|
32
|
+
{
|
|
33
|
+
readonly animate: (object: {} | {}[], keyframes: import("motion").ObjectTarget<{}>, options?: import("motion").AnimationOptions | undefined) => AnimationPlaybackControlsWithThen;
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { customShadowlessElement, correctElementType } from '@brytdesigns/web-component-utils';
|
|
2
|
+
import { ParallaxContainer, ParallaxStickyLayer, ParallaxAnimation } from './components/index.js';
|
|
3
|
+
export { getParallaxContext, getParallaxStickyLayerContext, useParallax, useParallaxStickyLayer } from './hooks/index.js';
|
|
4
|
+
|
|
5
|
+
customShadowlessElement(
|
|
6
|
+
ParallaxContainer.Name,
|
|
7
|
+
{
|
|
8
|
+
maxPages: 2
|
|
9
|
+
},
|
|
10
|
+
correctElementType(ParallaxContainer.Component)
|
|
11
|
+
);
|
|
12
|
+
customShadowlessElement(
|
|
13
|
+
ParallaxStickyLayer.Name,
|
|
14
|
+
{
|
|
15
|
+
start: 1,
|
|
16
|
+
end: 2
|
|
17
|
+
},
|
|
18
|
+
correctElementType(ParallaxStickyLayer.Component)
|
|
19
|
+
);
|
|
20
|
+
customShadowlessElement(
|
|
21
|
+
ParallaxAnimation.Name,
|
|
22
|
+
{
|
|
23
|
+
range: [0, 1],
|
|
24
|
+
...ParallaxAnimation.PROPS
|
|
25
|
+
},
|
|
26
|
+
correctElementType(ParallaxAnimation.Component)
|
|
27
|
+
);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAWA,uBAAA;AAAA,EACE,iBAAkB,CAAA,IAAA;AAAA,EAClB;AAAA,IACE,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,kBAAA,CAAmB,kBAAkB,SAAS;AAChD,CAAA;AAEA,uBAAA;AAAA,EACE,mBAAoB,CAAA,IAAA;AAAA,EACpB;AAAA,IACE,KAAO,EAAA,CAAA;AAAA,IACP,GAAK,EAAA;AAAA,GACP;AAAA,EACA,kBAAA,CAAmB,oBAAoB,SAAS;AAClD,CAAA;AAEA,uBAAA;AAAA,EACE,iBAAkB,CAAA,IAAA;AAAA,EAClB;AAAA,IACE,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACZ,GAAG,iBAAkB,CAAA;AAAA,GACvB;AAAA,EACA,kBAAA,CAAmB,kBAAkB,SAAS;AAChD,CAAA","file":"index.js","sourcesContent":["import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-utils\";\n\nimport {\n ParallaxContainer,\n ParallaxStickyLayer,\n ParallaxAnimation,\n} from \"./components/index.js\";\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 {\n range: [0, 1],\n ...ParallaxAnimation.PROPS,\n },\n correctElementType(ParallaxAnimation.Component),\n);\n\nexport {\n useParallax,\n getParallaxContext,\n useParallaxStickyLayer,\n getParallaxStickyLayerContext,\n} from \"./hooks/index.js\";\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
function normalizeTuple(range, max) {
|
|
2
|
+
if (max <= 1) {
|
|
3
|
+
throw new Error("The maximum value must be greater than 1.");
|
|
4
|
+
}
|
|
5
|
+
const [start, end] = range;
|
|
6
|
+
const normalizedStart = (start - 1) / (max - 1);
|
|
7
|
+
const normalizedEnd = (end - 1) / (max - 1);
|
|
8
|
+
return [normalizedStart, normalizedEnd];
|
|
9
|
+
}
|
|
10
|
+
function isInRange({
|
|
11
|
+
range: [start, end],
|
|
12
|
+
value
|
|
13
|
+
}) {
|
|
14
|
+
return start <= value && end >= value;
|
|
15
|
+
}
|
|
16
|
+
function abortablePromise(promise, signal) {
|
|
17
|
+
if (signal.aborted) {
|
|
18
|
+
return new Promise((_, rej) => rej(signal.reason));
|
|
19
|
+
}
|
|
20
|
+
return new Promise(async (res, rej) => {
|
|
21
|
+
signal.addEventListener(
|
|
22
|
+
"abort",
|
|
23
|
+
() => {
|
|
24
|
+
rej(signal.reason);
|
|
25
|
+
},
|
|
26
|
+
{ once: true }
|
|
27
|
+
);
|
|
28
|
+
promise.then(res);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function awaitAllAnimations(promises) {
|
|
32
|
+
return new Promise((resolve, _) => {
|
|
33
|
+
const results = [];
|
|
34
|
+
let remaining = promises.length;
|
|
35
|
+
if (remaining === 0) {
|
|
36
|
+
resolve([]);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
function updateResults(value, index) {
|
|
40
|
+
results[index] = value;
|
|
41
|
+
remaining -= 1;
|
|
42
|
+
if (remaining === 0) {
|
|
43
|
+
resolve(results);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
promises.forEach((p, i) => {
|
|
47
|
+
try {
|
|
48
|
+
if (p?.state === "idle") {
|
|
49
|
+
updateResults(null, i);
|
|
50
|
+
} else {
|
|
51
|
+
p.then(() => {
|
|
52
|
+
updateResults(null, i);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
} catch (e) {
|
|
56
|
+
p.then(() => {
|
|
57
|
+
updateResults(null, i);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async function controlPromise(controls) {
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
controls.then(() => resolve(null));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { abortablePromise, awaitAllAnimations, controlPromise, isInRange, normalizeTuple };
|
|
70
|
+
//# sourceMappingURL=utils.js.map
|
|
71
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils.ts"],"names":[],"mappings":"AAEO,SAAS,cAAA,CAAe,OAAyB,GAAa,EAAA;AACnE,EAAA,IAAI,OAAO,CAAG,EAAA;AACZ,IAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA;AAAA;AAG7D,EAAM,MAAA,CAAC,KAAO,EAAA,GAAG,CAAI,GAAA,KAAA;AACrB,EAAM,MAAA,eAAA,GAAA,CAAmB,KAAQ,GAAA,CAAA,KAAM,GAAM,GAAA,CAAA,CAAA;AAC7C,EAAM,MAAA,aAAA,GAAA,CAAiB,GAAM,GAAA,CAAA,KAAM,GAAM,GAAA,CAAA,CAAA;AAEzC,EAAO,OAAA,CAAC,iBAAiB,aAAa,CAAA;AACxC;AAEO,SAAS,SAAU,CAAA;AAAA,EACxB,KAAA,EAAO,CAAC,KAAA,EAAO,GAAG,CAAA;AAAA,EAClB;AACF,CAGG,EAAA;AACD,EAAO,OAAA,KAAA,IAAS,SAAS,GAAO,IAAA,KAAA;AAClC;AAEO,SAAS,gBAAA,CAAiB,SAAuB,MAAqB,EAAA;AAC3E,EAAA,IAAI,OAAO,OAAS,EAAA;AAClB,IAAO,OAAA,IAAI,QAAQ,CAAC,CAAA,EAAG,QAAQ,GAAI,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA;AAGnD,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,GAAA,EAAK,GAAQ,KAAA;AACrC,IAAO,MAAA,CAAA,gBAAA;AAAA,MACL,OAAA;AAAA,MACA,MAAM;AACJ,QAAA,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,OACnB;AAAA,MACA,EAAE,MAAM,IAAK;AAAA,KACf;AACA,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,GACjB,CAAA;AACH;AAEO,SAAS,mBACd,QACA,EAAA;AACA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,CAAM,KAAA;AACjC,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,IAAI,YAAY,QAAS,CAAA,MAAA;AACzB,IAAA,IAAI,cAAc,CAAG,EAAA;AACnB,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA;AAAA;AAGF,IAAS,SAAA,aAAA,CAAiB,OAAU,KAAe,EAAA;AACjD,MAAA,OAAA,CAAQ,KAAK,CAAI,GAAA,KAAA;AACjB,MAAa,SAAA,IAAA,CAAA;AACb,MAAA,IAAI,cAAc,CAAG,EAAA;AACnB,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AACjB;AAGF,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAM,KAAA;AACzB,MAAI,IAAA;AACF,QAAI,IAAA,CAAA,EAAG,UAAU,MAAQ,EAAA;AACvB,UAAA,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,SAChB,MAAA;AACL,UAAA,CAAA,CAAE,KAAK,MAAM;AACX,YAAA,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,WACtB,CAAA;AAAA;AACH,eACO,CAAG,EAAA;AACV,QAAA,CAAA,CAAE,KAAK,MAAM;AACX,UAAA,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,SACtB,CAAA;AAAA;AACH,KACD,CAAA;AAAA,GACF,CAAA;AACH;AAEA,eAAsB,eACpB,QACA,EAAA;AACA,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,IAAA,QAAA,CAAS,IAAK,CAAA,MAAM,OAAQ,CAAA,IAAI,CAAC,CAAA;AAAA,GAClC,CAAA;AACH","file":"utils.js","sourcesContent":["import type { AnimationPlaybackControlsWithThen } from \"motion\";\n\nexport 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 abortablePromise(promise: Promise<any>, signal: AbortSignal) {\n if (signal.aborted) {\n return new Promise((_, rej) => rej(signal.reason));\n }\n\n return new Promise(async (res, rej) => {\n signal.addEventListener(\n \"abort\",\n () => {\n rej(signal.reason);\n },\n { once: true },\n );\n promise.then(res);\n });\n}\n\nexport function awaitAllAnimations(\n promises: AnimationPlaybackControlsWithThen[],\n) {\n return new Promise((resolve, _) => {\n const results: any[] = [];\n let remaining = promises.length;\n if (remaining === 0) {\n resolve([]); // zero‐length edge case\n return;\n }\n\n function updateResults<T>(value: T, index: number) {\n results[index] = value;\n remaining -= 1;\n if (remaining === 0) {\n resolve(results);\n }\n }\n\n promises.forEach((p, i) => {\n try {\n if (p?.state === \"idle\") {\n updateResults(null, i);\n } else {\n p.then(() => {\n updateResults(null, i);\n });\n }\n } catch (e) {\n p.then(() => {\n updateResults(null, i);\n });\n }\n });\n });\n}\n\nexport async function controlPromise(\n controls: AnimationPlaybackControlsWithThen,\n) {\n return new Promise((resolve) => {\n controls.then(() => resolve(null));\n });\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@brytdesigns/web-component-parallax",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Headless parallax animation web component",
|
|
5
|
+
"main": "./dist/main/index.js",
|
|
6
|
+
"module": "./dist/main/index.js",
|
|
7
|
+
"types": "./dist/main/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/main/index.d.ts",
|
|
12
|
+
"module": "./dist/main/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [],
|
|
19
|
+
"author": "Bryt Designs",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"component-register": "^0.8.7",
|
|
23
|
+
"motion": "^12.18.1",
|
|
24
|
+
"solid-element": "^1.9.1",
|
|
25
|
+
"solid-js": "^1.9.7",
|
|
26
|
+
"@brytdesigns/web-component-utils": "0.1.14"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"dts-bundle-generator": "^9.5.1",
|
|
30
|
+
"tsup": "^8.4.0"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup --clean",
|
|
34
|
+
"typecheck": "tsc --noEmit"
|
|
35
|
+
}
|
|
36
|
+
}
|