Commit ff07ac4f authored by Dominik Hebeler's avatar Dominik Hebeler
Browse files

fixed some stylings and image search

parent 100d638c
...@@ -6,6 +6,7 @@ namespace App\Models; ...@@ -6,6 +6,7 @@ namespace App\Models;
/* Die Klasse Result sammelt alle Informationen über ein einzelnes Suchergebnis. /* Die Klasse Result sammelt alle Informationen über ein einzelnes Suchergebnis.
* Die Results werden von den Suchmaschinenspezifischen Parser-Skripten erstellt. * Die Results werden von den Suchmaschinenspezifischen Parser-Skripten erstellt.
*/ */
class Result class Result
{ {
public $provider; # Die Engine von der das Suchergebnis kommt public $provider; # Die Engine von der das Suchergebnis kommt
...@@ -20,7 +21,7 @@ class Result ...@@ -20,7 +21,7 @@ class Result
public $sourceRank; # Das Ranking für dieses Suchergebnis von der Seite, die es geliefert hat (implizit durch Ergebnisreihenfolge: 20 - Position in Ergebnisliste) public $sourceRank; # Das Ranking für dieses Suchergebnis von der Seite, die es geliefert hat (implizit durch Ergebnisreihenfolge: 20 - Position in Ergebnisliste)
public $partnershop; # Ist das Ergebnis von einem Partnershop? (bool) public $partnershop; # Ist das Ergebnis von einem Partnershop? (bool)
public $image; # Ein Vorschaubild für das Suchergebnis (als URL) public $image; # Ein Vorschaubild für das Suchergebnis (als URL)
public $imageDimensions; # Ein Array in welchem wenn verfügbar Breite/Höhe des Bildes gespeichert sind ["width" => ..., "height" => ...]
public $proxyLink; # Der Link für die Seite über unseren Proxy-Service public $proxyLink; # Der Link für die Seite über unseren Proxy-Service
public $engineBoost = 1; # Der Boost für den Provider des Suchergebnisses public $engineBoost = 1; # Der Boost für den Provider des Suchergebnisses
public $valid = true; # Ob das Ergebnis noch gültig ist (bool) public $valid = true; # Ob das Ergebnis noch gültig ist (bool)
...@@ -78,6 +79,7 @@ class Result ...@@ -78,6 +79,7 @@ class Result
$this->rank = 0; $this->rank = 0;
$this->partnershop = isset($additionalInformation["partnershop"]) ? $additionalInformation["partnershop"] : false; $this->partnershop = isset($additionalInformation["partnershop"]) ? $additionalInformation["partnershop"] : false;
$this->image = isset($additionalInformation["image"]) ? $additionalInformation["image"] : ""; $this->image = isset($additionalInformation["image"]) ? $additionalInformation["image"] : "";
$this->imageDimensions = isset($additionalInformation["imagedimensions"]) ? $additionalInformation["imagedimensions"] : [];
$this->price = isset($additionalInformation["price"]) ? $additionalInformation["price"] : 0; $this->price = isset($additionalInformation["price"]) ? $additionalInformation["price"] : 0;
$this->price_text = $this->price_to_text($this->price); $this->price_text = $this->price_to_text($this->price);
$this->additionalInformation = $additionalInformation; $this->additionalInformation = $additionalInformation;
...@@ -186,7 +188,8 @@ class Result ...@@ -186,7 +188,8 @@ class Result
$tmpEingabe = preg_replace($regex, "", $tmpEingabe); $tmpEingabe = preg_replace($regex, "", $tmpEingabe);
} }
foreach (str_split($tmpEingabe) as $char) { foreach (str_split($tmpEingabe) as $char) {
if (!$char if (
!$char
|| !$tmpEingabe || !$tmpEingabe
|| strlen($tmpEingabe) === 0 || strlen($tmpEingabe) === 0
|| strlen($char) === 0 || strlen($char) === 0
...@@ -246,8 +249,10 @@ class Result ...@@ -246,8 +249,10 @@ class Result
public function isValid(\App\MetaGer $metager) public function isValid(\App\MetaGer $metager)
{ {
# Perönliche Host und Domain Blacklist # Perönliche Host und Domain Blacklist
if (in_array(strtolower($this->strippedHost), $metager->getUserHostBlacklist()) if (
|| in_array(strtolower($this->strippedDomain), $metager->getUserDomainBlacklist())) { in_array(strtolower($this->strippedHost), $metager->getUserHostBlacklist())
|| in_array(strtolower($this->strippedDomain), $metager->getUserDomainBlacklist())
) {
return false; return false;
} }
...@@ -256,7 +261,6 @@ class Result ...@@ -256,7 +261,6 @@ class Result
if (strpos(strtolower($this->link), $word)) { if (strpos(strtolower($this->link), $word)) {
return false; return false;
} }
} }
# Allgemeine URL und Domain Blacklist # Allgemeine URL und Domain Blacklist
...@@ -273,7 +277,7 @@ class Result ...@@ -273,7 +277,7 @@ class Result
} }
// Possibly remove description // Possibly remove description
if($this->isDescriptionBlackListed($metager)){ if ($this->isDescriptionBlackListed($metager)) {
$this->descr = ""; $this->descr = "";
} }
...@@ -324,12 +328,12 @@ class Result ...@@ -324,12 +328,12 @@ class Result
if (($this->strippedHost !== "" && (in_array($this->strippedHost, $metager->getDomainBlacklist()) || if (($this->strippedHost !== "" && (in_array($this->strippedHost, $metager->getDomainBlacklist()) ||
in_array($this->strippedLink, $metager->getUrlBlacklist()))) || in_array($this->strippedLink, $metager->getUrlBlacklist()))) ||
($this->strippedHostAnzeige !== "" && (in_array($this->strippedHostAnzeige, $metager->getDomainBlacklist()) || ($this->strippedHostAnzeige !== "" && (in_array($this->strippedHostAnzeige, $metager->getDomainBlacklist()) ||
in_array($this->strippedLinkAnzeige, $metager->getUrlBlacklist())))) { in_array($this->strippedLinkAnzeige, $metager->getUrlBlacklist())))
) {
return true; return true;
} else { } else {
return false; return false;
} }
} }
public function isDescriptionBlackListed(\App\MetaGer $metager) public function isDescriptionBlackListed(\App\MetaGer $metager)
...@@ -381,9 +385,9 @@ class Result ...@@ -381,9 +385,9 @@ class Result
$proxyUrl = "https://proxy.metager.de/"; $proxyUrl = "https://proxy.metager.de/";
if(!empty($parts["host"])){ if (!empty($parts["host"])) {
$proxyUrl .= $parts["host"]; $proxyUrl .= $parts["host"];
if(!empty($parts["path"])){ if (!empty($parts["path"])) {
$proxyUrl .= "/" . rawurlencode(trim($parts["path"], "/")); $proxyUrl .= "/" . rawurlencode(trim($parts["path"], "/"));
} }
} }
...@@ -490,7 +494,8 @@ class Result ...@@ -490,7 +494,8 @@ class Result
* *
* @return Sanitized version of the text * @return Sanitized version of the text
*/ */
private function sanitizeText($text){ private function sanitizeText($text)
{
$target = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"]; $target = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '?', '.', ',', '"', "'"];
$specialList = [ $specialList = [
'serifBold' => ['𝐚', '𝐛', '𝐜', '𝐝', '𝐞', '𝐟', '𝐠', '𝐡', '𝐢', '𝐣', '𝐤', '𝐥', '𝐦', '𝐧', '𝐨', '𝐩', '𝐪', '𝐫', '𝐬', '𝐭', '𝐮', '𝐯', '𝐰', '𝐱', '𝐲', '𝐳', '𝐀', '𝐁', '𝐂', '𝐃', '𝐄', '𝐅', '𝐆', '𝐇', '𝐈', '𝐉', '𝐊', '𝐋', '𝐌', '𝐍', '𝐎', '𝐏', '𝐐', '𝐑', '𝐒', '𝐓', '𝐔', '𝐕', '𝐖', '𝐗', '𝐘', '𝐙', '𝟎', '𝟏', '𝟐', '𝟑', '𝟒', '𝟓', '𝟔', '𝟕', '𝟖', '𝟗', '❗', '❓', '.', ',', '"', "'"], 'serifBold' => ['𝐚', '𝐛', '𝐜', '𝐝', '𝐞', '𝐟', '𝐠', '𝐡', '𝐢', '𝐣', '𝐤', '𝐥', '𝐦', '𝐧', '𝐨', '𝐩', '𝐪', '𝐫', '𝐬', '𝐭', '𝐮', '𝐯', '𝐰', '𝐱', '𝐲', '𝐳', '𝐀', '𝐁', '𝐂', '𝐃', '𝐄', '𝐅', '𝐆', '𝐇', '𝐈', '𝐉', '𝐊', '𝐋', '𝐌', '𝐍', '𝐎', '𝐏', '𝐐', '𝐑', '𝐒', '𝐓', '𝐔', '𝐕', '𝐖', '𝐗', '𝐘', '𝐙', '𝟎', '𝟏', '𝟐', '𝟑', '𝟒', '𝟓', '𝟔', '𝟕', '𝟖', '𝟗', '❗', '❓', '.', ',', '"', "'"],
......
...@@ -34,14 +34,20 @@ class BingBilder extends Searchengine ...@@ -34,14 +34,20 @@ class BingBilder extends Searchengine
$link, $link,
$anzeigeLink, $anzeigeLink,
$descr, $descr,
$this->engine->{"display-name"}, $this->engine->homepage, $this->engine->{"display-name"},
$this->engine->homepage,
$this->counter, $this->counter,
['image' => $image] [
'image' => $image,
'imagedimensions' => [
"width" => $result->width,
"height" => $result->height
]
]
); );
} }
} catch (\Exception $e) { } catch (\Exception $e) {
throw $e;
Log::error("A problem occurred parsing results from $this->name:"); Log::error("A problem occurred parsing results from $this->name:");
Log::error($e->getMessage()); Log::error($e->getMessage());
return; return;
...@@ -64,12 +70,50 @@ class BingBilder extends Searchengine ...@@ -64,12 +70,50 @@ class BingBilder extends Searchengine
$newEngine->{"get-parameter"}->offset = $nextOffset; $newEngine->{"get-parameter"}->offset = $nextOffset;
$next = new BingBilder($this->name, $newEngine, $metager); $next = new BingBilder($this->name, $newEngine, $metager);
$this->next = $next; $this->next = $next;
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error("A problem occurred parsing results from $this->name:"); Log::error("A problem occurred parsing results from $this->name:");
Log::error($e->getMessage()); Log::error($e->getMessage());
return; return;
} }
}
public static function generateThumbnailUrl(\App\Models\Result $result)
{
$url = $result->image;
// all images get cropped to a width of 400 px
// We will calculate the height after cropping
// All Images in a row get 250px
// If the height after cropping is a multiple of that plus the gap between rows
// we will allow the image to span up to three rows
$newWidth = 400;
$newHeight = 250;
$heightMultiplier = 1; // Can be 1..3 in the end
$gapPixels = 8;
$width = $result->imageDimensions["width"];
$height = $result->imageDimensions["height"];
$heightAfterCrop = $height * (400 / $width);
$heightMultiplier = max(1, min(3, floor($heightAfterCrop / 250)));
$newHeight = $newHeight * $heightMultiplier + (($heightMultiplier - 1) * $gapPixels);
$requestDataBing = [
"w" => $newWidth,
"h" => $newHeight,
"c" => 7, // Smart Cropping
];
$requestDataBing = http_build_query($requestDataBing, "", "&", PHP_QUERY_RFC3986);
$url .= "&" . $requestDataBing;
$requestData = [];
$requestData["url"] = $url;
$link = action('Pictureproxy@get', $requestData);
return [
"link" => $link,
"height-multiplier" => $heightMultiplier
];
} }
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
return [ return [
'head.1' => 'MetaGer Apps', 'head.1' => 'MetaGer Apps',
'disclaimer.1' => 'Aktuell können wir unsere Apps nur für Android Geräte zur Verfügung stellen. Apple macht es uns leider zu schwer. Wir bitten hierfür um Verständnis.', 'disclaimer.1' => 'Aktuell können wir unsere Apps nur für Android Geräte zur Verfügung stellen.',
'head.2' => 'MetaGer App', 'head.2' => 'MetaGer App',
'metager.1' => 'Diese App bringt die volle Power unserer Suchmaschine auf ihr Smartphone. Durchsuchen Sie das Internet unter Wahrung ihrer Privatsphäre mit nur einem Fingerwisch.', 'metager.1' => 'Diese App bringt die volle Power unserer Suchmaschine auf ihr Smartphone. Durchsuchen Sie das Internet unter Wahrung ihrer Privatsphäre mit nur einem Fingerwisch.',
'metager.2' => 'Sie können die App für unsere Suche entweder über F-Droid oder den Google Playstore installieren, oder sie datengeschützt manuell von unserem Server auf ihrem Smartphone installieren.', 'metager.2' => 'Sie können die App für unsere Suche entweder über F-Droid oder den Google Playstore installieren, oder sie datengeschützt manuell von unserem Server auf ihrem Smartphone installieren.',
......
<?php <?php
return [ return [
'headline.1' => 'Ihre Spende für SUMA-EV und MetaGer', 'headline.1' => 'Ihre Spende',
'headline.2' => 'Mit Ihrer Spende unterstützen Sie den Erhalt und die Weiterentwicklung der unabhängigen Suchmaschine metager.de und die Arbeit des gemeinnützigen Trägervereins SUMA-EV. <a href=":aboutlink" rel="noopener" target=_blank>Mehr erfahren</a> und <a href=":beitrittlink" target="_blank" rel="noopener">Mitglied werden.</a>.', 'headline.2' => 'Mit Ihrer Spende unterstützen Sie den Erhalt und die Weiterentwicklung der unabhängigen Suchmaschine metager.de und die Arbeit des gemeinnützigen Trägervereins SUMA-EV. <a href=":aboutlink" rel="noopener" target=_blank>Mehr erfahren</a> und <a href=":beitrittlink" target="_blank" rel="noopener">Mitglied werden.</a>.',
'headline.3' => 'Welchen Betrag möchten Sie spenden?', 'headline.3' => 'Welchen Betrag möchten Sie spenden?',
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
return [ return [
"head.1" => "MetaGer Apps", "head.1" => "MetaGer Apps",
"disclaimer.1" => "At this time we only have an Android version of our App. Unfortunately Apple makes life difficult for us. Thank you for your understanding.", "disclaimer.1" => "At this time we only have an Android version of our App.",
"head.2" => "MetaGer App", "head.2" => "MetaGer App",
"metager.1" => "This App brings the full Metager power to your smartphone. Search the web with one touch while preserving your privacy.", "metager.1" => "This App brings the full Metager power to your smartphone. Search the web with one touch while preserving your privacy.",
"metager.2" => "There are two ways to get our App: install via the Google Playstore or (better for your privacy) get it directly from our server.", "metager.2" => "There are two ways to get our App: install via the Google Playstore or (better for your privacy) get it directly from our server.",
......
<?php <?php
return [ return [
"headline.1" => "Your Donation for MetaGer to SUMA-EV", "headline.1" => "Your Donation",
"headline.2" => 'With your donation: you support maintenance and development of the independent search engine metager.org and its supporting association SUMA-EV. <a href=":aboutlink" rel="noopener" target=_blank>Read more</a> and <a href=":beitrittlink" target="_blank" rel="noopener">become a member.</a>', "headline.2" => 'With your donation: you support maintenance and development of the independent search engine metager.org and its supporting association SUMA-EV. <a href=":aboutlink" rel="noopener" target=_blank>Read more</a> and <a href=":beitrittlink" target="_blank" rel="noopener">become a member.</a>',
'headline.3' => 'How much would you like to donate?', 'headline.3' => 'How much would you like to donate?',
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
return [ return [
"head.1" => "Aplicaciones MetaGer", "head.1" => "Aplicaciones MetaGer",
"disclaimer.1" => "Actualmente solo podemos proporcionar nuestras aplicaciones para dispositivos Android. Desafortunadamente, Apple nos lo pone demasiado difícil. Rogamos su comprensión.", "disclaimer.1" => "Actualmente solo podemos proporcionar nuestras aplicaciones para dispositivos Android.",
"head.2" => "Aplicación MetaGer", "head.2" => "Aplicación MetaGer",
"metager.1" => "Con esta aplicación, obtiene toda la potencia de nuestro motor de búsqueda en su smartphone.\r\nBusque en Internet con solo deslizar un dedo mientras que mantiene su privacidad.", "metager.1" => "Con esta aplicación, obtiene toda la potencia de nuestro motor de búsqueda en su smartphone.\r\nBusque en Internet con solo deslizar un dedo mientras que mantiene su privacidad.",
"metager.2" => "Puede instalar la aplicación para nuestra búsqueda a través de Google Playstore o instalarla manualmente desde nuestro servidor en su smartphone, protegida de datos.", "metager.2" => "Puede instalar la aplicación para nuestra búsqueda a través de Google Playstore o instalarla manualmente desde nuestro servidor en su smartphone, protegida de datos.",
......
<?php <?php
return [ return [
"headline.1" => "Su donación para SUME-EV y MetaGer", "headline.1" => "Su donación",
"headline.2" => "Con su donación, apoya el mantenimiento y desarrollo del motor de búsqueda independiente metager.de y la labor de la asociación patrocinadora sin fines de lucro SUMA-EV. \r\n<a href=\":aboutlink\" rel=\"noopener\" target=_blank>Obtenga más información</a> y <a href=\":beitrittlink\" target=\"_blank\" rel=\"noopener\"> conviértase en miembro. </a>.", "headline.2" => "Con su donación, apoya el mantenimiento y desarrollo del motor de búsqueda independiente metager.de y la labor de la asociación patrocinadora sin fines de lucro SUMA-EV. \r\n<a href=\":aboutlink\" rel=\"noopener\" target=_blank>Obtenga más información</a> y <a href=\":beitrittlink\" target=\"_blank\" rel=\"noopener\"> conviértase en miembro. </a>.",
"headline.3" => "¿Qué cantidad desea donar?", "headline.3" => "¿Qué cantidad desea donar?",
"headline.4" => "¿Con qué frecuencia desea donar?", "headline.4" => "¿Con qué frecuencia desea donar?",
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
@body-background-color-mobile: @background-color-mobile; @body-background-color-mobile: @background-color-mobile;
@a-hover-color: red; @a-hover-color: red;
html, body, * { html,
body,
* {
font-family: @metager-font; font-family: @metager-font;
} }
...@@ -36,7 +38,8 @@ body { ...@@ -36,7 +38,8 @@ body {
flex-direction: column; flex-direction: column;
margin: 0; margin: 0;
font-size: 1.0em; font-size: 1.0em;
@media(max-width: @screen-mobile){
@media(max-width: @screen-mobile) {
background-color: @body-background-color-mobile background-color: @body-background-color-mobile
} }
} }
...@@ -47,9 +50,15 @@ body { ...@@ -47,9 +50,15 @@ body {
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-top: 50px; margin-top: 5rem;
padding: 0px;
@media(min-width: @screen-mobile) {
padding: 0px 8px; padding: 0px 8px;
}
overflow: hidden; overflow: hidden;
main { main {
width: 100%; width: 100%;
max-width: 1000px; max-width: 1000px;
...@@ -64,15 +73,18 @@ body { ...@@ -64,15 +73,18 @@ body {
/* Scrollbox Style */ /* Scrollbox Style */
@scrollfade-color: white; @scrollfade-color: white;
.scrollbox { .scrollbox {
position: relative; position: relative;
width: 100%; width: 100%;
max-width: @results-width-max; max-width: @results-width-max;
.scrollfade-right { .scrollfade-right {
background: -webkit-gradient(linear, right top, left top, from(@scrollfade-color), color-stop(fade(@scrollfade-color, 80%)), to(fade(@scrollfade-color, 0%))); background: -webkit-gradient(linear, right top, left top, from(@scrollfade-color), color-stop(fade(@scrollfade-color, 80%)), to(fade(@scrollfade-color, 0%)));
background: linear-gradient(to left, @scrollfade-color, fade(@scrollfade-color, 80%), fade(@scrollfade-color, 0%)); background: linear-gradient(to left, @scrollfade-color, fade(@scrollfade-color, 80%), fade(@scrollfade-color, 0%));
right: 1px; right: 1px;
} }
.search-option-frame { .search-option-frame {
position: relative; position: relative;
} }
...@@ -81,13 +93,11 @@ body { ...@@ -81,13 +93,11 @@ body {
/* General font sizing */ /* General font sizing */
@default-font-size: 15px; @default-font-size: 15px;
.first-last-child-margin-fix() { .first-last-child-margin-fix() {
&:first-child { &:first-child {
margin-top: 0px; margin-top: 0px;
} }
&:last-child {
margin-bottom: 0px;
}
} }
h1 { h1 {
...@@ -105,7 +115,7 @@ h3 { ...@@ -105,7 +115,7 @@ h3 {
.first-last-child-margin-fix; .first-last-child-margin-fix;
} }
.static-page-header{ .static-page-header {
text-align: center; text-align: center;
} }
...@@ -137,9 +147,11 @@ body { ...@@ -137,9 +147,11 @@ body {
a { a {
font-size: 1em; font-size: 1em;
color: @link-color; color: @link-color;
&:visited { &:visited {
color: @link-color; color: @link-color;
} }
&:hover { &:hover {
text-decoration: none; text-decoration: none;
color: @a-hover-color; color: @a-hover-color;
...@@ -162,23 +174,28 @@ i.fa { ...@@ -162,23 +174,28 @@ i.fa {
#startpage-logo { #startpage-logo {
.logo; .logo;
border: 0;
display: flex; display: flex;
justify-content: center; justify-content: center;
margin: 0px 0px 45px 0px; margin: 0px 0px 45px 0px;
white-space: nowrap; white-space: nowrap;
text-align: center; text-align: center;
@media(max-width: @screen-mobile){
@media(max-width: @screen-mobile) {
margin-bottom: 25px; margin-bottom: 25px;
} }
&>a { &>a {
.logo; .logo;
display: block; display: block;
width: fit-content; width: fit-content;
text-decoration: none; text-decoration: none;
font-size: 2.7em; font-size: 2.7em;
@media(max-width: @screen-mobile) { @media(max-width: @screen-mobile) {
font-size: 2em; font-size: 2em;
} }
>img { >img {
width: 4.6em; width: 4.6em;
} }
...@@ -187,6 +204,7 @@ i.fa { ...@@ -187,6 +204,7 @@ i.fa {
#subpage-logo { #subpage-logo {
padding: 16px 0 5px 0px; padding: 16px 0 5px 0px;
.navbar-brand { .navbar-brand {
.noprint; .noprint;
line-height: 100% !important; line-height: 100% !important;
...@@ -197,10 +215,13 @@ i.fa { ...@@ -197,10 +215,13 @@ i.fa {
position: absolute; position: absolute;
z-index: 5; z-index: 5;
left: 10px; left: 10px;
h1 { h1 {
border: 0;
.logo; .logo;
font-size: 1.6em; font-size: 1.6em;
margin: 0; margin: 0;
>img { >img {
width: 4.8em; width: 4.8em;
} }
...@@ -211,6 +232,7 @@ i.fa { ...@@ -211,6 +232,7 @@ i.fa {
/* Links that look like text */ /* Links that look like text */
.mutelink { .mutelink {
&, &,
&:hover, &:hover,
&:active, &:active,
...@@ -224,21 +246,27 @@ i.fa { ...@@ -224,21 +246,27 @@ i.fa {
summary { summary {
cursor: pointer; cursor: pointer;
&::-webkit-details-marker { &::-webkit-details-marker {
display: none; display: none;
} }
&::-moz-details-marker { &::-moz-details-marker {
display: none; display: none;
} }
&::-ms-details-marker { &::-ms-details-marker {
display: none; display: none;
} }
&::-o-details-marker { &::-o-details-marker {
display: none; display: none;
} }
&::details-marker { &::details-marker {
display: none; display: none;
} }
&:focus { &:focus {
outline: none; outline: none;
} }
...@@ -252,11 +280,13 @@ summary { ...@@ -252,11 +280,13 @@ summary {
*[data-tooltip] { *[data-tooltip] {
position: relative; position: relative;
&:hover { &:hover {
&:after { &:after {
opacity: 1; opacity: 1;
} }