diff --git a/.gitignore b/.gitignore index b30d881..ee43759 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +.DS_Store # Runtime data pids diff --git a/README.md b/README.md index 5b9516b..1275853 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ # @quasar/icon-genie -This node module outputs a set of **SQUARE** favicons, webicons, pwa-icons and electron-icons as well as iOS, Windows Store and MacOS icons from an original 1240x1240 square icon that retains transparency and also **minifies** the assets. It will also create splash screens for Cordova and even a minified svg. +This node module outputs a set of **SQUARE** favicons, webicons, pwa-icons and electron-icons as well as iOS, Windows Store and MacOS icons from an original 1240x1240 square icon that retains transparency and also **minifies** the assets. It will also create splash screens for Cordova/Capacitor and even a minified svg. It works cross-platform to generate those pesky `.icns` and `.ico` files used by Electron apps and in the case of the latter preferred by some browsers and webscrapers (favicon.ico) - even though modern development guidelines for Apple and Windows recommend using `.png`. @@ -46,13 +46,13 @@ If you are on Windows and seeing an error the likes of `pngquant failed to build $ npm install --global --production windows-build-tools ``` -The most important part (and indeed the only reason to use this extension) is pointing it at your shiny icon (and splashscreen if you are building for Cordova.) So the first thing you are reminded of is that you need to do that! +The most important part (and indeed the only reason to use this extension) is pointing it at your shiny icon (and splashscreen if you are building for Cordova/Capacitor.) So the first thing you are reminded of is that you need to do that! ``` --------------------------- ATTENTION! ----------------------------- You must replace app-icon.png in the root folder of your project. - If you plan on building for Cordova, you must also replace the + If you plan on building for Cordova/Capacitor, you must also replace the app-splashscreen.png image in the same place. File details: -> app-icon.png 1240x1240 (with transparency) @@ -75,7 +75,7 @@ Then choose a minification strategy: You will be asked the same question for production. Our recommendation is to choose `optipng`. It has the best time / quality trade-off for a lossless minification - but `zopfli` WILL shave off a bit more bytes (at the cost of taking much, much longer). -You will also be asked for a background color. This is used in the few cases that a background is required, as with Cordova splashscreens and Cordova iOS icons. +You will also be asked for a background color. This is used in the few cases that a background is required, as with Cordova/Capacitor splashscreens and Cordova/Capacitor iOS icons. ### Triggering The first time you start Quasar, icon-genie will create the images needed for the specific app artifacts. They will not automatically be added to git, so you will need to manage that yourself. diff --git a/bin/cli.js b/bin/cli.js index 07b850d..777063a 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -37,7 +37,7 @@ useful for other build pipelines. Flags: -p, --preset Choose a preset output or make your own [minify|splash|svg|svgduochrome|favicon] - [spa|pwa|cordova|electron|bex|kitchensink|custom] + [spa|pwa|cordova|capacitor|electron|bex|kitchensink|custom] -s, --source Your source image as a large square png -t, --target The destination directory for the files created -o, --options Path to file that overrides defaults (if custom) @@ -61,7 +61,7 @@ if (!args.preset) { console.log('You must choose a preset or declare custom.') console.log( ' -p, --preset [minify|splash|svg|favicon]\n' + - ' [kitchensink|spa|pwa|cordova|electron|custom]\n' + ' [kitchensink|spa|pwa|cordova|capacitor|electron|custom]\n' ) process.exit(0) } @@ -121,6 +121,9 @@ switch (args.preset) { case 'cordova': icongenie.cordova(args.source, args.target, args.minify) break + case 'capacitor': + icongenie.capacitor(args.source, args.target, args.minify) + break case 'electron': icongenie.electron(args.source, args.target, args.minify) break diff --git a/lib/cordova.js b/lib/cordova.js deleted file mode 100644 index 5542624..0000000 --- a/lib/cordova.js +++ /dev/null @@ -1,3 +0,0 @@ -import et from 'elementtree' - - diff --git a/lib/index.js b/lib/index.js index fae17db..1388400 100644 --- a/lib/index.js +++ b/lib/index.js @@ -225,6 +225,29 @@ let icongenie = exports.icongenie = { progress('Icon Genie Finished Cordova') clearInterval(spinnerInterval) }, + capacitor: async function(src, target, strategy, options, splashSrc) { + const spinnerInterval = spinner() + try { + if (!splashSrc) splashSrc = src + options = options || settings.options.capacitor + await this.validate(src, target) + progress('Building Capacitor splash images') + await this.splash(src, splashSrc, target, options) + progress('Building Capacitor icons') + await this.build(src, target, options) + if (strategy) { + progress(`Minifying assets with ${strategy}`) + await this.minify(target, options, strategy, 'batch') + } else { + console.log('no minify strategy') + } + } catch (e) { + console.log('Capacitor: failed', e) + // throw e + } + progress('Icon Genie Finished Capacitor') + clearInterval(spinnerInterval) + }, electron: async function(src, target, strategy, options) { const spinnerInterval = spinner() try { @@ -295,32 +318,33 @@ let icongenie = exports.icongenie = { } progress('Icon Genie Finished SPA') clearInterval(spinnerInterval) -}, + }, bex: async function(src, target, strategy, options) { - const spinnerInterval = spinner() - try { - options = options || settings.options.bex - await this.validate(src, target) - progress('Building Browser Extension icons') - await this.build(src, target, options) - if (strategy) { - progress(`Minifying assets with ${strategy}`) - await this.minify(target, options, strategy, 'batch') - } else { - console.log('no minify strategy') + const spinnerInterval = spinner() + try { + options = options || settings.options.bex + await this.validate(src, target) + progress('Building Browser Extension icons') + await this.build(src, target, options) + if (strategy) { + progress(`Minifying assets with ${strategy}`) + await this.minify(target, options, strategy, 'batch') + } else { + console.log('no minify strategy') + } + } catch (e) { + console.log('BEX: failed', e) + // throw e } - } catch (e) { - console.log('BEX: failed', e) - // throw e - } - progress('Icon Genie Finished BEX') - clearInterval(spinnerInterval) -}, + progress('Icon Genie Finished BEX') + clearInterval(spinnerInterval) + }, kitchensink: async function(src, target, strategy) { await this.pwa(src, path.join(target, '/src/statics'), strategy) await this.spa(src, path.join(target, '/src/statics'), strategy) await this.electron(src, path.join(target + '/src-electron/icons'), strategy) await this.cordova(src, path.join(target + '/src-cordova/res'), strategy) + await this.capacitor(src, path.join(target + '/src-capacitor'), strategy) await this.bex(src, path.join(target + '/src-browser-ext/icons'), strategy) }, @@ -463,7 +487,7 @@ let icongenie = exports.icongenie = { * @param {string} mode - singlefile, single directory or batch */ minify: async function(target, options, strategy, mode) { - let cmd, chain + let cmd let minify = settings.options.minify if (!minify.available.find(x => x === strategy)) { strategy = minify.type diff --git a/lib/settings.js b/lib/settings.js index 545767e..bdbf3d3 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -472,6 +472,17 @@ exports.options = { 152 ] }, + 'ios_icon_86@2x': { + platform: 'ios', + background: true, + folder: 'ios', + prefix: 'icon-86@2x', + infix: false, + suffix: '.png', + sizes: [ + 172 + ] + }, 'ios_icon_88@2x': { platform: 'ios', background: true, @@ -935,6 +946,631 @@ exports.options = { ] } }, + capacitor: { + android_icon_hdpi_fg: { + platform: 'android', + density: 'hdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-hdpi', + prefix: 'ic_launcher_foreground', + infix: false, + suffix: '.png', + sizes: [ + 162 + ] + }, + android_icon_hdpi_launcher_round: { + platform: 'android', + density: 'hdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-hdpi', + prefix: 'ic_launcher_round', + infix: false, + suffix: '.png', + sizes: [ + 48 + ] + }, + android_icon_hdpi_launcher: { + platform: 'android', + density: 'hdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-hdpi', + prefix: 'ic_launcher', + infix: false, + suffix: '.png', + sizes: [ + 48 + ] + }, + android_icon_mdpi_fg: { + platform: 'android', + density: 'mdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-mdpi', + prefix: 'ic_launcher_foreground', + infix: false, + suffix: '.png', + sizes: [ + 108 + ] + }, + android_icon_mdpi_launcher_round: { + platform: 'android', + density: 'mdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-mdpi', + prefix: 'ic_launcher_round', + infix: false, + suffix: '.png', + sizes: [ + 48 + ] + }, + android_icon_mdpi_launcher: { + platform: 'android', + density: 'mdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-mdpi', + prefix: 'ic_launcher', + infix: false, + suffix: '.png', + sizes: [ + 48 + ] + }, + android_icon_xhdpi_fg: { + platform: 'android', + density: 'xhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xhdpi', + prefix: 'ic_launcher_foreground', + infix: false, + suffix: '.png', + sizes: [ + 216 + ] + }, + android_icon_xhdpi_launcher_round: { + platform: 'android', + density: 'xhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xhdpi', + prefix: 'ic_launcher_round', + infix: false, + suffix: '.png', + sizes: [ + 96 + ] + }, + android_icon_xhdpi_launcher: { + platform: 'android', + density: 'xhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xhdpi', + prefix: 'ic_launcher', + infix: false, + suffix: '.png', + sizes: [ + 96 + ] + }, + android_icon_xxhdpi_fg: { + platform: 'android', + density: 'xxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxhdpi', + prefix: 'ic_launcher_foreground', + infix: false, + suffix: '.png', + sizes: [ + 324 + ] + }, + android_icon_xxhdpi_launcher_round: { + platform: 'android', + density: 'xxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxhdpi', + prefix: 'ic_launcher_round', + infix: false, + suffix: '.png', + sizes: [ + 144 + ] + }, + android_icon_xxhdpi_launcher: { + platform: 'android', + density: 'xxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxhdpi', + prefix: 'ic_launcher', + infix: false, + suffix: '.png', + sizes: [ + 144 + ] + }, + android_icon_xxxhdpi_fg: { + platform: 'android', + density: 'xxxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxxhdpi', + prefix: 'ic_launcher_foreground', + infix: false, + suffix: '.png', + sizes: [ + 432 + ] + }, + android_icon_xxxhdpi_launcher_round: { + platform: 'android', + density: 'xxxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxxhdpi', + prefix: 'ic_launcher_round', + infix: false, + suffix: '.png', + sizes: [ + 192 + ] + }, + android_icon_xxxhdpi_launcher: { + platform: 'android', + density: 'xxxhdpi', + background: false, + folder: 'android/app/src/main/res/mipmap-xxxhdpi', + prefix: 'ic_launcher', + infix: false, + suffix: '.png', + sizes: [ + 192 + ] + }, + ios_icon_20_1x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-20x20@1x', + infix: false, + suffix: '.png', + sizes: [ + 20 + ] + }, + ios_icon_20_2x_1: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-20x20@2x-1', + infix: false, + suffix: '.png', + sizes: [ + 40 + ] + }, + ios_icon_20_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-20x20@2x', + infix: false, + suffix: '.png', + sizes: [ + 40 + ] + }, + ios_icon_20_3x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-20x20@3x', + infix: false, + suffix: '.png', + sizes: [ + 60 + ] + }, + ios_icon_29_1x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-29x29@1x', + infix: false, + suffix: '.png', + sizes: [ + 29 + ] + }, + ios_icon_29_2x_1: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-29x29@2x-1', + infix: false, + suffix: '.png', + sizes: [ + 58 + ] + }, + ios_icon_29_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-29x29@2x', + infix: false, + suffix: '.png', + sizes: [ + 58 + ] + }, + ios_icon_29_3x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-29x29@3x', + infix: false, + suffix: '.png', + sizes: [ + 87 + ] + }, + ios_icon_40_1x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-40x40@1x', + infix: false, + suffix: '.png', + sizes: [ + 40 + ] + }, + ios_icon_40_2x_1: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-40x40@2x-1', + infix: false, + suffix: '.png', + sizes: [ + 80 + ] + }, + ios_icon_40_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-40x40@2x', + infix: false, + suffix: '.png', + sizes: [ + 80 + ] + }, + ios_icon_40_3x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-40x40@3x', + infix: false, + suffix: '.png', + sizes: [ + 120 + ] + }, + ios_icon_60_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-60x60@2x', + infix: false, + suffix: '.png', + sizes: [ + 120 + ] + }, + ios_icon_60_3x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-60x60@3x', + infix: false, + suffix: '.png', + sizes: [ + 180 + ] + }, + ios_icon_76_1x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-76x76@1x', + infix: false, + suffix: '.png', + sizes: [ + 76 + ] + }, + ios_icon_76_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-76x76@2x', + infix: false, + suffix: '.png', + sizes: [ + 152 + ] + }, + ios_icon_83_5_2x: { + platform: 'ios', + background: true, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-83.5x83.5@2x', + infix: false, + suffix: '.png', + sizes: [ + 165 + ] + }, + ios_icon_512_2x: { + platform: 'ios', + background: false, + folder: 'ios/App/App/Assets.xcassets/AppIcon.appiconset', + prefix: 'AppIcon-512x512@2x', + infix: false, + suffix: '.png', + sizes: [ + 1024 + ] + }, + android_screen_land_hdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-land-hdpi', + prefix: 'splash', + density: 'land-hdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 800, + 480 + ] + ] + }, + android_screen_land_mdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-land-mdpi', + prefix: 'splash', + density: 'land-mdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 480, + 320 + ] + ] + }, + android_screen_land_xhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-land-xhdpi', + prefix: 'splash', + density: 'land-xhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 1280, + 720 + ] + ] + }, + android_screen_land_xxhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-land-xxhdpi', + prefix: 'splash', + density: 'land-xxhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 1600, + 960 + ] + ] + }, + android_screen_land_xxxhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-land-xxxhdpi', + prefix: 'splash', + density: 'land-xxxhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 1920, + 1280 + ] + ] + }, + android_screen_port_hdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-port-hdpi', + prefix: 'splash', + density: 'port-hdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 480, + 800 + ] + ] + }, + android_screen_port_mdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-port-mdpi', + prefix: 'splash', + density: 'port-mdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 320, + 480 + ] + ] + }, + android_screen_port_xhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-port-xhdpi', + prefix: 'splash', + density: 'port-xhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 720, + 1280 + ] + ] + }, + android_screen_port_xxhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-port-xxhdpi', + prefix: 'splash', + density: 'port-xxhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 960, + 1600 + ] + ] + }, + android_screen_port_xxxhdpi: { + platform: 'android', + splash: true, + folder: 'android/app/src/main/res/drawable-port-xxxhdpi', + prefix: 'splash', + density: 'port-xxxhdpi', + infix: false, + suffix: '.png', + sizes: [ + [ + 1280, + 1920 + ] + ] + }, + ios_screen_2732_1: { + platform: 'ios', + splash: true, + folder: 'ios/App/App/Assets.xcassets/Splash.imageset', + prefix: 'splash-2732x2732-1', + infix: false, + suffix: '.png', + sizes: [ + [ + 2732, + 2732 + ] + ] + }, + ios_screen_2732_2: { + platform: 'ios', + splash: true, + folder: 'ios/App/App/Assets.xcassets/Splash.imageset', + prefix: 'splash-2732x2732-2', + infix: false, + suffix: '.png', + sizes: [ + [ + 2732, + 2732 + ] + ] + }, + ios_screen_2732: { + platform: 'ios', + splash: true, + folder: 'ios/App/App/Assets.xcassets/Splash.imageset', + prefix: 'splash-2732x2732', + infix: false, + suffix: '.png', + sizes: [ + [ + 2732, + 2732 + ] + ] + } + }, + electron: { + defaults: { + folder: '.', + prefix: 'icon', + infix: false, + suffix: '.png', + sizes: [ + 512 + ] + }, + appx_logo: { + folder: '.', + prefix: 'StoreLogo', + infix: false, + suffix: '.png', + sizes: [ + 50 + ] + }, + appx_square: { + folder: '.', + prefix: 'Square', + infix: true, + suffix: 'Logo.png', + sizes: [ + 30, + 44, + 71, + 89, + 107, + 142, + 150, + 284, + 310 + ] + }, + linux: { + folder: '.', + prefix: 'linux-', + infix: true, + suffix: '.png', + sizes: [ + 512, + 128, + 96, + 64, + 48, + 32, + 24, + 16 + ] + } + }, bex: { icons: { folder: '.', diff --git a/src/index.js b/src/index.js index 3752b61..4c70b4b 100644 --- a/src/index.js +++ b/src/index.js @@ -26,6 +26,9 @@ async function copyFiles (source, modeName, api) { case 'cordova': await copySync(source, api.resolve.cordova('/res')) break + case 'capacitor': + await copySync(source, api.resolve.capacitor('.')) + break case 'bex': await copySync(source, api.resolve.bex('/icons')) break @@ -145,11 +148,14 @@ async function run (api) { const currentConfig = { iconHash: await computeHash(iconSource, 'md5', 'icon-genie!!!') } - modeName === 'cordova' && Object.assign(currentConfig, { - splashscreenHash: splashscreenHashBasis, - splashscreenType: api.prompts.cordova.splashscreen_type, - backgroundColor: api.prompts.cordova.background_color - }) + + if (['cordova', 'capacitor'].includes(modeName)) { + Object.assign(currentConfig, { + splashscreenHash: splashscreenHashBasis, + splashscreenType: api.prompts.cordova.splashscreen_type, + backgroundColor: api.prompts.cordova.background_color + }) + } if ( api.prompts.build_always === true || @@ -175,6 +181,20 @@ async function run (api) { splashscreen_type: currentConfig.splashscreenType }) } + else if (modeName === 'capacitor') { + if (api.prompts.cordova.splashscreen_type !== 'generate') { + await validatePng(splashscreenSource) + } + + Object.assign(opts, { + background_color: validateHexRGB(currentConfig.backgroundColor) + ? currentConfig.backgroundColor + : '#000000', + // theme_color: validateHexRGB(api.prompts.theme_color) ? + // api.prompts.theme_color : '#ffffff' + splashscreen_type: currentConfig.splashscreenType + }) + } await icongenie[modeName]( iconSource, diff --git a/src/prompts.js b/src/prompts.js index 168cf37..31f85f7 100644 --- a/src/prompts.js +++ b/src/prompts.js @@ -7,7 +7,7 @@ https://github.com/quasarframework/app-extension-icon-genie --------------------------- ATTENTION! ----------------------------- You must replace app-icon.png in the root folder of your project. - If you plan on building for Cordova, you must also replace the + If you plan on building for Cordova/Capacitor, you must also replace the app-splashscreen.png image in the same place. File details: -> app-icon.png 1240x1240 (with transparency) @@ -68,7 +68,7 @@ https://github.com/quasarframework/app-extension-icon-genie name: 'cordova.background_color', type: 'input', required: true, - message: `Please type a background color to use for Cordova Icons / Splashscreens (no transparency): `, + message: `Please type a background color to use for Cordova/Capacitor Icons / Splashscreens (no transparency): `, default: '#000074', validate: validateHexRGB }, @@ -85,7 +85,7 @@ https://github.com/quasarframework/app-extension-icon-genie { name: 'cordova.splashscreen_type', type: 'list', - message: 'Build strategy for Cordova Splashscreen:', + message: 'Build strategy for Cordova/Capacitor Splashscreen:', choices: [ { name: 'Use app-splashscreen.png as-is', diff --git a/test/app/package.json b/test/app/package.json index bbbd7cf..a8374e9 100644 --- a/test/app/package.json +++ b/test/app/package.json @@ -4,6 +4,7 @@ "description": "A Quasar Framework app", "productName": "Quasar App", "cordovaId": "org.cordova.quasar.app", + "capacitorId": "org.capacitor.quasar.app", "author": "Daniel Thompson-Yvetot <35242872+nothingismagick@users.noreply.github.com>", "private": true, "scripts": { diff --git a/test/app/src/index.template.html b/test/app/src/index.template.html index 5cf10d3..45509a6 100644 --- a/test/app/src/index.template.html +++ b/test/app/src/index.template.html @@ -7,7 +7,7 @@ - +