@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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @rethink-js/rt-smooth-scroll v1.0.2 | MIT */
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 n = Number(v);
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 hasAnyConfigOn(el) {
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 !== null && v !== void 0) return v;
136
+ if (isAttrPresent(v)) return v;
136
137
  return getAttr(name);
137
138
  }
138
- var rawDuration = localOrGlobal(prefix + "duration");
139
- var rawLerp = localOrGlobal(prefix + "lerp");
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
- var orientation = parseStr(
148
- localOrGlobal(prefix + "orientation"),
149
- "vertical"
150
- );
151
- var gestureOrientation = parseStr(
152
- localOrGlobal(prefix + "gesture-orientation"),
153
- "vertical"
154
- );
155
- var normalizeWheel = parseBool(
156
- localOrGlobal(prefix + "normalize-wheel"),
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
- var opts = {
178
- lerp,
179
- orientation,
180
- gestureOrientation,
181
- normalizeWheel,
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 (easingFn) opts.easing = easingFn;
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
- ensureDefaultsIfNeeded();
285
+ ensureAutoEnableIfNeeded();
286
+ convertAnchorLinks();
234
287
  var enabledRoot = hasAttrAnywhere("rt-smooth-scroll");
235
288
  var instanceEls = document.querySelectorAll("[rt-smooth-scroll-instance]");
236
- var shouldRun = enabledRoot || instanceEls && instanceEls.length > 0;
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
- observers: {},
260
- resizeTimers: {}
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
- out[k] = "[Function]";
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 createInstance(id, wrapper, content, options) {
327
- var opts = options || {};
328
- if (wrapper) opts.wrapper = wrapper;
329
- if (content) opts.content = content;
330
- var inst = new window.Lenis(opts);
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
- console.log("[rt-smooth-scroll] instance:", id, {
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
- return inst;
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 = wrapperEl.querySelector(selector);
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
- createInstance("root", window, document.documentElement, optsRoot);
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
- createInstance(id, el, content, opts);
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
  });