diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css
index 4ba40563..8be4c171 100644
--- a/copyparty/web/browser.css
+++ b/copyparty/web/browser.css
@@ -1,6 +1,7 @@
:root {
--grid-sz: 10em;
--grid-ln: 3;
+ --nav-sz: 16em;
}
* {
line-height: 1.2em;
@@ -702,6 +703,7 @@ input.eq_gain {
left: 0;
bottom: 0;
top: 7em;
+ width: var(--nav-sz);
overflow-x: hidden;
overflow-y: auto;
-ms-scroll-chaining: none;
@@ -796,13 +798,12 @@ input.eq_gain {
}
#tree.nowrap #treeul li {
min-height: 1.4em;
-}
-#tree.nowrap #treeul a+a {
white-space: nowrap;
}
#tree.nowrap #treeul a+a:hover {
background: rgba(34, 34, 34, 0.67);
- position: fixed;
+ min-width: calc(var(--nav-sz) - 2em);
+ width: auto;
}
html.light #tree.nowrap #treeul a+a:hover {
background: rgba(255, 255, 255, 0.67);
@@ -899,6 +900,9 @@ html.light #tree.nowrap #treeul a+a:hover {
#u2turbo.on+#u2tdate {
opacity: 1;
}
+#wraptree.on+#hovertree {
+ display: none;
+}
#ghead {
background: #3c3c3c;
border: 1px solid #444;
diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js
index f979d889..d6c87e14 100644
--- a/copyparty/web/browser.js
+++ b/copyparty/web/browser.js
@@ -184,6 +184,7 @@ ebi('tree').innerHTML = (
' 🎯\n' +
' a\n' +
' ↵\n' +
+ ' 👀\n' +
'\n' +
'
\n' +
'
'
@@ -3013,6 +3014,7 @@ var treectl = (function () {
fixedpos = false,
prev_atop = null,
prev_winh = null,
+ mentered = null,
treesz = clamp(icfg_get('treesz', 16), 4, 50);
bcfg_bind(treectl, 'ireadme', 'ireadme', true);
@@ -3021,9 +3023,11 @@ var treectl = (function () {
treectl.goto(get_evpath());
});
setwrap(bcfg_bind(treectl, 'wtree', 'wraptree', true, setwrap));
+ bcfg_bind(treectl, 'htree', 'hovertree', true, reload_tree);
function setwrap(v) {
clmod(ebi('tree'), 'nowrap', !v);
+ reload_tree();
}
treectl.entree = function (e) {
@@ -3067,6 +3071,14 @@ var treectl = (function () {
}
function onscroll() {
+ if (mentered) {
+ mentered.style.position = '';
+ mentered = null;
+ }
+ onscroll2();
+ }
+
+ function onscroll2() {
if (!entreed || treectl.hidden || document.visibilityState == 'hidden')
return;
@@ -3103,7 +3115,7 @@ var treectl = (function () {
tree.style.height = treeh < 10 ? '' : treeh + 'px';
}
}
- timer.add(onscroll, true);
+ timer.add(onscroll2, true);
function onresize(e) {
if (!entreed || treectl.hidden)
@@ -3118,9 +3130,14 @@ var treectl = (function () {
if (!QS(q))
break;
}
- var w = treesz + nq;
- ebi('tree').style.width = w + 'em';
- ebi('wrap').style.marginLeft = w + 'em';
+ var w = (treesz + nq) + 'em';
+ try {
+ document.documentElement.style.setProperty('--nav-sz', w);
+ }
+ catch (ex) {
+ ebi('tree').style.width = w;
+ }
+ ebi('wrap').style.marginLeft = w;
onscroll();
}
@@ -3207,12 +3224,15 @@ var treectl = (function () {
function reload_tree() {
var cdir = get_evpath(),
- links = QSA('#treeul a+a');
+ links = QSA('#treeul a+a'),
+ nowrap = QS('#tree.nowrap') && QS('#hovertree.on');
for (var a = 0, aa = links.length; a < aa; a++) {
var href = links[a].getAttribute('href');
links[a].setAttribute('class', href == cdir ? 'hl' : '');
links[a].onclick = treego;
+ links[a].onmouseenter = nowrap ? menter : null;
+ links[a].onmouseleave = nowrap ? mleave : null;
}
links = QSA('#treeul li>a:first-child');
for (var a = 0, aa = links.length; a < aa; a++) {
@@ -3221,6 +3241,22 @@ var treectl = (function () {
}
}
+ function menter(e) {
+ var p = this.offsetParent,
+ pp = p.offsetParent,
+ ppy = pp.offsetTop,
+ y = this.offsetTop + p.offsetTop + ppy - p.scrollTop - pp.scrollTop - (ppy ? document.documentElement.scrollTop : 0);
+
+ this.style.position = 'fixed';
+ this.style.top = y + 'px';
+ mentered = this;
+ }
+
+ function mleave(e) {
+ this.style.position = '';
+ mentered = null;
+ }
+
function treego(e) {
if (ctrl(e))
return true;