1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-07-21 09:22:09 +03:00

Layout: Improved sidebar sizing, and dropdown consideration

- Updated tri-layout sidebars to have less padding and to avoid cutting
  off content when in single-sidebar mode.
- Updated dropdown handling to consider the parent scroll container when
  deciding to drop upwards, to help prevent cut-off.
This commit is contained in:
Dan Brown
2025-06-30 13:19:45 +01:00
parent dfeca246a0
commit 6045aff33a
3 changed files with 25 additions and 3 deletions

View File

@ -1,4 +1,4 @@
import {onSelect} from '../services/dom.ts'; import {findClosestScrollContainer, onSelect} from '../services/dom.ts';
import {KeyboardNavigationHandler} from '../services/keyboard-navigation.ts'; import {KeyboardNavigationHandler} from '../services/keyboard-navigation.ts';
import {Component} from './component'; import {Component} from './component';
@ -33,7 +33,8 @@ export class Dropdown extends Component {
const menuOriginalRect = this.menu.getBoundingClientRect(); const menuOriginalRect = this.menu.getBoundingClientRect();
let heightOffset = 0; let heightOffset = 0;
const toggleHeight = this.toggle.getBoundingClientRect().height; const toggleHeight = this.toggle.getBoundingClientRect().height;
const dropUpwards = menuOriginalRect.bottom > window.innerHeight; const containerBounds = findClosestScrollContainer(this.menu).getBoundingClientRect();
const dropUpwards = menuOriginalRect.bottom > containerBounds.bottom;
const containerRect = this.container.getBoundingClientRect(); const containerRect = this.container.getBoundingClientRect();
// If enabled, Move to body to prevent being trapped within scrollable sections // If enabled, Move to body to prevent being trapped within scrollable sections

View File

@ -256,4 +256,22 @@ export function findTargetNodeAndOffset(parentNode: HTMLElement, offset: number)
export function hashElement(element: HTMLElement): string { export function hashElement(element: HTMLElement): string {
const normalisedElemText = (element.textContent || '').replace(/\s{2,}/g, ''); const normalisedElemText = (element.textContent || '').replace(/\s{2,}/g, '');
return cyrb53(normalisedElemText); return cyrb53(normalisedElemText);
}
/**
* Find the closest scroll container parent for the given element
* otherwise will default to the body element.
*/
export function findClosestScrollContainer(start: HTMLElement): HTMLElement {
let el: HTMLElement|null = start;
do {
const computed = window.getComputedStyle(el);
if (computed.overflowY === 'scroll') {
return el;
}
el = el.parentElement;
} while (el);
return document.body;
} }

View File

@ -431,7 +431,8 @@ body.flexbox {
grid-template-areas: "a b b"; grid-template-areas: "a b b";
grid-template-columns: 1fr 3fr; grid-template-columns: 1fr 3fr;
grid-template-rows: min-content min-content 1fr; grid-template-rows: min-content min-content 1fr;
padding-inline-end: vars.$l; margin-inline-start: (vars.$m + vars.$xxs);
margin-inline-end: (vars.$m + vars.$xxs);
} }
.tri-layout-sides { .tri-layout-sides {
grid-column-start: a; grid-column-start: a;
@ -452,6 +453,8 @@ body.flexbox {
height: 100%; height: 100%;
scrollbar-width: none; scrollbar-width: none;
-ms-overflow-style: none; -ms-overflow-style: none;
padding-inline: vars.$m;
margin-inline: -(vars.$m);
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }