diff --git a/README.md b/README.md
index 6ee8729b..6aa3a705 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,7 @@ turn your phone or raspi into a portable file server with resumable uploads/down
* [file parser plugins](#file-parser-plugins) - provide custom parsers to index additional tags, also see [./bin/mtag/README.md](./bin/mtag/README.md)
* [upload events](#upload-events) - trigger a script/program on each upload
* [hiding from google](#hiding-from-google) - tell search engines you dont wanna be indexed
+ * [themes](#themes)
* [complete examples](#complete-examples)
* [browser support](#browser-support) - TLDR: yes
* [client examples](#client-examples) - interact with copyparty using non-browser clients
@@ -247,6 +248,8 @@ some improvement ideas
## not my bugs
+* [Chrome issue 1317069](https://bugs.chromium.org/p/chromium/issues/detail?id=1317069) -- if you try to upload a folder which contains symlinks by dragging it into the browser, the symlinked files will not get uploaded
+
* iPhones: the volume control doesn't work because [apple doesn't want it to](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html#//apple_ref/doc/uid/TP40009523-CH5-SW11)
* *future workaround:* enable the equalizer, make it all-zero, and set a negative boost to reduce the volume
* "future" because `AudioContext` is broken in the current iOS version (15.1), maybe one day...
@@ -808,22 +811,23 @@ also, `--force-js` disables the plain HTML folder listing, making things harder
## themes
-you can add your own themes by modifying `browser.css` or providing your own css to `--css-browser`
+you can add your own themes by modifying `browser.css` or providing your own css to `--css-browser`, then telling copyparty they exist by increasing `--themes`
-
-
-currently there is four themes,
-* classic dark/light
-* flat dark/light
-* vice
-* [hotdog stand](https://blog.codinghorror.com/a-tribute-to-the-windows-31-hot-dog-stand-color-scheme/)
+
+0. classic dark |
+2. flat dark |
+4. vice |
+1. classic light |
+3. flat light
+ |
+5. hotdog stand |
the classname of the HTML tag is set according to the selected theme, which is used to set colors as css variables ++
* each theme *generally* has a dark theme (even numbers) and a light theme (odd numbers), showing in pairs
* the first theme (theme 0 and 1) is `html.a`, second theme (2 and 3) is `html.b`
* if a light theme is selected, `html.y` is set, otherwise `html.z` is
-* additionally, if the dark edition of the 2nd theme is selected, `html.bz` is set
+* so if the dark edition of the 2nd theme is selected, you use any of `html.b`, `html.z`, `html.bz` to specify rules
see the top of [./copyparty/web/browser.css](./copyparty/web/browser.css) where the color variables are set, and there's layout-specific stuff near the bottom
diff --git a/copyparty/__main__.py b/copyparty/__main__.py
index 404794a3..e44bf73c 100644
--- a/copyparty/__main__.py
+++ b/copyparty/__main__.py
@@ -485,7 +485,7 @@ def run_argparse(argv, formatter):
ap2.add_argument("--no-logues", action="store_true", help="disable rendering .prologue/.epilogue.html into directory listings")
ap2.add_argument("--no-readme", action="store_true", help="disable rendering readme.md into directory listings")
ap2.add_argument("--vague-403", action="store_true", help="send 404 instead of 403 (security through ambiguity, very enterprise)")
- ap2.add_argument("--force-js", action="store_true", help="don't send HTML folder listings, force clients to use the embedded json instead -- slight protection against misbehaving search engines which ignore --no-robots")
+ ap2.add_argument("--force-js", action="store_true", help="don't send folder listings as HTML, force clients to use the embedded json instead -- slight protection against misbehaving search engines which ignore --no-robots")
ap2.add_argument("--no-robots", action="store_true", help="adds http and html headers asking search engines to not index anything")
ap2 = ap.add_argument_group('yolo options')
diff --git a/copyparty/web/browser.css b/copyparty/web/browser.css
index ade0dc95..abb020d6 100644
--- a/copyparty/web/browser.css
+++ b/copyparty/web/browser.css
@@ -927,8 +927,8 @@ html.y #widget.open {
}
html.b #barpos,
html.b #barbuf {
- width: calc(100% - 19.5em);
- left: 8.5em;
+ width: calc(100% - 19em);
+ left: 8em;
}
#widget {
bottom: -3.2em;
@@ -937,6 +937,12 @@ html.y #widget.open {
#pvol {
max-width: 9em;
}
+ html.b #ops {
+ padding-left: 1.7em;
+ }
+ html.b #path {
+ padding-left: 1.3em;
+ }
}
@media (max-width: 35em) {
#ops>a[data-dest="new_md"],
@@ -2237,6 +2243,9 @@ html.a #pctl a {
margin-right: .5em;
box-shadow: -.02em -.02em .3em rgba(0,0,0,0.2) inset;
}
+html.b #pctl {
+ left: .5em;
+}
html.c #ops,
html.a #ops {
margin: 1.7em 1.5em 0 1.5em;
@@ -2372,7 +2381,8 @@ html.ay #tree {
html.b #path {
- margin: 1.3em 0;
+ margin: 1.3em 0 1.4em 0;
+ line-height: 1.7em;
}
html.b.op_open #path {
margin-top: .2em;
@@ -2406,9 +2416,10 @@ html.by #barpos {
box-shadow: 0 0 0 1px rgba(0,0,0,0.2) inset;
}
html.b #ops {
+ max-width: 1em;
+ margin-bottom: 2em;
position: relative;
z-index: 2;
- max-width: calc(100% - 10em);
}
html.b #ops a {
background: var(--bg);
@@ -2422,8 +2433,11 @@ html.b #srch_q {
html.b #srch_q:empty {
margin-bottom: -1em;
}
+html.b #op_up2k {
+ margin-top: 3em;
+}
html.b #wrap {
- margin-top: .3em;
+ margin-top: 2em;
}
html.b #tree {
box-shadow: 0 -1px 0 rgba(128,128,128,0.4);
diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js
index 3f5899b4..16f38894 100644
--- a/copyparty/web/browser.js
+++ b/copyparty/web/browser.js
@@ -5104,7 +5104,7 @@ var unpost = (function () {
html.push(" | time | size | file |
");
}
else
- html.push("sike! no uploads " + (filt.value ? 'matching that filter' : '') + " are sufficiently recent
");
+ html.push("sike! no uploads " + (filt.value ? 'matching that filter' : '') + " are sufficiently recent");
var mods = [1000, 100, 10];
for (var a = 0; a < res.length; a++) {