diff --git a/package-lock.json b/package-lock.json index 8d43a648..6bacc13e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -987,7 +987,7 @@ "@babel/plugin-transform-template-literals": "7.2.0", "@babel/plugin-transform-typeof-symbol": "7.2.0", "@babel/plugin-transform-unicode-regex": "7.2.0", - "browserslist": "4.4.0", + "browserslist": "4.4.1", "invariant": "2.2.4", "js-levenshtein": "1.1.6", "semver": "5.6.0" @@ -2181,45 +2181,6 @@ "num2fraction": "1.2.2", "postcss": "7.0.13", "postcss-value-parser": "3.3.1" - }, - "dependencies": { - "browserslist": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", - "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000929", - "electron-to-chromium": "1.3.103", - "node-releases": "1.1.3" - } - }, - "caniuse-lite": { - "version": "1.0.30000929", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", - "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", - "dev": true - }, - "postcss": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", - "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } } }, "aws-sign2": { @@ -2543,7 +2504,7 @@ "create-hmac": "1.1.7", "elliptic": "6.4.1", "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "parse-asn1": "5.1.3" } }, "browserify-zlib": { @@ -2556,12 +2517,12 @@ } }, "browserslist": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.0.tgz", - "integrity": "sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000928", + "caniuse-lite": "1.0.30000929", "electron-to-chromium": "1.3.103", "node-releases": "1.1.3" } @@ -2710,22 +2671,22 @@ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserslist": "4.4.0", - "caniuse-lite": "1.0.30000928", + "browserslist": "4.4.1", + "caniuse-lite": "1.0.30000929", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" } }, "caniuse-db": { - "version": "1.0.30000928", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000928.tgz", - "integrity": "sha512-nAoeTspAEzLjqGSeibzM09WojORi08faeOOI5GBmFWC3/brydovb9lYJWM+p48rEQsdevfpufK58gPiDtwOWKw==", + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000929.tgz", + "integrity": "sha512-bap0KDH7KJ2Hc4zWb1bBJwsyl+76jOukW6TH8uxaVI7BrzF2CnibTj53ro7VZAHB+ucMlIGBC1rhG2BQY0ekeg==", "dev": true }, "caniuse-lite": { - "version": "1.0.30000928", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz", - "integrity": "sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg==", + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", "dev": true }, "caseless": { @@ -2825,7 +2786,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.4", + "fsevents": "1.2.7", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3478,7 +3439,7 @@ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "postcss": "7.0.11", + "postcss": "7.0.13", "timsort": "0.3.0" } }, @@ -3551,7 +3512,7 @@ "cosmiconfig": "5.0.7", "cssnano-preset-default": "4.0.6", "is-resolvable": "1.1.0", - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "cssnano-preset-default": { @@ -3562,7 +3523,7 @@ "requires": { "css-declaration-sorter": "4.0.1", "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-calc": "7.0.1", "postcss-colormin": "4.0.2", "postcss-convert-values": "4.0.1", @@ -3610,7 +3571,7 @@ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "cssnano-util-same-parent": { @@ -3751,6 +3712,11 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -3960,8 +3926,7 @@ "dom-walk": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, "domain-browser": { "version": "1.2.0", @@ -4640,9 +4605,9 @@ "dev": true }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "evp_bytestokey": { @@ -5315,14 +5280,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { "nan": "2.12.1", - "node-pre-gyp": "0.10.0" + "node-pre-gyp": "0.10.3" }, "dependencies": { "abbrev": { @@ -5343,7 +5308,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -5367,7 +5332,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -5403,7 +5368,7 @@ } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -5426,7 +5391,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "2.3.5" } }, "fs.realpath": { @@ -5448,11 +5413,11 @@ "signal-exit": "3.0.2", "string-width": "1.0.2", "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "wide-align": "1.1.3" } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -5472,7 +5437,7 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, @@ -5538,21 +5503,21 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "2.3.5" } }, "mkdirp": { @@ -5570,32 +5535,32 @@ "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, "requires": { "debug": "2.6.9", - "iconv-lite": "0.4.21", + "iconv-lite": "0.4.24", "sax": "1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "1.0.3", "mkdirp": "0.5.1", - "needle": "2.2.0", + "needle": "2.2.4", "nopt": "4.0.1", - "npm-packlist": "1.1.10", + "npm-packlist": "1.2.0", "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.6.0", + "tar": "4.4.8" } }, "nopt": { @@ -5609,19 +5574,19 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, "requires": { "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "npm-bundled": "1.0.5" } }, "npmlog": { @@ -5630,7 +5595,7 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", + "are-we-there-yet": "1.1.5", "console-control-strings": "1.1.0", "gauge": "2.7.4", "set-blocking": "2.0.0" @@ -5690,12 +5655,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", + "deep-extend": "0.6.0", "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" @@ -5719,22 +5684,22 @@ "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -5751,7 +5716,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -5784,7 +5749,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -5802,18 +5767,18 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", + "chownr": "1.1.1", "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", + "minipass": "2.3.5", + "minizlib": "1.2.1", "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "util-deprecate": { @@ -5823,7 +5788,7 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, @@ -5837,7 +5802,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -5955,7 +5920,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, "requires": { "min-document": "2.19.0", "process": "0.5.2" @@ -6282,7 +6246,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000928", + "caniuse-db": "1.0.30000929", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -6295,7 +6259,7 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000928", + "caniuse-db": "1.0.30000929", "electron-to-chromium": "1.3.103" } }, @@ -6306,7 +6270,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000928", + "caniuse-db": "1.0.30000929", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" } @@ -6441,7 +6405,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -7441,9 +7405,9 @@ "dev": true }, "js-base64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz", - "integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-beautify": { @@ -8048,9 +8012,9 @@ "dev": true }, "math-random": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.3.tgz", - "integrity": "sha512-hULdrPg17lCyaJOrDwS4RSGQcc/MFyv1aujidohCsBq2zotkhIns8mMDQ7B8VnKG23xcpa+haU5MLDNyNzCesQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "mathml-tag-names": { @@ -8274,7 +8238,6 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, "requires": { "dom-walk": "0.1.1" } @@ -8480,6 +8443,11 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "nested-property": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/nested-property/-/nested-property-0.0.7.tgz", + "integrity": "sha1-/yIvIzyoeTxoKLQRcJG+pZcTD08=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -8520,9 +8488,9 @@ "dev": true }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "1.4.1", @@ -8532,7 +8500,7 @@ "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", "domain-browser": "1.2.0", - "events": "1.1.1", + "events": "3.0.0", "https-browserify": "1.0.0", "os-browserify": "0.3.0", "path-browserify": "0.0.0", @@ -8546,7 +8514,7 @@ "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", - "util": "0.10.4", + "util": "0.11.1", "vm-browserify": "0.0.4" }, "dependencies": { @@ -10151,7 +10119,7 @@ "@parcel/workers": "1.11.0", "ansi-to-html": "0.6.9", "babylon-walk": "1.0.2", - "browserslist": "4.4.0", + "browserslist": "4.4.1", "chalk": "2.4.2", "clone": "2.1.2", "command-exists": "1.2.8", @@ -10172,9 +10140,9 @@ "micromatch": "3.1.10", "mkdirp": "0.5.1", "node-forge": "0.7.6", - "node-libs-browser": "2.1.0", + "node-libs-browser": "2.2.0", "opn": "5.4.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1", "posthtml": "0.11.3", "posthtml-parser": "0.4.1", @@ -10523,16 +10491,17 @@ } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "4.10.1", "browserify-aes": "1.2.0", "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17" + "pbkdf2": "3.0.17", + "safe-buffer": "5.1.2" } }, "parse-bmfont-ascii": { @@ -10810,9 +10779,9 @@ "dev": true }, "postcss": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.11.tgz", - "integrity": "sha512-9AXb//5UcjeOEof9T+yPw3XTa5SL207ZOIC/lHYP4mbUTEh4M0rDAQekQpVANCZdwQwKhBtFZCk3i3h3h2hdWg==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", + "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", "dev": true, "requires": { "chalk": "2.4.2", @@ -10838,7 +10807,7 @@ "dev": true, "requires": { "css-unit-converter": "1.1.1", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-selector-parser": "5.0.0", "postcss-value-parser": "3.3.1" } @@ -10849,10 +10818,10 @@ "integrity": "sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw==", "dev": true, "requires": { - "browserslist": "4.4.0", + "browserslist": "4.4.1", "color": "3.1.0", "has": "1.0.3", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -10862,7 +10831,7 @@ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -10872,7 +10841,7 @@ "integrity": "sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-discard-duplicates": { @@ -10881,7 +10850,7 @@ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-discard-empty": { @@ -10890,7 +10859,7 @@ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-discard-overridden": { @@ -10899,7 +10868,7 @@ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-discard-unused": { @@ -10958,7 +10927,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -11044,7 +11013,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -11099,7 +11068,7 @@ "integrity": "sha512-yVa0hb03p7xj914Z4qDDA/PGwXYvCEfjJizWVYQvnEQr8SgJ098qejCvbCGk1dDYQpQEGKkvYHQCo66DwTocjg==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-markdown": { @@ -11175,7 +11144,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -11213,7 +11182,7 @@ "dev": true, "requires": { "css-color-names": "0.0.4", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1", "stylehacks": "4.0.1" } @@ -11224,10 +11193,10 @@ "integrity": "sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag==", "dev": true, "requires": { - "browserslist": "4.4.0", + "browserslist": "4.4.1", "caniuse-api": "3.0.0", "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-selector-parser": "3.1.1", "vendors": "1.0.2" }, @@ -11257,7 +11226,7 @@ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11269,7 +11238,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "is-color-stop": "1.1.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11280,9 +11249,9 @@ "dev": true, "requires": { "alphanum-sort": "1.0.2", - "browserslist": "4.4.0", + "browserslist": "4.4.1", "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1", "uniqs": "2.0.0" } @@ -11295,7 +11264,7 @@ "requires": { "alphanum-sort": "1.0.2", "has": "1.0.3", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-selector-parser": "3.1.1" }, "dependencies": { @@ -11318,7 +11287,7 @@ "integrity": "sha512-3+V8+g+i9zUQ/AADNtBj3DVVvSOhRCV7W8Kzn9n4ViWJtSQrSdtIJnxZaupfdTrnhCkY86sAsuKVxBCuyfJDeA==", "dev": true, "requires": { - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-selector-parser": "5.0.0" } }, @@ -11328,7 +11297,7 @@ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-normalize-display-values": { @@ -11338,7 +11307,7 @@ "dev": true, "requires": { "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11350,7 +11319,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "has": "1.0.3", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11362,7 +11331,7 @@ "requires": { "cssnano-util-get-arguments": "4.0.0", "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11373,7 +11342,7 @@ "dev": true, "requires": { "has": "1.0.3", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11384,7 +11353,7 @@ "dev": true, "requires": { "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11394,8 +11363,8 @@ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "browserslist": "4.4.0", - "postcss": "7.0.11", + "browserslist": "4.4.1", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11407,7 +11376,7 @@ "requires": { "is-absolute-url": "2.1.0", "normalize-url": "3.3.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11417,7 +11386,7 @@ "integrity": "sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw==", "dev": true, "requires": { - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11428,7 +11397,7 @@ "dev": true, "requires": { "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11488,7 +11457,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -11525,10 +11494,10 @@ "integrity": "sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug==", "dev": true, "requires": { - "browserslist": "4.4.0", + "browserslist": "4.4.1", "caniuse-api": "3.0.0", "has": "1.0.3", - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-reduce-transforms": { @@ -11539,7 +11508,7 @@ "requires": { "cssnano-util-get-match": "4.0.0", "has": "1.0.3", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1" } }, @@ -11552,7 +11521,7 @@ "chalk": "2.4.2", "lodash": "4.17.11", "log-symbols": "2.2.0", - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-resolve-nested-selector": { @@ -11567,7 +11536,7 @@ "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-sass": { @@ -11577,7 +11546,7 @@ "dev": true, "requires": { "gonzales-pe": "4.2.3", - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-scss": { @@ -11586,7 +11555,7 @@ "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-selector-parser": { @@ -11607,7 +11576,7 @@ "dev": true, "requires": { "lodash": "4.17.11", - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "postcss-svgo": { @@ -11617,7 +11586,7 @@ "dev": true, "requires": { "is-svg": "3.0.0", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-value-parser": "3.3.1", "svgo": "1.1.1" } @@ -11635,7 +11604,7 @@ "dev": true, "requires": { "alphanum-sort": "1.0.2", - "postcss": "7.0.11", + "postcss": "7.0.13", "uniqs": "2.0.0" } }, @@ -11702,7 +11671,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.5.0", + "js-base64": "2.5.1", "source-map": "0.5.7", "supports-color": "3.2.3" } @@ -11810,8 +11779,7 @@ "process": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "2.0.0", @@ -11877,7 +11845,7 @@ "bn.js": "4.11.8", "browserify-rsa": "4.0.1", "create-hash": "1.2.0", - "parse-asn1": "5.1.1", + "parse-asn1": "5.1.3", "randombytes": "2.0.6", "safe-buffer": "5.1.2" } @@ -12005,6 +11973,14 @@ "performance-now": "2.1.0" } }, + "rafl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rafl/-/rafl-1.2.2.tgz", + "integrity": "sha1-/pMPdYIRAg1H44gV9Rlqi+QVB0A=", + "requires": { + "global": "4.3.2" + } + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -12013,7 +11989,7 @@ "requires": { "is-number": "4.0.0", "kind-of": "6.0.2", - "math-random": "1.0.3" + "math-random": "1.0.4" }, "dependencies": { "is-number": { @@ -12064,17 +12040,15 @@ "object-assign": "4.1.1", "prop-types": "15.6.2", "scheduler": "0.13.0-alpha.1" - }, - "dependencies": { - "scheduler": { - "version": "0.13.0-alpha.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.0-alpha.1.tgz", - "integrity": "sha512-W0sH0848sVuPKg+I18vTYQyzVtA4X1lrVgSeXK6KnOPUltFdJcY5nkbTkjGUeS/E0x+eBsNYfSdhJtGjT95njw==", - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" - } - } + } + }, + "react-contextmenu": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-contextmenu/-/react-contextmenu-2.10.0.tgz", + "integrity": "sha512-neiZGpfxfYFjqbcIExi69qruqhB7l0LKEguHDXeizgyTGbJHTwbq1GplXCHIafUAkbGZH8FfD9PBeUcSRG78+Q==", + "requires": { + "classnames": "2.2.6", + "object-assign": "4.1.1" } }, "react-cookie-consent": { @@ -12094,17 +12068,6 @@ "object-assign": "4.1.1", "prop-types": "15.6.2", "scheduler": "0.13.0-alpha.1" - }, - "dependencies": { - "scheduler": { - "version": "0.13.0-alpha.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.0-alpha.1.tgz", - "integrity": "sha512-W0sH0848sVuPKg+I18vTYQyzVtA4X1lrVgSeXK6KnOPUltFdJcY5nkbTkjGUeS/E0x+eBsNYfSdhJtGjT95njw==", - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" - } - } } }, "react-floater": { @@ -12125,10 +12088,27 @@ "integrity": "sha512-g04dz6zrbdHRxVaURPWT3RUbjLflh74sS6dCuhGeZupj7ii+UEt9lwTjALb2ST2w+7wAmzG1YqYlNX4yvRXe1g==" }, "react-is": { - "version": "16.8.0-alpha.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.0-alpha.1.tgz", - "integrity": "sha512-Gsh2u4ovhS2DY6fWgie/av5vzrIfW6P0lgWAsAQp9DjOImE0fJ26FfEdpFXtYBwi5s2krT9z0xvcQKvQsi4ekw==", - "dev": true + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.7.0.tgz", + "integrity": "sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==" + }, + "react-joyride": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.0.2.tgz", + "integrity": "sha512-XJQB4QOPJoC48IU0LkCXwMZIu4Lvgw0AZ5iLyE7xL6l2TXQyk2eN+VOPjLWrRQfk7HBArezHKnc1Fd1jE/KNpA==", + "requires": { + "deep-diff": "1.0.2", + "deepmerge": "3.1.0", + "exenv": "1.2.2", + "is-lite": "0.2.2", + "nested-property": "0.0.7", + "react-floater": "0.6.2", + "react-is": "16.7.0", + "scroll": "2.0.3", + "scroll-doc": "0.2.1", + "scrollparent": "2.0.1", + "tree-changes": "0.4.0" + } }, "react-lifecycles-compat": { "version": "3.0.4", @@ -12170,6 +12150,14 @@ "prop-types": "15.6.2", "react-is": "16.8.0-alpha.1", "scheduler": "0.13.0-alpha.1" + }, + "dependencies": { + "react-is": { + "version": "16.8.0-alpha.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.0-alpha.1.tgz", + "integrity": "sha512-Gsh2u4ovhS2DY6fWgie/av5vzrIfW6P0lgWAsAQp9DjOImE0fJ26FfEdpFXtYBwi5s2krT9z0xvcQKvQsi4ekw==", + "dev": true + } } }, "react-use-promise": { @@ -12984,12 +12972,29 @@ "version": "0.13.0-alpha.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.0-alpha.1.tgz", "integrity": "sha512-W0sH0848sVuPKg+I18vTYQyzVtA4X1lrVgSeXK6KnOPUltFdJcY5nkbTkjGUeS/E0x+eBsNYfSdhJtGjT95njw==", - "dev": true, "requires": { "loose-envify": "1.4.0", "object-assign": "4.1.1" } }, + "scroll": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scroll/-/scroll-2.0.3.tgz", + "integrity": "sha512-3ncZzf8gUW739h3LeS68nSssO60O+GGjT3SxzgofQmT8PIoyHzebql9HHPJopZX8iT6TKOdwaWFMqL6LzUN3DQ==", + "requires": { + "rafl": "1.2.2" + } + }, + "scroll-doc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/scroll-doc/-/scroll-doc-0.2.1.tgz", + "integrity": "sha512-ZLueZaKMkdL1/SL07Fpw/P/MFYit76GaaKQYnjLSx2K6dOUmkYP1TEOyyfKZohvDyoKMwue0l9MbgPesREjqCA==" + }, + "scrollparent": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.0.1.tgz", + "integrity": "sha1-cV1bnMV3YPsivczDvvtb/gaxoxc=" + }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", @@ -13642,8 +13647,8 @@ "integrity": "sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w==", "dev": true, "requires": { - "browserslist": "4.4.0", - "postcss": "7.0.11", + "browserslist": "4.4.1", + "postcss": "7.0.13", "postcss-selector-parser": "3.1.1" }, "dependencies": { @@ -14095,17 +14100,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "postcss": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", - "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" - } - }, "postcss-selector-parser": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", @@ -14149,15 +14143,6 @@ "ansi-regex": "4.0.0" } }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, "write": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", @@ -14191,7 +14176,7 @@ "dev": true, "requires": { "lodash": "4.17.11", - "postcss": "7.0.11", + "postcss": "7.0.13", "postcss-sorting": "4.0.1" } }, @@ -14201,7 +14186,7 @@ "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", "dev": true, "requires": { - "postcss": "7.0.11" + "postcss": "7.0.13" } }, "supports-color": { @@ -14457,6 +14442,15 @@ "punycode": "2.1.1" } }, + "tree-changes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.4.0.tgz", + "integrity": "sha512-ayVwCHFCCm2LtaEqf2cbgt9Em8QTnn6nIMFZErAE4XwdPawRmSSE+AUUrt6MZmwxPqELSH3ZAcOTOkpIvCxhew==", + "requires": { + "deep-diff": "1.0.2", + "nested-property": "0.0.7" + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -14819,9 +14813,9 @@ } }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" diff --git a/package.json b/package.json index 49f5e885..8de9322a 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,13 @@ "react-cookie-consent": "2.0.1", "react-dom": "16.8.0-alpha.1", "react-ga": "2.5.6", + "react-joyride": "2.0.2", "react-outside-click-handler": "1.2.2", "react-svg-inline": "2.1.1", "react-use-promise": "0.0.0-alpha.1", "react-virtualized": "9.21.0", - "react-floater": "0.6.2" + "react-floater": "0.6.2", + "react-contextmenu": "2.10.0" }, "devDependencies": { "@after-work.js/cli": "5.1.3", diff --git a/src/components/app.jsx b/src/components/app.jsx index 3667eb06..a5541182 100644 --- a/src/components/app.jsx +++ b/src/components/app.jsx @@ -1,4 +1,4 @@ -import React, { useMemo, useEffect } from 'react'; +import React, { useMemo, useEffect, useRef } from 'react'; import usePromise from 'react-use-promise'; import enigma from 'enigma.js'; @@ -8,6 +8,8 @@ import TopBar from './topbar'; import Model from './model'; import Splash from './splash'; import Cubes from './cubes'; +import Guide from './guide'; + import { useReloadInProgress } from '../enigma/reload-in-progress-interceptor'; import './app.pcss'; @@ -24,6 +26,8 @@ export default function App() { const [app, appError] = useApp(global); const [docs, docsError] = useDocList(global, appError && global); const appLayout = useLayout(app); + const guideRef = useRef(); + useEffect(() => () => { if (!app) return; session.close(); @@ -51,7 +55,8 @@ export default function App() { return (
- + + guideRef.current.startGuideFunc()} />
diff --git a/src/components/guide-steps.jsx b/src/components/guide-steps.jsx new file mode 100644 index 00000000..bb57e1b7 --- /dev/null +++ b/src/components/guide-steps.jsx @@ -0,0 +1,237 @@ +import React from 'react'; + +const steps = [ + { + content: ( +
+

Welcome to catwalk!

+

+ catwalk lets you explore your data model to gain + insights about fields, associations and how interactions + with the data impacts the model. +

+

+ Follow the guide to discover the power of catwalk. +

+
+ ), + placement: 'center', + target: 'body', + }, + { + content: ( +
+

Welcome to catwalk!

+

The URL to catwalk is

+ + {window.location.href} + +

+ where + {' '} + engine_url + {' '} + points to the app containing the data model. Change this to explore another data model. +

+
+ ), + placement: 'center', + target: 'body', + }, + { + content: ( +
+

+ The highlighted area represents a table in the data model. +

+

On the top we can see the table name, together with the number of rows in the table.

+
+ ), + placement: 'right-start', + target: '.column', + title: 'Table', + }, + { + content: ( +
+

+ Fields, the data-carrying entities in the data model, are represented with a box like this. +

+

+ The field name and the number of field values are visible. +

+

+ The number of field values are presented in the form of X of Y(Z), where X is the number + of field values valid in the current selection, Y is the values in total and Z is the number + of values present in this table. +

+
+ ), + placement: 'right', + target: '.vertcell.keycell', + title: 'Field', + }, + { + content: ( +
+ A field can have different border colors where the color represents different type of keys. +
+
+

Perfect key.

+

+ Indicates that every row contains a key value, and that all of these key values are unique. + The field's subset ratio is 100 percent. +

+
+
+
+

Primary key

+
+

+ Indicates that all key values are unique, but not every row contains a key value or + the field's subset ratio is less than 100 percent. +

+
+
+
+

Key

+
+

+ Indicates that the key is not unique. Usually seen in fact tables, where the same dimension + value may be associated with many different facts. +

+
+
+ ), + target: '.table-field', + title: 'Field', + placement: 'right', + }, + { + content: ( +
+

+ The fields are clickable. When clicking on a field, it unfolds and displays the field values with the possibility to make + selections. Selections can be helpful when trying to figure out the data model, and to find errors in the data model. +

+

+ Go ahead, click the field and make a selection! +

+
+ ), + spotlightClicks: true, + placement: 'right', + target: '.vertcell.keycell', + title: 'Field', + }, + { + step: 'selections', + content: ( +
+

+ The selections made can be seen in the top bar. +

+

+ Selections in any single field can be removed, or all selections in the app can be removed by clicking the X to the left. +

+
+ ), + spotlightClicks: true, + placement: 'bottom', + target: '.selection-field', + title: 'Selections', + }, + { + content: 'This shows the association between two fields, with basic frequency information on each end of the association line (*, 1 or 0/1).', + target: '.association-to-right-b', + title: 'Associations', + }, + { + step: 'openHypercubeBuilder', + content: ( +
+

+ Here you can build your own hypercube with the fields, dimensions and + measure in the app. This could be handy when you want to see how the information + in the datamodel is connected. +

+

+ Click the button to open the hypercube builder. +

+
+ ), + spotlightClicks: true, + disableOverlayClose: true, + hideFooter: true, + target: '.add-button', + title: 'Hypercube builder', + }, + { + step: 'selectEntity', + content: ( +
+

Here you can see a list of all the fields, dimensions and measures defined in the app. The input field on top will filter the list.

+

Click on an entity to select it.

+
+ ), + disableOverlayClose: true, + hideFooter: true, + spotlightClicks: true, + target: '.cube-column-chooser', + title: 'Hypercube builder', + }, + { + step: 'addAnotherColumn', + content: ( +
+

+ A cube is created with the selected entity as the first column. All the entity values are shown + and it is possible to spot any errande values. If selections are applied, only the selected values + are displayed. +

+

Add another column by clicking the plus button.

+
+ ), + disableOverlayClose: true, + hideFooter: true, + spotlightClicks: true, + target: '.card', + title: 'Hypercube builder', + }, + { + step: 'selectAnotherEntity', + content: 'Click an entity to add it as a column in the cube.', + placement: 'left', + disableOverlayClose: true, + hideFooter: true, + spotlightClicks: true, + target: '.cube-column-chooser', + title: 'Hypercube builder', + }, + { + step: 'cubeFinished', + content: 'More columns can be added to the cube. To close the cube, just click the button in the upper corner.', + target: '.card', + title: 'Hypercube builder', + }, + { + content: ( +
+

+ Now you can continue to explore your data model with catwalk on your own! +

+

+ To restart the guide, right click and select + {' '} + Start Guide + . +

+
+ ), + placement: 'bottom', + target: '.topbarLogo', + title: 'Guide completed!', + }, +]; + +export default steps; diff --git a/src/components/guide.jsx b/src/components/guide.jsx new file mode 100644 index 00000000..4d0c83e4 --- /dev/null +++ b/src/components/guide.jsx @@ -0,0 +1,109 @@ +import React, +{ + useState, + useCallback, + forwardRef, + useImperativeHandle, +} from 'react'; +import Joyride, { ACTIONS, EVENTS, STATUS } from 'react-joyride'; +import steps from './guide-steps'; + +import './guide.pcss'; + +// The component needs to be wrapped in `forwardRef` to give access to the +// ref object assigned using the `ref` prop. +const Guide = forwardRef((props, ref) => { + const [runGuide, setRunGuide] = useState(!localStorage.getItem('catwalkGuide')); + const [stepIndex, setStepIndex] = useState(0); + + // Any instance of the component is extended with what is returned from the + // callback passed as the second argument. + useImperativeHandle(ref, () => ({ + startGuideFunc() { + if (!runGuide) { + setRunGuide(true); + } + }, + })); + + const setStep = (stepName) => { + setRunGuide(false); + setStepIndex(steps.findIndex(s => s.step === stepName)); + setTimeout(() => setRunGuide(true), 300); + }; + + const onClick = useCallback((evt) => { + let parentElemName = evt.target.parentElement.className; + if (parentElemName) { + parentElemName = parentElemName.trim(); + } + + if (parentElemName === 'field') { + // a click in the field (to open the filterbox). + // stop and start the guide in order to highlight the opened filterbox. + setRunGuide(false); + setRunGuide(true); + } + if (parentElemName === 'add-button') { + // a click on the big hypercube builder button. + setStep('selectEntity'); + } else if (parentElemName === 'expression' || parentElemName === 'expression-list') { + // a click on an expression in the hypercube builder. + let nbrOfColumns = 0; + const table = document.getElementsByClassName('hypercube-table'); + if (table.length > 0) { + const virtTable = table[0].getElementsByClassName('ReactVirtualized__Table'); + if (virtTable.length > 0) { + nbrOfColumns = virtTable[0].getAttribute('aria-colcount'); + } + } + if (nbrOfColumns > 0) { + setStep('cubeFinished'); + } else { + setStep('addAnotherColumn'); + } + } else if (parentElemName === 'column-add-button') { + // a click on the little add button in the hypercube builder. + setStep('selectAnotherEntity'); + } + }, []); + + const handleJoyrideCallback = (data) => { + const { + action, index, type, status, + } = data; + + if ([EVENTS.TOUR_START].includes(type)) { + document.addEventListener('mouseup', onClick); + } else if ([STATUS.FINISHED, STATUS.SKIPPED].includes(status)) { + setRunGuide(false); + setStepIndex(0); + localStorage.setItem('catwalkGuide', 'catwalk'); + document.removeEventListener('mouseup', onClick); + } else if ([EVENTS.STEP_AFTER, EVENTS.TARGET_NOT_FOUND].includes(type)) { + const newStepIndex = index + (action === ACTIONS.PREV ? -1 : 1); + // Update state to advance the guide + setStepIndex(newStepIndex); + } + }; + + return ( + + ); +}); + +export default Guide; diff --git a/src/components/guide.pcss b/src/components/guide.pcss new file mode 100644 index 00000000..24cc3234 --- /dev/null +++ b/src/components/guide.pcss @@ -0,0 +1,35 @@ +.guide-step { + margin-top: 1em; + text-align: left; + + div, + p { + display: inline-block; + } + + div { + height: 10px; + margin-right: 5px; + width: 30px; + } + + p { + margin: 0; + } +} + +.perfect { + border: solid 2px #398ab5; +} + +.primary { + border: solid 2px #00993f; +} + +.default { + border: solid 2px #f29600; +} + +.breakword { + overflow-wrap: break-word; +} diff --git a/src/components/topbar.jsx b/src/components/topbar.jsx index 8a6894b9..9b0a9453 100644 --- a/src/components/topbar.jsx +++ b/src/components/topbar.jsx @@ -1,13 +1,14 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import SVGInline from 'react-svg-inline'; +import { ContextMenu, MenuItem, ContextMenuTrigger } from 'react-contextmenu'; import Selections from './selections'; import logo from '../assets/catwalk.svg'; import './topbar.pcss'; -export default function TopBar({ app, appLayout: { qLastReloadTime } }) { +export default function TopBar({ app, appLayout: { qLastReloadTime }, startGuide }) { const [lastReloadString, setLastReloadString] = useState(''); const [lastRefresh, setLastRefresh] = useState(null); const [refreshTimer, setRefreshTimer] = useState(0); @@ -36,14 +37,26 @@ export default function TopBar({ app, appLayout: { qLastReloadTime } }) {
{lastReloadString}
-
{ window.open('https://github.com/qlik-oss/catwalk'); }} role="navigation"> - -
+ +
{ window.open('https://github.com/qlik-oss/catwalk'); }} role="navigation"> + +
+
+ + + Start Guide + +
); } +TopBar.defaultProps = { + startGuide: null, +}; + TopBar.propTypes = { app: PropTypes.object.isRequired, appLayout: PropTypes.object.isRequired, + startGuide: PropTypes.func, }; diff --git a/src/components/topbar.pcss b/src/components/topbar.pcss index 375061fb..e5d4aa4c 100644 --- a/src/components/topbar.pcss +++ b/src/components/topbar.pcss @@ -23,3 +23,46 @@ margin-right: 2em; } } + +.react-contextmenu { + background-clip: padding-box; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; + color: #373a3c; + font-size: 16px; + margin: 2px 0 0; + min-width: 160px; + opacity: 0; + outline: none; + padding: 5px 0; + pointer-events: none; + text-align: left; + transition: opacity 250ms ease !important; +} + +.react-contextmenu.react-contextmenu--visible { + opacity: 1; + pointer-events: auto; + z-index: 9999; +} + +.react-contextmenu-item { + background: 0 0; + border: 0; + color: #373a3c; + cursor: pointer; + font-weight: 400; + line-height: 1.5; + padding: 3px 20px; + text-align: inherit; + white-space: nowrap; +} + +.react-contextmenu-item.react-contextmenu-item--active, +.react-contextmenu-item.react-contextmenu-item--selected { + background-color: #20a0ff; + border-color: #20a0ff; + color: #fff; + text-decoration: none; +} diff --git a/test/e2e/__artifacts__/baseline/grid.png b/test/e2e/__artifacts__/baseline/grid.png index e8a1a981..4f9f8d87 100644 Binary files a/test/e2e/__artifacts__/baseline/grid.png and b/test/e2e/__artifacts__/baseline/grid.png differ