mirror of
https://github.com/voideditor/void
synced 2026-05-24 09:58:23 +00:00
scrollbar fix
This commit is contained in:
parent
74f8303803
commit
89d08071fc
1 changed files with 66 additions and 69 deletions
|
|
@ -19,90 +19,87 @@ export const useScrollbarStyles = (containerRef: React.MutableRefObject<HTMLDivE
|
||||||
...Array.from(containerRef.current?.querySelectorAll(overflowSelector) || [])
|
...Array.from(containerRef.current?.querySelectorAll(overflowSelector) || [])
|
||||||
];
|
];
|
||||||
|
|
||||||
// Clean up existing elements first
|
// Apply basic styling to all elements
|
||||||
scrollElements.forEach(element => {
|
scrollElements.forEach(element => {
|
||||||
if ((element as any).__scrollbarCleanup) {
|
element.classList.add('void-scrollable-element');
|
||||||
(element as any).__scrollbarCleanup();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Apply styles and listeners to each scroll element
|
// Only initialize fade effects for elements that haven't been initialized yet
|
||||||
scrollElements.forEach(element => {
|
scrollElements.forEach(element => {
|
||||||
// Add the scrollable class directly to the overflow element
|
if (!(element as any).__scrollbarCleanup) {
|
||||||
element.classList.add('void-scrollable-element');
|
let fadeTimeout: NodeJS.Timeout | null = null;
|
||||||
|
let fadeInterval: NodeJS.Timeout | null = null;
|
||||||
|
|
||||||
let fadeTimeout: NodeJS.Timeout | null = null;
|
const fadeIn = () => {
|
||||||
let fadeInterval: NodeJS.Timeout | null = null;
|
if (fadeInterval) clearInterval(fadeInterval);
|
||||||
|
|
||||||
const fadeIn = () => {
|
let step = 0;
|
||||||
if (fadeInterval) clearInterval(fadeInterval);
|
fadeInterval = setInterval(() => {
|
||||||
|
if (step <= 10) {
|
||||||
|
element.classList.remove(`show-scrollbar-${step - 1}`);
|
||||||
|
element.classList.add(`show-scrollbar-${step}`);
|
||||||
|
step++;
|
||||||
|
} else {
|
||||||
|
clearInterval(fadeInterval!);
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
};
|
||||||
|
|
||||||
let step = 0;
|
const fadeOut = () => {
|
||||||
fadeInterval = setInterval(() => {
|
if (fadeInterval) clearInterval(fadeInterval);
|
||||||
if (step <= 10) {
|
|
||||||
element.classList.remove(`show-scrollbar-${step - 1}`);
|
let step = 10;
|
||||||
element.classList.add(`show-scrollbar-${step}`);
|
fadeInterval = setInterval(() => {
|
||||||
step++;
|
if (step >= 0) {
|
||||||
} else {
|
element.classList.remove(`show-scrollbar-${step + 1}`);
|
||||||
clearInterval(fadeInterval!);
|
element.classList.add(`show-scrollbar-${step}`);
|
||||||
|
step--;
|
||||||
|
} else {
|
||||||
|
clearInterval(fadeInterval!);
|
||||||
|
}
|
||||||
|
}, 60);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onMouseEnter = () => {
|
||||||
|
if (fadeTimeout) clearTimeout(fadeTimeout);
|
||||||
|
if (fadeInterval) clearInterval(fadeInterval);
|
||||||
|
fadeIn();
|
||||||
|
};
|
||||||
|
|
||||||
|
const onMouseLeave = () => {
|
||||||
|
if (fadeTimeout) clearTimeout(fadeTimeout);
|
||||||
|
fadeTimeout = setTimeout(() => {
|
||||||
|
fadeOut();
|
||||||
|
}, 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
element.addEventListener('mouseenter', onMouseEnter);
|
||||||
|
element.addEventListener('mouseleave', onMouseLeave);
|
||||||
|
|
||||||
|
// Store cleanup function
|
||||||
|
const cleanup = () => {
|
||||||
|
element.removeEventListener('mouseenter', onMouseEnter);
|
||||||
|
element.removeEventListener('mouseleave', onMouseLeave);
|
||||||
|
if (fadeTimeout) clearTimeout(fadeTimeout);
|
||||||
|
if (fadeInterval) clearInterval(fadeInterval);
|
||||||
|
element.classList.remove('void-scrollable-element');
|
||||||
|
// Remove any remaining show-scrollbar classes
|
||||||
|
for (let i = 0; i <= 10; i++) {
|
||||||
|
element.classList.remove(`show-scrollbar-${i}`);
|
||||||
}
|
}
|
||||||
}, 10);
|
};
|
||||||
};
|
|
||||||
|
|
||||||
const fadeOut = () => {
|
// Store the cleanup function on the element for later use
|
||||||
if (fadeInterval) clearInterval(fadeInterval);
|
(element as any).__scrollbarCleanup = cleanup;
|
||||||
|
}
|
||||||
let step = 10;
|
|
||||||
fadeInterval = setInterval(() => {
|
|
||||||
if (step >= 0) {
|
|
||||||
element.classList.remove(`show-scrollbar-${step + 1}`);
|
|
||||||
element.classList.add(`show-scrollbar-${step}`);
|
|
||||||
step--;
|
|
||||||
} else {
|
|
||||||
clearInterval(fadeInterval!);
|
|
||||||
}
|
|
||||||
}, 60);
|
|
||||||
};
|
|
||||||
|
|
||||||
const onMouseEnter = () => {
|
|
||||||
if (fadeTimeout) clearTimeout(fadeTimeout);
|
|
||||||
if (fadeInterval) clearInterval(fadeInterval);
|
|
||||||
fadeIn();
|
|
||||||
};
|
|
||||||
|
|
||||||
const onMouseLeave = () => {
|
|
||||||
if (fadeTimeout) clearTimeout(fadeTimeout);
|
|
||||||
fadeTimeout = setTimeout(() => {
|
|
||||||
fadeOut();
|
|
||||||
}, 10);
|
|
||||||
};
|
|
||||||
|
|
||||||
element.addEventListener('mouseenter', onMouseEnter);
|
|
||||||
element.addEventListener('mouseleave', onMouseLeave);
|
|
||||||
|
|
||||||
// Store cleanup function
|
|
||||||
const cleanup = () => {
|
|
||||||
element.removeEventListener('mouseenter', onMouseEnter);
|
|
||||||
element.removeEventListener('mouseleave', onMouseLeave);
|
|
||||||
if (fadeTimeout) clearTimeout(fadeTimeout);
|
|
||||||
if (fadeInterval) clearInterval(fadeInterval);
|
|
||||||
element.classList.remove('void-scrollable-element');
|
|
||||||
// Remove any remaining show-scrollbar classes
|
|
||||||
for (let i = 0; i <= 10; i++) {
|
|
||||||
element.classList.remove(`show-scrollbar-${i}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Store the cleanup function on the element for later use
|
|
||||||
(element as any).__scrollbarCleanup = cleanup;
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Initialize for the first time
|
// Initialize for the first time
|
||||||
initializeScrollbarStyles();
|
initializeScrollbarStyles();
|
||||||
|
|
||||||
// Set up mutation observer
|
// Set up mutation observer to do the same
|
||||||
const observer = new MutationObserver((mutations) => {
|
const observer = new MutationObserver(() => {
|
||||||
initializeScrollbarStyles();
|
initializeScrollbarStyles();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue