diff --git a/src/main/resources/static/css/dark-mode.css b/src/main/resources/static/css/dark-mode.css index 9223c798..73f06824 100644 --- a/src/main/resources/static/css/dark-mode.css +++ b/src/main/resources/static/css/dark-mode.css @@ -26,4 +26,9 @@ body { } - +#pages-container { + --background-color: rgba(255, 255, 255, 0.046) !important; + --scroll-bar-color: #4c4c4c !important; + --scroll-bar-thumb: #d3d3d3 !important; + --scroll-bar-thumb-hover: #ffffff !important; +} \ No newline at end of file diff --git a/src/main/resources/static/css/general.css b/src/main/resources/static/css/general.css index f6e4809e..3190465e 100644 --- a/src/main/resources/static/css/general.css +++ b/src/main/resources/static/css/general.css @@ -31,6 +31,13 @@ html[lang-direction=rtl] * { right: 0; top: 50%; } + +.align-center-left { + position: absolute; + left: 0; + top: 50%; +} + .align-bottom { position: absolute; bottom: 0; diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html index 63ede894..15879c54 100644 --- a/src/main/resources/templates/multi-tool.html +++ b/src/main/resources/templates/multi-tool.html @@ -11,9 +11,9 @@

+

+
-

-
- -
-
+
@@ -59,21 +57,36 @@ var fileName = null; const pagesContainer = document.getElementById("pages-container"); - // add the bottom "insert pdf" button that appears on the right when hovered over - const bottomInsertFileButtonContainer = document.createElement('div'); - bottomInsertFileButtonContainer.classList.add("insert-file-button-container", "align-bottom"); - bottomInsertFileButtonContainer.style.transform = "translate(0, 50%)"; - - const bottomInsertFileButton = document.createElement('button'); - bottomInsertFileButton.classList.add("btn", "btn-primary", "insert-file-button"); - bottomInsertFileButton.innerHTML = ` - - - `; - bottomInsertFileButton.onclick = e => addPdfs(); - bottomInsertFileButtonContainer.appendChild(bottomInsertFileButton); + var scrollDelta = 0; // variable to store the accumulated scroll delta + var isScrolling = false; // variable to track if scroll is already in progress - pagesContainer.appendChild(bottomInsertFileButtonContainer); + pagesContainer.addEventListener("wheel", function(e) { + e.preventDefault(); // prevent default mousewheel behavior + + // Accumulate the horizontal scroll delta + scrollDelta -= e.deltaX || e.wheelDeltaX || -e.deltaY || -e.wheelDeltaY; + + // If scroll is not already in progress, start the scroll loop + if (!isScrolling) { + isScrolling = true; + requestAnimationFrame(scrollLoop); + } + }); + + function scrollLoop() { + // Scroll the div horizontally by a fraction of the accumulated scroll delta + pagesContainer.scrollLeft += scrollDelta * 0.1; + + // Reduce the accumulated scroll delta by a fraction + scrollDelta *= 0.9; + + // If scroll delta is still significant, continue the scroll loop + if (Math.abs(scrollDelta) > 0.1) { + requestAnimationFrame(scrollLoop); + } else { + isScrolling = false; // Reset scroll in progress flag + } + } function addPdfs(nextSiblingElement) { var input = document.createElement('input'); @@ -187,14 +200,14 @@ buttonContainer.classList.add("button-container"); const moveUp = document.createElement('button'); - moveUp.classList.add("move-up-button","btn", "btn-secondary"); - moveUp.innerHTML = ''; + moveUp.classList.add("move-left-button","btn", "btn-secondary"); + moveUp.innerHTML = ''; moveUp.onclick = moveUpButtonCallback; buttonContainer.appendChild(moveUp); const moveDown = document.createElement('button'); - moveDown.classList.add("move-down-button","btn", "btn-secondary"); - moveDown.innerHTML = ''; + moveDown.classList.add("move-right-button","btn", "btn-secondary"); + moveDown.innerHTML = ''; moveDown.onclick = moveDownButtonCallback; buttonContainer.appendChild(moveDown); @@ -228,7 +241,7 @@ div.appendChild(buttonContainer); const insertFileButtonContainer = document.createElement('div'); - insertFileButtonContainer.classList.add("insert-file-button-container", "align-top"); + insertFileButtonContainer.classList.add("insert-file-button-container","left", "align-center-left"); const insertFileButton = document.createElement('button'); insertFileButton.classList.add("btn", "btn-primary", "insert-file-button"); @@ -238,8 +251,23 @@ `; insertFileButton.onclick = insertFileButtonCallback; insertFileButtonContainer.appendChild(insertFileButton); - + div.appendChild(insertFileButtonContainer); + + // add this button to every element, but only show it on the last one :D + const insertFileButtonRightContainer = document.createElement('div'); + insertFileButtonRightContainer.classList.add("insert-file-button-container","right", "align-center-right"); + + const insertFileButtonRight = document.createElement('button'); + insertFileButtonRight.classList.add("btn", "btn-primary", "insert-file-button"); + insertFileButtonRight.innerHTML = ` + + + insertFileButtonRight`; + insertFileButtonRight.onclick = () => addPdfs(); + insertFileButtonRightContainer.appendChild(insertFileButtonRight); + + div.appendChild(insertFileButtonRightContainer); if (nextSiblingElement) { pagesContainer.insertBefore(div, nextSiblingElement); @@ -358,11 +386,9 @@ border: 1px solid rgba(0, 0, 0, .25); backdrop-filter: blur(2px); - position: sticky; top: 10px; z-index: 10; padding: 10px; - margin-top: 30px; border-radius: 8px; } #global-buttons-container > * { @@ -377,20 +403,55 @@ } #pages-container { + --background-color: rgba(0, 0, 0, 0.046); + --scroll-bar-color: #f1f1f1; + --scroll-bar-thumb: #888; + --scroll-bar-thumb-hover: #555; width: 100%; display: flex; + padding: 10px 25px; gap: 0px; - flex-direction: column; align-items: center; margin: 30px 0; + overflow-y: hidden; + overflow-x: auto; + min-height: 275px; + background-color: var(--background-color); + border-radius: 10px; + } + + /* width */ + #pages-container::-webkit-scrollbar { + width: 10px; + height: 10px; + } + + /* Track */ + #pages-container::-webkit-scrollbar-track { + background: var(--scroll-bar-color); + } + + /* Handle */ + #pages-container::-webkit-scrollbar-thumb { + border-radius: 10px; + background: var(--scroll-bar-thumb); + } + + /* Handle on hover */ + #pages-container::-webkit-scrollbar-thumb:hover { + background: var(--scroll-bar-thumb-hover); } .page-container { - width: 500px; + height:250px; + display: flex; + align-items: center; + flex-direction: column-reverse; aspect-ratio: 1; text-align: center; position: relative; user-select: none; + } .page-container img { @@ -406,10 +467,8 @@ } .page-container .button-container { - position: absolute; - top: 50%; - translate: 0 -50%; - right: 6px; + z-index: 2; + display:flex; } .page-container .button-container > * { padding: 0.25rem 0.5rem; @@ -420,23 +479,50 @@ width: 16px; height: 16px; } - .page-container:nth-child(2) .move-up-button { - visibility: hidden; + .page-container:nth-child(1) .move-left-button { + display: none; } - .page-container:last-child .move-down-button { - visibility: hidden; + .page-container:last-child .move-right-button { + display: none; } /* "insert pdf" buttons that appear on the right when hover */ .insert-file-button-container { translate: 0 -50%; - width: 100%; - height: 60px; - + width: 80px; + height: 100%; + z-index: 1; opacity: 0; transition: opacity 0.2s; } + + .insert-file-button-container.left { + left: -20px; + } + + .insert-file-button-container.right { + right: -20px; + } + + .insert-file-button-container.align-center-right { + display:none; + } + + .insert-file-button-container.left .insert-file-button { + left: 0; + translate: 0 -50%; + } + + .insert-file-button-container.right .insert-file-button { + right: 0; + translate: 0 -50%; + } + + .page-container:last-child > .insert-file-button-container.right { + display: block; + } + .insert-file-button-container:hover { opacity: 1; transition: opacity 0.05s;