Theme: add a preference to center the results (Oscar)

related to #1169
This commit is contained in:
Alexandre Flament 2022-06-03 14:10:48 +02:00
parent a408dd37e7
commit 4237f5fd50
8 changed files with 219 additions and 88 deletions

View File

@ -367,6 +367,16 @@ class Preferences:
locked=is_locked('simple_style'), locked=is_locked('simple_style'),
choices=['', 'auto', 'light', 'dark'] choices=['', 'auto', 'light', 'dark']
), ),
'center_aligment': MapSetting(
settings['ui']['center_aligment'],
locked=is_locked('center_aligment'),
map={
'0': False,
'1': True,
'False': False,
'True': True
}
),
'advanced_search': MapSetting( 'advanced_search': MapSetting(
settings['ui']['advanced_search'], settings['ui']['advanced_search'],
locked=is_locked('advanced_search'), locked=is_locked('advanced_search'),

View File

@ -82,6 +82,8 @@ ui:
query_in_title: false query_in_title: false
# ui theme # ui theme
default_theme: simple default_theme: simple
# center the results ?
center_aligment: false
# Default interface locale - leave blank to detect from browser information or # Default interface locale - leave blank to detect from browser information or
# use codes from the 'locales' config section # use codes from the 'locales' config section
default_locale: "" default_locale: ""

View File

@ -183,6 +183,7 @@ SCHEMA = {
'theme_args': { 'theme_args': {
'simple_style': SettingsValue(SIMPLE_STYLE, 'auto'), 'simple_style': SettingsValue(SIMPLE_STYLE, 'auto'),
}, },
'center_aligment': SettingsValue(bool, False),
'results_on_new_tab': SettingsValue(bool, False), 'results_on_new_tab': SettingsValue(bool, False),
'advanced_search': SettingsValue(bool, False), 'advanced_search': SettingsValue(bool, False),
'query_in_title': SettingsValue(bool, False), 'query_in_title': SettingsValue(bool, False),

View File

@ -243,6 +243,7 @@
/// General Size /// General Size
@results-width: 45rem; @results-width: 45rem;
@results-sidebar-width: 25rem;
@results-offset: 10rem; @results-offset: 10rem;
@results-tablet-offset: 0.5rem; @results-tablet-offset: 0.5rem;
@results-gap: 5rem; @results-gap: 5rem;

View File

@ -0,0 +1,102 @@
/*
--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) {
.center-aligment-yes #main_results {
#results {
grid-template-columns: 60% 1fr;
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";
width: 100%;
padding-left: 0;
padding-right: 0;
}
.search_filters {
.ltr-margin-left(0.5rem);
width: var(--center-page-width);
}
#results {
&.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;
}
}
}
}

View File

@ -29,6 +29,9 @@
// Search-Field // Search-Field
@import "search.less"; @import "search.less";
// to center the results
@import "style-center.less";
// ion-icon // ion-icon
.ion-icon { .ion-icon {
display: inline-block; display: inline-block;
@ -460,7 +463,7 @@ article[data-vim-selected].category-social {
margin-bottom: 0; margin-bottom: 0;
.ltr-margin-left(@results-offset); .ltr-margin-left(@results-offset);
display: grid; display: grid;
grid-template-columns: @results-width 25rem; grid-template-columns: @results-width @results-sidebar-width;
grid-template-rows: min-content min-content 1fr min-content; grid-template-rows: min-content min-content 1fr min-content;
gap: 0 @results-gap; gap: 0 @results-gap;
grid-template-areas: grid-template-areas:
@ -699,103 +702,105 @@ article[data-vim-selected].category-social {
} }
@media screen and (max-width: @tablet) { @media screen and (max-width: @tablet) {
.page_with_header { .center-aligment-no {
margin: 2rem 0.5rem; .page_with_header {
width: auto; margin: 2rem 0.5rem;
} width: auto;
}
#infoboxes { #infoboxes {
position: inherit; position: inherit;
max-width: inherit; max-width: inherit;
.infobox { .infobox {
clear: both; clear: both;
img {
.ltr-float-left();
max-width: 10em;
margin-top: 0.5em;
.ltr-margin-right(0.5em);
margin-bottom: 0.5em;
.ltr-margin-left(0);
}
}
}
#sidebar {
margin: 0 @results-tablet-offset @results-margin @results-tablet-offset;
padding: 0;
float: none;
border: none;
width: auto;
input {
border: 0;
}
}
#apis {
display: none;
}
#search_url {
display: none;
}
.result {
.thumbnail {
max-width: 98%;
}
.url {
span.url {
display: block;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
}
}
.engines {
.ltr-float-right();
padding: 0 0 3px 0;
}
}
.result-images {
border-bottom: none !important;
}
.image_result {
max-width: 98%;
img { img {
.ltr-float-left(); max-width: 98%;
max-width: 10em;
margin-top: 0.5em;
.ltr-margin-right(0.5em);
margin-bottom: 0.5em;
.ltr-margin-left(0);
}
}
}
#sidebar {
margin: 0 @results-tablet-offset @results-margin @results-tablet-offset;
padding: 0;
float: none;
border: none;
width: auto;
input {
border: 0;
}
}
#apis {
display: none;
}
#search_url {
display: none;
}
.result {
.thumbnail {
max-width: 98%;
}
.url {
span.url {
display: block;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
} }
} }
.engines { #backToTop {
.ltr-float-right(); display: none;
padding: 0 0 3px 0;
} }
}
.result-images { #pagination {
border-bottom: none !important; margin: 2rem 0 0 0 !important;
}
.image_result {
max-width: 98%;
img {
max-width: 98%;
} }
}
#backToTop { #main_results div#results {
display: none; margin: 1rem auto 0 auto;
} justify-content: center;
display: grid;
#pagination { grid-template-columns: @results-width;
margin: 2rem 0 0 0 !important; grid-template-rows: min-content min-content min-content 1fr min-content min-content;
} gap: 0;
grid-template-areas:
#main_results div#results { "corrections"
margin: 1rem auto 0 auto; "answers"
justify-content: center; "sidebar"
display: grid; "urls"
grid-template-columns: @results-width; "pagination";
grid-template-rows: min-content min-content min-content 1fr min-content min-content; }
gap: 0;
grid-template-areas:
"corrections"
"answers"
"sidebar"
"urls"
"pagination";
} }
} }

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html class="no-js theme-{{ preferences.get_value('simple_style') or 'auto' }}" lang="{{ locale_rfc5646 }}" {% if rtl %} dir="rtl"{% endif %}> <html class="no-js theme-{{ preferences.get_value('simple_style') or 'auto' }} center-aligment-{{ preferences.get_value('center_aligment') and 'yes' or 'no' }}" lang="{{ locale_rfc5646 }}" {% if rtl %} dir="rtl"{% endif %}>
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="description" content="SearXNG — a privacy-respecting, hackable metasearch engine"> <meta name="description" content="SearXNG — a privacy-respecting, hackable metasearch engine">

View File

@ -213,6 +213,16 @@
</p> </p>
<div class="description">{{ _('Choose auto to follow your browser settings') }}</div> <div class="description">{{ _('Choose auto to follow your browser settings') }}</div>
</fieldset> </fieldset>
<fieldset>
<legend id="pref_center_aligment">{{ _('Center Alignment') }}</legend>
<p class="value">
<select name="center_aligment" aria-labelledby="pref_center_aligment">
<option value="1" {% if preferences.get_value('center_aligment') %}selected="selected"{% endif %}>{{ _('On') }}</option>
<option value="0" {% if not preferences.get_value('center_aligment') %}selected="selected"{% endif %}>{{ _('Off')}}</option>
</select>
</p>
<div class="description">{{ _('Displays results in the center of the page (Oscar layout).') }}</div>
</fieldset>
{% endif %} {% endif %}
{% if 'results_on_new_tab' not in locked_preferences %} {% if 'results_on_new_tab' not in locked_preferences %}
<fieldset> <fieldset>