From 450be1ad3eac2077750bb8a29aa8610eab917b52 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 7 Oct 2022 17:50:55 +0200 Subject: [PATCH] Simplify the `dropdownToolbarButton`-select width computation The way that we set the width of the `dropdownToolbarButton`-select is very old, and despite some improvements over the years this is still somewhat hacky. In particular, note how we're assigning the select-element a larger width than its containing `dropdownToolbarButton`-element. This was done to prevent displaying *two* separate icons, i.e. the native and the PDF.js one, since it's the only way to handle this in older browsers (particularly Internet Explorer). Given the currently supported browsers, there's however a better solution available: use `appearance: none;` to disable native styling of the select-element. [According to MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/appearance#browser_compatibility), this is supported in all reasonably modern browsers. This way we're able to simplify both the CSS rules and the JS-code that's used to adjust the `dropdownToolbarButton` width in a localization aware way. --- web/toolbar.js | 21 +++++++++------------ web/viewer.css | 15 ++++++--------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/web/toolbar.js b/web/toolbar.js index c03eaea8e..5aa1313b1 100644 --- a/web/toolbar.js +++ b/web/toolbar.js @@ -320,15 +320,10 @@ class Toolbar { ]); await animationStarted; - const style = getComputedStyle(items.scaleSelect), - scaleSelectContainerWidth = parseInt( - style.getPropertyValue("--scale-select-container-width"), - 10 - ), - scaleSelectOverflow = parseInt( - style.getPropertyValue("--scale-select-overflow"), - 10 - ); + const style = getComputedStyle(items.scaleSelect); + const scaleSelectWidth = parseFloat( + style.getPropertyValue("--scale-select-width") + ); // The temporary canvas is used to measure text length in the DOM. const canvas = document.createElement("canvas"); @@ -342,10 +337,12 @@ class Toolbar { maxWidth = width; } } - maxWidth += 2 * scaleSelectOverflow; + // Account for the icon width, and ensure that there's always some spacing + // between the text and the icon. + maxWidth += 0.3 * scaleSelectWidth; - if (maxWidth > scaleSelectContainerWidth) { - docStyle.setProperty("--scale-select-container-width", `${maxWidth}px`); + if (maxWidth > scaleSelectWidth) { + docStyle.setProperty("--scale-select-width", `${maxWidth}px`); } // Zeroing the width and height cause Firefox to release graphics resources // immediately, which can greatly reduce memory consumption. diff --git a/web/viewer.css b/web/viewer.css index 27cf0296b..4c661f9c6 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -20,8 +20,7 @@ --sidebar-width: 200px; --sidebar-transition-duration: 200ms; --sidebar-transition-timing-function: ease; - --scale-select-container-width: 140px; - --scale-select-overflow: 22px; + --scale-select-width: 140px; --toolbar-icon-opacity: 0.7; --doorhanger-icon-opacity: 0.9; @@ -791,29 +790,27 @@ body { } .dropdownToolbarButton { - width: var(--scale-select-container-width); + width: var(--scale-select-width); padding: 0; - overflow: hidden; background-color: var(--dropdown-btn-bg-color); border: var(--dropdown-btn-border); } .dropdownToolbarButton::after { top: 6px; - inset-inline-end: 7px; + inset-inline-end: 6px; pointer-events: none; mask-image: var(--toolbarButton-menuArrow-icon); } .dropdownToolbarButton > select { - width: calc( - var(--scale-select-container-width) + var(--scale-select-overflow) - ); + appearance: none; + width: inherit; height: 28px; font-size: 12px; color: var(--main-color); margin: 0; padding: 1px 0 2px; - padding-inline-start: 4px; + padding-inline-start: 6px; border: none; background-color: var(--dropdown-btn-bg-color); }