plan for new theme

This commit is contained in:
Fauli1221 2024-04-30 21:06:11 +02:00
parent 0c54d566ae
commit 5ec07b4788
61 changed files with 6283 additions and 0 deletions

View file

@ -0,0 +1,28 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 12
},
"rules": {
"indent": ["error", 2],
"keyword-spacing": ["error", { "before": true, "after": true }],
"no-trailing-spaces": 2,
"space-before-function-paren": ["error", "always"],
"space-infix-ops": "error",
"comma-spacing": ["error", { "before": false, "after": true }],
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"curly": ["error", "multi-line"],
"block-spacing": ["error", "always"],
"dot-location": ["error", "property"],
"key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
"spaced-comment": ["error", "always", {
"line": { "markers": ["*package", "!", "/", ",", "="] },
"block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] }
}]
}
}

View file

@ -0,0 +1,2 @@
leaflet.css -diff
leaflet.js -diff

2
searx/static/themes/marlo/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/node_modules
package-lock.json

View file

@ -0,0 +1,8 @@
{
"proto": true,
"globals": {
"browser": true,
"jQuery": false,
"devel": true
}
}

View file

@ -0,0 +1,7 @@
{
"extends": "stylelint-config-standard",
"rules": {
"declaration-empty-line-before": null,
"no-invalid-position-at-import-rule": null
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

View file

@ -0,0 +1,661 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
max-width: none !important;
max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
width: auto;
padding: 0;
}
.leaflet-container img.leaflet-tile {
/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
mix-blend-mode: plus-lighter;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.8);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
line-height: 1.4;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
text-decoration: underline;
}
.leaflet-attribution-flag {
display: inline !important;
vertical-align: baseline !important;
width: 1em;
height: 0.6669em;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
white-space: nowrap;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: rgba(255, 255, 255, 0.8);
text-shadow: 1px 1px #fff;
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 24px 13px 20px;
line-height: 1.3;
font-size: 13px;
font-size: 1.08333em;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 17px 0;
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-top: -1px;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
pointer-events: auto;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
border: none;
text-align: center;
width: 24px;
height: 24px;
font: 16px/24px Tahoma, Verdana, sans-serif;
color: #757575;
text-decoration: none;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}
/* Printing */
@media print {
/* Prevent printers from removing background-images of controls. */
.leaflet-control {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,307 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
module.exports = function (grunt) {
const eachAsync = require('each-async');
function file_exists (filepath) {
// filter function to exit grunt task with error if a (src) file not exists
if (!grunt.file.exists(filepath)) {
grunt.fail.fatal('Could not find: ' + filepath, 42);
} else {
return true;
}
}
grunt.initConfig({
_brand: '../../../../src/brand',
_templates: '../../../templates',
pkg: grunt.file.readJSON('package.json'),
watch: {
scripts: {
files: ['gruntfile.js', 'src/**'],
tasks: [
'eslint',
'copy',
'uglify',
'less',
'image',
'svg2png',
'svg2jinja'
]
}
},
eslint: {
options: {
overrideConfigFile: '.eslintrc.json',
failOnError: true,
fix: grunt.option('fix')
},
target: [
'gruntfile.js',
'svg4web.svgo.js',
'src/js/main/*.js',
'src/js/head/*.js',
],
},
stylelint: {
options: {
formatter: 'unix',
},
src: [
'src/less/**/*.less',
]
},
copy: {
js: {
expand: true,
cwd: './node_modules',
dest: './js/',
flatten: true,
filter: 'isFile',
timestamp: true,
src: [
'./leaflet/dist/leaflet.js',
]
},
css: {
expand: true,
cwd: './node_modules',
dest: './css/',
flatten: true,
filter: 'isFile',
timestamp: true,
src: [
'./leaflet/dist/leaflet.css',
]
},
leaflet_images: {
expand: true,
cwd: './node_modules',
dest: './css/images/',
flatten: true,
filter: 'isFile',
timestamp: true,
src: [
'./leaflet/dist/images/*.png',
]
},
},
uglify: {
options: {
output: {
comments: 'some'
},
ie8: false,
warnings: true,
compress: false,
mangle: true,
sourceMap: {
includeSources: true
}
},
dist: {
files: {
'js/searxng.head.min.js': ['src/js/head/*.js'],
'js/searxng.min.js': [
'src/js/main/*.js',
'./node_modules/autocomplete-js/dist/autocomplete.js'
]
}
}
},
less: {
production: {
options: {
paths: ["less"],
plugins: [
new (require('less-plugin-clean-css'))()
],
sourceMap: true,
sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map'; },
outputSourceFiles: true,
},
files: [
{
src: ['src/less/style-ltr.less'],
dest: 'css/searxng.min.css',
nonull: true,
filter: file_exists,
},
{
src: ['src/less/style-rtl.less'],
dest: 'css/searxng-rtl.min.css',
nonull: true,
filter: file_exists,
},
],
},
},
image: {
svg4web: {
options: {
svgo: ['--config', 'svg4web.svgo.js']
},
files: {
'<%= _templates %>/simple/searxng-wordmark.min.svg': '<%= _brand %>/searxng-wordmark.svg',
'img/searxng.svg': '<%= _brand %>/searxng.svg',
'img/img_load_error.svg': '<%= _brand %>/img_load_error.svg'
}
},
favicon: {
options: {
svgo: ['--config', 'svg4favicon.svgo.js']
},
files: {
'img/favicon.svg': '<%= _brand %>/searxng-wordmark.svg'
}
},
},
svg2png: {
favicon: {
files: {
'img/favicon.png': '<%= _brand %>/searxng-wordmark.svg',
'img/searxng.png': '<%= _brand %>/searxng.svg',
}
}
},
svg2jinja: {
all: {
src: {
'warning': 'node_modules/ionicons/dist/svg/alert-outline.svg',
'close': 'node_modules/ionicons/dist/svg/close-outline.svg',
'chevron-up-outline': 'node_modules/ionicons/dist/svg/chevron-up-outline.svg',
'chevron-right': 'node_modules/ionicons/dist/svg/chevron-forward-outline.svg',
'chevron-left': 'node_modules/ionicons/dist/svg/chevron-back-outline.svg',
'menu-outline': 'node_modules/ionicons/dist/svg/settings-outline.svg',
'ellipsis-vertical-outline': 'node_modules/ionicons/dist/svg/ellipsis-vertical-outline.svg',
'magnet-outline': 'node_modules/ionicons/dist/svg/magnet-outline.svg',
'globe-outline': 'node_modules/ionicons/dist/svg/globe-outline.svg',
'search-outline': 'node_modules/ionicons/dist/svg/search-outline.svg',
'image-outline': 'node_modules/ionicons/dist/svg/image-outline.svg',
'play-outline': 'node_modules/ionicons/dist/svg/play-outline.svg',
'newspaper-outline': 'node_modules/ionicons/dist/svg/newspaper-outline.svg',
'location-outline': 'node_modules/ionicons/dist/svg/location-outline.svg',
'musical-notes-outline': 'node_modules/ionicons/dist/svg/musical-notes-outline.svg',
'layers-outline': 'node_modules/ionicons/dist/svg/layers-outline.svg',
'school-outline': 'node_modules/ionicons/dist/svg/school-outline.svg',
'file-tray-full-outline': 'node_modules/ionicons/dist/svg/file-tray-full-outline.svg',
'people-outline': 'node_modules/ionicons/dist/svg/people-outline.svg',
'heart-outline': 'node_modules/ionicons/dist/svg/heart-outline.svg',
'information-circle-outline': 'src/svg/information-circle-outline.svg',
},
dest: '../../../templates/simple/icons.html',
},
},
});
grunt.registerMultiTask('svg2jinja', 'Create Jinja2 macro', function () {
const ejs = require('ejs'), svgo = require('svgo');
const icons = {}
for (const iconName in this.data.src) {
const svgFileName = this.data.src[iconName];
try {
const svgContent = grunt.file.read(svgFileName, { encoding: 'utf8' })
const svgoResult = svgo.optimize(svgContent, {
path: svgFileName,
multipass: true,
plugins: [
{
name: "removeTitle",
},
{
name: "removeXMLNS",
},
{
name: "addAttributesToSVGElement",
params: {
attributes: [
{ "class": "ionicon", "aria-hidden": "true" }
]
}
}
]
});
icons[iconName] = svgoResult.data.replace("'", "\\'");
} catch (err) {
grunt.log.error(err);
}
}
const template = `{# this file was generated by searx/static/themes/simple/gruntfile.js #}
{%- set icons = {
<% for (const iconName in icons) { %> '<%- iconName %>':'<%- icons[iconName] %>',
<% } %>
}
-%}
{% macro icon(action, alt) -%}
{{ icons[action] | replace("ionicon", "ion-icon") | safe }}
{%- endmacro %}
{% macro icon_small(action) -%}
{{ icons[action] | replace("ionicon", "ion-icon-small") | safe }}
{%- endmacro %}
{% macro icon_big(action, alt) -%}
{{ icons[action] | replace("ionicon", "ion-icon-big") | safe }}
{%- endmacro %}
`;
const result = ejs.render(template, { icons });
grunt.file.write(this.data.dest, result, { encoding: 'utf8' });
grunt.log.ok(this.data.dest + " created");
});
grunt.registerMultiTask('svg2png', 'Convert SVG to PNG', function () {
const sharp = require('sharp'), done = this.async();
eachAsync(this.files, async (file, _index, next) => {
try {
if (file.src.length != 1) {
next("this task supports only one source per destination");
}
const info = await sharp(file.src[0])
.png({
force: true,
compressionLevel: 9,
palette: true,
})
.toFile(file.dest);
grunt.log.ok(file.dest + ' created (' + info.size + ' bytes, ' + info.width + 'px * ' + info.height + 'px)');
next();
} catch (error) {
grunt.fatal(error);
next(error);
}
}, error => {
if (error) {
grunt.fatal(error);
done(error);
} else {
done();
}
});
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-image');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-stylelint');
grunt.loadNpmTasks('grunt-eslint');
grunt.registerTask('test', ['eslint']);
grunt.registerTask('default', [
'eslint',
'stylelint',
'copy',
'uglify',
'less',
'image',
'svg2png',
'svg2jinja',
]);
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="92mm" height="92mm" viewBox="0 0 92 92"><g transform="translate(-40.921 -17.417)"><circle cx="75.921" cy="53.903" r="30" style="fill:none;fill-opacity:1;stroke:#3050ff;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/><path d="M67.515 37.915a18 18 0 0 1 21.051 3.313 18 18 0 0 1 3.138 21.078" style="fill:none;fill-opacity:1;stroke:#3050ff;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/><rect width="18.846" height="39.963" x="3.706" y="122.09" ry="0" style="opacity:1;fill:#3050ff;fill-opacity:1;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="rotate(-46.235)"/></g></svg>

After

Width:  |  Height:  |  Size: 726 B

View file

@ -0,0 +1 @@
<svg width="92mm" height="92mm" viewBox="0 0 92 92"><path d="M39.581 41.421h-8.954v-1.215q0-2.034.818-3.597.819-1.587 3.448-4.018l1.588-1.439q1.414-1.29 2.059-2.43.67-1.142.67-2.283 0-1.736-1.191-2.703-1.19-.993-3.324-.993-2.01 0-4.341.844-2.332.818-4.862 2.455v-7.788q3.002-1.042 5.482-1.538t4.787-.496q6.053 0 9.228 2.48 3.175 2.456 3.175 7.194 0 2.43-.968 4.365-.967 1.91-3.299 4.118L42.31 35.79q-1.687 1.538-2.208 2.48-.52.918-.52 2.034zm-8.954 3.671h8.954v8.83h-8.954Z" style="line-height:1;-inkscape-font-specification:&quot;DejaVu Sans Bold&quot;" font-style="normal" font-variant="normal" font-weight="700" font-stretch="normal" font-size="50.80000305px" font-family="DejaVu Sans" display="inline" fill="#db3434" fill-opacity="1" stroke-width=".26458335"/><circle cx="35" cy="36.486" r="30" fill="none" fill-opacity="1" stroke="#db3434" stroke-width="10" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/><rect width="18.846" height="39.963" x="-12.021" y="80.49" ry="0" transform="rotate(-46.235)" opacity="1" fill="#db3434" fill-opacity="1" stroke="none" stroke-width="8" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg sodipodi:docname="searxng.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" id="svg8" version="1.1" viewBox="0 0 255.96389 42.936821" height="42.936821mm" width="255.9639mm" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs id="defs2">
<rect x="0.023412704" y="0.020520346" width="1213.2513" height="275.74414" id="rect1180"/>
</defs>
<sodipodi:namedview inkscape:window-maximized="1" inkscape:window-y="2149" inkscape:window-x="-7" inkscape:window-height="1346" inkscape:window-width="2560" fit-margin-bottom="0" fit-margin-right="0" fit-margin-left="0" fit-margin-top="0" showgrid="false" inkscape:document-rotation="0" inkscape:current-layer="layer1" inkscape:document-units="mm" inkscape:cy="235.27775" inkscape:cx="1236.8338" inkscape:zoom="0.7" inkscape:pageshadow="2" inkscape:pageopacity="0.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" id="base" inkscape:showpageshadow="2" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1"/>
<metadata id="metadata5">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-4.0289272,-7.4746152)" id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g inkscape:export-ydpi="96" inkscape:export-xdpi="96" transform="translate(-25.702381,-86.178571)" style="font-style:normal;font-weight:normal;font-size:50.8px;line-height:1.25;font-family:sans-serif;display:none;fill:#487cff;fill-opacity:1;stroke:none;stroke-width:0.264583" id="text884" aria-label="SearXNG">
<path id="path886" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 56.494069,102.70358 q -1.1684,-1.2192 -3.047999,-2.032 -1.8796,-0.812802 -4.4196,-0.812802 -3.1496,0 -5.08,1.320802 -1.9304,1.27 -1.9304,3.4544 0,2.3368 3.7084,3.6068 l 7.6708,2.6416 q 3.962399,1.3208 5.841999,3.4036 1.8796,2.0828 1.8796,5.1308 0,4.064 -2.1844,7.0104 -2.1844,2.8956 -5.943599,4.4196 -3.7592,1.524 -8.4836,1.524 -5.334,0 -9.0424,-1.778 -3.7084,-1.8288 -5.5372,-5.1308 -0.2032,-0.3556 -0.2032,-0.7112 0,-0.3556 0.4064,-0.6096 l 4.0132,-2.4384 q 0.3556,-0.254 0.762,-0.254 0.6096,0 1.1176,0.6604 1.3208,1.6256 2.3876,2.54 1.1176,0.8636 2.6924,1.3208 1.6256,0.4572 4.1656,0.4572 3.2004,0 5.1816,-1.1684 1.9812,-1.2192 1.9812,-3.7592 0,-1.27 -0.9144,-2.0828 -0.9144,-0.8636 -2.9464,-1.5748 l -7.4168,-2.4892 q -3.6576,-1.2192 -5.588,-3.556 -1.8796,-2.3876 -1.8796,-5.4356 0,-3.7592 2.1336,-6.654802 2.1336,-2.8956 5.6896,-4.4704 3.6068,-1.5748 7.874,-1.5748 4.3688,0 7.670799,1.5748 3.3528,1.524 5.1816,3.9624 0.4064,0.508 0.4064,0.762 0,0.254002 -0.3556,0.457202 l -4.5212,2.9972 q -0.0508,0.0508 -0.2032,0.0508 -0.3048,0 -1.0668,-0.762 z"/>
<path id="path888" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 77.003775,132.37078 q -3.6068,0 -6.4008,-1.4732 -2.794,-1.4732 -4.318,-4.1148 -1.524,-2.6924 -1.524,-6.1976 0,-4.1656 1.9812,-7.874 2.032,-3.7592 5.5372,-5.9944 3.556,-2.286 7.9248,-2.286 5.334,0 8.4836,3.1496 3.1496,3.1496 3.1496,8.6868 0,1.4732 -0.2032,2.8448 -0.1016,0.4064 -0.3556,0.6096 -0.2032,0.1524 -0.8128,0.1524 h -17.1196 q -0.8128,0 -0.8128,2.1844 0,2.3876 1.524,3.7084 1.5748,1.27 4.064,1.27 1.9304,0 3.6068,-0.8128 1.6764,-0.8128 3.302,-2.54 0.254,-0.254 0.508,-0.254 0.1524,0 0.6604,0.2032 l 3.3528,1.5748 q 0.6096,0.2032 0.6096,0.6604 0,0.254 -0.254,0.6604 -2.9464,3.302 -5.8928,4.572 -2.8956,1.27 -7.0104,1.27 z m 6.4516,-16.5608 q 1.2192,0 1.2192,-1.9812 0,-1.9304 -1.1684,-3.2512 -1.1684,-1.3716 -3.2512,-1.3716 -2.54,0 -4.5212,1.9304 -1.9304,1.8796 -2.2352,4.6736 z"/>
<path id="path890" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 109.411,129.37358 q -3.048,2.9972 -8.3312,2.9972 -3.555996,0 -5.587996,-1.8288 -2.032,-1.8288 -2.032,-4.7752 0,-3.6068 2.3876,-5.8928 2.3876,-2.3368 5.994396,-3.3528 3.6576,-1.0668 7.5692,-1.1684 l 1.8288,-0.1524 q 0.9652,0 1.1176,-0.9652 l 0.1524,-1.0668 q 0.0508,-0.254 0.0508,-0.8128 0,-3.048 -3.5052,-3.048 -4.0132,0 -5.9436,3.1496 -0.254,0.3556 -0.6604,0.3556 -0.3048,0 -0.4572,-0.0508 l -4.927596,-1.1684 q -0.508,-0.1016 -0.508,-0.6604 0,-0.508 0.254,-1.016 3.352796,-5.4864 12.649196,-5.4864 5.4864,0 8.0264,1.9304 2.5908,1.9304 2.5908,5.334 0,0.4572 -0.1016,1.4732 l -2.54,17.78 q -0.0508,0.6604 -0.2032,0.8128 -0.1524,0.1016 -0.7112,0.1016 h -5.2324 q -0.508,0 -0.6604,-0.3048 -0.1524,-0.3048 -0.2032,-1.016 l 0.0508,-1.3208 q 0,-0.4064 -0.254,-0.4064 -0.254,0 -0.8128,0.5588 z m 2.1844,-9.7536 v -0.3048 q 0,-0.2032 -0.1016,-0.254 -0.1016,-0.1016 -0.4064,-0.0508 l -1.8288,0.1524 q -2.9464,0.2032 -5.4864,1.4732 -2.54,1.27 -2.54,3.9116 0,1.2192 0.8636,1.9812 0.9144,0.7112 2.4384,0.7112 1.3208,0 2.4892,-0.3556 1.1684,-0.4064 2.032,-1.0668 1.8796,-1.4224 2.0828,-2.8956 z"/>
<path id="path892" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 123.8636,131.86278 q -0.6096,0 -0.9144,-0.3556 -0.254,-0.3556 -0.1524,-0.9144 l 3.5052,-24.9428 q 0.0508,-0.4572 0.1524,-0.5588 0.1524,-0.1524 0.5588,-0.1524 h 6.0452 q 0.9144,0 0.7112,1.0668 l -0.3556,2.286 v 0.2032 q 0,0.3556 0.2032,0.3556 0.1524,0 0.4572,-0.3048 1.778,-1.8796 3.9624,-2.9972 2.1844,-1.1176 3.9624,-1.1176 1.0668,0 1.5748,0.1524 0.508,0.1524 0.4572,0.6096 l -0.8128,5.6896 q -0.0508,0.5588 -0.2032,0.7112 -0.1016,0.1524 -0.4064,0.1016 -1.7272,-0.254 -3.4544,-0.254 -1.3208,0 -2.794,0.7112 -1.4732,0.6604 -2.54,1.778 -1.016,1.0668 -1.1684,2.1336 l -2.0828,14.8336 q -0.1016,0.6604 -0.3556,0.8128 -0.2032,0.1524 -0.9652,0.1524 z"/>
<path id="path894" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 176.48129,130.08478 q 0.4572,0.8128 0.4572,1.2192 0,0.3048 -0.254,0.4572 -0.254,0.1016 -0.762,0.1016 h -7.0612 q -0.6096,0 -0.9652,-0.1524 -0.3048,-0.1524 -0.508,-0.6096 l -5.6388,-11.7348 q -0.254,-0.508 -0.508,-0.508 -0.1524,0 -0.5588,0.5588 l -9.0424,11.8364 q -0.254,0.4064 -0.6096,0.508 -0.3048,0.1016 -1.0668,0.1016 h -5.9436 q -1.016,0 -1.016,-0.6604 0,-0.4572 0.762,-1.524 l 13.0048,-16.3068 q 0.5588,-0.6096 0.5588,-1.0668 0,-0.3556 -0.1016,-0.5588 l -8.4836,-16.560802 q -0.1524,-0.254 -0.1524,-0.508 0,-0.508 0.762,-0.508 h 7.4168 q 0.6604,0 0.9144,0.1524 0.254,0.1524 0.508,0.6604 l 4.9276,10.363202 q 0.1524,0.4064 0.3556,0.4064 0.2032,0 0.508,-0.4064 l 8.0264,-10.566402 q 0.3048,-0.4064 0.5588,-0.508 0.3048,-0.1016 0.9652,-0.1016 h 6.5532 q 0.6096,0 0.6096,0.5588 0,0.4064 -0.3048,0.9144 l -12.5984,15.646402 q -0.508,0.6604 -0.508,0.9144 0,0.2032 0.1524,0.508 z"/>
<path id="path896" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 218.11268,94.169178 q 0.3556,0 0.4572,0.2032 0.1016,0.1524 0.0508,0.5588 l -5.1308,36.372802 q -0.0508,0.3556 -0.254,0.4572 -0.1524,0.1016 -0.5588,0.1016 h -5.1816 q -0.6604,0 -1.1684,-0.8128 l -13.1064,-22.7076 q -0.1524,-0.254 -0.3048,-0.254 -0.3048,0 -0.3556,0.5588 l -3.1496,22.4028 q -0.1016,0.508 -0.3048,0.6604 -0.1524,0.1524 -0.7112,0.1524 h -5.588 q -0.8128,0 -0.7112,-1.1176 l 5.08,-35.814002 q 0.1016,-0.508 0.2032,-0.6096 0.1524,-0.1524 0.6604,-0.1524 h 6.1468 q 0.508,0 0.762,0.254 0.3048,0.2032 0.5588,0.7112 l 11.9888,21.183602 q 0.254,0.4064 0.508,0.4064 0.4064,0 0.4572,-0.6096 l 2.9464,-21.285202 q 0.0508,-0.4064 0.2032,-0.508 0.2032,-0.1524 0.6604,-0.1524 z"/>
<path id="path898" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:50.8px;font-family:'Libre Franklin';-inkscape-font-specification:'Libre Franklin';fill:#487cff;fill-opacity:1;stroke-width:0.264583" d="m 236.43958,132.37078 q -4.572,0 -7.9248,-1.9304 -3.3528,-1.9304 -5.1308,-5.4356 -1.7272,-3.556 -1.7272,-8.3312 0,-6.2992 2.4892,-11.5316 2.4892,-5.283202 7.0612,-8.382002 4.572,-3.0988 10.5156,-3.0988 4.064,0 7.1628,1.5748 3.1496,1.5748 4.8768,4.1656 1.7272,2.540002 1.8288,5.435602 0,0.508 -0.1016,0.762 -0.0508,0.2032 -0.254,0.254 l -6.9596,1.016 h -0.0508 q -0.2032,0 -0.3556,-0.254 -0.1016,-0.254 -0.254,-1.016 -0.3556,-2.54 -1.9304,-4.1148 -1.524,-1.574802 -4.318,-1.574802 -3.6068,0 -5.9944,2.641602 -2.3368,2.6416 -3.4544,6.8072 -1.1176,4.1148 -1.1176,8.5852 0,4.3688 1.6256,6.2992 1.6764,1.8796 4.8768,1.8796 3.0988,0 5.2324,-1.7272 2.1336,-1.7272 3.1496,-4.2164 l 0.3048,-1.4224 q 0.1524,-0.254 0.1524,-0.3556 0,-0.3048 -0.6096,-0.3048 h -6.2484 q -0.3048,0 -0.4064,-0.1016 -0.1016,-0.1524 -0.0508,-0.5588 l 0.4572,-4.1656 q 0.0508,-0.5588 0.508,-0.5588 l 14.5288,0.0508 q 0.6096,0 0.762,0.2032 0.2032,0.1524 0.1016,0.6604 l -2.4892,17.5768 q -0.0508,0.6604 -0.8128,0.6604 h -1.524 q -0.4572,0 -0.7112,-0.1524 -0.2032,-0.1524 -0.3556,-0.6096 l -0.8636,-3.7084 q -0.0508,-0.254 -0.3556,-0.254 -0.3048,0 -0.6604,0.4064 -1.6764,2.0828 -4.3688,3.4544 -2.6924,1.3716 -6.604,1.3716 z"/>
</g>
<g aria-label="PonySearch" transform="matrix(0.3100831,0,0,0.3100831,3.9925893,-15.387177)" id="text472" style="font-size:192px;font-family:Equestria;-inkscape-font-specification:'Equestria, Normal';white-space:pre;fill:#487aff;stroke-width:3" inkscape:label="text472">
<path d="m 1.5234375,78.040453 q 50.9999995,3.5625 59.1562495,7.875 13.3125,3.75 17.8125,12.09375 10.6875,16.687497 10.6875,27.749997 v 1.5 q 0,16.78125 -45.5625,28.5 -2.90625,0 -2.90625,1.40625 0,22.96875 11.4375,35.625 v 0.65625 q -0.46875,2.15625 -5.71875,2.15625 H 15.117188 q -7.8750005,0 -7.8750005,-2.15625 11.4374995,-4.125 11.4374995,-24.1875 l 0.65625,-17.0625 v -35.625 q 0,-15.1875 -19.2187495,-37.124997 z m 38.5312495,57.749997 2.8125,1.40625 q 22.78125,-5.15625 22.78125,-19.21875 0,-11.90625 -15.65625,-14.25 h -2.15625 q -7.125,0 -7.125,18.46875 z" id="path1182"/>
<path d="m 124.71094,104.3842 h 2.25 q 15.1875,0 21.09375,16.59375 2.34375,7.78125 2.34375,14.25 v 6.1875 l 0.46875,5.15625 q 0,13.59375 -18.84375,20.53125 l -6.75,1.21875 q -11.71875,0 -19.96875,-9.1875 -6.843753,-8.8125 -6.843753,-23.4375 v -3.375 q 0,-17.8125 19.312503,-26.71875 z m -9.1875,30.1875 q 1.3125,18.84375 9.1875,18.84375 h 1.125 q 10.125,0 11.90625,-19.96875 v -0.5625 q 0,-13.6875 -10.21875,-13.6875 -9.09375,0 -12,14.25 z" id="path1184"/>
<path d="m 201.58594,80.571703 q 38.71875,0.75 38.71875,3.9375 -8.53125,13.3125 -8.53125,19.968747 -2.25,10.96875 -2.25,26.15625 0,39.46875 7.40625,46.21875 l 4.59375,5.71875 v 1.125 l -26.25,4.5 q -2.8125,0 -4.59375,-12 -5.71875,-15.5625 -19.3125,-43.875 h -0.65625 l -1.125,21.09375 q 0,13.03125 7.5,18.84375 l 1.6875,2.34375 q 0,2.0625 -38.25,4.5 l -0.5625,-0.5625 v -1.125 q 15.375,-9 15.375,-37.03125 0,-28.875 -15.375,-39.375 l -1.6875,-2.249997 v -0.5625 l 3.9375,-0.5625 h 33.09375 q 1.59375,0 9.65625,25.687497 9.375,22.59375 10.875,23.90625 l 0.5625,-12.5625 q 0,-42.468747 -16.5,-51.281247 l -0.5625,-0.5625 v -1.78125 z" id="path1186"/>
<path d="m 299.17969,87.134203 h 0.65625 l 44.34375,1.125 0.65625,0.5625 v 1.78125 q -6.46875,3.46875 -11.4375,7.96875 -15.5625,17.531247 -29.0625,48.374997 v 13.125 q 0,11.4375 12,16.5 l 1.125,1.78125 q 0,1.5 -37.125,7.40625 0,1.125 -3.9375,1.125 h -2.8125 l -1.125,-1.125 q 15.9375,-11.4375 15.9375,-23.90625 0,-11.15625 -23.4375,-43.40625 -7.96875,-9.375 -17.0625,-14.25 v -1.125 l 17.0625,-1.125 0.65625,0.5625 h 0.46875 l 2.34375,-0.5625 7.40625,0.5625 10.21875,-0.5625 h 0.65625 q 1.6875,0 1.6875,2.25 -3.46875,6 -3.46875,9.75 0,7.5 10.3125,17.625 15.375,-20.34375 15.375,-29.0625 0,-3.843747 -11.4375,-14.812497 z" id="path1188"/>
<path d="m 430.61719,75.509203 0.75,4.21875 q 0,15.65625 -3.5625,28.499997 -12.84375,-12.093747 -22.125,-12.093747 h -5.625 q -12.84375,1.96875 -12.84375,12.093747 3.84375,3.375 36.28125,19.96875 10.03125,9.375 10.03125,16.40625 v 2.8125 q 0,21.75 -24.9375,42.75 -9.1875,4.96875 -12.84375,4.96875 h -0.75 q -16.875,0 -34.125,-32.0625 -7.875,-6.84375 -7.875,-11.34375 9.65625,-2.15625 42.75,-2.15625 h 0.75 v 1.40625 q -9.28125,8.90625 -9.28125,12.84375 v 0.75 q 1.125,7.78125 7.78125,7.78125 h 2.90625 q 11.34375,0 11.34375,-24.1875 v -2.15625 q 0,-6.65625 -21.375,-7.875 -25.59375,-3.375 -25.59375,-24.1875 v -1.40625 q 0,-17.437497 24.9375,-32.062497 3.46875,-2.15625 9.28125,-2.15625 h 2.8125 l 11.4375,3.5625 q 4.875,0 19.875,-6.375 z" id="path1190"/>
<path d="m 511.14844,91.821703 h 0.5625 q 3.1875,0 4.5,32.437497 v 0.5625 h -1.6875 q -9.9375,-12.46875 -21.09375,-12.46875 l -15.9375,-0.65625 q -3.46875,2.25 -3.46875,14.25 v 3.46875 l 1.78125,1.6875 q 8.34375,0 17.625,-9.09375 2.34375,10.03125 2.34375,26.8125 v 2.8125 h -1.125 q -15.65625,-6.84375 -18.375,-6.84375 h -1.59375 q -1.78125,6.1875 -1.78125,11.90625 v 5.71875 q 0,1.78125 10.875,2.34375 21.65625,0 21.65625,-5.15625 l 7.40625,-7.40625 q 1.6875,3.375 1.6875,12 v 15.375 l -1.125,1.125 -59.90625,1.6875 -0.46875,0.5625 h -0.65625 l -0.46875,-0.5625 h -0.65625 l -7.40625,1.21875 -0.5625,-1.78125 q 13.125,-20.25 13.125,-40.96875 0,-24.84375 -12.5625,-43.968747 l -1.125,-2.8125 h 0.5625 l 54.75,4.5 q 5.0625,-0.75 13.125,-6.75 z" id="path1192"/>
<path d="m 575.17969,83.946703 h 1.78125 q 1.5,0 2.8125,21.093747 l 6.1875,45 q 6.75,27.65625 13.78125,37.6875 1.40625,0 2.8125,4.59375 l -38.25,5.0625 -0.46875,-1.6875 q 8.53125,-11.0625 8.53125,-26.25 v -11.34375 h -10.875 l -6.28125,-0.65625 q -2.25,0.65625 -2.25,4.03125 0,10.78125 8.53125,18.1875 v 0.65625 l -2.25,1.125 q -34.21875,-0.75 -34.21875,-3.375 10.59375,-12.75 16.5,-30.28125 7.40625,-22.40625 7.40625,-40.96875 v -1.78125 q 0,-4.21875 -9.65625,-9.656247 -2.8125,0 -2.8125,-1.6875 2.8125,-2.53125 38.71875,-9.75 z m -10.875,36.468747 -7.96875,23.90625 v 0.65625 h 1.125 l 12.5625,-0.65625 v -0.46875 q -2.8125,-16.59375 -5.0625,-23.4375 z" id="path1194"/>
<path d="m 601.33594,81.040453 q 45.5625,6.375 45.5625,11.4375 16.59375,10.968747 16.59375,25.593747 0,5.25 -14.8125,19.96875 7.96875,8.90625 7.96875,24.5625 7.96875,27.28125 9.75,27.84375 3.84375,2.90625 7.3125,2.90625 h 1.6875 q 7.5,0 10.3125,-9.1875 0,-5.71875 1.6875,-5.71875 10.875,8.25 10.875,18.84375 0,6.28125 -18.28125,12.5625 -5.15625,2.34375 -12.46875,2.34375 -9.75,0 -22.875,-36.5625 -6.84375,-25.3125 -11.34375,-29.625 -2.90625,-1.6875 -5.71875,-1.6875 l -0.5625,0.5625 q 0,17.625 8.53125,29.0625 l -0.5625,0.5625 v 0.5625 l -7.96875,-0.5625 -24,3.46875 -1.125,-1.125 q 6.09375,-6.28125 9.75,-38.8125 l 0.5625,-8.53125 v -5.15625 q 0,-12.75 -12,-41.531247 v -0.65625 z m 23.90625,20.531247 v 9.75 l 1.21875,15.375 v 1.6875 l 1.125,1.125 q 14.8125,-4.96875 14.8125,-14.8125 -2.625,-14.25 -10.21875,-14.25 z" id="path1196"/>
<path d="m 731.64844,90.884203 h 0.5625 l 0.5625,2.8125 v 5.15625 q 0,24.468747 -2.25,24.468747 h -0.5625 q -11.53125,-10.21875 -19.96875,-10.21875 -19.40625,0 -19.40625,21.65625 0,27.9375 19.96875,27.9375 12.75,0 20.53125,-13.125 h 0.5625 l 1.125,1.6875 v 10.3125 q 0,14.8125 -3.375,14.8125 l -25.125,5.71875 q -13.5,0 -26.8125,-25.125 -2.25,-9 -2.25,-14.8125 0,-25.96875 5.71875,-30.84375 9.5625,-10.875 24.46875,-16.499997 l 2.25,-0.5625 h 4.03125 l 9.09375,2.8125 q 3.09375,0 10.875,-6.1875 z" id="path1198"/>
<path d="m 821.08594,73.727953 0.46875,0.46875 v 0.65625 q -13.125,10.875 -13.125,28.499997 v 10.21875 l -0.46875,4.59375 0.46875,6.28125 v 26.25 q 0,24.375 17.15625,34.125 v 1.125 h -0.5625 l -42.75,4.59375 -0.5625,-0.5625 v -1.125 q 11.34375,-10.875 11.34375,-34.78125 l -1.125,-19.96875 h -8.53125 q -13.6875,0.375 -13.6875,1.6875 0,18.65625 11.4375,35.90625 l 2.25,2.90625 v 0.5625 l -1.125,1.125 -11.4375,-1.125 h -27.375 l -1.125,-1.21875 v -0.46875 q 7.96875,-5.15625 7.96875,-10.3125 5.15625,-10.78125 5.15625,-27.84375 0,-28.21875 -14.8125,-44.531247 v -1.125 q 0,-1.40625 37.03125,-4.03125 h 3.46875 l 0.5625,0.5625 h 0.5625 q -12,22.499997 -12,33.656247 v 1.21875 l 2.8125,0.46875 h 0.65625 q 15.9375,0 18.1875,-2.8125 v -1.125 q 0,-28.312497 -10.21875,-37.031247 -1.125,0 -3.375,-4.03125 v -1.125 l 6.75,-0.5625 z" id="path1200"/>
</g>
<text xml:space="preserve" transform="matrix(0.3100831,0,0,0.3100831,3.9925893,-15.387177)" id="text1178" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:192px;font-family:Equestria;-inkscape-font-specification:'Equestria, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;white-space:pre;shape-inside:url(#rect1180);fill:#487aff;fill-opacity:1;stroke:none;stroke-width:3" inkscape:label="text472"><tspan x="0.0234375" y="194.7592" id="tspan1341">PonySearch</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
(function(t,e){"use strict";var s=e.currentScript||function(){var t=e.getElementsByTagName("script");return t[t.length-1]}();t.searxng={settings:JSON.parse(atob(s.getAttribute("client_settings")))};var n=e.getElementsByTagName("html")[0];n.classList.remove("no-js");n.classList.add("js")})(window,document);
//# sourceMappingURL=searxng.head.min.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"searxng.head.min.js","sources":["../src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute('client_settings')))\n };\n\n // update the css\n var hmtlElement = d.getElementsByTagName(\"html\")[0];\n hmtlElement.classList.remove('no-js');\n hmtlElement.classList.add('js');\n\n})(window, document);\n"],"names":["w","d","script","currentScript","scripts","getElementsByTagName","length","searxng","settings","JSON","parse","atob","getAttribute","hmtlElement","classList","remove","add","window","document"],"mappings":"CACA,SAAWA,EAAGC,GACZ,aAGA,IAAIC,EAASD,EAAEE,eAAkB,WAC/B,IAAIC,EAAUH,EAAEI,qBAAqB,QAAQ,EAC7C,OAAOD,EAAQA,EAAQE,OAAS,EACjC,EAAE,EAEHN,EAAEO,QAAU,CACVC,SAAUC,KAAKC,MAAMC,KAAKT,EAAOU,aAAa,iBAAiB,CAAC,CAAC,CACnE,EAGA,IAAIC,EAAcZ,EAAEI,qBAAqB,MAAM,EAAE,GACjDQ,EAAYC,UAAUC,OAAO,OAAO,EACpCF,EAAYC,UAAUE,IAAI,IAAI,CAE/B,GAAEC,OAAQC,QAAQ"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,39 @@
{
"devDependencies": {
"eslint": "^9.0.0",
"grunt": "~1.6.1",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^5.0.0",
"grunt-contrib-less": "~3.0.0",
"grunt-contrib-uglify": "~5.2.1",
"grunt-xmlmin": "~0.1.8",
"grunt-contrib-watch": "~1.1.0",
"grunt-eslint": "^24.0.0",
"grunt-stylelint": "^0.16.0",
"grunt-image": "^6.4.0",
"ionicons": "^7.1.0",
"less": "^4.1.3",
"less-plugin-clean-css": "^1.5.1",
"sharp": "^0.33.0",
"stylelint": "^13.13.1",
"stylelint-config-standard": "^22.0.0",
"ejs": "^3.1.8",
"svgo": "^3.0.0"
},
"dependencies": {
"autocomplete-js": "2.7.1",
"leaflet": "^1.8.0",
"normalize.css": "^8.0.1"
},
"scripts": {
"all": "npm install && grunt",
"build": "grunt",
"test": "grunt test",
"eslint": "grunt eslint",
"eslint-fix": "grunt eslint --fix",
"watch": "grunt watch",
"clean": "rm -Rf node_modules package-lock.json",
"stylelint": "grunt stylelint",
"stylelint-fix": "grunt stylelint --fix"
}
}

View file

@ -0,0 +1,173 @@
/*
this file is generated automatically by searxng_extra/update/update_pygments.py
using pygments version 2.17.2
*/
.code-highlight {
pre { line-height: 100%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #ffffcc }
.c { color: #3D7B7B; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.cp { color: #9C6500 } /* Comment.Preproc */
.cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.gr { color: #E40000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #008400 } /* Generic.Inserted */
.go { color: #717171 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0044DD } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #687822 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #717171; font-weight: bold } /* Name.Entity */
.ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #767600 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mb { color: #666666 } /* Literal.Number.Bin */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sa { color: #BA2121 } /* Literal.String.Affix */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.dl { color: #BA2121 } /* Literal.String.Delimiter */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #A45A77 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.fm { color: #0000FF } /* Name.Function.Magic */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.vm { color: #19177C } /* Name.Variable.Magic */
.il { color: #666666 } /* Literal.Number.Integer.Long */
}
.code-highlight-dark(){
.code-highlight {
pre { line-height: 100%; }
td.linenos .normal { color: #3c4354; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #3c4354; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #3c4354; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #3c4354; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #6e7681 }
.c { color: #7e8aa1 } /* Comment */
.err { color: #f88f7f } /* Error */
.esc { color: #d4d2c8 } /* Escape */
.g { color: #d4d2c8 } /* Generic */
.k { color: #FFAD66 } /* Keyword */
.l { color: #D5FF80 } /* Literal */
.n { color: #d4d2c8 } /* Name */
.o { color: #FFAD66 } /* Operator */
.x { color: #d4d2c8 } /* Other */
.p { color: #d4d2c8 } /* Punctuation */
.ch { color: #f88f7f; font-style: italic } /* Comment.Hashbang */
.cm { color: #7e8aa1 } /* Comment.Multiline */
.cp { color: #FFAD66; font-weight: bold } /* Comment.Preproc */
.cpf { color: #7e8aa1 } /* Comment.PreprocFile */
.c1 { color: #7e8aa1 } /* Comment.Single */
.cs { color: #7e8aa1; font-style: italic } /* Comment.Special */
.gd { color: #f88f7f; background-color: #3d1e20 } /* Generic.Deleted */
.ge { color: #d4d2c8; font-style: italic } /* Generic.Emph */
.ges { color: #d4d2c8 } /* Generic.EmphStrong */
.gr { color: #f88f7f } /* Generic.Error */
.gh { color: #d4d2c8 } /* Generic.Heading */
.gi { color: #6ad4af; background-color: #19362c } /* Generic.Inserted */
.go { color: #7e8aa1 } /* Generic.Output */
.gp { color: #d4d2c8 } /* Generic.Prompt */
.gs { color: #d4d2c8; font-weight: bold } /* Generic.Strong */
.gu { color: #d4d2c8 } /* Generic.Subheading */
.gt { color: #f88f7f } /* Generic.Traceback */
.kc { color: #FFAD66 } /* Keyword.Constant */
.kd { color: #FFAD66 } /* Keyword.Declaration */
.kn { color: #FFAD66 } /* Keyword.Namespace */
.kp { color: #FFAD66 } /* Keyword.Pseudo */
.kr { color: #FFAD66 } /* Keyword.Reserved */
.kt { color: #73D0FF } /* Keyword.Type */
.ld { color: #D5FF80 } /* Literal.Date */
.m { color: #DFBFFF } /* Literal.Number */
.s { color: #D5FF80 } /* Literal.String */
.na { color: #FFD173 } /* Name.Attribute */
.nb { color: #FFD173 } /* Name.Builtin */
.nc { color: #73D0FF } /* Name.Class */
.no { color: #FFD173 } /* Name.Constant */
.nd { color: #7e8aa1; font-weight: bold; font-style: italic } /* Name.Decorator */
.ni { color: #95E6CB } /* Name.Entity */
.ne { color: #73D0FF } /* Name.Exception */
.nf { color: #FFD173 } /* Name.Function */
.nl { color: #d4d2c8 } /* Name.Label */
.nn { color: #d4d2c8 } /* Name.Namespace */
.nx { color: #d4d2c8 } /* Name.Other */
.py { color: #FFD173 } /* Name.Property */
.nt { color: #5CCFE6 } /* Name.Tag */
.nv { color: #d4d2c8 } /* Name.Variable */
.ow { color: #FFAD66 } /* Operator.Word */
.pm { color: #d4d2c8 } /* Punctuation.Marker */
.w { color: #d4d2c8 } /* Text.Whitespace */
.mb { color: #DFBFFF } /* Literal.Number.Bin */
.mf { color: #DFBFFF } /* Literal.Number.Float */
.mh { color: #DFBFFF } /* Literal.Number.Hex */
.mi { color: #DFBFFF } /* Literal.Number.Integer */
.mo { color: #DFBFFF } /* Literal.Number.Oct */
.sa { color: #F29E74 } /* Literal.String.Affix */
.sb { color: #D5FF80 } /* Literal.String.Backtick */
.sc { color: #D5FF80 } /* Literal.String.Char */
.dl { color: #D5FF80 } /* Literal.String.Delimiter */
.sd { color: #7e8aa1 } /* Literal.String.Doc */
.s2 { color: #D5FF80 } /* Literal.String.Double */
.se { color: #95E6CB } /* Literal.String.Escape */
.sh { color: #D5FF80 } /* Literal.String.Heredoc */
.si { color: #95E6CB } /* Literal.String.Interpol */
.sx { color: #95E6CB } /* Literal.String.Other */
.sr { color: #95E6CB } /* Literal.String.Regex */
.s1 { color: #D5FF80 } /* Literal.String.Single */
.ss { color: #DFBFFF } /* Literal.String.Symbol */
.bp { color: #5CCFE6 } /* Name.Builtin.Pseudo */
.fm { color: #FFD173 } /* Name.Function.Magic */
.vc { color: #d4d2c8 } /* Name.Variable.Class */
.vg { color: #d4d2c8 } /* Name.Variable.Global */
.vi { color: #d4d2c8 } /* Name.Variable.Instance */
.vm { color: #d4d2c8 } /* Name.Variable.Magic */
.il { color: #DFBFFF } /* Literal.Number.Integer.Long */
}
}

View file

@ -0,0 +1,20 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
(function (w, d) {
'use strict';
// add data- properties
var script = d.currentScript || (function () {
var scripts = d.getElementsByTagName('script');
return scripts[scripts.length - 1];
})();
w.searxng = {
settings: JSON.parse(atob(script.getAttribute('client_settings')))
};
// update the css
var hmtlElement = d.getElementsByTagName("html")[0];
hmtlElement.classList.remove('no-js');
hmtlElement.classList.add('js');
})(window, document);

View file

@ -0,0 +1,165 @@
/**
* @license
* (C) Copyright Contributors to the SearXNG project.
* (C) Copyright Contributors to the searx project (2014 - 2021).
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
window.searxng = (function (w, d) {
'use strict';
// not invented here tookit with bugs fixed elsewhere
// purposes : be just good enough and as small as possible
// from https://plainjs.com/javascript/events/live-binding-event-handlers-14/
if (w.Element) {
(function (ElementPrototype) {
ElementPrototype.matches = ElementPrototype.matches ||
ElementPrototype.matchesSelector ||
ElementPrototype.webkitMatchesSelector ||
ElementPrototype.msMatchesSelector ||
function (selector) {
var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;
while (nodes[++i] && nodes[i] != node);
return !!nodes[i];
};
})(Element.prototype);
}
function callbackSafe (callback, el, e) {
try {
callback.call(el, e);
} catch (exception) {
console.log(exception);
}
}
var searxng = window.searxng || {};
searxng.on = function (obj, eventType, callback, useCapture) {
useCapture = useCapture || false;
if (typeof obj !== 'string') {
// obj HTMLElement, HTMLDocument
obj.addEventListener(eventType, callback, useCapture);
} else {
// obj is a selector
d.addEventListener(eventType, function (e) {
var el = e.target || e.srcElement, found = false;
while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;
if (found) callbackSafe(callback, el, e);
}, useCapture);
}
};
searxng.ready = function (callback) {
if (document.readyState != 'loading') {
callback.call(w);
} else {
w.addEventListener('DOMContentLoaded', callback.bind(w));
}
};
searxng.http = function (method, url, data = null) {
return new Promise(function (resolve, reject) {
try {
var req = new XMLHttpRequest();
req.open(method, url, true);
req.timeout = 20000;
// On load
req.onload = function () {
if (req.status == 200) {
resolve(req.response, req.responseType);
} else {
reject(Error(req.statusText));
}
};
// Handle network errors
req.onerror = function () {
reject(Error("Network Error"));
};
req.onabort = function () {
reject(Error("Transaction is aborted"));
};
req.ontimeout = function () {
reject(Error("Timeout"));
}
// Make the request
if (data) {
req.send(data)
} else {
req.send();
}
} catch (ex) {
reject(ex);
}
});
};
searxng.loadStyle = function (src) {
var path = searxng.settings.theme_static_path + "/" + src,
id = "style_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
s = d.createElement('link');
s.setAttribute('id', id);
s.setAttribute('rel', 'stylesheet');
s.setAttribute('type', 'text/css');
s.setAttribute('href', path);
d.body.appendChild(s);
}
};
searxng.loadScript = function (src, callback) {
var path = searxng.settings.theme_static_path + "/" + src,
id = "script_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
s = d.createElement('script');
s.setAttribute('id', id);
s.setAttribute('src', path);
s.onload = callback;
s.onerror = function () {
s.setAttribute('error', '1');
};
d.body.appendChild(s);
} else if (!s.hasAttribute('error')) {
try {
callback.apply(s, []);
} catch (exception) {
console.log(exception);
}
} else {
console.log("callback not executed : script '" + path + "' not loaded.");
}
};
searxng.insertBefore = function (newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode);
};
searxng.insertAfter = function (newNode, referenceNode) {
referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);
};
searxng.on('.close', 'click', function () {
this.parentNode.classList.add('invisible');
});
function getEndpoint () {
for (var className of d.getElementsByTagName('body')[0].classList.values()) {
if (className.endsWith('_endpoint')) {
return className.split('_')[0];
}
}
return '';
}
searxng.endpoint = getEndpoint();
return searxng;
})(window, document);

View file

@ -0,0 +1,88 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/* global searxng */
searxng.ready(function () {
'use strict';
searxng.infinite_scroll_supported = (
'IntersectionObserver' in window &&
'IntersectionObserverEntry' in window &&
'intersectionRatio' in window.IntersectionObserverEntry.prototype);
if (searxng.endpoint !== 'results') {
return;
}
if (!searxng.infinite_scroll_supported) {
console.log('IntersectionObserver not supported');
return;
}
let d = document;
var onlyImages = d.getElementById('results').classList.contains('only_template_images');
function newLoadSpinner () {
var loader = d.createElement('div');
loader.classList.add('loader');
return loader;
}
function replaceChildrenWith (element, children) {
element.textContent = '';
children.forEach(child => element.appendChild(child));
}
function loadNextPage (callback) {
var form = d.querySelector('#pagination form.next_page');
if (!form) {
return
}
replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);
var formData = new FormData(form);
searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(
function (response) {
var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');
var articleList = nextPageDoc.querySelectorAll('#urls article');
var paginationElement = nextPageDoc.querySelector('#pagination');
d.querySelector('#pagination').remove();
if (articleList.length > 0 && !onlyImages) {
// do not add <hr> element when there are only images
d.querySelector('#urls').appendChild(d.createElement('hr'));
}
articleList.forEach(articleElement => {
d.querySelector('#urls').appendChild(articleElement);
});
if (paginationElement) {
d.querySelector('#results').appendChild(paginationElement);
callback();
}
}
).catch(
function (err) {
console.log(err);
var e = d.createElement('div');
e.textContent = searxng.settings.translations.error_loading_next_page;
e.classList.add('dialog-error');
e.setAttribute('role', 'alert');
replaceChildrenWith(d.querySelector('#pagination'), [ e ]);
}
)
}
if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {
const intersectionObserveOptions = {
rootMargin: "20rem",
};
const observedSelector = 'article.result:last-child';
const observer = new IntersectionObserver(entries => {
const paginationEntry = entries[0];
if (paginationEntry.isIntersecting) {
observer.unobserve(paginationEntry.target);
loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));
}
});
observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);
}
});

View file

@ -0,0 +1,461 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
/* global searxng */
searxng.ready(function () {
function isElementInDetail (el) {
while (el !== undefined) {
if (el.classList.contains('detail')) {
return true;
}
if (el.classList.contains('result')) {
// we found a result, no need to go to the root of the document:
// el is not inside a <div class="detail"> element
return false;
}
el = el.parentNode;
}
return false;
}
function getResultElement (el) {
while (el !== undefined) {
if (el.classList.contains('result')) {
return el;
}
el = el.parentNode;
}
return undefined;
}
function isImageResult (resultElement) {
return resultElement && resultElement.classList.contains('result-images');
}
searxng.on('.result', 'click', function (e) {
if (!isElementInDetail(e.target)) {
highlightResult(this)(true, true);
let resultElement = getResultElement(e.target);
if (isImageResult(resultElement)) {
e.preventDefault();
searxng.selectImage(resultElement);
}
}
});
searxng.on('.result a', 'focus', function (e) {
if (!isElementInDetail(e.target)) {
let resultElement = getResultElement(e.target);
if (resultElement && resultElement.getAttribute("data-vim-selected") === null) {
highlightResult(resultElement)(true);
}
if (isImageResult(resultElement)) {
searxng.selectImage(resultElement);
}
}
}, true);
/* common base for layouts */
var baseKeyBinding = {
'Escape': {
key: 'ESC',
fun: removeFocus,
des: 'remove focus from the focused input',
cat: 'Control'
},
'c': {
key: 'c',
fun: copyURLToClipboard,
des: 'copy url of the selected result to the clipboard',
cat: 'Results'
},
'h': {
key: 'h',
fun: toggleHelp,
des: 'toggle help window',
cat: 'Other'
},
'i': {
key: 'i',
fun: searchInputFocus,
des: 'focus on the search input',
cat: 'Control'
},
'n': {
key: 'n',
fun: GoToNextPage(),
des: 'go to next page',
cat: 'Results'
},
'o': {
key: 'o',
fun: openResult(false),
des: 'open search result',
cat: 'Results'
},
'p': {
key: 'p',
fun: GoToPreviousPage(),
des: 'go to previous page',
cat: 'Results'
},
'r': {
key: 'r',
fun: reloadPage,
des: 'reload page from the server',
cat: 'Control'
},
't': {
key: 't',
fun: openResult(true),
des: 'open the result in a new tab',
cat: 'Results'
},
};
var keyBindingLayouts = {
"default": Object.assign(
{ /* SearXNG layout */
'ArrowLeft': {
key: '←',
fun: highlightResult('up'),
des: 'select previous search result',
cat: 'Results'
},
'ArrowRight': {
key: '→',
fun: highlightResult('down'),
des: 'select next search result',
cat: 'Results'
},
}, baseKeyBinding),
'vim': Object.assign(
{ /* Vim-like Key Layout. */
'b': {
key: 'b',
fun: scrollPage(-window.innerHeight),
des: 'scroll one page up',
cat: 'Navigation'
},
'f': {
key: 'f',
fun: scrollPage(window.innerHeight),
des: 'scroll one page down',
cat: 'Navigation'
},
'u': {
key: 'u',
fun: scrollPage(-window.innerHeight / 2),
des: 'scroll half a page up',
cat: 'Navigation'
},
'd': {
key: 'd',
fun: scrollPage(window.innerHeight / 2),
des: 'scroll half a page down',
cat: 'Navigation'
},
'g': {
key: 'g',
fun: scrollPageTo(-document.body.scrollHeight, 'top'),
des: 'scroll to the top of the page',
cat: 'Navigation'
},
'v': {
key: 'v',
fun: scrollPageTo(document.body.scrollHeight, 'bottom'),
des: 'scroll to the bottom of the page',
cat: 'Navigation'
},
'k': {
key: 'k',
fun: highlightResult('up'),
des: 'select previous search result',
cat: 'Results'
},
'j': {
key: 'j',
fun: highlightResult('down'),
des: 'select next search result',
cat: 'Results'
},
'y': {
key: 'y',
fun: copyURLToClipboard,
des: 'copy url of the selected result to the clipboard',
cat: 'Results'
},
}, baseKeyBinding)
}
var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;
searxng.on(document, "keydown", function (e) {
// check for modifiers so we don't break browser's hotkeys
if (
Object.prototype.hasOwnProperty.call(keyBindings, e.key)
&& !e.ctrlKey && !e.altKey
&& !e.shiftKey && !e.metaKey
) {
var tagName = e.target.tagName.toLowerCase();
if (e.key === 'Escape') {
keyBindings[e.key].fun(e);
} else {
if (e.target === document.body || tagName === 'a' || tagName === 'button') {
e.preventDefault();
keyBindings[e.key].fun();
}
}
}
});
function highlightResult (which) {
return function (noScroll, keepFocus) {
var current = document.querySelector('.result[data-vim-selected]'),
effectiveWhich = which;
if (current === null) {
// no selection : choose the first one
current = document.querySelector('.result');
if (current === null) {
// no first one : there are no results
return;
}
// replace up/down actions by selecting first one
if (which === "down" || which === "up") {
effectiveWhich = current;
}
}
var next, results = document.querySelectorAll('.result');
results = Array.from(results); // convert NodeList to Array for further use
if (typeof effectiveWhich !== 'string') {
next = effectiveWhich;
} else {
switch (effectiveWhich) {
case 'visible':
var top = document.documentElement.scrollTop || document.body.scrollTop;
var bot = top + document.documentElement.clientHeight;
for (var i = 0; i < results.length; i++) {
next = results[i];
var etop = next.offsetTop;
var ebot = etop + next.clientHeight;
if ((ebot <= bot) && (etop > top)) {
break;
}
}
break;
case 'down':
next = results[results.indexOf(current) + 1] || current;
break;
case 'up':
next = results[results.indexOf(current) - 1] || current;
break;
case 'bottom':
next = results[results.length - 1];
break;
case 'top':
/* falls through */
default:
next = results[0];
}
}
if (next) {
current.removeAttribute('data-vim-selected');
next.setAttribute('data-vim-selected', 'true');
if (!keepFocus) {
var link = next.querySelector('h3 a') || next.querySelector('a');
if (link !== null) {
link.focus();
}
}
if (!noScroll) {
scrollPageToSelected();
}
}
};
}
function reloadPage () {
document.location.reload(true);
}
function removeFocus (e) {
const tagName = e.target.tagName.toLowerCase();
if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {
document.activeElement.blur();
} else {
searxng.closeDetail();
}
}
function pageButtonClick (css_selector) {
return function () {
var button = document.querySelector(css_selector);
if (button) {
button.click();
}
};
}
function GoToNextPage () {
return pageButtonClick('nav#pagination .next_page button[type="submit"]');
}
function GoToPreviousPage () {
return pageButtonClick('nav#pagination .previous_page button[type="submit"]');
}
function scrollPageToSelected () {
var sel = document.querySelector('.result[data-vim-selected]');
if (sel === null) {
return;
}
var wtop = document.documentElement.scrollTop || document.body.scrollTop,
wheight = document.documentElement.clientHeight,
etop = sel.offsetTop,
ebot = etop + sel.clientHeight,
offset = 120;
// first element ?
if ((sel.previousElementSibling === null) && (ebot < wheight)) {
// set to the top of page if the first element
// is fully included in the viewport
window.scroll(window.scrollX, 0);
return;
}
if (wtop > (etop - offset)) {
window.scroll(window.scrollX, etop - offset);
} else {
var wbot = wtop + wheight;
if (wbot < (ebot + offset)) {
window.scroll(window.scrollX, ebot - wheight + offset);
}
}
}
function scrollPage (amount) {
return function () {
window.scrollBy(0, amount);
highlightResult('visible')();
};
}
function scrollPageTo (position, nav) {
return function () {
window.scrollTo(0, position);
highlightResult(nav)();
};
}
function searchInputFocus () {
window.scrollTo(0, 0);
var q = document.querySelector('#q');
q.focus();
if (q.setSelectionRange) {
var len = q.value.length;
q.setSelectionRange(len, len);
}
}
function openResult (newTab) {
return function () {
var link = document.querySelector('.result[data-vim-selected] h3 a');
if (link === null) {
link = document.querySelector('.result[data-vim-selected] > a');
}
if (link !== null) {
var url = link.getAttribute('href');
if (newTab) {
window.open(url);
} else {
window.location.href = url;
}
}
};
}
function initHelpContent (divElement) {
var categories = {};
for (var k in keyBindings) {
var key = keyBindings[k];
categories[key.cat] = categories[key.cat] || [];
categories[key.cat].push(key);
}
var sorted = Object.keys(categories).sort(function (a, b) {
return categories[b].length - categories[a].length;
});
if (sorted.length === 0) {
return;
}
var html = '<a href="#" class="close" aria-label="close" title="close">×</a>';
html += '<h3>How to navigate SearXNG with hotkeys</h3>';
html += '<table>';
for (var i = 0; i < sorted.length; i++) {
var cat = categories[sorted[i]];
var lastCategory = i === (sorted.length - 1);
var first = i % 2 === 0;
if (first) {
html += '<tr>';
}
html += '<td>';
html += '<h4>' + cat[0].cat + '</h4>';
html += '<ul class="list-unstyled">';
for (var cj in cat) {
html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>';
}
html += '</ul>';
html += '</td>'; // col-sm-*
if (!first || lastCategory) {
html += '</tr>'; // row
}
}
html += '</table>';
divElement.innerHTML = html;
}
function toggleHelp () {
var helpPanel = document.querySelector('#vim-hotkeys-help');
if (helpPanel === undefined || helpPanel === null) {
// first call
helpPanel = document.createElement('div');
helpPanel.id = 'vim-hotkeys-help';
helpPanel.className = 'dialog-modal';
initHelpContent(helpPanel);
var body = document.getElementsByTagName('body')[0];
body.appendChild(helpPanel);
} else {
// togggle hidden
helpPanel.classList.toggle('invisible');
return;
}
}
function copyURLToClipboard () {
var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');
if (currentUrlElement === null) return;
const url = currentUrlElement.getAttribute('href');
navigator.clipboard.writeText(url);
}
searxng.scrollPageToSelected = scrollPageToSelected;
searxng.selectNext = highlightResult('down');
searxng.selectPrevious = highlightResult('up');
});

View file

@ -0,0 +1,74 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
/* global L */
(function (w, d, searxng) {
'use strict';
searxng.ready(function () {
searxng.on('.searxng_init_map', 'click', function (event) {
// no more request
this.classList.remove("searxng_init_map");
//
var leaflet_target = this.dataset.leafletTarget;
var map_lon = parseFloat(this.dataset.mapLon);
var map_lat = parseFloat(this.dataset.mapLat);
var map_zoom = parseFloat(this.dataset.mapZoom);
var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);
var map_geojson = JSON.parse(this.dataset.mapGeojson);
searxng.loadStyle('css/leaflet.css');
searxng.loadScript('js/leaflet.js', function () {
var map_bounds = null;
if (map_boundingbox) {
var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
map_bounds = L.latLngBounds(southWest, northEast);
}
// 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 © <a href="https://openstreetmap.org">OpenStreetMap</a> 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 | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>';
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
// Still useful ?
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
event.preventDefault();
});
});
})(window, document, window.searxng);

View file

@ -0,0 +1,53 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
(function (w, d, searxng) {
'use strict';
if (searxng.endpoint !== 'preferences') {
return;
}
searxng.ready(function () {
let engine_descriptions = null;
function load_engine_descriptions () {
if (engine_descriptions == null) {
searxng.http("GET", "engine_descriptions.json").then(function (content) {
engine_descriptions = JSON.parse(content);
for (const [engine_name, description] of Object.entries(engine_descriptions)) {
let elements = d.querySelectorAll('[data-engine-name="' + engine_name + '"] .engine-description');
for (const element of elements) {
let source = ' (<i>' + searxng.settings.translations.Source + ':&nbsp;' + description[1] + '</i>)';
element.innerHTML = description[0] + source;
}
}
});
}
}
for (const el of d.querySelectorAll('[data-engine-name]')) {
searxng.on(el, 'mouseenter', load_engine_descriptions);
}
const enableAllEngines = d.querySelectorAll(".enable-all-engines");
const disableAllEngines = d.querySelectorAll(".disable-all-engines");
const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');
const toggleEngines = (enable) => {
for (const el of engineToggles) {
// check if element visible, so that only engines of the current category are modified
if (el.offsetParent !== null) el.checked = !enable;
}
};
for (const el of enableAllEngines) {
searxng.on(el, 'click', () => toggleEngines(true));
}
for (const el of disableAllEngines) {
searxng.on(el, 'click', () => toggleEngines(false));
}
const copyHashButton = d.querySelector("#copy-hash");
searxng.on(copyHashButton, 'click', (e) => {
e.preventDefault();
navigator.clipboard.writeText(copyHashButton.dataset.hash);
copyHashButton.innerText = copyHashButton.dataset.copiedText;
});
});
})(window, document, window.searxng);

View file

@ -0,0 +1,119 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
(function (w, d, searxng) {
'use strict';
if (searxng.endpoint !== 'results') {
return;
}
searxng.ready(function () {
d.querySelectorAll('#urls img.image').forEach(
img =>
img.addEventListener(
'error', () => {
img.style.display = 'none';
img.error = null;
}
));
if (d.querySelector('#search_url button#copy_url')) {
d.querySelector('#search_url button#copy_url').style.display = "block";
}
searxng.on('.btn-collapse', 'click', function () {
var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');
var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');
var target = this.getAttribute('data-target');
var targetElement = d.querySelector(target);
var html = this.innerHTML;
if (this.classList.contains('collapsed')) {
html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);
} else {
html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);
}
this.innerHTML = html;
this.classList.toggle('collapsed');
targetElement.classList.toggle('invisible');
});
searxng.on('.media-loader', 'click', function () {
var target = this.getAttribute('data-target');
var iframe_load = d.querySelector(target + ' > iframe');
var srctest = iframe_load.getAttribute('src');
if (srctest === null || srctest === undefined || srctest === false) {
iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));
}
});
searxng.on('#copy_url', 'click', function () {
var target = this.parentElement.querySelector('pre');
navigator.clipboard.writeText(target.innerText);
this.innerText = this.dataset.copiedText;
});
searxng.selectImage = function (resultElement) {
/* eslint no-unused-vars: 0 */
if (resultElement) {
// load full size image in background
const imgElement = resultElement.querySelector('.result-images-source img');
const thumbnailElement = resultElement.querySelector('.image_thumbnail');
const detailElement = resultElement.querySelector('.detail');
if (imgElement) {
const imgSrc = imgElement.getAttribute('data-src');
if (imgSrc) {
const loader = d.createElement('div');
const imgLoader = new Image();
loader.classList.add('loader');
detailElement.appendChild(loader);
imgLoader.onload = e => {
imgElement.src = imgSrc;
loader.remove();
};
imgLoader.onerror = e => {
loader.remove();
};
imgLoader.src = imgSrc;
imgElement.src = thumbnailElement.src;
imgElement.removeAttribute('data-src');
}
}
}
d.getElementById('results').classList.add('image-detail-open');
searxng.scrollPageToSelected();
}
searxng.closeDetail = function (e) {
d.getElementById('results').classList.remove('image-detail-open');
searxng.scrollPageToSelected();
}
searxng.on('.result-detail-close', 'click', e => {
e.preventDefault();
searxng.closeDetail();
});
searxng.on('.result-detail-previous', 'click', e => {
e.preventDefault();
searxng.selectPrevious(false)
});
searxng.on('.result-detail-next', 'click', e => {
e.preventDefault();
searxng.selectNext(false);
});
w.addEventListener('scroll', function () {
var e = d.getElementById('backToTop'),
scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
results = d.getElementById('results');
if (e !== null) {
if (scrollTop >= 100) {
results.classList.add('scrolling');
} else {
results.classList.remove('scrolling');
}
}
}, true);
});
})(window, document, window.searxng);

View file

@ -0,0 +1,186 @@
/* SPDX-License-Identifier: AGPL-3.0-or-later */
/* global AutoComplete */
(function (w, d, searxng) {
'use strict';
var qinput_id = "q", qinput;
const isMobile = window.matchMedia("only screen and (max-width: 50em)").matches;
function submitIfQuery () {
if (qinput.value.length > 0) {
var search = document.getElementById('search');
setTimeout(search.submit.bind(search), 0);
}
}
function createClearButton (qinput) {
var cs = document.getElementById('clear_search');
var updateClearButton = function () {
if (qinput.value.length === 0) {
cs.classList.add("empty");
} else {
cs.classList.remove("empty");
}
};
// update status, event listener
updateClearButton();
cs.addEventListener('click', function (ev) {
qinput.value = '';
qinput.focus();
updateClearButton();
ev.preventDefault();
});
qinput.addEventListener('keyup', updateClearButton, false);
}
searxng.ready(function () {
qinput = d.getElementById(qinput_id);
if (qinput !== null) {
// clear button
createClearButton(qinput);
// autocompleter
if (searxng.settings.autocomplete_provider) {
searxng.autocomplete = AutoComplete.call(w, {
Url: "./autocompleter",
EmptyMessage: searxng.settings.translations.no_item_found,
HttpMethod: searxng.settings.http_method,
HttpHeaders: {
"Content-type": "application/x-www-form-urlencoded",
"X-Requested-With": "XMLHttpRequest"
},
MinChars: searxng.settings.autocomplete_min,
Delay: 300,
_Position: function () {},
_Open: function () {
var params = this;
Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"), function (li) {
if (li.getAttribute("class") != "locked") {
li.onmousedown = function () {
params._Select(li);
};
}
});
},
_Select: function (item) {
AutoComplete.defaults._Select.call(this, item);
var form = item.closest('form');
if (form) {
form.submit();
}
},
_MinChars: function () {
if (this.Input.value.indexOf('!') > -1) {
return 0;
} else {
return AutoComplete.defaults._MinChars.call(this);
}
},
KeyboardMappings: Object.assign({}, AutoComplete.defaults.KeyboardMappings, {
"KeyUpAndDown_up": Object.assign({}, AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up, {
Callback: function (event) {
AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up.Callback.call(this, event);
var liActive = this.DOMResults.querySelector("li.active");
if (liActive) {
AutoComplete.defaults._Select.call(this, liActive);
}
},
}),
"Tab": Object.assign({}, AutoComplete.defaults.KeyboardMappings.Enter, {
Conditions: [{
Is: 9,
Not: false
}],
Callback: function (event) {
if (this.DOMResults.getAttribute("class").indexOf("open") != -1) {
var liActive = this.DOMResults.querySelector("li.active");
if (liActive !== null) {
AutoComplete.defaults._Select.call(this, liActive);
event.preventDefault();
}
}
},
})
}),
}, "#" + qinput_id);
}
/*
Monkey patch autocomplete.js to fix a bug
With the POST method, the values are not URL encoded: query like "1 + 1" are sent as "1 1" since space are URL encoded as plus.
See HTML specifications:
* HTML5: https://url.spec.whatwg.org/#concept-urlencoded-serializer
* HTML4: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
autocomplete.js does not URL encode the name and values:
https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/src/autocomplete.ts#L665
The monkey patch overrides the compiled version of the ajax function.
See https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/dist/autocomplete.js#L143-L158
The patch changes only the line 156 from
params.Request.send(params._QueryArg() + "=" + params._Pre());
to
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
Related to:
* https://github.com/autocompletejs/autocomplete.js/issues/78
* https://github.com/searxng/searxng/issues/1695
*/
AutoComplete.prototype.ajax = function (params, request, timeout) {
if (timeout === void 0) { timeout = true; }
if (params.$AjaxTimer) {
window.clearTimeout(params.$AjaxTimer);
}
if (timeout === true) {
params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);
} else {
if (params.Request) {
params.Request.abort();
}
params.Request = request;
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
}
};
if (!isMobile && document.querySelector('.index_endpoint')) {
qinput.focus();
}
}
// Additionally to searching when selecting a new category, we also
// automatically start a new search request when the user changes a search
// filter (safesearch, time range or language) (this requires JavaScript
// though)
if (
qinput !== null
&& searxng.settings.search_on_category_select
// If .search_filters is undefined (invisible) we are on the homepage and
// hence don't have to set any listeners
&& d.querySelector(".search_filters") != null
) {
searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);
searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);
searxng.on(d.getElementById('language'), 'change', submitIfQuery);
}
// most common browsers at the time of writing this support :has, except for Firefox
// can be removed when Firefox / Firefox ESL starts supporting it as well
try {
// this fails when the browser does not support :has
d.querySelector("html:has(body)");
} catch (_) {
// manually deselect the old selection when a new category is selected
for (let button of d.querySelectorAll("button.category_button")) {
searxng.on(button, 'click', () => {
const selected = d.querySelector("button.category_button.selected");
console.log(selected);
selected.classList.remove("selected");
})
}
}
});
})(window, document, window.searxng);

View file

@ -0,0 +1,19 @@
.dialog-modal {
animation-name: dialogmodal;
animation-duration: 0.13s;
@keyframes dialogmodal {
0% {
opacity: 0;
}
50% {
opacity: 0.5;
transform: translate(-50%, -50%) scale(1.05);
}
}
}
input.checkbox-onoff[type="checkbox"]::before {
transition: left 0.25s;
}

View file

@ -0,0 +1,75 @@
/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
.autocomplete {
position: absolute;
width: @search-width;
max-height: 0;
overflow-y: hidden;
.ltr-text-align-left();
.rounded-corners;
&:active,
&:focus,
&:hover {
background-color: var(--color-autocomplete-background);
}
&:empty {
display: none;
}
> ul {
list-style-type: none;
margin: 0;
padding: 0;
> li {
cursor: pointer;
padding: 0.5rem 1rem;
&.active,
&:active,
&:focus,
&:hover {
background-color: var(--color-autocomplete-background-hover);
a:active,
a:focus,
a:hover {
text-decoration: none;
}
}
&.locked {
cursor: inherit;
}
}
}
&.open {
display: block;
background-color: var(--color-autocomplete-background);
color: var(--color-autocomplete-font);
max-height: 32rem;
overflow-y: auto;
z-index: 100;
margin-top: 3.5rem;
border-radius: 0.8rem;
box-shadow: 0 2px 8px rgb(34 38 46 / 25%);
&:empty {
display: none;
}
}
}
@media screen and (max-width: @phone) {
.autocomplete {
width: 100%;
> ul > li {
padding: 1rem;
}
}
}

View file

@ -0,0 +1,51 @@
@import "../generated/pygments.less";
.codelines {
margin: @results-margin 0 0 0;
padding: @result-padding 0 0 0;
}
.code-highlight-sxng() {
.code-highlight {
pre {
overflow: auto;
margin: 0;
padding: 0 0 0.75rem 0;
}
.linenos {
user-select: none;
cursor: default;
&::selection {
background: transparent; /* WebKit/Blink Browsers */
}
&::-moz-selection {
background: transparent; /* Gecko Browsers */
}
margin-right: 8px;
text-align: right;
}
span.linenos {
color: #64708d;
}
}
}
.code-highlight-sxng();
/// Dark Theme (autoswitch based on device pref)
@media (prefers-color-scheme: dark) {
:root.theme-auto {
.code-highlight-dark();
.code-highlight-sxng();
}
}
// Dark Theme by preferences
:root.theme-dark {
.code-highlight-dark();
.code-highlight-sxng();
}

View file

@ -0,0 +1,277 @@
/*
* SearXNG, A privacy-respecting, hackable metasearch engine
*
* To change the colors of the site, simple edit this variables
*/
/// Light Theme
:root {
/// Base Colors
--color-base-font: #444;
--color-base-font-rgb: 68, 68, 68;
--color-base-background: #fff;
--color-base-background-mobile: #f2f5f8;
--color-url-font: #334999;
--color-url-visited-font: #9822c3;
/// Header Colors
--color-header-background: #fdfbff;
--color-header-border: #ddd;
/// Footer Colors
--color-footer-background: #fdfbff;
--color-footer-border: #ddd;
/// Sidebar Colors
--color-sidebar-border: #ddd;
--color-sidebar-font: #000;
--color-sidebar-background: #fff;
/// BackToTop Colors
--color-backtotop-font: #444;
--color-backtotop-border: #ddd;
--color-backtotop-background: #fff;
/// Button Colors
--color-btn-background: #3050ff;
--color-btn-font: #fff;
--color-show-btn-background: #bbb;
--color-show-btn-font: #000;
/// Search Input Colors
--color-search-border: #bbb;
--color-search-shadow: 0 2px 8px rgb(34 38 46 / 25%);
--color-search-background: #fff;
--color-search-font: #222;
--color-search-background-hover: #3050ff;
/// Modal Colors
--color-error: #db3434;
--color-error-background: lighten(#db3434, 40%);
--color-warning: #dbba34;
--color-warning-background: lighten(#dbba34, 40%);
--color-success: #42db34;
--color-success-background: lighten(#42db34, 40%);
/// Categories Colors
--color-categories-item-selected-font: #3050ff;
--color-categories-item-border-selected: #3050ff;
/// Autocomplete Colors
--color-autocomplete-font: #000;
--color-autocomplete-border: #bbb;
--color-autocomplete-shadow: 0 2px 8px rgb(34 38 46 / 25%);
--color-autocomplete-background: #fff;
--color-autocomplete-background-hover: #e3e3e3;
/// Answer Colors
--color-answer-font: #444; // same as --color-base-font
--color-answer-background: #fff;
/// Results Colors
--color-result-background: #fff;
--color-result-border: #ddd;
--color-result-url-font: #000;
--color-result-vim-selected: #f7f7f7;
--color-result-vim-arrow: #000bbb;
--color-result-description-highlight-font: #000;
--color-result-link-font: #000bbb;
--color-result-link-font-highlight: #000bbb;
--color-result-link-visited-font: #9822c3;
--color-result-publishdate-font: #777;
--color-result-engines-font: #545454;
--color-result-search-url-border: #ddd;
--color-result-search-url-font: #000;
// Images Colors
--color-result-image-span-font: #444;
--color-result-image-span-font-selected: #fff;
--color-result-image-background: #fff;
/// Settings Colors
--color-settings-tr-hover: #ebebeb;
--color-settings-engine-description-font: #545454;
--color-settings-table-group-background: #0001;
/// Detail modal
--color-result-detail-font: #fff;
--color-result-detail-label-font: lightgray;
--color-result-detail-background: #242424;
--color-result-detail-hr: #555;
--color-result-detail-link: #8af;
--color-result-detail-loader-border: rgba(255, 255, 255, 0.2);
--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);
/// Toolkit Colors
--color-toolkit-badge-font: #fff;
--color-toolkit-badge-background: #545454;
--color-toolkit-kbd-font: #fff;
--color-toolkit-kbd-background: #000;
--color-toolkit-dialog-border: #ddd;
--color-toolkit-dialog-background: #fff;
--color-toolkit-tabs-label-border: #fff;
--color-toolkit-tabs-section-border: #ddd;
--color-toolkit-select-background: #e1e1e1;
--color-toolkit-select-border: #ddd;
--color-toolkit-select-background-hover: #bbb;
--color-toolkit-input-text-font: #222;
--color-toolkit-checkbox-onoff-off-background: #ddd;
--color-toolkit-checkbox-onoff-on-background: #ddd;
--color-toolkit-checkbox-onoff-on-mark-background: #3050ff;
--color-toolkit-checkbox-onoff-on-mark-color: #fff;
--color-toolkit-checkbox-onoff-off-mark-background: #aaa;
--color-toolkit-checkbox-onoff-off-mark-color: #fff;
--color-toolkit-checkbox-label-background: #ddd;
--color-toolkit-checkbox-label-border: #ddd;
--color-toolkit-checkbox-input-border: #3050ff;
--color-toolkit-engine-tooltip-border: #ddd;
--color-toolkit-engine-tooltip-background: #fff;
--color-toolkit-loader-border: rgba(0, 0, 0, 0.2);
--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);
--color-doc-code: #003;
--color-doc-code-background: #ddeaff;
}
.dark-themes() {
/// Base Colors
--color-base-font: #bbb;
--color-base-font-rgb: 187, 187, 187;
--color-base-background: #222428;
--color-base-background-mobile: #222428;
--color-url-font: #8af;
--color-url-visited-font: #c09cd9;
/// Header Colors
--color-header-background: #1e1e22;
--color-header-border: #333;
/// Footer Colors
--color-footer-background: #1e1e22;
--color-footer-border: #333;
/// Sidebar Colors
--color-sidebar-border: #555;
--color-sidebar-font: #fff;
--color-sidebar-background: #292c34;
/// BackToTop Colors
--color-backtotop-font: #bbb;
--color-backtotop-border: #333;
--color-backtotop-background: #2b2e36;
/// Button Colors
--color-btn-background: #58f;
--color-btn-font: #222;
--color-show-btn-background: #555;
--color-show-btn-font: #fff;
/// Search Input Colors
--color-search-border: #555;
--color-search-shadow: 0 2px 8px rgb(34 38 46 / 25%);
--color-search-background: #2b2e36;
--color-search-font: #fff;
--color-search-background-hover: #58f;
/// Modal Colors
--color-error: #f55b5b;
--color-error-background: darken(#db3434, 40%);
--color-warning: #f1d561;
--color-warning-background: darken(#dbba34, 40%);
--color-success: #79f56e;
--color-success-background: darken(#42db34, 40%);
/// Categories Colors
--color-categories-item-selected-font: #58f;
--color-categories-item-border-selected: #58f;
/// Autocomplete Colors
--color-autocomplete-font: #fff;
--color-autocomplete-border: #555;
--color-autocomplete-shadow: 0 2px 8px rgb(34 38 46 / 25%);
--color-autocomplete-background: #2b2e36;
--color-autocomplete-background-hover: #1e1e22;
/// Answer Colors
--color-answer-font: #bbb; // same as --color-base-font
--color-answer-background: #26292f;
/// Results Colors
--color-result-background: #26292f;
--color-result-border: #333;
--color-result-url-font: #fff;
--color-result-vim-selected: #1f1f23cc;
--color-result-vim-arrow: #8af;
--color-result-description-highlight-font: #fff;
--color-result-link-font: #8af;
--color-result-link-font-highlight: #8af;
--color-result-link-visited-font: #c09cd9;
--color-result-publishdate-font: #888;
--color-result-engines-font: #a4a4a4;
--color-result-search-url-border: #555;
--color-result-search-url-font: #fff;
/// Detail modal : same as the light version
--color-result-detail-font: #fff;
--color-result-detail-label-font: lightgray;
--color-result-detail-background: #1a1a1c;
--color-result-detail-hr: #555;
--color-result-detail-link: #8af;
--color-result-detail-loader-border: rgba(255, 255, 255, 0.2);
--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);
// Images Colors
--color-result-image-span-font: #bbb;
--color-result-image-span-font-selected: #222;
--color-result-image-background: #222;
/// Settings Colors
--color-settings-tr-hover: #2c2c32;
--color-settings-engine-description-font: darken(#dcdcdc, 30%);
--color-settings-table-group-background: #1b1b21;
/// Toolkit Colors
--color-toolkit-badge-font: #fff;
--color-toolkit-badge-background: #555;
--color-toolkit-kbd-font: #000;
--color-toolkit-kbd-background: #fff;
--color-toolkit-dialog-border: #555;
--color-toolkit-dialog-background: #1e1e22;
--color-toolkit-tabs-label-border: #222;
--color-toolkit-tabs-section-border: #555;
--color-toolkit-select-background: #313338;
--color-toolkit-select-border: #555;
--color-toolkit-select-background-hover: #373b49;
--color-toolkit-input-text-font: #fff;
--color-toolkit-checkbox-onoff-off-background: #313338;
--color-toolkit-checkbox-onoff-on-background: #313338;
--color-toolkit-checkbox-onoff-on-mark-background: #58f;
--color-toolkit-checkbox-onoff-on-mark-color: #222;
--color-toolkit-checkbox-onoff-off-mark-background: #ddd;
--color-toolkit-checkbox-onoff-off-mark-color: #222;
--color-toolkit-checkbox-label-background: #222;
--color-toolkit-checkbox-label-border: #333;
--color-toolkit-checkbox-input-border: #58f;
--color-toolkit-engine-tooltip-border: #333;
--color-toolkit-engine-tooltip-background: #222;
--color-toolkit-loader-border: rgba(255, 255, 255, 0.2);
--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);
--color-doc-code: #ddd;
--color-doc-code-background: #4d5a6f;
}
/// Dark Theme (autoswitch based on device pref)
@media (prefers-color-scheme: dark) {
:root.theme-auto {
.dark-themes();
}
}
// Dark Theme by preferences
:root.theme-dark {
.dark-themes();
}
/// General Size
@results-width: 45rem;
@results-sidebar-width: 25rem;
@results-offset: 10rem;
@results-tablet-offset: 0.5rem;
@results-gap: 5rem;
@results-margin: 0.125rem;
@result-padding: 1rem;
@results-image-row-height: 12rem;
@results-image-row-height-phone: 6rem;
@search-width: 44rem;
// heigh of #search, see detail.less
@search-height: 7.6rem;
/// Device Size
/// @desktop > @tablet
@tablet: 79.75em; // see https://github.com/searxng/searxng/issues/874
@phone: 50em;
@small-phone: 35em;
@ultra-small-phone: 20rem;
/// From style.less
@stacked-bar-chart: rgb(0, 0, 0);
/// Load fonts from this directory.
@icon-font-path: "../../../fonts/";
//** File name for all font files.
@icon-font-name: "glyphicons-halflings-regular";
//** Element ID within SVG icon file.
@icon-font-svg-id: "glyphicons_halflingsregular";
// decoration of the select HTML elements
@select-light-svg-path: "../svg/select-light.svg";
@select-dark-svg-path: "../svg/select-dark.svg";

View file

@ -0,0 +1,254 @@
#main_results #results.image-detail-open.only_template_images {
width: min(98%, 59.25rem) !important;
}
#main_results #results.only_template_images.image-detail-open #backToTop {
.ltr-left(56.75rem) !important;
.ltr-right(inherit);
}
article.result-images .detail {
display: none;
}
#results.image-detail-open article.result-images[data-vim-selected] .detail {
display: flex;
flex-direction: column;
position: fixed;
.ltr-left(60rem);
.ltr-right(0);
top: @search-height;
transition: top 0.064s ease-in 0s;
bottom: 0;
background: var(--color-result-detail-background);
border: 1px solid var(--color-result-detail-background);
z-index: 10000;
padding: 4rem 3rem 3rem 3rem;
a.result-images-source {
display: block;
flex: 1;
text-align: left;
width: 100%;
border: none;
text-decoration: none;
img {
padding: 0;
margin: 0;
border: none;
object-fit: contain;
width: inherit;
height: inherit;
max-width: 100%;
min-height: inherit;
max-height: calc(100vh - 25rem - 7rem);
background: inherit;
}
}
.result-images-labels {
color: var(--color-result-detail-font);
height: 19rem;
hr {
border-top: 1px solid var(--color-result-detail-hr);
border-bottom: none;
}
h4 {
height: 2rem;
overflow: hidden;
text-overflow: ellipsis;
font-size: 0.9rem;
margin-bottom: 0;
}
p {
color: var(--color-result-detail-label-font);
font-size: 0.9rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
margin: 0.8rem 0;
span {
display: inline-block;
width: 12rem;
}
}
h4,
p,
a {
.ltr-text-align-left();
}
p.result-content {
height: 2rem;
line-height: unset;
overflow: hidden;
text-overflow: ellipsis;
}
p.result-url {
white-space: nowrap;
overflow-x: hidden;
overflow-y: hidden;
text-overflow: ellipsis;
}
p.result-content:hover,
p.result-url:hover {
position: relative;
overflow: inherit !important;
background: var(--color-result-detail-background);
text-overflow: inherit !important;
}
a,
a:visited,
a:hover,
a:active {
color: var(--color-result-detail-link);
}
a:hover {
text-decoration: underline;
}
}
a.result-detail-close {
top: 1rem;
.ltr-left(1rem);
padding: 0.4rem;
}
a.result-detail-previous {
top: 1rem;
.ltr-right(6rem);
// center the icon by moving it slightly on the left
padding-top: 0.4rem;
.ltr-padding-right(0.5rem);
padding-bottom: 0.4rem;
.ltr-padding-left(0.3rem);
}
a.result-detail-next {
top: 1rem;
.ltr-right(2rem);
padding: 0.4rem;
}
a.result-detail-close,
a.result-detail-next,
a.result-detail-previous {
border-radius: 50%;
display: block;
width: 1.5rem;
height: 1.5rem;
position: absolute;
filter: opacity(40%);
z-index: 2000002;
span {
display: block;
width: 1.5rem;
height: 1.5rem;
text-align: center;
}
}
a.result-detail-next,
a.result-detail-previous {
span::before {
// vertical center small icons
vertical-align: sub;
}
}
a.result-detail-close,
a.result-detail-close:visited,
a.result-detail-close:hover,
a.result-detail-close:active,
a.result-detail-previous,
a.result-detail-previous:visited,
a.result-detail-previous:hover,
a.result-detail-previous:active,
a.result-detail-next,
a.result-detail-next:visited,
a.result-detail-next:hover,
a.result-detail-next:active {
color: var(--color-result-detail-font);
background: var(--color-result-detail-background);
border: 1px solid var(--color-result-detail-font);
}
a.result-detail-close:focus,
a.result-detail-close:hover,
a.result-detail-previous:focus,
a.result-detail-previous:hover,
a.result-detail-next:focus,
a.result-detail-next:hover {
filter: opacity(80%);
}
.loader {
position: absolute;
top: 1rem;
.ltr-right(50%);
border-top: 0.5em solid var(--color-result-detail-loader-border);
border-right: 0.5em solid var(--color-result-detail-loader-border);
border-bottom: 0.5em solid var(--color-result-detail-loader-border);
border-left: 0.5em solid var(--color-result-detail-loader-borderleft);
}
}
#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail {
top: 0;
a.result-images-source img {
max-height: calc(100vh - 25rem);
}
}
@media screen and (max-width: @tablet) {
#results.image-detail-open article.result-images[data-vim-selected] .detail {
top: 0;
.ltr-left(0);
a.result-images-source {
display: flex;
flex-direction: column;
justify-content: center;
img {
width: 100%;
max-height: calc(100vh - 24rem);
}
}
a.result-detail-next {
.ltr-right(1rem);
}
}
}
@media screen and (max-width: @phone) {
#results.image-detail-open article.result-images[data-vim-selected] .detail {
top: 0;
.ltr-left(0);
padding: 1rem;
a.result-images-source img {
width: 100%;
max-height: calc(100vh - 20rem);
margin: 0;
}
.result-images-labels p span {
width: inherit;
.ltr-margin-right(1rem);
}
}
}

View file

@ -0,0 +1,33 @@
iframe[src^="https://w.soundcloud.com"] {
height: 120px;
}
iframe[src^="https://www.deezer.com"] {
// The real size is 92px, but 94px are needed to avoid an inner scrollbar of
// the embedded HTML.
height: 94px;
}
iframe[src^="https://www.mixcloud.com"] {
// the embedded player from mixcloud has some quirks: initial there is an
// issue with an image URL that is blocked since it is an a Cross-Origin
// request. The alternative text (<img alt='Mixcloud Logo'> then cause an
// scrollbar in the inner of the iframe we can't avoid. Another quirk comes
// when pressing the play button, somtimes the shown player has an height of
// 200px, somtimes 250px.
height: 250px;
}
iframe[src^="https://bandcamp.com/EmbeddedPlayer"] {
// show playlist
height: 350px;
}
iframe[src^="https://bandcamp.com/EmbeddedPlayer/track"] {
// hide playlist
height: 120px;
}
iframe[src^="https://genius.com/songs"] {
height: 65px;
}

View file

@ -0,0 +1,51 @@
#main_index {
margin-top: 26vh;
}
.index {
text-align: center;
.title {
background: url('../img/searxng.png') no-repeat;
min-height: 4rem;
margin: 4rem auto;
background-position: center;
background-size: contain;
}
h1 {
font-size: 4em;
visibility: hidden;
}
#search,
#search_header {
margin: 0 auto;
background: inherit;
border: inherit;
padding: 0;
display: block;
}
.search_filters {
display: block;
margin: 1em 0;
}
.category label {
padding: 6px 10px;
border-bottom: initial !important;
}
}
@media screen and (max-width: @tablet) {
div.title {
h1 {
font-size: 1em;
}
}
#main_index {
margin-top: 6em;
}
}

View file

@ -0,0 +1,10 @@
.info-page {
code {
font-family: monospace;
.rounded-corners-tiny;
background-color: var(--color-doc-code-background);
color: var(--color-doc-code);
padding: 0.2rem;
border: 0 none;
}
}

View file

@ -0,0 +1,40 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
// Mixins
.text-size-adjust (@property: 100%) {
-webkit-text-size-adjust: @property;
-ms-text-size-adjust: @property;
-moz-text-size-adjust: @property;
text-size-adjust: @property;
}
.rounded-corners (@radius: 10px) {
border-radius: @radius;
}
.rounded-right-corners (@radius: 0 10px 10px 0) {
border-radius: @radius;
}
.rounded-corners-tiny (@radius: 5px) {
border-radius: @radius;
}
// disable user selection
.disable-user-select () {
-webkit-touch-callout: none;
user-select: none;
}
.show-content-button() {
padding: 5px 10px;
.rounded-corners-tiny;
background: var(--color-show-btn-background);
color: var(--color-show-btn-font);
cursor: pointer;
&:hover {
background: var(--color-btn-background);
color: var(--color-btn-font);
}
}

View file

@ -0,0 +1,48 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.stats_endpoint {
.github-issue-button {
display: block;
padding: 8px 16px;
font-family: sans-serif;
font-size: 16px;
color: white;
background-color: #238636;
border: #2ea043;
border-radius: 10px !important;
box-shadow: rgba(0, 0, 0, 0) 0 0 0 0;
}
.github-issue-button:hover {
background-color: #2ea043;
}
.issue-hide {
display: none;
}
input[type=checked] {
position: absolute;
}
label {
margin: 1rem 1rem 1rem 0;
}
.step_content {
margin: 1rem 1rem 1rem 2rem;
}
.step1,
.step2 {
visibility: hidden;
}
.step1_delay {
transition: visibility 0s linear 4s;
}
#step1:checked ~ .step1,
#step2:checked ~ .step2 {
visibility: visible;
}
}

View file

@ -0,0 +1,225 @@
table {
border-collapse: collapse;
th,
td {
text-align: center;
padding: 1rem 0.5rem;
.ltr-text-align-left();
}
tr.pref-group th {
font-weight: normal;
.ltr-text-align-left();
background: var(--color-settings-table-group-background);
}
}
#main_preferences {
form {
width: 100%;
}
fieldset {
margin: 8px;
border: none;
}
legend {
margin: 0;
padding: 5px 0 0 0;
display: block;
.ltr-float-left();
width: 300px;
}
input[type="text"] {
width: 13.25rem;
color: var(--color-toolkit-input-text-font);
border: none;
background: none repeat scroll 0 0 var(--color-toolkit-select-background);
padding: 0.2rem 0.4rem;
height: 2rem;
.rounded-corners-tiny;
&:hover,
&:focus {
background-color: var(--color-toolkit-select-background-hover);
}
}
.value {
margin: 0;
padding: 0;
.ltr-float-left();
width: 15em;
select,
input[type="text"] {
font-size: inherit !important;
margin-top: 0;
.ltr-margin-right(1rem);
margin-bottom: 0;
.ltr-margin-left(0);
}
select {
width: 14rem;
}
select:focus,
input:focus {
outline: none;
box-shadow: 0 0 1px 1px var(--color-btn-background);
}
}
.description {
margin: 0;
padding: 5px 0 0 0;
.ltr-float-right();
width: 50%;
color: var(--color-settings-engine-description-font);
font-size: 90%;
}
.bang {
.ltr-text-align-left();
.rounded-corners-tiny;
background-color: var(--color-doc-code-background);
color: var(--color-doc-code);
padding: 0.2rem;
border: 0 none;
}
.category {
.ltr-margin-right(0.5rem);
label {
border: 2px solid transparent;
padding: 0.2rem 0.4rem;
.rounded-corners-tiny;
}
}
.category input[type="checkbox"]:checked + label {
border: 2px solid var(--color-categories-item-border-selected);
}
table.table_engines {
th.name {
/* stylelint-disable */
label {
cursor: pointer;
}
/* stylelint-enable */
.engine-tooltip {
margin-top: 1.8rem;
.ltr-left(calc((100% - 85em) / 2 + 10em));
max-width: 40rem;
.engine-description {
margin-top: 0.5rem;
}
.bang {
margin: 0.3rem;
}
}
}
.checkbox-col,
.name,
.shortcut {
.ltr-text-align-left();
}
}
table.cookies {
width: 100%;
direction: ltr;
th,
td {
text-align: left;
font-family: monospace;
font-size: 1rem;
padding: 0.5em;
vertical-align: top;
}
td:first-child {
word-break: keep-all;
width: 14rem;
padding-right: 1rem;
}
td:last-child {
word-break: break-all;
}
& > tbody > tr:nth-child(even) > th,
& > tbody > tr:nth-child(even) > td {
background-color: var(--color-settings-tr-hover);
}
}
.preferences_back {
background: none repeat scroll 0 0 var(--color-btn-background);
color: var(--color-btn-font);
border: 0 none;
.rounded-corners;
cursor: pointer;
display: inline-block;
margin: 2px 4px;
padding: 0.7em;
a {
color: var(--color-settings-return-font);
}
a::first-letter {
text-transform: uppercase;
}
}
#toggle-all-engines-container {
width: max-content;
margin-left: auto;
}
div.selectable_url {
pre {
width: 100%;
}
}
#copy-hash-container {
display: flex;
align-items: center;
gap: 0.5rem;
div.selectable_url {
pre {
width: auto;
flex-grow: 1;
}
}
}
#pref-hash-input {
width: 100%;
}
}
@media screen and (max-width: @tablet) {
.preferences_back {
clear: both;
}
.engine-tooltip {
.ltr-left(10em) !important;
}
}

View file

@ -0,0 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.osm-map-box {
height: 300px;
width: 100%;
margin: 10px 0;
}

View file

@ -0,0 +1,380 @@
/*
* SearXNG, A privacy-respecting, hackable metasearch engine
*/
#search {
padding: 0;
margin: 0;
}
#search_header {
padding-top: 1.5em;
.ltr-padding-right(2em);
.ltr-padding-left(@results-offset - 3rem);
margin: 0;
background: var(--color-header-background);
border-bottom: 1px solid var(--color-header-border);
display: grid;
column-gap: 1.2rem;
row-gap: 1rem;
grid-template-columns: 3rem 1fr;
grid-template-areas:
"logo search"
"spacer categories";
}
.category_checkbox,
.category_button {
display: inline-block;
position: relative;
.ltr-margin-right(1rem);
padding: 0;
}
.category_checkbox {
input {
display: none;
}
label {
svg {
padding-right: 0.2rem;
}
cursor: pointer;
padding: 0.2rem 0;
display: inline-flex;
text-transform: capitalize;
font-size: 0.9em;
border-bottom: 2px solid transparent;
.disable-user-select;
div.category_name {
margin: auto 0;
}
}
input[type="checkbox"]:checked + label {
color: var(--color-categories-item-selected-font);
border-bottom: 2px solid var(--color-categories-item-border-selected);
}
}
button.category_button {
background-color: inherit;
color: var(--color-base-font);
cursor: pointer;
padding: 0.2rem 0;
display: inline-flex;
align-items: center;
text-transform: capitalize;
font-size: 0.9em;
border: none;
border-bottom: 2px solid transparent;
svg {
padding-right: 0.2rem;
}
&.selected,
&:active,
&:focus-within {
color: var(--color-categories-item-selected-font);
border-bottom: 2px solid var(--color-categories-item-border-selected);
}
}
#categories_container:has(button.category_button:focus-within) button.category_button.selected {
color: var(--color-base-font);
border-bottom: none;
}
#search_logo {
padding: 0.5rem 10px 0 10px;
grid-area: logo;
display: flex;
align-items: center;
justify-content: center;
svg {
flex: 1;
width: 30px;
height: 30px;
margin: 0.5rem 0 auto 0;
}
}
.search_categories {
grid-area: categories;
.help {
display: none;
}
&:hover .help {
display: block;
position: absolute;
background: var(--color-base-background);
padding: 1rem 0.6rem 0.6rem 0;
z-index: 1000;
width: 100%;
left: -0.1rem;
}
}
#search_view {
padding: 0.5rem 0.3rem 0 0.5rem;
grid-area: search;
body.results_endpoint & {
padding: 0.5rem 2.8rem 0 0;
}
}
.search_box {
border-radius: 0.8rem;
width: @search-width;
display: inline-flex;
flex-direction: row;
white-space: nowrap;
box-shadow: var(--color-search-shadow);
}
#clear_search {
display: block;
border-collapse: separate;
box-sizing: border-box;
width: 1.8rem;
margin: 0;
padding: 0.8rem 0.2rem;
background: none repeat scroll 0 0 var(--color-search-background);
border: none;
outline: none;
color: var(--color-search-font);
font-size: 1.1rem;
z-index: 10000;
&:hover {
color: var(--color-search-background-hover);
}
&.empty * {
display: none;
}
}
html.no-js #clear_search.hide_if_nojs {
display: none;
}
#q,
#send_search {
display: block;
margin: 0;
padding: 0.8rem;
background: none repeat scroll 0 0 var(--color-search-background);
border: none;
outline: none;
color: var(--color-search-font);
font-size: 1.1rem;
z-index: 2;
}
#q {
width: 100%;
.ltr-padding-left(1rem);
.ltr-padding-right(0) !important;
.ltr-rounded-left-corners(0.8rem);
}
#q::-ms-clear,
#q::-webkit-search-cancel-button {
display: none;
}
#send_search {
.ltr-rounded-right-corners(0.8rem);
&:hover {
cursor: pointer;
background-color: var(--color-search-background-hover);
color: var(--color-search-background);
}
}
.no-js #clear_search,
.no-js #send_search {
width: auto !important;
.ltr-border-left(1px solid var(--color-search-border));
}
.search_filters {
margin-top: 0.6rem;
.ltr-margin-right(0);
margin-bottom: 0;
.ltr-margin-left(@results-offset + 0.6rem);
display: flex;
overflow-x: auto;
overscroll-behavior-inline: contain;
select {
background-color: inherit;
&:hover,
&:focus {
color: var(--color-base-font);
}
}
}
@media screen and (max-width: @tablet) {
#search_header {
padding: 1.5em @results-tablet-offset 0 @results-tablet-offset;
column-gap: @results-tablet-offset;
}
.search_filters {
margin-top: 0.6rem;
.ltr-margin-right(0);
margin-bottom: 0;
.ltr-margin-left(@results-tablet-offset + 3rem);
}
#categories {
font-size: 90%;
clear: both;
}
}
@media screen and (max-width: @tablet) and (hover: none) {
#main_index,
#main_results {
#categories_container {
width: max-content;
.category_checkbox {
display: inline-block;
width: auto;
}
}
#categories {
width: 100%;
.ltr-text-align-left();
overflow-x: scroll;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
}
}
}
@media screen and (max-width: @phone) {
#search_header {
width: 100%;
margin: 0;
padding: 0.1rem 0 0 0;
column-gap: 0;
row-gap: 0;
grid-template-areas:
"logo search"
"categories categories";
}
.search_logo {
padding: 0;
}
.search_box {
width: 98%;
display: flex;
}
#q {
width: 100%;
flex: 1;
}
.search_filters {
margin: 0 10px;
padding: 0.5rem 0;
}
.category {
display: inline-block;
width: auto;
margin: 0;
svg {
display: none;
}
}
.category_checkbox {
label {
padding: 1rem !important;
margin: 0 !important;
}
}
.category_button {
padding: 1rem !important;
margin: 0 !important;
}
#search_view:focus-within {
display: block;
background-color: var(--color-search-background);
position: absolute;
top: 0;
height: 100%;
width: 100%;
z-index: 10000;
.search_box {
border-bottom: 1px solid var(--color-search-border);
width: 100%;
border-radius: 0;
box-shadow: none;
#send_search {
.ltr-margin-right(0) !important; // Delete when send_search button is disabled on mobile.
}
* {
border: none;
border-radius: 0;
box-shadow: none;
}
}
}
#main_results #q:placeholder-shown ~ #send_search {
.ltr-margin-right(2.6rem);
transition: margin 0.1s;
}
}
@media screen and (max-width: @ultra-small-phone) {
#search_header {
grid-template-areas:
"search search"
"categories categories";
}
#search_logo {
display: none;
}
}
#categories {
.disable-user-select;
&::-webkit-scrollbar {
width: 0;
height: 0;
}
}
#categories_container {
position: relative;
}

View file

@ -0,0 +1,106 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.engine-stats {
border-spacing: 0;
border-collapse: collapse;
tr td,
tr th {
border-bottom: 1px solid var(--color-result-border);
padding: 0.25rem;
}
table.engine-tooltip {
border-spacing: 0;
border-collapse: collapse;
td,
th {
border: none;
}
}
.engine-name {
width: 20rem;
}
.engine-score {
width: 7rem;
text-align: right;
}
.engine-reliability {
text-align: right;
}
}
table.engine-error th.engine-error-type,
table.engine-error td.engine-error-type,
failed-test {
width: 10rem;
}
.engine-errors {
margin-top: 3rem;
table.engine-error {
max-width: 1280px;
margin: 1rem 0 3rem 0;
border: 1px solid var(--color-result-border);
.ltr-text-align-left();
tr th,
tr td {
padding: 0.5rem;
}
& span.log_parameters {
border-right: 1px solid solid var(--color-result-border);
padding: 0 1rem 0 0;
margin: 0 0 0 0.5rem;
}
}
}
.bar-chart-value {
width: 3em;
display: inline-block;
text-align: right;
padding-right: 0.5rem;
}
.bar-chart-graph {
width: calc(100% - 5rem);
display: inline-block;
}
.bar-chart-bar {
border: 3px solid #5bc0de;
margin: 1px 0;
}
.bar-chart-serie1 {
border: 3px solid #5bc0de;
margin: 1px 0;
float: left;
}
.bar-chart-serie2 {
border: 3px solid #deb15b;
margin: 1px 0;
float: left;
}
.bar0 {
width: 0;
border: 0;
}
.generate-bar(100);
.generate-bar(@n, @i: 1) when (@i =< @n) {
.bar@{i} {
width: (@i * 100% / @n);
}
.generate-bar(@n, (@i + 1));
}

View file

@ -0,0 +1,118 @@
/*
--center-page-width overrides the less variable @results-width when the results are centered
see the CSS rules for #results in style.less ( grid-template-columns and gap).
In this file, the --center-page-width values comes from the Oscar theme (Bootstrap 3).
All rules starts with ".center-aligment-yes #main_results" to be enabled only
on the /search URL and when the "center alignment" preference is enabled.
*/
@media screen and (min-width: @phone) {
.center-aligment-yes #main_results {
--center-page-width: 48rem;
}
}
@media screen and (min-width: 62rem) {
.center-aligment-yes #main_results {
--center-page-width: 60rem;
}
}
@media screen and (min-width: @tablet) {
.center-aligment-yes #main_results {
--center-page-width: 73rem;
}
}
@media screen and (min-width: @phone) and (max-width: @tablet) {
// any change must be reset in @media screen and (min-width: @tablet) { ... }
.center-aligment-yes #main_results {
#results {
grid-template-columns: 60% calc(40% - @results-gap);
margin-left: 0;
margin-right: 0;
}
#urls {
.ltr-margin-left(3rem);
}
#sidebar {
.ltr-margin-right(1rem);
}
#backToTop {
.ltr-left(calc(60% + 1rem));
}
}
}
@media screen and (min-width: @tablet) {
.center-aligment-yes #main_results {
display: flex;
flex-direction: column;
align-items: center;
#search {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
#search_header {
grid-template-columns: calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);
grid-template-areas: "na logo search" "na spacer categories";
column-gap: 1.2rem; // from search.less
width: 100%;
padding-left: 0;
padding-right: 0;
}
.search_filters {
.ltr-margin-left(0.5rem);
width: var(--center-page-width);
}
#results {
// from style.less (when screen width = @tablet, reset layout from tablet)
.ltr-margin-right(2rem);
.ltr-margin-left(@results-offset);
//
&.only_template_images,
&.image-detail-open {
// * grid-template-columns and .ltr-margin-left are set in style.less
// * With .image-detail-open.only_template_images, the width is set in detail.less
// * #results is going to be centered because of the #main_results rules,
// align-self aligns the results on the left or right according to the language.
align-self: flex-start;
}
&:not(.only_template_images):not(.image-detail-open) {
// the gap is set in style.less
.ltr-margin-left(1.5rem);
grid-template-columns: calc(var(--center-page-width) - @results-gap - @results-sidebar-width) @results-sidebar-width;
#backToTop {
.ltr-left(calc(50% - @results-sidebar-width - @results-gap + 1rem + var(--center-page-width) / 2));
}
}
.result .content {
max-width: inherit;
}
}
// from style.less (when screen width = @tablet, reset layout from tablet)
#urls {
.ltr-margin-left(0);
}
#sidebar {
.ltr-margin-right(0);
}
}
}

View file

@ -0,0 +1,85 @@
.ltr-left(@offset) {
left: @offset;
}
.ltr-right(@offset) {
right: @offset;
}
.ltr-margin-right(@offset) {
margin-right: @offset;
}
.ltr-margin-left(@offset) {
margin-left: @offset;
}
.ltr-border-right(@offset) {
border-right: @offset;
}
.ltr-border-left(@offset) {
border-left: @offset;
}
.ltr-padding-right(@offset) {
padding-right: @offset;
}
.ltr-padding-left(@offset) {
padding-left: @offset;
}
.ltr-float-left() {
float: left;
}
.ltr-float-right() {
float: right;
}
.ltr-text-align-right() {
text-align: right;
}
.ltr-rounded-left-corners(@radius) {
border-radius: @radius 0 0 @radius;
}
.ltr-rounded-top-left-corners(@radius) {
border-radius: @radius 0 0 0;
}
.ltr-rounded-bottom-left-corners(@radius) {
border-radius: 0 0 0 @radius;
}
.ltr-rounded-right-corners(@radius) {
border-radius: 0 @radius @radius 0;
}
.ltr-rounded-top-right-corners(@radius) {
border-radius: 0 @radius 0 0;
}
.ltr-rounded-bottom-right-corners(@radius) {
border-radius: 0 0 @radius 0;
}
.ltr-text-align-left() {
text-align: left;
}
.ltr-border-left-width(@offset) {
border-left-width: @offset;
}
.ltr-border-right-width(@offset) {
border-right-width: @offset;
}
.ltr-transform() {
transform: scale(1, 1);
}
@import "style.less";

View file

@ -0,0 +1,155 @@
.ltr-left(@offset) {
right: @offset;
}
.ltr-right(@offset) {
left: @offset;
}
.ltr-margin-right(@offset) {
margin-left: @offset;
}
.ltr-margin-left(@offset) {
margin-right: @offset;
}
.ltr-border-right(@offset) {
border-left: @offset;
}
.ltr-border-left(@offset) {
border-right: @offset;
}
.ltr-padding-right(@offset) {
padding-left: @offset;
}
.ltr-padding-left(@offset) {
padding-right: @offset;
}
.ltr-float-left() {
float: right;
}
.ltr-float-right() {
float: left;
}
.ltr-text-align-right() {
text-align: left;
}
.ltr-rounded-left-corners(@radius) {
border-radius: 0 @radius @radius 0;
}
.ltr-rounded-top-left-corners(@radius) {
border-radius: 0 @radius 0 0;
}
.ltr-rounded-bottom-left-corners(@radius) {
border-radius: 0 0 @radius 0;
}
.ltr-rounded-right-corners(@radius) {
border-radius: @radius 0 0 @radius;
}
.ltr-rounded-top-right-corners(@radius) {
border-radius: @radius 0 0 0;
}
.ltr-rounded-bottom-right-corners(@radius) {
border-radius: 0 0 0 @radius;
}
.ltr-text-align-left() {
text-align: right;
}
.ltr-border-left-width(@offset) {
border-right-width: @offset;
}
.ltr-border-right-width(@offset) {
border-left-width: @offset;
}
.ltr-transform() {
transform: scale(-1, 1);
}
@import "style.less";
#q,
#sidebar .infobox dt bdi {
direction: rtl;
}
// URL are displayed LTR but align on the right
#urls {
direction: initial;
text-align: right;
.result .url_wrapper {
justify-content: end;
}
}
// Image flexbox
#main_results div#results.only_template_images #urls {
direction: rtl;
}
// Image detail
#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p {
direction: rtl;
&.result-url {
// Display URL using the LTR direction
direction: ltr;
span {
// And put the label on the right
direction: rtl;
float: right;
}
}
}
// select HTML element
@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))) {
select {
border-width: 0 0 0 2rem;
background-position-x: -2rem;
}
}
// vim hotkey helps is not translated
#vim-hotkeys-help table {
direction: ltr;
text-align: left;
}
// Logo on the right
#main_preferences h1,
#main_stats h1 {
background-position-x: 100%;
}
// patch of stats.less
.bar-chart-serie1,
.bar-chart-serie2 {
float: right;
}
.engine-stats .engine-name,
.engine-stats .engine-score,
.engine-stats .result-count,
.engine-stats .response-time,
.engine-stats .engine-reliability {
text-align: right;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,648 @@
// other solution : http://stackoverflow.com/questions/1577598/how-to-hide-parts-of-html-when-javascript-is-disabled/13857783#13857783
// stylelint-disable no-descending-specificity
html.no-js .hide_if_nojs {
display: none;
}
html.js .show_if_nojs {
display: none;
}
.center {
text-align: center;
}
.right {
float: right;
}
.left {
float: left;
}
.invisible {
display: none !important;
}
.list-unstyled {
list-style-type: none;
li {
margin-top: 4px;
margin-bottom: 4px;
}
}
.danger {
background-color: var(--color-error-background);
}
.warning {
background: var(--color-warning-background);
}
.success {
background: var(--color-success-background);
}
.badge {
display: inline-block;
color: var(--color-toolkit-badge-font);
background-color: var(--color-toolkit-badge-background);
text-align: center;
white-space: nowrap;
vertical-align: baseline;
min-width: 10px;
padding: 1px 5px;
border-radius: 5px;
}
// kbd
kbd {
padding: 2px 4px;
margin: 1px;
font-size: 90%;
color: var(--color-toolkit-kbd-font);
background: var(--color-toolkit-kbd-background);
}
// table
table {
width: 100%;
&.striped {
tr {
border-bottom: 1px solid var(--color-settings-tr-hover);
}
}
}
th {
padding: 0.4em;
}
td {
padding: 0 4px;
}
tr {
&:hover {
background: var(--color-settings-tr-hover) !important;
}
}
// pre
.pre() {
display: block;
font-size: 0.8em;
word-break: break-all;
margin: 0.1em;
user-select: all;
}
div.selectable_url {
display: block;
border: 1px solid var(--color-result-search-url-border);
padding: 4px;
color: var(--color-result-search-url-font);
margin: 0.1em;
overflow: hidden;
height: 1.2em;
line-height: 1.2em;
.rounded-corners-tiny;
pre {
.pre();
}
}
// dialog
.dialog() {
position: relative;
display: flex;
padding: 1rem;
margin: 0 0 1em 0;
border: 1px solid var(--color-toolkit-dialog-border);
.ltr-text-align-left();
.rounded-corners;
.close {
.ltr-float-right();
position: relative;
top: -3px;
color: inherit;
font-size: 1.5em;
}
ul,
ol,
p {
margin: 1px 0 0 0;
}
table {
width: auto;
}
tr {
vertical-align: text-top;
&:hover {
background: transparent !important;
}
}
td {
padding: 0 1em 0 0;
padding-top: 0;
.ltr-padding-right(1rem);
padding-bottom: 0;
.ltr-padding-left(0);
}
h4 {
margin-top: 0.3em;
margin-bottom: 0.3em;
}
}
.dialog-error {
.dialog();
color: var(--color-error);
background: var(--color-error-background);
border-color: var(--color-error);
}
.dialog-error-block {
.dialog();
display: block;
color: var(--color-error);
background: var(--color-error-background);
border-color: var(--color-error);
}
.dialog-warning {
.dialog();
color: var(--color-warning);
background: var(--color-warning-background);
border-color: var(--color-warning);
}
.dialog-modal {
.dialog();
display: block;
background: var(--color-toolkit-dialog-background);
position: fixed;
top: 50%;
left: 50%;
margin: 0 auto;
transform: translate(-50%, -50%);
z-index: 10000000;
h3 {
margin-top: 0;
}
}
// btn-collapse
.btn-collapse {
cursor: pointer;
}
//
.scrollx {
overflow-x: auto;
overflow-y: hidden;
display: block;
padding: 0;
margin: 0;
border: none;
}
/* -- tabs -- */
.tabs .tabs > label {
font-size: 90%;
}
ul.tabs {
border-bottom: 1px solid var(--color-toolkit-tabs-section-border);
list-style: none;
padding-left: 0;
li {
display: flex;
}
}
.tabs {
display: flex;
flex-wrap: wrap;
width: 100%;
min-width: 100%;
& > * {
order: 2;
}
& > input[type=radio] {
display: none;
}
& > label,
& > li > a {
order: 1;
padding: 0.7em;
margin: 0 0.7em;
letter-spacing: 0.5px;
text-transform: uppercase;
border: solid var(--color-toolkit-tabs-label-border);
border-width: 0 0 2px 0;
color: unset;
.disable-user-select();
cursor: pointer;
&.active {
border-bottom: 2px solid var(--color-categories-item-border-selected);
background: var(--color-categories-item-selected);
color: var(--color-categories-item-selected-font);
}
}
& > label:hover,
& > li > a:hover {
border-bottom: 2px solid var(--color-categories-item-border-selected);
}
& > section {
min-width: 100%;
padding: 0.7rem 0;
box-sizing: border-box;
border-top: 1px solid var(--color-toolkit-tabs-section-border);
display: none;
}
// default selection
& > label:last-of-type {
border-bottom: 2px solid var(--color-categories-item-border-selected);
background: var(--color-categories-item-selected);
color: var(--color-categories-item-selected-font);
letter-spacing: -0.1px;
}
& > section:last-of-type {
display: block;
}
}
html body .tabs > input:checked {
~ section {
display: none;
}
~ label {
position: inherited;
background: inherit;
border-bottom: 2px solid transparent;
font-weight: normal;
color: inherit;
&:hover {
border-bottom: 2px solid var(--color-categories-item-border-selected);
}
}
+ label {
border-bottom: 2px solid var(--color-categories-item-border-selected);
background: var(--color-categories-item-selected);
color: var(--color-categories-item-selected-font);
}
+ label + section {
display: block;
}
}
/* -- select -- */
select {
height: 2.4rem;
margin-top: 0;
.ltr-margin-right(1rem);
margin-bottom: 0;
.ltr-margin-left(0);
padding: 0.2rem !important;
color: var(--color-search-font);
font-size: 0.9rem;
z-index: 2;
&:hover,
&:focus {
cursor: pointer;
}
}
@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))) {
select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
border-width: 0 2rem 0 0;
border-color: transparent;
background: data-uri('image/svg+xml;charset=UTF-8', @select-light-svg-path) no-repeat;
background-position-x: calc(100% + 2rem);
background-size: 2rem;
background-origin: content-box;
background-color: var(--color-toolkit-select-background);
outline: medium none;
text-overflow: ellipsis;
.rounded-corners-tiny;
&:hover,
&:focus {
background-color: var(--color-toolkit-select-background-hover);
}
option {
background-color: var(--color-base-background);
}
}
@media (prefers-color-scheme: dark) {
html.theme-auto select,
html.theme-dark select {
background-image: data-uri('image/svg+xml;charset=UTF-8', @select-dark-svg-path);
}
}
html.theme-dark select {
background-image: data-uri('image/svg+xml;charset=UTF-8', @select-dark-svg-path);
}
}
/* -- checkbox-onoff -- */
input.checkbox-onoff[type="checkbox"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
cursor: pointer;
display: inline-block;
width: 2.5em;
height: 0.7em;
box-shadow: none !important;
margin: 0 16px;
border-radius: 10px;
position: relative;
/* focus & hover */
&:focus,
&:hover {
outline: none;
}
&:focus::after {
content: "";
position: absolute;
width: 3.5em;
height: 1.65em;
border: 1px solid var(--color-btn-background);
border-radius: 12px;
box-shadow: var(--color-btn-background) 0 0 3px;
z-index: 10000;
top: -0.55em;
left: -0.6em;
}
&::before {
position: absolute;
top: -0.5em;
display: flex;
justify-content: center;
align-items: center;
font-size: 0.75em;
width: 1.875em;
height: 1.875em;
border-radius: 50%;
}
}
/* check mark
reversed-checkbox displays unchecked checkedboxes as checked, and vice versa.
see https://github.com/searxng/searxng/blob/3408d061aab9abc6168fec9bbc6deab71b236dac/searx/templates/simple/preferences.html#L313
*/
input.checkbox-onoff[type="checkbox"],
input.checkbox-onoff.reversed-checkbox[type="checkbox"]:checked {
background: var(--color-toolkit-checkbox-onoff-off-background);
&::before {
left: -0.5em;
content: "\2715";
color: var(--color-toolkit-checkbox-onoff-off-mark-color);
background: var(--color-toolkit-checkbox-onoff-off-mark-background);
}
}
input.checkbox-onoff[type="checkbox"]:checked,
input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
background: var(--color-toolkit-checkbox-onoff-on-background);
&::before {
left: calc(100% - 1.5em);
content: "\2713";
color: var(--color-toolkit-checkbox-onoff-on-mark-color);
background: var(--color-toolkit-checkbox-onoff-on-mark-background);
}
}
/* -- checkbox -- */
@supports (transform: rotate(-45deg)) {
input[type=checkbox]:not(.checkbox-onoff) {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 20px;
height: 20px;
cursor: pointer;
position: relative;
top: 0;
left: 0;
border: 2px solid var(--color-toolkit-checkbox-input-border);
.rounded-corners(0.3em);
&::after {
content: '';
width: 9px;
height: 5px;
position: absolute;
top: 3px;
left: 2px;
border: 3px solid var(--color-toolkit-checkbox-label-border);
border-top: none;
border-right: none;
background: transparent;
opacity: 0;
transform: rotate(-45deg);
}
&:checked::after {
border-color: var(--color-toolkit-checkbox-input-border);
opacity: 1;
}
}
// disabled : can't be focused, show only the check mark
input[type=checkbox][disabled]:not(.checkbox-onoff) {
border: inherit;
background-color: transparent !important;
cursor: inherit;
}
// if not checked and possible to checked then display a "light" check mark on hover
input.checkbox[type=checkbox]:not(:checked):not([disabled]):not(.checkbox-onoff):hover::after {
opacity: 0.5;
}
}
@media screen and (max-width: @phone) {
.tabs > label {
width: 100%;
}
}
/* -- loader -- */
.loader,
.loader::after {
border-radius: 50%;
width: 2em;
height: 2em;
}
.loader {
margin: 1em auto;
font-size: 10px;
position: relative;
text-indent: -9999em;
border-top: 0.5em solid var(--color-toolkit-loader-border);
border-right: 0.5em solid var(--color-toolkit-loader-border);
border-bottom: 0.5em solid var(--color-toolkit-loader-border);
border-left: 0.5em solid var(--color-toolkit-loader-borderleft);
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load8 1.2s infinite linear;
animation: load8 1.2s infinite linear;
}
@-webkit-keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
/* -- engine-tooltip -- */
.engine-tooltip {
display: none;
position: absolute;
padding: 0.5rem 1rem;
margin: 0 0 0 2rem;
border: 1px solid var(--color-toolkit-engine-tooltip-border);
background: var(--color-toolkit-engine-tooltip-background);
font-size: 14px;
font-weight: normal;
z-index: 1000000;
text-align: left;
.rounded-corners;
}
th:hover .engine-tooltip,
td:hover .engine-tooltip,
.engine-tooltip:hover {
display: inline-block;
}
/* -- stacked bar chart -- */
.stacked-bar-chart {
margin: 0;
padding: 0 0.125rem 0 4rem;
width: 100%;
width: -moz-available;
width: -webkit-fill-available;
width: fill;
flex-direction: row;
flex-wrap: nowrap;
align-items: center;
display: inline-flex;
}
.stacked-bar-chart-value {
width: 3rem;
display: inline-block;
position: absolute;
padding: 0 0.5rem;
text-align: right;
}
.stacked-bar-chart-base {
display: flex;
flex-shrink: 0;
flex-grow: 0;
flex-basis: unset;
}
.stacked-bar-chart-median {
.stacked-bar-chart-base();
background: var(--color-base-font);
border: 1px solid rgba(var(--color-base-font-rgb), 0.9);
padding: 0.3rem 0;
}
.stacked-bar-chart-rate80 {
.stacked-bar-chart-base();
background: transparent;
border: 1px solid rgba(var(--color-base-font-rgb), 0.3);
padding: 0.3rem 0;
}
.stacked-bar-chart-rate95 {
.stacked-bar-chart-base();
background: transparent;
border-bottom: 1px dotted rgba(var(--color-base-font-rgb), 0.5);
padding: 0;
}
.stacked-bar-chart-rate100 {
.stacked-bar-chart-base();
background: transparent;
border-left: 1px solid rgba(var(--color-base-font-rgb), 0.9);
padding: 0.4rem 0;
width: 1px;
}

View file

@ -0,0 +1,46 @@
.loader,
.loader::after {
border-radius: 50%;
width: 10em;
height: 10em;
}
.loader {
margin: 60px auto;
font-size: 10px;
position: relative;
text-indent: -9999em;
border-top: 1.1em solid rgba(255, 255, 255, 0.2);
border-right: 1.1em solid rgba(255, 255, 255, 0.2);
border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
border-left: 1.1em solid #fff;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load8 1.1s infinite linear;
animation: load8 1.1s infinite linear;
}
@-webkit-keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}

View file

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512">
<title>Information Circle</title>
<path d="M248 64C146.39 64 64 146.39 64 248s82.39 184 184 184 184-82.39 184-184S349.61 64 248 64z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M220 220h32v116"/>
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M208 340h88"/>
<path fill="currentColor" stroke="currentColor" stroke-linecap="round" d="M248 130a26 26 0 1026 26 26 26 0 00-26-26z"/>
</svg>

After

Width:  |  Height:  |  Size: 679 B

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
<g><polygon fill="#ddd" points="128,192 256,320 384,192"/></g>
</svg>

After

Width:  |  Height:  |  Size: 196 B

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512">
<g><polygon points="128,192 256,320 384,192"/></g>
</svg>

After

Width:  |  Height:  |  Size: 184 B

View file

@ -0,0 +1,16 @@
/**
* @license
* SPDX-License-Identifier: AGPL-3.0-or-later
*
* svgo config: Optimize SVG for WEB usage
*/
module.exports = {
plugins: [
{
name: 'preset-default',
},
// make diff friendly
'sortAttrs',
],
};

View file

@ -0,0 +1,19 @@
/**
* @license
* SPDX-License-Identifier: AGPL-3.0-or-later
*
* svgo config: Optimize SVG for WEB usage
*/
module.exports = {
plugins: [
{
name: 'preset-default',
},
// make diff friendly
'sortAttrs',
// Optimize SVG for WEB usage
'convertStyleToAttrs',
'removeXMLNS'
],
};