From 0f038122021695a95798e27356dbf366629cdd6c Mon Sep 17 00:00:00 2001 From: Til Schmitter Date: Sat, 13 Jun 2026 10:57:39 +0200 Subject: [PATCH] thumbnails in list view --- copyparty/web/baguettebox.js | 7 +- copyparty/web/browser.css | 64 +++++++-- copyparty/web/browser.js | 242 ++++++++++++++++++----------------- copyparty/web/shares.css | 2 +- copyparty/web/tl/chi.js | 2 +- copyparty/web/tl/cze.js | 2 +- copyparty/web/tl/deu.js | 2 +- copyparty/web/tl/epo.js | 2 +- copyparty/web/tl/fin.js | 2 +- copyparty/web/tl/fra.js | 2 +- copyparty/web/tl/grc.js | 2 +- copyparty/web/tl/hun.js | 2 +- copyparty/web/tl/ita.js | 2 +- copyparty/web/tl/jpn.js | 2 +- copyparty/web/tl/kor.js | 2 +- copyparty/web/tl/nld.js | 2 +- copyparty/web/tl/nor.js | 2 +- copyparty/web/tl/pol.js | 2 +- copyparty/web/tl/por.js | 2 +- copyparty/web/tl/rus.js | 2 +- copyparty/web/tl/spa.js | 2 +- copyparty/web/tl/swe.js | 2 +- copyparty/web/tl/tur.js | 2 +- copyparty/web/tl/ukr.js | 2 +- copyparty/web/tl/vie.js | 2 +- docs/changelog.md | 1 - scripts/tl.js | 2 +- 27 files changed, 204 insertions(+), 156 deletions(-) diff --git a/copyparty/web/baguettebox.js b/copyparty/web/baguettebox.js index e9ffdb70..48301a00 100644 --- a/copyparty/web/baguettebox.js +++ b/copyparty/web/baguettebox.js @@ -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]; diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css index 42d7047e..f24d099c 100644 --- a/copyparty/web/browser.css +++ b/copyparty/web/browser.css @@ -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; } @@ -708,6 +709,7 @@ html.y #path { display: block; padding: .5em; scroll-margin-top: 45vh; + border-radius: var(--radius); } #files tr { scroll-margin-top: 25vh; @@ -742,6 +744,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 +789,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 +843,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 +1048,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 +1114,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 +1136,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; @@ -2197,7 +2198,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 +2502,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 +2581,6 @@ html.b .btn { padding: 0; } .disabled, -#thumbs, #au_prescan, #au_fullpre, #au_os_seek, @@ -2556,7 +2594,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 +5274,8 @@ html.e #tree_footer { background: transparent; } html.e #wrap { - padding: 0; + padding-left: 0; + padding-right: 0; } html.e #pathBar { padding: 0; diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 425d08e3..a6c53ee5 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -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 = ( '

✅ ' + L.cl_opts + '

\n' + '
\n' + ' ' + L.ct_grid + '\n' + ' ' + L.ct_grid + '\n' + ' td:nth-child(2)>a[id]"), + var files = QSA("#files tr>td:nth-child(3)>a[id]"), 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 = tds[2].getElementsByTagName('a'); 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 tbody td:nth-child(3) a'); 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>tbody>tr>td:nth-child(3) a[id]'); 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 = ''; - svg = '' + svg + ''; - - if (N3DS){ - // 3DS / unsupported: use fallback - svg = '' + (isdir ? '📁[FOLDER]' : '📄[FILE:' + ext + ']') + ''; - ext = 'unk'; - } + ac = ao.parentElement.parentElement.classList; html.push('' + - '
' + - '' + - svg + - (isdir || ext == 'unk' || ext.startsWith('/') ? '' : - '' + ext + '') + - '
' + ao.innerHTML + '
'); + get_thumb(ohref, ref, isdir, true) + + '' + ao.innerHTML + ''); } 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 = ''; + svg = '' + svg + ''; + + if (N3DS){ + // 3DS / unsupported: use fallback + svg = '' + (isdir ? '📁[FOLDER]' : '📄[FILE:' + ext + ']') + ''; + ext = 'unk'; + } + + var container = '
' + + (grid ? '' : '') + + svg + + (isdir || ext == 'unk' || ext.startsWith('/') ? '' : + '' + ext + '') + + '
' + return container; +} + function th_onload(el) { set_loaded(el, true, false) } @@ -8628,8 +8640,9 @@ var treectl = (function () { '" hl="' + id + '" name="' + hname + '">-txt-'; var cl = (/\.PARTIAL$/.exec(fname) ? 'fade ' : '') + (img_re.exec(fname) ? 'img ' : '') + (tn.cls || ''), - ln = ['' + tn.lead + '' + hname + + ln = ['' + tn.lead + '' + + get_thumb(tn.href, id, (/\bdir\b/i).test(cl), false) + + '' + hname + '' + 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); }; @@ -9173,6 +9186,7 @@ function mk_files_header(taglist) { var html = [ '', '!', + 'th', 'File Name', 'Size' ]; @@ -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 tbody td:nth-child(3) a:last-child'), 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 td:nth-child(3) a[id]') 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); } @@ -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("td:nth-child(3) a")).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("td:nth-child(3) a").href.split("?")); current = e.target; r.no_warn = true; diff --git a/copyparty/web/shares.css b/copyparty/web/shares.css index 0a69260d..755ac2df 100644 --- a/copyparty/web/shares.css +++ b/copyparty/web/shares.css @@ -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, diff --git a/copyparty/web/tl/chi.js b/copyparty/web/tl/chi.js index 6298f8ea..426a97cd 100644 --- a/copyparty/web/tl/chi.js +++ b/copyparty/web/tl/chi.js @@ -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": '点击文件时强制下载(不要就地显示)">下载', diff --git a/copyparty/web/tl/cze.js b/copyparty/web/tl/cze.js index cd94c269..095113a5 100644 --- a/copyparty/web/tl/cze.js +++ b/copyparty/web/tl/cze.js @@ -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 diff --git a/copyparty/web/tl/deu.js b/copyparty/web/tl/deu.js index 00ccf05f..ffe6ccda 100644 --- a/copyparty/web/tl/deu.js +++ b/copyparty/web/tl/deu.js @@ -225,7 +225,7 @@ Ls.deu = { "ct_grid": '田 Das Raster™', "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', diff --git a/copyparty/web/tl/epo.js b/copyparty/web/tl/epo.js index 1828ab96..962b2be3 100644 --- a/copyparty/web/tl/epo.js +++ b/copyparty/web/tl/epo.js @@ -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', diff --git a/copyparty/web/tl/fin.js b/copyparty/web/tl/fin.js index 3d5d074b..2e973d4b 100644 --- a/copyparty/web/tl/fin.js +++ b/copyparty/web/tl/fin.js @@ -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', diff --git a/copyparty/web/tl/fra.js b/copyparty/web/tl/fra.js index bdb05b46..04a323f7 100644 --- a/copyparty/web/tl/fra.js +++ b/copyparty/web/tl/fra.js @@ -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) lorsqu’un fichier est cliqué">dl', //m diff --git a/copyparty/web/tl/grc.js b/copyparty/web/tl/grc.js index 7000176c..79e26e66 100644 --- a/copyparty/web/tl/grc.js +++ b/copyparty/web/tl/grc.js @@ -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 diff --git a/copyparty/web/tl/hun.js b/copyparty/web/tl/hun.js index b9404c82..9f2ada68 100644 --- a/copyparty/web/tl/hun.js +++ b/copyparty/web/tl/hun.js @@ -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', diff --git a/copyparty/web/tl/ita.js b/copyparty/web/tl/ita.js index 86639777..88266276 100644 --- a/copyparty/web/tl/ita.js +++ b/copyparty/web/tl/ita.js @@ -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 diff --git a/copyparty/web/tl/jpn.js b/copyparty/web/tl/jpn.js index 5d616c33..d3305679 100644 --- a/copyparty/web/tl/jpn.js +++ b/copyparty/web/tl/jpn.js @@ -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', diff --git a/copyparty/web/tl/kor.js b/copyparty/web/tl/kor.js index cfc1f510..b1a8eb4f 100644 --- a/copyparty/web/tl/kor.js +++ b/copyparty/web/tl/kor.js @@ -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 diff --git a/copyparty/web/tl/nld.js b/copyparty/web/tl/nld.js index 0a6d1186..9f9197d7 100644 --- a/copyparty/web/tl/nld.js +++ b/copyparty/web/tl/nld.js @@ -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 diff --git a/copyparty/web/tl/nor.js b/copyparty/web/tl/nor.js index c550de47..7dd25ea8 100644 --- a/copyparty/web/tl/nor.js +++ b/copyparty/web/tl/nor.js @@ -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', diff --git a/copyparty/web/tl/pol.js b/copyparty/web/tl/pol.js index 949a0640..4725bb1e 100644 --- a/copyparty/web/tl/pol.js +++ b/copyparty/web/tl/pol.js @@ -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 diff --git a/copyparty/web/tl/por.js b/copyparty/web/tl/por.js index 99515fff..a061318b 100644 --- a/copyparty/web/tl/por.js +++ b/copyparty/web/tl/por.js @@ -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', diff --git a/copyparty/web/tl/rus.js b/copyparty/web/tl/rus.js index d59aeaa1..3768899a 100644 --- a/copyparty/web/tl/rus.js +++ b/copyparty/web/tl/rus.js @@ -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 diff --git a/copyparty/web/tl/spa.js b/copyparty/web/tl/spa.js index 8590b675..182cff33 100644 --- a/copyparty/web/tl/spa.js +++ b/copyparty/web/tl/spa.js @@ -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 diff --git a/copyparty/web/tl/swe.js b/copyparty/web/tl/swe.js index 0b2fcfd1..4b96e2d0 100644 --- a/copyparty/web/tl/swe.js +++ b/copyparty/web/tl/swe.js @@ -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 diff --git a/copyparty/web/tl/tur.js b/copyparty/web/tl/tur.js index 7fc3d468..4c7723f0 100644 --- a/copyparty/web/tl/tur.js +++ b/copyparty/web/tl/tur.js @@ -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 diff --git a/copyparty/web/tl/ukr.js b/copyparty/web/tl/ukr.js index 4ca0cdec..4b0fc1a1 100644 --- a/copyparty/web/tl/ukr.js +++ b/copyparty/web/tl/ukr.js @@ -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 diff --git a/copyparty/web/tl/vie.js b/copyparty/web/tl/vie.js index 476fbcda..f6575e0b 100644 --- a/copyparty/web/tl/vie.js +++ b/copyparty/web/tl/vie.js @@ -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', diff --git a/docs/changelog.md b/docs/changelog.md index f9da092d..4ceeaa29 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -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 diff --git a/scripts/tl.js b/scripts/tl.js index 06013c0a..f78faf4b 100644 --- a/scripts/tl.js +++ b/scripts/tl.js @@ -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',