From 4e5430a17ba4ce77d4cb188222e47924f032b197 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Wed, 15 Jan 2020 09:06:33 +0100 Subject: [PATCH 01/83] Add eelo theme --- manage.sh | 6 + .../plugins/js/search_on_category_select.js | 2 +- searx/static/themes/eelo/css/eelo.css | 1065 ++++++++++ searx/static/themes/eelo/css/eelo.min.css | Bin 0 -> 18879 bytes searx/static/themes/eelo/css/leaflet.min.css | Bin 0 -> 8027 bytes searx/static/themes/eelo/gruntfile.js | 92 + searx/static/themes/eelo/img/empty_space.svg | Bin 0 -> 8433 bytes searx/static/themes/eelo/img/favicon.png | Bin 0 -> 2573 bytes searx/static/themes/eelo/img/icons/1337x.png | Bin 0 -> 1229 bytes searx/static/themes/eelo/img/icons/README.md | 2 + searx/static/themes/eelo/img/icons/amazon.png | Bin 0 -> 4129 bytes .../themes/eelo/img/icons/dailymotion.png | Bin 0 -> 3963 bytes .../themes/eelo/img/icons/deviantart.png | Bin 0 -> 3790 bytes .../static/themes/eelo/img/icons/facebook.png | Bin 0 -> 3685 bytes searx/static/themes/eelo/img/icons/flickr.png | Bin 0 -> 3751 bytes searx/static/themes/eelo/img/icons/github.png | Bin 0 -> 4315 bytes .../themes/eelo/img/icons/invidious.png | Bin 0 -> 3427 bytes .../static/themes/eelo/img/icons/kickass.png | Bin 0 -> 4527 bytes .../themes/eelo/img/icons/openstreetmap.png | Bin 0 -> 5184 bytes searx/static/themes/eelo/img/icons/photon.png | Bin 0 -> 4177 bytes .../themes/eelo/img/icons/searchcode code.png | Bin 0 -> 4241 bytes .../themes/eelo/img/icons/searchcode doc.png | Bin 0 -> 4241 bytes .../themes/eelo/img/icons/soundcloud.png | Bin 0 -> 3820 bytes .../themes/eelo/img/icons/stackoverflow.png | Bin 0 -> 3990 bytes .../static/themes/eelo/img/icons/twitter.png | Bin 0 -> 3790 bytes searx/static/themes/eelo/img/icons/vimeo.png | Bin 0 -> 3894 bytes .../themes/eelo/img/icons/wikipedia.png | Bin 0 -> 3960 bytes .../static/themes/eelo/img/icons/youtube.png | Bin 0 -> 587 bytes searx/static/themes/eelo/img/loader.gif | Bin 0 -> 8314 bytes searx/static/themes/eelo/img/logo.png | Bin 0 -> 1856 bytes searx/static/themes/eelo/img/logo.svg | Bin 0 -> 19480 bytes searx/static/themes/eelo/img/logo_searx_a.png | Bin 0 -> 10697 bytes .../static/themes/eelo/img/logo_searx_a_n.png | Bin 0 -> 9704 bytes .../static/themes/eelo/img/map/layers-2x.png | Bin 0 -> 1763 bytes searx/static/themes/eelo/img/map/layers.png | Bin 0 -> 1142 bytes .../eelo/img/map/marker-icon-2x-green.png | Bin 0 -> 3753 bytes .../eelo/img/map/marker-icon-2x-orange.png | Bin 0 -> 3691 bytes .../eelo/img/map/marker-icon-2x-red.png | Bin 0 -> 3692 bytes .../themes/eelo/img/map/marker-icon-2x.png | Bin 0 -> 4033 bytes .../themes/eelo/img/map/marker-icon-green.png | Bin 0 -> 1696 bytes .../eelo/img/map/marker-icon-orange.png | Bin 0 -> 1714 bytes .../themes/eelo/img/map/marker-icon-red.png | Bin 0 -> 1690 bytes .../themes/eelo/img/map/marker-icon.png | Bin 0 -> 1747 bytes .../themes/eelo/img/map/marker-shadow.png | Bin 0 -> 797 bytes searx/static/themes/eelo/img/not_found.svg | Bin 0 -> 15760 bytes searx/static/themes/eelo/img/searx_logo.png | Bin 0 -> 10611 bytes .../static/themes/eelo/img/torrent_thumb.svg | Bin 0 -> 931 bytes .../themes/eelo/js/leaflet-0.7.3.min.js | Bin 0 -> 125410 bytes searx/static/themes/eelo/js/searx.js | 383 ++++ searx/static/themes/eelo/js/searx.min.js | Bin 0 -> 5631 bytes .../eelo/js/searx_src/00_requirejs_config.js | 23 + .../themes/eelo/js/searx_src/01_init.js | 30 + .../themes/eelo/js/searx_src/autocompleter.js | 37 + .../static/themes/eelo/js/searx_src/custom.js | 28 + .../eelo/js/searx_src/element_modifiers.js | 99 + .../themes/eelo/js/searx_src/leaflet_map.js | 167 ++ searx/static/themes/eelo/less/eelo/base.less | 133 ++ searx/static/themes/eelo/less/eelo/code.less | 11 + searx/static/themes/eelo/less/eelo/defs.less | 90 + searx/static/themes/eelo/less/eelo/eelo.less | 11 + .../static/themes/eelo/less/eelo/layout.less | 146 ++ .../static/themes/eelo/less/eelo/navbar.less | 73 + .../themes/eelo/less/eelo/preferences.less | 71 + .../static/themes/eelo/less/eelo/results.less | 299 +++ .../static/themes/eelo/less/eelo/search.less | 238 +++ .../static/themes/eelo/less/eelo/widgets.less | 131 ++ searx/static/themes/eelo/package-lock.json | 1875 +++++++++++++++++ searx/static/themes/eelo/package.json | 15 + searx/templates/eelo/404.html | 15 + searx/templates/eelo/about.html | 7 + searx/templates/eelo/base.html | 108 + .../templates/eelo/components/categories.html | 29 + searx/templates/eelo/components/icons.html | 26 + searx/templates/eelo/components/infobox.html | 51 + .../templates/eelo/components/languages.html | 11 + searx/templates/eelo/components/navbar.html | 15 + searx/templates/eelo/components/search.html | 3 + .../eelo/components/search_full.html | 12 + .../templates/eelo/components/time-range.html | 17 + searx/templates/eelo/index.html | 16 + searx/templates/eelo/macros.html | 149 ++ searx/templates/eelo/messages/no_cookies.html | 4 + searx/templates/eelo/messages/no_results.html | 28 + .../messages/save_settings_successfull.html | 9 + .../templates/eelo/messages/unknow_error.html | 9 + searx/templates/eelo/preferences.html | 238 +++ searx/templates/eelo/privacy.html | 10 + .../templates/eelo/result_templates/code.html | 16 + .../eelo/result_templates/default.html | 13 + .../eelo/result_templates/images.html | 4 + .../templates/eelo/result_templates/map.html | 72 + .../eelo/result_templates/torrent.html | 38 + .../eelo/result_templates/video_torrent.html | 25 + .../eelo/result_templates/videos.html | 13 + searx/templates/eelo/results.html | 126 ++ tests/unit/test_preferences.py | 2 +- 96 files changed, 6091 insertions(+), 2 deletions(-) create mode 100644 searx/static/themes/eelo/css/eelo.css create mode 100644 searx/static/themes/eelo/css/eelo.min.css create mode 100644 searx/static/themes/eelo/css/leaflet.min.css create mode 100644 searx/static/themes/eelo/gruntfile.js create mode 100644 searx/static/themes/eelo/img/empty_space.svg create mode 100644 searx/static/themes/eelo/img/favicon.png create mode 100644 searx/static/themes/eelo/img/icons/1337x.png create mode 100644 searx/static/themes/eelo/img/icons/README.md create mode 100644 searx/static/themes/eelo/img/icons/amazon.png create mode 100644 searx/static/themes/eelo/img/icons/dailymotion.png create mode 100644 searx/static/themes/eelo/img/icons/deviantart.png create mode 100644 searx/static/themes/eelo/img/icons/facebook.png create mode 100644 searx/static/themes/eelo/img/icons/flickr.png create mode 100644 searx/static/themes/eelo/img/icons/github.png create mode 100644 searx/static/themes/eelo/img/icons/invidious.png create mode 100644 searx/static/themes/eelo/img/icons/kickass.png create mode 100644 searx/static/themes/eelo/img/icons/openstreetmap.png create mode 100644 searx/static/themes/eelo/img/icons/photon.png create mode 100644 searx/static/themes/eelo/img/icons/searchcode code.png create mode 100644 searx/static/themes/eelo/img/icons/searchcode doc.png create mode 100644 searx/static/themes/eelo/img/icons/soundcloud.png create mode 100644 searx/static/themes/eelo/img/icons/stackoverflow.png create mode 100644 searx/static/themes/eelo/img/icons/twitter.png create mode 100644 searx/static/themes/eelo/img/icons/vimeo.png create mode 100644 searx/static/themes/eelo/img/icons/wikipedia.png create mode 100644 searx/static/themes/eelo/img/icons/youtube.png create mode 100644 searx/static/themes/eelo/img/loader.gif create mode 100644 searx/static/themes/eelo/img/logo.png create mode 100644 searx/static/themes/eelo/img/logo.svg create mode 100644 searx/static/themes/eelo/img/logo_searx_a.png create mode 100644 searx/static/themes/eelo/img/logo_searx_a_n.png create mode 100644 searx/static/themes/eelo/img/map/layers-2x.png create mode 100644 searx/static/themes/eelo/img/map/layers.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-2x-green.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-2x-orange.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-2x-red.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-2x.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-green.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-orange.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon-red.png create mode 100644 searx/static/themes/eelo/img/map/marker-icon.png create mode 100644 searx/static/themes/eelo/img/map/marker-shadow.png create mode 100644 searx/static/themes/eelo/img/not_found.svg create mode 100644 searx/static/themes/eelo/img/searx_logo.png create mode 100644 searx/static/themes/eelo/img/torrent_thumb.svg create mode 100644 searx/static/themes/eelo/js/leaflet-0.7.3.min.js create mode 100644 searx/static/themes/eelo/js/searx.js create mode 100644 searx/static/themes/eelo/js/searx.min.js create mode 100644 searx/static/themes/eelo/js/searx_src/00_requirejs_config.js create mode 100644 searx/static/themes/eelo/js/searx_src/01_init.js create mode 100644 searx/static/themes/eelo/js/searx_src/autocompleter.js create mode 100644 searx/static/themes/eelo/js/searx_src/custom.js create mode 100644 searx/static/themes/eelo/js/searx_src/element_modifiers.js create mode 100644 searx/static/themes/eelo/js/searx_src/leaflet_map.js create mode 100644 searx/static/themes/eelo/less/eelo/base.less create mode 100644 searx/static/themes/eelo/less/eelo/code.less create mode 100644 searx/static/themes/eelo/less/eelo/defs.less create mode 100644 searx/static/themes/eelo/less/eelo/eelo.less create mode 100644 searx/static/themes/eelo/less/eelo/layout.less create mode 100644 searx/static/themes/eelo/less/eelo/navbar.less create mode 100644 searx/static/themes/eelo/less/eelo/preferences.less create mode 100644 searx/static/themes/eelo/less/eelo/results.less create mode 100644 searx/static/themes/eelo/less/eelo/search.less create mode 100644 searx/static/themes/eelo/less/eelo/widgets.less create mode 100644 searx/static/themes/eelo/package-lock.json create mode 100644 searx/static/themes/eelo/package.json create mode 100644 searx/templates/eelo/404.html create mode 100644 searx/templates/eelo/about.html create mode 100644 searx/templates/eelo/base.html create mode 100644 searx/templates/eelo/components/categories.html create mode 100644 searx/templates/eelo/components/icons.html create mode 100644 searx/templates/eelo/components/infobox.html create mode 100644 searx/templates/eelo/components/languages.html create mode 100644 searx/templates/eelo/components/navbar.html create mode 100644 searx/templates/eelo/components/search.html create mode 100644 searx/templates/eelo/components/search_full.html create mode 100644 searx/templates/eelo/components/time-range.html create mode 100644 searx/templates/eelo/index.html create mode 100644 searx/templates/eelo/macros.html create mode 100644 searx/templates/eelo/messages/no_cookies.html create mode 100644 searx/templates/eelo/messages/no_results.html create mode 100644 searx/templates/eelo/messages/save_settings_successfull.html create mode 100644 searx/templates/eelo/messages/unknow_error.html create mode 100644 searx/templates/eelo/preferences.html create mode 100644 searx/templates/eelo/privacy.html create mode 100644 searx/templates/eelo/result_templates/code.html create mode 100644 searx/templates/eelo/result_templates/default.html create mode 100644 searx/templates/eelo/result_templates/images.html create mode 100644 searx/templates/eelo/result_templates/map.html create mode 100644 searx/templates/eelo/result_templates/torrent.html create mode 100644 searx/templates/eelo/result_templates/video_torrent.html create mode 100644 searx/templates/eelo/result_templates/videos.html create mode 100644 searx/templates/eelo/results.html diff --git a/manage.sh b/manage.sh index 496a522ba..6656892a0 100755 --- a/manage.sh +++ b/manage.sh @@ -133,6 +133,10 @@ npm_packages() { echo '[!] install NPM packages for simple theme' cd -- "$BASE_DIR/searx/static/themes/simple" npm install + + echo '[!] install NPM packages for eelo theme' + cd -- "$BASE_DIR/searx/static/themes/eelo" + npm install } build_style() { @@ -163,6 +167,8 @@ grunt_build() { grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js" echo '[!] Grunt build : simple theme' grunt --gruntfile "$SEARX_DIR/static/themes/simple/gruntfile.js" + echo '[!] Grunt build : eelo theme' + grunt --gruntfile "$SEARX_DIR/static/themes/eelo/gruntfile.js" } docker_build() { diff --git a/searx/static/plugins/js/search_on_category_select.js b/searx/static/plugins/js/search_on_category_select.js index 1c42d9e9e..7ffa818a3 100644 --- a/searx/static/plugins/js/search_on_category_select.js +++ b/searx/static/plugins/js/search_on_category_select.js @@ -1,6 +1,6 @@ $(document).ready(function() { if($('#q').length) { - $('#categories label').click(function(e) { + $('#categories label[for^="checkbox_"]').click(function(e) { $('#categories input[type="checkbox"]').each(function(i, checkbox) { $(checkbox).prop('checked', false); }); diff --git a/searx/static/themes/eelo/css/eelo.css b/searx/static/themes/eelo/css/eelo.css new file mode 100644 index 000000000..a32a24dd7 --- /dev/null +++ b/searx/static/themes/eelo/css/eelo.css @@ -0,0 +1,1065 @@ +.container-padding, +nav { + padding-left: 16px; + padding-right: 16px; +} +.color-transition, +a { + transition: color 0.2s ease-in-out; +} +.border-color-transition { + transition: border-color 0.2s ease-in-out; +} +.fill-transition, +.checkmark .icon { + transition: fill 0.2s ease-in-out; +} +.box-shadow-transition, +#search_form #search_input_container { + transition: box-shadow 0.2s ease-in-out; +} +.disabled, +[disabled], +#preferences #engines .engine input:checked ~ .data { + opacity: .4; +} +#pagination { + margin-top: 48px; + display: flex; + justify-content: space-between; +} +.container { + max-width: 1100px; + padding-left: 16px; + padding-right: 16px; + display: flex; + justify-content: space-between; + margin: auto; +} +.container > :first-child { + max-width: 600px; + width: 600px; +} +.container > :last-child:not(:first-child) { + max-width: 400px; + width: 400px; +} +.container.full { + max-width: 100%; +} +.container.full > :first-child { + max-width: 100%; + width: 100%; +} +.container.full > :last-child:not(:first-child) { + display: none; +} +.container.full #pagination { + max-width: 400px; + width: 400px; + margin: auto; + justify-content: space-around; +} +#search_bar_area { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); +} +#search_bar_area #search_form, +#no_results_msg, +.content-small-centered { + max-width: 600px; + margin: auto; +} +#no_results_msg, +#page_not_found_404 { + text-align: center; + margin-top: 64px; + margin-bottom: 64px; +} +#no_results_msg img, +#page_not_found_404 img { + max-width: 70%; +} +#errors { + border: 2px solid #e06572; + border-radius: 8px; + padding: 8px; +} +#errors .title { + margin-top: 0; + margin-bottom: 8px; +} +#errors pre { + background-color: rgba(224, 101, 114, 0.1); +} +.inline { + display: flex; + flex-direction: row; +} +@media screen and (max-width: 1100px) { + .container { + flex-direction: column-reverse; + } + .container > * { + margin: auto; + } + #preferences.container { + flex-direction: column; + margin-top: 16px; + } +} +@media screen and (max-width: 600px) { + .container { + max-width: 100%; + padding-left: 16px; + padding-right: 16px; + } + .container > :first-child, + .container > :last-child:not(:first-child) { + max-width: 100%; + width: 100%; + } + main { + margin-top: 16px; + } + #search_input_container { + margin-left: 16px; + margin-right: 16px; + } + .container.full #pagination { + max-width: 100%; + width: 100%; + } +} +#index { + max-width: 600px; + margin: auto; +} +#index img { + width: 300px; + display: block; + margin: auto; + margin-top: 64px; + margin-bottom: 64px; +} +#index img#logo_inline { + display: none; +} +@media screen and (max-width: 600px) { + #index img { + width: 50vmin; + margin-bottom: 24px; + } +} +@media screen and (max-height: 600px) and (orientation: landscape) { + #index img { + width: 70vmin; + margin-top: 32px; + display: none; + } + #index img#logo_inline { + display: block; + } +} +.block, +.btn.btn-block { + display: block; + width: 100%; + box-sizing: border-box; +} +.text-muted { + color: rgba(0, 0, 0, 0.4); +} +.danger, +.btn.danger { + color: #e06572; +} +.widget, +.btn, +.custom-select:not(.flat) { + border: 2px solid rgba(0, 0, 0, 0.2); + padding: 4px 12px; + background-color: transparent; + transition: border-color 0.2s ease-in-out, color 0.2s ease-in-out, background-color 0.2s ease-in-out; +} +.btn { + padding: 8px 16px; + text-transform: capitalize; + background-color: transparent; + border-radius: 8px; + text-align: center; + font-size: 16px; + font-weight: bold; + cursor: pointer; +} +.btn:not(:disabled) { + color: #5068dd; + border-color: #5068dd; +} +.btn:hover:not(:disabled) { + border-color: #2344a2; + color: #2344a2; +} +.btn.primary, +input.btn[type="submit"] { + background-color: #5068dd; + color: #ffffff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn.primary:hover, +input.btn[type="submit"]:hover { + color: #ffffff; + background-color: #2344a2; +} +.btn.danger { + color: #e06572; + border-color: #e06572; +} +.btn.danger:hover { + border-color: rgba(0, 0, 0, 0.2); + background-color: #e06572; + color: #ffffff; +} +.btn.btn-flat { + border: none; + border-radius: 0; + background-color: transparent; +} +.btn.btn-flat:hover { + color: #2344a2; +} +.btn.plain-white { + border-color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.8); + background-color: rgba(0, 0, 0, 0.5); +} +.checkmark .icon { + fill: #60686f; +} +.checkmark .icon.checked { + fill: #5068dd; +} +.checkmark_input { + display: none; +} +.checkmark_input.inverted:checked + .checkmark .checked { + display: none; +} +.checkmark_input.inverted:checked + .checkmark .unchecked { + display: initial; +} +.checkmark_input.inverted:not(:checked) + .checkmark .checked { + display: initial; +} +.checkmark_input.inverted:not(:checked) + .checkmark .unchecked { + display: none; +} +.collapser input:checked ~ .collapse { + display: initial; +} +.collapser input:not(:checked) ~ .collapse { + display: none; +} +.custom-select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + font-weight: normal; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ +cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn +sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8 +6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0 +ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w +Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb +7jwaAAAAAElFTkSuQmCC) 96% no-repeat; +} +.custom-select.flat { + border: none; +} +.custom-select:not(.flat) { + width: 100%; + border-radius: 50px; +} +html { + position: relative; + min-height: 100%; + color: #60686f; +} +body { + margin: 0px; + padding: 0px; + font-size: 16px; + margin-bottom: 120px; + background-color: white; + font-family: 'Roboto', "Cantarell", Helvetica, Arial, sans-serif; +} +body.lock { + overflow: hidden; +} +body * { + font-family: sans-serif, "Cantarell", 'Roboto', Helvetica, Arial; +} +input, +select { + box-shadow: none !important; +} +a { + color: #1f6ed7; +} +a, +select, +a:focus, +select:focus, +a:active, +select:active, +a:hover, +select:hover { + outline: none; + text-decoration: none; +} +label { + color: #5c6469; +} +section { + margin-bottom: 32px; +} +ul > li { + margin-bottom: 8px; +} +fieldset { + border: none; + padding: 0px; +} +pre { + font-family: 'Courier New', Courier, monospace; + background: rgba(0, 0, 0, 0.1); + padding: 8px 16px; + border-radius: 8px; + white-space: pre-line; +} +footer { + position: absolute; + bottom: 0; + width: 100%; + height: auto; + text-align: center; + color: #c1c1c1; + padding-bottom: 8px; +} +footer .links > :first-child { + margin-right: 8px; +} +.hidden, +#icons { + display: none; +} +#image_view_modal { + position: absolute; + top: 0; + width: 100%; + height: 100vh; + background-color: rgba(0, 0, 0, 0.9); + z-index: 100; +} +#image_view_modal button { + display: block; + width: 100%; + text-align: right; + background: none; + border: none; +} +#image_view_modal button .icon { + fill: white; +} +#image_view_modal .card-container { + display: flex; + height: 100%; +} +#image_view_modal #image_view_card { + margin: auto; + max-width: 600px; + max-height: 80vh; +} +@media screen and (max-width: 600px) { + #image_view_modal #image_view_card { + margin-left: 16px; + margin-right: 16px; + max-width: 100%; + width: 100%; + } +} +#image_view_modal #image_view_image { + display: block; + max-width: 100%; + max-height: 70vh; + background-color: white; + margin: auto; +} +#image_view_modal .options { + margin-top: 8px; +} +#image_view_modal .btn { + border-color: rgba(255, 255, 255, 0.4); + color: rgba(255, 255, 255, 0.8); + background-color: rgba(0, 0, 0, 0.5); + display: inline-block; + margin-right: 8px; +} +nav { + height: 48px; + display: flex; + align-items: center; + justify-content: space-between; + text-transform: capitalize; + margin-bottom: 24px; +} +nav a { + color: #868686; +} +nav a:hover { + color: #5068dd; +} +nav #eelo_links > * { + margin-right: 32px; +} +#nav_toggle_btn { + display: none; +} +@media screen and (max-width: 600px) { + nav { + position: fixed; + right: 0; + top: 0; + flex-direction: column; + height: 100%; + background-color: white; + z-index: 1000; + width: 280px; + min-width: 280px; + max-width: 280px; + align-items: unset; + box-shadow: 0 0 0 rgba(0, 0, 0, 0.2); + transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + padding: 0; + } + nav > :first-child { + margin-top: 8px; + } + nav > :last-child { + margin-bottom: 8px; + } + nav a { + display: block; + padding: 8px 16px; + } + #nav_toggle_btn { + display: block; + position: absolute; + top: 24px; + right: 8px; + z-index: 1001; + } + #nav_toggle:checked ~ #nav_toggle_btn > .menu-open { + display: none; + } + #nav_toggle:checked ~ #nav_toggle_btn > .menu-close { + display: initial; + } + #nav_toggle:checked ~ nav { + box-shadow: 0 0 30px rgba(0, 0, 0, 0.2); + transform: translateX(0); + } + #nav_toggle:checked ~ #nav_toggle_btn { + position: fixed; + } + #nav_toggle:not(:checked) ~ #nav_toggle_btn > .menu-open { + display: initial; + } + #nav_toggle:not(:checked) ~ #nav_toggle_btn > .menu-close { + display: none; + } + #nav_toggle:not(:checked) ~ nav { + transform: translateX(100%); + } +} +#search_form #search_input_container { + position: relative; + display: flex; + align-items: center; + border: 2px solid rgba(0, 0, 0, 0.24); + border-radius: 50px; + height: 38px; +} +#search_form #search_input_container:hover, +#search_form #search_input_container:active { + box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.13); +} +#search_form #search_input_container #q { + font-size: 16px; + border: none; + height: 100%; + width: 100%; + min-width: 0; + padding-left: 16px; + background-color: transparent; +} +#search_form #search_input_container #q:focus { + outline: none; +} +#search_form #search_input_container button[type="submit"] { + position: relative; + height: 100%; + width: 38px; + min-width: 38px; + border: none; + background: none; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} +#search_form #search_input_container button[type="submit"] .icon { + transition: fill 0.2s ease-in-out, transform 0.1s ease-in-out; +} +#search_form #search_input_container button[type="submit"]:hover .icon { + fill: #5068dd; + transform: scale(1.2); +} +#search_form #logo, +#search_form #logo_link { + height: 32px; +} +#search_form #logo_link { + padding-left: 4px; +} +#search_form #search_input_container.rtl #q { + margin-left: 0; + padding-right: 16px; +} +#search_form #search_input_container.rtl #logo_link { + padding-left: 0; + padding-right: 4px; +} +#search_form .twitter-typeahead { + position: unset !important; + background-color: transparent; + width: 100%; + height: 100%; +} +#search_form input.tt-hint { + display: none; +} +#search_form .tt-dropdown-menu { + position: absolute; + left: 0; + right: 0 !important; + top: calc(116%) !important; + border-radius: 8px; + border: 2px solid rgba(0, 0, 0, 0.2); + width: 100% !important; + box-sizing: border-box !important; + background-color: #eeeeee; + padding-left: 16px; + padding-right: 16px; +} +#search_form .tt-dropdown-menu .tt-cursor, +#search_form .tt-dropdown-menu .tt-highlight { + font-weight: bold; +} +#search_form.inline-search .tt-dropdown-menu { + padding-left: 52px; +} +#search_form #search_params { + display: flex; + justify-content: space-between; + font-size: 14px; + padding-bottom: 16px; + padding-top: 16px; + padding-left: 24px; + padding-right: 24px; +} +#search_form #search_params select, +#search_form #search_params label { + font-size: 14px; +} +#search_form #search_params select { + color: rgba(0, 0, 0, 0.5); + text-align: right; + padding-right: 32px; +} +#search_form #search_params #time_and_lang { + text-align: right; +} +#search_form #search_params #time_and_lang > * { + width: 160px; +} +#search_form .search_categories, +#search_form #categories { + text-transform: capitalize; + display: flex; + flex-wrap: wrap; + align-items: center; + position: relative; + flex: 100%; +} +#search_form .search_categories label, +#search_form #categories label { + flex-basis: auto; + font-size: 14px; + font-weight: normal; + margin-right: 16px; + cursor: pointer; +} +#search_form .search_categories input[type="checkbox"]:checked + label, +#search_form #categories input[type="checkbox"]:checked + label { + color: #5068dd; + font-weight: bold; +} +#search_form #more_categories { + position: absolute; + top: 24px; + display: flex; + flex-direction: column; + border-radius: 8px; + border: 2px solid rgba(0, 0, 0, 0.2); + background-color: #eeeeee; + padding-bottom: 8px; + padding-top: 8px; + left: 0; + z-index: 998; +} +#search_form #more_categories > label { + padding: 16px; + padding-bottom: 8px; + padding-top: 8px; + white-space: nowrap; + margin-right: 0; +} +#search_form #more_categories > label:hover { + background-color: rgba(0, 0, 0, 0.1); +} +#more_categories_container { + border-left: 1px solid rgba(0, 0, 0, 0.24); + padding-left: 16px; + display: flex; + align-items: center; + position: relative; +} +#show_more_categories_ { + cursor: default; +} +#more_categories_toggle:checked ~ #more_categories, +#more_categories_toggle_[checked] ~ #more_categories { + display: flex; +} +#more_categories_toggle:checked ~ #show_more_categories, +#more_categories_toggle_[checked] ~ #show_more_categories { + display: none; +} +#more_categories_toggle:checked ~ #show_less_categories, +#more_categories_toggle_[checked] ~ #show_less_categories { + display: initial; +} +#more_categories_toggle:not(:checked) ~ #more_categories, +#more_categories_toggle_:not([checked]) ~ #more_categories { + display: none; +} +#more_categories_toggle:not(:checked) ~ #show_more_categories, +#more_categories_toggle_:not([checked]) ~ #show_more_categories { + display: initial; +} +#more_categories_toggle:not(:checked) ~ #show_less_categories, +#more_categories_toggle_:not([checked]) ~ #show_less_categories { + display: none; +} +@media screen and (max-width: 600px) { + #search_form #search_params { + overflow-x: scroll; + } + #search_form #search_params #time_and_lang { + display: flex; + margin-left: 32px; + } + #search_form #search_params #time_and_lang > * { + width: auto; + } + #search_form #search_params, + #search_form #categories { + flex-wrap: nowrap; + } + #search_form #more_categories { + margin-left: 24px; + padding: 8px 16px; + border-radius: 16px; + position: relative; + flex-direction: row; + align-items: center; + top: 0; + margin-left: 16px; + } + #search_form #more_categories > label { + padding: 0; + } + #search_form #more_categories > label:not(:last-child) { + margin-right: 16px; + } + #search_form.inline-search > #search_input_container { + margin-right: 40px; + } + .tt-dropdown-menu { + padding-left: 16px; + } +} +#results { + margin-top: 32px; + margin-bottom: 32px; +} +.result .result-template { + font-weight: bold; + text-transform: uppercase; + color: rgba(0, 0, 0, 0.4); +} +.result .result-template + .result_header { + margin-top: 0; +} +.result .result_header { + margin-bottom: 6px; +} +.result .result_header .favicon { + width: 16px; + height: 16px; +} +.result .subheader > :not(:last-child), +.result .subheader > * > :not(:last-child) { + margin-right: 16px; +} +.result .result-content { + margin-top: 8px; + margin-bottom: 6px; +} +.result .result-content p, +.result .result-content pre { + margin-top: 8px; + margin-bottom: 8px; +} +.result.result-torrent .extra-info > :not(:last-child) { + margin-right: 16px; +} +.videos-gallery .result.result-torrent .torrent-banner { + position: absolute; + bottom: 0; + left: 0; + right: 0; + color: rgba(0, 0, 0, 0.4); + font-weight: bold; + padding: 6px 16px; + text-transform: uppercase; + display: flex; + justify-content: space-between; + font-size: 14px; +} +.videos-gallery .result.result-torrent .torrent-banner .torrent-data { + text-transform: none; + font-weight: normal; +} +.videos-gallery .result.result-torrent .torrent-banner .torrent-data > :not(:first-child) { + margin-left: 6px; +} +.result.result-videos, +.videos-gallery .result.result-torrent { + position: relative; + border: 2px solid rgba(0, 0, 0, 0.1); + border-radius: 8px; +} +.result.result-videos .result-content, +.videos-gallery .result.result-torrent .result-content { + margin: 0px; + display: flex; + flex-direction: column; + height: 100%; +} +.result.result-videos .result-content .result_header, +.videos-gallery .result.result-torrent .result-content .result_header { + margin-top: 0; +} +.result.result-videos .result-content .result_header a, +.videos-gallery .result.result-torrent .result-content .result_header a { + word-wrap: break-word; +} +.result.result-videos .result-content > .thumbnail, +.videos-gallery .result.result-torrent .result-content > .thumbnail { + position: relative; +} +.result.result-videos .result-content > :not(.thumbnail), +.videos-gallery .result.result-torrent .result-content > :not(.thumbnail) { + margin-top: 8px; + height: 100%; + display: flex; + padding: 8px 16px; + flex-direction: column; + justify-content: space-between; +} +.result.result-videos .result-content .thumbnail > img, +.videos-gallery .result.result-torrent .result-content .thumbnail > img { + width: 100%; + height: 144px; + object-fit: cover; + object-position: center; + display: block; +} +.result.result-videos .result-content .subheader .result_engine, +.videos-gallery .result.result-torrent .result-content .subheader .result_engine { + float: right; +} +.result.result-videos .result-content .subheader .result_engine img, +.videos-gallery .result.result-torrent .result-content .subheader .result_engine img { + width: 16px; + height: 16px; + margin-left: 8px; + vertical-align: middle; +} +.result .external-link { + font-size: 14px; + color: #39a441; +} +.result .extra-info { + color: rgba(0, 0, 0, 0.4); +} +.result .code-block { + background-color: rgba(0, 0, 0, 0.03); + padding: 0 16px; + border-radius: 8px; + border: 1px solid rgba(0, 0, 0, 0.2); +} +.result .code-block pre { + white-space: pre-wrap; +} +.result.result-default, +.result.result-torrent { + margin-bottom: 32px; +} +.result.result-images { + display: inline; +} +.result.result-images .img-thumbnail { + width: 100%; + border: none; + margin-bottom: 8px; +} +#results.images-gallery { + display: flex; + flex-wrap: wrap; +} +#results.images-gallery .result.result-images { + display: block; + flex: 20%; + height: 200px; + max-height: 200px; + overflow: hidden; +} +.videos-gallery { + display: flex; + flex-wrap: wrap; +} +.videos-gallery .result.result-torrent { + margin-bottom: 0; +} +@supports (display: grid) { + #results.images-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-gap: 8px; + } + #results.images-gallery .result.result-images { + display: block; + text-align: center; + overflow: hidden; + } + #results.images-gallery .result.result-images .img-thumbnail { + height: 100%; + width: auto; + } + .videos-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(256px, 1fr)); + grid-gap: 16px; + } + .videos-gallery .result.result-videos, + .videos-gallery .result.result-torrent { + display: block; + overflow: hidden; + } +} +#default_images_container { + column-count: 5; + column-gap: 8px; + margin-bottom: 32px; +} +#default_images_container .img-thumb-link { + display: block; + max-height: 120px; + overflow: hidden; +} +#suggestions form, +#corrections form { + display: inline-block; +} +#suggestions form .btn, +#corrections form .btn { + text-transform: none; +} +.infobox { + margin-top: 32px; +} +.infobox .head .title { + font-size: 22px; + margin-top: 0; + margin-bottom: 0; +} +.infobox .head small { + color: rgba(0, 0, 0, 0.4); +} +.infobox .body .image-container { + max-height: 250px; + overflow: hidden; + text-align: center; +} +.infobox .body .content { + flex: 3; +} +.infobox .body img { + max-width: 100%; + width: 100%; + margin-top: 16px; +} +.infobox .footer .links a { + padding-left: 0; + padding-top: 0; + padding-bottom: 16px; + padding-right: 32px; + display: inline-block; + font-size: 14px; +} +.infobox table { + margin-top: 16px; + width: 100%; +} +.infobox table tr { + vertical-align: top; +} +.infobox table tr td { + padding: 0; + padding-bottom: 8px; +} +.infobox table tr > .label { + text-align: right; + color: rgba(0, 0, 0, 0.4); + padding-right: 16px; +} +.first-page-media-results { + margin-bottom: 32px; +} +.first-page-media-results .header { + display: flex; + align-items: center; + justify-content: space-between; +} +.first-page-media-results .header .title { + font-size: 18px; +} +@media screen and (max-width: 1100px) { + #results.images-gallery { + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + } + #results.images-gallery .result.result-images { + height: 140px; + max-height: 140px; + } +} +#preferences h1, +#preferences .nav-tabs, +#preferences #notice { + margin-bottom: 24px; +} +#preferences .options { + margin-top: 24px; +} +#preferences .tab-content { + margin-bottom: 48px; + display: none; +} +#preferences input.tab-radio[type="radio"] { + display: none; +} +#preferences input.tab-radio[type="radio"]:checked + .tab-content { + display: block; +} +#preferences .preference { + margin-bottom: 16px; +} +#preferences .preference.inline { + justify-content: space-between; +} +#preferences .preference.inline > :first-child { + flex: 2; +} +#preferences .preference.inline > :last-child { + flex: 1; +} +#preferences #tabs { + margin-bottom: 32px; +} +#preferences #tabs > * { + margin-right: 32px; +} +#preferences #controls { + display: flex; + flex-direction: column-reverse; + justify-content: flex-end; +} +#preferences #cookies_list .cookie-value { + word-wrap: break-word; +} +#preferences #action_buttons { + margin-top: 48px; +} +#preferences #action_buttons > div { + margin-bottom: 24px; +} +#preferences #action_buttons > div > * { + margin-bottom: 8px; +} +#preferences #engines h3 { + text-transform: capitalize; + margin-top: 0; +} +#preferences #engines .engine { + display: flex; + margin-bottom: 8px; +} +#preferences #engines .engine .data { + width: 100%; + margin-left: 16px; + margin-right: 16px; +} +#preferences #engines .engine input:checked ~ .data .danger { + display: inline; +} +#preferences #engines .engine input:not(:checked) ~ .data i.danger { + display: none; +} +@media screen and (max-width: 600px) { + .preference.inline { + flex-direction: column; + } + .preference.inline > :first-child { + margin-bottom: 8px; + } +} +.highlight .lineno, +.highlighttable .lineno { + margin-right: 16px; + color: rgba(0, 0, 0, 0.4); + display: none; +} diff --git a/searx/static/themes/eelo/css/eelo.min.css b/searx/static/themes/eelo/css/eelo.min.css new file mode 100644 index 0000000000000000000000000000000000000000..d918c13a5e45437774d50e19194027e26203947c GIT binary patch literal 18879 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 GdH)4Ffq8WR literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/css/leaflet.min.css b/searx/static/themes/eelo/css/leaflet.min.css new file mode 100644 index 0000000000000000000000000000000000000000..bca0c58b9a6b4aeb77b2366cacb5e2893e6f8889 GIT binary patch literal 8027 zcmcgxTW{;e5q|HlV2@G621FfFwk#hKc_`Y47Kr;41btnSD`{hjODtEiVj};&GkYP2 zH|rDu0!Js(a%OgRuHP)zC1?AR>+rW!;VR|7+qleCOGl(BZiOUo^brxlT|f>?A*?t5Y({Unq7k+(e_>Zf*>9p{LLbcz!C%FxmP)fqFL89{BrYLR;%yW~^>tnl+Oge>QgfAv z>d2MQ=|wam6Q$6>A_=w_nbcaIdTCvLducI*+F0N?b7kF* z>wv=0XwAQa0CD@-{|%mCL1}GOAwXuNKTX()y>mKiMVr2@lmwoQt-gY{JqKTHf~>Y=g3_puL* z8oFQK#Y)Wm-TQrRo?&bO_V_gROs^N!q4&j2^Y-1FC~p@Bb}&mLlFwB)TLTc`w8dFq zLKyQ>FA}Z09ovlMZwDpMRgv5kMUl$0#@a9_;T?6r z+FX`kz`H2gy|9-#i2>`XH3Gs5Z@tJ3KpQ}rq6qHxdj?pCup37LYHc&A3P3nWTR;!v zK>YZ!Pl=l9kg@yCcDwSQXuW+PqB?EcJ=isgLDbiHy$!zniNeMK1PjbW&YOB+lSO@9x7IdbCWy`TMbhI z>jMOY1}r%usv-`6*}>R$zlZZ0GXRdqHlE;~&T@I4rxvJfo_kPYz8j?Bz?)g{AjF~% z&96FSr8rbc4)}qq)T|UdmkN*u3;`zpItNqt7=?TN(Zm2&>`a01|8Rih>U|V;NM{@U zEr1X4U#NJ^q32i9ee1B&7;N9L($gOPhMoeW?uBY}m>)%1xLCs0A7W=FuJQK8N2Udn zXA_Yn8%wlqSrY1=j^+A2olnu&V9Pztxcv>_jTIX z(*fE?fI=S8n(s7taDk}iy=`(-kkNSX0J7XBTqesRh+iONfB5N~i-HCJkQGEP|6%ni zE0)XENmjA}q{3|k;(UOKy1c2E9X8^FC!3*qqf-u)5|z=(@j)dZ$NG$KwBazB{SIb? zZXn8TRfi`i4y4SI{C33x>IqS7D1Roq%=Bo6j`jL045D8FAAPmjtn2FV;0nYeDG>Ob zY@whIR;&+=KeA=Gx!PU(Gdg?2o&gpjvhjk^t@8e;w!S@q)qRNKcOqq|?&2{@(dfmZ z#jk*LU^rgnc2&(6(NVq*RS0iNLtTc~3NU>+VD3k~#S?bo+nN;x^!Ef!i&H~@U*O{l zz~kfNIM$Y>+RGKG;0mIfkswE=ika)6`TVq=3rd#pa(KSa_N^JT9N5@jHTc?SrZhN_ zYjy}otZoUm+|ZoZd>cj;I>P{{sWX|@N@Qp3Z*3o-2_TSLpknvn_okiD`<=+0hFFs` zxE;ij+Bqyj&_KL2V;v$AfYw}dzQyDq#h4Yq9o#^IHY5JqCL11Yf!>^!)Y*6#DYFxE zXqjB#nYnpb1Z|g``g6eNTIrC}dx$uJfJzrxyWNh)oIyUc1;*<*^|^*v6oU?ql_I3H z)eTRXz8{6=q3LA+Xx!DT1+jS z7IpvH#M4Frj?E6qJQ1{t=x?S&jnZy%3fRO!-*^WCT;nm{seN3xv7H7r2u4?Fct?{c zso^T={%KoqKwHDRpUFd*kMIs|j*;B^jMx@fCdcyC#QC}p_Rh4^uGhzW6c}d$xEhYL zPqXthne3f|OWDBP_8Df>s-1~ce20|U8&0@ucE|-c!%qa3CDG_cQVacXdgxpP#HQ>f zF*N-Un3%KU%Cb4hdz7YwQy2+t5<5brLtBLW&Ss&pKsnw9bzE;8$A{`DPc;70WYOc@t zDuB~lLN7{Zx%xEOpxs?MxMajveeMm^ms-h#D3X8v_uu$-@n;|5>sJAXY~)_AUl|~; z>-}pS{}`=z(JqdjcQ32pHQo$=Z{i=r0l|h6JbX#rmVergw=6qXuWWw=4=pqMc8QMY u^K|3|Pc-gbBeGc+FABBP=voJaNF)v8v=A5b`g^8mn5IS;pP%7<+W!F1L~~;R literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/gruntfile.js b/searx/static/themes/eelo/gruntfile.js new file mode 100644 index 000000000..ef546931d --- /dev/null +++ b/searx/static/themes/eelo/gruntfile.js @@ -0,0 +1,92 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + concat: { + options: { + separator: ';' + }, + dist: { + src: ['js/searx_src/*.js'], + dest: 'js/searx.js' + } + }, + uglify: { + options: { + banner: '/*! eelo/searx.min.js | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n' + }, + dist: { + files: { + 'js/searx.min.js': ['<%= concat.dist.dest %>'] + } + } + }, + jshint: { + files: ['gruntfile.js', 'js/searx_src/*.js'], + options: { + reporterOutput: "", + // options here to override JSHint defaults + globals: { + jQuery: true, + console: true, + module: true, + document: true + } + } + }, + less: { + development: { + options: { + paths: ["less/eelo"] + //banner: '/*! less/eelo/oscar.css | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n' + }, + files: {"css/eelo.css": "less/eelo/eelo.less"} + }, + production: { + options: { + paths: ["less/eelo"], + //banner: '/*! less/eelo/oscar.css | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n', + cleancss: true + }, + files: {"css/eelo.min.css": "less/eelo/eelo.less"} + }, + /* + // built with ./manage.sh styles + bootstrap: { + options: { + paths: ["less/bootstrap"], + cleancss: true + }, + files: {"css/bootstrap.min.css": "less/bootstrap/bootstrap.less"} + }, + */ + }, + watch: { + scripts: { + files: ['<%= jshint.files %>'], + tasks: ['jshint', 'concat', 'uglify'] + }, + eelo_styles: { + files: ['less/eelo/**/*.less'], + tasks: ['less:development', 'less:production'] + }, + bootstrap_styles: { + files: ['less/bootstrap/**/*.less'], + tasks: ['less:bootstrap'] + } + } + }); + + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-less'); + + grunt.registerTask('test', ['jshint']); + + grunt.registerTask('default', ['jshint', 'concat', 'uglify', 'less']); + + grunt.registerTask('styles', ['less']); + +}; diff --git a/searx/static/themes/eelo/img/empty_space.svg b/searx/static/themes/eelo/img/empty_space.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f25469d863bc7ff0445e5c3a520c62f2bf9a4ac GIT binary patch literal 8433 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/favicon.png b/searx/static/themes/eelo/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e96a90efdfb53f6de81922e93d0118d674a720 GIT binary patch literal 2573 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/README.md b/searx/static/themes/eelo/img/icons/README.md new file mode 100644 index 000000000..0e3ad1c03 --- /dev/null +++ b/searx/static/themes/eelo/img/icons/README.md @@ -0,0 +1,2 @@ +Source: http://www.iconspedia.com/pack/flat-gradient-social-icons-4384/ +License: Free for non commercial use. diff --git a/searx/static/themes/eelo/img/icons/amazon.png b/searx/static/themes/eelo/img/icons/amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..b4abf7d815518227d114d7edf75965c6e5a543cc GIT binary patch literal 4129 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/dailymotion.png b/searx/static/themes/eelo/img/icons/dailymotion.png new file mode 100644 index 0000000000000000000000000000000000000000..88e4801b6637c1647ba13bc2ff49dacdf2d914d2 GIT binary patch literal 3963 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 VwoJzJEA;>X002ovPDHLkV1jX)b#MRx literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/deviantart.png b/searx/static/themes/eelo/img/icons/deviantart.png new file mode 100644 index 0000000000000000000000000000000000000000..cec53bcea1c8aae035de4b9d9a914bb60abd7228 GIT binary patch literal 3790 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 Eg2eD09{>OV literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/facebook.png b/searx/static/themes/eelo/img/icons/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5a5949359aed0775058fa583d3f7eea88ce4fc GIT binary patch literal 3685 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 R91Z{g002ovPDHLkV1gj}4=n%y literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/github.png b/searx/static/themes/eelo/img/icons/github.png new file mode 100644 index 0000000000000000000000000000000000000000..9463a828a6d8ee61295af42863d6937b8f062005 GIT binary patch literal 4315 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 JPDHLkV1lpRCFcMD literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/invidious.png b/searx/static/themes/eelo/img/icons/invidious.png new file mode 100644 index 0000000000000000000000000000000000000000..a94c969d8a43f4096eb2bc20e6028a8579b98380 GIT binary patch literal 3427 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 bd~N>^`Vwhdsyj>#00000NkvXXu0mjfi0{r{ literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/searchcode code.png b/searx/static/themes/eelo/img/icons/searchcode code.png new file mode 100644 index 0000000000000000000000000000000000000000..517434af0228ed7f0c39ca1a914504e181c0d1e7 GIT binary patch literal 4241 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/twitter.png b/searx/static/themes/eelo/img/icons/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..f71c1973aae899651c91c0041332a9c2d43631c3 GIT binary patch literal 3790 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/vimeo.png b/searx/static/themes/eelo/img/icons/vimeo.png new file mode 100644 index 0000000000000000000000000000000000000000..0238d24d2487a0931f26da64aec2fceacaa0718c GIT binary patch literal 3894 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 Eg5E+zZ2$lO literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/icons/wikipedia.png b/searx/static/themes/eelo/img/icons/wikipedia.png new file mode 100644 index 0000000000000000000000000000000000000000..f77168382a231d43bcb2be294ef199695b027ca2 GIT binary patch literal 3960 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 S&>71B0000w4foewjh2C zX!!#4w8R1m6Juhm==cVP#vod#1Pg<2NQ25^kQZ@}#q1)Gpv>+7h5VD7xtY1=JkQ*l zn{znie<#`LLvRkQIE~{thBlNoEo-Sge{OoWiXT|U5*D$L@b#}wf}6pk;8m~`M8TsH zya*l!x3-Jl30C$%bf>Wz+=V2vZG49d|2VFqna9NxT?Zfz?YN!d#sP@ext`+60UEfP z;%u&va+$F)Iy#Cl(4OK<7)!GjNm(zqf+}~$$c%1OIZslljuhuHo^Kt+H002ovPDHLkV1kqM2uc6| literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/loader.gif b/searx/static/themes/eelo/img/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..419cdeedaba815759c4a4ea3a2236fd0df0ce442 GIT binary patch literal 8314 zcmZ9RXIzta`}VIZn-Cy`5JNyrFhE2^Kv0UKAqh(v0TB@q*#txg8<`1&y}}MVKxBh} zsDPkh2*{GrL!s3~^ndLjn?XB&SMoCpom84$s`~Q9yBny1}e0;oo+}zzFq9WpB||qS6BHa|bJ*s9=>Zml#j;@KWaZ@K<>>0^8W|d?sjE3T zI#D&KR4uB}UL#!{T^Iz0$Kmk=JO+(XBdNgSN(-03LOjBReHrw;`I0HAz< z!H~dLKzH*S_~SR}h_Ccqu9Yq+e^O#tu5VI1&l!1{;o3m`VP&d15DRuv*beF_FX*bc zUC{5N;iBe2gP(lQtM(bZ0HPSS0c@C4s*7u;z59`TVL>4YO_hTJP&^e~2*JpRWH6Az z61)g1SH(gDIbgK~CI{hb(U}87U$T#9Di2*Y9~?n*GQsPt-kdAu$fSTN7LtmGfiM~B z^bxqS3<%07!wc`o+<*AE=-p2nB>8g=P}zL6+@c*Q_r#L=(o99@n~{>>40*J_p2x0$ z_2lSUmBP&~__N%HO&4<(s$7>vGD^#6%GM%oj?17GMpIlem)Dnr<9Y8kll3#DWbQm! zr_Qtr)6$^{1ojoIA~i8jA4pBoDKMu9jcRVUnf-|jjs!@5AcJfoQv?9`SFu(W#?zM| zRr7vxjjMZ0!^>=5@&keSReGFtCuWU1QB5@oLZpHYRDffUQ}jqLJI;x-j>h?@{Ze|eV74GOo9XV>{%<*Bl@;+o(VDDU}oew1mD`#N)c_~&GwYf*7J-b z5epkk70POIW7Ffy4a?iwiW)3Uc1O4Oy)L?qlC1A!kZJ9FbA(Gd@6d5w z)E!ambvtH6*B4Q@KNbb-?R&hk@o=lh-or1~k6kaG`|5R;7r{X8=41r8s6yO>3He}% za$>j;L9msH^^42e24$BP5+so&A?29!;S7b06aHCB4h0AhJTJ*>ztYb*&+zR!*QIIS z(l{`TK@``E`meVYUb)fJ6Ps(J9J2WI%K6s%f!izXqcyJsRFSr*f)|Td5GV)9!sy%NgWyCgc5~hy0$-rhRm|Lr@xvE1AT@Ls5+9*j#R^F!p|z_>yrlq zl$zuqe-!qnOY#3^oy!gv9-wPrsTA>MVK+w{?r_#5+jFM>OKo4_8au)x`d*$**Uck7 z3JNvC=?_AI=CvxjID|(;R8(X{7(O^EIpiE3vOS?d?JUSm3C1{QMrS#I1>(@~s;Xpu zYKdJY*G^Sju($!8$ zpSRp|2!Kjnsf~z|h~PkP9d-i8(FkBnx>!C)K{$vf*Jrfd}e z^zxq1U*Y~RRV}*@^*7Rg?7La`f7n+@A&X2}<`DXS+1FH!>)O7a8TmoKWu}L*u8i!+@jv z?U`K$bQIlw*x5qcwc|J1+T2zFo4_;7D!O-wg4XNXxMS6@>0@r;v;`1=w|(>BOPrx} zR3=277$jlviALt0WF4PLa$B*Sx}!vnyd%$ql5m4gB@~WjCJ*0{nAmq{4wJ<&nhr)Y@@=@F^O5LZB85AR6ZR~N$3$mr;( z$ncP80XLSR&EX{(8+t~DriNe~vtqJsiHU{0v-Y7;HG-6M&?hUDL20;XXW`cgWGqC_L$sfJ{06s zS68wpZ%#(`1itun=jq0$EVoNx09;u;hJ_MTXa*#IuRXP1*Ym?mqLIeULkAZpu*hMW zO85}J9^iq#Woga7dI3nL5kX!3x5jKb1!7ok@-a1g<|Z4?RPU=wg(CKALl7~p0)INV z1H-mZyDwSGBGvbe&AgI;ZTrJffU%3V6re$Lb6hCisc2dGK8x~wYc!%522`CQM`t8o z=lzzpRaf(ypMk$1e}(Qj!Bj6sc(M% z)o?bsW9Es0_IjW7Qr5)~boJ2h(DnQ9*ra0#ktt65koxIP;eqM&2!o^U23u-R6sjBUH>42Z;+~6Qv%hsl{aa_j-#W84ODbJHb2ZGsO6^vAY4R+@ z`SOXgTAlrv2S0jl@NAxh%<#(ZklqR2Z76QfzsWOEibN5Vg0UIFN{VoS9YQf00osBl zNxTX#LV#krIHOK6p9vN#f`y<9L_4vv!q_m+9#>xk7Zx%o%my5Vk;^K5AnL^WxHbHBVxKK zxCE+L+1}nkx!~dHEjs^r+KY+RctBxn*eO9x9Dltj98bQ=u6`}T7q&JQA+4kB?)^u? zJDRTeNkaLuGdp>=aaMV^)HoY}OnKlqM>7198@D@8y3~y%L(3!US(8G_NC}6DaAMGt zg~<~_aC?oL&Nt-|e_`M8r}CRqAA37_(6o6DK_;5kGI6W#V-KQao4L|}?rTqrkm3Zi zhU&cK&=XdL-89wvy*9dzVf(jBZk6Q&pGp?!K6=!=d|N<5RKfMn4kGa@o}!d;>H zwFL!a7>OX#ZEB8GVWU;+g2ZRhI-ccMwAIk|n693rd`x)yl?c6JyP9kDGti8tTbFNX zSJ?s6()&rkXiID4g#A=v;PZOm(&E^H+9Y%6#|Q7XVH#VWc*fXwN`DlRRq^;PyzMcw zEw^j1B4n$YiX4ExKM>(nP--FfeG4D39EETBkNm5h7qv?-(4QTs>U+U=Ql~(42R~dK zPUfAmm&e{)p`;>JupsW*ve*Lzbas;g7cuZ+zUf>AE)@s++obaUHt9dDbd_UT%bw8i zBIVj3SP|1_g?%`oHcKxFH`+U}u~Ix;ZOK0p&BCOC)^aZgziw3w45X?iC25|HWP>q^ zAYhM6Ob=0qrZA9cB_XQW_IbGoMIdW?b&?vS9MO`bD7I_JkAb1V3rU2N!2>>OJ$BI& ziLKUkKL@#+zW9-PM1#z=o9Ygovy^Uebp9yV|A68^_(4GoUW!?dxqbaE`~K{s$o2fs z60qv#Hgw=j@4=ITeCGzOXN4z-5i8Z5&}<9yrF1$k!_Q5_=!awJm8L27xSR#^7t-|8 z+kc!lz#iVFPE)jq>fw@$usH3bx$_M6w(fngZ0ed*Hs2^%Qriy zGNe7H)y!iRij?1`tB-xQ4DziUr&=THFLgX5|IHHqFP75eE-}Z2+?bgf_J{K0M4*VtW@%vhe_8;>?Y}tH*aEUC*q@@2wqlQGkF0vKqlD!D_PMOhi^TXeXx` z=j~aDcT3jR6_p2zbRgl`by>M^o%xsP*qBW zXooHP5`zHNF%+7;V_TKjxXK%qT{3QnnFg>AKEsGvC|KCcuPtNU_jI>BezLkcJ&OQe zE-e+-+9~u7r$jdvUGzRgX^i<&*t_~v={V%E?}+$0 zj}iL}y}W&1z{nKtGXs`1c+kUqkqJ2^?4|pm5Ehh7G+b$0v`UN!G?P*^wdFZFM&2$8 z?}{`$-X+I`B66WhJA0~KJRyoQkcKA+kCq#g0y!l^E39~*K0=x1$d$6e1uTvw!zOn} zO%E(~hQCSt$L{~XMC?hjiy;BGRR~S{@Yro9vqLYg@?vBihZgKX=;4Ax| z8ejt|b2+LC8^?E-N|sPY#(Ppif{l%iL@*UW1R@u(!JJd_@G3p6pq%6fp{3P@(6Zr* z`NBM5Asnqz+7<8VNkms;Q|r@=l}!gkvo;$M&$r{F`U-MkbzG zb3#lJxJX{mB|F}}g4y@;0orGOhF)o!mJh1|kTR2=CM$NC-+U}ZyK+87Fqu*(BUGA{ z^&jrA3c6%qICiC}NCn|lO$p@gm4g;iQcV};eLWgweb;MFZ19`vh}#IC{(F%J%vgYK zrVdho2gg|J*j#QC56hBv+0Dl+NP}7+vI2leH|u%!u&+hu-q8LlKkfNv4~6`zl<0i6 zRVxO7PBAvycP;y7qwmE_dyDI$rnfp1PJsa)v`RTB*JXO)`4jF|%b|CqJK556+dSxX z7+r1(S2xlv4gtDSV>A6h*(6)|EOn4OH6okev z^QA$KWoLv|D_|_5P8SG0usjjpSjkDDx;q1_f-Go=mN4qA(S}KFWrjy^J>wyH=NcQ1 zK!=B+hY1toil@(=zcPikR%lCHk?v7A+;#Cq_Zl2Ly)NvJeq^z`thH_T2j=q2kb%a# z)95v&XL3bD+|Gfw*{R@Ntkvmy%~0p@Cpwu-JZmL-rlQ5|0r~ym4{uJ8RVoYdKV)LBx~TA2nasVs5!Ztd)j{#XGg$5xxl)L; z$8!im7U+T0=(70Fr;9=4x0!wuKDY`0`)~07I5p+w1KfQh~9x#?8zWi98LN6M}8yJ25>dlhX2uKZ3lMQi%X@*Be2vwmDr_Ga+ zKyRc#TerFK({nXvFnKDYUHT!Hq6Y3!HdPd_~3yjm>XbenVDB>Y3Q+N%Yz>+qbH_#Ui)))z@u% zdHfgJPYj?7jR%NjKi!c*9g7E#ym<3?`0PVSU-tyowkbd07v)zk^1Y}wD(Py}6-3oU z-i!-X-w+hDoZfkC-P1Pm6L!*uHFAb&+a_dnfu5Z4tX64vp7yM5trYU=5H z#M7h6-_A6f^UnVfik|+bP}vy)MusZbKZH`IlF1IQD2i-js@IwofuLR`jD36#f9)xZ zV~ccX%=V;u=&w(+sHzbHiYAroh}fDM1Uh({$0Zc;QgS0yk(p3YggTA{OGpG2i{p9n zh#G++7ZT7Bs1YkUf4&KUvFy1>QA3|@zaAJbDe9ZFl)G^TZ=pGtme@CNJIQiv?!r-I z&YZdzqH!X=XyhniiK1Y!PU&xM`Vc;u|MjUg=cRTsJr2T0L zF)HtWeq$vFP(F4EKLwdF6F9TID#$EHe!Y zEB%AHY~NvK+i@0x_Hd8*`7IipOx$H;R)U3WCuLfR`7=BKN?YqTh4E7r)J)>LRzAKe zhQLZ=IE5ZX53k02e0>}HZInd*E3>63Tq~8$b1NltBW6flU>+6=1erGH1?Wc-<(6B> zJz&Dj3tJYJ06Cyt>X!JLo10NLjFn+Y&m!fqoYZapSa&CtT@m3CdIV+`G9iw~M+?%^ z{L>Yjz})=M&@eq%a9Mmj$Y(&SdTMIOE!I238}oHTX+b3&BS{@js=b_x0oE#mLvurg z7m}L~@?fU(&UR+OhnQWbf8df^-i?b?7$WwXXVFuhv8kKn9i^q(`s=K8s1Gm^gTK?3$mAyIEj%9ufrX=TB} z>(XC|H6x=dV0p}t2>d00d)x0~xG9{A)-BRwJ*j4)y;ouB&P@v@3hYopSgIo0o3NLY zn-^dLGH_{W?rC@zxM6-ZM;k>VrlyuC5nYrLYVwQ~WF?Iyvi3&pH57bLx1iiEzB+JZ zj|pz@Di&woHdAAapBPlSW@|8)?{6YI*^TYByPTWYhiZ5fmTcd8r6YM@A!6B9zUo=K zHiSXAno7uY*)o?CCm5|2LVl|^pKL&in&@9Du=>Yef_yecxwyrka~usQR&r=K3NsCL z#E9czGRB81@APRWdP;|{AJ8%AiLVzo*~8&F#}MDb8vE}I$Y9?iZW^_YS3m@C7{1@( z4%e+^dF|0}T+lZ?sWxde5||RZm7~_qoi#6Qdzi2Y0!#E25o(ozwaQ2G5$SNF;@11cE^ zCa>dSZBkMo7^-#kmQwj*Zy*DGd^)2WOuA;Nd+X}1u^uTS;X+U9qq>_YE8%M4_ixTH zYKN`6ey*5GPKkMk_tVpLouHu_smol3M zkjLdY>@1U`SIJS{NKGJzkMhoNfAOWBGtB7>%Git6)o<1-C!=J3R~a+XnSpMDo^um@ zuyZkof^0(^-RgebA*fWiLowv80=O8O>6#joZ)Y-=(LO+=PSz- zn=868;`rIUmCi?bO@7G@u5C__MgzJXZoSmeBkN8sa$mQ6_kMigQhIV!emd+F*Ewa6 z2_z~b)EHur6>!ufE+%0Q40#?mZLQRCImDC?UvwW%S1aE*BI{vI_>2N zIy((_Zb!&ByIw%w7`OX&uR;GSzv!udJr}JhcD)jtHu4=gBG(HRycc7yqwKftSfuM6 z??!+8QW20abh_;M;qlhnOFY%N=TWC%=Dq|30Zj7&BT{`be3VI>&qa`(?ulGoHySe< zOb7jxy;JHk(hjSXSF}}xSEqH?re>i@l8oB4Mr*Z@a*>;kQ*YxyU8Lpt-mA?44d$gG z31#kjevGS`y*|hylCrP(2ZZ>7#d6zl#aLcX5BQXX%AFYRN1!b9maexav1Vq`sk&I4 zPr5)bMaU8;%8UMIjo-_9c#!?2klSWCi3iV-oUE%pKOYfhqo+@hx%5nWa*q&iwQ%dH z3?6P;QmK5Df5<8KdGa+4kyOMaNv^Iv8`+101-@r6 zSBngcNWIj9tNegMSE_40f3F0Xyb6Z|Z3stFG69R9(CRjQU7pteOsY!XK>vAbmS+A9 z+5iMI4=ZFk63bmLjKgSSZ`0_-K2#54S@-e>l`}76o>ogEbBtBr`3!_@yh}ge$WjdS zjzR$8U`k4K%4WDHCTJi7e6oC^1^JfQ<$ivL5rv6i%p5@lf`PU=*P5GUttm;+bUG(O zWcl_~4-VCwQACl($C1I8+|_Ft6;T7|iE+$)|JA5t7Rc#@zTpea;L`FPaqWBsW|?&J z$tiVKcbA`x*PPO5mb^vp1|@hEa=Wd7kGAHej)pf^ccTDi&=OMC4G618yQ>OVbZUqi ztZIZB^bn%?AU@zQdyWFcSQvKndz(vvTmb|_TM@d#bQLaX^oG+tly77nCwc6NH3#{M ziL6IQlQ|>F&Kwgt#mqEmnu5ATkjRw!?ZhSf4d9<|P13)eDtSNOWn-gsgjwfCY`xds z4MGzRxnnttR;0O?ZFef%l@7aaL|;?!x%Hsey}DTNA}mzXm&N(RtecxrbcTPnzcQ(~ zgoIQL4dr?6X2yY8V1Tk!Kz4JkHS~04QdLxK=Eb^lh;|Foc(e z3gXSvuGQC17L}s8{E_?HRL{x|04lC}E-j)C|c6)95=IQjOqZvv& zI~&CY{of8ds{e;K{OgKVo=-pxCr}6D;Y;8*d$FGO-E^B@wm&qDQI;WQO}M=k%~-1+ z+9tUhXT-gswkS3BJBA6w(-QR$EBb|=0X(3ujP}jW-}{MlgE^DWFx(zs!L@J;^w$ne zwX)K|B?u24=ck3HAvDl5_p)#OB%IX z8;=IBsHk${i>n~1dl}dQzzhJXQ}KR8)s^vu%Wx{JxQr%^H==h*fSQrIjC+pWK5}yRHbFL%+2$y8fK@tFn7+=?9 z>2$Pp-BzQpuIR+6`tJzA?*dq!F=Q515Ts=9IfDa?7osieo@UPc31<|Ici#3e5&s5h zMsW@{a*DnjB`>9M?5SIxWS=jsQ`&zjUG?7p=t<1;85ZTHNFIU!0FIjisi0^3Na+0o z>B=t?ndqv&iI@*zYF5t&HKDzQqwxU^8~{@Y0E9phgR7abo`9NkeO;6^2a-Xz8-Qz4 ziofeT_^0PHin71Xt|TNsfTi>BO9FVF82inid%IUJ7;CMmP+9CCXbk|B=t)j70f}l{ z&$OLRD;n?G@KZ1zGBRY~xX^IFdF|Uh^LRruM4M|$NzegiY@U=f1(F|?dcbg|i63?y zY_GdaR5`VwnhD(iWPM3`(PB4kqfft?^GuJn);_}Vg8Pymx;>aZlCvPDP0pXU{TaAq zGBKgiSdxElS#xM>K9T@n-+kn%)PEK|t0y_>#QUaS3jnxqqV5_1x{EG>j#=#H`-s5# zNKWH?=H&wn{MsN^9e!Zb`WevzN!kj)s#75eA@0w2B zAeZErl$_ad(kwl~0O!(WC<)t<5;_C&GVH*a>G6X5$ z%wwv8i!&BZL5w3z*qBIgVDEz?73aqnk8};6x%I_=4}%EdWp-;|V6HN1DDJSfs-f8Jk2Qur8y(YJCab$_x{MjF5632IoBe}m_7B1& zXmGXD9^7)BN8Yr|v&vOqGI)mh1I2E8nqKigQA6OPI?2Nuy+5uql3j80UibLeL<=+S z0U&>J_LYydRLo;gO|#2#f33$cymfi0qkge#l|>TM=in3wFQ-5cdY)|y(Mx`x-3-$O zWIoucGE5bBdVdfyk_CVjD;mrRYswahoJJ&a+PK0cH~`$R)Pb8EOL0q4QS2*kUfi+? z06P3lodDKkYJfqH-{pPuCt3Bnzz6^!P@7(ez>P2YeG9eJzH;KJOHqHy02cTGtG0ONb{;?Y3) zjeG9(dVK{~L-ew>^VQxb?q%lRPX9e?B-8T=!0iP5Q`1DZDksldET)mONA^!#QBeTs z@HZU<@PMLl-;Wx?rLky6Nj>_R`H^!yEwARMI7!-5O=op-=jcf4z@xi!mIQ#6MAT8f zX7`Rf{AS2}z}vi8D(heTOMtfJ*~Lhx`?Yf5UwM6ll`@v}_Hy*xv5um$nh-#@!{Bm4 z2P@k|dvdh@T#oet%;Uy+sJrDk!T3CYW4U%>HJ9f-v9kHGfl5EqxP=7o1MA#C&xO$! z>S^`@`Q5N&^A&;5_3ZycsHSx3jrO;?c|)7K`f?QR-a2#po6oy#@TqDKb+cbgbfhLhwO=*sdVjZ={QTG7 zg~cQ|bj$sExo!5ip?5cI}RCo8m@AtnPR?CMfcz@q@5A)gV z>FFt|`^2be?`A&+Vff*PA8rqy?tTb@fOhwX`FgdO^aUOs+pW#GUd^g)wX62sVWuNJ zn;f&Rj@ehzdi|+dHM?E2KiHD{!@E)DcD)%Ym)<i&#^&Ch zLp3jqykG9B!^3h_9cDhWE&o)nyZgl?G4|=cs_*W*;qg;lJ^i-%yqKs!1&QImh=D5Q zGLIIAwx#R!VuBHLkrwW`pXK?GQ$?kTOz=Kk#Z{r!)4(X5hpGrw_MtYpR+VY=&Pf`hf!q#%l*ri9<7>f)6U;nOQ@Sov+qLtX1;IQ-E!+vJ}ujN zx$jQWo~(6Gk`7&4b*uZ+wEAl`-&O1Sad)$=_f_a-Ul=Nu?)=MvUz;FgVSyScBPCo;r+MPJUmag%Xqw)Of&snfaJ z(yyuwWna)eKeDH$T|ZB=ee7Dy&5qo;cAr|TxW5Z`&AOUz+pzn1v##4}W&6DCTGx2f z)(q1PWLJN#);H^BSMOOH;m75nvcp(DcFm1{3J>@7rkndmSIct0x@XZj`#jy(9Y&Rv z?E8GU=ZFm-mTNhmv8k-*uzlQG6Me1PhOQkRw#zRZ71HEQ!=Bu1o2U7w`cQw|RyX$V zdRup2hNMR9!n2BEmDqiMQ)5;)7TaeA6jFG4Y zdlb&|C^kiz7OB4J)1_zZih0{S?$_hQ|8461Y3h!NX}2|h%@dzSnCm#oRA$O@D01w$vsjCT*?Y{awR*i<-c{kVM7IK-CE8{CEUnrvnKBmN>X$n^ zr1^5SdfYuSug5bn2smDMK~Y3mtT@l7I!U6uC{-4$f-sG;jDtIy0z_$?raB0E39i0Njqq+FIIMUrOI;TIsL`9r5w zrqXmu2bgPZWJpO=hLRBb?p`x5+fd#3QsgO*OQH7x(oyv{L3Q3BKEH}Z|0lpm-5Tq_+73Sk~ z&p%epo-Hf~#_F;CWHAX&GYMwGDS-KzhyVWBKmI*DA_>c$mRxy+Xo(gicjS7RjAxlS5u06I5RYd6a`9e1;YZconpx zc?Ir*@?@1l0Dlr|fFA%)1!vC#A>FcMB8%cY6XXW9w9YJ&gq8(C zp(+M821Qe40;vLx6NnTL${?^X22TTeBjgASg;8W0-eRyKXqu2_B8^SxM+T39ct}bK zoxmp&l#m<@YBK@eCQE~@C4o6LPkC$dIL$m`IL|RKQ&Pa!5vxu33?aAP= zUUAvh!a4-}WAaOO`V}WxDT^p$PIGP96hp;cVv-b_=)_J-T;{Al65*6d0V@>-g#k1y zPqTXBL{fAK)ksLfByc)Cg|`*VY(^6Fw8)`5vW!fe!L`oP50iz?5hA1lTJn#iA1chQ z^ke_hAroHd$CZ9u>Bp~&eiX;nZj&%t2u0U*u59$6Amsz|_I%T0JT zac&a6-A$}Z`NZW-lHeWz#PO4Wv4B)5MC3f}=v^4Vsm5spoPuqs9ZUjKGD102k})<7 zCT5HT2SW_@@o`;9gRr9*^5r-cNMBM#Q7|@PDbOvvF??*7c?LEzdLa|k3DhR!psza3 zl>0Krh-4}vU6cme#Wy<62O%=B77LOL&N@>H+dN=Rvd|D*QrbLkLFJ8wB!zSEi>C6zq9e&o6L5xL1i#6xd#Am``!Nz!mApC8Jt; zA*>=*&hZe#L1mE$yC@Sy&#_a7 zrSn3DTMGYW!f-A^GsVq<;w09FdXyI!g+Yz*UWk7zqtICxUm3-fQ9Kh%uENMw82J?n zBjHgQ0m8w>UK$yc5ig7Y5l$E3Q&WTy@vl2wL{tiFf!;Of?G})8FUfh z2Tm9P=z3)YoO9BMKvS=cSPz4UBi7UI)DcO0TOI+ktvYfPM+R*K7GcE^uZ?(VgnD~r zghEyr8FUdZi}b397e)BWcB+VYYpf{3aC%k5iy{z-UKNo_L=>?Sic>{;QG`;xDk9DS zD~n*oUKfF{SYZSV@0AfO<)jgW4)V+I*WDJ%ibTCOVnrLOki z0iSzaL}1X$B7k_Wi+EXNP({2bGH4>=Ww4USpon-u1YXwbA&kojA|pLSx?u&8ksc!6 ze=CR#dI+6!g2+)1;cMRsB4ir$kltM({)^Z3kdbg?6_MUy;Up1E>@|_sB@uC0VCP;C z8S5cl4uLxMYRDjlK$dzfWROCHHaRWCOCh9qEyPP9!q$2%#7iNLGfBQ1mzz86D4UZ;ite7zh3q&YprN&-$05ia5s5g{8+ z5)uAkH4)(sy(q%htJOrpqbTAv5g^2hB3=`rWhaUZng~#2MUgi&k)s4)H4y-{7e(lh zQ$+;oMHV5!=^_lt2_y8+>LS9AoG=2;TU~@|oG{{b5&CC^kwF)sRws-Mx(NNXvdEx{ zcu{1~M1-s)3MB$U;uH}th(J-SBGL;YG~X*CLbk>?F3>Yxmqd;lkq`_~c;wE7C?Z}E zc|#Aupu#Q&J;b_7tQ<0^Az~dXhcKXC4H5T}lS6tn#PUTehcLEY4`E83AR@!Hiik{? zl|*>eYa(Ll%c6*uyA6M@C~`ZK;1L^BGQ^xnz{y%-UR>o8VIsHi`?emqbZxI=FDCCc z_MiU6N8$yl*1tjt6Zs6E6h~FTXa; zZZUDeHe+>&h#gZvZn@;_oj*gF)tAL2W;?)K}>*+Mn)PvD#+29n5yIswVVQ;0N5d;irf0b=t%|Ma`T zo3&ca|GQ~_Ij%~{u>9CO5==GtyzqLhS91v8H7(Z3m{bU6VH&Yf9 z`%^*^-s6JRTo9KNA^*|azi*!&P{$p2{QUF>!Kf1K+}5ApqyA@Hfy>LO;@{&_$}tFX zaeJRz`K8pWrEo-0K6n4^u{QE_)FJ@&G@1O77;d=;BWGXAO&m)nM@{ulkN8XJ0BEb zLnMD39V*YFBwugHbuBhyt6eT3gXz0w#xr53MSMVh`GAuD^jv zk3U(?pLnmH#%Df1F6YOj?)2spYqWMRZx!wxy|PtaZAiX8fV`p@e{EhaA>6yi$d|wZ zbo1d#ARm|Tv2sSF!8hS|+T%(-GV;F^u6Sy77BnoZ^z>}-ND8SQw#XZ>lAK(Tzrc+* z#cGqp-{A>%=Af4^mIT&8=we2|f$&DWB`4?n#l0e0`Ejq@&hD(YPyV_UU*(4%{txa= B%Fh4* literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/logo_searx_a.png b/searx/static/themes/eelo/img/logo_searx_a.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5d83f82262cfe59f7a48964149ebd973ad589c GIT binary patch literal 10697 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/layers.png b/searx/static/themes/eelo/img/map/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..4297fd9ee035ce8063e91e34c6e6629c4c2b22b8 GIT binary patch literal 1142 zcmX9+2~bm46b(gc5TdwYr76w;P8^X%P`e1F#V~~`30obQ4k8L-Ym1N{lCW5|1P}-* z2ni%KIv^v934|p;u!OKAh6J!JA|ybFIzaB_)7N zCbOWRfW=~!m6btQQ&Uq{R|llAu@O)p5cKx;0%>b&8y_DB-qqDbB9R~?kw~OcDUhL| zA-P-*M5$CxOiWBpP6D5vo}QhZ)#-GLi;HHn*3}(U+Dl02N zDu=_VuCC_scp$aDz8<iL$cV^|qbeK8FJb4`H2gr+m))1q9$P5(r|GlTF^{>_`Emk)-AyPontoM`=PL2i4ovz^1`fIE%J zAJhu>Ss#!XpZ1c4o3&mavL3oyVO(AK9$Hg_Pi(SA?C0W&X(LA`;b&C{ZZyTGd)cu@ zM2XJXO~l3E&nPsEh$FZ5hT_+CyuyL{)+dJO)DqfM5|x_t!r$f9Va49HkL4}#H^vgR zj^)3Mj709A5%-=k#kH3Iz49{7l+Sp5{WNyM3+rvk*0OiejpXeF6Q=LCOGb5~?y9MO zs@8!vGWp~B*kgfaZEdB+X?1!PciP+L;r7jICjUnWt44Q+fXN}!l!f1&vp>h78zepK xr0i literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/marker-icon-2x-green.png b/searx/static/themes/eelo/img/map/marker-icon-2x-green.png new file mode 100644 index 0000000000000000000000000000000000000000..7446bb031c89e6332c17133db99b3c14552ca237 GIT binary patch literal 3753 zcmV;a4p#ArP)ME7U68L-k5E6t48$qgVPK)|Pl@=~doh!Xxzmz2T+4 zXsAjV@leU+s|OX4U%qX-Dzd~I)+>B-$kF!*B29cuSVBba&{syT889ND>cB8^elFpC zf=C2qL&T~BB6met3Ecy&lbDpk>0o^X^<8Cl{V+iyg)a@V!t3eQxn+>^A!5EbJN>J0quN@o222$Mp#5(xc=@K8_YQCdR5l8mqF<=&+P0fea> z@|z-J;{KSp<3QZPxc$1w*&P(wZ2=M6=@+pboj}LpyHt_ACm{0nhnU<2<69zv%1cN) zgqFNA_4-~R5-;`KKnizC<$2FXxP0IQkWbFTF?M`g4?*NWI{$!X=|gt&Ya@wd{zBzE z^0J7K0y~w{yV_!p0P@#|Era6^gbf1ZP_!4og!bzl0oocC`eL6jZ667iE7~OyiI(|B zg%^AN4MpK{zsTRATlJp(G7)I?iRji|1_-qWEIau-brGphnGE@IQd{I#dPF3*M87Un z=J_*$73H@lkf6x*I)P4z?^Zj=?A1h+S~h$k{4GGGo)!_?+kd!<1~g)zUgqPdutKV1 z%!9rrApu*k$+p{c5nkjs$dr1vceQ|CywELF3JC&0Yen5M3DoiyU%vu2VVix}6c*Ai zA~QEB5lUNTaDnn)044=30gXb=v$S=#b&!cy2APaj>R#U^5r3&W7MSlA0Mf{r z*cVJcaHIFu=y+yetm7oxlT0HxJeGC=(oeP2Iqo7N!4jn%C*xHik&Va^^zEc% zvo|?lh_WEZWW(|2A|ks|6WT(rWt8e##Fr4!RZ%8p$kt;*;^^Qt3;U4lk) zE}3oKZ0@_TyuiU0nCpH-Ep~~>BEO{!X$)@Y9^svaEQq7tG5*ok-*X1wEF3>`=8QOd z_Ur|~F%bIfv(Gp?#Rq5eSRk)OH@YOvgJibhoAfhMrt(AoQi}5&~)qtPA@)=+;yCplvgJfX^65IAWteC-6_anTVLH zY@kW$7Q70RT=u#!D~T0{xD!btsYrB1BHi?|D`DQs^Cy3lN zI!|=YND?JMEKDSqvm+!h4%l$GxyKoirFG=k$3ma$V?DXeh7X|>!PK$gBsutO`tXL$ zH`Ccd5ZTMZd{S>sL1djlgh>~B1;)${ANYNXPzPeG`#`JQ$>P7pe66|g=4JYb!>TcG?PmrY#*WBpIN#H!b-FKWS^ zAxX&AyXkO?h|E!0N4!dBop3UlZ4RXACw#_OUy<_(o4?4J!~YN>I|3|#)T(RU-6GJE zpsdVrWYU6saqz?aOa^7sd1X&r)v=Aip6iDzzsqAobE&1b8MZ@PlG_e$G;Bw98Foz~ zlWlkZR=9F4zw>0M&|TTL8oIE=_k;D2;Cl+*UV zZx#17{75>%-3Pifs{M5B!dH{XsR=W+uk-HLTV$`p!Em{;vZMW}4eq1}G%75|7gf|f zP+rgxoaqr$TmQ(;!f6S#*}WgMiITl@ME0|~6-`_uCC<%McIEtlucnS>Ya8z=az5aF z%E3Ju3e#1J#YxJ?*VDd-CM@(wOf1e7_c#7TJlK4{_|Ae!g38!BhlMm=uUq4}oO@so zRRBHY`>!k_YJq*YcZU5-f{4|JSP;G3-{4FMY#9(GHh^6*MHuA*U0ng^!n8q*Yzy!h zjK$iNjx8*N7!#`vNqt{1Z03JQ~@77)3e^__6D6YE%R{*VYS3I0MYf*BIIeX z4=7YD!q_@(Hx@wn=$e-KP`5-})0G=Ng;{3_BDTu7uZ8Omr9Nvwp<@1#FVW>80pHvO zna5pIGpBtP`k~HpGZ8{b%DeI2saauDSVY$bS%IHg z>_8F0JcAF>nxG`{rMJ+Lk=BDA5k9(9f}AXVi`9Qy}xOr9GdJje^X; zWxe@8U7`(&d?hYc4xpp-6$z)g00OxAW-fpYm;DL{ZCi4ztgJD!(xUWvHbSdZnT;=e zg<0-id8vlTZ04*KyLj^lAS<`mjp|kK0%+>T{VJ2l>Rx+0NSW#g$*crdt8B=--Yv$G z@!kZo0o}oseo5kU_Y8YxufDHEO4o8$p6$pA`u&)?k-dTovhj>Vm<#gKUVrh7%1gmM zhqFQvV}sPedW(q6hPuKhvvJ;E=or-}Z_uG$*$CAyHgf>7GP-8uWdZX|>QiRgC6Tf| zdleA%in@iNz$zcFzPRujRXgIc;HLQoUH)pXByq-BU?1M6FK1FuuYxg!>KNDP0JapP z>TbOx*c&rg2QC%7G8+ZG7 zvTEwchI^X*$$o#O-1X#`8_4(xIN+yP!ULz&WK}!A)pm-6+WX#i02#2@yqPdD2p(;jF9CC5EgSB5qo969d0-jL$7}$ZQbs!TTD%oDn)ca0d4V==A|Q1Cj!#{|(GR1I-7 z!cEjgdx_KWGsWoyZ*d}Kns_JDL)3)1h+E|eUlO)eg}OXEY(&Zf)OS|}X(B5_oW3Op z83?*jH(y*Rd`?{2zRV;#ieD7X84Jb9*y&8Vo1N=~)UtK9za3H{6`M3Kk)uy!$2H+@ z9DGO7^Wsv;OFeLL+l%62@$(Ys|K4Oei(g<;N4I!%C-gaCttIowETOlTPx?jqCa3KL z0aR{w7H3oEiOy{lY{|RbO}|06 zK+y0KvL8a_VL#V<2Zc!KI?a7#@RV%)RQxO+J{$z0v*eD(siA=^WB z>l0^pCv%>L^MkiVgbYli;q<|gV2uD8(&lv$pdoP~XQAc6_kmjpwPY?56(L$-^nIlw z*g-QOB4vTv@katRpTQ7@l0Iv(GTuA#mWcNB*`h6N=HP+|UC8b7W5{`uhZ>U!)O>R| z)Y;l1BKtRb-cuH&X(zCu_WWlQ6o#(+2laK*lorO{Y+j5tR@(^bxQ@T-8*V_WxgUF$cj!^^wptXVk zfU+A>XACRgQ}*AKzCg%v5gDCHB2=~s2Ll~%5O_6~jUYRQlxY?NfygbF6EOfATp42= z=w^tG@Iz^c_VGT6kU%K}D?;6PO+aZeUM+D9c}!TW6VSgEXcY21Guvk7Tt&Y++?~mk z`Z-keN~AQ{!Sz6Zg8)!Qc3QO5{LE1o>n(W9vDWM*N@5g3Bx^~fksRn@7a+%38es3$ zgUH(fj^}W)Cc=YO>}MG5S+mH<)P6ut^5!c#ZTU;YiMUy!I%0}A6y((9bR%`Za1T)z zJCj?vEYE9E#`J#upn|eaZPXOmZY!FTLgYZ8#$ms|g8*8y7KzS+r`SRNB&PCEfjsbT z@?3GiPa|Yo03}F}{T|0o#(UG|@oCoU$X_bjQu`;v2_tz!-s0}ITofYv)~n-j5Obrm z_$fwPikC2?O)-fJ+4EVpJ(m`)2v5a$RXio5wpd)bbWU9V_G|IO_uq-nKQf5F)x9Z> zXT7S(9og(AC5~)#ng0ADHprr@LZ9$H6Cvl5jR%Aw zYavf?1lgME(KnJjrOrgM^(nI@gZ_@<%6pB%+|SpaUKXXBJz4iy)HJrm%_V)BN#C46 z$kFhU;|2$-J+G+)38HM1OP4V!qbXzUIdddAB98G6{kHNPVd>{`b0zBnjcHG?&GWhQ zO!`J_a-4@lTv>PbYYxF6l7%m|TS%aAiMWuzP_(AFnFJ;sWRXeeR>Ut6Ki;@52J$&o zD_D$@3h4gp1H*uce1Gj5 z@zz>3+tFuBnZ~+eDh9*|Im8S-g5K)QHTM6+m$PX;wAwD>MX)v5rBAe_d$C+I?Vs4l z1_yEDyKCZhK4nq!*j9bQEVE*0&z!+>h}lTw3Mz6HUmA2iJU@^PeUfvZz)6HQc zdxJd0?S87$USeA(5@xV%WZaw>5VMiURjXa=>^cctCN@IZFlB@nLXtCN&KJ-Fu739M zfJxlEc~k5OaArFVDaK?{)lCw~lww89#uzSI?O1D9Nf7VEdYP3CeX=Xd0s8`+1av=a zsvIzpudaN=Hg>MFrwgbBQrDz5YbplB2sy+IT|y0rdh9D_|F%gh_?b<*+y;jRAVB2`c0%9Ct`*!A>68DwVlWI)wX<~EnCX8A=O>z z6CC@5A;ncOb~wycK>xs&x#Grk%eq&UZaM4j@u%eEO7_}xo~C`LN+YK|=LwD(`ov+j z)mCrMyXebTI8dK7LlUC)X37`<8OXL~&E@e8{qp1&#J{gx?w7!|t6z%ag@Hm&Aa_hu zBiq|-zlat3gm2$i?fEO-{g$j!9l*hg2x-;CWNL|bFpUHa%RwGP48sdH-dIn^YhUMJ zdt3b8Z>$u%gFNLR#L;L^wjs~W{`_L-K_0OhZImn9_>#4DuWnmq%RLze*(lAE{)}RA zlI0t9v`znP< z{>!Sd#Vb`e3F2(>bQVM}Z;7+-7rggDmPiM?VqAt|xWHC#pz$n@gws|hYmPA}A6}cx z@r8vDI%krm$@YHSzI^hypIoySt+cJe$tm!jmOPNCVGRKJ# zhIDtHu-ysu1&eJ{)i}B7-W(&xy2fsL4$QCo@mK$zgua8|$v98xz7{58jLnFmEz65zsf+Po z68X!mzs`MS(mf_`Vw2!b2=DQ8&0*=DVj4NQ7uCw}s<0+U>>#(^LQ zCPIm>Hv1PV8iUXBgrXMLllB4Wr-v8>MO#thA}K_{Y%v6{>}D78-R^m8!JF{dHK-mf^uZ&!kN0s)nzv>wtcq zCgo-rI2i0m*DBK)JPBhTA5x%8%KmTz&Pb$cz`wIoRc6WAIGf_Z{TwTHQ|!bc1u73; z^-1nZHS(8Pt8eSc2kH{_FtjgF&Bg(Al;+sSh6I?0vY)rs+sO-H>1{v4LE9D&IV)$9 z-Pr+mupuHMSL0NIt6YsA3tq9AJSY#<5SdzD?E}=j`2$durkDwX3a*CHKJHf;iR>P< zr-SlV+B(Wrc{kC89T{}aqB-W#K?PTXY@dvGkxBeeyjnG3P@mT#qh&C@+uvTv8v1=x z^do};bVJ$h&b7uJuCHqQpg(va;n6)ms6t!Y}(6!n+ef+5qH zZ5@ktl1W_4U!xj3qz`9OPcMP9of~NN&2VF2OVPOX&jW%!eiGZjrNZm0rE1VZtQ+#D zOmkP*Jw(o~!{PB5C)!51aR(a+38fljqc+@8uEsY7Yi#~7EYJN?H_72^dm7I?NsU!$ z+B)7MbXCJel&q4fk+<9?e%KyhE?lL)pPc>|j*mq-G8xR3#>j`vMnmLy)`4zKq=Q_I zukwAZe>bd8V$-!jGMr;v>(iWhh%_fYE*hdAGz-|}LPwwBtW=|Lm1@hdKT@9a!o>T? z`Bel^9jfMe(weRj4O<=*ja$Z<1Y~fV2|Cpg$~OIrlII`0SB%6%{QB9chLt{DszybayNL}pub8d{y5=n8Klt=MCG1gvWXiK{ap=GDW^N z^4#zpHLoTiqsS}*L#8oL^g6XTw{@&I7kR$~`X9$|t}Mh>uEvM>4RchzV?`Zoh4FU3 zXiQP_5Nb)BK$Z9-0~O*Smtf!hX4{LS?qxA#mNt9u^G&^tDh|3;XRiz^{EuTeXC!fH z$Ns^4VQf&}c%!O3r`*&_w&UPY6#)O^m~wk(g=*=jeSOb(tF?n~>IJH#Ds)3>utK6u zeqMLfzK2LV<3-9%y+m7u1pb$g(++pusDGi-*p6Ee@PPmu+Pc^=_WLUnyz!2BGt{^< z_Ev7{C8$JwysE2HEuTE&jv->K%DV`Bub%`XkyCffySm*v*pzPTg>=2K!rJ4GBVxRp zf3zEk+B@p)>05|sx~&_UJC=xXt{evLxcAw6tSieVseqyO^FN`9cY_M;|A7Di002ov JPDHLkV1k7n3itp3 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/marker-icon-2x-red.png b/searx/static/themes/eelo/img/map/marker-icon-2x-red.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2e197c645f015344f6471c90b8cbd68b0608d7 GIT binary patch literal 3692 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 KMNUMnLSTZ2%@Obb literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/marker-icon-2x.png b/searx/static/themes/eelo/img/map/marker-icon-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0015b6495fa458ad39d51cb4b913430016f48d33 GIT binary patch literal 4033 zcmV;y4?ggTP)h876I}?PQWpJLz%)x;}A1s3+;FijJ6nrW+Pl4)+EiN1Z`Z};D5lx0BtvZnmddk_DqORVPG3@A z|MUAQ5d8CyG`n3U%W5w|$1lmUI>14Eit;<8S?vK{s*?{-Ss+T)u_t92ZJTA8?H?iF zR>;v&x7=gkU3dZlw!Q;_2%o}};F13pC@6@Z$Rj?JWwli(vf7`Uv_M3vmPaI6ZRyg? zwr>!?ft(K4bi>Np0r=D2_w3@8-GdNOt_Q!(r!eStxP|AMG^4f1MRn*m6B>vlqxDrZ z^e+Su+;WdVxV9T!t{sF|>)yKqtLo0f%X=)K?{|}VWzP^q==9)`cMLdQ#3#~>wy4qc zkwZdrRrSA+s#>ZLK#*s&!Gi5)Vb$&-com)GuwvIBL{{}fScMrv%gqq1Gu;L{wqS=D zA}ae~dCefKx&Wue^ipzWJZ7j zXOrbS%~*l+4B-|15TG$lD8hF1;}EmhTVCA{%ItO^Ul121NsW&?6bK%9NRoQ!5CUZB zO|YcG$Vgw>H3Xqp1%I_^QV@c+R-jF?y|mH7qa2-(C z0ugQ8pDRw<4{n()NIJyegIV${HQGfO5|ixWN;7!nv;%PvB8%H$$MGRJ`}fQ6#kbes z>h&MMcTZrm#Ts3`fhrQak0q-hmbwneh)8_kw~}aV#&vv&0DQ zTMfe^L}O-h6u4_rJ&^vk4ik*_)7p25=@J%{bu-Se@_xIv$v4hVrK*YPiWBP+oJ5Ir zr3moEi=@SPav_d;H&n2Pu<`*W>zjWJNOw_DD_r~j28`tsSACjsxMemoPU@AB>{HW| ztXJMqrYlUW(>mdwMq$Dp@GE$mom`;n2e&N-yI52)$YiOCq+5IXJdE|zd*KS>5aSRb z&c)UdVb4DKNOFD!$C<8h{hnqg;riV@!i3$}=UGTOZpIU)>0{iquGsT|d?Y#Yne-5SPQrxRe+$>w;#JvMh{Q|>l$k-X z*)S}8wwajRf-*gjo*13Ddi{I2mrq!J6XOcRiG#RlA-3m(|8_HzBcDkRaoI^2U;8Bj zLQ1_>oIw~*j8y0k)gb88Fw%SV$TO(&Ik0F^e6@= zLHw>E1o&f_sL`n+G87&T9yqi}E?j2>(j)xilP|{{#Ely_L7r5{ctW;yF>b25Js}>`iO75R6BpgcE9|%%7ZRzD#1@K!W4(uK@LfLHB`NAX3qZf^YwSvp;i9@cqQ*)vIMW(V~k@y^(GFR zk?hjYBY8Jfi-jYuvcKGw#YY%vDItj}3 z7Q|uPsUF8INEZfRw#oQYFK+5{*aoL3O>O}4)g`9<@EtcFTw-*g{8$|m2r9KG(G1~; z5e{y}MqI4=Zwu&dpd`7ElAEf=5>(R5d?a55G39=D1mdJp{meN=dkKNp1|7_pf2kQ< za(hP&%AULsujtTO-x4$UA&=)46DW!dAjWf}ei8-FW91wTuZPe2cpnffC0y4@sv2)Mw;_ci|bZ`gPMKR{MfO zKlGq*A1TRFnjioxLQU_S-3#-w^pgr|akh3F*-@`3{jraTr2X0$DxU9J6 zonZ#3S7xR6ObDnNWJ8&AnybbQ=UC0Wae1hQ7p*{c(l)9RmncZ49Yhd#w`%) zJK~gOp5Ur+-DQnt#)LdUN8^=@2-enu2QF9ys>*XI-S-6QHw&K;_-m@Idn%23!X5>r z@k-;CZ74HNf_oumFy8=wOzyrX$n%YiOPc-`SB%=YvR_CYcdtRU%#lH0jzd^#(k@-di-hx~al>I_R&DnN#rm07DYJ+aF!NQPu( zbl)m=2e-pbn6kGOq%ozxMkhXFRl&@1RiUgum3Vj1u#)6jsv%5j<*IR6^t$emDShpN z7o|>QRl&?k@XAh_XN1|9@o5QNcLkjz8A*rcE*n}g+c*p5 z7~m;%`pNaTgO1TTk`ZiZ=Bn}0^D(8ryf5D9p^RE?AC-e7yN3;(S*bnf{JGme)u3~( zS$ORcqqFvg`t|$f)g;O&W!6%aW^l!m_k7b2$D02GPgh9AD1`()~cZ8Oj2AQyau(pP%|J;>TN`^P;r=4@@A|s=UjbU%Sr& zOCYBon0Iw=*%^D@^5cwU6_3(-JaBP001cn1^@s6z>|W`00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-ss3J(AtIcm~s00006VoOIv0RI600RN!9r;`8x1}#ZM zK~z}7wO46uR8}Fd@wp%8ub}t_sg~zb77>@3?o?{|0wjy*`_+ivu7KX9z}#*RJkjGd#wWW} z&`;ugvpb4{y-E#VtnAVzBqbu(uyfose7Cnw3g(@4L*4~9B`>Y7w4kvg|IE|5> zX+E!80kXpgDY~zwdL2A9qS5MCus>*`JF*_IUxVPu|K!kY~|N zMdWH`5-wiV+f>NymIesgh2(+uITtXpBPyWK4RM<=JyB!}*Q(cRk=!m6I3|n;BeGG} z$zR{CQ8XuqiAbB+7u{QgaMn2)JSVY=j`G7`M0H+-+zT@3XhUPp`GGS^uton|v{65D zhNR8x5<>*jG*PT_1ogvi$U5T!^$0f%TBi&2P6hIJdcnI@0(2w-czk;n=w}q;JQO64 z_aPqQ!_9|@-z02evfNcd$biv@t2|by8v9e`V$=b;Q+kV zvDBC+GWE1`m>=;FAMyr?-z2VgypvlahiJzt8pJ?`SY0{QZdmn20ffV0h(sa==yxa- zg7rOX!Mhn#*C`pPiuWfz;w65QYXfsYZ_vPvd6!zb7^q_O78U0C@*x}zLNpqM-rn9A zNQ{IQ?41YtKFv6bcz@y}Ug9^oDw$uhS{0CwaUdRIV=z)xuffuzuNs6z+}GC^1Bp^Z z@1J@Xaz56Kl*RiKAMp~uN%+uyEvrp2@+cl;V=#7t&db}E-Be^Kn$>4M0KH~VB+j4s zh}T(Rze*yfv-hZ=9OpsR8MQ@9IvK0RtAi(3{#_73zvk?2pn$lqadmRr|&w@JNj z%&7|(hd_DNPGEUf2vFBkZIBL~3ymba_u_7l*WukbCK*)~?@xT58ZqiBvlW`SQrojq z1$Tqaz}4g!24gq-+#r{8P~KSrm#S zrqni#Ut{}QYj+vBbT%_FxLO8w5T})4#1m67$cv_`_ouWPaAA17vXgj2S75qmec#`1@!Q8sFvZMKXX zELE~0N1^$>g#Qy}RmP)i zktM1$i$*#uO&KYJ{}d~-Q3T`(+gHwc_@;lq7)=E>v=AMr#h(G@Kzh=!1~S2gtwg9~ zLda7x;(t7;<1Rw-UKel&7|8U`Ng7nfN`pveaRblz!BO8wi4!j?yVe$T6k3-j{RW9Sok;h_wR_-l&I&v>BJ8;C+{IB8zfUhqyDz18 zVa)BDLODi*H+*(e8q5q#PXNsu9iYq>!W6%r@(Z_PW!k+M&2M}?3)U7Zr1_^MfZ7PH zV-#1UO_}$M>#d$GG`~i>q)Rr_KLchoPK|+{X`aP(tjJf!{pqk^nKA*R`I)Q7JA-Xw zN?=M1<`y&1JVtS8s7H-UWbod+#FyGa%s~dG2ByMf|72ryVC!*|TEZCZ3%B$UH1w^4 zyZzBohj*qq9VYoF8BsZWc8cPATEArx<7|p7&vPZ#FoXYkGw>{E`HCsCP!v6> q_@yL*T_7I;H2!ZQgC$*%s?R@q{CX#&`$rJ~0000P001cn1^@s6z>|W`00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sr0ud`2uu{M!00006VoOIv0RI600RN!9r;`8x20uwe zK~z}7wO46SQ&$v@tzE|H)R`_*N2jgYMJqxQ0$EsO69lmqtb%pvVntMx&B`K(F$751 z!X^}A^ZV8~m={ZkKN!bG0%zSh6?mg%G&bjy8 z`|e`_0LvPvlSHqn;zhPKTltC?zF;h0spZJKE_*vg=;@;8ZEMn$SCl{GPk*LL9psUIqQKbD;DX5YjiwyK9 zKH@#FnR}Z=&Yw%056wCAK_?TKLC=(KP3Gq#ikwzPVC8v2ORo1|f8<5}v#hdEcCsqL z^+8MC0t+LWS3~~CP#z_OtF84z3f#KV3I`(5KG&bAs)7E*SCinR3`7?8AVVuTiBKkSQ2g;+JpkxCVDii(S+b|yNj}StG+?!cDU52BDAG0RN zhrEyWem(as=2$6N&(_pQ=Ha>I4!RVs1)Ajc=8dVvGHsA~;Rf_&o||*sneqSn5D)V8 zA@3#g*`-{=4k`_^H?|h~GEPl0&LHUINRTPOBgC0$hqI%8;wcN`8j&~9EK(H3d!cxp z-QO2vkM~Mbvfa2r{`INufP6R0ehhlv;;7#pVwZ9#hHq-g_X2IIEjr8{2ke+qu84Fr zDc9P@40@mJT4OT>g?fI;@?fSzn_@F&=(B`yF~bdzr>kJ~?AM2U{o-II9%v?7P>pmB zXr&)n4-{$6^Ms0Mo(XxR!@lE59Suwu4WItHG`NEyI?ERN8n_H(P zj<|2w(75B>L7-!V#xaW=6DDBPofv(eKHDB@5;=YN-0@7l83&>;gyUZv%IUr&=K!`n zD6;UGi}W8i`qE8yl!b0Aeq$2BwedvIOUd(p6X`GMxUu^D1NaN3izD1P001cn1^@s6z>|W`00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-ss3JxhJBkQle00006VoOIv0RI600RN!9r;`8x1}8~G zK~z}7wO46uR8m?eUyP89Q{FDf*HxH}~FizO&x@ z-eUm(D;hY(<|pgL)`SLuO>shCVK+(~&qS*`>1Jc9ec=g_^}R;1?NWot3MW$Rp&z7K z*KzE_`LI)LyNt#^Y!sRjV>YstWqhDfXemSTfmTiafY-JLx^p(cxxy{bTl6L~cIRyY zpM5Qy(G?7$!CUo0%eH2D`pl?|)brEl9~W6XPRY`~z_L>4$$bO5mc9-_>sshEz6JqZ zF*DMf)@h&QFhYthcr4kza8e^j1nJs3p}D_RS8%I4Z!>gdtYb*0LYJ)sNWM*9c>9oCGi5TrWc*qyb3 zsm*w@T^P|(u{Cs%Z(7M1!8FY}kZkC4n^!{6yc+!Sya;qzRzjy^12pOK;ix17P!W!# zSmAq|2Qt?)_3$fmB6Ns{_|W-&;%C+Jv}uP#=1>nt;g>H1ztj;%&`<;(>l!$iY6JJS zkKpS03ovy1HeCPp68JyZb!VNNGZjbZ5fAYpZy)iqzD+i4s+TSck;lFz*aL zxdVEuYGJ(RLj6fNv?K$9_7WylqxFf8c!{6&9Z!F_MMJqP1YcTa7}POmjm2=>x&nrW zhhd_}S+EgKYx9{}jMgVU;w64o4Nw2O%ZP2L$N^tUMi`VT>^5+1-vN_7o#lJMsdO+Y z8?8@##7q3Fueq9QZc`DHN3Ylx26^ICW`pk}XG?&E5&l9AIb zs%!|L*IuDD44PB84f&;$8aY||HZ&=+pi`YURv&qhznN9V*1l6O$-LExc^xf8dG)6k zL$xR!F1EVHHE<<(4)zI6;Kj61SB=&uzJ|1n!Ag#9E31O5G*=6ZH<@-#PLBY2b6TAZ zRYD{5*48oYOV7~I5d7?HfqkhKIE69+jQCz%;;Z57ZtUi$jA%qQXE#SZ=l`yO`XHk&dWDO=rJ`xJ~Z(6?s(O+%(YU%R=Jz7 z-vcr%KGzrlPm(TtFgx`5(5A$K;%TROK$gku->XAB$Ty6hM5NKk?&UK=~m2(@wz-w-NKkZ&3DKKU$8IvWiQ{v^+2 z($Nv8h#5X?_p?$vAW#3Ni=I+JF>wlsiyku+*h8@EZUREwKf<0mHlS}A8Mw^b*p??gicuSli_%8~pxN$Ngy z@~tU9i9QkPA4kC(ttoh@czWnqAej=rWCM`=&II{2tnFh_ecYjN8D4B5zr+r%1!>@V zDRn|nBqX<&qr`I|+Z^>5B<6G$otqYskvW9!`6&~^%Tq(M&_GfASvfEM(U`u4F=ZR7 zC>lKB9pv#m(HPJ=?N@Tt)KMide{k=3S@sA#+e?T z)>l2A+EwHw9WvL8VsJet_!l^*^-7L1gdJHt?O%tjvQ;xNn%|m|@ZyV?f@>}(3~z!A zXdR=tc=wK)mXVQjvwROlBhZ2S`6Otc!)8XWPzM!kc|S&*b6-C}cmGw;+h3eq6?hg) zpnY}%c;l8pBhGRCJni4Nk&#Zz#1~M%Cs~8F-~)|cvX%Wi*-HC;|IUT6dd3X&x);44 z_9dyHfukJ8dC!0H&o~;NbCkwi9MwQOM*%nvq7lP?Ze--T@l__uDGF~adNCQn+9(k8 kQd0bHMn+n?ELNR=0NQ0KP?C_nbN~PV07*qoM6N<$f|Lms;{X5v literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/marker-icon.png b/searx/static/themes/eelo/img/map/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9f757f515ded172e6f72c3ce55bbe15579649 GIT binary patch literal 1747 zcmV;^1}yoBP)P001cn1^@s6z>|W`000J>NklgF+#9zZY7a#;@J(5X0e&McXK2n7+jhR}<0i-1U5t`>D@ zJSJ*^swjdwq0keUf9!BETXZhVyjqS4&z|?2HdJnOU-HYF_xSyu=XsCkdtVv=(53>u zME@3F*5J;OHwJNJdWK(ivQ??rr&t7M)1yRas=d_yYH>g+p#{( zm+NoyW%|8bNfUkAMrabri(FY#Dqr5%zhZA&e^iALHXiJOFYA7Qt##L_a?_z6SW{&J zVeyp#G&snW>SO{*%d9CGVM}xic~V`MU$)*JU1Nbw2YX?ywi}|VZ4g;$g)p^+DoLHR zZ^Zr$S_=f^oU`+!4K^?NsU;H{;bhhex#H7(!s52U&FJ}OHQf-VvVd?Btj2MhF|zQI z%l~jBr~6T7^_WIHC1>8j&bv`c18g|Z3*l-jgeoml1{oh++Y75JI)RgU>LEY<%)C)X zI2rZ2kb>s^4cZuYeq3!A}DS`X~>Nd;+A$4e;ZwyD<1@2!8$ZKJ3w%!6)+sCALy+bKwyk zqKCS6qEGWmJ)97b-QXY|`<0lS5THkEtGgjE>ojOvuftfM&Ugd-rQg9C+|FdGM)HXs z(IxsA$&r(xg_j^4=hC;>s;1UF*Wp1I-2~sEF zZYgb?&`4bM1qjM*hR`yr3qJ(;L>Kj2XpBUy+)t((6z;bIr@-ihFNVAl4<#?{TWIaQ zIi>;YjXS_iIfNb?!N1t-!Y6vZvW5ZXE{%l7imzV9NvV4nf#G`Pcex;#@}?EINwsk7 z>UC=SlJC*b5a>-mgHP%q2+qF;cbNx ztCV@{s&fPsSt#;i@#G-m$as&$gLaG}ebOrtS5*22&glbhMH_fz8(~qVVN!VIVCKzg z1$U9^93(E%Ur9v_R*h#!t)Ce+#)+m(q^zCq%g&L-!E zC&et9WrT(49pl0S`?=DK7=`+;`CB!wP3ta97b)XdJ8K=@`DXOk0Q0};7zNT!`k4t@ z+)=9S)4p(jEGm5!qq)PDTmXiw3qDM19|fiylc@LtiQ=}Kfb#w&ckv^7tBj;cfwtY$q?IdliYlg zqh@4;IyW)OFPQPw4z|JsAEb7`+@yA@Q8SXQT#;upV`QNJ59Bg5m(jci3`0T4X-&^GU6)x7$Vi0XMWB(2hrdK^!hq0 zt!bDg$Hh)-9L62h`&{0PBf%7vM>69o`k4~kx^Wc)?lG!}=WgV2x-rq?HN#jMr^B0; p5zMeb2q5MEX5{g&Aa%N&e*pr!t%ZZ}>w*9P002ovPDHLkV1gpUS8xCT literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/map/marker-shadow.png b/searx/static/themes/eelo/img/map/marker-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e773c715a9b508ebea055c4bb4b0a2ad7f6e52 GIT binary patch literal 797 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 T8(Z)EUcP^yfB5cx^WA>|%t>~B literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/img/searx_logo.png b/searx/static/themes/eelo/img/searx_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..307b42f12ebd486109108bbc8f26cbd1d53c786b GIT binary patch literal 10611 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�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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/js/searx.js b/searx/static/themes/eelo/js/searx.js new file mode 100644 index 000000000..1f5b9e7eb --- /dev/null +++ b/searx/static/themes/eelo/js/searx.js @@ -0,0 +1,383 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +requirejs.config({ + baseUrl: './static/themes/oscar/js', + paths: { + app: '../app' + } +}); +;/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2019 by Alexandre Flament + */ +window.searx = (function(d) { + 'use strict'; + + // add data- properties + var script = d.currentScript || (function() { + var scripts = d.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); + + return { + autocompleter: script.getAttribute('data-autocompleter') === 'true', + method: script.getAttribute('data-method') + }; +})(document); +;/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +if(searx.autocompleter) { + searx.searchResults = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: './autocompleter?q=%QUERY' + }); + searx.searchResults.initialize(); +} + +$(document).ready(function(){ + if(searx.autocompleter) { + $('#q').typeahead(null, { + name: 'search-results', + displayKey: function(result) { + return result; + }, + source: searx.searchResults.ttAdapter() + }); + } +}); +; +function configure_image_view(target) { + document.getElementById("image_view_image").src = target.href; + document.getElementById("image_view_file_link").href = target.href; + document.getElementById("image_view_url_link").href = target.dataset.url; +} + +function show_image_view_modal(event) { + event.preventDefault(); + var target = event.target; + if (target.tagName == "IMG") { + target = target.parentElement; + } + + var modal = document.getElementById("image_view_modal"); + modal.classList.remove("hidden"); + modal.style.top = window.scrollY + "px"; + configure_image_view(target); + document.body.classList.add("lock"); +} + +function close_image_view_modal() { + document.getElementById("image_view_modal").classList.add("hidden"); + document.getElementById("image_view_image").src = ""; + document.getElementById("image_view_file_link").href = "#"; + document.getElementById("image_view_url_link").href = "#"; + document.body.classList.remove("lock"); +};/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +$(document).ready(function(){ + /** + * focus element if class="autofocus" and id="q" + */ + $('#q.autofocus').focus(); + + /** + * select full content on click if class="select-all-on-click" + */ + $(".select-all-on-click").click(function () { + $(this).select(); + }); + + /** + * change text during btn-collapse click if possible + */ + $('.btn-collapse').click(function() { + var btnTextCollapsed = $(this).data('btn-text-collapsed'); + var btnTextNotCollapsed = $(this).data('btn-text-not-collapsed'); + + if(btnTextCollapsed !== '' && btnTextNotCollapsed !== '') { + if($(this).hasClass('collapsed')) { + new_html = $(this).html().replace(btnTextCollapsed, btnTextNotCollapsed); + } else { + new_html = $(this).html().replace(btnTextNotCollapsed, btnTextCollapsed); + } + $(this).html(new_html); + } + }); + + /** + * change text during btn-toggle click if possible + */ + $('.btn-toggle .btn').click(function() { + var btnClass = 'btn-' + $(this).data('btn-class'); + var btnLabelDefault = $(this).data('btn-label-default'); + var btnLabelToggled = $(this).data('btn-label-toggled'); + if(btnLabelToggled !== '') { + if($(this).hasClass('btn-default')) { + new_html = $(this).html().replace(btnLabelDefault, btnLabelToggled); + } else { + new_html = $(this).html().replace(btnLabelToggled, btnLabelDefault); + } + $(this).html(new_html); + } + $(this).toggleClass(btnClass); + $(this).toggleClass('btn-default'); + }); + + /** + * change text during btn-toggle click if possible + */ + $('.media-loader').click(function() { + var target = $(this).data('target'); + var iframe_load = $(target + ' > iframe'); + var srctest = iframe_load.attr('src'); + if(srctest === undefined || srctest === false){ + iframe_load.attr('src', iframe_load.data('src')); + } + }); + + /** + * Select or deselect every categories on double clic + */ + $(".btn-sm").dblclick(function() { + var btnClass = 'btn-' + $(this).data('btn-class'); // primary + if($(this).hasClass('btn-default')) { + $(".btn-sm > input").attr('checked', 'checked'); + $(".btn-sm > input").prop("checked", true); + $(".btn-sm").addClass(btnClass); + $(".btn-sm").addClass('active'); + $(".btn-sm").removeClass('btn-default'); + } else { + $(".btn-sm > input").attr('checked', ''); + $(".btn-sm > input").removeAttr('checked'); + $(".btn-sm > input").checked = false; + $(".btn-sm").removeClass(btnClass); + $(".btn-sm").removeClass('active'); + $(".btn-sm").addClass('btn-default'); + } + }); +}); +;/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +$(document).ready(function(){ + $(".searx_overpass_request").on( "click", function( event ) { + var overpass_url = "https://overpass-api.de/api/interpreter?data="; + var query_start = overpass_url + "[out:json][timeout:25];("; + var query_end = ");out meta;"; + + var osm_id = $(this).data('osm-id'); + var osm_type = $(this).data('osm-type'); + var result_table = $(this).data('result-table'); + var result_table_loadicon = "#" + $(this).data('result-table-loadicon'); + + // tags which can be ignored + var osm_ignore_tags = [ "addr:city", "addr:country", "addr:housenumber", "addr:postcode", "addr:street" ]; + + if(osm_id && osm_type && result_table) { + result_table = "#" + result_table; + var query = null; + switch(osm_type) { + case 'node': + query = query_start + "node(" + osm_id + ");" + query_end; + break; + case 'way': + query = query_start + "way(" + osm_id + ");" + query_end; + break; + case 'relation': + query = query_start + "relation(" + osm_id + ");" + query_end; + break; + default: + break; + } + if(query) { + //alert(query); + var ajaxRequest = $.ajax( query ) + .done(function( html) { + if(html && html.elements && html.elements[0]) { + var element = html.elements[0]; + var newHtml = $(result_table).html(); + for (var row in element.tags) { + if(element.tags.name === null || osm_ignore_tags.indexOf(row) == -1) { + newHtml += "" + row + ""; + switch(row) { + case "phone": + case "fax": + newHtml += "" + element.tags[row] + ""; + break; + case "email": + newHtml += "" + element.tags[row] + ""; + break; + case "website": + case "url": + newHtml += "" + element.tags[row] + ""; + break; + case "wikidata": + newHtml += "" + element.tags[row] + ""; + break; + case "wikipedia": + if(element.tags[row].indexOf(":") != -1) { + newHtml += "" + element.tags[row] + ""; + break; + } + /* jshint ignore:start */ + default: + /* jshint ignore:end */ + newHtml += element.tags[row]; + break; + } + newHtml += ""; + } + } + $(result_table).html(newHtml); + $(result_table).removeClass('hidden'); + $(result_table_loadicon).addClass('hidden'); + } + }) + .fail(function() { + $(result_table_loadicon).html($(result_table_loadicon).html() + "

could not load data!

"); + }); + } + } + + // this event occour only once per element + $( this ).off( event ); + }); + + $(".searx_init_map").on( "click", function( event ) { + var leaflet_target = $(this).data('leaflet-target'); + var map_lon = $(this).data('map-lon'); + var map_lat = $(this).data('map-lat'); + var map_zoom = $(this).data('map-zoom'); + var map_boundingbox = $(this).data('map-boundingbox'); + var map_geojson = $(this).data('map-geojson'); + + require(['leaflet-0.7.3.min'], function(leaflet) { + if(map_boundingbox) { + southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]); + northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]); + map_bounds = L.latLngBounds(southWest, northEast); + } + + // TODO hack + // change default imagePath + L.Icon.Default.imagePath = "./static/themes/oscar/img/map"; + + // init map + var map = L.map(leaflet_target); + + // create the tile layer with correct attribution + var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + var osmMapnikAttrib='Map data © OpenStreetMap contributors'; + var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib}); + + var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png'; + var osmWikimediaAttrib = 'Wikimedia maps beta | Maps data © OpenStreetMap contributors'; + var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib}); + + // init map view + if(map_bounds) { + // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021 + setTimeout(function () { + map.fitBounds(map_bounds, { + maxZoom:17 + }); + }, 0); + } else if (map_lon && map_lat) { + if(map_zoom) + map.setView(new L.LatLng(map_lat, map_lon),map_zoom); + else + map.setView(new L.LatLng(map_lat, map_lon),8); + } + + map.addLayer(osmMapnik); + + var baseLayers = { + "OSM Mapnik": osmMapnik/*, + "OSM Wikimedia": osmWikimedia*/ + }; + + L.control.layers(baseLayers).addTo(map); + + + if(map_geojson) + L.geoJson(map_geojson).addTo(map); + /*else if(map_bounds) + L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);*/ + }); + + // this event occour only once per element + $( this ).off( event ); + }); +}); diff --git a/searx/static/themes/eelo/js/searx.min.js b/searx/static/themes/eelo/js/searx.min.js new file mode 100644 index 0000000000000000000000000000000000000000..d9dd67f9a71c04650813a1178c1b69fd8371136a GIT binary patch literal 5631 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 literal 0 HcmV?d00001 diff --git a/searx/static/themes/eelo/js/searx_src/00_requirejs_config.js b/searx/static/themes/eelo/js/searx_src/00_requirejs_config.js new file mode 100644 index 000000000..e7c2abdac --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/00_requirejs_config.js @@ -0,0 +1,23 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +requirejs.config({ + baseUrl: './static/themes/oscar/js', + paths: { + app: '../app' + } +}); diff --git a/searx/static/themes/eelo/js/searx_src/01_init.js b/searx/static/themes/eelo/js/searx_src/01_init.js new file mode 100644 index 000000000..690365c7f --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/01_init.js @@ -0,0 +1,30 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2019 by Alexandre Flament + */ +window.searx = (function(d) { + 'use strict'; + + // add data- properties + var script = d.currentScript || (function() { + var scripts = d.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + })(); + + return { + autocompleter: script.getAttribute('data-autocompleter') === 'true', + method: script.getAttribute('data-method') + }; +})(document); diff --git a/searx/static/themes/eelo/js/searx_src/autocompleter.js b/searx/static/themes/eelo/js/searx_src/autocompleter.js new file mode 100644 index 000000000..0907f8e34 --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/autocompleter.js @@ -0,0 +1,37 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +if(searx.autocompleter) { + searx.searchResults = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: './autocompleter?q=%QUERY' + }); + searx.searchResults.initialize(); +} + +$(document).ready(function(){ + if(searx.autocompleter) { + $('#q').typeahead(null, { + name: 'search-results', + displayKey: function(result) { + return result; + }, + source: searx.searchResults.ttAdapter() + }); + } +}); diff --git a/searx/static/themes/eelo/js/searx_src/custom.js b/searx/static/themes/eelo/js/searx_src/custom.js new file mode 100644 index 000000000..848300231 --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/custom.js @@ -0,0 +1,28 @@ + +function configure_image_view(target) { + document.getElementById("image_view_image").src = target.href; + document.getElementById("image_view_file_link").href = target.href; + document.getElementById("image_view_url_link").href = target.dataset.url; +} + +function show_image_view_modal(event) { + event.preventDefault(); + var target = event.target; + if (target.tagName == "IMG") { + target = target.parentElement; + } + + var modal = document.getElementById("image_view_modal"); + modal.classList.remove("hidden"); + modal.style.top = window.scrollY + "px"; + configure_image_view(target); + document.body.classList.add("lock"); +} + +function close_image_view_modal() { + document.getElementById("image_view_modal").classList.add("hidden"); + document.getElementById("image_view_image").src = ""; + document.getElementById("image_view_file_link").href = "#"; + document.getElementById("image_view_url_link").href = "#"; + document.body.classList.remove("lock"); +} \ No newline at end of file diff --git a/searx/static/themes/eelo/js/searx_src/element_modifiers.js b/searx/static/themes/eelo/js/searx_src/element_modifiers.js new file mode 100644 index 000000000..4264d4c0d --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/element_modifiers.js @@ -0,0 +1,99 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +$(document).ready(function(){ + /** + * focus element if class="autofocus" and id="q" + */ + $('#q.autofocus').focus(); + + /** + * select full content on click if class="select-all-on-click" + */ + $(".select-all-on-click").click(function () { + $(this).select(); + }); + + /** + * change text during btn-collapse click if possible + */ + $('.btn-collapse').click(function() { + var btnTextCollapsed = $(this).data('btn-text-collapsed'); + var btnTextNotCollapsed = $(this).data('btn-text-not-collapsed'); + + if(btnTextCollapsed !== '' && btnTextNotCollapsed !== '') { + if($(this).hasClass('collapsed')) { + new_html = $(this).html().replace(btnTextCollapsed, btnTextNotCollapsed); + } else { + new_html = $(this).html().replace(btnTextNotCollapsed, btnTextCollapsed); + } + $(this).html(new_html); + } + }); + + /** + * change text during btn-toggle click if possible + */ + $('.btn-toggle .btn').click(function() { + var btnClass = 'btn-' + $(this).data('btn-class'); + var btnLabelDefault = $(this).data('btn-label-default'); + var btnLabelToggled = $(this).data('btn-label-toggled'); + if(btnLabelToggled !== '') { + if($(this).hasClass('btn-default')) { + new_html = $(this).html().replace(btnLabelDefault, btnLabelToggled); + } else { + new_html = $(this).html().replace(btnLabelToggled, btnLabelDefault); + } + $(this).html(new_html); + } + $(this).toggleClass(btnClass); + $(this).toggleClass('btn-default'); + }); + + /** + * change text during btn-toggle click if possible + */ + $('.media-loader').click(function() { + var target = $(this).data('target'); + var iframe_load = $(target + ' > iframe'); + var srctest = iframe_load.attr('src'); + if(srctest === undefined || srctest === false){ + iframe_load.attr('src', iframe_load.data('src')); + } + }); + + /** + * Select or deselect every categories on double clic + */ + $(".btn-sm").dblclick(function() { + var btnClass = 'btn-' + $(this).data('btn-class'); // primary + if($(this).hasClass('btn-default')) { + $(".btn-sm > input").attr('checked', 'checked'); + $(".btn-sm > input").prop("checked", true); + $(".btn-sm").addClass(btnClass); + $(".btn-sm").addClass('active'); + $(".btn-sm").removeClass('btn-default'); + } else { + $(".btn-sm > input").attr('checked', ''); + $(".btn-sm > input").removeAttr('checked'); + $(".btn-sm > input").checked = false; + $(".btn-sm").removeClass(btnClass); + $(".btn-sm").removeClass('active'); + $(".btn-sm").addClass('btn-default'); + } + }); +}); diff --git a/searx/static/themes/eelo/js/searx_src/leaflet_map.js b/searx/static/themes/eelo/js/searx_src/leaflet_map.js new file mode 100644 index 000000000..3c8c616b1 --- /dev/null +++ b/searx/static/themes/eelo/js/searx_src/leaflet_map.js @@ -0,0 +1,167 @@ +/** + * searx is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * searx is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with searx. If not, see < http://www.gnu.org/licenses/ >. + * + * (C) 2014 by Thomas Pointhuber, + */ + +$(document).ready(function(){ + $(".searx_overpass_request").on( "click", function( event ) { + var overpass_url = "https://overpass-api.de/api/interpreter?data="; + var query_start = overpass_url + "[out:json][timeout:25];("; + var query_end = ");out meta;"; + + var osm_id = $(this).data('osm-id'); + var osm_type = $(this).data('osm-type'); + var result_table = $(this).data('result-table'); + var result_table_loadicon = "#" + $(this).data('result-table-loadicon'); + + // tags which can be ignored + var osm_ignore_tags = [ "addr:city", "addr:country", "addr:housenumber", "addr:postcode", "addr:street" ]; + + if(osm_id && osm_type && result_table) { + result_table = "#" + result_table; + var query = null; + switch(osm_type) { + case 'node': + query = query_start + "node(" + osm_id + ");" + query_end; + break; + case 'way': + query = query_start + "way(" + osm_id + ");" + query_end; + break; + case 'relation': + query = query_start + "relation(" + osm_id + ");" + query_end; + break; + default: + break; + } + if(query) { + //alert(query); + var ajaxRequest = $.ajax( query ) + .done(function( html) { + if(html && html.elements && html.elements[0]) { + var element = html.elements[0]; + var newHtml = $(result_table).html(); + for (var row in element.tags) { + if(element.tags.name === null || osm_ignore_tags.indexOf(row) == -1) { + newHtml += "" + row + ""; + switch(row) { + case "phone": + case "fax": + newHtml += "" + element.tags[row] + ""; + break; + case "email": + newHtml += "" + element.tags[row] + ""; + break; + case "website": + case "url": + newHtml += "" + element.tags[row] + ""; + break; + case "wikidata": + newHtml += "" + element.tags[row] + ""; + break; + case "wikipedia": + if(element.tags[row].indexOf(":") != -1) { + newHtml += "" + element.tags[row] + ""; + break; + } + /* jshint ignore:start */ + default: + /* jshint ignore:end */ + newHtml += element.tags[row]; + break; + } + newHtml += ""; + } + } + $(result_table).html(newHtml); + $(result_table).removeClass('hidden'); + $(result_table_loadicon).addClass('hidden'); + } + }) + .fail(function() { + $(result_table_loadicon).html($(result_table_loadicon).html() + "

could not load data!

"); + }); + } + } + + // this event occour only once per element + $( this ).off( event ); + }); + + $(".searx_init_map").on( "click", function( event ) { + var leaflet_target = $(this).data('leaflet-target'); + var map_lon = $(this).data('map-lon'); + var map_lat = $(this).data('map-lat'); + var map_zoom = $(this).data('map-zoom'); + var map_boundingbox = $(this).data('map-boundingbox'); + var map_geojson = $(this).data('map-geojson'); + + require(['leaflet-0.7.3.min'], function(leaflet) { + if(map_boundingbox) { + southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]); + northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]); + map_bounds = L.latLngBounds(southWest, northEast); + } + + // TODO hack + // change default imagePath + L.Icon.Default.imagePath = "./static/themes/oscar/img/map"; + + // init map + var map = L.map(leaflet_target); + + // create the tile layer with correct attribution + var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + var osmMapnikAttrib='Map data © OpenStreetMap contributors'; + var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib}); + + var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png'; + var osmWikimediaAttrib = 'Wikimedia maps beta | Maps data © OpenStreetMap contributors'; + var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib}); + + // init map view + if(map_bounds) { + // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021 + setTimeout(function () { + map.fitBounds(map_bounds, { + maxZoom:17 + }); + }, 0); + } else if (map_lon && map_lat) { + if(map_zoom) + map.setView(new L.LatLng(map_lat, map_lon),map_zoom); + else + map.setView(new L.LatLng(map_lat, map_lon),8); + } + + map.addLayer(osmMapnik); + + var baseLayers = { + "OSM Mapnik": osmMapnik/*, + "OSM Wikimedia": osmWikimedia*/ + }; + + L.control.layers(baseLayers).addTo(map); + + + if(map_geojson) + L.geoJson(map_geojson).addTo(map); + /*else if(map_bounds) + L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);*/ + }); + + // this event occour only once per element + $( this ).off( event ); + }); +}); diff --git a/searx/static/themes/eelo/less/eelo/base.less b/searx/static/themes/eelo/less/eelo/base.less new file mode 100644 index 000000000..14acfb7d0 --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/base.less @@ -0,0 +1,133 @@ + +html { + position: relative; + min-height: 100%; + color: @text-color; +} + +body { + margin: 0px; + padding: 0px; + font-size: @fontsize_medium; + margin-bottom: 120px; + background-color: white; + font-family: 'Roboto', "Cantarell", Helvetica, Arial, sans-serif; + + &.lock { overflow: hidden; } + + * { + font-family: sans-serif, "Cantarell", 'Roboto', Helvetica, Arial; + } +} + +input, select { + box-shadow: none !important; +} + +a { + color: @link-color; + &:extend(.color-transition); +} +a, select { + &, &:focus, &:active, &:hover { + outline: none; + text-decoration: none; + } +} + +label { color: @text-color-hl; } + +section { margin-bottom: @spacing_xx-large; } + +ul > li { margin-bottom: @spacing_medium; } + +fieldset { + border: none; + padding: 0px; +} + +pre { + font-family: 'Courier New', Courier, monospace; + background: @dim-color-lighter; + padding: @spacing_medium @spacing_large; + border-radius: @corner-radius; + white-space: pre-line; +} + + + +footer { + position: absolute; + bottom: 0; + width: 100%; + height: auto; + text-align: center; + color: #c1c1c1; + padding-bottom: @spacing_medium; + + .links > :first-child { + margin-right: @spacing_medium; + } +} + + + +[disabled] { + &:extend(.disabled); +} +.hidden, #icons { display: none; } + + +#image_view_modal { + position: absolute; + top: 0; + width: 100%; + height: 100vh; + background-color: rgba(0, 0, 0, .9); + z-index: 100; + + button { + display: block; + width: 100%; + text-align: right; + background: none; + border: none; + + .icon { + fill: white; + } + } + + .card-container { + display: flex; + height: 100%; + } + + #image_view_card { + margin: auto; + max-width: @size-content; + max-height: 80vh; + + .mobile-mq({ + margin-left: @spacing_container; + margin-right: @spacing_container; + max-width: 100%; + width: 100%; + }); + } + + #image_view_image { + display: block; + max-width: 100%; + max-height: 70vh; + background-color: white; + margin: auto; + } + + .options { margin-top: @spacing_medium; } + .btn { + .btn.plain-white(); + display: inline-block; + margin-right: @spacing_medium; + } +} \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/code.less b/searx/static/themes/eelo/less/eelo/code.less new file mode 100644 index 000000000..d1a30e365 --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/code.less @@ -0,0 +1,11 @@ +.highlight, .highlighttable { + .lineno { + margin-right: @spacing_large; + color: @text-muted-color; + display: none; + } + .kd {} + .kt {} + .nf {} + .o {} +} \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/defs.less b/searx/static/themes/eelo/less/eelo/defs.less new file mode 100644 index 000000000..5f3f210ca --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/defs.less @@ -0,0 +1,90 @@ +@black: #020f16; +@grey: #eeeeee; +@text-color: #60686f; +@text-color-hl: #5c6469; +@link-color: #1f6ed7; + +@color_accent: #5068dd; +@color_accent__op: white; +@color_accent__dark: #2344a2; +@color_primary: blue; +@color_base: blue; +@color_base-text-hl: #5c6469; + +@color_danger: #e06572; +@color_danger__op: white; + +@corner-radius: 8px; + +@dim-color-superlighter: rgba(0, 0, 0, 0.03); +@dim-color-lighter: rgba(0, 0, 0, 0.1); +@dim-color-light: rgba(0, 0, 0, 0.2); +@dim-color-normal: rgba(0, 0, 0, 0.4); + +@text-muted-color: @dim-color-normal; + + +@fontsize_xx-small: 8px; +@fontsize_x-small: 11px; +@fontsize_small: 14px; +@fontsize_medium: 16px; +@fontsize_large: 18px; +@fontsize_x-large: 22px; +@fontsize_xx-large: 22px; + +@spacing_xx-small: 2px; +@spacing_x-small: 4px; +@spacing_small: 6px; +@spacing_medium: 8px; +@spacing_large: 16px; +@spacing_x-large: 24px; +@spacing_xx-large: 32px; +@spacing_huge: 38px; +@spacing_x-huge: 48px; +@spacing_xx-huge: 64px; + +@spacing_container: @spacing_large; +@spacing_search_bar_contents: 56px; + +@size-content-small: 400px; +@size-content: 600px; + +@size-desktop: 1100px; +@size-mobile: 600px; + + +.container-padding { + padding-left: @spacing_container; + padding-right: @spacing_container; +} + + +@color-transition: color .2s ease-in-out; +@border-color-transition: border-color .2s ease-in-out; +@background-color-transition: background-color .2s ease-in-out; +@fill-transition: fill .2s ease-in-out; +@box-shadow-transition: box-shadow .2s ease-in-out; + +.color-transition { transition: @color-transition; } +.border-color-transition { transition: @border-color-transition; } +.fill-transition { transition: @fill-transition; } +.box-shadow-transition { transition: @box-shadow-transition; } + +.widget-border(@color: rgba(0, 0, 0, .2)) { + border: 2px solid @color; +} + + +.disabled { opacity: .4; } + + +// media queries +.tablet-mq(@rules) { + @media screen and (max-width: @size-desktop) { @rules(); } +} +.mobile-mq(@rules) { + @media screen and (max-width: @size-mobile) { @rules(); } +} +.mobile-landscape-mq(@rules) { + @media screen and (max-height: @size-mobile) and (orientation: landscape) { @rules(); } +} \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/eelo.less b/searx/static/themes/eelo/less/eelo/eelo.less new file mode 100644 index 000000000..d22b257ec --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/eelo.less @@ -0,0 +1,11 @@ +@import "defs.less"; +@import "layout.less"; +@import "widgets.less"; + +@import "base.less"; +@import "navbar.less"; + +@import "search.less"; +@import "results.less"; +@import "preferences.less"; +@import "code.less"; \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/layout.less b/searx/static/themes/eelo/less/eelo/layout.less new file mode 100644 index 000000000..284dda454 --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/layout.less @@ -0,0 +1,146 @@ + +#pagination { + margin-top: @spacing_x-huge; + display: flex; + justify-content: space-between; +} + +.container { + max-width: @size-desktop; + .container-padding(); + + display: flex; + justify-content: space-between; + margin: auto; + + >:first-child { + max-width: @size-content; + width: @size-content; + } + >:last-child:not(:first-child) { + max-width: @size-content-small; + width: @size-content-small; + } +} + +.container.full { + max-width: 100%; + >:first-child { + max-width: 100%; + width: 100%; + } + >:last-child:not(:first-child) { + display: none; + } + + #pagination { + max-width: @size-content-small; + width: @size-content-small; + margin: auto; + justify-content: space-around; + } +} + +#search_bar_area { + border-bottom: 1px solid rgba(0, 0, 0, .1); +} +#search_bar_area #search_form, #no_results_msg, .content-small-centered { + max-width: @size-content; + margin: auto; +} +#no_results_msg, #page_not_found_404 { + text-align: center; + margin-top: @spacing_xx-huge; + margin-bottom: @spacing_xx-huge; + img { + max-width: 70%; + } +} +#errors { + .widget-border(@color_danger); + border-radius: @corner-radius; + padding: @spacing_medium; + + .title { + margin-top: 0; + margin-bottom: @spacing_medium; + } + pre { + background-color: fade(@color_danger, 10%); + } +} + + +.inline { + display: flex; + flex-direction: row; +} + + +.tablet-mq({ + .container { + flex-direction: column-reverse; + + > * { margin: auto; } + } + #preferences.container { + flex-direction: column; + margin-top: @spacing_large; + } +}); + +.mobile-mq({ + .container { + max-width: 100%; + .container-padding(); + + > :first-child, > :last-child:not(:first-child) { + max-width: 100%; + width: 100%; + } + } + + main { + margin-top: @spacing_large; + } + + #search_input_container { + margin-left: @spacing_container; + margin-right: @spacing_container; + } + + .container.full #pagination { + max-width: 100%; + width: 100%; + } +}); + + +// Move somewhere else? +#index { + max-width: @size-content; + margin: auto; + + img { + width: 300px; + display: block; + margin: auto; + margin-top: 64px; + margin-bottom: 64px; + } + img#logo_inline { display: none; } +} +.mobile-mq({ + #index img { + width: 50vmin; + margin-bottom: @spacing_x-large; + } +}); +.mobile-landscape-mq({ + #index img { + width: 70vmin; + margin-top: @spacing_xx-large; + display: none; + } + #index img#logo_inline { display: block; } +}); diff --git a/searx/static/themes/eelo/less/eelo/navbar.less b/searx/static/themes/eelo/less/eelo/navbar.less new file mode 100644 index 000000000..63a56ea4d --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/navbar.less @@ -0,0 +1,73 @@ +nav { + &:extend(.container-padding); + + height: 48px; + display: flex; + align-items: center; + justify-content: space-between; + + text-transform: capitalize; + + margin-bottom: 24px; + a { + color: #868686; + + &:hover { + color: @color_accent; + } + } + #eelo_links > * { margin-right: 32px; } +} +#nav_toggle_btn { + display: none; +} + + +.mobile-mq({ + nav { + position: fixed; + right: 0; + top: 0; + flex-direction: column; + height: 100%; + background-color: white; + z-index: 1000; + width: 280px; + min-width: 280px; + max-width: 280px; + align-items: unset; + // padding: @spacing_medium; + box-shadow: 0 0 0 rgba(0, 0, 0, .2); + transition: transform .2s ease-in-out, box-shadow .2s ease-in-out; + padding: 0; + } + nav > :first-child { margin-top: @spacing_large / 2; } + nav > :last-child { margin-bottom: @spacing_large / 2; } + nav a { + display: block; + padding: @spacing_large / 2 @spacing_large; + } + #nav_toggle_btn { + display: block; + position: absolute; + top: @spacing_medium + @spacing_large; + right: @spacing_medium; + z-index: 1001; + } + #nav_toggle:checked { + & ~ #nav_toggle_btn > .menu-open { display: none; } + & ~ #nav_toggle_btn > .menu-close { display: initial; } + & ~ nav { + box-shadow: 0 0 30px rgba(0, 0, 0, .2); + transform: translateX(0); + } + & ~ #nav_toggle_btn { + position: fixed; + } + } + #nav_toggle:not(:checked) { + & ~ #nav_toggle_btn > .menu-open { display: initial; } + & ~ #nav_toggle_btn > .menu-close { display: none; } + & ~ nav { transform: translateX(100%); } + } +}); \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/preferences.less b/searx/static/themes/eelo/less/eelo/preferences.less new file mode 100644 index 000000000..ba2345551 --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/preferences.less @@ -0,0 +1,71 @@ +#preferences { + h1, .nav-tabs, #notice { margin-bottom: @spacing_x-large; } + + .options { margin-top: @spacing_x-large; } + + .tab-content { + margin-bottom: 48px; + display: none; + } + + input.tab-radio[type="radio"] { display: none; } + input.tab-radio[type="radio"]:checked + .tab-content { display: block; } + + .preference { + margin-bottom: @spacing_large; + + &.inline { + justify-content: space-between; + + >:first-child { flex: 2; } + >:last-child { flex: 1; } + } + } + + #tabs { margin-bottom: @spacing_xx-large; } + #tabs > * { margin-right: @spacing_xx-large; } + + #controls { + display: flex; + flex-direction: column-reverse; + justify-content: flex-end; + } + + #cookies_list { } + #cookies_list .cookie-value { word-wrap: break-word; } + + #action_buttons { margin-top: @spacing_x-huge; } + #action_buttons > div { margin-bottom: @spacing_x-large; } + #action_buttons > div > * { margin-bottom: @spacing_medium; } + + + #engines { + h3 { + text-transform: capitalize; + margin-top: 0; + } + + .engine { + display: flex; + margin-bottom: @spacing_medium; + + .data { + width: 100%; + margin-left: @spacing_large; + margin-right: @spacing_large; + } + + input:checked ~ .data { &:extend(.disabled); } + input:checked ~ .data .danger { display: inline; } + input:not(:checked) ~ .data i.danger { display: none; } + } + } +} + +.mobile-mq({ + .preference.inline { + flex-direction: column; + + >:first-child { margin-bottom: @spacing_medium; } + } +}); \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/results.less b/searx/static/themes/eelo/less/eelo/results.less new file mode 100644 index 000000000..94afbd5ba --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/results.less @@ -0,0 +1,299 @@ +@video-scale: 16; + +#results { + margin-top: @spacing_xx-large; + margin-bottom: @spacing_xx-large; +} + +.result { + .result-template { + font-weight: bold; + text-transform: uppercase; + color: @text-muted-color; + + & + .result_header { margin-top: 0; } + } + .result_header { + margin-bottom: @spacing_small; + + .favicon { + width: 16px; + height: 16px; + } + } + .subheader > :not(:last-child), .subheader > * > :not(:last-child) { + margin-right: @spacing_large; + } + .result-content { + margin-top: @spacing_medium; + margin-bottom: @spacing_small; + + p, pre { + margin-top: @spacing_medium; + margin-bottom: @spacing_medium; + } + } + + &.result-torrent { + .extra-info > :not(:last-child) { margin-right: @spacing_large; } + } + .videos-gallery &.result-torrent { + .torrent-banner { + position: absolute; + bottom: 0; + left: 0; + right: 0; + color: @text-muted-color; + font-weight: bold; + padding: @spacing_small @spacing_large; + text-transform: uppercase; + display: flex; + justify-content: space-between; + font-size: @fontsize_small; + + .torrent-data { + text-transform: none; + font-weight: normal; + + & > :not(:first-child) { + margin-left: @spacing_small; + } + } + } + } + &.result-videos, .videos-gallery &.result-torrent { + position: relative; + .widget-border(@dim-color-lighter); + border-radius: @corner-radius; + + .result-content { + margin: 0px; + display: flex; + flex-direction: column; + height: 100%; + + .result_header { + margin-top: 0; + a { + word-wrap: break-word; + } + } + + & > .thumbnail { position: relative; } + & > :not(.thumbnail) { + margin-top: @spacing_medium; + height: 100%; + display: flex; + padding: @spacing_medium @spacing_large; + flex-direction: column; + justify-content: space-between; + } + .thumbnail > img { + width: 100%; + height: 9px * @video-scale; + object-fit: cover; + object-position: center; + display: block; + } + + .subheader { + .result_engine { + float: right; + img { + width: 16px; + height: 16px; + margin-left: @spacing_medium; + vertical-align: middle; + } + } + } + } + } + + .external-link { + font-size: @fontsize_small; + color: #39a441; + } + + .extra-info { + color: @text-muted-color; + } + + + .code-block { + background-color: @dim-color-superlighter; + padding: 0 @spacing_large; + border-radius: @corner-radius; + border: 1px solid @dim-color-light; + + pre { + white-space: pre-wrap; + } + } +} + +.result.result-default, .result.result-torrent { + margin-bottom: @spacing_xx-large; +} +.result.result-images { + display: inline; + + .img-thumbnail { + width: 100%; + border: none; + margin-bottom: @spacing_medium; + } +} + +#results.images-gallery { + display: flex; + flex-wrap: wrap; + + .result.result-images { + display: block; + flex: 20%; + height: 200px; + max-height: 200px; + overflow: hidden; + } +} +.videos-gallery { + display: flex; + flex-wrap: wrap; + + // torrents in grid mode do not need margin + .result.result-torrent { margin-bottom: 0; } +} +@supports(display: grid) { + #results.images-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-gap: @spacing_medium; + + .result.result-images { + display: block; + text-align: center; + overflow: hidden; + + .img-thumbnail { + height: 100%; + width: auto; + } + } + } + .videos-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(16px * @video-scale, 1fr)); + grid-gap: @spacing_large; + + .result.result-videos, .result.result-torrent { + display: block; + overflow: hidden; + } + } +} +#default_images_container { + column-count: 5; + column-gap: @spacing_medium; + margin-bottom: @spacing_xx-large; + + .img-thumb-link { + display: block; + max-height: 120px; + overflow: hidden; + } +} + + +#suggestions, #corrections { + form { + display: inline-block; + .btn { text-transform: none; } + } +} + + +.infobox { + + margin-top: @spacing_xx-large; + + .head { + .title { + font-size: @fontsize_x-large; + margin-top: 0; + margin-bottom: 0; + } + small { color: @text-muted-color; } + } + + .body { + .main-content { + } + .image-container { + max-height: 250px; + overflow: hidden; + text-align: center; + } + .content { flex: 3; } + + img { + max-width: 100%; + width: 100%; + margin-top: @spacing_large; + } + } + + .footer { + .links a { + padding-left: 0; + padding-top: 0; + padding-bottom: @spacing_large; + padding-right: @spacing_xx-large; + display: inline-block; + font-size: @fontsize_small; + } + } + + table { + margin-top: @spacing_large; + width: 100%; + } + table tr { + vertical-align: top; + + td { + padding: 0; + padding-bottom: @spacing_medium; + } + + & > .label { + text-align: right; + color: @text-muted-color; + padding-right: @spacing_large; + } + } +} + +.first-page-media-results { + margin-bottom: @spacing_xx-large; + + .header { + display: flex; + align-items: center; + justify-content: space-between; + + .title { font-size: @fontsize_large; } + } +} + + +.tablet-mq({ + #results.images-gallery { + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + + .result.result-images { + height: 140px; + max-height: 140px; + } + } +}); \ No newline at end of file diff --git a/searx/static/themes/eelo/less/eelo/search.less b/searx/static/themes/eelo/less/eelo/search.less new file mode 100644 index 000000000..57e5ef13f --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/search.less @@ -0,0 +1,238 @@ + +#search_form { + @logo-link-size: 32px; + @logo-link-spacing: 4px; + @input-size: 38px; + + #search_input_container { + position: relative; + display: flex; + align-items: center; + + .widget-border(rgba(0, 0, 0, 0.24)); + border-radius: 50px; + height: @input-size; + &:hover, &:active { box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.13); } + &:extend(.box-shadow-transition); + + // the actual input + #q { + font-size: @fontsize_medium; + + border: none; + height: 100%; + width: 100%; + min-width: 0; + padding-left: @spacing_large; + background-color: transparent; + } + #q:focus { outline: none; } + + button[type="submit"] { + position: relative; + height: 100%; + width: @input-size; + min-width: @input-size; + border: none; + background: none; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + .icon { transition: fill 0.2s ease-in-out, transform 0.1s ease-in-out; } + } + button[type="submit"]:hover { + .icon { + fill: @color_accent; + transform: scale(1.2); + } + } + } + + // inline search form + #logo, #logo_link { + height: @logo-link-size; + } + #logo_link { + padding-left: @logo-link-spacing; + } + + // some minor tweaks for RTL + #search_input_container.rtl { + #q { + margin-left: 0; + padding-right: @spacing_large; + } + #logo_link { + padding-left: 0; + padding-right: @logo-link-spacing; + } + } + + // style overrides for typeahead + .twitter-typeahead { + position: unset !important; + background-color: transparent; + width: 100%; + height: 100%; + } + input.tt-hint { + display: none; + } + .tt-dropdown-menu { + position: absolute; + left: 0; + right: 0 !important; + top: calc(100% + @spacing_large) !important; + border-radius: @corner-radius; + + .widget-border(); + width: 100% !important; + box-sizing: border-box !important; + background-color: @grey; + padding-left: @spacing_large; + padding-right: @spacing_large; + + & .tt-cursor, & .tt-highlight { + font-weight: bold; + } + } + + &.inline-search { + .tt-dropdown-menu { + padding-left: @spacing_large + @logo-link-size + @logo-link-spacing; + } + } + + + + // advanced search params, search topic, lang and time. + #search_params { + display: flex; + justify-content: space-between; + font-size: @fontsize_small; + padding-bottom: @spacing_large; + padding-top: @spacing_large; + padding-left: @spacing_x-large; + padding-right: @spacing_x-large; + + select, label { font-size: @fontsize_small; } + select { + color: rgba(0, 0, 0, .5); + text-align: right; + padding-right: 32px; + } + #time_and_lang { + text-align: right; + // > :first-child { margin-right: @spacing_large; } + > * { width: 160px; } + } + + } + + + .search_categories, #categories { + text-transform: capitalize; + display: flex; + flex-wrap: wrap; + align-items: center; + position: relative; + flex: 100%; + + label { + flex-basis: auto; + font-size: @fontsize_small; + font-weight: normal; + margin-right: @spacing_large; + cursor: pointer; + } + + input[type="checkbox"]:checked + label { + color: @color_accent; + font-weight: bold; + } + } + + #more_categories { + position: absolute; + top: @spacing_x-large; + display: flex; + flex-direction: column; + border-radius: @corner-radius; + .widget-border(); + background-color: @grey; + padding-bottom: @spacing_large / 2; + padding-top: @spacing_large / 2; + left: 0; + z-index: 998; + } + #more_categories > label { + padding: @spacing_large; + padding-bottom: @spacing_large / 2; + padding-top: @spacing_large / 2; + white-space: nowrap; + margin-right: 0; + + &:hover { + background-color: @dim-color-lighter; + } + } +} +#more_categories_container { + border-left: 1px solid rgba(0, 0, 0, 0.24); + padding-left: @spacing_large; + display: flex; + align-items: center; + position: relative; +} +#show_more_categories_ { cursor: default; } +#more_categories_toggle:checked, #more_categories_toggle_[checked] { + & ~ #more_categories { display: flex; } + & ~ #show_more_categories { display: none; } + & ~ #show_less_categories { display: initial; } +} +#more_categories_toggle:not(:checked), #more_categories_toggle_:not([checked]) { + & ~ #more_categories { display: none; } + & ~ #show_more_categories { display: initial; } + & ~ #show_less_categories { display: none; } +} + +// make advanced options scrollable on mobile +.mobile-mq({ + #search_form { + #search_params { + overflow-x: scroll; + + #time_and_lang { + display: flex; + margin-left: @spacing_xx-large; + > * { width: auto; } + } + } + #search_params, #categories { flex-wrap: nowrap; } + + #more_categories { + margin-left: @spacing_x-large; + padding: @spacing_medium @spacing_large; + border-radius: @spacing_large; + position: relative; + flex-direction: row; + align-items: center; + top: 0; + margin-left: @spacing_large; + + > label { padding: 0; } + > label:not(:last-child) { + margin-right: @spacing_large; + } + } + } + #search_form.inline-search > #search_input_container { + margin-right: @spacing_medium * 2 + 24px; + } + .tt-dropdown-menu { + padding-left: @spacing_large; + } +}); diff --git a/searx/static/themes/eelo/less/eelo/widgets.less b/searx/static/themes/eelo/less/eelo/widgets.less new file mode 100644 index 000000000..c5e8f0295 --- /dev/null +++ b/searx/static/themes/eelo/less/eelo/widgets.less @@ -0,0 +1,131 @@ +.block { + display: block; + width: 100%; + box-sizing: border-box; +} + +.text-muted { color: @text-muted-color; } + +.danger { color: @color_danger; } + +.widget { + .widget-border(); + padding: 4px 12px; + background-color: transparent; + + transition: @border-color-transition, @color-transition, @background-color-transition; +} + +.btn { + &:extend(.widget); + + padding: 8px 16px; + + text-transform: capitalize; + background-color: transparent; + border-radius: @corner-radius; + text-align: center; + font-size: @fontsize_medium; + font-weight: bold; + cursor: pointer; + + &:not(:disabled) { + color: @color_accent; + border-color: @color_accent; + } + &:hover:not(:disabled) { + border-color: @color_accent__dark; + color: @color_accent__dark; + } + + &.primary, input&[type="submit"] { + background-color: @color_accent; + color: @color_accent__op; + border-color: @dim-color-light; + &:hover { + color: @color_accent__op; + background-color: @color_accent__dark; + } + } + &.danger { + &:extend(.danger); + color: @color_danger; + border-color: @color_danger; + } + &.danger:hover { + border-color: @dim-color-light; + background-color: @color_danger; + color: @color_danger__op; + } + + &.btn-flat { + border: none; + border-radius: 0; + background-color: transparent; + } + + &.btn-flat:hover { + color: @color_accent__dark; + } + + &.btn-block { &:extend(.block); } + + // used in dark backgrounds + &.plain-white { + border-color: rgba(255, 255, 255, .4); + color: rgba(255, 255, 255, .8); + background-color: rgba(0, 0, 0, .5); + } +} + +.checkmark .icon { + &:extend(.fill-transition); + fill: @text-color; + + &.checked { fill: @color_accent; } +} +.checkmark_input { + display: none; + + &.inverted:checked { + & + .checkmark .checked { display: none; } + & + .checkmark .unchecked { display: initial; } + } + &.inverted:not(:checked) { + & + .checkmark .checked { display: initial; } + & + .checkmark .unchecked { display: none; } + } +} + + +.collapser { + input:checked ~ .collapse { display: initial; } + input:not(:checked) ~ .collapse { display: none; } +} + + +.custom-select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + + font-weight: normal; + + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN +AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ +cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn +sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8 +6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0 +ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w +Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb +7jwaAAAAAElFTkSuQmCC) 96% no-repeat; + + + &.flat { border: none; } + + &:not(.flat) { + &:extend(.widget); + width: 100%; + border-radius: 50px; + } +} \ No newline at end of file diff --git a/searx/static/themes/eelo/package-lock.json b/searx/static/themes/eelo/package-lock.json new file mode 100644 index 000000000..f42bab5f1 --- /dev/null +++ b/searx/static/themes/eelo/package-lock.json @@ -0,0 +1,1875 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true, + "optional": true + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", + "dev": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "dev": true, + "optional": true + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "dev": true, + "optional": true, + "requires": { + "hoek": "0.9.x" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "clean-css": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.2.23.tgz", + "integrity": "sha1-BZC1R4tRbEkD7cLYm9P9vdKGMow=", + "dev": true, + "optional": true, + "requires": { + "commander": "2.2.x" + } + }, + "cli": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", + "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "~ 3.2.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.2.0.tgz", + "integrity": "sha1-F1rUuTF/P/YV8gHB5XIk9Vo+kd8=", + "dev": true, + "optional": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "dev": true, + "optional": true, + "requires": { + "boom": "0.4.x" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true, + "optional": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", + "dev": true + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", + "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=", + "dev": true + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "dev": true, + "optional": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "faye-websocket": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "dev": true, + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "dev": true, + "optional": true, + "requires": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true, + "optional": true + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "dev": true, + "requires": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "grunt-contrib-concat": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz", + "integrity": "sha1-lTxu/f39LBB6uchQd/LUsk0xzUk=", + "dev": true, + "requires": { + "chalk": "^0.5.1", + "source-map": "^0.3.0" + } + }, + "grunt-contrib-jshint": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.10.0.tgz", + "integrity": "sha1-V+vMyofo8yevZkXYo8WG1IReTYE=", + "dev": true, + "requires": { + "hooker": "~0.2.3", + "jshint": "~2.5.0" + } + }, + "grunt-contrib-less": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-0.11.4.tgz", + "integrity": "sha1-VmdHWsRRfzLKYjuaTYHWz0rtK1E=", + "dev": true, + "requires": { + "async": "^0.2.10", + "chalk": "^0.5.1", + "less": "^1.7.2", + "lodash": "^2.4.1", + "maxmin": "^0.1.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "grunt-contrib-uglify": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.6.0.tgz", + "integrity": "sha1-OicdTcTaumRpHQ0NCFUOxUp+wKs=", + "dev": true, + "requires": { + "chalk": "^0.5.1", + "lodash": "^2.4.1", + "maxmin": "^1.0.0", + "uglify-js": "^2.4.0", + "uri-path": "0.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "dev": true, + "requires": { + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + } + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", + "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "dev": true, + "requires": { + "async": "~0.2.9", + "gaze": "~0.5.1", + "lodash": "~2.4.1", + "tiny-lr-fork": "0.0.5" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "dev": true, + "requires": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "dev": true, + "requires": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "dev": true, + "requires": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "gzip-size": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-0.1.1.tgz", + "integrity": "sha1-rjNIO2/IIk6DQilt4Qjvk3V/duA=", + "dev": true, + "requires": { + "concat-stream": "^1.4.1", + "zlib-browserify": "^0.0.3" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "dev": true, + "optional": true, + "requires": { + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true, + "optional": true + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + } + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "optional": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "dev": true, + "requires": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + } + }, + "jshint": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.5.11.tgz", + "integrity": "sha1-4tlYWLuxqngwAQii6BCZ+wlWIuA=", + "dev": true, + "requires": { + "cli": "0.6.x", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "minimatch": "1.0.x", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x", + "underscore": "1.6.x" + }, + "dependencies": { + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "less": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/less/-/less-1.7.5.tgz", + "integrity": "sha1-TyIM9yiKJ+rKc5325ICKLUwNV1Y=", + "dev": true, + "requires": { + "clean-css": "2.2.x", + "graceful-fs": "~3.0.2", + "mime": "~1.2.11", + "mkdirp": "~0.5.0", + "request": "~2.40.0", + "source-map": "0.1.x" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "optional": true, + "requires": { + "natives": "^1.1.3" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "maxmin": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-0.1.0.tgz", + "integrity": "sha1-ldgcUonjqdMPf8fcVZwCTlAwydA=", + "dev": true, + "requires": { + "chalk": "^0.4.0", + "gzip-size": "^0.1.0", + "pretty-bytes": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true, + "optional": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "noptify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", + "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "dev": true, + "requires": { + "nopt": "~2.0.0" + }, + "dependencies": { + "nopt": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", + "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-bytes": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-0.1.2.tgz", + "integrity": "sha1-zZApTVihyk6KXQ+5yCJZmIgazwA=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "optional": true + }, + "qs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", + "integrity": "sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g=", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", + "integrity": "sha1-TdZw9pbx5uhC5mtLXoOTAaub62c=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.5.0", + "forever-agent": "~0.5.0", + "form-data": "~0.1.0", + "hawk": "1.1.1", + "http-signature": "~0.10.0", + "json-stringify-safe": "~5.0.0", + "mime-types": "~1.0.1", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.3.0", + "qs": "~1.0.0", + "stringstream": "~0.0.4", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.4.0" + } + }, + "resolve": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", + "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "dev": true, + "optional": true, + "requires": { + "hoek": "0.9.x" + } + }, + "source-map": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", + "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "tape": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/tape/-/tape-0.2.2.tgz", + "integrity": "sha1-ZMz6S37PSgBgAH5hcW1CR4FnFjc=", + "dev": true, + "requires": { + "deep-equal": "~0.0.0", + "defined": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "tiny-lr-fork": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", + "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "dev": true, + "requires": { + "debug": "~0.7.0", + "faye-websocket": "~0.4.3", + "noptify": "~0.0.3", + "qs": "~0.5.2" + }, + "dependencies": { + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=", + "dev": true + } + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", + "dev": true + }, + "uri-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-0.0.2.tgz", + "integrity": "sha1-gD6wHy/rF5J9zOD2GH5yt19T9VQ=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "zlib-browserify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.3.tgz", + "integrity": "sha1-JAzNv9AgP6hCsTDe77FBQSLIzFA=", + "dev": true, + "requires": { + "tape": "~0.2.2" + } + } + } +} diff --git a/searx/static/themes/eelo/package.json b/searx/static/themes/eelo/package.json new file mode 100644 index 000000000..5b10fcf9f --- /dev/null +++ b/searx/static/themes/eelo/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": { + "grunt": "~0.4.5", + "grunt-contrib-uglify": "~0.6.0", + "grunt-contrib-watch": "~0.6.1", + "grunt-contrib-concat": "~0.5.0", + "grunt-contrib-jshint": "~0.10.0", + "grunt-contrib-less": "~0.11.0" + }, + "scripts": { + "build": "npm install && grunt", + "start": "grunt watch", + "test": "grunt" + } +} diff --git a/searx/templates/eelo/404.html b/searx/templates/eelo/404.html new file mode 100644 index 000000000..03c96eb3f --- /dev/null +++ b/searx/templates/eelo/404.html @@ -0,0 +1,15 @@ +{% extends "eelo/base.html" %} +{% block content %} +
+
+
+ +

{{_("Page not found")}}

+ + {% autoescape false %} +

{{ _('Go to %(search_page)s.', search_page=unicode('{}').format(url_for('index'), _('search page'))) }}

+ {% endautoescape %} +
+
+
+{% endblock %} diff --git a/searx/templates/eelo/about.html b/searx/templates/eelo/about.html new file mode 100644 index 000000000..159fffcc7 --- /dev/null +++ b/searx/templates/eelo/about.html @@ -0,0 +1,7 @@ +{% extends "eelo/base.html" %} +{% block title %}{{ _('about') }} - {% endblock %} +{% block content %} +
+ {% include '__common__/about.html' %} +
+{% endblock %} diff --git a/searx/templates/eelo/base.html b/searx/templates/eelo/base.html new file mode 100644 index 000000000..cb2ab9c1b --- /dev/null +++ b/searx/templates/eelo/base.html @@ -0,0 +1,108 @@ +{% from 'eelo/macros.html' import icon %} + + + + + + + + + + + {% block meta %}{% endblock %} + {% block title %}{% endblock %}{{ instance_name }} + + + + {% for css in styles %} + + {% endfor %} + + + + + + + {% block styles %} + {% endblock %} + {% block head %} + {% endblock %} + + + + + + + + + {% include 'eelo/components/icons.html' %} + {% include 'eelo/components/navbar.html' %} + + {% set inline_search_form = true %} +
+ + {% block site_alert_error %} + {% endblock %} + {% block site_alert_warning %} + {% endblock %} + {% block site_alert_info %} + {% endblock %} + {% block site_alert_success %} + {% endblock %} + + {% block content %} + {% endblock %} + + + +
+
+ {% block footer %} + {% endblock %} +

+ + e Foundation 2018-2019, + {{ _('Powered by') }} Spot + {{ metadata_version }}
An open-source metasearch engine forked from Searx {{ searx_version }}. + + {{ _('About') }} + {{ _('Privacy') }} + +
+

+
+ + + + {% if autocomplete %}{% endif %} + + + + {% for script in scripts %} + + {% endfor %} + + diff --git a/searx/templates/eelo/components/categories.html b/searx/templates/eelo/components/categories.html new file mode 100644 index 000000000..4cdd6786c --- /dev/null +++ b/searx/templates/eelo/components/categories.html @@ -0,0 +1,29 @@ +{% macro category_widget(category) -%} + + +{%- endmacro -%} + +{% set main_categories = ["general", "images", "videos", "news"] %} + +
+ {% for category in categories %} + {% if category in main_categories + selected_categories %} + {{ category_widget(category) }} + {% endif %} + {% endfor %} + +
+ + + + + +
+ {% for category in categories %} + {% if not (category in main_categories + ["map"] or category in selected_categories) %} + {{ category_widget(category) }} + {% endif %} + {% endfor %} +
+
+
diff --git a/searx/templates/eelo/components/icons.html b/searx/templates/eelo/components/icons.html new file mode 100644 index 000000000..8d76c5011 --- /dev/null +++ b/searx/templates/eelo/components/icons.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/searx/templates/eelo/components/infobox.html b/searx/templates/eelo/components/infobox.html new file mode 100644 index 000000000..39a077da0 --- /dev/null +++ b/searx/templates/eelo/components/infobox.html @@ -0,0 +1,51 @@ +{% from 'eelo/macros.html' import result_link with context %} + +
+
+

{{ infobox.infobox }}

+ {{infobox.engine}} +
+ +
+ +
+ {% if infobox.img_src %} +
+ +
+ {% endif %} + + {% if infobox.content %} +

{{ infobox.content }}

+ {% endif %} +
+ + {% if infobox.attributes %} + + {% for attribute in infobox.attributes %} + + + {% if attribute.image %} + + {% else %} + + {% endif %} + + {% endfor %} +
{{ attribute.label }}{{ attribute.image.alt }}{{ attribute.value }}
+ {% endif %} +
+ + +
diff --git a/searx/templates/eelo/components/languages.html b/searx/templates/eelo/components/languages.html new file mode 100644 index 000000000..a22a63fc3 --- /dev/null +++ b/searx/templates/eelo/components/languages.html @@ -0,0 +1,11 @@ +{% if preferences %} + +{% endif %} + {% for lang_id, lang_name, country_name, english_name in language_codes | sort(attribute=1) %} + + {% endfor %} + diff --git a/searx/templates/eelo/components/navbar.html b/searx/templates/eelo/components/navbar.html new file mode 100644 index 000000000..39038d1f6 --- /dev/null +++ b/searx/templates/eelo/components/navbar.html @@ -0,0 +1,15 @@ +{% from 'eelo/macros.html' import navbar_menu %} + + + + +{{ navbar_menu() }} diff --git a/searx/templates/eelo/components/search.html b/searx/templates/eelo/components/search.html new file mode 100644 index 000000000..af633376f --- /dev/null +++ b/searx/templates/eelo/components/search.html @@ -0,0 +1,3 @@ +{% from 'eelo/macros.html' import search_bar %} + +{% call search_bar(q, rtl=rtl, autofocus=True) %}{% endcall %} \ No newline at end of file diff --git a/searx/templates/eelo/components/search_full.html b/searx/templates/eelo/components/search_full.html new file mode 100644 index 000000000..9221b7675 --- /dev/null +++ b/searx/templates/eelo/components/search_full.html @@ -0,0 +1,12 @@ +{% from 'eelo/macros.html' import search_bar %} + +{% call search_bar(q, true, rtl) %} +
+ {% include 'eelo/components/categories.html' %} + + {% set flat_lang_selector = True %} + {% include 'eelo/components/languages.html' %} + {% include 'eelo/components/time-range.html' %} + +
+{% endcall %} diff --git a/searx/templates/eelo/components/time-range.html b/searx/templates/eelo/components/time-range.html new file mode 100644 index 000000000..5c9e3b28b --- /dev/null +++ b/searx/templates/eelo/components/time-range.html @@ -0,0 +1,17 @@ + diff --git a/searx/templates/eelo/index.html b/searx/templates/eelo/index.html new file mode 100644 index 000000000..fbebaf2f7 --- /dev/null +++ b/searx/templates/eelo/index.html @@ -0,0 +1,16 @@ +{% extends "eelo/base.html" %} +{% block content %} + +{% if errors %} +{% from 'eelo/macros.html' import errors_panel %} +
+ {{ errors_panel(errors, error_details) }} +
+{% endif %} + +
+ searx logo + e logo + {% include 'eelo/components/search.html' %} +
+{% endblock %} diff --git a/searx/templates/eelo/macros.html b/searx/templates/eelo/macros.html new file mode 100644 index 000000000..6126450db --- /dev/null +++ b/searx/templates/eelo/macros.html @@ -0,0 +1,149 @@ + +{% macro icon(action, classes="") -%} + + + +{%- endmacro %} + + +{% macro search_bar(value="", inline=false, rtl=false, autofocus=false) -%} + +{%- endmacro %} + +{% macro navbar_menu() -%} + +{%- endmacro %} + + + +{% macro draw_favicon(favicon) -%} + {{ favicon }} +{%- endmacro %} + +{%- macro result_link(url, title, classes='') -%} +{{ title }} +{%- endmacro -%} + + +{% macro result_header(result, favicons, put_icon=True) -%} +

{% if result.engine~".png" in favicons and put_icon %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}

+{%- endmacro %} +{% macro result_engine(result, favicons) -%} +{{ result.engine }}{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine)}}{% endif %} +{%- endmacro %} + + +{% macro result_sub_header(result) -%} + + {% if result.publishedDate %} + + {% endif %} + {% if caller %} + {{caller()}} + {% endif %} + +{%- endmacro %} + + +{% macro result_footer(result) -%} + +{{ result.pretty_url }} +{%- endmacro %} + + +{% macro result_footer_rtl(result) -%} +
+ {% for engine in result.engines %} + {{ engine }} + {% endfor %} + {{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }} + {% if proxify %} + {{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }} + {% endif %} + +{%- endmacro %} + +{% macro checkbox_toggle(id, blocked) -%} + + +{%- endmacro %} + +{% macro support_toggle(supports) -%} + {% if supports %} + + {{ _("supported") }} + + {% else %} + + {{ _("not supported") }} + + {% endif %} +{%- endmacro %} + + + +{% macro search_link(text, q, method=None, time_range=None, lang=None, category=None) -%} +
+ + {% if time_range %} + + {% endif %} + {% if time_range %} + + {% endif %} + {% if category %} + + {% endif %} + +
+{% endmacro %} + + +{% macro collapser(text, id, classes) -%} +
+ + +
+ {{ caller() }} +
+
+{%- endmacro %} + + +{% macro format_filesize(filesize) -%} +{% if filesize < 1024 %}{{ filesize }} {{ _('Bytes') }} +{% elif filesize < 1024*1024 %}{{ '{0:0.2f}'.format(filesize/1024) }} {{ _('kiB') }} +{% elif filesize < 1024*1024*1024 %}{{ '{0:0.2f}'.format(filesize/1024/1024) }} {{ _('MiB') }} +{% elif filesize < 1024*1024*1024*1024 %}{{ '{0:0.2f}'.format(filesize/1024/1024/1024) }} {{ _('GiB') }} +{% else %}{{ '{0:0.2f}'.format(filesize/1024/1024/1024/1024) }} {{ _('TiB') }}{% endif %} +{%- endmacro %} + + +{% macro errors_panel(errors, error_detail) -%} +
+

{{_("Error!")}}

+
    + {% for message in errors %} +
  • {{ message }}
  • + {% endfor %} +
+ {% if error_detail %} +
+{{error_detail}}
+    
+ {% endif %} +
+{%- endmacro %} diff --git a/searx/templates/eelo/messages/no_cookies.html b/searx/templates/eelo/messages/no_cookies.html new file mode 100644 index 000000000..d7cc98d57 --- /dev/null +++ b/searx/templates/eelo/messages/no_cookies.html @@ -0,0 +1,4 @@ + diff --git a/searx/templates/eelo/messages/no_results.html b/searx/templates/eelo/messages/no_results.html new file mode 100644 index 000000000..f27404bd2 --- /dev/null +++ b/searx/templates/eelo/messages/no_results.html @@ -0,0 +1,28 @@ +
+ +

{{_("Sorry, no results found!")}}

+
+ + + +{% if unresponsive_engines %} +
+
+

{{ _('Some engines are not working as expected!') }}

+
+{% for engine_name, error_type in unresponsive_engines %}
+- {{ engine_name }} ({{ error_type }}){% if not loop.last %}
{% endif %} +{% endfor %} +
+
+ +
+

{{ _('Please, try the following.') }}

+
    +
  • {{_("Search again later")}}
  • +
  • {{_("Try another query")}}
  • +
  • {{_("Report this problem")}}
  • +
+
+
+{% endif %} diff --git a/searx/templates/eelo/messages/save_settings_successfull.html b/searx/templates/eelo/messages/save_settings_successfull.html new file mode 100644 index 000000000..4b0420cca --- /dev/null +++ b/searx/templates/eelo/messages/save_settings_successfull.html @@ -0,0 +1,9 @@ +{% from 'eelo/macros.html' import icon %} + diff --git a/searx/templates/eelo/messages/unknow_error.html b/searx/templates/eelo/messages/unknow_error.html new file mode 100644 index 000000000..f03d4c431 --- /dev/null +++ b/searx/templates/eelo/messages/unknow_error.html @@ -0,0 +1,9 @@ +{% from 'eelo/macros.html' import icon %} + diff --git a/searx/templates/eelo/preferences.html b/searx/templates/eelo/preferences.html new file mode 100644 index 000000000..e32160964 --- /dev/null +++ b/searx/templates/eelo/preferences.html @@ -0,0 +1,238 @@ +{% from 'eelo/macros.html' import checkbox_toggle, support_toggle %} +{% extends "eelo/base.html" %} +{% block title %}{{ _('preferences') }} - {% endblock %} +{% block content %} + +{% macro preferences_item(info, label, rtl) -%} +
+
+ +
{{ info }}
+
+
+ {{ caller() }} +
+
+{% endmacro -%} + + +
+

{{ _('Preferences') }}

+
+ +
+ +
+ +
+
+ {% set language_label = _('Search language') %} + {% set language_info = _('What language do you prefer for search?') %} + {% call preferences_item(language_info, language_label, rtl) %} + {% include 'eelo/components/languages.html' %} + {% endcall %} + + {% set locale_label = _('Interface language') %} + {% set locale_info = _('Change the language of the layout') %} + {% call preferences_item(locale_info, locale_label, rtl) %} + + {% endcall %} + + {% set autocomplete_label = _('Autocomplete') %} + {% set autocomplete_info = _('Find stuff as you type') %} + {% call preferences_item(autocomplete_info, autocomplete_label, rtl) %} + + {% endcall %} + + {% set image_proxy_label = _('Image proxy') %} + {% set image_proxy_info = _('Proxying image results through searx') %} + {% call preferences_item(image_proxy_info, image_proxy_label, rtl) %} + + {% endcall %} + + {% set safesearch_label = _('SafeSearch') %} + {% set safesearch_info = _('Filter content') %} + {% call preferences_item(safesearch_info, safesearch_label, rtl) %} + + {% endcall %} + + {% set theme_label = _('Themes') %} + {% set theme_info = _('Change searx layout') %} + {% call preferences_item(theme_info, theme_label, rtl) %} + + {% endcall %} + + {% call preferences_item(_('Choose style for this theme'), _('Style'), rtl) %} + + {% endcall %} + + {% set label = _('Results on new tabs') %} + {% set info = _('Open result links on new browser tabs') %} + {% call preferences_item(info, label, rtl) %} + + {% endcall %} +
+
+ + + +
+ + {% for categ in categories %} + +
+

{{categ}}

+ {% for search_engine in engines_by_category[categ] %} + {% if not search_engine.private %} +
+ {% set disabled = (search_engine.name, categ) in disabled_engines %} + {{ checkbox_toggle('engine_' + search_engine.name | replace(' ', '_') + '__' + categ | replace(' ', '_'), disabled) }} + + {{ search_engine.name }}
+ + {% set support_text_str = [(stats[search_engine.name].supports_selected_language, "%s %s " | format(locales[current_locale], _("not supported"))), + (search_engine.safesearch == True, _("No safe search")), + (not(stats[search_engine.name]['warn_time'] or stats[search_engine.name]['warn_timeout']), _("Slow"))] %} + {{ support_text_str | rejectattr(0) | map(attribute=1) | join(", ") }} + +
+
+ {% endif %} + {% endfor %} +
+ {% endfor %} +
+ + + +
+
+

{{_("Plugins")}}

+
+
    + {% for plugin in plugins %} +
  • +
    + {{ checkbox_toggle('plugin_' + plugin.id, plugin.id not in allowed_plugins) }} + {{ _(plugin.name) }} +
    +

    {{ _(plugin.description) }}

    +
  • + {% endfor %} +
+
+
+ + {% if answerers %} +
+

{{ _('Answerers') }}

+

{{ _('This is the list of searx\'s instant answering modules.') }}

+
    + {% for answerer in answerers %} +
  • +

    {{ answerer.info.name }} {{ _('Keywords') }}: {{ answerer.keywords|join(', ') }}

    +

    {{ answerer.info.description }}

    +
    + {{ _('Examples') }} +

    {{ answerer.info.examples|join(', ') }}

    +
    +
  • + {% endfor %} +
+
+ {% endif %} + +
+

{{ _('Cookies') }}

+

+ {{ _('This is the list of cookies and their values searx is storing on your computer.') }}
+ {{ _('With that list, you can assess searx transparency.') }}
+

+ {% if cookies %} +
    + {% for cookie in cookies %} +
  • + {{ cookie }}: {{ cookies[cookie] }} +
  • + {% endfor %} +
+ {% else %} + {% include 'eelo/messages/no_cookies.html' %} + {% endif %} +
+
+ + + +
+ + + +
+ + + +
+ + +
+ {% if errors %} + {% from 'eelo/macros.html' import errors_panel %} + {{ errors_panel(errors) }} + {% endif %} + +
+

{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }} +
+ {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }} +

+
+ +
+

{{ _('Search URL of the currently saved preferences') }} ({{ _('Note: specifying custom settings in the search URL can reduce privacy by leaking data to the clicked result sites.') }}):

+ +
+ +
+ + {{ _('Reset defaults') }} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/searx/templates/eelo/privacy.html b/searx/templates/eelo/privacy.html new file mode 100644 index 000000000..f0f449369 --- /dev/null +++ b/searx/templates/eelo/privacy.html @@ -0,0 +1,10 @@ +{% extends "eelo/base.html" %} +{% block title %}{{ _('Privacy policy') }} - {% endblock %} + + +{% block content %} +
+

{{ _('Privacy') }}

+
+ +{% endblock %} \ No newline at end of file diff --git a/searx/templates/eelo/result_templates/code.html b/searx/templates/eelo/result_templates/code.html new file mode 100644 index 000000000..b9659ca2c --- /dev/null +++ b/searx/templates/eelo/result_templates/code.html @@ -0,0 +1,16 @@ +{% from 'eelo/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %} + +{{ result_header(result, favicons) }} +{% call result_sub_header(result) %} + {% if result.repository %}{{ result.repository }}{% endif %} +{% endcall %} + +
+ {% if result.content %}{{ result.content|safe }}{% endif %} + +
+ {{ result.codelines|code_highlighter(result.code_language)|safe }} +
+
+ +{{ result_footer(result) }} \ No newline at end of file diff --git a/searx/templates/eelo/result_templates/default.html b/searx/templates/eelo/result_templates/default.html new file mode 100644 index 000000000..d6a4f9729 --- /dev/null +++ b/searx/templates/eelo/result_templates/default.html @@ -0,0 +1,13 @@ +{% from 'eelo/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon with context %} + +{{ result_header(result, favicons) }} +{% call result_sub_header(result) %} +{% endcall %} + +
+ + {% if result.content %}{{ result.content|safe }}{% endif %} + +
+ +{{ result_footer(result) }} diff --git a/searx/templates/eelo/result_templates/images.html b/searx/templates/eelo/result_templates/images.html new file mode 100644 index 000000000..fdfdc623a --- /dev/null +++ b/searx/templates/eelo/result_templates/images.html @@ -0,0 +1,4 @@ + + {{ result.title|striptags }} + + \ No newline at end of file diff --git a/searx/templates/eelo/result_templates/map.html b/searx/templates/eelo/result_templates/map.html new file mode 100644 index 000000000..e5eb67e7b --- /dev/null +++ b/searx/templates/eelo/result_templates/map.html @@ -0,0 +1,72 @@ +{% from 'eelo/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %} + +{{ result_header(result, favicons) }} +{{ result_sub_header(result) }} + +{% if (result.latitude and result.longitude) or result.boundingbox %} + +{% endif %} + +{% if result.osm and (result.osm.type and result.osm.id) %} + +{% endif %} + +{# {% if (result.latitude and result.longitude) %} + +{% endif %} #} + +
+ +{% if result.address %} +

+ {% if result.address.name %} + {{ result.address.name }}
+ {% endif %} + {% if result.address.road %} + + {% if result.address.house_number %}{{ result.address.house_number }}, {% endif %} + {{ result.address.road }} +
+ {% endif %} + {% if result.address.locality %} + {{ result.address.locality }} + {% if result.address.postcode %}, {{ result.address.postcode }}{% endif %} +
+ {% endif %} + {% if result.address.country %} + {{ result.address.country }} + {% endif %} +

+{% endif %} + +{% if result.osm and (result.osm.type and result.osm.id) %} +
+
Loading ...
+ + + +
+{% endif %} + +{# {% if (result.latitude and result.longitude) %} +
+ Longitude: {{ result.longitude }}
+ Latitude: {{ result.latitude }} +
+{% endif %} #} + +{% if result.content %}

{{ result.content|safe }}

{% endif %} + +
+ +{% if (result.latitude and result.longitude) or result.boundingbox %} +
+
+
+{% endif %} + +{% if rtl %} +{{ result_footer_rtl(result) }} +{% else %} +{{ result_footer(result) }} +{% endif %} diff --git a/searx/templates/eelo/result_templates/torrent.html b/searx/templates/eelo/result_templates/torrent.html new file mode 100644 index 000000000..d200597bd --- /dev/null +++ b/searx/templates/eelo/result_templates/torrent.html @@ -0,0 +1,38 @@ +{% from 'eelo/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, result_link, icon, format_filesize %} + +{{ result_header(result, favicons) }} +{% call result_sub_header(result) %} + {% if result.magnetlink %} + {{ result_link(result.magnetlink, _('magnet link'), "magnetlink") }} + {% endif %} + {% if result.torrentfile %} + {{ result_link(result.torrentfile, _('torrent file'), "torrentfile") }} + {% endif %} +{% endcall %} + +
+ +
+ {% if result.seed and result.leech -%} + {{ _('Seeders') }}: {{ result.seed }} + {{ _('Leechers') }}: {{ result.leech }} + {%- endif %} + + {% if result.filesize %} + {{ _('Filesize') }}: + {{ format_filesize(result.filesize) }} + + {% endif %} + + {% if result.files %} + + {{ _('Files') }}: {{ result.files }} + + {% endif %} +
+ +

{% if result.content %}{{ result.content|safe }}{% endif %}

+
+ + +{{ result_footer(result) }} diff --git a/searx/templates/eelo/result_templates/video_torrent.html b/searx/templates/eelo/result_templates/video_torrent.html new file mode 100644 index 000000000..c108929a7 --- /dev/null +++ b/searx/templates/eelo/result_templates/video_torrent.html @@ -0,0 +1,25 @@ +{% from 'eelo/macros.html' import result_header, result_engine, result_sub_header, format_filesize%} + +
+ + {{ result.title|striptags }} {{ result.engine }} +
+ {{_("torrent")}} + + {% if result.seed and result.leech -%} + 🡑: {{ result.seed }} + 🡓: {{ result.leech }} + {%- endif %} + {% if result.filesize %} + {{ format_filesize(result.filesize) }} + {% endif %} + +
+
+
+ {{ result_header(result, favicons, False) }} + {% call result_sub_header(result) -%} + {{result_engine(result, favicons)}} + {%- endcall %} +
+
diff --git a/searx/templates/eelo/result_templates/videos.html b/searx/templates/eelo/result_templates/videos.html new file mode 100644 index 000000000..28f608f87 --- /dev/null +++ b/searx/templates/eelo/result_templates/videos.html @@ -0,0 +1,13 @@ +{% from 'eelo/macros.html' import result_header, result_engine, result_sub_header%} + +
+ + {{ result.title|striptags }} {{ result.engine }} + +
+ {{ result_header(result, favicons, False) }} + {% call result_sub_header(result) -%} + {{result_engine(result, favicons)}} + {%- endcall %} +
+
\ No newline at end of file diff --git a/searx/templates/eelo/results.html b/searx/templates/eelo/results.html new file mode 100644 index 000000000..9d9ff1ed8 --- /dev/null +++ b/searx/templates/eelo/results.html @@ -0,0 +1,126 @@ +{% extends "eelo/base.html" %} +{% from "eelo/macros.html" import search_link %} + + +{%- macro search_url() %}{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&pageno={{ pageno }}{% endif %}{% if time_range %}&time_range={{ time_range }}{% endif %}{% if current_language != 'all' %}&language={{ current_language }}{% endif %}{% endmacro -%} +{% block title %}{{ q|e }} - {% endblock %} +{% block meta %}{% endblock %} +{% block content %} + +
+ {% include 'eelo/components/search_full.html' %} +
+ + {% set use_gallery_layout = 'images' in selected_categories or 'videos' in selected_categories %} + +{% endblock %} diff --git a/tests/unit/test_preferences.py b/tests/unit/test_preferences.py index 61ac0e8e4..f18de0b6e 100644 --- a/tests/unit/test_preferences.py +++ b/tests/unit/test_preferences.py @@ -128,7 +128,7 @@ class TestPreferences(SearxTestCase): def test_encode(self): from searx.preferences import Preferences - pref = Preferences(['oscar'], ['general'], {}, []) + pref = Preferences(['oscar', 'eelo'], ['general'], {}, []) url_params = 'eJx1VMmO2zAM_Zr6YrTocujJh6JF0QEKzKAz7VVgJNohLIseUU7ivy-VcWy5yyGOTVGP73GLKJNPYjiYgGeT4NB8BS9YOSY' \ 'TUdifMDYM-vmGY1d5CN0EHTYOK88W_PXNkcDBozOjnzoK0vyi4bWnHs2RU4-zvHr_-RF9a-5Cy3GARByy7X7EkKMoBeMp9CuPQ-SzYMx' \ '8Vr9P1qKI-XJ_p1fOkRJWNCgVM0a-zAttmBJbHkaPSZlNts-_jiuBFgUh2mPztkpHHLBhsRArDHvm356eHh5vATS0Mqagr0ZsZO_V8hT' \ -- GitLab From 443c45a9fc0a33744192526bef0b62df5f23f41e Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Fri, 17 Jan 2020 19:46:24 +0100 Subject: [PATCH 02/83] Fix locale and search language Locale and search language was always defined with english value. This patch inits the locale on `pre_request` in order to define the default value of locale and language preferences. Plus the `best_match` function provided by flask babel library did not work as expected. So the function `match_language` provided by searx is used to detect that the language from Accepted-Language header can be used in searx project. Close: https://github.com/asciimoo/searx/issues/844 Close: #35, #42 --- searx/preferences.py | 16 +++++++++++++--- searx/settings.yml | 1 - searx/webapp.py | 34 ++++++++++++++++++++++------------ 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/searx/preferences.py b/searx/preferences.py index 30a4252b0..fa46e82af 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -117,7 +117,17 @@ class SearchLanguageSetting(EnumStringSetting): elif lang in self.choices: data = lang else: - data = self.value + res = None + for lg in self.choices: + if data == lg.split('-')[0]: + res = lg + break + + if res is None: + data = self.value + else: + data = res + self.value = data @@ -243,8 +253,8 @@ class Preferences(object): super(Preferences, self).__init__() self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']), - 'language': SearchLanguageSetting(settings['search']['language'], - choices=LANGUAGE_CODES), + 'language': SearchLanguageSetting(settings['ui']['default_locale'], + choices=list(LANGUAGE_CODES) + ['']), 'locale': EnumStringSetting(settings['ui']['default_locale'], choices=list(settings['locales'].keys()) + ['']), 'autocomplete': EnumStringSetting(settings['search']['autocomplete'], diff --git a/searx/settings.yml b/searx/settings.yml index 2777f9caa..8d86406ce 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -5,7 +5,6 @@ general: search: safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default - language : "en-US" ban_time_on_fail : 5 # ban time in seconds after engine errors max_ban_time_on_fail : 120 # max ban time in seconds after engine errors diff --git a/searx/webapp.py b/searx/webapp.py index 212c874c9..da4ff33d9 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -157,18 +157,19 @@ outgoing_proxies = settings['outgoing'].get('proxies') or None @babel.localeselector def get_locale(): - if 'locale' in request.form\ - and request.form['locale'] in settings['locales']: - return request.form['locale'] + locale = "en-US" - if 'locale' in request.args\ - and request.args['locale'] in settings['locales']: - return request.args['locale'] + for lang in request.headers.get("Accept-Language", locale).split(","): + locale = match_language(lang, settings['locales'].keys(), fallback=None) + if locale is not None: + break if request.preferences.get_value('locale') != '': - return request.preferences.get_value('locale') + locale = request.preferences.get_value('locale') - return request.accept_languages.best_match(settings['locales'].keys()) + logger.debug("selected locale is `%s`", locale) + + return locale # code-highlighter @@ -346,7 +347,9 @@ def render(template_name, override_theme=None, **kwargs): if 'autocomplete' not in kwargs: kwargs['autocomplete'] = request.preferences.get_value('autocomplete') - if get_locale() in rtl_locales and 'rtl' not in kwargs: + locale = request.preferences.get_value('locale') + + if locale in rtl_locales and 'rtl' not in kwargs: kwargs['rtl'] = True kwargs['searx_version'] = VERSION_STRING @@ -359,7 +362,7 @@ def render(template_name, override_theme=None, **kwargs): if 'current_language' not in kwargs: kwargs['current_language'] = match_language(request.preferences.get_value('language'), LANGUAGE_CODES, - fallback=settings['search']['language']) + fallback=locale) # override url_for function in templates kwargs['url_for'] = url_for_theme @@ -429,6 +432,13 @@ def pre_request(): logger.exception('invalid settings') request.errors.append(gettext('Invalid settings')) + # init search language and locale + locale = get_locale() + if not preferences.get_value("language"): + preferences.parse_dict({"language": locale}) + if not preferences.get_value("locale"): + preferences.parse_dict({"locale": locale}) + # request.user_plugins request.user_plugins = [] allowed_plugins = preferences.plugins.get_enabled() @@ -635,7 +645,7 @@ def index(): unresponsive_engines=result_container.unresponsive_engines, current_language=match_language(search_query.lang, LANGUAGE_CODES, - fallback=settings['search']['language']), + fallback=request.preferences.get_value("language")), base_url=get_base_url(), theme=get_current_theme_name(), favicons=global_favicons[themes.index(get_current_theme_name())], @@ -748,7 +758,7 @@ def preferences(): return render('preferences.html', locales=settings['locales'], - current_locale=get_locale(), + current_locale=request.preferences.get_value("locale"), image_proxy=image_proxy, engines_by_category=categories, stats=stats, -- GitLab From dea00dccd38af0421f0e8fb3f99d434a170be70c Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Wed, 15 Jan 2020 21:35:06 +0100 Subject: [PATCH 03/83] Package spot for production Ref: #33 --- .dockerignore | 4 -- .env | 5 +++ Dockerfile | 84 ++++++-------------------------------- docker-compose-prod.yml | 9 ++++ docker-compose.yml | 58 ++++++++++++++++++++++++++ env.Dockerfile | 8 ++++ etc/nginx/conf.d/spot.conf | 25 ++++++++++++ nginx.Dockerfile | 4 ++ searx/__init__.py | 9 +++- searx/settings.yml | 20 ++++++--- searx/version.py | 18 ++++---- setup.py | 28 +++---------- 12 files changed, 160 insertions(+), 112 deletions(-) create mode 100644 .env create mode 100644 docker-compose-prod.yml create mode 100644 docker-compose.yml create mode 100644 env.Dockerfile create mode 100644 etc/nginx/conf.d/spot.conf create mode 100644 nginx.Dockerfile diff --git a/.dockerignore b/.dockerignore index f4d03376c..08aa110d3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,10 +4,6 @@ */*/*/*~ */*/*/*/*~ -# Git -.git -.gitignore - # CI .codeclimate.yml .travis.yml diff --git a/.env b/.env new file mode 100644 index 000000000..e01a5e92b --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +SPOT_HOSTNAME=localhost +SPOT_DOCKER_IMG=registry.gitlab.e.foundation:5000/e/cloud/my-spot +SPOT_DOCKER_TAG=latest +SPOT_NGINX_DOCKER_IMG=registry.gitlab.e.foundation:5000/e/cloud/my-spot/nginx +SPOT_NGINX_DOCKER_TAG=latest diff --git a/Dockerfile b/Dockerfile index b0b5a609d..ea2166a5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,79 +1,19 @@ -FROM alpine:3.10 -ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"] -EXPOSE 8080 -VOLUME /etc/searx -VOLUME /var/log/uwsgi +FROM registry.gitlab.e.foundation:5000/e/cloud/my-spot/env as builder -ARG VERSION_GITCOMMIT=unknown -ARG SEARX_GIT_VERSION=unknown +COPY . /src/ +RUN pip install --force-reinstall --prefix /install /src -ARG SEARX_GID=977 -ARG SEARX_UID=977 -RUN addgroup -g ${SEARX_GID} searx && \ - adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx +FROM python:3.8-alpine +LABEL maintainer="spot " +LABEL description="A privacy-respecting, hackable metasearch engine." -ARG TIMESTAMP_SETTINGS=0 -ARG TIMESTAMP_UWSGI=0 -ARG LABEL_VCS_REF= -ARG LABEL_VCS_URL= +RUN apk add ca-certificates libxslt py3-gunicorn -ENV INSTANCE_NAME=searx \ - AUTOCOMPLETE= \ - BASE_URL= \ - MORTY_KEY= \ - MORTY_URL= +COPY --from=builder /install/ /usr/local/ -WORKDIR /usr/local/searx +EXPOSE 80 +STOPSIGNAL SIGINT - -COPY requirements.txt ./requirements.txt - -RUN apk upgrade --no-cache \ - && apk add --no-cache -t build-dependencies \ - build-base \ - py3-setuptools \ - python3-dev \ - libffi-dev \ - libxslt-dev \ - libxml2-dev \ - openssl-dev \ - tar \ - git \ - && apk add --no-cache \ - ca-certificates \ - su-exec \ - python3 \ - libxml2 \ - libxslt \ - openssl \ - tini \ - uwsgi \ - uwsgi-python3 \ - && pip3 install --upgrade pip \ - && pip3 install --no-cache -r requirements.txt \ - && apk del build-dependencies - -COPY --chown=searx:searx . . - -RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \ - touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \ - touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \ - if [ ! -z $VERSION_GITCOMMIT ]; then\ - echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \ - fi - - -# Keep this argument at the end since it change each time -ARG LABEL_DATE= -LABEL maintainer="searx " \ - description="A privacy-respecting, hackable metasearch engine." \ - version="${SEARX_GIT_VERSION}" \ - org.label-schema.schema-version="1.0" \ - org.label-schema.name="searx" \ - org.label-schema.version="${SEARX_GIT_VERSION}" \ - org.label-schema.url="${LABEL_VCS_URL}" \ - org.label-schema.vcs-ref=${LABEL_VCS_REF} \ - org.label-schema.vcs-url=${LABEL_VCS_URL} \ - org.label-schema.build-date="${LABEL_DATE}" \ - org.label-schema.usage="https://github.com/searx/searx-docker" +ENV PYTHONPATH="/usr/local/lib/python3.8/site-packages" +CMD ["gunicorn", "-w", "1", "-b", "0.0.0.0:80", "searx.webapp:app"] diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml new file mode 100644 index 000000000..e6937e840 --- /dev/null +++ b/docker-compose-prod.yml @@ -0,0 +1,9 @@ +version: '3.6' + +services: + spot: + image: ${SPOT_DOCKER_IMG}:${SPOT_DOCKER_TAG} + + nginx: + image: ${SPOT_NGINX_DOCKER_IMG}:${SPOT_NGINX_DOCKER_TAG} + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..9090d9d79 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,58 @@ +version: '3.6' + +x-logging: + &default-logging + options: + max-size: '1g' + max-file: '5' + driver: json-file + +services: + spot: + build: . + logging: *default-logging + restart: unless-stopped + environment: + SEARX_SECRET: ":@)%NN0+OqNdy:{prWQlZ{p9|oO9p-UyJq@%V!~G:arrSx6fXz.{jd%=XF44ncj" + GUNICORN_LOGGER: 1 + GUNICORN_LEVEL: INFO + + nginx: + build: + context: . + dockerfile: nginx.Dockerfile + logging: *default-logging + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.spot.rule=Host(`${SPOT_HOSTNAME}`)" + - "traefik.http.routers.spot.entrypoints=websecure" + - "traefik.http.routers.spot.tls.certresolver=spotchallenge" + - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" + - "traefik.http.routers.http-catchall.entrypoints=web" + - "traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker" + - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + - "traefik.http.middlewares.spot-ratelimit.ratelimit.average=50" + - "traefik.http.middlewares.spot-ratelimit.ratelimit.burst=20" + + traefik: + image: "traefik:v2.1.2" + logging: *default-logging + restart: unless-stopped + command: + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.web.address=:80" + - "--entrypoints.websecure.address=:443" + - "--certificatesresolvers.spotchallenge.acme.tlschallenge=true" + - "--certificatesresolvers.spotchallenge.acme.email=contact@e.email" + - "--certificatesresolvers.spotchallenge.acme.storage=/letsencrypt/acme.json" + ports: + - "80:80" + - "443:443" + volumes: + - "letsencrypt:/letsencrypt" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + +volumes: + letsencrypt: diff --git a/env.Dockerfile b/env.Dockerfile new file mode 100644 index 000000000..10675b11e --- /dev/null +++ b/env.Dockerfile @@ -0,0 +1,8 @@ +FROM python:3.8-alpine + +COPY requirements.txt requirements-dev.txt / + +RUN apk add build-base git libxml2-dev libxslt-dev libffi-dev openssl-dev npm \ +&& pip install -r /requirements.txt \ +&& pip install -r /requirements-dev.txt \ +&& rm -f /requirements.txt /requirements-dev.txt diff --git a/etc/nginx/conf.d/spot.conf b/etc/nginx/conf.d/spot.conf new file mode 100644 index 000000000..cbbda524f --- /dev/null +++ b/etc/nginx/conf.d/spot.conf @@ -0,0 +1,25 @@ +server { + listen 80; + server_name _; + + add_header Content-Security-Policy "frame-ancestors 'self'"; + add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin"; + add_header Strict-Transport-Security "max-age=31536000"; + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Content-Type-Options "nosniff"; + + root /var/www/spot; + + location / { + try_files $uri @searx; + } + + location @searx { + proxy_pass http://spot:80; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_buffering off; + } +} diff --git a/nginx.Dockerfile b/nginx.Dockerfile new file mode 100644 index 000000000..a8c1e0d2b --- /dev/null +++ b/nginx.Dockerfile @@ -0,0 +1,4 @@ +FROM nginx:1.17.6-alpine + +COPY etc/nginx/conf.d/spot.conf /etc/nginx/conf.d/default.conf +COPY --chown=nginx:nginx searx/static /var/www/spot/static diff --git a/searx/__init__.py b/searx/__init__.py index d32fe0066..2d7a03301 100644 --- a/searx/__init__.py +++ b/searx/__init__.py @@ -78,7 +78,14 @@ if searx_debug: else: logging.basicConfig(level=logging.WARNING) -logger = logging.getLogger('searx') +logger = logging.getLogger("searx") + +if "GUNICORN_LOGGER" in environ: + logger = logging.getLogger() + gunicorn_logger = logging.getLogger("gunicorn.error") + logger.handlers = gunicorn_logger.handlers + logger.setLevel(environ.get("GUNICORN_LEVEL", "INFO")) + logger.debug('read configuration from %s', settings_path) # Workaround for openssl versions <1.0.2 # https://github.com/certifi/python-certifi/issues/26 diff --git a/searx/settings.yml b/searx/settings.yml index 8d86406ce..fa58d1a99 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -1,16 +1,16 @@ general: debug : False # Debug mode, only for development - instance_name : "searx" # displayed name + instance_name : "/e/ spot" # displayed name search: safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict - autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default + autocomplete : "duckduckgo" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default ban_time_on_fail : 5 # ban time in seconds after engine errors max_ban_time_on_fail : 120 # max ban time in seconds after engine errors server: - port : 8888 - bind_address : "127.0.0.1" # address to listen on + port : 80 + bind_address : "0.0.0.0" # address to listen on secret_key : "ultrasecretkey" # change this! base_url : False # Set custom base_url. Possible values: False or "https://your.custom.host/location/" image_proxy : False # Proxying image results through searx @@ -19,7 +19,7 @@ server: ui: static_path : "" # Custom static path - leave it blank if you didn't change templates_path : "" # Custom templates path - leave it blank if you didn't change - default_theme : oscar # ui theme + default_theme : eelo # ui theme default_locale : "" # Default interface locale - leave blank to detect from browser information or use codes from the 'locales' config section theme_args : oscar_style : logicodev # default style of oscar @@ -95,6 +95,7 @@ engines: - name : bing images engine : bing_images shortcut : bii + disabled: True - name : bing news engine : bing_news @@ -103,6 +104,7 @@ engines: - name : bing videos engine : bing_videos shortcut : biv + disabled: True - name : bitbucket engine : xpath @@ -119,6 +121,7 @@ engines: - name : btdigg engine : btdigg shortcut : bt + disabled : True - name : ccc-tv engine : xpath @@ -301,6 +304,7 @@ engines: - name : google videos engine : google_videos shortcut : gov + disabled : True - name : google scholar engine : xpath @@ -399,6 +403,7 @@ engines: base_url : 'https://invidio.us/' shortcut: iv timeout : 5.0 + disabled : True - name: kickass engine : kickass @@ -488,6 +493,7 @@ engines: - name : openstreetmap engine : openstreetmap shortcut : osm + disabled : True - name : openrepos engine : xpath @@ -511,12 +517,14 @@ engines: - name : photon engine : photon shortcut : ph + disabled : True - name : piratebay engine : piratebay shortcut : tpb url: https://pirateproxy.red/ timeout : 3.0 + disabled: True - name : pubmed engine : pubmed @@ -623,6 +631,7 @@ engines: shortcut : tor url: https://torrentz2.eu/ timeout : 3.0 + disabled: True - name : twitter engine : twitter @@ -756,6 +765,7 @@ engines: shortcut : speu engine : seedpeer categories: files, music, videos + disabled: True # - name : yacy # engine : yacy diff --git a/searx/version.py b/searx/version.py index 4e149722e..11bbcbffe 100644 --- a/searx/version.py +++ b/searx/version.py @@ -16,11 +16,15 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. (C) 2013- by Adam Tauber, ''' -# version of searx -VERSION_MAJOR = 0 -VERSION_MINOR = 15 -VERSION_BUILD = 0 +from pkg_resources import get_distribution, DistributionNotFound -VERSION_STRING = "{0}.{1}.{2}".format(VERSION_MAJOR, - VERSION_MINOR, - VERSION_BUILD) +try: + VERSION_STRING = get_distribution("searx").version +except DistributionNotFound: + VERSION_STRING = "0.0.0" + +try: + SEARX_VERSION, METADATA_VERSION = VERSION_STRING.split("+") +except ValueError: + SEARX_VERSION = VERSION_STRING + METADATA_VERSION = "" diff --git a/setup.py b/setup.py index bd3dd5d1c..ac5d115b2 100644 --- a/setup.py +++ b/setup.py @@ -4,27 +4,15 @@ from setuptools import setup from setuptools import find_packages -import os -import sys -# required to load VERSION_STRING constant -sys.path.insert(0, './searx') -from version import VERSION_STRING - -with open('README.rst') as f: - long_description = f.read() - -with open('requirements.txt') as f: - requirements = [ l.strip() for l in f.readlines()] - -with open('requirements-dev.txt') as f: - dev_requirements = [ l.strip() for l in f.readlines()] +requirements = open('requirements.txt').read().splitlines() +dev_requirements = open('requirements-dev.txt').read().splitlines() setup( name='searx', - version=VERSION_STRING, + use_scm_version={"tag_regex": r"^(?:[\w-]+-)?(?P[vV]?\d+(?:\.\d+){0,2}.*)$"}, description="A privacy-respecting, hackable metasearch engine", - long_description=long_description, + long_description=open('README.rst').read(), classifiers=[ "Development Status :: 4 - Beta", "Programming Language :: Python", @@ -41,6 +29,7 @@ setup( packages=find_packages(exclude=["tests*"]), zip_safe=False, install_requires=requirements, + setup_requires=["setuptools_scm"], extras_require={ 'test': dev_requirements }, @@ -52,9 +41,6 @@ setup( package_data={ 'searx': [ 'settings.yml', - '../README.rst', - '../requirements.txt', - '../requirements-dev.txt', 'data/*', 'plugins/*/*', 'static/*.*', @@ -64,11 +50,7 @@ setup( 'static/*/*/*/*/*.*', 'templates/*/*.*', 'templates/*/*/*.*', - 'tests/*', - 'tests/*/*', - 'tests/*/*/*', 'translations/*/*/*' ], }, - ) -- GitLab From 2464d7c60152d5809d1eb027aea694f5154d9096 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Thu, 16 Jan 2020 22:57:16 +0100 Subject: [PATCH 04/83] Create spot README --- README.md | 46 +++++++++++++++++++++++++++++++++++++++ README.rst | 63 ------------------------------------------------------ setup.py | 2 +- 3 files changed, 47 insertions(+), 64 deletions(-) create mode 100644 README.md delete mode 100644 README.rst diff --git a/README.md b/README.md new file mode 100644 index 000000000..9c38fd5c7 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# spot for [/e/](https://e.foundation) + +![logo](searx/static/themes/eelo/img/favicon.png) + +A privacy-respecting, hackable [metasearch engine](https://en.wikipedia.org/wiki/Metasearch_engine). + +Spot was forked from searx: read [documentation](https://asciimoo.github.io/searx) and the [wiki](https://github.com/asciimoo/searx/wiki) for more information. + +## Changes between Spot and Searx + +* eelo theme +* docker packaging thinking to be production ready +* better locale support + +## Getting Started + +You can run spot with docker-compose. First of all you have to install +docker and docker-compose on your host, then follow instructions +below to run spot for production or local environment. + +### Like production + +3 containes are used for production, traefik as edge router, +nginx to server static files and spot as backend. + +* Run the docker-compose up command to start the project +``` +docker-compose up --build spot nginx +``` + +* Getting the ip of the nginx service and go to `http://`, below the docker way to get the IP of the nginx container +``` +docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-spot_nginx_1 +``` + +### For developer + +You can directly run spot, with a python command inside a docker container which +contains all dependencies. + +``` +docker run -it --rm -v $(pwd):/ws -w /ws registry.gitlab.e.foundation:5000/e/cloud/my-spot/env sh +SEARX_DEBUG=1 python -X dev searx/webapp.py +``` + +Then go open your browser and navigate to the container IP. diff --git a/README.rst b/README.rst deleted file mode 100644 index 7fcda4f97..000000000 --- a/README.rst +++ /dev/null @@ -1,63 +0,0 @@ -searx -===== - -A privacy-respecting, hackable `metasearch -engine `__. - -Pronunciation: səːks - -List of `running -instances `__. - -See the `documentation `__ and the `wiki `__ for more information. - -|OpenCollective searx backers| -|OpenCollective searx sponsors| - -Installation -~~~~~~~~~~~~ - -With Docker ------- -Go to the `searx-docker `__ project. - -Without Docker ------- -For all of the details, follow this `step by step installation `__. - -Note: the documentation needs to be updated. - -If you are in a hurry ------- -- clone the source: - ``git clone https://github.com/asciimoo/searx.git && cd searx`` -- install dependencies: ``./manage.sh update_packages`` -- edit your - `settings.yml `__ - (set your ``secret_key``!) -- run ``python searx/webapp.py`` to start the application - - -Bugs -~~~~ - -Bugs or suggestions? Visit the `issue -tracker `__. - -`License `__ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -More about searx -~~~~~~~~~~~~~~~~ - -- `openhub `__ -- `twitter `__ -- IRC: #searx @ freenode - - -.. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg - :target: https://opencollective.com/searx#backer - - -.. |OpenCollective searx sponsors| image:: https://opencollective.com/searx/sponsors/badge.svg - :target: https://opencollective.com/searx#sponsor diff --git a/setup.py b/setup.py index ac5d115b2..b6bae019f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name='searx', use_scm_version={"tag_regex": r"^(?:[\w-]+-)?(?P[vV]?\d+(?:\.\d+){0,2}.*)$"}, description="A privacy-respecting, hackable metasearch engine", - long_description=open('README.rst').read(), + long_description=open('README.md').read(), classifiers=[ "Development Status :: 4 - Beta", "Programming Language :: Python", -- GitLab From bac5453632817a36d057985aa94e0e755b2ed248 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Thu, 16 Jan 2020 23:25:21 +0100 Subject: [PATCH 05/83] Add a gitlab CI --- .gitlab-ci.yml | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..afcaa4c92 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,106 @@ +image: $CI_REGISTRY_IMAGE/env:latest + +stages: + - check + - build + - test + - deploy + +python: + stage: check + before_script: + - ./manage.sh update_dev_packages + script: + - ./manage.sh pep8_check + +build:web: + stage: build + before_script: + - ./manage.sh npm_packages + - ./manage.sh update_dev_packages + script: + - ./manage.sh locales + - ./manage.sh styles + - ./manage.sh grunt_build + +.build:docker: + stage: build + image: docker:git + services: + - docker:18-dind + before_script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY + script: + - docker build -t $CI_REGISTRY_IMAGE . + - docker push $CI_REGISTRY_IMAGE + - docker build -t $CI_REGISTRY_IMAGE/nginx -f nginx.Dockerfile . + - docker push $CI_REGISTRY_IMAGE/nginx + +build:docker:master: + extends: .build:docker + only: + - master + +build:docker:tags: + extends: .build:docker + script: + - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG . + - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + - docker build -t $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG -f nginx.Dockerfile . + - docker push $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG + only: + - tags + +test:unit: + stage: test + before_script: + - ./manage.sh update_dev_packages + script: + - ./manage.sh py_test_coverage + coverage: '/TOTAL.*\s+(\d+%)$/' + +.deploy:template: + stage: deploy + before_script: + - pip install docker-compose + - apk add openssh-client + - eval $(ssh-agent -s) + - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + +deploy:spot.test.cloud.global: + extends: .deploy:template + when: manual + only: + - branches + environment: + name: test + url: https://spot.test.ecloud.global + variables: + DOCKER_HOST: ssh://root@spot.test.ecloud.global + SPOT_HOSTNAME: spot.test.ecloud.global + COMPOSE_PROJECT_NAME: my-spot + SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY_TEST} + script: + - docker-compose up -d --build + +deploy:spot.cloud.global: + extends: .deploy:template + only: + - tags + environment: + name: prod + url: https://spot.ecloud.global + variables: + DOCKER_HOST: ssh://root@spot.ecloud.global + SPOT_HOSTNAME: spot.ecloud.global + COMPOSE_PROJECT_NAME: my-spot + COMPOSE_FILE: docker-compose.yml:docker-compose-prod.yml + SPOT_DOCKER_TAG: ${CI_COMMIT_REF_SLUG} + SPOT_NGINX_DOCKER_TAG: ${CI_COMMIT_REF_SLUG} + SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY_PROD} + script: + - docker-compose up -d -- GitLab From ecddc080797516fd09d46a25cce32b776abdc722 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Thu, 16 Jan 2020 23:55:51 +0100 Subject: [PATCH 06/83] Add rate limit config in nginx about search endpoints Close: #33 --- etc/nginx/conf.d/spot.conf | 17 +++++++++++------ etc/nginx/proxy_spot_params | 5 +++++ nginx.Dockerfile | 2 ++ 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 etc/nginx/proxy_spot_params diff --git a/etc/nginx/conf.d/spot.conf b/etc/nginx/conf.d/spot.conf index cbbda524f..90af2a927 100644 --- a/etc/nginx/conf.d/spot.conf +++ b/etc/nginx/conf.d/spot.conf @@ -1,3 +1,5 @@ +limit_req_zone $http_x_forwarded_for zone=botlimit:10m rate=3r/s; + server { listen 80; server_name _; @@ -11,15 +13,18 @@ server { root /var/www/spot; + location = / { + limit_req zone=botlimit burst=3; + include /etc/nginx/proxy_spot_params; + } + location = /search { + limit_req zone=botlimit burst=3; + include /etc/nginx/proxy_spot_params; + } location / { try_files $uri @searx; } - location @searx { - proxy_pass http://spot:80; - proxy_set_header Host $http_host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_buffering off; + include /etc/nginx/proxy_spot_params; } } diff --git a/etc/nginx/proxy_spot_params b/etc/nginx/proxy_spot_params new file mode 100644 index 000000000..893323963 --- /dev/null +++ b/etc/nginx/proxy_spot_params @@ -0,0 +1,5 @@ +proxy_pass http://spot:80; +proxy_set_header Host $http_host; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_buffering off; diff --git a/nginx.Dockerfile b/nginx.Dockerfile index a8c1e0d2b..16328ed59 100644 --- a/nginx.Dockerfile +++ b/nginx.Dockerfile @@ -1,4 +1,6 @@ FROM nginx:1.17.6-alpine COPY etc/nginx/conf.d/spot.conf /etc/nginx/conf.d/default.conf +COPY etc/nginx/proxy_spot_params /etc/nginx/proxy_spot_params +RUN sed -i 's!remote_addr!http_x_forwarded_for!g' /etc/nginx/nginx.conf COPY --chown=nginx:nginx searx/static /var/www/spot/static -- GitLab From 15c376430f58ca8fc60f4450f0e58d84b3c834da Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Tue, 21 Jan 2020 23:12:03 +0100 Subject: [PATCH 07/83] Introduce filtron to ban botnet Ref: #44 --- .env | 2 + .gitlab-ci.yml | 6 +- README.md | 10 ++-- docker-compose-build.yml | 15 +++++ docker-compose-prod.yml | 9 --- docker-compose.yml | 11 ++-- etc/filtron/rules.json | 120 +++++++++++++++++++++++++++++++++++++++ filtron.Dockerfile | 12 ++++ 8 files changed, 166 insertions(+), 19 deletions(-) create mode 100644 docker-compose-build.yml delete mode 100644 docker-compose-prod.yml create mode 100644 etc/filtron/rules.json create mode 100644 filtron.Dockerfile diff --git a/.env b/.env index e01a5e92b..7463602d4 100644 --- a/.env +++ b/.env @@ -3,3 +3,5 @@ SPOT_DOCKER_IMG=registry.gitlab.e.foundation:5000/e/cloud/my-spot SPOT_DOCKER_TAG=latest SPOT_NGINX_DOCKER_IMG=registry.gitlab.e.foundation:5000/e/cloud/my-spot/nginx SPOT_NGINX_DOCKER_TAG=latest +SPOT_FILTRON_DOCKER_IMG=registry.gitlab.e.foundation:5000/e/cloud/my-spot/filtron +SPOT_FILTRON_DOCKER_TAG=latest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index afcaa4c92..948d3e9f2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,8 @@ build:web: - docker push $CI_REGISTRY_IMAGE - docker build -t $CI_REGISTRY_IMAGE/nginx -f nginx.Dockerfile . - docker push $CI_REGISTRY_IMAGE/nginx + - docker build -t $CI_REGISTRY_IMAGE/filtron -f filtron.Dockerfile . + - docker push $CI_REGISTRY_IMAGE/filtron build:docker:master: extends: .build:docker @@ -48,6 +50,8 @@ build:docker:tags: - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - docker build -t $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG -f nginx.Dockerfile . - docker push $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG + - docker build -t $CI_REGISTRY_IMAGE/filtron:$CI_COMMIT_REF_SLUG -f filtron.Dockerfile . + - docker push $CI_REGISTRY_IMAGE/filtron:$CI_COMMIT_REF_SLUG only: - tags @@ -83,6 +87,7 @@ deploy:spot.test.cloud.global: DOCKER_HOST: ssh://root@spot.test.ecloud.global SPOT_HOSTNAME: spot.test.ecloud.global COMPOSE_PROJECT_NAME: my-spot + COMPOSE_FILE: docker-compose.yml:docker-compose-build.yml SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY_TEST} script: - docker-compose up -d --build @@ -98,7 +103,6 @@ deploy:spot.cloud.global: DOCKER_HOST: ssh://root@spot.ecloud.global SPOT_HOSTNAME: spot.ecloud.global COMPOSE_PROJECT_NAME: my-spot - COMPOSE_FILE: docker-compose.yml:docker-compose-prod.yml SPOT_DOCKER_TAG: ${CI_COMMIT_REF_SLUG} SPOT_NGINX_DOCKER_TAG: ${CI_COMMIT_REF_SLUG} SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY_PROD} diff --git a/README.md b/README.md index 9c38fd5c7..ac1b40f15 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,17 @@ below to run spot for production or local environment. ### Like production -3 containes are used for production, traefik as edge router, -nginx to server static files and spot as backend. +3 containers are used for production, traefik as edge router, +filtron to drop malicious requests, nginx to server static files and spot as backend. * Run the docker-compose up command to start the project ``` -docker-compose up --build spot nginx +COMPOSE_FILE=docker-compose.yml:docker-compose-build.yml docker-compose up --build spot nginx filtron ``` -* Getting the ip of the nginx service and go to `http://`, below the docker way to get the IP of the nginx container +* Getting the ip of the nginx service and go to `http://`, below the docker way to get the IP of the filtron container ``` -docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-spot_nginx_1 +docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-spot_filtron_1 ``` ### For developer diff --git a/docker-compose-build.yml b/docker-compose-build.yml new file mode 100644 index 000000000..afef173af --- /dev/null +++ b/docker-compose-build.yml @@ -0,0 +1,15 @@ +version: '3.6' + +services: + spot: + build: . + + nginx: + build: + context: . + dockerfile: nginx.Dockerfile + + filtron: + build: + context: . + dockerfile: filtron.Dockerfile diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml deleted file mode 100644 index e6937e840..000000000 --- a/docker-compose-prod.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '3.6' - -services: - spot: - image: ${SPOT_DOCKER_IMG}:${SPOT_DOCKER_TAG} - - nginx: - image: ${SPOT_NGINX_DOCKER_IMG}:${SPOT_NGINX_DOCKER_TAG} - diff --git a/docker-compose.yml b/docker-compose.yml index 9090d9d79..7804e932a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ x-logging: services: spot: - build: . + image: ${SPOT_DOCKER_IMG}:${SPOT_DOCKER_TAG} logging: *default-logging restart: unless-stopped environment: @@ -18,9 +18,12 @@ services: GUNICORN_LEVEL: INFO nginx: - build: - context: . - dockerfile: nginx.Dockerfile + image: ${SPOT_NGINX_DOCKER_IMG}:${SPOT_NGINX_DOCKER_TAG} + logging: *default-logging + restart: unless-stopped + + filtron: + image: ${SPOT_FILTRON_DOCKER_IMG}:${SPOT_FILTRON_DOCKER_TAG} logging: *default-logging restart: unless-stopped labels: diff --git a/etc/filtron/rules.json b/etc/filtron/rules.json new file mode 100644 index 000000000..8d7085134 --- /dev/null +++ b/etc/filtron/rules.json @@ -0,0 +1,120 @@ +[ + { + "name": "stats.searx.xyz", + "interval": 300, + "limit": 10, + "filters": ["Header:X-Forwarded-For=(2a01:4f8:161:542e::2|5.9.58.49)"], + "stop": true, + "actions": [{ "name": "log"}] + }, + { + "name": "IP limit, all paths", + "interval": 3, + "limit": 25, + "aggregations": ["Header:X-Forwarded-For"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded, try again later."}} + ] + }, + { + "name": "useragent limit, all paths", + "interval": 30, + "limit": 200, + "aggregations": ["Header:X-Forwarded-For", "Header:User-Agent"], + "stop": true, + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded, try again later."}} + ] + }, + { + "name": "search request", + "filters": ["Param:q", "Path=^(/|/search)$"], + "subrules": [ + { + "name": "robot agent forbidden", + "limit": 0, + "stop": true, + "filters": ["Header:User-Agent=([Cc][Uu][Rr][Ll]|[wW]get|Scrapy|splash|JavaFX|FeedFetcher|python-requests|Go-http-client|Java|Jakarta|okhttp|HttpClient|Jersey|Python|libwww-perl|Ruby|SynHttpClient|UniversalFeedParser)"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded"}} + ] + }, + { + "name": "bot forbidden", + "limit": 0, + "stop": true, + "filters": ["Header:User-Agent=(Googlebot|GoogleImageProxy|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT|Sogou|Abonti|Pixray|Spinn3r|SemrushBot|Exabot|ZmEu|BLEXBot|bitlybot)"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded"}} + ] + }, + { + "name": "block missing accept-language", + "filters": ["!Header:Accept-Language"], + "limit": 0, + "stop": true, + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded"}} + ] + }, + { + "name": "block Connection:close", + "filters": ["Header:Connection=close"], + "limit": 0, + "stop": true, + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded"}} + ] + }, + { + "name": "block accept everything", + "filters": ["!Header:Accept=text/html"], + "limit": 0, + "stop": true, + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded"}} + ] + }, + { + "name": "rss/json limit", + "interval": 3600, + "limit": 4, + "stop": true, + "filters": ["Param:format=(csv|json|rss)"], + "aggregations": ["Header:X-Forwarded-For"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded, try again later."}} + ] + }, + { + "name": "IP limit", + "interval": 3, + "limit": 3, + "aggregations": ["Header:X-Forwarded-For"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded, try again later."}} + ] + }, + { + "name": "IP and useragent limit", + "interval": 600, + "limit": 60, + "stop": true, + "aggregations": ["Header:X-Forwarded-For", "Header:User-Agent"], + "actions": [ + {"name": "block", + "params": {"message": "Rate limit exceeded, try again later."}} + ] + } + ] + } +] diff --git a/filtron.Dockerfile b/filtron.Dockerfile new file mode 100644 index 000000000..cb28d921e --- /dev/null +++ b/filtron.Dockerfile @@ -0,0 +1,12 @@ +FROM golang:1.13-alpine as builder + +RUN apk add git && go get github.com/asciimoo/filtron + + +FROM alpine:3.11 + +COPY --from=builder /go/bin/filtron /usr/bin/filtron +COPY etc/filtron/rules.json /etc/filtron/rules.json + +EXPOSE 80 +CMD ["filtron", "-listen", ":80", "-rules", "/etc/filtron/rules.json", "-target", "nginx"] -- GitLab From 6b57b0518020110b665d792f29be5777aec35309 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Tue, 21 Jan 2020 23:12:03 +0100 Subject: [PATCH 08/83] Add CSP policy Close: #44 --- etc/nginx/conf.d/spot.conf | 5 +- searx/settings.yml | 2 +- searx/static/themes/eelo/js/searx.js | 53 +++++++++--------- searx/static/themes/eelo/js/searx.min.js | Bin 5631 -> 5658 bytes .../static/themes/eelo/js/searx_src/custom.js | 52 ++++++++--------- searx/templates/eelo/base.html | 2 +- .../eelo/result_templates/images.html | 4 +- 7 files changed, 62 insertions(+), 56 deletions(-) diff --git a/etc/nginx/conf.d/spot.conf b/etc/nginx/conf.d/spot.conf index 90af2a927..57acce75a 100644 --- a/etc/nginx/conf.d/spot.conf +++ b/etc/nginx/conf.d/spot.conf @@ -4,12 +4,13 @@ server { listen 80; server_name _; - add_header Content-Security-Policy "frame-ancestors 'self'"; add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin"; - add_header Strict-Transport-Security "max-age=31536000"; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; + add_header Content-Security-Policy "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self'; font-src 'self'; frame-ancestors 'self'; base-uri 'self'; connect-src 'self' https://overpass-api.de; img-src 'self' data: https://*.tile.openstreetmap.org; frame-src https://www.youtube-nocookie.com https://player.vimeo.com https://www.dailymotion.com https://www.deezer.com https://www.mixcloud.com https://w.soundcloud.com https://embed.spotify.com"; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; + add_header X-Robots-Tag "noindex, noarchive, nofollow"; root /var/www/spot; diff --git a/searx/settings.yml b/searx/settings.yml index fa58d1a99..572cb5fa5 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -13,7 +13,7 @@ server: bind_address : "0.0.0.0" # address to listen on secret_key : "ultrasecretkey" # change this! base_url : False # Set custom base_url. Possible values: False or "https://your.custom.host/location/" - image_proxy : False # Proxying image results through searx + image_proxy : True # Proxying image results through searx http_protocol_version : "1.0" # 1.0 and 1.1 are supported ui: diff --git a/searx/static/themes/eelo/js/searx.js b/searx/static/themes/eelo/js/searx.js index 1f5b9e7eb..ec0c9cab3 100644 --- a/searx/static/themes/eelo/js/searx.js +++ b/searx/static/themes/eelo/js/searx.js @@ -88,34 +88,37 @@ $(document).ready(function(){ }); } }); -; -function configure_image_view(target) { - document.getElementById("image_view_image").src = target.href; - document.getElementById("image_view_file_link").href = target.href; - document.getElementById("image_view_url_link").href = target.dataset.url; -} - -function show_image_view_modal(event) { - event.preventDefault(); - var target = event.target; - if (target.tagName == "IMG") { - target = target.parentElement; +;$(document).ready(function(){ + function configure_image_view(target, view_url) { + document.getElementById("image_view_image").src = view_url; + document.getElementById("image_view_file_link").href = target.href; + document.getElementById("image_view_url_link").href = target.dataset.url; } - var modal = document.getElementById("image_view_modal"); - modal.classList.remove("hidden"); - modal.style.top = window.scrollY + "px"; - configure_image_view(target); - document.body.classList.add("lock"); -} + $(".result.result-images").click(function (event) { + event.preventDefault(); + var target = event.target; + var view_url = target.src; + if (target.tagName == "IMG") { + target = target.parentElement; + } -function close_image_view_modal() { - document.getElementById("image_view_modal").classList.add("hidden"); - document.getElementById("image_view_image").src = ""; - document.getElementById("image_view_file_link").href = "#"; - document.getElementById("image_view_url_link").href = "#"; - document.body.classList.remove("lock"); -};/** + var modal = document.getElementById("image_view_modal"); + modal.classList.remove("hidden"); + modal.style.top = window.scrollY + "px"; + configure_image_view(target, view_url); + document.body.classList.add("lock"); + }); + + $("#close_image_view_modal").click(function () { + document.getElementById("image_view_modal").classList.add("hidden"); + document.getElementById("image_view_image").src = ""; + document.getElementById("image_view_file_link").href = "#"; + document.getElementById("image_view_url_link").href = "#"; + document.body.classList.remove("lock"); + }); +}); +;/** * searx is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/searx/static/themes/eelo/js/searx.min.js b/searx/static/themes/eelo/js/searx.min.js index d9dd67f9a71c04650813a1178c1b69fd8371136a..28d6dcd927c5f6cf56be8fb10f9dc984c41ab70c 100644 GIT binary patch delta 236 zcmeybJxgbT1e1~RL@9&KY0Q6_1ky_Ll1no4^Ar*_5_OU^t0zxjRGHY%!!%uP&BEmqRhOU}tm&enkG)&S~E(km!RElbTSaY;=}1ZvUHv@T05 zQb@K<(kn?UN>44(NwH1VD=td5R`T?9SF#0iN)prk5_414)HITTyn@6cpl;Wk)LbA1 z(#%|>kUF`aQI|1w@?J(6AbE>Xo;6V;Stn&OKa(1prVh}3%9HJw#3nZ|u}(JQ4m`odm&2MDWN^T3UiGE~T3y>gnX7ASF$|_5x{AlC)J0&cC2!6aRvP z-0tsk5se(k4Ne~q-}?;j`;vUePdlT-qvzd&{i+kxFe%1Vii*{pf}Ay^hP-Dmgv3t# zz|Oo)`{Bj*&AWa4%j>BeR-$<$OTt4E%?NH4^dQVJRHWl3jMAQ{agh;hh^oP)=-OJwjd)Fz&loPEdOdG7Akv)WH%E}T1 ziV}*odEkJJY_oxhQVv*CB{{!|QG1V)e~T9Ob3IrYgG;?S#IoJu!rxwdKmQsn<{PhD EKk90CVgLXD diff --git a/searx/static/themes/eelo/js/searx_src/custom.js b/searx/static/themes/eelo/js/searx_src/custom.js index 848300231..9a6bc1f0f 100644 --- a/searx/static/themes/eelo/js/searx_src/custom.js +++ b/searx/static/themes/eelo/js/searx_src/custom.js @@ -1,28 +1,30 @@ - -function configure_image_view(target) { - document.getElementById("image_view_image").src = target.href; - document.getElementById("image_view_file_link").href = target.href; - document.getElementById("image_view_url_link").href = target.dataset.url; -} - -function show_image_view_modal(event) { - event.preventDefault(); - var target = event.target; - if (target.tagName == "IMG") { - target = target.parentElement; +$(document).ready(function(){ + function configure_image_view(target, view_url) { + document.getElementById("image_view_image").src = view_url; + document.getElementById("image_view_file_link").href = target.href; + document.getElementById("image_view_url_link").href = target.dataset.url; } - var modal = document.getElementById("image_view_modal"); - modal.classList.remove("hidden"); - modal.style.top = window.scrollY + "px"; - configure_image_view(target); - document.body.classList.add("lock"); -} + $(".result.result-images").click(function (event) { + event.preventDefault(); + var target = event.target; + var view_url = target.src; + if (target.tagName == "IMG") { + target = target.parentElement; + } + + var modal = document.getElementById("image_view_modal"); + modal.classList.remove("hidden"); + modal.style.top = window.scrollY + "px"; + configure_image_view(target, view_url); + document.body.classList.add("lock"); + }); -function close_image_view_modal() { - document.getElementById("image_view_modal").classList.add("hidden"); - document.getElementById("image_view_image").src = ""; - document.getElementById("image_view_file_link").href = "#"; - document.getElementById("image_view_url_link").href = "#"; - document.body.classList.remove("lock"); -} \ No newline at end of file + $("#close_image_view_modal").click(function () { + document.getElementById("image_view_modal").classList.add("hidden"); + document.getElementById("image_view_image").src = ""; + document.getElementById("image_view_file_link").href = "#"; + document.getElementById("image_view_url_link").href = "#"; + document.body.classList.remove("lock"); + }); +}); diff --git a/searx/templates/eelo/base.html b/searx/templates/eelo/base.html index cb2ab9c1b..67148459b 100644 --- a/searx/templates/eelo/base.html +++ b/searx/templates/eelo/base.html @@ -66,7 +66,7 @@