client/views: apply correct margins, fix android sizing

Images in fit mode 'width' and 'both' would extend to the very edge
of the screen on desktop. The right side margin was previously only
addressed on mobile from god knows where... (the lack of a scrollbar?)
Instead of trying to guess the post content width, we can set
overflow-x: hidden on the container which lets us get the real value.
Viewport height on Android was wrong when the address bar was shown,
causing unnecessary and jumpy image resizing. Use iOS hack.
All this sizing bs should really be done by toggling classes and using
regular css min/max width. For "Upscale small posts" option as well.
This commit is contained in:
Eva 2023-05-17 04:17:44 +02:00
parent 782f069031
commit 81416b6024
5 changed files with 32 additions and 24 deletions

View file

@ -5,11 +5,12 @@ const views = require("../util/views.js");
const optimizedResize = require("../util/optimized_resize.js"); const optimizedResize = require("../util/optimized_resize.js");
class PostContentControl { class PostContentControl {
constructor(hostNode, post, viewportSizeCalculator, fitFunctionOverride) { constructor(hostNode, post, viewportSizeCalculator, overflowNode, fitFunctionOverride) {
this._post = post; this._post = post;
this._viewportSizeCalculator = viewportSizeCalculator; this._viewportSizeCalculator = viewportSizeCalculator;
this._hostNode = hostNode; this._hostNode = hostNode;
this._template = views.getTemplate("post-content"); this._template = views.getTemplate("post-content");
this._overflowNode = overflowNode;
let fitMode = settings.get().fitMode; let fitMode = settings.get().fitMode;
if (typeof fitFunctionOverride !== "undefined") { if (typeof fitFunctionOverride !== "undefined") {
@ -36,6 +37,7 @@ class PostContentControl {
} }
fitWidth() { fitWidth() {
if (this._overflowNode) this._overflowNode.style.overflowX = "hidden";
this._currentFitFunction = this.fitWidth; this._currentFitFunction = this.fitWidth;
const mul = this._post.canvasHeight / this._post.canvasWidth; const mul = this._post.canvasHeight / this._post.canvasWidth;
let width = this._viewportWidth; let width = this._viewportWidth;
@ -46,6 +48,7 @@ class PostContentControl {
} }
fitHeight() { fitHeight() {
if (this._overflowNode) this._overflowNode.style.overflowX = "visible";
this._currentFitFunction = this.fitHeight; this._currentFitFunction = this.fitHeight;
const mul = this._post.canvasWidth / this._post.canvasHeight; const mul = this._post.canvasWidth / this._post.canvasHeight;
let height = this._viewportHeight; let height = this._viewportHeight;
@ -56,16 +59,17 @@ class PostContentControl {
} }
fitBoth() { fitBoth() {
if (this._overflowNode) this._overflowNode.style.overflowX = "hidden";
this._currentFitFunction = this.fitBoth; this._currentFitFunction = this.fitBoth;
let mul = this._post.canvasHeight / this._post.canvasWidth; let mul = this._post.canvasHeight / this._post.canvasWidth;
if (this._viewportWidth * mul < this._viewportHeight) { let width = this._viewportWidth;
let width = this._viewportWidth; let height = this._viewportHeight;
if (width * mul < height) {
if (!settings.get().upscaleSmallPosts) { if (!settings.get().upscaleSmallPosts) {
width = Math.min(this._post.canvasWidth, width); width = Math.min(this._post.canvasWidth, width);
} }
this._resize(width, width * mul); this._resize(width, width * mul);
} else { } else {
let height = this._viewportHeight;
if (!settings.get().upscaleSmallPosts) { if (!settings.get().upscaleSmallPosts) {
height = Math.min(this._post.canvasHeight, height); height = Math.min(this._post.canvasHeight, height);
} }
@ -74,6 +78,7 @@ class PostContentControl {
} }
fitOriginal() { fitOriginal() {
if (this._overflowNode) this._overflowNode.style.overflowX = "visible";
this._currentFitFunction = this.fitOriginal; this._currentFitFunction = this.fitOriginal;
this._resize(this._post.canvasWidth, this._post.canvasHeight); this._resize(this._post.canvasWidth, this._post.canvasHeight);
} }

View file

@ -65,6 +65,7 @@ class HomeView {
() => { () => {
return [window.innerWidth * 0.8, window.innerHeight * 0.7]; return [window.innerWidth * 0.8, window.innerHeight * 0.7];
}, },
null,
"fit-both" "fit-both"
); );

View file

@ -1,6 +1,6 @@
"use strict"; "use strict";
const iosCorrectedInnerHeight = require("ios-inner-height"); const iosCorrectedInnerHeight = require("@formfunfunction/inner-height");
const router = require("../router.js"); const router = require("../router.js");
const views = require("../util/views.js"); const views = require("../util/views.js");
const uri = require("../util/uri.js"); const uri = require("../util/uri.js");
@ -28,6 +28,9 @@ class PostMainView {
const topNavigationNode = const topNavigationNode =
document.body.querySelector("#top-navigation"); document.body.querySelector("#top-navigation");
const contentNode =
document.querySelector(".post-view > .content");
this._postContentControl = new PostContentControl( this._postContentControl = new PostContentControl(
postContainerNode, postContainerNode,
ctx.post, ctx.post,
@ -35,14 +38,13 @@ class PostMainView {
const margin = sidebarNode.getBoundingClientRect().left; const margin = sidebarNode.getBoundingClientRect().left;
return [ return [
window.innerWidth - postContainerNode.getBoundingClientRect().width,
postContainerNode.getBoundingClientRect().left -
margin,
iosCorrectedInnerHeight() - iosCorrectedInnerHeight() -
topNavigationNode.getBoundingClientRect().height - topNavigationNode.getBoundingClientRect().height -
margin * 2, margin * 2,
]; ];
} },
contentNode
); );
this._postNotesOverlayControl = new PostNotesOverlayControl( this._postNotesOverlayControl = new PostNotesOverlayControl(

View file

@ -6,9 +6,9 @@
"": { "": {
"name": "szurubooru", "name": "szurubooru",
"dependencies": { "dependencies": {
"@formfunfunction/inner-height": "^2.0.0",
"dompurify": "^2.0.17", "dompurify": "^2.0.17",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"ios-inner-height": "^1.0.3",
"js-cookie": "^2.2.0", "js-cookie": "^2.2.0",
"marked": "^4.0.10", "marked": "^4.0.10",
"mousetrap": "^1.6.2", "mousetrap": "^1.6.2",
@ -49,6 +49,14 @@
"integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
"dev": true "dev": true
}, },
"node_modules/@formfunfunction/inner-height": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@formfunfunction/inner-height/-/inner-height-2.0.0.tgz",
"integrity": "sha512-lxBRi80sPSuoCkSyutR47wRhdbxyUL5wuwweqCGje1XKiUbY1K+QFhNjq2VJsMl1Q1wnwpLcqfpZGXTZmm3vWA==",
"engines": {
"node": ">=0.10.3"
}
},
"node_modules/@jimp/bmp": { "node_modules/@jimp/bmp": {
"version": "0.13.0", "version": "0.13.0",
"resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.13.0.tgz", "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.13.0.tgz",
@ -2564,14 +2572,6 @@
"loose-envify": "^1.0.0" "loose-envify": "^1.0.0"
} }
}, },
"node_modules/ios-inner-height": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ios-inner-height/-/ios-inner-height-1.0.3.tgz",
"integrity": "sha512-GayJWoFxYHDx/gkfz4nIxNdsqB3nAJQHKV5pDBvig6he8+NxBSYxN+D7oarbqZfW2p6uera3q9NDr4Jgdafiog==",
"engines": {
"node": ">=0.10.3"
}
},
"node_modules/is-arguments": { "node_modules/is-arguments": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
@ -4619,6 +4619,11 @@
} }
} }
}, },
"@formfunfunction/inner-height": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@formfunfunction/inner-height/-/inner-height-2.0.0.tgz",
"integrity": "sha512-lxBRi80sPSuoCkSyutR47wRhdbxyUL5wuwweqCGje1XKiUbY1K+QFhNjq2VJsMl1Q1wnwpLcqfpZGXTZmm3vWA=="
},
"@jimp/bmp": { "@jimp/bmp": {
"version": "0.13.0", "version": "0.13.0",
"resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.13.0.tgz", "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.13.0.tgz",
@ -6934,11 +6939,6 @@
"loose-envify": "^1.0.0" "loose-envify": "^1.0.0"
} }
}, },
"ios-inner-height": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ios-inner-height/-/ios-inner-height-1.0.3.tgz",
"integrity": "sha512-GayJWoFxYHDx/gkfz4nIxNdsqB3nAJQHKV5pDBvig6he8+NxBSYxN+D7oarbqZfW2p6uera3q9NDr4Jgdafiog=="
},
"is-arguments": { "is-arguments": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",

View file

@ -7,9 +7,9 @@
"build-container": "docker build -t szurubooru/client:dev ." "build-container": "docker build -t szurubooru/client:dev ."
}, },
"dependencies": { "dependencies": {
"@formfunfunction/inner-height": "^2.0.0",
"dompurify": "^2.0.17", "dompurify": "^2.0.17",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"ios-inner-height": "^1.0.3",
"js-cookie": "^2.2.0", "js-cookie": "^2.2.0",
"marked": "^4.0.10", "marked": "^4.0.10",
"mousetrap": "^1.6.2", "mousetrap": "^1.6.2",