rework file list logic to work with class "flink" (file link) instead of fixed index

This commit is contained in:
Til Schmitter 2026-06-17 09:55:47 +02:00
parent 2d487d1427
commit ab78858469
28 changed files with 213 additions and 162 deletions

View file

@ -288,7 +288,7 @@ window.baguetteBox = (function () {
var galleries = data[selector].galleries;
[].forEach.call(galleries, function (gallery) {
[].forEach.call(gallery, function (imageItem) {
//unbind(imageItem.imageElement, 'click', imageItem.eventHandler);
unbind(imageItem.imageElement, 'click', imageItem.eventHandler);
});
if (currentGallery === gallery)
@ -742,7 +742,7 @@ window.baguetteBox = (function () {
}
function showOverlay(chosenImageIndex) {
clmod(ebi('ggrid'), 'waiting', true);
clmod(ebi('wrap'), 'waiting', true);
if (options.noScrollbars) {
var a = document.documentElement.style.overflowY,
@ -767,7 +767,7 @@ window.baguetteBox = (function () {
loadImage(currentIndex, function () {
preloadNext(currentIndex);
preloadPrev(currentIndex);
clmod(ebi('ggrid'), 'waiting', false);
clmod(ebi('wrap'), 'waiting', false);
});
show_buttons(0);
@ -796,7 +796,6 @@ window.baguetteBox = (function () {
function hideOverlay(e, dtor) {
ev(e);
playvid(false);
removeFromCache('#files');
if (options.noScrollbars) {
document.documentElement.style.overflowY = scrollCSS[0];
document.body.style.overflowY = scrollCSS[1];

View file

@ -522,6 +522,7 @@ html.dy #files tr.sel a.play {
color: #fff;
}
html.dy tr.play td:nth-child(1) a {
color: #000;
background: #fff;
border: #000 solid 1px;
}
@ -742,6 +743,7 @@ a:hover {
color: var(--a-hil);
background: var(--a-h-bg);
}
#files .imgcontainer:hover,
#files a:hover {
color: var(--fg-max);
background: color-mix(in oklab, var(--a) 20%, transparent);
@ -786,10 +788,6 @@ a.dir {
color: #3584e4;
color: var(--a);
}
tr.dir td:nth-child(2) a::before {
content: "📁";
margin: 0 .1em 0 -.2em;
}
#files thead th {
padding: .3em;
background: var(--bg);
@ -844,7 +842,7 @@ html.y #files tr.fade a {
border-radius: 0 5px 5px 0;
border-radius: 0 var(--radius) var(--radius) 0;
}
#files tbody td:nth-child(3) {
#files tbody td:nth-child(4) {
font-family: 'scp', monospace, monospace;
font-family: var(--font-mono), 'scp', monospace, monospace;
text-align: right;
@ -1049,9 +1047,6 @@ tr td:nth-child(1) a {
padding: .3em;
margin: -.3em;
} */
tr.play td:nth-child(2) a::before {
content: "▶";
}
tr.play td:nth-child(1) a {
background: var(--btn-1-bg);
color:var(--btn-1-fg);
@ -1118,10 +1113,14 @@ tr.play td:nth-child(1) a {
/* separate to allow IE to only use this rule */
display: block;
}
#files .play .thumb,
#files .play img,
#ggrid>a.play .thumb,
#ggrid>a.play img {
background: var(--bg-u2);
}
.thumb,
.imgcontainer img,
#ggrid>a .thumb,
#ggrid>a img {
color: #3584e4;
@ -1136,6 +1135,7 @@ tr.play td:nth-child(1) a {
height: calc(var(--grid-sz) - 2.5em);
object-fit: cover;
}
.imgcontainer img,
#ggrid>a img {
position: absolute;
opacity: 0;
@ -1170,6 +1170,10 @@ tr.play td:nth-child(1) a {
padding: 4px 3px;
justify-content: center;
}
#files .imgcontainer img,
#files .imgcontainer {
border-radius: 0;
}
.th_ext {
z-index: 2;
position: absolute;
@ -2197,7 +2201,7 @@ input.ssconf_v {
margin: 0 .1em 0 0;
}
#files td div span {
#files td div:not(.imgcontainer) span {
color: var(--fg-max);
padding: 0 .4em;
font-weight: bold;
@ -2501,9 +2505,47 @@ html.b .btn {
#files td.min {
display: none;
}
#files td:nth-child(2n) {
#files td:nth-child(3){
color: var(--tab-alt);
}
#files td:has(.imgcontainer) {
padding: 0 1px;
}
#files .imgcontainer {
width: 2.3em;
height: 2.3em;
cursor: pointer;
margin: 0;
padding: 0;
}
#files .play .imgcontainer {
margin: -2px 0px;
padding: 2px;
}
#files .thumb,
#files img {
height: 100%;
}
#files tbody tr.sel span.th_ext span,
#files tbody tr.sel span.th_ext {
background: none;
}
#files .dir.thumbed img,
#files .dir .thumbed img {
position: absolute;
opacity: .6;
}
#files .dir.thumbed .thumb,
#files .dir .thumbed .thumb {
display: block !important;
z-index: 2;
}
#files .au .imgcontainer::after {
content: "▶";
position: absolute;
z-index: 2;
top: .6em;
}
#plazy {
width: 1px;
height: 1px;
@ -2542,7 +2584,6 @@ html.b .btn {
padding: 0;
}
.disabled,
#thumbs,
#au_prescan,
#au_fullpre,
#au_os_seek,
@ -2556,7 +2597,6 @@ html.b .btn {
#up_quick.disabled {
display: none;
}
.setting:has(#griden.on)+.setting #thumbs,
.setting:has(#au_preload.on)+.setting #au_prescan,
.setting:has(#au_preload.on)+.setting #au_prescan,
.setting:has(#au_preload.on)~.setting #au_fullpre,
@ -5237,7 +5277,8 @@ html.e #tree_footer {
background: transparent;
}
html.e #wrap {
padding: 0;
padding-left: 0;
padding-right: 0;
}
html.e #pathBar {
padding: 0;
@ -5584,8 +5625,8 @@ html.f #ggrid > a.sel:hover .imgcontainer::before {
border-color: var(--g-fsel-bg) transparent transparent var(--g-fsel-bg);
}
/* #wrap:not(.thin) .ghead::after, */
html.f .dir.thumbed .imgcontainer::before,
html.f .au.thumbed:not(.play) .imgcontainer::before {
html.f #ggrid .dir.thumbed .imgcontainer::before,
html.f #ggrid .au.thumbed:not(.play) .imgcontainer::before {
content: "";
position: absolute;
left: 0;

View file

@ -259,7 +259,7 @@
{%- for f in files %}
<tr>
<td>{{ f.lead }}</td>
<td><a href="{{ f.href }}">{{ f.name|e }}</a></td>
<td><a href="{{ f.href }}" class="flink">{{ f.name|e }}</a></td>
<td>{{ f.sz }}</td>
{%- if f.tags is defined %}
{%- for k in taglist %}

View file

@ -282,7 +282,7 @@ if (1)
"ct_grid": '田 the grid',
"ct_ttips": '◔ ◡ ◔"> tooltips',
"ct_thumb": 'in grid-view, toggle icons or thumbnails$NHotkey: T">🖼️ thumbs',
"ct_thumb": 'toggle icons or thumbnails$NHotkey: T">🖼️ thumbs',
"ct_csel": 'use CTRL and SHIFT for file selection in grid-view">sel',
"ct_dsel": 'use drag-selection in grid-view">dsel',
"ct_den": 'use dragging to move files into other folders">mvd',
@ -1261,8 +1261,8 @@ ebi('op_cfg').innerHTML = (
' <h3 id="h_general">✅ ' + L.cl_opts + '</h3>\n' +
' <div>\n' +
' <a id="tooltips" class="tgl btn" tt="' + L.ct_ttips + '</a>\n' +
' <a id="griden" class="tgl btn" tt="' + L.wt_grid + '">' + L.ct_grid + '</a>\n' +
' <a id="thumbs" class="tgl btn" tt="' + L.ct_thumb + '</a>\n' +
' <a id="griden" class="tgl btn" tt="' + L.wt_grid + '">' + L.ct_grid + '</a>\n' +
' <a id="csel" class="tgl btn" tt="' + L.ct_csel + '</a>\n' +
' <a id="dsel" class="tgl btn" tt="' + L.ct_dsel + '</a>\n' +
' <a id="den" class="tgl btn" tt="' + L.ct_den + '</a>\n' +
@ -2191,7 +2191,7 @@ var mpl = (function () {
tags.album = np.album;
if (r.osd_cv) {
var files = QSA("#files tr>td:nth-child(2)>a[id]"),
var files = QSA("#files .flink"),
cover = null;
for (var a = 0, aa = files.length; a < aa; a++) {
@ -2304,7 +2304,7 @@ function MPlayer() {
for (var a = 0, aa = trs.length; a < aa; a++) {
var tds = trs[a].getElementsByTagName('td'),
link = tds[1].getElementsByTagName('a');
link = trs[a].querySelectorAll('.flink');
link = link[link.length - 1];
var url = link.getAttribute('href'),
@ -4245,16 +4245,13 @@ function eval_hash() {
}
if (mtype == 'g') {
if (!thegrid.en)
ebi('griden').click();
var t = setInterval(function () {
if (!thegrid.bbox)
if (!msel.bbox || !msel.ready)
return;
clearInterval(t);
baguetteBox.urltime(ts);
var im = QS('#ggrid a[ref="' + id + '"]');
var im = ebi(id);
if (!im)
return toast.warn(10, L.im_hnf);
@ -5526,7 +5523,7 @@ var fileman = (function () {
f = [],
indir = [],
srcdir = vsplit(r.clip[0])[0],
links = QSA('#files tbody td:nth-child(2) a');
links = QSA('#files .flink');
r.f = f;
@ -6517,88 +6514,21 @@ window.thegrid = (function () {
var html = [],
svgs = new Set(),
max_svgs = CHROME ? 500 : 5000,
need_ext = !r.thumbs || !!ext_th,
use_ext_th = r.thumbs && ext_th,
files = QSA('#files>tbody>tr>td:nth-child(2) a[id]');
files = QSA('#files .flink');
for (var a = 0, aa = files.length; a < aa; a++) {
var ao = files[a],
ohref = esc(ao.getAttribute('href')),
href = ohref.split('?')[0],
ext = '',
ext0 = '',
name = uricom_dec(vsplit(href)[1]),
ref = ao.getAttribute('id'),
isdir = clgot(ao.parentElement.parentElement, 'dir'),
ac = ao.parentElement.parentElement.classList,
ihref = ohref;
if (need_ext && href != "#") {
var ar = href.split('.');
if (ar.length > 1)
ar.shift();
ar.reverse();
ext0 = ar[0];
for (var b = 0; b < Math.min(2, ar.length); b++) {
ext = ext ? (ar[b] + '.' + ext) : ar[b];
if (ar[b].length > 2)
break;
}
if (!ext)
ext = 'unk';
}
if (use_ext_th && (ext_th[ext] || ext_th[ext0])) {
ihref = ext_th[ext] || ext_th[ext0];
}
else if (r.thumbs) {
ihref = addq(ihref, 'th=' + (
have_jxl ? 'x' :
have_webp ? 'w' :
'j'
));
if (!r.crop)
ihref += 'f';
if (r.x3)
ihref += '3';
if (href == "#")
ihref = SR + '/.cpr/ico/' + (ref == 'moar' ? '++' : 'exit');
}
else {
ihref = '';
}
if(ihref){
ihref = addq(ihref, 'cache=i&_=' + ACB + TS);
var accent = getComputedStyle(document.body).getPropertyValue('--a');
if (!accent)
accent = '#07c';
ihref += '&a=' + parseColor(accent).replace(/ /g, '');
}
var svg = '<use href="#' +
(isdir ? 'folder' : 'file') + '-icon" color="' +
(ext == 'unk' || ext.startsWith('/') ? '#0000' : intToHSL(hashCode(ext))) + '"/>';
svg = '<svg class="thumb" width="100%" height="100%">' + svg + '</svg>';
if (N3DS){
// 3DS / unsupported: use fallback
svg = '<span class="thumb">' + (isdir ? '📁[FOLDER]' : '📄[FILE:' + ext + ']') + '</span>';
ext = 'unk';
}
ac = ao.parentElement.parentElement.classList;
html.push('<a href="' + ohref + '" ref="' + ref +
'" class="' + ac + '" ttt="' + esc(name) + '">' +
'<div class="imgcontainer">' +
'<input type="checkbox" class="gselchk"></input>' +
svg +
(isdir || ext == 'unk' || ext.startsWith('/') ? '' :
'<span class="th_ext" style="font-size: ' + (r.sz / 5) +'em; font-size:calc((var(--grid-sz) - 2.5em) / 3 * ' +
(ext.length > 3 ? 1 / (3 + ext.length * .4) * 3 : 1) + ')"><span class="inner">' + ext + '</span></span>') +
'<img loading="lazy" fetchPriority="low" onload="th_onload(this)" src="' +
ihref + '" /></div><span class="' + ac + '">' + ao.innerHTML + '</span></a>');
'" class="flink ' + ac + '" ttt="' + esc(name) + '">' +
get_thumb(ohref, ref, isdir, true) +
'<span class="' + ac + '">' + ao.innerHTML + '</span></a>');
}
ggrid.innerHTML = html.join('\n');
clmod(ggrid, 'crop', r.crop);
@ -6704,7 +6634,10 @@ window.thegrid = (function () {
swrite('thumbs', 1);
}
bcfg_bind(r, 'thumbs', 'thumbs', true, r.setdirty);
bcfg_bind(r, 'thumbs', 'thumbs', true, function(e){
r.setdirty();
msel.render();
});
bcfg_bind(r, 'ihop', 'ihop', true);
bcfg_bind(r, 'vau', 'gridvau', false);
bcfg_bind(r, 'crop', 'gridcrop', !dcrop.endsWith('n'), r.set_crop);
@ -6757,6 +6690,85 @@ window.thegrid = (function () {
return r;
})();
function get_thumb(ohref, ref, isdir, grid){
var href = ohref.split('?')[0],
ext = '',
ext0 = '',
name = uricom_dec(vsplit(href)[1]),
need_ext = !thegrid.thumbs || !!ext_th,
use_ext_th = thegrid.thumbs && ext_th,
ihref = ohref;
if (need_ext && href != "#") {
var ar = href.split('.');
if (ar.length > 1)
ar.shift();
ar.reverse();
ext0 = ar[0];
for (var b = 0; b < Math.min(2, ar.length); b++) {
ext = ext ? (ar[b] + '.' + ext) : ar[b];
if (ar[b].length > 2)
break;
}
if (!ext)
ext = 'unk';
}
if (use_ext_th && (ext_th[ext] || ext_th[ext0])) {
ihref = ext_th[ext] || ext_th[ext0];
}
else if (thegrid.thumbs) {
ihref = addq(ihref, 'th=' + (
have_jxl ? 'x' :
have_webp ? 'w' :
'j'
));
if (grid && !thegrid.crop)
ihref += 'f';
if (grid && thegrid.x3)
ihref += '3';
if (href == "#")
ihref = SR + '/.cpr/ico/' + (ref == 'moar' ? '++' : 'exit');
}
else {
ihref = '';
}
if(ihref){
ihref = addq(ihref, 'cache=i&_=' + ACB + TS);
var accent = getComputedStyle(document.body).getPropertyValue('--a');
if (!accent)
accent = '#07c';
ihref += '&a=' + parseColor(accent).replace(/ /g, '');
}
var svg = '<use href="#' +
(isdir ? 'folder' : 'file') + '-icon" color="' +
(ext == 'unk' || ext.startsWith('/') ? '#0000' : intToHSL(hashCode(ext))) + '"/>';
svg = '<svg class="thumb" width="100%" height="100%">' + svg + '</svg>';
if (N3DS){
// 3DS / unsupported: use fallback
svg = '<span class="thumb">' + (isdir ? '📁[FOLDER]' : '📄[FILE:' + ext + ']') + '</span>';
ext = 'unk';
}
var container = '<div class="imgcontainer" ref="' + ref + '">' +
(grid ? '<input type="checkbox" class="gselchk"></input>' : '') +
svg +
(isdir || ext == 'unk' || ext.startsWith('/') ? '' :
'<span class="th_ext" style="font-size: ' +
(grid ?
(thegrid.sz / 5) +'em; font-size:calc((var(--grid-sz) - 2.5em) / 3 * ' + (ext.length > 3 ? 1 / (3 + ext.length * .4) * 3 : 1) + ')' :
'.8em') +
'"><span class="inner">' + ext + '</span></span>') +
'<img loading="lazy" fetchPriority="low" onload="th_onload(this)" src="' +
ihref + '" /></div>'
return container;
}
function th_onload(el) {
set_loaded(el, true, false)
}
@ -8628,8 +8640,9 @@ var treectl = (function () {
'" hl="' + id + '" name="' + hname + '">-txt-</a>';
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 +
ln = ['<tr class="' + cl + '"><td>' + tn.lead + '</td><td>' +
get_thumb(tn.href, id, (/\bdir\b/i).test(cl), false) +
'</td><td><a href="' + top + tn.href + '" id="' + id + '" class="flink">' + hname +
'</a></td><td sortv="' + tn.sz + '">' + filesizefun(tn.sz)];
for (var b = 0; b < res.taglist.length; b++) {
@ -8736,7 +8749,7 @@ var treectl = (function () {
var media = scan_hash(location.hash);
if(media && media[0] == 'g')
clmod(ebi('ggrid'), 'waiting', true);
clmod(ebi('wrap'), 'waiting', true);
setTimeout(eval_hash, 1);
};
@ -9140,7 +9153,7 @@ function wait_set_fsearch(){
function tr2id(tr) {
try {
return tr.cells[1].querySelector('a[id]').getAttribute('id');
return tr.querySelector('.flink').getAttribute('id');
}
catch (ex) {
return null;
@ -9173,6 +9186,7 @@ function mk_files_header(taglist) {
var html = [
'<thead><tr>',
'<th name="lead"><span>!</span></th>',
'<th name="thumb"><span>th</span></th>',
'<th name="href"><span>File Name</span></th>',
'<th name="sz" sort="int"><span>Size</span></th>'
];
@ -9724,7 +9738,7 @@ var msel = (function () {
}
r.all = [];
var links = QSA('#files tbody td:nth-child(2) a:last-child'),
var links = QSA('#files .flink'),
is_srch = !!ebi('unsearch'),
vbase = get_evpath();
@ -9910,16 +9924,25 @@ var msel = (function () {
dl_file(sel[a].vp + sel[a].q);
};
r.render = function () {
var tds = QSA('#files tbody td+td+td'),
var tds = QSA('#files tbody td+td+td+td'),
is_srch = !!ebi('unsearch');
for (var a = 0, aa = tds.length; a < aa; a++)
tds[a].onclick = r.seltgl;
var links = QSA('#files a[id]')
var links = QSA('#files .flink')
for (var a = 0, aa = links.length; a < aa; a++)
links[a].onclick = fclick;
var thumbs = QSA('#files .imgcontainer')
for (var a = 0, aa = thumbs.length; a < aa; a++)
thumbs[a].onclick = fclick1;
var imgs = QSA('#files img');
for (var a = 0, aa = imgs.length; a < aa; a++) {
set_loaded(imgs[a], thegrid.thumbs && imgs[a].complete, true);
}
if(window.baguetteBox != undefined)
r.bagit();
@ -9930,6 +9953,8 @@ var msel = (function () {
var zipvis = (is_srch || !have_zip) ? 'none' : '';
ebi('selzip').style.display = zipvis;
ebi('zip1').style.display = zipvis;
r.ready = true;
}
r.bagit = function (isrc) {
@ -9956,30 +9981,23 @@ var msel = (function () {
},
onChange: function (i, maxIdx) {
if (this[i].imageElement) {
sethash('g' + this[i].imageElement.getAttribute('ref') + getsort());
sethash('g' + this[i].imageElement.getAttribute('id') + getsort());
}
}
});
r.bbox_opts = br[1];
r.bbox = true;
eval_hash()
};
if(window.baguetteBox != undefined)
r.bagit();
return r;
})();
function fclick1(e) {
if (ctrl(e) && !treectl.csel && !r.sel && !r.tempsel)
return true;
e.preventDefault ? e.preventDefault() : e.returnValue = false;
// pass copy of click event to list entry (can trigger bbox handler)
var link = ebi(this.getAttribute('ref'));
link.dispatchEvent(new MouseEvent('click', {
var td = ebi(this.getAttribute('ref'));
td.dispatchEvent(new MouseEvent('click', {
bubbles: true,
cancelable: true,
clientX: e.clientX,
@ -9996,27 +10014,21 @@ function fclick(e, dbl) {
ev(e);
return;
}
var isInGrid = this.hasAttribute('ref'),
link = this;
if(isInGrid){
// get table row with file link
link = ebi(this.getAttribute('ref'))
}
var qhref = link.getAttribute('href'),
var qhref = this.getAttribute('href'),
href = qhref.split('?')[0],
fid = link.getAttribute('id'),
fid = this.getAttribute('id'),
aplay = ebi('a' + fid),
atext = ebi('t' + fid),
is_txt = atext && !/\.ts$/.test(href) && showfile.getlang(href),
is_img = img_re.test(href),
is_dir = href.endsWith('/'),
is_srch = !!ebi('unsearch'),
in_tree = is_dir && treectl.find(link.textContent.slice(0, -1)),
in_tree = is_dir && treectl.find(this.textContent.slice(0, -1)),
have_sel = QS('#files tr.sel'),
td = link.closest('td').nextSibling,
td = this.closest('td').nextSibling,
tr = td.parentNode;
if ( thegrid.en && (thegrid.sel || thegrid.tempsel) && !dbl && !ctrl(e) || treectl.csel && (e.shiftKey || ctrl(e))) {
if (thegrid.en && (thegrid.sel || thegrid.tempsel) && !dbl && !ctrl(e) || treectl.csel && (e.shiftKey || ctrl(e))) {
ev(e);
msel.seltgl.call(td, e);
if (e.shiftKey)
@ -10026,10 +10038,10 @@ function fclick(e, dbl) {
else if (in_tree)
in_tree.click();
else if (link.hasAttribute('download'))
link.click();
else if (this.hasAttribute('download'))
this.click();
else if (thegrid.en && aplay && (thegrid.vau || !is_img))
else if (aplay && (thegrid.vau || !is_img))
aplay.click();
else if (is_dir)
@ -10049,7 +10061,7 @@ function fclick(e, dbl) {
thegrid.sel = true;
}, 1);
thegrid.sel = false;
link.click();
this.click();
}
ev(e);
}
@ -10936,7 +10948,7 @@ var rcm = (function () {
var ref = ebi(target.getAttribute('ref'));
file = ref && ref.closest('#files tbody tr');
}
var fa = file && file.children[1].querySelector('a[id]');
var fa = file && file.querySelector('.flink');
if (fa && fa.id != 'unsearch') {
selFile.no_dsel = TOUCH || clgot(file, "sel");
clmod(file, "sel", true);
@ -11071,7 +11083,7 @@ var drag = (function() {
elem.ondragenter = elem.ondragleave = elem.ondragover = function(e) {
if (!r.enabled) return;
var elemHref = basenames((elem.tagName == "A" ? elem : elem.querySelector("td:nth-child(2) a")).href.split("?")[0])
var elemHref = basenames((elem.tagName == "A" ? elem : elem.querySelector(".flink")).href.split("?")[0])
if (current == elem || elemHref == get_evpath() || currLink == elemHref) // Prevent folders being dragged into themselves
return;
ev(e);
@ -11110,7 +11122,7 @@ var drag = (function() {
f.draggable = true;
f.ondragstart = function(e) {
try{
currLink = basenames(e.target.querySelector("td:nth-child(2) a").href.split("?"));
currLink = basenames(e.target.querySelector(".flink").href.split("?"));
current = e.target;
r.no_warn = true;

View file

@ -61,7 +61,7 @@ th {
vertical-align: top;
white-space: nowrap;
}
#wrap td+td+td+td+td+td+td+td {
#wrap td+td+td+td+td+td+td+td+td {
font-family: var(--font-mono), monospace, monospace;
}
#wrap th:first-child,

View file

@ -225,7 +225,7 @@ Ls.chi = {
"ct_grid": '田 网格',
"ct_ttips": '◔ ◡ ◔"> 提示',
"ct_thumb": '在网格视图中,切换图标或缩略图$N快捷键: T">🖼️ 缩略',
"ct_thumb": '切换图标或缩略图$N快捷键: T">🖼️ 缩略',
"ct_csel": '在网格视图中,允许使用 CTRL 和 SHIFT 进行文件选择">选择',
"ct_dsel": '在网格视图中,允许拖动选择">拖选',
"ct_dl": '点击文件时强制下载(不要就地显示)">下载',

View file

@ -229,7 +229,7 @@ Ls.cze = {
"ct_grid": '田 mřížka',
"ct_ttips": '◔ ◡ ◔"> nápovědy',
"ct_thumb": 'v zobrazení mřížky přepnout ikony nebo náhledy$NKlávesová zkratka: T">🖼️ náhledy',
"ct_thumb": 'přepnout ikony nebo náhledy$NKlávesová zkratka: T">🖼️ náhledy',
"ct_csel": 'použít CTRL a SHIFT pro výběr souborů v zobrazení mřížky">výběr',
"ct_dsel": 'použít tažený výběr v zobrazení mřížky">tažení', //m
"ct_dl": 'vynutit stažení (nezobrazovat inline) při kliknutí na soubor">dl', //m

View file

@ -225,7 +225,7 @@ Ls.deu = {
"ct_grid": '田 Das Raster&trade;',
"ct_ttips": '◔ ◡ ◔"> Tooltips',
"ct_thumb": 'In Raster-Ansicht, zwischen Icons und Vorschau wechseln$NHotkey: T">🖼️ Vorschaubilder',
"ct_thumb": 'Zwischen Icons und Vorschau wechseln$NHotkey: T">🖼️ Vorschaubilder',
"ct_csel": 'Benutze STRG und UMSCHALT für Dateiauswahl in Raster-Ansicht">sel',
"ct_dsel": 'Ziehauswahl in Raster-Ansicht verwenden">ziehen', //m
"ct_dl": 'Beim Klick auf Dateien sie immer herunterladen (nicht einbetten)">dl',

View file

@ -225,7 +225,7 @@ Ls.epo = {
"ct_grid": '田 krado',
"ct_ttips": '◔ ◡ ◔"> ŝpruchelpiloj',
"ct_thumb": 'dum krado-vido, baskuli montradon de simboloj aŭ bildetoj$NFulmoklavo: T">🖼️ bildetoj',
"ct_thumb": 'baskuli montradon de simboloj aŭ bildetoj$NFulmoklavo: T">🖼️ bildetoj',
"ct_csel": 'uzi STIR kaj MAJ por elekti dosierojn en krado-vido">elekto',
"ct_dsel": 'uzi tren-elekton en krado-vido">treni',
"ct_dl": 'devigi elŝuton (ne montri enkadre), kiam dosiero estas alklakita">elŝuti',

View file

@ -225,7 +225,7 @@ Ls.fin = {
"ct_grid": '田 kuvanäkymä',
"ct_ttips": '◔ ◡ ◔"> vihjelaatikot',
"ct_thumb": 'valitse kuvakkeiden / pienoiskuvien välillä kuvanäkymässä $NPikanäppäin: T">🖼️ pienoiskuvat',
"ct_thumb": 'valitse kuvakkeiden / pienoiskuvien välillä $NPikanäppäin: T">🖼️ pienoiskuvat',
"ct_csel": 'käytä CTRL ja SHIFT tiedostojen valintaan kuvanäkymässä">valitse',
"ct_dsel": 'käytä aluevalintaa tiedostojen valintaan kuvanäkymässä">aluevalinta',
"ct_dl": 'pakota lataus (älä näytä upotettuna), kun tiedostoa klikataan">dl',

View file

@ -225,7 +225,7 @@ Ls.fra = {
"ct_grid": '田 grille',
"ct_ttips": '◔ ◡ ◔"> infobulles',
"ct_thumb": 'vue en grille, activer les icônes ou les miniatures$NHotkey: T">🖼️ minia',
"ct_thumb": 'activer les icônes ou les miniatures$NHotkey: T">🖼️ minia',
"ct_csel": 'utiliser CTRL et MAJ pour selectioner des fichiers en vue en grille">sel',
"ct_dsel": 'utiliser la sélection par glisser en vue en grille">glisser', //m
"ct_dl": 'forcer le téléchargement (ne pas afficher en ligne) lorsquun fichier est cliqué">dl', //m

View file

@ -225,7 +225,7 @@ Ls.grc = {
"ct_grid": '田 το πλέγμα',
"ct_ttips": '◔ ◡ ◔"> συμβουλές εργαλείων',
"ct_thumb": 'σε προβολή πλέγματος, εναλλαγή εικονιδίων ή μικρογραφιών$NΠλήκτρο συντόμευσης: T">🖼️ μικρογραφίες',
"ct_thumb": 'εναλλαγή εικονιδίων ή μικρογραφιών$NΠλήκτρο συντόμευσης: T">🖼️ μικρογραφίες',
"ct_csel": 'χρησιμοποίησε CTRL και SHIFT για επιλογή αρχείων σε προβολή πλέγματος">επιλογή',
"ct_dsel": 'χρησιμοποίησε επιλογή με σύρσιμο σε προβολή πλέγματος">σύρσιμο', //m
"ct_dl": 'εξαναγκασμός λήψης (να μην εμφανίζεται ενσωματωμένα) όταν γίνεται κλικ σε ένα αρχείο">dl', //m

View file

@ -226,7 +226,7 @@ Ls.hun = {
"ct_grid": '田 rács nézet',
"ct_ttips": '◔ ◡ ◔"> segítő szövegek',
"ct_thumb": 'rács nézetben ikonok/indexképek váltása$Ngyorsbillentyű: T">🖼️ képek',
"ct_thumb": 'ikonok/indexképek váltása$Ngyorsbillentyű: T">🖼️ képek',
"ct_csel": 'kijelölés CTRL és SHIFT gombokkal rács nézetben">kijelölés',
"ct_dsel": 'kijelölés egérhúzással rács nézetben">húzás',
"ct_dl": 'azonnali letöltés (beágyazás helyett)">letöltés',

View file

@ -225,7 +225,7 @@ Ls.ita = {
"ct_grid": '田 griglia',
"ct_ttips": '◔ ◡ ◔"> tooltip',
"ct_thumb": 'nella vista griglia, alterna icone o miniature$NTasto rapido: T">🖼️ miniature',
"ct_thumb": 'alterna icone o miniature$NTasto rapido: T">🖼️ miniature',
"ct_csel": 'usa CTRL e SHIFT per la selezione file nella vista griglia">sel',
"ct_dsel": 'usa la selezione tramite trascinamento nella vista griglia">trascina', //m
"ct_dl": 'forza il download (non visualizzare inline) quando si clicca su un file">dl', //m

View file

@ -225,7 +225,7 @@ Ls.jpn = {
"ct_grid": '田 グリッド',
"ct_ttips": '◔ ◡ ◔"> ツールチップ',
"ct_thumb": 'グリッドビューではアイコンまたはサムネイルを切り替える$Nホットキー: T">🖼️ サムネイル',
"ct_thumb": 'アイコンまたはサムネイルを切り替える$Nホットキー: T">🖼️ サムネイル',
"ct_csel": 'グリッドビューでファイルを選択するにはCtrlとShiftを使用する。">選択',
"ct_dsel": 'グリッドビューでドラッグ選択を使用する。">ドラッグ', //m
"ct_dl": 'ファイルをクリックしたときに強制的にダウンロードする(インラインで表示しない)">dl',

View file

@ -225,7 +225,7 @@ Ls.kor = {
"ct_grid": "田 그리드",
"ct_ttips": '◔ ◡ ◔"> 도움말',
"ct_thumb": '그리드 보기에서 아이콘 또는 미리보기 이미지 전환$N단축키: T">🖼️ 미리보기',
"ct_thumb": '아이콘 또는 미리보기 이미지 전환$N단축키: T">🖼️ 미리보기',
"ct_csel": '그리드 보기에서 CTRL과 SHIFT를 사용하여 파일 선택">선택',
"ct_dsel": '그리드 보기에서 드래그 선택 사용">드래그', //m
"ct_dl": '파일을 클릭하면 다운로드를 강제로 수행 (인라인으로 표시하지 않음)">dl', //m

View file

@ -225,7 +225,7 @@ Ls.nld = {
"ct_grid": '田 grid',
"ct_ttips": '◔ ◡ ◔"> tooltips',
"ct_thumb": 'In grid-overzicht, wissel tussen iconen of thumbnails$NHotkey: T">🖼️ thumbs',
"ct_thumb": 'wissel tussen iconen of thumbnails$NHotkey: T">🖼️ thumbs',
"ct_csel": 'Gebruik CTRL en SHIFT voor de bestand selectie in grid-overzicht>sel',
"ct_dsel": 'Gebruik slepen om te selecteren in grid-overzicht>slepen', //m
"ct_dl": 'download afdwingen (niet inline weergeven) wanneer op een bestand wordt geklikt">dl', //m

View file

@ -222,7 +222,7 @@ Ls.nor = {
"ct_grid": '田 ikoner',
"ct_ttips": 'vis hjelpetekst ved å holde musen over ting"> tips',
"ct_thumb": 'vis miniatyrbilder istedenfor ikoner$NSnarvei: T">🖼️ bilder',
"ct_thumb": 'vis miniatyrbilder isteden for ikoner$NSnarvei: T">🖼️ bilder',
"ct_csel": 'bruk tastene CTRL og SHIFT for markering av filer i ikonvisning">merk',
"ct_dsel": 'marker filer med klikk-og-dra i ikonvisning">dsel',
"ct_dl": 'last ned filer (ikke vis i nettleseren)">dl',

View file

@ -228,7 +228,7 @@ Ls.pol = {
"ct_grid": '田 siatka',
"ct_ttips": '◔ ◡ ◔"> podpowiedzi',
"ct_thumb": 'w widoku siatki, przełącz ikony i miniaturki$NSkrót: T">🖼️ miniaturki',
"ct_thumb": 'przełącz ikony i miniaturki$NSkrót: T">🖼️ miniaturki',
"ct_csel": 'użyj CTRL i SHIFT do wybierania plików w widoku siatki">wybierz',
"ct_dsel": 'użyj zaznaczania przez przeciąganie w widoku siatki">przeciągnij', //m
"ct_dl": 'wymuś pobieranie (nie wyświetlaj inline) po kliknięciu pliku">dl', //m

View file

@ -225,7 +225,7 @@ Ls.por = {
"ct_grid": '田 a grade',
"ct_ttips": '◔ ◡ ◔"> dicas de ferramentas',
"ct_thumb": 'na visualização de grade, alternar entre ícones ou miniaturas$NHotkey: T">🖼️ miniaturas',
"ct_thumb": 'alternar entre ícones ou miniaturas$NHotkey: T">🖼️ miniaturas',
"ct_csel": 'usar CTRL e SHIFT para seleção de arquivo na visualização de grade">sel',
"ct_dsel": 'usar seleção por arrasto na visualização de grade">arrastar',
"ct_dl": 'forçar download (não exibir na página) ao clicar em um arquivo">dl',

View file

@ -225,7 +225,7 @@ Ls.rus = {
"ct_grid": '田 сетка',
"ct_ttips": '◔ ◡ ◔"> подсказки',
"ct_thumb": 'переключение между иконками и миниатюрами в режиме сетки$NГорячая клавиша: T">🖼️ миниат.',
"ct_thumb": 'переключение между иконками и миниатюрами$NГорячая клавиша: T">🖼️ миниат.',
"ct_csel": 'держите CTRL или SHIFT для выделения файлов в режиме сетки">выбор',
"ct_dsel": 'использовать выделение перетаскиванием в режиме сетки">перетащить', //m
"ct_dl": 'принудительная загрузка (не показывать встроенно) при щелчке по файлу">dl', //m

View file

@ -224,7 +224,7 @@ Ls.spa = {
"ct_grid": '田 cuadrícula',
"ct_ttips": '◔ ◡ ◔"> tooltips',
"ct_thumb": 'en vista de cuadrícula, alternar iconos o miniaturas$NAtajo: T">🖼️ miniaturas',
"ct_thumb": 'alternar iconos o miniaturas$NAtajo: T">🖼️ miniaturas',
"ct_csel": 'usa CTRL y SHIFT para seleccionar archivos en la vista de cuadrícula">sel',
"ct_dsel": 'usa la selección por arrastre en la vista de cuadrícula">arrastrar', //m
"ct_dl": 'forzar descarga (no mostrar en línea) al hacer clic en un archivo">dl', //m

View file

@ -225,7 +225,7 @@ Ls.swe = {
"ct_grid": '田 rutnätet',
"ct_ttips": '◔ ◡ ◔"> tips',
"ct_thumb": 'växla mellan miniatyrer och ikoner i rutnätsvyn$NSnabbtangent: T">🖼️ miniatyrer',
"ct_thumb": 'växla mellan miniatyrer och ikoner$NSnabbtangent: T">🖼️ miniatyrer',
"ct_csel": 'använd CTRL och SKIFT för urval av filer i rutnätsvyn">val',
"ct_dsel": 'använd dra-urval i rutnätsvyn">dra', //m
"ct_dl": 'tvinga nedladdning (visa inte inline) när en fil klickas">dl', //m

View file

@ -225,7 +225,7 @@ Ls.tur = {
"ct_grid": '田 ızgara',
"ct_ttips": '◔ ◡ ◔"> ipuçları',
"ct_thumb": 'ızgara görünümünde, simgeler ve küçük resimler arasında geçiş yapın$NKısayol: T">🖼️ küçük resimler',
"ct_thumb": 'simgeler ve küçük resimler arasında geçiş yapın$NKısayol: T">🖼️ küçük resimler',
"ct_csel": 'ızgara görünümünde dosya seçimi için CTRL ve SHIFT tuşlarını kullanın">seç',
"ct_dsel": 'ızgara görünümünde sürükleyerek seçimi kullanın">sürükle', //m
"ct_dl": 'dosyaya tıklandığında indirmeyi zorla (satır içinde görüntüleme)">dl', //m

View file

@ -225,7 +225,7 @@ Ls.ukr = {
"ct_grid": '田 сітка',
"ct_ttips": '◔ ◡ ◔"> підказки',
"ct_thumb": 'у режимі сітки, перемкнути іконки або мініатюри$NГаряча клавіша: T">🖼️ мініатюри',
"ct_thumb": 'перемкнути іконки або мініатюри$NГаряча клавіша: T">🖼️ мініатюри',
"ct_csel": 'використовувати CTRL і SHIFT для вибору файлів у режимі сітки">вибір',
"ct_dsel": 'використовувати вибір перетягуванням у режимі сітки">перетягнути', //m
"ct_dl": 'примусове завантаження (не показувати вбудовано) під час натискання на файл">dl', //m

View file

@ -226,7 +226,7 @@ Ls.vie = {
// settings / tuỳ chọn
"ct_grid": '田 chế độ lưới',
"ct_ttips": '༼ ◕_◕ ༽"> tooltips',
"ct_thumb": 'ở chế độ lưới, chuyển biểu tượng hoặc hình thu nhỏ$NPhím tắt: T">🖼️ ảnh thu nhỏ',
"ct_thumb": 'chuyển biểu tượng hoặc hình thu nhỏ$NPhím tắt: T">🖼️ ảnh thu nhỏ',
"ct_csel": 'dùng CTRL và SHIFT để chọn tệp trong chế độ lưới">sel',
"ct_dsel": 'dùng chọn bằng cách kéo trong chế độ lưới">kéo', //m
"ct_dl": 'cưỡng chế tải xuống (không hiện thị trong dòng) khi nhấp vào tệp">dl',

View file

@ -62,7 +62,6 @@
* more consistent areas for clicking to navigate left / right in the image viewer (they don't depend on image fill mode anymore)
* "folder up" / "next sibling" / "previous sibling" are now icon buttons at the top
* new look for the login screen
* file list makes it easier to identify folders via an added folder emoji to folder names. to disable this, add the following style: `tr:has(a.dir) td:nth-child(2) a::before { display: none; }`
* pm-monokai theme has become "flat dark"
## 🌠 fun facts

View file

@ -256,7 +256,7 @@ Ls.hmn = {
"ct_grid": '田 the grid',
"ct_ttips": '◔ ◡ ◔"> tooltips',
"ct_thumb": 'in grid-view, toggle icons or thumbnails$NHotkey: T">🖼️ thumbs',
"ct_thumb": 'toggle icons or thumbnails$NHotkey: T">🖼️ thumbs',
"ct_csel": 'use CTRL and SHIFT for file selection in grid-view">sel',
"ct_dsel": 'use drag-selection in grid-view">dsel',
"ct_dl": 'force download (don\'t display inline) when a file is clicked">dl',