+
{renderSections(props.sections,
props.currentSectionIndex,
props.setCurrentSection)}
diff --git a/entry_types/scrolled/package/src/frontend/Chapter.module.css b/entry_types/scrolled/package/src/frontend/Chapter.module.css
new file mode 100644
index 0000000000..f2a8eee755
--- /dev/null
+++ b/entry_types/scrolled/package/src/frontend/Chapter.module.css
@@ -0,0 +1,3 @@
+.wrapper {
+ scroll-margin-top: var(--widget-margin-top);
+}
diff --git a/entry_types/scrolled/package/src/frontend/Section.module.css b/entry_types/scrolled/package/src/frontend/Section.module.css
index 2d5f47bd5b..e01376c086 100644
--- a/entry_types/scrolled/package/src/frontend/Section.module.css
+++ b/entry_types/scrolled/package/src/frontend/Section.module.css
@@ -7,6 +7,7 @@
.Section {
position: relative;
+ scroll-margin-top: var(--widget-margin-top);
--section-max-width:
var(--theme-section-max-width);
diff --git a/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigation.js b/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigation.js
index 6f115e35f6..5ffdad1c11 100644
--- a/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigation.js
+++ b/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigation.js
@@ -34,7 +34,7 @@ export function DefaultNavigation({
logo,
omitChapterNavigation
}) {
- const {navExpanded, setNavExpanded} = useDefaultNavigationState();
+ const {navExpanded, setNavExpanded, lockNavExpanded} = useDefaultNavigationState();
const [menuOpen, setMenuOpen] = useState(!!configuration.defaultMobileNavVisible);
const [readingProgress, setReadingProgress] = useState(0);
@@ -78,6 +78,7 @@ export function DefaultNavigation({
};
function handleMenuClick(chapterLinkId) {
+ lockNavExpanded();
setMenuOpen(false);
};
diff --git a/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigationPresenceProvider.js b/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigationPresenceProvider.js
index 34833d4206..db44c2429f 100644
--- a/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigationPresenceProvider.js
+++ b/entry_types/scrolled/package/src/widgets/defaultNavigation/DefaultNavigationPresenceProvider.js
@@ -7,6 +7,7 @@ import {
usePhonePlatform
} from 'pageflow-scrolled/frontend';
+import {useTimeoutFlag} from './useTimeoutFlag';
import styles from './presenceClassNames.module.css';
const DefaultNavigationContext = createContext({
@@ -21,9 +22,17 @@ export function useDefaultNavigationState() {
export function DefaultNavigationPresenceProvider({configuration, children}) {
const [navExpanded, setNavExpanded] = useState(true);
const isPhonePlatform = usePhonePlatform();
+ const [scrollLockRef, activateScrollLock] = useTimeoutFlag(200);
+
+ const lockNavExpanded = useCallback(() => {
+ activateScrollLock();
+ setNavExpanded(true);
+ }, [activateScrollLock]);
useScrollPosition(
({prevPos, currPos}) => {
+ if (scrollLockRef.current) return;
+
const expand = currPos.y > prevPos.y ||
// Mobile Safari reports positive scroll position
// during scroll bounce animation when scrolling
@@ -51,8 +60,8 @@ export function DefaultNavigationPresenceProvider({configuration, children}) {
);
const contextValue = useMemo(
- () => ({navExpanded, setNavExpanded}),
- [navExpanded]
+ () => ({navExpanded, setNavExpanded, lockNavExpanded}),
+ [navExpanded, lockNavExpanded]
);
return (
diff --git a/entry_types/scrolled/package/src/widgets/defaultNavigation/useTimeoutFlag.js b/entry_types/scrolled/package/src/widgets/defaultNavigation/useTimeoutFlag.js
new file mode 100644
index 0000000000..975163f0f7
--- /dev/null
+++ b/entry_types/scrolled/package/src/widgets/defaultNavigation/useTimeoutFlag.js
@@ -0,0 +1,20 @@
+import {useCallback, useEffect, useRef} from 'react';
+
+export function useTimeoutFlag(duration) {
+ const flagRef = useRef(false);
+ const timeoutRef = useRef(null);
+
+ const activate = useCallback(() => {
+ flagRef.current = true;
+ clearTimeout(timeoutRef.current);
+ timeoutRef.current = setTimeout(() => {
+ flagRef.current = false;
+ }, duration);
+ }, [duration]);
+
+ useEffect(() => {
+ return () => clearTimeout(timeoutRef.current);
+ }, []);
+
+ return [flagRef, activate];
+}