scroll-system 1.1.0 → 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 CHANGED
@@ -178,6 +178,7 @@ Smart container for long content. Automatically detects overflow and locks navig
178
178
  | `className` | `string` | `""` | CSS classes |
179
179
  | `scrollDirection` | `"vertical"` \| `"horizontal"` | `"vertical"` | Internal scroll direction |
180
180
  | `scrollEndThreshold` | `number` | `0.99` | Progress threshold to unlock (0-1) |
181
+ | `scrollResetBehavior` | `ScrollResetBehavior` | `"direction-aware"` | How to reset scroll position on activation |
181
182
  | `onScrollProgress` | `(progress: number) => void` | - | Called on internal scroll |
182
183
  | `onActivate` | `() => void` | - | Called when view becomes active |
183
184
  | `onDeactivate` | `() => void` | - | Called when view becomes inactive |
@@ -186,6 +187,12 @@ Smart container for long content. Automatically detects overflow and locks navig
186
187
  | `onExitStart` | `() => void` | - | Called when exit transition starts |
187
188
  | `onExitEnd` | `() => void` | - | Called when exit transition ends |
188
189
 
190
+ **`ScrollResetBehavior` options:**
191
+ - `"direction-aware"` (default): Resets to **start** when navigating down (from above), resets to **end** when navigating up (from below)
192
+ - `"always-start"`: Always reset to the beginning of the scroll
193
+ - `"always-end"`: Always reset to the end of the scroll
194
+ - `"preserve"`: Keep the current scroll position (no reset)
195
+
189
196
  **Behavior:**
190
197
  - If content fits viewport → Acts like `FullView`
191
198
  - If content overflows → **LOCKS** navigation until user scrolls to bottom (99%)
@@ -529,17 +536,11 @@ Enable 1:1 native-feeling touch interactions:
529
536
 
530
537
  ## 📱 Mobile Optimization
531
538
 
532
- For the best app-like experience on mobile:
539
+ The `ScrollContainer` **automatically applies** mobile-optimized styles when mounted:
540
+ - `overscroll-behavior: none` - Prevents pull-to-refresh
541
+ - `touch-action: pan-x pan-y` - Ensures proper touch handling
533
542
 
534
- ```css
535
- html, body {
536
- position: fixed;
537
- width: 100%;
538
- height: 100%;
539
- overflow: hidden;
540
- overscroll-behavior-y: none; /* Prevents pull-to-refresh */
541
- }
542
- ```
543
+ These styles are automatically removed when the component unmounts.
543
544
 
544
545
  ### Fullscreen API (Optional)
545
546
  ```tsx
@@ -6,5 +6,5 @@
6
6
  * NO decide si bloquear o no.
7
7
  */
8
8
  import type { ScrollLockedViewProps } from "../types";
9
- export declare function ScrollLockedView({ id, children, className, scrollDirection, scrollEndThreshold, onScrollProgress, onActivate, onDeactivate, onEnterStart, onEnterEnd, onExitStart, onExitEnd, }: ScrollLockedViewProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function ScrollLockedView({ id, children, className, scrollDirection, scrollEndThreshold, scrollResetBehavior, onScrollProgress, onActivate, onDeactivate, onEnterStart, onEnterEnd, onExitStart, onExitEnd, }: ScrollLockedViewProps): import("react/jsx-runtime").JSX.Element;
10
10
  //# sourceMappingURL=ScrollLockedView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollLockedView.d.ts","sourceRoot":"","sources":["../../components/ScrollLockedView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,EAC/B,EAAE,EACF,QAAQ,EACR,SAAc,EACd,eAA4B,EAC5B,kBAAyB,EACzB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,GACV,EAAE,qBAAqB,2CA8CvB"}
1
+ {"version":3,"file":"ScrollLockedView.d.ts","sourceRoot":"","sources":["../../components/ScrollLockedView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAuB,MAAM,UAAU,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,EAC/B,EAAE,EACF,QAAQ,EACR,SAAc,EACd,eAA4B,EAC5B,kBAAyB,EACzB,mBAAuC,EACvC,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,GACV,EAAE,qBAAqB,2CAkGvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDragHandler.d.ts","sourceRoot":"","sources":["../../hooks/useDragHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,aAoJjE;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"useDragHandler.d.ts","sourceRoot":"","sources":["../../hooks/useDragHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CACzE;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,aA6KjE;AAED,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTouchHandler.d.ts","sourceRoot":"","sources":["../../hooks/useTouchHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,QA6DnE"}
1
+ {"version":3,"file":"useTouchHandler.d.ts","sourceRoot":"","sources":["../../hooks/useTouchHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqCD,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,QAoEnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useWheelHandler.d.ts","sourceRoot":"","sources":["../../hooks/useWheelHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,eAAe,SAiE9B"}
1
+ {"version":3,"file":"useWheelHandler.d.ts","sourceRoot":"","sources":["../../hooks/useWheelHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,eAAe,SA2F9B"}
package/dist/index.js CHANGED
@@ -53,7 +53,9 @@ var initialState = {
53
53
  isAutoScrolling: false,
54
54
  isAutoScrollPaused: false,
55
55
  // NEW: Infinite scroll
56
- infiniteScrollEnabled: false
56
+ infiniteScrollEnabled: false,
57
+ // NEW: Last navigation direction
58
+ lastNavigationDirection: null
57
59
  };
58
60
  var lastNavigationTime = 0;
59
61
  var useScrollStore = zustand.create()(
@@ -199,6 +201,7 @@ var useScrollStore = zustand.create()(
199
201
  if (targetIndex < 0 || targetIndex >= state.totalViews) return;
200
202
  if (targetIndex === state.activeIndex) return;
201
203
  set((s) => {
204
+ const navigationDirection = targetIndex > s.activeIndex ? "down" : "up";
202
205
  const newViews = s.views.map((v, idx) => {
203
206
  const isAdjacent = Math.abs(idx - targetIndex) <= 1 || s.infiniteScrollEnabled && (targetIndex === 0 && idx === s.totalViews - 1 || targetIndex === s.totalViews - 1 && idx === 0);
204
207
  return {
@@ -212,7 +215,8 @@ var useScrollStore = zustand.create()(
212
215
  isTransitioning: true,
213
216
  activeIndex: targetIndex,
214
217
  activeId: newViews[targetIndex]?.id ?? null,
215
- views: newViews
218
+ views: newViews,
219
+ lastNavigationDirection: navigationDirection
216
220
  };
217
221
  });
218
222
  },
@@ -272,7 +276,9 @@ var selectCanNavigateNext = (state) => {
272
276
  };
273
277
  var selectCanNavigatePrevious = (state) => {
274
278
  if (state.isTransitioning || state.isGlobalLocked) return false;
275
- if (state.infiniteScrollEnabled) return state.activeIndex >= 0;
279
+ const activeView = state.views[state.activeIndex];
280
+ if (!activeView) return false;
281
+ if (state.infiniteScrollEnabled) return true;
276
282
  return state.activeIndex > 0;
277
283
  };
278
284
  var selectGlobalProgress = (state) => state.globalProgress;
@@ -324,6 +330,24 @@ function useWheelHandler() {
324
330
  return;
325
331
  }
326
332
  const normalized = normalizeWheel(event);
333
+ const activeView = state.views[state.activeIndex];
334
+ if (activeView?.capability === "internal") {
335
+ const scrollContainer = document.querySelector(
336
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
337
+ );
338
+ if (scrollContainer) {
339
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
340
+ const maxScroll = scrollHeight - clientHeight;
341
+ const isScrollingDown = normalized.pixelY > 0;
342
+ const isScrollingUp = normalized.pixelY < 0;
343
+ const isAtBottom = scrollTop >= maxScroll - 1;
344
+ const isAtTop = scrollTop <= 1;
345
+ if (isScrollingDown && !isAtBottom || isScrollingUp && !isAtTop) {
346
+ scrollAccumulator.current = 0;
347
+ return;
348
+ }
349
+ }
350
+ }
327
351
  const delta = normalized.pixelY;
328
352
  scrollAccumulator.current += delta;
329
353
  const now = Date.now();
@@ -350,6 +374,28 @@ function useWheelHandler() {
350
374
  return () => window.removeEventListener("wheel", handleWheel);
351
375
  }, []);
352
376
  }
377
+ function canNavigateFromScrollPosition(direction) {
378
+ const state = useScrollStore.getState();
379
+ const activeView = state.views[state.activeIndex];
380
+ if (activeView?.capability !== "internal") {
381
+ return true;
382
+ }
383
+ const scrollContainer = document.querySelector(
384
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
385
+ );
386
+ if (!scrollContainer) {
387
+ return true;
388
+ }
389
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
390
+ const maxScroll = scrollHeight - clientHeight;
391
+ const isAtBottom = scrollTop >= maxScroll - 1;
392
+ const isAtTop = scrollTop <= 1;
393
+ if (direction === "down") {
394
+ return isAtBottom;
395
+ } else {
396
+ return isAtTop;
397
+ }
398
+ }
353
399
  function useTouchHandler(options = {}) {
354
400
  const { enabled = true } = options;
355
401
  const touchStart = react.useRef(null);
@@ -376,6 +422,10 @@ function useTouchHandler(options = {}) {
376
422
  Math.abs(deltaY) > NAV_THRESHOLDS.TOUCH && // Threshold distancia
377
423
  timeElapsed < 800) {
378
424
  const direction = deltaY > 0 ? "down" : "up";
425
+ if (!canNavigateFromScrollPosition(direction)) {
426
+ touchStart.current = null;
427
+ return;
428
+ }
379
429
  const intention = {
380
430
  type: "navigate",
381
431
  direction,
@@ -584,10 +634,29 @@ function useDragHandler(options = {}) {
584
634
  const store = useScrollStore.getState();
585
635
  const atStart = store.activeIndex === 0;
586
636
  const atEnd = store.activeIndex === store.totalViews - 1;
637
+ const activeView = store.views[store.activeIndex];
587
638
  const exceedsThreshold = Math.abs(deltaY) > DRAG_THRESHOLD;
588
639
  const hasVelocity = velocity > VELOCITY_THRESHOLD;
589
640
  const direction = deltaY > 0 ? "down" : "up";
590
- const canNavigate = direction === "down" && !atEnd || direction === "up" && !atStart;
641
+ let canNavigateInternal = true;
642
+ if (activeView?.capability === "internal") {
643
+ const scrollContainer = document.querySelector(
644
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
645
+ );
646
+ if (scrollContainer) {
647
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
648
+ const maxScroll = scrollHeight - clientHeight;
649
+ const isAtBottom = scrollTop >= maxScroll - 1;
650
+ const isAtTop = scrollTop <= 1;
651
+ if (direction === "down" && !isAtBottom) {
652
+ canNavigateInternal = false;
653
+ }
654
+ if (direction === "up" && !isAtTop) {
655
+ canNavigateInternal = false;
656
+ }
657
+ }
658
+ }
659
+ const canNavigate = canNavigateInternal && (direction === "down" && !atEnd || direction === "up" && !atStart);
591
660
  const shouldNavigate = canNavigate && (exceedsThreshold || hasVelocity);
592
661
  onDragEnd?.(shouldNavigate, direction);
593
662
  if (shouldNavigate) {
@@ -1306,6 +1375,7 @@ function ScrollLockedView({
1306
1375
  className = "",
1307
1376
  scrollDirection = "vertical",
1308
1377
  scrollEndThreshold = 0.99,
1378
+ scrollResetBehavior = "direction-aware",
1309
1379
  onScrollProgress,
1310
1380
  onActivate,
1311
1381
  onDeactivate,
@@ -1319,7 +1389,8 @@ function ScrollLockedView({
1319
1389
  id,
1320
1390
  type: "scroll-locked",
1321
1391
  scrollDirection,
1322
- scrollEndThreshold
1392
+ scrollEndThreshold,
1393
+ scrollResetBehavior
1323
1394
  },
1324
1395
  onActivate,
1325
1396
  onDeactivate,
@@ -1334,6 +1405,43 @@ function ScrollLockedView({
1334
1405
  scrollDirection,
1335
1406
  onScrollProgress
1336
1407
  });
1408
+ const wasActive = react.useRef(isActive);
1409
+ const lastNavigationDirection = useScrollStore((s) => s.lastNavigationDirection);
1410
+ react.useEffect(() => {
1411
+ if (isActive && !wasActive.current && scrollRef.current) {
1412
+ const element = scrollRef.current;
1413
+ let targetPosition;
1414
+ switch (scrollResetBehavior) {
1415
+ case "always-start":
1416
+ targetPosition = 0;
1417
+ break;
1418
+ case "always-end":
1419
+ targetPosition = element.scrollHeight - element.clientHeight;
1420
+ break;
1421
+ case "preserve":
1422
+ targetPosition = -1;
1423
+ break;
1424
+ case "direction-aware":
1425
+ default:
1426
+ if (lastNavigationDirection === "down") {
1427
+ targetPosition = 0;
1428
+ } else if (lastNavigationDirection === "up") {
1429
+ targetPosition = element.scrollHeight - element.clientHeight;
1430
+ } else {
1431
+ targetPosition = 0;
1432
+ }
1433
+ break;
1434
+ }
1435
+ if (targetPosition >= 0) {
1436
+ if (scrollDirection === "vertical") {
1437
+ element.scrollTop = targetPosition;
1438
+ } else {
1439
+ element.scrollLeft = targetPosition;
1440
+ }
1441
+ }
1442
+ }
1443
+ wasActive.current = isActive;
1444
+ }, [isActive, lastNavigationDirection, scrollResetBehavior, scrollDirection]);
1337
1445
  const scrollClasses = scrollDirection === "vertical" ? "overflow-y-auto overflow-x-hidden" : "overflow-x-auto overflow-y-hidden";
1338
1446
  return /* @__PURE__ */ jsxRuntime.jsx(
1339
1447
  "section",
@@ -1341,7 +1449,7 @@ function ScrollLockedView({
1341
1449
  id,
1342
1450
  className: `relative w-full h-screen ${className}`,
1343
1451
  "data-view-type": "scroll-locked",
1344
- "data-active": isActive,
1452
+ "data-active": isActive ? "true" : "false",
1345
1453
  children: /* @__PURE__ */ jsxRuntime.jsx(
1346
1454
  "div",
1347
1455
  {
package/dist/index.mjs CHANGED
@@ -51,7 +51,9 @@ var initialState = {
51
51
  isAutoScrolling: false,
52
52
  isAutoScrollPaused: false,
53
53
  // NEW: Infinite scroll
54
- infiniteScrollEnabled: false
54
+ infiniteScrollEnabled: false,
55
+ // NEW: Last navigation direction
56
+ lastNavigationDirection: null
55
57
  };
56
58
  var lastNavigationTime = 0;
57
59
  var useScrollStore = create()(
@@ -197,6 +199,7 @@ var useScrollStore = create()(
197
199
  if (targetIndex < 0 || targetIndex >= state.totalViews) return;
198
200
  if (targetIndex === state.activeIndex) return;
199
201
  set((s) => {
202
+ const navigationDirection = targetIndex > s.activeIndex ? "down" : "up";
200
203
  const newViews = s.views.map((v, idx) => {
201
204
  const isAdjacent = Math.abs(idx - targetIndex) <= 1 || s.infiniteScrollEnabled && (targetIndex === 0 && idx === s.totalViews - 1 || targetIndex === s.totalViews - 1 && idx === 0);
202
205
  return {
@@ -210,7 +213,8 @@ var useScrollStore = create()(
210
213
  isTransitioning: true,
211
214
  activeIndex: targetIndex,
212
215
  activeId: newViews[targetIndex]?.id ?? null,
213
- views: newViews
216
+ views: newViews,
217
+ lastNavigationDirection: navigationDirection
214
218
  };
215
219
  });
216
220
  },
@@ -270,7 +274,9 @@ var selectCanNavigateNext = (state) => {
270
274
  };
271
275
  var selectCanNavigatePrevious = (state) => {
272
276
  if (state.isTransitioning || state.isGlobalLocked) return false;
273
- if (state.infiniteScrollEnabled) return state.activeIndex >= 0;
277
+ const activeView = state.views[state.activeIndex];
278
+ if (!activeView) return false;
279
+ if (state.infiniteScrollEnabled) return true;
274
280
  return state.activeIndex > 0;
275
281
  };
276
282
  var selectGlobalProgress = (state) => state.globalProgress;
@@ -322,6 +328,24 @@ function useWheelHandler() {
322
328
  return;
323
329
  }
324
330
  const normalized = normalizeWheel(event);
331
+ const activeView = state.views[state.activeIndex];
332
+ if (activeView?.capability === "internal") {
333
+ const scrollContainer = document.querySelector(
334
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
335
+ );
336
+ if (scrollContainer) {
337
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
338
+ const maxScroll = scrollHeight - clientHeight;
339
+ const isScrollingDown = normalized.pixelY > 0;
340
+ const isScrollingUp = normalized.pixelY < 0;
341
+ const isAtBottom = scrollTop >= maxScroll - 1;
342
+ const isAtTop = scrollTop <= 1;
343
+ if (isScrollingDown && !isAtBottom || isScrollingUp && !isAtTop) {
344
+ scrollAccumulator.current = 0;
345
+ return;
346
+ }
347
+ }
348
+ }
325
349
  const delta = normalized.pixelY;
326
350
  scrollAccumulator.current += delta;
327
351
  const now = Date.now();
@@ -348,6 +372,28 @@ function useWheelHandler() {
348
372
  return () => window.removeEventListener("wheel", handleWheel);
349
373
  }, []);
350
374
  }
375
+ function canNavigateFromScrollPosition(direction) {
376
+ const state = useScrollStore.getState();
377
+ const activeView = state.views[state.activeIndex];
378
+ if (activeView?.capability !== "internal") {
379
+ return true;
380
+ }
381
+ const scrollContainer = document.querySelector(
382
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
383
+ );
384
+ if (!scrollContainer) {
385
+ return true;
386
+ }
387
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
388
+ const maxScroll = scrollHeight - clientHeight;
389
+ const isAtBottom = scrollTop >= maxScroll - 1;
390
+ const isAtTop = scrollTop <= 1;
391
+ if (direction === "down") {
392
+ return isAtBottom;
393
+ } else {
394
+ return isAtTop;
395
+ }
396
+ }
351
397
  function useTouchHandler(options = {}) {
352
398
  const { enabled = true } = options;
353
399
  const touchStart = useRef(null);
@@ -374,6 +420,10 @@ function useTouchHandler(options = {}) {
374
420
  Math.abs(deltaY) > NAV_THRESHOLDS.TOUCH && // Threshold distancia
375
421
  timeElapsed < 800) {
376
422
  const direction = deltaY > 0 ? "down" : "up";
423
+ if (!canNavigateFromScrollPosition(direction)) {
424
+ touchStart.current = null;
425
+ return;
426
+ }
377
427
  const intention = {
378
428
  type: "navigate",
379
429
  direction,
@@ -582,10 +632,29 @@ function useDragHandler(options = {}) {
582
632
  const store = useScrollStore.getState();
583
633
  const atStart = store.activeIndex === 0;
584
634
  const atEnd = store.activeIndex === store.totalViews - 1;
635
+ const activeView = store.views[store.activeIndex];
585
636
  const exceedsThreshold = Math.abs(deltaY) > DRAG_THRESHOLD;
586
637
  const hasVelocity = velocity > VELOCITY_THRESHOLD;
587
638
  const direction = deltaY > 0 ? "down" : "up";
588
- const canNavigate = direction === "down" && !atEnd || direction === "up" && !atStart;
639
+ let canNavigateInternal = true;
640
+ if (activeView?.capability === "internal") {
641
+ const scrollContainer = document.querySelector(
642
+ `[data-view-type="scroll-locked"][data-active="true"] > div`
643
+ );
644
+ if (scrollContainer) {
645
+ const { scrollTop, scrollHeight, clientHeight } = scrollContainer;
646
+ const maxScroll = scrollHeight - clientHeight;
647
+ const isAtBottom = scrollTop >= maxScroll - 1;
648
+ const isAtTop = scrollTop <= 1;
649
+ if (direction === "down" && !isAtBottom) {
650
+ canNavigateInternal = false;
651
+ }
652
+ if (direction === "up" && !isAtTop) {
653
+ canNavigateInternal = false;
654
+ }
655
+ }
656
+ }
657
+ const canNavigate = canNavigateInternal && (direction === "down" && !atEnd || direction === "up" && !atStart);
589
658
  const shouldNavigate = canNavigate && (exceedsThreshold || hasVelocity);
590
659
  onDragEnd?.(shouldNavigate, direction);
591
660
  if (shouldNavigate) {
@@ -1304,6 +1373,7 @@ function ScrollLockedView({
1304
1373
  className = "",
1305
1374
  scrollDirection = "vertical",
1306
1375
  scrollEndThreshold = 0.99,
1376
+ scrollResetBehavior = "direction-aware",
1307
1377
  onScrollProgress,
1308
1378
  onActivate,
1309
1379
  onDeactivate,
@@ -1317,7 +1387,8 @@ function ScrollLockedView({
1317
1387
  id,
1318
1388
  type: "scroll-locked",
1319
1389
  scrollDirection,
1320
- scrollEndThreshold
1390
+ scrollEndThreshold,
1391
+ scrollResetBehavior
1321
1392
  },
1322
1393
  onActivate,
1323
1394
  onDeactivate,
@@ -1332,6 +1403,43 @@ function ScrollLockedView({
1332
1403
  scrollDirection,
1333
1404
  onScrollProgress
1334
1405
  });
1406
+ const wasActive = useRef(isActive);
1407
+ const lastNavigationDirection = useScrollStore((s) => s.lastNavigationDirection);
1408
+ useEffect(() => {
1409
+ if (isActive && !wasActive.current && scrollRef.current) {
1410
+ const element = scrollRef.current;
1411
+ let targetPosition;
1412
+ switch (scrollResetBehavior) {
1413
+ case "always-start":
1414
+ targetPosition = 0;
1415
+ break;
1416
+ case "always-end":
1417
+ targetPosition = element.scrollHeight - element.clientHeight;
1418
+ break;
1419
+ case "preserve":
1420
+ targetPosition = -1;
1421
+ break;
1422
+ case "direction-aware":
1423
+ default:
1424
+ if (lastNavigationDirection === "down") {
1425
+ targetPosition = 0;
1426
+ } else if (lastNavigationDirection === "up") {
1427
+ targetPosition = element.scrollHeight - element.clientHeight;
1428
+ } else {
1429
+ targetPosition = 0;
1430
+ }
1431
+ break;
1432
+ }
1433
+ if (targetPosition >= 0) {
1434
+ if (scrollDirection === "vertical") {
1435
+ element.scrollTop = targetPosition;
1436
+ } else {
1437
+ element.scrollLeft = targetPosition;
1438
+ }
1439
+ }
1440
+ }
1441
+ wasActive.current = isActive;
1442
+ }, [isActive, lastNavigationDirection, scrollResetBehavior, scrollDirection]);
1335
1443
  const scrollClasses = scrollDirection === "vertical" ? "overflow-y-auto overflow-x-hidden" : "overflow-x-auto overflow-y-hidden";
1336
1444
  return /* @__PURE__ */ jsx(
1337
1445
  "section",
@@ -1339,7 +1447,7 @@ function ScrollLockedView({
1339
1447
  id,
1340
1448
  className: `relative w-full h-screen ${className}`,
1341
1449
  "data-view-type": "scroll-locked",
1342
- "data-active": isActive,
1450
+ "data-active": isActive ? "true" : "false",
1343
1451
  children: /* @__PURE__ */ jsx(
1344
1452
  "div",
1345
1453
  {
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.store.d.ts","sourceRoot":"","sources":["../../store/navigation.store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,iBAAiB,EAGjB,SAAS,EAKV,MAAM,UAAU,CAAC;AA6DlB,eAAO,MAAM,cAAc;;;;;;;;EAmR1B,CAAC;AAMF,eAAO,MAAM,gBAAgB,GAAI,OAAO,iBAAiB,cACzB,CAAC;AAEjC,eAAO,MAAM,wBAAwB,GAAI,OAAO,iBAAiB,WAClB,CAAC;AAEhD,eAAO,MAAM,qBAAqB,GAAI,OAAO,iBAAiB,YAM7D,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,iBAAiB,YAIjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,iBAAiB,WACvC,CAAC;AAEvB,eAAO,MAAM,qBAAqB,GAAI,OAAO,iBAAiB,YACV,CAAC"}
1
+ {"version":3,"file":"navigation.store.d.ts","sourceRoot":"","sources":["../../store/navigation.store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,iBAAiB,EAGjB,SAAS,EAKV,MAAM,UAAU,CAAC;AA+DlB,eAAO,MAAM,cAAc;;;;;;;;EAuR1B,CAAC;AAMF,eAAO,MAAM,gBAAgB,GAAI,OAAO,iBAAiB,cACzB,CAAC;AAEjC,eAAO,MAAM,wBAAwB,GAAI,OAAO,iBAAiB,WAClB,CAAC;AAEhD,eAAO,MAAM,qBAAqB,GAAI,OAAO,iBAAiB,YAM7D,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,iBAAiB,YAQjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,iBAAiB,WACvC,CAAC;AAEvB,eAAO,MAAM,qBAAqB,GAAI,OAAO,iBAAiB,YACV,CAAC"}
@@ -166,6 +166,14 @@ export interface ScrollSystemAPI {
166
166
  }
167
167
  export type ViewType = "full" | "scroll-locked" | "controlled" | "nested";
168
168
  export type ScrollDirection = "vertical" | "horizontal" | "none";
169
+ /**
170
+ * Behavior for resetting scroll position when view becomes active.
171
+ * - "direction-aware": (default) Reset to start when coming from above, end when coming from below
172
+ * - "always-start": Always reset to start
173
+ * - "always-end": Always reset to end
174
+ * - "preserve": Keep the current scroll position
175
+ */
176
+ export type ScrollResetBehavior = "direction-aware" | "always-start" | "always-end" | "preserve";
169
177
  export interface BaseViewConfig {
170
178
  id: string;
171
179
  type: ViewType;
@@ -181,6 +189,8 @@ export interface ScrollLockedViewConfig extends BaseViewConfig {
181
189
  type: "scroll-locked";
182
190
  scrollDirection: ScrollDirection;
183
191
  scrollEndThreshold?: number;
192
+ /** Behavior for resetting scroll when view becomes active (default: "direction-aware") */
193
+ scrollResetBehavior?: ScrollResetBehavior;
184
194
  }
185
195
  export interface ControlledViewConfig extends BaseViewConfig {
186
196
  type: "controlled";
@@ -224,6 +234,8 @@ export interface ScrollSystemState {
224
234
  isAutoScrollPaused: boolean;
225
235
  /** NEW: Infinite scroll enabled */
226
236
  infiniteScrollEnabled: boolean;
237
+ /** NEW: Last navigation direction (for scroll reset behavior) */
238
+ lastNavigationDirection: "up" | "down" | null;
227
239
  }
228
240
  export interface ScrollSystemActions {
229
241
  initialize: () => void;
@@ -269,6 +281,8 @@ export interface ScrollLockedViewProps extends BaseViewProps {
269
281
  scrollDirection?: ScrollDirection;
270
282
  scrollEndThreshold?: number;
271
283
  onScrollProgress?: (progress: number) => void;
284
+ /** Behavior for resetting scroll when view becomes active (default: "direction-aware") */
285
+ scrollResetBehavior?: ScrollResetBehavior;
272
286
  }
273
287
  export interface ControlledViewProps extends BaseViewProps {
274
288
  scrollDirection?: ScrollDirection;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scroll-system",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "TikTok-style vertical scroll system with snap views, touch physics, and accessibility features",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",