scroll-system 1.1.1 → 1.2.1

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,2CAmGvB"}
@@ -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"}
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;
@@ -368,6 +374,28 @@ function useWheelHandler() {
368
374
  return () => window.removeEventListener("wheel", handleWheel);
369
375
  }, []);
370
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
+ }
371
399
  function useTouchHandler(options = {}) {
372
400
  const { enabled = true } = options;
373
401
  const touchStart = react.useRef(null);
@@ -394,6 +422,10 @@ function useTouchHandler(options = {}) {
394
422
  Math.abs(deltaY) > NAV_THRESHOLDS.TOUCH && // Threshold distancia
395
423
  timeElapsed < 800) {
396
424
  const direction = deltaY > 0 ? "down" : "up";
425
+ if (!canNavigateFromScrollPosition(direction)) {
426
+ touchStart.current = null;
427
+ return;
428
+ }
397
429
  const intention = {
398
430
  type: "navigate",
399
431
  direction,
@@ -602,10 +634,29 @@ function useDragHandler(options = {}) {
602
634
  const store = useScrollStore.getState();
603
635
  const atStart = store.activeIndex === 0;
604
636
  const atEnd = store.activeIndex === store.totalViews - 1;
637
+ const activeView = store.views[store.activeIndex];
605
638
  const exceedsThreshold = Math.abs(deltaY) > DRAG_THRESHOLD;
606
639
  const hasVelocity = velocity > VELOCITY_THRESHOLD;
607
640
  const direction = deltaY > 0 ? "down" : "up";
608
- 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);
609
660
  const shouldNavigate = canNavigate && (exceedsThreshold || hasVelocity);
610
661
  onDragEnd?.(shouldNavigate, direction);
611
662
  if (shouldNavigate) {
@@ -1324,6 +1375,7 @@ function ScrollLockedView({
1324
1375
  className = "",
1325
1376
  scrollDirection = "vertical",
1326
1377
  scrollEndThreshold = 0.99,
1378
+ scrollResetBehavior = "direction-aware",
1327
1379
  onScrollProgress,
1328
1380
  onActivate,
1329
1381
  onDeactivate,
@@ -1337,7 +1389,8 @@ function ScrollLockedView({
1337
1389
  id,
1338
1390
  type: "scroll-locked",
1339
1391
  scrollDirection,
1340
- scrollEndThreshold
1392
+ scrollEndThreshold,
1393
+ scrollResetBehavior
1341
1394
  },
1342
1395
  onActivate,
1343
1396
  onDeactivate,
@@ -1352,6 +1405,43 @@ function ScrollLockedView({
1352
1405
  scrollDirection,
1353
1406
  onScrollProgress
1354
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]);
1355
1445
  const scrollClasses = scrollDirection === "vertical" ? "overflow-y-auto overflow-x-hidden" : "overflow-x-auto overflow-y-hidden";
1356
1446
  return /* @__PURE__ */ jsxRuntime.jsx(
1357
1447
  "section",
@@ -1359,13 +1449,14 @@ function ScrollLockedView({
1359
1449
  id,
1360
1450
  className: `relative w-full h-screen ${className}`,
1361
1451
  "data-view-type": "scroll-locked",
1362
- "data-active": isActive,
1452
+ "data-active": isActive ? "true" : "false",
1363
1453
  children: /* @__PURE__ */ jsxRuntime.jsx(
1364
1454
  "div",
1365
1455
  {
1366
1456
  ref: scrollRef,
1367
1457
  className: `w-full h-full ${scrollClasses} no-scrollbar`,
1368
1458
  style: { scrollbarWidth: "none" },
1459
+ "data-scrollable": "true",
1369
1460
  children
1370
1461
  }
1371
1462
  )
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;
@@ -366,6 +372,28 @@ function useWheelHandler() {
366
372
  return () => window.removeEventListener("wheel", handleWheel);
367
373
  }, []);
368
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
+ }
369
397
  function useTouchHandler(options = {}) {
370
398
  const { enabled = true } = options;
371
399
  const touchStart = useRef(null);
@@ -392,6 +420,10 @@ function useTouchHandler(options = {}) {
392
420
  Math.abs(deltaY) > NAV_THRESHOLDS.TOUCH && // Threshold distancia
393
421
  timeElapsed < 800) {
394
422
  const direction = deltaY > 0 ? "down" : "up";
423
+ if (!canNavigateFromScrollPosition(direction)) {
424
+ touchStart.current = null;
425
+ return;
426
+ }
395
427
  const intention = {
396
428
  type: "navigate",
397
429
  direction,
@@ -600,10 +632,29 @@ function useDragHandler(options = {}) {
600
632
  const store = useScrollStore.getState();
601
633
  const atStart = store.activeIndex === 0;
602
634
  const atEnd = store.activeIndex === store.totalViews - 1;
635
+ const activeView = store.views[store.activeIndex];
603
636
  const exceedsThreshold = Math.abs(deltaY) > DRAG_THRESHOLD;
604
637
  const hasVelocity = velocity > VELOCITY_THRESHOLD;
605
638
  const direction = deltaY > 0 ? "down" : "up";
606
- 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);
607
658
  const shouldNavigate = canNavigate && (exceedsThreshold || hasVelocity);
608
659
  onDragEnd?.(shouldNavigate, direction);
609
660
  if (shouldNavigate) {
@@ -1322,6 +1373,7 @@ function ScrollLockedView({
1322
1373
  className = "",
1323
1374
  scrollDirection = "vertical",
1324
1375
  scrollEndThreshold = 0.99,
1376
+ scrollResetBehavior = "direction-aware",
1325
1377
  onScrollProgress,
1326
1378
  onActivate,
1327
1379
  onDeactivate,
@@ -1335,7 +1387,8 @@ function ScrollLockedView({
1335
1387
  id,
1336
1388
  type: "scroll-locked",
1337
1389
  scrollDirection,
1338
- scrollEndThreshold
1390
+ scrollEndThreshold,
1391
+ scrollResetBehavior
1339
1392
  },
1340
1393
  onActivate,
1341
1394
  onDeactivate,
@@ -1350,6 +1403,43 @@ function ScrollLockedView({
1350
1403
  scrollDirection,
1351
1404
  onScrollProgress
1352
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]);
1353
1443
  const scrollClasses = scrollDirection === "vertical" ? "overflow-y-auto overflow-x-hidden" : "overflow-x-auto overflow-y-hidden";
1354
1444
  return /* @__PURE__ */ jsx(
1355
1445
  "section",
@@ -1357,13 +1447,14 @@ function ScrollLockedView({
1357
1447
  id,
1358
1448
  className: `relative w-full h-screen ${className}`,
1359
1449
  "data-view-type": "scroll-locked",
1360
- "data-active": isActive,
1450
+ "data-active": isActive ? "true" : "false",
1361
1451
  children: /* @__PURE__ */ jsx(
1362
1452
  "div",
1363
1453
  {
1364
1454
  ref: scrollRef,
1365
1455
  className: `w-full h-full ${scrollClasses} no-scrollbar`,
1366
1456
  style: { scrollbarWidth: "none" },
1457
+ "data-scrollable": "true",
1367
1458
  children
1368
1459
  }
1369
1460
  )
@@ -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.1",
3
+ "version": "1.2.1",
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",