1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-09-02 09:09:38 +02:00

Move "Quit" button to top bar in element picker

Additionally:

- Removed auto fade out of dialog when mouse does not hover the
  dialog.
- Added a minimize/maximize button in top bar

Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/55
This commit is contained in:
Raymond Hill 2024-03-02 16:45:03 -05:00
parent a0a6ae0d0c
commit 6266c4718d
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
3 changed files with 93 additions and 68 deletions

View File

@ -13,7 +13,6 @@ html#ublock0-epicker,
#ublock0-epicker aside { #ublock0-epicker aside {
background-color: var(--surface-1); background-color: var(--surface-1);
border: 1px solid var(--border-2); border: 1px solid var(--border-2);
bottom: 2px;
box-sizing: border-box; box-sizing: border-box;
cursor: default; cursor: default;
display: none; display: none;
@ -22,14 +21,21 @@ html#ublock0-epicker,
min-width: min(24rem, 100vw - 4px); min-width: min(24rem, 100vw - 4px);
overflow-y: auto; overflow-y: auto;
position: fixed; position: fixed;
right: 2px;
width: min(32rem, 100vw - 4px); width: min(32rem, 100vw - 4px);
} }
#ublock0-epicker.paused:not(.zap) aside { #ublock0-epicker.paused:not(.zap) aside {
display: flex; display: flex;
} }
#ublock0-epicker.minimized aside {
min-width: min(16rem, 100vw - 4px);
overflow: hidden;
width: min(16rem, 100vw - 4px);
}
#ublock0-epicker.minimized aside > *:not(#windowbar) {
display: none;
}
#ublock0-epicker aside > *:not(:first-child) { #ublock0-epicker aside > *:not(:first-child) {
padding: 2px; padding: 0 2px;
} }
#ublock0-epicker #toolbar { #ublock0-epicker #toolbar {
@ -43,16 +49,6 @@ html#ublock0-epicker,
background-color: var(--button-preferred-surface); background-color: var(--button-preferred-surface);
color: var(--button-preferred-ink); color: var(--button-preferred-ink);
} }
#ublock0-epicker #move {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAFElEQVQI12NgwAfKy8v/M5ANYLoBshgEyQo6H9UAAAAASUVORK5CYII=');
cursor: grab;
height: 1.5rem;
margin-bottom: 2px;
opacity: 0.8;
}
#ublock0-epicker aside.moving #move {
cursor: grabbing;
}
#ublock0-epicker section { #ublock0-epicker section {
border: 0; border: 0;
box-sizing: border-box; box-sizing: border-box;
@ -129,8 +125,8 @@ html#ublock0-epicker,
); );
display: inline-block; display: inline-block;
flex-shrink: 0; flex-shrink: 0;
height: 16px; height: 20px;
width: 16px; width: 20px;
} }
.resultsetModifier > span > span:nth-of-type(3) { .resultsetModifier > span > span:nth-of-type(3) {
background-color: var(--surface-3); background-color: var(--surface-3);
@ -174,7 +170,7 @@ html#ublock0-epicker,
overflow: hidden; overflow: hidden;
} }
#ublock0-epicker #candidateFilters { #ublock0-epicker #candidateFilters {
max-height: min(14em, 20vh); max-height: min(12em, 18vh);
overflow-y: auto; overflow-y: auto;
} }
#ublock0-epicker .changeFilter > li > span:nth-of-type(1) { #ublock0-epicker .changeFilter > li > span:nth-of-type(1) {
@ -211,32 +207,12 @@ html#ublock0-epicker,
https://github.com/gorhill/uBlock/issues/3449 https://github.com/gorhill/uBlock/issues/3449
https://github.com/uBlockOrigin/uBlock-issues/issues/55 https://github.com/uBlockOrigin/uBlock-issues/issues/55
**/ **/
@keyframes startDialog {
0% { opacity: 1.0; }
60% { opacity: 1.0; }
100% { opacity: 0.1; }
}
#ublock0-epicker.paused aside { #ublock0-epicker.paused aside {
opacity: 0.1;
visibility: visible; visibility: visible;
z-index: 100; z-index: 100;
} }
#ublock0-epicker.paused:not(.show):not(.hide) aside:not(:hover) {
animation-duration: 1.6s;
animation-name: startDialog;
animation-timing-function: linear;
}
#ublock0-epicker.paused aside:hover {
opacity: 1;
}
#ublock0-epicker.paused.show aside {
opacity: 1;
}
#ublock0-epicker.paused.hide aside {
opacity: 0.1;
}
#ublock0-epicker svg { #ublock0-epicker svg#sea {
cursor: crosshair; cursor: crosshair;
box-sizing: border-box; box-sizing: border-box;
height: 100%; height: 100%;
@ -245,26 +221,62 @@ html#ublock0-epicker,
top: 0; top: 0;
width: 100%; width: 100%;
} }
#ublock0-epicker.paused svg { #ublock0-epicker.paused svg#sea {
cursor: not-allowed; cursor: not-allowed;
} }
#ublock0-epicker svg > path:first-child { #ublock0-epicker svg#sea > path:first-child {
fill: rgba(0,0,0,0.5); fill: rgba(0,0,0,0.5);
fill-rule: evenodd; fill-rule: evenodd;
} }
#ublock0-epicker svg > path + path { #ublock0-epicker svg#sea > path + path {
stroke: #F00; stroke: #F00;
stroke-width: 0.5px; stroke-width: 0.5px;
fill: rgba(255,63,63,0.20); fill: rgba(255,63,63,0.20);
} }
#ublock0-epicker.zap svg > path + path { #ublock0-epicker.zap svg#sea > path + path {
stroke: #FF0; stroke: #FF0;
stroke-width: 0.5px; stroke-width: 0.5px;
fill: rgba(255,255,63,0.20); fill: rgba(255,255,63,0.20);
} }
#ublock0-epicker.preview svg > path { #ublock0-epicker.preview svg#sea > path {
fill: rgba(0,0,0,0.10); fill: rgba(0,0,0,0.10);
} }
#ublock0-epicker.preview svg > path + path { #ublock0-epicker.preview svg#sea > path + path {
stroke: none; stroke: none;
} }
#ublock0-epicker #windowbar {
display: flex;
}
#ublock0-epicker #windowbar svg {
fill: none;
pointer-events: none;
stroke: var(--ink-1);
stroke-width: 3px;
}
#ublock0-epicker #windowbar #move {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAFElEQVQI12NgwAfKy8v/M5ANYLoBshgEyQo6H9UAAAAASUVORK5CYII=');
cursor: grab;
flex-grow: 1;
opacity: 0.8;
}
#ublock0-epicker aside.moving #windowbar #move {
cursor: grabbing;
}
#windowbar #quit,
#windowbar #minimize {
height: 2em;
width: 2em;
}
#windowbar #quit:hover,
#windowbar #minimize:hover {
background-color: var(--surface-2)
}
html.minimized #windowbar #minimize svg > path,
#windowbar #minimize svg > rect {
display: none;
}
html.minimized #windowbar #minimize svg > rect {
display: initial;
}

View File

@ -28,6 +28,7 @@ import './codemirror/ubo-static-filtering.js';
import { hostnameFromURI } from './uri-utils.js'; import { hostnameFromURI } from './uri-utils.js';
import punycode from '../lib/punycode.js'; import punycode from '../lib/punycode.js';
import * as sfp from './static-filtering-parser.js'; import * as sfp from './static-filtering-parser.js';
import { dom } from './dom.js';
/******************************************************************************/ /******************************************************************************/
/******************************************************************************/ /******************************************************************************/
@ -46,7 +47,7 @@ const pickerRoot = document.documentElement;
const dialog = $stor('aside'); const dialog = $stor('aside');
let staticFilteringParser; let staticFilteringParser;
const svgRoot = $stor('svg'); const svgRoot = $stor('svg#sea');
const svgOcean = svgRoot.children[0]; const svgOcean = svgRoot.children[0];
const svgIslands = svgRoot.children[1]; const svgIslands = svgRoot.children[1];
const NoPaths = 'M0 0'; const NoPaths = 'M0 0';
@ -594,8 +595,9 @@ const onStartMoving = (( ) => {
let isTouch = false; let isTouch = false;
let mx0 = 0, my0 = 0; let mx0 = 0, my0 = 0;
let mx1 = 0, my1 = 0; let mx1 = 0, my1 = 0;
let r0 = 0, b0 = 0; let pw = 0, ph = 0;
let rMax = 0, bMax = 0; let dw = 0, dh = 0;
let cx0 = 0, cy0 = 0;
let timer; let timer;
const eatEvent = function(ev) { const eatEvent = function(ev) {
@ -605,10 +607,22 @@ const onStartMoving = (( ) => {
const move = ( ) => { const move = ( ) => {
timer = undefined; timer = undefined;
const r1 = Math.min(Math.max(r0 - mx1 + mx0, 2), rMax); const cx1 = cx0 + mx1 - mx0;
const b1 = Math.min(Math.max(b0 - my1 + my0, 2), bMax); const cy1 = cy0 + my1 - my0;
dialog.style.setProperty('right', `${r1}px`); if ( cx1 < pw / 2 ) {
dialog.style.setProperty('bottom', `${b1}px`); dialog.style.setProperty('left', `${Math.max(cx1-dw/2,2)}px`);
dialog.style.removeProperty('right');
} else {
dialog.style.removeProperty('left');
dialog.style.setProperty('right', `${Math.max(pw-cx1-dw/2,2)}px`);
}
if ( cy1 < ph / 2 ) {
dialog.style.setProperty('top', `${Math.max(cy1-dh/2,2)}px`);
dialog.style.removeProperty('bottom');
} else {
dialog.style.removeProperty('top');
dialog.style.setProperty('bottom', `${Math.max(ph-cy1-dh/2,2)}px`);
}
}; };
const moveAsync = ev => { const moveAsync = ev => {
@ -635,7 +649,7 @@ const onStartMoving = (( ) => {
eatEvent(ev); eatEvent(ev);
}; };
return function(ev) { return ev => {
const target = dialog.querySelector('#move'); const target = dialog.querySelector('#move');
if ( ev.target !== target ) { return; } if ( ev.target !== target ) { return; }
if ( dialog.classList.contains('moving') ) { return; } if ( dialog.classList.contains('moving') ) { return; }
@ -648,12 +662,13 @@ const onStartMoving = (( ) => {
mx0 = ev.pageX; mx0 = ev.pageX;
my0 = ev.pageY; my0 = ev.pageY;
} }
const style = self.getComputedStyle(dialog);
r0 = parseInt(style.right, 10);
b0 = parseInt(style.bottom, 10);
const rect = dialog.getBoundingClientRect(); const rect = dialog.getBoundingClientRect();
rMax = pickerRoot.clientWidth - 2 - rect.width ; dw = rect.width;
bMax = pickerRoot.clientHeight - 2 - rect.height; dh = rect.height;
cx0 = rect.x + dw / 2;
cy0 = rect.y + dh / 2;
pw = pickerRoot.clientWidth;
ph = pickerRoot.clientHeight;
dialog.classList.add('moving'); dialog.classList.add('moving');
if ( isTouch ) { if ( isTouch ) {
self.addEventListener('touchmove', moveAsync, { capture: true }); self.addEventListener('touchmove', moveAsync, { capture: true });
@ -806,7 +821,7 @@ const unpausePicker = function() {
const startPicker = function() { const startPicker = function() {
self.addEventListener('keydown', onKeyPressed, true); self.addEventListener('keydown', onKeyPressed, true);
const svg = $stor('svg'); const svg = $stor('svg#sea');
svg.addEventListener('click', onSvgClicked); svg.addEventListener('click', onSvgClicked);
svg.addEventListener('touchstart', onSvgTouch); svg.addEventListener('touchstart', onSvgTouch);
svg.addEventListener('touchend', onSvgTouch); svg.addEventListener('touchend', onSvgTouch);
@ -820,6 +835,9 @@ const startPicker = function() {
$id('preview').addEventListener('click', onPreviewClicked); $id('preview').addEventListener('click', onPreviewClicked);
$id('create').addEventListener('click', onCreateClicked); $id('create').addEventListener('click', onCreateClicked);
$id('pick').addEventListener('click', onPickClicked); $id('pick').addEventListener('click', onPickClicked);
$id('minimize').addEventListener('click', ( ) => {
dom.cl.toggle(dom.html, 'minimized');
});
$id('quit').addEventListener('click', onQuitClicked); $id('quit').addEventListener('click', onQuitClicked);
$id('move').addEventListener('mousedown', onStartMoving); $id('move').addEventListener('mousedown', onStartMoving);
$id('move').addEventListener('touchstart', onStartMoving); $id('move').addEventListener('touchstart', onStartMoving);

View File

@ -15,8 +15,8 @@
</head> </head>
<body> <body>
<aside> <aside style="right: 2px; bottom: 2px;">
<div id="move"></div> <div id="windowbar"><div id="minimize"><svg viewBox="0 0 64 64"><path d="M 16,48 H 48" /><rect x="16" y="16" height="32" width="32" /></div><div id="move"></div><div id="quit" data-i18n-title="pickerQuit"><svg viewBox="0 0 64 64"><path d="M16 16L48 48M16 48L48 16" /></div></div>
<section> <section>
<div> <div>
<div class="codeMirrorContainer codeMirrorBreakAll cm-theme-override"></div> <div class="codeMirrorContainer codeMirrorBreakAll cm-theme-override"></div>
@ -35,14 +35,9 @@
</div> </div>
</div> </div>
<div id="toolbar"> <div id="toolbar">
<div> <button id="pick" type="button" data-i18n="pickerPick">_<span class="hover"></span></button>
<button id="preview" type="button" data-i18n="pickerPreview">_<span class="hover"></span></button> <button id="preview" type="button" data-i18n="pickerPreview">_<span class="hover"></span></button>
</div> <button id="create" type="button" class="preferred" disabled data-i18n="pickerCreate">_<span class="hover"></span></button>
<div>
<button id="create" type="button" class="preferred" disabled data-i18n="pickerCreate">_<span class="hover"></span></button>
<button id="pick" type="button" data-i18n="pickerPick">_<span class="hover"></span></button>
<button id="quit" type="button" data-i18n="pickerQuit">_<span class="hover"></span></button>
</div>
</div> </div>
</section> </section>
<ul id="candidateFilters"> <ul id="candidateFilters">
@ -56,7 +51,7 @@
</li> </li>
</ul> </ul>
</aside> </aside>
<svg><path d></path><path d></path></svg> <svg id="sea"><path d></path><path d></path></svg>
<script src="../lib/codemirror/lib/codemirror.js"></script> <script src="../lib/codemirror/lib/codemirror.js"></script>
<script src="../lib/codemirror/addon/edit/closebrackets.js"></script> <script src="../lib/codemirror/addon/edit/closebrackets.js"></script>