Browse Source

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

related to
* #1169
* #1281
* #1286
Alexandre Flament 2 years ago
parent
commit
8a85d1b0c7

+ 10 - 0
searx/preferences.py

@@ -365,6 +365,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'),

+ 2 - 0
searx/settings.yml

@@ -83,6 +83,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: ""

+ 1 - 0
searx/settings_defaults.py

@@ -184,6 +184,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),

+ 1 - 0
searx/static/themes/simple/src/less/definitions.less

@@ -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;

+ 118 - 0
searx/static/themes/simple/src/less/style-center.less

@@ -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);
+    }
+  }
+}

+ 31 - 2
searx/static/themes/simple/src/less/style.less

@@ -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:
@@ -698,7 +701,11 @@ article[data-vim-selected].category-social {
   opacity: 1;
   opacity: 1;
 }
 }
 
 
-@media screen and (max-width: @tablet) {
+/*
+  tablet layout
+*/
+
+.results-tablet() {
   .page_with_header {
   .page_with_header {
     margin: 2rem 0.5rem;
     margin: 2rem 0.5rem;
     width: auto;
     width: auto;
@@ -799,6 +806,17 @@ article[data-vim-selected].category-social {
   }
   }
 }
 }
 
 
+@media screen and (min-width: @phone) and (max-width: @tablet) {
+  // when .center-aligment-yes, see style-center.less
+  // the media query includes "min-width: @phone"
+  // because the phone layout includes the tablet layout unconditionally.
+  .center-aligment-no {
+    .results-tablet();
+  }
+}
+
+/* Misc */
+
 #main_results div#results.only_template_images {
 #main_results div#results.only_template_images {
   margin: 1rem @results-tablet-offset 0 @results-tablet-offset;
   margin: 1rem @results-tablet-offset 0 @results-tablet-offset;
   display: grid;
   display: grid;
@@ -837,7 +855,14 @@ article[data-vim-selected].category-social {
   }
   }
 }
 }
 
 
+/*
+  phone layout
+*/
+
 @media screen and (max-width: @phone) {
 @media screen and (max-width: @phone) {
+  // based on the tablet layout
+  .results-tablet();
+
   html {
   html {
     background-color: var(--color-base-background-mobile);
     background-color: var(--color-base-background-mobile);
   }
   }
@@ -888,6 +913,10 @@ article[data-vim-selected].category-social {
   }
   }
 }
 }
 
 
+/*
+  small-phone layout
+*/
+
 @media screen and (max-width: @small-phone) {
 @media screen and (max-width: @small-phone) {
   .result-videos {
   .result-videos {
     img.thumbnail {
     img.thumbnail {

+ 1 - 1
searx/templates/simple/base.html

@@ -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">

+ 10 - 0
searx/templates/simple/preferences.html

@@ -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>