From a0f2a7a82fa0993caef4a4cf1d189b359717b8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Michael=20O=2E=20Hegg=C3=B8?= Date: Wed, 29 Jan 2020 21:49:11 +0100 Subject: [PATCH] Improve CKEditor config - Add toolbar save button, so you can easily save while working - Add image uploading - Improve styles, use PT Sans - Drop IE 11 support, since CKEditor 5 officially do not support it --- .babelrc | 6 +- app/Http/Controllers/PageController.php | 68 ++ app/Http/Kernel.php | 2 +- app/Providers/RouteServiceProvider.php | 3 +- composer.json | 3 + config/app.php | 1 + config/filesystems.php | 2 +- config/image.php | 20 + docker/Dockerfile | 15 +- package-lock.json | 858 ++++++++++++++++-- package.json | 38 +- public/uploads | 1 + resources/js/app.js | 9 +- resources/js/bootstrap.js | 1 + resources/js/components/PageEditor.vue | 173 +++- resources/js/components/SaveButton.js | 78 ++ resources/sass/app.sass | 53 ++ resources/sass/ckeditor-content-styles.css | 302 ++++++ resources/views/layout.blade.php | 11 + .../views/litteraturkritikk/index.blade.php | 2 +- resources/views/pages/edit.blade.php | 12 +- resources/views/pages/show.blade.php | 5 +- routes/web.php | 2 +- storage/app/.gitignore | 3 +- storage/app/public/.gitignore | 2 + webpack.mix.js | 73 +- 26 files changed, 1641 insertions(+), 102 deletions(-) create mode 100644 config/image.php create mode 120000 public/uploads create mode 100644 resources/js/components/SaveButton.js create mode 100644 resources/sass/ckeditor-content-styles.css create mode 100644 storage/app/public/.gitignore diff --git a/.babelrc b/.babelrc index ec664213..0451390b 100644 --- a/.babelrc +++ b/.babelrc @@ -8,12 +8,10 @@ { "debug": true, "modules": false, - "forceAllTransforms": true, + "forceAllTransforms": false, "useBuiltIns": "entry", "corejs": "3", - "targets": { - "ie": "11" - } + "targets": "last 4 Chrome versions, last 4 Firefox versions, last 4 Edge versions, last 2 Safari versions" } ] ] diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 95041873..7fd78070 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -3,7 +3,11 @@ namespace App\Http\Controllers; use App\Page; +use Illuminate\Filesystem\FilesystemManager; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Str; +use Intervention\Image\ImageManager; class PageController extends Controller { @@ -94,6 +98,70 @@ public function update(Request $request, Page $page) ->with('status', 'Siden ble lagret.'); } + protected function storeThumb(FilesystemManager $fm, ImageManager $im, $file, $maxWidth, $maxHeight, $filename) { + $blob = $im->make($file->path()) + ->resize($maxWidth, $maxHeight, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + }) + ->encode(null, 85); + + $fm->disk('public')->put($filename, $blob); + } + + /** + * Store a new image uploaded from CKEditor. + * + * @param Request $request + * @param FilesystemManager $fm + * @return JsonResponse + */ + public function uploadImage(Request $request, FilesystemManager $fm, ImageManager $im) + { + $user = \Auth::user(); + if (!count($user->rights)) { + return response()->json(['Error' => 'Permission denied, no write access to any base.'], 401); + } + + $file = $request->file('upload'); + $basename = Str::random(40); + $ext = '.' . $file->extension(); + $filename = "{$basename}{$ext}"; + + $publicPath = 'uploads/'; + + if ($ext === '.gif') { + // Don't generate thumbs + $fm->disk('public')->putFileAs('.', $file, $filename); + + $url = asset($publicPath . $filename); + $this->log("Lastet opp bilde: " . basename($url) . ""); + + return response()->json([ + 'url' => $url, + ]); + } + + $thumbSizes = ['1200', '600', '300']; + + $this->storeThumb($fm, $im, $file, 1920, null, $filename); + $urls = [ + 'default' => asset($publicPath . $filename), + ]; + foreach ($thumbSizes as $width) { + $thumb_filename = $basename . '_' . $width . $ext; + $this->storeThumb($fm, $im, $file, $width, null, "{$basename}_{$width}{$ext}"); + $urls[$width] = asset("{$publicPath}{$basename}_{$width}{$ext}"); + } + + $url = $urls['default']; + $this->log("Lastet opp bilde: " . basename($url) . ""); + + return response()->json([ + 'urls' => $urls, + ]); + } + /** * Remove the specified resource from storage. * diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 3e05aa2d..7c693f30 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -70,7 +70,7 @@ class Kernel extends HttpKernel 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'secure.content' => \Stevenmaguire\Laravel\Http\Middleware\EnforceContentSecurity::class, - 'admin' => \App\Http\Middleware\Login::class, + 'login' => \App\Http\Middleware\Login::class, 'checklang' => \App\Http\Middleware\CheckLang::class, ]; diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index f0b46439..3bf16d17 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -160,10 +160,11 @@ protected function mapDynamicRoutes() Route::middleware('web') ->namespace($this->namespace) ->group(function () { - Route::middleware('admin') + Route::middleware('login') ->group(function () { Route::get('{page}/edit', 'PageController@edit'); Route::post('{page}/update', 'PageController@update'); + Route::post('upload-image', 'PageController@uploadImage'); }); Route::get('{page}', 'PageController@show'); }); diff --git a/composer.json b/composer.json index 01d7504c..78d99e35 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "type": "project", "require": { "php": ">=7.2", + "ext-gd": "*", "ext-json": "*", "ext-pdo": "*", "ext-pdo_pgsql": "*", @@ -14,6 +15,8 @@ "doctrine/dbal": "~2.9", "fideloper/proxy": "^4.0", "http-interop/http-factory-guzzle": "^1.0", + "intervention/image": "^2.5", + "jenssegers/agent": "^2.6", "laravel/framework": "6.5.*", "laravel/tinker": "^1.0", "laravelcollective/html": "~6.0", diff --git a/config/app.php b/config/app.php index 3018d0b0..f80a6583 100644 --- a/config/app.php +++ b/config/app.php @@ -167,6 +167,7 @@ */ Collective\Html\HtmlServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class, + Intervention\Image\ImageServiceProvider::class, /* * Application Service Providers... diff --git a/config/filesystems.php b/config/filesystems.php index 443f2934..ff77a502 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,7 +13,7 @@ | */ - 'default' => env('FILESYSTEM_DRIVER', 'local'), + 'default' => env('FILESYSTEM_DRIVER', 'public'), /* |-------------------------------------------------------------------------- diff --git a/config/image.php b/config/image.php new file mode 100644 index 00000000..2b1d2c3e --- /dev/null +++ b/config/image.php @@ -0,0 +1,20 @@ + 'gd' + +]; diff --git a/docker/Dockerfile b/docker/Dockerfile index bff10317..c47eee97 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -16,11 +16,24 @@ RUN apt-get update \ && apt-get install -y libpq-dev \ && docker-php-ext-install pdo pdo_pgsql +# RUN apt-get update \ +# && apt-get install -y libvips-dev \ +# && pecl install vips \ +# && docker-php-ext-enable vips + +RUN apt-get update && apt-get install -y \ + libjpeg62-turbo-dev \ + libpng-dev \ + && docker-php-ext-configure gd --with-jpeg \ + && docker-php-ext-install -j$(nproc) gd + RUN a2enmod rewrite ssl headers RUN a2dissite 000-default RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \ - && sed -i "s/memory_limit = 128M/memory_limit = 348M/" "$PHP_INI_DIR/php.ini" + && sed -i "s/memory_limit = .*/memory_limit = 512M/" "$PHP_INI_DIR/php.ini" \ + && sed -i "s/post_max_size = .*/post_max_size = 128M/" "$PHP_INI_DIR/php.ini" \ + && sed -i "s/upload_max_filesize = .*/upload_max_filesize = 128M/" "$PHP_INI_DIR/php.ini" RUN mkdir -p \ ./storage/app \ diff --git a/package-lock.json b/package-lock.json index f566b646..704f4ab9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -789,16 +789,515 @@ "to-fast-properties": "^2.0.0" } }, - "@ckeditor/ckeditor5-build-classic": { + "@ckeditor/ckeditor-cloud-services-core": { "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-16.0.0.tgz", - "integrity": "sha512-gBfZqWg3hmCvhq6/wX5UJp4qwl6gB+NJPpOkya2Y3jWKA0HKf3UdlhIvaHq7dRaqhi4unmqaJZVEk5VpZ1vDOg==" + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor-cloud-services-core/-/ckeditor-cloud-services-core-16.0.0.tgz", + "integrity": "sha512-xiPaeXNGm5wAtW1v4gbkUP7RBdaw/bekcBZcIdhPkftOsLsjInXeOD7p4KMKuFLJYDaYB3vmaj+1G+XDKiGtdA==", + "requires": { + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-adapter-ckfinder": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-16.0.0.tgz", + "integrity": "sha512-B1xRa6TWJ62wTFLZ9tNbeGFPKDmhvNrnzczjLbomfvKu70dZoCRl4SHA593IWpIgjNXEcAtlVRryQQeNRMtZzw==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-upload": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-alignment": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-16.0.0.tgz", + "integrity": "sha512-yf04et0jSZ4Khhzl/t3GXLbsNMTH0qnyvcDDyIXm8Tu4Qec6c6h2xeCWBNp9cz0gab/91bYFtWReKd/swztMtg==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-autoformat": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-16.0.0.tgz", + "integrity": "sha512-/x65PH7TfGs+xmpN1jvxH1BxkjT3/Zjjf6nZiu4CTRD7tbzVfTqsWY+lDoSbS0BID1y4Q4/uw+9E21f+UnNLjg==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-typing": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-basic-styles": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-16.0.0.tgz", + "integrity": "sha512-SArVUT28+AjS3kHI6473nDd+L28ZMW7kGIYk4uN6dyOiyb5jBw4Bn/U+dEjHYagWHDtXopKtH4l8ljJPyBmluw==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-block-quote": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-16.0.0.tgz", + "integrity": "sha512-eFLqSC5atCbljfPDbrBOFOQkmaqxaYUsViGlRO0J/kTtEh3fs+FLYaePsxRpnKV8ZX0qymZj4HLjk4VEnq3VXA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-clipboard": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-16.0.0.tgz", + "integrity": "sha512-xI7ColnPUQfTP7RQsXAtzFVAtdEnv+6bD4zUeb0ZgQde91DX4z0EFC//VVWpOwlb+rC+BcgVyn3qUCQczzvmEA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-cloud-services": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-16.0.0.tgz", + "integrity": "sha512-RH+2p1Zyy2Jp0ZJThfe6PV7jNRKqvjihEe71j0pT6WgX+PrXPILBOS750HOMwFvKAEqWS2a9XPx+R01al3HRUw==", + "requires": { + "@ckeditor/ckeditor-cloud-services-core": "^16.0.0", + "@ckeditor/ckeditor5-core": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-core": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-16.0.0.tgz", + "integrity": "sha512-JKYnoXgfULjfAGRgVmf9/at3gGikfzKwGp4O8RpE3NYGeb/xH6hSgj2mUE9QwqyAY5at1QLnio5ZvU2HiWL4pA==", + "requires": { + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-dev-utils": { + "version": "12.0.7", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-utils/-/ckeditor5-dev-utils-12.0.7.tgz", + "integrity": "sha512-kH0Fc3zw7kME12tB2D+5RxnWzzy2xqiKoq79dSwwbBgd7Y1v/y1cXsv02jYz0N0eO0259pK3Ignj90SM8MDJ1g==", + "requires": { + "acorn": "^6.2.1", + "acorn-walk": "^6.2.0", + "chalk": "^3.0.0", + "cssnano": "^4.0.0", + "del": "^5.0.0", + "escodegen": "^1.9.0", + "fs-extra": "^8.1.0", + "javascript-stringify": "^1.6.0", + "pofile": "^1.0.9", + "postcss": "^7.0.17", + "postcss-import": "^12.0.0", + "postcss-mixins": "^6.2.0", + "postcss-nesting": "^7.0.0", + "shelljs": "^0.8.1", + "through2": "^3.0.1" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", + "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "rimraf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.1.tgz", + "integrity": "sha512-IQ4ikL8SjBiEDZfk+DFVwqRK8md24RWMEJkdSlgNLkyyAImcjf8SWvU1qFMDOb4igBClbTQ/ugPqXcRwdFTxZw==", + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@ckeditor/ckeditor5-dev-webpack-plugin": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-dev-webpack-plugin/-/ckeditor5-dev-webpack-plugin-8.0.7.tgz", + "integrity": "sha512-w5fKC95W4aVJ5pm6r+sUwp3t2Qsm1tkALXDt5oGcbXRzTqmGoLsGxj284FESI40oA/ProgZ34UKXVosWjKJ6Ug==", + "dev": true, + "requires": { + "@ckeditor/ckeditor5-dev-utils": "^12.0.7", + "chalk": "^3.0.0", + "rimraf": "^2.6.2", + "webpack-sources": "^1.1.0" + } + }, + "@ckeditor/ckeditor5-easy-image": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-16.0.0.tgz", + "integrity": "sha512-DiK2e1hELuDWFTfTv0lFrYM5B+b4gIskWH+QcFzgHOHOyvUsh3TuGTMerdt3wWuv0vWXcSmnwQRUosUUiStinw==", + "requires": { + "@ckeditor/ckeditor-cloud-services-core": "^16.0.0", + "@ckeditor/ckeditor5-cloud-services": "^16.0.0", + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-image": "^16.0.0", + "@ckeditor/ckeditor5-upload": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-editor-classic": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-16.0.0.tgz", + "integrity": "sha512-HWESg+b99ECobhb1RIMsCLvqcVyxj/xXI/5HkjEzyHfOO8hiq7u7ZsbHAvmTTxb55ty9Pz7orT7N5ifHGdRClA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-engine": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-16.0.0.tgz", + "integrity": "sha512-2p0DT/1B+UyVAwNkkaNaG4wGkrR0TNQuPJ1c5TEMWb9NVk3mhIOJ+6lPVl0ApP3tmMALol+pLmXLX5aht6Ewnw==", + "requires": { + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-enter": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-16.0.0.tgz", + "integrity": "sha512-LZjXu4RMpFFU7zudggTO/bfHtQEz7pYN1zYr/amDTR2zwsQs0jlTSh2UFtJHz4bVM10KliYKqUYcC1w97d9Qow==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-essentials": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-16.0.0.tgz", + "integrity": "sha512-9vKVVNAF3FKlipDSuFKjaSfHT+fQB2f1+qQTFT2MM44YnLYaZPQVbVn14lKm44okZAvil5R3t4QDzJuUxhvl7Q==", + "requires": { + "@ckeditor/ckeditor5-clipboard": "^16.0.0", + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-enter": "^16.0.0", + "@ckeditor/ckeditor5-typing": "^16.0.0", + "@ckeditor/ckeditor5-undo": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-heading": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-16.0.0.tgz", + "integrity": "sha512-E+fNej/rHE2gp8IT48hQGaWBmH10uR//f9dVooZkgJmXjJaPId/hhyDWRuSXYcG11AYRcQSS9aN5U7R0/k80wg==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-paragraph": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-highlight": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-16.0.0.tgz", + "integrity": "sha512-2XQ4PJXDIitO+yJrlt/Nq6zBgMn5s9yOseBBaMaKfoq1GbOpzmpttCOcjaOr679t5Q6H1iWPjMOTArRyJxpl1A==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-image": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-16.0.0.tgz", + "integrity": "sha512-voZYJk4guGPk47W0IhTOKAqtn8DTX5+q2yLS/HzjbCOTcfCASoeCCbbzxIEv0ozXSTlxB9QpXYZuFaQSjpvMbg==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-upload": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "@ckeditor/ckeditor5-widget": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-indent": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-16.0.0.tgz", + "integrity": "sha512-m3/gMenxqH5Sq1n4ongzchi8t7ah3sp2ag/QtiveaezaIlyobkjKG0StyDEN+xDdRjgxMJLhGjoNs0/nb76+xA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-link": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-16.0.0.tgz", + "integrity": "sha512-w+TTQSItGrXLknfV31d90pV4mqLhxxNkViEfedQcwQlvx5BpjRYRvgaVjQXRFPVv38V72PtxLjuYfJQT8bZjAA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-list": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-16.0.0.tgz", + "integrity": "sha512-olWQvGJnA9R1/t5k9p+Kc5msQgkLPW7cXBfUq5xSjD71pFFKB+g+emPujsaLqFsfTPtG/MwlcgFGXTQt9mOHDQ==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-paragraph": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-paragraph": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-16.0.0.tgz", + "integrity": "sha512-+dDU3nYsENuwmWTTtKL1Fwa7alpKXJUc3Xq37eY4xll0ZRNYbLicno2yRRr7q4UfI+mSDdHDzh33PKBb4OxHWQ==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-paste-from-office": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-16.0.0.tgz", + "integrity": "sha512-fuLZLj8Wg9iIusSQUM7liJZ+OOdqQ/GvnsRHm7MIwXqiL6SPzN/NsZR4L6Nulxm/fKvx0SSUXYgrQ0mStndQfw==", + "requires": { + "@ckeditor/ckeditor5-clipboard": "^16.0.0", + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-table": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-16.0.0.tgz", + "integrity": "sha512-DtQ9sQMEeXvuxIGTp2F+mKuB6pe3gpoXfxU5qtzhgAB+5unJ0IGP/fxmNNNabYjC2Icq39HU2KBc35WdaqoDjA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-widget": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-theme-lark": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-16.0.0.tgz", + "integrity": "sha512-dwSvjDavf1AGTraSRk1mgutXTfn+HGHONKMaR8jwBxg/gGcPtXHfEkFqTSB4lX4EG2egumrv272lZSOlS6rTjQ==", + "requires": { + "@ckeditor/ckeditor5-ui": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-typing": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-16.0.0.tgz", + "integrity": "sha512-e5cVTRta9/m0To+Eenv1rTjU4bnMSxyqhA+ha06FUKUDLAtMLCliV5SpsUj+ACuCVbIM6fkzY58rANeDX0FKYQ==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-16.0.0.tgz", + "integrity": "sha512-7mwIRajaN9Mf6S5ZkqWAOt/Rqy6GNS3WxhwaayMym7b1XI4oVIrxEKoun3DoKnKp3bTBMcWdQFJfsRvja2X2hA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, + "@ckeditor/ckeditor5-undo": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-16.0.0.tgz", + "integrity": "sha512-29vQR3hj/XIR5LuG8qgblXtTRe6sL0GDeag8/XvRHPZUA3k7AplD1IoDq5DHepw537CDTsuJzYL1ZiFdUlyIZw==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-upload": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-16.0.0.tgz", + "integrity": "sha512-GjOENKi53TLeV0+zRIuPabMchDTeOMcgTwV4I0VKHrEbPY4YmVbdoz3BO8KpGhA9/KK7se/JR59yHTviPgbFNA==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-16.0.0.tgz", + "integrity": "sha512-EMrKmVmxfyuttGlbZI0eK7stYigbo2kFCasN0m2apg/Pn4Dwil0pennWuJ964zvZ8te1Pyt33cweQZlYzSqvYQ==", + "requires": { + "lodash-es": "^4.17.10" + } }, "@ckeditor/ckeditor5-vue": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-vue/-/ckeditor5-vue-1.0.1.tgz", "integrity": "sha512-4MaQwZ04cWwqYW0732sg2aqx9ILeHIP0LSLKUuLCLR21qYONZPvxY/V/czh1DH99toaL/iwPvEoJtO2ldriPaA==" }, + "@ckeditor/ckeditor5-widget": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-16.0.0.tgz", + "integrity": "sha512-QZMRRJMAZnD3TtrobcwW/6XBQDk9RslIVux08y5YaALNtwKhTNADzB0FljDjANa+BbVQSV/z9AtGpGpSwCSY9w==", + "requires": { + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-engine": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-utils": "^16.0.0", + "lodash-es": "^4.17.10" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -808,11 +1307,41 @@ "glob-to-regexp": "^0.3.0" } }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + } + } + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@openfonts/pt-sans_all": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@openfonts/pt-sans_all/-/pt-sans_all-1.44.0.tgz", + "integrity": "sha512-k6AzpJX6U+TBRvkU1peT6R1ZQ9f0QSqaXtCIHLCj0DBa9goOTWfjD3Eh7LfbSPlqUmgjbEDX/3p4rQdSMpdWpg==" + }, "@sentry/browser": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.11.1.tgz", @@ -886,6 +1415,12 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@testim/chrome-version": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.0.6.tgz", + "integrity": "sha512-sudmtuzBC6MduzAZe3dzc8Ehhtr0Wk/nDjCDBOWsZ5noSLBsdUED+NLuq2eUHHDb5B0FqXwTitAzoLoVZNQUeg==", + "dev": true + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", @@ -895,8 +1430,7 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/events": { "version": "3.0.0", @@ -1843,6 +2377,22 @@ "es6-promisify": "^5.0.0" } }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + } + } + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -2222,9 +2772,9 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autocomplete.js": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.0.tgz", - "integrity": "sha512-MxYfNb89sl7IRhNdEJv6z8dSfA7lVeU7Dk6m/+/ih0/tPLsbxIM7uPVsnWEUh4j7dFqJktlM7hCeU7jmx6VC8A==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.1.tgz", + "integrity": "sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ==", "requires": { "immediate": "^3.2.3" } @@ -2445,6 +2995,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, "requires": { "bluebird": "^3.5.5", "check-types": "^8.0.3", @@ -3265,6 +3816,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, "camelcase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz", @@ -3344,7 +3900,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3354,7 +3909,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -3364,7 +3918,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -3372,20 +3925,17 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -3438,7 +3988,8 @@ "check-types": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true }, "chokidar": { "version": "2.1.8", @@ -3473,11 +4024,12 @@ } }, "chromedriver": { - "version": "79.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-79.0.0.tgz", - "integrity": "sha512-DO29C7ntJfzu6q1vuoWwCON8E9x5xzopt7Q41A7Dr7hBKcdNpGw1l9DTt9b+l1qviOWiJLGsD+jHw21ptEHubA==", + "version": "79.0.2", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-79.0.2.tgz", + "integrity": "sha512-jwgmcTb4UI2cqDAyJBJlGJ/Y6kRVO1VQ3sBw73fFz0TEqKSZfl61ToM53g+G8m5AWVa4ESFkSXEUfQtFZZ6QTA==", "dev": true, "requires": { + "@testim/chrome-version": "^1.0.3", "del": "^4.1.1", "extract-zip": "^1.6.7", "mkdirp": "^0.5.1", @@ -3530,6 +4082,11 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -4647,8 +5204,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "2.2.1", @@ -4965,7 +5521,8 @@ "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true }, "duplexer3": { "version": "0.1.4", @@ -5020,7 +5577,8 @@ "ejs": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true }, "electron-to-chromium": { "version": "1.3.322", @@ -5205,6 +5763,31 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", + "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "eslint": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", @@ -6297,14 +6880,21 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" }, + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "requires": { + "reusify": "^1.0.0" + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6417,7 +7007,8 @@ "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true }, "fill-range": { "version": "4.0.0", @@ -7445,6 +8036,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" @@ -7610,7 +8202,8 @@ "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true }, "hosted-git-info": { "version": "2.8.5", @@ -8648,6 +9241,11 @@ "is-object": "^1.0.1" } }, + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=" + }, "jpegtran-bin": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-4.0.0.tgz", @@ -8858,6 +9456,27 @@ "webpack-merge": "^4.1.0", "webpack-notifier": "^1.5.1", "yargs": "^12.0.5" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + } } }, "laravel-mix-imagemin": { @@ -8909,7 +9528,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -8984,6 +9602,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -13193,7 +13816,8 @@ "opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true }, "openseadragon": { "version": "2.4.1", @@ -13237,7 +13861,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -13600,8 +14223,7 @@ "picomatch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" }, "pify": { "version": "4.0.1", @@ -13707,6 +14329,11 @@ } } }, + "pofile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.0.tgz", + "integrity": "sha512-6XYcNkXWGiJ2CVXogTP7uJ6ZXQCldYLZc16wgRp8tqRaBTTyIfF+TUT3EQJPXTLAT7OTPpTAoaFdoXKfaTRU1w==" + }, "popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", @@ -13872,6 +14499,33 @@ "postcss": "^7.0.0" } }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, "postcss-load-config": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", @@ -14024,6 +14678,18 @@ } } }, + "postcss-mixins": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-6.2.3.tgz", + "integrity": "sha512-gfH5d09YilzDn/CLGFA9Lwv7GTezuyHgnAyXC8AfvhUMpl67ZTewhcpNuOgawClCOD+76XePE2IHO1xMgsOlvA==", + "requires": { + "globby": "^8.0.1", + "postcss": "^7.0.21", + "postcss-js": "^2.0.3", + "postcss-simple-vars": "^5.0.2", + "sugarss": "^2.0.0" + } + }, "postcss-modules-extract-imports": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", @@ -14167,6 +14833,14 @@ } } }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, "postcss-normalize-charset": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", @@ -14376,6 +15050,14 @@ } } }, + "postcss-simple-vars": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz", + "integrity": "sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg==", + "requires": { + "postcss": "^7.0.14" + } + }, "postcss-svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", @@ -14412,8 +15094,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", @@ -14616,6 +15297,41 @@ } } }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -14712,6 +15428,14 @@ "source-map": "~0.5.0" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -15068,6 +15792,11 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rework": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", @@ -15131,6 +15860,11 @@ "is-promise": "^2.1.0" } }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -15671,6 +16405,16 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -16314,22 +17058,21 @@ } }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" }, "dependencies": { "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" } } } @@ -16362,6 +17105,14 @@ "integrity": "sha1-zFgjFkag7xEC95R47zqSSP2chC8=", "dev": true }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "requires": { + "postcss": "^7.0.2" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16764,7 +17515,8 @@ "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true }, "tslib": { "version": "1.10.0", @@ -16800,7 +17552,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -17432,6 +18183,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", + "dev": true, "requires": { "acorn": "^6.0.7", "acorn-walk": "^6.1.1", @@ -17451,12 +18203,14 @@ "acorn": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -17466,7 +18220,8 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true } } }, @@ -17792,8 +18547,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { "version": "0.0.3", diff --git a/package.json b/package.json index 21c6a507..6c86bfd9 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,33 @@ }, "dependencies": { "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@ckeditor/ckeditor5-build-classic": "^16.0.0", + "@ckeditor/ckeditor5-adapter-ckfinder": "^16.0.0", + "@ckeditor/ckeditor5-autoformat": "^16.0.0", + "@ckeditor/ckeditor5-basic-styles": "^16.0.0", + "@ckeditor/ckeditor5-block-quote": "^16.0.0", + "@ckeditor/ckeditor5-core": "^16.0.0", + "@ckeditor/ckeditor5-dev-utils": "^12.0.7", + "@ckeditor/ckeditor5-easy-image": "^16.0.0", + "@ckeditor/ckeditor5-editor-classic": "^16.0.0", + "@ckeditor/ckeditor5-essentials": "^16.0.0", + "@ckeditor/ckeditor5-heading": "^16.0.0", + "@ckeditor/ckeditor5-highlight": "^16.0.0", + "@ckeditor/ckeditor5-image": "^16.0.0", + "@ckeditor/ckeditor5-indent": "^16.0.0", + "@ckeditor/ckeditor5-link": "^16.0.0", + "@ckeditor/ckeditor5-list": "^16.0.0", + "@ckeditor/ckeditor5-paragraph": "^16.0.0", + "@ckeditor/ckeditor5-paste-from-office": "^16.0.0", + "@ckeditor/ckeditor5-table": "^16.0.0", + "@ckeditor/ckeditor5-theme-lark": "^16.0.0", + "@ckeditor/ckeditor5-ui": "^16.0.0", + "@ckeditor/ckeditor5-upload": "^16.0.0", "@ckeditor/ckeditor5-vue": "^1.0.1", + "@openfonts/pt-sans_all": "^1.44.0", "@sentry/browser": "^5.11.1", "@sentry/integrations": "^5.11.1", "acorn": "^7.1.0", - "autocomplete.js": "^0.37.0", + "autocomplete.js": "^0.37.1", "axios": "^0.19.2", "bootstrap": "^4.4.1", "bootstrap-select": "^1.13.12", @@ -40,20 +61,24 @@ "npm": "^6.13.6", "openseadragon": "^2.4.1", "popper.js": "^1.16.1", + "postcss-loader": "^3.0.0", + "raw-loader": "^3.1.0", "regenerator-runtime": "^0.13.3", "resolve-url-loader": "^3.1.1", "sass": "^1.25.0", "sass-loader": "^7.1.0", "selectize": "~0.12.6", + "style-loader": "^1.1.3", "tooltipster": "^4.2.7", "vue": "^2.6.11", "vue-axios": "^2.1.5", "vue-slider-component": "^3.1.0", "vue-template-compiler": "^2.6.11", - "vue2-selectize": "^1.1.7", - "webpack-bundle-analyzer": "^3.6.0" + "vue2-selectize": "^1.1.7" }, "devDependencies": { + "@ckeditor/ckeditor5-alignment": "^16.0.0", + "@ckeditor/ckeditor5-dev-webpack-plugin": "^8.0.7", "@wdio/cli": "^5.18.6", "@wdio/local-runner": "^5.18.6", "@wdio/mocha-framework": "^5.18.6", @@ -63,7 +88,7 @@ "@wdio/sync": "^5.18.6", "chai": "^4.2.0", "chalk": "^3.0.0", - "chromedriver": "^79.0.0", + "chromedriver": "^79.0.2", "copy-webpack-plugin": "^5.1.1", "eslint": "^6.8.0", "eslint-config-standard": "^14.1.0", @@ -76,6 +101,7 @@ "imagemin-webpack-plugin": "^2.4.2", "laravel-mix-imagemin": "^1.0.3", "url-join": "^4.0.1", - "wdio-chromedriver-service": "^5.0.2" + "wdio-chromedriver-service": "^5.0.2", + "webpack-bundle-analyzer": "^3.6.0" } } diff --git a/public/uploads b/public/uploads new file mode 120000 index 00000000..7051e94f --- /dev/null +++ b/public/uploads @@ -0,0 +1 @@ +../storage/app/public \ No newline at end of file diff --git a/resources/js/app.js b/resources/js/app.js index 87f9b5ac..65940b77 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -22,8 +22,6 @@ import DataTable from './components/DataTable' import OpesDataTable from './components/bases/opes/OpesDataTable' import SearchForm from './components/SearchForm' import EditForm from './components/EditForm' -import PageEditor from './components/PageEditor' -import ImageViewer from './components/ImageViewer' import NationalLibrarySearch from './components/NationalLibrarySearch' Vue.config.devtools = true @@ -32,10 +30,13 @@ Vue.component('data-table', DataTable) Vue.component('opes-data-table', OpesDataTable) Vue.component('search-form', SearchForm) Vue.component('edit-form', EditForm) -Vue.component('page-editor', PageEditor) -Vue.component('image-viewer', ImageViewer) Vue.component('national-library-search', NationalLibrarySearch) +// Code splitting: Components to be loaded as needed +Vue.component('page-editor', () => import(/* webpackChunkName: "page-editor" */ './components/PageEditor')) +Vue.component('image-viewer', () => import(/* webpackChunkName: "image-viewer" */ './components/ImageViewer')) + + Vue.use(Lang, { locale: window.default_locale, fallback: window.fallback_locale, diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index b95b7072..13b08eec 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -28,6 +28,7 @@ window.Popper = require('popper.js').default window.$ = window.jQuery = require('jquery') require('bootstrap') +require('@openfonts/pt-sans_all') // require('selectize'); diff --git a/resources/js/components/PageEditor.vue b/resources/js/components/PageEditor.vue index 4eb51e6b..41fc9e98 100644 --- a/resources/js/components/PageEditor.vue +++ b/resources/js/components/PageEditor.vue @@ -1,38 +1,183 @@ + - - diff --git a/resources/js/components/SaveButton.js b/resources/js/components/SaveButton.js new file mode 100644 index 00000000..aebee074 --- /dev/null +++ b/resources/js/components/SaveButton.js @@ -0,0 +1,78 @@ +import Plugin from '@ckeditor/ckeditor5-core/src/plugin' +import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview' +import PendingActions from '@ckeditor/ckeditor5-core/src/pendingactions'; + +let isDirty = false; + +export default class SaveButton extends Plugin { + + init() { + const editor = this.editor; + const config = editor.config.get( 'saveButton' ) || {}; + + editor.ui.componentFactory.add( 'saveButton', locale => { + this.view = new ButtonView( locale ); + + this.view.set( { + withText: true, + label: 'Lagre', + tooltip: false, + class: 'ck-savebutton ck-savebutton-success', + isEnabled: false, + } ); + + // console.log(view) + // console.log(view.template) + // console.log(view.template.attributes) + + //view.template.attributes.class = ['ck-savebutton'] + + // Callback executed once the image is clicked. + this.view.on( 'execute', () => { + config.save(editor) + } ); + + return this.view; + } ); + + config.init(this) + + } + + setSaving () { + this.view.set({ + class: 'ck-savebutton ck-savebutton-success', + tooltip: false, + isEnabled: false, + label: 'Lagrer...', + }) + } + + + setDirty () { + this.view.set({ + class: 'ck-savebutton ck-savebutton-success ck-savebutton-active', + tooltip: false, + isEnabled: true, + label: 'Lagre', + }) + } + + setSaved () { + this.view.set({ + class: 'ck-savebutton ck-savebutton-success', + isEnabled: false, + label: 'Lagret!', + tooltip: false, + }) + } + + setFailed () { + this.view.set({ + isEnabled: true, + class: 'ck-savebutton ck-savebutton-error', + label: 'Lagring feilet!', + tooltip: 'Trykk for å prøve igjen.', + }) + } +} diff --git a/resources/sass/app.sass b/resources/sass/app.sass index d86e65f1..9d6224cc 100644 --- a/resources/sass/app.sass +++ b/resources/sass/app.sass @@ -18,6 +18,9 @@ $break-md: 1200px // Extra styles for DataTables @import 'datatables.net-fixedHeader.bootstrap4.min' +// CKeditor content styles +@import 'ckeditor-content-styles' + body // Always show scollbar to avoid jumping of centered content during page load overflow-y: scroll @@ -393,3 +396,53 @@ div.dataTables_wrapper .opes .record-view badge font-size: 100% + +/******************************************************************* + * CKEditor + *******************************************************************/ + +.ck-savebutton + margin-left: 8px !important + margin-right: 10px !important + color: #fff + padding-left: 20px !important + padding-right: 20px !important + border: 0 + border-radius: 2px + font-weight: bold + outline: none + transition: 300ms ease background opacity + // box-shadow: 0 2px 0 rgb(68, 117, 10) + opacity: 1 + +.ck-savebutton.ck-savebutton-success + background: hsl( 88, 73%, 39% ) !important + +.ck-savebutton.ck-savebutton-error + background: hsl( 360, 73%, 39% ) !important + +.ck-savebutton:not(.ck-disabled):hover + opacity: 0.8 + +.ck-savebutton > span + color: white !important + +.ck-content + font-size: 17px + line-height: 150% + font-family: 'PT Sans', serif + +.ck-content h2 + margin-top: 30px + margin-bottom: 24px + +.ck-content h3, .ck-content h4 + border-bottom: 1px solid #aaa + margin-top: 20px + margin-bottom: 16px + +.ck-content table + @extend .table-bordered + +.ck.ck-editor__main + min-height: 500px diff --git a/resources/sass/ckeditor-content-styles.css b/resources/sass/ckeditor-content-styles.css new file mode 100644 index 00000000..b1edcc43 --- /dev/null +++ b/resources/sass/ckeditor-content-styles.css @@ -0,0 +1,302 @@ +/* + * CKEditor 5 (v15.0.0) content styles. + * Generated on Wed, 27 Nov 2019 13:26:13 GMT. + * + * Source: + * https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html + */ + +:root { + --ck-highlight-marker-blue: #72cdfd; + --ck-highlight-marker-green: #63f963; + --ck-highlight-marker-pink: #fc7999; + --ck-highlight-marker-yellow: #fdfd77; + --ck-highlight-pen-green: #118800; + --ck-highlight-pen-red: #e91313; + --ck-image-style-spacing: 1.5em; + --ck-todo-list-checkmark-size: 16px; +} + +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list { + list-style: none; +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li { + margin-bottom: 5px; +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li .todo-list { + margin-top: 5px; +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ''; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border; +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ''; + left: calc( var(--ck-todo-list-checkmark-size) / 3 ); + top: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + width: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + height: calc( var(--ck-todo-list-checkmark-size) / 2.6 ); + border-style: solid; + border-color: transparent; + border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0; + transform: rotate(45deg); +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label .todo-list__label__description { + vertical-align: middle; +} +/* ckeditor5-image/theme/image.css */ +.ck-content .image { + display: table; + clear: both; + text-align: center; + margin: 1em auto; +} +/* ckeditor5-image/theme/image.css */ +.ck-content .image > img { + display: block; + margin: 0 auto; + max-width: 100%; + min-width: 50px; +} +/* ckeditor5-block-quote/theme/blockquote.css */ +.ck-content blockquote { + overflow: hidden; + padding-right: 1.5em; + padding-left: 1.5em; + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} +/* ckeditor5-block-quote/theme/blockquote.css */ +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} +/* ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized { + max-width: 100%; + display: block; + box-sizing: border-box; +} +/* ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized img { + width: 100%; +} +/* ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized > figcaption { + display: block; +} +/* ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-side, +.ck-content .image-style-align-left, +.ck-content .image-style-align-center, +.ck-content .image-style-align-right { + max-width: 50%; +} +/* ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-side { + float: right; + margin-left: var(--ck-image-style-spacing); +} +/* ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left { + float: left; + margin-right: var(--ck-image-style-spacing); +} +/* ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-center { + margin-left: auto; + margin-right: auto; +} +/* ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-right { + float: right; + margin-left: var(--ck-image-style-spacing); +} +/* ckeditor5-media-embed/theme/mediaembed.css */ +.ck-content .media { + clear: both; + margin: 1em 0; + display: block; + min-width: 15em; +} +/* ckeditor5-table/theme/table.css */ +.ck-content .table { + margin: 1em auto; + display: table; +} +/* ckeditor5-table/theme/table.css */ +.ck-content .table table { + border-collapse: collapse; + border-spacing: 0; + border: 1px double hsl(0, 0%, 70%); +} +/* ckeditor5-table/theme/table.css */ +.ck-content .table table td, +.ck-content .table table th { + min-width: 2em; + padding: .4em; + border-color: hsl(0, 0%, 85%); +} +/* ckeditor5-table/theme/table.css */ +.ck-content .table table th { + font-weight: bold; + background: hsl(0, 0%, 98%); +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-yellow { + background-color: var(--ck-highlight-marker-yellow); +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-green { + background-color: var(--ck-highlight-marker-green); +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-pink { + background-color: var(--ck-highlight-marker-pink); +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-blue { + background-color: var(--ck-highlight-marker-blue); +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-red { + color: var(--ck-highlight-pen-red); + background-color: transparent; +} +/* ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-green { + color: var(--ck-highlight-pen-green); + background-color: transparent; +} +/* ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break { + position: relative; + clear: both; + padding: 5px 0; + display: flex; + align-items: center; + justify-content: center; +} +/* ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break::after { + content: ''; + position: absolute; + border-bottom: 2px dashed hsl(0, 0%, 77%); + width: 100%; +} +/* ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break__label { + position: relative; + z-index: 1; + padding: .3em .6em; + display: block; + text-transform: uppercase; + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif; + font-size: 0.75em; + font-weight: bold; + color: hsl(0, 0%, 20%); + background: #fff; + box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +/* ckeditor5-basic-styles/theme/code.css */ +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: .15em; + border-radius: 2px; +} +/* ckeditor5-image/theme/imagecaption.css */ +.ck-content .image > figcaption { + display: table-caption; + caption-side: bottom; + word-break: break-word; + color: hsl(0, 0%, 20%); + background-color: hsl(0, 0%, 97%); + padding: .6em; + font-size: .75em; + outline-offset: -1px; +} +/* ckeditor5-horizontal-line/theme/horizontalline.css */ +.ck-content hr { + border-width: 1px 0 0; + border-style: solid; + border-color: hsl(0, 0%, 37%); + margin: 0; +} +/* ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre { + padding: 1em; + color: #353535; + background: hsla(0, 0%, 78%, 0.3); + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + text-align: left; + direction: ltr; + tab-size: 4; + white-space: pre-wrap; + font-style: normal; + min-width: 200px; +} +/* ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre code { + background: unset; + padding: 0; + border-radius: 0; +} +@media print { + /* ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break { + padding: 0; + } + /* ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break::after { + display: none; + } +} diff --git a/resources/views/layout.blade.php b/resources/views/layout.blade.php index e2a1246e..f128e22d 100644 --- a/resources/views/layout.blade.php +++ b/resources/views/layout.blade.php @@ -98,6 +98,17 @@
+ @if ((new \Jenssegers\Agent\Agent() )->browser() === 'IE') + +
+
+ Du bruker Internet Explorer, en utdatert nettleser som UB-baser dessverre ikke støtter særlig bra. + Vi anbefaler å bytte til en mer moderne nettleser om du kan, som Edge, Firefox eller Chrome. +
+
+ + @endif + @if (session('status'))
{{ session('status') }} diff --git a/resources/views/litteraturkritikk/index.blade.php b/resources/views/litteraturkritikk/index.blade.php index b13fff87..82dd98a6 100644 --- a/resources/views/litteraturkritikk/index.blade.php +++ b/resources/views/litteraturkritikk/index.blade.php @@ -10,7 +10,7 @@

@endcan -
+
{!! $intro !!}
diff --git a/resources/views/pages/edit.blade.php b/resources/views/pages/edit.blade.php index 1eb7c171..1643a0a0 100644 --- a/resources/views/pages/edit.blade.php +++ b/resources/views/pages/edit.blade.php @@ -11,16 +11,16 @@

@endif - @if (!$page->exists)

Språk for denne siden: {{ \Punic\Language::getName(\App::getLocale(), 'nb') }}

- @endif - - - - {{ trans('messages.cancel') }} + diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php index a4c32253..ac979020 100644 --- a/resources/views/pages/show.blade.php +++ b/resources/views/pages/show.blade.php @@ -7,12 +7,13 @@ Rediger tekst

@endif -
+ +
{!! $page->body !!}
-
+

Sist endret av {{ $page->updatedBy->name }} {{ $page->updated_at }} diff --git a/routes/web.php b/routes/web.php index 751c2335..ac6adc03 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,7 +19,7 @@ // Admin routes... Route::get('users/{id}', 'Admin\UserController@show'); -Route::group(['middleware' => 'admin'], function () { +Route::group(['middleware' => ['login', 'can:admin']], function () { Route::get('admin', 'Admin\AdminController@index'); // Manage users diff --git a/storage/app/.gitignore b/storage/app/.gitignore index c96a04f0..3984efe5 100644 --- a/storage/app/.gitignore +++ b/storage/app/.gitignore @@ -1,2 +1,3 @@ * -!.gitignore \ No newline at end of file +!.gitignore +!public diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/webpack.mix.js b/webpack.mix.js index 02bf70d6..ceda4f83 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -15,7 +15,7 @@ const imageminMozjpeg = require('imagemin-mozjpeg') mix.lang() mix.js('resources/js/app.js', 'public/js') - .sourceMaps() + .sourceMaps(true, 'inline-source-map') .version() mix.imagemin({ @@ -78,12 +78,71 @@ mix.copy('node_modules/datatables.net-plugins/i18n/Norwegian-Bokmal.lang', 'publ mix.copy('node_modules/openseadragon/build/openseadragon/images/*', 'public/images') + +/* + |-------------------------------------------------------------------------- + | And then some horrible CKEditor mess + | https://github.com/ckeditor/ckeditor5-vue/issues/23#issuecomment-455756667 + |-------------------------------------------------------------------------- + */ + +const CKEditorWebpackPlugin = require( '@ckeditor/ckeditor5-dev-webpack-plugin' ); +const CKEStyles = require('@ckeditor/ckeditor5-dev-utils').styles; +const CKERegex = { + svg: /ckeditor5-[^/\\]+[/\\]theme[/\\]icons[/\\][^/\\]+\.svg$/, + css: /ckeditor5-[^/\\]+[/\\]theme[/\\].+\.css/, +}; + +Mix.listen('configReady', webpackConfig => { + const rules = webpackConfig.module.rules; + const targetSVG = /(\.(png|jpe?g|gif|webp)$|^((?!font).)*\.svg$)/; + const targetCSS = /\.css$/; + + // exclude CKE regex from mix's default rules + // if there's a better way to loop/change this, open to suggestions + for (let rule of rules) { + if (rule.test.toString() === targetSVG.toString()) { + rule.exclude = CKERegex.svg; + } + else if (rule.test.toString() === targetCSS.toString()) { + rule.exclude = CKERegex.css; + } + } +}); + mix.webpackConfig({ plugins: [ - // new BundleAnalyzerPlugin({ - // analyzerMode: 'disabled', - // generateStatsFile: true, - // // statsOptions: { source: false } - // }), + new CKEditorWebpackPlugin({ + language: 'nb' + }), + // new BundleAnalyzerPlugin(), ], -}) + module: { + rules: [ + { + test: CKERegex.svg, + use: [ 'raw-loader' ] + }, + { + test: CKERegex.css, + use: [ + { + loader: 'style-loader', + options: { + injectType: 'singletonStyleTag', + } + }, + { + loader: 'postcss-loader', + options: CKEStyles.getPostCssConfig({ + themeImporter: { + themePath: require.resolve('@ckeditor/ckeditor5-theme-lark') + }, + minify: true + }) + }, + ] + } + ] + } +});