From fa14d98d58109982ff5f363ceabbbdd96b2c5309 Mon Sep 17 00:00:00 2001 From: viliusle Date: Sun, 14 Feb 2021 17:21:17 +0200 Subject: [PATCH] #228 - Web app manifests (for offline usage) --- images/manifest/144x144.png | Bin 0 -> 6708 bytes images/manifest/168x168.png | Bin 0 -> 7826 bytes images/manifest/192x192.png | Bin 0 -> 9291 bytes images/manifest/48x48.png | Bin 0 -> 2270 bytes images/manifest/72x72.png | Bin 0 -> 3362 bytes images/manifest/96x96.png | Bin 0 -> 4341 bytes index.html | 1 + manifest.json | 41 +++++++++++++++++++++++ service-worker.js | 64 ++++++++++++++++++++++++++++++++++++ src/css/layout.css | 14 +++----- src/js/core/base-gui.js | 17 ++++++++++ src/js/main.js | 5 +-- 12 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 images/manifest/144x144.png create mode 100644 images/manifest/168x168.png create mode 100644 images/manifest/192x192.png create mode 100644 images/manifest/48x48.png create mode 100644 images/manifest/72x72.png create mode 100644 images/manifest/96x96.png create mode 100644 manifest.json create mode 100644 service-worker.js diff --git a/images/manifest/144x144.png b/images/manifest/144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1fd4be02440fc1c47bc2b49617e1b38755427b GIT binary patch literal 6708 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 KMNUMnLSTZp2BYWz literal 0 HcmV?d00001 diff --git a/images/manifest/168x168.png b/images/manifest/168x168.png new file mode 100644 index 0000000000000000000000000000000000000000..4c21ca1b82dd72baa014edc708252007219a582c GIT binary patch literal 7826 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 literal 0 HcmV?d00001 diff --git a/images/manifest/96x96.png b/images/manifest/96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..7a934d31fad83c79e04c2583085f670c9958b727 GIT binary patch literal 4341 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 jJ+*Gv{_hYFV`l#g;PH8Mfn~ literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 9a7794b..b9e0297 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@ + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..a983d39 --- /dev/null +++ b/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "miniPaint", + "short_name": "miniPaint", + "start_url": "/", + "display": "standalone", + "orientation": "landscape", + "background_color": "#666d6f", + "description": "miniPaint is free online image editor using HTML5.", + "icons": [ + { + "src": "images/manifest/48x48.png", + "sizes": "48x48", + "type": "image/png" + }, + { + "src": "images/manifest/72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "images/manifest/96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "images/manifest/144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "images/manifest/168x168.png", + "sizes": "168x168", + "type": "image/png" + }, + { + "src": "images/manifest/192x192.png", + "sizes": "192x192", + "type": "image/png" + } + ] +} diff --git a/service-worker.js b/service-worker.js new file mode 100644 index 0000000..50e3f0f --- /dev/null +++ b/service-worker.js @@ -0,0 +1,64 @@ +// use a cacheName for cache versioning +var cacheName = 'v1:static'; + +// during the install phase you usually want to cache static assets +self.addEventListener('install', function(e) { + // once the SW is installed, go ahead and fetch the resources to make this work offline + e.waitUntil( + caches.open(cacheName).then(function(cache) { + return cache.addAll([ + './', + './dist/bundle.js', + './images/favicon.png', + './images/logo.svg', + './images/logo-colors.png', + './images/icons/animation.svg', + './images/icons/blur.svg', + './images/icons/bold.svg', + './images/icons/brush.svg', + './images/icons/bulge_pinch.svg', + './images/icons/clone.svg', + './images/icons/crop.svg', + './images/icons/delete.svg', + './images/icons/desaturate.svg', + './images/icons/erase.svg', + './images/icons/external.png', + './images/icons/fill.svg', + './images/icons/gradient.png', + './images/icons/grid.png', + './images/icons/italic.svg', + './images/icons/magic_erase.svg', + './images/icons/media.svg', + './images/icons/menu.svg', + './images/icons/pencil.svg', + './images/icons/pick_color.svg', + './images/icons/refresh.svg', + './images/icons/select.svg', + './images/icons/selection.svg', + './images/icons/shape.svg', + './images/icons/sharpen.svg', + './images/icons/strikethrough.svg', + './images/icons/text.svg', + './images/icons/underline.svg', + './images/icons/view.svg' + ]).then(function() { + self.skipWaiting(); + }); + }) + ); +}); + +// when the browser fetches a url +self.addEventListener('fetch', function(event) { + // either respond with the cached object or go ahead and fetch the actual url + event.respondWith( + caches.match(event.request).then(function(response) { + if (response) { + // retrieve from cache + return response; + } + // fetch as normal + return fetch(event.request); + }) + ); +}); diff --git a/src/css/layout.css b/src/css/layout.css index 28f7bd0..35c2a62 100644 --- a/src/css/layout.css +++ b/src/css/layout.css @@ -278,6 +278,9 @@ body .sp-preview{ filter: var(--menu-icons-filter-active); } +/* +IMPORTANT: any new icon should also must be added on /service-worker.js + its version should be updated !!! + */ .sidebar_left .select:after{ background-image: url('images/icons/select.svg'); } .sidebar_left .selection:after{ background-image: url('images/icons/selection.svg'); } .sidebar_left .brush:after{ background-image: url('images/icons/brush.svg'); } @@ -288,15 +291,8 @@ body .sp-preview{ .sidebar_left .fill:after{ background-image: url('images/icons/fill.svg'); } .sidebar_left .media:after{ background-image: url('images/icons/media.svg'); } .sidebar_left .shape:after{ background-image: url('images/icons/shape.svg'); } -.sidebar_left .text:after{ - background-image: url('images/icons/text.svg'); - background-size: 16px auto; -} -.sidebar_left .gradient:after{ - background-image: url('images/icons/gradient.png'); - background-size: 18px 12px; - filter: none; -} +.sidebar_left .text:after{ background-image: url('images/icons/text.svg'); background-size: 16px auto; } +.sidebar_left .gradient:after{ background-image: url('images/icons/gradient.png'); background-size: 18px 12px; filter: none; } .sidebar_left .clone:after{ background-image: url('images/icons/clone.svg'); } .sidebar_left .crop:after{ background-image: url('images/icons/crop.svg'); } .sidebar_left .blur:after{ background-image: url('images/icons/blur.svg'); } diff --git a/src/js/core/base-gui.js b/src/js/core/base-gui.js index 72c94d4..e98a86d 100644 --- a/src/js/core/base-gui.js +++ b/src/js/core/base-gui.js @@ -65,6 +65,13 @@ class Base_gui_class { this.modules = {}; } + init() { + this.load_modules(); + this.load_default_values(); + this.render_main_gui(); + this.init_service_worker(); + } + load_modules() { var _this = this; var modules_context = require.context("./../modules/", true, /\.js$/); @@ -140,6 +147,16 @@ class Base_gui_class { this.load_translations(); } + init_service_worker() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('./service-worker.js').then(function(reg) { + console.log('Successfully registered service worker', reg); + }).catch(function(err) { + console.warn('Error whilst registering service worker', err); + }); + } + } + set_events() { var _this = this; diff --git a/src/js/main.js b/src/js/main.js index 99bb57c..2ad746f 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -50,9 +50,6 @@ window.addEventListener('load', function (e) { window.FileSave = File_save; // Render all - GUI.load_modules(); - GUI.load_default_values(); - GUI.render_main_gui(); - + GUI.init(); Layers.init(); }, false);