@rethink-js/rt-smooth-scroll 1.0.2 → 1.2.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 +131 -65
- package/dist/index.js +313 -148
- package/dist/index.js.map +2 -2
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @rethink-js/rt-smooth-scroll v1.0
|
|
1
|
+
/*! @rethink-js/rt-smooth-scroll v1.2.0 | MIT */
|
|
2
2
|
(() => {
|
|
3
3
|
// src/index.js
|
|
4
4
|
(function() {
|
|
@@ -37,7 +37,9 @@
|
|
|
37
37
|
}
|
|
38
38
|
function parseNum(v, def) {
|
|
39
39
|
if (v === null || v === void 0) return def;
|
|
40
|
-
var
|
|
40
|
+
var s = String(v).trim();
|
|
41
|
+
if (!s.length) return def;
|
|
42
|
+
var n = Number(s);
|
|
41
43
|
return Number.isFinite(n) ? n : def;
|
|
42
44
|
}
|
|
43
45
|
function parseStr(v, def) {
|
|
@@ -50,6 +52,29 @@
|
|
|
50
52
|
if (t > 1) return 1;
|
|
51
53
|
return t;
|
|
52
54
|
}
|
|
55
|
+
function resolveTargetFromStr(selectorStr) {
|
|
56
|
+
if (!selectorStr) return null;
|
|
57
|
+
var s = String(selectorStr).trim();
|
|
58
|
+
if (!s) return null;
|
|
59
|
+
if (s === "window") return window;
|
|
60
|
+
var match = s.match(/^(.*)\(\s*(\d+)\s*\)$/);
|
|
61
|
+
if (match) {
|
|
62
|
+
var baseSelector = match[1].trim();
|
|
63
|
+
var index = parseInt(match[2], 10);
|
|
64
|
+
if (!baseSelector || isNaN(index) || index < 1) return null;
|
|
65
|
+
try {
|
|
66
|
+
var all = document.querySelectorAll(baseSelector);
|
|
67
|
+
return all[index - 1] || null;
|
|
68
|
+
} catch (e) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
return document.querySelector(s);
|
|
74
|
+
} catch (e) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
53
78
|
function easingByName(name) {
|
|
54
79
|
var n = String(name || "").trim();
|
|
55
80
|
if (!n) return null;
|
|
@@ -92,105 +117,90 @@
|
|
|
92
117
|
};
|
|
93
118
|
return easings[n] || null;
|
|
94
119
|
}
|
|
95
|
-
function
|
|
96
|
-
if (!el) return false;
|
|
97
|
-
for (var i = 0; i < el.attributes.length; i++) {
|
|
98
|
-
var n = el.attributes[i].name;
|
|
99
|
-
if (n && n.indexOf("rt-smooth-scroll-") === 0) return true;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
function ensureDefaultsIfNeeded() {
|
|
120
|
+
function ensureAutoEnableIfNeeded() {
|
|
104
121
|
var body = document.body;
|
|
105
|
-
var html = document.documentElement;
|
|
106
122
|
if (!body) return;
|
|
107
123
|
var instances = document.querySelectorAll("[rt-smooth-scroll-instance]");
|
|
108
124
|
var hasInstances = instances && instances.length > 0;
|
|
109
|
-
if (!hasAttrAnywhere("rt-smooth-scroll") && !hasInstances)
|
|
125
|
+
if (!hasAttrAnywhere("rt-smooth-scroll") && !hasInstances) {
|
|
110
126
|
body.setAttribute("rt-smooth-scroll", "");
|
|
111
|
-
var configured = hasAnyConfigOn(html) || hasAnyConfigOn(body);
|
|
112
|
-
if (configured || hasInstances) return;
|
|
113
|
-
var defaults = {
|
|
114
|
-
"rt-smooth-scroll-lerp": "0.25",
|
|
115
|
-
"rt-smooth-scroll-orientation": "vertical",
|
|
116
|
-
"rt-smooth-scroll-gesture-orientation": "vertical",
|
|
117
|
-
"rt-smooth-scroll-normalize-wheel": "true",
|
|
118
|
-
"rt-smooth-scroll-wheel-multiplier": "1",
|
|
119
|
-
"rt-smooth-scroll-easing": "easeOutCubic",
|
|
120
|
-
"rt-smooth-scroll-smooth-touch": "true",
|
|
121
|
-
"rt-smooth-scroll-sync-touch": "true",
|
|
122
|
-
"rt-smooth-scroll-sync-touch-lerp": "0",
|
|
123
|
-
"rt-smooth-scroll-touch-inertia-multiplier": "10",
|
|
124
|
-
"rt-smooth-scroll-touch-multiplier": "2"
|
|
125
|
-
};
|
|
126
|
-
for (var k in defaults) {
|
|
127
|
-
if (!html.hasAttribute(k) && !body.hasAttribute(k))
|
|
128
|
-
body.setAttribute(k, defaults[k]);
|
|
129
127
|
}
|
|
130
128
|
}
|
|
129
|
+
function isAttrPresent(v) {
|
|
130
|
+
return v !== null && v !== void 0;
|
|
131
|
+
}
|
|
131
132
|
function readOptions(getLocal) {
|
|
132
133
|
var prefix = "rt-smooth-scroll-";
|
|
133
134
|
function localOrGlobal(name) {
|
|
134
135
|
var v = getLocal(name);
|
|
135
|
-
if (v
|
|
136
|
+
if (isAttrPresent(v)) return v;
|
|
136
137
|
return getAttr(name);
|
|
137
138
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
var hasDuration = rawDuration !== null && rawDuration !== void 0 && String(rawDuration).trim() !== "";
|
|
141
|
-
var hasLerp = rawLerp !== null && rawLerp !== void 0 && String(rawLerp).trim() !== "";
|
|
142
|
-
var duration = parseNum(rawDuration, 1.15);
|
|
143
|
-
var lerp = parseNum(rawLerp, 0.25);
|
|
144
|
-
if (hasDuration && !hasLerp) {
|
|
145
|
-
lerp = 0;
|
|
139
|
+
function getRaw(name) {
|
|
140
|
+
return localOrGlobal(prefix + name);
|
|
146
141
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
var
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
);
|
|
155
|
-
var
|
|
156
|
-
|
|
157
|
-
true
|
|
158
|
-
);
|
|
159
|
-
var wheelMultiplier = parseNum(
|
|
160
|
-
localOrGlobal(prefix + "wheel-multiplier"),
|
|
161
|
-
1
|
|
162
|
-
);
|
|
163
|
-
var smoothTouch = parseBool(localOrGlobal(prefix + "smooth-touch"), true);
|
|
164
|
-
var syncTouch = parseBool(localOrGlobal(prefix + "sync-touch"), true);
|
|
165
|
-
var syncTouchLerp = parseNum(localOrGlobal(prefix + "sync-touch-lerp"), 0);
|
|
166
|
-
var touchInertiaMultiplier = parseNum(
|
|
167
|
-
localOrGlobal(prefix + "touch-inertia-multiplier"),
|
|
168
|
-
10
|
|
169
|
-
);
|
|
170
|
-
var touchMultiplier = parseNum(
|
|
171
|
-
localOrGlobal(prefix + "touch-multiplier"),
|
|
172
|
-
2
|
|
173
|
-
);
|
|
174
|
-
var infinite = parseBool(localOrGlobal(prefix + "infinite"), false);
|
|
175
|
-
var easingName = parseStr(localOrGlobal(prefix + "easing"), "easeOutCubic");
|
|
142
|
+
function hasRaw(name) {
|
|
143
|
+
return isAttrPresent(getRaw(name));
|
|
144
|
+
}
|
|
145
|
+
var opts = {};
|
|
146
|
+
var hasLerp = hasRaw("lerp");
|
|
147
|
+
var lerp = parseNum(getRaw("lerp"), void 0);
|
|
148
|
+
var hasDuration = hasRaw("duration");
|
|
149
|
+
var duration = parseNum(getRaw("duration"), void 0);
|
|
150
|
+
var hasEasing = hasRaw("easing");
|
|
151
|
+
var easingName = parseStr(getRaw("easing"), "");
|
|
176
152
|
var easingFn = easingByName(easingName);
|
|
177
|
-
|
|
178
|
-
lerp
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
wheelMultiplier,
|
|
183
|
-
smoothTouch,
|
|
184
|
-
syncTouch,
|
|
185
|
-
syncTouchLerp,
|
|
186
|
-
touchInertiaMultiplier,
|
|
187
|
-
touchMultiplier,
|
|
188
|
-
infinite
|
|
189
|
-
};
|
|
190
|
-
if (lerp === 0) {
|
|
191
|
-
opts.duration = duration;
|
|
153
|
+
if (hasLerp && lerp !== void 0) {
|
|
154
|
+
opts.lerp = lerp;
|
|
155
|
+
} else {
|
|
156
|
+
if (hasDuration && duration !== void 0) opts.duration = duration;
|
|
157
|
+
if (hasEasing && easingFn) opts.easing = easingFn;
|
|
192
158
|
}
|
|
193
|
-
if (
|
|
159
|
+
if (hasRaw("orientation"))
|
|
160
|
+
opts.orientation = parseStr(getRaw("orientation"), "");
|
|
161
|
+
if (hasRaw("gesture-orientation"))
|
|
162
|
+
opts.gestureOrientation = parseStr(getRaw("gesture-orientation"), "");
|
|
163
|
+
var smoothWheelRaw = getRaw("smooth-wheel");
|
|
164
|
+
var normalizeWheelRaw = getRaw("normalize-wheel");
|
|
165
|
+
if (isAttrPresent(smoothWheelRaw))
|
|
166
|
+
opts.smoothWheel = parseBool(smoothWheelRaw, true);
|
|
167
|
+
else if (isAttrPresent(normalizeWheelRaw))
|
|
168
|
+
opts.smoothWheel = parseBool(normalizeWheelRaw, true);
|
|
169
|
+
if (hasRaw("wheel-multiplier"))
|
|
170
|
+
opts.wheelMultiplier = parseNum(getRaw("wheel-multiplier"), void 0);
|
|
171
|
+
if (hasRaw("touch-multiplier"))
|
|
172
|
+
opts.touchMultiplier = parseNum(getRaw("touch-multiplier"), void 0);
|
|
173
|
+
if (hasRaw("sync-touch"))
|
|
174
|
+
opts.syncTouch = parseBool(getRaw("sync-touch"), false);
|
|
175
|
+
if (hasRaw("sync-touch-lerp"))
|
|
176
|
+
opts.syncTouchLerp = parseNum(getRaw("sync-touch-lerp"), void 0);
|
|
177
|
+
if (hasRaw("touch-inertia-exponent"))
|
|
178
|
+
opts.touchInertiaExponent = parseNum(
|
|
179
|
+
getRaw("touch-inertia-exponent"),
|
|
180
|
+
void 0
|
|
181
|
+
);
|
|
182
|
+
if (hasRaw("infinite"))
|
|
183
|
+
opts.infinite = parseBool(getRaw("infinite"), false);
|
|
184
|
+
if (hasRaw("auto-resize"))
|
|
185
|
+
opts.autoResize = parseBool(getRaw("auto-resize"), true);
|
|
186
|
+
if (hasRaw("overscroll"))
|
|
187
|
+
opts.overscroll = parseBool(getRaw("overscroll"), true);
|
|
188
|
+
if (hasRaw("anchors")) {
|
|
189
|
+
var s = String(getRaw("anchors") || "").trim();
|
|
190
|
+
if (s === "" || s.toLowerCase() === "true") opts.anchors = true;
|
|
191
|
+
else if (s.toLowerCase() === "false") opts.anchors = false;
|
|
192
|
+
else {
|
|
193
|
+
try {
|
|
194
|
+
opts.anchors = JSON.parse(s);
|
|
195
|
+
} catch (e) {
|
|
196
|
+
opts.anchors = true;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (hasRaw("auto-toggle"))
|
|
201
|
+
opts.autoToggle = parseBool(getRaw("auto-toggle"), false);
|
|
202
|
+
if (hasRaw("allow-nested-scroll"))
|
|
203
|
+
opts.allowNestedScroll = parseBool(getRaw("allow-nested-scroll"), false);
|
|
194
204
|
var extra = localOrGlobal(prefix + "options-json");
|
|
195
205
|
if (extra) {
|
|
196
206
|
try {
|
|
@@ -229,35 +239,73 @@
|
|
|
229
239
|
document.head.appendChild(s);
|
|
230
240
|
});
|
|
231
241
|
}
|
|
242
|
+
function convertAnchorLinks() {
|
|
243
|
+
var raw = getAttr("rt-smooth-scroll-anchor-links");
|
|
244
|
+
if (!parseBool(raw, false)) return;
|
|
245
|
+
var links = document.querySelectorAll('a[href*="#"]');
|
|
246
|
+
var currentPath = window.location.pathname.replace(/\/+$/, "").toLowerCase();
|
|
247
|
+
var origin = window.location.origin;
|
|
248
|
+
for (var i = 0; i < links.length; i++) {
|
|
249
|
+
var link = links[i];
|
|
250
|
+
if (link.hasAttribute("rt-smooth-scroll-to")) continue;
|
|
251
|
+
var href = link.getAttribute("href");
|
|
252
|
+
if (!href) continue;
|
|
253
|
+
var hashIndex = href.indexOf("#");
|
|
254
|
+
if (hashIndex === -1) continue;
|
|
255
|
+
var pathPart = href.substring(0, hashIndex);
|
|
256
|
+
var hashPart = href.substring(hashIndex);
|
|
257
|
+
if (hashPart.length <= 1) continue;
|
|
258
|
+
var isLocal = false;
|
|
259
|
+
if (pathPart === "" || pathPart === "./") {
|
|
260
|
+
isLocal = true;
|
|
261
|
+
} else {
|
|
262
|
+
var normPath = pathPart.replace(/\/+$/, "").toLowerCase();
|
|
263
|
+
if (pathPart.indexOf("http") === 0) {
|
|
264
|
+
try {
|
|
265
|
+
var u = new URL(href, origin);
|
|
266
|
+
if (u.origin === origin && u.pathname.replace(/\/+$/, "").toLowerCase() === currentPath) {
|
|
267
|
+
isLocal = true;
|
|
268
|
+
}
|
|
269
|
+
} catch (e) {
|
|
270
|
+
}
|
|
271
|
+
} else if (normPath === currentPath) {
|
|
272
|
+
isLocal = true;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (isLocal) {
|
|
276
|
+
link.setAttribute("rt-smooth-scroll-to", hashPart);
|
|
277
|
+
link.removeAttribute("href");
|
|
278
|
+
link.style.cursor = "pointer";
|
|
279
|
+
link.setAttribute("tabindex", "0");
|
|
280
|
+
link.setAttribute("role", "button");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
232
284
|
function init() {
|
|
233
|
-
|
|
285
|
+
ensureAutoEnableIfNeeded();
|
|
286
|
+
convertAnchorLinks();
|
|
234
287
|
var enabledRoot = hasAttrAnywhere("rt-smooth-scroll");
|
|
235
288
|
var instanceEls = document.querySelectorAll("[rt-smooth-scroll-instance]");
|
|
236
|
-
var
|
|
289
|
+
var hasInstances = instanceEls && instanceEls.length > 0;
|
|
290
|
+
var shouldRun = enabledRoot || hasInstances;
|
|
237
291
|
if (!shouldRun) return;
|
|
238
292
|
var lenisSrc = parseStr(
|
|
239
293
|
getAttr("rt-smooth-scroll-lenis-src"),
|
|
240
294
|
"https://cdn.jsdelivr.net/npm/lenis@1.3.16/dist/lenis.min.js"
|
|
241
295
|
);
|
|
242
|
-
var observeResize = parseBool(
|
|
243
|
-
getAttr("rt-smooth-scroll-observe-resize"),
|
|
244
|
-
true
|
|
245
|
-
);
|
|
246
|
-
var observeMutations = parseBool(
|
|
247
|
-
getAttr("rt-smooth-scroll-observe-mutations"),
|
|
248
|
-
true
|
|
249
|
-
);
|
|
250
296
|
var resizeDebounceMs = parseNum(
|
|
251
297
|
getAttr("rt-smooth-scroll-resize-debounce-ms"),
|
|
252
298
|
0
|
|
253
299
|
);
|
|
300
|
+
var debug = parseBool(getAttr("rt-smooth-scroll-debug"), true);
|
|
254
301
|
var state = {
|
|
255
302
|
destroyed: false,
|
|
256
303
|
rafId: 0,
|
|
257
304
|
instances: {},
|
|
258
305
|
order: [],
|
|
259
|
-
|
|
260
|
-
|
|
306
|
+
resizeTimers: {},
|
|
307
|
+
clickListener: null,
|
|
308
|
+
keyListener: null
|
|
261
309
|
};
|
|
262
310
|
function scheduleResize(id) {
|
|
263
311
|
var inst = state.instances[id];
|
|
@@ -285,71 +333,161 @@
|
|
|
285
333
|
}
|
|
286
334
|
state.rafId = requestAnimationFrame(raf);
|
|
287
335
|
}
|
|
288
|
-
function addObservers(id, wrapperEl) {
|
|
289
|
-
if (!wrapperEl || wrapperEl === window) return;
|
|
290
|
-
var ro = null;
|
|
291
|
-
var mo = null;
|
|
292
|
-
if (observeResize && typeof ResizeObserver !== "undefined") {
|
|
293
|
-
ro = new ResizeObserver(function() {
|
|
294
|
-
scheduleResize(id);
|
|
295
|
-
});
|
|
296
|
-
ro.observe(wrapperEl);
|
|
297
|
-
}
|
|
298
|
-
if (observeMutations && typeof MutationObserver !== "undefined") {
|
|
299
|
-
mo = new MutationObserver(function() {
|
|
300
|
-
scheduleResize(id);
|
|
301
|
-
});
|
|
302
|
-
mo.observe(wrapperEl, { childList: true, subtree: true });
|
|
303
|
-
}
|
|
304
|
-
state.observers[id] = { ro, mo };
|
|
305
|
-
}
|
|
306
|
-
function removeObservers(id) {
|
|
307
|
-
var obs = state.observers[id];
|
|
308
|
-
if (!obs) return;
|
|
309
|
-
if (obs.ro) obs.ro.disconnect();
|
|
310
|
-
if (obs.mo) obs.mo.disconnect();
|
|
311
|
-
delete state.observers[id];
|
|
312
|
-
}
|
|
313
336
|
function sanitizeOptionsForLog(opts) {
|
|
314
337
|
var out = {};
|
|
315
338
|
for (var k in opts) {
|
|
316
339
|
if (!Object.prototype.hasOwnProperty.call(opts, k)) continue;
|
|
317
340
|
var v = opts[k];
|
|
318
|
-
if (typeof v === "function")
|
|
319
|
-
|
|
320
|
-
} else {
|
|
321
|
-
out[k] = v;
|
|
322
|
-
}
|
|
341
|
+
if (typeof v === "function") out[k] = "[Function]";
|
|
342
|
+
else out[k] = v;
|
|
323
343
|
}
|
|
324
344
|
return out;
|
|
325
345
|
}
|
|
326
|
-
function
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
if (
|
|
330
|
-
|
|
331
|
-
state.instances[id] = inst;
|
|
332
|
-
state.order.push(id);
|
|
333
|
-
if (wrapper && wrapper !== window) addObservers(id, wrapper);
|
|
334
|
-
if (id === "root") window.lenis = inst;
|
|
346
|
+
function resolveElementFromSelector(base, selector) {
|
|
347
|
+
if (!selector) return null;
|
|
348
|
+
var s = String(selector).trim();
|
|
349
|
+
if (!s.length) return null;
|
|
350
|
+
if (s === "window") return window;
|
|
335
351
|
try {
|
|
336
|
-
|
|
337
|
-
wrapper: wrapper === window ? "window" : wrapper,
|
|
338
|
-
content: content || null,
|
|
339
|
-
options: sanitizeOptionsForLog(opts)
|
|
340
|
-
});
|
|
352
|
+
return (base || document).querySelector(s);
|
|
341
353
|
} catch (e) {
|
|
354
|
+
return null;
|
|
342
355
|
}
|
|
343
|
-
|
|
356
|
+
}
|
|
357
|
+
function applySelectorsToOptions(el, opts) {
|
|
358
|
+
var prefix = "rt-smooth-scroll-";
|
|
359
|
+
var wrapperSel = getAttrFrom(el, prefix + "wrapper");
|
|
360
|
+
var contentSel = getAttrFrom(el, prefix + "content");
|
|
361
|
+
var eventsSel = getAttrFrom(el, prefix + "events-target");
|
|
362
|
+
if (wrapperSel) {
|
|
363
|
+
var w = resolveElementFromSelector(document, wrapperSel);
|
|
364
|
+
if (w) opts.wrapper = w;
|
|
365
|
+
}
|
|
366
|
+
if (contentSel) {
|
|
367
|
+
var c = resolveElementFromSelector(document, contentSel);
|
|
368
|
+
if (c) opts.content = c;
|
|
369
|
+
}
|
|
370
|
+
if (eventsSel) {
|
|
371
|
+
var et = resolveElementFromSelector(document, eventsSel);
|
|
372
|
+
if (et) opts.eventsTarget = et;
|
|
373
|
+
}
|
|
374
|
+
return opts;
|
|
344
375
|
}
|
|
345
376
|
function getContentForWrapper(wrapperEl) {
|
|
346
377
|
var selector = getAttrFrom(wrapperEl, "rt-smooth-scroll-content");
|
|
347
378
|
if (selector) {
|
|
348
|
-
var found =
|
|
379
|
+
var found = null;
|
|
380
|
+
try {
|
|
381
|
+
found = wrapperEl.querySelector(selector);
|
|
382
|
+
} catch (e) {
|
|
383
|
+
found = null;
|
|
384
|
+
}
|
|
349
385
|
if (found) return found;
|
|
350
386
|
}
|
|
351
387
|
return wrapperEl.firstElementChild || wrapperEl;
|
|
352
388
|
}
|
|
389
|
+
function createInstance(id, wrapper, content, options, isRoot) {
|
|
390
|
+
var opts = options || {};
|
|
391
|
+
if (!isRoot) {
|
|
392
|
+
if (wrapper) opts.wrapper = wrapper;
|
|
393
|
+
if (content) opts.content = content;
|
|
394
|
+
}
|
|
395
|
+
var inst = new window.Lenis(opts);
|
|
396
|
+
state.instances[id] = inst;
|
|
397
|
+
state.order.push(id);
|
|
398
|
+
if (id === "root") window.lenis = inst;
|
|
399
|
+
if (debug) {
|
|
400
|
+
try {
|
|
401
|
+
console.log("[rt-smooth-scroll] instance:", id, {
|
|
402
|
+
wrapper: isRoot ? opts.wrapper || "default" : wrapper,
|
|
403
|
+
content: isRoot ? opts.content || "default" : content,
|
|
404
|
+
options: sanitizeOptionsForLog(opts)
|
|
405
|
+
});
|
|
406
|
+
} catch (e) {
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return inst;
|
|
410
|
+
}
|
|
411
|
+
function setupScrollToListeners() {
|
|
412
|
+
if (state.clickListener) return;
|
|
413
|
+
var handleScrollAction = function(targetEl, e) {
|
|
414
|
+
var targetVal = targetEl.getAttribute("rt-smooth-scroll-to");
|
|
415
|
+
if (!targetVal) return;
|
|
416
|
+
if (e) e.preventDefault();
|
|
417
|
+
var target = null;
|
|
418
|
+
var numeric = parseFloat(targetVal);
|
|
419
|
+
if (targetVal === "top") {
|
|
420
|
+
target = 0;
|
|
421
|
+
} else if (!isNaN(numeric) && isFinite(numeric)) {
|
|
422
|
+
target = numeric;
|
|
423
|
+
} else {
|
|
424
|
+
target = resolveTargetFromStr(targetVal);
|
|
425
|
+
}
|
|
426
|
+
if (target === null && targetVal !== "top" && isNaN(numeric)) return;
|
|
427
|
+
var instance = null;
|
|
428
|
+
var explicitId = targetEl.getAttribute("rt-smooth-scroll-target-id");
|
|
429
|
+
if (explicitId && state.instances[explicitId]) {
|
|
430
|
+
instance = state.instances[explicitId];
|
|
431
|
+
} else {
|
|
432
|
+
var parentWrapper = targetEl.closest("[rt-smooth-scroll-instance]");
|
|
433
|
+
if (parentWrapper) {
|
|
434
|
+
var parentId = parentWrapper.getAttribute("rt-smooth-scroll-id");
|
|
435
|
+
if (parentId && state.instances[parentId]) {
|
|
436
|
+
instance = state.instances[parentId];
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (!instance && state.instances["root"]) {
|
|
441
|
+
instance = state.instances["root"];
|
|
442
|
+
}
|
|
443
|
+
if (!instance) return;
|
|
444
|
+
var opts = {};
|
|
445
|
+
var offsetRaw = targetEl.getAttribute("rt-smooth-scroll-offset");
|
|
446
|
+
if (offsetRaw) {
|
|
447
|
+
var offsetNum = parseFloat(offsetRaw);
|
|
448
|
+
if (!isNaN(offsetNum) && isFinite(offsetNum)) {
|
|
449
|
+
opts.offset = offsetNum;
|
|
450
|
+
} else {
|
|
451
|
+
var offsetEl = resolveTargetFromStr(offsetRaw);
|
|
452
|
+
if (offsetEl) opts.offset = -1 * offsetEl.offsetHeight;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
var dur = parseNum(
|
|
456
|
+
targetEl.getAttribute("rt-smooth-scroll-duration"),
|
|
457
|
+
void 0
|
|
458
|
+
);
|
|
459
|
+
if (dur !== void 0) opts.duration = dur;
|
|
460
|
+
var immediate = parseBool(
|
|
461
|
+
targetEl.getAttribute("rt-smooth-scroll-immediate"),
|
|
462
|
+
null
|
|
463
|
+
);
|
|
464
|
+
if (immediate !== null) opts.immediate = immediate;
|
|
465
|
+
var lock = parseBool(
|
|
466
|
+
targetEl.getAttribute("rt-smooth-scroll-lock"),
|
|
467
|
+
null
|
|
468
|
+
);
|
|
469
|
+
if (lock !== null) opts.lock = lock;
|
|
470
|
+
var force = parseBool(
|
|
471
|
+
targetEl.getAttribute("rt-smooth-scroll-force"),
|
|
472
|
+
null
|
|
473
|
+
);
|
|
474
|
+
if (force !== null) opts.force = force;
|
|
475
|
+
instance.scrollTo(target, opts);
|
|
476
|
+
};
|
|
477
|
+
state.clickListener = function(e) {
|
|
478
|
+
var trigger = e.target.closest("[rt-smooth-scroll-to]");
|
|
479
|
+
if (trigger) handleScrollAction(trigger, e);
|
|
480
|
+
};
|
|
481
|
+
state.keyListener = function(e) {
|
|
482
|
+
if (e.key !== "Enter" && e.key !== " ") return;
|
|
483
|
+
var trigger = e.target.closest("[rt-smooth-scroll-to]");
|
|
484
|
+
if (trigger && !trigger.hasAttribute("href")) {
|
|
485
|
+
handleScrollAction(trigger, e);
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
document.addEventListener("click", state.clickListener);
|
|
489
|
+
document.addEventListener("keydown", state.keyListener);
|
|
490
|
+
}
|
|
353
491
|
function makeApi() {
|
|
354
492
|
function forEachTarget(id, fn) {
|
|
355
493
|
if (typeof id === "string" && id.length) {
|
|
@@ -397,11 +535,13 @@
|
|
|
397
535
|
scheduleResize(k);
|
|
398
536
|
});
|
|
399
537
|
},
|
|
538
|
+
refreshAnchors: function() {
|
|
539
|
+
convertAnchorLinks();
|
|
540
|
+
},
|
|
400
541
|
destroy: function(id) {
|
|
401
542
|
if (state.destroyed) return;
|
|
402
543
|
function destroyOne(k) {
|
|
403
544
|
clearTimeout(state.resizeTimers[k]);
|
|
404
|
-
removeObservers(k);
|
|
405
545
|
var inst = state.instances[k];
|
|
406
546
|
if (inst) {
|
|
407
547
|
try {
|
|
@@ -424,6 +564,14 @@
|
|
|
424
564
|
destroyOne(id);
|
|
425
565
|
return;
|
|
426
566
|
}
|
|
567
|
+
if (state.clickListener) {
|
|
568
|
+
document.removeEventListener("click", state.clickListener);
|
|
569
|
+
state.clickListener = null;
|
|
570
|
+
}
|
|
571
|
+
if (state.keyListener) {
|
|
572
|
+
document.removeEventListener("keydown", state.keyListener);
|
|
573
|
+
state.keyListener = null;
|
|
574
|
+
}
|
|
427
575
|
while (state.order.length) destroyOne(state.order[0]);
|
|
428
576
|
state.destroyed = true;
|
|
429
577
|
if (state.rafId) cancelAnimationFrame(state.rafId);
|
|
@@ -442,13 +590,26 @@
|
|
|
442
590
|
}
|
|
443
591
|
loadScriptOnce(lenisSrc).then(function() {
|
|
444
592
|
if (state.destroyed) return;
|
|
593
|
+
var els = document.querySelectorAll("[rt-smooth-scroll-instance]");
|
|
594
|
+
var totalCount = (enabledRoot ? 1 : 0) + (els ? els.length : 0);
|
|
595
|
+
var allowAutoRaf = totalCount === 1 && enabledRoot && (!els || els.length === 0);
|
|
445
596
|
if (enabledRoot && !state.instances.root) {
|
|
446
597
|
var optsRoot = readOptions(function() {
|
|
447
598
|
return null;
|
|
448
599
|
});
|
|
449
|
-
|
|
600
|
+
optsRoot = applySelectorsToOptions(
|
|
601
|
+
document.body || document.documentElement,
|
|
602
|
+
optsRoot
|
|
603
|
+
);
|
|
604
|
+
if (allowAutoRaf) {
|
|
605
|
+
var rawAutoRaf = getAttr("rt-smooth-scroll-auto-raf");
|
|
606
|
+
var autoRaf = isAttrPresent(rawAutoRaf) ? parseBool(rawAutoRaf, true) : true;
|
|
607
|
+
optsRoot.autoRaf = autoRaf;
|
|
608
|
+
} else {
|
|
609
|
+
optsRoot.autoRaf = false;
|
|
610
|
+
}
|
|
611
|
+
createInstance("root", null, null, optsRoot, true);
|
|
450
612
|
}
|
|
451
|
-
var els = document.querySelectorAll("[rt-smooth-scroll-instance]");
|
|
452
613
|
var autoCount = 0;
|
|
453
614
|
for (var i = 0; i < els.length; i++) {
|
|
454
615
|
var el = els[i];
|
|
@@ -456,18 +617,22 @@
|
|
|
456
617
|
if (!id) {
|
|
457
618
|
autoCount++;
|
|
458
619
|
id = "instance-" + autoCount;
|
|
620
|
+
el.setAttribute("rt-smooth-scroll-id", id);
|
|
459
621
|
}
|
|
460
622
|
if (state.instances[id]) continue;
|
|
461
623
|
var content = getContentForWrapper(el);
|
|
462
624
|
var opts = readOptions(function(name) {
|
|
463
625
|
return getAttrFrom(el, name);
|
|
464
626
|
});
|
|
465
|
-
|
|
627
|
+
opts = applySelectorsToOptions(el, opts);
|
|
628
|
+
opts.autoRaf = false;
|
|
629
|
+
createInstance(id, el, content, opts, false);
|
|
466
630
|
}
|
|
467
|
-
startRaf();
|
|
631
|
+
if (!allowAutoRaf) startRaf();
|
|
468
632
|
var api = makeApi();
|
|
469
633
|
window[RT_NS] = api;
|
|
470
634
|
installLegacyAliases(api);
|
|
635
|
+
setupScrollToListeners();
|
|
471
636
|
window.addEventListener("resize", function() {
|
|
472
637
|
api.resize();
|
|
473
638
|
});
|