From 9569666259a71d12438d4484ce9fc43309fea99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Wed, 17 Feb 2021 21:58:04 -0800 Subject: [PATCH] Use embed package for CSS bundles instead of generated files --- cli/cli.go | 10 +++++++ generate.go | 29 ------------------- go.mod | 3 +- go.sum | 8 ++++++ main.go | 1 - ui/static/css.go | 21 -------------- ui/static/static.go | 63 +++++++++++++++++++++++++++++++++++++++-- ui/static_stylesheet.go | 4 +-- ui/view/view.go | 2 +- 9 files changed, 83 insertions(+), 58 deletions(-) delete mode 100644 ui/static/css.go diff --git a/cli/cli.go b/cli/cli.go index 0607bd87..5d038ad5 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -13,6 +13,7 @@ import ( "miniflux.app/locale" "miniflux.app/logger" "miniflux.app/storage" + "miniflux.app/ui/static" "miniflux.app/version" ) @@ -106,6 +107,15 @@ func Parse() { logger.Fatal("Unable to load translations: %v", err) } + logger.Debug("Loading static assets...") + if err := static.CalculateBinaryFileChecksums(); err != nil { + logger.Fatal("Unable to calculate binary files checksum: %v", err) + } + + if err := static.GenerateStylesheetsBundles(); err != nil { + logger.Fatal("Unable to generate stylesheet bundles: %v", err) + } + db, err := database.NewConnectionPool( config.Opts.DatabaseURL(), config.Opts.DatabaseMinConns(), diff --git a/generate.go b/generate.go index 9980577f..a44cd176 100644 --- a/generate.go +++ b/generate.go @@ -16,7 +16,6 @@ import ( "text/template" "github.com/tdewolff/minify/v2" - "github.com/tdewolff/minify/v2/css" "github.com/tdewolff/minify/v2/js" ) @@ -133,25 +132,6 @@ func generateJSBundle(bundleFile string, bundleFiles map[string][]string, prefix bundle.Write(bundleFile) } -func generateCSSBundle(bundleFile string, themes map[string][]string) { - bundle := NewBundle("static", "Stylesheets", "ui/static") - m := minify.New() - m.AddFunc("text/css", css.Minify) - - for theme, srcFiles := range themes { - data := concat(srcFiles) - minifiedData, err := m.String("text/css", data) - if err != nil { - panic(err) - } - - bundle.Files[theme] = minifiedData - bundle.Checksums[theme] = checksum([]byte(minifiedData)) - } - - bundle.Write(bundleFile) -} - func generateBundle(bundleFile, pkg, mapName string, srcFiles []string) { bundle := NewBundle(pkg, mapName, pkg) @@ -187,15 +167,6 @@ func main() { "app": "})();", }) - generateCSSBundle("ui/static/css.go", map[string][]string{ - "light_serif": []string{"ui/static/css/light.css", "ui/static/css/serif.css", "ui/static/css/common.css"}, - "light_sans_serif": []string{"ui/static/css/light.css", "ui/static/css/sans_serif.css", "ui/static/css/common.css"}, - "dark_serif": []string{"ui/static/css/dark.css", "ui/static/css/serif.css", "ui/static/css/common.css"}, - "dark_sans_serif": []string{"ui/static/css/dark.css", "ui/static/css/sans_serif.css", "ui/static/css/common.css"}, - "system_serif": []string{"ui/static/css/system.css", "ui/static/css/serif.css", "ui/static/css/common.css"}, - "system_sans_serif": []string{"ui/static/css/system.css", "ui/static/css/sans_serif.css", "ui/static/css/common.css"}, - }) - generateBundle("template/views.go", "template", "templateViewsMap", glob("template/html/*.html")) generateBundle("template/common.go", "template", "templateCommonMap", glob("template/html/common/*.html")) } diff --git a/go.mod b/go.mod index 808368e0..09f501a5 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,8 @@ require ( github.com/prometheus/client_golang v1.9.0 github.com/rylans/getlang v0.0.0-20200505200108-4c3188ff8a2d github.com/stretchr/testify v1.6.1 // indirect - github.com/tdewolff/minify/v2 v2.9.11 // indirect + github.com/tdewolff/minify/v2 v2.9.13 + github.com/tdewolff/parse v2.3.4+incompatible // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/net v0.0.0-20201029221708-28c70e62bb1d golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d diff --git a/go.sum b/go.sum index 5ed192b2..74770982 100644 --- a/go.sum +++ b/go.sum @@ -378,10 +378,18 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tdewolff/minify v1.1.0 h1:nxHQi1ML+g3ZbZHffiZ6eC7vMqNvSRfX3KB5Y5y/kfw= github.com/tdewolff/minify v2.3.6+incompatible h1:2hw5/9ZvxhWLvBUnHE06gElGYz+Jv9R4Eys0XUzItYo= +github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs= github.com/tdewolff/minify/v2 v2.9.11 h1:8o6hclGwxm6MNwTPHabvdND5SghhHs0bn+3/+uAf0yQ= github.com/tdewolff/minify/v2 v2.9.11/go.mod h1:YZk0lGOc6CvQrqvm5f7V3ihaq3QUd9acS4HESdVDOaM= +github.com/tdewolff/minify/v2 v2.9.13 h1:RrwQhgGoYBhKN/ezStGB+crU64wPK1ZE5Jmkl63lif0= +github.com/tdewolff/minify/v2 v2.9.13/go.mod h1:faNOp+awAoo+fhFHD+NAkBOaXBAvJI2X2SDERGKnARo= +github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxpP46ghf0Qzh38= +github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ= github.com/tdewolff/parse/v2 v2.5.8 h1:vutkOO9Xi3DehIzCLHqvMM2hFXo54S0iDvIG/hYznnE= github.com/tdewolff/parse/v2 v2.5.8/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= +github.com/tdewolff/parse/v2 v2.5.10 h1:vj35n+ljq8LuYUx436s4qB18wuwP7thrLv+t1syE39M= +github.com/tdewolff/parse/v2 v2.5.10/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= +github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= diff --git a/main.go b/main.go index b74ed399..f162afb9 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ package main // import "miniflux.app" //go:generate go run generate.go -//go:generate gofmt -s -w ui/static/css.go //go:generate gofmt -s -w ui/static/js.go //go:generate gofmt -s -w template/views.go //go:generate gofmt -s -w template/common.go diff --git a/ui/static/css.go b/ui/static/css.go deleted file mode 100644 index 082ad05f..00000000 --- a/ui/static/css.go +++ /dev/null @@ -1,21 +0,0 @@ -// Code generated by go generate; DO NOT EDIT. - -package static // import "miniflux.app/ui/static" - -var Stylesheets = map[string]string{ - "dark_sans_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#efefef;--body-background:#222;--hr-border-color:#555;--title-color:#aaa;--link-color:#aaa;--link-focus-color:#ddd;--link-hover-color:#ddd;--header-list-border-color:#333;--header-link-color:#ddd;--header-link-focus-color:rgba(82, 168, 236, 0.85);--header-link-hover-color:rgba(82, 168, 236, 0.85);--header-active-link-color:#9b9494;--page-header-title-color:#aaa;--page-header-title-border-color:#333;--logo-color:#bbb;--logo-hover-color-span:#bbb;--table-border-color:#555;--table-th-background:#333;--table-th-color:#aaa;--table-tr-hover-background-color:#333;--table-tr-hover-color:#aaa;--button-primary-border-color:#444;--button-primary-background:#333;--button-primary-color:#efefef;--button-primary-focus-border-color:#888;--button-primary-focus-background:#555;--input-border:1px solid #555;--input-background:#333;--input-color:#ccc;--input-placeholder-color:#666;--input-focus-color:#efefef;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#efefef;--alert-background-color:#333;--alert-border-color:#444;--alert-success-color:#efefef;--alert-success-background-color:#333;--alert-success-border-color:#444;--alert-error-color:#efefef;--alert-error-background-color:#333;--alert-error-border-color:#444;--alert-info-color:#efefef;--alert-info-background-color:#333;--alert-info-border-color:#444;--panel-background:#333;--panel-border-color:#555;--panel-color:#9b9b9b;--modal-background:#333;--modal-color:#efefef;--modal-box-shadow:0 0 10px rgba(82, 168, 236, 0.6);--pagination-link-color:#aaa;--pagination-border-color:#333;--category-color:#efefef;--category-background-color:#333;--category-border-color:#444;--category-link-color:#999;--category-link-hover-color:#aaa;--item-border-color:#666;--item-padding:4px;--item-title-link-font-weight:400;--item-status-read-title-link-color:#666;--item-status-read-title-focus-color:rgba(82, 168, 236, 0.6);--item-meta-focus-color:#aaa;--item-meta-li-color:#ddd;--current-item-border-width:2px;--current-item-border-color:rgba(82, 168, 236, 0.8);--current-item-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--entry-header-border-color:#333;--entry-header-title-link-color:#bbb;--entry-content-color:#999;--entry-content-code-color:#fff;--entry-content-code-background:#555;--entry-content-code-border-color:#888;--entry-content-quote-color:#777;--entry-content-abbr-border-color:#777;--entry-enclosure-border-color:#333;--parsing-error-color:#eee;--feed-parsing-error-background-color:#343434;--keyboard-shortcuts-li-color:#9b9b9b;--counter-color:#bbb}:root{--entry-content-font-weight:400;--entry-content-font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, - "dark_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#efefef;--body-background:#222;--hr-border-color:#555;--title-color:#aaa;--link-color:#aaa;--link-focus-color:#ddd;--link-hover-color:#ddd;--header-list-border-color:#333;--header-link-color:#ddd;--header-link-focus-color:rgba(82, 168, 236, 0.85);--header-link-hover-color:rgba(82, 168, 236, 0.85);--header-active-link-color:#9b9494;--page-header-title-color:#aaa;--page-header-title-border-color:#333;--logo-color:#bbb;--logo-hover-color-span:#bbb;--table-border-color:#555;--table-th-background:#333;--table-th-color:#aaa;--table-tr-hover-background-color:#333;--table-tr-hover-color:#aaa;--button-primary-border-color:#444;--button-primary-background:#333;--button-primary-color:#efefef;--button-primary-focus-border-color:#888;--button-primary-focus-background:#555;--input-border:1px solid #555;--input-background:#333;--input-color:#ccc;--input-placeholder-color:#666;--input-focus-color:#efefef;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#efefef;--alert-background-color:#333;--alert-border-color:#444;--alert-success-color:#efefef;--alert-success-background-color:#333;--alert-success-border-color:#444;--alert-error-color:#efefef;--alert-error-background-color:#333;--alert-error-border-color:#444;--alert-info-color:#efefef;--alert-info-background-color:#333;--alert-info-border-color:#444;--panel-background:#333;--panel-border-color:#555;--panel-color:#9b9b9b;--modal-background:#333;--modal-color:#efefef;--modal-box-shadow:0 0 10px rgba(82, 168, 236, 0.6);--pagination-link-color:#aaa;--pagination-border-color:#333;--category-color:#efefef;--category-background-color:#333;--category-border-color:#444;--category-link-color:#999;--category-link-hover-color:#aaa;--item-border-color:#666;--item-padding:4px;--item-title-link-font-weight:400;--item-status-read-title-link-color:#666;--item-status-read-title-focus-color:rgba(82, 168, 236, 0.6);--item-meta-focus-color:#aaa;--item-meta-li-color:#ddd;--current-item-border-width:2px;--current-item-border-color:rgba(82, 168, 236, 0.8);--current-item-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--entry-header-border-color:#333;--entry-header-title-link-color:#bbb;--entry-content-color:#999;--entry-content-code-color:#fff;--entry-content-code-background:#555;--entry-content-code-border-color:#888;--entry-content-quote-color:#777;--entry-content-abbr-border-color:#777;--entry-enclosure-border-color:#333;--parsing-error-color:#eee;--feed-parsing-error-background-color:#343434;--keyboard-shortcuts-li-color:#9b9b9b;--counter-color:#bbb}:root{--entry-content-font-weight:300;--entry-content-font-family:Georgia, 'Times New Roman', Times, serif;--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, - "light_sans_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#333;--body-background:#fff;--hr-border-color:#ccc;--title-color:#333;--link-color:#3366CC;--link-focus-color:red;--link-hover-color:#333;--header-list-border-color:#ddd;--header-link-color:#444;--header-link-focus-color:#888;--header-link-hover-color:#888;--header-active-link-color:#444;--page-header-title-color:#333;--page-header-title-border-color:#333;--logo-color:#000;--logo-hover-color-span:#000;--table-border-color:#ddd;--table-th-background:#fcfcfc;--table-th-color:#333;--table-tr-hover-background-color:#f9f9f9;--table-tr-hover-color:#333;--button-primary-border-color:#3079ed;--button-primary-background:#4d90fe;--button-primary-color:#fff;--button-primary-focus-border-color:#2f5bb7;--button-primary-focus-background:#357ae8;--input-border:1px solid #ccc;--input-background:#fff;--input-color:#333;--input-placeholder-color:#d0d0d0;--input-focus-color:#000;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#c09853;--alert-background-color:#fcf8e3;--alert-border-color:#fbeed5;--alert-success-color:#468847;--alert-success-background-color:#dff0d8;--alert-success-border-color:#d6e9c6;--alert-error-color:#b94a48;--alert-error-background-color:#f2dede;--alert-error-border-color:#eed3d7;--alert-info-color:#3a87ad;--alert-info-background-color:#d9edf7;--alert-info-border-color:#bce8f1;--panel-background:#fcfcfc;--panel-border-color:#ddd;--panel-color:#333;--modal-background:#f0f0f0;--modal-color:#333;--modal-box-shadow:2px 0 5px 0 #ccc;--pagination-link-color:#333;--pagination-border-color:#ddd;--category-color:#333;--category-background-color:#fffcd7;--category-border-color:#d5d458;--category-link-color:#000;--category-link-hover-color:#000;--item-border-color:#ddd;--item-padding:5px;--item-title-link-font-weight:600;--item-status-read-title-link-color:#777;--item-status-read-title-focus-color:#777;--item-meta-focus-color:#777;--item-meta-li-color:#aaa;--current-item-border-width:3px;--current-item-border-color:#bce;--current-item-box-shadow:none;--entry-header-border-color:#ddd;--entry-header-title-link-color:#333;--entry-content-color:#555;--entry-content-code-color:#333;--entry-content-code-background:#f0f0f0;--entry-content-code-border-color:#ddd;--entry-content-quote-color:#666;--entry-content-abbr-border-color:#999;--entry-enclosure-border-color:#333;--parsing-error-color:#333;--feed-parsing-error-background-color:#fcf8e3;--keyboard-shortcuts-li-color:#333;--counter-color:#666}:root{--entry-content-font-weight:400;--entry-content-font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, - "light_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#333;--body-background:#fff;--hr-border-color:#ccc;--title-color:#333;--link-color:#3366CC;--link-focus-color:red;--link-hover-color:#333;--header-list-border-color:#ddd;--header-link-color:#444;--header-link-focus-color:#888;--header-link-hover-color:#888;--header-active-link-color:#444;--page-header-title-color:#333;--page-header-title-border-color:#333;--logo-color:#000;--logo-hover-color-span:#000;--table-border-color:#ddd;--table-th-background:#fcfcfc;--table-th-color:#333;--table-tr-hover-background-color:#f9f9f9;--table-tr-hover-color:#333;--button-primary-border-color:#3079ed;--button-primary-background:#4d90fe;--button-primary-color:#fff;--button-primary-focus-border-color:#2f5bb7;--button-primary-focus-background:#357ae8;--input-border:1px solid #ccc;--input-background:#fff;--input-color:#333;--input-placeholder-color:#d0d0d0;--input-focus-color:#000;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#c09853;--alert-background-color:#fcf8e3;--alert-border-color:#fbeed5;--alert-success-color:#468847;--alert-success-background-color:#dff0d8;--alert-success-border-color:#d6e9c6;--alert-error-color:#b94a48;--alert-error-background-color:#f2dede;--alert-error-border-color:#eed3d7;--alert-info-color:#3a87ad;--alert-info-background-color:#d9edf7;--alert-info-border-color:#bce8f1;--panel-background:#fcfcfc;--panel-border-color:#ddd;--panel-color:#333;--modal-background:#f0f0f0;--modal-color:#333;--modal-box-shadow:2px 0 5px 0 #ccc;--pagination-link-color:#333;--pagination-border-color:#ddd;--category-color:#333;--category-background-color:#fffcd7;--category-border-color:#d5d458;--category-link-color:#000;--category-link-hover-color:#000;--item-border-color:#ddd;--item-padding:5px;--item-title-link-font-weight:600;--item-status-read-title-link-color:#777;--item-status-read-title-focus-color:#777;--item-meta-focus-color:#777;--item-meta-li-color:#aaa;--current-item-border-width:3px;--current-item-border-color:#bce;--current-item-box-shadow:none;--entry-header-border-color:#ddd;--entry-header-title-link-color:#333;--entry-content-color:#555;--entry-content-code-color:#333;--entry-content-code-background:#f0f0f0;--entry-content-code-border-color:#ddd;--entry-content-quote-color:#666;--entry-content-abbr-border-color:#999;--entry-enclosure-border-color:#333;--parsing-error-color:#333;--feed-parsing-error-background-color:#fcf8e3;--keyboard-shortcuts-li-color:#333;--counter-color:#666}:root{--entry-content-font-weight:300;--entry-content-font-family:Georgia, 'Times New Roman', Times, serif;--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, - "system_sans_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#333;--body-background:#fff;--hr-border-color:#ccc;--title-color:#333;--link-color:#3366CC;--link-focus-color:red;--link-hover-color:#333;--header-list-border-color:#ddd;--header-link-color:#444;--header-link-focus-color:#888;--header-link-hover-color:#888;--header-active-link-color:#444;--page-header-title-border-color:#333;--logo-color:#000;--logo-hover-color-span:#000;--table-border-color:#ddd;--table-th-background:#fcfcfc;--table-th-color:#333;--table-tr-hover-background-color:#f9f9f9;--table-tr-hover-color:#333;--button-primary-border-color:#3079ed;--button-primary-background:#4d90fe;--button-primary-color:#fff;--button-primary-focus-border-color:#2f5bb7;--button-primary-focus-background:#357ae8;--input-border:1px solid #ccc;--input-background:#fff;--input-color:#333;--input-placeholder-color:#d0d0d0;--input-focus-color:#000;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#c09853;--alert-background-color:#fcf8e3;--alert-border-color:#fbeed5;--alert-success-color:#468847;--alert-success-background-color:#dff0d8;--alert-success-border-color:#d6e9c6;--alert-error-color:#b94a48;--alert-error-background-color:#f2dede;--alert-error-border-color:#eed3d7;--alert-info-color:#3a87ad;--alert-info-background-color:#d9edf7;--alert-info-border-color:#bce8f1;--panel-background:#fcfcfc;--panel-border-color:#ddd;--panel-color:#333;--modal-background:#f0f0f0;--modal-color:#333;--modal-box-shadow:2px 0 5px 0 #ccc;--pagination-link-color:#333;--pagination-border-color:#ddd;--category-color:#333;--category-background-color:#fffcd7;--category-border-color:#d5d458;--category-link-color:#000;--category-link-hover-color:#000;--item-border-color:#ddd;--item-padding:5px;--item-title-link-font-weight:600;--item-status-read-title-link-color:#777;--item-status-read-title-focus-color:#777;--item-meta-focus-color:#777;--item-meta-li-color:#aaa;--current-item-border-width:3px;--current-item-border-color:#bce;--current-item-box-shadow:none;--entry-header-border-color:#ddd;--entry-header-title-link-color:#333;--entry-content-color:#555;--entry-content-code-color:#333;--entry-content-code-background:#f0f0f0;--entry-content-code-border-color:#ddd;--entry-content-quote-color:#666;--entry-content-abbr-border-color:#999;--entry-enclosure-border-color:#333;--parsing-error-color:#333;--feed-parsing-error-background-color:#fcf8e3;--keyboard-shortcuts-li-color:#333;--counter-color:#666}@media(prefers-color-scheme:dark){:root{--body-color:#efefef;--body-background:#222;--hr-border-color:#555;--title-color:#aaa;--link-color:#aaa;--link-focus-color:#ddd;--link-hover-color:#ddd;--header-list-border-color:#333;--header-link-color:#ddd;--header-link-focus-color:rgba(82, 168, 236, 0.85);--header-link-hover-color:rgba(82, 168, 236, 0.85);--header-active-link-color:#9b9494;--page-header-title-border-color:#333;--logo-color:#bbb;--logo-hover-color-span:#bbb;--table-border-color:#555;--table-th-background:#333;--table-th-color:#aaa;--table-tr-hover-background-color:#333;--table-tr-hover-color:#aaa;--button-primary-border-color:#444;--button-primary-background:#333;--button-primary-color:#efefef;--button-primary-focus-border-color:#888;--button-primary-focus-background:#555;--input-border:1px solid #555;--input-background:#333;--input-color:#ccc;--input-placeholder-color:#666;--input-focus-color:#efefef;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#efefef;--alert-background-color:#333;--alert-border-color:#444;--alert-success-color:#efefef;--alert-success-background-color:#333;--alert-success-border-color:#444;--alert-error-color:#efefef;--alert-error-background-color:#333;--alert-error-border-color:#444;--alert-info-color:#efefef;--alert-info-background-color:#333;--alert-info-border-color:#444;--panel-background:#333;--panel-border-color:#555;--panel-color:#9b9b9b;--modal-background:#333;--modal-color:#efefef;--modal-box-shadow:0 0 10px rgba(82, 168, 236, 0.6);--pagination-link-color:#aaa;--pagination-border-color:#333;--category-color:#efefef;--category-background-color:#333;--category-border-color:#444;--category-link-color:#999;--category-link-hover-color:#aaa;--item-border-color:#666;--item-padding:4px;--item-title-link-font-weight:400;--item-status-read-title-link-color:#666;--item-status-read-title-focus-color:rgba(82, 168, 236, 0.6);--item-meta-focus-color:#aaa;--item-meta-li-color:#ddd;--current-item-border-width:2px;--current-item-border-color:rgba(82, 168, 236, 0.8);--current-item-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--entry-header-border-color:#333;--entry-header-title-link-color:#bbb;--entry-content-color:#999;--entry-content-code-color:#fff;--entry-content-code-background:#555;--entry-content-code-border-color:#888;--entry-content-quote-color:#777;--entry-content-abbr-border-color:#777;--entry-enclosure-border-color:#333;--parsing-error-color:#eee;--feed-parsing-error-background-color:#343434;--keyboard-shortcuts-li-color:#9b9b9b;--counter-color:#bbb}}:root{--entry-content-font-weight:400;--entry-content-font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, - "system_serif": `:root{--font-family:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--body-color:#333;--body-background:#fff;--hr-border-color:#ccc;--title-color:#333;--link-color:#3366CC;--link-focus-color:red;--link-hover-color:#333;--header-list-border-color:#ddd;--header-link-color:#444;--header-link-focus-color:#888;--header-link-hover-color:#888;--header-active-link-color:#444;--page-header-title-border-color:#333;--logo-color:#000;--logo-hover-color-span:#000;--table-border-color:#ddd;--table-th-background:#fcfcfc;--table-th-color:#333;--table-tr-hover-background-color:#f9f9f9;--table-tr-hover-color:#333;--button-primary-border-color:#3079ed;--button-primary-background:#4d90fe;--button-primary-color:#fff;--button-primary-focus-border-color:#2f5bb7;--button-primary-focus-background:#357ae8;--input-border:1px solid #ccc;--input-background:#fff;--input-color:#333;--input-placeholder-color:#d0d0d0;--input-focus-color:#000;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#c09853;--alert-background-color:#fcf8e3;--alert-border-color:#fbeed5;--alert-success-color:#468847;--alert-success-background-color:#dff0d8;--alert-success-border-color:#d6e9c6;--alert-error-color:#b94a48;--alert-error-background-color:#f2dede;--alert-error-border-color:#eed3d7;--alert-info-color:#3a87ad;--alert-info-background-color:#d9edf7;--alert-info-border-color:#bce8f1;--panel-background:#fcfcfc;--panel-border-color:#ddd;--panel-color:#333;--modal-background:#f0f0f0;--modal-color:#333;--modal-box-shadow:2px 0 5px 0 #ccc;--pagination-link-color:#333;--pagination-border-color:#ddd;--category-color:#333;--category-background-color:#fffcd7;--category-border-color:#d5d458;--category-link-color:#000;--category-link-hover-color:#000;--item-border-color:#ddd;--item-padding:5px;--item-title-link-font-weight:600;--item-status-read-title-link-color:#777;--item-status-read-title-focus-color:#777;--item-meta-focus-color:#777;--item-meta-li-color:#aaa;--current-item-border-width:3px;--current-item-border-color:#bce;--current-item-box-shadow:none;--entry-header-border-color:#ddd;--entry-header-title-link-color:#333;--entry-content-color:#555;--entry-content-code-color:#333;--entry-content-code-background:#f0f0f0;--entry-content-code-border-color:#ddd;--entry-content-quote-color:#666;--entry-content-abbr-border-color:#999;--entry-enclosure-border-color:#333;--parsing-error-color:#333;--feed-parsing-error-background-color:#fcf8e3;--keyboard-shortcuts-li-color:#333;--counter-color:#666}@media(prefers-color-scheme:dark){:root{--body-color:#efefef;--body-background:#222;--hr-border-color:#555;--title-color:#aaa;--link-color:#aaa;--link-focus-color:#ddd;--link-hover-color:#ddd;--header-list-border-color:#333;--header-link-color:#ddd;--header-link-focus-color:rgba(82, 168, 236, 0.85);--header-link-hover-color:rgba(82, 168, 236, 0.85);--header-active-link-color:#9b9494;--page-header-title-border-color:#333;--logo-color:#bbb;--logo-hover-color-span:#bbb;--table-border-color:#555;--table-th-background:#333;--table-th-color:#aaa;--table-tr-hover-background-color:#333;--table-tr-hover-color:#aaa;--button-primary-border-color:#444;--button-primary-background:#333;--button-primary-color:#efefef;--button-primary-focus-border-color:#888;--button-primary-focus-background:#555;--input-border:1px solid #555;--input-background:#333;--input-color:#ccc;--input-placeholder-color:#666;--input-focus-color:#efefef;--input-focus-border-color:rgba(82, 168, 236, 0.8);--input-focus-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--alert-color:#efefef;--alert-background-color:#333;--alert-border-color:#444;--alert-success-color:#efefef;--alert-success-background-color:#333;--alert-success-border-color:#444;--alert-error-color:#efefef;--alert-error-background-color:#333;--alert-error-border-color:#444;--alert-info-color:#efefef;--alert-info-background-color:#333;--alert-info-border-color:#444;--panel-background:#333;--panel-border-color:#555;--panel-color:#9b9b9b;--modal-background:#333;--modal-color:#efefef;--modal-box-shadow:0 0 10px rgba(82, 168, 236, 0.6);--pagination-link-color:#aaa;--pagination-border-color:#333;--category-color:#efefef;--category-background-color:#333;--category-border-color:#444;--category-link-color:#999;--category-link-hover-color:#aaa;--item-border-color:#666;--item-padding:4px;--item-title-link-font-weight:400;--item-status-read-title-link-color:#666;--item-status-read-title-focus-color:rgba(82, 168, 236, 0.6);--item-meta-focus-color:#aaa;--item-meta-li-color:#ddd;--current-item-border-width:2px;--current-item-border-color:rgba(82, 168, 236, 0.8);--current-item-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);--entry-header-border-color:#333;--entry-header-title-link-color:#bbb;--entry-content-color:#999;--entry-content-code-color:#fff;--entry-content-code-background:#555;--entry-content-code-border-color:#888;--entry-content-quote-color:#777;--entry-content-abbr-border-color:#777;--entry-enclosure-border-color:#333;--parsing-error-color:#eee;--feed-parsing-error-background-color:#343434;--keyboard-shortcuts-li-color:#9b9b9b;--counter-color:#bbb}}:root{--entry-content-font-weight:300;--entry-content-font-family:Georgia, 'Times New Roman', Times, serif;--entry-content-quote-font-family:var(--entry-content-font-family)}*{margin:0;padding:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-family:var(--font-family);text-rendering:optimizeLegibility;color:var(--body-color);background:var(--body-background)}hr{border:0;height:0;border-top:1px dotted var(--hr-border-color);padding-bottom:10px}h1,h2,h3{color:var(--title-color)}main{padding-left:5px;padding-right:5px;margin-bottom:30px}a{color:var(--link-color)}a:focus{outline:0;color:var(--link-focus-color);text-decoration:none;outline:1px dotted #aaa}a:hover{color:var(--link-hover-color);text-decoration:none}.header{margin-top:10px;margin-bottom:20px}.header nav ul{display:none}.header li{cursor:pointer;padding-left:10px;line-height:2.1em;font-size:1.2em;border-bottom:1px dotted var(--header-list-border-color)}.header li:hover a{color:#888}.header a{font-size:.9em;color:var(--header-link-color);text-decoration:none;border:none;font-weight:400}.header .active a{color:var(--header-active-link-color);font-weight:500}.header a:hover{color:var(--header-link-hover-color)}.header a:focus{color:var(--header-link-focus-color)}.page-header{margin-bottom:25px}.page-footer{margin-bottom:10px}.page-header h1{font-weight:500;border-bottom:1px dotted var(--page-header-title-border-color)}.page-header h1 a{text-decoration:none;color:var(--page-header-title-color)}.page-header h1 a:hover,.page-header h1 a:focus{color:#666}.page-header ul,.page-footer ul{margin-left:25px}.page-header li,.page-footer li{list-style-type:circle;line-height:1.8em}.logo{cursor:pointer;text-align:center}.logo a{color:var(--logo-color);letter-spacing:1px}.logo a:hover{color:#396}.logo a span{color:#396}.logo a:hover span{color:var(--logo-hover-color-span)}.search{text-align:center;display:none}.search-toggle-switch{display:none}#prompt-home-screen{display:none;position:fixed;bottom:0;right:0;width:100%;text-align:center;background:#000;opacity:85%}#btn-add-to-home-screen{text-decoration:none;line-height:30px;color:#fff}#btn-add-to-home-screen:hover{color:red}.toast-wrap{visibility:hidden;opacity:0;position:fixed;left:0;bottom:10%;color:#fff;width:100%;text-align:center}.toast-msg{background-color:rgba(0,0,0,.7);padding:2px 5px;border-radius:5px}.toastAnimate{animation:toastKeyFrames 2s}@keyframes toastKeyFrames{0%{visibility:hidden;opacity:0}25%{visibility:visible;opacity:1;z-index:9999}50%{visibility:visible;opacity:1;z-index:9999}75%{visibility:visible;opacity:1;z-index:9999}100%{visibility:hidden;opacity:0;z-index:0}}@media(min-width:600px){body{margin:auto;max-width:750px}.header{margin-bottom:0}.logo{text-align:left;float:left;margin-right:15px;margin-left:5px}.header nav ul{display:block}.header li{display:inline;padding:0;padding-right:15px;line-height:normal;border:none;font-size:1em}.page-header ul,.page-footer ul{margin-left:0}.page-header li,.page-footer li{display:inline;padding-right:15px}.search{text-align:right;display:block;margin-top:10px;margin-right:5px}.search-toggle-switch{display:block}.search-form{display:none}.search-toggle-switch.has-search-query{display:none}.search-form.has-search-query{display:block}}table{width:100%;border-collapse:collapse}table,th,td{border:1px solid var(--table-border-color)}th,td{padding:5px;text-align:left}td{vertical-align:top}th{background:var(--table-th-background);color:var(--table-th-color);font-weight:400}tr:hover{color:var(--table-tr-hover-color);background-color:var(--table-tr-hover-background-color)}.column-40{width:40%}.column-25{width:25%}.column-20{width:20%}fieldset{border:1px solid #ddd;padding:8px}legend{font-weight:500;padding-left:3px;padding-right:3px}label{cursor:pointer;display:block}.radio-group{line-height:1.9em}div.radio-group label{display:inline-block}select{margin-bottom:15px}input[type=search],input[type=url],input[type=password],input[type=text],input[type=number]{color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;line-height:20px;width:250px;font-size:99%;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}input[type=search]:focus,input[type=url]:focus,input[type=password]:focus,input[type=text]:focus,input[type=number]:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}#form-entries-per-page{max-width:80px}input[type=checkbox]{margin-bottom:15px}textarea{width:350px;color:var(--input-color);background:var(--input-background);border:var(--input-border);padding:3px;margin-bottom:10px;margin-top:5px;-webkit-appearance:none}textarea:focus{color:var(--input-focus-color);border-color:var(--input-focus-border-color);outline:0;box-shadow:var(--input-focus-box-shadow)}input::placeholder{color:var(--input-placeholder-color);padding-top:2px}.form-help{font-size:.9em;color:brown;margin-bottom:15px}.form-section{border-left:2px dotted #ddd;padding-left:20px;margin-left:10px}details>summary{outline:none;cursor:pointer}.details-content{margin-top:15px}a.button{text-decoration:none}.button{display:inline-block;-webkit-appearance:none;-moz-appearance:none;font-size:1.1em;cursor:pointer;padding:3px 10px;border:1px solid;border-radius:unset}.button-primary{border-color:var(--button-primary-border-color);background:var(--button-primary-background);color:var(--button-primary-color)}.button-primary:hover,.button-primary:focus{border-color:var(--button-primary-focus-border-color);background:var(--button-primary-focus-background)}.button-danger{border-color:#b0281a;background:#d14836;color:#fff}.button-danger:hover,.button-danger:focus{color:#fff;background:#c53727}.button:disabled{color:#ccc;background:#f7f7f7;border-color:#ccc}.buttons{margin-top:10px;margin-bottom:20px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:var(--alert-color);background-color:var(--alert-background-color);border:1px solid var(--alert-border-color);border-radius:4px;overflow:auto}.alert h3{margin-top:0;margin-bottom:15px}.alert-success{color:var(--alert-success-color);background-color:var(--alert-success-background-color);border-color:var(--alert-success-border-color)}.alert-error{color:var(--alert-error-color);background-color:var(--alert-error-background-color);border-color:var(--alert-error-border-color)}.alert-error h3,.alert-error a{color:var(--alert-error-color)}.alert-info{color:var(--alert-info-color);background-color:var(--alert-info-background-color);border-color:var(--alert-info-border-color)}.panel{color:var(--panel-color);background-color:var(--panel-background);border:1px solid var(--panel-border-color);border-radius:5px;padding:10px;margin-bottom:15px}.panel h3{font-weight:500;margin-top:0;margin-bottom:20px}.panel ul{margin-left:30px}#modal-left{position:fixed;top:0;left:0;bottom:0;width:380px;overflow:auto;color:var(--modal-color);background:var(--modal-background);box-shadow:var(--modal-box-shadow);padding:5px;padding-top:30px}#modal-left h3{font-weight:400;margin:0}.btn-close-modal{position:absolute;top:0;right:0;font-size:1.7em;color:#ccc;padding:0 .2em;margin:10px;text-decoration:none}.btn-close-modal:hover{color:#999}.keyboard-shortcuts li{margin-left:25px;list-style-type:square;color:var(--keyboard-shortcuts-li-color);font-size:.95em;line-height:1.45em}.keyboard-shortcuts p{line-height:1.9em}.login-form{margin:50px auto 0;max-width:280px}.unread-counter-wrapper,.error-feeds-counter-wrapper{font-size:.9em;font-weight:300;color:var(--counter-color)}.category{font-size:.75em;background-color:var(--category-background-color);border:1px solid var(--category-border-color);border-radius:5px;margin-left:.25em;padding:1px .4em;white-space:nowrap;color:var(--category-color)}.category a{color:var(--category-link-color);text-decoration:none}.category a:hover,.category a:focus{color:var(--category-link-hover-color)}.pagination{font-size:1.1em;display:flex;align-items:center;padding-top:8px}.pagination-bottom{border-top:1px dotted var(--pagination-border-color);margin-bottom:15px;margin-top:50px}.pagination>div{flex:1}.pagination-next{text-align:right}.pagination-prev:before{content:"« "}.pagination-next:after{content:" »"}.pagination a{color:var(--pagination-color)}.pagination a:hover,.pagination a:focus{text-decoration:none}.item{border:1px dotted var(--item-border-color);margin-bottom:20px;padding:var(--item-padding);overflow:hidden}.item.current-item{border:var(--current-item-border-width)solid var(--current-item-border-color);padding:3px;box-shadow:var(--current-item-box-shadow)}.item-title a{text-decoration:none;font-weight:var(--item-title-link-font-weight)}.item-status-read .item-title a{color:var(--item-status-read-title-link-color)}.item-meta{color:var(--item-meta-focus-color);font-size:.8em}.item-meta a{color:#777;text-decoration:none}.item-meta a:hover,.item-meta a:focus{color:#333}.item-meta ul{margin-top:5px}.item-meta li{display:inline-block}.item-meta-info{font-size:.85em}.item-meta-info li:after{content:"|";color:var(--item-meta-li-color)}.item-meta-info li:last-child:after{content:""}.item-meta-icons li{margin-right:8px;margin-top:4px}.item-meta-icons li:last-child{margin-right:0}.items{overflow-x:hidden;touch-action:pan-y}.hide-read-items .item-status-read:not(.current-item){display:none}article.feed-parsing-error{background-color:var(--feed-parsing-error-background-color);border-color:#aaa}.parsing-error{font-size:.85em;margin-top:2px;color:var(--parsing-error-color)}.parsing-error-count{cursor:pointer}.icon,.icon-label{vertical-align:middle;display:inline-block}.icon{width:16px;height:16px}.entry header{padding-bottom:5px;border-bottom:1px dotted var(--entry-header-border-color)}.entry header h1{font-size:2em;line-height:1.25em;margin:5px 0 30px}.entry header h1 a{text-decoration:none;color:var(--entry-header-title-link-color)}.entry header h1 a:hover,.entry header h1 a:focus{color:#666}.entry-actions{margin-bottom:20px}.entry-actions a{text-decoration:none}.entry-actions li{display:inline-block;margin-right:15px;line-height:1.7em}.entry-meta{font-size:.95em;margin:0 0 20px;color:#666;overflow-wrap:break-word}.entry-website img{vertical-align:top}.entry-website a{color:#666;vertical-align:top;text-decoration:none}.entry-website a:hover,.entry-website a:focus{text-decoration:underline}.entry-date{font-size:.65em;font-style:italic;color:#555}.entry-content{padding-top:15px;font-size:1.2em;font-weight:var(--entry-content-font-weight);font-family:var(--entry-content-font-family);color:var(--entry-content-color);line-height:1.4em;overflow-wrap:break-word}.entry-content h1,h2,h3,h4,h5,h6{margin-top:15px;margin-bottom:10px}.entry-content iframe,.entry-content video,.entry-content img{max-width:100%}.entry-content figure{margin-top:15px;margin-bottom:15px}.entry-content figure img{border:1px solid #000}.entry-content figcaption{font-size:.75em;text-transform:uppercase;color:#777}.entry-content p{margin-top:10px;margin-bottom:15px}.entry-content a{overflow-wrap:break-word}.entry-content a:visited{color:purple}.entry-content dt{font-weight:500;margin-top:15px;color:#555}.entry-content dd{margin-left:15px;margin-top:5px;padding-left:20px;border-left:3px solid #ddd;color:#777;font-weight:300;line-height:1.4em}.entry-content blockquote{border-left:4px solid #ddd;padding-left:25px;margin-left:20px;margin-top:20px;margin-bottom:20px;line-height:1.4em;font-family:var(--entry-content-quote-font-family)}.entry-content q{color:var(--entry-content-quote-color);font-family:var(--entry-content-quote-font-family);font-style:italic}.entry-content q:before{content:"“"}.entry-content q:after{content:"”"}.entry-content pre{padding:5px;overflow:auto;overflow-wrap:initial;border-width:1px;border-style:solid}.entry-content pre,.entry-content code{color:var(--entry-content-code-color);background:var(--entry-content-code-background);border-color:var(--entry-content-code-border-color)}.entry-content table{max-width:100%}.entry-content ul,.entry-content ol{margin-left:30px;margin-top:15px;margin-bottom:15px}.entry-content li ul,.entry-content li ol{margin-top:0;margin-bottom:0}.entry-content ul{list-style-type:square}.entry-content strong{font-weight:600}.entry-content sub,.entry-content sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.entry-content sub{bottom:-.25em}.entry-content sup{top:-.5em}.entry-content abbr{cursor:pointer;text-decoration:none;border-bottom:1px dashed var(--entry-content-abbr-border-color)}details.entry-enclosures{margin-top:25px}.entry-enclosures summary{font-weight:500;font-size:1.2em}.entry-enclosure{border:1px dotted var(--entry-enclosure-border-color);padding:5px;margin-top:10px;max-width:100%}.entry-enclosure-download{font-size:.85em;overflow-wrap:break-word}.enclosure-video video,.enclosure-image img{max-width:100%}.confirm{font-weight:500;color:#ed2d04}.confirm a{color:#ed2d04}.loading{font-style:italic}.bookmarklet{border:1px dashed #ccc;border-radius:5px;padding:15px;margin:15px;text-align:center}.bookmarklet a{font-weight:600;text-decoration:none;font-size:1.2em}`, -} - -var StylesheetsChecksums = map[string]string{ - "dark_sans_serif": "3a35fab171e7e8d78a40560301c82601e044fc8432dbacb43ccf2e0af7ff271f", - "dark_serif": "f00c6424658c1e5b69bb987a0f3b10f1f71101f74c1f713e859e85ef096a243c", - "light_sans_serif": "4cd6dc28034619c39572f128667d269601a28a772a59f6181ccdeb1cb2c8feb5", - "light_serif": "7f17aff3a0e92de877f06dabc42d0b45fd543b4d8f90db1e020dbe4d100de051", - "system_sans_serif": "88a2b940c2e0406620ca45c35c32b51b917f1ad791c9bd517761f371b32af79b", - "system_serif": "47f288fcce7cd52f88eeafadf88e44c92d90d49ec519f025574da4bbd8bffaa6", -} diff --git a/ui/static/static.go b/ui/static/static.go index f70cc2e8..9cefbfee 100644 --- a/ui/static/static.go +++ b/ui/static/static.go @@ -5,32 +5,48 @@ package static // import "miniflux.app/ui/static" import ( + "bytes" "crypto/sha256" "embed" "fmt" + + "github.com/tdewolff/minify/v2" + "github.com/tdewolff/minify/v2/css" +) + +// Static assets. +var ( + StylesheetBundleChecksums map[string]string + StylesheetBundles map[string][]byte ) //go:embed bin/* var binaryFiles embed.FS +//go:embed css/*.css +var stylesheetFiles embed.FS + var binaryFileChecksums map[string]string -func init() { +// CalculateBinaryFileChecksums generates hash of embed binary files. +func CalculateBinaryFileChecksums() error { binaryFileChecksums = make(map[string]string) dirEntries, err := binaryFiles.ReadDir("bin") if err != nil { - panic(err) + return err } for _, dirEntry := range dirEntries { data, err := LoadBinaryFile(dirEntry.Name()) if err != nil { - panic(err) + return err } binaryFileChecksums[dirEntry.Name()] = fmt.Sprintf("%x", sha256.Sum256(data)) } + + return nil } // LoadBinaryFile loads an embed binary file. @@ -45,3 +61,44 @@ func GetBinaryFileChecksum(filename string) (string, error) { } return binaryFileChecksums[filename], nil } + +// GenerateStylesheetsBundles creates CSS bundles. +func GenerateStylesheetsBundles() error { + var bundles = map[string][]string{ + "light_serif": {"css/light.css", "css/serif.css", "css/common.css"}, + "light_sans_serif": {"css/light.css", "css/sans_serif.css", "css/common.css"}, + "dark_serif": {"css/dark.css", "css/serif.css", "css/common.css"}, + "dark_sans_serif": {"css/dark.css", "css/sans_serif.css", "css/common.css"}, + "system_serif": {"css/system.css", "css/serif.css", "css/common.css"}, + "system_sans_serif": {"css/system.css", "css/sans_serif.css", "css/common.css"}, + } + + StylesheetBundles = make(map[string][]byte) + StylesheetBundleChecksums = make(map[string]string) + + minifier := minify.New() + minifier.AddFunc("text/css", css.Minify) + + for bundle, srcFiles := range bundles { + var buffer bytes.Buffer + + for _, srcFile := range srcFiles { + fileData, err := stylesheetFiles.ReadFile(srcFile) + if err != nil { + return err + } + + buffer.Write(fileData) + } + + minifiedData, err := minifier.Bytes("text/css", buffer.Bytes()) + if err != nil { + return err + } + + StylesheetBundles[bundle] = minifiedData + StylesheetBundleChecksums[bundle] = fmt.Sprintf("%x", sha256.Sum256(minifiedData)) + } + + return nil +} diff --git a/ui/static_stylesheet.go b/ui/static_stylesheet.go index dd9b0e3e..fc8ae15b 100644 --- a/ui/static_stylesheet.go +++ b/ui/static_stylesheet.go @@ -29,7 +29,7 @@ func (h *handler) showStylesheet(w http.ResponseWriter, r *http.Request) { return } - etag, found := static.StylesheetsChecksums[filename] + etag, found := static.StylesheetBundleChecksums[filename] if !found { html.NotFound(w, r) return @@ -37,7 +37,7 @@ func (h *handler) showStylesheet(w http.ResponseWriter, r *http.Request) { response.New(w, r).WithCaching(etag, 48*time.Hour, func(b *response.Builder) { b.WithHeader("Content-Type", "text/css; charset=utf-8") - b.WithBody(static.Stylesheets[filename]) + b.WithBody(static.StylesheetBundles[filename]) b.Write() }) } diff --git a/ui/view/view.go b/ui/view/view.go index f714dea3..07f25740 100644 --- a/ui/view/view.go +++ b/ui/view/view.go @@ -40,7 +40,7 @@ func New(tpl *template.Engine, r *http.Request, sess *session.Session) *View { b.params["flashMessage"] = sess.FlashMessage(request.FlashMessage(r)) b.params["flashErrorMessage"] = sess.FlashErrorMessage(request.FlashErrorMessage(r)) b.params["theme"] = theme - b.params["theme_checksum"] = static.StylesheetsChecksums[theme] + b.params["theme_checksum"] = static.StylesheetBundleChecksums[theme] b.params["app_js_checksum"] = static.JavascriptsChecksums["app"] b.params["sw_js_checksum"] = static.JavascriptsChecksums["service-worker"] return b