From 8a85d1b0c7b03cc0d0f82287a114728b521a5a47 Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Fri, 3 Jun 2022 14:10:48 +0200 Subject: [PATCH 1/2] Theme: add a preference to center the results (Oscar) (2nd edition) related to * #1169 * #1281 * #1286 --- searx/preferences.py | 10 ++ searx/settings.yml | 2 + searx/settings_defaults.py | 1 + .../themes/simple/src/less/definitions.less | 1 + .../themes/simple/src/less/style-center.less | 118 ++++++++++++++++++ .../static/themes/simple/src/less/style.less | 33 ++++- searx/templates/simple/base.html | 2 +- searx/templates/simple/preferences.html | 10 ++ 8 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 searx/static/themes/simple/src/less/style-center.less diff --git a/searx/preferences.py b/searx/preferences.py index 46b7b39d7..a7ecac55e 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -365,6 +365,16 @@ class Preferences: locked=is_locked('simple_style'), 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( settings['ui']['advanced_search'], locked=is_locked('advanced_search'), diff --git a/searx/settings.yml b/searx/settings.yml index 1a5d85d1a..a6311b7ff 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -83,6 +83,8 @@ ui: query_in_title: false # ui theme default_theme: simple + # center the results ? + center_aligment: false # Default interface locale - leave blank to detect from browser information or # use codes from the 'locales' config section default_locale: "" diff --git a/searx/settings_defaults.py b/searx/settings_defaults.py index 35089fbd4..ccbbbf287 100644 --- a/searx/settings_defaults.py +++ b/searx/settings_defaults.py @@ -184,6 +184,7 @@ SCHEMA = { 'theme_args': { 'simple_style': SettingsValue(SIMPLE_STYLE, 'auto'), }, + 'center_aligment': SettingsValue(bool, False), 'results_on_new_tab': SettingsValue(bool, False), 'advanced_search': SettingsValue(bool, False), 'query_in_title': SettingsValue(bool, False), diff --git a/searx/static/themes/simple/src/less/definitions.less b/searx/static/themes/simple/src/less/definitions.less index dc2717067..ef6b02b2c 100644 --- a/searx/static/themes/simple/src/less/definitions.less +++ b/searx/static/themes/simple/src/less/definitions.less @@ -243,6 +243,7 @@ /// General Size @results-width: 45rem; +@results-sidebar-width: 25rem; @results-offset: 10rem; @results-tablet-offset: 0.5rem; @results-gap: 5rem; diff --git a/searx/static/themes/simple/src/less/style-center.less b/searx/static/themes/simple/src/less/style-center.less new file mode 100644 index 000000000..30c52cd5a --- /dev/null +++ b/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); + } + } +} diff --git a/searx/static/themes/simple/src/less/style.less b/searx/static/themes/simple/src/less/style.less index 45c6eb204..c2efcdd50 100644 --- a/searx/static/themes/simple/src/less/style.less +++ b/searx/static/themes/simple/src/less/style.less @@ -29,6 +29,9 @@ // Search-Field @import "search.less"; +// to center the results +@import "style-center.less"; + // ion-icon .ion-icon { display: inline-block; @@ -460,7 +463,7 @@ article[data-vim-selected].category-social { margin-bottom: 0; .ltr-margin-left(@results-offset); 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; gap: 0 @results-gap; grid-template-areas: @@ -698,7 +701,11 @@ article[data-vim-selected].category-social { opacity: 1; } -@media screen and (max-width: @tablet) { +/* + tablet layout +*/ + +.results-tablet() { .page_with_header { margin: 2rem 0.5rem; 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 { margin: 1rem @results-tablet-offset 0 @results-tablet-offset; display: grid; @@ -837,7 +855,14 @@ article[data-vim-selected].category-social { } } +/* + phone layout +*/ + @media screen and (max-width: @phone) { + // based on the tablet layout + .results-tablet(); + html { 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) { .result-videos { img.thumbnail { diff --git a/searx/templates/simple/base.html b/searx/templates/simple/base.html index 7e5f535d4..c40183fdd 100644 --- a/searx/templates/simple/base.html +++ b/searx/templates/simple/base.html @@ -1,5 +1,5 @@ - + diff --git a/searx/templates/simple/preferences.html b/searx/templates/simple/preferences.html index 4dde6fec2..aa0e65e28 100644 --- a/searx/templates/simple/preferences.html +++ b/searx/templates/simple/preferences.html @@ -213,6 +213,16 @@

{{ _('Choose auto to follow your browser settings') }}
+
+ {{ _('Center Alignment') }} +

+ +

+
{{ _('Displays results in the center of the page (Oscar layout).') }}
+
{% endif %} {% if 'results_on_new_tab' not in locked_preferences %}
From e6c300090916c192bdb3e01c02fc372ba800f66a Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Sat, 18 Jun 2022 08:58:06 +0200 Subject: [PATCH 2/2] [build] /static --- .../themes/simple/css/searxng-rtl.min.css | Bin 63495 -> 66930 bytes .../themes/simple/css/searxng-rtl.min.css.map | Bin 103280 -> 108393 bytes .../static/themes/simple/css/searxng.min.css | Bin 62401 -> 65832 bytes .../themes/simple/css/searxng.min.css.map | Bin 101593 -> 106706 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/searx/static/themes/simple/css/searxng-rtl.min.css b/searx/static/themes/simple/css/searxng-rtl.min.css index 5080411a94bb1e0016cb1c60be9fb7c3d496ae54..2c87867839702786946144e5b03446dcc757faf9 100644 GIT binary patch delta 2105 zcmbtV-%Aux6n-!<2rAQEe~@_DMc6@SoYmbmXQO-x3PVVI=uNIO*V$|HiaeCK@U%+p5O?`P*; zu5FUXqP)*MfVw(4IW#?gdY3U#o87NC6? zt)WF%%KE{#T8dtP@`E{Z&a}Mn+JFhAGz=&RNBfp**5nLjCcl=th_Ka3UcI?eXekv3 zL0c|)q2jWlI7IG!YeI~l0b;&{pn`0VhVy+$b3104;p% z7v#%MvTQ)0nW_oGgi|2p8ypMD$o7TcBGt4pa#BUv)RuLFSD__k1uFRB5w)TP6$KkA zAGAwszP6&7j&Rlh+1}`x3IhUS5qumub^)o3rDNI&GCd~6ESwLfehSO14Xe>1N2(euCqIqkwg~NfhKltnsFW4DK-7ka|`i*`HnH z#@_imL965FN2BRK#)1(IAFX6kj?Dz5nd1|xEx6|J)^M8qp^8h7N{^jPntX5)Wgvtr z76`KGFJZ&=tFRg^SZtJ#jbo~M>Y{0BLG`3rYernJtZvQ@F?MG62}u|xAmy!oaGE_^&wurj*Y(TniapxztL)U@w$a{I e4tBq{wU=C7^T_ti0rK@-J6Z4OtbA%*@Av~(0uO!w delta 33 rcmV++0N(%diUf!71F(6-vwqA`C6oWW60-sN{R6W{_qqbJ{{3_ZH2xAl diff --git a/searx/static/themes/simple/css/searxng-rtl.min.css.map b/searx/static/themes/simple/css/searxng-rtl.min.css.map index 2b3300c17ecc75cec3449b72bd0bed0dc92b3da4..e3f951e211148153596099d7044a2bda74072370 100644 GIT binary patch delta 4959 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 delta 1102 zcmY*XOK1~87-qH-6ipPWRD2y&6q>1a#k47cI1{(YX1i??lcqCO+ucy}-X=|JZ9vdN z4@I!(fbn8&EeKw;kV8OG=t1x#N=2`N2zt|-9t3ALkLo4)_kVo<_kI6-f9v@1*s%tr z>LDqjOSvdp3PUID@gW#PC=LlJvrl3CU&dm`BIx+PJsxaA4fzyE5JE7H>eC2nrp0bY z+>(*6zKE28)12~$U_$h0#w^3p@%=OvpwJK*-ToozfEPnAro9S#8Qtq9>Ha*1b3Wv= zFb772*N~6GAsfWZsHllIc{gUb%tA1So0(ZQ89UfPQ$h6a1~EuTzPcJ40Fo)QpTkkf zn5p{Xm%$hrI1>eqtm`nu#TXSWLRx92$41m9r@40ET*2#S?}iTbhtG;%eIi$ zPSc9EIM1+;eB@2KO^ zjK~|JTj8d^POi7p+%#8hgK1=PnoA5b`S2e0H1)MDfiAGlEAM)#r`%+&i9^~VHPR!p zr_R%|_-`D-TgH<q}tmw_;zUPDbLhI{>(+I za`OQ=QCVCD`)VBvVA)mqH3(qsdj-rpYHJU{s#LL-!0yV89iXH3{t>v-*81LFS$PcJ F`~|XMSeF0* diff --git a/searx/static/themes/simple/css/searxng.min.css b/searx/static/themes/simple/css/searxng.min.css index 3aff95a7e0e24d0d7578784e9a6db97b0b037b4e..444518ca865f09b046188e531e171ceb723812a5 100644 GIT binary patch delta 2136 zcmbtV&ubGw6h_j67nPDG{Q=b>p^~NDbsLjZ(}Reosx2rzR>EX=noQlyE;F0{a0$iU z1?k|QAb1pW@E{1qq9>1f6K_h}VC^3uIJ=vKwwYC1PrLJG=G*VR_q}hozQbf?S{}0Hit8K{hUC1D3e&P9WLYg;!%aUh2-rr2F z7xXb;K+DMF#ES~@es0q>NGk%%LW^!u@2n`URK>C(MLbeTkgijUd52Main5#JSQ9{+ zVH1@h?c5H(IvH`j=XMzy59jT9+wlVOL1uo6fyx@q(;>X6*;NvW7GWhX1Z`XH2(PAD8JM^I~Syv4;q)#{MLyME<>7; zC|S7zvI_9q5P5<>{gJ#(Ah7I;4MM^xkP-prKm$=B6Bku%iV;ikgIDp{L&-SMG%=}k z6w_IrKr;N}o534F&w@mzL-43%08hjZB0n(&DYmrAY$qA{H`9*hp!V5dYkhNG` zw9u-`Tu9wWtmLgCvE7Vj6Kky`wBcByRwY~$M#7YED_E!|av`=<+d)L>NIc}K<@veh z$V|}EsI=PyDjwNjP{T(wtMyZ`0%_R{g(3^S+945+l$fk2wpYMVR`~-tpoPv0G{Y9& zOk7cr)wb_qQbiO;6#Q>y^KTwCD0LdW(Oll19g|q;K#y984fvxEBYb}+A>ZuV)#Mvn zU*o_tEMW@8vh7xTi{wM!+pWuQzu&#TE+fsnYn()~Gc8patZmYP5#r c8_!x9`3Be@ZhmgPjx|5+{E9W7{LICE1FF3jYXATM delta 54 zcmV-60LlNTf&{_m1F(0*vv|x*C6lhd36s#p3X<|JvnKk^1G7B$y8;DhbZu;VlX1Zv MlXwRfvn>An0`@Z+djJ3c diff --git a/searx/static/themes/simple/css/searxng.min.css.map b/searx/static/themes/simple/css/searxng.min.css.map index 9f3ed4abbed41a9add3911a1cec69e782c92322f..6050b1323732759ae8c9013de65593b64c253996 100644 GIT binary patch delta 4907 zcmb_gU2Gd!71j+jrBuo8lAk7Rm)=dZZGOhF<2XMpTDCK`lRB=Oq-m2n&ClK$PvU9D zGtSI7iCcAD3Bh(nMFk_6tqCj9&f#JlsP>wHbOXGYkosCIJ*uRjEk24z~oi)MNSbSj^X42V_xFW1eV!9;l zgE2#0r>Sd|j;82{9XBN=MIp)%WvVvJx^l2NKw3`(0Yu}1mf+h&2)zt(oKN~RK~Qi~ z38qA0zItfw5JKlzvj zA*S+4AvywKUJgy8az&uZ_f>L#dX+TiHYas|4|RWT_T>|@F&Xel z9k4U9#NN3%dl@z4M%^D=yVjsYcAj2aM&0t}^d)YQCgtgrk4nBZGwB~g3huqR&Tcte zv(sj(cDHMGQTJzazii4m*Qx*`?l~llSst17xX@P^Ts4EgfxlXND3QJhe=-iDS5cIww`s5-8|hb8w&3_Ax$=5 z$V*bb1w)qa3@Pkfy4l#!oU_)T8`*M7iMfkQcVEbb^HMcg>zezwrSCN725$vsX=TKH zu>AFN@-1DOvvoboa|E?>5V$hU6zy_BV2os#*#At$PK@yriD31*7NtWU?m6(3U%`9D> zp(}pLgD`B>3j_R)#pUn@pyhjsW=R=t&9s7bd0HN{r7P!nplK4b!GuGUw_za&bPV)Q z7?IrLa#AX=Qy9FYn3@zK4395afNzbh`@f->g5gkU$m{hkATTQ0NgfKgob)NFhu}t(mm9|7?v(OYgDJUxQhq-w zp9iEt!vQXzm3}%KO~^y^FJYt;b5P=!$?eIaYmv*Bo|DI5|DiOxjq-;r2gmI`k^g#x zi0jF5_fal2C_B*_IgzN8WxUP_a0LN$d8lr+KMKfaT{GL}7S!`E=8Pe!Sk;TtkoyyL z1v_3?2sPsclS|y1rsBO*GRE3=H7Al&t3ux>~f1WbZfk(J6T(@+ww{uJpuU z5UTYCE#5EjTwq)v)*67&)m7&Lj_jYdw6%QQJb>c+x=WUB<2zoaj5^OyCIW{w3%{Yk zXt@`iJ?bxb?|ucfo`%SD$6|-}FoYCpKOUrxynAh^H%L`*9p~c)z`mI_DUu zVMbeQU>INle;_hF2h?sa4&!JqrX(C{;?wFq{2FTS#EV@9!MeF-Vh#$rj7@pPQPlof z+9KXZBdDznV<;h}7Tk`>koWT#I{5{RizJuRjJ0awyvP{pX!Z{Z0{Zu>sMDJ*qt=Fj zVefqfwN?%bV(&&=6Tv${p;WQdDI${&Td`D-Sti{0HGGlRvEWy_PReG<@kNguVI@v0 z;^Yz5+}`CfI_do=fsT3KlThQ0ppIzlL9tFq~ z*(^o-wpLpcjMq%anJ><~v_YL^RUsu?#pWuz7WPOvzXGa}0-8z~3WO2c7x{8Ty!#sfUD za2=TNUj@Snirag$f;!#u(-)Vx<^QEcS%-3ebt>Q0;%f>>LrvM6%jlGMH-SEf?s}zR zG_`yA3i_ZS1O?{5Bxsg{M~QJ!D-=!30kLCk=0ELr|22(1{$l&VgzkQ9qQ}ks;XVq8 z3k&9oLLVSBUp_Z>h_CkS9<87Ujozac)OyIpTmhPxa2<5J3Q&zIfA#tJsx9poZ9&ax z1aFj7s|?q;qL=7Pbg`>YcayVMz+xB044Z=Xrd-gK3Ori5C|0-Ar9IK%k^#BSX^v(Z zMAyr#N1wrKm_a4%XMvX#q>N=P+=nxotzgdBuKQK=UPC+QltHbdl)mZ0!xS~K*~5`F i>K<$~tb@+mUAm9H{h8C;uU!Dxp@Y14doMjezxofk=M;|s delta 1122 zcmY*YO=uHA6lS)XgP162{kH`{d&me~F>R_S%xu$Sv&MGQr0I-5?QYQgHcgtwYCtH0 z6!D-k;8GDjmD&6f-ULLOZyZAlL)0?iqzQ$9sd_8v7R{U`L`y3O{gIy1PMY2rjUb1P%}&H zM%*tMQ;jF_I`En^;Srb?HJUNUl*Ht2nvGBg6%*kY$wh(~1~Kgqv8Rb063MX-i9KF3 zuc8)knt`O@Gt1E;ZiVJpIk|T`%|_9`T!N60smA@}2_Ts=`!$x3j9Md-ItwOfc_aeu zmKv#!s4k2Sj6_{dlF?PCASUDt+tZ=&AS_@SXk&wI?5w_qon!0C3$Iy9tPNdb@5vu8 z%_c)GDJihe^x$?{N)187A?Ffp|3akF*njF8@X;CK4w=EE#-5xm=4g35$_*9{lDY8^ ztYBgLIT284y`A%q4?$g|bdfrT!b5OW{5nvYO(UnPMhg6BuOvhV%$9#7)3|lUBl*l? z1`j!D)wskSOkCb%2C{f43v4wy;1%$JDnc$ zhARrJDoB}8_^#M$dM`_4{1JMw!u#4iG}2qaF>${|2hQc1QmW#UEmta4Ug7Z4yokFK z*VxO<>K0m@<$7(h7@3~s;&dkO>trk0uN`SL%Ha7o{WMT-DbNsKt=qa!L=O$py7(IQ z2qaj?(+Zs8GnW;1C#N2y{k?7eoQw&~@Z=a&MSYAG<#x6zv(5SVW>c1NdF?#}Wj2$a z0BYlH{`s-SOW=U@Yyqri&pvIi Tv?Z{$xo{T@b~tq#mcgsPyyILy