desktop scrolling works fine now
This commit is contained in:
@@ -41,12 +41,43 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
const documentHeight = document.documentElement.scrollHeight;
|
const documentHeight = document.documentElement.scrollHeight;
|
||||||
const windowHeight = window.innerHeight;
|
const windowHeight = window.innerHeight;
|
||||||
|
|
||||||
// Get the absolute position of the element by temporarily scrolling to top
|
// Detect if we're on desktop or mobile layout
|
||||||
|
const isDesktop = window.innerWidth >= 640; // sm breakpoint
|
||||||
|
const proseContainer = document.querySelector('.prose');
|
||||||
|
|
||||||
|
console.log('Layout detection:', {
|
||||||
|
isDesktop,
|
||||||
|
windowWidth: window.innerWidth,
|
||||||
|
proseContainer: proseContainer ? 'found' : 'not found'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the absolute position of the element
|
||||||
const currentScrollY = window.scrollY;
|
const currentScrollY = window.scrollY;
|
||||||
let elementTop = 0;
|
let elementTop = 0;
|
||||||
|
|
||||||
// If we're not at the top, scroll to top temporarily to get accurate positions
|
if (isDesktop) {
|
||||||
if (currentScrollY > 0) {
|
// For desktop, we need to account for the nested container structure
|
||||||
|
// The content is inside a container with padding and margins
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
elementTop = rect.top + currentScrollY;
|
||||||
|
|
||||||
|
// If we're at the top and getting 0, try a different approach
|
||||||
|
if (elementTop === 0 && currentScrollY === 0) {
|
||||||
|
// Walk up the DOM tree to calculate position
|
||||||
|
let currentElement = element;
|
||||||
|
while (currentElement && currentElement !== document.body) {
|
||||||
|
elementTop += currentElement.offsetTop;
|
||||||
|
currentElement = currentElement.offsetParent as HTMLElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For mobile, use the simpler approach
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
elementTop = rect.top + currentScrollY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're not at the top, temporarily scroll to top to get accurate positions
|
||||||
|
if (currentScrollY > 0 && elementTop === currentScrollY) {
|
||||||
// Temporarily scroll to top to get accurate element positions
|
// Temporarily scroll to top to get accurate element positions
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
|
|
||||||
@@ -63,9 +94,11 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
}, 50);
|
}, 50);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// We're already at the top, get position directly
|
// We're already at the top or have a valid position, get position directly
|
||||||
|
if (elementTop === 0 && currentScrollY === 0) {
|
||||||
const rect = element.getBoundingClientRect();
|
const rect = element.getBoundingClientRect();
|
||||||
elementTop = rect.top;
|
elementTop = rect.top;
|
||||||
|
}
|
||||||
performActualScroll(elementTop);
|
performActualScroll(elementTop);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +110,8 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
currentScrollY: window.scrollY,
|
currentScrollY: window.scrollY,
|
||||||
documentHeight,
|
documentHeight,
|
||||||
windowHeight,
|
windowHeight,
|
||||||
canScroll: documentHeight > windowHeight
|
canScroll: documentHeight > windowHeight,
|
||||||
|
isDesktop
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if page is scrollable
|
// Check if page is scrollable
|
||||||
@@ -86,8 +120,8 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the target scroll position
|
// Calculate the target scroll position with different offsets for desktop/mobile
|
||||||
const offset = 100; // Account for sticky header
|
const offset = isDesktop ? 120 : 100; // Slightly more offset for desktop due to header
|
||||||
const targetScrollY = Math.max(0, elementTop - offset);
|
const targetScrollY = Math.max(0, elementTop - offset);
|
||||||
|
|
||||||
console.log('Scroll calculation:', {
|
console.log('Scroll calculation:', {
|
||||||
@@ -95,7 +129,8 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
targetScrollY,
|
targetScrollY,
|
||||||
offset,
|
offset,
|
||||||
currentScrollY: window.scrollY,
|
currentScrollY: window.scrollY,
|
||||||
scrollDifference: targetScrollY - window.scrollY
|
scrollDifference: targetScrollY - window.scrollY,
|
||||||
|
isDesktop
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if we need to scroll at all
|
// Check if we need to scroll at all
|
||||||
@@ -157,29 +192,35 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const element = document.getElementById(id);
|
// Find the element, but only consider visible ones
|
||||||
|
const allElements = document.querySelectorAll(`#${id}`);
|
||||||
|
let element: HTMLElement | null = null;
|
||||||
|
|
||||||
|
// Check if we're on desktop or mobile
|
||||||
|
const isDesktop = window.innerWidth >= 640;
|
||||||
|
|
||||||
|
for (const el of Array.from(allElements)) {
|
||||||
|
const htmlEl = el as HTMLElement;
|
||||||
|
// Check if the element is visible (not hidden by CSS)
|
||||||
|
const rect = htmlEl.getBoundingClientRect();
|
||||||
|
const isVisible = rect.width > 0 && rect.height > 0;
|
||||||
|
|
||||||
|
if (isVisible) {
|
||||||
|
element = htmlEl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
console.log('Found target element:', element.textContent?.substring(0, 50));
|
console.log('Found target element:', element.textContent?.substring(0, 50));
|
||||||
scrollToElement(element);
|
scrollToElement(element);
|
||||||
} else if (retryCount < 5) {
|
} else if (retryCount < 5) {
|
||||||
console.log(`Element not found for anchor: ${id}, retrying... (${retryCount + 1}/5)`);
|
console.log(`Element not found for anchor: ${id}, retrying... (${retryCount + 1}/5)`);
|
||||||
// Retry after a short delay
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
findAndScrollToElement(id, retryCount + 1);
|
findAndScrollToElement(id, retryCount + 1);
|
||||||
}, 100);
|
}, 100);
|
||||||
} else {
|
} else {
|
||||||
console.warn('Target element not found for anchor after retries:', id);
|
console.warn(`Element with id "${id}" not found after retries`);
|
||||||
// Log all available IDs for debugging
|
|
||||||
const allIds = Array.from(document.querySelectorAll('[id]')).map(el => el.id);
|
|
||||||
console.log('Available IDs on page:', allIds);
|
|
||||||
|
|
||||||
// Show a user-friendly error message
|
|
||||||
const linkElement = document.querySelector(`a[href="#${id}"]`) as HTMLElement;
|
|
||||||
if (linkElement) {
|
|
||||||
linkElement.setAttribute('title', `Heading "${id}" not found`);
|
|
||||||
linkElement.style.color = '#ef4444'; // Red color for broken links
|
|
||||||
linkElement.style.textDecoration = 'line-through';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -286,6 +327,40 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
}, 2000);
|
}, 2000);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Add a desktop-specific test function
|
||||||
|
(window as any).testDesktopScroll = () => {
|
||||||
|
console.log('=== Desktop Scroll Test ===');
|
||||||
|
|
||||||
|
const isDesktop = window.innerWidth >= 640;
|
||||||
|
console.log('Layout detection:', {
|
||||||
|
isDesktop,
|
||||||
|
windowWidth: window.innerWidth,
|
||||||
|
windowHeight: window.innerHeight
|
||||||
|
});
|
||||||
|
|
||||||
|
// Test scrolling to a known element
|
||||||
|
const overviewElement = document.getElementById('overview');
|
||||||
|
if (overviewElement) {
|
||||||
|
console.log('Testing desktop scroll to overview...');
|
||||||
|
|
||||||
|
// Get element position using desktop method
|
||||||
|
const rect = overviewElement.getBoundingClientRect();
|
||||||
|
const elementTop = rect.top + window.scrollY;
|
||||||
|
|
||||||
|
console.log('Desktop position calculation:', {
|
||||||
|
rectTop: rect.top,
|
||||||
|
currentScrollY: window.scrollY,
|
||||||
|
calculatedElementTop: elementTop
|
||||||
|
});
|
||||||
|
|
||||||
|
scrollToElement(overviewElement);
|
||||||
|
} else {
|
||||||
|
console.log('Overview element not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('=== End Desktop Test ===');
|
||||||
|
};
|
||||||
|
|
||||||
// Add a function to list all available IDs
|
// Add a function to list all available IDs
|
||||||
(window as any).listIds = () => {
|
(window as any).listIds = () => {
|
||||||
const allIds = Array.from(document.querySelectorAll('[id]')).map(el => ({
|
const allIds = Array.from(document.querySelectorAll('[id]')).map(el => ({
|
||||||
@@ -337,7 +412,13 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
|
|
||||||
const headings = Array.from(document.querySelectorAll('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]'));
|
const headings = Array.from(document.querySelectorAll('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]'));
|
||||||
|
|
||||||
headings.forEach((el, index) => {
|
// Filter to only visible elements
|
||||||
|
const visibleHeadings = headings.filter(el => {
|
||||||
|
const rect = (el as HTMLElement).getBoundingClientRect();
|
||||||
|
return rect.width > 0 && rect.height > 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
visibleHeadings.forEach((el, index) => {
|
||||||
const element = el as HTMLElement;
|
const element = el as HTMLElement;
|
||||||
|
|
||||||
// Calculate absolute position
|
// Calculate absolute position
|
||||||
@@ -357,12 +438,26 @@ export default function PostPage({ params }: { params: { slug: string[] } }) {
|
|||||||
console.log('---');
|
console.log('---');
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('=== End Positions ===');
|
console.log(`=== End Positions (${visibleHeadings.length} visible elements) ===`);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add a simple test function
|
// Add a simple test function
|
||||||
(window as any).testScrollToElement = (id: string) => {
|
(window as any).testScrollToElement = (id: string) => {
|
||||||
const element = document.getElementById(id);
|
// Find visible element with this ID
|
||||||
|
const allElements = document.querySelectorAll(`#${id}`);
|
||||||
|
let element: HTMLElement | null = null;
|
||||||
|
|
||||||
|
for (const el of Array.from(allElements)) {
|
||||||
|
const htmlEl = el as HTMLElement;
|
||||||
|
const rect = htmlEl.getBoundingClientRect();
|
||||||
|
const isVisible = rect.width > 0 && rect.height > 0;
|
||||||
|
|
||||||
|
if (isVisible) {
|
||||||
|
element = htmlEl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
console.log(`Testing scroll to ${id}...`);
|
console.log(`Testing scroll to ${id}...`);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user