diff --git a/js/ui/galleryView.js b/js/ui/galleryView.js index f677ffc..93215b5 100644 --- a/js/ui/galleryView.js +++ b/js/ui/galleryView.js @@ -45,6 +45,14 @@ function updateScrollTopVisibility() { } const scrollEl = getScrollContainer(cardStackEl); if (scrollEl) { + const viewportEl = scrollEl.parentElement || galleryContainerEl; + if (viewportEl && scrollToTopBtnEl && scrollToTopBtnEl.parentNode !== viewportEl) { + if (window.getComputedStyle(viewportEl).position === "static") { + viewportEl.style.position = "relative"; + } + viewportEl.appendChild(scrollToTopBtnEl); + } + if (scrollToTopBtnEl) { scrollToTopBtnEl.style.display = scrollEl.scrollTop > 200 ? "flex" : "none"; } @@ -636,19 +644,13 @@ export function setupGalleryView() { const cardStack = document.createElement("div"); cardStackEl = cardStack; Object.assign(cardStack.style, { - flex: "1", overflowY: "visible", display: "flex", flexDirection: "column", paddingBottom: "28px" + flex: "1", overflowY: "visible", display: "flex", flexDirection: "column", paddingBottom: "46px" }); container.appendChild(cardStack); scrollToTopBtnEl = document.createElement("button"); scrollToTopBtnEl.className = "pi pi-chevron-up comfy-sidebar-scroll-top-btn"; scrollToTopBtnEl.title = t("Scroll to Top"); - Object.assign(scrollToTopBtnEl.style, { - position: "sticky", - bottom: "14px", - marginLeft: "auto", - zIndex: "30" - }); scrollToTopBtnEl.onclick = (e) => { e.stopPropagation(); const scrollEl = getScrollContainer(cardStackEl); @@ -691,5 +693,8 @@ export function teardownGalleryView() { stickyHeaderGroupEl = null; galleryContainerEl = null; cardStackEl = null; + if (scrollToTopBtnEl && scrollToTopBtnEl.parentNode) { + scrollToTopBtnEl.parentNode.removeChild(scrollToTopBtnEl); + } scrollToTopBtnEl = null; } \ No newline at end of file diff --git a/js/ui/sidebarView.js b/js/ui/sidebarView.js index 1698e31..1172b53 100644 --- a/js/ui/sidebarView.js +++ b/js/ui/sidebarView.js @@ -336,7 +336,7 @@ export function setupSidebarView() { overflowY: "visible", display: "flex", flexDirection: "column", - paddingBottom: "28px" + paddingBottom: "46px" }); container.appendChild(cardStack); @@ -997,4 +997,8 @@ export function teardownSidebarView() { renderAnimationFrameId = null; } cardPool.clear(); + if (scrollToTopBtnEl && scrollToTopBtnEl.parentNode) { + scrollToTopBtnEl.parentNode.removeChild(scrollToTopBtnEl); + } + scrollToTopBtnEl = null; } \ No newline at end of file diff --git a/js/utils/comparison.js b/js/utils/comparison.js index b2c9f8d..ab50b92 100644 --- a/js/utils/comparison.js +++ b/js/utils/comparison.js @@ -328,6 +328,7 @@ function createAudioViewer(baseSrc, onSwitchMedia = () => {}, onDestroy = () => const createMediaElement = (src, muted = false) => { const isVideo = isVideoFormat(src); const el = isVideo ? document.createElement("video") : document.createElement("img"); + el.className = "comfy-sidebar-comparison-media"; if (isVideo) { el.muted = muted; el.playsInline = true; @@ -345,7 +346,10 @@ const createMediaElement = (src, muted = false) => { pointerEvents: isVideo ? "none" : "auto", userSelect: "none", webkitUserSelect: "none", - display: "block" + display: "block", + border: "none", + outline: "none", + boxShadow: "none" }); el.draggable = false; el.ondragstart = (e) => e.preventDefault(); @@ -576,21 +580,30 @@ function createComparisonViewer(baseSrc, onDestroy = () => {}) { } const slider = document.createElement("div"); + slider.className = "comfy-sidebar-comparison-slider"; Object.assign(slider.style, { position: "absolute", top: "0", bottom: "0", left: "50%", - width: "2px", background: "#fff", cursor: "ew-resize", + width: "2px", + background: "var(--foreground, #ffffff)", + cursor: "ew-resize", zIndex: "25", display: "none", pointerEvents: "auto", - boxShadow: "0 0 8px rgba(0,0,0,0.5)" + boxShadow: "0 0 6px rgba(0,0,0,0.6)" }); const sliderButton = document.createElement("div"); + sliderButton.className = "comfy-sidebar-comparison-handle"; Object.assign(sliderButton.style, { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)", width: "32px", height: "32px", - borderRadius: "50%", background: "#fff", color: "#333", + borderRadius: "50%", + background: "var(--card, var(--secondary, rgba(30, 30, 30, 0.9)))", + border: "1px solid var(--border, var(--border-color, rgba(255, 255, 255, 0.15)))", + color: "var(--foreground, #eee)", display: "flex", alignItems: "center", justifyContent: "center", - boxShadow: "0 2px 6px rgba(0,0,0,0.4)", pointerEvents: "auto" + boxShadow: "0 4px 12px rgba(0,0,0,0.5)", pointerEvents: "auto", + cursor: "ew-resize", + transition: "background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, color 0.15s ease-in-out" }); - sliderButton.innerHTML = ``; + sliderButton.innerHTML = ``; slider.appendChild(sliderButton); wrapper.appendChild(slider); diff --git a/js/utils/styles.js b/js/utils/styles.js index f3cc90e..3c5937d 100644 --- a/js/utils/styles.js +++ b/js/utils/styles.js @@ -614,26 +614,58 @@ export function injectStyles() { -webkit-backdrop-filter: blur(10px) !important; } - /* Round (X) Close Button across all preview overlays (matches button, div, or span) */ - body.comfy-sidebar-overlay-active [style*="50%"], - .comfy-sidebar-comparison-overlay [style*="50%"], - .comfy-sidebar-3d-overlay-root [style*="50%"], - div[class*="sidebar-overlay"] [style*="50%"] { - background: var(--card, var(--secondary, rgba(28, 28, 35, 0.9))) !important; - border: 1px solid var(--border, var(--border-color, rgba(255, 255, 255, 0.2))) !important; - color: var(--muted-foreground, #cbd5e1) !important; - box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5) !important; + /* Comparison Media: Ensures no borders or outlines appear on compared images */ + .comfy-sidebar-comparison-media { + border: none !important; + outline: none !important; + box-shadow: none !important; + } + + /* Comparison Slider Line & Handle */ + .comfy-sidebar-comparison-slider { + background: var(--foreground, #ffffff) !important; + box-shadow: 0 0 6px rgba(0, 0, 0, 0.6) !important; + } + + .comfy-sidebar-comparison-handle { + width: 32px !important; + height: 32px !important; + border-radius: 50% !important; + background: var(--card, var(--secondary, rgba(30, 30, 30, 0.9))) !important; + border: 1px solid var(--border, var(--border-color, rgba(255, 255, 255, 0.15))) !important; + color: var(--foreground, #eee) !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5) !important; + cursor: ew-resize !important; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, color 0.15s ease-in-out !important; + } + + .comfy-sidebar-comparison-handle:hover { + background: var(--primary, var(--p-primary-color, #ea580c)) !important; + border-color: var(--primary, var(--p-primary-color, #ea580c)) !important; + color: #ffffff !important; + } + + /* Round (X) Close Button across all preview overlays (matches buttons, ignores images/sliders) */ + body.comfy-sidebar-overlay-active button[style*="50%"], + body.comfy-sidebar-overlay-active [style*="border-radius: 50%"]:not(img):not(video):not(.comfy-sidebar-comparison-handle):not(.comfy-sidebar-comparison-slider):not(.comfy-sidebar-comparison-media), + body.comfy-sidebar-overlay-active [style*="border-radius:50%"]:not(img):not(video):not(.comfy-sidebar-comparison-handle):not(.comfy-sidebar-comparison-slider):not(.comfy-sidebar-comparison-media), + .comfy-sidebar-comparison-overlay button[style*="50%"], + div[class*="sidebar-overlay"] button[style*="50%"] { + background: var(--card, var(--secondary, rgba(30, 30, 30, 0.9))) !important; + border: 1px solid var(--border, var(--border-color, rgba(255, 255, 255, 0.15))) !important; + color: var(--foreground, #eee) !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5) !important; transition: all 0.15s ease-in-out !important; } - body.comfy-sidebar-overlay-active [style*="50%"]:hover, - .comfy-sidebar-comparison-overlay [style*="50%"]:hover, - .comfy-sidebar-3d-overlay-root [style*="50%"]:hover, - div[class*="sidebar-overlay"] [style*="50%"]:hover { + body.comfy-sidebar-overlay-active button[style*="50%"]:hover, + body.comfy-sidebar-overlay-active [style*="border-radius: 50%"]:not(img):not(video):not(.comfy-sidebar-comparison-handle):not(.comfy-sidebar-comparison-slider):not(.comfy-sidebar-comparison-media):hover, + body.comfy-sidebar-overlay-active [style*="border-radius:50%"]:not(img):not(video):not(.comfy-sidebar-comparison-handle):not(.comfy-sidebar-comparison-slider):not(.comfy-sidebar-comparison-media):hover, + .comfy-sidebar-comparison-overlay button[style*="50%"]:hover, + div[class*="sidebar-overlay"] button[style*="50%"]:hover { color: #ffffff !important; border-color: var(--primary, var(--p-primary-color, #ea580c)) !important; - background: color-mix(in srgb, var(--primary, var(--p-primary-color, #ea580c)) 25%, var(--card, var(--secondary, #222)) 75%) !important; - transform: scale(1.08) !important; + background: var(--primary, var(--p-primary-color, #ea580c)) !important; } body.comfy-sidebar-overlay-active [style*="50%"] svg,