File "ez-toc-widget-sticky.js"
Full Path: /home/timepamn/dailynetworth.org/wp-content/plugins/easy-table-of-contents/assets/js/ez-toc-widget-sticky.js
File size: 36.56 KB
MIME-type: text/plain
Charset: utf-8
// Prevent multiple initializations
if (window.ezTocWidgetStickyInitialized) {
} else {
window.ezTocWidgetStickyInitialized = true;
// Wait for DOM to be ready
function ready(fn) {
if (document.readyState !== 'loading') {
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
}
ready(() => {
let lastActive = null;
let observer;
let stickyInitialized = false;
let mobileToggleInitialized = false;
let observerDisabled = false;
const tocContainer = document.querySelector('.ez-toc-widget-sticky nav');
const stickyContainer = document.querySelector('.ez-toc-widget-sticky-container');
// Check if elements exist
if (!tocContainer || !stickyContainer) {
return;
}
// Function to find the article or post-content container
function findArticleContainer() {
// Look for common article containers
const selectors = [
'article',
'.post-content',
'.entry-content',
'.content-area',
'.main-content',
'.post-body',
'.article-content',
'.single-post',
'.single-page',
'.post',
'.page',
'[role="main"]',
'main'
];
for (const selector of selectors) {
const container = document.querySelector(selector);
if (container) {
// Check if the container is visible and has content
const rect = container.getBoundingClientRect();
if (rect.width > 0 && rect.height > 0) {
return container;
} else {
}
} else {
console.log('EZ TOC Widget Sticky: No element found for selector:', selector);
}
}
// Fallback to body if no suitable container found
return document.body;
}
// Check if device is mobile
function isMobileDevice() {
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
window.innerWidth <= 768;
return isMobile;
}
// Function to initialize mobile toggle functionality
function initializeMobileToggle() {
if (mobileToggleInitialized || !isMobileDevice()) {
return;
}
// Create mobile toggle button
const mobileToggleBtn = document.createElement('div');
mobileToggleBtn.className = 'ez-toc-mobile-toggle-btn';
mobileToggleBtn.innerHTML = `
<span class="ez-toc-mobile-toggle-icon">☰</span>
<span class="ez-toc-mobile-toggle-text">TOC</span>
`;
// Add styles for mobile toggle button
const mobileToggleStyles = document.createElement('style');
mobileToggleStyles.textContent = `
.ez-toc-mobile-toggle-btn {
position: fixed;
top: 50%;
right: 0;
transform: translateY(-50%);
background: #007cba;
color: white;
padding: 12px 8px;
border-radius: 8px 0 0 8px;
cursor: pointer;
z-index: 10000;
box-shadow: -2px 2px 8px rgba(0,0,0,0.2);
transition: all 0.3s ease;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: bold;
}
.ez-toc-mobile-toggle-btn:hover {
background: #005a87;
transform: translateY(-50%) translateX(-2px);
}
.ez-toc-mobile-toggle-icon {
font-size: 16px;
line-height: 1;
}
.ez-toc-mobile-toggle-text {
font-size: 10px;
line-height: 1;
}
.ez-toc-widget-sticky-container.mobile-overlay {
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
bottom: 0 !important;
width: 100% !important;
max-width: 100% !important;
height: 100vh !important;
z-index: 10001 !important;
background: rgba(0,0,0,0.8) !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
padding: 20px !important;
box-sizing: border-box !important;
border: none !important;
border-radius: 0 !important;
box-shadow: none !important;
}
.ez-toc-widget-sticky-container.mobile-overlay .ez-toc-widget-sticky-content {
background: white;
border-radius: 12px;
max-width: 90%;
max-height: 80vh;
width: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
}
.ez-toc-widget-sticky-container.mobile-overlay .ez-toc-widget-sticky-title {
padding: 15px 20px !important;
border-bottom: 1px solid #eee !important;
margin: 0 !important;
background: #f9f9f9 !important;
border-radius: 12px 12px 0 0 !important;
font-size: 18px !important;
font-weight: bold !important;
}
.ez-toc-widget-sticky-container.mobile-overlay nav {
padding: 20px !important;
max-height: 60vh !important;
overflow-y: auto !important;
flex: 1;
}
.ez-toc-widget-sticky-container.mobile-overlay .ez-toc-mobile-close-btn {
position: absolute;
top: 15px;
right: 15px;
background: none;
border: none;
font-size: 24px;
cursor: pointer;
color: #666;
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: background-color 0.2s ease;
}
.ez-toc-widget-sticky-container.mobile-overlay .ez-toc-mobile-close-btn:hover {
background-color: #f0f0f0;
}
.ez-toc-widget-sticky-container.mobile-overlay {
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease, visibility 0.3s ease;
}
.ez-toc-widget-sticky-container.mobile-overlay.show {
opacity: 1;
visibility: visible;
}
@media (max-width: 768px) {
.ez-toc-widget-sticky-container:not(.mobile-overlay) {
display: none !important;
}
}
`;
document.head.appendChild(mobileToggleStyles);
document.body.appendChild(mobileToggleBtn);
// Wrap the sticky container content for mobile overlay
const originalContent = stickyContainer.innerHTML;
stickyContainer.innerHTML = `
<div class="ez-toc-widget-sticky-content">
<button class="ez-toc-mobile-close-btn" aria-label="Close Table of Contents">×</button>
${originalContent}
</div>
`;
// Add event listeners
mobileToggleBtn.addEventListener('click', function() {
stickyContainer.classList.add('mobile-overlay', 'show');
document.body.style.overflow = 'hidden'; // Prevent background scrolling
});
const closeBtn = stickyContainer.querySelector('.ez-toc-mobile-close-btn');
if (closeBtn) {
closeBtn.addEventListener('click', function() {
closeMobileOverlay();
});
}
// Close overlay when clicking outside the content
stickyContainer.addEventListener('click', function(e) {
if (e.target === stickyContainer) {
closeMobileOverlay();
}
});
// Close overlay when pressing Escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && stickyContainer.classList.contains('mobile-overlay')) {
closeMobileOverlay();
}
});
// Close overlay when clicking on any link within the mobile overlay
stickyContainer.addEventListener('click', function(e) {
const link = e.target.closest('a');
if (link && isMobileDevice()) {
// Close the overlay immediately when any link is clicked
stickyContainer.classList.remove('show');
stickyContainer.classList.remove('mobile-overlay');
document.body.style.overflow = '';
}
});
function closeMobileOverlay() {
stickyContainer.classList.remove('show');
setTimeout(() => {
stickyContainer.classList.remove('mobile-overlay');
document.body.style.overflow = '';
}, 200); // Reduced delay for better responsiveness
}
mobileToggleInitialized = true;
}
// Function to initialize sticky functionality
function initializeSticky() {
if (stickyInitialized || !stickyContainer) {
return;
}
// Don't initialize sticky on mobile devices
if (isMobileDevice()) {
return;
}
// Find the article container
const articleContainer = findArticleContainer();
// Check if sticky-kit is available
if (typeof jQuery !== 'undefined' && jQuery.fn.stick_in_parent) {
const $ = jQuery;
try {
// Get the offset top setting
const offsetTop = (typeof ezTocWidgetSticky !== 'undefined' && ezTocWidgetSticky.fixed_top_position)
? parseInt(ezTocWidgetSticky.fixed_top_position)
: 30;
// Initialize sticky with body as parent but respect article boundaries
$(stickyContainer).stick_in_parent({
inner_scrolling: false,
offset_top: offsetTop,
sticky_class: 'is_stuck',
parent: 'body' // Use body as parent
});
stickyInitialized = true;
// Add custom logic to respect article boundaries
let isSticky = false;
const originalTop = stickyContainer.offsetTop;
const originalPosition = stickyContainer.style.position;
function handleArticleBoundaries() {
if (!isSticky) return;
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const containerTop = articleContainer.offsetTop;
const containerBottom = containerTop + articleContainer.offsetHeight;
const stickyHeight = stickyContainer.offsetHeight;
const stickyTop = stickyContainer.offsetTop;
// Check if we've scrolled past the article container
if (scrollTop + stickyHeight + offsetTop > containerBottom) {
// Position the sticky element at the bottom of the article
const maxTop = containerBottom - stickyHeight - offsetTop;
stickyContainer.style.top = Math.max(offsetTop, maxTop) + 'px';
} else {
// Normal sticky behavior
stickyContainer.style.top = offsetTop + 'px';
}
}
// Handle window resize
$(window).on('resize', function() {
// Don't recalculate on mobile
if (isMobileDevice()) {
if ($(stickyContainer).hasClass('is_stuck')) {
$(stickyContainer).trigger('sticky_kit:recalc');
}
return;
}
if ($(stickyContainer).hasClass('is_stuck')) {
$(stickyContainer).trigger('sticky_kit:recalc');
handleArticleBoundaries();
}
});
// Add scroll listener for article boundary handling
$(window).on('scroll', function() {
if ($(stickyContainer).hasClass('is_stuck')) {
handleArticleBoundaries();
}
});
} catch (error) {
console.error('EZ TOC Widget Sticky: Error initializing sticky functionality:', error);
}
} else {
console.warn('EZ TOC Widget Sticky: jQuery or sticky-kit not available');
}
}
// Initialize based on device type
if (isMobileDevice()) {
initializeMobileToggle();
} else {
initializeSticky();
}
// Handle device type changes on resize
let currentDeviceType = isMobileDevice();
window.addEventListener('resize', function() {
const newDeviceType = isMobileDevice();
if (newDeviceType !== currentDeviceType) {
currentDeviceType = newDeviceType;
if (newDeviceType) {
// Switch to mobile mode
if (stickyInitialized) {
// Detach sticky functionality
if (typeof jQuery !== 'undefined' && jQuery.fn.stick_in_parent) {
const $ = jQuery;
$(stickyContainer).trigger('sticky_kit:detach');
}
stickyInitialized = false;
}
initializeMobileToggle();
} else {
// Switch to desktop mode
if (mobileToggleInitialized) {
// Remove mobile toggle button
const mobileToggleBtn = document.querySelector('.ez-toc-mobile-toggle-btn');
if (mobileToggleBtn) {
mobileToggleBtn.remove();
}
mobileToggleInitialized = false;
}
initializeSticky();
}
}
});
// If not initialized, try again with a timeout
if (!stickyInitialized && !isMobileDevice()) {
setTimeout(() => {
initializeSticky();
}, 1000); // Wait 1 second
}
// Try again after a longer timeout as fallback
setTimeout(() => {
if (!stickyInitialized && !isMobileDevice()) {
initializeSticky();
}
}, 3000); // Wait 3 seconds
// Final attempt after page is fully loaded
window.addEventListener('load', () => {
if (!stickyInitialized && !isMobileDevice()) {
initializeSticky();
}
if (!mobileToggleInitialized && isMobileDevice()) {
initializeMobileToggle();
}
});
// Fallback sticky functionality without sticky-kit
function initializeFallbackSticky() {
if (stickyInitialized || !stickyContainer) {
return;
}
// Don't initialize fallback sticky on mobile devices
if (isMobileDevice()) {
return;
}
try {
const articleContainer = findArticleContainer();
const offsetTop = (typeof ezTocWidgetSticky !== 'undefined' && ezTocWidgetSticky.fixed_top_position)
? parseInt(ezTocWidgetSticky.fixed_top_position)
: 30;
let isSticky = false;
const originalTop = stickyContainer.offsetTop;
const originalPosition = stickyContainer.style.position;
const containerRect = articleContainer.getBoundingClientRect();
function handleScroll() {
// Don't handle sticky on mobile
if (isMobileDevice()) {
return;
}
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const containerTop = articleContainer.offsetTop;
const containerBottom = containerTop + articleContainer.offsetHeight;
const stickyHeight = stickyContainer.offsetHeight;
// Check if we should make it sticky
if (scrollTop > originalTop - offsetTop && !isSticky) {
stickyContainer.style.position = 'fixed';
stickyContainer.style.top = offsetTop + 'px';
stickyContainer.style.zIndex = '9999';
stickyContainer.classList.add('is_stuck');
isSticky = true;
}
// Check if we should unstick it (when reaching container bottom)
else if ((scrollTop + stickyHeight + offsetTop > containerBottom) && isSticky) {
stickyContainer.style.position = 'absolute';
stickyContainer.style.top = (containerBottom - stickyHeight - offsetTop) + 'px';
stickyContainer.style.zIndex = '9999';
stickyContainer.classList.add('is_stuck');
}
// Check if we should return to normal position
else if (scrollTop <= originalTop - offsetTop && isSticky) {
stickyContainer.style.position = originalPosition;
stickyContainer.style.top = '';
stickyContainer.style.zIndex = '';
stickyContainer.classList.remove('is_stuck');
isSticky = false;
}
}
window.addEventListener('scroll', handleScroll);
window.addEventListener('resize', handleScroll);
stickyInitialized = true;
} catch (error) {
console.error('EZ TOC Widget Sticky: Error initializing fallback sticky:', error);
}
}
// Try fallback if sticky-kit fails after 5 seconds
setTimeout(() => {
if (!stickyInitialized && !isMobileDevice()) {
initializeFallbackSticky();
}
}, 5000);
function isElementFullyVisible(el, container) {
const containerRect = container.getBoundingClientRect();
const elRect = el.getBoundingClientRect();
return elRect.top >= containerRect.top && elRect.bottom <= containerRect.bottom;
}
function highlightHeading(headingId) {
const allTocLinks = document.querySelectorAll('.ez-toc-widget-sticky nav li a');
const all_active_items = document.querySelectorAll('.ez-toc-widget-sticky nav li.active');
// Remove active class from all previously active list items
if (all_active_items.length > 0) {
all_active_items.forEach(item => {
item.classList.remove('active');
});
}
// Find the link that corresponds to the clicked heading
let targetLink = null;
allTocLinks.forEach(link => {
const href = link.getAttribute('href');
if (href && href.startsWith('#')) {
const id = href.substring(1);
if (id === headingId) {
targetLink = link;
}
}
});
// Add active class to the specific list item containing the link
if (targetLink) {
const listItem = targetLink.closest('li');
if (listItem) {
listItem.classList.add('active');
lastActive = listItem;
// Scroll the active item into view if needed
if (!isElementFullyVisible(listItem, tocContainer)) {
listItem.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}
}
}
// Track scroll direction and last scroll position
let lastScrollTop = 0;
let scrollDirection = 'down';
function updateScrollDirection() {
const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;
scrollDirection = currentScrollTop > lastScrollTop ? 'down' : 'up';
lastScrollTop = currentScrollTop;
}
function getHeadingAtTop() {
const topOffset = 50; // Small offset from the very top
const allTocLinks = document.querySelectorAll('.ez-toc-widget-sticky nav li a');
const tocLinkMap = new Map();
const headingPositions = [];
// Build map of all headings and their positions
allTocLinks.forEach(link => {
const href = link.getAttribute('href');
if (href && href.startsWith('#')) {
const id = href.substring(1);
const element = document.getElementById(id);
if (element) {
const rect = element.getBoundingClientRect();
const top = rect.top + window.pageYOffset;
const bottom = rect.bottom + window.pageYOffset;
const center = top + (rect.height / 2);
tocLinkMap.set(id, link);
headingPositions.push({
id: id,
link: link,
top: top,
bottom: bottom,
center: center,
element: element
});
}
}
});
// Sort headings by their position (top to bottom)
headingPositions.sort((a, b) => a.top - b.top);
const viewportTop = window.pageYOffset + topOffset;
let bestHeading = null;
// When scrolling down, be more conservative - only advance when we've scrolled past the current heading's content
if (scrollDirection === 'down') {
// Find the current active heading first
const activeListItem = document.querySelector('.ez-toc-widget-sticky nav li.active');
if (activeListItem) {
const activeLink = activeListItem.querySelector('a');
if (activeLink) {
const activeHref = activeLink.getAttribute('href');
if (activeHref && activeHref.startsWith('#')) {
const activeId = activeHref.substring(1);
const activeHeading = headingPositions.find(h => h.id === activeId);
if (activeHeading) {
// Only advance to next heading if we've scrolled significantly past the current heading's bottom
const advanceThreshold = activeHeading.bottom + 100; // 100px buffer
if (viewportTop >= advanceThreshold) {
// Find the next heading
const currentIndex = headingPositions.findIndex(h => h.id === activeId);
if (currentIndex < headingPositions.length - 1) {
bestHeading = headingPositions[currentIndex + 1];
} else {
bestHeading = activeHeading; // Stay on last heading
}
} else {
bestHeading = activeHeading; // Keep current heading
}
}
}
}
}
}
// If no heading found for scroll down logic, or if scrolling up, use the original logic
if (!bestHeading) {
// Find the first heading that is at or below the top of the viewport
for (let i = 0; i < headingPositions.length; i++) {
const heading = headingPositions[i];
if (heading.top >= viewportTop) {
bestHeading = heading;
break;
}
}
// If no heading found at or below viewport top, use the last heading
if (!bestHeading && headingPositions.length > 0) {
bestHeading = headingPositions[headingPositions.length - 1];
}
// If scrolling up, prefer the previous heading when current is below top
if (scrollDirection === 'up' && bestHeading) {
const currentIndex = headingPositions.findIndex(h => h.id === bestHeading.id);
if (currentIndex > 0) {
const currentHeading = headingPositions[currentIndex];
const previousHeading = headingPositions[currentIndex - 1];
// If current heading is below top, use previous heading
if (currentHeading.top > viewportTop) {
bestHeading = previousHeading;
}
}
}
}
return bestHeading;
}
function createObserver() {
observer = new IntersectionObserver(entries => {
// Skip processing if observer is disabled
if (observerDisabled) {
return;
}
updateScrollDirection();
const topHeading = getHeadingAtTop();
if (!topHeading) {
return;
}
// Build map of all TOC links
const allTocLinks = document.querySelectorAll('.ez-toc-widget-sticky nav li a');
const tocLinkMap = new Map();
allTocLinks.forEach(link => {
const href = link.getAttribute('href');
if (href && href.startsWith('#')) {
const id = href.substring(1);
tocLinkMap.set(id, link);
}
});
// Find the best heading to highlight by checking hierarchy
let bestHeadingId = topHeading.id;
let bestHeadingLink = tocLinkMap.get(topHeading.id);
if (bestHeadingLink) {
const bestListItem = bestHeadingLink.closest('li');
// Check if this heading has child headings that are also visible
if (bestListItem) {
const childLinks = bestListItem.querySelectorAll('ul li a');
const visibleChildIds = [];
childLinks.forEach(childLink => {
const childHref = childLink.getAttribute('href');
if (childHref && childHref.startsWith('#')) {
const childId = childHref.substring(1);
const childElement = document.getElementById(childId);
if (childElement) {
const rect = childElement.getBoundingClientRect();
const isVisible = rect.top < window.innerHeight && rect.bottom > 0;
if (isVisible) {
visibleChildIds.push(childId);
}
}
}
});
// If child headings are visible, check if any are at the top of viewport
if (visibleChildIds.length > 0) {
let topChildId = null;
const viewportTop = window.pageYOffset + 50;
// Find the first child heading that is at or below the top of the viewport
for (let i = 0; i < visibleChildIds.length; i++) {
const childId = visibleChildIds[i];
const childElement = document.getElementById(childId);
if (childElement) {
const rect = childElement.getBoundingClientRect();
const childTop = rect.top + window.pageYOffset;
if (childTop >= viewportTop) {
topChildId = childId;
break;
}
}
}
// Use child if it's at the top of viewport and parent is not
if (topChildId && topHeading.top < viewportTop) {
bestHeadingId = topChildId;
bestHeadingLink = tocLinkMap.get(topChildId);
}
}
}
}
const all_active_items = document.querySelectorAll('.ez-toc-widget-sticky nav li.active');
if (bestHeadingLink) {
// Remove active class from all previously active list items
if (all_active_items.length > 0) {
all_active_items.forEach(item => {
item.classList.remove('active');
});
}
// Add active class only to the specific list item containing the link
const listItem = bestHeadingLink.closest('li');
if (listItem) {
listItem.classList.add('active');
lastActive = listItem;
// Scroll the active item into view if needed
if (!isElementFullyVisible(listItem, tocContainer)) {
listItem.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
}
}
}, {
threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
rootMargin: '0px 0px -80% 0px' // Adjust to focus more on top of viewport
});
}
// Initialize the observer and start observing all sections.
createObserver();
// Try multiple selectors to find heading elements
const headingSelectors = [
'.ez-toc-section',
'[id] h1, [id] h2, [id] h3, [id] h4, [id] h5, [id] h6',
'h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]',
'.ez-toc-heading',
'[id]'
];
let sectionsFound = false;
for (const selector of headingSelectors) {
const sections = document.querySelectorAll(selector);
if (sections.length > 0) {
sections.forEach(section => {
const id = section.getAttribute('id');
if (id) {
observer.observe(section);
}
});
sectionsFound = true;
break;
}
}
if (!sectionsFound) {
console.warn('EZ TOC Widget Sticky: No heading sections found to observe');
}
tocContainer.addEventListener('click', event => {
const link = event.target.closest('a');
if (link) {
// Get the heading ID from the clicked link
const href = link.getAttribute('href');
if (href && href.startsWith('#')) {
const headingId = href.substring(1);
// Immediately highlight the clicked heading
highlightHeading(headingId);
}
// Close mobile overlay immediately if it's open
if (isMobileDevice() && stickyContainer.classList.contains('mobile-overlay')) {
// Close the overlay immediately
stickyContainer.classList.remove('show');
stickyContainer.classList.remove('mobile-overlay');
document.body.style.overflow = '';
}
// Disable observer for 3 seconds to prevent conflicts
observerDisabled = true;
// Disconnect the observer so it won't interfere with the native anchor jump.
observer.disconnect();
setTimeout(() => {
// Re-enable observer after 3 seconds
observerDisabled = false;
createObserver();
// Use the same improved element selection
const headingSelectors = [
'.ez-toc-section',
'[id] h1, [id] h2, [id] h3, [id] h4, [id] h5, [id] h6',
'h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]',
'.ez-toc-heading',
'[id]'
];
for (const selector of headingSelectors) {
const sections = document.querySelectorAll(selector);
if (sections.length > 0) {
sections.forEach(section => {
const id = section.getAttribute('id');
if (id) {
observer.observe(section);
}
});
break;
}
}
}, 3000); // Changed from 2000 to 3000 milliseconds
}
});
// Global event listener to catch ALL link clicks within the mobile overlay
document.addEventListener('click', event => {
const link = event.target.closest('a');
if (link && isMobileDevice() && stickyContainer.classList.contains('mobile-overlay')) {
// Check if the link is within the TOC container
const tocContainer = link.closest('.ez-toc-widget-sticky-container');
if (tocContainer) {
// Close the overlay immediately for any link click
stickyContainer.classList.remove('show');
stickyContainer.classList.remove('mobile-overlay');
document.body.style.overflow = '';
}
}
});
// Additional event listener specifically for the mobile overlay content
stickyContainer.addEventListener('click', event => {
const link = event.target.closest('a');
if (link && isMobileDevice() && stickyContainer.classList.contains('mobile-overlay')) {
// Close the overlay immediately
stickyContainer.classList.remove('show');
stickyContainer.classList.remove('mobile-overlay');
document.body.style.overflow = '';
}
});
});
}
document.addEventListener("DOMContentLoaded", function () {
const tocContainer = document.querySelector(".ez-toc-widget-sticky-container");
let postContent = document.querySelector("article");
if (document.querySelector("article")) {
postContent = document.querySelector("article");
} else if (document.querySelector(".post-content")) {
postContent = document.querySelector(".post-content");
} else if (document.querySelector(".entry-content")) {
postContent = document.querySelector(".entry-content");
} else if (document.querySelector(".single-post-content")) {
postContent = document.querySelector(".single-post-content");
} else if (document.querySelector(".content-area")) {
postContent = document.querySelector(".content-area");
}
function checkTOCInsideContent() {
if (!tocContainer || !postContent) return;
const tocRect = tocContainer.getBoundingClientRect();
const contentRect = postContent.getBoundingClientRect();
const inside =
tocRect.top >= contentRect.top &&
tocRect.bottom <= contentRect.bottom;
if (inside) {
tocContainer.style.opacity = "1";
tocContainer.style.pointerEvents = "auto";
} else {
tocContainer.style.opacity = "0";
tocContainer.style.pointerEvents = "none";
}
}
// Run on load + scroll + resize
checkTOCInsideContent();
document.addEventListener("scroll", checkTOCInsideContent);
window.addEventListener("resize", checkTOCInsideContent);
});