Daniel Keir Haywood created ISIS-2568: -----------------------------------------
Summary: Make sidebar resizable Key: ISIS-2568 URL: https://issues.apache.org/jira/browse/ISIS-2568 Project: Isis Issue Type: Improvement Components: Isis Viewer Wicket Reporter: Daniel Keir Haywood possible implementation: [https://codepen.io/Zodiase/pen/qmjyKL] HTML: {code:java} <div class="container"> <aside> Aside <hr /> </aside> <div class="resize-handle--x" data-target="aside"></div> <main> Main <hr /> </main> </div> {code} CSS: {code:java} html { height: 100%; } body { box-sizing: border-box; height: 100%; margin: 0; padding: 30px; background-color: black; }.container { height: 100%; overflow: hidden; background-color: white; }// Flexbox setup. .container { display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; -webkit-flex-wrap: nowrap; -ms-flex-wrap: nowrap; flex-wrap: nowrap; -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; -webkit-align-content: stretch; -ms-flex-line-pack: stretch; align-content: stretch; -webkit-align-items: stretch; -ms-flex-align: stretch; align-items: stretch; & > aside { -webkit-order: 0; -ms-flex-order: 0; order: 0; -webkit-flex: 0 0 auto; -ms-flex: 0 0 auto; flex: 0 0 auto; -webkit-align-self: auto; -ms-flex-item-align: auto; align-self: auto; } & > main { -webkit-order: 0; -ms-flex-order: 0; order: 0; -webkit-flex: 1 1 auto; -ms-flex: 1 1 auto; flex: 1 1 auto; -webkit-align-self: auto; -ms-flex-item-align: auto; align-self: auto; } }.container > aside, .container > main { padding: 10px; overflow: auto; }.resize-handle--x { -webkit-flex: 0 0 auto; -ms-flex: 0 0 auto; flex: 0 0 auto; position: relative; box-sizing: border-box; width: 3px; height: 100%; border-left-width: 1px; border-left-style: solid; border-left-color: black; border-right-width: 1px; border-right-style: solid; border-right-color: black; cursor: ew-resize; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; @handleSize: 18px; @handleThickness: 1px; @handleDistance: 2px; &:before { content: ""; position: absolute; z-index: 1; top: 50%; right: 100%; height: @handleSize; width: @handleDistance; margin-top: -@handleSize/2; border-left-color: black; border-left-width: @handleThickness; border-left-style: solid; } &:after { content: ""; position: absolute; z-index: 1; top: 50%; left: 100%; height: @handleSize; width: @handleDistance; margin-top: -@handleSize/2; border-right-color: black; border-right-width: @handleThickness; border-right-style: solid; } } {code} JS: {code:java} const selectTarget = (fromElement, selector) => { if (!(fromElement instanceof HTMLElement)) { return null; } return fromElement.querySelector(selector); };const resizeData = { tracking: false, startWidth: null, startCursorScreenX: null, handleWidth: 10, resizeTarget: null, parentElement: null, maxWidth: null, };$(document.body).on('mousedown', '.resize-handle--x', null, (event) => { if (event.button !== 0) { return; } event.preventDefault(); event.stopPropagation(); const handleElement = event.currentTarget; if (!handleElement.parentElement) { console.error(new Error("Parent element not found.")); return; } // Use the target selector on the handle to get the resize target. const targetSelector = handleElement.getAttribute('data-target'); const targetElement = selectTarget(handleElement.parentElement, targetSelector); if (!targetElement) { console.error(new Error("Resize target element not found.")); return; } resizeData.startWidth = $(targetElement).outerWidth(); resizeData.startCursorScreenX = event.screenX; resizeData.resizeTarget = targetElement; resizeData.parentElement = handleElement.parentElement; resizeData.maxWidth = $(handleElement.parentElement).innerWidth() - resizeData.handleWidth; resizeData.tracking = true; console.log('tracking started'); });$(window).on('mousemove', null, null, _.debounce((event) => { if (resizeData.tracking) { const cursorScreenXDelta = event.screenX - resizeData.startCursorScreenX; const newWidth = Math.min(resizeData.startWidth + cursorScreenXDelta, resizeData.maxWidth); $(resizeData.resizeTarget).outerWidth(newWidth); } }, 1));$(window).on('mouseup', null, null, (event) => { if (resizeData.tracking) { resizeData.tracking = false; console.log('tracking stopped'); } });{code} -- This message was sent by Atlassian Jira (v8.3.4#803005)