5 Commits

Author SHA1 Message Date
Eva
beea218c96 Merge e2bdb5feab into 376f687c38 2025-02-11 21:52:22 +01:00
376f687c38 chore: questionable is not a recognized rating 2025-02-11 21:50:27 +01:00
4fd848abf2 doc: use docker compose instead of docker-compose
The minimum version requirements are rough guesses, in practice any decently modern docker installation should work.
2025-02-11 21:25:10 +01:00
Eva
e2bdb5feab client/posts: respect right side margin in original and height fit modes
Still not perfect for comment section and edit mode, but we should
really replace image resizing logic with css.
2024-03-21 22:23:13 +01:00
Eva
81416b6024 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.
2024-03-21 20:36:58 +01:00
10 changed files with 59 additions and 38 deletions

View File

@ -39,12 +39,26 @@
>.content >.content
width: 100% width: 100%
&[data-fit=fit-original] .after-mobile-controls, &[data-fit=fit-height] .after-mobile-controls
width: auto
margin-right: 1.5em
@media (max-width: 1000px)
margin-right: 1em
.post-container .post-container
margin-bottom: 0.6em margin-bottom: 0.6em
.post-content .post-content
margin: 0 margin: 0
background-size: cover
background-repeat: no-repeat
background-origin: content-box
padding-right: 1.5em
@media (max-width: 1000px)
padding-right: 1em
.after-mobile-controls
width: 100%
.after-mobile-controls .after-mobile-controls
width: 100% width: 100%

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

@ -175,6 +175,7 @@ class PostReadonlySidebarControl extends events.EventTarget {
oldNode.classList.remove("active"); oldNode.classList.remove("active");
} }
newNode.classList.add("active"); newNode.classList.add("active");
document.querySelector(".content").dataset.fit = className;
} }
_evtAddToFavoritesClick(e) { _evtAddToFavoritesClick(e) {

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",

View File

@ -789,7 +789,7 @@ data.
| `fav-time` | alias of `fav-date` | | `fav-time` | alias of `fav-date` |
| `feature-date` | featured at given date | | `feature-date` | featured at given date |
| `feature-time` | alias of `feature-time` | | `feature-time` | alias of `feature-time` |
| `safety` | having given safety. `<value>` can be either `safe`, `sketchy` (or `questionable`) or `unsafe`. | | `safety` | having given safety. `<value>` can be either `safe`, `sketchy` or `unsafe`. |
| `rating` | alias of `safety` | | `rating` | alias of `safety` |
**Sort style tokens** **Sort style tokens**

View File

@ -1,5 +1,5 @@
This assumes that you have Docker (version 17.05 or greater) This assumes that you have Docker (version 19.03 or greater)
and Docker Compose (version 1.6.0 or greater) already installed. and the Docker Compose CLI (version 1.27.0 or greater) already installed.
### Prepare things ### Prepare things
@ -38,7 +38,7 @@ and Docker Compose (version 1.6.0 or greater) already installed.
This pulls the latest containers from docker.io: This pulls the latest containers from docker.io:
```console ```console
user@host:szuru$ docker-compose pull user@host:szuru$ docker compose pull
``` ```
If you have modified the application's source and would like to manually If you have modified the application's source and would like to manually
@ -49,17 +49,17 @@ and Docker Compose (version 1.6.0 or greater) already installed.
For first run, it is recommended to start the database separately: For first run, it is recommended to start the database separately:
```console ```console
user@host:szuru$ docker-compose up -d sql user@host:szuru$ docker compose up -d sql
``` ```
To start all containers: To start all containers:
```console ```console
user@host:szuru$ docker-compose up -d user@host:szuru$ docker compose up -d
``` ```
To view/monitor the application logs: To view/monitor the application logs:
```console ```console
user@host:szuru$ docker-compose logs -f user@host:szuru$ docker compose logs -f
# (CTRL+C to exit) # (CTRL+C to exit)
``` ```
@ -84,13 +84,13 @@ and Docker Compose (version 1.6.0 or greater) already installed.
2. Build the containers: 2. Build the containers:
```console ```console
user@host:szuru$ docker-compose build user@host:szuru$ docker compose build
``` ```
That will attempt to build both containers, but you can specify `client` That will attempt to build both containers, but you can specify `client`
or `server` to make it build only one. or `server` to make it build only one.
If `docker-compose build` spits out: If `docker compose build` spits out:
``` ```
ERROR: Service 'server' failed to build: failed to parse platform : "" is an invalid component of "": platform specifier component must match "^[A-Za-z0-9_-]+$": invalid argument ERROR: Service 'server' failed to build: failed to parse platform : "" is an invalid component of "": platform specifier component must match "^[A-Za-z0-9_-]+$": invalid argument
@ -102,7 +102,7 @@ and Docker Compose (version 1.6.0 or greater) already installed.
user@host:szuru$ export DOCKER_BUILDKIT=1; export COMPOSE_DOCKER_CLI_BUILD=1 user@host:szuru$ export DOCKER_BUILDKIT=1; export COMPOSE_DOCKER_CLI_BUILD=1
``` ```
...and run `docker-compose build` again. ...and run `docker compose build` again.
*Note: If your changes are not taking effect in your builds, consider building *Note: If your changes are not taking effect in your builds, consider building
with `--no-cache`.* with `--no-cache`.*
@ -117,7 +117,7 @@ with `--no-cache`.*
run from docker: run from docker:
```console ```console
user@host:szuru$ docker-compose run server ./szuru-admin --help user@host:szuru$ docker compose run server ./szuru-admin --help
``` ```
will give you a breakdown on all available commands. will give you a breakdown on all available commands.

View File

@ -1,9 +1,7 @@
## Example Docker Compose configuration ## Example Docker Compose configuration
## ##
## Use this as a template to set up docker-compose, or as guide to set up other ## Use this as a template to set up docker compose, or as guide to set up other
## orchestration services ## orchestration services
version: '2'
services: services:
server: server: