resizable header in editor

This commit is contained in:
tophf 2021-12-27 19:55:42 +03:00
parent 906508832b
commit 78e0a87b96
7 changed files with 87 additions and 8 deletions

View File

@ -466,6 +466,7 @@
</div>
</details>
</div>
<div id="header-resizer"></div>
<div id="footer" class="hidden">
<a href="https://github.com/openstyles/stylus/wiki/Usercss"
i18n-text="externalUsercssDocument"

View File

@ -41,6 +41,12 @@ const editor = {
document.documentElement.classList.toggle('is-new-style', !editor.style.id);
},
updateHeaderWidth(w) {
w = Math.round(Math.max(200, Math.min(innerWidth / 2, w)));
document.documentElement.style.setProperty('--header-width', w + 'px');
return w;
},
updateTitle(isDirty = editor.dirty.isDirty()) {
const {customName, name} = editor.style;
document.title = `${
@ -65,6 +71,7 @@ const baseInit = (() => {
Promise.all([
loadTheme(),
loadKeymaps(),
editor.updateHeaderWidth(prefs.get('editor.headerWidth')),
])),
]),
};

View File

@ -1,5 +1,6 @@
:root {
--fixed-padding: unset;
--header-width: 280px;
}
body {
@ -7,6 +8,18 @@ body {
height: 100vh;
font: 12px arial,sans-serif;
}
body.resizing-h {
cursor: e-resize;
}
body.resizing-v {
cursor: n-resize;
}
body.resizing-h > *,
body.resizing-v > * {
pointer-events: none;
-moz-user-select: none;
user-select: none;
}
a {
color: #000;
@ -90,13 +103,12 @@ label {
/************ header ************/
#header {
width: 280px;
width: var(--header-width);
height: 100vh;
overflow: auto;
position: fixed;
top: 0;
padding: 1rem;
border-right: 1px dashed #AAA;
box-shadow: 0 0 3rem -1.2rem black;
box-sizing: border-box;
z-index: 10;
@ -107,7 +119,7 @@ label {
margin-top: 0;
}
#sections {
padding-left: 280px;
padding-left: var(--header-width);
min-height: 0;
height: 100%;
}
@ -123,6 +135,30 @@ label {
margin-top: 0.1rem;
min-height: 1.4rem;
}
#header-resizer {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 6px;
cursor: e-resize;
border-width: 0 1px;
border-style: solid;
color: #8888;
border-color: currentColor;
pointer-events: auto;
}
#header-resizer:active {
border-color: #888;
}
#header-resizer::after {
content: '';
position: absolute;
border-right: 2px dotted currentColor;
left: 2px;
width: 0;
height: 100%;
}
/* basic info */
#basic-info {
@ -745,7 +781,7 @@ body:not(.find-open) [data-match-highlight-count="1"] .CodeMirror-selection-high
}
#help-popup.big {
box-shadow: rgba(0, 0, 0, 0.45) 0px 0px 0px 100000px !important;
left: calc(280px - 3rem);
left: calc(var(--header-width) - 3rem);
}
#help-popup.big .CodeMirror {
min-height: 2rem;
@ -1054,6 +1090,7 @@ body.linter-disabled .hidden-unless-compact {
padding: 0;
background-color: #fff;
}
#header-resizer,
.fixed-header #header > *:not(#details-wrapper),
.fixed-header #options {
display: none !important;

View File

@ -55,6 +55,7 @@ baseInit.ready.then(async () => {
require([
'/edit/autocomplete',
'/edit/global-search',
'/edit/header-resizer',
]);
});

34
edit/header-resizer.js Normal file
View File

@ -0,0 +1,34 @@
/* global $ $$ */// dom.js
/* global editor */
/* global prefs */
'use strict';
(function HeaderResizer() {
const el = $('#header-resizer');
let lastW, lastX;
el.onmousedown = e => {
if (e.button) return;
lastW = $('#header').clientWidth;
lastX = e.clientX;
document.body.classList.add('resizing-h');
document.on('mousemove', resize);
document.on('mouseup', resizeStop);
};
function resize({clientX: x}) {
const w = editor.updateHeaderWidth(lastW + x - lastX);
const delta = w - lastW;
if (delta) {
lastW = w;
lastX = x;
prefs.set('editor.headerWidth', w);
for (const el of $$('.CodeMirror-linewidget[style*="width:"]')) {
el.style.width = parseFloat(el.style.width) - delta + 'px';
}
}
}
function resizeStop() {
document.off('mouseup', resizeStop);
document.off('mousemove', resize);
document.body.classList.remove('resizing-h');
}
})();

View File

@ -381,8 +381,7 @@ function createResizeGrip(cm) {
cm.display.lineDiv.offsetParent.offsetTop +
/* borders */
wrapper.offsetHeight - wrapper.clientHeight;
wrapper.style.pointerEvents = 'none';
document.body.style.cursor = 's-resize';
document.body.classList.add('resizing-v');
document.on('mousemove', resize);
document.on('mouseup', resizeStop);
@ -398,8 +397,7 @@ function createResizeGrip(cm) {
function resizeStop() {
document.off('mouseup', resizeStop);
document.off('mousemove', resize);
wrapper.style.pointerEvents = '';
document.body.style.cursor = '';
document.body.classList.remove('resizing-v');
}
};

View File

@ -99,6 +99,7 @@
'editor.appliesToLineWidget': true, // show applies-to line widget on the editor
'editor.livePreview': true,
'editor.headerWidth': 280,
// show CSS colors as clickable colored rectangles
'editor.colorpicker': true,