From 932ddafdb0e527e8d3bdc90edd8b8078d1b16495 Mon Sep 17 00:00:00 2001 From: Devin Binnie <52460000+devinbinnie@users.noreply.github.com> Date: Fri, 3 Jan 2020 12:00:43 -0500 Subject: [PATCH] [MM-10586] Desktop App Window/Tabs Update (#1056) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [MM-19054] Added new server tab look and feel, still missing proper hover states and session expired icon * [MM-19055] Added window controls and removed border for macOS * [MM-19055] Add dark mode for macOS * [MM-19054] Added session expired icon * Test windows titlebar * Fixed the menu issue and added non-macOS dark mode * Blank commit * Fixed a lint issue * Fixed more lint issues * Fixed more issues * New tray icons * [MM-19603] Drag and drop tabs * Fixed some assets and fixed build output to include missing assets * Fixed a couple small issues * Only show tabs for only 1 server on Mac * Fixed some more tests * Fixed another test * Revert "Fixed another test" This reverts commit 36040294a71a68663d06996d71eecc5ed23d7014. * Fixed another test * Trial and error! * A bunch of additional fixes * Fixed a lint issue * Fixed restore focus on add server tab causing bad UX * Trial and error on flaky test again * Fixed some bugs based on PR feedback. * blank commit to push tests * Revert "Test windows titlebar" This reverts commit 9cd46b71b1427b75942434ac49185870d2437b85. * Remove the rest of the old new titlebar and fixes * Added three-dot link * New menu * Rest of new windows menu and other fixes * Fixed lint errors * Added windows 10 style title bar buttons for non mac OS * Lint fixes and enabled the tab bar regardless of number of servers * Missed one * Fixed unicode characters * Commenting out test that should no longer be applicable * Removed Windows 10 style titlebar icons and used material design instead * Fixed a lint issue * Some small UX fixes * blank commit * Fixed an issue where dropping the first tab moves it too far over before snapping into place * Additional style fixes * Another small issue fix * Back to Windows 10 style * Lint fixes * Accessible three dot menu * Lint fixes * Shrinking tabs when window is too small * Gradient between tabs and title bar buttons when window is too small * Add drag to gradient * Replaced icons, drag and drop cursor sticking fix, slight tab change * Lint and some mac fixes * Light theme fix to three dot menu * Hack for tab sticking to cursor on macOS * Fixes for the find utility * Fix for Catalina dark mode * Revert "Fix for Catalina dark mode" This reverts commit 45da05dd0f17f46efd1c53fafb92e9c1fd9dd8d9. * Fixed a couple issues Dean found * More fixes * Three dot hover effect to circle * PR feedback * Test fixes * Test and config fixes * Disable dragging when there are GPO servers * [MM-20757] Fixed dark mode on debug when running macOS Catalina * Allow future config versions to use v2 config if launching this version of the app * Oops * New titlebar icons, blur for titlebar on inactive * Lint fix * Set unfocused opacity to 0.4 * Final FINAL icons * Fixed closing menu not returning focus to the app * Lint fix * Update src/browser/components/TabBar.jsx Co-Authored-By: Guillermo Vayá * Update src/main/Validator.js Co-Authored-By: Guillermo Vayá * Lint fixes * Moved react-smooth-dnd fork to MM org and fixed another merge issue Co-authored-by: mattermod Co-authored-by: Guillermo Vayá --- .gitignore | 4 + electron-builder.json | 2 +- package-lock.json | 1624 +++++++++++++++++ package.json | 6 +- scripts/fix_catalina_dark_mode_debug.js | 13 + ...ek-ext_greek_cyrillic_vietnamese-600.woff2 | Bin 0 -> 63736 bytes src/assets/icon-session-expired.svg | 3 + .../linux/dark/MenuIconMentionTemplate.png | Bin 1165 -> 732 bytes src/assets/linux/dark/MenuIconTemplate.png | Bin 1137 -> 649 bytes .../linux/dark/MenuIconUnreadTemplate.png | Bin 1086 -> 730 bytes .../linux/light/MenuIconMentionTemplate.png | Bin 872 -> 768 bytes src/assets/linux/light/MenuIconTemplate.png | Bin 544 -> 692 bytes .../linux/light/MenuIconUnreadTemplate.png | Bin 1052 -> 766 bytes src/assets/osx/ClickedMenuIcon.png | Bin 332 -> 447 bytes src/assets/osx/ClickedMenuIcon@2x.png | Bin 598 -> 956 bytes src/assets/osx/ClickedMenuIconMention.png | Bin 345 -> 519 bytes src/assets/osx/ClickedMenuIconMention@2x.png | Bin 688 -> 1077 bytes src/assets/osx/ClickedMenuIconUnread.png | Bin 335 -> 513 bytes src/assets/osx/ClickedMenuIconUnread@2x.png | Bin 684 -> 1068 bytes src/assets/osx/MenuIcon.png | Bin 344 -> 426 bytes src/assets/osx/MenuIcon@2x.png | Bin 719 -> 883 bytes src/assets/osx/MenuIconMention.png | Bin 342 -> 482 bytes src/assets/osx/MenuIconMention@2x.png | Bin 766 -> 1012 bytes src/assets/osx/MenuIconUnread.png | Bin 344 -> 478 bytes src/assets/osx/MenuIconUnread@2x.png | Bin 760 -> 1001 bytes src/assets/titlebar/chrome-close.svg | 3 + src/assets/titlebar/chrome-maximize.svg | 3 + src/assets/titlebar/chrome-minimize.svg | 3 + src/assets/titlebar/chrome-restore.svg | 3 + src/assets/windows/tray.ico | Bin 5342 -> 2462 bytes src/assets/windows/tray_mention.ico | Bin 5342 -> 2462 bytes src/assets/windows/tray_unread.ico | Bin 5342 -> 2462 bytes src/browser/components/ErrorView.jsx | 4 - src/browser/components/Finder.jsx | 2 +- src/browser/components/MainPage.jsx | 271 ++- src/browser/components/MattermostView.jsx | 25 +- src/browser/components/NewTeamModal.jsx | 16 +- src/browser/components/SettingsPage.jsx | 3 +- src/browser/components/TabBar.jsx | 96 +- src/browser/components/TeamList.jsx | 21 +- src/browser/css/components/ErrorView.css | 6 +- src/browser/css/components/Finder.css | 1 - src/browser/css/components/MainPage.css | 7 +- src/browser/css/components/MattermostView.css | 6 +- src/browser/css/components/TabBar.css | 247 ++- src/browser/css/components/TeamListItem.css | 1 - src/browser/css/index.css | 188 ++ src/browser/index.jsx | 63 +- src/browser/webview/mattermost.js | 9 + src/common/config/RegistryConfig.js | 1 + src/common/config/defaultPreferences.js | 3 +- src/common/config/index.js | 15 +- src/common/config/pastDefaultPreferences.js | 17 + src/common/config/upgradePreferences.js | 12 + src/main.js | 29 + src/main/Validator.js | 43 + src/main/mainWindow.js | 6 +- src/main/menus/app.js | 155 +- test/specs/app_test.js | 5 +- test/specs/browser/index_test.js | 29 +- test/specs/browser/settings_test.js | 13 +- test/specs/security_test.js | 4 +- webpack.config.renderer.js | 12 + 63 files changed, 2762 insertions(+), 212 deletions(-) create mode 100644 scripts/fix_catalina_dark_mode_debug.js create mode 100644 src/assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2 create mode 100644 src/assets/icon-session-expired.svg mode change 100644 => 100755 src/assets/linux/dark/MenuIconMentionTemplate.png mode change 100644 => 100755 src/assets/linux/dark/MenuIconTemplate.png mode change 100644 => 100755 src/assets/linux/dark/MenuIconUnreadTemplate.png mode change 100644 => 100755 src/assets/linux/light/MenuIconMentionTemplate.png mode change 100644 => 100755 src/assets/linux/light/MenuIconTemplate.png mode change 100644 => 100755 src/assets/linux/light/MenuIconUnreadTemplate.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIcon.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIcon@2x.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIconMention.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIconMention@2x.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIconUnread.png mode change 100644 => 100755 src/assets/osx/ClickedMenuIconUnread@2x.png mode change 100644 => 100755 src/assets/osx/MenuIcon.png mode change 100644 => 100755 src/assets/osx/MenuIcon@2x.png mode change 100644 => 100755 src/assets/osx/MenuIconMention.png mode change 100644 => 100755 src/assets/osx/MenuIconMention@2x.png mode change 100644 => 100755 src/assets/osx/MenuIconUnread.png mode change 100644 => 100755 src/assets/osx/MenuIconUnread@2x.png create mode 100644 src/assets/titlebar/chrome-close.svg create mode 100644 src/assets/titlebar/chrome-maximize.svg create mode 100644 src/assets/titlebar/chrome-minimize.svg create mode 100644 src/assets/titlebar/chrome-restore.svg diff --git a/.gitignore b/.gitignore index ec82ea5f..4a3daa1f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,7 @@ test-results.xml test_config.json .idea testUserData + +src/browser/*.png +src/browser/*.svg +src/browser/*.woff2 \ No newline at end of file diff --git a/electron-builder.json b/electron-builder.json index 454f6459..1d2bdfb4 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -12,7 +12,7 @@ }, "files": [ "main_bundle.js", - "browser/**/*{.html,.css,_bundle.js}", + "browser/**/*{.html,.css,_bundle.js,.svg,.png}", "assets/**/*", "node_modules/bootstrap/dist/**", "node_modules/simple-spellchecker/dict/*.dic" diff --git a/package-lock.json b/package-lock.json index f9b3a2cf..ea89b3a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1396,6 +1396,13 @@ "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==", "dev": true }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true, + "optional": true + }, "@webassemblyjs/ast": { "version": "1.7.11", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", @@ -1879,6 +1886,32 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true, + "optional": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "optional": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true, + "optional": true + } + } + }, "archiver": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", @@ -2619,6 +2652,297 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "optional": true, + "requires": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + } + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "optional": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + } + }, + "bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "optional": true, + "requires": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "optional": true, + "requires": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + } + }, + "bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "optional": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "optional": true + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "optional": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true, + "optional": true + } + } + }, + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "optional": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true, + "optional": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "optional": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true, + "optional": true + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true, + "optional": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "optional": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "optional": true + }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "optional": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "optional": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, "binary-extensions": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", @@ -3250,6 +3574,19 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "optional": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } + }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -3521,6 +3858,18 @@ "mimic-response": "^1.0.0" } }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "optional": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3663,6 +4012,17 @@ "typedarray": "^0.0.6" } }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "configstore": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", @@ -3698,6 +4058,13 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4013,6 +4380,13 @@ "nth-check": "~1.0.1" } }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true, + "optional": true + }, "css-selector-tokenizer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", @@ -4058,6 +4432,17 @@ } } }, + "css-tree": { + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.5.3" + } + }, "css-value": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", @@ -4076,6 +4461,36 @@ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "optional": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "dev": true, + "optional": true + } + } + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -4085,6 +4500,18 @@ "array-find-index": "^1.0.1" } }, + "cwebp-bin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cwebp-bin/-/cwebp-bin-5.1.0.tgz", + "integrity": "sha512-BsPKStaNr98zfxwejWWLIGELbPERULJoD2v5ijvpeutSAGsegX7gmABgnkRK7MUucCPROXXfaPqkLAwI509JzA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "logalot": "^2.1.0" + } + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -4127,6 +4554,32 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -4136,6 +4589,132 @@ "mimic-response": "^1.0.0" } }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "optional": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "optional": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "optional": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "optional": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "optional": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "optional": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "optional": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -4603,6 +5182,82 @@ "dotenv-expand": "^4.0.1" } }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "optional": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "optional": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "optional": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "optional": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -5590,6 +6245,20 @@ "safe-buffer": "^5.1.1" } }, + "exec-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "optional": true, + "requires": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + } + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -5605,6 +6274,25 @@ "strip-eof": "^1.0.0" } }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "optional": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, "exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", @@ -5731,6 +6419,27 @@ } } }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "optional": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "optional": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5994,6 +6703,31 @@ "ramda": "^0.21.0" } }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "dev": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true, + "optional": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "optional": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", @@ -6075,6 +6809,26 @@ "locate-path": "^2.0.0" } }, + "find-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.1.0.tgz", + "integrity": "sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q==", + "dev": true, + "optional": true, + "requires": { + "array-uniq": "^2.1.0", + "semver-regex": "^2.0.0" + }, + "dependencies": { + "array-uniq": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", + "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==", + "dev": true, + "optional": true + } + } + }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -6828,6 +7582,16 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "optional": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -6855,6 +7619,61 @@ "assert-plus": "^1.0.0" } }, + "gifsicle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-4.0.1.tgz", + "integrity": "sha512-A/kiCLfDdV+ERV/UB+2O41mifd+RxH8jlRG8DMxZO84Bma/Fw0htqZ+hY2iaalLRNyUu7tYZQslqUBJxBggxbg==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "execa": "^1.0.0", + "logalot": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -7013,6 +7832,13 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true, + "optional": true + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -7081,12 +7907,29 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true, + "optional": true + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "optional": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -7213,6 +8056,13 @@ "wbuf": "^1.1.0" } }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true, + "optional": true + }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", @@ -7440,6 +8290,191 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "image-webpack-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/image-webpack-loader/-/image-webpack-loader-5.0.0.tgz", + "integrity": "sha512-Ov7xyNTpeKqF31UTnFPNxLohsYVGUJA4lKU0Tjld5iIGfqzUMtkaU3/3MDE/QGPV6jfm0ai+vekJHp+VujUpFw==", + "dev": true, + "requires": { + "imagemin": "^6.1.0", + "imagemin-gifsicle": "^6.0.0", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-optipng": "^6.0.0", + "imagemin-pngquant": "^6.0.0", + "imagemin-svgo": "^7.0.0", + "imagemin-webp": "^5.0.0", + "loader-utils": "^1.2.3", + "object-assign": "^4.1.1" + } + }, + "imagemin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", + "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", + "dev": true, + "requires": { + "file-type": "^10.7.0", + "globby": "^8.0.1", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^4.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "imagemin-gifsicle": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-6.0.1.tgz", + "integrity": "sha512-kuu47c6iKDQ6R9J10xCwL0lgs0+sMz3LRHqRcJ2CRBWdcNmo3T5hUaM8hSZfksptZXJLGKk8heSAvwtSdB1Fng==", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "^3.0.0", + "gifsicle": "^4.0.0", + "is-gif": "^3.0.0" + } + }, + "imagemin-mozjpeg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz", + "integrity": "sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==", + "dev": true, + "optional": true, + "requires": { + "execa": "^1.0.0", + "is-jpg": "^2.0.0", + "mozjpeg": "^6.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "imagemin-optipng": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-6.0.0.tgz", + "integrity": "sha512-FoD2sMXvmoNm/zKPOWdhKpWdFdF9qiJmKC17MxZJPH42VMAp17/QENI/lIuP7LCUnLVAloO3AUoTSNzfhpyd8A==", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^5.0.0" + } + }, + "imagemin-pngquant": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-6.0.1.tgz", + "integrity": "sha512-Stk+fZCLxZznV8MFNA/T3AY/VRKevsiP9uZOLV0RCXoi0vUUFriySYuz/83IGp9D254EW8miGyyQ69zKouFr7w==", + "dev": true, + "optional": true, + "requires": { + "execa": "^0.10.0", + "is-png": "^1.0.0", + "is-stream": "^1.1.0", + "pngquant-bin": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "imagemin-svgo": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.0.0.tgz", + "integrity": "sha512-+iGJFaPIMx8TjFW6zN+EkOhlqcemdL7F3N3Y0wODvV2kCUBuUtZK7DRZc1+Zfu4U2W/lTMUyx2G8YMOrZntIWg==", + "dev": true, + "optional": true, + "requires": { + "is-svg": "^3.0.0", + "svgo": "^1.0.5" + } + }, + "imagemin-webp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/imagemin-webp/-/imagemin-webp-5.1.0.tgz", + "integrity": "sha512-BsPTpobgbDPFBBsI3UflnU/cpIVa15qInEDBcYBw16qI/6XiB4vDF/dGp9l4aM3pfFDDYqR0mANMcKpBD7wbCw==", + "dev": true, + "optional": true, + "requires": { + "cwebp-bin": "^5.0.0", + "exec-buffer": "^3.0.0", + "is-cwebp-readable": "^2.0.1" + } + }, "immer": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/immer/-/immer-1.7.2.tgz", @@ -7682,6 +8717,17 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "optional": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -7780,6 +8826,25 @@ "ci-info": "^2.0.0" } }, + "is-cwebp-readable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz", + "integrity": "sha1-r7k7DAq9CiUQEBauM66ort+SbSY=", + "dev": true, + "optional": true, + "requires": { + "file-type": "^4.3.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true, + "optional": true + } + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7867,6 +8932,16 @@ "number-is-nan": "^1.0.0" } }, + "is-gif": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", + "dev": true, + "optional": true, + "requires": { + "file-type": "^10.4.0" + } + }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -7886,6 +8961,20 @@ "is-path-inside": "^1.0.0" } }, + "is-jpg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", + "dev": true, + "optional": true + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true, + "optional": true + }, "is-npm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", @@ -7918,6 +9007,13 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true, + "optional": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -7942,6 +9038,13 @@ "path-is-inside": "^1.0.1" } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "optional": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -7951,6 +9054,13 @@ "isobject": "^3.0.1" } }, + "is-png": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", + "dev": true, + "optional": true + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -7972,6 +9082,13 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "optional": true + }, "is-root": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", @@ -7984,6 +9101,16 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "optional": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -8075,6 +9202,17 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "optional": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, "js-levenshtein": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", @@ -8388,12 +9526,43 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "optional": true, + "requires": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + } + } + }, "loglevel": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -8425,6 +9594,19 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -8502,6 +9684,19 @@ "safe-buffer": "^5.1.2" } }, + "mdi-react": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mdi-react/-/mdi-react-6.2.0.tgz", + "integrity": "sha512-IM1+/YjJ5DJ4rWKDqphfxra6RM52T6Yiki1pr7dJzoE8B5SoPln0D3wwPMWuwEm9fd8oqsM8eMwAYuim3tgmzg==", + "dev": true + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true, + "optional": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8878,6 +10073,18 @@ "run-queue": "^1.0.3" } }, + "mozjpeg": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-6.0.1.tgz", + "integrity": "sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.1.0" + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -9085,6 +10292,17 @@ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + } + }, "npm-install-package": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", @@ -9425,6 +10643,18 @@ "wordwrap": "~1.0.0" } }, + "optipng-bin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-5.1.0.tgz", + "integrity": "sha512-9baoqZTNNmXQjq/PQTWEXbVV3AMO2sI/GaaqZJZ8SExfAzjijeAP7FEeT+TtyumSw7gr0PZtSUYB/Ke7iHQVKA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + } + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -9440,6 +10670,16 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "optional": true, + "requires": { + "arch": "^2.1.0" + } + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -9508,6 +10748,16 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dev": true, + "optional": true, + "requires": { + "p-timeout": "^1.1.1" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -9544,6 +10794,39 @@ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "optional": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true, + "optional": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "optional": true, + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -9785,6 +11068,51 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pngquant-bin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.2.tgz", + "integrity": "sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "execa": "^0.10.0", + "logalot": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "optional": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "portfinder": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", @@ -10163,6 +11491,13 @@ "object-assign": "^4.1.1" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true, + "optional": true + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -10256,6 +11591,18 @@ "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==", "dev": true }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "optional": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -10644,6 +11991,15 @@ "warning": "^3.0.0" } }, + "react-smooth-dnd": { + "version": "github:mattermost/react-smooth-dnd#af6b471295007274560a375799622c1cd52d678a", + "from": "github:mattermost/react-smooth-dnd#af6b471295007274560a375799622c1cd52d678a", + "dev": true, + "requires": { + "prop-types": ">=15.6.0", + "smooth-dnd": "0.12.1" + } + }, "react-split-pane": { "version": "0.1.85", "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.85.tgz", @@ -11065,6 +12421,12 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -11347,6 +12709,28 @@ "ajv-keywords": "^3.1.0" } }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -11377,6 +12761,23 @@ "semver": "^5.0.3" } }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true, + "optional": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "optional": true, + "requires": { + "semver": "^5.3.0" + } + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -11621,6 +13022,12 @@ } } }, + "smooth-dnd": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/smooth-dnd/-/smooth-dnd-0.12.1.tgz", + "integrity": "sha512-Dndj/MOG7VP83mvzfGCLGzV2HuK1lWachMtWl/Iuk6zV7noDycIBnflwaPuDzoaapEl3Pc4+ybJArkkx9sxPZg==", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -11795,6 +13202,26 @@ } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "optional": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -11959,6 +13386,48 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + } + } + }, "sshpk": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", @@ -11985,6 +13454,13 @@ "figgy-pudding": "^3.5.1" } }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, "stat-mode": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", @@ -12057,6 +13533,13 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "optional": true + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -12130,6 +13613,16 @@ "is-utf8": "^0.2.0" } }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "optional": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -12151,6 +13644,16 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", @@ -12251,6 +13754,54 @@ } } }, + "svgo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.33", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "optional": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "optional": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -12332,6 +13883,13 @@ "xtend": "^4.0.0" } }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true, + "optional": true + }, "temp-file": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", @@ -12370,6 +13928,17 @@ } } }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "optional": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -12525,6 +14094,13 @@ "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "optional": true + }, "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", @@ -12639,6 +14215,16 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -12754,6 +14340,30 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dev": true, + "optional": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -12856,6 +14466,13 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true, + "optional": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -13061,6 +14678,13 @@ "prepend-http": "^2.0.0" } }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true, + "optional": true + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", diff --git a/package.json b/package.json index b693b725..7f07bf63 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "url": "git://github.com/mattermost/desktop.git" }, "scripts": { - "postinstall": "electron-builder install-app-deps && npm run extract-dict", + "postinstall": "electron-builder install-app-deps && npm run extract-dict && npm run fix-catalina-dark-mode", + "fix-catalina-dark-mode": "node scripts/fix_catalina_dark_mode_debug.js", "extract-dict": "node scripts/extract_dict.js src/node_modules/simple-spellchecker/dict", "build": "npm-run-all build:*", "build:main": "webpack-cli --bail --config webpack.config.main.js", @@ -64,11 +65,14 @@ "eslint-plugin-import": "^2.14.0", "eslint-plugin-react": "^7.11.1", "file-loader": "^2.0.0", + "image-webpack-loader": "5.0.0", + "mdi-react": "^6.2.0", "mocha": "^5.2.0", "mocha-circleci-reporter": "0.0.3", "npm-run-all": "^4.1.5", "react": "^16.6.3", "react-dom": "^16.6.3", + "react-smooth-dnd": "github:mattermost/react-smooth-dnd#af6b471295007274560a375799622c1cd52d678a", "spectron": "^6.0.0", "style-loader": "^0.23.1", "url-loader": "^1.1.2", diff --git a/scripts/fix_catalina_dark_mode_debug.js b/scripts/fix_catalina_dark_mode_debug.js new file mode 100644 index 00000000..358a7118 --- /dev/null +++ b/scripts/fix_catalina_dark_mode_debug.js @@ -0,0 +1,13 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +const {exec} = require('child_process'); + +if (process.platform === 'darwin') { + exec('plutil -insert NSRequiresAquaSystemAppearance -bool NO ./node_modules/electron/dist/Electron.app/Contents/Info.plist', (err) => { + if (err) { + console.error(err); + } + }); +} + diff --git a/src/assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2 b/src/assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d088697a0918ad5cff449809ed604287981d2735 GIT binary patch literal 63736 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 cSC>z_9vug4(>9u7E9o-M-vA4YQD{Qv*} literal 0 HcmV?d00001 diff --git a/src/assets/icon-session-expired.svg b/src/assets/icon-session-expired.svg new file mode 100644 index 00000000..1a48f58d --- /dev/null +++ b/src/assets/icon-session-expired.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/linux/dark/MenuIconMentionTemplate.png b/src/assets/linux/dark/MenuIconMentionTemplate.png old mode 100644 new mode 100755 index 243955997cf9265f144326954a9c20d7c11ac530..dd4eaa035e728775519c33d93043022b1421e742 GIT binary patch literal 732 zcmV<20wev2P)Px%mPtfGR7ee_R7*=$Q54==dq5P0f%KS!At4R|kE34na1uml5hOG+X;OnCn$%B- zCOJ)^7nM1%L4!cTnl$McL6=A)b0h^tB@rgI`@Vhmx_8~(K3Ag!-&t#Y>pOexbN0iS z`nCz>^T0!38h8P$1^(MO@J(O=Z~-6TTL7`u2<}MoFa99J-vAkS1aS|r3eYx;WL6W1 z4@CK2=^-%l00(~ubO9;52$GslQSm+UlMz=*45O^tD| zuYkPNT2rkiZ3y-6`&BLZs25L;!S!nPOn7iXSs*S4E_U2KlYr>NuZV#fMAyraFJ5R zZ5rDch<<=;qKy-{8;BkBGl0zMYAD3+fznJN-V+NFITw7K{AWNK+#`{&K5*1L1=c0% zMbw&QsH{}g4i)S0Iuc$JSAZ`pIOpudwyfVd9xT^R&KO&=)(m#M$*);!IiWc&$Xj45 zAjVygOOo=>+p>*j!QFDk?N8OMv5(Did!qAoKHC66ys(#2FA2w)*BhKV-VHeY%qt=UY(gy?+y;0pYrBDDw-EP($Nc$foix{RQQUF{22! z18lr$}f3 literal 1165 zcmV;81akX{P)~HDucxPHS{bqrcr2a`%))I&Cm8)8YyZ`F zHDI=YUP;zfaQ>2T>8;hoYkH0hp*-00-%7}eMHX3PK?)}_g=;*}NV2Gs6rq3{<*mO- z16aoj$OA_+Z|EV6&6b(7m5g4L6@M%4hXsu**<+$PQo{QH0}8>$Nr5e;81ddP?TGBf z7hilDC!84lB_-}ENF>ux_y)oqWUc`ErTErC$*OR#a3Vw2X`y+Ea+`$XlTl= zibP=4Vwa1S;GEetdv3u67n~9MUkZN^{JTn_+|CoBt-qomSt=4f9dOh-3`uojqd_ZW%AK87Hp4&a-0u%ze~xVFwRQ_ zHWrgUA0Sib&IuY~xk6}49|N|_B{koC^Uc)J(J@Qj7yaGLHF;|rZk!`#F1uHAKX*7} z#pz&9ysH;pc;Oiw64369z1sorv)pKiJaaQ(dshUN!}==mxQGlNNloYRC_K9#g6<^) zZ<0AZ!8#|%h`$J&dmnN>!rrza?=EE?k->W+>Q#w6U7&yoSCTTEpGz8*?^9Us&Thxp z5;*4`&xj-b=LKFTmvqa;1pJ6D%}V4oL#OW63z|JjqkP06E@`N^LpP!Tz|F*Cdvts5 z0chaAX8Smv*>_l`fJee|oHZ_?)_()BO zI{GJE(uz-i$@Lt=5S3t#K;zk!fOE3LO;!PVHY?D;@{r)6qy)zgtOQ%_l!hQA#&HtX z8x)8gazo+Wt|Z)T5=pq5s^He#-JUH91+QB*p`E3`QD7Jn4Rw* z7FlqK&v~n1{YiR|{7x`FfjD&g=)wa+@&>!$X1qHvz79Cv*E646%nSB*);4fPE;h}% fx4n}v|7X+z$sbI881yh`00000NkvXXu0mjfa8@fg diff --git a/src/assets/linux/dark/MenuIconTemplate.png b/src/assets/linux/dark/MenuIconTemplate.png old mode 100644 new mode 100755 index 284e450258aace36822fd67c3a00bb0fda87fd6e..c1f634afa2d18fe123e836250ca6eab0cb0b9082 GIT binary patch literal 649 zcmV;40(Sk0P)Px%LrFwIR7ee_mdi_3Q542cK}BXpgwl%!QG*6Hvq1_g&7qe0Se-yexg2 zCVT*2!>6zXt{Z!)a0mW@|8u@$JqQEM827?yWbH%z6-MDP>{GA_I_~2vc>ud7@vGd+ zME*e)e*sUxBHSV<&4(nZW4w~Y%I;aLDE<;#$5ez~f}vYZ1ao=rbP~_>GCx5*l{OuQ zML0t63zSY&Bgc6h#Xm#UEJH6eHVu`dmBtR-1=EFoOQkHE$Tg~2f;# zA&jEFZcoI=bKP&&(yzE`8=oZNaL<{>i_6{>B3l=8{f&(notAiRwwoH$TG(8Wn8{<^ zYS3YVpJuzc)g80{Vrw{3yv+mcYS3cYR45QGI9id|mwUIOq_R~Vq5A^n5UM~U0 z74cl~E{E?gQP!fhICYI?S4$xyI75oWz>BG;o_Y#1PLKcPbvMemM>!=z16MIxf7>2l zStWo79AI^05yG{iHnmVp(TnurZ{~e(VVsK*i>6wMfk5-jE1nGjq%_ z$H-oARP+}~+?*&R-($vCq-+=H0c{drS4ie5d!ZLHY#lG%1EyH?pieZ5#bP;zN;g4K z)kAKc1AQT|X^h+yQ%o@izJE#iF7!{Ak#;*B8`b*@6UCCF@lhf3CS{el6WCh!dpB4; zc@%IxKSO2X;KO&Wzyv^Oso;Gqx+|HkCeV)rtnGpWIXXHiWPV{3e!_JUBe05l;vZ0{ z6U73RTrLPX&3h!^of9LNCy9GysI6xTPsM|_-K%k)t1`%(sG&~~*iVWz7Vgm|L%DN} z(Ia8#Jf1jAawKpa<=R6au+I<(Y$q-Gl)ZS54^8IpX(gZ$kb>3xD_Z=vqIOJ}8=FJM z34D^_DW?VakyUxB2Jme@$~%cJ;VJx--s*mh!0sg31O6Hipt7!98y@yV8us=)dN`@n zu!Iv%MDTnWUVmu{x)Q?eWm8;Pda@*N2kRPtBW0X|y9n^r9FG zOCrMwH}lLhkC{00V+Sn&XstY@Mb!$Gyk4l}xbpF2OnEK^cnfv^!-7B0Sgjh`sza9F zb0ASca%Gc|;@IYSvx=u$os6Tn8`|kfDo;luwd4$dBNeP)wcBw0c`%AunWt$Qlmu&J zobVGYJEVx{DG1%u$SK$nz31y`ShPL{yg%b$`4los#~J`ek{_ktQGQGTx8Yi8$PUPD@w_-5LIG$stGb;9kF>mVU(hbMU?vbq>$U zhG>k-_Bs=I9QY9U8Tf_wj{|4H_?m@6Vf+x$Px%lu1NER7ee_lud|@Q5eV1J8qPSC>b_`EM%du@|BM%DG8-ajgrBJM6zLHFB`T9 zGrB&Dg@u|l*;q+aBp(?Tnkd2~VR-%i?>)~u=N{+YOP>0_&-47B|M_~)hjYzs7Ujd> zHW&gA!4&Y{rjC2T50HDj!_Ng~lL)Go{EOd!_%pDMuM=+p6G3QKNrpp$cwLnLk#2P($|0@i4LU3Dy3 zKp6hMpJSyW>f)T=V;WmO#BQKH z2~88Y?1^RauYt|#lrO~YR-k!KyebwXa&7p4_z%DaxFRB9yWpg`2c{hP(jtfSFFg14~lA zyEkti9d&(q?$)O2S?2CmDz3Y4M>gDsAl}$xsYb?W=FK{nP6O98c{Yx`9jsTun{KNH zePTrDpLQJILk9;!u0cHK#-Mwn6lg8LY;(<*Z}z&U>B^v(H)RRrn|s}>kL;=t2lR)U=h$D zdcI|=fnHP^X1OkrI#8Z6yJ*s;RuHzCNwN(r0kgqYFam5Pt)2?^8}{VHsKdxRpa1{> M07*qoM6N<$f|_Aa3IG5A literal 1086 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 literal 1052 zcmV+%1mpXOP)t!i( zmWZZ;W5A=}dr${1aSgU$k`CSg29WhE@G4_xfV6=!*1=0a)$iaYFj^Tu3VaK$83^<2 z*cQur3akZglkx7@(Xg&lewPo*dt<&g=mbJxkm(R}CJ?$+`CTqBz!5z$&r!^O1-e5_ zKIj5M_b9*L0$7IaPOy=(?Nwl^gZTo`0AxL)jEMt5z-j_>tR{OA$SQF#A0OKxRnMA? z-6p-F_kdd+kOpME<6!Pp5|;I8^{dW)FZ(k^_ep1lEt zTEK7{^BwALf&Hm593LqO%!-ugn}Wr9UZ_M{6D*iEMTz|o2rUplJPOGAK=HKNtzSVd zn}&+?8$-qV|A4wtqJN72PYUiCHCXbq;J9$HelmPAL;}q~){k}x@U{!{(SDC&WY5~k!|30_XcArF z!oWtW9WX$mnR%pa>P$X!UWr(FZ#i)K7>e#fiT)9O;CAs@097ZLC4j&i0G&E-e4or2 zA1vQZONu5DEYY@d0*?Sye}iGNIi2J3@J+^T7ZYABECuHY5<#fOt2)7 z%L!bKBEup51s9nUXcY-$lC|1Ed9X-d#R)vHA+F!%WBnd+1b@g??p3l@I8+gc<4X2r zRthRy{}SMO5GzQp%Lz;a^<=F@vBtvXwOJCDAcvXp67@w)() WEx2>BO~Z@;00001;0BYyw^b5ch_0Itp)=>Px$c}YY;R5%fJlRZnrP!xunme!)UD563^ zT%^o*o8Ydg`6b#nV2-1B1l6Ge&7ixy4k4|8|9Ls|!xa^X{(?Y{Md(4u7URZ@YI1}g{%fEn)fQJ|x=p(VO@~>Uxt2ry51B?%}CbR?W ztk4X`^BO;Uo)#2aD*wI$b_c_-G3E?U8_E^SI05*AgTcTEK!2Zt<$yUUrHO#A_>5yQ zY<$F;g3EwW$-p}Re8l<0KZ1`1p8=zjz~K-+EJ*wV_*(D@upuy;(TY=eQ_CMMLFQ)7 zzy*NvpFlUjhk`{ATZPuF6zRAHSW(bN1l#}N{SW~9)rgxz%itYmpg-DRI2MP3!j5eD zLh5^lK)=%1hb!=dt^SQ|xg#Y_SYND7;eNn!^v#?24WE@wgzNm~0000007*qoM6N<$ Eg63nGn*aa+ diff --git a/src/assets/osx/ClickedMenuIcon@2x.png b/src/assets/osx/ClickedMenuIcon@2x.png old mode 100644 new mode 100755 index be81be83d68d40ebc33b9682e52729bc81229cd4..c97e02af3c180034b951b9dba3708a33c5867029 GIT binary patch delta 935 zcmV;Y16cgl1iS~3BYyw^b5ch_0Itp)=>Px&c1c7*R9FeMm&;34Q543#g=S?`5RtFc zOlnX$=p|GN2@N6$E1Lxknj}PxiW&$yaT-MbLRK`1utCGJ2PkD!L^QFNq!I;bWu^A} zuIHTA+2?W9ZVNv4dVFi|b@tt7pLH_@vy|!S>0+n{z%H;8tbYYxL31XP8DjiD!opSH zGWZOvjALwdSH;%?R=EB-+e}gnI>9&K$}=3=jga7L0>40{un;kq!2}hc4_NtvaUQIX z%g0{{hJj?e5<144oVQ9p|-q4Pno)es(|FN#cuv)z!S z-iVMK2b}$2Qe;P39clsbTZYpfiW8^-6NaEkH-t!zLA(y=V8+QYhpqxvgAtGXov}uo z1s?GfW09w8=;m^HW$chj@-iGZ!SYbxuMyc|<{Ke=$$z8hQah8?nXCl3PZB!CUQ#f? zzXsBzEg&0(glaJ5C2Gy3+JPoupX4WYzsU=!ByGcSG~|pLb~l44yD*5+>p8UMJ{6$5 z-O5XdKdi&iTO2#ij4i+;J~s)CaRsC;uG}?df+SVDm?Xm{(4Yd=8Hdy<$9Byj*AZhs ziShZaQGZ`yEK>pQiLEt+IQ1&d-*ExY_nPruO1#X(R_Xn8-vAv_OEUZ!m3SM7yMV^< z?}#KA2k{=@%eV>{@+~u-G&!*<+ykX=aJHV9zlan`)D9eSs`5?s1b-`?gn66Hb;O_8j0aUf5g0X2tKP*} zGVfKrMCPak?qOGtS(2roTm(s?Gh(mmIn_h%X5cnCTB|FV2%{RP%T1Cu1R8^cSt#%` z;5cxf99QL@6^cA}enn5P124aiAVekMXNr#^wOa!wKXCJ8dgDK-DV)ucr z+FN%UsvaO-@{Pe?8W`e)<*ImMMIy4ZBLROebX zcnfk7nM}8q`bV{Jf*Kk15^BH3!3&`8iXeJ{9!_~$R|I87{s2iw&?mQmx7q*z002ov JPDHLkV1f=rv9ACC delta 574 zcmV-E0>S;f2i63TBYy%NNklK9Q`N$A6pyn5TN!F@0h9uKlOV z!*c89d5)7z6N3~E``&%$5hv=}BG0ikpvAYvp14@_hUTv)o*vPRJZ z(*YV?`xH-AK4bcnz^!tZ_Mdm(8*Kk5zM_pnjNDy;-G6m8_#?&<*3q>|3^CX%<8dl5 zxm<&`aAg)f7h`~_@wcvfQxY?)`wol72w_`YEnwO_ne+5}0;@(3tdI8$c0rWjJHvMm zj>F#A2PfiTbq&56cwJ#y6Q==89yOR}0*B8Q!-47WT`C^67Vrfoi;==5l79_fBROxZ z|A#Z+J~z34&`4VREopE!rb)fV2$NtV+=fr^8(OsZ4WHpoY!V~zA1ogS8*#}?Px$!AV3xR5%fJk-tkEK^TT-{Be<31T=*N zwMwBO@sdIgE3Zru3-Lej4@e`JG;8Gmc%7DG3vu?c6e1cSbL zmVC?SL*%_3-3UGK6%;Fw3kLG%@CQEo0Y&lyh))*#*n9xRT4?m<0kn&_;@lUnJ!XFc zrO-UW<_@mmVHiNJPdbDU-%_=C#1@R{a@M`$Q!r>nd*}7A?1wr+A2eWH#u_Nz2ZJ9_ zO=K6bmSHkeUw=kB)&O0QVj*Kt(=AM;^>j|{mF3Yu)VJ?iYiEK1UH|xV2b7Z5Mab_T`8*6^&TrS^*_`?_aS$7yH z?O()i&Ni!xrkc##(2_<>!yZG1<6Zm+$8Ia_%oe*ia%UZ3vn`s}z>%07*qoM6N<$f=>hGwg3PC delta 319 zcmV-F0l@x;1latBtT9`&*Su!Ce{5E^ZOsa^ zw`>mC8sj_Zw%uIk@w4Mc7>3Qbhl`OgB>o1w0go|166WA|{twJ=+o*5_(29gM7zj9= zaU=2aTY7C77LT-mo4|X(y!e4$Px&?@2^KR9FeMms^NUVHC&rW*nDBNC`3S zB~#Oc$paa=B|IRPCrUifi1MI#K=a~FF2#$yA-5t#9!R1zavv!vj$1@gZZm`J_dm1u zIctCW>^+XM>VLj<`LDIt_w8?gdmrEXO9_IY8tNP{155!!z<+Nr&G-G+jQ>Zt@My3P zdtjeW^OcI`9TqIf0>jURH?p2DeSZG)u(43p@p*tUsYc&@5g9E1MET z#{v1MO+cSzDSz18!uVUp8XGI>1ajbhNQ{Q&A|XYAsN3So0!t^j$PligceC+=j&ldF zawzDh#Mm*F<5=JIJZo!L7U@RxFpeV(-0CWq{9)>jIYqwfbNL|#~}{T z$@l_XP=5n2ft4FhPRxY3-ICGI0By>Ogq(h0j~aLnth~#r1aTyYp8dV(eipy0m`{OE zknAQ@&S3UIY9r*VhNIJNIXrz66y@H8hT4vfUu%6Yn2R$ycJqPfU+&SP`=R>BEv-c| ziW<Kzl#d`6d&Pm@{V1JnJ+fL zDs+&k)9pnU6~@`PPB?2ZSps=+!M{mfX9e|;Hs*+6sw8mUIt{t)WH9U9oc7#fpG bU&ns{iq~?g3^aPk00000NkvXXu0mjf+-?Ey delta 665 zcmV;K0%rZS2(Sf^BYy&SNklO( zjtv`9gU;;BCOOfv@HGBs$=C+?FLCtYUr@s#uX?r7E)j zr80w&;1(e37OD zGnF{2CGl$M_kzA*?}_EAI#L6CE5|DQ)ViIj6oQL)qTq&8qv-DX8H z@l%lCHh2ehWQhA5S6f_s#ueKr_LnfyQ0UJ}0!|9Zx?00000NkvXXu0mjf@9k4> diff --git a/src/assets/osx/ClickedMenuIconUnread.png b/src/assets/osx/ClickedMenuIconUnread.png old mode 100644 new mode 100755 index 0fe41ebb178bed84423beec4e0f307adb262fa00..0593ea373cd41ec899801df7a22e6b523d593de0 GIT binary patch delta 488 zcmVPx$yGcYrR5%fJkughLK@^2&T-}Hkfz@IO zYibpZS_HAmmMOH5l&10r*aVDCx{yLe3;|J6Sg5R|3M2|*AVR7@5LUJltPE%o7C{7E zjFaz7W@L87f$!Zr=bn4tym`hnEa%)~Sb!h!1s=#k%r{u;w|^KipvEgWgg4L;n#akP zL!KvZsq02)hEJgN4zkfe-UsKf8U_@}cfg;_``FBb)?921<{a9QuQ<0Ev`+SaU?Dbl zvAKj(Xo~~L^+~%B*XN`*iFgCux}3$}ScwKjwAVq8VLR3lTHyi~Wh{f%Of-Z6KmW_F zMl8Y8hWcByUw;~)3(|VkU{KQ;jHG&+Qya28E)ezYU#+!c(SWZ1{s?V}9fMdgG=2tpNv!{h&cTG#qXJ>iA&AH ze$Ry^dVNaG58xCvDx>fLTyVWm)NK>0K}$nbwRi%Bp4U}0tW$4u{07a!r9!9&b1yTxCQ7&f*M8x zPUhWYypDYT+48bNu#x);a3&JK!7^reSqRs1e_4X_kzhJtQh#7OU_}(53s@H=31C;? zK45VaRJ=hW?wJ}7^y2|J9>maW)GOWvJ_44+&kU_jpB>Gn8(+6?p00000NkvXX Hu0mjf#juNB diff --git a/src/assets/osx/ClickedMenuIconUnread@2x.png b/src/assets/osx/ClickedMenuIconUnread@2x.png old mode 100644 new mode 100755 index 1e31bac4b8649bb0ca5889dc8fa7034358218b10..04d3cfe8bc69aed3d8d5f310e6ce24a592046813 GIT binary patch delta 1048 zcmV+z1n2v#1*`~=BYyw^b5ch_0Itp)=>Px&=1D|BR9FeMms^MqVHn3}mKIqdCA7Pa zTS{$m$c4=cE8zlZ<${O{BFcs0f^Bcy$)UKB+_2dwLga!ZN<>bz<%Z8Gq9~^&JAVJ! zneTh%oo{A+%2WUEeGdQUndg1yopYG#76K2Sn0&jJufT727!Afp~({Q?*q@kcU% z(Q!aNWfRcnTYn1n?kN72vEIgtI)Q5NFe1i7dy$Z#K-6tpNs(l( z24+W&c<6$tCbDEjRsjDia2Q<4;oLE?nc5sTq9uuk+lG)*Asvs2W_*Rd0rX2HI1X`u zPR1ADl7AX_39Q_5auO!QJ(i4q4ro(WB;*VQ2h_lOVC7w2C5Yod{Olh@_w)FD#e52U zf@C+Laz?QaG8-XhJsh2Ot?=|sP?Xgtf+;W z0ewu2u}<_Y6h7kk5~gO31hKQNGpO$R>h0&kn}2a?bEkx*>Y++X5SGhnl@ae7grJG zD1Wz#8EP|}OjYi6=$&wpCWdFkRY|-3--KMPfaC!97Ha9A1-S0g#GG^}^u&)^MmX19 zA2z@$JcrhvL!C(M22JRrqJIvr;!wN-O56_~_EABf;$t07!Lchb3&jRlg`eSiRb{Sd0 zJ}AC+!?T^^wG1!cMUHY)4JeBy3JlGl9fW5#V=Q$jYhy#B&UWATu32B6F0OLKVI}f~ z+3FvWK3eq=8UN{2gN-!$nK6`qeHr!HKzsojsX^EN5T=6rG_aL1A(g(4{{RjaViAcQ Sw+Zb40000!(+_<)F+l`aj zMqK{3ad`S;l1w(=dwYD6Ic|35n|ZNiBybiU!q=Du*sM$>Y>nsjwo9qtd~7t-H)Bl$V)QF#~H;U&Q}5H=`XFdx}PtvTX))Q&3&PJ}R{=bpF+*(>ej4h0M%JEK(a zIE1@PhHdJNN&_}ZqpDrlF{+$n<(=g!+{l9SR#WA6eU)!Ts`UHEiNpFSe)lFtgxRbv24 zs>Ex?_i5u%KPx$WJyFpR5%fhlf5g2Q5?sg$V+4)T}sI! z%BqaYYT+Naf5x4x23)U;kqrwO7%Ubmxh18Pjbu;=gO|_eI_GvSu6*nB{9exQcg}Op zbDk{wsUA{ua0FY>2&(JL)PB}6G!L(E0aMTcY64cvUY6ys^?$*ym0ecp+`&pl4MR^Mele^Fh zzp0<(30U_I15nlqPm>Y1%k1J^KwpV%$fjuK!AV3wHI=*1qf#pu8tz-Ig<-sBoO zaX>H|kfT6J(1hy%YtV&1#(RN!q-!@ zTC}4J?WjSD7B_qdpB-0jp#zP`LsFm-owybM2k|DX!xdyGkfRD0ur8jPx&ElET{R9FeMmbq(GQ541}O5DW=A|{$- zjEWX6gW`Ag<@)sjIuY@7G zFf@e5YIHsE3HS;6#**(r{Wn77Fnoh?8w+Do^?7&)pl|#h{V-ez(AYc!= zYF31$M7@H(c@KJHO7>)Yw_VQqAhsL*1zaB3BdVU_IrPoKAWwu59K+%ZU5Z3R4Vy6i2=Y`z4MSYUVD;6j z1oP3pLJLsQ#U&9@Wf3MFOv~}>u4s5>Hnul~_|L5BS;R>sU*K%f6E951{4mJz`8xG+ zIEvBYPFuh4o1rhFpF%?@39E4U_&E7M zQZn{Fm)|uGMYG-G5y}^D2xN`ga+r`3aNqel;x>@hT)A^xfh2J>$$?$d($KCAw3${| z^&6$3k~iOAN`be|*Q5=ELt%jnh!Zbh{2u2h*dDX?r}&$kZg?1!S~B6_$su!J0Q&Vaub)^i0y+&njbwd=tk@uu``(C^A*eG|-7K#j12I#%1(t*Wh|p{rp=zxH9D z0{<7fS>a(H#-`W6ADrT^Z|r5Akr{u(s`|T(tbgz$NA)R!(9)nhOUe5tOiG=8_{6XY{|k@_*;+~h*MK52lWXjwn1Gv nO;SDS1E}{(KkS90uq=K9{0C`ktup(E00000NkvXXu0mjfUZJK5 delta 696 zcmV;p0!RJx2G0eMBYy&xNkl(^{7%J@z2qEo?=3+Kw&_5`Q{8LRr61r^|liyNe;) zmOb{3=}{x0!>N?LsyE39bUB24*U%+nBc`^T27xwbQuZFNr$->r;b`(5%ZR|A(~kKN zT>^DpqU_`cGbSPAF8pNTo}dLj?x?L86Tk(Ow=tdQUsWKX7yqiykrJr$2xToH z5NmNBlRB3^b$?z#(tto<%$5}OF3o}qxR|(gSeKM4wfykfCJ}A=jo?R$+LnJv2$339in@pafq!Ju1@tKEO2*N*lkzwFP}DQD z^B1rr{|aU?{_n|qWOVq1?I~*&H4;`*`8xUt6TV}iTbEtw5m?KwRGuIu3G6I1rN&IDIghccrx0I zAt6SSC4cP9Y&)J#{E^dPBmUR@vsX54?V6F0B-lX}Gf0000Px$oJmAMR5%fJkr za2g@_f+iV@papA6JWUY0X3Ym)t(5o;)N3-J1(QlVoe|5=LJGRU*EGqw3|){Gjw$h^ zrWfe-y!^1s;(zEU`u9B;1Sh?FEnH+8d+I)IcGei1jEX_JI7p0l+??HOgG*=wZPW~R zkdvCTHk;v$dXXPl^PC709R)Ziv0Ki(3G#9ZzntH!DxPXuybgL2sSoy{PDvzpY?u49 zO=^QHSn=%s*sJioe?xa%y}+@zO3gh{9;7`#FAUOd146y^04#%^R2tTx+csR7;$Om3 z&26CC2aG}sEI~VT>Zx?w)|!;H_94Qg@?f9 zt!xk3*1YGpPrWv@V+fYx81@VFqibvN5hpQKU>vps`TzN`=wRouc_AcF_jYU%v5 z?F6aIP7Y^+y8`}hHJv*PUtw_u-^Nyv4qXNqiWj(ndj*?%IsvT1qfGJ&a`W9fLO6uS zxP=9Iz78)jX*FFGfDL$_;O|p)vid#|nS^0jnNL#weX8ciNxq(A7QX>5RrEH5XCpBH O0000Px&u1Q2eR9FeMS4n6TK@{yV$wWmlB8ZBK zOBBRF2x{=47*QjlIT&#{84x`fA_^V^J*W(VH&@V$cv8U)1QkV4$svM7+!F)|m~lf< zFrbN9$M<@=nm<3)HR*sK-qc^-uln6x^}8qGja(*xS_`ZMmVW}%fgxZy@EQ1TG8Z$S z0lI*Uz#r&~0WI}#lxXK@?6F8X3iJSSVd`&yIzUSe9R0u|9f)hsM8XR|F8mAjL0}$W zlTtXp0nDjZgdMP_Dqo~oiO3f~E`AL*pLvvwL*N-;a=0&~9Eb59m?NDwomasPWhUad z&qh?fD=KHTihmyp;$JbAsaR+xp}hj+;;Aqit?;qP9O@eseWTz!hCW8cee;MQagrN0 zlJc#GJqVC5v03qG-WHq#I?iYFR}eVq0!>o(eAwKWa$%!yS6rIB^}hjfdI4_qP)*PEX`Ssk5%hW>eVDlM8$)>0P{GWicz^_W~fFki*W{3EU<5BOnWCq0=FU5tIB|u(>JY$|NM5V$yd&PRPyS zlGzBFvwwdYdcsA{7h^I{0IQKQ4Th@_-a>Y}t-ufv%FBh-75)8#yAobzEu1|2lyt^R zJSZwExKP#J+Lm=?e^~%~{|xDb-UOUeK5a6Wcg~l#iY>|R-i{MkxDifkt3|>P3OPT% zxO{&_+jSmCpO{lob~=BP1Zw1vvv^N$$34{36o0iiXUWDgP2{p*`dH~(DoS|Pw<%ww z$t%xznN^Vl6(E;6bn`ayT;HUjgh#6i_^JFkCZG90-@t3vmFFY`1|LUZvaphO;12M^ zLgLGUN6gg~J#M(Ti*qgJFqZ{zGhC+AB77&Xz{!@F?+SK%RM_cfE(@TrA$0rN@Sins zwSNLDhKGEQIcgDMr@PD)@By@xgIbPQGr*6ELI*E)$P~at?n-`=xug!kS&EQWb{sP; z3*h%WyIW_T8Tcg>3OihA#8j9o3t&3CVlBY;LzJwO0k&5jDd`)D&K&0I0+`G1cfO}v zXjp`OBYf?$x3j%kcup5{m}@J5iD{q)NLT@W&&Ft^6iS0JII_1Vyu>5vbLr$VhaB9A zyuyD(dx70RNx)`-{0G$)*xqPgMk6V}tig|0?hk@3`Z=%%$dS0O<9~98K%ylW6dC{k N002ovPDHLkV1fnQ%k%&M delta 743 zcmV2~+&OMcmK&ly|A%n+=_89aa=HBqjqi>*i_hA@K2q6y55Ky{QV z74&xnatK2qf)p;H2h6m=Tm2RPDt>CG!NhmFj z-jL~wEEMiL{d1*Q^8j{wDBc-4_@J~H2Eoh*M70%`k$R#--GFPVBQA?;QH*q0Dg_^s z=26{>uqeJ7Zhv_QrM*HJ86+?k|H@dT5WsFrBn_qIP}imS5rlN%BpzWQ!)!66O1&Dn zhW#ts%_ml}n~kq%%tA$k@EU%3y~d!l=Ptz?BZU}z=m*!>%_it&ur4Br6uQG&i!hXS z3IEGV^yH)@*#j zB=MgmcwvcGO=+iH8W<#sUloOI7r$ZSn)ufah+_oYhHFIe;*(974It^E_$1h+G)bOk zxdd?xbtqgxe?PlTyNh4=Z0VdcHlYs};WYXwu(dLoh4lzS32Ah2Xdo{}Um69xvB)sQ zp#&eE8-Il>>TgjQHSinnEu9pUAs~-rq1pIKx`D4Kz%By?OJ_48P=*MO!TM9q4b(yg z3Z@VqfRxh`=qyDH3Z@+AuVp!G!n|eV0Rm8lFcykO$1WoiEhE(&_QESX63g(ZEH5H6 z4IP?DqMx{m%Y5|aOgumYJ~0bQ%)+(OJx2O!cVNjXq!7Ss#Bcy+6Tdu8yN&B!i&xO! z8rTg#QpjP6XksEhi=F-3IBEsh_>75Oi~k)ipaaCk&|Px$m`OxIR5%fJlg}%JK^Vv9wQGrkS`N~3 zMt&Y7Cyovr~q^ ze4lw{=bfiD=C7)-X5bWdpa7)u%=G^lA*I51xPdV!1*r!XZGV(GC_jv|Q)T=#vgX#bO(r z1_-{OTE;AB!;%)BMu=Up=6x?$Nc;+_HJ6|bqgr@6BbJ|n4QK&h<1Ef)=z+9xNDEIY zdWJU7%MF_Y9DiL!-@Xgo;H17+z(wC$I`Nq@lO`}7Hkmdjk(e1??+@;Ez!lVk4yu7W z$V$Z@Df^k~h_7TcW*YNwjzhPYc@^YkWq;Y2++yY9%4zd5s3lT6>_I{cD|c1K0wPBYy!ONkli0LkIvd*14-0VsJB2`UTg5?6AbG>x_)nahe zea|)6TPC07*qoM6N<$f;;S#6951J diff --git a/src/assets/osx/MenuIconUnread@2x.png b/src/assets/osx/MenuIconUnread@2x.png old mode 100644 new mode 100755 index 7b0e3386fe298edfdeaae5d9edf7f9ed11bff803..21d8955d8f878547e7e7a0899f1e106ca7fb28fa GIT binary patch delta 980 zcmV;_11tRa1?dNnBYyw^b5ch_0Itp)=>Px&qe(&=_gv_|t zl$zv{2QtD)%!83e9*B4_jVKR_2TmvDZQP0%$%9KKN}-WL^Ds(8u1$F{$1S2v8P}Zc z`}R5O%s>CEwa(d7{`$`PFW`bj*Al z=m8>uUg+}xEsbzgYUg0=;YdmYKLEKf^=Ci>prsCuKfqiaNNP_;!ec-#{1x^-U?yOb zDmXs^%vqoaTVan^KBrlW$a_F8-Uge`+$AFrcnFvr?h7f0VY~vSNvBQcRd7R@i8$`I z5tZ+P%2}@B`+p1Z4;ZUetY}t1djiPCGsUP|;bW0G)YmBbTEV#sJ*DEYc~Foz$z>Z! z`BuaJ3y?3dUh!yN6P&#|&S&#e5IAX#CMkOsY;H`su+cXuE=}J0ZvZ*J0B-c69D!z% zIi4#f7vT0k7Qf4jB$RoW2shiw)O|mw%v`iELxDA*yj4?B9i49$D_Y zc*Dp^_$Y=k;E?(7OTJC_ot)buzmdCfky@w=HlLA8*0}=kzXeVJH$9yDA{IBS4mjjh z+!F+wdPeb?%Z2&ehXAF79CpTT;0DQW09imMogO)WnB-rD%}tq9#vtJ+lRg1*LT(P9 zOhwR~{eNT7Lm#hdT?SCwoK34jiiV~jn4a(;Xke%?l&>nn;wlSgX~@P&p;_{^hR@YHwZwp>1rFcsAD4qOL5TS$Ca@QC@kV!#cT zbaAf59OkkBZie%8T7>Te7C6=t%e(Ts-5K@t5ilH7};*cqTiLC%X$$Zj);1os3Dm#gpl?Cv7p53jx#0>lr z>JxOhJ|m&V?x<4O73%@MA6&9Z2H0MCq@=GLojJ_a1u&Q2?|e^p(y$2oM)9>9_ja^b z3(xOD4s&e-Zn_w=jXGP6rDB0000e_cV}%i zMq{(K-R-~MBqzzqWQ||)$@M*FY--FG=!-en06*?UOYm{)Z&2 zh~s_ee26S8)|dL9J=K~AFtUo`uOkN^tcc+=xEX+`=wX~Zq&k!aD&}s)b#W2JwmLBHwq z?02rxFH01@MLwQ)r@cnkaNbDfIh)Xjg=I$n2RzY~S?G^2tdhnnB^t;#GJ2(eJ%)UR zIIQBsc7Lbvt@80mlNz{=(?*hlbp-U0H2Vv;Ndp&AfY+2+kPJoy))B!p(7=tBHgF#@ zuyBR20j6b3AnEEnN?MMW?%5V>!n|>^0RdP?7#-E4<2A{z#>rhJ_QEb~Qp<3znHQ0p zM@ux3#7FunZuaQinb?2`d}9WF&}wqh TCHrp>00000NkvXXu0mjfUvXkA diff --git a/src/assets/titlebar/chrome-close.svg b/src/assets/titlebar/chrome-close.svg new file mode 100644 index 00000000..cb148f5a --- /dev/null +++ b/src/assets/titlebar/chrome-close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/titlebar/chrome-maximize.svg b/src/assets/titlebar/chrome-maximize.svg new file mode 100644 index 00000000..0d991756 --- /dev/null +++ b/src/assets/titlebar/chrome-maximize.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/titlebar/chrome-minimize.svg b/src/assets/titlebar/chrome-minimize.svg new file mode 100644 index 00000000..62f72c70 --- /dev/null +++ b/src/assets/titlebar/chrome-minimize.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/titlebar/chrome-restore.svg b/src/assets/titlebar/chrome-restore.svg new file mode 100644 index 00000000..7dc8f55b --- /dev/null +++ b/src/assets/titlebar/chrome-restore.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/windows/tray.ico b/src/assets/windows/tray.ico index 4277e0f3382bb5f7998ef2d86f6b6ceef8e92d21..1f7102f09fd914d85acfe3996dd685258a8b5d68 100644 GIT binary patch literal 2462 zcmcImJxF6g5Z(|lMAQqYAqL^jLWqhGv=9+N1Urq`SSxA}BKB5yWjY%>5$qN1Y&}6i z5EToBfIlZ#2#Ul6G+>gs`Nqs+^CbRo+!yxe?aX}pc6Mf7jPdX<6f)fZFiF2LL1RpW z8!wqCH>?X-_C++aeuCQ;w-mQ*sbP*a$e{C8gxO#@5D4TaCMIZebCXi36lJqnX_#+p zY!GD7fi5@LdT2rf=%C5TN!s4tcJyEaTjrmyutyB?o0}W4xwyEX{{DVq-FMr-z<~G;MzAgI z;XX$g=hOGz-QA_Sy1I9H?S1(UXm4*%-U}QhU)lGu3?BlxJLuc?m^U^y(#Xh&+-WQp zqo$^&G9A3n<>jStfQxN#=Rh-JK<^UgHJv=;!tWpP`_xAQWc8CW6oXjD)gZKsz6UrY92Iam)@IiNX zcjx#E902lzxg;;)bD+Jw-QizfUzas^_x$`!#bVLDOpA+)V%yr2)L*0ei5KBlg&E|Isiw9wJfk&0xzy1Eh>@&m|ZGI*AHqWs7o_-ANnNObHD z?**B*&dyF-Ec2S08p68);4Ja;QC|HMiA2PHbaYg7w9Dmk4zKcK)Rvtnc2Z$jhq@bHj49uIlFUV^@j{r!F9W!X8N zo}L_)WHKqX-~g=nEX%L)@p0jpnVE5Hb+WRuQpS%Q18#3`#qVQdWAg0EFFvwy>cjc@ zx#;2?tE;P`Z+CNZbFv3~twYvSj zc6KI@73v%IcvGK;hlk}|QDcyo@B?sve^1@r-7-g~`@d74!4JIozMPz#P&^)|zP>(! ze-W#|jo19*e@tkfh3dl=9N+>cxc>q&ADVgq literal 5342 zcmb7I2W%G05k6yjHNBbMd&dxZ5uMOMh;CYh=pfSsm@4Ws#MDUi-XZW15JHFm(J?Is z(R(ij+hAn#Prh&X=X97y^4>^$d$&9D?auD(% z>R*e|s=E?urKw9;ob!6)PlP zzI>87b7skqA%mn%n^sGnJb8qDhEcI%Me0Ke*|1>)n|SpI=g?O66i~+_+I7Tcd5;wtxHd>61Kr_AHS+S+i!92@@trLPCO$We?7~ zZr!?y{rvfJ-`lrurDMmA5yOWMze}D43l{iNr%o*c1`IHfAL<)7Zsn7EzRTIoj z`;HwuCR{V>+`4sZiH(ibcG!b->eR`VA2w{*9ezxkHqBSMbZL3?=#loFJ$qIP7cQ)G zs#mX`ynOjm+o7*anlwq@IsZ0o+N_9=kLUg-X3CUFwr<_3eSFNFJ6E_SO`A5=_2in> zs#Qy1C%)IOUrYP;?H6JXYOY_uUS$?7S|mk^6p?G!uDKXJdi0Pwb?Qh`Qj+3LpFUmt zCpW)hdDA zMnEQoU*2S`W^;Ay*ODPahTO!Se3~(1M*PsBL!(=^Z24F8Rq@NQQkj@6j`JXm;~d9{ z4ELgV7`?CLAunYpOFsiwr3w3x%Ir#f3nb@EoBkqW z#*9*|STQMDw5S&Pg@OeOs()Y``*`-rtHR&L;2Gl>UTZr1;>8Q`&p~}N{jFis|7OdU zO??3U1hM(ec6*1v(=qs1r~rAsage3a=h(c4a+#&zJ_3l%D)am^L_jTi2b>A^T+boA&^;*U?CKK(!0#X@c-8A^0UEY z-A?~Yvu4dS#%|uc+3hM2hv$;(o;Pn^ zm&eW;bam~%M2Qkos#GbLhcArPjCtPmDOIs__=w_^L%{aP9~{t4z!bK}ojW9E1DCc^*2XTV!zR zqsx>j<9>&ShwHofFXl_Yw7J_b?V0z2FvPcW$+e=b2L=YJZSUK+&&8ZLaiYE(uiuW7 zm=6N5se$@yi!Vd`d1jK?JwcdXF|Vbc^R^S4#ow05cnZAGWZ3p;@$t`G6MsIair5)& zCyy7KH($B${xz|A+k6e%YHMe#-a{KWapHs*%R7V|KYmUKZ256qfx@*=6;tQu^5hBE5~#Ao zAXb9Yz#%sCFiw(nfKwPx$618C;Qt`IgOQ~W&S5Cd$rjkf^--fn#i7K)ms~?0wy9*v zl6}DwOh!L>W!YqVo&vEx6!sgvZQC}9i;MeiANWCkMgNHW;VSNCy$#TVVc6*~r^uBn zSAK^>d%AMviWd4XBj(IYmoBBx_yt&YrVJ|pb``l}#|~qcQ>RYpJq>X|?>$wkRu$yP zf_ty_86))oChr+8rAwDCl=Cu*jEq!2#``Akoy-B4^YA-Onlys-lO;=*7`wisy{8|r z0M;Vf{5bg-Hz?2Ch4~cED$iu^-n}({1T@< zFD~>y%p;hya&H(*$unZa2%U2g#5}GGiGBbwJsUM@bl}UEFB+TaYoNR4SId_#clAmB z^7->;T}S#W=0+sOEUfQZ==v0&KKg0KR;~~4*F}~Qo_vzE;67G;X zx0^R_s_$Svb>zqqSCqLBV>R;*-Ve?9l7V-7>TJ0!Z2pNCkNFdG4PqP3pFdx7AL>S5 zb@1Rp>yp*0R}1~U#V6unU!H)$_Z)d5@1ewtj*fO^Xm89zm`^b$rY#xqow?q9#32&& zy~uke{w=7^n5)_fW317+bLVs%+9Bho{qtZybAv&H1}W>ickk#E*Fyh+d-m+nw$rCi z>z&_tv=NW(+qY}J#r$*a+O^uefB$}s^UOa<%oDI)Jz#^u_+RoLyTkH6O*zI%FYyk; zc*}b@_nW%#&P}4NaBqQ?k7opaqR+Br%Utm}bLMDX)3aw!*}HeI#wFS_F*pzYYoab@ zLyH$LX3o={SbhpX-W5SVWW*T3eZCH{|ZaPCsGo;<0acaSz;y{E>b+w_lEx&C5v$h(X+mK@1y- VI8+%iiGLY?ACZ?blqCkS{tHGuAv6F0 diff --git a/src/assets/windows/tray_mention.ico b/src/assets/windows/tray_mention.ico index 53e49de07cbc9c41d2cba6edd08e30e44fbefe83..6b56c7aaacb0fb006b2d49e05de2e01a321ce2c8 100644 GIT binary patch literal 2462 zcmcIm%}ZNB5Z@Ru)UPUPkRYUo9s(XrO+g3i8FZk_44YbL#OL!BlF20H^LcuXpaWglF!;zb4ibStpqj~K4D9aiF3rr$ zP;YN9H8nNS*w`4|+}s$sp1=mSjGuVK#|Y%7r>A0)%jIZbV1QWH@c8&R-QC^M?_Xs~ ze*Qt9qThuv#~N%cAMSGma6Y~7y}dnZX=yRI@ZtCSsZb~gPVD11`tUyEV64FhFsxYF z^RbE;f{;7TnFAa6OG`^4$6npo`W-S5u-FDU2X&(cbS`7Dm;<}Ly`5H8R_OlzUThH) zjpu$s1_G8R%Mxd-I%sr=sF-iiq@8DH)^?j@+9p+WFFIy$IQsmPih z4h{}zd3jl0AFEFY6N!ZApw<{)`iaJGZf+L*;o)J?u@B*JSY)%avs5mZ?IJUunwp}{ z&Q5s;riIT(d5BLa6cUWl(NSZA3C_&AhJ(SN)L^MpGJ2TT)zwLiv1p6Ww$AVL^t51L zuWst=>ofS;m#%5(9vvNtT;CI0e&=<4;_kuL>-Eyf$%(_o{{BAhrNf8LB@|Psl*rQQ zwAk6|({aDhzu*Hs%}r}-YYzNswJIuSXJ^#d*huksT;5&xi{X^%568#Hk|U4DL+k77 zZWpw$upmC_>+6kdadDB_+S&*`5#;I*z<2bw!^1=AXNVJY?fn>iVsLO!`k!`ynnL}8 z9_erJ;pope2kMB|2|WmR`~3V|FfJ}GC=!Xt9K-eXwalOB&%g)$^L;^H=jP@p8jaG> z(2&$Bz^<;Y1XB;#_cPy@2M>G>^l!w)UVj?L{e%v5t)B1xu4qj6^M8Kd?Y>_9|KyMQ hqDm^L^6IVnseCG}yeh^2n83A?)`u-HfCWro{{`T~xHbR) literal 5342 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 literal 5342 zcmb7I2~br>7HvRe5fGJ%2%@+|P29$aXrj2mxHDrpqsGFOxJ)cHZb6Y~P!=&NV!#NK zn5fZc)N+YVMlC0y%E`pIM-4h|AOfPO>;?z;XYT3$``3>#Gs&&$*Z=kFd;0e6?sIQ{ zrJR(D^7U0x2dlp{P%2a@<>zO8KiW{KkEPAu-};{7q13oWN_CPxq9PjBcB#}r>Guob z^F^+n1uRgxH^%3uGZ+9Ult+H~x?y?XV^ z+O=yJ%FD}P=Dp ziiwlwAZl!Dph)x{Im1$*bU}r(R9;sY7pZnrU&hVM%gfWcnVFdg2nc|;w-1!^#PYYS z+6eGUg?P$GZ!Ky&INd)P(*HsHf)IL)2C}a^T@wjjO4gxsJSH=6;i|&i_B$1Vn_518}`q{#Kb!G zoiu3@{QUfI>eMNtif!ArB073HKH9P!>r-Awa;zI-=PHaJ(-uYd9wRk1?ViyeKYl!V z_Uws!_wH%^ufF;U&6_uen_ENtdF<;bEw||Q#c!{|$jB)Dd-dwo_vX%>dy_9KSFW^l z>eLDO`T6?Wci(-7;NW0wQ&?CS9z1xU+vm-D3vqFA`uF0+i%*XlH7c{Zx*COrg|*(^ z-q^i+xBkY*nl)=cpF~7Npr)ntWMlrFF{WnI|vVQsSljKZ%$A*)F2vrc_yDE6)fOX}%#pQPPBy z{)dRRU0T2V^2^b(2X@K6zp`M#f-2#isxg0x`o4*;>#i}w)saQBRO$Tbs$%RYbJT&R$+#(KBYu$oc&9&rwxXWp`b@cz*qRG0032-jOqhN7h3A$VgIXAFPsX zIL0myu_-+(E9)mXMMZ`9{!%WoGSjgm!yPELok!w5mQrrzruP#Ryc?FMbZ zThXXdBe=OYhLf`==1dbk+E(Ud=R3oDdhTND{28iHYzvBxj?Ss9tkiHB85wBNq6Nf{ zXxg+XLVNdztOMRz;E8&2XPFdZo2hNSTsTYJY1_8#tV4$mX)JOO?eg^WMEmyb5g#9q zTeos?`G+FJy&Z<)^MWNjh9U(;Hh`S9VxItH9LaYDb7FU4O`vY%T{ojUag!=2=D>IwfDI9&@T>imHGZ?RawxsdBA zBT=2xsfq!#Kq=Y2uOTw{z!C&U1|clG^ZdbzSspNQ|OW!-M|@85r4P*Bih>C@b% z$I95HYSix}Vf6h?vC81Yi(a!`G^^YT*v8WFB4h7VSy?r!R&v@MYGOCr%#OA~n>nJ{6( zPx3jlh_Y?brE^Cd`b0Rcl6)tH{48ZpmXbZE3Pk_eC~VecY-ngGm_L~{9DG8FT(ISyltlRSoa_1uG$ix)3K_KoH+=Dq;|K?w90T#0dx`To!5z;Q}7{?|5q zU%5jNvex*5wlWry*U85$K|yUXWPs>OoY8j(WAF27!4D5pcWn5_ii?YRZa4CBCe6ct4Hba_rc#gw^Ns!i5WR_wm;D5}z?+(V|7*8c=$@5&%5- z75))?v7P=|cK-Z%t;+{y$TN=e&Wbb~_(m`Zr_QS)w z1+lpo&0WFZ-oJle$6&5?|NaAH6W3y8!Y1?yZHJJq3ZdN<{F*vrQ1}?5f+0hO+9Soi0|kho>BUpd7u$<))@D=?pzzjcZp-B zi>}X|JE!kzpMCb3yRfEXAEW zckJsWd-I@_C1=i@v3I2(I0wdKN8vnZKMU>W9nVpCN9Enp2y+|3j*-%0%ox2U+R(FS z&+5FE`R%j9`yc;5Ab$7m-R+~X>2#cjF$TsyU7sNHKnfx3>YBi&;^o9!Q2nni8(#R^tJ8dI{uF#fDs1N zR-5=T+xGuRo!R%q;Qssdr89q?tzmhPuhK8uuaX}P;zD3yi -
+
{ + if (event.target === self.topBar.current) { + const upEvent = document.createEvent('MouseEvents'); + upEvent.initMouseEvent('mouseup'); + document.dispatchEvent(upEvent); + } + }); + + // Hack for when it leaves the electron window because apparently mouseleave isn't good enough there... + self.topBar.current.addEventListener('mousemove', () => { + if (event.clientY === 0 || event.clientX === 0 || event.clientX >= window.innerWidth) { + const upEvent = document.createEvent('MouseEvents'); + upEvent.initMouseEvent('mouseup'); + document.dispatchEvent(upEvent); + } + }); + } + ipcRenderer.on('login-request', (event, request, authInfo) => { self.setState({ loginRequired: true, @@ -115,14 +147,32 @@ export default class MainPage extends React.Component { function focusListener() { self.handleOnTeamFocused(self.state.key); self.refs[`mattermostView${self.state.key}`].focusOnWebView(); + self.setState({unfocused: false}); + } + + function blurListener() { + self.setState({unfocused: true}); } const currentWindow = remote.getCurrentWindow(); currentWindow.on('focus', focusListener); + currentWindow.on('blur', blurListener); window.addEventListener('beforeunload', () => { currentWindow.removeListener('focus', focusListener); }); + if (currentWindow.isMaximized()) { + self.setState({maximized: true}); + } + currentWindow.on('maximize', this.handleMaximizeState); + currentWindow.on('unmaximize', this.handleMaximizeState); + + if (currentWindow.isFullScreen()) { + self.setState({fullScreen: true}); + } + currentWindow.on('enter-full-screen', this.handleFullScreenState); + currentWindow.on('leave-full-screen', this.handleFullScreenState); + // https://github.com/mattermost/desktop/pull/371#issuecomment-263072803 currentWindow.webContents.on('devtools-closed', () => { focusListener(); @@ -246,6 +296,32 @@ export default class MainPage extends React.Component { ipcRenderer.on('toggle-find', () => { this.activateFinder(true); }); + + if (process.platform === 'darwin') { + self.setState({ + isDarkMode: remote.systemPreferences.isDarkMode(), + }); + remote.systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => { + self.setState({ + isDarkMode: remote.systemPreferences.isDarkMode(), + }); + }); + } else { + self.setState({ + isDarkMode: this.props.getDarkMode(), + }); + + ipcRenderer.on('set-dark-mode', () => { + this.setDarkMode(); + }); + + this.threeDotMenu = React.createRef(); + ipcRenderer.on('focus-three-dot-menu', () => { + if (this.threeDotMenu.current) { + this.threeDotMenu.current.focus(); + } + }); + } } componentDidUpdate(prevProps, prevState) { @@ -254,6 +330,16 @@ export default class MainPage extends React.Component { } } + handleMaximizeState = () => { + const win = remote.getCurrentWindow(); + this.setState({maximized: win.isMaximized()}); + } + + handleFullScreenState = () => { + const win = remote.getCurrentWindow(); + this.setState({fullScreen: win.isFullScreen()}); + } + handleSelect = (key) => { const newKey = (this.props.teams.length + key) % this.props.teams.length; this.setState({ @@ -269,6 +355,14 @@ export default class MainPage extends React.Component { this.handleOnTeamFocused(newKey); } + handleDragAndDrop = (dropResult) => { + const {removedIndex, addedIndex} = dropResult; + if (removedIndex !== addedIndex) { + const teamIndex = this.props.moveTabs(removedIndex, addedIndex < this.props.teams.length ? addedIndex : this.props.teams.length - 1); + this.handleSelect(teamIndex); + } + } + handleBadgeChange = (index, sessionExpired, unreadCount, mentionCount, isUnread, isMentioned) => { const sessionsExpired = this.state.sessionsExpired; const unreadCounts = this.state.unreadCounts; @@ -362,16 +456,52 @@ export default class MainPage extends React.Component { } } + handleClose = () => { + const win = remote.getCurrentWindow(); + win.close(); + } + + handleMinimize = () => { + const win = remote.getCurrentWindow(); + win.minimize(); + } + + handleMaximize = () => { + const win = remote.getCurrentWindow(); + win.maximize(); + } + + handleRestore = () => { + const win = remote.getCurrentWindow(); + win.restore(); + } + + openMenu = () => { + // @eslint-ignore + this.threeDotMenu.current.blur(); + this.props.openMenu(); + } + + handleDoubleClick = () => { + const doubleClickAction = remote.systemPreferences.getUserDefault('AppleActionOnDoubleClick', 'string'); + const win = remote.getCurrentWindow(); + if (doubleClickAction === 'Minimize') { + win.minimize(); + } else if (doubleClickAction === 'Maximize' && !win.isMaximized()) { + win.maximize(); + } else if (doubleClickAction === 'Maximize' && win.isMaximized()) { + win.unmaximize(); + } + } + addServer = () => { this.setState({ showNewTeamModal: true, }); } - focusOnWebView = (e) => { - if (e.target.className !== 'finder-input') { - this.refs[`mattermostView${this.state.key}`].focusOnWebView(); - } + focusOnWebView = () => { + this.refs[`mattermostView${this.state.key}`].focusOnWebView(); } activateFinder = () => { @@ -393,29 +523,116 @@ export default class MainPage extends React.Component { }); } + setDarkMode() { + this.setState({ + isDarkMode: this.props.setDarkMode(), + }); + } + render() { const self = this; - let tabsRow; - if (this.props.teams.length > 1) { - tabsRow = ( - - - + const tabsRow = ( + + ); + + let topBarClassName = 'topBar'; + if (process.platform === 'darwin') { + topBarClassName += ' macOS'; + } + if (this.state.isDarkMode) { + topBarClassName += ' darkMode'; + } + if (this.state.fullScreen) { + topBarClassName += ' fullScreen'; + } + + let maxButton; + if (this.state.maximized) { + maxButton = ( +
+ +
+ ); + } else { + maxButton = ( +
+ +
); } + let overlayGradient; + if (process.platform !== 'darwin') { + overlayGradient = ( + + ); + } + + let titleBarButtons; + if (process.platform !== 'darwin') { + titleBarButtons = ( + +
+ +
+ {maxButton} +
+ +
+
+ ); + } + + const topRow = ( + +
+ + {tabsRow} + {overlayGradient} + {titleBarButtons} +
+
+ ); + const views = this.props.teams.map((team, index) => { function handleBadgeChange(sessionExpired, unreadCount, mentionCount, isUnread, isMentioned) { self.handleBadgeChange(index, sessionExpired, unreadCount, mentionCount, isUnread, isMentioned); @@ -439,7 +656,7 @@ export default class MainPage extends React.Component { 1} + useSpellChecker={this.props.useSpellChecker} onSelectSpellCheckerLocale={this.props.onSelectSpellCheckerLocale} src={teamUrl} @@ -467,7 +684,9 @@ export default class MainPage extends React.Component { } const modal = ( { this.setState({ showNewTeamModal: false, @@ -498,7 +717,7 @@ export default class MainPage extends React.Component { onCancel={this.handleLoginCancel} /> - { tabsRow } + { topRow } { viewsRow } { this.state.finderVisible ? ( { const webview = this.webviewRef.current; const webContents = webview.getWebContents(); // webContents might not be created yet. - if (webContents && !webContents.isFocused()) { + if (webContents) { webview.focus(); webContents.focus(); } } + handleMouseMove = (event) => { + const moveEvent = document.createEvent('MouseEvents'); + moveEvent.initMouseEvent('mousemove', null, null, null, null, null, null, event.clientX, event.clientY); + document.dispatchEvent(moveEvent); + } + + handleMouseUp = () => { + const upEvent = document.createEvent('MouseEvents'); + upEvent.initMouseEvent('mouseup'); + document.dispatchEvent(upEvent); + } + canGoBack = () => { const webview = this.webviewRef.current; return webview.getWebContents().canGoBack(); @@ -301,7 +319,6 @@ export default class MattermostView extends React.Component { className='errorView' errorInfo={this.state.errorInfo} active={this.props.active} - withTab={this.props.withTab} />) : null; // Need to keep webview mounted when failed to load. @@ -309,7 +326,7 @@ export default class MattermostView extends React.Component { if (this.props.withTab) { classNames.push('mattermostView-with-tab'); } - if (!this.props.active) { + if (!this.props.active || this.state.errorInfo) { classNames.push('mattermostView-hidden'); } @@ -342,11 +359,11 @@ export default class MattermostView extends React.Component { MattermostView.propTypes = { name: PropTypes.string, id: PropTypes.string, + withTab: PropTypes.bool, onTargetURLChange: PropTypes.func, onBadgeChange: PropTypes.func, src: PropTypes.string, active: PropTypes.bool, - withTab: PropTypes.bool, useSpellChecker: PropTypes.bool, onSelectSpellCheckerLocale: PropTypes.func, }; diff --git a/src/browser/components/NewTeamModal.jsx b/src/browser/components/NewTeamModal.jsx index f340c155..3b7bcd67 100644 --- a/src/browser/components/NewTeamModal.jsx +++ b/src/browser/components/NewTeamModal.jsx @@ -9,13 +9,18 @@ import {Modal, Button, FormGroup, FormControl, ControlLabel, HelpBlock} from 're import Utils from '../../utils/util'; export default class NewTeamModal extends React.Component { - constructor() { - super(); + static defaultProps = { + restoreFocus: true, + }; + + constructor(props) { + super(props); this.wasShown = false; this.state = { teamName: '', teamUrl: '', + teamOrder: props.currentOrder || 0, saveStarted: false, }; } @@ -25,6 +30,7 @@ export default class NewTeamModal extends React.Component { teamName: this.props.team ? this.props.team.name : '', teamUrl: this.props.team ? this.props.team.url : '', teamIndex: this.props.team ? this.props.team.index : false, + teamOrder: this.props.team ? this.props.team.order : (this.props.currentOrder || 0), saveStarted: false, }); } @@ -100,6 +106,7 @@ export default class NewTeamModal extends React.Component { url: this.state.teamUrl, name: this.state.teamName, index: this.state.teamIndex, + order: this.state.teamOrder, }); } }); @@ -132,6 +139,8 @@ export default class NewTeamModal extends React.Component { show={this.props.show} id='newServerModal' onHide={this.props.onClose} + container={this.props.modalContainer} + restoreFocus={this.props.restoreFocus} onKeyDown={(e) => { switch (e.key) { case 'Enter': @@ -221,4 +230,7 @@ NewTeamModal.propTypes = { team: PropTypes.object, editMode: PropTypes.bool, show: PropTypes.bool, + modalContainer: PropTypes.object, + restoreFocus: PropTypes.bool, + currentOrder: PropTypes.number, }; diff --git a/src/browser/components/SettingsPage.jsx b/src/browser/components/SettingsPage.jsx index 75b414e2..f76cc77f 100644 --- a/src/browser/components/SettingsPage.jsx +++ b/src/browser/components/SettingsPage.jsx @@ -342,6 +342,7 @@ export default class SettingsPage extends React.Component { onTeamClick={(index) => { backToIndex(index + this.state.buildTeams.length + this.state.registryTeams.length); }} + modalContainer={this} /> @@ -605,7 +606,7 @@ export default class SettingsPage extends React.Component { ) : null; return ( -
+
{ + const orderedTabs = this.props.teams.concat().sort((a, b) => a.order - b.order); + const tabs = orderedTabs.map((team) => { + const index = this.props.teams.indexOf(team); const sessionExpired = this.props.sessionsExpired[index]; let unreadCount = 0; @@ -29,7 +34,7 @@ export default class TabBar extends React.Component { // need "this" let badgeDiv; if (sessionExpired) { badgeDiv = ( -
+
); } else if (mentionCount !== 0) { badgeDiv = ( @@ -37,29 +42,45 @@ export default class TabBar extends React.Component { // need "this" {mentionCount}
); + } else if (unreadCount !== 0) { + badgeDiv = ( +
+ ); } - const id = 'teamTabItem' + index; - // draggable=false is a workaround for https://github.com/mattermost/desktop/issues/667 - // It would obstruct https://github.com/mattermost/desktop/issues/478 - return ( + const id = `teamTabItem${index}`; + const navItem = () => ( { + this.props.onSelect(index); + }} + onSelect={() => { + this.props.onSelect(index); + }} + title={team.name} > - - {team.name} - - { ' ' } - { badgeDiv } - ); +
+ + {team.name} + + { badgeDiv } +
+ + ); + + return ( + ); }); if (this.props.showAddServerButton === true) { tabs.push( @@ -68,36 +89,50 @@ export default class TabBar extends React.Component { // need "this" key='addServerButton' id='addServerButton' eventKey='addServerButton' - title='Add new server' draggable={false} + title='Add new server' + activeKey={this.props.activeKey} + onSelect={() => { + this.props.onAddServer(); + }} > - +
+ +
); } - return ( + + const navContainer = (ref) => ( ); + return ( + { + return !(remote.getCurrentWindow().registryConfigData.teams && remote.getCurrentWindow().registryConfigData.teams.length > 0); + }} + /> + ); } } TabBar.propTypes = { activeKey: PropTypes.number, id: PropTypes.string, + isDarkMode: PropTypes.bool, onSelect: PropTypes.func, teams: PropTypes.array, sessionsExpired: PropTypes.array, @@ -107,4 +142,5 @@ TabBar.propTypes = { mentionAtActiveCounts: PropTypes.array, showAddServerButton: PropTypes.bool, onAddServer: PropTypes.func, + onDrop: PropTypes.func, }; diff --git a/src/browser/components/TeamList.jsx b/src/browser/components/TeamList.jsx index ba845be3..b9e8088c 100644 --- a/src/browser/components/TeamList.jsx +++ b/src/browser/components/TeamList.jsx @@ -20,6 +20,7 @@ export default class TeamList extends React.Component { url: '', name: '', index: false, + order: props.teams.length, }, }; } @@ -27,7 +28,13 @@ export default class TeamList extends React.Component { handleTeamRemove = (index) => { console.log(index); const teams = this.props.teams; + const removedOrder = this.props.teams[index].order; teams.splice(index, 1); + teams.forEach((value) => { + if (value.order > removedOrder) { + value.order--; + } + }); this.props.onTeamsChange(teams); } @@ -38,6 +45,7 @@ export default class TeamList extends React.Component { if ((typeof team.index !== 'undefined') && teams[team.index]) { teams[team.index].name = team.name; teams[team.index].url = team.url; + teams[team.index].order = team.order; } else { teams.push(team); } @@ -48,19 +56,21 @@ export default class TeamList extends React.Component { url: '', name: '', index: false, + order: teams.length, }, }); this.props.onTeamsChange(teams); } - handleTeamEditing = (teamName, teamUrl, teamIndex) => { + handleTeamEditing = (teamName, teamUrl, teamIndex, teamOrder) => { this.setState({ showEditTeamForm: true, team: { url: teamUrl, name: teamName, index: teamIndex, + order: teamOrder, }, }); } @@ -83,7 +93,7 @@ export default class TeamList extends React.Component { function handleTeamEditing() { document.activeElement.blur(); - self.handleTeamEditing(team.name, team.url, i); + self.handleTeamEditing(team.name, team.url, i, team.order); } function handleTeamClick() { @@ -105,6 +115,7 @@ export default class TeamList extends React.Component { const addServerForm = ( { @@ -114,6 +125,7 @@ export default class TeamList extends React.Component { name: '', url: '', index: false, + order: this.props.teams.length, }, }); this.props.setAddTeamFormVisibility(false); @@ -122,6 +134,7 @@ export default class TeamList extends React.Component { const teamData = { name: newTeam.name, url: newTeam.url, + order: newTeam.order, }; if (this.props.showAddTeamForm) { this.props.addServer(teamData); @@ -135,12 +148,14 @@ export default class TeamList extends React.Component { name: '', url: '', index: false, + order: newTeam.order + 1, }, }); this.render(); this.props.setAddTeamFormVisibility(false); }} team={this.state.team} + modalContainer={this.props.modalContainer} />); const removeServer = this.props.teams[this.state.indexToRemoveServer]; @@ -154,6 +169,7 @@ export default class TeamList extends React.Component { this.handleTeamRemove(this.state.indexToRemoveServer); this.closeServerRemoveModal(); }} + modalContainer={this.props.modalContainer} /> ); @@ -176,4 +192,5 @@ TeamList.propTypes = { toggleAddTeamForm: PropTypes.func, setAddTeamFormVisibility: PropTypes.func, onTeamClick: PropTypes.func, + modalContainer: PropTypes.object, }; diff --git a/src/browser/css/components/ErrorView.css b/src/browser/css/components/ErrorView.css index 9a51706d..2abfc61a 100644 --- a/src/browser/css/components/ErrorView.css +++ b/src/browser/css/components/ErrorView.css @@ -1,15 +1,11 @@ .ErrorView { position: absolute; - top: 0px; + top: 32px; right: 0px; bottom: 0px; left: 0px; } -.ErrorView-with-tab { - top: 32px; -} - .ErrorView-hidden { visibility: hidden; } diff --git a/src/browser/css/components/Finder.css b/src/browser/css/components/Finder.css index 8ab08d8e..021c2108 100644 --- a/src/browser/css/components/Finder.css +++ b/src/browser/css/components/Finder.css @@ -8,7 +8,6 @@ border: none; background: #d2d2d2; outline: none; - cursor: pointer; font-size: 18px; height: 26px; } diff --git a/src/browser/css/components/MainPage.css b/src/browser/css/components/MainPage.css index e3518a11..37f3641f 100644 --- a/src/browser/css/components/MainPage.css +++ b/src/browser/css/components/MainPage.css @@ -15,7 +15,7 @@ div[id*="-permissionDialog"] { .finder { position: fixed; top: 0; - right: 20px; + right: 200px; padding: 4px; background: #eee; border: 1px solid #d7d7d7; @@ -24,4 +24,9 @@ div[id*="-permissionDialog"] { border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; font-size: 0px; + -webkit-app-region: no-drag; +} + +.finder.macOS { + right: 20px; } diff --git a/src/browser/css/components/MattermostView.css b/src/browser/css/components/MattermostView.css index 3ab9bc42..98ad72d7 100644 --- a/src/browser/css/components/MattermostView.css +++ b/src/browser/css/components/MattermostView.css @@ -8,16 +8,12 @@ .mattermostView webview, .mattermostView .mattermostView-loadingScreen { position: absolute; - top: 0px; + top: 40px; right: 0px; bottom: 0px; left: 0px; } -.mattermostView-with-tab webview, .mattermostView-with-tab .mattermostView-loadingScreen { - top: 31px; -} - .mattermostView-hidden webview { visibility: hidden; z-index: -1; diff --git a/src/browser/css/components/TabBar.css b/src/browser/css/components/TabBar.css index dd8d785f..6667239e 100644 --- a/src/browser/css/components/TabBar.css +++ b/src/browser/css/components/TabBar.css @@ -1,27 +1,189 @@ +.TabBar { + border: none; + max-height: 36px; + flex: 1 1 auto; + display: flex !important; + flex-wrap: nowrap; + justify-content: flex-start; +} + +.TabBar.darkMode { + background-color: #202124; +} + .TabBar .teamTabItem span { - display: inline-block; + flex: 0 1 auto; overflow: hidden; - text-overflow: ellipsis; white-space: nowrap; - max-width: 170px; + text-align: center; +} + +.TabBar>li { + -webkit-app-region: no-drag; + -webkit-user-select: none; + min-width: 48px; } .TabBar>li>a { - background: rgba(0, 0, 0, 0.05); - border-radius: 2px 2px 0 0; - border: 1px solid #ddd; - color: #888; - height: 31px; - line-height: 29px; + border: none; + border-radius: 0; + height: 32px; + max-height: 32px; + line-height: 16px; margin-right: -1px; - margin-top: 0px; - padding: 0 15px; + margin-top: 4px; + padding: 6px 0; + color: rgba(61,60,64,0.7); + font-family: Arial; + font-size: 14px; + letter-spacing: -0.2px; + transition: 0.3s; } -.TabBar>li.teamTabItem:not(.active)>a:hover { - background-color: #e6e6e6; - border: 1px solid #ddd; - transition: background-color 0.2s ease; +.TabBar.darkMode>li>a { + color: rgba(243,243,243,0.7); +} + +.TabBar>li>a:hover { + background-color: rgba(255,255,255,0.4); + text-decoration: none; + border-radius: 6px 6px 0 0; +} + +.TabBar.darkMode>li>a:hover { + background-color: rgba(50, 54, 57, 0.4); +} + +.TabBar>li>a:focus { + background-color: #fff; + color: rgba(61,60,64,1); + text-decoration: none; + border-radius: 6px 6px 0 0; +} + +.TabBar.darkMode>li>a:focus { + background-color: #323639; + color: rgba(243,243,243,1); +} + +.TabBar>li:before, .TabBar>li:after { + position: absolute; + bottom: -1px; + width: 6px; + height: 6px; + content: ""; + background-color: inherit; + z-index: 9; + flex: 0 0 6px; +} + +.TabBar>li.teamTabItem.active:before, .TabBar>li.teamTabItem.smooth-dnd-ghost:before { + left: -4px; + border-bottom-right-radius: 6px; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + z-index: 9; +} + +.TabBar.darkMode>li.teamTabItem.active:before, .TabBar.darkMode>li.teamTabItem.smooth-dnd-ghost:before { + border-right: 2px solid #323639; + border-bottom: 2px solid #323639; +} + +.TabBar>li.teamTabItem.active:after, .TabBar>li.teamTabItem.smooth-dnd-ghost:after { + border-bottom-left-radius: 6px; + right: -5px; + border-left: 2px solid #fff; + border-bottom: 2px solid #fff; + z-index: 9; +} + +.TabBar.darkMode>li.teamTabItem.active:after, .TabBar.darkMode>li.teamTabItem.smooth-dnd-ghost:after { + border-left: 2px solid #323639; + border-bottom: 2px solid #323639; +} + +.TabBar>li>a>div.TabBar-tabSeperator { + padding: 2px 16px; + max-height: 20px; + display: flex; +} + +.TabBar>li.TabBar-addServerButton{ + transition: none !important; + transform: none !important; + flex: 0 0 auto; + min-width: 40px; +} + +.TabBar>li.TabBar-addServerButton>a{ + color: rgba(61,60,64,0.7); + transition: opacity 0.3s ease-in; +} + +.TabBar>li.TabBar-addServerButton svg{ + margin: -2px; +} + +.TabBar.darkMode>li.TabBar-addServerButton>a{ + color: rgba(243,243,243,0.7); +} + +.TabBar>li.teamTabItem.active>a, .TabBar>li.teamTabItem.smooth-dnd-ghost>a { + border: none; + border-radius: 6px 6px 0 0; + color: rgba(61,60,64,1); + background-color: #fff; + z-index: 9; +} + +.smooth-dnd-no-user-select li.TabBar-addServerButton>a { + opacity: 0; +} + +.TabBar.darkMode>li.teamTabItem.active>a, .TabBar.darkMode>li.teamTabItem.smooth-dnd-ghost>a { + color: #f3f3f3; + background-color: #323639; +} + +.TabBar>li.teamTabItem:not(.active)+.TabBar-addServerButton>a>div.TabBar-tabSeperator { + border-left: 1px solid rgba(61,60,64,0.2); + margin-left: -1px; +} + +.TabBar>li.teamTabItem:not(.active)+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator { + border-left: 1px solid rgba(61,60,64,0.2); + margin-left: -1px; +} + +.TabBar.darkMode>li.teamTabItem:not(.active)+.TabBar-addServerButton>a>div.TabBar-tabSeperator { + border-left: 1px solid rgba(243,243,243,0.2); + margin-left: -1px; +} + +.TabBar.darkMode>li.teamTabItem:not(.active)+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator { + border-left: 1px solid rgba(243,243,243,0.2); + margin-left: -1px; +} + +.TabBar>li.teamTabItem:not(.active):hover+.TabBar-addServerButton>a>div.TabBar-tabSeperator { + border-left: none; + margin-left: 0px; +} + +.TabBar>li.teamTabItem:not(.active):hover+li.teamTabItem:not(.active)>a>div.TabBar-tabSeperator { + border-left: none; + margin-left: 0px; +} + +.TabBar>li.teamTabItem:not(.active)+.TabBar-addServerButton>a:hover>div.TabBar-tabSeperator { + border-left: none; + margin-left: 0px; +} + +.TabBar>li.teamTabItem:not(.active)+li.teamTabItem:not(.active)>a:hover>div.TabBar-tabSeperator { + border-left: none; + margin-left: 0px; } .TabBar .TabBar-addServerButton>a { @@ -29,34 +191,59 @@ background: transparent; color: #999; font-size: 10px; - line-height: 31px; + line-height: 16px; } -.TabBar .TabBar-addServerButton>a:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; - transition: background-color 0.2s ease; +.TabBar.darkMode .TabBar-addServerButton>a { + color: rgba(243,243,243,0.7); +} + +.TabBar .TabBar-dot { + background: #579EFF; + float: right; + height: 6px; + width: 6px; + margin-top: 5px; + margin-left: 8px; + border-radius: 4px; + flex: 0 0 6px; +} + +.TabBar .TabBar-expired { + float: right; + height: 16px; + width: 16px; + margin-left: 8px; + background-image: url(../../../assets/icon-session-expired.svg); + flex: 0 0 16px; +} + +.TabBar.darkMode .TabBar-expired { + filter: invert(100%); + -webkit-filter: invert(100%); } .TabBar .TabBar-badge { - background: #FF1744; + background: #CB2431; float: right; color: white; - min-width: 18px; - font-size: 12px; + font-size: 11px; text-align: center; - line-height: 20px; + line-height: 18px; height: 18px; - margin-left: 5px; - margin-top: 5px; + margin-left: 8px; + border-radius: 100px; padding: 0 5px; - border-radius: 9px; display: flex; justify-content: center; align-items: center; - font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-weight: 600; + font-family: "Open Sans", sans-serif; + font-weight: bold; + min-width: 18px; + margin-top: -1px; + letter-spacing: normal; + -webkit-font-smoothing: antialiased; + flex: 1 0 18px; } .TabBar .TabBar-badge.TabBar-badge-nomention:after { diff --git a/src/browser/css/components/TeamListItem.css b/src/browser/css/components/TeamListItem.css index 28b9449c..2a61a250 100644 --- a/src/browser/css/components/TeamListItem.css +++ b/src/browser/css/components/TeamListItem.css @@ -5,5 +5,4 @@ .TeamListItem-left { display: inline-block; width: calc(100% - 100px); - cursor: pointer; } diff --git a/src/browser/css/index.css b/src/browser/css/index.css index e2287735..1a75ac25 100644 --- a/src/browser/css/index.css +++ b/src/browser/css/index.css @@ -1,5 +1,19 @@ @import url("components/index.css"); +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: url('../../assets/fonts/open-sans-v13-latin-ext_latin_cyrillic-ext_greek-ext_greek_cyrillic_vietnamese-600.woff2') format('woff2'); +} + +html { + height: 100%; +} +body { + min-height: 100%; +} + .hovering-enter { opacity: 0.01; } @@ -26,3 +40,177 @@ .modal-error { color: #a94442; } + +.topBar { + height: 40px; + -webkit-app-region: drag; +} + +.topBar>.topBar-bg { + display: flex; + overflow: hidden; + -webkit-app-region: drag; + height: 36px; + background-color: rgba(0,0,0,0.1); +} + +.topBar>.topBar-bg.unfocused { + opacity: 0.4; +} + +.topBar.darkMode { + background-color: #323639; + color: #fff; +} + +.topBar.darkMode>.topBar-bg { + background-color: #202124; +} + +.topBar .three-dot-menu { + font-size: 20px; + line-height: 20px; + height: 36px; + float: left; + padding-top: 5px; + border: none; + flex: 0 0 40px; + z-index: 9; + color: rgba(61,60,64,0.7); + -webkit-app-region: no-drag; + background-color: rgba(229, 229, 229, 1); +} + +.topBar .three-dot-menu svg { + border-radius: 100px; + padding: 4px; + height: 28px; + width: 28px; +} + +.topBar .three-dot-menu:focus { + outline: none; +} + +.topBar .three-dot-menu:hover svg, .topBar .three-dot-menu:focus svg, .topBar .three-dot-menu:active svg { + outline: none; + background-color: #c8c8c8; +} + +.topBar.darkMode .three-dot-menu:hover svg, .topBar.darkMode .three-dot-menu:focus svg, .topBar.darkMode .three-dot-menu:active svg { + background-color: #383A3F; +} + +.topBar.macOS .three-dot-menu:hover svg, .topBar.macOS .three-dot-menu:focus svg, .topBar.macOS .three-dot-menu:active svg { + background: none !important; +} + +.topBar.macOS .three-dot-menu { + flex-basis: 80px; +} + +.topBar.macOS.fullScreen .three-dot-menu { + flex-basis: 0px; +} + +.topBar.macOS .three-dot-menu>svg { + display: none; +} + +.topBar.darkMode .three-dot-menu { + background-color: #202124; + color: rgba(243,243,243,0.7); +} + +.topBar.darkMode .title-bar-btns { + color: rgba(243,243,243,0.7); + background-color: #202124; +} + +.topBar .title-bar-btns { + position: relative; + line-height: 36px; + height: 36px; + z-index: 9; + color: rgba(61,60,64,0.7); + -webkit-app-region: no-drag; + display: grid; + grid-template-columns: repeat(3, 46px); + background-color: #e5e5e5; +} + +.topBar .title-bar-btns>.button { + grid-row: 1 / span 1; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + user-select: none; +} + +.topBar.darkMode .title-bar-btns>.button:hover { + background: rgba(255,255,255,0.1); +} + +.topBar.darkMode .title-bar-btns>.button:active { + background: rgba(255,255,255,0.2); +} + +.topBar .title-bar-btns>.button:hover { + background: rgba(0,0,0,0.1); +} + +.topBar .title-bar-btns>.button:active { + background: rgba(0,0,0,0.2); +} + +.topBar .title-bar-btns>.close-button:hover { + background: #E81123 !important; +} + +.topBar .title-bar-btns>.close-button:hover>img { + filter: invert(100%); + -webkit-filter: invert(100%); + opacity: 1; +} + +.topBar .title-bar-btns>.close-button:active { + background: #f1707a !important; +} + +.topBar .title-bar-btns>.close-button:active>img { + filter: invert(100%); + -webkit-filter: invert(100%); +} + +.topBar .title-bar-btns img { + opacity: 0.7; +} + +.topBar.darkMode .title-bar-btns img { + filter: invert(100%); + -webkit-filter: invert(100%); +} + +.topBar .title-bar-btns>.min-button { + grid-column: 1; +} +.topBar .title-bar-btns>.max-button, .topBar .title-bar-btns>.restore-button { + grid-column: 2; +} + +.topBar .title-bar-btns>.close-button { + grid-column: 3; +} + +.topBar .overlay-gradient { + flex: 0 0 40px; + z-index: 9; + background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #e5e5e5 100%); + -webkit-app-region: drag; +} + +.topBar.darkMode .overlay-gradient { + background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #202124 100%); +} \ No newline at end of file diff --git a/src/browser/index.jsx b/src/browser/index.jsx index f4c28269..7c945295 100644 --- a/src/browser/index.jsx +++ b/src/browser/index.jsx @@ -26,6 +26,14 @@ const config = new Config(remote.app.getPath('userData') + '/config.json', remot const teams = config.teams; +// Make sure teams have an order +if (teams.every((team) => !team.order)) { + teams.forEach((team, index) => { + team.order = index; + }); + teamConfigChange(teams); +} + remote.getCurrentWindow().removeAllListeners('focus'); if (teams.length === 0) { @@ -33,7 +41,7 @@ if (teams.length === 0) { } const parsedURL = url.parse(window.location.href, true); -const initialIndex = parsedURL.query.index ? parseInt(parsedURL.query.index, 10) : 0; +const initialIndex = parsedURL.query.index ? parseInt(parsedURL.query.index, 10) : getInitialIndex(); let deeplinkingUrl = null; if (!parsedURL.query.index || parsedURL.query.index === null) { @@ -52,6 +60,11 @@ ipcRenderer.on('reload-config', () => { config.reload(); }); +function getInitialIndex() { + const element = teams.find((e) => e.order === 0); + return element ? teams.indexOf(element) : 0; +} + function showBadgeWindows(sessionExpired, unreadCount, mentionCount) { function sendBadge(dataURL, description) { // window.setOverlayIcon() does't work with NativeImage across remote boundaries. @@ -136,6 +149,50 @@ function handleSelectSpellCheckerLocale(locale) { ipcRenderer.send('update-dict', locale); } +function moveTabs(originalOrder, newOrder) { + const tabOrder = teams.concat().map((team, index) => { + return { + index, + order: team.order, + }; + }).sort((a, b) => (a.order - b.order)); + + const team = tabOrder.splice(originalOrder, 1); + tabOrder.splice(newOrder, 0, team[0]); + + let teamIndex; + tabOrder.forEach((t, order) => { + if (order === newOrder) { + teamIndex = t.index; + } + teams[t.index].order = order; + }); + teamConfigChange(teams); + return teamIndex; +} + +function getDarkMode() { + if (process.platform !== 'darwin') { + return config.darkMode; + } + return null; +} + +function setDarkMode() { + if (process.platform !== 'darwin') { + const darkMode = Boolean(config.darkMode); + config.set('darkMode', !darkMode); + return !darkMode; + } + return null; +} + +function openMenu() { + if (process.platform !== 'darwin') { + ipcRenderer.send('open-app-menu'); + } +} + ReactDOM.render( , document.getElementById('content') ); diff --git a/src/browser/webview/mattermost.js b/src/browser/webview/mattermost.js index 5826a3cf..e167cb4e 100644 --- a/src/browser/webview/mattermost.js +++ b/src/browser/webview/mattermost.js @@ -47,6 +47,15 @@ window.addEventListener('load', () => { }); }); +// Sent for drag and drop tabs to work properly +document.addEventListener('mousemove', (event) => { + ipcRenderer.sendToHost('mouse-move', {clientX: event.clientX, clientY: event.clientY}); +}); + +document.addEventListener('mouseup', () => { + ipcRenderer.sendToHost('mouse-up'); +}); + // listen for messages from the webapp window.addEventListener('message', ({origin, data: {type, message = {}} = {}} = {}) => { if (origin !== window.location.origin) { diff --git a/src/common/config/RegistryConfig.js b/src/common/config/RegistryConfig.js index c4724592..4af09019 100644 --- a/src/common/config/RegistryConfig.js +++ b/src/common/config/RegistryConfig.js @@ -72,6 +72,7 @@ export default class RegistryConfig extends EventEmitter { teams.push({ name: team.name, url: team.value, + order: team.order, }); } return teams; diff --git a/src/common/config/defaultPreferences.js b/src/common/config/defaultPreferences.js index 76b95a5c..7658a1f0 100644 --- a/src/common/config/defaultPreferences.js +++ b/src/common/config/defaultPreferences.js @@ -7,7 +7,7 @@ * @param {number} version - Scheme version. (Not application version) */ const defaultPreferences = { - version: 1, + version: 2, teams: [], showTrayIcon: false, trayIconTheme: 'light', @@ -22,6 +22,7 @@ const defaultPreferences = { enableHardwareAcceleration: true, autostart: true, spellCheckerLocale: 'en-US', + darkMode: false, }; export default defaultPreferences; diff --git a/src/common/config/index.js b/src/common/config/index.js index ec086a7e..46b7e95f 100644 --- a/src/common/config/index.js +++ b/src/common/config/index.js @@ -144,6 +144,9 @@ export default class Config extends EventEmitter { get teams() { return this.combinedData.teams; } + get darkMode() { + return this.combinedData.darkMode; + } get localTeams() { return this.localConfigData.teams; } @@ -209,10 +212,16 @@ export default class Config extends EventEmitter { configData = this.readFileSync(this.configFilePath); // validate based on config file version - if (configData.version > 0) { - configData = Validator.validateV1ConfigData(configData); + if (configData.version > 1) { + configData = Validator.validateV2ConfigData(configData); } else { - configData = Validator.validateV0ConfigData(configData); + switch (configData.version) { + case 1: + configData = Validator.validateV1ConfigData(configData); + break; + default: + configData = Validator.validateV0ConfigData(configData); + } } if (!configData) { throw new Error('Provided configuration file does not validate, using defaults instead.'); diff --git a/src/common/config/pastDefaultPreferences.js b/src/common/config/pastDefaultPreferences.js index 20724f45..b47b284d 100644 --- a/src/common/config/pastDefaultPreferences.js +++ b/src/common/config/pastDefaultPreferences.js @@ -7,6 +7,23 @@ const pastDefaultPreferences = { 0: { url: '', }, + 1: { + version: 1, + teams: [], + showTrayIcon: false, + trayIconTheme: 'light', + minimizeToTray: false, + notifications: { + flashWindow: 0, + bounceIcon: false, + bounceIconType: 'informational', + }, + showUnreadBadge: true, + useSpellChecker: true, + enableHardwareAcceleration: true, + autostart: true, + spellCheckerLocale: 'en-US', + }, }; pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences; diff --git a/src/common/config/upgradePreferences.js b/src/common/config/upgradePreferences.js index ca9668aa..38ebadf2 100644 --- a/src/common/config/upgradePreferences.js +++ b/src/common/config/upgradePreferences.js @@ -19,9 +19,21 @@ function upgradeV0toV1(configV0) { return config; } +function upgradeV1toV2(configV1) { + const config = deepCopy(configV1); + config.version = 2; + config.teams.forEach((value, index) => { + value.order = index; + }); + config.darkMode = false; + return config; +} + export default function upgradeToLatest(config) { const configVersion = config.version ? config.version : 0; switch (configVersion) { + case 1: + return upgradeToLatest(upgradeV1toV2(config)); case 0: return upgradeToLatest(upgradeV0toV1(config)); default: diff --git a/src/main.js b/src/main.js index 316d9a07..e43f76e0 100644 --- a/src/main.js +++ b/src/main.js @@ -66,6 +66,7 @@ let registryConfig = null; let config = null; let trayIcon = null; let trayImages = null; +let altLastPressed = false; // supported custom login paths (oath, saml) const customLoginRegexPaths = [ @@ -216,6 +217,9 @@ function initializeInterCommunicationEventListeners() { if (shouldShowTrayIcon()) { ipcMain.on('update-unread', handleUpdateUnreadEvent); } + if (process.platform !== 'darwin') { + ipcMain.on('open-app-menu', handleOpenAppMenu); + } } function initializeMainWindowListeners() { @@ -462,6 +466,19 @@ function handleAppWebContentsCreated(dc, contents) { // implemented to temporarily help solve for https://community-daily.mattermost.com/core/pl/b95bi44r4bbnueqzjjxsi46qiw contents.on('before-input-event', (event, input) => { + if (input.key === 'Alt' && input.type === 'keyUp' && altLastPressed) { + altLastPressed = false; + mainWindow.webContents.send('focus-three-dot-menu'); + return; + } + + // Hack to detect keyPress so that alt+ combinations don't default back to the 3-dot menu + if (input.key === 'Alt' && input.type === 'keyDown') { + altLastPressed = true; + } else { + altLastPressed = false; + } + if (!input.shift && !input.control && !input.alt && !input.meta) { // hacky fix for https://mattermost.atlassian.net/browse/MM-19226 if ((input.key === 'Escape' || input.key === 'f') && input.type === 'keyDown') { @@ -755,9 +772,21 @@ function handleUpdateUnreadEvent(event, arg) { } } +function handleOpenAppMenu() { + Menu.getApplicationMenu().popup({ + x: 18, + y: 18, + }); +} + +function handleCloseAppMenu(event) { + mainWindow.webContents.send('focus-on-webview', event); +} + function handleUpdateMenuEvent(event, configData) { const aMenu = appMenu.createMenu(mainWindow, configData, global.isDev); Menu.setApplicationMenu(aMenu); + aMenu.addListener('menu-will-close', handleCloseAppMenu); // set up context menu for tray icon if (shouldShowTrayIcon()) { diff --git a/src/main/Validator.js b/src/main/Validator.js index 6a615d5b..dd74d43e 100644 --- a/src/main/Validator.js +++ b/src/main/Validator.js @@ -61,6 +61,29 @@ const configDataSchemaV1 = Joi.object({ spellCheckerLocale: Joi.string().regex(/^[a-z]{2}-[A-Z]{2}$/).default('en-US'), }); +const configDataSchemaV2 = Joi.object({ + version: Joi.number().min(2).default(2), + teams: Joi.array().items(Joi.object({ + name: Joi.string().required(), + url: Joi.string().required(), + order: Joi.number().integer().min(0), + })).default([]), + showTrayIcon: Joi.boolean().default(false), + trayIconTheme: Joi.any().allow('').valid('light', 'dark').default('light'), + minimizeToTray: Joi.boolean().default(false), + notifications: Joi.object({ + flashWindow: Joi.any().valid(0, 2).default(0), + bounceIcon: Joi.boolean().default(false), + bounceIconType: Joi.any().allow('').valid('informational', 'critical').default('informational'), + }), + showUnreadBadge: Joi.boolean().default(true), + useSpellChecker: Joi.boolean().default(true), + enableHardwareAcceleration: Joi.boolean().default(true), + autostart: Joi.boolean().default(true), + spellCheckerLocale: Joi.string().regex(/^[a-z]{2}-[A-Z]{2}$/).default('en-US'), + darkMode: Joi.boolean().default(false), +}); + // eg. data['community.mattermost.com'] = { data: 'certificate data', issuerName: 'COMODO RSA Domain Validation Secure Server CA'}; const certificateStoreSchema = Joi.object().pattern( Joi.string().uri(), @@ -113,6 +136,26 @@ export function validateV1ConfigData(data) { return validateAgainstSchema(data, configDataSchemaV1); } +export function validateV2ConfigData(data) { + if (Array.isArray(data.teams) && data.teams.length) { + // first replace possible backslashes with forward slashes + let teams = data.teams.map(({name, url, order}) => { + let updatedURL = url; + if (updatedURL.includes('\\')) { + updatedURL = updatedURL.toLowerCase().replace(/\\/gi, '/'); + } + return {name, url: updatedURL, order}; + }); + + // next filter out urls that are still invalid so all is not lost + teams = teams.filter(({url}) => Utils.isValidURL(url)); + + // replace original teams + data.teams = teams; + } + return validateAgainstSchema(data, configDataSchemaV2); +} + // validate certificate.json export function validateCertificateStore(data) { return validateAgainstSchema(data, certificateStoreSchema); diff --git a/src/main/mainWindow.js b/src/main/mainWindow.js index 39675b09..55a92c54 100644 --- a/src/main/mainWindow.js +++ b/src/main/mainWindow.js @@ -51,7 +51,9 @@ function createMainWindow(config, options) { show: hideOnStartup || false, minWidth: minimumWindowWidth, minHeight: minimumWindowHeight, + frame: false, fullscreen: false, + titleBarStyle: 'hiddenInset', backgroundColor: '#fff', // prevents blurry text: https://electronjs.org/docs/faq#the-font-looks-blurry-what-is-this-and-what-can-i-do webPreferences: { nodeIntegration: true, @@ -156,10 +158,6 @@ function createMainWindow(config, options) { } }); - mainWindow.on('sheet-end', () => { - mainWindow.webContents.send('focus-on-webview'); - }); - // Register keyboard shortcuts mainWindow.webContents.on('before-input-event', (event, input) => { // Add Alt+Cmd+(Right|Left) as alternative to switch between servers diff --git a/src/main/menus/app.js b/src/main/menus/app.js index 12f76d93..e8f694b9 100644 --- a/src/main/menus/app.js +++ b/src/main/menus/app.js @@ -116,79 +116,92 @@ function createTemplate(mainWindow, config, isDev) { role: 'selectall', }], }); + + const viewSubMenu = [{ + label: 'Find..', + accelerator: 'CmdOrCtrl+F', + click(item, focusedWindow) { + focusedWindow.webContents.send('toggle-find'); + }, + }, { + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click(item, focusedWindow) { + if (focusedWindow) { + if (focusedWindow === mainWindow) { + mainWindow.webContents.send('reload-tab'); + } else { + focusedWindow.reload(); + } + } + }, + }, { + label: 'Clear Cache and Reload', + accelerator: 'Shift+CmdOrCtrl+R', + click(item, focusedWindow) { + if (focusedWindow) { + if (focusedWindow === mainWindow) { + mainWindow.webContents.send('clear-cache-and-reload-tab'); + } else { + focusedWindow.webContents.session.clearCache(() => { + focusedWindow.reload(); + }); + } + } + }, + }, { + role: 'togglefullscreen', + }, separatorItem, { + label: 'Actual Size', + accelerator: 'CmdOrCtrl+0', + click() { + mainWindow.webContents.send('zoom-reset'); + }, + }, { + label: 'Zoom In', + accelerator: 'CmdOrCtrl+SHIFT+=', + click() { + mainWindow.webContents.send('zoom-in'); + }, + }, { + label: 'Zoom Out', + accelerator: 'CmdOrCtrl+-', + click() { + mainWindow.webContents.send('zoom-out'); + }, + }, separatorItem, { + label: 'Developer Tools for Application Wrapper', + accelerator: (() => { + if (process.platform === 'darwin') { + return 'Alt+Command+I'; + } + return 'Ctrl+Shift+I'; + })(), + click(item, focusedWindow) { + if (focusedWindow) { + focusedWindow.toggleDevTools(); + } + }, + }, { + label: 'Developer Tools for Current Server', + click() { + mainWindow.webContents.send('open-devtool'); + }, + }]; + + if (process.platform !== 'darwin') { + viewSubMenu.push(separatorItem); + viewSubMenu.push({ + label: 'Toggle Dark Mode', + click() { + mainWindow.webContents.send('set-dark-mode'); + }, + }); + } + template.push({ label: '&View', - submenu: [{ - label: 'Find..', - accelerator: 'CmdOrCtrl+F', - click(item, focusedWindow) { - focusedWindow.webContents.send('toggle-find'); - }, - }, { - label: 'Reload', - accelerator: 'CmdOrCtrl+R', - click(item, focusedWindow) { - if (focusedWindow) { - if (focusedWindow === mainWindow) { - mainWindow.webContents.send('reload-tab'); - } else { - focusedWindow.reload(); - } - } - }, - }, { - label: 'Clear Cache and Reload', - accelerator: 'Shift+CmdOrCtrl+R', - click(item, focusedWindow) { - if (focusedWindow) { - if (focusedWindow === mainWindow) { - mainWindow.webContents.send('clear-cache-and-reload-tab'); - } else { - focusedWindow.webContents.session.clearCache(() => { - focusedWindow.reload(); - }); - } - } - }, - }, { - role: 'togglefullscreen', - }, separatorItem, { - label: 'Actual Size', - accelerator: 'CmdOrCtrl+0', - click() { - mainWindow.webContents.send('zoom-reset'); - }, - }, { - label: 'Zoom In', - accelerator: 'CmdOrCtrl+SHIFT+=', - click() { - mainWindow.webContents.send('zoom-in'); - }, - }, { - label: 'Zoom Out', - accelerator: 'CmdOrCtrl+-', - click() { - mainWindow.webContents.send('zoom-out'); - }, - }, separatorItem, { - label: 'Developer Tools for Application Wrapper', - accelerator: (() => { - if (process.platform === 'darwin') { - return 'Alt+Command+I'; - } - return 'Ctrl+Shift+I'; - })(), - click(item, focusedWindow) { - if (focusedWindow) { - focusedWindow.toggleDevTools(); - } - }, - }, { - label: 'Developer Tools for Current Server', - click() { - mainWindow.webContents.send('open-devtool'); - }, - }], + submenu: viewSubMenu, }); template.push({ label: '&History', diff --git a/test/specs/app_test.js b/test/specs/app_test.js index 0e9dc17d..76457c6a 100644 --- a/test/specs/app_test.js +++ b/test/specs/app_test.js @@ -72,13 +72,15 @@ describe('application', function desc() { it('should show index.html when there is config file', async () => { const config = { - version: 1, + version: 2, teams: [{ name: 'example', url: env.mattermostURL, + order: 0, }, { name: 'github', url: 'https://github.com/', + order: 1, }], showTrayIcon: false, trayIconTheme: 'light', @@ -92,6 +94,7 @@ describe('application', function desc() { useSpellChecker: true, enableHardwareAcceleration: true, autostart: true, + darkMode: false, }; fs.writeFileSync(env.configFilePath, JSON.stringify(config)); await this.app.restart(); diff --git a/test/specs/browser/index_test.js b/test/specs/browser/index_test.js index b2e2e15c..bc584a05 100644 --- a/test/specs/browser/index_test.js +++ b/test/specs/browser/index_test.js @@ -14,13 +14,15 @@ describe('browser/index.html', function desc() { this.timeout(30000); const config = { - version: 1, + version: 2, teams: [{ name: 'example', url: env.mattermostURL, + order: 0, }, { name: 'github', url: 'https://github.com/', + order: 1, }], showTrayIcon: false, trayIconTheme: 'light', @@ -34,6 +36,7 @@ describe('browser/index.html', function desc() { useSpellChecker: true, enableHardwareAcceleration: true, autostart: true, + darkMode: false, }; const serverPort = 8181; @@ -65,16 +68,6 @@ describe('browser/index.html', function desc() { this.server.close(done); }); - it('should NOT show tabs when there is one team', async () => { - fs.writeFileSync(env.configFilePath, JSON.stringify({ - url: env.mattermostURL, - })); - await this.app.restart(); - - const existing = await this.app.client.isExisting('#tabBar'); - existing.should.be.false; - }); - it('should set src of webview from config file', async () => { const src0 = await this.app.client.getAttribute('#mattermostView0', 'src'); src0.should.equal(config.teams[0].url); @@ -107,10 +100,11 @@ describe('browser/index.html', function desc() { it.skip('should show error when using incorrect URL', async () => { this.timeout(30000); fs.writeFileSync(env.configFilePath, JSON.stringify({ - version: 1, + version: 2, teams: [{ name: 'error_1', url: 'http://false', + order: 0, }], })); await this.app.restart(); @@ -120,10 +114,11 @@ describe('browser/index.html', function desc() { it('should set window title by using webview\'s one', async () => { fs.writeFileSync(env.configFilePath, JSON.stringify({ - version: 1, + version: 2, teams: [{ name: 'title_test', url: `http://localhost:${serverPort}`, + order: 0, }], })); await this.app.restart(); @@ -135,13 +130,15 @@ describe('browser/index.html', function desc() { // Skip because it's very unstable in CI it.skip('should update window title when the activated tab\'s title is updated', async () => { fs.writeFileSync(env.configFilePath, JSON.stringify({ - version: 1, + version: 2, teams: [{ name: 'title_test_0', url: `http://localhost:${serverPort}`, + order: 0, }, { name: 'title_test_1', url: `http://localhost:${serverPort}`, + order: 1, }], })); await this.app.restart(); @@ -171,13 +168,15 @@ describe('browser/index.html', function desc() { // Skip because it's very unstable in CI it.skip('should update window title when a tab is selected', async () => { fs.writeFileSync(env.configFilePath, JSON.stringify({ - version: 1, + version: 2, teams: [{ name: 'title_test_0', url: `http://localhost:${serverPort}`, + order: 0, }, { name: 'title_test_1', url: `http://localhost:${serverPort}`, + order: 1, }], })); await this.app.restart(); diff --git a/test/specs/browser/settings_test.js b/test/specs/browser/settings_test.js index 28ff1aa6..4d749275 100644 --- a/test/specs/browser/settings_test.js +++ b/test/specs/browser/settings_test.js @@ -12,13 +12,15 @@ describe('browser/settings.html', function desc() { this.timeout(30000); const config = { - version: 1, + version: 2, teams: [{ name: 'example', url: env.mattermostURL, + order: 0, }, { name: 'github', url: 'https://github.com/', + order: 1, }], showTrayIcon: false, trayIconTheme: 'light', @@ -32,6 +34,7 @@ describe('browser/settings.html', function desc() { useSpellChecker: true, enableHardwareAcceleration: true, autostart: true, + darkMode: false, }; beforeEach(async () => { @@ -357,8 +360,13 @@ describe('browser/settings.html', function desc() { await this.app.client.waitForVisible('#serversSaveIndicator', 10000, true); + const expectedConfig = JSON.parse(JSON.stringify(config.teams.slice(1))); + expectedConfig.forEach((value) => { + value.order--; + }); + const savedConfig = JSON.parse(fs.readFileSync(env.configFilePath, 'utf8')); - savedConfig.teams.should.deep.equal(config.teams.slice(1)); + savedConfig.teams.should.deep.equal(expectedConfig); }); it('should NOT remove existing team on click Cancel', async () => { @@ -512,6 +520,7 @@ describe('browser/settings.html', function desc() { savedConfig.teams.should.deep.contain({ name: 'TestTeam', url: 'http://example.org', + order: 2, }); }); }); diff --git a/test/specs/security_test.js b/test/specs/security_test.js index 9e53c671..02f5169e 100644 --- a/test/specs/security_test.js +++ b/test/specs/security_test.js @@ -16,13 +16,15 @@ describe.skip('security', function desc() { const testURL = `http://localhost:${serverPort}`; const config = { - version: 1, + version: 2, teams: [{ name: 'example_1', url: testURL, + order: 0, }, { name: 'example_2', url: testURL, + order: 1, }], }; diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index b06382a0..5d2008de 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -41,6 +41,18 @@ module.exports = merge(base, { use: { loader: 'url-loader', }, + }, { + test: /\.(svg|woff2)$/, + use: [ + { + loader: 'file-loader', + options: { + name: '[hash].[ext]', + publicPath: './', + }, + }, + {loader: 'image-webpack-loader'}, + ], }], }, node: {