diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php index 9d2de525c9cd57c6bbaaf92e4476ebadd8b67912..ae0b4d9c162e37f4c0e451d187f7654b54b2411f 100644 --- a/app/Http/Controllers/MetaGerSearch.php +++ b/app/Http/Controllers/MetaGerSearch.php @@ -67,12 +67,6 @@ class MetaGerSearch extends Controller return response($responseContent); } - # Die Quicktips als Job erstellen - $quicktips = $metager->createQuicktips(); - if (!empty($timings)) { - $timings["createQuicktips"] = microtime(true) - $time; - } - # Suche für alle zu verwendenden Suchmaschinen als Job erstellen, # auf Ergebnisse warten und die Ergebnisse laden $metager->createSearchEngines($request, $timings); @@ -89,12 +83,6 @@ class MetaGerSearch extends Controller $timings["retrieveResults"] = microtime(true) - $time; } - # Versuchen die Ergebnisse der Quicktips zu laden - $quicktipResults = $quicktips->loadResults(); - if (!empty($timings)) { - $timings["loadResults"] = microtime(true) - $time; - } - # Alle Ergebnisse vor der Zusammenführung ranken: $metager->rankAll(); if (!empty($timings)) { @@ -121,7 +109,7 @@ class MetaGerSearch extends Controller } # Die Ausgabe erstellen: - $resultpage = $metager->createView($quicktipResults); + $resultpage = $metager->createView(); if ($spamEntry !== null) { Cache::put('spam.' . $metager->getFokus() . "." . md5($spamEntry), $resultpage->render(), 604800); } @@ -278,4 +266,12 @@ class MetaGerSearch extends Controller ->with('title', trans('tips.title')) ->with('tips', $tips); } + + public function quicktips($search) + { + $quicktips = new \App\Models\Quicktips\Quicktips($search); + return view('quicktips') + ->with('quicktips', $quicktips->getResults()) + ->with('search', $search); + } } diff --git a/app/MetaGer.php b/app/MetaGer.php index 495ce417e5c820cd36a2978957d764bc623e369a..ccfcd3520884c2dff6fb34dc14f9f2bbd77ac5a3 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -131,7 +131,7 @@ class MetaGer } # Erstellt aus den gesammelten Ergebnissen den View - public function createView($quicktipResults = []) + public function createView() { # Hiermit werden die evtl. ausgewählten SuMas extrahiert, damit die Input-Boxen richtig gesetzt werden können $focusPages = []; @@ -171,7 +171,7 @@ class MetaGer ->with('apiAuthorized', $this->apiAuthorized) ->with('metager', $this) ->with('browser', (new Agent())->browser()) - ->with('quicktips', $quicktipResults) + ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe])) ->with('focus', $this->fokus) ->with('resultcount', count($this->results)); } @@ -244,7 +244,7 @@ class MetaGer ->with('apiAuthorized', $this->apiAuthorized) ->with('metager', $this) ->with('browser', (new Agent())->browser()) - ->with('quicktips', $quicktipResults) + ->with('quicktips', action('MetaGerSearch@quicktips', ["search" => $this->eingabe])) ->with('resultcount', count($this->results)) ->with('focus', $this->fokus); break; @@ -464,13 +464,6 @@ class MetaGer } } - public function createQuicktips() - { - # Die quicktips werden als job erstellt und zur Abarbeitung freigegeben - $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime()); - return $quicktips; - } - /* * Die Erstellung der Suchmaschinen bis die Ergebnisse da sind mit Unterfunktionen */ diff --git a/app/Models/Quicktips/Quicktips.php b/app/Models/Quicktips/Quicktips.php index 06306dcde031b42f5b8b3f9cfd208d8e7a0f7680..1088e82cd777f49dd400e08e44f0dab80996ce8d 100644 --- a/app/Models/Quicktips/Quicktips.php +++ b/app/Models/Quicktips/Quicktips.php @@ -3,51 +3,42 @@ namespace App\Models\Quicktips; use Cache; -use Illuminate\Foundation\Bus\DispatchesJobs; -use Illuminate\Support\Facades\Redis; +use LaravelLocalization; use Log; class Quicktips { - use DispatchesJobs; private $quicktipUrl = "/1.1/quicktips.xml"; + private $results = []; const QUICKTIP_NAME = "quicktips"; const CACHE_DURATION = 60; private $hash; - public function __construct($search, $locale, $max_time) + public function __construct($search/*, $locale, $max_time*/) { + $locale = LaravelLocalization::getCurrentLocale(); if (env("APP_ENV") === "production") { $this->quicktipUrl = "https://quicktips.metager.de" . $this->quicktipUrl; } else { $this->quicktipUrl = "https://dev.quicktips.metager.de" . $this->quicktipUrl; } - $this->startSearch($search, $locale, $max_time); + $this->startSearch($search, $locale); } - public function startSearch($search, $locale, $max_time) + public function startSearch($search, $locale) { $url = $this->quicktipUrl . "?search=" . $this->normalize_search($search) . "&locale=" . $locale; $this->hash = md5($url); if (!Cache::has($this->hash)) { - - // Queue this search - $mission = [ - "resulthash" => $this->hash, - "url" => $url, - "username" => null, - "password" => null, - "headers" => [], - "cacheDuration" => self::CACHE_DURATION, - ]; - - $mission = json_encode($mission); - - Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission); + $results = file_get_contents($url); + Cache::put($this->hash, $results, Quicktips::CACHE_DURATION); + } else { + $results = Cache::get($this->hash); } + $this->results = $this->loadResults($results); } /** @@ -56,9 +47,8 @@ class Quicktips * 2. Parse the results * Returns an empty array if no results are found */ - public function loadResults() + public function loadResults($resultsRaw) { - $resultsRaw = $this->retrieveResults($this->hash); if ($resultsRaw) { $results = $this->parseResults($resultsRaw); return $results; @@ -175,4 +165,9 @@ class Quicktips { return urlencode($search); } + + public function getResults() + { + return $this->results; + } } diff --git a/config/session.php b/config/session.php index e2779ad8d00db247c45aa773888494bad79c46bc..e769fac0e564350ada90982fc87dff1e1470869f 100644 --- a/config/session.php +++ b/config/session.php @@ -14,7 +14,7 @@ return [ | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "array" | - */ + */ 'driver' => env('SESSION_DRIVER', 'file'), @@ -27,7 +27,7 @@ return [ | to be allowed to remain idle before it expires. If you want them | to immediately expire on the browser closing, set that option. | - */ + */ 'lifetime' => 120, @@ -42,9 +42,9 @@ return [ | should be encrypted before it is stored. All encryption will be run | automatically by Laravel and you can use the Session like normal. | - */ + */ - 'encrypt' => false, + 'encrypt' => true, /* |-------------------------------------------------------------------------- @@ -55,7 +55,7 @@ return [ | files may be stored. A default has been set for you but a different | location may be specified. This is only needed for file sessions. | - */ + */ 'files' => storage_path('framework/sessions'), @@ -68,7 +68,7 @@ return [ | connection that should be used to manage these sessions. This should | correspond to a connection in your database configuration options. | - */ + */ 'connection' => null, @@ -81,7 +81,7 @@ return [ | should use to manage the sessions. Of course, a sensible default is | provided for you; however, you are free to change this as needed. | - */ + */ 'table' => 'sessions', @@ -94,7 +94,7 @@ return [ | cache store that should be used for these sessions. This value must | correspond with one of the application's configured cache stores. | - */ + */ 'store' => null, @@ -107,7 +107,7 @@ return [ | rid of old sessions from storage. Here are the chances that it will | happen on a given request. By default, the odds are 2 out of 100. | - */ + */ 'lottery' => [2, 100], @@ -120,9 +120,9 @@ return [ | instance by ID. The name specified here will get used every time a | new session cookie is created by the framework for every driver. | - */ + */ - 'cookie' => 'laravel_session', + 'cookie' => 'mg_session', /* |-------------------------------------------------------------------------- @@ -133,7 +133,7 @@ return [ | be regarded as available. Typically, this will be the root path of | your application but you are free to change this when necessary. | - */ + */ 'path' => '/', @@ -146,7 +146,7 @@ return [ | in your application. This will determine which domains the cookie is | available to in your application. A sensible default has been set. | - */ + */ 'domain' => env('SESSION_DOMAIN', null), @@ -159,7 +159,7 @@ return [ | to the server if the browser has a HTTPS connection. This will keep | the cookie from being sent to you if it can not be done securely. | - */ + */ 'secure' => env('SESSION_SECURE_COOKIE', false), @@ -172,7 +172,7 @@ return [ | value of the cookie and the cookie will only be accessible through | the HTTP protocol. You are free to modify this option if needed. | - */ + */ 'http_only' => true, diff --git a/resources/js/result-saver.js b/resources/js/result-saver.js index 50706213d8f0945ac32dbf99b7721163360a4cdc..c4c6e113ecfe36e63953f26b1774aeedff24d47e 100644 --- a/resources/js/result-saver.js +++ b/resources/js/result-saver.js @@ -16,7 +16,7 @@ $(document).ready(function () { * Load all saved results and sort them * @param {String} sort The type of sorting function to call for these results */ -function Results () { +function Results() { if (!localStorage) return; this.prefix = 'result_'; this.sort = 'chronological'; @@ -29,8 +29,8 @@ function Results () { */ Results.prototype.addResult = function (result) { if (this.results.every(function (val) { - return val.hash !== result.hash; - })) { + return val.hash !== result.hash; + })) { this.results.push(result); } }; @@ -120,7 +120,7 @@ Results.prototype.updateResultPageInterface = function () { <h1>' + t('result-saver.title') + '</h1>\ </div>\ '); - $('#additions-container').append(tabPanel); + $('#additions-container').prepend(tabPanel); } else { // If there already is a savedFoki element, get it $('#savedFoki').html(''); @@ -178,7 +178,7 @@ Results.prototype.addToContainer = function (container) { if (html.toLowerCase().indexOf(search.toLowerCase()) === -1) { // hide entire result block $(value).parent().addClass('hidden'); - }else { + } else { // show entire result block $(value).parent().removeClass('hidden'); } @@ -218,7 +218,7 @@ Results.prototype.addToContainer = function (container) { * @param {int} rank The rank of this result * @param {int} hash The hash value for this result */ -function Result (title, link, hosterName, hosterLink, anzeigeLink, description, anonym, index, hash) { +function Result(title, link, hosterName, hosterLink, anzeigeLink, description, anonym, index, hash) { // Set prefix for localstorage this.prefix = 'result_'; @@ -313,7 +313,7 @@ Result.prototype.save = function () { * Convert a string into base64 format * @param {String} str The string to convert */ -function b64EncodeUnicode (str) { +function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { return String.fromCharCode('0x' + p1); })); @@ -323,7 +323,7 @@ function b64EncodeUnicode (str) { * Convert a base64 string into normal format * @param {String} str The string to convert */ -function b64DecodeUnicode (str) { +function b64DecodeUnicode(str) { return decodeURIComponent(Array.prototype.map.call(atob(str), function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); @@ -389,7 +389,7 @@ Result.prototype.toHtml = function () { </div>'); // Add a click listener to the remover, that removes the result on click - $(result).find('.remover').click({caller: this}, function (event) { + $(result).find('.remover').click({ caller: this }, function (event) { event.data.caller.remove(); }); @@ -400,7 +400,7 @@ Result.prototype.toHtml = function () { * Saves the result at the given index * @param {int} index The index of the result to save */ -function resultSaver (index) { +function resultSaver(index) { // Remember the original result element var original = $('.result[data-count=' + index + ']'); @@ -428,6 +428,6 @@ function resultSaver (index) { // Animate the result transfer to the saved results var transferTarget = $('.saved-result[data-count=' + index + ']'); if (original.length > 0 && transferTarget.length > 0) { - $(original).transfer({to: transferTarget, duration: 1000}); + $(original).transfer({ to: transferTarget, duration: 1000 }); } } diff --git a/resources/less/metager/pages/resultpage.less b/resources/less/metager/pages/resultpage.less index 90d190d8194ef13de6a44adfa4e7298318eb3968..a2a703ea1965582827ae6a5a7ecdf2f0dc31a7ca 100644 --- a/resources/less/metager/pages/resultpage.less +++ b/resources/less/metager/pages/resultpage.less @@ -1,6 +1,5 @@ @import "./resultpage/result-page.less"; @import "./resultpage/result.less"; @import "./resultpage/product.less"; -@import "./resultpage/quicktips.less"; @import "./resultpage/result-saver.less"; @import "./resultpage/keyboard-nav.less"; \ No newline at end of file diff --git a/resources/less/metager/pages/resultpage/quicktips.less b/resources/less/metager/pages/resultpage/quicktips.less index ff37db3800cb78e9755bc19513f8deff44643409..e8d5b918eb83ecb24ebd68ad8028a3f5a9c24072 100644 --- a/resources/less/metager/pages/resultpage/quicktips.less +++ b/resources/less/metager/pages/resultpage/quicktips.less @@ -1,11 +1,21 @@ /* Quicktips */ - +@import "../../variables.less"; +@import "../../general/cards.less"; +@import "../../general/general.less"; @quicktip-font-large: @result-font-large; @quicktip-font-medium: @result-font-medium; @quicktip-font-small: @result-font-small; #quicktips { display: flex; flex-direction: column; + margin: 0 8px; + background-color: inherit; + a { + text-decoration: none; + &:hover { + text-decoration: underline; + } + } .quicktip { .card-light; position: relative; @@ -15,7 +25,6 @@ } margin: 10px 0px; padding: 10px 10px 10px 10px; - width: 100%; border: 1px solid #ccc; background-color: white; details:not([open=""]) { @@ -24,6 +33,32 @@ } } .quicktip-summary { + display: block; + .btn { + display: inline-block; + margin-bottom: 0; + font-weight: 400; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-decoration: none; + &:hover { + text-decoration: underline; + } + } .quicktip-headline { width: 100%; display: flex; diff --git a/resources/less/metager/pages/resultpage/result-page.less b/resources/less/metager/pages/resultpage/result-page.less index 4a60c0fefdbb49728a9aaa68b07fb9a1580aafa7..2c3f9045edb9169c454a4189cae12fe0adce9eab 100644 --- a/resources/less/metager/pages/resultpage/result-page.less +++ b/resources/less/metager/pages/resultpage/result-page.less @@ -1,26 +1,5 @@ /* Variables */ -// Background color -@resultpage-background-color: @background-color; -// Margin to the left of the results -@results-margin-left: 16px; -// Min and max widths of the 2 resultpage columns -@results-width-min: 500px; -@results-width-max: 800px; -@additions-width-min: 500px; -@additions-width-max: 500px; -// Breakpoints for the 2 resultpage columns -@resultpage-breakpoint-max: (@results-width-max + @additions-width-max + @padding-small-default * 2 + @padding-small-default * 4 + 6); -@resultpage-breakpoint-min: (@results-width-min + @additions-width-min + @padding-small-default * 4); -@product-shop-color: green; -// The point upon which a .screen-large logo is displayed -@logo-size-breakpoint: (@results-width-min + @padding-small-default * 2); -// The point upon which the sidebar opener switches place -@sidebar-opener-breakpoint: (@results-width-max + @padding-small-default * 2 + 60px); -// Quicktip background color -@quicktip-background-color: @color-white; -// Color of the Spruch author -@spruch-author-color: @color-strong-grey; /* Styles */ #header-logo { @@ -400,6 +379,13 @@ a { #search-settings { display: none; } + #quicktips { + height: 100%; + iframe{ + height: 100%; + width: 100%; + } + } } footer { grid-area: footer; diff --git a/resources/less/metager/pages/resultpage/result.less b/resources/less/metager/pages/resultpage/result.less index 242f6f01320886a92118161cc72b19b1d428fa8f..eb42ae189ace4967a48dd030462389303458de84 100644 --- a/resources/less/metager/pages/resultpage/result.less +++ b/resources/less/metager/pages/resultpage/result.less @@ -1,9 +1,3 @@ -@result-font-large: 18px; -@result-font-medium: 16px; -@result-font-url: 14px; -@result-font-small: 12px; -@result-description-color: @color-black; -@result-image-border-color: @color-almost-white; .result { // Remove the margin from the first result because it already has margin from the grid ruleset diff --git a/resources/less/metager/variables.less b/resources/less/metager/variables.less index 11522db7220581b0c458ba9201ae4ed0a66dd955..2dc72d81cbf45c9c1b0acd986a092bdd592306d2 100644 --- a/resources/less/metager/variables.less +++ b/resources/less/metager/variables.less @@ -1,5 +1,5 @@ // MetaGer Brand Color -@metager-orange: #FF8000; +@metager-orange: #FF8000; // Shades of Gray @color-white: white; @color-almost-white: mix(@color-white, @color-black, 90%); @@ -27,4 +27,33 @@ sans-serif; // Screen sizes @screen-mobile: 760px; @screen-small: 1000px; -@screen-medium: 1200px; \ No newline at end of file +@screen-medium: 1200px; + +@result-font-large: 18px; +@result-font-medium: 16px; +@result-font-url: 14px; +@result-font-small: 12px; +@result-description-color: @color-black; +@result-image-border-color: @color-almost-white; + +// Background color +@resultpage-background-color: @background-color; +// Margin to the left of the results +@results-margin-left: 16px; +// Min and max widths of the 2 resultpage columns +@results-width-min: 500px; +@results-width-max: 800px; +@additions-width-min: 500px; +@additions-width-max: 500px; +// Breakpoints for the 2 resultpage columns +@resultpage-breakpoint-max: (@results-width-max + @additions-width-max + @padding-small-default * 2 + @padding-small-default * 4 + 6); +@resultpage-breakpoint-min: (@results-width-min + @additions-width-min + @padding-small-default * 4); +@product-shop-color: green; +// The point upon which a .screen-large logo is displayed +@logo-size-breakpoint: (@results-width-min + @padding-small-default * 2); +// The point upon which the sidebar opener switches place +@sidebar-opener-breakpoint: (@results-width-max + @padding-small-default * 2 + 60px); +// Quicktip background color +@quicktip-background-color: @color-white; +// Color of the Spruch author +@spruch-author-color: @color-strong-grey; \ No newline at end of file diff --git a/resources/views/layouts/researchandtabs.blade.php b/resources/views/layouts/researchandtabs.blade.php index 8ec665cc5eea2909a517208e0ef11b78c3e7694e..9e9596e0cc281bb673cf0a82750fbd6df5e41859 100644 --- a/resources/views/layouts/researchandtabs.blade.php +++ b/resources/views/layouts/researchandtabs.blade.php @@ -36,7 +36,7 @@ @include('layouts.keyboardNavBox') @if( $metager->showQuicktips() ) <div id="quicktips"> - @include('quicktips', ['quicktips', $quicktips]) + <iframe src="{{ $quicktips }}" frameborder="0"></iframe> </div> @endif </div> diff --git a/resources/views/quicktips.blade.php b/resources/views/quicktips.blade.php index f354bda8b7ff7dadefffc7704e3bf4325b39b28b..6fa679cf65fd25ab3e02af788260f55783900250 100644 --- a/resources/views/quicktips.blade.php +++ b/resources/views/quicktips.blade.php @@ -1,5 +1,19 @@ +<!DOCTYPE html> +<html lang="{{ LaravelLocalization::getCurrentLocale() }}"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>{{ $search }} - MetaGer Quicktips</title> + <link type="text/css" rel="stylesheet" href="{{ mix('css/quicktips.css') }}" /> + <link href="/fonts/liberationsans/stylesheet.css" rel="stylesheet"> + <link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome.css') }}" /> + <link type="text/css" rel="stylesheet" href="{{ mix('css/fontawesome-solid.css') }}" /> +</head> +<body id="quicktips"> @foreach($quicktips as $quicktip) <div class="quicktip" type="{{ $quicktip->type }}"> @include('parts.quicktip', ['quicktip' => $quicktip]) </div> -@endforeach \ No newline at end of file +@endforeach +</body> +</html> diff --git a/resources/views/widget/sitesearch.blade.php b/resources/views/widget/sitesearch.blade.php index c01d9b756adf349bfb869d4e05e17cd195ffa4cb..811a474f436171811260c363dd5cbccc3ce29795 100644 --- a/resources/views/widget/sitesearch.blade.php +++ b/resources/views/widget/sitesearch.blade.php @@ -28,7 +28,7 @@ </div> <h2>{{ trans('sitesearch.generated.5') }} <button id="copyButton" class="btn btn-default" type="button"><i class="fa fa-paperclip" aria-hidden="true"></i> {{ trans('websearch.head.copy') }}</button></h2> <textarea id="codesnippet" readonly style="width:100%;height:500px"> - <form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}/meta/meta.ger3" method="get" accept-charset="UTF-8"> + <form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}meta/meta.ger3" method="get" accept-charset="UTF-8"> <style type="text/css" scoped> .metager-searchinput { height: 30px; diff --git a/resources/views/widget/websearch.blade.php b/resources/views/widget/websearch.blade.php index 13ced28619221568ed7e60be694bc43e69f82e6d..09e73017ea5a746e351c81272423d1ffd4b037dc 100644 --- a/resources/views/widget/websearch.blade.php +++ b/resources/views/widget/websearch.blade.php @@ -7,7 +7,7 @@ <h1>{{ trans('websearch.head.1') }}</h1> <p>{{ trans('websearch.head.2') }}</p> <h2>{{ trans('websearch.head.3') }}</h2> - <form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}/meta/meta.ger3" method="GET" accept-charset="UTF-8" > + <form class="metager-searchform" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}meta/meta.ger3" method="GET" accept-charset="UTF-8" > <a href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/") }}"><img class="metager-logo" title="{{ trans('websearch.head.4') }}" alt="MetaGer" src="data:image/png;base64, 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"></a> <input class="metager-searchinput" name="eingabe" placeholder="{{ trans('websearch.head.5') }}" required=""> <input type="hidden" name="lang" value="{{ trans('websearch.head.6') }}"> diff --git a/routes/web.php b/routes/web.php index 16b658253b881a5d38385eea7c4137c440d95e78..7f6093e491b6413cc4604a2ddaa2f24f81126fb5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -196,7 +196,7 @@ Route::group( Route::get('pluginClose', 'LogController@pluginClose'); Route::get('pluginInstall', 'LogController@pluginInstall'); - Route::get('qt', 'MetaGerSearch@quicktips'); + Route::get('qt/{eingabe}', 'MetaGerSearch@quicktips'); Route::get('tips', 'MetaGerSearch@tips'); Route::get('/plugins/opensearch.xml', 'StartpageController@loadPlugin'); Route::get('owi', function () { diff --git a/webpack.mix.js b/webpack.mix.js index 573059346677b6f5738dc299cbc260fa310a51df..882de714d88b6a8ccde46693c544762dd324ada1 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -22,6 +22,9 @@ mix .less("resources/less/metager/metager.less", "public/css/themes/metager.css", { strictMath: true }) + .less("resources/less/metager/pages/resultpage/quicktips.less", "public/css/quicktips.css", { + strictMath: true + }) .less("resources/less/font-awesome/fontawesome.less", "public/css/fontawesome.css", { strictMath: true }) @@ -34,8 +37,8 @@ mix .less( "resources/less/metager/pages/key.less", "public/css/key.css", { - strictMath: true - } + strictMath: true + } ) .less("resources/less/utility.less", "public/css/utility.css", { strictMath: true