Merge branch 'hovudstraum' of https://github.com/tilse/copyparty-uiV1.5 into hovudstraum

This commit is contained in:
Til 2026-05-05 08:18:29 +02:00
commit 2cf1f0d10f
8 changed files with 306 additions and 129 deletions

View file

@ -16,11 +16,11 @@
--btn-fg: var(--a);
--btn-bg-a: rgba(128,128,128,0.15);
--btn-bg-a: color-mix(var(--bg-max) 85%, var(--fg-max) 20%);
--btn-bg-a: color-mix(in oklab, var(--bg-max) 85%, var(--fg-max) 20%);
--btn-bg: rgba(128,128,128,0.15);
--btn-bg: linear-gradient(-5deg, color-mix(var(--btn-bg-a) 40%, transparent), color-mix(var(--btn-bg-a)70%, var(--a-gray)));
--btn-bg: linear-gradient(-5deg, color-mix(in oklab, var(--btn-bg-a) 40%, transparent), color-mix(in oklab, var(--btn-bg-a)70%, var(--a-gray)));
--btn-h-fg: var(--a-hil);
--btn-h-bg: color-mix(var(--a-gray) 45%, var(--bg-max));
--btn-h-bg: color-mix(in oklab, var(--a-gray) 45%, var(--bg-max));
--btn-1-fg: var(--bg);
--btn-1-bg: var(--a);
--btn-h-bs: var(--btn-bs);
@ -38,7 +38,7 @@
--op-aa-fg: var(--a);
--op-aa-bg: var(--bg-d2);
--op-a-sh: color-mix(var(--bg-max) 50%, transparent 50%);
--op-a-sh: color-mix(in oklab, var(--bg-max) 50%, transparent 50%);
--u2-btn-b1: #999;
--u2-sbtn-b1: #999;
@ -99,7 +99,7 @@
--g-f-bg: var(--bg-u3);
--g-f-b1: var(--bg-u5);
--g-f-fg: var(--fg-max);
--g-sh: color-mix(var(--bg-max) 30%, transparent 70%);
--g-sh: color-mix(in oklab, var(--bg-max) 30%, transparent 70%);
--f-sh1: 0.33;
--f-sh2: 0.02;
@ -113,7 +113,7 @@
--fm-off: var(--a-hil);
--mp-sh: #1116;
--mp-b-bg: color-mix(var(--bg-max) 20%, transparent 80%);
--mp-b-bg: color-mix(in oklab, var(--bg-max) 20%, transparent 80%);
--scrl-hint: var(--bg-u2);
@ -135,13 +135,13 @@ html.az {
--btn-1-bs: .05em .1em .2em var(--a-dark) inset;
}
html.ay {
--btn-bg: linear-gradient(-5deg, color-mix(var(--btn-bg-a)80%, var(--a)), color-mix(var(--btn-bg-a) 50%, transparent));
--btn-bg: linear-gradient(-5deg, color-mix(in oklab, var(--btn-bg-a)80%, var(--a)), color-mix(in oklab, var(--btn-bg-a) 50%, transparent));
}
html.b {
--btn-bs: 0 .05em 0 var(--bg-d3) inset;
--btn-1-bs: 0 .05em 0 var(--btn-1h-bg) inset;
--btn-bg: color-mix(var(--bg-u5), transparent);
--btn-bg: color-mix(in oklab, var(--bg-u5), transparent);
--tree-bg: var(--bg);
@ -529,7 +529,7 @@ html .ayjump:focus-visible {
cursor: pointer;
}
#qs_btns a {
background: color-mix(var(--txt-bg), transparent);
background: color-mix(in oklab, var(--txt-bg), transparent);
width: 1em;
display: inline-block;
text-align: center;
@ -544,7 +544,7 @@ html.y #path {
}
#path a.dtarget {
text-shadow: var(--f-sel-sh) 0 0 5px;
background: color-mix(var(--a), transparent);
background: color-mix(in oklab, var(--a), transparent);
}
#path #entree {
margin-left: -.7em;
@ -597,7 +597,7 @@ a:hover {
}
#files a:hover {
color: var(--fg-max);
background: color-mix(var(--a) 20%, transparent);
background: color-mix(in oklab, var(--a) 20%, transparent);
text-decoration: underline;
}
#files thead th {
@ -631,7 +631,7 @@ a:hover {
}
#files tbody tr:hover td,
#files tbody tr:hover td+td {
background: color-mix(var(--a) 15%, transparent);
background: color-mix(in oklab, var(--a) 15%, transparent);
}
a.dir {
color: var(--a);
@ -722,13 +722,13 @@ html.y #files span.fsz_P { font-weight: bold }
}
#files tr.dtarget {
box-shadow: 0 0 5px 0 var(--f-sel-sh) inset;
background: color-mix(var(--a), transparent);
background: color-mix(in oklab, var(--a), transparent);
}
#files tr.dtarget td {
background: none;
}
#path a {
padding: 0 .35em;
padding: .5em .35em;
position: relative;
z-index: 1;
/* ie: */
@ -743,7 +743,7 @@ html.y #files span.fsz_P { font-weight: bold }
transform: skew(-25deg);
border-right: #222 solid 2px;
border-right: var(--bg) solid 2px;
background: linear-gradient(70deg, transparent 40%, color-mix(var(--bg-max) 25%, transparent) 75%, color-mix(var(--bg-max) 35%, transparent));
background: linear-gradient(70deg, transparent 40%, color-mix(in oklab, var(--bg-max) 25%, transparent) 75%, color-mix(in oklab, var(--bg-max) 35%, transparent));
}
html.a #path i {
border-right: var(--bg) solid 1px;
@ -987,6 +987,9 @@ tr.play td:nth-child(1) a {
.imgcontainer:hover .gselchk {
display: block;
}
.srch_hdr .gselchk {
display: none !important;
}
.gselchk {
position: absolute;
display: none;
@ -1097,7 +1100,7 @@ html:not(.e) #ggrid>a.dir:before {
}
#ggrid a.dtarget {
box-shadow: 0 0 5px 0 var(--f-sel-sh);
background: color-mix(var(--a), transparent);
background: color-mix(in oklab, var(--a), transparent);
}
#files tr.sel a,
#files tr.sel a.play {
@ -1184,7 +1187,8 @@ html:not(.e) #ggrid>a.dir:before {
height: 1.5em;
padding: .1em;
}
.btn.svgIcon.gb1 {
.btn.svgIcon.gb_grd,
.btn.svgIcon.gb_glr {
width: 1.7em;
height: 1.7em;
padding: 0;
@ -1250,13 +1254,13 @@ html:not(.e) #ggrid>a.dir:before {
right: .4em;
font-size: xx-large;
font-weight: bold;
box-shadow: 0 0 .5em color-mix(var(--a) 20%, transparent);
box-shadow: 0 0 .5em color-mix(in oklab, var(--a) 20%, transparent);
border-radius: 10px;
border-radius: calc(var(--radius) * 1.2);
text-align: right;
}
#up_quick.open {
box-shadow: 0 0 .5em color-mix(var(--mp-sh) 20%, transparent);
box-shadow: 0 0 .5em color-mix(in oklab, var(--mp-sh) 20%, transparent);
}
#up_quick_more {
display: none;
@ -1297,7 +1301,7 @@ html:not(.e):not(.d) #up_quick .btn {
}
html:not(.e):not(.d) #up_quick .btn.on {
transform: rotate(-90deg);
box-shadow: -.05em .02em .3em color-mix(var(--a) 20%, transparent);
box-shadow: -.05em .02em .3em color-mix(in oklab, var(--a) 20%, transparent);
}
#up_quick .btn .rotatable {
transition: all .20s;
@ -1561,12 +1565,18 @@ html:not(.e):not(.d) #up_quick .btn.on {
border: var(--transparent) solid 1px;
color: var(--a);
font-size: 1.5em;
padding: 0 .4em;
padding: .15em .4em;
margin: 0;
}
.unfun #ops a {
font-size: 1.2em;
}
#opa_mkd {
display: none;
}
#ops a.vis {
display: block;
}
#ops a.act {
color: #fff;
color: var(--op-aa-fg);
@ -1576,7 +1586,7 @@ html:not(.e):not(.d) #up_quick .btn.on {
border-radius: 0 0 var(--radius) var(--radius);
border-bottom: .3em solid var(--a);
box-shadow: var(--op-aa-sh);
margin: -.2em 0 -.6em 0;
margin: -1px 0 -.35em 0;
padding-top: .2em;
}
#ops a svg {
@ -1608,10 +1618,10 @@ html.y #ops svg circle {
vertical-align: bottom;
}
#ops {
padding: .25em .5em;
padding: 0 .5em;
white-space: nowrap;
display: flex;
height: 2em;
height: 2.5em;
border-radius: 5px;
border-radius: var(--radius);
background: var(--bg-u2);
@ -1980,7 +1990,7 @@ html.a .btn {
}
#tree li a.dtarget {
box-shadow: 0 0 5px 0 var(--f-sel-sh) inset;
background: color-mix(var(--a) 30%, transparent);
background: color-mix(in oklab, var(--a) 30%, transparent);
}
#tree ul a.sel {
background: #000;
@ -2124,6 +2134,7 @@ html.a .btn {
margin: .8em 0 0 .6em;
padding: 0;
}
.disabled,
#thumbs,
#au_prescan,
#au_fullpre,
@ -2468,7 +2479,7 @@ html.noscroll .sbar::-webkit-scrollbar {
opacity: 1;
}
#bbox-overlay.sel {
background: color-mix(var(--a-dark) 70%, transparent);
background: color-mix(in oklab, var(--a-dark) 70%, transparent);
}
.full-image {
display: inline-block;
@ -2860,7 +2871,21 @@ html.c .modalcontent {
margin: 0 -.4em;
text-align: center;
}
.modal.vis.unmodal {
position: initial;
.modalcontent{
width: 100%;
max-width: none;
margin: 0;
}
.closepane,
.close {
display: none;
}
.splitsub {
margin-bottom: .5em;
}
}
/* upload.css */
@ -3024,7 +3049,7 @@ html.c .modalcontent {
font-size: 1.1em;
}
#u2btn:hover {
background: linear-gradient(var(--a) 0%, var(--a) 20%, color-mix(transparent 85%, var(--a) 15%));
background: linear-gradient(var(--a) 0%, var(--a) 20%, color-mix(in oklab, transparent 85%, var(--a) 15%));
border-color: var(--bg);
border-style: solid;
color: var(--fg-max);
@ -3474,7 +3499,7 @@ html.cz {
}
}
html.c .modal .setting:hover {
background: color-mix(var(--bg-u5) 30%, transparent);
background: color-mix(in oklab, var(--bg-u5) 30%, transparent);
}
html.ay #u2btn {
box-shadow: .4em .4em 0 #ccc;
@ -3574,7 +3599,7 @@ html.b * {
}
html.b #path,
html.b #ops {
background: color-mix(var(--bg-u5), transparent);
background: color-mix(in oklab, var(--bg-u5), transparent);
}
html.b #treepar {
margin-left: .63em;
@ -3887,10 +3912,18 @@ html.e #wrap.thin {
justify-content: center;
gap: 1em;
}
html.b #ggrid {
padding: 0 0 2em 0;
gap: 1em 1.5em;
#ggrid.gallery {
gap: 1px 2px;
margin: -.2em -.5em;
a::before {
padding: .1em 0;
margin: .3em;
}
a.img {
span {
display: none;
}
}
}
#ggrid > a {
@ -3901,6 +3934,7 @@ html.e #wrap.thin {
#ggrid>a>span {
text-align: center;
padding: .2em .2em .15em .2em;
user-select: text;
}
}
@ -4669,11 +4703,10 @@ html.e #tree_footer {
background: transparent;
}
html.e #wrap {
transform: translateX(calc((var(--negative-space) * 2) - .2em));
padding-right: var(--negative-space);
position: relative;
margin-right: calc((var(--negative-space) * 2) - .1em);
margin-left: -6px;
margin-right: 0;
margin-left: -10px;
margin-top: 0;
/*overflow-x: auto; fix for OOB table when screen space is limited (mobile), but removes sticky header*/
}

View file

@ -136,6 +136,32 @@
<div id="pro" class="logue">{{ "" if sb_lg else logues[0] }}</div>
<div id="cfg" class="modal">
<a id="s_outside" class="closepane" href="#"></a>
<div id="s_content" class="modalcontent">
<a id="h_cfg" class="modalheader" href="#h_cfg"></a>
<div id="s_hor" class="modalsplit">
<div id="s_nav" class="splitsub"></div>
<div class="divider"></div>
<div id="s_list" class="opview splitsub"></div>
</div>
<a class="close btn" href="#"></a>
</div>
</div>
<div id="up2k" class="modal">
<a id="up_outside" class="closepane" href="#"></a>
<div id="up_content" class="modalcontent">
<a id="h_up2k" class="modalheader" href="#h_up2k">🚀 Upload</a>
<div id="up_hor" class="modalsplit">
<div id="op_up2k" class="opview splitsub"></div>
<div class="divider"></div>
<div id="up_info" class="splitsub"></div>
</div>
<a class="close btn" href="#"></a>
</div>
</div>
<div id="wtc" class="ghead"></div>
<table id="files">
<thead>
@ -179,32 +205,6 @@
<div id="rcm" tabindex="0"></div>
<div id="cfg" class="modal">
<a id="s_outside" class="closepane" href="#"></a>
<div id="s_content" class="modalcontent">
<a id="h_cfg" class="modalheader" href="#h_cfg"></a>
<div id="s_hor" class="modalsplit">
<div id="s_nav" class="splitsub"></div>
<div class="divider"></div>
<div id="s_list" class="opview splitsub"></div>
</div>
<a class="close btn" href="#"></a>
</div>
</div>
<div id="up2k" class="modal">
<a id="up_outside" class="closepane" href="#"></a>
<div id="up_content" class="modalcontent">
<a id="h_up2k" class="modalheader" href="#h_up2k">🚀 Upload</a>
<div id="up_hor" class="modalsplit">
<div id="op_up2k" class="opview splitsub"></div>
<div class="divider"></div>
<div id="up_info" class="splitsub"></div>
</div>
<a class="close btn" href="#"></a>
</div>
</div>
<script>
var SR = "{{ r }}",
CGV1 = {{ cgv1 }},

View file

@ -168,6 +168,7 @@ if (1)
"wt_m3ua": "add to m3u playlist (click <code>📻copy</code> later)",
"wt_m3uc": "copy m3u playlist to clipboard",
"wt_grid": "toggle grid / list view$NHotkey: G",
"wt_gallery": "toggle gallery view with larger image previews",
"wt_prev": "previous track$NHotkey: J",
"wt_play": "play / pause$NHotkey: P",
"wt_next": "next track$NHotkey: L",
@ -315,6 +316,7 @@ if (1)
"mt_one": "stop after one song\">1⃣",
"mt_shuf": "shuffle the songs in each folder",
"mt_aplay": "autoplay if there is a song-ID in the link you clicked to access the server$N$Ndisabling this will also stop the page URL from being updated with song-IDs when playing music, to prevent autoplay if these settings are lost but the URL remains\">a▶",
"mt_afade": "fade in / out when pausing / unpausing audio\">fade",
"mt_preload": "start loading the next song near the end for gapless playback\">preload",
"mt_prescan": "go to the next folder before the last song$Nends, keeping the webbrowser happy$Nso it doesn't stop the playback\">nav",
"mt_fullpre": "try to preload the entire song;$N✅ enable on <b>unreliable</b> connections,$N❌ <b>disable</b> on slow connections probably\">full",
@ -823,6 +825,8 @@ ebi('ops').innerHTML = (
(have_del ? '<a href="#" id="opa_del" data-perm="write" data-dest="unpost" tt="' + L.ot_unpost + '">' + (fun_tgl ? '🧯' : 'undo') + '</a>' : '') +
'<a href="#" id="opa_up" data-dest="up2k">' + (fun_tgl ? '🚀' : 'upload') + '</a>' +
'<a href="#" id="opa_bup" data-perm="write" data-dest="bup" tt="' + L.ot_bup + '">' + (fun_tgl ? '🎈' : 'bup') + '</a>' +
'<a href="#" id="opa_mkd" data-perm="write" data-dest="mkdir" tt="' + L.ot_mkdir + '"><p class="overlay_plus">+</p>📂</a>' +
//'<a href="#" id="opa_md" data-perm="read write" data-dest="new_md" tt="' + L.ot_md + '"><p class="overlay_plus">+</p>📝</a>' +
'<a href="#" id="opa_msg" data-dest="msg" tt="' + L.ot_msg + '">' + (fun_tgl ? '📟' : 'msg') + '</a>' +
'<a href="#" id="opa_cfg" data-dest="cfg" tt="' + L.ot_cfg + '">' + (fun_tgl ? '⚙️' : 'conf') + '</a>' +
'<a href="#" id="opa_acc" data-dest="acc" tt=""><span id="acc_pfp"' + (fun_tgl ? ' class="pfp"' : '') + '>' + (fun_tgl ? '👤' : 'acc') + '</span></a>' +
@ -831,6 +835,12 @@ ebi('ops').innerHTML = (
// mkdir + md
function mktemp(is_dir) {
if(!has(perms, 'read')){
if(is_dir)
goto('mkdir');
else
goto('new_md');
}
qsr('#rcm_tmp');
if (!thegrid.en) {
var row = mknod('tr', 'rcm_tmp',
@ -976,6 +986,8 @@ ebi('wtoggle').addEventListener('wheel', function (e) {
});
ebi('up_quick').onclick = function(){
if(!has(perms, 'write'))
return;
var btn = ebi('up_quick_btn');
clmod(btn, 'on', 't');
var isOff = clgot(btn, 'on'); // button has inverted display logic
@ -1138,10 +1150,14 @@ var bup = ebi('op_bup');
ebi('bup_tgl').appendChild(bup);
ebi('h_bup').onclick = function() {
var open = !clgot(bup, 'act');
if(open)
if(open){
location.hash = '#h_bup';
modaltoggle('bup', true);
else
}
else{
location.hash = '#h_up2k';
modaltoggle('up2k', true);
}
ebi('bup_tgl').open = !open;
};
@ -1167,6 +1183,7 @@ var musicSettings = (
'<a href="#" class="tgl btn" id="au_loop" tt="' + L.mt_loop + '">🔂</a>' +
'<a href="#" class="tgl btn" id="au_one" tt="' + L.mt_one + '</a>' +
'<a href="#" class="tgl btn" id="au_aplay" tt="' + L.mt_aplay + '</a>' +
'<a href="#" class="tgl btn" id="au_afade" tt="' + L.mt_afade + '</a>' +
'<a href="#" class="tgl btn" id="au_preload" tt="' + L.mt_preload + '</a>' +
'<a href="#" class="tgl btn" id="au_prescan" tt="' + L.mt_prescan + '</a>' +
'<a href="#" class="tgl btn" id="au_fullpre" tt="' + L.mt_fullpre + '</a>' +
@ -1578,12 +1595,17 @@ function goto(dest) {
if (fn)
fn();
}
else{
if(location.hash.startsWith('#h_'))
location.hash = '#';
}
ebi('srchfolder_div').style.display = dest == 'search' ? 'block' : 'none';
clmod(document.documentElement, 'op_open', dest);
// enables the use of keyboard page nav on modals
clmod(document.documentElement, 'noscroll', QS('.modal.vis'));
var a_modal = QS('.modal.vis');
clmod(document.documentElement, 'noscroll', a_modal && window.getComputedStyle(a_modal).position == 'fixed');
if (treectl)
treectl.onscroll();
@ -1598,6 +1620,8 @@ window.onhashchange = function() {
console.log('closing modal due to hash');
}
if(a_modal && location.hash == '#h_' + a_modal.id){
if(a_modal.style.position != 'fixed')
return;
var m_header = QS('.modal.vis .modalheader');
if(m_header){
m_header.click();
@ -1611,7 +1635,6 @@ window.onhashchange = function() {
var p_modal = header.closest('.modal');
if(!p_modal)
return;
console.log(p_modal)
if(!clgot(p_modal, 'vis')){
console.log('forcing modal open due to subheader hash');
modaltoggle(p_modal.id);
@ -1780,6 +1803,7 @@ var mpl = (function () {
mp.read_order(); // don't bind
});
bcfg_bind(r, 'aplay', 'au_aplay', true);
bcfg_bind(r, 'afade', 'au_afade', true);
bcfg_bind(r, 'preload', 'au_preload', true);
bcfg_bind(r, 'prescan', 'au_prescan', true);
bcfg_bind(r, 'fullpre', 'au_fullpre', false);
@ -2218,7 +2242,14 @@ function MPlayer() {
r.ftid = r.au.tid;
r.au.play();
mpl.pp();
fader();
if(mpl.afade != false)
fader();
else{
// insta start
r.fvol = r.vol;
mpss.go();
r.au.volume = r.expvol(r.fvol);
}
}
};
r.fade_out = function () {
@ -2226,7 +2257,13 @@ function MPlayer() {
r.fvol = r.vol;
r.fdir = -0.05 * r.vol * (CHROME ? 2 : 1);
r.ftid = r.au.tid;
fader();
if(mpl.afade != false)
fader();
else {
// insta stop
r.au.pause();
mpl.pp();
}
};
r.stopfade = function (hard) {
clearTimeout(r.ftimer);
@ -2406,7 +2443,12 @@ var widget = (function () {
}
};
r.setvis = function () {
widget.style.display = !has(perms, "read") || showfile.abrt ? 'none' : '';
var display = !has(perms, "read") || showfile.abrt ? 'none' : '';
ebi('wtico').style.display =
ebi('wtoggle').style.display =
ebi('widgeti').style.display =
ebi('np_inf').style.display =
display;
};
wtico.onclick = function (e) {
if (!touchmode)
@ -2777,7 +2819,7 @@ var vbar = (function () {
if (gradh != gh) {
gradh = gh;
style1 = auto_grad(r.can, accent, accent);
style2 = light ? 'color-mix(' + bg + ' 85%, #000 15%' : 'color-mix(' + bg + ' 85%, #fff 15%';
style2 = light ? 'color-mix(in oklab, ' + bg + ' 85%, #000 15%' : 'color-mix(in oklab, ' + bg + ' 85%, #fff 15%';
}
if(IE){
style1 = 'rgb(85, 144, 255)';
@ -6006,8 +6048,9 @@ var thegrid = (function () {
gfiles.style.display = 'none';
gfiles.innerHTML = (
'<div id="ghead" class="ghead">' +
'<a href="#" id="gridicon_template" class="grdbtn gb1 svgIcon tgl btn on"></a>' +
'<a href="#" id="listicon_template" class="grdbtn gb2 svgIcon tgl btn"></a>' +
'<a href="#" id="listicon_template" class="grdbtn gb_lst svgIcon tgl btn" tt="' + L.wt_grid + '"></a>' +
'<a href="#" id="gridicon_template" class="grdbtn gb_grd svgIcon tgl btn on" tt="' + L.wt_grid + '"></a>' +
'<a href="#" id="galleryicon_template" class="grdbtn gb_glr svgIcon tgl btn" tt="' + L.wt_gallery + '"></a>' +
'<a href="#" class="tgl btn" id="gridsel" tt="' + L.gt_msel + '</a> ' +
'<a href="#" class="tgl btn" id="gridvau" tt="' + L.gt_vau + '</a> ' +
'<a href="#" class="tgl btn" id="gridcrop" tt="' + L.gt_crop + '</a> ' +
@ -6030,15 +6073,17 @@ var thegrid = (function () {
lfiles.parentNode.insertBefore(gfiles, lfiles);
var ggrid = ebi('ggrid');
var svg_grid = svg_box + '<rect x="4" y="4" width="7" height="7" rx="1" fill="currentColor"/><rect x="4" y="13" width="7" height="7" rx="1" fill="currentColor"/><rect x="13" y="4" width="7" height="7" rx="1" fill="currentColor"/><rect x="13" y="13" width="7" height="7" rx="1" fill="currentColor"/></svg>'
var svg_list = svg_box + '<path fill-rule="evenodd" clip-rule="evenodd" d="M9 6C9 4.34315 7.65685 3 6 3H4C2.34315 3 1 4.34315 1 6V8C1 9.65685 2.34315 11 4 11H6C7.65685 11 9 9.65685 9 8V6ZM7 6C7 5.44772 6.55228 5 6 5H4C3.44772 5 3 5.44772 3 6V8C3 8.55228 3.44772 9 4 9H6C6.55228 9 7 8.55228 7 8V6Z" fill="currentColor"/><path fill-rule="evenodd" clip-rule="evenodd" d="M9 16C9 14.3431 7.65685 13 6 13H4C2.34315 13 1 14.3431 1 16V18C1 19.6569 2.34315 21 4 21H6C7.65685 21 9 19.6569 9 18V16ZM7 16C7 15.4477 6.55228 15 6 15H4C3.44772 15 3 15.4477 3 16V18C3 18.5523 3.44772 19 4 19H6C6.55228 19 7 18.5523 7 18V16Z" fill="currentColor"/><path d="M11 7C11 6.44772 11.4477 6 12 6H22C22.5523 6 23 6.44772 23 7C23 7.55228 22.5523 8 22 8H12C11.4477 8 11 7.55228 11 7Z" fill="currentColor"/><path d="M11 17C11 16.4477 11.4477 16 12 16H22C22.5523 16 23 16.4477 23 17C23 17.5523 22.5523 18 22 18H12C11.4477 18 11 17.5523 11 17Z" fill="currentColor"/></svg>'
ebi('gridicon_template').innerHTML = svg_grid;
var svg_grid = svg_box + '<rect x="4" y="4" width="7" height="7" rx="1" fill="currentColor"/><rect x="4" y="13" width="7" height="7" rx="1" fill="currentColor"/><rect x="13" y="4" width="7" height="7" rx="1" fill="currentColor"/><rect x="13" y="13" width="7" height="7" rx="1" fill="currentColor"/></svg>'
var svg_gallery = svg_box + '<path d="M4 17L7.58959 13.7694C8.38025 13.0578 9.58958 13.0896 10.3417 13.8417L11.5 15L15.0858 11.4142C15.8668 10.6332 17.1332 10.6332 17.9142 11.4142L20 13.5M11 9C11 9.55228 10.5523 10 10 10C9.44772 10 9 9.55228 9 9C9 8.44772 9.44772 8 10 8C10.5523 8 11 8.44772 11 9ZM6 20H18C19.1046 20 20 19.1046 20 18V6C20 4.89543 19.1046 4 18 4H6C4.89543 4 4 4.89543 4 6V18C4 19.1046 4.89543 20 6 20Z"' + svg_options + '/></svg>'
ebi('listicon_template').innerHTML = svg_list;
ebi('gridicon_template').innerHTML = svg_grid;
ebi('galleryicon_template').innerHTML = svg_gallery;
var ico1 = ebi('gridicon_template').cloneNode(true);
var ico2 = ebi('listicon_template').cloneNode(true);
clmod(ico1, 'on', 't');
clmod(ico2, 'on', 't');
var ico1 = ebi('listicon_template').cloneNode(true);
var ico2 = ebi('gridicon_template').cloneNode(true);
clmod(ico1, 'on', true);
clmod(ico2, 'on', false);
// file list header
ebi('wtc').innerHTML = (
@ -6115,6 +6160,7 @@ var thegrid = (function () {
ebi('wtc').style.display = lfiles.style.display;
clmod(ggrid, 'crop', r.crop);
clmod(ggrid, 'nocrop', !r.crop);
clmod(ggrid, 'gallery', r.gallery);
ebi('pro').style.display = ebi('epi').style.display = ebi('lazy').style.display = ebi('treeul').style.display = ebi('treepar').style.display = '';
ebi('bdoc').style.display = 'none';
clmod(ebi('wrap'), 'doc');
@ -6178,12 +6224,6 @@ var thegrid = (function () {
return gclick.call(this, e, false);
}
function gselclick(e) {
var oth = ebi(this.closest('a').getAttribute('ref')),
td = oth.closest('td').nextSibling;
td.onclick.call(td, e);
}
function gclick2(e) {
if (ctrl(e) || !r.sel)
return true;
@ -6430,7 +6470,14 @@ var thegrid = (function () {
var chks = QSA('.gselchk');
for (var a = 0, aa = chks.length; a < aa; a++) {
chks[a].onclick = gselclick;
chks[a].onclick = function (e) {
var oth = ebi(this.closest('a').getAttribute('ref')),
td = oth.closest('td').nextSibling;
if(td && td.onclick)
td.onclick.call(td, e);
else
rcm.show(e);
}
}
r.dirty = false;
@ -6564,9 +6611,23 @@ var thegrid = (function () {
swrite('ga_thresh', r.gathr = (isNum(n) ? n : 0) || 70);
};
var gtgls = QSA('.grdbtn');
for(var a = 0; a < gtgls.length; a++)
gtgls[a].onclick = ebi('griden').onclick;
var gbtn = QSA('.gb_grd');
for(var a = 0; a < gbtn.length; a++)
gbtn[a].onclick = function(){
if(!thegrid.en)
ebi('griden').click();
}
var lsbtn = QSA('.gb_lst');
for(var a = 0; a < lsbtn.length; a++)
lsbtn[a].onclick = function(){
if(thegrid.en)
ebi('griden').click();
}
bcfg_bind(r, 'gallery', 'galleryicon_template', false, function (v) {
clmod(ebi('ggrid'), 'gallery', v);
});
return r;
})();
@ -7216,12 +7277,17 @@ var search_ui = (function () {
if (!ebi(chk).checked)
continue;
if(q.length > 0)
q += ' and ';
q += ' ( ';
for (var c = 0; c < tvs.length; c++) {
var tv = tvs[c];
if (!tv.length)
break;
q += ' and ';
if(c > 0)
q += ' or ';
if (k == 'adv') {
q += tv.replace(/ +/g, " and ").replace(/([=!><]=?)/, " $1 ");
@ -7258,12 +7324,23 @@ var search_ui = (function () {
tv = '"' + tv + '"';
}
var quote = tv.match('"') ? '"' : '';
var match;
while ( (match = tv.match(/[^\*\"\s]\*[^\*\"\s]/)) && match[0]){
console.log(match)
tv = tv.replace(
match[0],
match[0].replace('*', '*' + quote + ' and ' + k + ' like ' + quote + '*')
)
}
q += not + k + ' like ' + tv;
}
}
q += ' ) ';
}
}
ebi('q_raw').value = q.slice(5);
ebi('q_raw').value = q.trim();
}
function do_search() {
@ -7329,7 +7406,7 @@ var search_ui = (function () {
ext = '%';
var links = linksplit(r.rp + '', null, id).join('<span>/</span>'),
nodes = ['<tr><td>-</td><td><div>' + links +
nodes = ['<tr class="' + (img_re.exec(r.rp) ? 'img ' : '') + '"><td>-</td><td><div>' + links +
'</div></td><td sortv="' + sz + '">' + hsz];
for (var b = 0; b < tagord.length; b++) {
@ -8340,7 +8417,7 @@ var treectl = (function () {
'" rel="nofollow" class="doc' + (lang ? ' bri' : '') +
'" hl="' + id + '" name="' + hname + '">-txt-</a>';
var cl = (/\.PARTIAL$/.exec(fname) ? 'fade' : '') + tn.cls,
var cl = (/\.PARTIAL$/.exec(fname) ? 'fade ' : '') + (img_re.exec(fname) ? 'img ' : '') + tn.cls,
ln = ['<tr class="' + cl + '"><td>' + tn.lead + '</td><td><a href="' +
top + tn.href + '" id="' + id + '">' + hname +
'</a></td><td sortv="' + tn.sz + '">' + filesizefun(tn.sz)];
@ -8745,14 +8822,20 @@ function apply_perms(res) {
var o = QSA('#ops>a[data-perm]');
for (var a = 0; a < o.length; a++) {
var display = '';
var enabled = true;
var needed = o[a].getAttribute('data-perm').split(' ');
for (var b = 0; b < needed.length; b++) {
if (!has(perms, needed[b])) {
display = 'none';
enabled = false;
if(needed[b] != 'write')
display = 'none';
}
}
clmod(o[a], 'disabled', !enabled);
o[a].style.display = display;
}
clmod(ebi('up_quick'), 'disabled', !has(perms, 'write'));
ebi('bup_tgl').style.display = has(perms, 'write') ? '' : 'none';
var o = QSA('#ops>a[data-dep], #u2conf td[data-dep]');
for (var a = 0; a < o.length; a++)
@ -8803,8 +8886,12 @@ function apply_perms(res) {
widget.setvis();
thegrid.setvis();
if (!have_read && have_write)
var up_only = !have_read && have_write;
if (up_only)
goto('up2k');
clmod(ebi('up2k'), 'unmodal', up_only);
clmod(ebi('opa_mkd'), 'vis', up_only);
}
@ -10570,7 +10657,7 @@ var rcm = (function () {
menu.style.display = '';
}
ebi('wrap').oncontextmenu = function (e) {
r.show = function (e) {
if (!r.enabled || e.shiftKey || (r.double && menu.style.display) || /doc=/.exec(location.search)) {
r.hide(true);
return true;
@ -10584,6 +10671,10 @@ var rcm = (function () {
var gfile = thegrid.en && e.target && e.target.closest('#ggrid > a');
show(e.clientX, e.clientY, gfile || e.target, gfile);
return false;
}
ebi('wrap').oncontextmenu = function (e) {
r.show(e);
};
menu.onblur = function () { setTimeout(r.hide) };

View file

@ -20,7 +20,7 @@ html {
border-bottom: 2px solid rgb(7, 130, 212);
position: fixed;
z-index: 10;
box-shadow: 0 0 1em color-mix(var(--bg-max) 60%, transparent 40%);
box-shadow: 0 0 1em color-mix(in oklab, var(--bg-max) 60%, transparent 40%);
}
#homebtn:hover, #homebtn:focus-visible {
background: var(--bg-u5);
@ -51,13 +51,13 @@ html {
padding: 1.5em;
padding-bottom: 0em;
line-height: 1.3em;
background: color-mix(var(--a-gray) 27%, var(--bg-max));
background: color-mix(in oklab, var(--a-gray) 27%, var(--bg-max));
border-radius: .5em;
border: var(--bg-u5) solid 1px;
box-shadow: 0 0 2em color-mix(var(--bg-max) 60%, transparent 40%);
box-shadow: 0 0 2em color-mix(in oklab, var(--bg-max) 60%, transparent 40%);
}
html.y #wrap {
background: color-mix(var(--a-gray) 18%, var(--bg-max));
background: color-mix(in oklab, var(--a-gray) 18%, var(--bg-max));
}
#wrap.w {
max-width: 96%;

View file

@ -11,27 +11,27 @@
accent-color: var(--a);
--radius: .3em;
/* accent color in everything */
--fg-max: color-mix(#fefefe 95%, var(--a) 5%);
--bg-max: color-mix(#010101 95%, var(--a) 5%);
--fg-max: #fefefe;
--bg-max: #010101;
--a-hil: hsl(from color-mix(var(--a) 80%, var(--fg-max) 20%) h calc(s * 1.2) l);
--a-dark: hsl(from color-mix(var(--a) 60%, var(--bg-max) 40%) h calc(s * 1.3) l); /* warning text etc */
--a-gray: hsl(from var(--a) h calc(s * 0.1) l);
--a-hil: rgb(255, 215, 121);
--a-dark: rgb(235, 165, 37); /* warning text etc */
--a-gray: #ccc;
--fg: color-mix(var(--fg-max) 90%, var(--bg-max) 10%);
--fg-weak: color-mix(var(--fg-max) 70%, var(--bg-max) 30%);
--fg: #efefef;
--fg-weak: #c4c4c4;
--bg: #1f1f1f;
--bg-half: #01010182;
--bg-u1: #212121;
--bg-u2: #353535;
--bg-u3: #404040;
--bg-u5: #4e4e4e;
--bg-d1: #111111;
--bg-d2: #0e0e0e;
--bg-d3: #0b0b0b;
--bg: color-mix(var(--bg-max) 85%, var(--fg-max) 15%);
--bg-half: color-mix(var(--bg) 50%, transparent 50%);
--bg-u1: color-mix(var(--bg-max) 80%, var(--fg-max) 20%);
--bg-u2: color-mix(var(--bg-max) 75%, var(--fg-max) 25%);
--bg-u3: color-mix(var(--bg-max) 70%, var(--fg-max) 30%);
--bg-u5: color-mix(var(--bg-max) 65%, var(--fg-max) 35%);
--bgg: var(--bg);
--bg-d1: color-mix(var(--bg-max) 90%, var(--fg-max) 10%);
--bg-d2: color-mix(var(--bg-max) 92%, var(--fg-max) 8%);
--bg-d3: color-mix(var(--bg-max) 95%, var(--fg-max) 5%);
}
html.y {
color-scheme: light;
@ -42,13 +42,22 @@ html.y {
--a: #07c;
--bg-max: color-mix(#fefefe 95%, var(--a) 5%);
--fg-max: color-mix(#010101 95%, var(--a) 5%);
--bg-u1: color-mix(var(--bg-max) 92%, var(--fg-max));
--bg-u2: color-mix(var(--bg-max) 95%, var(--fg-max));
--bg-u5: color-mix(var(--bg-max) 82%, var(--fg-max));
--bg: color-mix(var(--bg-max) 98%, var(--fg-max));
--a-hil: rgb(121, 193, 255);
--a-dark: rgb(7, 95, 183); /* warning text etc */
--a-gray: #ccc;
--fg: #101010;
--fg-weak: #323232;
--bg: #eeeeee;
--bg-half: #eeeeee82;
--bg-u1: #e3e3e3;
--bg-u2: #d6d6d6;
--bg-u3: #c7c7c7;
--bg-u5: #bcbcbc;
--bg-d1: #f4f4f4;
--bg-d2: #f5f5f5;
--bg-d3: #f6f6f6;
--chk-fg: var(--fg);
--txt-sh: #aaa;
@ -57,6 +66,46 @@ html.y {
text-shadow: none;
}
@supports (background: hsl(from #ccc, h s l)){
:root {
--a-hil: hsl(from var(--a) h calc(s * 1.2) l);
--a-dark: hsl(from var(--a) h calc(s * 1.3) l); /* warning text etc */
--a-gray: hsl(from var(--a) h calc(s * 0.1) l);
}
}
@supports (background: color-mix(in oklab, black, white)){
:root, html.y {
/* accent color in everything */
--fg-max: color-mix(in oklab, #fefefe 95%, var(--a) 5%);
--bg-max: color-mix(in oklab, #010101 95%, var(--a) 5%);
--a-hil: hsl(from color-mix(in oklab, var(--a) 80%, var(--fg-max) 20%) h calc(s * 1.2) l);
--a-dark: hsl(from color-mix(in oklab, var(--a) 60%, var(--bg-max) 40%) h calc(s * 1.3) l); /* warning text etc */
--a-gray: hsl(from var(--a) h calc(s * 0.1) l);
--fg: color-mix(in oklab, var(--fg-max) 90%, var(--bg-max) 10%);
--fg-weak: color-mix(in oklab, var(--fg-max) 70%, var(--bg-max) 30%);
--bg: color-mix(in oklab, var(--bg-max) 85%, var(--fg-max) 15%);
--bg-half: color-mix(in oklab, var(--bg) 50%, transparent 50%);
--bg-u1: color-mix(in oklab, var(--bg-max) 80%, var(--fg-max) 20%);
--bg-u2: color-mix(in oklab, var(--bg-max) 75%, var(--fg-max) 25%);
--bg-u3: color-mix(in oklab, var(--bg-max) 70%, var(--fg-max) 30%);
--bg-u5: color-mix(in oklab, var(--bg-max) 65%, var(--fg-max) 35%);
--bg-d1: color-mix(in oklab, var(--bg-max) 90%, var(--fg-max) 10%);
--bg-d2: color-mix(in oklab, var(--bg-max) 92%, var(--fg-max) 8%);
--bg-d3: color-mix(in oklab, var(--bg-max) 95%, var(--fg-max) 5%);
}
html.y {
--bg-max: color-mix(in oklab, #fefefe 95%, var(--a) 5%);
--fg-max: color-mix(in oklab, #010101 95%, var(--a) 5%);
--bg-u1: color-mix(in oklab, var(--bg-max) 92%, var(--fg-max));
--bg-u2: color-mix(in oklab, var(--bg-max) 95%, var(--fg-max));
--bg-u5: color-mix(in oklab, var(--bg-max) 82%, var(--fg-max));
--bg: color-mix(in oklab, var(--bg-max) 98%, var(--fg-max));
}
}
@font-face {
font-family: 'scp';
font-display: swap;

View file

@ -839,6 +839,7 @@ function up2k_init(subtle) {
var loading_deps = false;
function init_deps() {
console.log('up2k init deps');
if (!loading_deps && !got_deps()) {
var fn = 'sha512.' + sha_js + '.js',
m = L.u_https1 + ' <a href="' + (location + '').replace(':', 's:') + '">' + L.u_https2 + '</a> ' + L.u_https3;
@ -1201,9 +1202,8 @@ function up2k_init(subtle) {
// if ((dz == 'up_dz' && uc.fsearch) || (dz == 'srch_dz' && !uc.fsearch))
// tgl_fsearch();
//if (!QS('#op_up2k.act'))
if(!uc.fsearch)
goto('up2k');
up2k.init_deps();
var files,
is_itemlist = false;

View file

@ -2,11 +2,12 @@
# 2026-0428-0907 `v1.21.0` UI V2
## 🧪 new features
* drag n drop support within the browser window to move files or folders
* [Add moving files into other folders by dragging](https://github.com/tilse/copyparty-uiV1.5/pull/1) within the browser window to move files or folders
* custom accent color setting added. works best for light and dark themes (the first 4 in the list)
* right click (long press) on mobile is now possible
* selection checkboxes on items in grid view
* the tree and path can be visible at the same time
* #386 gallery view toggle for smaller margins / bigger image previews
* settings and upload are now a popup/modal
* settings can be navigated via sections and former tooltip info is now always visible
* new floating [+] button in bottom right for quickly creating files / folders / uploading
@ -24,6 +25,9 @@
* #1455 tooltips disappear more consistently when element is no longer hovered
* scrollable tree header so all options are accessible independent of tree width
* #1378 improved mobile layout
* media player has "fade" option now to disable fade in / fade out, which fixes play / pause on iOS lockscreens
* #1002 proper overflow handling for text files or readmes (svg editor still overflows, but it doesn't break the page layout anymore)
## 🔧 other changes
@ -47,7 +51,7 @@
## 😔 unfun facts
* added a setting that gets rid of (most) emojis
* #1209 (partially), #711 added a setting that gets rid of (most) emojis
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

View file

@ -23,7 +23,7 @@ ac96786e5d35882e0c5b724794329c9125c2b86ae7847f17acfc49f0d294312c6afc1c3f248655de
# win10
f4b4e330995ebe96c0bd06e16e5b26062ece9473f06d369775aa68eab261dedcf32dfdd159acaa227502bbf9fa2cd8bbe57cddb89fc6f2196fef7a9ed5a80ae9 Git-2.51.0-64-bit.exe
0a2cd4cadf0395f0374974cd2bc2407e5cc65c111275acdffb6ecc5a2026eee9e1bb3da528b35c7f0ff4b64563a74857d5c2149051e281cc09ebd0d1968be9aa en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso
16cc0c58b5df6c7040893089f3eb29c074aed61d76dae6cd628d8a89a05f6223ac5d7f3f709a12417c147594a87a94cc808d1e04a6f1e407cc41f7c9f47790d1 virtio-win-0.1.285.iso
4f13070cc9241fa342deab4ebfac360565030580ff77b6e5f1951a64627621e5da4abfd30e1e46ca8bae2bb7dd4ff98141aff424142c9629a5876a61283962e5 virtio-win-0.1.285.iso
9a7f40edc6f9209a2acd23793f3cbd6213c94f36064048cb8bf6eb04f1bdb2c2fe991cb09f77fe8b13e5cd85c618ef23573e79813b2fef899ab2f290cd129779 jinja2-3.1.6-py3-none-any.whl
00731cfdd9d5c12efef04a7161c90c1e5ed1dc4677aa88a1d4054aff836f3430df4da5262ed4289c21637358a9e10e5df16f76743cbf5a29bb3a44b146c19cf3 MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl
8a6e2b13a2ec4ef914a5d62aad3db6464d45e525a82e07f6051ed10474eae959069e165dba011aefb8207cdfd55391d73d6f06362c7eb247b08763106709526e mutagen-1.47.0-py3-none-any.whl